-diff -urN kernel-base/arch/mips/ar7/ar7/ar7_jump.S kernel-current/arch/mips/ar7/ar7/ar7_jump.S
---- kernel-base/arch/mips/ar7/ar7/ar7_jump.S 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/ar7_jump.S 2005-07-10 06:40:39.582267168 +0200
+diff -urN kernel-base/arch/mips/ar7/ar7/jump.S kernel-current/arch/mips/ar7/ar7/jump.S
+--- kernel-base/arch/mips/ar7/ar7/jump.S 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/arch/mips/ar7/ar7/jump.S 2005-07-10 06:40:39.582267000 +0200
@@ -0,0 +1,89 @@
+/*
+ * $Id$
+END(jump_dedicated_interrupt)
+
+ .set at
-diff -urN kernel-base/arch/mips/ar7/ar7/ar7_paging.c kernel-current/arch/mips/ar7/ar7/ar7_paging.c
---- kernel-base/arch/mips/ar7/ar7/ar7_paging.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/ar7_paging.c 2005-07-10 07:08:33.725758672 +0200
+diff -urN kernel-base/arch/mips/ar7/ar7/Makefile kernel-current/arch/mips/ar7/ar7/Makefile
+--- kernel-base/arch/mips/ar7/ar7/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/arch/mips/ar7/ar7/Makefile 2005-07-10 17:46:24.037377984 +0200
+@@ -0,0 +1,31 @@
++# $Id$
++# Copyright (C) $Date$ $Author$
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++.S.s:
++ $(CPP) $(AFLAGS) $< -o $*.s
++
++.S.o:
++ $(CC) $(AFLAGS) -c $< -o $*.o
++
++EXTRA_CFLAGS := -DLITTLE_ENDIAN -D_LINK_KSEG0_
++
++O_TARGET := ar7.o
++
++export-objs := misc.o
++obj-y += paging.o jump.o misc.o
++
++include $(TOPDIR)/Rules.make
+diff -urN kernel-base/arch/mips/ar7/ar7/misc.c kernel-current/arch/mips/ar7/ar7/misc.c
+--- kernel-base/arch/mips/ar7/ar7/misc.c 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/arch/mips/ar7/ar7/misc.c 2005-07-10 19:02:11.699779472 +0200
+@@ -0,0 +1,319 @@
++#include <asm/ar7/sangam.h>
++#include <asm/ar7/avalanche_misc.h>
++#include <linux/module.h>
++#include <linux/spinlock.h>
++
++#define TRUE 1
++
++static unsigned int avalanche_vbus_freq;
++
++REMOTE_VLYNQ_DEV_RESET_CTRL_FN p_remote_vlynq_dev_reset_ctrl = NULL;
++
++/*****************************************************************************
++ * Reset Control Module.
++ *****************************************************************************/
++void avalanche_reset_ctrl(unsigned int module_reset_bit,
++ AVALANCHE_RESET_CTRL_T reset_ctrl)
++{
++ volatile unsigned int *reset_reg = (unsigned int*) AVALANCHE_RST_CTRL_PRCR;
++
++ if(module_reset_bit >= 32 && module_reset_bit < 64)
++ return;
++
++ if(module_reset_bit >= 64)
++ {
++ if(p_remote_vlynq_dev_reset_ctrl)
++ return(p_remote_vlynq_dev_reset_ctrl(module_reset_bit - 64, reset_ctrl));
++ else
++ return;
++ }
++
++ if(reset_ctrl == OUT_OF_RESET)
++ *reset_reg |= 1 << module_reset_bit;
++ else
++ *reset_reg &= ~(1 << module_reset_bit);
++}
++
++AVALANCHE_RESET_CTRL_T avalanche_get_reset_status(unsigned int module_reset_bit)
++{
++ volatile unsigned int *reset_reg = (unsigned int*) AVALANCHE_RST_CTRL_PRCR;
++
++ return (((*reset_reg) & (1 << module_reset_bit)) ? OUT_OF_RESET : IN_RESET );
++}
++
++void avalanche_sys_reset(AVALANCHE_SYS_RST_MODE_T mode)
++{
++ volatile unsigned int *sw_reset_reg = (unsigned int*) AVALANCHE_RST_CTRL_SWRCR;
++ *sw_reset_reg = mode;
++}
++
++#define AVALANCHE_RST_CTRL_RSR_MASK 0x3
++
++AVALANCHE_SYS_RESET_STATUS_T avalanche_get_sys_last_reset_status()
++{
++ volatile unsigned int *sys_reset_status = (unsigned int*) AVALANCHE_RST_CTRL_RSR;
++
++ return ( (AVALANCHE_SYS_RESET_STATUS_T) (*sys_reset_status & AVALANCHE_RST_CTRL_RSR_MASK) );
++}
++
++
++/*****************************************************************************
++ * Power Control Module
++ *****************************************************************************/
++#define AVALANCHE_GLOBAL_POWER_DOWN_MASK 0x3FFFFFFF /* bit 31, 30 masked */
++#define AVALANCHE_GLOBAL_POWER_DOWN_BIT 30 /* shift to bit 30, 31 */
++
++
++void avalanche_power_ctrl(unsigned int module_power_bit, AVALANCHE_POWER_CTRL_T power_ctrl)
++{
++ volatile unsigned int *power_reg = (unsigned int*)AVALANCHE_POWER_CTRL_PDCR;
++
++ if (power_ctrl == POWER_CTRL_POWER_DOWN)
++ /* power down the module */
++ *power_reg |= (1 << module_power_bit);
++ else
++ /* power on the module */
++ *power_reg &= (~(1 << module_power_bit));
++}
++
++AVALANCHE_POWER_CTRL_T avalanche_get_power_status(unsigned int module_power_bit)
++{
++ volatile unsigned int *power_status_reg = (unsigned int*)AVALANCHE_POWER_CTRL_PDCR;
++
++ return (((*power_status_reg) & (1 << module_power_bit)) ? POWER_CTRL_POWER_DOWN : POWER_CTRL_POWER_UP);
++}
++
++void avalanche_set_global_power_mode(AVALANCHE_SYS_POWER_MODE_T power_mode)
++{
++ volatile unsigned int *power_status_reg = (unsigned int*)AVALANCHE_POWER_CTRL_PDCR;
++
++ *power_status_reg &= AVALANCHE_GLOBAL_POWER_DOWN_MASK;
++ *power_status_reg |= ( power_mode << AVALANCHE_GLOBAL_POWER_DOWN_BIT);
++}
++
++AVALANCHE_SYS_POWER_MODE_T avalanche_get_global_power_mode(void)
++{
++ volatile unsigned int *power_status_reg = (unsigned int*)AVALANCHE_POWER_CTRL_PDCR;
++
++ return((AVALANCHE_SYS_POWER_MODE_T) (((*power_status_reg) & (~AVALANCHE_GLOBAL_POWER_DOWN_MASK))
++ >> AVALANCHE_GLOBAL_POWER_DOWN_BIT));
++}
++
++/*****************************************************************************
++ * GPIO Control
++ *****************************************************************************/
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_init
++ ***************************************************************************/
++void avalanche_gpio_init(void)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *reset_reg = (unsigned int*) AVALANCHE_RST_CTRL_PRCR;
++ spin_lock_irqsave(&closeLock, closeFlag);
++ *reset_reg |= (1 << AVALANCHE_GPIO_RESET_BIT);
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++}
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_ctrl
++ ***************************************************************************/
++int avalanche_gpio_ctrl(unsigned int gpio_pin,
++ AVALANCHE_GPIO_PIN_MODE_T pin_mode,
++ AVALANCHE_GPIO_PIN_DIRECTION_T pin_direction)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *gpio_ctrl = (unsigned int*)AVALANCHE_GPIO_ENBL;
++
++ if(gpio_pin >= 32)
++ return(-1);
++
++ spin_lock_irqsave(&closeLock, closeFlag);
++
++ if(pin_mode == GPIO_PIN)
++ {
++ *gpio_ctrl |= (1 << gpio_pin);
++
++ gpio_ctrl = (unsigned int*)AVALANCHE_GPIO_DIR;
++
++ if(pin_direction == GPIO_INPUT_PIN)
++ *gpio_ctrl |= (1 << gpio_pin);
++ else
++ *gpio_ctrl &= ~(1 << gpio_pin);
++ }
++ else /* FUNCTIONAL PIN */
++ {
++ *gpio_ctrl &= ~(1 << gpio_pin);
++ }
++
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++
++ return (0);
++}
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_out
++ ***************************************************************************/
++int avalanche_gpio_out_bit(unsigned int gpio_pin, int value)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *gpio_out = (unsigned int*) AVALANCHE_GPIO_DATA_OUT;
++
++ if(gpio_pin >= 32)
++ return(-1);
++
++ spin_lock_irqsave(&closeLock, closeFlag);
++ if(value == TRUE)
++ *gpio_out |= 1 << gpio_pin;
++ else
++ *gpio_out &= ~(1 << gpio_pin);
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++
++ return(0);
++}
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_in
++ ***************************************************************************/
++int avalanche_gpio_in_bit(unsigned int gpio_pin)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *gpio_in = (unsigned int*) AVALANCHE_GPIO_DATA_IN;
++ int ret_val = 0;
++
++ if(gpio_pin >= 32)
++ return(-1);
++
++ spin_lock_irqsave(&closeLock, closeFlag);
++ ret_val = ((*gpio_in) & (1 << gpio_pin));
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++
++ return (ret_val);
++}
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_out_val
++ ***************************************************************************/
++int avalanche_gpio_out_value(unsigned int out_val, unsigned int out_mask,
++ unsigned int reg_index)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *gpio_out = (unsigned int*) AVALANCHE_GPIO_DATA_OUT;
++
++ if(reg_index > 0)
++ return(-1);
++
++ spin_lock_irqsave(&closeLock, closeFlag);
++ *gpio_out &= ~out_mask;
++ *gpio_out |= out_val;
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++
++ return(0);
++}
++
++/****************************************************************************
++ * FUNCTION: avalanche_gpio_in_value
++ ***************************************************************************/
++int avalanche_gpio_in_value(unsigned int* in_val, unsigned int reg_index)
++{
++ spinlock_t closeLock;
++ unsigned int closeFlag;
++ volatile unsigned int *gpio_in = (unsigned int*) AVALANCHE_GPIO_DATA_IN;
++
++ if(reg_index > 0)
++ return(-1);
++
++ spin_lock_irqsave(&closeLock, closeFlag);
++ *in_val = *gpio_in;
++ spin_unlock_irqrestore(&closeLock, closeFlag);
++
++ return (0);
++}
++
++/***********************************************************************
++ *
++ * Wakeup Control Module for TNETV1050 Communication Processor
++ *
++ ***********************************************************************/
++
++#define AVALANCHE_WAKEUP_POLARITY_BIT 16
++
++void avalanche_wakeup_ctrl(AVALANCHE_WAKEUP_INTERRUPT_T wakeup_int,
++ AVALANCHE_WAKEUP_CTRL_T wakeup_ctrl,
++ AVALANCHE_WAKEUP_POLARITY_T wakeup_polarity)
++{
++ volatile unsigned int *wakeup_status_reg = (unsigned int*) AVALANCHE_WAKEUP_CTRL_WKCR;
++
++ /* enable/disable */
++ if (wakeup_ctrl == WAKEUP_ENABLED)
++ /* enable wakeup */
++ *wakeup_status_reg |= wakeup_int;
++ else
++ /* disable wakeup */
++ *wakeup_status_reg &= (~wakeup_int);
++
++ /* set polarity */
++ if (wakeup_polarity == WAKEUP_ACTIVE_LOW)
++ *wakeup_status_reg |= (wakeup_int << AVALANCHE_WAKEUP_POLARITY_BIT);
++ else
++ *wakeup_status_reg &= ~(wakeup_int << AVALANCHE_WAKEUP_POLARITY_BIT);
++}
++
++void avalanche_set_vbus_freq(unsigned int new_vbus_freq)
++{
++ avalanche_vbus_freq = new_vbus_freq;
++}
++
++unsigned int avalanche_get_vbus_freq()
++{
++ return(avalanche_vbus_freq);
++}
++
++unsigned int avalanche_get_chip_version_info()
++{
++ return(*(volatile unsigned int*)AVALANCHE_CVR);
++}
++
++SET_MDIX_ON_CHIP_FN_T p_set_mdix_on_chip_fn = NULL;
++
++int avalanche_set_mdix_on_chip(unsigned int base_addr, unsigned int operation)
++{
++ if(p_set_mdix_on_chip_fn)
++ return (p_set_mdix_on_chip_fn(base_addr, operation));
++ else
++ return(-1);
++}
++
++unsigned int avalanche_is_mdix_on_chip(void)
++{
++ return(p_set_mdix_on_chip_fn ? 1:0);
++}
++
++EXPORT_SYMBOL(avalanche_reset_ctrl);
++EXPORT_SYMBOL(avalanche_get_reset_status);
++EXPORT_SYMBOL(avalanche_sys_reset);
++EXPORT_SYMBOL(avalanche_get_sys_last_reset_status);
++EXPORT_SYMBOL(avalanche_power_ctrl);
++EXPORT_SYMBOL(avalanche_get_power_status);
++EXPORT_SYMBOL(avalanche_set_global_power_mode);
++EXPORT_SYMBOL(avalanche_get_global_power_mode);
++EXPORT_SYMBOL(avalanche_set_mdix_on_chip);
++EXPORT_SYMBOL(avalanche_is_mdix_on_chip);
++
++EXPORT_SYMBOL(avalanche_gpio_init);
++EXPORT_SYMBOL(avalanche_gpio_ctrl);
++EXPORT_SYMBOL(avalanche_gpio_out_bit);
++EXPORT_SYMBOL(avalanche_gpio_in_bit);
++EXPORT_SYMBOL(avalanche_gpio_out_value);
++EXPORT_SYMBOL(avalanche_gpio_in_value);
++
++EXPORT_SYMBOL(avalanche_set_vbus_freq);
++EXPORT_SYMBOL(avalanche_get_vbus_freq);
++
++EXPORT_SYMBOL(avalanche_get_chip_version_info);
++
+diff -urN kernel-base/arch/mips/ar7/ar7/paging.c kernel-current/arch/mips/ar7/ar7/paging.c
+--- kernel-base/arch/mips/ar7/ar7/paging.c 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/arch/mips/ar7/ar7/paging.c 2005-07-10 07:08:33.725758000 +0200
@@ -0,0 +1,314 @@
+/*
+ * -*- linux-c -*-
+ * Determine the low and high memory ranges
+ */
+
-+ max_low_pfn = max_pfn;
-+
-+ /*
-+ * Partially used pages are not usable - thus we are
-+ * rounding upwards:
-+ */
-+
-+ start_pfn = PFN_UP(__pa(&_end));
-+
-+ /*
-+ * Find a proper area for the bootmem bitmap. After this
-+ * bootstrap step all allocations (until the page allocator is
-+ * intact) must be done via bootmem_alloc().
-+ */
-+
-+ bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
-+ __MEMORY_START>>PAGE_SHIFT, max_low_pfn);
-+
-+
-+ /*
-+ * Register fully available low RAM pages with the bootmem allocator.
-+ */
-+
-+ {
-+ unsigned long curr_pfn, last_pfn, pages;
-+
-+ /*
-+ * We are rounding up the start address of usable memory:
-+ */
-+ curr_pfn = PFN_UP(__MEMORY_START);
-+
-+ /*
-+ * ... and at the end of the usable range downwards:
-+ */
-+ last_pfn = PFN_DOWN(__pa(memory_end));
-+
-+ if (last_pfn > max_low_pfn)
-+ last_pfn = max_low_pfn;
-+
-+ pages = last_pfn - curr_pfn;
-+
-+
-+ free_bootmem_node(NODE_DATA(0), PFN_PHYS(curr_pfn),
-+ PFN_PHYS(pages));
-+ }
-+
-+ /*
-+ * Reserve the kernel text and
-+ * Reserve the bootmem bitmap. We do this in two steps (first step
-+ * was init_bootmem()), because this catches the (definitely buggy)
-+ * case of us accidentally initializing the bootmem allocator with
-+ * an invalid RAM area.
-+ */
-+ reserve_bootmem_node(NODE_DATA(0), __MEMORY_START+PAGE_SIZE,
-+ (PFN_PHYS(start_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START);
-+
-+ /*
-+ * reserve physical page 0 - it's a special BIOS page on many boxes,
-+ * enabling clean reboots, SMP operation, laptop functions.
-+ */
-+ reserve_bootmem_node(NODE_DATA(0), __MEMORY_START, PAGE_SIZE);
-+}
-+
-+extern char __init_begin, __init_end;
-+
-+void free_initmem(void)
-+{
-+ unsigned long addr;
-+ // prom_free_prom_memory ();
-+
-+ addr = (unsigned long) &__init_begin;
-+ while (addr < (unsigned long) &__init_end) {
-+ ClearPageReserved(virt_to_page(addr));
-+ set_page_count(virt_to_page(addr), 1);
-+ free_page(addr);
-+ totalram_pages++;
-+ addr += PAGE_SIZE;
-+ }
-+ printk("Freeing unused kernel memory: %dk freed\n",
-+ (&__init_end - &__init_begin) >> 10);
-+}
-+
-+void si_meminfo(struct sysinfo *val)
-+{
-+ val->totalram = totalram_pages;
-+ val->sharedram = 0;
-+ val->freeram = nr_free_pages();
-+ val->bufferram = atomic_read(&buffermem_pages);
-+ val->totalhigh = 0;
-+ val->freehigh = nr_free_highpages();
-+ val->mem_unit = PAGE_SIZE;
-+
-+ return;
-+}
-diff -urN kernel-base/arch/mips/ar7/ar7/gpio.c kernel-current/arch/mips/ar7/ar7/gpio.c
---- kernel-base/arch/mips/ar7/ar7/gpio.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/gpio.c 2005-07-10 09:46:52.164776456 +0200
-@@ -0,0 +1,132 @@
-+#include <linux/kernel.h>
-+#include <asm/uaccess.h>
-+#include <linux/spinlock.h>
-+#include <linux/proc_fs.h>
-+#include <linux/fs.h>
-+#include <linux/timer.h>
-+#include <linux/module.h>
-+#include <linux/stddef.h>
-+
-+#include <asm/ar7/tnetd73xx_err.h>
-+#include <asm/ar7/tnetd73xx_misc.h>
-+#include <asm/ar7/ledapp.h>
-+
-+
-+#if defined (CONFIG_AR7RD) || defined(CONFIG_AR7WRD)
-+
-+#define AR7_RESET_FILE "led_mod/ar7reset"
-+#define AR7_RESET_GPIO 11
-+#define RESET_POLL_TIME 1
-+#define RESET_HOLD_TIME 4
-+#define NO_OF_LEDS
-+#define TRUE 1
-+#define FALSE 0
-+
-+static struct proc_dir_entry *reset_file;
-+static int res_state = 0;
-+static int count;
-+static struct timer_list *pTimer = NULL;
-+static ssize_t proc_read_reset_fops(struct file *filp, char *buf, size_t count, loff_t * offp);
-+
-+struct file_operations reset_fops = {
-+ read:proc_read_reset_fops
-+};
-+
-+#endif
-+
-+static spinlock_t device_lock;
-+led_reg_t temp[15];
-+
-+static void gpio_led_on(unsigned long param)
-+{
-+ unsigned int flags;
-+
-+ spin_lock_irqsave(&device_lock, flags);
-+ tnetd73xx_gpio_out(param, FALSE);
-+ spin_unlock_irqrestore(&device_lock, flags);
-+}
-+
-+static void gpio_led_off(unsigned long param)
-+{
-+ unsigned int flags = 0x00;
-+
-+ spin_lock_irqsave(&device_lock, flags);
-+ tnetd73xx_gpio_out(param, TRUE);
-+ spin_unlock_irqrestore(&device_lock, flags);
-+}
-+
-+static void gpio_led_init(unsigned long param)
-+{
-+ tnetd73xx_gpio_ctrl(param, GPIO_PIN, GPIO_OUTPUT_PIN);
-+}
-+
-+static void board_gpio_reset(void)
-+{
-+ tnetd73xx_gpio_init();
-+
-+ /* Initialize the link mask */
-+ device_lock = SPIN_LOCK_UNLOCKED;
-+ return;
-+}
-+
-+#if defined(CONFIG_AR7WRD)
-+
-+static ssize_t proc_read_reset_fops(struct file *filp, char *buf, size_t count, loff_t * offp)
-+{
-+ char *pdata = NULL;
-+ char line[3];
-+ int len = 0;
-+ if (*offp != 0)
-+ return 0;
-+
-+ pdata = buf;
-+ len = sprintf(line, "%d\n", res_state);
-+ res_state = 0;
-+ copy_to_user(buf, line, len);
-+ *offp = len;
-+ return len;
-+}
-+
-+static void reset_timer_func(unsigned long data)
-+{
-+ count = (tnetd73xx_gpio_in(AR7_RESET_GPIO) == 0) ? count + 1 : 0;
-+ if (count >= RESET_HOLD_TIME / RESET_POLL_TIME)
-+ res_state = 1;
-+ pTimer->expires = jiffies + HZ * RESET_POLL_TIME;
-+ add_timer(pTimer);
-+ return;
-+}
-+
-+static void reset_init(void)
-+{
-+ /* Create board reset proc file */
-+ reset_file = create_proc_entry(AR7_RESET_FILE, 0777, NULL);
-+ if (reset_file == NULL)
-+ goto reset_file;
-+ reset_file->owner = THIS_MODULE;
-+ reset_file->proc_fops = &reset_fops;
-+
-+ /* Initialise GPIO 11 for input */
-+ tnetd73xx_gpio_ctrl(AR7_RESET_GPIO, GPIO_PIN, GPIO_INPUT_PIN);
-+
-+ /* Create a timer which fires every seconds */
-+ pTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
-+ init_timer(pTimer);
-+ pTimer->function = reset_timer_func;
-+ pTimer->data = 0;
-+ /* Start the timer */
-+ reset_timer_func(0);
-+ return;
-+
-+ reset_file:
-+ remove_proc_entry(AR7_RESET_FILE, NULL);
-+ return;
-+}
-+#endif
-+
-+
-+void board_gpio_init(void)
-+{
-+ board_gpio_reset();
-+ return;
-+}
-diff -urN kernel-base/arch/mips/ar7/ar7/ledmod.c kernel-current/arch/mips/ar7/ar7/ledmod.c
---- kernel-base/arch/mips/ar7/ar7/ledmod.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/ledmod.c 2005-07-10 09:45:36.692250024 +0200
-@@ -0,0 +1,712 @@
-+#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/proc_fs.h>
-+#include <asm/uaccess.h>
-+#include <linux/fs.h>
-+#include <linux/timer.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <asm/ar7/avalanche_regs.h>
-+#include <asm/ar7/ledapp.h>
-+#include <linux/module.h>
-+
-+#define LED_ON 1
-+#define LED_OFF 2
-+#define LED_BLINK 3
-+#define LED_FLASH 4
-+
-+#define LED_BLINK_UP 5
-+#define LED_BLINK_DOWN 6
-+
-+typedef struct state_entry {
-+ unsigned char mode;
-+ unsigned char led;
-+ void (*handler) (struct state_entry * pState);
-+ unsigned long param;
-+} state_entry_t;
-+
-+typedef struct mod_entry {
-+ state_entry_t *states[MAX_STATE_ID];
-+} mod_entry_t;
-+
-+static mod_entry_t *modArr[MAX_MOD_ID];
-+static struct proc_dir_entry *led_proc_dir, *led_file;
-+
-+/* index of the array is the led number HARDWARE SPECIFIC*/
-+typedef struct led_data {
-+ led_reg_t *led;
-+ int state;
-+ struct timer_list *pTimer;
-+ unsigned char timer_running;
-+ unsigned long param;
-+} led_data_t;
-+
-+led_data_t led_arr[MAX_LED_ID + 1];
-+/*!!! The last device is actually being used for ar7 reset to factory default */
-+#if 1
-+/* Ron add for adsl LED blink */
-+#define GPIO_ADSL_ACT (1<<6)
-+#define GPIO_ADSL_DOWN (1<<8)
-+#define BLINK_FAST 5*HZ/100
-+#define BLINK_SLOW 15*HZ/100
-+static struct timer_list my_led_timer;
-+static int my_blink_count = 0;
-+static int my_mode = 1;
-+void led_operation(int mod, int state);
-+
-+static void my_led_on(unsigned long gpio, int logic)
-+{
-+ if (logic > 0)
-+ GPIO_DATA_OUTPUT |= gpio;
-+ else
-+ GPIO_DATA_OUTPUT &= ~gpio;
-+
-+}
-+static void my_led_off(unsigned long gpio, int logic)
-+{
-+ if (logic > 0)
-+ GPIO_DATA_OUTPUT &= ~gpio;
-+ else
-+ GPIO_DATA_OUTPUT |= gpio;
-+
-+}
-+
-+static void my_led_init(unsigned long gpio, int init, int logic)
-+{
-+ GPIO_DATA_ENABLE |= gpio;
-+ GPIO_DATA_DIR &= ~gpio;
-+ if (init)
-+ my_led_on(gpio, logic);
-+ else
-+ my_led_off(gpio, logic);
-+}
-+
-+static void my_led_blink_timer(unsigned long data)
-+{
-+ unsigned long gpio = GPIO_ADSL_ACT;
-+ unsigned int speed = BLINK_FAST;
-+ if (my_mode == 2) {
-+ gpio = GPIO_ADSL_DOWN;
-+ speed = BLINK_SLOW;
-+ }
-+ if (my_blink_count) {
-+ if (GPIO_DATA_OUTPUT & gpio) {
-+ GPIO_DATA_OUTPUT &= ~gpio;
-+ if (my_mode != 2)
-+ my_blink_count = 0;
-+ } else {
-+ GPIO_DATA_OUTPUT |= gpio;
-+ }
-+ }
-+ my_led_timer.expires = jiffies + speed;
-+ add_timer(&my_led_timer);
-+}
-+
-+/* Ron add for ADSL led blink */
-+#endif
-+static spinlock_t config_lock;
-+
-+static void board_led_link_up(state_entry_t * pState);
-+static void board_led_link_down(state_entry_t * pState);
-+static void board_led_activity_on(state_entry_t * pState);
-+static void board_led_activity_off(state_entry_t * pState);
-+static void led_timer_func(unsigned long data);
-+
-+extern void board_gpio_init(void);
-+extern void uart_led_init(void);
-+
-+static ssize_t proc_read_led_fops(struct file *filp, char *buf, size_t count, loff_t * offp);
-+static ssize_t proc_write_led_fops(struct file *filp, const char *buffer, size_t count, loff_t * offp);
-+static int config_led(unsigned long y);
-+
-+struct file_operations led_fops = {
-+ read:proc_read_led_fops,
-+ write:proc_write_led_fops,
-+};
-+
-+static int led_atoi(char *name)
-+{
-+ int val = 0;
-+ for (;; name++) {
-+ switch (*name) {
-+ case '0'...'9':
-+ val = val * 10 + (*name - '0');
-+ break;
-+ default:
-+ return val;
-+ }
-+ }
-+}
-+
-+static int free_memory(void)
-+{
-+ int i, j;
-+
-+ for (i = 0; i < MAX_MOD_ID; i++) {
-+ if (modArr[i] != NULL) {
-+ for (j = 0; j < MAX_STATE_ID; j++) {
-+ if (modArr[i]->states[j] != NULL)
-+ kfree(modArr[i]->states[j]);
-+ }
-+ kfree(modArr[i]);
-+ modArr[i] = NULL;
-+ }
-+ }
-+ return 0;
-+}
-+
-+static int led_on(state_entry_t * pState)
-+{
-+ if (led_arr[pState->led].led == NULL)
-+ return -1;
-+ led_arr[pState->led].led->onfunc(led_arr[pState->led].led->param);
-+ return 0;
-+}
-+
-+static int led_off(state_entry_t * pState)
-+{
-+ if (led_arr[pState->led].led == NULL)
-+ return -1;
-+ led_arr[pState->led].led->offfunc(led_arr[pState->led].led->param);
-+ return 0;
-+}
-+
-+static void board_led_link_up(state_entry_t * pState)
-+{
-+ led_arr[pState->led].state = LED_ON;
-+ if (led_arr[pState->led].timer_running == 0)
-+ led_on(pState);
-+ return;
-+}
-+
-+static void board_led_link_down(state_entry_t * pState)
-+{
-+ led_arr[pState->led].state = LED_OFF;
-+ if (led_arr[pState->led].timer_running == 0)
-+ led_off(pState);
-+ return;
-+}
-+
-+static void add_led_timer(state_entry_t * pState)
-+{
-+ led_arr[pState->led].pTimer->expires =
-+ jiffies + HZ * (pState->param) / 1000;
-+ led_arr[pState->led].param = pState->param;
-+ led_arr[pState->led].pTimer->data = pState;
-+ add_timer(led_arr[pState->led].pTimer);
-+}
-+
-+static void board_led_activity_on(state_entry_t * pState)
-+{
-+ if (led_arr[pState->led].timer_running == 0) {
-+ led_on(pState);
-+ add_led_timer(pState);
-+ led_arr[pState->led].timer_running = 1;
-+ led_arr[pState->led].state = LED_BLINK_UP;
-+ } else if (led_arr[pState->led].timer_running > 0xF0) {
-+ led_arr[pState->led].state = LED_BLINK_UP;
-+ led_arr[pState->led].pTimer->expires =
-+ jiffies + HZ * (pState->param) / 1000;
-+ led_arr[pState->led].param = pState->param;
-+ led_arr[pState->led].pTimer->data = pState;
-+ }
-+ return;
-+}
-+
-+static void board_led_activity_off(state_entry_t * pState)
-+{
-+ if (led_arr[pState->led].timer_running == 0) {
-+ led_off(pState);
-+ add_led_timer(pState);
-+ led_arr[pState->led].timer_running = 1;
-+ led_arr[pState->led].state = LED_BLINK_UP;
-+ } else if (led_arr[pState->led].timer_running > 0xF0) {
-+ led_arr[pState->led].state = LED_BLINK_UP;
-+ led_arr[pState->led].pTimer->expires =
-+ jiffies + HZ * (pState->param) / 1000;
-+ led_arr[pState->led].param = pState->param;
-+ led_arr[pState->led].pTimer->data = pState;
-+ }
-+ return;
-+}
-+
-+static void board_led_link_flash(state_entry_t * pState)
-+{
-+ if (led_on(pState))
-+ return;
-+ if (led_arr[pState->led].timer_running == 0)
-+ add_led_timer(pState);
-+ else
-+ led_arr[pState->led].param = pState->param;
-+ led_arr[pState->led].timer_running = 0xFF;
-+ led_arr[pState->led].state = LED_FLASH;
-+ return;
-+}
-+
-+static void led_timer_func(unsigned long data)
-+{
-+ state_entry_t *pState = NULL;
-+ mod_entry_t *pMod = NULL;
-+ unsigned int flags;
-+
-+ spin_lock_irqsave(&config_lock, flags);
-+
-+ pState = (state_entry_t *) data;
-+
-+ if (led_arr[pState->led].state == LED_BLINK_DOWN) {
-+ led_arr[pState->led].timer_running = 0;
-+ if (pState->mode == 2)
-+ led_arr[pState->led].state = LED_OFF;
-+ else
-+ led_arr[pState->led].state = LED_ON;
-+ } else if (led_arr[pState->led].state == LED_BLINK_UP) {
-+ led_arr[pState->led].pTimer->expires =
-+ jiffies + HZ * (led_arr[pState->led].param) / 1000;
-+ led_arr[pState->led].pTimer->data = pState;
-+ add_timer(led_arr[pState->led].pTimer);
-+ if (pState->mode == 2) {
-+ led_off(pState);
-+ led_arr[pState->led].state = LED_BLINK_DOWN;
-+ } else {
-+ led_on(pState);
-+ led_arr[pState->led].state = LED_BLINK_DOWN;
-+ }
-+ led_arr[pState->led].timer_running = 1;
-+ } else if (led_arr[pState->led].state == LED_FLASH) {
-+ led_arr[pState->led].pTimer->expires =
-+ jiffies + HZ * (led_arr[pState->led].param) / 1000;
-+ led_arr[pState->led].pTimer->data = pState;
-+ add_timer(led_arr[pState->led].pTimer);
-+
-+ if (led_arr[pState->led].timer_running == 0xFF) {
-+ led_off(pState);
-+ led_arr[pState->led].timer_running--;
-+ } else {
-+ led_on(pState);
-+ led_arr[pState->led].timer_running++;
-+ }
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return;
-+ } else if (led_arr[pState->led].state == LED_OFF) {
-+ led_off(pState);
-+ led_arr[pState->led].timer_running = 0;
-+ } else if (led_arr[pState->led].state == LED_ON) {
-+ led_on(pState);
-+ led_arr[pState->led].timer_running = 0;
-+ }
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return;
-+}
-+
-+static ssize_t proc_read_led_fops(struct file *filp,
-+ char *buf, size_t count, loff_t * offp)
-+{
-+ char *pdata = NULL;
-+ int i = 0, j = 0, len = 0, totallen = 0;
-+ char line[255];
-+
-+ if (*offp != 0)
-+ return 0;
-+
-+ pdata = buf;
-+ len += sprintf(line, "LEDS Registered for use are:");
-+ for (i = 0; i < MAX_LED_ID; i++)
-+ if (led_arr[i].led != NULL)
-+ len += sprintf(&line[len], " %d ", i);
-+ line[len++] = '\n';
-+
-+ copy_to_user(pdata, line, len);
-+ pdata += len;
-+ totallen += len;
-+ len = 0;
-+ len = sprintf(line, "USER MODULE INFORMATION:\n");
-+ copy_to_user(pdata, line, len);
-+ pdata += len;
-+ totallen += len;
-+ len = 0;
-+ for (i = 0; i < MAX_MOD_ID; i++) {
-+ if (modArr[i] != NULL) {
-+ len = sprintf(line, " Module ID = %d \n", i);
-+ copy_to_user(pdata, line, len);
-+ pdata += len;
-+ totallen += len;
-+ len = 0;
-+ for (j = 0; j < MAX_STATE_ID; j++) {
-+ if (modArr[i]->states[j] != NULL) {
-+ len = sprintf(line, " State = %d , Led = %d,", j,
-+ modArr[i]->states[j]->led);
-+ copy_to_user(pdata, line, len);
-+ pdata += len;
-+ totallen += len;
-+
-+ len = 0;
-+ switch (modArr[i]->states[j]->mode) {
-+ case 1:
-+ len = sprintf(line, " Mode = OFF\n");
-+ break;
-+ case 2:
-+ len = sprintf(line, " Mode = BLINK_ON , On Time(ms) = %d\n",
-+ (unsigned int) modArr[i]->states[j]->
-+ param);
-+ break;
-+ case 3:
-+ len = sprintf(line, " Mode = BLINK_OFF , Off Time(ms) = %d\n",
-+ (unsigned int) modArr[i]->states[j]->
-+ param);
-+ break;
-+ case 4:
-+ len = sprintf(line, " Mode = ON \n");
-+ break;
-+ case 5:
-+ len = sprintf(line, " Mode = FLASH , Time Period(ms) = %d\n",
-+ (unsigned int) modArr[i]->states[j]->
-+ param);
-+ break;
-+ default:
-+ break;
-+
-+ }
-+ copy_to_user(pdata, line, len);
-+ pdata += len;
-+ totallen += len;
-+
-+ len = 0;
-+ }
-+ }
-+ }
-+ }
-+ /* Return with configuration information for LEDs */
-+ *offp = totallen;
-+ return totallen;
-+}
-+
-+static ssize_t proc_write_led_fops(struct file *filp, const char *buffer, size_t count, loff_t * offp)
-+{
-+ char *pdata = NULL, *ptemp = NULL;
-+ char line[10], temp[10];
-+ int i = 0;
-+ int mod = 0xFFFF, state = 0xFFFF;
-+ int flag = 0;
-+
-+ /* Check if this write is for configuring stuff */
-+ if (*(int *) (buffer) == 0xFFEEDDCC) {
-+ printk("<1>proc write:Calling Configuration\n");
-+ config_led((unsigned long) (buffer + sizeof(int)));
-+ return count;
-+ }
-+
-+ if (count >= 10) {
-+ printk("<1>proc write:Input too long,max length = %d\n", 10);
-+ return count;
-+ }
-+ memset(temp, 0x00, 10);
-+ memset(line, 0x00, 10);
-+ copy_from_user(line, buffer, count);
-+ line[count] = 0x00;
-+ pdata = line;
-+ ptemp = temp;
-+ while (flag == 0) {
-+ if (i > 10)
-+ break;
-+ if (((*pdata) >= '0') && ((*pdata) <= '9')) {
-+ *ptemp = *pdata;
-+ ptemp++;
-+ } else if ((*pdata) == ',') {
-+ *ptemp = 0x00;
-+ flag = 1;
-+ }
-+ pdata++;
-+ i++;
-+ };
-+ if (flag == 1)
-+ mod = led_atoi(temp);
-+ else
-+ return count;
-+
-+ ptemp = temp;
-+ *ptemp = 0x00;
-+ flag = 0;
-+ while (flag == 0) {
-+ if (i > 10)
-+ break;
-+ if (((*pdata) >= '0') && ((*pdata) <= '9')) {
-+ *ptemp = *pdata;
-+ ptemp++;
-+ } else if ((*pdata) == 0x00) {
-+ *ptemp = 0x00;
-+ flag = 1;
-+ }
-+ pdata++;
-+ i++;
-+ };
-+ if (flag == 1)
-+ state = led_atoi(temp);
-+ else
-+ return count;
-+ if ((mod == 0xFFFF) || (state == 0xFFFF))
-+ return count;
-+ else
-+ led_operation(mod, state);
-+ return count;
-+}
-+
-+static int config_led(unsigned long y)
-+{
-+ config_elem_t *pcfg = NULL;
-+ char *pdata = NULL;
-+ int i;
-+ int length = 0, number = 0;
-+ unsigned int flags;
-+
-+ spin_lock_irqsave(&config_lock, flags);
-+
-+ /* ioctl to configure */
-+ length = *((int *) y);
-+ pdata = (char *) y + sizeof(int);
-+ number = (length - sizeof(int)) / sizeof(config_elem_t);
-+ pcfg = (config_elem_t *) (pdata);
-+
-+ /* Check if an earlier configuration exists IF yes free it up */
-+ free_memory();
-+
-+ for (i = 0; i < number; i++) {
-+ /* If no structure has been allocated for the module do so */
-+ if (modArr[pcfg->name] == NULL) {
-+ printk("<1>module = %d\n", pcfg->name);
-+ if (pcfg->name >= MAX_MOD_ID) {
-+ printk
-+ ("<1>Exiting Configuration: Module ID too large %d\n",
-+ pcfg->name);
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ modArr[pcfg->name] = kmalloc(sizeof(mod_entry_t), GFP_KERNEL);
-+ if (modArr[pcfg->name] == NULL) {
-+ printk
-+ ("<1>Exiting Configuration: Error in allocating memory\n");
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ memset(modArr[pcfg->name], 0x00, sizeof(mod_entry_t));
-+ }
-+
-+ /* if no structure is allocated previously for this state
-+ allocate a structure, if it's already there fill it up */
-+ if (modArr[pcfg->name]->states[pcfg->state] == NULL) {
-+ printk("<1>STATE = %d\n", pcfg->state);
-+ if (pcfg->state >= MAX_STATE_ID) {
-+ printk("<1>Exiting Configuration: State ID too large\n");
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ modArr[pcfg->name]->states[pcfg->state] =
-+ kmalloc(sizeof(state_entry_t), GFP_KERNEL);
-+ if (modArr[pcfg->name]->states[pcfg->state] == NULL) {
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ memset(modArr[pcfg->name]->states[pcfg->state], 0x00,
-+ sizeof(state_entry_t));
-+ }
-+ /* Fill up the fields of the state */
-+ if (pcfg->led >= MAX_LED_ID) {
-+ printk("<1>led = %d\n", pcfg->led);
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ modArr[pcfg->name]->states[pcfg->state]->led = pcfg->led;
-+ modArr[pcfg->name]->states[pcfg->state]->mode = pcfg->mode;
-+ modArr[pcfg->name]->states[pcfg->state]->param = pcfg->param;
-+ switch (pcfg->mode) {
-+ case 1:
-+ modArr[pcfg->name]->states[pcfg->state]->handler =
-+ board_led_link_down;
-+ break;
-+ case 2:
-+ case 3:
-+ case 5:
-+ if (pcfg->mode == 2)
-+ modArr[pcfg->name]->states[pcfg->state]->handler =
-+ board_led_activity_on;
-+ else if (pcfg->mode == 3)
-+ modArr[pcfg->name]->states[pcfg->state]->handler =
-+ board_led_activity_off;
-+ else
-+ modArr[pcfg->name]->states[pcfg->state]->handler =
-+ board_led_link_flash;
-+ break;
-+ case 4:
-+ modArr[pcfg->name]->states[pcfg->state]->handler =
-+ board_led_link_up;
-+ break;
-+ default:
-+ printk("<1>Exiting Configuration: Unknown LED Mode\n");
-+ free_memory();
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return -1;
-+ }
-+ pcfg++;
-+ }
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return 0;
-+}
-+
-+
-+int led_init(void)
-+{
-+
-+ /* Clear our memory */
-+ memset(modArr, 0x00, sizeof(mod_entry_t *) * MAX_MOD_ID);
-+ memset(led_arr, 0x00, sizeof(led_data_t *) * MAX_LED_ID);
-+
-+ /* Create spin lock for config data structure */
-+ config_lock = SPIN_LOCK_UNLOCKED;
-+
-+ /* Create directory */
-+ led_proc_dir = proc_mkdir("led_mod", NULL);
-+ if (led_proc_dir == NULL)
-+ goto out;
-+
-+ /* Create adsl file */
-+ led_file = create_proc_entry("led", 0777, led_proc_dir);
-+ if (led_file == NULL)
-+ goto led_file;
-+ led_file->owner = THIS_MODULE;
-+ led_file->proc_fops = &led_fops;
-+
-+ memset(modArr, 0x00, sizeof(mod_entry_t *) * MAX_MOD_ID);
-+ /* Reset the GPIO pins */
-+ board_gpio_init();
-+
-+ /* Ron add for ADSL LED blink */
-+ my_mode = 1;
-+ my_led_init(GPIO_ADSL_ACT, 0, -1);
-+ my_led_init(GPIO_ADSL_DOWN, 0, -1);
-+ init_timer(&my_led_timer);
-+ my_led_timer.function = my_led_blink_timer;
-+ my_led_timer.data = 0;
-+ my_led_timer.expires = jiffies + BLINK_SLOW;
-+ add_timer(&my_led_timer);
-+ /* Ron add for ADSL LED blink */
-+ return 0;
-+
-+ led_file:
-+ remove_proc_entry("led", led_proc_dir);
-+ out:
-+ return 0;
-+
-+}
-+
-+void led_operation(int mod, int state)
-+{
-+
-+ unsigned int flags;
-+
-+ spin_lock_irqsave(&config_lock, flags);
-+#if 1
-+ /* Ron Add for ADSL LED blink */
-+ //printk("mod==%d state==%d\n",mod,state);
-+
-+ if (mod == 1) {
-+ switch (state) {
-+ /* off */
-+ case 1:
-+ my_mode = 1;
-+ my_blink_count = 0;
-+ my_led_off(GPIO_ADSL_ACT, -1);
-+ my_led_off(GPIO_ADSL_DOWN, -1);
-+ break;
-+ /* sync */
-+ case 2:
-+ if (my_mode == 1) {
-+ my_mode = 2;
-+ my_led_off(GPIO_ADSL_ACT, -1);
-+ my_blink_count++;
-+ }
-+ break;
-+ /* on */
-+ case 3:
-+ my_mode = 3;
-+ my_blink_count = 0;
-+ my_led_off(GPIO_ADSL_DOWN, -1);
-+ my_led_on(GPIO_ADSL_ACT, -1);
-+ break;
-+ /* off */
-+ case 4:
-+ my_mode = 4;
-+ my_led_off(GPIO_ADSL_DOWN, -1);
-+ my_blink_count++;
-+ break;
-+ }
-+ } /* Ron add for ADSL LED Blink */
-+#endif
-+ if ((mod >= MAX_MOD_ID) || (state >= MAX_STATE_ID)) {
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return;
-+ }
-+ if (modArr[mod] == NULL) {
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return;
-+ }
-+ if (modArr[mod]->states[state] == NULL) {
-+ spin_unlock_irqrestore(&config_lock, flags);
-+ return;
-+ }
-+ /* Call the function handler */
-+ modArr[mod]->states[state]->handler(modArr[mod]->states[state]);
-+
-+ spin_unlock_irqrestore(&config_lock, flags);
-+}
-+
-+void register_led_drv(int device, led_reg_t * pInfo)
-+{
-+ unsigned int flags;
-+ struct timer_list *pTimer = NULL;
-+
-+ spin_lock_irqsave(&config_lock, flags);
-+
-+ led_arr[device].led = pInfo;
-+ if (led_arr[device].led->init != 0x00)
-+ led_arr[device].led->init(led_arr[device].led->param);
-+ if (led_arr[device].led->offfunc != 0x00)
-+ led_arr[device].led->offfunc(led_arr[device].led->param);
-+
-+ /* Create a timer for blinking */
-+ pTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
-+ init_timer(pTimer);
-+ pTimer->function = led_timer_func;
-+ pTimer->data = 0;
-+ led_arr[device].pTimer = pTimer;
-+ led_arr[device].timer_running = 0;
-+
-+ spin_unlock_irqrestore(&config_lock, flags);
-+
-+ return;
-+}
-+
-+void deregister_led_drv(int device)
-+{
-+ unsigned int flags;
-+
-+ spin_lock_irqsave(&config_lock, flags);
-+ led_arr[device].led = NULL;
-+
-+ if (led_arr[device].pTimer != NULL) {
-+ del_timer(led_arr[device].pTimer);
-+ kfree(led_arr[device].pTimer);
-+ }
-+ spin_unlock_irqrestore(&config_lock, flags);
-+
-+ return;
-+}
-+
-+EXPORT_SYMBOL_NOVERS(led_init);
-+EXPORT_SYMBOL_NOVERS(led_operation);
-+EXPORT_SYMBOL_NOVERS(register_led_drv);
-+EXPORT_SYMBOL_NOVERS(deregister_led_drv);
-diff -urN kernel-base/arch/mips/ar7/ar7/Makefile kernel-current/arch/mips/ar7/ar7/Makefile
---- kernel-base/arch/mips/ar7/ar7/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/Makefile 2005-07-10 09:31:33.038504888 +0200
-@@ -0,0 +1,31 @@
-+# $Id$
-+# Copyright (C) $Date$ $Author$
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-+
-+.S.s:
-+ $(CPP) $(AFLAGS) $< -o $*.s
-+
-+.S.o:
-+ $(CC) $(AFLAGS) -c $< -o $*.o
-+
-+EXTRA_CFLAGS := -DLITTLE_ENDIAN -D_LINK_KSEG0_
-+
-+O_TARGET := ar7.o
-+
-+export-objs:= ledmod.o gpio.o
-+obj-y += ar7_paging.o ar7_jump.o ledmod.o gpio.o tnetd73xx_misc.o
-+
-+include $(TOPDIR)/Rules.make
-diff -urN kernel-base/arch/mips/ar7/ar7/tnetd73xx_misc.c kernel-current/arch/mips/ar7/ar7/tnetd73xx_misc.c
---- kernel-base/arch/mips/ar7/ar7/tnetd73xx_misc.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/ar7/tnetd73xx_misc.c 2005-07-10 09:57:09.935860976 +0200
-@@ -0,0 +1,926 @@
-+/******************************************************************************
-+ * FILE PURPOSE: TNETD73xx Misc modules API Source
-+ ******************************************************************************
-+ * FILE NAME: tnetd73xx_misc.c
-+ *
-+ * DESCRIPTION: Clock Control, Reset Control, Power Management, GPIO
-+ * FSER Modules API
-+ * As per TNETD73xx specifications
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - Sharath Kumar PSP TII
-+ * 14 Feb 03 - Anant Gole PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+
-+#include <linux/stddef.h>
-+#include <linux/types.h>
-+#include <asm/ar7/tnetd73xx.h>
-+#include <asm/ar7/tnetd73xx_misc.h>
-+
-+#define TRUE 1
-+#define FALSE 0
-+
-+/* TNETD73XX Revision */
-+__u32 tnetd73xx_get_revision(void)
-+{
-+ /* Read Chip revision register - This register is from GPIO module */
-+ return ( (__u32) REG32_DATA(TNETD73XX_CVR));
-+}
-+
-+/*****************************************************************************
-+ * Reset Control Module
-+ *****************************************************************************/
-+
-+
-+void tnetd73xx_reset_ctrl(TNETD73XX_RESET_MODULE_T reset_module, TNETD73XX_RESET_CTRL_T reset_ctrl)
-+{
-+ __u32 reset_status;
-+
-+ /* read current reset register */
-+ REG32_READ(TNETD73XX_RST_CTRL_PRCR, reset_status);
-+
-+ if (reset_ctrl == OUT_OF_RESET)
-+ {
-+ /* bring module out of reset */
-+ reset_status |= (1 << reset_module);
-+ }
-+ else
-+ {
-+ /* put module in reset */
-+ reset_status &= (~(1 << reset_module));
-+ }
-+
-+ /* write to the reset register */
-+ REG32_WRITE(TNETD73XX_RST_CTRL_PRCR, reset_status);
-+}
-+
-+
-+TNETD73XX_RESET_CTRL_T tnetd73xx_get_reset_status (TNETD73XX_RESET_MODULE_T reset_module)
-+{
-+ __u32 reset_status;
-+
-+ REG32_READ(TNETD73XX_RST_CTRL_PRCR, reset_status);
-+ return ( (reset_status & (1 << reset_module)) ? OUT_OF_RESET : IN_RESET );
-+}
-+
-+void tnetd73xx_sys_reset(TNETD73XX_SYS_RST_MODE_T mode)
-+{
-+ REG32_WRITE(TNETD73XX_RST_CTRL_SWRCR, mode);
-+}
-+
-+#define TNETD73XX_RST_CTRL_RSR_MASK 0x3
-+
-+TNETD73XX_SYS_RESET_STATUS_T tnetd73xx_get_sys_last_reset_status()
-+{
-+ __u32 sys_reset_status;
-+
-+ REG32_READ(TNETD73XX_RST_CTRL_RSR, sys_reset_status);
-+
-+ return ( (TNETD73XX_SYS_RESET_STATUS_T) (sys_reset_status & TNETD73XX_RST_CTRL_RSR_MASK) );
-+}
-+
-+
-+/*****************************************************************************
-+ * Power Control Module
-+ *****************************************************************************/
-+#define TNETD73XX_GLOBAL_POWER_DOWN_MASK 0x3FFFFFFF /* bit 31, 30 masked */
-+#define TNETD73XX_GLOBAL_POWER_DOWN_BIT 30 /* shift to bit 30, 31 */
-+
-+
-+void tnetd73xx_power_ctrl(TNETD73XX_POWER_MODULE_T power_module, TNETD73XX_POWER_CTRL_T power_ctrl)
-+{
-+ __u32 power_status;
-+
-+ /* read current power down control register */
-+ REG32_READ(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+
-+ if (power_ctrl == POWER_CTRL_POWER_DOWN)
-+ {
-+ /* power down the module */
-+ power_status |= (1 << power_module);
-+ }
-+ else
-+ {
-+ /* power on the module */
-+ power_status &= (~(1 << power_module));
-+ }
-+
-+ /* write to the reset register */
-+ REG32_WRITE(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+}
-+
-+TNETD73XX_POWER_CTRL_T tnetd73xx_get_pwr_status(TNETD73XX_POWER_MODULE_T power_module)
-+{
-+ __u32 power_status;
-+
-+ /* read current power down control register */
-+ REG32_READ(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+
-+ return ( (power_status & (1 << power_module)) ? POWER_CTRL_POWER_DOWN : POWER_CTRL_POWER_UP );
-+}
-+
-+void tnetd73xx_set_global_pwr_mode(TNETD73XX_SYS_POWER_MODE_T power_mode)
-+{
-+ __u32 power_status;
-+
-+ /* read current power down control register */
-+ REG32_READ(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+
-+ power_status &= TNETD73XX_GLOBAL_POWER_DOWN_MASK;
-+ power_status |= ( power_mode << TNETD73XX_GLOBAL_POWER_DOWN_BIT);
-+
-+ /* write to power down control register */
-+ REG32_WRITE(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+}
-+
-+TNETD73XX_SYS_POWER_MODE_T tnetd73xx_get_global_pwr_mode()
-+{
-+ __u32 power_status;
-+
-+ /* read current power down control register */
-+ REG32_READ(TNETD73XX_POWER_CTRL_PDCR, power_status);
-+
-+ power_status &= (~TNETD73XX_GLOBAL_POWER_DOWN_MASK);
-+ power_status = ( power_status >> TNETD73XX_GLOBAL_POWER_DOWN_BIT);
-+
-+ return ( (TNETD73XX_SYS_POWER_MODE_T) power_status );
-+}
-+
-+
-+/*****************************************************************************
-+ * Wakeup Control
-+ *****************************************************************************/
-+
-+#define TNETD73XX_WAKEUP_POLARITY_BIT 16
-+
-+void tnetd73xx_wakeup_ctrl(TNETD73XX_WAKEUP_INTERRUPT_T wakeup_int,
-+ TNETD73XX_WAKEUP_CTRL_T wakeup_ctrl,
-+ TNETD73XX_WAKEUP_POLARITY_T wakeup_polarity)
-+{
-+ __u32 wakeup_status;
-+
-+ /* read the wakeup control register */
-+ REG32_READ(TNETD73XX_POWER_CTRL_WKCR, wakeup_status);
-+
-+ /* enable/disable */
-+ if (wakeup_ctrl == WAKEUP_ENABLED)
-+ {
-+ /* enable wakeup */
-+ wakeup_status |= wakeup_int;
-+ }
-+ else
-+ {
-+ /* disable wakeup */
-+ wakeup_status &= (~wakeup_int);
-+ }
-+
-+ /* set polarity */
-+ if (wakeup_polarity == WAKEUP_ACTIVE_LOW)
-+ {
-+ wakeup_status |= (wakeup_int << TNETD73XX_WAKEUP_POLARITY_BIT);
-+ }
-+ else
-+ {
-+ wakeup_status &= ~(wakeup_int << TNETD73XX_WAKEUP_POLARITY_BIT);
-+ }
-+
-+ /* write the wakeup control register */
-+ REG32_WRITE(TNETD73XX_POWER_CTRL_WKCR, wakeup_status);
-+}
-+
-+
-+/*****************************************************************************
-+ * FSER Control
-+ *****************************************************************************/
-+
-+void tnetd73xx_fser_ctrl(TNETD73XX_FSER_MODE_T fser_mode)
-+{
-+ REG32_WRITE(TNETD73XX_FSER_BASE, fser_mode);
-+}
-+
-+/*****************************************************************************
-+ * Clock Control
-+ *****************************************************************************/
-+
-+#define MIN(x,y) ( ((x) < (y)) ? (x) : (y) )
-+#define MAX(x,y) ( ((x) > (y)) ? (x) : (y) )
-+#define ABS(x) ( ((signed)(x) > 0) ? (x) : (-(x)) )
-+#define CEIL(x,y) ( ((x) + (y) / 2) / (y) )
-+
-+#define CLKC_CLKCR(x) (TNETD73XX_CLOCK_CTRL_BASE + 0x20 + (0x20 * (x)))
-+#define CLKC_CLKPLLCR(x) (TNETD73XX_CLOCK_CTRL_BASE + 0x30 + (0x20 * (x)))
-+
-+#define CLKC_PRE_DIVIDER 0x0000001F
-+#define CLKC_POST_DIVIDER 0x001F0000
-+
-+#define CLKC_PLL_STATUS 0x1
-+#define CLKC_PLL_FACTOR 0x0000F000
-+
-+#define BOOTCR_PLL_BYPASS (1 << 5)
-+#define BOOTCR_MIPS_ASYNC_MODE (1 << 25)
-+
-+#define MIPS_PLL_SELECT 0x00030000
-+#define SYSTEM_PLL_SELECT 0x0000C000
-+#define USB_PLL_SELECT 0x000C0000
-+#define ADSLSS_PLL_SELECT 0x00C00000
-+
-+#define MIPS_AFECLKI_SELECT 0x00000000
-+#define MIPS_REFCLKI_SELECT 0x00010000
-+#define MIPS_XTAL3IN_SELECT 0x00020000
-+
-+#define SYSTEM_AFECLKI_SELECT 0x00000000
-+#define SYSTEM_REFCLKI_SELECT 0x00004000
-+#define SYSTEM_XTAL3IN_SELECT 0x00008000
-+#define SYSTEM_MIPSPLL_SELECT 0x0000C000
-+
-+#define USB_SYSPLL_SELECT 0x00000000
-+#define USB_REFCLKI_SELECT 0x00040000
-+#define USB_XTAL3IN_SELECT 0x00080000
-+#define USB_MIPSPLL_SELECT 0x000C0000
-+
-+#define ADSLSS_AFECLKI_SELECT 0x00000000
-+#define ADSLSS_REFCLKI_SELECT 0x00400000
-+#define ADSLSS_XTAL3IN_SELECT 0x00800000
-+#define ADSLSS_MIPSPLL_SELECT 0x00C00000
-+
-+#define SYS_MAX CLK_MHZ(150)
-+#define SYS_MIN CLK_MHZ(1)
-+
-+#define MIPS_SYNC_MAX SYS_MAX
-+#define MIPS_ASYNC_MAX CLK_MHZ(160)
-+#define MIPS_MIN CLK_MHZ(1)
-+
-+#define USB_MAX CLK_MHZ(100)
-+#define USB_MIN CLK_MHZ(1)
-+
-+#define ADSL_MAX CLK_MHZ(180)
-+#define ADSL_MIN CLK_MHZ(1)
-+
-+#define PLL_MUL_MAXFACTOR 15
-+#define MAX_DIV_VALUE 32
-+#define MIN_DIV_VALUE 1
-+
-+#define MIN_PLL_INP_FREQ CLK_MHZ(8)
-+#define MAX_PLL_INP_FREQ CLK_MHZ(100)
-+
-+#define DIVIDER_LOCK_TIME 10100
-+#define PLL_LOCK_TIME 10100 * 75
-+
-+
-+
-+/****************************************************************************
-+ * DATA PURPOSE: PRIVATE Variables
-+ **************************************************************************/
-+static __u32 *clk_src[4];
-+static __u32 mips_pll_out;
-+static __u32 sys_pll_out;
-+static __u32 afeclk_inp;
-+static __u32 refclk_inp;
-+static __u32 xtal_inp;
-+static __u32 present_min;
-+static __u32 present_max;
-+
-+/* Forward References */
-+static __u32 find_gcd(__u32 min, __u32 max);
-+static __u32 compute_prediv( __u32 divider, __u32 min, __u32 max);
-+static void get_val(__u32 base_freq, __u32 output_freq,__u32 *multiplier, __u32 *divider);
-+static __u32 get_base_frequency(TNETD73XX_CLKC_ID_T clk_id);
-+static void find_approx(__u32 *,__u32 *,__u32);
-+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_clkc_init
-+ ****************************************************************************
-+ * Description: The routine initializes the internal variables depending on
-+ * on the sources selected for different clocks.
-+ ***************************************************************************/
-+void tnetd73xx_clkc_init(__u32 afeclk, __u32 refclk, __u32 xtal3in)
-+{
-+
-+ __u32 choice;
-+
-+ afeclk_inp = afeclk;
-+ refclk_inp = refclk;
-+ xtal_inp = xtal3in;
-+
-+ choice = REG32_DATA(TNETD73XX_DCL_BOOTCR) & MIPS_PLL_SELECT;
-+ switch(choice)
-+ {
-+ case MIPS_AFECLKI_SELECT:
-+ clk_src[CLKC_MIPS] = &afeclk_inp;
-+ break;
-+
-+ case MIPS_REFCLKI_SELECT:
-+ clk_src[CLKC_MIPS] = &refclk_inp;
-+ break;
-+
-+ case MIPS_XTAL3IN_SELECT:
-+ clk_src[CLKC_MIPS] = &xtal_inp;
-+ break;
-+
-+ default :
-+ clk_src[CLKC_MIPS] = 0;
-+
-+ }
-+
-+ choice = REG32_DATA(TNETD73XX_DCL_BOOTCR) & SYSTEM_PLL_SELECT;
-+ switch(choice)
-+ {
-+ case SYSTEM_AFECLKI_SELECT:
-+ clk_src[CLKC_SYS] = &afeclk_inp;
-+ break;
-+
-+ case SYSTEM_REFCLKI_SELECT:
-+ clk_src[CLKC_SYS] = &refclk_inp;
-+ break;
-+
-+ case SYSTEM_XTAL3IN_SELECT:
-+ clk_src[CLKC_SYS] = &xtal_inp;
-+ break;
-+
-+ case SYSTEM_MIPSPLL_SELECT:
-+ clk_src[CLKC_SYS] = &mips_pll_out;
-+ break;
-+
-+ default :
-+ clk_src[CLKC_SYS] = 0;
-+
-+ }
-+
-+
-+ choice = REG32_DATA(TNETD73XX_DCL_BOOTCR) & ADSLSS_PLL_SELECT;
-+ switch(choice)
-+ {
-+ case ADSLSS_AFECLKI_SELECT:
-+ clk_src[CLKC_ADSLSS] = &afeclk_inp;
-+ break;
-+
-+ case ADSLSS_REFCLKI_SELECT:
-+ clk_src[CLKC_ADSLSS] = &refclk_inp;
-+ break;
-+
-+ case ADSLSS_XTAL3IN_SELECT:
-+ clk_src[CLKC_ADSLSS] = &xtal_inp;
-+ break;
-+
-+ case ADSLSS_MIPSPLL_SELECT:
-+ clk_src[CLKC_ADSLSS] = &mips_pll_out;
-+ break;
-+
-+ default :
-+ clk_src[CLKC_ADSLSS] = 0;
-+
-+ }
-+
-+
-+ choice = REG32_DATA(TNETD73XX_DCL_BOOTCR) & USB_PLL_SELECT;
-+ switch(choice)
-+ {
-+ case USB_SYSPLL_SELECT:
-+ clk_src[CLKC_USB] = &sys_pll_out ;
-+ break;
-+
-+ case USB_REFCLKI_SELECT:
-+ clk_src[CLKC_USB] = &refclk_inp;
-+ break;
-+
-+ case USB_XTAL3IN_SELECT:
-+ clk_src[CLKC_USB] = &xtal_inp;
-+ break;
-+
-+ case USB_MIPSPLL_SELECT:
-+ clk_src[CLKC_USB] = &mips_pll_out;
-+ break;
-+
-+ default :
-+ clk_src[CLKC_USB] = 0;
-+
-+ }
-+}
-+
-+
-+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_clkc_set_freq
-+ ****************************************************************************
-+ * Description: The above routine is called to set the output_frequency of the
-+ * selected clock(using clk_id) to the required value given
-+ * by the variable output_freq.
-+ ***************************************************************************/
-+TNETD73XX_ERR tnetd73xx_clkc_set_freq
-+(
-+ TNETD73XX_CLKC_ID_T clk_id,
-+ __u32 output_freq
-+)
-+{
-+ __u32 base_freq;
-+ __u32 multiplier;
-+ __u32 divider;
-+ __u32 min_prediv;
-+ __u32 max_prediv;
-+ __u32 prediv;
-+ __u32 postdiv;
-+ __u32 temp;
-+
-+ /* check if PLLs are bypassed*/
-+ if(REG32_DATA(TNETD73XX_DCL_BOOTCR) & BOOTCR_PLL_BYPASS)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+
-+ /*check if the requested output_frequency is in valid range*/
-+ switch( clk_id )
-+ {
-+ case CLKC_SYS:
-+ if( output_freq < SYS_MIN || output_freq > SYS_MAX)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+ present_min = SYS_MIN;
-+ present_max = SYS_MAX;
-+ break;
-+
-+ case CLKC_MIPS:
-+ if((output_freq < MIPS_MIN) ||
-+ (output_freq > ((REG32_DATA(TNETD73XX_DCL_BOOTCR) & BOOTCR_MIPS_ASYNC_MODE) ? MIPS_ASYNC_MAX: MIPS_SYNC_MAX)))
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+ present_min = MIPS_MIN;
-+ present_max = (REG32_DATA(TNETD73XX_DCL_BOOTCR) & BOOTCR_MIPS_ASYNC_MODE) ? MIPS_ASYNC_MAX: MIPS_SYNC_MAX;
-+ break;
-+
-+ case CLKC_USB:
-+ if( output_freq < USB_MIN || output_freq > USB_MAX)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+ present_min = USB_MIN;
-+ present_max = USB_MAX;
-+ break;
-+
-+ case CLKC_ADSLSS:
-+ if( output_freq < ADSL_MIN || output_freq > ADSL_MAX)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+ present_min = ADSL_MIN;
-+ present_max = ADSL_MAX;
-+ break;
-+ }
-+
-+
-+ base_freq = get_base_frequency(clk_id);
-+
-+
-+ /* check for minimum base frequency value */
-+ if( base_freq < MIN_PLL_INP_FREQ)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+
-+ get_val(output_freq, base_freq, &multiplier, ÷r);
-+
-+ /* check multiplier range */
-+ if( (multiplier > PLL_MUL_MAXFACTOR) || (multiplier <= 0) )
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+
-+ /* check divider value */
-+ if( divider == 0 )
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+
-+ /*compute minimum and maximum predivider values */
-+ min_prediv = MAX(base_freq / MAX_PLL_INP_FREQ + 1, divider / MAX_DIV_VALUE + 1);
-+ max_prediv = MIN(base_freq / MIN_PLL_INP_FREQ, MAX_DIV_VALUE);
-+
-+ /*adjust the value of divider so that it not less than minimum predivider value*/
-+ if (divider < min_prediv)
-+ {
-+ temp = CEIL(min_prediv, divider);
-+ if ((temp * multiplier) > PLL_MUL_MAXFACTOR)
-+ {
-+ return TNETD73XX_ERR_ERROR ;
-+ }
-+ else
-+ {
-+ multiplier = temp * multiplier;
-+ divider = min_prediv;
-+ }
-+
-+ }
-+
-+ /* compute predivider and postdivider values */
-+ prediv = compute_prediv (divider, min_prediv, max_prediv);
-+ postdiv = CEIL(divider,prediv);
-+
-+ /*return fail if postdivider value falls out of range */
-+ if(postdiv > MAX_DIV_VALUE)
-+ {
-+ return TNETD73XX_ERR_ERROR;
-+ }
-+
-+
-+ /*write predivider and postdivider values*/
-+ /* pre-Divider and post-divider are 5 bit N+1 dividers */
-+ REG32_WRITE(CLKC_CLKCR(clk_id), ((postdiv -1) & 0x1F) << 16 | ((prediv -1) & 0x1F) );
-+
-+ /*wait for divider output to stabilise*/
-+ for(temp =0; temp < DIVIDER_LOCK_TIME; temp++);
-+
-+ /*write to PLL clock register*/
-+
-+ if(clk_id == CLKC_SYS)
-+ {
-+ /* but before writing put DRAM to hold mode */
-+ REG32_DATA(TNETD73XX_EMIF_SDRAM_CFG) |= 0x80000000;
-+ }
-+ /*Bring PLL into div mode */
-+ REG32_WRITE(CLKC_CLKPLLCR(clk_id), 0x4);
-+
-+ /*compute the word to be written to PLLCR
-+ *corresponding to multiplier value
-+ */
-+ multiplier = (((multiplier - 1) & 0xf) << 12)| ((255 <<3) | 0x0e);
-+
-+ /* wait till PLL enters div mode */
-+ while(REG32_DATA(CLKC_CLKPLLCR(clk_id)) & CLKC_PLL_STATUS)
-+ /*nothing*/;
-+
-+ REG32_WRITE(CLKC_CLKPLLCR(clk_id), multiplier);
-+
-+ while(!REG32_DATA(CLKC_CLKPLLCR(clk_id)) & CLKC_PLL_STATUS)
-+ /*nothing*/;
-+
-+
-+ /*wait for External pll to lock*/
-+ for(temp =0; temp < PLL_LOCK_TIME; temp++);
-+
-+ if(clk_id == CLKC_SYS)
-+ {
-+ /* Bring DRAM out of hold */
-+ REG32_DATA(TNETD73XX_EMIF_SDRAM_CFG) &= ~0x80000000;
-+ }
-+
-+ return TNETD73XX_ERR_OK ;
-+}
-+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_clkc_get_freq
-+ ****************************************************************************
-+ * Description: The above routine is called to get the output_frequency of the
-+ * selected clock( clk_id)
-+ ***************************************************************************/
-+__u32 tnetd73xx_clkc_get_freq
-+(
-+ TNETD73XX_CLKC_ID_T clk_id
-+)
-+{
-+
-+ __u32 clk_ctrl_register;
-+ __u32 clk_pll_setting;
-+ __u32 clk_predivider;
-+ __u32 clk_postdivider;
-+ __u16 pll_factor;
-+ __u32 base_freq;
-+ __u32 divider;
-+
-+ base_freq = get_base_frequency(clk_id);
-+
-+ clk_ctrl_register = REG32_DATA(CLKC_CLKCR(clk_id));
-+
-+ /* pre-Divider and post-divider are 5 bit N+1 dividers */
-+ clk_predivider = (CLKC_PRE_DIVIDER & clk_ctrl_register) + 1;
-+ clk_postdivider = ((CLKC_POST_DIVIDER & clk_ctrl_register) >> 16) + 1;
-+
-+ divider = clk_predivider * clk_postdivider;
-+
-+
-+ if( (REG32_DATA(TNETD73XX_DCL_BOOTCR) & BOOTCR_PLL_BYPASS))
-+ {
-+ return (CEIL(base_freq, divider)); /* PLLs bypassed.*/
-+ }
-+
-+
-+ else
-+ {
-+ /* return the current clock speed based upon the PLL setting */
-+ clk_pll_setting = REG32_DATA(CLKC_CLKPLLCR(clk_id));
-+
-+ /* Get the PLL multiplication factor */
-+ pll_factor = ((clk_pll_setting & CLKC_PLL_FACTOR) >> 12) + 1;
-+
-+ /* Check if we're in divide mode or multiply mode */
-+ if((clk_pll_setting & 0x1) == 0)
-+ {
-+ /* We're in divide mode */
-+ if(pll_factor < 0x10)
-+ return (CEIL(base_freq >> 1, divider));
-+ else
-+ return (CEIL(base_freq >> 2, divider));
-+ }
-+
-+ else /* We're in PLL mode */
-+ {
-+ /* See if PLLNDIV & PLLDIV are set */
-+ if((clk_pll_setting & 0x0800) && (clk_pll_setting & 0x2))
-+ {
-+ if(clk_pll_setting & 0x1000)
-+ {
-+ /* clk = base_freq * k/2 */
-+ return(CEIL((base_freq * pll_factor) >> 1, divider));
-+ }
-+ else
-+ {
-+ /* clk = base_freq * (k-1) / 4)*/
-+ return(CEIL((base_freq * (pll_factor - 1)) >>2, divider));
-+ }
-+ }
-+ else
-+ {
-+ if(pll_factor < 0x10)
-+ {
-+ /* clk = base_freq * k */
-+ return(CEIL(base_freq * pll_factor, divider));
-+ }
-+
-+ else
-+ {
-+ /* clk = base_freq */
-+ return(CEIL(base_freq, divider));
-+ }
-+ }
-+ }
-+ return(0); /* Should never reach here */
-+
-+ }
-+
-+}
-+
-+
-+/* local helper functions */
-+
-+ /****************************************************************************
-+ * FUNCTION: get_base_frequency
-+ ****************************************************************************
-+ * Description: The above routine is called to get base frequency of the clocks.
-+ ***************************************************************************/
-+
-+static __u32 get_base_frequency(TNETD73XX_CLKC_ID_T clk_id)
-+{
-+ /* update the current MIPs PLL output value, if the required
-+ * source is MIPS PLL
-+ */
-+ if ( clk_src[clk_id] == &mips_pll_out)
-+ {
-+ *clk_src[clk_id] = tnetd73xx_clkc_get_freq(CLKC_MIPS);
-+ }
-+
-+
-+ /* update the current System PLL output value, if the required
-+ * source is system PLL
-+ */
-+ if ( clk_src[clk_id] == &sys_pll_out)
-+ {
-+ *clk_src[clk_id] = tnetd73xx_clkc_get_freq(CLKC_SYS);
-+ }
-+
-+ return (*clk_src[clk_id]);
-+
-+}
-+
-+
-+
-+/****************************************************************************
-+ * FUNCTION: find_gcd
-+ ****************************************************************************
-+ * Description: The above routine is called to find gcd of 2 numbers.
-+ ***************************************************************************/
-+static __u32 find_gcd
-+(
-+__u32 min,
-+__u32 max
-+)
-+{
-+ if (max % min == 0)
-+ {
-+ return min;
-+ }
-+ else
-+ {
-+ return find_gcd(max % min, min);
-+ }
-+}
-+
-+/****************************************************************************
-+ * FUNCTION: compute_prediv
-+ ****************************************************************************
-+ * Description: The above routine is called to compute predivider value
-+ ***************************************************************************/
-+static __u32 compute_prediv(__u32 divider, __u32 min, __u32 max)
-+{
-+__u16 prediv;
-+
-+/* return the divider itself it it falls within the range of predivider*/
-+if (min <= divider && divider <= max)
-+{
-+ return divider;
-+}
-+
-+/* find a value for prediv such that it is a factor of divider */
-+for (prediv = max; prediv >= min ; prediv--)
-+{
-+ if ( (divider % prediv) == 0 )
-+ {
-+ return prediv;
-+ }
-+}
-+
-+/* No such factor exists, return min as prediv */
-+return min;
-+}
-+
-+/****************************************************************************
-+ * FUNCTION: get_val
-+ ****************************************************************************
-+ * Description: This routine is called to get values of divider and multiplier.
-+ ***************************************************************************/
++ max_low_pfn = max_pfn;
+
-+static void get_val(__u32 output_freq, __u32 base_freq,__u32 *multiplier, __u32 *divider)
-+{
-+ __u32 temp_mul;
-+ __u32 temp_div;
-+ __u32 gcd;
-+ __u32 min_freq;
-+ __u32 max_freq;
++ /*
++ * Partially used pages are not usable - thus we are
++ * rounding upwards:
++ */
+
-+ /* find gcd of base_freq, output_freq */
-+ min_freq = (base_freq < output_freq) ? base_freq : output_freq;
-+ max_freq = (base_freq > output_freq) ? base_freq : output_freq;
-+ gcd = find_gcd(min_freq , max_freq);
++ start_pfn = PFN_UP(__pa(&_end));
+
-+ if(gcd == 0)
-+ return; /* ERROR */
++ /*
++ * Find a proper area for the bootmem bitmap. After this
++ * bootstrap step all allocations (until the page allocator is
++ * intact) must be done via bootmem_alloc().
++ */
+
-+ /* compute values of multiplier and divider */
-+ temp_mul = output_freq / gcd;
-+ temp_div = base_freq / gcd;
++ bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
++ __MEMORY_START>>PAGE_SHIFT, max_low_pfn);
+
+
-+ /* set multiplier such that 1 <= multiplier <= PLL_MUL_MAXFACTOR */
-+ if( temp_mul > PLL_MUL_MAXFACTOR )
-+ {
-+ if((temp_mul / temp_div) > PLL_MUL_MAXFACTOR)
-+ return;
++ /*
++ * Register fully available low RAM pages with the bootmem allocator.
++ */
+
-+ find_approx(&temp_mul,&temp_div,base_freq);
-+ }
++ {
++ unsigned long curr_pfn, last_pfn, pages;
+
-+ *multiplier = temp_mul;
-+ *divider = temp_div;
-+}
++ /*
++ * We are rounding up the start address of usable memory:
++ */
++ curr_pfn = PFN_UP(__MEMORY_START);
+
-+/****************************************************************************
-+ * FUNCTION: find_approx
-+ ****************************************************************************
-+ * Description: This function gets the approx value of num/denom.
-+ ***************************************************************************/
++ /*
++ * ... and at the end of the usable range downwards:
++ */
++ last_pfn = PFN_DOWN(__pa(memory_end));
+
-+static void find_approx(__u32 *num,__u32 *denom,__u32 base_freq)
-+{
-+ __u32 num1;
-+ __u32 denom1;
-+ __u32 num2;
-+ __u32 denom2;
-+ int closest;
-+ int prev_closest;
-+ __u32 temp_num;
-+ __u32 temp_denom;
-+ __u32 normalize;
-+ __u32 gcd;
-+ __u32 output_freq;
-+
-+ num1 = *num;
-+ denom1 = *denom;
-+
-+ prev_closest = 0x7fffffff; /* maximum possible value */
-+ num2 = num1;
-+ denom2 = denom1;
-+
-+ /* start with max */
-+ for(temp_num = 15; temp_num >=1; temp_num--)
-+ {
++ if (last_pfn > max_low_pfn)
++ last_pfn = max_low_pfn;
+
-+ temp_denom = CEIL(temp_num * denom1, num1);
-+ output_freq = (temp_num * base_freq) / temp_denom;
++ pages = last_pfn - curr_pfn;
+
-+ if(temp_denom < 1)
-+ {
-+ break;
-+ }
-+ else
-+ {
-+ normalize = CEIL(num1,temp_num);
-+ closest = (ABS((num1 * (temp_denom) ) - (temp_num * denom1))) * normalize;
-+ if(closest < prev_closest && output_freq > present_min && output_freq <present_max)
-+ {
-+ prev_closest = closest;
-+ num2 = temp_num;
-+ denom2 = temp_denom;
-+ }
-+
-+ }
+
-+ }
++ free_bootmem_node(NODE_DATA(0), PFN_PHYS(curr_pfn),
++ PFN_PHYS(pages));
++ }
+
-+ gcd = find_gcd(num2,denom2);
-+ num2 = num2 / gcd;
-+ denom2 = denom2 /gcd;
++ /*
++ * Reserve the kernel text and
++ * Reserve the bootmem bitmap. We do this in two steps (first step
++ * was init_bootmem()), because this catches the (definitely buggy)
++ * case of us accidentally initializing the bootmem allocator with
++ * an invalid RAM area.
++ */
++ reserve_bootmem_node(NODE_DATA(0), __MEMORY_START+PAGE_SIZE,
++ (PFN_PHYS(start_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START);
+
-+ *num = num2;
-+ *denom = denom2;
++ /*
++ * reserve physical page 0 - it's a special BIOS page on many boxes,
++ * enabling clean reboots, SMP operation, laptop functions.
++ */
++ reserve_bootmem_node(NODE_DATA(0), __MEMORY_START, PAGE_SIZE);
+}
+
++extern char __init_begin, __init_end;
+
-+/*****************************************************************************
-+ * GPIO Control
-+ *****************************************************************************/
-+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_gpio_init
-+ ***************************************************************************/
-+void tnetd73xx_gpio_init()
++void free_initmem(void)
+{
-+ /* Bring module out of reset */
-+ tnetd73xx_reset_ctrl(RESET_MODULE_GPIO, OUT_OF_RESET);
-+ REG32_WRITE(TNETD73XX_GPIOENR, 0xFFFFFFFF);
-+}
++ unsigned long addr;
++ // prom_free_prom_memory ();
+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_gpio_ctrl
-+ ***************************************************************************/
-+void tnetd73xx_gpio_ctrl(TNETD73XX_GPIO_PIN_T gpio_pin,
-+ TNETD73XX_GPIO_PIN_MODE_T pin_mode,
-+ TNETD73XX_GPIO_PIN_DIRECTION_T pin_direction)
-+{
-+ __u32 pin_status;
-+ REG32_READ(TNETD73XX_GPIOENR, pin_status);
-+ if (pin_mode == GPIO_PIN)
-+ {
-+ pin_status |= (1 << gpio_pin);
-+ REG32_WRITE(TNETD73XX_GPIOENR, pin_status);
-+
-+ /* Set pin direction */
-+ REG32_READ(TNETD73XX_GPIOPDIRR, pin_status);
-+ if (pin_direction == GPIO_INPUT_PIN)
-+ {
-+ pin_status |= (1 << gpio_pin);
-+ }
-+ else /* GPIO_OUTPUT_PIN */
-+ {
-+ pin_status &= (~(1 << gpio_pin));
-+ }
-+ REG32_WRITE(TNETD73XX_GPIOPDIRR, pin_status);
-+ }
-+ else /* FUNCTIONAL PIN */
-+ {
-+ pin_status &= (~(1 << gpio_pin));
-+ REG32_WRITE(TNETD73XX_GPIOENR, pin_status);
-+ }
-+
-+}
-+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_gpio_out
-+ ***************************************************************************/
-+void tnetd73xx_gpio_out(TNETD73XX_GPIO_PIN_T gpio_pin, int value)
-+{
-+ __u32 pin_value;
-+
-+ REG32_READ(TNETD73XX_GPIODOUTR, pin_value);
-+ if (value == TRUE)
-+ {
-+ pin_value |= (1 << gpio_pin);
-+ }
-+ else
-+ {
-+ pin_value &= (~(1 << gpio_pin));
-+ }
-+ REG32_WRITE(TNETD73XX_GPIODOUTR, pin_value);
++ addr = (unsigned long) &__init_begin;
++ while (addr < (unsigned long) &__init_end) {
++ ClearPageReserved(virt_to_page(addr));
++ set_page_count(virt_to_page(addr), 1);
++ free_page(addr);
++ totalram_pages++;
++ addr += PAGE_SIZE;
++ }
++ printk("Freeing unused kernel memory: %dk freed\n",
++ (&__init_end - &__init_begin) >> 10);
+}
+
-+/****************************************************************************
-+ * FUNCTION: tnetd73xx_gpio_in
-+ ***************************************************************************/
-+int tnetd73xx_gpio_in(TNETD73XX_GPIO_PIN_T gpio_pin)
++void si_meminfo(struct sysinfo *val)
+{
-+ __u32 pin_value;
-+ REG32_READ(TNETD73XX_GPIODINR, pin_value);
-+ return ( (pin_value & (1 << gpio_pin)) ? TRUE : FALSE );
-+}
++ val->totalram = totalram_pages;
++ val->sharedram = 0;
++ val->freeram = nr_free_pages();
++ val->bufferram = atomic_read(&buffermem_pages);
++ val->totalhigh = 0;
++ val->freehigh = nr_free_highpages();
++ val->mem_unit = PAGE_SIZE;
+
++ return;
++}
diff -urN kernel-base/arch/mips/ar7/cmdline.c kernel-current/arch/mips/ar7/cmdline.c
--- kernel-base/arch/mips/ar7/cmdline.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/cmdline.c 2005-07-10 06:40:39.584266864 +0200
++++ kernel-current/arch/mips/ar7/cmdline.c 2005-07-10 06:40:39.584266000 +0200
@@ -0,0 +1,64 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/ar7/init.c kernel-current/arch/mips/ar7/init.c
--- kernel-base/arch/mips/ar7/init.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/init.c 2005-07-10 06:40:39.584266864 +0200
-@@ -0,0 +1,146 @@
++++ kernel-current/arch/mips/ar7/init.c 2005-07-10 17:53:38.565319696 +0200
+@@ -0,0 +1,144 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved.
+
+ return 0;
+}
-+
-+EXPORT_SYMBOL(prom_getenv);
diff -urN kernel-base/arch/mips/ar7/irq.c kernel-current/arch/mips/ar7/irq.c
--- kernel-base/arch/mips/ar7/irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/irq.c 2005-07-10 10:02:30.212171576 +0200
++++ kernel-current/arch/mips/ar7/irq.c 2005-07-10 17:53:17.841470200 +0200
@@ -0,0 +1,705 @@
+/*
+ * Nitin Dhingra, iamnd@ti.com
+}
diff -urN kernel-base/arch/mips/ar7/Makefile kernel-current/arch/mips/ar7/Makefile
--- kernel-base/arch/mips/ar7/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/Makefile 2005-07-10 08:23:55.081408136 +0200
-@@ -0,0 +1,29 @@
++++ kernel-current/arch/mips/ar7/Makefile 2005-07-10 17:53:46.635092904 +0200
+@@ -0,0 +1,28 @@
+# $Id$
+# Copyright (C) $Date$ $Author$
+#
+
+O_TARGET := ar7.o
+
-+export-objs := init.o irq.o
+obj-y := setup.o irq.o mipsIRQ.o reset.o init.o memory.o printf.o cmdline.o time.o
+
+include $(TOPDIR)/Rules.make
diff -urN kernel-base/arch/mips/ar7/memory.c kernel-current/arch/mips/ar7/memory.c
--- kernel-base/arch/mips/ar7/memory.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/memory.c 2005-07-10 06:40:39.586266560 +0200
++++ kernel-current/arch/mips/ar7/memory.c 2005-07-10 06:40:39.586266000 +0200
@@ -0,0 +1,130 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/ar7/mipsIRQ.S kernel-current/arch/mips/ar7/mipsIRQ.S
--- kernel-base/arch/mips/ar7/mipsIRQ.S 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/mipsIRQ.S 2005-07-10 06:40:39.587266408 +0200
++++ kernel-current/arch/mips/ar7/mipsIRQ.S 2005-07-10 06:40:39.587266000 +0200
@@ -0,0 +1,120 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+END(mipsIRQ)
diff -urN kernel-base/arch/mips/ar7/printf.c kernel-current/arch/mips/ar7/printf.c
--- kernel-base/arch/mips/ar7/printf.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/printf.c 2005-07-10 06:40:39.587266408 +0200
++++ kernel-current/arch/mips/ar7/printf.c 2005-07-10 06:40:39.587266000 +0200
@@ -0,0 +1,54 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/ar7/reset.c kernel-current/arch/mips/ar7/reset.c
--- kernel-base/arch/mips/ar7/reset.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/reset.c 2005-07-10 06:40:39.587266408 +0200
++++ kernel-current/arch/mips/ar7/reset.c 2005-07-10 06:40:39.587266000 +0200
@@ -0,0 +1,54 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/ar7/setup.c kernel-current/arch/mips/ar7/setup.c
--- kernel-base/arch/mips/ar7/setup.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/setup.c 2005-07-10 06:40:39.588266256 +0200
++++ kernel-current/arch/mips/ar7/setup.c 2005-07-10 06:40:39.588266000 +0200
@@ -0,0 +1,120 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/ar7/time.c kernel-current/arch/mips/ar7/time.c
--- kernel-base/arch/mips/ar7/time.c 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/arch/mips/ar7/time.c 2005-07-10 06:40:39.588266256 +0200
++++ kernel-current/arch/mips/ar7/time.c 2005-07-10 06:40:39.588266000 +0200
@@ -0,0 +1,125 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+}
diff -urN kernel-base/arch/mips/config-shared.in kernel-current/arch/mips/config-shared.in
--- kernel-base/arch/mips/config-shared.in 2005-07-10 03:00:44.784181376 +0200
-+++ kernel-current/arch/mips/config-shared.in 2005-07-10 06:40:39.589266104 +0200
++++ kernel-current/arch/mips/config-shared.in 2005-07-10 06:40:39.589266000 +0200
@@ -20,6 +20,16 @@
mainmenu_option next_comment
comment 'Machine selection'
"$CONFIG_IBM_WORKPAD" = "y" -o \
diff -urN kernel-base/arch/mips/kernel/irq.c kernel-current/arch/mips/kernel/irq.c
--- kernel-base/arch/mips/kernel/irq.c 2005-07-10 03:00:44.784181376 +0200
-+++ kernel-current/arch/mips/kernel/irq.c 2005-07-10 06:40:39.589266104 +0200
++++ kernel-current/arch/mips/kernel/irq.c 2005-07-10 06:40:39.589266000 +0200
@@ -76,6 +76,7 @@
* Generic, controller-independent functions:
*/
* IRQ autodetection code..
diff -urN kernel-base/arch/mips/kernel/mips_ksyms.c kernel-current/arch/mips/kernel/mips_ksyms.c
--- kernel-base/arch/mips/kernel/mips_ksyms.c 2004-02-18 14:36:30.000000000 +0100
-+++ kernel-current/arch/mips/kernel/mips_ksyms.c 2005-07-10 10:08:15.469684456 +0200
-@@ -40,6 +40,10 @@
++++ kernel-current/arch/mips/kernel/mips_ksyms.c 2005-07-10 17:55:55.738466208 +0200
+@@ -40,6 +40,12 @@
extern long __strnlen_user_nocheck_asm(const char *s);
extern long __strnlen_user_asm(const char *s);
+#ifdef CONFIG_AR7
-+extern int avalanche_request_pacing(int irq_nr, unsigned int blk_num, unsigned int pace_value);
++int avalanche_request_pacing(int irq_nr, unsigned int blk_num, unsigned int pace_value);
++char *prom_getenv(char *envname);
+#endif
++
+
EXPORT_SYMBOL(mips_machtype);
#ifdef CONFIG_EISA
EXPORT_SYMBOL(EISA_bus);
-@@ -102,4 +106,8 @@
- EXPORT_SYMBOL(ide_ops);
+@@ -103,3 +109,9 @@
#endif
+ EXPORT_SYMBOL(get_wchan);
++
+#ifdef CONFIG_AR7
+EXPORT_SYMBOL_NOVERS(avalanche_request_pacing);
++EXPORT_SYMBOL_NOVERS(prom_getenv);
+#endif
+
- EXPORT_SYMBOL(get_wchan);
diff -urN kernel-base/arch/mips/kernel/setup.c kernel-current/arch/mips/kernel/setup.c
--- kernel-base/arch/mips/kernel/setup.c 2005-07-10 03:00:44.785181224 +0200
-+++ kernel-current/arch/mips/kernel/setup.c 2005-07-10 06:40:39.590265952 +0200
++++ kernel-current/arch/mips/kernel/setup.c 2005-07-10 06:40:39.590265000 +0200
@@ -109,6 +109,7 @@
unsigned long isa_slot_offset;
EXPORT_SYMBOL(isa_slot_offset);
}
diff -urN kernel-base/arch/mips/kernel/traps.c kernel-current/arch/mips/kernel/traps.c
--- kernel-base/arch/mips/kernel/traps.c 2005-07-10 03:00:44.786181072 +0200
-+++ kernel-current/arch/mips/kernel/traps.c 2005-07-10 06:40:39.591265800 +0200
++++ kernel-current/arch/mips/kernel/traps.c 2005-07-10 06:40:39.591265000 +0200
@@ -40,6 +40,10 @@
#include <asm/uaccess.h>
#include <asm/mmu_context.h>
}
diff -urN kernel-base/arch/mips/lib/promlib.c kernel-current/arch/mips/lib/promlib.c
--- kernel-base/arch/mips/lib/promlib.c 2005-07-10 03:00:44.786181072 +0200
-+++ kernel-current/arch/mips/lib/promlib.c 2005-07-10 06:40:39.591265800 +0200
++++ kernel-current/arch/mips/lib/promlib.c 2005-07-10 06:40:39.591265000 +0200
@@ -1,3 +1,4 @@
+#ifndef CONFIG_AR7
#include <stdarg.h>
+#endif
diff -urN kernel-base/arch/mips/Makefile kernel-current/arch/mips/Makefile
--- kernel-base/arch/mips/Makefile 2005-07-10 03:00:44.786181072 +0200
-+++ kernel-current/arch/mips/Makefile 2005-07-10 06:40:39.591265800 +0200
++++ kernel-current/arch/mips/Makefile 2005-07-10 06:40:39.591265000 +0200
@@ -369,6 +369,16 @@
endif
ifdef CONFIG_DECSTATION
diff -urN kernel-base/arch/mips/mm/init.c kernel-current/arch/mips/mm/init.c
--- kernel-base/arch/mips/mm/init.c 2005-07-10 03:00:44.787180920 +0200
-+++ kernel-current/arch/mips/mm/init.c 2005-07-10 07:09:29.914216728 +0200
++++ kernel-current/arch/mips/mm/init.c 2005-07-10 07:09:29.914216000 +0200
@@ -40,8 +40,10 @@
mmu_gather_t mmu_gathers[NR_CPUS];
+#endif
diff -urN kernel-base/arch/mips/mm/tlb-r4k.c kernel-current/arch/mips/mm/tlb-r4k.c
--- kernel-base/arch/mips/mm/tlb-r4k.c 2005-07-10 03:00:44.787180920 +0200
-+++ kernel-current/arch/mips/mm/tlb-r4k.c 2005-07-10 06:40:39.592265648 +0200
++++ kernel-current/arch/mips/mm/tlb-r4k.c 2005-07-10 06:40:39.592265000 +0200
@@ -20,6 +20,10 @@
#include <asm/pgtable.h>
#include <asm/system.h>
}
diff -urN kernel-base/drivers/char/serial.c kernel-current/drivers/char/serial.c
--- kernel-base/drivers/char/serial.c 2005-07-10 03:00:44.789180616 +0200
-+++ kernel-current/drivers/char/serial.c 2005-07-10 06:42:02.902600552 +0200
++++ kernel-current/drivers/char/serial.c 2005-07-10 06:42:02.902600000 +0200
@@ -419,7 +419,40 @@
return 0;
}
cval >>= 8;
diff -urN kernel-base/include/asm-mips/ar7/ar7.h kernel-current/include/asm-mips/ar7/ar7.h
--- kernel-base/include/asm-mips/ar7/ar7.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/ar7.h 2005-07-10 06:40:39.622261088 +0200
++++ kernel-current/include/asm-mips/ar7/ar7.h 2005-07-10 06:40:39.622261000 +0200
@@ -0,0 +1,33 @@
+/*
+ * $Id$
+#endif
diff -urN kernel-base/include/asm-mips/ar7/avalanche_intc.h kernel-current/include/asm-mips/ar7/avalanche_intc.h
--- kernel-base/include/asm-mips/ar7/avalanche_intc.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/avalanche_intc.h 2005-07-10 06:40:39.622261088 +0200
++++ kernel-current/include/asm-mips/ar7/avalanche_intc.h 2005-07-10 06:40:39.622261000 +0200
@@ -0,0 +1,278 @@
+ /*
+ * Nitin Dhingra, iamnd@ti.com
+};
+
+
-+/* Interrupt Line #'s (Sangam peripherals) */
++/* Interrupt Line #'s (Sangam peripherals) */
++
++/*------------------------------*/
++/* Sangam primary interrupts */
++/*------------------------------*/
++
++#define UNIFIED_SECONDARY_INTERRUPT 0
++#define AVALANCHE_EXT_INT_0 1
++#define AVALANCHE_EXT_INT_1 2
++/* Line #3 Reserved */
++/* Line #4 Reserved */
++#define AVALANCHE_TIMER_0_INT 5
++#define AVALANCHE_TIMER_1_INT 6
++#define AVALANCHE_UART0_INT 7
++#define AVALANCHE_UART1_INT 8
++#define AVALANCHE_PDMA_INT0 9
++#define AVALANCHE_PDMA_INT1 10
++/* Line #11 Reserved */
++/* Line #12 Reserved */
++/* Line #13 Reserved */
++/* Line #14 Reserved */
++#define AVALANCHE_ATM_SAR_INT 15
++/* Line #16 Reserved */
++/* Line #17 Reserved */
++/* Line #18 Reserved */
++#define AVALANCHE_MAC0_INT 19
++/* Line #20 Reserved */
++#define AVALANCHE_VLYNQ0_INT 21
++#define AVALANCHE_CODEC_WAKE_INT 22
++/* Line #23 Reserved */
++#define AVALANCHE_USB_INT 24
++#define AVALANCHE_VLYNQ1_INT 25
++/* Line #26 Reserved */
++/* Line #27 Reserved */
++#define AVALANCHE_MAC1_INT 28
++#define AVALANCHE_I2CM_INT 29
++#define AVALANCHE_PDMA_INT2 30
++#define AVALANCHE_PDMA_INT3 31
++/* Line #32 Reserved */
++/* Line #33 Reserved */
++/* Line #34 Reserved */
++/* Line #35 Reserved */
++/* Line #36 Reserved */
++#define AVALANCHE_VDMA_VT_RX_INT 37
++#define AVALANCHE_VDMA_VT_TX_INT 38
++#define AVALANCHE_ADSLSS_INT 39
++
++/*-----------------------------------*/
++/* Sangam Secondary Interrupts */
++/*-----------------------------------*/
++#define PRIMARY_INTS 40
++
++#define EMIF_INT (7 + PRIMARY_INTS)
++
++
++extern void avalanche_int_set(int channel, int line);
++
++
++#endif /* _AVALANCHE_INTC_H */
+diff -urN kernel-base/include/asm-mips/ar7/avalanche_misc.h kernel-current/include/asm-mips/ar7/avalanche_misc.h
+--- kernel-base/include/asm-mips/ar7/avalanche_misc.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/include/asm-mips/ar7/avalanche_misc.h 2005-07-10 18:45:35.089287296 +0200
+@@ -0,0 +1,174 @@
++#ifndef _AVALANCHE_MISC_H_
++#define _AVALANCHE_MISC_H_
++
++typedef enum AVALANCHE_ERR_t
++{
++ AVALANCHE_ERR_OK = 0, /* OK or SUCCESS */
++ AVALANCHE_ERR_ERROR = -1, /* Unspecified/Generic ERROR */
++
++ /* Pointers and args */
++ AVALANCHE_ERR_INVARG = -2, /* Invaild argument to the call */
++ AVALANCHE_ERR_NULLPTR = -3, /* NULL pointer */
++ AVALANCHE_ERR_BADPTR = -4, /* Bad (out of mem) pointer */
++
++ /* Memory issues */
++ AVALANCHE_ERR_ALLOC_FAIL = -10, /* allocation failed */
++ AVALANCHE_ERR_FREE_FAIL = -11, /* free failed */
++ AVALANCHE_ERR_MEM_CORRUPT = -12, /* corrupted memory */
++ AVALANCHE_ERR_BUF_LINK = -13, /* buffer linking failed */
++
++ /* Device issues */
++ AVALANCHE_ERR_DEVICE_TIMEOUT = -20, /* device timeout on read/write */
++ AVALANCHE_ERR_DEVICE_MALFUNC = -21, /* device malfunction */
++
++ AVALANCHE_ERR_INVID = -30 /* Invalid ID */
++
++} AVALANCHE_ERR;
++
++/*****************************************************************************
++ * Reset Control Module
++ *****************************************************************************/
++
++typedef enum AVALANCHE_RESET_MODULE_tag
++{
++ RESET_MODULE_UART0 = 0,
++ RESET_MODULE_UART1 = 1,
++ RESET_MODULE_I2C = 2,
++ RESET_MODULE_TIMER0 = 3,
++ RESET_MODULE_TIMER1 = 4,
++ RESET_MODULE_GPIO = 6,
++ RESET_MODULE_ADSLSS = 7,
++ RESET_MODULE_USBS = 8,
++ RESET_MODULE_SAR = 9,
++ RESET_MODULE_VDMA_VT = 11,
++ RESET_MODULE_FSER = 12,
++ RESET_MODULE_VLYNQ1 = 16,
++ RESET_MODULE_EMAC0 = 17,
++ RESET_MODULE_DMA = 18,
++ RESET_MODULE_BIST = 19,
++ RESET_MODULE_VLYNQ0 = 20,
++ RESET_MODULE_EMAC1 = 21,
++ RESET_MODULE_MDIO = 22,
++ RESET_MODULE_ADSLSS_DSP = 23,
++ RESET_MODULE_EPHY = 26
++} AVALANCHE_RESET_MODULE_T;
++
++typedef enum AVALANCHE_RESET_CTRL_tag
++{
++ IN_RESET = 0,
++ OUT_OF_RESET
++} AVALANCHE_RESET_CTRL_T;
++
++typedef enum AVALANCHE_SYS_RST_MODE_tag
++{
++ RESET_SOC_WITH_MEMCTRL = 1, /* SW0 bit in SWRCR register */
++ RESET_SOC_WITHOUT_MEMCTRL = 2 /* SW1 bit in SWRCR register */
++} AVALANCHE_SYS_RST_MODE_T;
++
++typedef enum AVALANCHE_SYS_RESET_STATUS_tag
++{
++ HARDWARE_RESET = 0,
++ SOFTWARE_RESET0, /* Caused by writing 1 to SW0 bit in SWRCR register */
++ WATCHDOG_RESET,
++ SOFTWARE_RESET1 /* Caused by writing 1 to SW1 bit in SWRCR register */
++} AVALANCHE_SYS_RESET_STATUS_T;
++
++AVALANCHE_RESET_CTRL_T avalanche_get_reset_status(AVALANCHE_RESET_MODULE_T reset_module);
++void avalanche_sys_reset(AVALANCHE_SYS_RST_MODE_T mode);
++AVALANCHE_SYS_RESET_STATUS_T avalanche_get_sys_last_reset_status(void);
++
++typedef int (*REMOTE_VLYNQ_DEV_RESET_CTRL_FN)(unsigned int reset_module, AVALANCHE_RESET_CTRL_T reset_ctrl);
++
++/*****************************************************************************
++ * Power Control Module
++ *****************************************************************************/
++
++typedef enum AVALANCHE_POWER_CTRL_tag
++{
++ POWER_CTRL_POWER_UP = 0,
++ POWER_CTRL_POWER_DOWN
++} AVALANCHE_POWER_CTRL_T;
++
++typedef enum AVALANCHE_SYS_POWER_MODE_tag
++{
++ GLOBAL_POWER_MODE_RUN = 0, /* All system is up */
++ GLOBAL_POWER_MODE_IDLE, /* MIPS is power down, all peripherals working */
++ GLOBAL_POWER_MODE_STANDBY, /* Chip in power down, but clock to ADSKL subsystem is running */
++ GLOBAL_POWER_MODE_POWER_DOWN /* Total chip is powered down */
++} AVALANCHE_SYS_POWER_MODE_T;
++
++void avalanche_power_ctrl(unsigned int power_module, AVALANCHE_POWER_CTRL_T power_ctrl);
++AVALANCHE_POWER_CTRL_T avalanche_get_power_status(unsigned int power_module);
++void avalanche_set_global_power_mode(AVALANCHE_SYS_POWER_MODE_T power_mode);
++AVALANCHE_SYS_POWER_MODE_T avalanche_get_global_power_mode(void);
++
++/*****************************************************************************
++ * Wakeup Control
++ *****************************************************************************/
++
++typedef enum AVALANCHE_WAKEUP_INTERRUPT_tag
++{
++ WAKEUP_INT0 = 1,
++ WAKEUP_INT1 = 2,
++ WAKEUP_INT2 = 4,
++ WAKEUP_INT3 = 8
++} AVALANCHE_WAKEUP_INTERRUPT_T;
++
++typedef enum TNETV1050_WAKEUP_CTRL_tag
++{
++ WAKEUP_DISABLED = 0,
++ WAKEUP_ENABLED
++} AVALANCHE_WAKEUP_CTRL_T;
++
++typedef enum TNETV1050_WAKEUP_POLARITY_tag
++{
++ WAKEUP_ACTIVE_HIGH = 0,
++ WAKEUP_ACTIVE_LOW
++} AVALANCHE_WAKEUP_POLARITY_T;
++
++void avalanche_wakeup_ctrl(AVALANCHE_WAKEUP_INTERRUPT_T wakeup_int,
++ AVALANCHE_WAKEUP_CTRL_T wakeup_ctrl,
++ AVALANCHE_WAKEUP_POLARITY_T wakeup_polarity);
+
-+/*------------------------------*/
-+/* Sangam primary interrupts */
-+/*------------------------------*/
++/*****************************************************************************
++ * GPIO Control
++ *****************************************************************************/
+
-+#define UNIFIED_SECONDARY_INTERRUPT 0
-+#define AVALANCHE_EXT_INT_0 1
-+#define AVALANCHE_EXT_INT_1 2
-+/* Line #3 Reserved */
-+/* Line #4 Reserved */
-+#define AVALANCHE_TIMER_0_INT 5
-+#define AVALANCHE_TIMER_1_INT 6
-+#define AVALANCHE_UART0_INT 7
-+#define AVALANCHE_UART1_INT 8
-+#define AVALANCHE_PDMA_INT0 9
-+#define AVALANCHE_PDMA_INT1 10
-+/* Line #11 Reserved */
-+/* Line #12 Reserved */
-+/* Line #13 Reserved */
-+/* Line #14 Reserved */
-+#define AVALANCHE_ATM_SAR_INT 15
-+/* Line #16 Reserved */
-+/* Line #17 Reserved */
-+/* Line #18 Reserved */
-+#define AVALANCHE_MAC0_INT 19
-+/* Line #20 Reserved */
-+#define AVALANCHE_VLYNQ0_INT 21
-+#define AVALANCHE_CODEC_WAKE_INT 22
-+/* Line #23 Reserved */
-+#define AVALANCHE_USB_INT 24
-+#define AVALANCHE_VLYNQ1_INT 25
-+/* Line #26 Reserved */
-+/* Line #27 Reserved */
-+#define AVALANCHE_MAC1_INT 28
-+#define AVALANCHE_I2CM_INT 29
-+#define AVALANCHE_PDMA_INT2 30
-+#define AVALANCHE_PDMA_INT3 31
-+/* Line #32 Reserved */
-+/* Line #33 Reserved */
-+/* Line #34 Reserved */
-+/* Line #35 Reserved */
-+/* Line #36 Reserved */
-+#define AVALANCHE_VDMA_VT_RX_INT 37
-+#define AVALANCHE_VDMA_VT_TX_INT 38
-+#define AVALANCHE_ADSLSS_INT 39
++typedef enum AVALANCHE_GPIO_PIN_MODE_tag
++{
++ FUNCTIONAL_PIN = 0,
++ GPIO_PIN = 1
++} AVALANCHE_GPIO_PIN_MODE_T;
+
-+/*-----------------------------------*/
-+/* Sangam Secondary Interrupts */
-+/*-----------------------------------*/
-+#define PRIMARY_INTS 40
++typedef enum AVALANCHE_GPIO_PIN_DIRECTION_tag
++{
++ GPIO_OUTPUT_PIN = 0,
++ GPIO_INPUT_PIN = 1
++} AVALANCHE_GPIO_PIN_DIRECTION_T;
+
-+#define EMIF_INT (7 + PRIMARY_INTS)
++typedef enum { GPIO_FALSE, GPIO_TRUE } AVALANCHE_GPIO_BOOL_T;
+
++void avalanche_gpio_init(void);
++int avalanche_gpio_ctrl(unsigned int gpio_pin,
++ AVALANCHE_GPIO_PIN_MODE_T pin_mode,
++ AVALANCHE_GPIO_PIN_DIRECTION_T pin_direction);
++int avalanche_gpio_ctrl_with_link_count(unsigned int gpio_pin,
++ AVALANCHE_GPIO_PIN_MODE_T pin_mode,
++ AVALANCHE_GPIO_PIN_DIRECTION_T pin_direction);
++int avalanche_gpio_out_bit(unsigned int gpio_pin, int value);
++int avalanche_gpio_in_bit(unsigned int gpio_pin);
++int avalanche_gpio_out_value(unsigned int out_val, unsigned int set_mask, unsigned int reg_index);
++int avalanche_gpio_out_value_with_link_count(unsigned int out_val, unsigned int set_mask, unsigned int reg_index);
++int avalanche_gpio_in_value(unsigned int *in_val, unsigned int reg_index);
+
-+extern void avalanche_int_set(int channel, int line);
++unsigned int avalanche_get_chip_version_info(void);
+
++unsigned int avalanche_get_vbus_freq(void);
++void avalanche_set_vbus_freq(unsigned int);
+
-+#endif /* _AVALANCHE_INTC_H */
++
++typedef int (*SET_MDIX_ON_CHIP_FN_T)(unsigned int base_addr, unsigned int operation);
++int avalanche_set_mdix_on_chip(unsigned int base_addr, unsigned int operation);
++unsigned int avalanche_is_mdix_on_chip(void);
++
++#endif
diff -urN kernel-base/include/asm-mips/ar7/avalanche_regs.h kernel-current/include/asm-mips/ar7/avalanche_regs.h
--- kernel-base/include/asm-mips/ar7/avalanche_regs.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/avalanche_regs.h 2005-07-10 09:27:48.638618856 +0200
++++ kernel-current/include/asm-mips/ar7/avalanche_regs.h 2005-07-10 18:48:26.333254256 +0200
@@ -0,0 +1,567 @@
+/*
+ * $Id$
+
diff -urN kernel-base/include/asm-mips/ar7/if_port.h kernel-current/include/asm-mips/ar7/if_port.h
--- kernel-base/include/asm-mips/ar7/if_port.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/if_port.h 2005-07-10 06:40:39.623260936 +0200
++++ kernel-current/include/asm-mips/ar7/if_port.h 2005-07-10 06:40:39.623260000 +0200
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * FILE PURPOSE: Interface port id Header file
+
+
+#endif /* _IF_PORT_H_ */
-diff -urN kernel-base/include/asm-mips/ar7/ledapp.h kernel-current/include/asm-mips/ar7/ledapp.h
---- kernel-base/include/asm-mips/ar7/ledapp.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/ledapp.h 2005-07-10 08:26:11.663644480 +0200
-@@ -0,0 +1,59 @@
-+#ifndef __LED_APP__
-+#define __LED_APP__
-+
-+#define CONF_FILE "/etc/led.conf"
-+#define LED_PROC_FILE "/proc/led_mod/led"
-+
-+#define CONFIG_LED_MODULE
-+
-+#define MAX_MOD_ID 25
-+#define MAX_STATE_ID 25
-+#define MAX_LED_ID 25
-+
-+#define MOD_ADSL 1
-+#define DEF_ADSL_IDLE 1
-+#define DEF_ADSL_TRAINING 2
-+#define DEF_ADSL_SYNC 3
-+#define DEF_ADSL_ACTIVITY 4
-+
-+#define MOD_WAN 2
-+#define DEF_WAN_IDLE 1
-+#define DEF_WAN_NEGOTIATE 2
-+#define DEF_WAN_SESSION 3
-+
-+#define MOD_LAN 3
-+#define DEF_LAN_IDLE 1
-+#define DEF_LAN_LINK_UP 2
-+#define DEF_LAN_ACTIVITY 3
-+
-+#define MOD_WLAN 4
-+#define DEF_WLAN_IDLE 1
-+#define DEF_WLAN_LINK_UP 2
-+#define DEF_WLAN_ACTIVITY 3
-+
-+#define MOD_USB 5
-+#define DEF_USB_IDLE 1
-+#define DEF_USB_LINK_UP 2
-+#define DEF_USB_ACTIVITY 3
-+
-+#define MOD_ETH 6
-+#define DEF_ETH_IDLE 1
-+#define DEF_ETH_LINK_UP 2
-+#define DEF_ETH_ACTIVITY 3
-+
-+typedef struct config_elem{
-+ unsigned char name;
-+ unsigned char state;
-+ unsigned char mode;
-+ unsigned char led;
-+ int param;
-+}config_elem_t;
-+
-+typedef struct led_reg{
-+ unsigned int param;
-+ void (*init)(unsigned long param);
-+ void (*onfunc)(unsigned long param);
-+ void (*offfunc)(unsigned long param);
-+}led_reg_t;
-+
-+#endif
diff -urN kernel-base/include/asm-mips/ar7/sangam_boards.h kernel-current/include/asm-mips/ar7/sangam_boards.h
--- kernel-base/include/asm-mips/ar7/sangam_boards.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/sangam_boards.h 2005-07-10 06:40:39.623260936 +0200
++++ kernel-current/include/asm-mips/ar7/sangam_boards.h 2005-07-10 06:40:39.623260000 +0200
@@ -0,0 +1,77 @@
+#ifndef _SANGAM_BOARDS_H
+#define _SANGAM_BOARDS_H
+#endif
diff -urN kernel-base/include/asm-mips/ar7/sangam.h kernel-current/include/asm-mips/ar7/sangam.h
--- kernel-base/include/asm-mips/ar7/sangam.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/sangam.h 2005-07-10 06:40:39.624260784 +0200
++++ kernel-current/include/asm-mips/ar7/sangam.h 2005-07-10 06:40:39.624260000 +0200
@@ -0,0 +1,180 @@
+#ifndef _SANGAM_H_
+#define _SANGAM_H_
+#include "sangam_boards.h"
+
+#endif /*_SANGAM_H_ */
-diff -urN kernel-base/include/asm-mips/ar7/tnetd73xx_err.h kernel-current/include/asm-mips/ar7/tnetd73xx_err.h
---- kernel-base/include/asm-mips/ar7/tnetd73xx_err.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/tnetd73xx_err.h 2005-07-10 09:34:36.482617144 +0200
-@@ -0,0 +1,42 @@
-+/******************************************************************************
-+ * FILE PURPOSE: TNETD73xx Error Definations Header File
-+ ******************************************************************************
-+ * FILE NAME: tnetd73xx_err.h
-+ *
-+ * DESCRIPTION: Error definations for TNETD73XX
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+
-+#ifndef __TNETD73XX_ERR_H__
-+#define __TNETD73XX_ERR_H__
-+
-+typedef enum TNETD73XX_ERR_t
-+{
-+ TNETD73XX_ERR_OK = 0, /* OK or SUCCESS */
-+ TNETD73XX_ERR_ERROR = -1, /* Unspecified/Generic ERROR */
-+
-+ /* Pointers and args */
-+ TNETD73XX_ERR_INVARG = -2, /* Invaild argument to the call */
-+ TNETD73XX_ERR_NULLPTR = -3, /* NULL pointer */
-+ TNETD73XX_ERR_BADPTR = -4, /* Bad (out of mem) pointer */
-+
-+ /* Memory issues */
-+ TNETD73XX_ERR_ALLOC_FAIL = -10, /* allocation failed */
-+ TNETD73XX_ERR_FREE_FAIL = -11, /* free failed */
-+ TNETD73XX_ERR_MEM_CORRUPT = -12, /* corrupted memory */
-+ TNETD73XX_ERR_BUF_LINK = -13, /* buffer linking failed */
-+
-+ /* Device issues */
-+ TNETD73XX_ERR_DEVICE_TIMEOUT = -20, /* device timeout on read/write */
-+ TNETD73XX_ERR_DEVICE_MALFUNC = -21, /* device malfunction */
-+
-+ TNETD73XX_ERR_INVID = -30 /* Invalid ID */
-+
-+} TNETD73XX_ERR;
-+
-+#endif /* __TNETD73XX_ERR_H__ */
-diff -urN kernel-base/include/asm-mips/ar7/tnetd73xx.h kernel-current/include/asm-mips/ar7/tnetd73xx.h
---- kernel-base/include/asm-mips/ar7/tnetd73xx.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/tnetd73xx.h 2005-07-10 09:51:18.910224984 +0200
-@@ -0,0 +1,338 @@
-+/******************************************************************************
-+ * FILE PURPOSE: TNETD73xx Common Header File
-+ ******************************************************************************
-+ * FILE NAME: tnetd73xx.h
-+ *
-+ * DESCRIPTION: shared typedef's, constants and API for TNETD73xx
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+/*
-+ *
-+ *
-+ * These are const, typedef, and api definitions for tnetd73xx.
-+ *
-+ * NOTES:
-+ * 1. This file may be included into both C and Assembly files.
-+ * - for .s files, please do #define _ASMLANGUAGE in your ASM file to
-+ * avoid C data types (typedefs) below;
-+ * - for .c files, you don't have to do anything special.
-+ *
-+ * 2. This file has a number of sections for each SOC subsystem. When adding
-+ * a new constant, find the subsystem you are working on and follow the
-+ * name pattern. If you are adding another typedef for your interface, please,
-+ * place it with other typedefs and function prototypes.
-+ *
-+ * 3. Please, DO NOT add any macros or types that are local to a subsystem to avoid
-+ * cluttering. Include such items directly into the module's .c file or have a
-+ * local .h file to pass data between smaller modules. This file defines only
-+ * shared items.
-+ */
-+
-+#ifndef __TNETD73XX_H__
-+#define __TNETD73XX_H__
-+
-+#ifndef _ASMLANGUAGE /* This part not for assembly language */
-+
-+extern unsigned int tnetd73xx_mips_freq;
-+extern unsigned int tnetd73xx_vbus_freq;
-+
-+#include "tnetd73xx_err.h"
-+
-+#endif /* _ASMLANGUAGE */
-+
-+
-+/*******************************************************************************************
-+* Emerald core specific
-+******************************************************************************************** */
-+
-+#ifdef BIG_ENDIAN
-+#elif defined(LITTLE_ENDIAN)
-+#else
-+#error Need to define endianism
-+#endif
-+
-+#ifndef KSEG_MSK
-+#define KSEG_MSK 0xE0000000 /* Most significant 3 bits denote kseg choice */
-+#endif
-+
-+#ifndef KSEG_INV_MASK
-+#define KSEG_INV_MASK 0x1FFFFFFF /* Inverted mask for kseg address */
-+#endif
-+
-+#ifndef KSEG0_BASE
-+#define KSEG0_BASE 0x80000000
-+#endif
-+
-+#ifndef KSEG1_BASE
-+#define KSEG1_BASE 0xA0000000
-+#endif
-+
-+#ifndef KSEG0
-+#define KSEG0(addr) (((__u32)(addr) & ~KSEG_MSK) | KSEG0_BASE)
-+#endif
-+
-+#ifndef KSEG1
-+#define KSEG1(addr) (((__u32)(addr) & ~KSEG_MSK) | KSEG1_BASE)
-+#endif
-+
-+#ifndef KUSEG
-+#define KUSEG(addr) ((__u32)(addr) & ~KSEG_MSK)
-+#endif
-+
-+#ifndef PHYS_ADDR
-+#define PHYS_ADDR(addr) ((addr) & KSEG_INV_MASK)
-+#endif
-+
-+#ifndef PHYS_TO_K0
-+#define PHYS_TO_K0(addr) (PHYS_ADDR(addr)|KSEG0_BASE)
-+#endif
-+
-+#ifndef PHYS_TO_K1
-+#define PHYS_TO_K1(addr) (PHYS_ADDR(addr)|KSEG1_BASE)
-+#endif
-+
-+#ifndef REG8_ADDR
-+#define REG8_ADDR(addr) (volatile __u8 *)(PHYS_TO_K1(addr))
-+#define REG8_DATA(addr) (*(volatile __u8 *)(PHYS_TO_K1(addr)))
-+#define REG8_WRITE(addr, data) REG8_DATA(addr) = data;
-+#define REG8_READ(addr, data) data = (__u8) REG8_DATA(addr);
-+#endif
-+
-+#ifndef REG16_ADDR
-+#define REG16_ADDR(addr) (volatile __u16 *)(PHYS_TO_K1(addr))
-+#define REG16_DATA(addr) (*(volatile __u16 *)(PHYS_TO_K1(addr)))
-+#define REG16_WRITE(addr, data) REG16_DATA(addr) = data;
-+#define REG16_READ(addr, data) data = (__u16) REG16_DATA(addr);
-+#endif
-+
-+#ifndef REG32_ADDR
-+#define REG32_ADDR(addr) (volatile __u32 *)(PHYS_TO_K1(addr))
-+#define REG32_DATA(addr) (*(volatile __u32 *)(PHYS_TO_K1(addr)))
-+#define REG32_WRITE(addr, data) REG32_DATA(addr) = data;
-+#define REG32_READ(addr, data) data = (__u32) REG32_DATA(addr);
-+#endif
-+
-+#ifdef _LINK_KSEG0_ /* Application is linked into KSEG0 space */
-+#define VIRT_ADDR(addr) PHYS_TO_K0(PHYS_ADDR(addr))
-+#endif
-+
-+#ifdef _LINK_KSEG1_ /* Application is linked into KSEG1 space */
-+#define VIRT_ADDR(addr) PHYS_TO_K1(PHYS_ADDR(addr))
-+#endif
-+
-+#if !defined(_LINK_KSEG0_) && !defined(_LINK_KSEG1_)
-+#error You must define _LINK_KSEG0_ or _LINK_KSEG1_ to compile the code.
-+#endif
-+
-+/* TNETD73XX chip definations */
-+
-+#define FREQ_1MHZ 1000000
-+#define TNETD73XX_MIPS_FREQ tnetd73xx_mips_freq /* CPU clock frequency */
-+#define TNETD73XX_VBUS_FREQ tnetd73xx_vbus_freq /* originally (TNETD73XX_MIPS_FREQ/2) */
-+
-+#ifdef AR7SEAD2
-+#define TNETD73XX_MIPS_FREQ_DEFAULT 25000000 /* 25 Mhz for sead2 board crystal */
-+#else
-+#define TNETD73XX_MIPS_FREQ_DEFAULT 125000000 /* 125 Mhz */
-+#endif
-+#define TNETD73XX_VBUS_FREQ_DEFAULT (TNETD73XX_MIPS_FREQ_DEFAULT / 2) /* Sync mode */
-+
-+
-+
-+/* Module base addresses */
-+#define TNETD73XX_ADSLSS_BASE PHYS_TO_K1(0x01000000) /* ADSLSS Module */
-+#define TNETD73XX_BBIF_CTRL_BASE PHYS_TO_K1(0x02000000) /* BBIF Control */
-+#define TNETD73XX_ATMSAR_BASE PHYS_TO_K1(0x03000000) /* ATM SAR */
-+#define TNETD73XX_USB_BASE PHYS_TO_K1(0x03400000) /* USB Module */
-+#define TNETD73XX_VLYNQ0_BASE PHYS_TO_K1(0x04000000) /* VLYNQ0 Module */
-+#define TNETD73xx_EMAC0_BASE PHYS_TO_K1(0x08610000) /* EMAC0 Module*/
-+#define TNETD73XX_EMIF_BASE PHYS_TO_K1(0x08610800) /* EMIF Module */
-+#define TNETD73XX_GPIO_BASE PHYS_TO_K1(0x08610900) /* GPIO control */
-+#define TNETD73XX_CLOCK_CTRL_BASE PHYS_TO_K1(0x08610A00) /* Clock Control */
-+#define TNETD73XX_WDTIMER_BASE PHYS_TO_K1(0x08610B00) /* WDTIMER Module */
-+#define TNETD73XX_TIMER0_BASE PHYS_TO_K1(0x08610C00) /* TIMER0 Module */
-+#define TNETD73XX_TIMER1_BASE PHYS_TO_K1(0x08610D00) /* TIMER1 Module */
-+#define TNETD73XX_UARTA_BASE PHYS_TO_K1(0x08610E00) /* UART A */
-+#define TNETD73XX_UARTB_BASE PHYS_TO_K1(0x08610F00) /* UART B */
-+#define TNETD73XX_I2C_BASE PHYS_TO_K1(0x08611000) /* I2C Module */
-+#define TNETD73XX_USB_DMA_BASE PHYS_TO_K1(0x08611200) /* USB Module */
-+#define TNETD73XX_MCDMA_BASE PHYS_TO_K1(0x08611400) /* MC-DMA */
-+#define TNETD73xx_VDMAVT_BASE PHYS_TO_K1(0x08611500) /* VDMAVT Control */
-+#define TNETD73XX_RST_CTRL_BASE PHYS_TO_K1(0x08611600) /* Reset Control */
-+#define TNETD73xx_BIST_CTRL_BASE PHYS_TO_K1(0x08611700) /* BIST Control */
-+#define TNETD73xx_VLYNQ0_CTRL_BASE PHYS_TO_K1(0x08611800) /* VLYNQ0 Control */
-+#define TNETD73XX_DCL_BASE PHYS_TO_K1(0x08611A00) /* Device Configuration Latch */
-+#define TNETD73xx_VLYNQ1_CTRL_BASE PHYS_TO_K1(0x08611C00) /* VLYNQ1 Control */
-+#define TNETD73xx_MDIO_BASE PHYS_TO_K1(0x08611E00) /* MDIO Control */
-+#define TNETD73XX_FSER_BASE PHYS_TO_K1(0x08612000) /* FSER Control */
-+#define TNETD73XX_INTC_BASE PHYS_TO_K1(0x08612400) /* Interrupt Controller */
-+#define TNETD73xx_EMAC1_BASE PHYS_TO_K1(0x08612800) /* EMAC1 Module*/
-+#define TNETD73XX_VLYNQ1_BASE PHYS_TO_K1(0x0C000000) /* VLYNQ1 Module */
-+
-+/* BBIF Registers */
-+#define TNETD73XX_BBIF_ADSLADR (TNETD73XX_BBIF_CTRL_BASE + 0x0)
-+
-+/* Device Configuration Latch Registers */
-+#define TNETD73XX_DCL_BOOTCR (TNETD73XX_DCL_BASE + 0x0)
-+#define TNETD73XX_DCL_DPLLSELR (TNETD73XX_DCL_BASE + 0x10)
-+#define TNETD73XX_DCL_SPEEDCTLR (TNETD73XX_DCL_BASE + 0x14)
-+#define TNETD73XX_DCL_SPEEDPWDR (TNETD73XX_DCL_BASE + 0x18)
-+#define TNETD73XX_DCL_SPEEDCAPR (TNETD73XX_DCL_BASE + 0x1C)
-+
-+/* GPIO Control */
-+#define TNETD73XX_GPIODINR (TNETD73XX_GPIO_BASE + 0x0)
-+#define TNETD73XX_GPIODOUTR (TNETD73XX_GPIO_BASE + 0x4)
-+#define TNETD73XX_GPIOPDIRR (TNETD73XX_GPIO_BASE + 0x8)
-+#define TNETD73XX_GPIOENR (TNETD73XX_GPIO_BASE + 0xC)
-+#define TNETD73XX_CVR (TNETD73XX_GPIO_BASE + 0x14)
-+#define TNETD73XX_DIDR1 (TNETD73XX_GPIO_BASE + 0x18)
-+#define TNETD73XX_DIDR2 (TNETD73XX_GPIO_BASE + 0x1C)
-+
-+/* Reset Control */
-+#define TNETD73XX_RST_CTRL_PRCR (TNETD73XX_RST_CTRL_BASE + 0x0)
-+#define TNETD73XX_RST_CTRL_SWRCR (TNETD73XX_RST_CTRL_BASE + 0x4)
-+#define TNETD73XX_RST_CTRL_RSR (TNETD73XX_RST_CTRL_BASE + 0x8)
-+
-+/* Power Control */
-+#define TNETD73XX_POWER_CTRL_PDCR (TNETD73XX_CLOCK_CTRL_BASE + 0x0)
-+#define TNETD73XX_POWER_CTRL_PCLKCR (TNETD73XX_CLOCK_CTRL_BASE + 0x4)
-+#define TNETD73XX_POWER_CTRL_PDUCR (TNETD73XX_CLOCK_CTRL_BASE + 0x8)
-+#define TNETD73XX_POWER_CTRL_WKCR (TNETD73XX_CLOCK_CTRL_BASE + 0xC)
-+
-+/* Clock Control */
-+#define TNETD73XX_CLK_CTRL_SCLKCR (TNETD73XX_CLOCK_CTRL_BASE + 0x20)
-+#define TNETD73XX_CLK_CTRL_SCLKPLLCR (TNETD73XX_CLOCK_CTRL_BASE + 0x30)
-+#define TNETD73XX_CLK_CTRL_MCLKCR (TNETD73XX_CLOCK_CTRL_BASE + 0x40)
-+#define TNETD73XX_CLK_CTRL_MCLKPLLCR (TNETD73XX_CLOCK_CTRL_BASE + 0x50)
-+#define TNETD73XX_CLK_CTRL_UCLKCR (TNETD73XX_CLOCK_CTRL_BASE + 0x60)
-+#define TNETD73XX_CLK_CTRL_UCLKPLLCR (TNETD73XX_CLOCK_CTRL_BASE + 0x70)
-+#define TNETD73XX_CLK_CTRL_ACLKCR0 (TNETD73XX_CLOCK_CTRL_BASE + 0x80)
-+#define TNETD73XX_CLK_CTRL_ACLKPLLCR0 (TNETD73XX_CLOCK_CTRL_BASE + 0x90)
-+#define TNETD73XX_CLK_CTRL_ACLKCR1 (TNETD73XX_CLOCK_CTRL_BASE + 0xA0)
-+#define TNETD73XX_CLK_CTRL_ACLKPLLCR1 (TNETD73XX_CLOCK_CTRL_BASE + 0xB0)
-+
-+/* EMIF control */
-+#define TNETD73XX_EMIF_SDRAM_CFG ( TNETD73XX_EMIF_BASE + 0x08 )
-+
-+/* UART */
-+#ifdef AR7SEAD2
-+#define TNETD73XX_UART_FREQ 3686400
-+#else
-+#define TNETD73XX_UART_FREQ TNETD73XX_VBUS_FREQ
-+#endif
-+
-+/* Interrupt Controller */
-+
-+/* Primary interrupts */
-+#define TNETD73XX_INTC_UNIFIED_SECONDARY 0 /* Unified secondary interrupt */
-+#define TNETD73XX_INTC_EXTERNAL0 1 /* External Interrupt Line 0 */
-+#define TNETD73XX_INTC_EXTERNAL1 2 /* External Interrupt Line 1 */
-+#define TNETD73XX_INTC_RESERVED3 3 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED4 4 /* Reserved */
-+#define TNETD73XX_INTC_TIMER0 5 /* TIMER 0 int */
-+#define TNETD73XX_INTC_TIMER1 6 /* TIMER 1 int */
-+#define TNETD73XX_INTC_UART0 7 /* UART 0 int */
-+#define TNETD73XX_INTC_UART1 8 /* UART 1 int */
-+#define TNETD73XX_INTC_MCDMA0 9 /* MCDMA 0 int */
-+#define TNETD73XX_INTC_MCDMA1 10 /* MCDMA 1 int */
-+#define TNETD73XX_INTC_RESERVED11 11 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED12 12 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED13 13 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED14 14 /* Reserved */
-+#define TNETD73XX_INTC_ATMSAR 15 /* ATM SAR int */
-+#define TNETD73XX_INTC_RESERVED16 16 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED17 17 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED18 18 /* Reserved */
-+#define TNETD73XX_INTC_EMAC0 19 /* EMAC 0 int */
-+#define TNETD73XX_INTC_RESERVED20 20 /* Reserved */
-+#define TNETD73XX_INTC_VLYNQ0 21 /* VLYNQ 0 int */
-+#define TNETD73XX_INTC_CODEC 22 /* CODEC int */
-+#define TNETD73XX_INTC_RESERVED23 23 /* Reserved */
-+#define TNETD73XX_INTC_USBSLAVE 24 /* USB Slave int */
-+#define TNETD73XX_INTC_VLYNQ1 25 /* VLYNQ 1 int */
-+#define TNETD73XX_INTC_RESERVED26 26 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED27 27 /* Reserved */
-+#define TNETD73XX_INTC_ETH_PHY 28 /* Ethernet PHY */
-+#define TNETD73XX_INTC_I2C 29 /* I2C int */
-+#define TNETD73XX_INTC_MCDMA2 30 /* MCDMA 2 int */
-+#define TNETD73XX_INTC_MCDMA3 31 /* MCDMA 3 int */
-+#define TNETD73XX_INTC_RESERVED32 32 /* Reserved */
-+#define TNETD73XX_INTC_EMAC1 33 /* EMAC 1 int */
-+#define TNETD73XX_INTC_RESERVED34 34 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED35 35 /* Reserved */
-+#define TNETD73XX_INTC_RESERVED36 36 /* Reserved */
-+#define TNETD73XX_INTC_VDMAVTRX 37 /* VDMAVTRX */
-+#define TNETD73XX_INTC_VDMAVTTX 38 /* VDMAVTTX */
-+#define TNETD73XX_INTC_ADSLSS 39 /* ADSLSS */
-+
-+/* Secondary interrupts */
-+#define TNETD73XX_INTC_SEC0 40 /* Secondary */
-+#define TNETD73XX_INTC_SEC1 41 /* Secondary */
-+#define TNETD73XX_INTC_SEC2 42 /* Secondary */
-+#define TNETD73XX_INTC_SEC3 43 /* Secondary */
-+#define TNETD73XX_INTC_SEC4 44 /* Secondary */
-+#define TNETD73XX_INTC_SEC5 45 /* Secondary */
-+#define TNETD73XX_INTC_SEC6 46 /* Secondary */
-+#define TNETD73XX_INTC_EMIF 47 /* EMIF */
-+#define TNETD73XX_INTC_SEC8 48 /* Secondary */
-+#define TNETD73XX_INTC_SEC9 49 /* Secondary */
-+#define TNETD73XX_INTC_SEC10 50 /* Secondary */
-+#define TNETD73XX_INTC_SEC11 51 /* Secondary */
-+#define TNETD73XX_INTC_SEC12 52 /* Secondary */
-+#define TNETD73XX_INTC_SEC13 53 /* Secondary */
-+#define TNETD73XX_INTC_SEC14 54 /* Secondary */
-+#define TNETD73XX_INTC_SEC15 55 /* Secondary */
-+#define TNETD73XX_INTC_SEC16 56 /* Secondary */
-+#define TNETD73XX_INTC_SEC17 57 /* Secondary */
-+#define TNETD73XX_INTC_SEC18 58 /* Secondary */
-+#define TNETD73XX_INTC_SEC19 59 /* Secondary */
-+#define TNETD73XX_INTC_SEC20 60 /* Secondary */
-+#define TNETD73XX_INTC_SEC21 61 /* Secondary */
-+#define TNETD73XX_INTC_SEC22 62 /* Secondary */
-+#define TNETD73XX_INTC_SEC23 63 /* Secondary */
-+#define TNETD73XX_INTC_SEC24 64 /* Secondary */
-+#define TNETD73XX_INTC_SEC25 65 /* Secondary */
-+#define TNETD73XX_INTC_SEC26 66 /* Secondary */
-+#define TNETD73XX_INTC_SEC27 67 /* Secondary */
-+#define TNETD73XX_INTC_SEC28 68 /* Secondary */
-+#define TNETD73XX_INTC_SEC29 69 /* Secondary */
-+#define TNETD73XX_INTC_SEC30 70 /* Secondary */
-+#define TNETD73XX_INTC_SEC31 71 /* Secondary */
-+
-+/* These ugly macros are to access the -1 registers, like config1 */
-+#define MFC0_SEL1_OPCODE(dst, src)\
-+ .word (0x40000000 | ((dst)<<16) | ((src)<<11) | 1);\
-+ nop; \
-+ nop; \
-+ nop
-+
-+#define MTC0_SEL1_OPCODE(dst, src)\
-+ .word (0x40800000 | ((dst)<<16) | ((src)<<11) | 1);\
-+ nop; \
-+ nop; \
-+ nop
-+
-+
-+/* Below are Jade core specific */
-+#define CFG0_4K_IL_MASK 0x00380000
-+#define CFG0_4K_IL_SHIFT 19
-+#define CFG0_4K_IA_MASK 0x00070000
-+#define CFG0_4K_IA_SHIFT 16
-+#define CFG0_4K_IS_MASK 0x01c00000
-+#define CFG0_4K_IS_SHIFT 22
-+
-+#define CFG0_4K_DL_MASK 0x00001c00
-+#define CFG0_4K_DL_SHIFT 10
-+#define CFG0_4K_DA_MASK 0x00000380
-+#define CFG0_4K_DA_SHIFT 7
-+#define CFG0_4K_DS_MASK 0x0000E000
-+#define CFG0_4K_DS_SHIFT 13
-+
-+
-+
-+#endif /* __TNETD73XX_H_ */
-diff -urN kernel-base/include/asm-mips/ar7/tnetd73xx_misc.h kernel-current/include/asm-mips/ar7/tnetd73xx_misc.h
---- kernel-base/include/asm-mips/ar7/tnetd73xx_misc.h 1970-01-01 01:00:00.000000000 +0100
-+++ kernel-current/include/asm-mips/ar7/tnetd73xx_misc.h 2005-07-10 09:53:49.418344272 +0200
-@@ -0,0 +1,239 @@
-+/******************************************************************************
-+ * FILE PURPOSE: TNETD73xx Misc modules API Header
-+ ******************************************************************************
-+ * FILE NAME: tnetd73xx_misc.h
-+ *
-+ * DESCRIPTION: Clock Control, Reset Control, Power Management, GPIO
-+ * FSER Modules API
-+ * As per TNETD73xx specifications
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - Sharath Kumar PSP TII
-+ * 14 Feb 03 - Anant Gole PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __TNETD73XX_MISC_H__
-+#define __TNETD73XX_MISC_H__
-+
-+/*****************************************************************************
-+ * Reset Control Module
-+ *****************************************************************************/
-+
-+typedef enum TNETD73XX_RESET_MODULE_tag
-+{
-+ RESET_MODULE_UART0 = 0,
-+ RESET_MODULE_UART1 = 1,
-+ RESET_MODULE_I2C = 2,
-+ RESET_MODULE_TIMER0 = 3,
-+ RESET_MODULE_TIMER1 = 4,
-+ RESET_MODULE_GPIO = 6,
-+ RESET_MODULE_ADSLSS = 7,
-+ RESET_MODULE_USBS = 8,
-+ RESET_MODULE_SAR = 9,
-+ RESET_MODULE_VDMA_VT = 11,
-+ RESET_MODULE_FSER = 12,
-+ RESET_MODULE_VLYNQ1 = 16,
-+ RESET_MODULE_EMAC0 = 17,
-+ RESET_MODULE_DMA = 18,
-+ RESET_MODULE_BIST = 19,
-+ RESET_MODULE_VLYNQ0 = 20,
-+ RESET_MODULE_EMAC1 = 21,
-+ RESET_MODULE_MDIO = 22,
-+ RESET_MODULE_ADSLSS_DSP = 23,
-+ RESET_MODULE_EPHY = 26
-+} TNETD73XX_RESET_MODULE_T;
-+
-+typedef enum TNETD73XX_RESET_CTRL_tag
-+{
-+ IN_RESET = 0,
-+ OUT_OF_RESET
-+} TNETD73XX_RESET_CTRL_T;
-+
-+typedef enum TNETD73XX_SYS_RST_MODE_tag
-+{
-+ RESET_SOC_WITH_MEMCTRL = 1, /* SW0 bit in SWRCR register */
-+ RESET_SOC_WITHOUT_MEMCTRL = 2 /* SW1 bit in SWRCR register */
-+} TNETD73XX_SYS_RST_MODE_T;
-+
-+typedef enum TNETD73XX_SYS_RESET_STATUS_tag
-+{
-+ HARDWARE_RESET = 0,
-+ SOFTWARE_RESET0, /* Caused by writing 1 to SW0 bit in SWRCR register */
-+ WATCHDOG_RESET,
-+ SOFTWARE_RESET1 /* Caused by writing 1 to SW1 bit in SWRCR register */
-+} TNETD73XX_SYS_RESET_STATUS_T;
-+
-+void tnetd73xx_reset_ctrl(TNETD73XX_RESET_MODULE_T reset_module,
-+ TNETD73XX_RESET_CTRL_T reset_ctrl);
-+TNETD73XX_RESET_CTRL_T tnetd73xx_get_reset_status(TNETD73XX_RESET_MODULE_T reset_module);
-+void tnetd73xx_sys_reset(TNETD73XX_SYS_RST_MODE_T mode);
-+TNETD73XX_SYS_RESET_STATUS_T tnetd73xx_get_sys_last_reset_status(void);
-+
-+/*****************************************************************************
-+ * Power Control Module
-+ *****************************************************************************/
-+
-+typedef enum TNETD73XX_POWER_MODULE_tag
-+{
-+ POWER_MODULE_USBSP = 0,
-+ POWER_MODULE_WDTP = 1,
-+ POWER_MODULE_UT0P = 2,
-+ POWER_MODULE_UT1P = 3,
-+ POWER_MODULE_IICP = 4,
-+ POWER_MODULE_VDMAP = 5,
-+ POWER_MODULE_GPIOP = 6,
-+ POWER_MODULE_VLYNQ1P = 7,
-+ POWER_MODULE_SARP = 8,
-+ POWER_MODULE_ADSLP = 9,
-+ POWER_MODULE_EMIFP = 10,
-+ POWER_MODULE_ADSPP = 12,
-+ POWER_MODULE_RAMP = 13,
-+ POWER_MODULE_ROMP = 14,
-+ POWER_MODULE_DMAP = 15,
-+ POWER_MODULE_BISTP = 16,
-+ POWER_MODULE_TIMER0P = 18,
-+ POWER_MODULE_TIMER1P = 19,
-+ POWER_MODULE_EMAC0P = 20,
-+ POWER_MODULE_EMAC1P = 22,
-+ POWER_MODULE_EPHYP = 24,
-+ POWER_MODULE_VLYNQ0P = 27,
-+} TNETD73XX_POWER_MODULE_T;
-+
-+typedef enum TNETD73XX_POWER_CTRL_tag
-+{
-+ POWER_CTRL_POWER_UP = 0,
-+ POWER_CTRL_POWER_DOWN
-+} TNETD73XX_POWER_CTRL_T;
-+
-+typedef enum TNETD73XX_SYS_POWER_MODE_tag
-+{
-+ GLOBAL_POWER_MODE_RUN = 0, /* All system is up */
-+ GLOBAL_POWER_MODE_IDLE, /* MIPS is power down, all peripherals working */
-+ GLOBAL_POWER_MODE_STANDBY, /* Chip in power down, but clock to ADSKL subsystem is running */
-+ GLOBAL_POWER_MODE_POWER_DOWN /* Total chip is powered down */
-+} TNETD73XX_SYS_POWER_MODE_T;
-+
-+void tnetd73xx_power_ctrl(TNETD73XX_POWER_MODULE_T power_module, TNETD73XX_POWER_CTRL_T power_ctrl);
-+TNETD73XX_POWER_CTRL_T tnetd73xx_get_pwr_status(TNETD73XX_POWER_MODULE_T power_module);
-+void tnetd73xx_set_global_pwr_mode(TNETD73XX_SYS_POWER_MODE_T power_mode);
-+TNETD73XX_SYS_POWER_MODE_T tnetd73xx_get_global_pwr_mode(void);
-+
-+/*****************************************************************************
-+ * Wakeup Control
-+ *****************************************************************************/
-+
-+typedef enum TNETD73XX_WAKEUP_INTERRUPT_tag
-+{
-+ WAKEUP_INT0 = 1,
-+ WAKEUP_INT1 = 2,
-+ WAKEUP_INT2 = 4,
-+ WAKEUP_INT3 = 8
-+} TNETD73XX_WAKEUP_INTERRUPT_T;
-+
-+typedef enum TNETD73XX_WAKEUP_CTRL_tag
-+{
-+ WAKEUP_DISABLED = 0,
-+ WAKEUP_ENABLED
-+} TNETD73XX_WAKEUP_CTRL_T;
-+
-+typedef enum TNETD73XX_WAKEUP_POLARITY_tag
-+{
-+ WAKEUP_ACTIVE_HIGH = 0,
-+ WAKEUP_ACTIVE_LOW
-+} TNETD73XX_WAKEUP_POLARITY_T;
-+
-+void tnetd73xx_wakeup_ctrl(TNETD73XX_WAKEUP_INTERRUPT_T wakeup_int,
-+ TNETD73XX_WAKEUP_CTRL_T wakeup_ctrl,
-+ TNETD73XX_WAKEUP_POLARITY_T wakeup_polarity);
-+
-+/*****************************************************************************
-+ * FSER Control
-+ *****************************************************************************/
-+
-+typedef enum TNETD73XX_FSER_MODE_tag
-+{
-+ FSER_I2C = 0,
-+ FSER_UART = 1
-+} TNETD73XX_FSER_MODE_T;
-+
-+void tnetd73xx_fser_ctrl(TNETD73XX_FSER_MODE_T fser_mode);
-+
-+/*****************************************************************************
-+ * Clock Control
-+ *****************************************************************************/
-+
-+#define CLK_MHZ(x) ( (x) * 1000000 )
-+
-+typedef enum TNETD73XX_CLKC_ID_tag
-+{
-+ CLKC_SYS = 0,
-+ CLKC_MIPS,
-+ CLKC_USB,
-+ CLKC_ADSLSS
-+} TNETD73XX_CLKC_ID_T;
-+
-+void tnetd73xx_clkc_init(__u32 afeclk, __u32 refclk, __u32 xtal3in);
-+TNETD73XX_ERR tnetd73xx_clkc_set_freq(TNETD73XX_CLKC_ID_T clk_id, __u32 output_freq);
-+__u32 tnetd73xx_clkc_get_freq(TNETD73XX_CLKC_ID_T clk_id);
-+
-+/*****************************************************************************
-+ * GPIO Control
-+ *****************************************************************************/
-+
-+typedef enum TNETD73XX_GPIO_PIN_tag
-+{
-+ GPIO_UART0_RD = 0,
-+ GPIO_UART0_TD = 1,
-+ GPIO_UART0_RTS = 2,
-+ GPIO_UART0_CTS = 3,
-+ GPIO_FSER_CLK = 4,
-+ GPIO_FSER_D = 5,
-+ GPIO_EXT_AFE_SCLK = 6,
-+ GPIO_EXT_AFE_TX_FS = 7,
-+ GPIO_EXT_AFE_TXD = 8,
-+ GPIO_EXT_AFE_RS_FS = 9,
-+ GPIO_EXT_AFE_RXD1 = 10,
-+ GPIO_EXT_AFE_RXD0 = 11,
-+ GPIO_EXT_AFE_CDIN = 12,
-+ GPIO_EXT_AFE_CDOUT = 13,
-+ GPIO_EPHY_SPEED100 = 14,
-+ GPIO_EPHY_LINKON = 15,
-+ GPIO_EPHY_ACTIVITY = 16,
-+ GPIO_EPHY_FDUPLEX = 17,
-+ GPIO_EINT0 = 18,
-+ GPIO_EINT1 = 19,
-+ GPIO_MBSP0_TCLK = 20,
-+ GPIO_MBSP0_RCLK = 21,
-+ GPIO_MBSP0_RD = 22,
-+ GPIO_MBSP0_TD = 23,
-+ GPIO_MBSP0_RFS = 24,
-+ GPIO_MBSP0_TFS = 25,
-+ GPIO_MII_DIO = 26,
-+ GPIO_MII_DCLK = 27,
-+} TNETD73XX_GPIO_PIN_T;
-+
-+typedef enum TNETD73XX_GPIO_PIN_MODE_tag
-+{
-+ FUNCTIONAL_PIN = 0,
-+ GPIO_PIN = 1
-+} TNETD73XX_GPIO_PIN_MODE_T;
-+
-+typedef enum TNETD73XX_GPIO_PIN_DIRECTION_tag
-+{
-+ GPIO_OUTPUT_PIN = 0,
-+ GPIO_INPUT_PIN = 1
-+} TNETD73XX_GPIO_PIN_DIRECTION_T;
-+
-+void tnetd73xx_gpio_init(void);
-+void tnetd73xx_gpio_ctrl(TNETD73XX_GPIO_PIN_T gpio_pin,
-+ TNETD73XX_GPIO_PIN_MODE_T pin_mode,
-+ TNETD73XX_GPIO_PIN_DIRECTION_T pin_direction);
-+void tnetd73xx_gpio_out(TNETD73XX_GPIO_PIN_T gpio_pin, int value);
-+int tnetd73xx_gpio_in(TNETD73XX_GPIO_PIN_T gpio_pin);
-+
-+/* TNETD73XX Revision */
-+__u32 tnetd73xx_get_revision(void);
-+
-+#endif /* __TNETD73XX_MISC_H__ */
diff -urN kernel-base/include/asm-mips/io.h kernel-current/include/asm-mips/io.h
--- kernel-base/include/asm-mips/io.h 2005-07-10 03:00:44.797179400 +0200
-+++ kernel-current/include/asm-mips/io.h 2005-07-10 06:40:39.624260784 +0200
++++ kernel-current/include/asm-mips/io.h 2005-07-10 06:40:39.624260000 +0200
@@ -63,8 +63,12 @@
#ifdef CONFIG_64BIT_PHYS_ADDR
#define page_to_phys(page) ((u64)(page - mem_map) << PAGE_SHIFT)
diff -urN kernel-base/include/asm-mips/irq.h kernel-current/include/asm-mips/irq.h
--- kernel-base/include/asm-mips/irq.h 2005-07-10 03:00:44.798179248 +0200
-+++ kernel-current/include/asm-mips/irq.h 2005-07-10 06:40:39.624260784 +0200
++++ kernel-current/include/asm-mips/irq.h 2005-07-10 06:40:39.624260000 +0200
@@ -14,7 +14,12 @@
#include <linux/config.h>
#include <linux/linkage.h>
static inline int irq_cannonicalize(int irq)
diff -urN kernel-base/include/asm-mips/page.h kernel-current/include/asm-mips/page.h
--- kernel-base/include/asm-mips/page.h 2005-07-10 03:00:44.798179248 +0200
-+++ kernel-current/include/asm-mips/page.h 2005-07-10 06:40:39.625260632 +0200
++++ kernel-current/include/asm-mips/page.h 2005-07-10 06:40:39.625260000 +0200
@@ -129,7 +129,11 @@
#define __pa(x) ((unsigned long) (x) - PAGE_OFFSET)
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
diff -urN kernel-base/include/asm-mips/pgtable-32.h kernel-current/include/asm-mips/pgtable-32.h
--- kernel-base/include/asm-mips/pgtable-32.h 2005-07-10 03:00:44.798179248 +0200
-+++ kernel-current/include/asm-mips/pgtable-32.h 2005-07-10 06:40:39.625260632 +0200
++++ kernel-current/include/asm-mips/pgtable-32.h 2005-07-10 06:40:39.625260000 +0200
@@ -108,7 +108,18 @@
* and a page entry and page directory to the page they refer to.
*/
#else
diff -urN kernel-base/include/asm-mips/serial.h kernel-current/include/asm-mips/serial.h
--- kernel-base/include/asm-mips/serial.h 2005-07-10 03:00:44.799179096 +0200
-+++ kernel-current/include/asm-mips/serial.h 2005-07-10 06:40:39.625260632 +0200
++++ kernel-current/include/asm-mips/serial.h 2005-07-10 06:40:39.625260000 +0200
@@ -65,6 +65,15 @@
#define C_P(card,port) (((card)<<6|(port)<<3) + 1)
COBALT_SERIAL_PORT_DEFNS \
diff -urN kernel-base/Makefile kernel-current/Makefile
--- kernel-base/Makefile 2005-07-10 03:00:44.799179096 +0200
-+++ kernel-current/Makefile 2005-07-10 06:40:39.626260480 +0200
++++ kernel-current/Makefile 2005-07-10 06:40:39.626260000 +0200
@@ -91,7 +91,7 @@
CPPFLAGS := -D__KERNEL__ -I$(HPATH)
--- /dev/null
+diff -urN kernel-old/drivers/char/avalanche_led/led_drv.c kernel-current/drivers/char/avalanche_led/led_drv.c
+--- kernel-old/drivers/char/avalanche_led/led_drv.c 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/led_drv.c 2005-07-10 18:40:23.008730752 +0200
+@@ -0,0 +1,375 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED driver module Source
++ ******************************************************************************
++ * FILE NAME: led_drv.c
++ *
++ * DESCRIPTION: Linux LED character driver implementation
++ *
++ * REVISION HISTORY:
++ * 27 Aug 2003 Initial Creation Sharath Kumar<krs@ti.com>
++ *
++ * 16 Dec 2003 Updates for 5.7 Sharath Kumar<krs@ti.com>
++ *
++ * 07 Jan 2004 Wrapper for DSL Sharath Kumar<krs@ti.com>
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/slab.h>
++#include <linux/ioport.h>
++#include <linux/fcntl.h>
++#include <linux/interrupt.h>
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/system.h>
++#include <linux/delay.h>
++#include <linux/devfs_fs_kernel.h>
++#include <linux/wait.h>
++#include <linux/proc_fs.h>
++#include <linux/timer.h>
++#include <asm/ar7/sangam.h>
++#include <asm/ar7/avalanche_misc.h>
++
++#include "led_config.h"
++#include "led_hal.h"
++#include "led_ioctl.h"
++#include "led_platform.h"
++
++//#define tnetd73xx_gpio_ctrl(gpio_pin, pin_mode, pin_direction) avalanche_gpio_ctrl(gpio_pin, pin_mode, pin_direction)
++#define tnetd73xx_gpio_out(gpio_pin, value) avalanche_gpio_out_bit(gpio_pin, value)
++//#define avalanche_gpio_in_bit(gpio_pin) tnetd73xx_gpio_in(gpio_pin)
++
++#define TI_LED_VERSION "0.1"
++#define GPIO_MAP_LEN ((MAX_GPIO_PIN_NUM/32) + 1)
++
++static int gpio_off_state[GPIO_MAP_LEN] = AVALANCHE_GPIO_OFF_MAP;
++
++#define TRUE 1
++#define FALSE 0
++#define FLICK_TIME (HZ*100/1000)
++static unsigned int wan_txrx_state = 0;
++static unsigned int wlan_txrx_state = 0;
++struct timer_list *pWanTimer = NULL;
++
++static void wan_led_func(unsigned long data)
++{
++ avalanche_gpio_ctrl(2, GPIO_PIN, GPIO_OUTPUT_PIN);
++ avalanche_gpio_ctrl(3, GPIO_PIN, GPIO_OUTPUT_PIN);
++
++ if (wan_txrx_state == 0)
++ {
++ tnetd73xx_gpio_out(2, TRUE);
++ tnetd73xx_gpio_out(3, FALSE);
++ wan_txrx_state = 1;
++ }
++ else
++ {
++ tnetd73xx_gpio_out(2, FALSE);
++ tnetd73xx_gpio_out(3, FALSE);
++ wan_txrx_state = 0;
++ }
++ pWanTimer->expires = jiffies + FLICK_TIME;
++ add_timer(pWanTimer);
++
++}
++
++static int led_ioctl( struct inode * inode, struct file * file,
++ unsigned int cmd, unsigned long arg )
++{
++
++ int ret = 0;
++// char name[80];
++
++ switch ( cmd )
++ {
++ case LED_CONFIG:
++ {
++ LED_CONFIG_T led_cfg;
++ if (copy_from_user((char *)&led_cfg, (char *)arg, sizeof(led_cfg)))
++ {
++ printk("in led config error\n");
++ ret = -EFAULT;
++ break;
++ }
++ printk("in led config\n");
++ ret = avalanche_led_config_set(&led_cfg);
++ }
++ break;
++
++ case LED_GET_HANDLE:
++ {
++ LED_MODULE_T led_mod;
++ int handle;
++
++ if (copy_from_user((char *)&led_mod, (char *)arg, sizeof(led_mod)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++
++ handle = (int)avalanche_led_register(led_mod.name,led_mod.instance);
++
++ if (copy_to_user((char *)(&(((LED_MODULE_T *)arg)->handle)), (char *)(&handle), sizeof(int)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++
++ if(handle)
++ ret = 0;
++ else
++ ret = -1;
++ }
++ break;
++
++ case LED_ACTION:
++ {
++ LED_STATE_T led_state;
++ if (copy_from_user((char *)&led_state, (char *)arg, sizeof(led_state)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++ else {
++ printk("led action : handle = %d, id = %d\n", led_state.handle, led_state.state_id);
++ //add by leijun
++ if (led_state.handle == 2) //system led
++ {
++ switch (led_state.state_id)
++ {
++ case 1:
++ break;
++ case 2: /*sys led flashing green */
++ tnetd73xx_gpio_out(4, FALSE);
++ tnetd73xx_gpio_out(5, TRUE);
++ tnetd73xx_gpio_out(8, TRUE);
++ break;
++ case 3: /*sys led solid green */
++ tnetd73xx_gpio_out(4, TRUE);
++ tnetd73xx_gpio_out(5, TRUE);
++ tnetd73xx_gpio_out(8, TRUE);
++
++ break;
++ case 4: /*sys fail red */
++ tnetd73xx_gpio_out(4, TRUE);
++ tnetd73xx_gpio_out(5, FALSE);
++ tnetd73xx_gpio_out(8, FALSE);
++ break;
++ default:
++ break;
++
++ }
++ }else if (led_state.handle == 3)
++ {
++ printk("led action : handle = %d, id = %d\n", led_state.handle, led_state.state_id);
++ avalanche_gpio_ctrl(2, GPIO_PIN, GPIO_OUTPUT_PIN);
++ avalanche_gpio_ctrl(3, GPIO_PIN, GPIO_OUTPUT_PIN);
++
++ switch (led_state.state_id)
++ {
++ case 1: /*no wan interface*/
++ if (pWanTimer)
++ {
++ del_timer(pWanTimer);
++ kfree(pWanTimer);
++ pWanTimer = NULL;
++ }
++ tnetd73xx_gpio_out(2, FALSE);
++ tnetd73xx_gpio_out(3, FALSE);
++ break;
++ case 2: /*wan connected */
++ if (pWanTimer)
++ {
++ del_timer(pWanTimer);
++ kfree(pWanTimer);
++ pWanTimer = NULL;
++ }
++ tnetd73xx_gpio_out(2, TRUE);
++ tnetd73xx_gpio_out(3, FALSE);
++ break;
++ case 3: /*rx/tx activity */
++ if (pWanTimer != NULL)
++ break;
++
++ pWanTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
++ init_timer(pWanTimer);
++
++ pWanTimer->function = wan_led_func;
++ pWanTimer->data = 0;
++ pWanTimer->expires = jiffies + FLICK_TIME;
++ tnetd73xx_gpio_out(2, FALSE);
++ tnetd73xx_gpio_out(3, FALSE);
++ wan_txrx_state = 0;
++ add_timer(pWanTimer);
++
++ break;
++ case 4: /*no ipaddress */
++ if (pWanTimer)
++ {
++ del_timer(pWanTimer);
++ kfree(pWanTimer);
++ pWanTimer = NULL;
++ }
++ tnetd73xx_gpio_out(2, FALSE);
++ tnetd73xx_gpio_out(3, TRUE);
++ break;
++ default:
++ if (pWanTimer)
++ {
++ del_timer(pWanTimer);
++ kfree(pWanTimer);
++ pWanTimer = NULL;
++ }
++ break;
++ }
++ }else if (led_state.handle == 4) //test
++ {
++ int high, low;
++ high = (led_state.state_id & 0xf0) >> 4;
++ low = (led_state.state_id & 0x0f);
++ tnetd73xx_gpio_out(high, (low > 0)?1:0);
++ }else avalanche_led_action((void *)led_state.handle,led_state.state_id);
++ }
++
++ }
++ break;
++
++ case LED_RELEASE_HANDLE:
++ ret = avalanche_led_unregister((void *)arg);
++ break;
++
++ default:
++ ret = -EINVAL;
++ }
++ return ret;
++
++}
++
++static int led_open( struct inode * inode, struct file * file )
++{
++ return 0;
++}
++
++static int led_close( struct inode * inode, struct file * file )
++{
++ return 0;
++}
++
++struct file_operations led_fops = {
++ ioctl: led_ioctl,
++ open: led_open,
++ release: led_close
++};
++
++
++/* Proc function to display driver version */
++static int
++led_ver_info(char *buf, char **start, off_t offset, int count, int *eof, void *data)
++{
++// int instance;
++ int len=0;
++
++ len += sprintf(buf +len,"\nTI Linux LED Driver Version %s\n",TI_LED_VERSION);
++ return len;
++}
++
++
++/* proc interface /proc/avalanche/led */
++int led_cfg_info(char* buf, char **start, off_t offset, int count,
++ int *eof, void *data)
++{
++ int mod_count = 0;
++ int len=0;
++ int limit = count - 80;
++ char *msg[5]={"LED OFF", "LED_ON", "LED_ONESHOT_OFF", "LED_ONESHOT_ON","LED_FLASH"};
++
++ for(mod_count = 0;mod_count<MAX_MODULE_ENTRIES;mod_count++)
++ {
++ int instance;
++
++ for(instance = 0; instance < MAX_MODULE_INSTANCES; instance++)
++ {
++ int state_id;
++ int flag = 0;
++
++ for(state_id =0 ;state_id < MAX_STATE_ENTRIES; state_id++)
++ {
++ LED_CONFIG_T led_cfg;
++ if(avalanche_led_config_get(&led_cfg,mod_count,instance,state_id) == 0)
++ {
++ if(flag == 0)
++ {
++ flag = 1;
++ if(len <= limit)
++ len+= sprintf(buf+len, "\nModule:%s\n",led_cfg.name);
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n Instance:%d\n",instance);
++
++ }
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n State: %d\n",state_id);
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n mode: %s\n",msg[led_cfg.mode[0]% 5 ]);
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n gpio: %d\n",led_cfg.gpio[0]);
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n param1: %d\n",led_cfg.param1);
++
++ if(len <= limit)
++ len+= sprintf(buf+len, "\n param2: %d\n",led_cfg.param2);
++ }
++ }
++ }
++ }
++
++
++
++ return len;
++}
++
++
++
++int __init led_init(void)
++{
++
++ /* register LED device */
++ devfs_register(NULL, "led", DEVFS_FL_AUTO_DEVNUM, 0, 0,
++ S_IFCHR | S_IRUGO | S_IWUGO, &led_fops,NULL);
++
++
++ avalanche_led_hal_init(gpio_off_state,AVALANCHE_GPIO_PIN_COUNT);
++
++ /* create proc entry */
++ create_proc_read_entry("avalanche/led_cfg", 0, NULL, led_cfg_info, NULL);
++ create_proc_read_entry("avalanche/led_ver", 0, NULL, led_ver_info, NULL);
++
++ return 0;
++}
++
++void led_exit(void)
++{
++ avalanche_led_hal_exit();
++ return;
++}
++
++module_init(led_init);
++module_exit(led_exit);
++
++
++EXPORT_SYMBOL_NOVERS(avalanche_led_register);
++EXPORT_SYMBOL_NOVERS(avalanche_led_action);
++EXPORT_SYMBOL_NOVERS(avalanche_led_unregister);
++EXPORT_SYMBOL_NOVERS(avalanche_led_config_set);
++EXPORT_SYMBOL_NOVERS(avalanche_led_config_get);
+diff -urN kernel-old/drivers/char/avalanche_led/led_hal.c kernel-current/drivers/char/avalanche_led/led_hal.c
+--- kernel-old/drivers/char/avalanche_led/led_hal.c 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/led_hal.c 2005-07-10 18:24:22.242038232 +0200
+@@ -0,0 +1,821 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED HAL module source
++ ******************************************************************************
++ * FILE NAME: led_hal.c
++ *
++ * DESCRIPTION: LED HAL API's source.
++ *
++ * REVISION HISTORY:
++ * 27 Aug 2003 Initial Creation Sharath Kumar<krs@ti.com>
++ *
++ * 16 Dec 2003 Updates for 5.7 Sharath Kumar<krs@ti.com>
++ *
++ * 07 Jan 2004 Wrapper for DSL Sharath Kumar<krs@ti.com>
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#include "led_platform.h"
++#include "led_config.h"
++#include "led_hal.h"
++
++/* include for gpio APIs */
++#include <asm/ar7/avalanche_misc.h>
++
++
++#define REQUIRES_TIMER(x) ( (x == LED_ONESHOT_ON) || (x == LED_ONESHOT_OFF) || (x == LED_FLASH) )
++
++/*******************TYPEDEFs**************************************************/
++typedef struct
++{
++ unsigned int state;
++ unsigned int module_map;
++ unsigned int pos_map[2];
++}
++LED_OBJ_T;
++
++typedef struct state_entry STATE_ENTRY_T;
++
++struct state_entry
++{
++ void (*handler) (STATE_ENTRY_T * state);
++ unsigned int timer_running;
++ LED_OBJ_T *led;
++ unsigned int map1[2];
++ unsigned int map2[2];
++ void *os_timer;
++ unsigned int param1;
++ unsigned int param2;
++ unsigned int module_id;
++ unsigned int mode;
++};
++
++typedef struct module_instance
++{
++ int module_id;
++ int instance;
++ STATE_ENTRY_T *states[MAX_STATE_ENTRIES];
++}
++MODULE_INSTANCE_T;
++
++typedef struct module_entry
++{
++ unsigned char *name;
++ MODULE_INSTANCE_T *module_instance[MAX_MODULE_INSTANCES];
++}
++MODULE_ENTRY_T;
++
++
++
++/******************variable defn/declns***************************************/
++
++static LED_OBJ_T *leds[MAX_LED_ENTRIES];
++static MODULE_ENTRY_T *modules[MAX_MODULE_ENTRIES];
++
++/* Declare Mutex lock */
++MUTEX_DECLARE (led_lock);
++
++/* GPIO OFF STATE */
++static unsigned int gpio_offstate_map[2];
++
++/* Number of GPIO pins in the system */
++static unsigned int num_gpios;
++
++/* LED handlers */
++static void (*led_mode_handler[NUM_LED_MODES]) (STATE_ENTRY_T * state);
++
++
++
++/******************static functions*****************************************/
++
++static void *led_malloc (int n)
++{
++ void *p;
++ p = os_malloc (n);
++
++ if (p)
++ os_memset (p, 0, n);
++
++ return p;
++}
++
++static void avalanche_gpio_set(int * set_map,int *pos_map)
++{
++ int i;
++
++ for(i = 0;i <num_gpios ;i+=32)
++ {
++ int index = i/32;
++ avalanche_gpio_out_value(set_map[index],pos_map[index],index);
++
++ }
++
++}
++
++
++static MODULE_INSTANCE_T *get_module (char *name, int instance)
++{
++ int module_id;
++ MODULE_INSTANCE_T *mod_inst;
++
++
++ if (instance >= MAX_MODULE_INSTANCES)
++ return NULL;
++
++ for (module_id = 0; module_id < MAX_MODULE_ENTRIES; module_id++)
++ {
++ if (modules[module_id]
++ && !os_strcmp (name, modules[module_id]->name))
++ break;
++ }
++
++ if (module_id == MAX_MODULE_ENTRIES)
++ {
++ for (module_id = 0;
++ (module_id < MAX_MODULE_ENTRIES) && modules[module_id];
++ module_id++);
++
++ if (module_id < MAX_MODULE_ENTRIES)
++ {
++ modules[module_id] = led_malloc (sizeof (MODULE_ENTRY_T));
++
++ if (!modules[module_id])
++ return NULL;
++
++ modules[module_id]->name = led_malloc (os_strlen (name) + 1);
++
++ if (!modules[module_id]->name)
++ return NULL;
++
++ os_strcpy (modules[module_id]->name, name);
++ }
++ else
++ {
++ log_msg ("ERROR:Module Count exceeded\n");
++ return NULL;
++ }
++ }
++
++ if (!modules[module_id]->module_instance[instance])
++ modules[module_id]->module_instance[instance] =
++ led_malloc (sizeof (MODULE_INSTANCE_T));
++
++ if (!modules[module_id]->module_instance[instance])
++ return NULL;
++
++ mod_inst = modules[module_id]->module_instance[instance];
++ mod_inst->module_id = module_id;
++ mod_inst->instance = instance;
++
++ return mod_inst;
++}
++
++
++static void assign_map(int *to, int *from)
++{
++ int i;
++
++ for(i = 0;i <num_gpios ;i+=32)
++ {
++ int index = i/32;
++ to[index] = from[index];
++ }
++}
++
++
++
++
++static LED_OBJ_T *get_led (int * pos_map)
++{
++ int led_id;
++
++ for (led_id = 0; led_id < MAX_LED_ENTRIES; led_id++)
++ {
++ if (leds[led_id])
++ {
++ int i;
++ int flag=0;
++
++ for(i = 0;i <num_gpios ;i+=32)
++ {
++ int index = i/32;
++ if(leds[led_id]->pos_map[index] != pos_map[index])
++ flag =1;
++ }
++ if(flag == 0)
++ break;
++ }
++ }
++
++ if (led_id == MAX_LED_ENTRIES)
++ {
++ for (led_id = 0; (led_id < MAX_LED_ENTRIES) && leds[led_id];
++ led_id++);
++
++ if (led_id < MAX_LED_ENTRIES)
++ {
++ leds[led_id] = led_malloc (sizeof (LED_OBJ_T));
++
++ if (!leds[led_id])
++ return NULL;
++
++ assign_map(leds[led_id]->pos_map,pos_map);
++ }
++ else
++ {
++ log_msg ("ERROR:Module Count exceeded\n");
++ return NULL;
++ }
++ }
++
++ return leds[led_id];
++}
++
++static void led_oneshot_on_timer_func (int arg)
++{
++ STATE_ENTRY_T *state = (STATE_ENTRY_T *) arg;
++ LED_OBJ_T *led = state->led;
++
++ state->timer_running = 0;
++ MUTEX_GET (led_lock);
++ if (led->state == LED_ONESHOT_ON)
++ {
++ led->state = LED_OFF;
++ avalanche_gpio_set (state->map2,led->pos_map);
++ }
++ MUTEX_RELEASE (led_lock);
++
++}
++
++static void led_oneshot_off_timer_func (int arg)
++{
++ STATE_ENTRY_T *state = (STATE_ENTRY_T *) arg;
++ LED_OBJ_T *led = state->led;
++
++ state->timer_running = 0;
++
++ MUTEX_GET (led_lock);
++ if (led->state == LED_ONESHOT_OFF)
++ {
++ led->state = LED_ON;
++ avalanche_gpio_set(state->map2,led->pos_map);
++ }
++ MUTEX_RELEASE (led_lock);
++
++}
++
++static void led_flash_timer_func (int arg)
++{
++ STATE_ENTRY_T *state = (STATE_ENTRY_T *) arg;
++ LED_OBJ_T *led = state->led;
++
++
++ if (led->state != LED_FLASH)
++ return;
++
++ MUTEX_GET (led_lock);
++
++ if (state->timer_running == 1)
++ {
++ state->timer_running = 2;
++ avalanche_gpio_set(state->map2,led->pos_map);
++ os_timer_add (state->os_timer, state->param2, (int)state);
++ }
++ else
++ {
++ state->timer_running = 1;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ os_timer_add (state->os_timer, state->param1, (int)state);
++ }
++
++ MUTEX_RELEASE (led_lock);
++}
++
++static void led_on(STATE_ENTRY_T * state)
++{
++ LED_OBJ_T *led = state->led;
++
++ led->state = LED_ON;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ led->module_map |= (1 << (state->module_id));
++
++}
++
++static void led_off (STATE_ENTRY_T * state)
++{
++ LED_OBJ_T *led = state->led;
++
++ led->module_map &= ~(1 << (state->module_id));
++ if (!led->module_map)
++ {
++ led->state = LED_OFF;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ }
++
++}
++
++static void led_oneshot_on (STATE_ENTRY_T * state)
++{
++ LED_OBJ_T *led = state->led;
++
++ if (state->timer_running)
++ return;
++
++ state->timer_running = 1;
++ led->state = LED_ONESHOT_ON;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ os_timer_add (state->os_timer, state->param1,(int) state);
++}
++
++static void led_oneshot_off (STATE_ENTRY_T * state)
++{
++
++ LED_OBJ_T *led = state->led;
++
++ if (state->timer_running)
++ return;
++
++ state->timer_running = 1;
++ led->state = LED_ONESHOT_OFF;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ os_timer_add (state->os_timer, state->param1,(int) state);
++}
++
++static void led_flash (STATE_ENTRY_T * state)
++{
++ LED_OBJ_T *led = state->led;
++
++ if (state->timer_running)
++ return;
++
++ state->timer_running = 1;
++ led->state = LED_FLASH;
++ avalanche_gpio_set(state->map1,led->pos_map);
++ os_timer_add (state->os_timer, state->param1,(int) state);
++}
++
++
++
++static int led_get_mode(LED_CONFIG_T *led_cfg)
++{
++ int num_gpio = led_cfg->gpio_num;
++ int i;
++ int *led_mode = led_cfg->mode;
++ int max = -1;
++
++ /* Return Max of available modes */
++ for(i = 0; i<num_gpio; i++)
++ {
++ max = (max > led_mode[i]) ? max : led_mode[i];
++ }
++
++ return max;
++}
++
++static void led_assign_timer(STATE_ENTRY_T *state_entry)
++{
++
++ if (state_entry->os_timer)
++ {
++ os_timer_delete(state_entry->os_timer);
++ }
++
++ switch(state_entry->mode)
++ {
++ case LED_ONESHOT_ON:
++ state_entry->os_timer = os_timer_init(led_oneshot_on_timer_func);
++ break;
++
++ case LED_ONESHOT_OFF:
++ state_entry->os_timer = os_timer_init(led_oneshot_off_timer_func);
++ break;
++
++ case LED_FLASH:
++ state_entry->os_timer = os_timer_init(led_flash_timer_func);
++ break;
++
++ default:
++ log_msg("invalid mode in function led_assign timer\n");
++ }
++
++}
++
++static int led_get_map(LED_CONFIG_T *led_cfg,int *p_pos_map,int *p_map1,int *p_map2)
++{
++ int i;
++ int map1[2] = {0,0};
++ int pos_map[2] = {0,0};
++ int map2[2] = {0,0};
++ int requires_timer = REQUIRES_TIMER(led_get_mode(led_cfg));
++
++ for (i = 0; i < led_cfg->gpio_num; i++)
++ {
++ int gpio_map;
++ int index = led_cfg->gpio[i]/32;
++ int pos = led_cfg->gpio[i] % 32;
++
++ if (led_cfg->gpio[i] >= num_gpios)
++ {
++ log_msg ("Error: gpio number out of range\n");
++ return -1;
++ }
++
++ gpio_map = 1 << pos;
++
++ pos_map[index] |= gpio_map;
++
++
++ switch (led_cfg->mode[i])
++ {
++ case LED_OFF:
++ if(gpio_offstate_map[index] & gpio_map)
++ map1[index] |= gpio_map;
++
++ if (requires_timer && (gpio_offstate_map[index] & gpio_map))
++ map2[index] |= gpio_map;
++ break;
++
++ case LED_ON:
++
++ if(!(gpio_offstate_map[index] & gpio_map))
++ map1[index] |= gpio_map;
++
++ if (requires_timer && !(gpio_offstate_map[index] & gpio_map))
++ map2[index] |= gpio_map;
++ break;
++
++ case LED_ONESHOT_OFF:
++
++ if ((gpio_offstate_map[index] & gpio_map))
++ map1[index] |= gpio_map;
++ else
++ map2[index] |= gpio_map;
++ break;
++
++ case LED_ONESHOT_ON:
++ case LED_FLASH:
++
++ if (!(gpio_offstate_map[index] & gpio_map))
++ map1[index] |= gpio_map;
++ else
++ map2[index] |= gpio_map;
++ break;
++
++ default:
++ log_msg ("Error: Invalid mode\n");
++ return -1;
++ }
++ }
++
++ assign_map(p_pos_map,pos_map);
++ assign_map(p_map1,map1);
++ assign_map(p_map2,map2);
++
++ return 0;
++}
++
++
++
++
++static int configure_state(STATE_ENTRY_T *state_entry,LED_CONFIG_T *led_cfg)
++{
++// int state = led_cfg->state;
++ int i;
++ int map1[2] ;
++ int pos_map[2];
++ int map2[2];
++
++ if((state_entry->mode = led_get_mode(led_cfg)) >= NUM_LED_MODES)
++ {
++ log_msg ("Error: Invalid mode in func configure_state\n");
++ return -1;
++ }
++
++ state_entry->handler = led_mode_handler[state_entry->mode];
++
++
++ if(led_get_map(led_cfg,pos_map,map1,map2))
++ {
++ log_msg ("Error: gpio number out of range\n");
++ return -1;
++ }
++
++ assign_map(state_entry->map1,map1);
++ assign_map(state_entry->map2,map2);
++ state_entry->led = get_led(pos_map);
++
++ /* Check if the state requires timer */
++ if(REQUIRES_TIMER(state_entry->mode))
++ {
++ state_entry->timer_running = 0;
++ state_entry->param1 = led_cfg->param1;
++ state_entry->param2 = led_cfg->param2;
++ led_assign_timer(state_entry);
++ }
++
++ /* enable gpio pins */
++ for(i = 0;i<led_cfg->gpio_num;i++)
++ {
++ int value;
++ int index;
++ int pos;
++ avalanche_gpio_ctrl (led_cfg->gpio[i],GPIO_PIN,GPIO_OUTPUT_PIN);
++
++ /* Turn off the led */
++ index = led_cfg->gpio[i]/32;
++ pos = led_cfg->gpio[i] % 32;
++ value = (gpio_offstate_map[index] & (1 << pos))?1:0;
++ avalanche_gpio_out_bit(led_cfg->gpio[i],value);
++ }
++
++ return 0;
++}
++
++
++static void free_all_states(void)
++{
++ int module_id;
++
++ for(module_id = 0; module_id < MAX_MODULE_ENTRIES; module_id++)
++ {
++ if(modules[module_id])
++ {
++ int i;
++ for(i = 0; i< MAX_MODULE_INSTANCES; i++)
++ {
++ MODULE_INSTANCE_T *module_instance = modules[module_id]->module_instance[i];
++
++ if(module_instance)
++ {
++ int state_id;
++
++ for(state_id =0; state_id < MAX_STATE_ENTRIES; state_id++)
++ {
++ STATE_ENTRY_T *state= module_instance->states[state_id];
++
++ if(state)
++ {
++ if(state->os_timer)
++ os_timer_delete(state->os_timer);
++
++ os_free(state);
++ module_instance->states[state_id] = NULL;
++ }
++
++ }
++ }
++
++ }
++ os_free(modules[module_id]->name);
++ os_free(modules[module_id]);
++ modules[module_id] = NULL;
++ }
++ }
++}
++
++/***********************************HAL APIS************************************/
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_hal_init
++ **************************************************************************
++ * DESCRIPTION :
++ * The function initializes led hal module
++ *
++ * RETURNS :
++ * 0 on Success
++ * Negative value on Error
++ ***************************************************************************/
++
++
++int avalanche_led_hal_init (int *gpio_off_value, int num_gpio_pins)
++{
++ //int i;
++
++ num_gpios = num_gpio_pins + 4;
++ assign_map(gpio_offstate_map, gpio_off_value);
++
++ MUTEX_INIT (led_lock);
++
++ /* initialize led state function handlers */
++ led_mode_handler[LED_ON] = led_on;
++ led_mode_handler[LED_OFF] = led_off;
++ led_mode_handler[LED_ONESHOT_ON] = led_oneshot_on;
++ led_mode_handler[LED_ONESHOT_OFF] = led_oneshot_off;
++ led_mode_handler[LED_FLASH] = led_flash;
++
++ return 0;
++}
++
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_config_set
++ **************************************************************************
++ * DESCRIPTION :
++ * The function configures LED state object
++ *
++ * RETURNS :
++ * 0 on Success
++ * Negative value on Error
++ ***************************************************************************/
++
++int avalanche_led_config_set(LED_CONFIG_T * led_cfg)
++{
++ MODULE_INSTANCE_T *module;
++ MUTEX_GET (led_lock);
++ module = get_module (led_cfg->name, led_cfg->instance);
++
++ if (!module)
++ goto config_failed;
++
++ if (led_cfg->state < MAX_STATE_ENTRIES)
++ {
++ int state = led_cfg->state;
++
++ if (!(module->states[state]))
++ {
++ module->states[state] = led_malloc (sizeof (STATE_ENTRY_T));
++ }
++
++ if (!(module->states[state]))
++ goto config_failed;
++
++ module->states[state]->module_id = module->module_id;
++
++ if(configure_state(module->states[state],led_cfg))
++ {
++ os_free(module->states[state]);
++ module->states[state] = NULL;
++ goto config_failed;
++ }
++
++ }
++ else
++ {
++ log_msg ("ERROR:State Count exceeded\n");
++ goto config_failed;
++ }
++
++ MUTEX_RELEASE (led_lock);
++ return 0;
++
++ config_failed:
++
++ MUTEX_RELEASE (led_lock);
++ return -1;
++
++}
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_register
++ **************************************************************************
++ * DESCRIPTION :
++ * The function creates handle to the given module and returns it.
++ *
++ * RETURNS :
++ * Handle to the module instance on success.
++ * NULL on failure.
++ ***************************************************************************/
++
++void *avalanche_led_register (const char *mod_name, int instance)
++{
++ void *p;
++ MUTEX_GET (led_lock);
++ p = (void *)get_module ((char *)mod_name, instance);
++ MUTEX_RELEASE (led_lock);
++ return p;
++}
++
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_action
++ **************************************************************************
++ * DESCRIPTION :
++ * The function triggers action on LED
++ *
++ ***************************************************************************/
++
++void avalanche_led_action (void *module, int state_id)
++{
++
++ MUTEX_GET (led_lock);
++ if (module && (state_id < MAX_STATE_ENTRIES))
++ {
++
++ STATE_ENTRY_T *state =
++ ((MODULE_INSTANCE_T *) (module))->states[state_id];
++ if (state)
++ {
++ state->handler (state);
++ }
++ }
++ MUTEX_RELEASE (led_lock);
++ return;
++}
++
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_unregister
++ **************************************************************************
++ * DESCRIPTION :
++ * The function unregisters the module
++ *
++ * RETURNS :
++ * 0 on Success
++ * Negative value on Error
++ ***************************************************************************/
++
++int avalanche_led_unregister (void *mod_inst)
++{
++
++ return 0;
++}
++
++
++/**************************************************************************
++ * FUNCTION NAME : led_free_all
++ **************************************************************************
++ * DESCRIPTION :
++ * The function frees the memory allocated for holding state
++ * configuration data
++ *
++ ***************************************************************************/
++
++void avalanche_led_free_all()
++{
++ free_all_states();
++}
++
++/**************************************************************************
++ * FUNCTION NAME : avalanche_led_hal_exit
++ **************************************************************************
++ * DESCRIPTION :
++ * The function releases all the allocated memory
++ *
++ ***************************************************************************/
++
++void avalanche_led_hal_exit ()
++{
++ free_all_states();
++}
++
++/*****************************************************************************
++ * FUNCTION NAME : avalanche_led_config_get
++ *****************************************************************************
++ * DESCRIPTION :
++ * The function returns configuration information corresponding to module
++ * state.
++ *
++ * RETURNS :
++ * 0 on Success
++ * Negative value on Error
++ ***************************************************************************/
++int avalanche_led_config_get(LED_CONFIG_T *led_cfg,int module_id,int instance, int state_id)
++{
++ if(module_id == -1)
++ {
++ /* The module info is passed through field of led_cfg */
++ MODULE_INSTANCE_T *mod = get_module (led_cfg->name, instance);
++ if(mod)
++ module_id = mod->module_id;
++
++ }
++ if(module_id >= MAX_MODULE_ENTRIES || module_id < 0)
++ return -1;
++
++ if(state_id >= MAX_STATE_ENTRIES || module_id < 0)
++ return -1;
++
++ if(instance >= MAX_MODULE_INSTANCES || module_id < 0)
++ return -1;
++
++ if(modules[module_id])
++ {
++ MODULE_INSTANCE_T *module = modules[module_id]->module_instance[instance];
++ if(module)
++ {
++ STATE_ENTRY_T *state = module->states[state_id];
++ if(state)
++ {
++ int i;
++ LED_OBJ_T *led;
++ strcpy(led_cfg->name, modules[module_id]->name);
++ led_cfg->state = state_id;
++ led_cfg->instance = instance;
++ led_cfg->param1 = state->param1;
++ led_cfg->param2 = state->param2;
++ led_cfg->mode[0] = state->mode;
++ led = state->led;
++
++ /* needs to be modified for multi-pin leds */
++ for(i = 0;i < num_gpios && !(led->pos_map[i/32] & (1 << i)); i++);
++
++ led_cfg->gpio[0] = i;
++ led_cfg->gpio_num = 1;
++
++ return 0;
++ }
++ }
++ }
++
++ return -1;
++}
+diff -urN kernel-old/drivers/char/avalanche_led/led_hal.h kernel-current/drivers/char/avalanche_led/led_hal.h
+--- kernel-old/drivers/char/avalanche_led/led_hal.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/led_hal.h 2005-07-10 18:03:46.120957200 +0200
+@@ -0,0 +1,28 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED HAL module Header
++ ******************************************************************************
++ * FILE NAME: led_hal.h
++ *
++ * DESCRIPTION: LED HAL API's.
++ *
++ * REVISION HISTORY:
++ * 11 Oct 03 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __LED_HAL__
++#define __LED_HAL__
++
++/* Interface prototypes */
++
++int avalanche_led_hal_init (int *gpio_off_value, int num_gpio_pins);
++int avalanche_led_config_set (LED_CONFIG_T * led_cfg);
++int avalanche_led_config_get (LED_CONFIG_T *led_cfg,int module_id,int instance, int state);
++void *avalanche_led_register (const char *module_name, int instance_num);
++void avalanche_led_action (void *handle, int state_id);
++int avalanche_led_unregister (void *handle);
++void avalanche_led_free_all(void);
++void avalanche_led_hal_exit (void);
++
++#endif /*__LED_HAL__ */
+diff -urN kernel-old/drivers/char/avalanche_led/led_platform.h kernel-current/drivers/char/avalanche_led/led_platform.h
+--- kernel-old/drivers/char/avalanche_led/led_platform.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/led_platform.h 2005-07-10 18:03:46.120957200 +0200
+@@ -0,0 +1,117 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED Platform specific Header file
++ ******************************************************************************
++ * FILE NAME: led_platform.h
++ *
++ * DESCRIPTION: Linux specific implementation for OS abstracted function calls
++ * made by LED HAL module. This file has functions defined for
++ * Memory allocation calls, Mutex calls, String and Timer
++ * operations.
++ *
++ * REVISION HISTORY:
++ * 11 Oct 03 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __LED_PLATFORM__
++#define __LED_PLATFORM__
++
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <asm/string.h>
++#include <linux/param.h>
++#include <linux/sched.h>
++#include <linux/timer.h>
++#include <linux/spinlock.h>
++
++
++#define os_malloc(x) kmalloc(x,GFP_KERNEL)
++#define os_memset memset
++#define os_free(x) kfree(x)
++#define os_strcmp os_strcasecmp
++#define os_strcpy strcpy
++
++#if defined(DEBUG)
++#define log_msg printk
++#else
++#define log_msg(x)
++#endif
++
++/* defines for Mutex */
++typedef struct {
++ spinlock_t lock;
++ int flags;
++}OS_SPINLOCK_T;
++
++#define MUTEX_DECLARE(x) static OS_SPINLOCK_T x
++#define MUTEX_INIT(x) x.lock = SPIN_LOCK_UNLOCKED
++#define MUTEX_GET(x) spin_lock_irqsave(&x.lock, x.flags)
++#define MUTEX_RELEASE(x) spin_unlock_irqrestore(&x.lock, x.flags)
++
++
++
++/* String handling functions not defined in asm/string.h */
++static __inline__ int os_strlen(char *str)
++{
++ int i;
++ for(i=0;str[i];i++);
++ return i;
++}
++
++
++#define LOWER(x) ((x < 'a') ? (x - 'A' + 'a'):(x))
++#define ISALPHA(x) ((( x >= 'a') && (x <= 'z')) || (( x >= 'A') && (x <= 'Z')))
++#define COMP(x,y) ((x == y) || ((ISALPHA(x) && ISALPHA(y)) && (LOWER(x) == LOWER(y))))
++
++
++static __inline__ int os_strcasecmp(char *str1, char *str2)
++{
++ int i;
++
++ for(i=0;str1[i] && str2[i];i++)
++ {
++ char x,y;
++
++ x = str1[i];
++ y = str2[i];
++
++ if(!COMP(x,y))
++ break;
++ }
++
++ return(str1[i] || str2[i]);
++}
++
++
++
++/* Functions for timer related operations */
++static __inline__ void * os_timer_init(void (*func)(int))
++{
++ struct timer_list *ptimer;
++ ptimer = (struct timer_list *) kmalloc(sizeof(struct timer_list),GFP_KERNEL);
++ init_timer( ptimer );
++ (void *)ptimer->function = (void *)func;
++ return (void *)ptimer;
++}
++
++static __inline__ int os_timer_add(void *timer_handle,int milisec,int arg)
++{
++ struct timer_list *ptimer=timer_handle;
++ ptimer->expires = ((HZ * milisec)/1000) + jiffies;
++ ptimer->data = arg;
++ add_timer(ptimer);
++ return 0;
++
++}
++
++static __inline__ int os_timer_delete(void *timer_handle)
++{
++ struct timer_list *ptimer=timer_handle;
++ del_timer(ptimer);
++ kfree(ptimer);
++ return 0;
++}
++
++
++#endif /* __LED_PLATFORM__ */
+diff -urN kernel-old/drivers/char/avalanche_led/led_wrapper.c kernel-current/drivers/char/avalanche_led/led_wrapper.c
+--- kernel-old/drivers/char/avalanche_led/led_wrapper.c 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/led_wrapper.c 2005-07-10 18:25:14.657069936 +0200
+@@ -0,0 +1,561 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED Wrapper file for DSL module support
++ ******************************************************************************
++ * FILE NAME: led_wrapper.c
++ *
++ * DESCRIPTION: LED Wrapper file for DSL module support
++ * This is to provide backward compatibility to the ADSL module
++ * using OLD LED driver. The numbers mapped for DSL LEDs in the
++ * previous implementation is 3,4,5,6. Since these numbers overlap
++ * with the existing numbering scheme, the following numbers need to
++ * be used in the led configuration file - 32,33,34,35.
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <asm/ar7/sangam.h>
++#include "led_platform.h"
++#include "led_config.h"
++
++#define BITS_PER_INT (8 * sizeof(int))
++#define GPIOS_PER_INT BITS_PER_INT
++#define GPIO_MAP_LEN ((MAX_GPIO_PIN_NUM + GPIOS_PER_INT -1)/GPIOS_PER_INT)
++#define MODULE_MAP_LEN ((MAX_MODULE_ENTRIES + BITS_PER_INT -1)/BITS_PER_INT)
++
++
++#define REQUIRES_TIMER(x) (x > 1)
++
++#define gpio_on(gpio) do \
++ { \
++ if(gpio >= 32 && adsl_led_objs[gpio - 32].onfunc) \
++ adsl_led_objs[gpio - 32].onfunc(adsl_led_objs[gpio - 32].param);\
++ } while(0)
++
++
++
++#define gpio_off(gpio) \
++ do \
++ { \
++ if(gpio >= 32 && adsl_led_objs[gpio - 32].offfunc) \
++ adsl_led_objs[gpio - 32].offfunc(adsl_led_objs[gpio - 32].param);\
++ } while(0)
++
++
++
++
++
++
++/********************TYPEDEFS***********************************************/
++
++typedef struct gpio_module
++{
++ volatile unsigned int *gpio_write_reg;
++ volatile unsigned int *gpio_dir_reg;
++ volatile unsigned int *gpio_mode_reg;
++}GPIO_REGS_T;
++
++typedef struct {
++ unsigned int gpio_id;
++ unsigned int gpio_state;
++ int module_map[MODULE_MAP_LEN];
++}GPIO_OBJ_T;
++
++
++typedef struct state_entry STATE_ENTRY_T;
++
++struct state_entry{
++ unsigned int timer_running;
++ STATE_ENTRY_T *next;
++ void (*handler)(STATE_ENTRY_T *state);
++ GPIO_OBJ_T *gpio;
++ void *os_timer;
++ unsigned int param;
++ unsigned int module_id;
++ unsigned int mode;
++};
++
++
++typedef struct module_instance{
++ int module_id;
++ int instance;
++ STATE_ENTRY_T *states[MAX_STATE_ENTRIES];
++}MODULE_INSTANCE_T;
++
++typedef struct module_entry{
++ unsigned char *name;
++ MODULE_INSTANCE_T *module_instance[MAX_MODULE_INSTANCES];
++}MODULE_ENTRY_T;
++
++
++
++typedef struct led_reg{
++ unsigned int param;
++ void (*init)(unsigned long param);
++ void (*onfunc)(unsigned long param);
++ void (*offfunc)(unsigned long param);
++}led_reg_t;
++
++
++
++/* Interface prototypes */
++static int led_hal_init(GPIO_REGS_T gpio_mod, unsigned int *gpio_off_value,int num_gpio_pins);
++static int avalanche_led_set_config(LED_CONFIG_T *led_cfg);
++static void *avalanche_led_register(const char *module_name, int instance_num);
++static int avalanche_led_action(void *handle,int state_id);
++int avalanche_led_config_get (LED_CONFIG_T *led_cfg,int module_id,int instance, int state);
++
++led_reg_t adsl_led_objs[4];
++MODULE_INSTANCE_T *dsl_mod = NULL;
++static int gpio_off_state[GPIO_MAP_LEN] = AVALANCHE_GPIO_OFF_MAP;
++
++
++
++static unsigned int num_gpios;
++static GPIO_OBJ_T *gpio_arr;
++GPIO_REGS_T gpio_regs;
++
++/* GPIO OFF STATE */
++static unsigned int gpio_off_val[GPIO_MAP_LEN];
++
++
++MODULE_ENTRY_T *modules[MAX_MODULE_ENTRIES];
++
++/* LED handlers */
++void (*led_mode_handler[NUM_LED_MODES])(STATE_ENTRY_T *state);
++
++
++/******************static functions*****************************************/
++static void *led_malloc(int n)
++{
++ void *p;
++ p=kmalloc(n,GFP_ATOMIC);
++
++ if(p)
++ os_memset(p,0,n);
++ return p;
++}
++
++static void free_state(STATE_ENTRY_T *state)
++{
++
++ STATE_ENTRY_T *prev = NULL;
++ STATE_ENTRY_T *curr = NULL ;
++ while(curr != state)
++ {
++ curr = state;
++ prev = NULL;
++
++ while(curr->next != NULL)
++ {
++ prev = curr;
++ curr = curr->next;
++ }
++
++ os_free(curr);
++ if(prev)
++ {
++ prev->next = NULL;
++ }
++
++ }
++
++}
++
++static MODULE_INSTANCE_T* get_module(char * name,int instance)
++{
++ int module_id;
++ MODULE_INSTANCE_T *mod_inst;
++
++ if(instance >= MAX_MODULE_INSTANCES)
++ return NULL;
++
++ for(module_id=0;module_id <MAX_MODULE_ENTRIES;module_id++)
++ {
++ if(modules[module_id] && !os_strcmp(name,modules[module_id]->name))
++ break;
++ }
++
++ if(module_id == MAX_MODULE_ENTRIES)
++ {
++ for(module_id = 0; (module_id < MAX_MODULE_ENTRIES) && modules[module_id] ; module_id++);
++
++ if(module_id < MAX_MODULE_ENTRIES)
++ {
++ modules[module_id]=led_malloc(sizeof(MODULE_ENTRY_T));
++ modules[module_id]->name = led_malloc(os_strlen(name));
++ os_strcpy(modules[module_id]->name,name);
++ }
++ else
++ {
++ log_msg("ERROR:Module Count exceeded\n");
++ return NULL;
++ }
++ }
++
++ if(!modules[module_id]->module_instance[instance])
++ modules[module_id]->module_instance[instance] = led_malloc(sizeof(MODULE_INSTANCE_T));
++
++ mod_inst = modules[module_id]->module_instance[instance];
++ mod_inst->module_id = module_id;
++ mod_inst->instance = instance;
++
++ return mod_inst;
++}
++
++
++static void led_timer_func(int arg)
++{
++ STATE_ENTRY_T *state = (STATE_ENTRY_T *) arg;
++ GPIO_OBJ_T *gpio;
++
++
++ gpio = state->gpio;
++
++ switch(gpio->gpio_state)
++ {
++ case LED_ONESHOT_ON:
++ gpio->gpio_state = LED_OFF;
++ gpio_off(gpio->gpio_id);
++ break;
++
++ case LED_ONESHOT_OFF:
++ gpio->gpio_state = LED_ON;
++ gpio_on(gpio->gpio_id);
++ break;
++
++ case LED_FLASH:
++ {
++
++ if(state->timer_running == 1)
++ {
++ state->timer_running = 2;
++ gpio_off(gpio->gpio_id);
++ os_timer_add(state->os_timer,(state->param >> 16),(int)state);
++ }
++ else
++ {
++ state->timer_running = 1;
++ gpio_on(gpio->gpio_id);
++ os_timer_add(state->os_timer, (state->param & 0xffff),(int)state);
++ }
++ return;
++ }
++ default:
++ break;
++
++ }
++
++ state->timer_running = 0;
++
++
++}
++
++
++static void led_on(STATE_ENTRY_T *state)
++{
++ int mod_index = state->module_id >> 5;
++ GPIO_OBJ_T *gpio = state->gpio;
++
++ gpio->gpio_state = LED_ON;
++ gpio_on(gpio->gpio_id);
++ gpio->module_map[mod_index] |= (1 << (state->module_id % BITS_PER_INT));
++
++}
++
++static void led_off(STATE_ENTRY_T *state)
++{
++
++ int mod_index = state->module_id >> 5;
++ GPIO_OBJ_T *gpio = state->gpio;
++
++ gpio->module_map[mod_index] &= ~(1 << (state->module_id % BITS_PER_INT) );
++ if(!gpio->module_map[mod_index])
++ {
++ gpio->gpio_state = LED_OFF;
++ gpio_off(gpio->gpio_id);
++ }
++
++}
++
++static void led_oneshot_on(STATE_ENTRY_T *state)
++{
++ GPIO_OBJ_T *gpio = state->gpio;
++
++ state->timer_running = 1;
++ gpio->gpio_state = LED_ONESHOT_ON;
++ gpio_on(gpio->gpio_id);
++ os_timer_add(state->os_timer,state->param,(int)state);
++}
++
++static void led_oneshot_off(STATE_ENTRY_T *state)
++{
++
++ GPIO_OBJ_T *gpio = state->gpio;
++
++ state->timer_running = 1;
++ gpio->gpio_state = LED_ONESHOT_OFF;
++ gpio_off(gpio->gpio_id);
++ os_timer_add(state->os_timer,state->param,(int)state);
++}
++
++static void led_flash(STATE_ENTRY_T *state)
++{
++
++ GPIO_OBJ_T *gpio = state->gpio;
++
++ state->timer_running = 1;
++ gpio->gpio_state = LED_FLASH;
++ gpio_on(gpio->gpio_id);
++ os_timer_add(state->os_timer,(state->param & 0xffff),(int)state);
++}
++
++
++/****************HAL APIS***********************************************/
++int led_hal_init(GPIO_REGS_T gpio_reg,unsigned int *gpio_off_value,int num_gpio_pins)
++{
++ int i;
++ unsigned int *p_gpio=gpio_off_val;
++
++ gpio_regs = gpio_reg;
++ num_gpios = num_gpio_pins;
++
++ gpio_arr = led_malloc((num_gpio_pins + 4) * sizeof(GPIO_OBJ_T)); /* 4 added for ADSL gpio pins */
++
++ /* get gpios off state */
++ for(i=0; i < num_gpio_pins; i+=GPIOS_PER_INT)
++ {
++ *p_gpio = *gpio_off_value;
++ gpio_off_value++;
++ p_gpio++;
++ }
++
++ /* initialize gpio objects */
++ for(i=0; i<num_gpio_pins + 4;i++) /* 4 added for ADSL gpio pins */
++ {
++ gpio_arr[i].gpio_id = i;
++ }
++
++
++
++ /* initialize led state function handlers */
++ led_mode_handler[LED_ON] = led_on;
++ led_mode_handler[LED_OFF] = led_off;
++ led_mode_handler[LED_ONESHOT_ON] = led_oneshot_on;
++ led_mode_handler[LED_ONESHOT_OFF] = led_oneshot_off;
++ led_mode_handler[LED_FLASH] = led_flash;
++
++
++ return 0;
++}
++
++
++ /*********************************************************/
++
++int avalanche_led_set_config(LED_CONFIG_T *led_cfg)
++{
++ MODULE_INSTANCE_T *module;
++ module = get_module(led_cfg->name,led_cfg->instance);
++
++ if(!module )
++ goto config_failed;
++
++ if(led_cfg->state < MAX_STATE_ENTRIES)
++ {
++ STATE_ENTRY_T *state_entry;
++ int state=led_cfg->state;
++ int i;
++
++ if(!(module->states[state]))
++ {
++ module->states[state] = led_malloc(sizeof(STATE_ENTRY_T));
++ }
++
++ state_entry = module->states[state];
++
++ for(i=0;i<led_cfg->gpio_num;i++)
++ {
++ if(led_cfg->gpio[i] >= (num_gpios + 4) ) /* 4 added for ADSL */
++ {
++ log_msg("Error: gpio number out of range\n");
++ goto config_failed;
++ }
++
++ state_entry->gpio = &gpio_arr[led_cfg->gpio[i]];
++ state_entry->mode = led_cfg->mode[i];
++ state_entry->module_id = module->module_id;
++ state_entry->handler = led_mode_handler[state_entry->mode];
++ state_entry->timer_running = 0;
++
++ if(REQUIRES_TIMER(led_cfg->mode[i])) /* requires timer */
++ {
++
++ state_entry->param = led_cfg->param1;
++
++ if(led_cfg->mode[i] == LED_FLASH)
++ state_entry->param |= (led_cfg->param2 << 16);
++
++ if(!(state_entry->os_timer))
++ state_entry->os_timer = os_timer_init(led_timer_func);
++ }
++
++ if(i == led_cfg->gpio_num - 1)
++ {
++ free_state(state_entry->next);
++ state_entry->next = NULL;
++ break;
++ }
++
++
++ /* allocate next node */
++ else if( !(state_entry->next))
++ {
++ state_entry->next = led_malloc(sizeof(STATE_ENTRY_T));
++ }
++
++ state_entry = state_entry->next;
++
++
++ }
++
++ }
++ else
++ {
++ log_msg("ERROR:State Count exceeded\n");
++ goto config_failed;
++ }
++
++ return 0;
++
++ config_failed:
++
++ return -1;
++
++
++
++}
++
++ /*********************************************************/
++
++void *avalanche_led_register(const char * mod_name,int instance)
++{
++ void *p;
++ p = get_module((void * )mod_name,instance);
++ return p;
++ }
++
++
++int avalanche_led_action(void *module, int state_id)
++{
++
++ if(module && state_id < MAX_STATE_ENTRIES)
++ {
++
++ STATE_ENTRY_T *state =((MODULE_INSTANCE_T *)(module))->states[state_id];
++ while(state)
++ {
++ if(state->timer_running == 0)
++ {
++ state->handler(state);
++ }
++ state = state->next;
++
++ }
++ }
++ return 0;
++}
++
++
++
++int led_get_dsl_config(void)
++{
++
++ int state_id = 0;
++ LED_CONFIG_T led_cfg;
++ int state_count = 0;
++
++ os_strcpy(led_cfg.name,"adsl");
++
++ for(state_id = 0; state_id < MAX_STATE_ENTRIES;state_id++)
++ {
++ if(avalanche_led_config_get(&led_cfg,-1,0,state_id) == 0)
++ {
++ /* call configure */
++ avalanche_led_set_config(&led_cfg);
++ state_count++;
++ }
++
++ }
++ return state_count;
++
++
++}
++
++
++void register_led_drv(int led_num,led_reg_t *led)
++{
++
++ /* DSL leds are numbered from 3 to 6 */
++ int led_index = led_num - 3;
++
++ if(led_index >=0 && led_index <= 2)
++ {
++ adsl_led_objs[led_index] = *led;
++
++ if(adsl_led_objs[led_index].init)
++ adsl_led_objs[led_index].init(adsl_led_objs[led_index].param);
++ }
++
++}
++
++void deregister_led_drv( int led_num)
++{
++ /* DSL leds are numbered from 3 to 6 */
++ int led_index = led_num - 3;
++
++ if(led_index >=0 && led_index <= 2)
++ {
++ adsl_led_objs[led_index].onfunc = NULL;
++ adsl_led_objs[led_index].offfunc = NULL;
++ }
++ return;
++}
++
++void led_operation(int mod,int state_id)
++{
++ static int configured = 0;
++
++ if(configured == 0)
++ {
++ configured = led_get_dsl_config();
++ }
++
++ avalanche_led_action(dsl_mod,state_id);
++}
++
++static int __init led_init(void)
++{
++ GPIO_REGS_T gpio_regs;
++
++ gpio_regs.gpio_write_reg = NULL;
++ gpio_regs.gpio_dir_reg = NULL;
++ gpio_regs.gpio_mode_reg = NULL;
++
++ led_hal_init(gpio_regs,gpio_off_state,AVALANCHE_GPIO_PIN_COUNT);
++
++ /* register instance 0 of adsl module */
++ dsl_mod = avalanche_led_register("adsl",0);
++ return 0;
++
++}
++
++__initcall(led_init);
++
++
++
++EXPORT_SYMBOL_NOVERS(led_init);
++EXPORT_SYMBOL_NOVERS(led_operation);
++EXPORT_SYMBOL_NOVERS(register_led_drv);
++EXPORT_SYMBOL_NOVERS(deregister_led_drv);
++
+diff -urN kernel-old/drivers/char/avalanche_led/Makefile kernel-current/drivers/char/avalanche_led/Makefile
+--- kernel-old/drivers/char/avalanche_led/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/drivers/char/avalanche_led/Makefile 2005-07-10 18:25:32.692328160 +0200
+@@ -0,0 +1,23 @@
++# File: drivers/char/avalanche_led/Makefile
++#
++# Makefile for the Linux LED device driver.
++#
++
++
++O_TARGET := avalanche_led.o
++obj-m := avalanche_led.o
++list-multi := avalanche_led.o
++
++EXTRA_CFLAGS := -I$(TOPDIR)/include/asm/ar7
++
++export-objs := led_drv.o led_wrapper.o
++
++avalanche_led-objs := led_hal.o led_drv.o led_wrapper.o
++
++include $(TOPDIR)/Rules.make
++
++avalanche_led.o: $(avalanche_led-objs)
++ $(LD) -r -o $@ $(avalanche_led-objs)
++
++clean:
++ rm -f core *.o *.a *.s
+diff -urN kernel-old/drivers/char/Config.in kernel-current/drivers/char/Config.in
+--- kernel-old/drivers/char/Config.in 2005-07-10 02:55:18.318811000 +0200
++++ kernel-current/drivers/char/Config.in 2005-07-10 18:03:46.121957048 +0200
+@@ -133,6 +133,10 @@
+ fi
+ fi
+ fi
++if [ "$CONFIG_AR7" = "y" ]; then
++ bool 'Enable LED support' CONFIG_MIPS_AVALANCHE_LED
++fi
++
+ if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_ZORRO" = "y" ]; then
+ tristate 'Commodore A2232 serial support (EXPERIMENTAL)' CONFIG_A2232
+ fi
+diff -urN kernel-old/drivers/char/Makefile kernel-current/drivers/char/Makefile
+--- kernel-old/drivers/char/Makefile 2005-07-10 02:55:18.319811000 +0200
++++ kernel-current/drivers/char/Makefile 2005-07-10 18:03:46.122956896 +0200
+@@ -190,6 +190,19 @@
+ obj-$(CONFIG_PCI) += keyboard.o $(KEYMAP)
+ endif
+
++#
++# Texas Intruments LED driver
++#
++ifeq ($(CONFIG_MIPS_AVALANCHE_LED),y)
++obj-$(CONFIG_MIPS_AVALANCHE_LED) += avalanche_led/avalanche_led.o
++subdir-$(CONFIG_MIPS_AVALANCHE_LED) += avalanche_led
++endif
++
++ifeq ($(CONFIG_MIPS_AVALANCHE_LED),m)
++obj-$(CONFIG_MIPS_AVALANCHE_LED) += avalanche_led/avalanche_led.o
++subdir-$(CONFIG_MIPS_AVALANCHE_LED) += avalanche_led
++endif
++
+ obj-$(CONFIG_HIL) += hp_keyb.o
+ obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o
+ obj-$(CONFIG_ATARI_DSP56K) += dsp56k.o
+diff -urN kernel-old/include/asm-mips/ar7/ledapp.h kernel-current/include/asm-mips/ar7/ledapp.h
+--- kernel-old/include/asm-mips/ar7/ledapp.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/include/asm-mips/ar7/ledapp.h 2005-07-10 18:49:37.556426688 +0200
+@@ -0,0 +1,59 @@
++#ifndef __LED_APP__
++#define __LED_APP__
++
++#define CONF_FILE "/etc/led.conf"
++#define LED_PROC_FILE "/proc/led_mod/led"
++
++#define CONFIG_LED_MODULE
++
++#define MAX_MOD_ID 25
++#define MAX_STATE_ID 25
++#define MAX_LED_ID 25
++
++#define MOD_ADSL 1
++#define DEF_ADSL_IDLE 1
++#define DEF_ADSL_TRAINING 2
++#define DEF_ADSL_SYNC 3
++#define DEF_ADSL_ACTIVITY 4
++
++#define MOD_WAN 2
++#define DEF_WAN_IDLE 1
++#define DEF_WAN_NEGOTIATE 2
++#define DEF_WAN_SESSION 3
++
++#define MOD_LAN 3
++#define DEF_LAN_IDLE 1
++#define DEF_LAN_LINK_UP 2
++#define DEF_LAN_ACTIVITY 3
++
++#define MOD_WLAN 4
++#define DEF_WLAN_IDLE 1
++#define DEF_WLAN_LINK_UP 2
++#define DEF_WLAN_ACTIVITY 3
++
++#define MOD_USB 5
++#define DEF_USB_IDLE 1
++#define DEF_USB_LINK_UP 2
++#define DEF_USB_ACTIVITY 3
++
++#define MOD_ETH 6
++#define DEF_ETH_IDLE 1
++#define DEF_ETH_LINK_UP 2
++#define DEF_ETH_ACTIVITY 3
++
++typedef struct config_elem{
++ unsigned char name;
++ unsigned char state;
++ unsigned char mode;
++ unsigned char led;
++ int param;
++}config_elem_t;
++
++typedef struct led_reg{
++ unsigned int param;
++ void (*init)(unsigned long param);
++ void (*onfunc)(unsigned long param);
++ void (*offfunc)(unsigned long param);
++}led_reg_t;
++
++#endif
+diff -urN kernel-old/include/asm-mips/ar7/led_config.h kernel-current/include/asm-mips/ar7/led_config.h
+--- kernel-old/include/asm-mips/ar7/led_config.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/include/asm-mips/ar7/led_config.h 2005-07-10 18:03:46.122956896 +0200
+@@ -0,0 +1,51 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED config Header
++ ******************************************************************************
++ * FILE NAME: led_config.h
++ *
++ * DESCRIPTION: Header file for LED configuration parameters
++ * and data structures
++ *
++ * REVISION HISTORY:
++ * 11 Oct 03 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++
++#ifndef __LED_CONFIG__
++#define __LED_CONFIG__
++
++/* LED config parameters */
++#define MAX_GPIO_PIN_NUM 64
++#define MAX_GPIOS_PER_STATE 2
++#define MAX_MODULE_ENTRIES 25
++#define MAX_MODULE_INSTANCES 2
++#define MAX_STATE_ENTRIES 25
++#define NUM_LED_MODES 5
++#define MAX_LED_ENTRIES 25
++
++
++/* LED modes */
++#define LED_OFF 0
++#define LED_ON 1
++#define LED_ONESHOT_OFF 2
++#define LED_ONESHOT_ON 3
++#define LED_FLASH 4
++
++
++
++/* Data structure for LED configuration */
++typedef struct led_config{
++ unsigned char name[80];
++ unsigned int instance;
++ unsigned int state;
++ unsigned int gpio[MAX_GPIOS_PER_STATE];
++ unsigned int mode[MAX_GPIOS_PER_STATE];
++ unsigned int gpio_num;
++ unsigned int param1;
++ unsigned int param2;
++}LED_CONFIG_T;
++
++
++#endif /* __LED_CONFIG__ */
+diff -urN kernel-old/include/asm-mips/ar7/led_ioctl.h kernel-current/include/asm-mips/ar7/led_ioctl.h
+--- kernel-old/include/asm-mips/ar7/led_ioctl.h 1970-01-01 01:00:00.000000000 +0100
++++ kernel-current/include/asm-mips/ar7/led_ioctl.h 2005-07-10 18:03:46.122956896 +0200
+@@ -0,0 +1,32 @@
++/******************************************************************************
++ * FILE PURPOSE: - LED ioctl Header
++ ******************************************************************************
++ * FILE NAME: led_ioctl.h
++ *
++ * DESCRIPTION: Header file defining macros for ioctl commands.
++ *
++ * REVISION HISTORY:
++ * 11 Oct 03 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++#ifndef __LED_IOCTL__
++#define __LED_IOCTL__
++
++typedef struct led_mod{
++unsigned char *name;
++unsigned int instance;
++unsigned int handle;
++}LED_MODULE_T;
++
++typedef struct led_state{
++unsigned int handle;
++unsigned int state_id;
++}LED_STATE_T;
++
++#define LED_CONFIG 0
++#define LED_GET_HANDLE 1
++#define LED_ACTION 2
++#define LED_RELEASE_HANDLE 3
++
++#endif /* __LED_IOCTL__ */
+++ /dev/null
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.c
---- linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.c 2005-07-10 04:06:50.491302256 +0200
-@@ -0,0 +1,728 @@
-+#ifndef _INC_CPCOMMON_C
-+#define _INC_CPCOMMON_C
-+
-+#ifdef _CPHAL_CPMAC
-+#include "cpremap_cpmac.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "cpremap_cpaal5.c"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "cpremap_cpsar.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "cpremap_cpaal2.c"
-+#endif
-+
-+/**
-+@defgroup Common_Config_Params Common Configuration Parameters
-+
-+This section documents the configuration parameters that are valid across
-+all CPHAL devices.
-+@{
-+*/
-+/** This is the debug level. The field is bit defined, such that the user
-+should set to 1 all the bits corresponding to desired debug outputs. The following
-+are the meanings for each debug bit:
-+- bit0 (LSB): CPHAL Function Trace
-+- b1 : OS Function call trace
-+- b2 : Critical section entry/exit
-+- b3 : Memory allocation/destruction
-+- b4 : Detailed information in Rx path
-+- b5 : Detailed information in Tx path
-+- b6 : Extended error information
-+- b7 : General info
-+*/
-+static const char pszDebug[] = "debug";
-+/** CPU Frequency. */
-+/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
-+/** Base address for the module. */
-+static const char pszBase[] = "base";
-+/** Reset bit for the module. */
-+static const char pszResetBit[] = "reset_bit";
-+/** Reset base address for the module. */
-+static const char pszResetBase[] = "ResetBase";
-+/** Interrupt line for the module. */
-+static const char pszIntLine[] = "int_line";
-+/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
-+static const char pszOffset[] = "offset";
-+/** The OS may "Get" this parameter, which is a pointer
-+ to a character string that indicates the version of CPHAL. */
-+static const char pszVer[] = "Version";
-+/*@}*/
-+
-+/**
-+@defgroup Common_Control_Params Common Keys for [os]Control()
-+
-+This section documents the keys used with the OS @c Control() interface that
-+are required by CPHAL devices.
-+
-+@{
-+*/
-+/** Used to wait for an integer number of clock ticks, given as an integer
-+ pointer in the @p Value parameter. No actions are defined. */
-+static const char pszSleep[] = "Sleep";
-+/** Requests the OS to flush it's IO buffers. No actions are defined. */
-+static const char pszSioFlush[] = "SioFlush";
-+/*@}*/
-+
-+static const char pszStateChange[] = "StateChange";
-+static const char pszStatus[] = "Status";
-+
-+static const char pszGET[] = "Get";
-+static const char pszSET[] = "Set";
-+static const char pszCLEAR[] = "Clear";
-+static const char pszNULL[] = "";
-+static const char pszLocator[] = "Locator";
-+static const char pszOff[] = "Off";
-+static const char pszOn[] = "On";
-+static const char hcMaxFrags[] = "MaxFrags";
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/* New method for string constants */
-+const char hcClear[] = "Clear";
-+const char hcGet[] = "Get";
-+const char hcSet[] = "Set";
-+
-+const char hcTick[] = "Tick";
-+
-+static const CONTROL_KEY KeyCommon[] =
-+ {
-+ {"" , enCommonStart},
-+ {pszStatus , enStatus},
-+ {pszOff , enOff},
-+ {pszOn , enOn},
-+ {pszDebug , enDebug},
-+ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
-+ {"" , enCommonEnd}
-+ };
-+#endif
-+
-+/**
-+@defgroup Common_Statistics Statistics
-+
-+A broad array of module statistics is available. Statistics values are accessed
-+through the @c Control() interface of the CPHAL. There are 5 different levels
-+of statistics, each of which correspond to a unique set of data. Furthermore,
-+certain statistics data is indexed by using a channel number and Tx queue number.
-+The following is a brief description of each statistics level, along with the
-+indexes used for the level:
-+
-+- Level 0: Hardware Statistics (index with channel)
-+- Level 1: CPHAL Software Statistics (channel, queue)
-+- Level 2: CPHAL Flags (channel, queue)
-+- Level 3: CPHAL Channel Configuration (channel)
-+- Level 4: CPHAL General Configuration (no index)
-+
-+The caller requests statistics information by providing a Key string to the
-+@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
-+The only valid Action parameter for statistics usage is "Get".
-+
-+Code Examples:
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# Get Level 2 stats for Channel 0, Queue 0
-+HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
-+
-+# Get Level 4 stats
-+HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
-+@endcode
-+
-+The information returned in the Value parameter of @c Control() is an
-+array of pointers to strings. The pointers are arranged in pairs.
-+The first pointer is a pointer to a name string for a particular statistic.
-+The next pointer is a pointer to a string containing the representation of
-+the integer statistic value corresponding to the first pointer. This is followed
-+by another pair of pointers, and so on, until a NULL pointer is encountered. The
-+following is example code for processing the statistics data. Note that the OS
-+is responsible for freeing the memory passed back through the Value parameter of
-+@c Control().
-+
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# output Statistics data
-+PrintStats(StatsData);
-+
-+# the upper layer is responsible for freeing stats info
-+free(&StatsPtr);
-+
-+...
-+
-+void PrintStats(unsigned int *StatsPtr)
-+ {
-+ while(*StatsPtr)
-+ {
-+ printf("%20s:", (char *)*StatsPtr);
-+ StatsPtr++;
-+ printf("%11s\n", (char *)*StatsPtr);
-+ StatsPtr++;
-+ }
-+ MySioFlush();
-+ }
-+@endcode
-+
-+Within each statistics level, there are several statistics defined. The statistics that
-+are common to every CPPI module are listed below. In addition, each module may define
-+extra statistics in each level, which will be documented within the module-specific
-+documentation appendices.
-+
-+- Level 0 Statistics
-+ - All level 0 statistics are module-specific.
-+- Level 1 Statistics (CPHAL Software Statistics)
-+ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
-+ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
-+transmitting the previous last packet in the queue (per channel and queue).
-+ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
-+reception of the previous last packet in the queue (per channel).
-+ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
-+ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
-+ - RxPacketsServiced: Number of received packets (per channel).
-+ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
-+ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
-+ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
-+ - RxTotal: Total number of received packets, all channels.
-+ - TxTotal: Total number of transmitted packets, all channels and queues.
-+- Level 2 Statistics (CPHAL Flags)
-+ - RcbPool: Pointer to receive descriptor pool (per channel).
-+ - RxActQueueCount: Number of buffers currently available for receive (per channel).
-+ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
-+ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
-+ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
-+ - RcbStart: Pointer to block of receive descriptors.
-+ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
-+ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
-+ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
-+ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
-+ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
-+ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
-+ - TcbStart: Pointer to block of transmit descriptors.
-+ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
-+- Level 3 Statistics (CPHAL Channel Configuration)
-+ - RxBufSize: Rx buffer size.
-+ - RxBufferOffset: Rx buffer offset.
-+ - RxNumBuffers: Number of Rx buffers.
-+ - RxServiceMax: Maximum number of receive packets to service at a time.
-+ - TxNumBuffers: Number of Tx buffer descriptors.
-+ - TxNumQueues: Number of Tx queues to use.
-+ - TxServiceMax: Maximum number of transmit packets to service at a time.
-+- Level 4 Statistics (CPHAL General Configuration)
-+ - Base Address: Base address of the module.
-+ - Offset (VLYNQ): VLYNQ relative module offset.
-+ - Interrupt Line: Interrupt number.
-+ - Debug: Debug flag, 1 to enable debug.
-+ - Inst: Instance number.
-+*/
-+
-+/*
-+ Data Type 0 = int display
-+ Data Type 1 = hex display
-+ Data Type 2 = channel structure, int display
-+ Data Type 3 = queue index and int display
-+ Data Type 4 = queue index and hex display
-+*/
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
-+static STATS_TABLE StatsTable0[] =
-+ {
-+#ifdef _CPHAL_AAL5
-+ /* Name , Data Ptr, Data Type */
-+ {"Crc Errors", 0, 0},
-+ {"Len Errors", 0, 0},
-+ {"Abort Errors", 0, 0},
-+ {"Starv Errors", 0, 0}
-+#endif
-+#ifdef _CPHAL_CPMAC
-+ {"Rx Good Frames", 0, 0}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable1[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"DmaLenErrors", 0, 0},
-+ {"TxMisQCnt", 0, 3},
-+ {"RxMisQCnt", 0, 0},
-+ {"TxEOQCnt", 0, 3},
-+ {"RxEOQCnt", 0, 0},
-+ {"RxPacketsServiced", 0, 0},
-+ {"TxPacketsServiced", 0, 3},
-+ {"RxMaxServiced", 0, 0},
-+ {"TxMaxServiced", 0, 3},
-+ {"RxTotal", 0, 0},
-+ {"TxTotal", 0, 0},
-+ };
-+
-+static STATS_TABLE StatsTable2[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RcbPool", 0, 1},
-+ {"RxActQueueCount", 0, 0},
-+ {"RxActQueueHead", 0, 1},
-+ {"RxActQueueTail", 0, 1},
-+ {"RxActive", 0, 0},
-+ {"RcbStart", 0, 1},
-+ {"RxTeardownPending", 0, 0},
-+ {"TcbPool", 0, 4},
-+ {"TxActQueueCount", 0, 3},
-+ {"TxActQueueHead", 0, 4},
-+ {"TxActQueueTail", 0, 4},
-+ {"TxActive", 0, 3},
-+ {"TcbStart", 0, 4},
-+ {"TxTeardownPending", 0, 0}
-+ };
-+
-+static STATS_TABLE StatsTable3[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RxBufSize", 0, 2},
-+ {"RxBufferOffset", 0, 2},
-+ {"RxNumBuffers", 0, 2},
-+ {"RxServiceMax", 0, 2},
-+ {"TxNumBuffers", 0, 2},
-+ {"TxNumQueues", 0, 2},
-+ {"TxServiceMax", 0, 2},
-+#ifdef _CPHAL_AAL5
-+ {"CpcsUU", 0, 2},
-+ {"Gfc", 0, 2},
-+ {"Clp", 0, 2},
-+ {"Pti", 0, 2},
-+ {"DaMask", 0, 2},
-+ {"Priority", 0, 2},
-+ {"PktType", 0, 2},
-+ {"Vci", 0, 2},
-+ {"Vpi", 0, 2},
-+ {"CellRate", 0, 2},
-+ {"QosType", 0, 2},
-+ {"Mbs", 0, 2},
-+ {"Pcr", 0, 2}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable4[] =
-+ {
-+ {"Base Address", 0, 1},
-+ {"Offset (VLYNQ)", 0, 0},
-+ {"Interrupt Line", 0, 0},
-+ {"Debug", 0, 0},
-+ {"Instance", 0, 0},
-+#ifdef _CPHAL_AAL5
-+ {"UniNni", 0, 0}
-+#endif
-+ };
-+
-+static STATS_DB StatsDb[] =
-+ {
-+ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
-+ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
-+ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
-+ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
-+ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
-+ };
-+#endif /* +GSG 030307 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void resetWait(HAL_DEVICE *HalDev)
-+ { /*+RC3.02*/
-+ const int TickReset=64;
-+ osfuncSleep((int*)&TickReset);
-+ } /*+RC3.02*/
-+#endif /* +RC 3.02 */
-+
-+/* I only define the reset base function for the modules
-+ that can perform a reset. The AAL5 and AAL2 modules
-+ do not perform a reset, that is done by the shared module
-+ CPSAR */
-+#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
-+/*
-+ * Determines the reset register address to be used for a particular device.
-+ * It will search the current device entry for Locator information. If the
-+ * device is a root device, there will be no Locator information, and the
-+ * function will find and return the root reset register. If a Locator value
-+ * is found, the function will search each VLYNQ device entry in the system
-+ * looking for a matching Locator. Once it finds a VLYNQ device entry with
-+ * a matching Locator, it will extract the "ResetBase" parameter from that
-+ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param ResetBase Pointer to integer address of reset register.
-+ *
-+ * @return 0 OK, Non-zero not OK
-+ */
-+static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
-+ {
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+ char *MyLocator, *NextLocator;
-+ int Inst=1;
-+ bit32u error_code;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
-+ if (error_code)
-+ {
-+ /* if no Locator value, device is on the root, so get the "reset" device */
-+ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
-+ if (error_code)
-+ {
-+ return(EC_VAL_DEVICE_NOT_FOUND);
-+ }
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ /* we have a Locator value, so the device is remote */
-+
-+ /* Find a vlynq device with a matching locator value */
-+ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
-+ if (error_code)
-+ {
-+ /* no Locator value for this VLYNQ, so move on */
-+ continue;
-+ }
-+ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
-+ {
-+ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ Inst++;
-+ } /* while */
-+ } /* else */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif
-+
-+#ifndef _CPHAL_AAL2 /* + RC 3.02 */
-+static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
-+ {
-+ bit32u ParmValue;
-+ bit32 error_code;
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
-+
-+#ifndef _CPHAL_AAL5
-+#ifndef _CPHAL_AAL2
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
-+ if(error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
-+ }
-+ HalDev->ResetBit = ParmValue;
-+
-+ /* Get reset base address */
-+ error_code = ResetBaseGet(HalDev, &ParmValue);
-+ if (error_code)
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
-+ HalDev->ResetBase = ParmValue;
-+#endif
-+#endif
-+
-+#ifndef _CPHAL_CPSAR
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
-+ }
-+ HalDev->interrupt = ParmValue;
-+#endif
-+
-+ /* only look for the offset if there is a Locator field, which indicates that
-+ the module is a VLYNQ module */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
-+ if (!error_code)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
-+ }
-+ HalDev->offset = ParmValue;
-+ }
-+ else
-+ HalDev->offset = 0;
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
-+ if (!error_code) HalDev->debug = ParmValue;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
-+ {
-+ /* even though these statistics may be for multiple channels and
-+ queues, i need only configure the pointer to the beginning
-+ of the array, and I can index from there if necessary */
-+
-+#ifdef _CPHAL_AAL5
-+ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
-+ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
-+ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
-+ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
-+
-+ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
-+ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
-+ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
-+ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
-+ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
-+ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
-+ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
-+ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
-+ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
-+ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
-+ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
-+#endif
-+
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
-+ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
-+ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
-+ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
-+ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
-+ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
-+ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
-+ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
-+ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
-+ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
-+ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
-+ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
-+ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
-+ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
-+ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
-+
-+ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
-+ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
-+ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
-+ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
-+ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
-+ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
-+ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
-+#ifdef _CPHAL_AAL5
-+ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
-+ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
-+ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
-+ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
-+ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
-+ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
-+ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
-+ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
-+ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
-+ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
-+ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
-+ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
-+ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
-+#endif
-+#endif
-+
-+ StatsTable4[0].StatPtr = &HalDev->dev_base;
-+ StatsTable4[1].StatPtr = &HalDev->offset;
-+ StatsTable4[2].StatPtr = &HalDev->interrupt;
-+ StatsTable4[3].StatPtr = &HalDev->debug;
-+ StatsTable4[4].StatPtr = &HalDev->Inst;
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifndef _CPHAL_CPSAR /* +RC 3.02 */
-+#ifndef _CPHAL_AAL2 /* +RC 3.02 */
-+/*
-+ * Returns statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0
-+ */
-+static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
-+ {
-+ int Size;
-+ bit32u *AddrPtr;
-+ char *DataPtr;
-+ STATS_TABLE *StatsTable;
-+ int i, NumberOfStats;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
-+ (bit32u)HalDev, (bit32u)StatPtr);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ StatsTable = StatsDb[Index].StatTable;
-+ NumberOfStats = StatsDb[Index].NumberOfStats;
-+
-+ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
-+ Size += (NumberOfStats*11);
-+ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
-+
-+ AddrPtr = (bit32u *) *StatPtr;
-+ DataPtr = (char *)AddrPtr;
-+ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
-+
-+ for (i=0; i<NumberOfStats; i++)
-+ {
-+ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
-+ *AddrPtr++ = (bit32u)DataPtr;
-+ if (&StatsTable[i].StatPtr[Ch] != 0)
-+ {
-+ switch(StatsTable[i].DataType)
-+ {
-+ case 0:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 1:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 2:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
-+ break;
-+ case 3:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ case 4:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ default:
-+ /* invalid data type, due to CPHAL programming error */
-+ break;
-+ }
-+ }
-+ else
-+ {
-+ /* invalid statistics pointer, probably was not initialized */
-+ }
-+ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
-+ }
-+
-+ *AddrPtr = (bit32u) 0;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC
-+static void gpioFunctional(int base, int bit)
-+ { /*+RC3.02*/
-+ bit32u GpioEnr = base + 0xC;
-+ /* To make functional, set to zero */
-+ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
-+ } /*+RC3.02*/
-+
-+
-+/*+RC3.02*/
-+/* Common function, Checks to see if GPIO should be in functional mode */
-+static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
-+ { /*+RC3.02*/
-+ int rc;
-+ void *DeviceInfo;
-+ char *pszMuxBits;
-+ char pszMuxBit[20];
-+ char *pszTmp;
-+ char szMuxBit[20];
-+ char *ptr;
-+ int base;
-+ int reset_bit;
-+ int bit;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
-+ if(rc) return;
-+ /* gpio entry found, get GPIO register info and make functional */
-+
-+ /* temp copy until FinParmValue fixed */
-+ ptr = &szMuxBit[0];
-+ while ((*ptr++ = *pszTmp++));
-+
-+ pszMuxBits = &szMuxBit[0];
-+
-+ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
-+ if(rc) return;
-+
-+ /* If GPIO still in reset, then exit */
-+ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
-+ return;
-+ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
-+ while (*pszMuxBits)
-+ {
-+ pszTmp = &pszMuxBit[0];
-+ if(*pszMuxBits == ';') pszMuxBits++;
-+ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
-+ {
-+ osfuncSioFlush();
-+ /*If value not a number, skip */
-+ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
-+ pszMuxBits++;
-+ else
-+ *pszTmp++ = *pszMuxBits++;
-+ }
-+ *pszTmp = '\0';
-+ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
-+ gpioFunctional(base, bit);
-+ resetWait(HalDev); /* not sure if this is needed */
-+ }
-+ } /*+RC3.02*/
-+#endif /* CPMAC */
-+
-+#ifdef _CPHAL_AAL5
-+const char hcSarFrequency[] = "SarFreq";
-+#endif
-+
-+#endif /* _INC */
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.h
---- linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.h 2005-07-10 03:22:40.508160000 +0200
-@@ -0,0 +1,79 @@
-+#ifndef _INC_CPCOMMON_H
-+#define _INC_CPCOMMON_H
-+
-+#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
-+#ifndef dbgPrintf
-+#define dbgPrintf HalDev->OsFunc->Printf
-+#endif
-+
-+#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
-+
-+#define DBG(level) (HalDev->debug & (1<<(level)))
-+/*
-+#define DBG0() DBG(0)
-+#define DBG1() DBG(1)
-+#define DBG2() DBG(2)
-+#define DBG3() DBG(3)
-+#define DBG4() DBG(4)
-+#define DBG5() DBG(5)
-+#define DBG6() DBG(6)
-+#define DBG7() DBG(7)
-+*/
-+
-+/*
-+ * List of defined actions for use with Control().
-+ */
-+typedef enum
-+ {
-+ enGET=0, /**< Get the value associated with a key */
-+ enSET, /**< Set the value associates with a key */
-+ enCLEAR, /**<Clear the value */
-+ enNULL /**< No data action, used to initiate a service or send a message */
-+ }ACTION;
-+
-+/*
-+ * Enumerated hardware states.
-+ */
-+typedef enum
-+ {
-+ enConnected=1, enDevFound, enInitialized, enOpened
-+ }DEVICE_STATE;
-+
-+typedef enum
-+ {
-+ enCommonStart=0,
-+ /* General */
-+ enOff, enOn, enDebug,
-+ /* Module General */
-+ enCpuFreq,
-+ enStatus,
-+ enCommonEnd
-+ }COMMON_KEY;
-+
-+typedef struct
-+ {
-+ const char *strKey;
-+ int enKey;
-+ }CONTROL_KEY;
-+
-+typedef struct
-+ {
-+ char *StatName;
-+ unsigned int *StatPtr;
-+ int DataType; /* 0: int, 1: hex int, 2:channel data */
-+ }STATS_TABLE;
-+
-+typedef struct
-+ {
-+ int NumberOfStats;
-+ STATS_TABLE *StatTable;
-+ }STATS_DB;
-+
-+#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
-+#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
-+#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
-+
-+#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
-+
-+#endif
-+
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpmac.c
---- linux.old/drivers/net/avalanche_cpmac/cpmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmac.c 2005-07-10 07:39:15.514764184 +0200
-@@ -0,0 +1,2509 @@
-+/******************************************************************************
-+ * FILE PURPOSE: CPMAC Linux Network Device Driver Source
-+ ******************************************************************************
-+ * FILE NAME: cpmac.c
-+ *
-+ * DESCRIPTION: CPMAC Network Device Driver Source
-+ *
-+ * REVISION HISTORY:
-+ *
-+ * Date Description Author
-+ *-----------------------------------------------------------------------------
-+ * 27 Nov 2002 Initial Creation Suraj S Iyer
-+ * 09 Jun 2003 Updates for GA Suraj S Iyer
-+ * 30 Sep 2003 Updates for LED, Reset stats Suraj S Iyer
-+ *
-+ * (C) Copyright 2003, Texas Instruments, Inc
-+ *******************************************************************************/
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/proc_fs.h>
-+#include <linux/ioport.h>
-+#include <asm/io.h>
-+
-+#include <linux/skbuff.h>
-+
-+#include <asm/mips-boards/prom.h>
-+#include <linux/string.h>
-+#include <asm/uaccess.h>
-+#include <linux/config.h>
-+#include <asm/ar7/if_port.h>
-+
-+extern void build_psp_config(void);
-+extern void psp_config_cleanup(void);
-+
-+#include "cpmacHalLx.h"
-+#include "cpmac.h"
-+
-+static struct net_device *last_cpmac_device = NULL;
-+static int cpmac_devices_installed = 0;
-+
-+void xdump( u_char* cp, int length, char* prefix );
-+
-+unsigned int cpmac_cpu_freq = 0;
-+
-+char cpmac_version[] = "1.5";
-+
-+char l3_align_array[] = {0x02, 0x01, 0x00, 0x03};
-+#define L3_ALIGN(i) l3_align_array[i]
-+
-+char add_for_4byte_align[] = {0x04, 0x03, 0x02, 0x05};
-+#define ADD_FOR_4BYTE_ALIGN(i) add_for_4byte_align[i]
-+
-+
-+#define TPID 0x8100
-+#define IS_802_1Q_FRAME(byte_ptr) (*(unsigned short*)byte_ptr == TPID)
-+#define TPID_START_OFFSET 12
-+#define TCI_START_OFFSET 14
-+#define TCI_LENGTH 2
-+#define TPID_LENGTH 2
-+#define TPID_END_OFFSET (TPID_START_OFFSET + TPID_LENGTH)
-+#define TCI_END_OFFSET (TCI_START_OFFSET + TCI_LENGTH)
-+#define IS_VALID_VLAN_ID(byte_ptr) ((*(unsigned short*)byte_ptr) && 0xfff != 0)
-+#define MAX_CLASSES 8
-+#define MAX_USER_PRIORITY 8
-+#define CONTROL_802_1Q_SIZE (TCI_LENGTH + TPID_LENGTH)
-+
-+unsigned char user_priority_to_traffic_class_map[MAX_CLASSES][MAX_USER_PRIORITY] =
-+{
-+ {0, 0, 0, 1, 1, 1, 1, 2},
-+ {0, 0, 0, 0, 0, 0, 0, 0},
-+ {0, 0, 0, 0, 0, 0, 0, 1},
-+ {0, 0, 0, 1, 1, 2, 2, 3},
-+ {0, 1, 1, 2, 2, 3, 3, 4},
-+ {0, 1, 1, 2, 3, 4, 4, 5},
-+ {0, 1, 2, 3, 4, 5, 5, 6},
-+ {0, 1, 2, 3, 4, 5, 6, 7}
-+};
-+
-+#define GET_802_1P_CHAN(x,y) user_priority_to_traffic_class_map[x][(y & 0xe0)]
-+
-+#if defined(CONFIG_MIPS_SEAD2)
-+unsigned long temp_base_address[2] = {0xa8610000, 0xa8612800};
-+unsigned long temp_reset_value[2] = { 1<< 17,1<<21};
-+#define RESET_REG_PRCR (*(volatile unsigned int *)((0xa8611600 + 0x0)))
-+#define VERSION(base) (*(volatile unsigned int *)(((base)|0xa0000000) + 0x0))
-+#endif
-+
-+MODULE_AUTHOR("Maintainer: Suraj S Iyer <ssiyer@ti.com>");
-+MODULE_DESCRIPTION("Driver for TI CPMAC");
-+
-+static int cfg_link_speed = 0;
-+MODULE_PARM(cfg_link_speed, "i");
-+MODULE_PARM_DESC(cfg_link_speed, "Fixed speed of the Link: <100/10>");
-+
-+static char *cfg_link_mode = NULL;
-+MODULE_PARM(cfg_link_mode, "1-3s");
-+MODULE_PARM_DESC(cfg_link_mode, "Fixed mode of the Link: <fd/hd>");
-+
-+int cpmac_debug_mode = 0;
-+MODULE_PARM(debug_mode, "i");
-+MODULE_PARM_DESC(debug_mode, "Turn on the debug info: <0/1>. Default is 0 (off)");
-+
-+#define dbgPrint if (cpmac_debug_mode) printk
-+#define errPrint printk
-+
-+static int g_cfg_start_link_params = CFG_START_LINK_SPEED;
-+static int g_init_enable_flag = 0;
-+static int cfg_start_link_speed;
-+static int cpmac_max_frame_size;
-+
-+static struct net_device *g_dev_array[2];
-+static struct proc_dir_entry *gp_stats_file = NULL;
-+
-+//-----------------------------------------------------------------------------
-+// Statistics related private functions.
-+//-----------------------------------------------------------------------------
-+static int cpmac_p_update_statistics(struct net_device *p_dev, char *buf, int limit, int *len);
-+static int cpmac_p_read_rfc2665_stats(char *buf, char **start, off_t offset, int count, int *eof, void *data);
-+static int cpmac_p_read_link(char *buf, char **start, off_t offset, int count, int *eof, void *data);
-+static int cpmac_p_read_stats(char* buf, char **start, off_t offset, int count, int *eof, void *data);
-+static int cpmac_p_write_stats (struct file *fp, const char * buf, unsigned long count, void * data);
-+static int cpmac_p_reset_statistics (struct net_device *p_dev);
-+static int cpmac_p_get_version(char *buf, char **start, off_t offset, int count, int *eof, void *data);
-+
-+static int cpmac_p_detect_manual_cfg(int, char*, int);
-+static int cpmac_p_process_status_ind(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
-+
-+//-----------------------------------------------------------------------------
-+// Timer related private functions.
-+//-----------------------------------------------------------------------------
-+static int cpmac_p_timer_init(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
-+// static int cpmac_timer_cleanup(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
-+static void cpmac_p_tick_timer_expiry(unsigned long p_cb_param);
-+inline static int cpmac_p_start_timer(struct timer_list *p_timer, unsigned int delay_ticks);
-+static int cpmac_p_stop_timer(struct timer_list *p_timer);
-+
-+//------------------------------------------------------------------------------
-+// Device configuration and setup related private functions.
-+//------------------------------------------------------------------------------
-+static int cpmac_p_probe_and_setup_device(CPMAC_PRIVATE_INFO_T *p_cpmac_priv, unsigned long *p_dev_flags);
-+static int cpmac_p_setup_driver_params(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
-+inline static int cpmac_p_rx_buf_setup(CPMAC_RX_CHAN_INFO_T *p_rx_chan);
-+
-+//-----------------------------------------------------------------------------
-+// Net device related private functions.
-+//-----------------------------------------------------------------------------
-+static int cpmac_dev_init(struct net_device *p_dev);
-+static int cpmac_dev_open( struct net_device *dev );
-+static int cpmac_dev_close(struct net_device *p_dev);
-+static void cpmac_dev_mcast_set(struct net_device *p_dev);
-+static int cpmac_dev_set_mac_addr(struct net_device *p_dev,void * addr);
-+static int cpmac_dev_tx( struct sk_buff *skb, struct net_device *p_dev);
-+static struct net_device_stats *cpmac_dev_get_net_stats (struct net_device *dev);
-+
-+static int cpmac_p_dev_enable( struct net_device *p_dev);
-+
-+
-+
-+/* Max. Reserved headroom in front of each packet so that the headers can be added to
-+ * a packet. Worst case scenario would be PPPoE + 2684 LLC Encapsulation + Ethernet
-+ * header. */
-+#define MAX_RESERVED_HEADROOM 20
-+
-+/* This is the MAX size of the static buffer for pure data. */
-+#define MAX_SIZE_STATIC_BUFFER 1600
-+
-+typedef struct DRIVER_BUFFER
-+{
-+ /* Pointer to the allocated data buffer. This is the static data buffer
-+ * allocated for the TI-Cache. 60 bytes out of the below buffer are required
-+ * by the SKB shared info. We always reserve at least MAX_RESERVED_HEADROOM bytes
-+ * so that the packets always have sufficient headroom. */
-+ char ptr_buffer[MAX_SIZE_STATIC_BUFFER + MAX_RESERVED_HEADROOM + 60];
-+
-+ /* List of the driver buffers. */
-+ struct DRIVER_BUFFER* ptr_next;
-+}DRIVER_BUFFER;
-+
-+typedef struct DRIVER_BUFFER_MCB
-+{
-+ /* List of the driver buffers. */
-+ DRIVER_BUFFER* ptr_available_driver_buffers;
-+
-+ /* The number of available buffers. */
-+ int num_available_buffers;
-+}DRIVER_BUFFER_MCB;
-+
-+DRIVER_BUFFER_MCB driver_mcb;
-+int hybrid_mode = 0;
-+
-+static union {
-+ struct sk_buff_head list;
-+ char pad[SMP_CACHE_BYTES];
-+} skb_head_pool[NR_CPUS];
-+
-+/**************************************************************************
-+ * FUNCTION NAME : ti_release_skb
-+ **************************************************************************
-+ * DESCRIPTION :
-+ * This function is called from the ti_alloc_skb when there were no more
-+ * data buffers available. The allocated SKB had to released back to the
-+ * data pool. The reason why this function was moved from the fast path
-+ * below was because '__skb_queue_head' is an inline function which adds
-+ * a large code chunk on the fast path.
-+ *
-+ * NOTES :
-+ * This function is called with interrupts disabled.
-+ **************************************************************************/
-+static void ti_release_skb (struct sk_buff_head* list, struct sk_buff* skb)
-+{
-+ __skb_queue_head(list, skb);
-+ return;
-+}
-+
-+/**************************************************************************
-+ * FUNCTION NAME : ti_alloc_skb
-+ **************************************************************************
-+ * DESCRIPTION :
-+ * The function is called to allocate memory from the static allocated
-+ * TI-Cached memory pool.
-+ *
-+ * RETURNS :
-+ * Allocated static memory buffer - Success
-+ * NULL - Error.
-+ **************************************************************************/
-+struct sk_buff *ti_alloc_skb(unsigned int size,int gfp_mask)
-+{
-+ register struct sk_buff* skb;
-+ unsigned long flags;
-+ struct sk_buff_head* list;
-+ DRIVER_BUFFER* ptr_node = NULL;
-+
-+ /* Critical Section Begin: Lock out interrupts. */
-+ local_irq_save(flags);
-+
-+ /* Get the SKB Pool list associated with the processor and dequeue the head. */
-+ list = &skb_head_pool[smp_processor_id()].list;
-+ skb = __skb_dequeue(list);
-+
-+ /* Align the data size. */
-+ size = SKB_DATA_ALIGN(size);
-+
-+ /* Did we get one. */
-+ if (skb != NULL)
-+ {
-+ /* YES. Now get a data block from the head of statically allocated block. */
-+ ptr_node = driver_mcb.ptr_available_driver_buffers;
-+ if (ptr_node != NULL)
-+ {
-+ /* YES. Got a data block. Advance the free list pointer to the next available buffer. */
-+ driver_mcb.ptr_available_driver_buffers = ptr_node->ptr_next;
-+ ptr_node->ptr_next = NULL;
-+
-+ /* Decrement the number of available data buffers. */
-+ driver_mcb.num_available_buffers = driver_mcb.num_available_buffers - 1;
-+ }
-+ else
-+ {
-+ /* NO. Was unable to get a data block. So put the SKB back on the free list.
-+ * This is slow path. */
-+#ifdef DEBUG_SKB
-+ printk ("DEBUG: No Buffer memory available: Number of free buffer:%d.\n",
-+ driver_mcb.num_available_buffers);
-+#endif
-+ ti_release_skb (list, skb);
-+ }
-+ }
-+
-+ /* Critical Section End: Unlock interrupts. */
-+ local_irq_restore(flags);
-+
-+ /* Did we get an SKB and data buffer. Proceed only if we were succesful in getting both else drop */
-+ if (skb != NULL && ptr_node != NULL)
-+ {
-+ /* XXX: does not include slab overhead */
-+ skb->truesize = size + sizeof(struct sk_buff);
-+
-+ /* Load the data pointers. */
-+ skb->head = ptr_node->ptr_buffer;
-+ skb->data = ptr_node->ptr_buffer + MAX_RESERVED_HEADROOM;
-+ skb->tail = ptr_node->ptr_buffer + MAX_RESERVED_HEADROOM;
-+ skb->end = ptr_node->ptr_buffer + size + MAX_RESERVED_HEADROOM;
-+
-+ /* Set up other state */
-+ skb->len = 0;
-+ skb->cloned = 0;
-+ skb->data_len = 0;
-+
-+ /* Mark the SKB indicating that the SKB is from the TI cache. */
-+ skb->cb[45] = 1;
-+
-+ atomic_set(&skb->users, 1);
-+ atomic_set(&(skb_shinfo(skb)->dataref), 1);
-+ skb_shinfo(skb)->nr_frags = 0;
-+ skb_shinfo(skb)->frag_list = NULL;
-+ return skb;
-+ }
-+ else
-+ {
-+ /* Control comes here only when there is no statically allocated data buffers
-+ * available. This case is handled using the mode selected
-+ *
-+ * 1. Hybrid Mode.
-+ * In that case lets jump to the old allocation code. This way we
-+ * can allocate a small number of data buffers upfront and the rest will hit
-+ * this portion of the code, which is slow path. Note the number of hits here
-+ * should be kept as low as possible to satisfy performance requirements.
-+ *
-+ * 2. Pure Static Mode.
-+ * Return NULL the user should have tuned the number of static buffers for
-+ * worst case scenario. So return NULL and let the drivers handle the error. */
-+ if (hybrid_mode == 1)
-+ {
-+ /* Hybrid Mode: Old allocation. */
-+ return dev_alloc_skb(size);
-+ }
-+ else
-+ {
-+ /* Pure Static Mode: No buffers available. */
-+ return NULL;
-+ }
-+ }
-+}
-+
-+/**************************************************************************
-+ * FUNCTION NAME : ti_skb_release_fragment
-+ **************************************************************************
-+ * DESCRIPTION :
-+ * This function is called to release fragmented packets. This is NOT in
-+ * the fast path and this function requires some work.
-+ **************************************************************************/
-+static void ti_skb_release_fragment(struct sk_buff *skb)
-+{
-+ if (skb_shinfo(skb)->nr_frags)
-+ {
-+ /* PANKAJ TODO: This portion has not been tested. */
-+ int i;
-+#ifdef DEBUG_SKB
-+ printk ("DEBUG: Releasing fragments in TI-Cached code.\n");
-+#endif
-+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-+ printk ("DEBUG: Fragmented Page = 0x%p.\n", skb_shinfo(skb)->frags[i].page);
-+ }
-+
-+ /* Check if there were any fragments present and if so clean all the SKB's.
-+ * This is required to recursivly clean the SKB's. */
-+ if (skb_shinfo(skb)->frag_list)
-+ skb_drop_fraglist(skb);
-+
-+ return;
-+}
-+
-+/**************************************************************************
-+ * FUNCTION NAME : ti_skb_release_data
-+ **************************************************************************
-+ * DESCRIPTION :
-+ * The function is called to release the SKB back into the TI-Cached static
-+ * memory pool.
-+ **************************************************************************/
-+static void ti_skb_release_data(struct sk_buff *skb)
-+{
-+ DRIVER_BUFFER* ptr_node;
-+ unsigned long flags;
-+
-+ /* The SKB data can be cleaned only if the packet has not been cloned and we
-+ * are the only one holding a reference to the data. */
-+ if (!skb->cloned || atomic_dec_and_test(&(skb_shinfo(skb)->dataref)))
-+ {
-+ /* Are there any fragments associated with the SKB ?*/
-+ if ((skb_shinfo(skb)->nr_frags != 0) || (skb_shinfo(skb)->frag_list != NULL))
-+ {
-+ /* Slow Path: Try and clean up the fragments. */
-+ ti_skb_release_fragment (skb);
-+ }
-+
-+ /* Cleanup the SKB data memory. This is fast path. */
-+ ptr_node = (DRIVER_BUFFER *)skb->head;
-+
-+ /* Critical Section: Lock out interrupts. */
-+ local_irq_save(flags);
-+
-+ /* Add the data buffer to the list of available buffers. */
-+ ptr_node->ptr_next = driver_mcb.ptr_available_driver_buffers;
-+ driver_mcb.ptr_available_driver_buffers = ptr_node;
-+
-+ /* Increment the number of available data buffers. */
-+ driver_mcb.num_available_buffers = driver_mcb.num_available_buffers + 1;
-+
-+ /* Criticial Section: Unlock interrupts. */
-+ local_irq_restore(flags);
-+ }
-+ return;
-+}
-+
-+
-+
-+
-+static unsigned char str2hexnum(unsigned char c)
-+{
-+ if(c >= '0' && c <= '9')
-+ return c - '0';
-+ if(c >= 'a' && c <= 'f')
-+ return c - 'a' + 10;
-+ if(c >= 'A' && c <= 'F')
-+ return c - 'A' + 10;
-+ return 0;
-+}
-+
-+static void str2eaddr(unsigned char *ea, unsigned char *str)
-+{
-+ int i;
-+ unsigned char num;
-+ for(i = 0; i < 6; i++) {
-+ if((*str == '.') || (*str == ':'))
-+ str++;
-+ num = str2hexnum(*str++) << 4;
-+ num |= (str2hexnum(*str++));
-+ ea[i] = num;
-+ }
-+}
-+
-+//-----------------------------------------------------------------------------
-+// Statistics related private functions.
-+//-----------------------------------------------------------------------------
-+static int cpmac_p_update_statistics(struct net_device *p_dev, char *buf, int limit, int *p_len)
-+{
-+ int ret_val = -1;
-+ unsigned long rx_hal_errors = 0;
-+ unsigned long rx_hal_discards = 0;
-+ unsigned long tx_hal_errors = 0;
-+ unsigned long ifOutDiscards = 0;
-+ unsigned long ifInDiscards = 0;
-+ unsigned long ifOutErrors = 0;
-+ unsigned long ifInErrors = 0;
-+
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ CPMAC_DEVICE_MIB_T *p_device_mib = p_cpmac_priv->device_mib;
-+ CPMAC_DRV_STATS_T *p_stats = p_cpmac_priv->stats;
-+ CPMAC_DEVICE_MIB_T local_mib;
-+ CPMAC_DEVICE_MIB_T *p_local_mib = &local_mib;
-+
-+ struct net_device_stats *p_net_dev_stats = &p_cpmac_priv->net_dev_stats;
-+
-+ int len = 0;
-+ int dev_mib_elem_count = 0;
-+
-+ /* do not access the hardware if it is in the reset state. */
-+ if(!test_bit(0, &p_cpmac_priv->set_to_close))
-+ {
-+ if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsDump", "Get",
-+ p_local_mib) != 0)
-+ {
-+ errPrint("The stats dump for %s is failing.\n", p_dev->name);
-+ return(ret_val);
-+ }
-+
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsClear", "Set", NULL);
-+
-+ dev_mib_elem_count = sizeof(CPMAC_DEVICE_MIB_T)/sizeof(unsigned long);
-+
-+ /* Update the history of the stats. This takes care of any reset of the
-+ * device and stats that might have taken place during the life time of
-+ * the driver.
-+ */
-+ while(dev_mib_elem_count--)
-+ {
-+ *((unsigned long*) p_device_mib + dev_mib_elem_count) +=
-+ *((unsigned long*) p_local_mib + dev_mib_elem_count);
-+ }
-+ }
-+
-+ /* RFC2665, section 3.2.7, page 9 */
-+ rx_hal_errors = p_device_mib->ifInFragments +
-+ p_device_mib->ifInCRCErrors +
-+ p_device_mib->ifInAlignCodeErrors +
-+ p_device_mib->ifInJabberFrames;
-+
-+ /* RFC2233 */
-+ rx_hal_discards = p_device_mib->ifRxDMAOverruns;
-+
-+ /* RFC2665, section 3.2.7, page 9 */
-+ tx_hal_errors = p_device_mib->ifExcessiveCollisionFrames +
-+ p_device_mib->ifLateCollisions +
-+ p_device_mib->ifCarrierSenseErrors +
-+ p_device_mib->ifOutUnderrun;
-+
-+ /* if not set, the short frames (< 64 bytes) are considered as errors */
-+ if(!p_cpmac_priv->flags & IFF_PRIV_SHORT_FRAMES)
-+ rx_hal_errors += p_device_mib->ifInUndersizedFrames;
-+
-+ /* if not set, the long frames ( > 1518) are considered as errors
-+ * RFC2665, section 3.2.7, page 9. */
-+ if(!p_cpmac_priv->flags & IFF_PRIV_JUMBO_FRAMES)
-+ rx_hal_errors += p_device_mib->ifInOversizedFrames;
-+
-+ /* if not in promiscous, then non addr matching frames are discarded */
-+ /* CPMAC 2.0 Manual Section 2.8.1.14 */
-+ if(!p_dev->flags & IFF_PROMISC)
-+ {
-+ ifInDiscards += p_device_mib->ifInFilteredFrames;
-+ }
-+
-+ /* total rx discards = hal discards + driver discards. */
-+ ifInDiscards = rx_hal_discards + p_net_dev_stats->rx_dropped;
-+ ifInErrors = rx_hal_errors;
-+
-+ ifOutErrors = tx_hal_errors;
-+ ifOutDiscards = p_net_dev_stats->tx_dropped;
-+
-+ /* Let us update the net device stats struct. To be updated in the later releases.*/
-+ p_cpmac_priv->net_dev_stats.rx_errors = ifInErrors;
-+ p_cpmac_priv->net_dev_stats.collisions = p_device_mib->ifCollisionFrames;
-+
-+ if(buf == NULL || limit == 0)
-+ {
-+ return(0);
-+ }
-+
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %ld\n", "ifSpeed", (long)p_cpmac_priv->link_speed);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "dot3StatsDuplexStatus", (long)p_cpmac_priv->link_mode);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifAdminStatus", (long)(p_dev->flags & IFF_UP ? 1:2));
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOperStatus", (long)(((p_dev->flags & IFF_UP) && netif_carrier_ok(p_dev)) ? 1:2));
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifLastChange", p_stats->start_tick);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInDiscards", ifInDiscards);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInErrors", ifInErrors);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutDiscards", ifOutDiscards);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutErrors", ifOutErrors);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInGoodFrames", p_device_mib->ifInGoodFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInBroadcasts", p_device_mib->ifInBroadcasts);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInMulticasts", p_device_mib->ifInMulticasts);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInPauseFrames", p_device_mib->ifInPauseFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInCRCErrors", p_device_mib->ifInCRCErrors);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInAlignCodeErrors", p_device_mib->ifInAlignCodeErrors);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInOversizedFrames", p_device_mib->ifInOversizedFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInJabberFrames", p_device_mib->ifInJabberFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInUndersizedFrames", p_device_mib->ifInUndersizedFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInFragments", p_device_mib->ifInFragments);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInFilteredFrames", p_device_mib->ifInFilteredFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInQosFilteredFrames", p_device_mib->ifInQosFilteredFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInOctets", p_device_mib->ifInOctets);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutGoodFrames", p_device_mib->ifOutGoodFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutBroadcasts", p_device_mib->ifOutBroadcasts);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutMulticasts", p_device_mib->ifOutMulticasts);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutPauseFrames", p_device_mib->ifOutPauseFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifDeferredTransmissions", p_device_mib->ifDeferredTransmissions);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifCollisionFrames", p_device_mib->ifCollisionFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifSingleCollisionFrames", p_device_mib->ifSingleCollisionFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifMultipleCollisionFrames", p_device_mib->ifMultipleCollisionFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifExcessiveCollisionFrames", p_device_mib->ifExcessiveCollisionFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifLateCollisions", p_device_mib->ifLateCollisions);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutUnderrun", p_device_mib->ifOutUnderrun);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifCarrierSenseErrors", p_device_mib->ifCarrierSenseErrors);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutOctets", p_device_mib->ifOutOctets);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if64OctetFrames", p_device_mib->if64OctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if65To127POctetFrames", p_device_mib->if65To127OctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if128To255OctetFrames", p_device_mib->if128To255OctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if256To511OctetFrames", p_device_mib->if256To511OctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if512To1023OctetFrames", p_device_mib->if512To1023OctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "if1024ToUpOctetFrames", p_device_mib->if1024ToUPOctetFrames);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifNetOctets", p_device_mib->ifNetOctets);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxSofOverruns", p_device_mib->ifRxSofOverruns);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxMofOverruns", p_device_mib->ifRxMofOverruns);
-+ if(len <= limit)
-+ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxDMAOverruns", p_device_mib->ifRxDMAOverruns);
-+
-+ *p_len = len;
-+
-+ return(0);
-+}
-+
-+
-+static int cpmac_p_read_rfc2665_stats(char* buf, char **start, off_t offset,
-+ int count, int *eof, void *data)
-+{
-+ int limit = count - 80;
-+ int len = 0;
-+ struct net_device *p_dev = (struct net_device*)data;
-+
-+ cpmac_p_update_statistics(p_dev, buf, limit, &len);
-+
-+ *eof = 1;
-+
-+ return len;
-+}
-+
-+static int cpmac_p_read_link(char *buf, char **start, off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ int len = 0;
-+
-+ struct net_device *p_dev;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
-+ struct net_device *cpmac_dev_list[cpmac_devices_installed];
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal;
-+
-+ int i;
-+ int phy; /* what phy are we using? */
-+
-+ len += sprintf(buf+len, "CPMAC devices = %d\n",cpmac_devices_installed);
-+
-+ p_dev = last_cpmac_device;
-+
-+ /* Reverse the the device link list to list eth0,eth1...in correct order */
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ cpmac_dev_list[cpmac_devices_installed -(i+1)] = p_dev;
-+ p_cpmac_priv = p_dev->priv;
-+ p_dev = p_cpmac_priv->next_device;
-+ }
-+
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ p_dev = cpmac_dev_list[i];
-+ p_cpmac_priv = p_dev->priv;
-+ p_drv_hal = p_cpmac_priv->drv_hal;
-+
-+ /* This prints them out from high to low because of how the devices are linked */
-+ if(netif_carrier_ok(p_dev))
-+ {
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "PhyNum", "Get", &phy);
-+
-+
-+ len += sprintf(buf+len,"eth%d: Link State: %s Phy:0x%x, Speed = %s, Duplex = %s\n",
-+ p_cpmac_priv->instance_num, "UP", phy,
-+ (p_cpmac_priv->link_speed == 100000000) ? "100":"10",
-+ (p_cpmac_priv->link_mode == 2) ? "Half":"Full");
-+
-+ }
-+ else
-+ len += sprintf(buf+len,"eth%d: Link State: DOWN\n",p_cpmac_priv->instance_num);
-+
-+ p_dev = p_cpmac_priv->next_device;
-+ }
-+
-+ return len;
-+
-+}
-+
-+static int cpmac_p_read_stats(char* buf, char **start, off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *p_dev = last_cpmac_device;
-+ int len = 0;
-+ int limit = count - 80;
-+ int i;
-+ struct net_device *cpmac_dev_list[cpmac_devices_installed];
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
-+ CPMAC_DEVICE_MIB_T *p_device_mib;
-+
-+ /* Reverse the the device link list to list eth0,eth1...in correct order */
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ cpmac_dev_list[cpmac_devices_installed - (i+1)] = p_dev;
-+ p_cpmac_priv = p_dev->priv;
-+ p_dev = p_cpmac_priv->next_device;
-+ }
-+
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ p_dev = cpmac_dev_list[i];
-+
-+ if(!p_dev)
-+ goto proc_error;
-+
-+ /* Get Stats */
-+ cpmac_p_update_statistics(p_dev, NULL, 0, NULL);
-+
-+ p_cpmac_priv = p_dev->priv;
-+ p_device_mib = p_cpmac_priv->device_mib;
-+
-+ /* Transmit stats */
-+ if(len<=limit)
-+ len+= sprintf(buf+len, "\nCpmac %d, Address %lx\n",i+1, p_dev->base_addr);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Transmit Stats\n");
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Tx Valid Bytes Sent :%lu\n",p_device_mib->ifOutOctets);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Tx Frames (Hardware) :%lu\n",p_device_mib->ifOutGoodFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Tx Frames (Software) :%lu\n",p_cpmac_priv->net_dev_stats.tx_packets);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Tx Broadcast Frames :%lu\n",p_device_mib->ifOutBroadcasts);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Tx Multicast Frames :%lu\n",p_device_mib->ifOutMulticasts);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Pause Frames Sent :%lu\n",p_device_mib->ifOutPauseFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Collisions :%lu\n",p_device_mib->ifCollisionFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Tx Error Frames :%lu\n",p_cpmac_priv->net_dev_stats.tx_errors);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Carrier Sense Errors :%lu\n",p_device_mib->ifCarrierSenseErrors);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, "\n");
-+
-+
-+ /* Receive Stats */
-+ if(len<=limit)
-+ len+= sprintf(buf+len, "\nCpmac %d, Address %lx\n",i+1,p_dev->base_addr);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Receive Stats\n");
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Valid Bytes Received :%lu\n",p_device_mib->ifInOctets);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Rx Frames (Hardware) :%lu\n",p_device_mib->ifInGoodFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Rx Frames (Software) :%lu\n",p_cpmac_priv->net_dev_stats.rx_packets);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Rx Broadcast Frames :%lu\n",p_device_mib->ifInBroadcasts);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Good Rx Multicast Frames :%lu\n",p_device_mib->ifInMulticasts);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Pause Frames Received :%lu\n",p_device_mib->ifInPauseFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx CRC Errors :%lu\n",p_device_mib->ifInCRCErrors);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Align/Code Errors :%lu\n",p_device_mib->ifInAlignCodeErrors);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Jabbers :%lu\n",p_device_mib->ifInOversizedFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Filtered Frames :%lu\n",p_device_mib->ifInFilteredFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Fragments :%lu\n",p_device_mib->ifInFragments);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Undersized Frames :%lu\n",p_device_mib->ifInUndersizedFrames);
-+ if(len<=limit)
-+ len+= sprintf(buf+len, " Rx Overruns :%lu\n",p_device_mib->ifRxDMAOverruns);
-+ }
-+
-+
-+ return len;
-+
-+ proc_error:
-+ *eof=1;
-+ return len;
-+}
-+
-+static int cpmac_p_write_stats (struct file *fp, const char * buf, unsigned long count, void * data)
-+{
-+ char local_buf[31];
-+ int ret_val = 0;
-+
-+ if(count > 30)
-+ {
-+ printk("Error : Buffer Overflow\n");
-+ printk("Use \"echo 0 > cpmac_stat\" to reset the statistics\n");
-+ return -EFAULT;
-+ }
-+
-+ copy_from_user(local_buf,buf,count);
-+ local_buf[count-1]='\0'; /* Ignoring last \n char */
-+ ret_val = count;
-+
-+ if(strcmp("0",local_buf)==0)
-+ {
-+ struct net_device *p_dev = last_cpmac_device;
-+ int i;
-+ struct net_device *cpmac_dev_list[cpmac_devices_installed];
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
-+
-+ /* Valid command */
-+ printk("Resetting statistics for CPMAC interface.\n");
-+
-+ /* Reverse the the device link list to list eth0,eth1...in correct order */
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ cpmac_dev_list[cpmac_devices_installed - (i+1)] = p_dev;
-+ p_cpmac_priv = p_dev->priv;
-+ p_dev = p_cpmac_priv->next_device;
-+ }
-+
-+ for(i=0; i< cpmac_devices_installed; i++)
-+ {
-+ p_dev = cpmac_dev_list[i];
-+ if(!p_dev)
-+ {
-+ ret_val = -EFAULT;
-+ break;
-+ }
-+
-+ cpmac_p_reset_statistics(p_dev);
-+ }
-+ }
-+ else
-+ {
-+ printk("Error: Unknown operation on cpmac statistics\n");
-+ printk("Use \"echo 0 > cpmac_stats\" to reset the statistics\n");
-+ return -EFAULT;
-+ }
-+
-+ return ret_val;
-+}
-+
-+static int cpmac_p_reset_statistics(struct net_device *p_dev)
-+{
-+ int ret_val = 0;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+
-+ memset(p_cpmac_priv->device_mib, 0, sizeof(CPMAC_DEVICE_MIB_T));
-+ memset(p_cpmac_priv->stats, 0, sizeof(CPMAC_DRV_STATS_T));
-+ memset(&p_cpmac_priv->net_dev_stats, 0, sizeof(struct net_device_stats));
-+
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsClear", "Set", NULL);
-+
-+ return(ret_val);
-+}
-+
-+static int cpmac_p_get_version(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ int limit = count - 80;
-+ char *hal_version = NULL;
-+ struct net_device *p_dev = last_cpmac_device;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "Version", "Get", &hal_version);
-+
-+ len += sprintf(buf+len, "Texas Instruments CPMAC driver version: %s\n", cpmac_version);
-+
-+ if(len <= limit && hal_version)
-+ len += sprintf(buf+len, "Texas Instruments CPMAC HAL version: %s\n", hal_version);
-+
-+ return len;
-+}
-+
-+static struct net_device_stats *cpmac_dev_get_net_stats (struct net_device *p_dev)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = (CPMAC_PRIVATE_INFO_T *) p_dev->priv;
-+
-+ cpmac_p_update_statistics(p_dev, NULL, 0, NULL);
-+
-+ return &p_cpmac_priv->net_dev_stats;
-+}
-+
-+static int cpmac_p_detect_manual_cfg(int link_speed, char* link_mode, int debug)
-+{
-+ char *pSpeed = NULL;
-+
-+ if(debug == 1)
-+ {
-+ cpmac_debug_mode = 1;
-+ dbgPrint("Enabled the debug print.\n");
-+ }
-+
-+ if(!link_speed && !link_mode)
-+ {
-+ dbgPrint("No manual link params, defaulting to auto negotiation.\n");
-+ return (0);
-+ }
-+
-+ if(!link_speed || (link_speed != 10 && link_speed != 100))
-+ {
-+ dbgPrint("Invalid or No value of link speed specified, defaulting to auto speed.\n");
-+ pSpeed = "auto";
-+ }
-+ else if(link_speed == 10)
-+ {
-+ g_cfg_start_link_params &= ~(_CPMDIO_100);
-+ pSpeed = "10 Mbps";
-+ }
-+ else
-+ {
-+ g_cfg_start_link_params &= ~(_CPMDIO_10);
-+ pSpeed = "100 Mbps";
-+ }
-+
-+ if(!link_mode || (!strcmp(link_mode, "fd") && !strcmp(link_mode, "hd")))
-+ {
-+ dbgPrint("Invalid or No value of link mode specified, defaulting to auto mode.\n");
-+ }
-+ else if(!strcmp(link_mode, "hd"))
-+ {
-+ g_cfg_start_link_params &= ~(_CPMDIO_FD);
-+ }
-+ else
-+ {
-+ g_cfg_start_link_params &= ~(_CPMDIO_HD);
-+ }
-+
-+ dbgPrint("Link is manually set to the speed of %s speed and %s mode.\n",
-+ pSpeed, link_mode ? link_mode : "auto");
-+
-+ return(0);
-+}
-+
-+//------------------------------------------------------------------------------
-+// Call back from the HAL.
-+//------------------------------------------------------------------------------
-+static int cpmac_p_process_status_ind(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
-+{
-+ struct net_device *p_dev = p_cpmac_priv->owner;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ int status;
-+
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "Status", "Get", &status);
-+
-+ /* We do not reflect the real link status if in loopback.
-+ * After all, we want the packets to reach the hardware so
-+ * that Send() should work. */
-+ if(p_dev->flags & IFF_LOOPBACK)
-+ {
-+ dbgPrint("Maintaining the link up loopback for %s.\n", p_dev->name);
-+ netif_carrier_on(p_dev);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
-+#endif
-+
-+ return(0);
-+ }
-+
-+ if(status & CPMAC_STATUS_ADAPTER_CHECK) /* ???? */
-+ {
-+ ; /* what to do ? */
-+ }
-+ else if(status)
-+ {
-+ if(!netif_carrier_ok(p_dev))
-+ {
-+ netif_carrier_on(p_cpmac_priv->owner);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
-+#endif
-+ dbgPrint("Found the Link for the CPMAC instance %s.\n", p_dev->name);
-+ }
-+
-+ if(netif_running(p_dev) & netif_queue_stopped(p_dev))
-+ {
-+ netif_wake_queue(p_dev);
-+ }
-+
-+ p_cpmac_priv->link_speed = status & CPMAC_STATUS_LINK_SPEED ? 100000000:10000000;
-+ p_cpmac_priv->link_mode = status & CPMAC_STATUS_LINK_DUPLEX? 3:2;
-+
-+ }
-+ else
-+ {
-+ if(netif_carrier_ok(p_dev))
-+ {
-+ /* do we need to register synchronization issues with stats here. */
-+ p_cpmac_priv->link_speed = 100000000;
-+ p_cpmac_priv->link_mode = 1;
-+
-+ netif_carrier_off(p_dev);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
-+#endif
-+
-+ dbgPrint("Lost the Link for the CPMAC for %s.\n", p_dev->name);
-+ }
-+
-+ if(!netif_queue_stopped(p_dev))
-+ {
-+ netif_stop_queue(p_dev); /* So that kernel does not keep on xmiting pkts. */
-+ }
-+ }
-+
-+ return(0);
-+}
-+
-+//-----------------------------------------------------------------------------
-+// Timer related private functions.
-+//-----------------------------------------------------------------------------
-+static int cpmac_p_timer_init(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
-+{
-+ struct timer_list *p_timer = p_cpmac_priv->timer;
-+
-+ init_timer(p_timer);
-+
-+ p_timer = p_cpmac_priv->timer + TICK_TIMER;
-+ p_timer->expires = 0;
-+ p_timer->data = (unsigned long)p_cpmac_priv;
-+ p_timer->function = cpmac_p_tick_timer_expiry;
-+
-+ return(0);
-+}
-+
-+#if 0
-+static int cpmac_timer_cleanup(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
-+{
-+ struct timer_list *p_timer;
-+
-+ p_timer = p_cpmac_priv->timer + TICK_TIMER;
-+
-+ /* use spin lock to establish synchronization with the dispatch */
-+ if(p_timer->function) del_timer_sync(p_timer);
-+ p_timer->function = NULL;
-+
-+ return (0);
-+}
-+#endif
-+
-+static int cpmac_p_start_timer(struct timer_list *p_timer, unsigned int delay_ticks)
-+{
-+ p_timer->expires = jiffies + delay_ticks;
-+
-+ if(p_timer->function)
-+ {
-+ add_timer(p_timer);
-+ }
-+
-+ return(0);
-+}
-+
-+static void cpmac_p_tick_timer_expiry(unsigned long p_cb_param)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = (CPMAC_PRIVATE_INFO_T*) p_cb_param;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ struct timer_list *p_timer = p_cpmac_priv->timer + TICK_TIMER;
-+
-+ if(test_bit(0, &p_cpmac_priv->set_to_close))
-+ {
-+ return;
-+ }
-+
-+ p_drv_hal->hal_funcs->Tick(p_drv_hal->hal_dev);
-+
-+ cpmac_p_start_timer(p_timer, p_cpmac_priv->delay_ticks);
-+}
-+
-+static int cpmac_p_stop_timer(struct timer_list *p_timer)
-+{
-+ /* Ideally we need to a set flag indicating not to start the timer again
-+ before del_timer_sync() is called up. But here we assume that the
-+ caller has set the p_cpmac_priv->set_to_close (ok for now). */
-+ del_timer_sync(p_timer);
-+
-+ return(0);
-+}
-+
-+//------------------------------------------------------------------------------
-+// Device configuration and setup related private functions.
-+//------------------------------------------------------------------------------
-+static int cpmac_p_probe_and_setup_device(CPMAC_PRIVATE_INFO_T *p_cpmac_priv,
-+ unsigned long *p_dev_flags)
-+{
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ CPMAC_ABILITY_INFO_T *p_capability= p_cpmac_priv->ability_info;
-+ unsigned int val = 0;
-+ int channel = 0;
-+
-+ p_cpmac_priv->flags = 0;
-+
-+ p_capability->promiscous = CFG_PROMISCOUS;
-+ p_capability->broadcast = CFG_BROADCAST;
-+ p_capability->multicast = CFG_MULTICAST;
-+ p_capability->all_multi = CFG_ALL_MULTI;
-+ p_capability->jumbo_frames = CFG_JUMBO_FRAMES;
-+ p_capability->short_frames = CFG_SHORT_FRAMES;
-+ p_capability->auto_negotiation = CFG_AUTO_NEGOTIATION;
-+ p_capability->link_speed = cfg_start_link_speed;
-+ p_capability->loop_back = CFG_LOOP_BACK;
-+ p_capability->tx_flow_control = CFG_TX_FLOW_CNTL;
-+ p_capability->rx_flow_control = CFG_RX_FLOW_CNTL;
-+ p_capability->tx_pacing = CFG_TX_PACING;
-+ p_capability->rx_pass_crc = CFG_RX_PASS_CRC;
-+ p_capability->qos_802_1q = CFG_QOS_802_1Q;
-+ p_capability->tx_num_chan = CFG_TX_NUM_CHAN;
-+
-+ /* Lets probe the device for the configured capabilities (netdev specific).*/
-+
-+ /* Following are set in the set_multi_list, when indicated by the kernel
-+ * Promiscous and all multi.
-+ */
-+
-+ if(p_capability->broadcast)
-+ {
-+ channel = 0;
-+ val = 1;
-+ if((p_hal_funcs->Control(p_hal_dev, pszRX_BROAD_EN, pszSet, &val) == 0) &&
-+ (p_hal_funcs->Control(p_hal_dev, pszRX_BROAD_CH, pszSet, &channel) == 0))
-+ *p_dev_flags |= IFF_BROADCAST;
-+ else
-+ p_capability->broadcast = 0; /* no broadcast capabilities */
-+ }
-+
-+ if(p_capability->multicast)
-+ {
-+ val = 1;
-+ channel = 0;
-+ if((p_hal_funcs->Control(p_hal_dev, pszRX_MULT_EN, pszSet, &val) == 0) &&
-+ (p_hal_funcs->Control(p_hal_dev, pszRX_MULT_CH, pszSet, &channel) == 0))
-+ *p_dev_flags |= IFF_MULTICAST;
-+ else
-+ {
-+ p_capability->multicast = 0;
-+ p_capability->all_multi = 0; /* no multicast, no all-multi. */
-+ }
-+ }
-+
-+ if(p_capability->loop_back)
-+ {
-+ ; /* We do not put the device in loopback, if required use ioctl */
-+ }
-+
-+ /* Lets probe the device for the configured capabilities (Non net device specific).*/
-+
-+ if(p_capability->jumbo_frames)
-+ {
-+ val = 0;
-+ if(p_hal_funcs->Control(p_hal_dev, pszRX_NO_CHAIN, pszSet, &val) == 0)
-+ p_cpmac_priv->flags |= IFF_PRIV_JUMBO_FRAMES;
-+ else
-+ p_capability->jumbo_frames = 0;
-+ }
-+
-+ if(p_capability->short_frames)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev, pszRX_CSF_EN, pszSet, &val) == 0)
-+ p_cpmac_priv->flags |= IFF_PRIV_SHORT_FRAMES;
-+ else
-+ p_capability->short_frames = 0;
-+ }
-+
-+ val = g_cfg_start_link_params;
-+
-+#ifdef CONFIG_AR7_MDIX
-+ if( avalanche_is_mdix_on_chip() )
-+ {
-+ val |= _CPMDIO_AUTOMDIX;
-+ }
-+#endif
-+
-+ if(p_hal_funcs->Control(p_hal_dev,pszMdioConnect,pszSet, &val) !=0)
-+ {
-+ p_capability->link_speed = 0;
-+ }
-+ else
-+ {
-+ if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_HD | _CPMDIO_FD | _CPMDIO_10))
-+ p_cpmac_priv->flags |= IFF_PRIV_AUTOSPEED;
-+ else if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_HD))
-+ p_cpmac_priv->flags |= IFF_PRIV_LINK100_HD;
-+ else if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_FD))
-+ p_cpmac_priv->flags |= IFF_PRIV_LINK100_FD;
-+ else if(g_cfg_start_link_params & (_CPMDIO_10 | _CPMDIO_HD))
-+ p_cpmac_priv->flags |= IFF_PRIV_LINK10_HD;
-+ else if(g_cfg_start_link_params & (_CPMDIO_10 | _CPMDIO_FD))
-+ p_cpmac_priv->flags |= IFF_PRIV_LINK10_FD;
-+ else
-+ ;
-+ }
-+
-+ if(p_capability->tx_flow_control)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev,pszTX_FLOW_EN, pszSet, &val) ==0)
-+ p_cpmac_priv->flags |= IFF_PRIV_TX_FLOW_CNTL;
-+ else
-+ p_capability->tx_flow_control = 0;
-+ }
-+
-+ if(p_capability->rx_flow_control)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev, pszRX_FLOW_EN, pszSet, &val) ==0)
-+ p_cpmac_priv->flags |= IFF_PRIV_RX_FLOW_CNTL;
-+ else
-+ p_capability->rx_flow_control = 0;
-+ }
-+
-+ if(p_capability->tx_pacing)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev, pszTX_PACE, pszSet, &val) ==0)
-+ p_cpmac_priv->flags |= IFF_PRIV_TX_PACING;
-+ else
-+ p_capability->tx_pacing = 0;
-+ }
-+
-+ if(p_capability->rx_pass_crc)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev, pszRX_PASS_CRC, pszSet, &val) == 0)
-+ p_cpmac_priv->flags |= IFF_PRIV_RX_PASS_CRC;
-+ else
-+ p_capability->rx_pass_crc = 0;
-+ }
-+
-+ if(p_capability->qos_802_1q)
-+ {
-+ val = 1;
-+ if(p_hal_funcs->Control(p_hal_dev, pszRX_QOS_EN, pszSet, &val) == 0)
-+ p_cpmac_priv->flags |= IFF_PRIV_8021Q_EN;
-+ else
-+ {
-+ p_capability->qos_802_1q = 0;
-+ p_capability->tx_num_chan= 1;
-+ }
-+ }
-+
-+ if(p_capability->tx_num_chan > 1)
-+ {
-+ int cfg_tx_num_chan = p_capability->tx_num_chan;
-+ val = 0;
-+#ifdef TEST
-+ if(p_hal_funcs->Control(p_hal_dev, pszTX_NUM_CH, pszGet, &val) == 0)
-+ cfg_tx_num_chan = cfg_tx_num_chan > val ? val : cfg_tx_num_chan;
-+ else
-+ cfg_tx_num_chan = 1;
-+#endif
-+ p_capability->tx_num_chan = cfg_tx_num_chan;
-+ }
-+
-+ return(0);
-+}
-+
-+static int cpmac_p_setup_driver_params(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
-+{
-+ int i=0;
-+ int threshold = CFG_TX_NUM_BUF_SERVICE;
-+
-+ char *tx_threshold_ptr = prom_getenv("threshold");
-+
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info = p_cpmac_priv->tx_chan_info;
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
-+ CPMAC_ABILITY_INFO_T *p_capability = p_cpmac_priv->ability_info;
-+
-+ /* Timer stuff */
-+ p_cpmac_priv->timer_count = 1; /* should be < or = the MAX TIMER */
-+ p_cpmac_priv->timer_created = 0;
-+ p_cpmac_priv->timer_access_hal = 1;
-+
-+ for(i=0; i < MAX_TIMER; i++)
-+ p_cpmac_priv->timer[i].function = NULL;
-+
-+ p_cpmac_priv->enable_802_1q = p_capability->qos_802_1q;
-+
-+ /* Tx channel related.*/
-+ p_tx_chan_info->cfg_chan = p_capability->tx_num_chan;
-+ p_tx_chan_info->opened_chan = 0;
-+
-+ if(tx_threshold_ptr)
-+ threshold = simple_strtol(tx_threshold_ptr, (char **)NULL, 10);
-+
-+ if((threshold <= 0) && tx_threshold_ptr) /* If threshold set to 0 then Enable the TX interrupt */
-+ {
-+ threshold = CFG_TX_NUM_BUF_SERVICE;
-+ p_tx_chan_info->tx_int_disable = 0;
-+
-+ }
-+ else
-+ {
-+ p_tx_chan_info->tx_int_disable = CFG_TX_INT_DISABLE;
-+ }
-+
-+ for(i=0; i < MAX_TX_CHAN; i++)
-+ {
-+
-+
-+
-+ p_tx_chan_info->chan[i].state = CHAN_CLOSE;
-+ p_tx_chan_info->chan[i].num_BD = CFG_TX_NUM_BUF_DESC;
-+ p_tx_chan_info->chan[i].buffer_size = cpmac_max_frame_size;
-+ p_tx_chan_info->chan[i].buffer_offset = CFG_TX_BUF_OFFSET;
-+
-+
-+
-+ p_tx_chan_info->chan[i].service_max = threshold;
-+ }
-+
-+ if (p_tx_chan_info->tx_int_disable)
-+ printk("Cpmac driver Disable TX complete interrupt setting threshold to %d.\n",threshold);
-+ else
-+ printk("Cpmac driver Enable TX complete interrupt\n");
-+
-+
-+ /* Assuming just one rx channel for now */
-+ p_rx_chan_info->cfg_chan = 1;
-+ p_rx_chan_info->opened_chan = 0;
-+ p_rx_chan_info->chan->state = CHAN_CLOSE;
-+ p_rx_chan_info->chan->num_BD = CFG_RX_NUM_BUF_DESC;
-+ p_rx_chan_info->chan->buffer_size = cpmac_max_frame_size;
-+ p_rx_chan_info->chan->buffer_offset = CFG_RX_BUF_OFFSET;
-+ p_rx_chan_info->chan->service_max = CFG_RX_NUM_BUF_SERVICE;
-+
-+ /* Set as per RFC 2665 */
-+ p_cpmac_priv->link_speed = 100000000;
-+ p_cpmac_priv->link_mode = 1;
-+
-+ p_cpmac_priv->loop_back = 0;
-+
-+ return(0);
-+}
-+
-+inline static int cpmac_p_rx_buf_setup(CPMAC_RX_CHAN_INFO_T *p_rx_chan)
-+{
-+ /* Number of ethernet packets & max pkt length */
-+ p_rx_chan->chan->tot_buf_size = p_rx_chan->chan->buffer_size +
-+ 2*(CONTROL_802_1Q_SIZE) +
-+ p_rx_chan->chan->buffer_offset +
-+ ADD_FOR_4BYTE_ALIGN(p_rx_chan->chan->buffer_offset & 0x3);
-+
-+ p_rx_chan->chan->tot_reserve_bytes = CONTROL_802_1Q_SIZE +
-+ p_rx_chan->chan->buffer_offset +
-+ L3_ALIGN(p_rx_chan->chan->buffer_offset & 0x3);
-+
-+ return(0);
-+}
-+
-+//-----------------------------------------------------------------------------
-+// Net device related private functions.
-+//-----------------------------------------------------------------------------
-+
-+/***************************************************************
-+ * cpmac_dev_init
-+ *
-+ * Returns:
-+ * 0 on success, error code otherwise.
-+ * Parms:
-+ * dev The structure of the device to be
-+ * init'ed.
-+ *
-+ * This function completes the initialization of the
-+ * device structure and driver. It reserves the IO
-+ * addresses and assignes the device's methods.
-+ *
-+ *
-+ **************************************************************/
-+
-+static int cpmac_dev_init(struct net_device *p_dev)
-+{
-+ int retVal = -1;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ int instance_num = p_cpmac_priv->instance_num;
-+ unsigned long net_flags = 0;
-+ char *mac_name = NULL;
-+ char *mac_string = NULL;
-+
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info;
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal;
-+ int i;
-+
-+ int mem_size = sizeof(CPMAC_DRV_HAL_INFO_T)
-+ + sizeof(CPMAC_TX_CHAN_INFO_T)
-+ + sizeof(CPMAC_RX_CHAN_INFO_T)
-+ + sizeof(CPMAC_ABILITY_INFO_T)
-+ + sizeof(CPMAC_DEVICE_MIB_T)
-+ + sizeof(CPMAC_DRV_STATS_T);
-+
-+
-+#if defined(CONFIG_MIPS_SEAD2)
-+ int prev_reset_val = RESET_REG_PRCR;
-+ /* Bring the module out of reset */
-+ RESET_REG_PRCR |= temp_reset_value[p_cpmac_priv->instance_num];
-+
-+ /* Read the version id of the device to check if the device really exists */
-+ if( VERSION(temp_base_address[p_cpmac_priv->instance_num]) == 0)
-+ {
-+ printk(" CPMAC:Device not found\n");
-+ RESET_REG_PRCR = prev_reset_val;
-+ return -ENODEV;
-+ }
-+
-+ RESET_REG_PRCR = prev_reset_val;
-+#endif
-+
-+
-+ if((p_drv_hal = kmalloc(mem_size, GFP_KERNEL)) == NULL)
-+ {
-+ errPrint("Failed to allocate memory; rewinding.\n");
-+ return(-1);
-+ }
-+
-+ memset(p_drv_hal, 0, mem_size);
-+
-+ /* build the cpmac private object */
-+ p_cpmac_priv->drv_hal = p_drv_hal;
-+ p_cpmac_priv->tx_chan_info = p_tx_chan_info
-+ = (CPMAC_TX_CHAN_INFO_T*)((char*)p_drv_hal
-+ + sizeof(CPMAC_DRV_HAL_INFO_T));
-+ p_cpmac_priv->rx_chan_info = p_rx_chan_info
-+ = (CPMAC_RX_CHAN_INFO_T*)((char *)p_tx_chan_info
-+ + sizeof(CPMAC_TX_CHAN_INFO_T));
-+ p_cpmac_priv->ability_info = (CPMAC_ABILITY_INFO_T *)((char *)p_rx_chan_info
-+ + sizeof(CPMAC_RX_CHAN_INFO_T));
-+ p_cpmac_priv->device_mib = (CPMAC_DEVICE_MIB_T *)((char *)p_cpmac_priv->ability_info
-+ + sizeof(CPMAC_ABILITY_INFO_T));
-+ p_cpmac_priv->stats = (CPMAC_DRV_STATS_T *)((char *)p_cpmac_priv->device_mib
-+ + sizeof(CPMAC_DEVICE_MIB_T));
-+
-+ p_drv_hal->owner = p_cpmac_priv;
-+
-+
-+ switch(instance_num)
-+ {
-+
-+ case 0:
-+ mac_name="maca";
-+
-+ /* Also setting port information */
-+ p_dev->if_port = AVALANCHE_CPMAC_LOW_PORT_ID;
-+
-+ break;
-+
-+ case 1:
-+ mac_name="macb";
-+
-+ /* Also setting port information */
-+ p_dev->if_port = AVALANCHE_CPMAC_HIGH_PORT_ID;
-+
-+ break;
-+ }
-+
-+ if(mac_name)
-+ mac_string=prom_getenv(mac_name);
-+
-+ if(!mac_string)
-+ {
-+ mac_string="08.00.28.32.06.02";
-+ printk("Error getting mac from Boot enviroment for %s\n",p_dev->name);
-+ printk("Using default mac address: %s\n",mac_string);
-+ if(mac_name)
-+ {
-+ printk("Use Bootloader command:\n");
-+ printk(" setenv %s xx.xx.xx.xx.xx.xx\n","<env_name>");
-+ printk("to set mac address\n");
-+ }
-+ }
-+
-+ str2eaddr(p_cpmac_priv->mac_addr,mac_string);
-+
-+ for (i=0; i <= ETH_ALEN; i++)
-+ {
-+ /* This sets the hardware address */
-+ p_dev->dev_addr[i] = p_cpmac_priv->mac_addr[i];
-+ }
-+
-+ p_cpmac_priv->set_to_close = 1;
-+ p_cpmac_priv->non_data_irq_expected = 0;
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ if((p_cpmac_priv->led_handle = avalanche_led_register("cpmac", instance_num)) == NULL)
-+ {
-+ errPrint("Could not allocate handle for CPMAC[%d] LED.\n", instance_num);
-+ goto cpmac_init_mod_error;
-+ }
-+#endif
-+
-+ if(cpmac_drv_init_module(p_drv_hal, p_dev, instance_num) != 0)
-+ {
-+ errPrint("Could not initialize the HAL for %s.\n", p_dev->name);
-+ goto cpmac_init_mod_error;
-+ }
-+
-+ /* initialize the CPMAC device */
-+ if (cpmac_drv_init(p_drv_hal) == -1)
-+ {
-+ errPrint("HAL init failed for %s.\n", p_dev->name);
-+ goto cpmac_init_device_error;
-+ }
-+
-+ if(cpmac_p_probe_and_setup_device(p_cpmac_priv, &net_flags) == -1)
-+ {
-+ errPrint("Failed to configure up %s.\n", p_dev->name);
-+ goto cpmac_init_device_error;
-+ }
-+
-+ if(cpmac_p_setup_driver_params(p_cpmac_priv) == -1)
-+ {
-+ errPrint("Failed to set driver parameters for %s.\n", p_dev->name);
-+ goto cpmac_init_device_error;
-+ }
-+
-+ cpmac_p_rx_buf_setup(p_rx_chan_info);
-+
-+ /* initialize the timers for the net device */
-+ if(cpmac_p_timer_init(p_cpmac_priv) == -1)
-+ {
-+ errPrint("Failed to set timer(s) for %s.\n", p_dev->name);
-+ goto cpmac_timer_init_error;
-+ }
-+
-+ p_dev->addr_len = 6;
-+
-+ p_dev->open = &cpmac_dev_open; /* i.e. Start Device */
-+ p_dev->hard_start_xmit = &cpmac_dev_tx;
-+ p_dev->stop = &cpmac_dev_close;
-+ p_dev->get_stats = &cpmac_dev_get_net_stats;
-+
-+ p_dev->set_multicast_list = &cpmac_dev_mcast_set;
-+ p_dev->set_mac_address = cpmac_dev_set_mac_addr;
-+ /* Knocking off the default broadcast and multicast flags. Allowing the
-+ device configuration to control the flags. */
-+ p_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
-+ p_dev->flags |= net_flags;
-+
-+ netif_carrier_off(p_dev);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
-+#endif
-+
-+ /* Tasklet is initialized at the isr registeration time. */
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "CpmacBase", "Get", &p_dev->base_addr);
-+ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "CpmacSize", "Get", &p_cpmac_priv->dev_size);
-+
-+ request_mem_region(p_dev->base_addr, p_cpmac_priv->dev_size, p_dev->name);
-+
-+ retVal = 0;
-+
-+ if(g_init_enable_flag)
-+ cpmac_p_dev_enable(p_dev);
-+
-+ return(retVal);
-+
-+cpmac_timer_init_error:
-+cpmac_init_device_error :
-+ cpmac_drv_cleanup(p_drv_hal);
-+
-+cpmac_init_mod_error:
-+ kfree(p_drv_hal);
-+
-+ return (retVal);
-+
-+} /* cpmac_dev_init */
-+
-+
-+/***************************************************************
-+ * cpmac_p_dev_enable
-+ *
-+ * Returns:
-+ * 0 on success, error code otherwise.
-+ * Parms:
-+ * dev Structure of device to be opened.
-+ *
-+ * This routine puts the driver and CPMAC adapter in a
-+ * state where it is ready to send and receive packets.
-+ *
-+ *
-+ **************************************************************/
-+int cpmac_p_dev_enable( struct net_device *p_dev)
-+{
-+ int ret_val = 0;
-+ int channel = 0;
-+
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
-+ int max_length = p_rx_chan_info->chan->tot_buf_size;
-+
-+ p_cpmac_priv->set_to_close = 0;
-+
-+ if((ret_val = cpmac_drv_start(p_drv_hal, p_cpmac_priv->tx_chan_info,
-+ p_cpmac_priv->rx_chan_info, CHAN_SETUP))==-1)
-+ {
-+ errPrint("%s error: failed to start the device.\n", p_dev->name);
-+ ret_val = -1;
-+ }
-+ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev,"RX_UNICAST_SET",
-+ "Set", &channel)!=0)
-+ {
-+ errPrint("%s error: device chan 0 could not be enabled.\n", p_dev->name);
-+ ret_val = -1;
-+ }
-+ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, pszRX_MAXLEN, pszSet, &max_length) != 0)
-+ {
-+ errPrint(" CPMAC registers can't be written \n");
-+ ret_val = -1;
-+ }
-+ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "TxIntDisable", "Set",
-+ &p_cpmac_priv->tx_chan_info->tx_int_disable) != 0)
-+ {
-+ errPrint(" CPMAC registers can't be written \n");
-+ ret_val = -1;
-+ }
-+ else
-+ {
-+ ; // Every thing went OK.
-+ }
-+
-+ return(ret_val);
-+} /* cpmac_dev_enable */
-+
-+
-+static int cpmac_dev_open(struct net_device *p_dev)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
-+
-+ if(!g_init_enable_flag)
-+ cpmac_p_dev_enable(p_dev);
-+
-+ if(request_irq(p_isr_cb_param->intr, cpmac_hal_isr, SA_INTERRUPT,
-+ "Cpmac Driver", p_isr_cb_param))
-+ {
-+ errPrint("Failed to register the irq %d for Cpmac %s.\n",
-+ p_isr_cb_param->intr, p_dev->name);
-+ return (-1);
-+ }
-+
-+ netif_start_queue(p_dev);
-+
-+ MOD_INC_USE_COUNT;
-+ p_cpmac_priv->stats->start_tick = jiffies;
-+ dbgPrint("Started the network queue for %s.\n", p_dev->name);
-+ return(0);
-+}
-+
-+/***************************************************************
-+ * cpmac_p_dev_disable
-+ *
-+ * Returns:
-+ * An error code.
-+ * Parms:
-+ * dev The device structure of the device to
-+ * close.
-+ *
-+ * This function shuts down the adapter.
-+ *
-+ **************************************************************/
-+int cpmac_p_dev_disable(struct net_device *p_dev)
-+{
-+ int ret_val = 0;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+
-+ set_bit(0, &p_cpmac_priv->set_to_close);
-+ set_bit(0, &p_cpmac_priv->non_data_irq_expected);
-+
-+ /* The driver does not re-schedule the tasklet after kill is called. So, this
-+ should take care of the bug in the kernel. */
-+ tasklet_kill(&p_cpmac_priv->cpmac_isr.tasklet);
-+
-+ if(cpmac_drv_stop(p_drv_hal, p_cpmac_priv->tx_chan_info,
-+ p_cpmac_priv->rx_chan_info,
-+ CHAN_TEARDOWN | FREE_BUFFER | BLOCKING | COMPLETE) == -1)
-+ {
-+ ret_val = -1;
-+ }
-+ else
-+ {
-+ /* hope that the HAL closes down the tick timer.*/
-+
-+ dbgPrint("Device %s Closed.\n", p_dev->name);
-+ p_cpmac_priv->stats->start_tick = jiffies;
-+
-+ p_cpmac_priv->link_speed = 100000000;
-+ p_cpmac_priv->link_mode = 1;
-+ netif_carrier_off(p_dev);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
-+#endif
-+
-+ clear_bit(0, &p_cpmac_priv->non_data_irq_expected);
-+
-+ }
-+
-+ return (ret_val);
-+
-+} /* cpmac_dev_close */
-+
-+
-+/***************************************************************
-+ * cpmac_dev_close
-+ *
-+ * Returns:
-+ * An error code.
-+ * Parms:
-+ * dev The device structure of the device to
-+ * close.
-+ *
-+ * This function shuts down the adapter.
-+ *
-+ **************************************************************/
-+static int cpmac_dev_close(struct net_device *p_dev)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
-+
-+ /* inform the upper layers. */
-+ netif_stop_queue(p_dev);
-+
-+ if(!g_init_enable_flag)
-+ cpmac_p_dev_disable(p_dev);
-+ else
-+ free_irq(p_isr_cb_param->intr, p_isr_cb_param);
-+
-+ MOD_DEC_USE_COUNT;
-+
-+ return(0);
-+}
-+
-+static void cpmac_dev_mcast_set(struct net_device *p_dev)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ CPMAC_ABILITY_INFO_T *p_capability = p_cpmac_priv->ability_info;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ int val = 1;
-+ int channel = 0;
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ if(netif_carrier_ok(p_dev))
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
-+#endif
-+
-+ if(p_dev->flags & IFF_PROMISC)
-+ {
-+ if(p_capability->promiscous)
-+ {
-+ /* multi mode in the HAL, check this */
-+ val = 0;
-+ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
-+
-+ val = 1;
-+ /* set the promiscous mode in the HAL */
-+ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
-+ p_hal_funcs->Control(p_hal_dev, pszRX_PROM_CH, pszSet, &channel);
-+
-+ dbgPrint("%s set in the Promisc mode.\n", p_dev->name);
-+ }
-+ else
-+ {
-+ errPrint("%s not configured for Promisc mode.\n", p_dev->name);
-+ }
-+ }
-+ else if(p_dev->flags & IFF_ALLMULTI)
-+ {
-+ if(p_capability->all_multi)
-+ {
-+ val = 0;
-+ /* disable the promiscous mode in the HAL */
-+ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, "Clear", &val);
-+
-+ val = 1;
-+ /* set the all multi mode in the HAL */
-+ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, pszSet, &val);
-+ p_hal_funcs->Control(p_hal_dev, pszRX_MULT_CH, pszSet, &channel);
-+
-+ dbgPrint("%s has been set to the ALL_MULTI mode.\n", p_dev->name);
-+ }
-+ else
-+ {
-+ errPrint("%s not configured for ALL MULTI mode.\n", p_dev->name);
-+ }
-+ }
-+ else if(p_dev->mc_count)
-+ {
-+ if(p_capability->multicast)
-+ {
-+ struct dev_mc_list *p_dmi = p_dev->mc_list;
-+ int count;
-+
-+ val = 0;
-+ /* clear all the previous data, we are going to populate new ones.*/
-+ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
-+ /* disable the promiscous mode in the HAL */
-+ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
-+
-+ for(count = 0; count < p_dev->mc_count; count++, p_dmi = p_dmi->next)
-+ {
-+ p_hal_funcs->Control(p_hal_dev, "RX_MULTI_SINGLE", "Set", p_dmi->dmi_addr);
-+ }
-+
-+ dbgPrint("%s configured for %d multicast addresses.\n", p_dev->name, p_dev->mc_count);
-+ }
-+ else
-+ {
-+ errPrint("%s has not been configuted for multicast handling.\n", p_dev->name);
-+ }
-+ }
-+ else
-+ {
-+ val = 0;
-+ /* clear all the previous data, we are going to populate new ones.*/
-+ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
-+ /* disable the promiscous mode in the HAL */
-+ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
-+ dbgPrint("Dev set to Unicast mode.\n");
-+ }
-+}
-+
-+static int cpmac_dev_set_mac_addr(struct net_device *p_dev,void * addr)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ struct sockaddr *sa = addr;
-+
-+ memcpy(p_cpmac_priv->mac_addr,sa->sa_data,p_dev->addr_len);
-+ memcpy(p_dev->dev_addr,sa->sa_data,p_dev->addr_len);
-+ p_hal_funcs->Control(p_hal_dev, pszMacAddr, pszSet, p_cpmac_priv->mac_addr);
-+
-+ return 0;
-+
-+}
-+
-+/* VLAN is handled by vlan/vconfig support. Here, we just check for the
-+ * 802.1q configuration of the device and en-queue the packet accordingly.
-+ * We do not do any 802.1q processing here.
-+ */
-+static int cpmac_dev_tx( struct sk_buff *skb, struct net_device *p_dev)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ int channel = 0;
-+ int ret_val = 0;
-+ FRAGLIST send_frag_list[1];
-+
-+#ifdef CPMAC_8021Q_SUPPORT
-+ if(skb->len < TCI_END_OFFSET)
-+ {
-+ /* Whee, frame shorter than 14 bytes !! We need to copy
-+ * fragments to understand the frame. Too much work.
-+ * Hmm, dump it. */
-+
-+ /* Free the buffer */
-+ goto cpmac_dev_tx_drop_pkt;
-+ }
-+
-+ /* 802.1p/q stuff */
-+ if(IS_802_1Q_FRAME(skb->data + TPID_START_OFFSET))
-+ {
-+ /* IEEE 802.1q, section 8.8 and section 8.11.9 */
-+ if(!p_cpmac_priv->enable_802_1q)
-+ {
-+ /* free the buffer */
-+ goto cpmac_dev_tx_drop_pkt;
-+ }
-+
-+ channel = GET_802_1P_CHAN(p_cpmac_priv->tx_chan_info->opened_chan,
-+ skb->data[TCI_START_OFFSET]);
-+
-+ }
-+ /* sending a non 802.1q frame, when configured for 802.1q: dump it.*/
-+ else if(p_cpmac_priv->enable_802_1q)
-+ {
-+ /* free the buffer */
-+ goto cpmac_dev_tx_drop_pkt;
-+ }
-+ else
-+ {
-+ ;/* it is the good old non 802.1q */
-+ }
-+#endif
-+
-+ send_frag_list->len = skb->len;
-+ send_frag_list->data = skb->data;
-+
-+#ifdef CPMAC_TEST
-+ xdump(skb->data, skb->len, "send");
-+#endif
-+
-+ dma_cache_wback_inv((unsigned long)skb->data, skb->len);
-+
-+ if(p_drv_hal->hal_funcs->Send(p_drv_hal->hal_dev, send_frag_list, 1,
-+ skb->len, skb, channel) != 0)
-+ {
-+ /* code here to stop the queue, when allowing tx timeout, perhaps next release.*/
-+ p_cpmac_priv->net_dev_stats.tx_errors++;
-+#ifndef TI_SLOW_PATH
-+ /* Free the skb in case of Send return error */
-+ dev_kfree_skb_any(skb);
-+ p_cpmac_priv->net_dev_stats.tx_dropped++;
-+ return 0;
-+#endif
-+ goto cpmac_dev_tx_drop_pkt;
-+ }
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_TX_ACTIVITY);
-+#endif
-+
-+ return(ret_val);
-+
-+cpmac_dev_tx_drop_pkt:
-+
-+ p_cpmac_priv->net_dev_stats.tx_dropped++;
-+ ret_val = -1;
-+ return (ret_val);
-+
-+} /*cpmac_dev_tx */
-+
-+
-+//------------------------------------------------------------------------------
-+// Public functions : Called by outsiders to this file.
-+//------------------------------------------------------------------------------
-+
-+
-+void *cpmac_hal_malloc_buffer(unsigned int size, void* mem_base, unsigned int mem_range,
-+ OS_SETUP *p_os_setup, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **osReceiveInfo, OS_DEVICE *p_dev)
-+{
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = (CPMAC_RX_CHAN_INFO_T *)p_os_setup;
-+ int tot_buf_size = p_rx_chan_info->chan->tot_buf_size;
-+ int tot_reserve_bytes = p_rx_chan_info->chan->tot_reserve_bytes;
-+ struct sk_buff *p_skb;
-+ void *ret_ptr;
-+
-+ /* use TI SKB private pool */
-+ p_skb = dev_alloc_skb(tot_buf_size);
-+
-+ if(p_skb == NULL)
-+ {
-+ errPrint("Failed to allocate skb for %s.\n", ((struct net_device*)p_dev)->name);
-+ return (NULL);
-+ }
-+
-+ p_skb->dev = p_dev;
-+ skb_reserve(p_skb, tot_reserve_bytes);
-+
-+ *osReceiveInfo = p_skb;
-+
-+ ret_ptr = skb_put(p_skb, p_rx_chan_info->chan->buffer_size);
-+
-+ return(ret_ptr);
-+}
-+
-+void cpmac_hal_isr(int irq, void *p_param, struct pt_regs *regs)
-+{
-+ CPMAC_ISR_INFO_T *p_cb_param = (CPMAC_ISR_INFO_T*) p_param;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cb_param->owner;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_drv_hal->owner;
-+ int pkts_to_handle = 0;
-+
-+ if(p_cpmac_priv->non_data_irq_expected)
-+ {
-+ p_cb_param->hal_isr(p_drv_hal->hal_dev, &pkts_to_handle);
-+ p_drv_hal->hal_funcs->PacketProcessEnd(p_drv_hal->hal_dev);
-+ }
-+ else if(!p_cpmac_priv->set_to_close)
-+ tasklet_schedule(&((CPMAC_ISR_INFO_T*) p_param)->tasklet);
-+ else
-+ ; // back off from doing anything more. We are closing down.
-+}
-+
-+void cpmac_handle_tasklet(unsigned long data)
-+{
-+ CPMAC_ISR_INFO_T *p_cb_param = (CPMAC_ISR_INFO_T*) data;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cb_param->owner;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_drv_hal->owner;
-+ int pkts_to_handle;
-+
-+ p_cb_param->hal_isr(p_drv_hal->hal_dev, &pkts_to_handle);
-+
-+ if(test_bit(0, &p_cpmac_priv->non_data_irq_expected) || !pkts_to_handle)
-+ p_drv_hal->hal_funcs->PacketProcessEnd(p_drv_hal->hal_dev);
-+ else if(!test_bit(0, &p_cpmac_priv->set_to_close))
-+ tasklet_schedule(&p_cb_param->tasklet);
-+ else
-+ ; // Back off from processing packets we are closing down.
-+}
-+
-+int cpmac_hal_control(OS_DEVICE *p_dev, const char *key,
-+ const char *action, void *value)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ int ret_val = -1;
-+
-+ if(key == NULL)
-+ {
-+ dbgPrint("Encountered NULL key.\n");
-+ return (-1);
-+ }
-+
-+ if(cpmac_ci_strcmp(key, "Sleep") == 0 && value != NULL)
-+ {
-+ unsigned int clocks_per_tick = cpmac_cpu_freq/HZ;
-+ unsigned int requested_clocks = *(unsigned int*)value;
-+ unsigned int requested_ticks = (requested_clocks + clocks_per_tick - 1)/clocks_per_tick;
-+ mdelay(requested_ticks);
-+ ret_val = 0;
-+ }
-+ else if(cpmac_ci_strcmp(key, "StateChange") == 0)
-+ {
-+ ret_val = cpmac_p_process_status_ind(p_cpmac_priv);
-+ }
-+ else if(cpmac_ci_strcmp(key, "Tick") == 0 && action != NULL)
-+ {
-+ if(cpmac_ci_strcmp(action, "Set") == 0 && value != NULL)
-+ {
-+ if(*(unsigned int*)value == 0)
-+ {
-+ cpmac_p_stop_timer(p_cpmac_priv->timer + TICK_TIMER);
-+ ret_val = 0;
-+ }
-+ else
-+ {
-+ unsigned int clocks_per_tick = cpmac_cpu_freq/HZ;
-+ unsigned int requested_clocks = *(unsigned int*)value;
-+ unsigned int requested_ticks = (requested_clocks + clocks_per_tick - 1)/clocks_per_tick;
-+
-+ p_cpmac_priv->delay_ticks = requested_ticks; /* save it for re-triggering */
-+ ret_val = cpmac_p_start_timer(p_cpmac_priv->timer + TICK_TIMER,
-+ p_cpmac_priv->delay_ticks);
-+ }
-+ }
-+ else if(cpmac_ci_strcmp(action, "Clear") == 0)
-+ {
-+ ret_val = cpmac_p_stop_timer(p_cpmac_priv->timer + TICK_TIMER);
-+ }
-+ else
-+ ;
-+ }
-+ else if(cpmac_ci_strcmp(key, "MacAddr") == 0 && action != NULL)
-+ {
-+ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
-+ {
-+ *(char **)value = p_cpmac_priv->mac_addr;
-+ ret_val = 0;
-+ }
-+ }
-+ else if(cpmac_ci_strcmp(key, "CpuFreq") == 0)
-+ {
-+ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
-+ {
-+ *(unsigned int *)value = cpmac_cpu_freq;
-+ dbgPrint("Cpu frequency for cpmacs is %u\n",cpmac_cpu_freq);
-+ ret_val = 0;
-+ }
-+ }
-+ else if(cpmac_ci_strcmp(key, "SioFlush") == 0)
-+ {
-+ ret_val = 0;
-+ dbgPrint("\n");
-+ }
-+ else if(cpmac_ci_strcmp(key, "CpmacFrequency") == 0)
-+ {
-+ /* For Sangam cpmac clock is off the PBUS */
-+ /* OS Needs to supply CORRECT frequency */
-+ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
-+ {
-+ *(unsigned int *)value = CONFIG_AR7_SYS_FREQUENCY * 1000 * 1000;
-+ ret_val = 0;
-+ }
-+ }
-+ /* For now, providing back the default values. */
-+ else if(cpmac_ci_strcmp(key, "MdioClockFrequency") == 0)
-+ {
-+ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
-+ {
-+ *(unsigned int *)value = 2200000; /*DEFAULT */
-+ ret_val = 0;
-+ }
-+ }
-+ /* For now, providing back the default values. */
-+ else if(cpmac_ci_strcmp(key, "MdioBusFrequency") == 0)
-+ {
-+ /* For Sangam MdioBusFreq is off the PBUS */
-+ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
-+ {
-+ *(unsigned int *)value = CONFIG_AR7_SYS_FREQUENCY * 1000 * 1000;
-+ ret_val = 0;
-+ }
-+ }
-+
-+#if 0
-+#if defined(CONFIG_AVALANCHE_AUTO_MDIX)
-+ /* supporting Mdio Mdix switching */
-+ else if(cpmac_ci_strcmp(key, hcMdioMdixSwitch) == 0)
-+ {
-+ /* For Sangam Mdio-switching action should be always "set"*/
-+ if(cpmac_ci_strcmp(action, hcSet) == 0 && value != NULL )
-+ {
-+ unsigned int mdix = *((unsigned int *) value) ;
-+
-+ if(mdix)
-+ avalanche_set_phy_into_mdix_mode();
-+
-+ else
-+ avalanche_set_phy_into_mdi_mode();
-+
-+ ret_val = 0;
-+ }
-+
-+ }
-+#endif
-+#endif
-+ else if(cpmac_ci_strcmp(key, hcMdioMdixSwitch) == 0)
-+ {
-+ /* For Sangam Mdio-switching action should be always "set"*/
-+ if(cpmac_ci_strcmp(action, hcSet) == 0 && value != NULL )
-+ {
-+ unsigned int mdix = *((unsigned int *) value) ;
-+
-+#ifdef CONFIG_AR7_MDIX
-+ avalanche_set_mdix_on_chip(0xa8610000 , mdix ? 1: 0);
-+#endif
-+
-+ ret_val = 0;
-+ }
-+
-+ }
-+
-+ return(ret_val);
-+}
-+
-+
-+int cpmac_hal_receive(OS_DEVICE *p_dev, FRAGLIST *fragList,
-+ unsigned int fragCount,
-+ unsigned int packet_size,
-+ HAL_RECEIVEINFO *hal_receive_info,
-+ unsigned int mode)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ struct sk_buff *p_skb = fragList[0].OsInfo;
-+ p_skb->len = fragList[0].len;
-+
-+ /* invalidate the cache. */
-+ dma_cache_inv((unsigned long)p_skb->data, fragList[0].len);
-+#ifdef CPMAC_TEST
-+ xdump(p_skb->data, p_skb->len, "recv");
-+#endif
-+#ifdef CPMAC_8021Q_SUPPORT
-+ /* 802.1q stuff, just does the basic checking here. */
-+ if(!p_cpmac_priv->enable_802_1q &&
-+ p_skb->len > TCI_END_OFFSET &&
-+ IS_802_1Q_FRAME(p_skb->data + TPID_START_OFFSET))
-+ {
-+ goto cpmac_hal_recv_frame_mismatch;
-+ }
-+#endif
-+ if(fragCount > 1)
-+ {
-+ int len;
-+ struct sk_buff *p_temp_skb;
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
-+ int count;
-+
-+ dbgPrint("Recv: It is multifragment for %s.\n", p_dev->name);
-+
-+ p_skb = dev_alloc_skb(packet_size +
-+ p_rx_chan_info->chan->tot_reserve_bytes);
-+ if(p_skb == NULL)
-+ {
-+ p_cpmac_priv->net_dev_stats.rx_errors++;
-+ goto cpmac_hal_recv_alloc_failed;
-+ }
-+
-+ p_skb->dev = p_dev;
-+ skb_reserve(p_skb, p_rx_chan_info->chan->tot_reserve_bytes);
-+
-+ for(count = 0; count < fragCount; count++)
-+ {
-+ p_temp_skb = fragList[count].OsInfo;
-+ len = fragList[count].len;
-+
-+ dma_cache_inv((unsigned long)p_temp_skb->data, len);
-+
-+ memcpy(skb_put(p_skb, len), p_temp_skb->data, len);
-+ dev_kfree_skb_any(p_temp_skb);
-+ }
-+ }
-+
-+
-+#if defined(CONFIG_MIPS_AVALANCHE_MARVELL)
-+ /* Fetch the receiving port information from EGRESS TRAILOR Bytes*/
-+ p_dev->if_port = (unsigned char)p_skb->data[packet_size -(EGRESS_TRAILOR_LEN-1)] + AVALANCHE_MARVELL_BASE_PORT_ID;
-+ skb_trim(p_skb, packet_size - EGRESS_TRAILOR_LEN);
-+#else
-+ /* set length & tail */
-+ skb_trim(p_skb, packet_size);
-+#endif
-+
-+#ifndef TI_SLOW_PATH
-+ /* TI Optimization: This is NOT required if the ethernet resides below the bridge. But is
-+ * required only if the ethernet is directly connected to the IP stack. */
-+ if (p_dev->br_port == NULL)
-+#endif
-+ p_skb->protocol = eth_type_trans(p_skb, p_dev);
-+
-+ netif_rx(p_skb);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_RX_ACTIVITY);
-+#endif
-+
-+ p_cpmac_priv->net_dev_stats.rx_packets++;
-+ p_cpmac_priv->net_dev_stats.rx_bytes += packet_size;
-+
-+ p_drv_hal->hal_funcs->RxReturn(hal_receive_info,1);
-+
-+ return(0);
-+
-+cpmac_hal_recv_alloc_failed:
-+
-+#ifdef CPMAC_8021Q_SUPPORT
-+cpmac_hal_recv_frame_mismatch:
-+#endif
-+
-+ fragCount--;
-+
-+ do
-+ {
-+ dev_kfree_skb_any(fragList[fragCount].OsInfo);
-+ }
-+ while(fragCount--);
-+
-+ p_cpmac_priv->net_dev_stats.rx_dropped++;
-+
-+ return(-1);
-+} /*cpmac_receive*/
-+
-+
-+void cpmac_hal_tear_down_complete(OS_DEVICE*a, int b, int ch)
-+{
-+ dbgPrint("what to do with this.\n");
-+}
-+
-+
-+int cpmac_hal_send_complete(OS_SENDINFO *p_skb)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_skb->dev->priv;
-+
-+ p_cpmac_priv->net_dev_stats.tx_packets++;
-+ p_cpmac_priv->net_dev_stats.tx_bytes += p_skb->len;
-+
-+ dev_kfree_skb_any(p_skb);
-+
-+ return(0);
-+}
-+
-+
-+int cpmac_reset(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
-+{
-+ // code here to reset the device/hal. Not now.
-+
-+ netif_wake_queue(p_cpmac_priv->owner);
-+ return(0);
-+}
-+
-+#ifdef CPMAC_TEST
-+
-+#define isprint(a) ((a >=' ')&&(a<= '~'))
-+void xdump( u_char* cp, int length, char* prefix )
-+{
-+ int col, count;
-+ u_char prntBuf[120];
-+ u_char* pBuf = prntBuf;
-+ count = 0;
-+ while(count < length){
-+ pBuf += sprintf( pBuf, "%s", prefix );
-+ for(col = 0;count + col < length && col < 16; col++){
-+ if (col != 0 && (col % 4) == 0)
-+ pBuf += sprintf( pBuf, " " );
-+ pBuf += sprintf( pBuf, "%02X ", cp[count + col] );
-+ }
-+ while(col++ < 16){ /* pad end of buffer with blanks */
-+ if ((col % 4) == 0)
-+ sprintf( pBuf, " " );
-+ pBuf += sprintf( pBuf, " " );
-+ }
-+ pBuf += sprintf( pBuf, " " );
-+ for(col = 0;count + col < length && col < 16; col++){
-+ if (isprint((int)cp[count + col]))
-+ pBuf += sprintf( pBuf, "%c", cp[count + col] );
-+ else
-+ pBuf += sprintf( pBuf, "." );
-+ }
-+ sprintf( pBuf, "\n" );
-+ // SPrint(prntBuf);
-+ printk(prntBuf);
-+ count += col;
-+ pBuf = prntBuf;
-+ }
-+
-+} /* close xdump(... */
-+#endif
-+
-+
-+static int __init cpmac_dev_probe(void)
-+{
-+ int retVal = 0;
-+ int unit;
-+ int instance_count = CONFIG_MIPS_CPMAC_PORTS;
-+
-+ //cpmac_cpu_freq = avalanche_clkc_get_freq(CLKC_MIPS);
-+ cpmac_cpu_freq = CONFIG_AR7_CPU_FREQUENCY * 1000 * 1000;
-+
-+ build_psp_config();
-+
-+ for(unit = 0; unit < instance_count; unit++)
-+ {
-+ struct net_device *p_dev;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
-+ size_t dev_size;
-+ int failed;
-+
-+ dev_size = sizeof(struct net_device)
-+ + sizeof(CPMAC_PRIVATE_INFO_T);
-+
-+
-+ if((p_dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL)) == NULL)
-+ {
-+ dbgPrint( "Could not allocate memory for device.\n" );
-+ retVal = -ENOMEM;
-+ break;
-+ }
-+
-+ memset(p_dev, 0, dev_size );
-+
-+ p_dev->priv = p_cpmac_priv
-+ = (CPMAC_PRIVATE_INFO_T*)(((char *) p_dev) + sizeof(struct net_device));
-+ p_cpmac_priv->owner = p_dev;
-+
-+ ether_setup(p_dev);
-+
-+ p_cpmac_priv->instance_num = unit;
-+ p_dev->init = cpmac_dev_init;
-+
-+ g_dev_array[p_cpmac_priv->instance_num] = p_dev;
-+
-+#if defined CONFIG_MIPS_CPMAC_INIT_BUF_MALLOC
-+ g_init_enable_flag = 1;
-+ printk("Cpmac driver is allocating buffer memory at init time.\n");
-+#endif
-+
-+ /* This section gives a default value by the number of PHY in order to
-+ * replace the default MACRO. */
-+ {
-+ char *mac_port = prom_getenv("MAC_PORT"); /* Internal: 0, External: 1 */
-+ if(!mac_port || (0 != strcmp(mac_port, "0"))) {
-+ printk("Using the MAC with external PHY\n");
-+ cfg_start_link_speed = _CPMDIO_NOPHY;
-+ cpmac_max_frame_size = CPMAC_MAX_FRAME_SIZE + 4;
-+ }
-+ else {
-+ printk("Using the MAC with internal PHY\n");
-+ cfg_start_link_speed = CFG_START_LINK_SPEED;
-+ cpmac_max_frame_size = CPMAC_MAX_FRAME_SIZE;
-+ }
-+ g_cfg_start_link_params = cfg_start_link_speed;
-+ }
-+
-+ cpmac_p_detect_manual_cfg(cfg_link_speed, cfg_link_mode, cpmac_debug_mode);
-+
-+ failed = register_netdev(p_dev);
-+ if (failed)
-+ {
-+ dbgPrint("Could not register device for inst %d because of reason \
-+ code %d.\n", unit, failed);
-+ retVal = -1;
-+ kfree(p_dev);
-+ break;
-+ }
-+ else
-+ {
-+
-+ char proc_name[100];
-+ int proc_category_name_len = 0;
-+
-+ p_cpmac_priv->next_device = last_cpmac_device;
-+ last_cpmac_device = p_dev;
-+
-+ dbgPrint(" %s irq=%2d io=%04x\n",p_dev->name, (int) p_dev->irq,
-+ (int) p_dev->base_addr);
-+
-+ strcpy(proc_name, "avalanche/");
-+ strcat(proc_name, p_dev->name);
-+ proc_category_name_len = strlen(proc_name);
-+
-+ strcpy(proc_name + proc_category_name_len, "_rfc2665_stats");
-+ create_proc_read_entry(proc_name,0,NULL,cpmac_p_read_rfc2665_stats, p_dev);
-+
-+ }
-+ }
-+
-+ if(retVal == 0)
-+ {
-+ /* To maintain backward compatibility with NSP. */
-+ gp_stats_file = create_proc_entry("avalanche/cpmac_stats", 0644, NULL);
-+ if(gp_stats_file)
-+ {
-+ gp_stats_file->read_proc = cpmac_p_read_stats;
-+ gp_stats_file->write_proc = cpmac_p_write_stats;
-+ }
-+ create_proc_read_entry("avalanche/cpmac_link", 0, NULL, cpmac_p_read_link, NULL);
-+ create_proc_read_entry("avalanche/cpmac_ver", 0, NULL, cpmac_p_get_version, NULL);
-+
-+ }
-+
-+ cpmac_devices_installed = unit;
-+ dbgPrint("Installed %d cpmac instances.\n", unit);
-+ return ( (unit >= 0 ) ? 0 : -ENODEV );
-+
-+} /* init_module */
-+
-+
-+/***************************************************************
-+ * cleanup_module
-+ *
-+ * Returns:
-+ * Nothing
-+ * Parms:
-+ * None
-+ *
-+ * Goes through the CpmacDevices list and frees the device
-+ * structs and memory associated with each device (lists
-+ * and buffers). It also ureserves the IO port regions
-+ * associated with this device.
-+ *
-+ **************************************************************/
-+
-+void cpmac_exit(void)
-+{
-+ struct net_device *p_dev;
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
-+
-+ while (cpmac_devices_installed)
-+ {
-+ char proc_name[100];
-+ int proc_category_name_len = 0;
-+
-+ p_dev = last_cpmac_device;
-+ p_cpmac_priv = (CPMAC_PRIVATE_INFO_T *) p_dev->priv;
-+
-+ dbgPrint("Unloading %s irq=%2d io=%04x\n",p_dev->name, (int) p_dev->irq, (int) p_dev->base_addr);
-+
-+ if(g_init_enable_flag)
-+ cpmac_p_dev_disable(p_dev);
-+
-+ cpmac_drv_cleanup(p_cpmac_priv->drv_hal);
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_LED)
-+ avalanche_led_unregister(p_cpmac_priv->led_handle);
-+#endif
-+ strcpy(proc_name, "avalanche/");
-+ strcat(proc_name, p_dev->name);
-+ proc_category_name_len = strlen(proc_name);
-+
-+ strcpy(proc_name + proc_category_name_len, "_rfc2665_stats");
-+ remove_proc_entry(proc_name, NULL);
-+
-+ release_mem_region(p_dev->base_addr, p_cpmac_priv->dev_size);
-+ unregister_netdev(p_dev);
-+ last_cpmac_device = p_cpmac_priv->next_device;
-+
-+ kfree(p_cpmac_priv->drv_hal);
-+ kfree(p_dev);
-+
-+ cpmac_devices_installed--;
-+ }
-+
-+ if(gp_stats_file)
-+ remove_proc_entry("avalanche/cpmac_stats", NULL);
-+
-+ remove_proc_entry("avalanche/cpmac_link", NULL);
-+ remove_proc_entry("avalanche/cpmac_ver", NULL);
-+
-+ psp_config_cleanup();
-+}
-+
-+
-+module_init(cpmac_dev_probe);
-+module_exit(cpmac_exit);
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpmac.h
---- linux.old/drivers/net/avalanche_cpmac/cpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmac.h 2005-07-10 03:22:40.511160000 +0200
-@@ -0,0 +1,379 @@
-+/******************************************************************************
-+ * FILE PURPOSE: CPMAC Linux Network Device Driver Header
-+ ******************************************************************************
-+ * FILE NAME: cpmac.h
-+ *
-+ * DESCRIPTION: CPMAC Network Device Driver Header
-+ *
-+ * REVISION HISTORY:
-+ * Date Name Details
-+ *-----------------------------------------------------------------------------
-+ * 27 Nov 2002 Suraj S Iyer Initial Create.
-+ * 09 Jun 2003 Suraj S Iyer Preparing for GA.
-+ *
-+ * (C) Copyright 2003, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef CPMAC_H
-+#define CPMAC_H
-+
-+#include <linux/timer.h>
-+#include <linux/netdevice.h>
-+#include <asm/semaphore.h>
-+#include <linux/ctype.h>
-+#include <linux/interrupt.h>
-+
-+#include "cpmacHalLx.h"
-+/*-----------------------------------------------------------------------------
-+ * Config macros. Use these to config the driver.
-+ *---------------------------------------------------------------------------*/
-+#define CPMAC_MAX_FRAME_SIZE 1518
-+
-+#if defined(CONFIG_AR7WRD) || defined(CONFIG_AR7WI) || defined(CONFIG_AR7VWI)|| defined(CONFIG_AR7VW)
-+#define CFG_RX_NUM_BUF_DESC 64
-+#define CFG_RX_NUM_BUF_SERVICE 32
-+#else
-+#define CFG_RX_NUM_BUF_DESC 16
-+#define CFG_RX_NUM_BUF_SERVICE 8
-+#endif
-+
-+#define CFG_RX_BUF_OFFSET 0
-+
-+#define CFG_TX_NUM_BUF_DESC 128
-+#define CFG_TX_NUM_BUF_SERVICE 20
-+#define CFG_TX_BUF_OFFSET 0 /* Lets not change this. */
-+#define CFG_TX_TIMEOUT 2000 /* ticks*/
-+#define CFG_TX_INT_DISABLE 1 /* Disable the Tx Complete interrupt */
-+
-+#define CFG_JUMBO_FRAMES 1
-+#define CFG_SHORT_FRAMES 1
-+#define CFG_PROMISCOUS 1
-+#define CFG_BROADCAST 1
-+#define CFG_MULTICAST 1
-+#define CFG_ALL_MULTI (1*(CFG_MULTICAST))
-+#define CFG_AUTO_NEGOTIATION 1
-+
-+#if defined (CONFIG_MIPS_AVALANCHE_MARVELL)
-+#define EGRESS_TRAILOR_LEN 4
-+#define CFG_START_LINK_SPEED (_CPMDIO_NOPHY)
-+#undef CPMAC_MAX_FRAME_SIZE
-+#define CPMAC_MAX_FRAME_SIZE (1518 + EGRESS_TRAILOR_LEN)
-+#else
-+#define CFG_START_LINK_SPEED (_CPMDIO_10 | _CPMDIO_100 | _CPMDIO_HD | _CPMDIO_FD) /* auto nego */
-+#endif
-+
-+#define CFG_LOOP_BACK 1
-+#define CFG_TX_FLOW_CNTL 0
-+#define CFG_RX_FLOW_CNTL 0
-+#define CFG_TX_PACING 0
-+#define CFG_RX_PASS_CRC 0
-+#define CFG_QOS_802_1Q 0
-+#define CFG_TX_NUM_CHAN 1
-+
-+
-+/*-----------------------------------------------------------------------------
-+ * Private macros.
-+ *---------------------------------------------------------------------------*/
-+#define MAX_TIMER 2
-+#define TX_TIMER 0
-+#define TICK_TIMER 0
-+#define MAX_TX_CHAN 8
-+
-+#define CPMAC_LINK_OFF 0
-+#define CPMAC_LINK_ON 1
-+/*#define CPMAC_SPEED_100 2
-+#define CPMAC_SPEED_10 3
-+#define CPMAC_FULL_DPLX 4
-+#define CPMAC_HALF_DPLX 5*/
-+#define CPMAC_RX_ACTIVITY 2
-+#define CPMAC_TX_ACTIVITY 3
-+
-+struct cpmac_timer_info;
-+
-+typedef int (*CPMAC_HAL_ISR_FUNC_T)(HAL_DEVICE*, int*);
-+typedef int (*CPMAC_TIMEOUT_CB_T)(struct cpmac_timer_info*);
-+
-+typedef struct cpmac_ability_info
-+{
-+ int promiscous;
-+ int broadcast;
-+ int multicast;
-+ int all_multi;
-+ int loop_back;
-+ int jumbo_frames;
-+ int short_frames;
-+ int auto_negotiation;
-+ int tx_flow_control;
-+ int rx_flow_control;
-+ int tx_pacing;
-+ int link_speed;
-+ int rx_pass_crc;
-+ int qos_802_1q;
-+ int tx_num_chan;
-+}
-+CPMAC_ABILITY_INFO_T;
-+
-+#ifdef DEBUG
-+typedef struct cpmac_timer_info
-+{
-+ void *owner;
-+ UINT32 delay_ticks;
-+ WDOG_ID timer_id;
-+ UINT32 is_running;
-+ UINT32 timer_set_at;
-+ CPMAC_TIMEOUT_CB_T timeout_CB;
-+} CPMAC_TIMER_INFO_T;
-+
-+typedef struct
-+{
-+ void *owner;
-+ unsigned int num_cl_desc;
-+ CL_DESC *cl_desc_tbl;
-+ M_CL_CONFIG *m_cl_blk_config;
-+ NET_POOL *net_pool;
-+ CL_POOL_ID clPoolId;
-+
-+} CPMAC_NET_MEM_INFO_T;
-+
-+#endif
-+
-+typedef struct
-+{
-+ void *owner;
-+ CPMAC_HAL_ISR_FUNC_T hal_isr;
-+ struct tasklet_struct tasklet;
-+ int intr;
-+
-+} CPMAC_ISR_INFO_T;
-+
-+typedef struct cpmac_chan
-+{
-+ int num_BD;
-+ int buffer_size;
-+ int buffer_offset;
-+ int service_max;
-+ int state;
-+ int tot_buf_size;
-+ int tot_reserve_bytes;
-+
-+} CPMAC_CHAN_T;
-+
-+#define CHAN_CLOSE 0
-+#define CHAN_OPENED 1
-+
-+typedef struct
-+{
-+ int cfg_chan;
-+ int dev_chan;
-+ int opened_chan;
-+ CPMAC_CHAN_T chan[1];
-+ int enable_802_1q;
-+
-+} CPMAC_RX_CHAN_INFO_T;
-+
-+typedef struct
-+{
-+ int cfg_chan;
-+ int dev_chan;
-+ int opened_chan;
-+ int tx_int_disable;
-+ CPMAC_CHAN_T chan[MAX_TX_CHAN];
-+
-+} CPMAC_TX_CHAN_INFO_T;
-+
-+
-+
-+typedef struct
-+{
-+ void *owner;
-+ HAL_FUNCTIONS *hal_funcs;
-+ HAL_DEVICE *hal_dev;
-+ OS_FUNCTIONS *os_funcs;
-+// SEM_ID chan_teardown_sem;
-+ int non_data_irq_expected;
-+} CPMAC_DRV_HAL_INFO_T;
-+
-+
-+typedef struct
-+{
-+ unsigned long tx_discards;
-+ unsigned long rx_discards;
-+ unsigned long start_tick;
-+
-+} CPMAC_DRV_STATS_T;
-+
-+typedef struct
-+{
-+ unsigned long ifInGoodFrames;
-+ unsigned long ifInBroadcasts;
-+ unsigned long ifInMulticasts;
-+ unsigned long ifInPauseFrames;
-+ unsigned long ifInCRCErrors;
-+ unsigned long ifInAlignCodeErrors;
-+ unsigned long ifInOversizedFrames;
-+ unsigned long ifInJabberFrames;
-+ unsigned long ifInUndersizedFrames;
-+ unsigned long ifInFragments;
-+ unsigned long ifInFilteredFrames;
-+ unsigned long ifInQosFilteredFrames;
-+ unsigned long ifInOctets;
-+ unsigned long ifOutGoodFrames;
-+ unsigned long ifOutBroadcasts;
-+ unsigned long ifOutMulticasts;
-+ unsigned long ifOutPauseFrames;
-+ unsigned long ifDeferredTransmissions;
-+ unsigned long ifCollisionFrames;
-+ unsigned long ifSingleCollisionFrames;
-+ unsigned long ifMultipleCollisionFrames;
-+ unsigned long ifExcessiveCollisionFrames;
-+ unsigned long ifLateCollisions;
-+ unsigned long ifOutUnderrun;
-+ unsigned long ifCarrierSenseErrors;
-+ unsigned long ifOutOctets;
-+ unsigned long if64OctetFrames;
-+ unsigned long if65To127OctetFrames;
-+ unsigned long if128To255OctetFrames;
-+ unsigned long if256To511OctetFrames;
-+ unsigned long if512To1023OctetFrames;
-+ unsigned long if1024ToUPOctetFrames;
-+ unsigned long ifNetOctets;
-+ unsigned long ifRxSofOverruns;
-+ unsigned long ifRxMofOverruns;
-+ unsigned long ifRxDMAOverruns;
-+
-+} CPMAC_DEVICE_MIB_T;
-+
-+
-+typedef struct
-+{
-+ void *owner;
-+ int timer_count;
-+ int timer_created;
-+ struct timer_list timer[1];
-+ CPMAC_DRV_HAL_INFO_T *drv_hal;
-+ unsigned int num_of_intr;
-+ CPMAC_ISR_INFO_T cpmac_isr;
-+ unsigned int link_speed;
-+ unsigned int link_mode;
-+ unsigned int enable_802_1q;
-+ unsigned int timer_access_hal;
-+ unsigned int loop_back;
-+ CPMAC_RX_CHAN_INFO_T *rx_chan_info;
-+ CPMAC_TX_CHAN_INFO_T *tx_chan_info;
-+ CPMAC_ABILITY_INFO_T *ability_info;
-+ CPMAC_DEVICE_MIB_T *device_mib;
-+ CPMAC_DRV_STATS_T *stats;
-+ unsigned int flags;
-+ unsigned int delay_ticks;
-+ char mac_addr[6];
-+ struct net_device_stats net_dev_stats;
-+// rwlock_t rw_lock;
-+ int set_to_close;
-+ struct net_device *next_device;
-+ unsigned int instance_num;
-+ unsigned int non_data_irq_expected;
-+ unsigned long dev_size;
-+ void* led_handle;
-+} CPMAC_PRIVATE_INFO_T;
-+
-+
-+/* Private flags */
-+
-+/* bit 0 to 31, bit 32 is used to indicate set or reset */
-+
-+#define IFF_PRIV_SHORT_FRAMES 0x00010000
-+#define IFF_PRIV_JUMBO_FRAMES 0x00020000
-+#define IFF_PRIV_AUTOSPEED 0x00080000
-+#define IFF_PRIV_LINK10_HD 0x00100000
-+#define IFF_PRIV_LINK10_FD 0x00200000
-+#define IFF_PRIV_LINK100_HD 0x00400000
-+#define IFF_PRIV_LINK100_FD 0x00800000
-+#define IFF_PRIV_8021Q_EN 0x01000000
-+#define IFF_PRIV_NUM_TX_CHAN 0x02000000
-+#define IFF_PRIV_TX_FLOW_CNTL 0x04000000
-+#define IFF_PRIV_RX_FLOW_CNTL 0x08000000
-+#define IFF_PRIV_TX_PACING 0x10000000
-+#define IFF_PRIV_RX_PASS_CRC 0x20000000
-+
-+#define PRIVCSFLAGS 0x200
-+#define PRIVCGFLAGS 0x201
-+
-+
-+#define BLOCKING 1
-+#define CHAN_TEARDOWN 2
-+#define CHAN_SETUP 4
-+#define COMPLETE 8
-+#define FREE_BUFFER 16
-+
-+
-+static const char pszStats0[] = "Stats0";
-+static const char pszStats1[] = "Stats1";
-+static const char pszStats2[] = "Stats2";
-+static const char pszStats3[] = "Stats3";
-+static const char pszStats4[] = "Stats4";
-+static const char pszStatsDump[] = "StatsDump";
-+static const char pszStatsClear[] = "StatsClear";
-+static const char pszRX_PASS_CRC[] = "RX_PASS_CRC";
-+static const char pszRX_QOS_EN[] = "RX_QOS_EN";
-+static const char pszRX_NO_CHAIN[] = "RX_NO_CHAIN";
-+static const char pszRX_CMF_EN[] = "RX_CMF_EN";
-+static const char pszRX_CSF_EN[] = "RX_CSF_EN";
-+static const char pszRX_CEF_EN[] = "RX_CEF_EN";
-+static const char pszRX_CAF_EN[] = "RX_CAF_EN";
-+static const char pszRX_PROM_CH[] = "RX_PROM_CH";
-+static const char pszRX_BROAD_EN[] = "RX_BROAD_EN";
-+static const char pszRX_BROAD_CH[] = "RX_BROAD_CH";
-+static const char pszRX_MULT_EN[] = "RX_MULT_EN";
-+static const char pszRX_MULT_CH[] = "RX_MULT_CH";
-+static const char pszTX_PTYPE[] = "TX_PTYPE";
-+static const char pszTX_PACE[] = "TX_PACE";
-+static const char pszMII_EN[] = "MII_EN";
-+static const char pszTX_FLOW_EN[] = "TX_FLOW_EN";
-+static const char pszRX_FLOW_EN[] = "RX_FLOW_EN";
-+static const char pszRX_MAXLEN[] = "RX_MAXLEN";
-+static const char pszRX_FILTERLOWTHRESH[] = "RX_FILTERLOWTHRESH";
-+static const char pszRX0_FLOWTHRESH[] = "RX0_FLOWTHRESH";
-+static const char pszRX_UNICAST_SET[] = "RX_UNICAST_SET";
-+static const char pszRX_UNICAST_CLEAR[] = "RX_UNICAST_CLEAR";
-+static const char pszMdioConnect[] = "MdioConnect";
-+static const char pszMacAddr[] = "MacAddr";
-+static const char pszTick[] = "Tick";
-+static const char pszRX_MULTICAST[] = "RX_MULTICAST";
-+static const char pszRX_MULTI_ALL[] = "RX_MULTI_ALL";
-+static const char pszRX_MULTI_SINGLE[] = "RX_MULTI_SINGLE";
-+
-+static const char pszSet[] = "Set";
-+static const char pszGet[] = "Get";
-+static const char pszClear[] = "Clear";
-+
-+
-+void *cpmac_hal_malloc_buffer(unsigned int size, void *MemBase, unsigned int MemRange,
-+ HAL_DEVICE *HalDev, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
-+
-+void cpmac_hal_tear_down_complete(OS_DEVICE*, int, int);
-+int cpmac_hal_control(OS_DEVICE *p_END_obj, const char *key,
-+ const char *action, void *value);
-+int cpmac_hal_receive(OS_DEVICE *p_END_obj, FRAGLIST *fragList,
-+ unsigned int FragCount, unsigned int pkt_len,
-+ HAL_RECEIVEINFO *halReceiveInfo,
-+ unsigned int mode);
-+int cpmac_hal_send_complete(OS_SENDINFO*);
-+
-+void cpmac_hal_isr(int irq, void *p_param, struct pt_regs *p_cb_param);
-+void cpmac_handle_tasklet(unsigned long data);
-+
-+inline static int cpmac_ci_strcmp(const char *s1, const char *s2)
-+{
-+ while(*s1 && *s2)
-+ {
-+ if(tolower(*s1) != tolower(*s2))
-+ break;
-+ s1++;
-+ s2++;
-+ }
-+
-+ return(tolower(*s1) - tolower(*s2));
-+}
-+
-+#endif
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.c linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.c
---- linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.c 2005-07-10 04:06:50.491302256 +0200
-@@ -0,0 +1,492 @@
-+/******************************************************************************
-+ * FILE PURPOSE: CPMAC Net Driver HAL support Source
-+ ******************************************************************************
-+ * FILE NAME: cpmacHalLx.c
-+ *
-+ * DESCRIPTION: CPMAC Network Device Driver Source
-+ *
-+ * REVISION HISTORY:
-+ *
-+ * Date Description Author
-+ *-----------------------------------------------------------------------------
-+ * 27 Nov 2002 Initial Creation Suraj S Iyer
-+ * 09 Jun 2003 Updates for GA Suraj S Iyer
-+ * 18 Dec 2003 Updated for 5.7 Suraj S Iyer
-+ *
-+ * (C) Copyright 2003, Texas Instruments, Inc
-+ *******************************************************************************/
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/proc_fs.h>
-+#include <asm/io.h>
-+#include <linux/string.h>
-+
-+#include "cpmacHalLx.h"
-+#include "cpmac.h"
-+
-+/* PSP config headers */
-+#include "psp_config_parse.h"
-+#include "psp_config_mgr.h"
-+
-+/* Probe Debug Section*/
-+
-+/* debug */
-+extern int cpmac_debug_mode;
-+#define dbgPrint if (cpmac_debug_mode) printk
-+#define errPrint printk
-+
-+char CpmacSignature[] = "Cpmac driver";
-+static unsigned long irq_flags = 0;
-+OS_SETUP *p_os_setup = NULL;
-+
-+extern int avalanche_request_intr_pacing(int, unsigned int, unsigned int);
-+extern int avalanche_free_intr_pacing(unsigned int blk_num);
-+
-+/*----------------------------------------------------------------------------
-+ * Parameter extracting functionalities.
-+ *--------------------------------------------------------------------------*/
-+static int os_find_parm_u_int(void *info_ptr, const char *param, unsigned int *val)
-+{
-+ int ret_val = 0;
-+
-+ if((ret_val = psp_config_get_param_uint(info_ptr, param, val)) == -1)
-+ {
-+ dbgPrint("Error: could not locate the requested \"%s\" param.\n",param);
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+static int os_find_parm_val(void *info_ptr, const char *param, void *val)
-+{
-+ int ret_val = 0;
-+
-+ if(psp_config_get_param_string(info_ptr, param, val) == -1)
-+ {
-+ dbgPrint("Error: could not locate the requested \"%s\" param.\n",param);
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+static int os_find_device(int unit, const char *find_name, void *device_info)
-+{
-+ int ret_val = 0;
-+
-+ if(psp_config_get((char *)find_name, unit, device_info) == -1)
-+ {
-+ dbgPrint("Error: could not locate the requested \"%s\" param.\n", find_name);
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+/*---------------------------------------------------------------------------
-+ * Memory related OS abstraction.
-+ *--------------------------------------------------------------------------*/
-+void os_free(void *mem_ptr)
-+{
-+ kfree(mem_ptr);
-+}
-+
-+void os_free_buffer(OS_RECEIVEINFO *osReceiveInfo, void *mem_ptr)
-+{
-+ dev_kfree_skb_any(osReceiveInfo);
-+}
-+
-+void os_free_dev(void *mem_ptr)
-+{
-+ kfree(mem_ptr);
-+}
-+
-+void os_free_dma_xfer(void *mem_ptr)
-+{
-+ kfree(mem_ptr);
-+}
-+
-+static void *os_malloc(unsigned int size)
-+{
-+ return(kmalloc(size, GFP_KERNEL));
-+}
-+
-+static void *os_malloc_dma_xfer(unsigned int size,
-+ void *mem_base,
-+ unsigned int mem_range)
-+{
-+ return(kmalloc(size, GFP_KERNEL));
-+}
-+
-+static void *os_malloc_dev(unsigned int size)
-+{
-+ return(kmalloc(size, GFP_KERNEL));
-+}
-+
-+
-+/*----------------------------------------------------------------------------
-+ * CRITICAL SECTION ENABLING/DISABLING.
-+ *--------------------------------------------------------------------------*/
-+static void os_critical_on(void)
-+{
-+ save_and_cli(irq_flags);
-+}
-+
-+static void os_critical_off(void)
-+{
-+ restore_flags(irq_flags);
-+}
-+
-+/*----------------------------------------------------------------------------
-+ * Cache related abstraction
-+ *--------------------------------------------------------------------------*/
-+static void os_cache_invalidate(void *mem_ptr, int size)
-+{
-+ dma_cache_inv((unsigned long)mem_ptr, size);
-+}
-+
-+static void os_cache_writeback(void *mem_ptr, int size)
-+{
-+ dma_cache_wback_inv((unsigned long)mem_ptr, size);
-+}
-+
-+/*-----------------------------------------------------------------------------
-+ * Support functions.
-+ *---------------------------------------------------------------------------*/
-+
-+static void hal_drv_unregister_isr(OS_DEVICE *p_dev, int intr)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
-+ intr = LNXINTNUM(intr);
-+
-+ free_irq(p_isr_cb_param->intr, p_isr_cb_param);
-+
-+ dbgPrint("cpmac_hal_unregister called for the intr %d for unit %x and isr_cb_param %x.\n",
-+ intr, p_cpmac_priv->instance_num, (unsigned int )&p_cpmac_priv->cpmac_isr);
-+}
-+
-+
-+static void hal_drv_register_isr(OS_DEVICE *p_dev,
-+ CPMAC_HAL_ISR_FUNC_T hal_isr, int intr)
-+{
-+ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
-+ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
-+ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
-+ intr = LNXINTNUM(intr);
-+
-+ dbgPrint("osRegister called for the intr %d for device %x and p_isr_cb_param %x.\n",
-+ intr, (bit32u)p_dev, (bit32u)p_isr_cb_param);
-+
-+ p_isr_cb_param->owner = p_drv_hal;
-+ p_isr_cb_param->hal_isr = hal_isr;
-+ p_isr_cb_param->intr = intr;
-+
-+ tasklet_init(&p_isr_cb_param->tasklet, cpmac_handle_tasklet, (unsigned long)p_isr_cb_param);
-+ dbgPrint("Success in registering irq %d for Cpmac unit# %d.\n", intr, p_cpmac_priv->instance_num);
-+}
-+
-+/*---------------------------------------------------------------------------
-+ * FUNCTIONS called by the CPMAC Net Device.
-+ *-------------------------------------------------------------------------*/
-+static int load_os_funcs(OS_FUNCTIONS *os_func)
-+{
-+ dbgPrint("os_init_module: Start\n");
-+ if( os_func == 0 )
-+ {
-+ return(sizeof(OS_FUNCTIONS));
-+ }
-+
-+ os_func->Control = cpmac_hal_control;
-+ os_func->CriticalOn = os_critical_on;
-+ os_func->CriticalOff = os_critical_off;
-+ os_func->DataCacheHitInvalidate = os_cache_invalidate;
-+ os_func->DataCacheHitWriteback = os_cache_writeback;
-+ os_func->DeviceFindInfo = os_find_device;
-+ os_func->DeviceFindParmUint = os_find_parm_u_int;
-+ os_func->DeviceFindParmValue= os_find_parm_val;
-+ os_func->Free = os_free;
-+ os_func->FreeRxBuffer = os_free_buffer;
-+ os_func->FreeDev = os_free_dev;
-+ os_func->FreeDmaXfer = os_free_dma_xfer;
-+ os_func->IsrRegister = hal_drv_register_isr;
-+ os_func->IsrUnRegister = hal_drv_unregister_isr;
-+ os_func->Malloc = os_malloc;
-+ os_func->MallocDev = os_malloc_dev;
-+ os_func->MallocDmaXfer = os_malloc_dma_xfer;
-+ os_func->MallocRxBuffer = cpmac_hal_malloc_buffer;
-+ os_func->Memset = memset;
-+ os_func->Printf = printk;
-+ os_func->Receive = cpmac_hal_receive;
-+ os_func->SendComplete = cpmac_hal_send_complete;
-+ os_func->Strcmpi = cpmac_ci_strcmp;
-+ os_func->TeardownComplete = cpmac_hal_tear_down_complete;
-+ os_func->Strstr = strstr;
-+ os_func->Strtoul = simple_strtol;
-+ os_func->Sprintf = sprintf;
-+ os_func->Strlen = strlen;
-+
-+ dbgPrint("os_init_module: Leave\n");
-+
-+ return(0);
-+}
-+
-+
-+int cpmac_drv_init(CPMAC_DRV_HAL_INFO_T *p_drv_hal)
-+{
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+
-+ return(p_hal_funcs->Init(p_hal_dev));
-+}
-+
-+int cpmac_drv_cleanup(CPMAC_DRV_HAL_INFO_T *p_drv_hal)
-+{
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+
-+ int ret_val = p_hal_funcs->Shutdown(p_hal_dev);
-+
-+#if 0
-+ if(ret_val == 0)
-+ kfree(p_hal_funcs);
-+ else
-+ ret_val = -1;
-+#endif
-+
-+ kfree(p_drv_hal->os_funcs);
-+
-+ return (ret_val);
-+}
-+
-+int cpmac_drv_tx_setup(HAL_FUNCTIONS *p_hal_funcs,
-+ HAL_DEVICE *p_hal_dev,
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info)
-+{
-+ int ret_val = 0;
-+ int count = 0;
-+ CHANNEL_INFO chan_info;
-+
-+ /* Let's setup the TX Channels. */
-+ for(count=0; count < p_tx_chan_info->cfg_chan; count++)
-+ {
-+ chan_info.Channel = count;
-+ chan_info.Direction = DIRECTION_TX;
-+ chan_info.TxNumBuffers = p_tx_chan_info->chan[count].num_BD;
-+ chan_info.TxServiceMax = p_tx_chan_info->chan[count].service_max;
-+ chan_info.TxNumQueues = 0;
-+
-+ if((ret_val = p_hal_funcs->ChannelSetup(p_hal_dev, &chan_info,
-+ NULL)) != 0)
-+ {
-+ errPrint("Error in opening channel %d for TX.\n", count);
-+ ret_val = -1;
-+ break;
-+ }
-+
-+ p_tx_chan_info->opened_chan++;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+int cpmac_drv_rx_setup(HAL_FUNCTIONS *p_hal_funcs,
-+ HAL_DEVICE *p_hal_dev,
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info)
-+{
-+ int ret_val = 0;
-+ CHANNEL_INFO chan_info;
-+
-+ chan_info.Channel = 0;
-+ chan_info.Direction = DIRECTION_RX;
-+ chan_info.RxBufSize = p_rx_chan_info->chan[0].buffer_size;
-+ chan_info.RxBufferOffset= p_rx_chan_info->chan[0].buffer_offset;
-+ chan_info.RxNumBuffers = p_rx_chan_info->chan[0].num_BD;
-+ chan_info.RxServiceMax = p_rx_chan_info->chan[0].service_max;
-+
-+ if(p_hal_funcs->ChannelSetup(p_hal_dev, &chan_info, p_rx_chan_info) != 0)
-+ {
-+ errPrint("Error in opening channel %d for RX.\n", 0);
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+int cpmac_drv_start(CPMAC_DRV_HAL_INFO_T *p_drv_hal,
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,
-+ unsigned int flags)
-+{
-+ int ret_val = 0;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+
-+ dbgPrint("It is in cpmac_drv_start for %x.\n", (unsigned int)p_drv_hal);
-+
-+ if(flags & CHAN_SETUP)
-+ {
-+ if(cpmac_drv_tx_setup(p_hal_funcs, p_hal_dev,
-+ p_tx_chan_info)!=0)
-+ {
-+ errPrint("Failed to set up tx channel(s).\n");
-+ ret_val = -1;
-+ }
-+ else if(cpmac_drv_rx_setup(p_hal_funcs, p_hal_dev,
-+ p_rx_chan_info)!=0)
-+ {
-+ errPrint("Failed to set up rx channel.\n");
-+ ret_val = -1;
-+ }
-+ else
-+ {
-+ ret_val = 0;
-+ }
-+ }
-+
-+ /* Error in setting up the Channels, quit. */
-+ if((ret_val == 0) && (ret_val = p_hal_funcs->Open(p_hal_dev)) != 0)
-+ {
-+ errPrint("failed to open the HAL!!!.\n");
-+ ret_val = -1;
-+ }
-+
-+ return (ret_val);
-+} /* cpmac_drv_start */
-+
-+
-+
-+int cpmac_drv_tx_teardown(HAL_FUNCTIONS *p_hal_funcs,
-+ HAL_DEVICE *p_hal_dev,
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
-+ unsigned int flags)
-+{
-+ int ret_val = 0;
-+ int count = 0;
-+
-+ /* Let's setup the TX Channels. */
-+ for(; p_tx_chan_info->opened_chan > 0;
-+ p_tx_chan_info->opened_chan--, count++)
-+ {
-+ if(p_hal_funcs->ChannelTeardown(p_hal_dev, count, flags) != 0)
-+ {
-+ errPrint("Error in tearing down channel %d for TX.\n", count);
-+ ret_val = -1;
-+ break;
-+ }
-+ }
-+
-+ return(ret_val);
-+}
-+
-+
-+int cpmac_drv_rx_teardown(HAL_FUNCTIONS *p_hal_funcs,
-+ HAL_DEVICE *p_hal_dev,
-+ unsigned int flags)
-+{
-+ int ret_val = 0;
-+
-+ if(p_hal_funcs->ChannelTeardown(p_hal_dev, 0, flags) != 0)
-+ {
-+ errPrint("Error in tearing down channel %d for RX.\n", 0);
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+int cpmac_drv_stop(CPMAC_DRV_HAL_INFO_T *p_drv_hal,
-+ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,
-+ unsigned int flags)
-+{
-+ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
-+ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
-+ int ret_val = 0;
-+
-+ if(flags & CHAN_TEARDOWN)
-+ {
-+ unsigned int chan_flags = 0;
-+
-+ if(flags & FREE_BUFFER) chan_flags |= 0x4; /* full tear down */
-+ if(flags & BLOCKING) chan_flags |= 0x8; /* blocking call */
-+
-+ dbgPrint("The teardown flags are %d.\n", flags);
-+ dbgPrint("The teardown chan flags are %d.\n", chan_flags);
-+
-+ if(cpmac_drv_tx_teardown(p_hal_funcs, p_hal_dev,
-+ p_tx_chan_info, chan_flags | 0x1) != 0)
-+ {
-+ ret_val = -1;
-+ errPrint("The tx channel teardown failed.\n");
-+ }
-+ else if(cpmac_drv_rx_teardown(p_hal_funcs, p_hal_dev, chan_flags | 0x2) != 0)
-+ {
-+ ret_val = -1;
-+ errPrint("The rx channel teardown failed.\n");
-+ }
-+ else
-+ {
-+ ;
-+ }
-+ }
-+
-+ if(ret_val == 0)
-+ {
-+ int close_flags = 1;
-+
-+ if(flags & FREE_BUFFER) close_flags = 2;
-+// if(flags & COMPLETE) close_flags = 3;
-+
-+ if(p_hal_funcs->Close(p_hal_dev, close_flags) != 0)
-+ {
-+ ret_val = -1;
-+ }
-+ }
-+
-+ return(ret_val);
-+}
-+
-+int cpmac_drv_init_module(CPMAC_DRV_HAL_INFO_T *p_drv_hal, OS_DEVICE *p_os_dev, int inst)
-+{
-+ int ret_val = -1;
-+ int hal_func_size;
-+
-+ dbgPrint("Entering the CpmacInitModule for the inst %d \n", inst);
-+
-+ if((p_drv_hal->os_funcs = kmalloc(sizeof(OS_FUNCTIONS), GFP_KERNEL)) == NULL)
-+ {
-+ errPrint("Failed to allocate memory for OS_FUNCTIONS.\n");
-+ }
-+ else if(load_os_funcs(p_drv_hal->os_funcs) != 0)
-+ {
-+ errPrint("Failed to load OS funcs.\n");
-+ os_free(p_drv_hal->os_funcs);
-+ }
-+ else if(halCpmacInitModule(&p_drv_hal->hal_dev, p_os_dev,
-+ &p_drv_hal->hal_funcs, p_drv_hal->os_funcs,
-+ sizeof(*p_drv_hal->os_funcs),
-+ &hal_func_size, inst) != 0)
-+ {
-+ errPrint("halCpmacInitModule failed for inst %d \n", inst);
-+ os_free(p_drv_hal->os_funcs);
-+ }
-+ else if(p_drv_hal->hal_funcs->Probe(p_drv_hal->hal_dev) != 0)
-+ {
-+ errPrint("halCpmacProbe failed for inst %d \n", inst);
-+ os_free(p_drv_hal->os_funcs);
-+ }
-+ else
-+ {
-+ /* every thing went well. */
-+ ret_val = 0;
-+ }
-+
-+ return (ret_val);
-+}
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.h linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.h
---- linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.h 2005-07-10 03:22:40.512160000 +0200
-@@ -0,0 +1,51 @@
-+/******************************************************************************
-+ * FILE PURPOSE: CPMAC Linux Device Driver HAL support Header
-+ ******************************************************************************
-+ * FILE NAME: cpmacHalVx.h
-+ *
-+ * DESCRIPTION: CPMAC Linux Device Driver Header
-+ *
-+ * REVISION HISTORY:
-+ *
-+ * Date Description Author
-+ *-----------------------------------------------------------------------------
-+ * 27 Nov 2002 Initial Creation Suraj S Iyer
-+ * 09 Jun 2003 Updates for GA Suraj S Iyer
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __CPMAC_HAL_LX_H
-+#define __CPMAC_HAL_LX_H
-+
-+
-+typedef struct net_device OS_DEVICE;
-+typedef struct sk_buff OS_RECEIVEINFO;
-+typedef struct sk_buff OS_SENDINFO;
-+
-+#ifdef DEBUG
-+typedef void HAL_RECEIVEINFO;
-+typedef void HAL_DEVICE;
-+typedef void OS_SETUP;
-+#endif
-+
-+#define OS_SETUP void
-+#define HAL_DEVICE void
-+#define HAL_RECEIVEINFO void
-+
-+#define _CPHAL_CPMAC
-+
-+#include "cpswhal_cpmac.h"
-+#include "cpmac.h"
-+
-+int cpmac_drv_start(CPMAC_DRV_HAL_INFO_T *, CPMAC_TX_CHAN_INFO_T*,
-+ CPMAC_RX_CHAN_INFO_T *, unsigned int);
-+int cpmac_drv_cleanup(CPMAC_DRV_HAL_INFO_T *);
-+int cpmac_drv_init(CPMAC_DRV_HAL_INFO_T*);
-+int cpmac_drv_close(CPMAC_DRV_HAL_INFO_T*);
-+int cpmac_drv_open(CPMAC_DRV_HAL_INFO_T*);
-+int cpmac_drv_init_module(CPMAC_DRV_HAL_INFO_T*, OS_DEVICE*, int);
-+int cpmac_drv_stop(CPMAC_DRV_HAL_INFO_T *p_drv_hal,CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
-+ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,unsigned int flags);
-+
-+#endif
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac_reg.h linux.dev/drivers/net/avalanche_cpmac/cpmac_reg.h
---- linux.old/drivers/net/avalanche_cpmac/cpmac_reg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmac_reg.h 2005-07-10 03:22:40.513160000 +0200
-@@ -0,0 +1,406 @@
-+/****************************************************************************
-+ TNETD73xx Software Support
-+ Copyright(c) 2000, Texas Instruments Incorporated. All Rights Reserved.
-+
-+ FILE: cpmac_reg.h Register definitions for the CPMAC module
-+
-+ DESCRIPTION:
-+ This include file contains register definitions for the
-+ CPMAC module.
-+
-+ HISTORY:
-+ 15Nov00 BEGR Original version written
-+ 30May02 MICK Added bits for Int Vector
-+ 19Sep02 MICK Added INT_ACK per Channel
-+ 08Nov02 GDUN Updated to use base
-+ 12Nov02 MICK Incorporated into CPHAL
-+*****************************************************************************/
-+#ifndef _INC_CPMAC_REG
-+#define _INC_CPMAC_REG
-+
-+#ifndef MEM_PTR
-+#define MEM_PTR volatile bit32u *
-+#endif
-+
-+/***************************************************************************
-+ *
-+ * C P M A C M E M O R Y M A P
-+ *
-+ **************************************************************************/
-+
-+#define pCPMAC_TX_IDVER(base) ((MEM_PTR)(base+0x000))
-+#define CPMAC_TX_IDVER(base) (*pCPMAC_TX_IDVER(base))
-+#define pCPMAC_TX_CONTROL(base) ((MEM_PTR)(base+0x004))
-+#define CPMAC_TX_CONTROL(base) (*pCPMAC_TX_CONTROL(base))
-+#define pCPMAC_TX_TEARDOWN(base) ((MEM_PTR)(base+0x008))
-+#define CPMAC_TX_TEARDOWN(base) (*pCPMAC_TX_TEARDOWN(base))
-+#define pCPMAC_RX_IDVER(base) ((MEM_PTR)(base+0x010))
-+#define CPMAC_RX_IDVER(base) (*pCPMAC_RX_IDVER(base))
-+#define pCPMAC_RX_CONTROL(base) ((MEM_PTR)(base+0x014))
-+#define CPMAC_RX_CONTROL(base) (*pCPMAC_RX_CONTROL(base))
-+#define pCPMAC_RX_TEARDOWN(base) ((MEM_PTR)(base+0x018))
-+#define CPMAC_RX_TEARDOWN(base) (*pCPMAC_RX_TEARDOWN(base))
-+#define pCPMAC_RX_MBP_ENABLE(base) ((MEM_PTR)(base+0x100))
-+#define CPMAC_RX_MBP_ENABLE(base) (*pCPMAC_RX_MBP_ENABLE(base))
-+#define pCPMAC_RX_UNICAST_SET(base) ((MEM_PTR)(base+0x104))
-+#define CPMAC_RX_UNICAST_SET(base) (*pCPMAC_RX_UNICAST_SET(base))
-+#define pCPMAC_RX_UNICAST_CLEAR(base) ((MEM_PTR)(base+0x108))
-+#define CPMAC_RX_UNICAST_CLEAR(base) (*pCPMAC_RX_UNICAST_CLEAR(base))
-+#define pCPMAC_RX_MAXLEN(base) ((MEM_PTR)(base+0x10C))
-+#define CPMAC_RX_MAXLEN(base) (*pCPMAC_RX_MAXLEN(base))
-+#define pCPMAC_RX_BUFFER_OFFSET(base) ((MEM_PTR)(base+0x110))
-+#define CPMAC_RX_BUFFER_OFFSET(base) (*pCPMAC_RX_BUFFER_OFFSET(base))
-+#define pCPMAC_RX_FILTERLOWTHRESH(base) ((MEM_PTR)(base+0x114))
-+#define CPMAC_RX_FILTERLOWTHRESH(base) (*pCPMAC_RX_FILTERLOWTHRESH(base))
-+#define pCPMAC_RX0_FLOWTHRESH(base) ((MEM_PTR)(base+0x120))
-+#define CPMAC_RX0_FLOWTHRESH(base) (*pCPMAC_RX0_FLOWTHRESH(base))
-+#define pCPMAC_RX1_FLOWTHRESH(base) ((MEM_PTR)(base+0x124))
-+#define CPMAC_RX1_FLOWTHRESH(base) (*pCPMAC_RX1_FLOWTHRESH(base))
-+#define pCPMAC_RX2_FLOWTHRESH(base) ((MEM_PTR)(base+0x128))
-+#define CPMAC_RX2_FLOWTHRESH(base) (*pCPMAC_RX2_FLOWTHRESH(base))
-+#define pCPMAC_RX3_FLOWTHRESH(base) ((MEM_PTR)(base+0x12C))
-+#define CPMAC_RX3_FLOWTHRESH(base) (*pCPMAC_RX3_FLOWTHRESH(base))
-+#define pCPMAC_RX4_FLOWTHRESH(base) ((MEM_PTR)(base+0x130))
-+#define CPMAC_RX4_FLOWTHRESH(base) (*pCPMAC_RX4_FLOWTHRESH(base))
-+#define pCPMAC_RX5_FLOWTHRESH(base) ((MEM_PTR)(base+0x134))
-+#define CPMAC_RX5_FLOWTHRESH(base) (*pCPMAC_RX5_FLOWTHRESH(base))
-+#define pCPMAC_RX6_FLOWTHRESH(base) ((MEM_PTR)(base+0x138))
-+#define CPMAC_RX6_FLOWTHRESH(base) (*pCPMAC_RX6_FLOWTHRESH(base))
-+#define pCPMAC_RX7_FLOWTHRESH(base) ((MEM_PTR)(base+0x13C))
-+#define CPMAC_RX7_FLOWTHRESH(base) (*pCPMAC_RX7_FLOWTHRESH(base))
-+#define pCPMAC_RX0_FREEBUFFER(base) ((MEM_PTR)(base+0x140))
-+#define CPMAC_RX0_FREEBUFFER(base) (*pCPMAC_RX0_FREEBUFFER(base))
-+#define pCPMAC_RX1_FREEBUFFER(base) ((MEM_PTR)(base+0x144))
-+#define CPMAC_RX1_FREEBUFFER(base) (*pCPMAC_RX1_FREEBUFFER(base))
-+#define pCPMAC_RX2_FREEBUFFER(base) ((MEM_PTR)(base+0x148))
-+#define CPMAC_RX2_FREEBUFFER(base) (*pCPMAC_RX2_FREEBUFFER(base))
-+#define pCPMAC_RX3_FREEBUFFER(base) ((MEM_PTR)(base+0x14C))
-+#define CPMAC_RX3_FREEBUFFER(base) (*pCPMAC_RX3_FREEBUFFER(base))
-+#define pCPMAC_RX4_FREEBUFFER(base) ((MEM_PTR)(base+0x150))
-+#define CPMAC_RX4_FREEBUFFER(base) (*pCPMAC_RX4_FREEBUFFER(base))
-+#define pCPMAC_RX5_FREEBUFFER(base) ((MEM_PTR)(base+0x154))
-+#define CPMAC_RX5_FREEBUFFER(base) (*pCPMAC_RX5_FREEBUFFER(base))
-+#define pCPMAC_RX6_FREEBUFFER(base) ((MEM_PTR)(base+0x158))
-+#define CPMAC_RX6_FREEBUFFER(base) (*pCPMAC_RX6_FREEBUFFER(base))
-+#define pCPMAC_RX7_FREEBUFFER(base) ((MEM_PTR)(base+0x15C))
-+#define CPMAC_RX7_FREEBUFFER(base) (*pCPMAC_RX7_FREEBUFFER(base))
-+#define pCPMAC_MACCONTROL(base) ((MEM_PTR)(base+0x160))
-+#define CPMAC_MACCONTROL(base) (*pCPMAC_MACCONTROL(base))
-+#define pCPMAC_MACSTATUS(base) ((MEM_PTR)(base+0x164))
-+#define CPMAC_MACSTATUS(base) (*pCPMAC_MACSTATUS(base))
-+#define pCPMAC_EMCONTROL(base) ((MEM_PTR)(base+0x168))
-+#define CPMAC_EMCONTROL(base) (*pCPMAC_EMCONTROL(base))
-+#define pCPMAC_TX_INTSTAT_RAW(base) ((MEM_PTR)(base+0x170))
-+#define CPMAC_TX_INTSTAT_RAW(base) (*pCPMAC_TX_INTSTAT_RAW(base))
-+#define pCPMAC_TX_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x174))
-+#define CPMAC_TX_INTSTAT_MASKED(base) (*pCPMAC_TX_INTSTAT_MASKED(base))
-+#define pCPMAC_TX_INTMASK_SET(base) ((MEM_PTR)(base+0x178))
-+#define CPMAC_TX_INTMASK_SET(base) (*pCPMAC_TX_INTMASK_SET(base))
-+#define pCPMAC_TX_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x17C))
-+#define CPMAC_TX_INTMASK_CLEAR(base) (*pCPMAC_TX_INTMASK_CLEAR(base))
-+#define pCPMAC_MAC_IN_VECTOR(base) ((MEM_PTR)(base+0x180))
-+#define CPMAC_MAC_IN_VECTOR(base) (*pCPMAC_MAC_IN_VECTOR(base))
-+#define pCPMAC_MAC_EOI_VECTOR(base) ((MEM_PTR)(base+0x184))
-+#define CPMAC_MAC_EOI_VECTOR(base) (*pCPMAC_MAC_EOI_VECTOR(base))
-+#define pCPMAC_RX_INTSTAT_RAW(base) ((MEM_PTR)(base+0x190))
-+#define CPMAC_RX_INTSTAT_RAW(base) (*pCPMAC_RX_INTSTAT_RAW(base))
-+#define pCPMAC_RX_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x194))
-+#define CPMAC_RX_INTSTAT_MASKED(base) (*pCPMAC_RX_INTSTAT_MASKED(base))
-+#define pCPMAC_RX_INTMASK_SET(base) ((MEM_PTR)(base+0x198))
-+#define CPMAC_RX_INTMASK_SET(base) (*pCPMAC_RX_INTMASK_SET(base))
-+#define pCPMAC_RX_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x19C))
-+#define CPMAC_RX_INTMASK_CLEAR(base) (*pCPMAC_RX_INTMASK_CLEAR(base))
-+#define pCPMAC_MAC_INTSTAT_RAW(base) ((MEM_PTR)(base+0x1A0))
-+#define CPMAC_MAC_INTSTAT_RAW(base) (*pCPMAC_MAC_INTSTAT_RAW(base))
-+#define pCPMAC_MAC_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x1A4))
-+#define CPMAC_MAC_INTSTAT_MASKED(base) (*pCPMAC_MAC_INTSTAT_MASKED(base))
-+#define pCPMAC_MAC_INTMASK_SET(base) ((MEM_PTR)(base+0x1A8))
-+#define CPMAC_MAC_INTMASK_SET(base) (*pCPMAC_MAC_INTMASK_SET(base))
-+#define pCPMAC_MAC_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x1AC))
-+#define CPMAC_MAC_INTMASK_CLEAR(base) (*pCPMAC_MAC_INTMASK_CLEAR(base))
-+#define pCPMAC_MACADDRLO_0(base) ((MEM_PTR)(base+0x1B0))
-+#define CPMAC_MACADDRLO_0(base) (*pCPMAC_MACADDRLO_0(base))
-+#define pCPMAC_MACADDRLO_1(base) ((MEM_PTR)(base+0x1B4))
-+#define CPMAC_MACADDRLO_1(base) (*pCPMAC_MACADDRLO_1(base))
-+#define pCPMAC_MACADDRLO_2(base) ((MEM_PTR)(base+0x1B8))
-+#define CPMAC_MACADDRLO_2(base) (*pCPMAC_MACADDRLO_2(base))
-+#define pCPMAC_MACADDRLO_3(base) ((MEM_PTR)(base+0x1BC))
-+#define CPMAC_MACADDRLO_3(base) (*pCPMAC_MACADDRLO_3(base))
-+#define pCPMAC_MACADDRLO_4(base) ((MEM_PTR)(base+0x1C0))
-+#define CPMAC_MACADDRLO_4(base) (*pCPMAC_MACADDRLO_4(base))
-+#define pCPMAC_MACADDRLO_5(base) ((MEM_PTR)(base+0x1C4))
-+#define CPMAC_MACADDRLO_5(base) (*pCPMAC_MACADDRLO_5(base))
-+#define pCPMAC_MACADDRLO_6(base) ((MEM_PTR)(base+0x1C8))
-+#define CPMAC_MACADDRLO_6(base) (*pCPMAC_MACADDRLO_6(base))
-+#define pCPMAC_MACADDRLO_7(base) ((MEM_PTR)(base+0x1CC))
-+#define CPMAC_MACADDRLO_7(base) (*pCPMAC_MACADDRLO_7(base))
-+#define pCPMAC_MACADDRMID(base) ((MEM_PTR)(base+0x1D0))
-+#define CPMAC_MACADDRMID(base) (*pCPMAC_MACADDRMID(base))
-+#define pCPMAC_MACADDRHI(base) ((MEM_PTR)(base+0x1D4))
-+#define CPMAC_MACADDRHI(base) (*pCPMAC_MACADDRHI(base))
-+#define pCPMAC_MACHASH1(base) ((MEM_PTR)(base+0x1D8))
-+#define CPMAC_MACHASH1(base) (*pCPMAC_MACHASH1(base))
-+#define pCPMAC_MACHASH2(base) ((MEM_PTR)(base+0x1DC))
-+#define CPMAC_MACHASH2(base) (*pCPMAC_MACHASH2(base))
-+#define pCPMAC_BOFFTEST(base) ((MEM_PTR)(base+0x1E0))
-+#define CPMAC_BOFFTEST(base) (*pCPMAC_BOFFTEST(base))
-+#define pCPMAC_PACTEST(base) ((MEM_PTR)(base+0x1E4))
-+#define CPMAC_PACTEST(base) (*pCPMAC_PACTEST(base))
-+#define pCPMAC_RXPAUSE(base) ((MEM_PTR)(base+0x1E8))
-+#define CPMAC_RXPAUSE(base) (*pCPMAC_RXPAUSE(base))
-+#define pCPMAC_TXPAUSE(base) ((MEM_PTR)(base+0x1EC))
-+#define CPMAC_TXPAUSE(base) (*pCPMAC_TXPAUSE(base))
-+/* STATISTICS */
-+#define pCPMAC_RXGOODFRAMES(base) ((MEM_PTR)(base+0x200))
-+#define CPMAC_RXGOODFRAMES(base) (*pCPMAC_RXGOODFRAMES(base))
-+#define pCPMAC_RXBROADCASTFRAMES(base) ((MEM_PTR)(base+0x204))
-+#define CPMAC_RXBROADCASTFRAMES(base) (*pCPMAC_RXBROADCASTFRAMES(base))
-+#define pCPMAC_RXMULTICASTFRAMES(base) ((MEM_PTR)(base+0x208))
-+#define CPMAC_RXMULTICASTFRAMES(base) (*pCPMAC_RXMULTICASTFRAMES(base))
-+#define pCPMAC_RXPAUSEFRAMES(base) ((MEM_PTR)(base+0x20C))
-+#define CPMAC_RXPAUSEFRAMES(base) (*pCPMAC_RXPAUSEFRAMES(base))
-+#define pCPMAC_RXCRCERRORS(base) ((MEM_PTR)(base+0x210))
-+#define CPMAC_RXCRCERRORS(base) (*pCPMAC_RXCRCERRORS(base))
-+#define pCPMAC_RXALIGNCODEERRORS(base) ((MEM_PTR)(base+0x214))
-+#define CPMAC_RXALIGNCODEERRORS(base) (*pCPMAC_RXALIGNCODEERRORS(base))
-+#define pCPMAC_RXOVERSIZEDFRAMES(base) ((MEM_PTR)(base+0x218))
-+#define CPMAC_RXOVERSIZEDFRAMES(base) (*pCPMAC_RXOVERSIZEDFRAMES(base))
-+#define pCPMAC_RXJABBERFRAMES(base) ((MEM_PTR)(base+0x21C))
-+#define CPMAC_RXJABBERFRAMES(base) (*pCPMAC_RXJABBERFRAMES(base))
-+#define pCPMAC_RXUNDERSIZEDFRAMES(base) ((MEM_PTR)(base+0x220))
-+#define CPMAC_RXUNDERSIZEDFRAMES(base) (*pCPMAC_RXUNDERSIZEDFRAMES(base))
-+#define pCPMAC_RXFRAGMENTS(base) ((MEM_PTR)(base+0x224))
-+#define CPMAC_RXFRAGMENTS(base) (*pCPMAC_RXFRAGMENTS(base))
-+#define pCPMAC_RXFILTEREDFRAMES(base) ((MEM_PTR)(base+0x228))
-+#define CPMAC_RXFILTEREDFRAMES(base) (*pCPMAC_RXFILTEREDFRAMES(base))
-+#define pCPMAC_RXQOSFILTEREDFRAMES(base) ((MEM_PTR)(base+0x22C))
-+#define CPMAC_RXQOSFILTEREDFRAMES(base) (*pCPMAC_RXQOSFILTEREDFRAMES(base))
-+#define pCPMAC_RXOCTETS(base) ((MEM_PTR)(base+0x230))
-+#define CPMAC_RXOCTETS(base) (*pCPMAC_RXOCTETS(base))
-+#define pCPMAC_TXGOODFRAMES(base) ((MEM_PTR)(base+0x234))
-+#define CPMAC_TXGOODFRAMES(base) (*pCPMAC_TXGOODFRAMES(base))
-+#define pCPMAC_TXBROADCASTFRAMES(base) ((MEM_PTR)(base+0x238))
-+#define CPMAC_TXBROADCASTFRAMES(base) (*pCPMAC_TXBROADCASTFRAMES(base))
-+#define pCPMAC_TXMULTICASTFRAMES(base) ((MEM_PTR)(base+0x23C))
-+#define CPMAC_TXMULTICASTFRAMES(base) (*pCPMAC_TXMULTICASTFRAMES(base))
-+#define pCPMAC_TXPAUSEFRAMES(base) ((MEM_PTR)(base+0x240))
-+#define CPMAC_TXPAUSEFRAMES(base) (*pCPMAC_TXPAUSEFRAMES(base))
-+#define pCPMAC_TXDEFERREDFRAMES(base) ((MEM_PTR)(base+0x244))
-+#define CPMAC_TXDEFERREDFRAMES(base) (*pCPMAC_TXDEFERREDFRAMES(base))
-+#define pCPMAC_TXCOLLISIONFRAMES(base) ((MEM_PTR)(base+0x248))
-+#define CPMAC_TXCOLLISIONFRAMES(base) (*pCPMAC_TXCOLLISIONFRAMES(base))
-+#define pCPMAC_TXSINGLECOLLFRAMES(base) ((MEM_PTR)(base+0x24C))
-+#define CPMAC_TXSINGLECOLLFRAMES(base) (*pCPMAC_TXSINGLECOLLFRAMES(base))
-+#define pCPMAC_TXMULTCOLLFRAMES(base) ((MEM_PTR)(base+0x250))
-+#define CPMAC_TXMULTCOLLFRAMES(base) (*pCPMAC_TXMULTCOLLFRAMES(base))
-+#define pCPMAC_TXEXCESSIVECOLLISIONS(base) ((MEM_PTR)(base+0x254))
-+#define CPMAC_TXEXCESSIVECOLLISIONS(base) (*pCPMAC_TXEXCESSIVECOLLISIONS(base))
-+#define pCPMAC_TXLATECOLLISIONS(base) ((MEM_PTR)(base+0x258))
-+#define CPMAC_TXLATECOLLISIONS(base) (*pCPMAC_TXLATECOLLISIONS(base))
-+#define pCPMAC_TXUNDERRUN(base) ((MEM_PTR)(base+0x25C))
-+#define CPMAC_TXUNDERRUN(base) (*pCPMAC_TXUNDERRUN(base))
-+#define pCPMAC_TXCARRIERSENSEERRORS(base) ((MEM_PTR)(base+0x260))
-+#define CPMAC_TXCARRIERSENSEERRORS(base) (*pCPMAC_TXCARRIERSENSEERRORS(base))
-+#define pCPMAC_TXOCTETS(base) ((MEM_PTR)(base+0x264))
-+#define CPMAC_TXOCTETS(base) (*pCPMAC_TXOCTETS(base))
-+#define pCPMAC_64OCTETFRAMES(base) ((MEM_PTR)(base+0x268))
-+#define CPMAC_64OCTETFRAMES(base) (*pCPMAC_64OCTETFRAMES(base))
-+#define pCPMAC_65T127OCTETFRAMES(base) ((MEM_PTR)(base+0x26C))
-+#define CPMAC_65T127OCTETFRAMES(base) (*pCPMAC_65T127OCTETFRAMES(base))
-+#define pCPMAC_128T255OCTETFRAMES(base) ((MEM_PTR)(base+0x270))
-+#define CPMAC_128T255OCTETFRAMES(base) (*pCPMAC_128T255OCTETFRAMES(base))
-+#define pCPMAC_256T511OCTETFRAMES(base) ((MEM_PTR)(base+0x274))
-+#define CPMAC_256T511OCTETFRAMES(base) (*pCPMAC_256T511OCTETFRAMES(base))
-+#define pCPMAC_512T1023OCTETFRAMES(base) ((MEM_PTR)(base+0x278))
-+#define CPMAC_512T1023OCTETFRAMES(base) (*pCPMAC_512T1023OCTETFRAMES(base))
-+#define pCPMAC_1024TUPOCTETFRAMES(base) ((MEM_PTR)(base+0x27C))
-+#define CPMAC_1024TUPOCTETFRAMES(base) (*pCPMAC_1024TUPOCTETFRAMES(base))
-+#define pCPMAC_NETOCTETS(base) ((MEM_PTR)(base+0x280))
-+#define CPMAC_NETOCTETS(base) (*pCPMAC_NETOCTETS(base))
-+#define pCPMAC_RXSOFOVERRUNS(base) ((MEM_PTR)(base+0x284))
-+#define CPMAC_RXSOFOVERRUNS(base) (*pCPMAC_RXSOFOVERRUNS(base))
-+#define pCPMAC_RXMOFOVERRUNS(base) ((MEM_PTR)(base+0x288))
-+#define CPMAC_RXMOFOVERRUNS(base) (*pCPMAC_RXMOFOVERRUNS(base))
-+#define pCPMAC_RXDMAOVERRUNS(base) ((MEM_PTR)(base+0x28C))
-+#define CPMAC_RXDMAOVERRUNS(base) (*pCPMAC_RXDMAOVERRUNS(base))
-+
-+#define CPMAC_TX_HDP(base,ch) (*(MEM_PTR)(base+0x600+(4*ch)))
-+#define pCPMAC_TX0_HDP(base) ((MEM_PTR)(base+0x600))
-+#define CPMAC_TX0_HDP(base) (*pCPMAC_TX0_HDP(base))
-+#define pCPMAC_TX1_HDP(base) ((MEM_PTR)(base+0x604))
-+#define CPMAC_TX1_HDP(base) (*pCPMAC_TX1_HDP(base))
-+#define pCPMAC_TX2_HDP(base) ((MEM_PTR)(base+0x608))
-+#define CPMAC_TX2_HDP(base) (*pCPMAC_TX2_HDP(base))
-+#define pCPMAC_TX3_HDP(base) ((MEM_PTR)(base+0x60C))
-+#define CPMAC_TX3_HDP(base) (*pCPMAC_TX3_HDP(base))
-+#define pCPMAC_TX4_HDP(base) ((MEM_PTR)(base+0x610))
-+#define CPMAC_TX4_HDP(base) (*pCPMAC_TX4_HDP(base))
-+#define pCPMAC_TX5_HDP(base) ((MEM_PTR)(base+0x614))
-+#define CPMAC_TX5_HDP(base) (*pCPMAC_TX5_HDP(base))
-+#define pCPMAC_TX6_HDP(base) ((MEM_PTR)(base+0x618))
-+#define CPMAC_TX6_HDP(base) (*pCPMAC_TX6_HDP(base))
-+#define pCPMAC_TX7_HDP(base) ((MEM_PTR)(base+0x61C))
-+#define CPMAC_TX7_HDP(base) (*pCPMAC_TX7_HDP(base))
-+#define CPMAC_RX_HDP(base,ch) (*(MEM_PTR)(base+0x620+(4*ch)))
-+#define pCPMAC_RX0_HDP(base) ((MEM_PTR)(base+0x620))
-+#define CPMAC_RX0_HDP(base) (*pCPMAC_RX0_HDP(base))
-+#define pCPMAC_RX1_HDP(base) ((MEM_PTR)(base+0x624))
-+#define CPMAC_RX1_HDP(base) (*pCPMAC_RX1_HDP(base))
-+#define pCPMAC_RX2_HDP(base) ((MEM_PTR)(base+0x628))
-+#define CPMAC_RX2_HDP(base) (*pCPMAC_RX2_HDP(base))
-+#define pCPMAC_RX3_HDP(base) ((MEM_PTR)(base+0x62C))
-+#define CPMAC_RX3_HDP(base) (*pCPMAC_RX3_HDP(base))
-+#define pCPMAC_RX4_HDP(base) ((MEM_PTR)(base+0x630))
-+#define CPMAC_RX4_HDP(base) (*pCPMAC_RX4_HDP(base))
-+#define pCPMAC_RX5_HDP(base) ((MEM_PTR)(base+0x634))
-+#define CPMAC_RX5_HDP(base) (*pCPMAC_RX5_HDP(base))
-+#define pCPMAC_RX6_HDP(base) ((MEM_PTR)(base+0x638))
-+#define CPMAC_RX6_HDP(base) (*pCPMAC_RX6_HDP(base))
-+#define pCPMAC_RX7_HDP(base) ((MEM_PTR)(base+0x63C))
-+#define CPMAC_RX7_HDP(base) (*pCPMAC_RX7_HDP(base))
-+
-+
-+#define CPMAC_TX_INT_ACK(base,ch) (*(MEM_PTR)(base+0x640+(4*ch)))
-+
-+#define pCPMAC_TX0_INT_ACK(base) ((MEM_PTR)(base+0x640))
-+#define CPMAC_TX0_INT_ACK(base) (*pCPMAC_TX0_INT_ACK(base))
-+#define pCPMAC_TX1_INT_ACK(base) ((MEM_PTR)(base+0x644))
-+#define CPMAC_TX1_INT_ACK(base) (*pCPMAC_TX1_INT_ACK(base))
-+#define pCPMAC_TX2_INT_ACK(base) ((MEM_PTR)(base+0x648))
-+#define CPMAC_TX2_INT_ACK(base) (*pCPMAC_TX2_INT_ACK(base))
-+#define pCPMAC_TX3_INT_ACK(base) ((MEM_PTR)(base+0x64C))
-+#define CPMAC_TX3_INT_ACK(base) (*pCPMAC_TX3_INT_ACK(base))
-+#define pCPMAC_TX4_INT_ACK(base) ((MEM_PTR)(base+0x650))
-+#define CPMAC_TX4_INT_ACK(base) (*pCPMAC_TX4_INT_ACK(base))
-+#define pCPMAC_TX5_INT_ACK(base) ((MEM_PTR)(base+0x654))
-+#define CPMAC_TX5_INT_ACK(base) (*pCPMAC_TX5_INT_ACK(base))
-+#define pCPMAC_TX6_INT_ACK(base) ((MEM_PTR)(base+0x658))
-+#define CPMAC_TX6_INT_ACK(base) (*pCPMAC_TX6_INT_ACK(base))
-+#define pCPMAC_TX7_INT_ACK(base) ((MEM_PTR)(base+0x65C))
-+#define CPMAC_TX7_INT_ACK(base) (*pCPMAC_TX7_INT_ACK(base))
-+#define CPMAC_RX_INT_ACK(base,ch) (*(MEM_PTR)(base+0x660+(4*ch)))
-+
-+#define pCPMAC_RX0_INT_ACK(base) ((MEM_PTR)(base+0x660))
-+#define CPMAC_RX0_INT_ACK(base) (*pCPMAC_RX0_INT_ACK(base))
-+#define pCPMAC_RX1_INT_ACK(base) ((MEM_PTR)(base+0x664))
-+#define CPMAC_RX1_INT_ACK(base) (*pCPMAC_RX1_INT_ACK(base))
-+#define pCPMAC_RX2_INT_ACK(base) ((MEM_PTR)(base+0x668))
-+#define CPMAC_RX2_INT_ACK(base) (*pCPMAC_RX2_INT_ACK(base))
-+#define pCPMAC_RX3_INT_ACK(base) ((MEM_PTR)(base+0x66C))
-+#define CPMAC_RX3_INT_ACK(base) (*pCPMAC_RX3_INT_ACK(base))
-+#define pCPMAC_RX4_INT_ACK(base) ((MEM_PTR)(base+0x670))
-+#define CPMAC_RX4_INT_ACK(base) (*pCPMAC_RX4_INT_ACK(base))
-+#define pCPMAC_RX5_INT_ACK(base) ((MEM_PTR)(base+0x674))
-+#define CPMAC_RX5_INT_ACK(base) (*pCPMAC_RX5_INT_ACK(base))
-+#define pCPMAC_RX6_INT_ACK(base) ((MEM_PTR)(base+0x678))
-+#define CPMAC_RX6_INT_ACK(base) (*pCPMAC_RX6_INT_ACK(base))
-+#define pCPMAC_RX7_INT_ACK(base) ((MEM_PTR)(base+0x67C))
-+#define CPMAC_RX7_INT_ACK(base) (*pCPMAC_RX7_INT_ACK(base))
-+
-+/****************************************************************************/
-+/* */
-+/* R E G I S T E R B I T D E F I N I T I O N S */
-+/* */
-+/****************************************************************************/
-+
-+/* TX_CONTROL */
-+
-+#define TX_EN (1 << 0)
-+
-+/* RX_CONTROL */
-+
-+#define RX_EN (1 << 0)
-+
-+/* RX_MBP_ENABLE */
-+
-+#define RX_PASS_CRC (1 << 30)
-+#define RX_QOS_EN (1 << 29)
-+#define RX_NO_CHAIN (1 << 28)
-+
-+#define RX_CMF_EN (1 << 24)
-+#define RX_CSF_EN (1 << 23)
-+#define RX_CEF_EN (1 << 22)
-+#define RX_CAF_EN (1 << 21)
-+
-+#define RX_PROM_CH(n) (n << 16)
-+#define RX_PROM_CH_MASK RX_PROM_CH(7)
-+#define RX_PROM_CH_7 RX_PROM_CH(7)
-+#define RX_PROM_CH_6 RX_PROM_CH(6)
-+#define RX_PROM_CH_5 RX_PROM_CH(5)
-+#define RX_PROM_CH_4 RX_PROM_CH(4)
-+#define RX_PROM_CH_3 RX_PROM_CH(3)
-+#define RX_PROM_CH_2 RX_PROM_CH(2)
-+#define RX_PROM_CH_1 RX_PROM_CH(1)
-+#define RX_PROM_CH_0 RX_PROM_CH(0)
-+
-+#define RX_BROAD_EN (1 << 13)
-+
-+#define RX_BROAD_CH(n) (n << 8)
-+#define RX_BROAD_CH_MASK RX_BROAD_CH(7)
-+#define RX_BROAD_CH_7 RX_BROAD_CH(7)
-+#define RX_BROAD_CH_6 RX_BROAD_CH(6)
-+#define RX_BROAD_CH_5 RX_BROAD_CH(5)
-+#define RX_BROAD_CH_4 RX_BROAD_CH(4)
-+#define RX_BROAD_CH_3 RX_BROAD_CH(3)
-+#define RX_BROAD_CH_2 RX_BROAD_CH(2)
-+#define RX_BROAD_CH_1 RX_BROAD_CH(1)
-+#define RX_BROAD_CH_0 RX_BROAD_CH(0)
-+
-+#define RX_MULT_EN (1 << 5)
-+
-+#define RX_MULT_CH(n) (n << 0)
-+#define RX_MULT_CH_MASK RX_MULT_CH(7)
-+#define RX_MULT_CH_7 RX_MULT_CH(7)
-+#define RX_MULT_CH_6 RX_MULT_CH(6)
-+#define RX_MULT_CH_5 RX_MULT_CH(5)
-+#define RX_MULT_CH_4 RX_MULT_CH(4)
-+#define RX_MULT_CH_3 RX_MULT_CH(3)
-+#define RX_MULT_CH_2 RX_MULT_CH(2)
-+#define RX_MULT_CH_1 RX_MULT_CH(1)
-+#define RX_MULT_CH_0 RX_MULT_CH(0)
-+
-+
-+
-+/* RX_UNICAST_SET */
-+
-+#define RX_CH7_EN (1 << 7)
-+#define RX_CH6_EN (1 << 6)
-+#define RX_CH5_EN (1 << 5)
-+#define RX_CH4_EN (1 << 4)
-+#define RX_CH3_EN (1 << 3)
-+#define RX_CH2_EN (1 << 2)
-+#define RX_CH1_EN (1 << 1)
-+#define RX_CH0_EN (1 << 0)
-+
-+
-+
-+/* MAC control */
-+#define TX_PTYPE (1 << 9)
-+#define TX_PACE (1 << 6)
-+#define MII_EN (1 << 5)
-+#define TX_FLOW_EN (1 << 4)
-+#define RX_FLOW_EN (1 << 3)
-+#define MTEST (1 << 2)
-+#define CTRL_LOOPBACK (1 << 1)
-+#define FULLDUPLEX (1 << 0)
-+
-+
-+/* IntVec definitions */
-+#define MAC_IN_VECTOR_STATUS_INT (1 << 19)
-+#define MAC_IN_VECTOR_HOST_INT (1 << 18)
-+#define MAC_IN_VECTOR_RX_INT_OR (1 << 17)
-+#define MAC_IN_VECTOR_TX_INT_OR (1 << 16)
-+#define MAC_IN_VECTOR_RX_INT_VEC (7 << 8)
-+#define MAC_IN_VECTOR_TX_INT_VEC (7)
-+
-+
-+/* MacStatus */
-+
-+#define TX_HOST_ERR_CODE (0xF << 20)
-+#define TX_ERR_CH (0x7 << 16)
-+#define RX_HOST_ERR_CODE (0xF << 12)
-+#define RX_ERR_CH (0x7 << 8)
-+#define RX_QOS_ACT (1 << 2)
-+#define RX_FLOW_ACT (1 << 1)
-+#define TX_FLOW_ACT (1 << 0)
-+#endif _INC_CPMAC_REG
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmdio.c linux.dev/drivers/net/avalanche_cpmac/cpmdio.c
---- linux.old/drivers/net/avalanche_cpmac/cpmdio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmdio.c 2005-07-10 04:06:50.491302256 +0200
-@@ -0,0 +1,960 @@
-+/***************************************************************************
-+** TNETD53xx Software Support
-+** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
-+**
-+** FILE: cpmdio.c
-+**
-+** DESCRIPTION:
-+** MDIO Polling State Machine API. Functions will enable mii-Phy
-+** negotiation.
-+**
-+** HISTORY:
-+** 01Jan01 Denis, Bill Original
-+** 27Mar02 Michael Hanrahan (modified from emacmdio.c)
-+** 07May02 Michael Hanrahan replaced clockwait for code delay
-+** 10Jul02 Michael Hanrahan more debug, if fallback link is selected
-+*****************************************************************************/
-+#define __CPHAL_CPMDIO
-+
-+#include "mdio_reg.h"
-+
-+#ifdef _CPHAL_CPMAC
-+#define mdioPrintf PhyDev->HalDev->OsFunc->Printf
-+#else
-+#define mdioPrintf printf
-+#endif
-+
-+typedef struct _phy_device
-+{
-+ bit32u miibase;
-+ bit32u inst;
-+ bit32u PhyState;
-+ bit32u MdixMask;
-+ bit32u PhyMask;
-+ bit32u MLinkMask;
-+ bit32u PhyMode;
-+#ifdef _CPHAL_CPMAC
-+ HAL_DEVICE *HalDev;
-+#endif
-+} _PHY_DEVICE;
-+
-+static void _mdioDelayEmulate(PHY_DEVICE *PhyDev, int ClockWait);
-+static void _mdioWaitForAccessComplete(PHY_DEVICE *PhyDev);
-+static void _mdioUserAccess(PHY_DEVICE *PhyDev, bit32u method, bit32u regadr, bit32u phyadr, bit32u data);
-+static bit32u _mdioUserAccessRead(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr);
-+static void _mdioUserAccessWrite(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr, bit32u data);
-+
-+static void _mdioDisablePhy(PHY_DEVICE *PhyDev,bit32u PhyNum);
-+static void _mdioPhyTimeOut(PHY_DEVICE *PhyDev);
-+static void _mdioResetPhy(PHY_DEVICE *PhyDev,bit32u PhyNum);
-+
-+static void _mdioDumpPhy(PHY_DEVICE *PhyDev, bit32u p);
-+static void _mdioDumpState(PHY_DEVICE *PhyDev);
-+
-+/* Auto Mdix */
-+static void _mdioMdixDelay(PHY_DEVICE *PhyDev);
-+static int _mdioMdixSupported(PHY_DEVICE *PhyDev);
-+
-+static void _MdioDefaultState (PHY_DEVICE *PhyDev);
-+static void _MdioFindingState (PHY_DEVICE *PhyDev);
-+static void _MdioFoundState (PHY_DEVICE *PhyDev);
-+static void _MdioInitState (PHY_DEVICE *PhyDev);
-+static void _MdioLinkedState (PHY_DEVICE *PhyDev);
-+static void _MdioLinkWaitState (PHY_DEVICE *PhyDev);
-+static void _MdioLoopbackState (PHY_DEVICE *PhyDev);
-+static void _MdioNwayStartState(PHY_DEVICE *PhyDev);
-+static void _MdioNwayWaitState (PHY_DEVICE *PhyDev);
-+
-+
-+
-+#ifndef TRUE
-+#define TRUE (1==1)
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE (1==2)
-+#endif
-+
-+#define PHY_NOT_FOUND 0xFFFF /* Used in Phy Detection */
-+
-+/*PhyState breakout */
-+
-+#define PHY_DEV_OFFSET (0)
-+#define PHY_DEV_SIZE (5) /* 5 Bits used */
-+#define PHY_DEV_MASK (0x1f<<PHY_DEV_OFFSET)
-+
-+#define PHY_STATE_OFFSET (PHY_DEV_SIZE+PHY_DEV_OFFSET)
-+#define PHY_STATE_SIZE (5) /* 10 Bits used */
-+#define PHY_STATE_MASK (0x1f<<PHY_STATE_OFFSET)
-+ #define INIT (1<<PHY_STATE_OFFSET)
-+ #define FINDING (2<<PHY_STATE_OFFSET)
-+ #define FOUND (3<<PHY_STATE_OFFSET)
-+ #define NWAY_START (4<<PHY_STATE_OFFSET)
-+ #define NWAY_WAIT (5<<PHY_STATE_OFFSET)
-+ #define LINK_WAIT (6<<PHY_STATE_OFFSET)
-+ #define LINKED (7<<PHY_STATE_OFFSET)
-+ #define LOOPBACK (8<<PHY_STATE_OFFSET)
-+
-+#define PHY_SPEED_OFFSET (PHY_STATE_OFFSET+PHY_STATE_SIZE)
-+#define PHY_SPEED_SIZE (1) /* 11 Bits used */
-+#define PHY_SPEED_MASK (1<<PHY_SPEED_OFFSET)
-+
-+#define PHY_DUPLEX_OFFSET (PHY_SPEED_OFFSET+PHY_SPEED_SIZE)
-+#define PHY_DUPLEX_SIZE (1) /* 12 Bits used */
-+#define PHY_DUPLEX_MASK (1<<PHY_DUPLEX_OFFSET)
-+
-+#define PHY_TIM_OFFSET (PHY_DUPLEX_OFFSET+PHY_DUPLEX_SIZE)
-+#define PHY_TIM_SIZE (10) /* 22 Bits used */
-+#define PHY_TIM_MASK (0x3ff<<PHY_TIM_OFFSET)
-+ #define PHY_FIND_TO ( 2<<PHY_TIM_OFFSET)
-+ #define PHY_RECK_TO (200<<PHY_TIM_OFFSET)
-+ #define PHY_LINK_TO (500<<PHY_TIM_OFFSET)
-+ #define PHY_NWST_TO (500<<PHY_TIM_OFFSET)
-+ #define PHY_NWDN_TO (800<<PHY_TIM_OFFSET)
-+ #define PHY_MDIX_TO (274<<PHY_TIM_OFFSET) /* 2.74 Seconds <--Spec and empirical */
-+
-+#define PHY_SMODE_OFFSET (PHY_TIM_OFFSET+PHY_TIM_SIZE)
-+#define PHY_SMODE_SIZE (5) /* 27 Bits used */
-+#define PHY_SMODE_MASK (0x1f<<PHY_SMODE_OFFSET)
-+ #define SMODE_AUTO (0x10<<PHY_SMODE_OFFSET)
-+ #define SMODE_FD100 (0x08<<PHY_SMODE_OFFSET)
-+ #define SMODE_HD100 (0x04<<PHY_SMODE_OFFSET)
-+ #define SMODE_FD10 (0x02<<PHY_SMODE_OFFSET)
-+ #define SMODE_HD10 (0x01<<PHY_SMODE_OFFSET)
-+ #define SMODE_ALL (0x1f<<PHY_SMODE_OFFSET)
-+
-+#define PHY_CHNG_OFFSET (PHY_SMODE_OFFSET+PHY_SMODE_SIZE)
-+#define PHY_CHNG_SIZE (1) /* 28 Bits used */
-+#define PHY_CHNG_MASK (1<<PHY_CHNG_OFFSET)
-+ #define PHY_CHANGE (1<<PHY_CHNG_OFFSET)
-+
-+#define PHY_TIMEDOUT_OFFSET (PHY_CHNG_OFFSET+PHY_CHNG_SIZE)
-+#define PHY_TIMEDOUT_SIZE (1) /* 29 Bits used */
-+#define PHY_TIMEDOUT_MASK (1<<PHY_TIMEDOUT_OFFSET)
-+ #define PHY_MDIX_SWITCH (1<<PHY_TIMEDOUT_OFFSET)
-+
-+#define PHY_MDIX_OFFSET (PHY_TIMEDOUT_OFFSET+PHY_TIMEDOUT_SIZE)
-+#define PHY_MDIX_SIZE (1) /* 30 Bits used */
-+#define PHY_MDIX_MASK (1<<PHY_MDIX_OFFSET)
-+ #define PHY_MDIX (1<<PHY_MDIX_OFFSET)
-+
-+static char *lstate[]={"NULL","INIT","FINDING","FOUND","NWAY_START","NWAY_WAIT","LINK_WAIT","LINKED", "LOOPBACK"};
-+static int cpMacDebug;
-+
-+/* Local MDIO Register Macros */
-+
-+#define myMDIO_ALIVE MDIO_ALIVE (PhyDev->miibase)
-+#define myMDIO_CONTROL MDIO_CONTROL (PhyDev->miibase)
-+#define myMDIO_LINK MDIO_LINK (PhyDev->miibase)
-+#define myMDIO_LINKINT MDIO_LINKINT (PhyDev->miibase)
-+#define myMDIO_USERACCESS MDIO_USERACCESS(PhyDev->miibase, PhyDev->inst)
-+#define myMDIO_USERPHYSEL MDIO_USERPHYSEL(PhyDev->miibase, PhyDev->inst)
-+#define myMDIO_VER MDIO_VER (PhyDev->miibase)
-+
-+#ifndef VOLATILE32
-+#define VOLATILE32(addr) (*((volatile bit32u *)(addr)))
-+#endif
-+
-+/************************************
-+***
-+*** Delays at least ClockWait cylces
-+*** before returning
-+***
-+**************************************/
-+void _mdioDelayEmulate(PHY_DEVICE *PhyDev, int ClockWait)
-+ {
-+#ifdef _CPHAL_CPMAC /*+RC3.02*/
-+ HAL_DEVICE *HalDev = PhyDev->HalDev; /*+RC3.02*/
-+ osfuncSleep((int*)&ClockWait); /*+RC3.02*/
-+#else /*+RC3.02*/
-+ volatile bit32u i=0;
-+ while(ClockWait--)
-+ {
-+ i |= myMDIO_LINK; /* MDIO register access to burn cycles */
-+ }
-+#endif
-+ }
-+
-+void _mdioWaitForAccessComplete(PHY_DEVICE *PhyDev)
-+ {
-+ while((myMDIO_USERACCESS & MDIO_USERACCESS_GO)!=0)
-+ {
-+ }
-+ }
-+
-+void _mdioUserAccess(PHY_DEVICE *PhyDev, bit32u method, bit32u regadr, bit32u phyadr, bit32u data)
-+ {
-+ bit32u control;
-+
-+ control = MDIO_USERACCESS_GO |
-+ (method) |
-+ (((regadr) << 21) & MDIO_USERACCESS_REGADR) |
-+ (((phyadr) << 16) & MDIO_USERACCESS_PHYADR) |
-+ ((data) & MDIO_USERACCESS_DATA);
-+
-+ myMDIO_USERACCESS = control;
-+ }
-+
-+
-+
-+/************************************
-+***
-+*** Waits for MDIO_USERACCESS to be ready and reads data
-+*** If 'WaitForData' set, waits for read to complete and returns Data,
-+*** otherwise returns 0
-+*** Note: 'data' is 16 bits but we use 32 bits
-+*** to be consistent with rest of the code.
-+***
-+**************************************/
-+bit32u _mdioUserAccessRead(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr)
-+ {
-+
-+ _mdioWaitForAccessComplete(PhyDev); /* Wait until UserAccess ready */
-+ _mdioUserAccess(PhyDev, MDIO_USERACCESS_READ, regadr, phyadr, 0);
-+ _mdioWaitForAccessComplete(PhyDev); /* Wait for Read to complete */
-+
-+ return(myMDIO_USERACCESS & MDIO_USERACCESS_DATA);
-+ }
-+
-+
-+/************************************
-+***
-+*** Waits for MDIO_USERACCESS to be ready and writes data
-+***
-+**************************************/
-+void _mdioUserAccessWrite(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr, bit32u data)
-+ {
-+ _mdioWaitForAccessComplete(PhyDev); /* Wait until UserAccess ready */
-+ _mdioUserAccess(PhyDev, MDIO_USERACCESS_WRITE, regadr, phyadr, data);
-+ }
-+
-+void _mdioDumpPhyDetailed(PHY_DEVICE *PhyDev)
-+{
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum;
-+ int RegData;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ RegData = _mdioUserAccessRead(PhyDev, 0, PhyNum);
-+ mdioPrintf("PhyControl: %04X, Lookback=%s, Speed=%s, Duplex=%s\n",
-+ RegData,
-+ RegData&PHY_LOOP?"On":"Off",
-+ RegData&PHY_100?"100":"10",
-+ RegData&PHY_FD?"Full":"Half");
-+ RegData = _mdioUserAccessRead(PhyDev, 1, PhyNum);
-+ mdioPrintf("PhyStatus: %04X, AutoNeg=%s, Link=%s\n",
-+ RegData,
-+ RegData&NWAY_COMPLETE?"Complete":"NotComplete",
-+ RegData&PHY_LINKED?"Up":"Down");
-+ RegData = _mdioUserAccessRead(PhyDev, 4, PhyNum);
-+ mdioPrintf("PhyMyCapability: %04X, 100FD=%s, 100HD=%s, 10FD=%s, 10HD=%s\n",
-+ RegData,
-+ RegData&NWAY_FD100?"Yes":"No",
-+ RegData&NWAY_HD100?"Yes":"No",
-+ RegData&NWAY_FD10?"Yes":"No",
-+ RegData&NWAY_HD10?"Yes":"No");
-+
-+ RegData = _mdioUserAccessRead(PhyDev, 5, PhyNum);
-+ mdioPrintf("PhyPartnerCapability: %04X, 100FD=%s, 100HD=%s, 10FD=%s, 10HD=%s\n",
-+ RegData,
-+ RegData&NWAY_FD100?"Yes":"No",
-+ RegData&NWAY_HD100?"Yes":"No",
-+ RegData&NWAY_FD10?"Yes":"No",
-+ RegData&NWAY_HD10?"Yes":"No");
-+}
-+void _mdioDumpPhy(PHY_DEVICE *PhyDev, bit32u p)
-+ {
-+ bit32u j,n,PhyAcks;
-+ bit32u PhyRegAddr;
-+ bit32u phy_num;
-+ bit32u PhyMask = PhyDev->PhyMask;
-+
-+ PhyAcks=myMDIO_ALIVE;
-+ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
-+
-+ for(phy_num=0,j=1;phy_num<32;phy_num++,j<<=1)
-+ {
-+ if (PhyAcks&j)
-+ {
-+ mdioPrintf("%2d%s:",phy_num,(phy_num==p)?">":" ");
-+ for(PhyRegAddr=0;PhyRegAddr<6;PhyRegAddr++)
-+ {
-+ n = _mdioUserAccessRead(PhyDev, PhyRegAddr, phy_num);
-+ mdioPrintf(" %04x",n&0x0ffff);
-+ }
-+ mdioPrintf("\n");
-+ }
-+ }
-+ _mdioDumpPhyDetailed(PhyDev);
-+ }
-+
-+void _mdioDumpState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u state = PhyDev->PhyState;
-+
-+ if (!cpMacDebug) return;
-+
-+ mdioPrintf("Phy: %d, ",(state&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
-+ mdioPrintf("State: %d/%s, ",(state&PHY_STATE_MASK)>>PHY_STATE_OFFSET,lstate[(state&PHY_STATE_MASK)>>PHY_STATE_OFFSET]);
-+ mdioPrintf("Speed: %d, ",(state&PHY_SPEED_MASK)>>PHY_SPEED_OFFSET);
-+ mdioPrintf("Dup: %d, ",(state&PHY_DUPLEX_MASK)>>PHY_DUPLEX_OFFSET);
-+ mdioPrintf("Tim: %d, ",(state&PHY_TIM_MASK)>>PHY_TIM_OFFSET);
-+ mdioPrintf("SMode: %d, ",(state&PHY_SMODE_MASK)>>PHY_SMODE_OFFSET);
-+ mdioPrintf("Chng: %d",(state&PHY_CHNG_MASK)>>PHY_CHNG_OFFSET);
-+ mdioPrintf("\n");
-+
-+ if (((state&PHY_STATE_MASK)!=FINDING)&&((state&PHY_STATE_MASK)!=INIT))
-+ _mdioDumpPhy(PhyDev, (state&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
-+ }
-+
-+
-+void _mdioResetPhy(PHY_DEVICE *PhyDev,bit32u PhyNum)
-+ {
-+ bit16u PhyControlReg;
-+
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_RESET);
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioPhYReset(%d)\n",PhyNum);
-+
-+ /* Read control register until Phy Reset is complete */
-+ do
-+ {
-+ PhyControlReg = _mdioUserAccessRead(PhyDev, PHY_CONTROL_REG, PhyNum);
-+ }
-+ while (PhyControlReg & PHY_RESET); /* Wait for Reset to clear */
-+ }
-+
-+void _mdioDisablePhy(PHY_DEVICE *PhyDev,bit32u PhyNum)
-+ {
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_ISOLATE|PHY_PDOWN);
-+
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioDisablePhy(%d)\n",PhyNum);
-+
-+ }
-+
-+void _MdioInitState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u CurrentState;
-+
-+ CurrentState=*PhyState;
-+ CurrentState=(CurrentState&~PHY_TIM_MASK)|(PHY_FIND_TO);
-+ CurrentState=(CurrentState&~PHY_STATE_MASK)|(FINDING);
-+ CurrentState=(CurrentState&~PHY_SPEED_MASK);
-+ CurrentState=(CurrentState&~PHY_DUPLEX_MASK);
-+ CurrentState|=PHY_CHANGE;
-+
-+ *PhyState=CurrentState;
-+
-+ }
-+
-+void _MdioFindingState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyMask = PhyDev->PhyMask;
-+ bit32u PhyNum,i,j,PhyAcks;
-+
-+
-+ PhyNum=PHY_NOT_FOUND;
-+
-+ if (*PhyState&PHY_TIM_MASK)
-+ {
-+ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
-+ }
-+ else
-+ {
-+ PhyAcks=myMDIO_ALIVE;
-+ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
-+
-+ for(i=0,j=1;(i<32)&&((j&PhyAcks)==0);i++,j<<=1);
-+
-+ if ((PhyAcks)&&(i<32)) PhyNum=i;
-+ if (PhyNum!=PHY_NOT_FOUND)
-+ {
-+ /* Phy Found! */
-+ *PhyState=(*PhyState&~PHY_DEV_MASK)|((PhyNum&PHY_DEV_MASK)<<PHY_DEV_OFFSET);
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|(FOUND);
-+ *PhyState|=PHY_CHANGE;
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioFindingState: PhyNum: %d\n",PhyNum);
-+ }
-+ else
-+ {
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioFindingState: Timed Out looking for a Phy!\n");
-+ *PhyState|=PHY_RECK_TO; /* This state currently has no support?*/
-+ }
-+ }
-+ }
-+
-+void _MdioFoundState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyMask = PhyDev->PhyMask;
-+ bit32u MLinkMask = PhyDev->MLinkMask;
-+ bit32u PhyNum,PhyStatus,NWAYadvertise,m,phynum,i,j,PhyAcks;
-+ bit32u PhySel;
-+
-+ if ((*PhyState&PHY_SMODE_MASK)==0) return;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ PhyAcks=myMDIO_ALIVE;
-+ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
-+
-+ /* Will now isolate all our Phys, except the one we have decided to use */
-+ for(phynum=0,j=1;phynum<32;phynum++,j<<=1)
-+ {
-+ if (PhyAcks&j)
-+ {
-+ if (phynum!=PhyNum) /* Do not disabled Found Phy */
-+ _mdioDisablePhy(PhyDev,phynum);
-+ }
-+ }
-+
-+ /* Reset the Phy and proceed with auto-negotiation */
-+ _mdioResetPhy(PhyDev,PhyNum);
-+
-+ /* Now setup the MDIOUserPhySel register */
-+
-+ PhySel=PhyNum; /* Set the phy address */
-+
-+ /* Set the way Link will be Monitored */
-+ /* Check the Link Selection Method */
-+ if ((1 << PhyNum) & MLinkMask)
-+ PhySel |= MDIO_USERPHYSEL_LINKSEL;
-+
-+ myMDIO_USERPHYSEL = PhySel; /* update PHYSEL */
-+
-+ /* Get the Phy Status */
-+ PhyStatus = _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
-+
-+
-+#ifdef _CPHAL_CPMAC
-+ /* For Phy Internal loopback test, need to wait until Phy
-+ found, then set Loopback */
-+ if (PhyDev->HalDev->MdioConnect & _CPMDIO_LOOPBK)
-+ {
-+ /* Set Phy in Loopback */
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_LOOP|PHY_FD);
-+ /* Do a read to ensure PHY_LOOP has completed */
-+ _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|(LOOPBACK);
-+ *PhyState|=PHY_CHANGE;
-+ return;
-+ }
-+#endif
-+
-+
-+ if (cpMacDebug)
-+ mdioPrintf("Enable Phy to negotiate external connection\n");
-+
-+ NWAYadvertise=NWAY_SEL;
-+ if (*PhyState&SMODE_FD100) NWAYadvertise|=NWAY_FD100;
-+ if (*PhyState&SMODE_HD100) NWAYadvertise|=NWAY_HD100;
-+ if (*PhyState&SMODE_FD10) NWAYadvertise|=NWAY_FD10;
-+ if (*PhyState&SMODE_HD10) NWAYadvertise|=NWAY_HD10;
-+
-+ *PhyState&=~(PHY_TIM_MASK|PHY_STATE_MASK);
-+ if ((PhyStatus&NWAY_CAPABLE)&&(*PhyState&SMODE_AUTO)) /*NWAY Phy Detected*/
-+ {
-+ /*For NWAY compliant Phys */
-+
-+ _mdioUserAccessWrite(PhyDev, NWAY_ADVERTIZE_REG, PhyNum, NWAYadvertise);
-+
-+ if (cpMacDebug)
-+ {
-+ mdioPrintf("NWAY Advertising: ");
-+ if (NWAYadvertise&NWAY_FD100) mdioPrintf("FullDuplex-100 ");
-+ if (NWAYadvertise&NWAY_HD100) mdioPrintf("HalfDuplex-100 ");
-+ if (NWAYadvertise&NWAY_FD10) mdioPrintf("FullDuplex-10 ");
-+ if (NWAYadvertise&NWAY_HD10) mdioPrintf("HalfDuplex-10 ");
-+ mdioPrintf("\n");
-+ }
-+
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN);
-+
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN|RENEGOTIATE);
-+
-+ *PhyState|=PHY_CHANGE|PHY_NWST_TO|NWAY_START;
-+ }
-+ else
-+ {
-+ *PhyState&=~SMODE_AUTO; /*The Phy is not capable of auto negotiation! */
-+ m=NWAYadvertise;
-+ for(j=0x8000,i=0;(i<16)&&((j&m)==0);i++,j>>=1);
-+ m=j;
-+ j=0;
-+ if (m&(NWAY_FD100|NWAY_HD100))
-+ {
-+ j=PHY_100;
-+ m&=(NWAY_FD100|NWAY_HD100);
-+ }
-+ if (m&(NWAY_FD100|NWAY_FD10))
-+ j |= PHY_FD;
-+ if (cpMacDebug)
-+ mdioPrintf("Requested PHY mode %s Duplex %s Mbps\n",(j&PHY_FD)?"Full":"Half",(j&PHY_100)?"100":"10");
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, j);
-+ *PhyState&=~PHY_SPEED_MASK;
-+ if (j&PHY_100)
-+ *PhyState|=(1<<PHY_SPEED_OFFSET);
-+ *PhyState&=~PHY_DUPLEX_MASK;
-+ if (j&PHY_FD)
-+ *PhyState|=(1<<PHY_DUPLEX_OFFSET);
-+ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
-+ }
-+ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
-+ }
-+
-+void _MdioNwayStartState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum,PhyMode;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ /*Wait for Negotiation to start */
-+
-+ PhyMode=_mdioUserAccessRead(PhyDev, PHY_CONTROL_REG, PhyNum);
-+
-+ if((PhyMode&RENEGOTIATE)==0)
-+ {
-+ _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum); /*Flush pending latch bits*/
-+ *PhyState&=~(PHY_STATE_MASK|PHY_TIM_MASK);
-+ *PhyState|=PHY_CHANGE|NWAY_WAIT|PHY_NWDN_TO;
-+ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
-+ }
-+ else
-+ {
-+ if (*PhyState&PHY_TIM_MASK)
-+ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
-+ else
-+ _mdioPhyTimeOut(PhyDev);
-+ }
-+ }
-+
-+void _MdioNwayWaitState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum,PhyStatus,NWAYadvertise,NWAYREadvertise,NegMode,i,j;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
-+
-+ if (PhyStatus&NWAY_COMPLETE)
-+ {
-+ *PhyState|=PHY_CHANGE;
-+ *PhyState&=~PHY_SPEED_MASK;
-+ *PhyState&=~PHY_DUPLEX_MASK;
-+
-+ NWAYadvertise =_mdioUserAccessRead(PhyDev, NWAY_ADVERTIZE_REG, PhyNum);
-+ NWAYREadvertise =_mdioUserAccessRead(PhyDev, NWAY_REMADVERTISE_REG, PhyNum);
-+
-+ /* Negotiated mode is we and the remote have in common */
-+ NegMode = NWAYadvertise & NWAYREadvertise;
-+
-+ if (cpMacDebug)
-+ {
-+ mdioPrintf("Phy: %d, ",(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
-+ mdioPrintf("NegMode %04X, NWAYadvertise %04X, NWAYREadvertise %04X\n",
-+ NegMode, NWAYadvertise, NWAYREadvertise);
-+ }
-+
-+ /* Limit negotiation to fields below */
-+ NegMode &= (NWAY_FD100|NWAY_HD100|NWAY_FD10|NWAY_HD10);
-+
-+ if (NegMode==0)
-+ {
-+ NegMode=(NWAY_HD100|NWAY_HD10)&NWAYadvertise; /*or 10 ?? who knows, Phy is not MII compliant*/
-+ if(cpMacDebug)
-+ {
-+ mdioPrintf("Mdio:WARNING: Negotiation complete but NO agreement, default is HD\n");
-+ _mdioDumpPhyDetailed(PhyDev);
-+ }
-+ }
-+ for(j=0x8000,i=0;(i<16)&&((j&NegMode)==0);i++,j>>=1);
-+
-+
-+ NegMode=j;
-+ if (cpMacDebug)
-+ {
-+ mdioPrintf("Negotiated connection: ");
-+ if (NegMode&NWAY_FD100) mdioPrintf("FullDuplex 100 Mbs\n");
-+ if (NegMode&NWAY_HD100) mdioPrintf("HalfDuplex 100 Mbs\n");
-+ if (NegMode&NWAY_FD10) mdioPrintf("FullDuplex 10 Mbs\n");
-+ if (NegMode&NWAY_HD10) mdioPrintf("HalfDuplex 10 Mbs\n");
-+ }
-+ if (NegMode!=0)
-+ {
-+ if (PhyStatus&PHY_LINKED)
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINKED;
-+ else
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINK_WAIT;
-+ if (NegMode&(NWAY_FD100|NWAY_HD100))
-+ *PhyState=(*PhyState&~PHY_SPEED_MASK)|(1<<PHY_SPEED_OFFSET);
-+ if (NegMode&(NWAY_FD100|NWAY_FD10))
-+ *PhyState=(*PhyState&~PHY_DUPLEX_MASK)|(1<<PHY_DUPLEX_OFFSET);
-+ }
-+ }
-+ else
-+ {
-+ if (*PhyState&PHY_TIM_MASK)
-+ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
-+ else
-+ _mdioPhyTimeOut(PhyDev);
-+ }
-+ }
-+
-+void _MdioLinkWaitState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyStatus;
-+ bit32u PhyNum;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
-+
-+ if (PhyStatus&PHY_LINKED)
-+ {
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINKED;
-+ *PhyState|=PHY_CHANGE;
-+ }
-+ else
-+ {
-+ if (*PhyState&PHY_TIM_MASK)
-+ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
-+ else
-+ _mdioPhyTimeOut(PhyDev);
-+ }
-+ }
-+
-+void _mdioPhyTimeOut(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState;
-+
-+ if(_mdioMdixSupported(PhyDev) == 0)
-+ return; /* AutoMdix not supported */
-+
-+ PhyState = &PhyDev->PhyState;
-+
-+ /* Indicate MDI/MDIX mode switch is needed */
-+ *PhyState|=PHY_MDIX_SWITCH;
-+
-+ /* Toggle the MDIX mode indicatir */
-+ if(*PhyState & PHY_MDIX)
-+ *PhyState &= ~PHY_MDIX_MASK; /* Current State is MDIX, set to MDI */
-+ else
-+ *PhyState |= PHY_MDIX_MASK; /* Current State is MDI, set to MDIX */
-+
-+ /* Reset state machine to FOUND */
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|(FOUND);
-+ }
-+
-+void _MdioLoopbackState(PHY_DEVICE *PhyDev)
-+ {
-+ return;
-+ }
-+
-+void _MdioLinkedState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum = (*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ if (myMDIO_LINK&(1<<PhyNum)) return; /* if still Linked, exit*/
-+
-+ /* Not Linked */
-+ *PhyState&=~(PHY_STATE_MASK|PHY_TIM_MASK);
-+ if (*PhyState&SMODE_AUTO)
-+ *PhyState|=PHY_CHANGE|NWAY_WAIT|PHY_NWDN_TO;
-+ else
-+ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
-+
-+ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
-+ }
-+
-+void _MdioDefaultState(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ /*Awaiting a cpMacMdioInit call */
-+ *PhyState|=PHY_CHANGE;
-+ }
-+
-+
-+/*User Calls********************************************************* */
-+
-+void cpMacMdioClose(PHY_DEVICE *PhyDev, int Full)
-+ {
-+ }
-+
-+
-+int cpMacMdioInit(PHY_DEVICE *PhyDev, bit32u miibase, bit32u inst, bit32u PhyMask, bit32u MLinkMask, bit32u MdixMask, bit32u ResetReg, bit32u ResetBit, bit32u MdioBusFreq, bit32u MdioClockFreq, int verbose, void *Info)
-+ {
-+ bit32u HighestChannel;
-+ bit32u ControlState;
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u clkdiv; /*MJH+030328*/
-+
-+ cpMacDebug=verbose;
-+
-+ PhyDev->miibase = miibase;
-+ PhyDev->inst = inst;
-+ PhyDev->PhyMask = PhyMask;
-+ PhyDev->MLinkMask = MLinkMask;
-+ PhyDev->MdixMask = MdixMask;
-+#ifdef _CPHAL_CPMAC
-+ PhyDev->HalDev = (HAL_DEVICE*) Info;
-+#endif
-+
-+ *PhyState &= ~PHY_MDIX_MASK; /* Set initial State to MDI */
-+
-+ /* Check that the channel supplied is within range */
-+ HighestChannel = (myMDIO_CONTROL & MDIO_CONTROL_HIGHEST_USER_CHANNEL) > 8;
-+ if(inst > HighestChannel)
-+ return(HighestChannel);
-+
-+ /*Setup MII MDIO access regs */
-+
-+ /* Calculate the correct value for the mclkdiv */
-+ /* See PITS #14 */
-+ if (MdioClockFreq) /*MJH+030402*/
-+ clkdiv = (MdioBusFreq / MdioClockFreq) - 1; /*MJH+030402*/
-+ else /*MJH+030402*/
-+ clkdiv = 0xFF; /*MJH+030402*/
-+
-+ ControlState = MDIO_CONTROL_ENABLE;
-+ ControlState |= (clkdiv & MDIO_CONTROL_CLKDIV); /*MJH+030328*/
-+
-+ /*
-+ If mii is not out of reset or if the Control Register is not set correctly
-+ then initalize
-+ */
-+ if( !(VOLATILE32(ResetReg) & (1 << ResetBit)) ||
-+ ((myMDIO_CONTROL & (MDIO_CONTROL_CLKDIV | MDIO_CONTROL_ENABLE)) != ControlState) )/*GSG~030404*/
-+ {
-+ /* MII not setup, Setup initial condition */
-+ VOLATILE32(ResetReg) &= ~(1 << ResetBit);
-+ _mdioDelayEmulate(PhyDev, 64);
-+ VOLATILE32(ResetReg) |= (1 << ResetBit); /* take mii out of reset */
-+ _mdioDelayEmulate(PhyDev, 64);
-+ myMDIO_CONTROL = ControlState; /* Enable MDIO */
-+ }
-+
-+ *PhyState=INIT;
-+
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioInit\n");
-+ _mdioDumpState(PhyDev);
-+ return(0);
-+ }
-+
-+void cpMacMdioSetPhyMode(PHY_DEVICE *PhyDev,bit32u PhyMode)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u CurrentState;
-+
-+ PhyDev->PhyMode = PhyMode; /* used for AUTOMIDX, planned to replace PhyState fields */
-+
-+ *PhyState&=~PHY_SMODE_MASK;
-+
-+ if (PhyMode&NWAY_AUTO) *PhyState|=SMODE_AUTO;
-+ if (PhyMode&NWAY_FD100) *PhyState|=SMODE_FD100;
-+ if (PhyMode&NWAY_HD100) *PhyState|=SMODE_HD100;
-+ if (PhyMode&NWAY_FD10) *PhyState|=SMODE_FD10;
-+ if (PhyMode&NWAY_HD10) *PhyState|=SMODE_HD10;
-+
-+ CurrentState=*PhyState&PHY_STATE_MASK;
-+ if ((CurrentState==NWAY_START)||
-+ (CurrentState==NWAY_WAIT) ||
-+ (CurrentState==LINK_WAIT) ||
-+ (CurrentState==LINKED) )
-+ *PhyState=(*PhyState&~PHY_STATE_MASK)|FOUND|PHY_CHANGE;
-+ if (cpMacDebug)
-+ mdioPrintf("cpMacMdioSetPhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
-+ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
-+ PhyMode&NWAY_HD100);
-+ _mdioDumpState(PhyDev);
-+ }
-+
-+/* cpMacMdioTic is called every 10 mili seconds to process Phy states */
-+
-+int cpMacMdioTic(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u CurrentState;
-+
-+ /*Act on current state of the Phy */
-+
-+ CurrentState=*PhyState;
-+ switch(CurrentState&PHY_STATE_MASK)
-+ {
-+ case INIT: _MdioInitState(PhyDev); break;
-+ case FINDING: _MdioFindingState(PhyDev); break;
-+ case FOUND: _MdioFoundState(PhyDev); break;
-+ case NWAY_START: _MdioNwayStartState(PhyDev); break;
-+ case NWAY_WAIT: _MdioNwayWaitState(PhyDev); break;
-+ case LINK_WAIT: _MdioLinkWaitState(PhyDev); break;
-+ case LINKED: _MdioLinkedState(PhyDev); break;
-+ case LOOPBACK: _MdioLoopbackState(PhyDev); break;
-+ default: _MdioDefaultState(PhyDev); break;
-+ }
-+
-+ /*Dump state info if a change has been detected */
-+
-+ if ((CurrentState&~PHY_TIM_MASK)!=(*PhyState&~PHY_TIM_MASK))
-+ _mdioDumpState(PhyDev);
-+
-+ /* Check is MDI/MDIX mode switch is needed */
-+ if(*PhyState & PHY_MDIX_SWITCH)
-+ {
-+ bit32u Mdix;
-+
-+ *PhyState &= ~PHY_MDIX_SWITCH; /* Clear Mdix Flip indicator */
-+
-+ if(*PhyState & PHY_MDIX)
-+ Mdix = 1;
-+ else
-+ Mdix = 0;
-+ return(_MIIMDIO_MDIXFLIP|Mdix);
-+ }
-+
-+ /*Return state change to user */
-+
-+ if (*PhyState&PHY_CHNG_MASK)
-+ {
-+ *PhyState&=~PHY_CHNG_MASK;
-+ return(1);
-+ }
-+ else
-+ return(0);
-+ }
-+
-+/* cpMacMdioGetDuplex is called to retrieve the Duplex info */
-+
-+int cpMacMdioGetDuplex(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ return((*PhyState&PHY_DUPLEX_MASK)?1:0); /* return 0 or a 1 */
-+ }
-+
-+/* cpMacMdioGetSpeed is called to retreive the Speed info */
-+
-+int cpMacMdioGetSpeed(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ return(*PhyState&PHY_SPEED_MASK);
-+ }
-+
-+/* cpMacMdioGetPhyNum is called to retreive the Phy Device Adr info */
-+
-+int cpMacMdioGetPhyNum(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ return((*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
-+ }
-+
-+/* cpMacMdioGetLoopback is called to Determine if the LOOPBACK state has been reached*/
-+
-+int cpMacMdioGetLoopback(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ return((*PhyState&PHY_STATE_MASK)==LOOPBACK);
-+ }
-+/* cpMacMdioGetLinked is called to Determine if the LINKED state has been reached*/
-+
-+int cpMacMdioGetLinked(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ return((*PhyState&PHY_STATE_MASK)==LINKED);
-+ }
-+
-+void cpMacMdioLinkChange(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum,PhyStatus;
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+
-+ if (cpMacMdioGetLinked(PhyDev))
-+ {
-+ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
-+
-+ if ((PhyStatus&PHY_LINKED)==0)
-+ {
-+ *PhyState&=~(PHY_TIM_MASK|PHY_STATE_MASK);
-+ if (*PhyState&SMODE_AUTO)
-+ {
-+ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN|RENEGOTIATE);
-+ *PhyState|=PHY_CHANGE|PHY_NWST_TO|NWAY_START;
-+ }
-+ else
-+ {
-+ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
-+ }
-+ }
-+ }
-+ }
-+
-+void cpMacMdioGetVer(bit32u miibase, bit32u *ModID, bit32u *RevMaj, bit32u *RevMin)
-+ {
-+ bit32u Ver;
-+
-+ Ver = MDIO_VER(miibase);
-+
-+ *ModID = (Ver & MDIO_VER_MODID) >> 16;
-+ *RevMaj = (Ver & MDIO_VER_REVMAJ) >> 8;
-+ *RevMin = (Ver & MDIO_VER_REVMIN);
-+ }
-+
-+int cpMacMdioGetPhyDevSize(void)
-+ {
-+ return(sizeof(PHY_DEVICE));
-+ }
-+
-+ /* returns 0 if current Phy has AutoMdix support, otherwise 0 */
-+int _mdioMdixSupported(PHY_DEVICE *PhyDev)
-+ {
-+ bit32u *PhyState = &PhyDev->PhyState;
-+ bit32u PhyNum;
-+
-+ if((PhyDev->PhyMode & NWAY_AUTOMDIX) == 0)
-+ return(0); /* AutoMdix not turned on */
-+
-+ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
-+ if( ((1<<PhyNum) & PhyDev->MdixMask) == 0)
-+ return(0); /* Phy does not support AutoMdix*/
-+
-+ return(1);
-+ }
-+
-+/* If current Phy has AutoMdix support add Mdix Delay to the Timer State Value */
-+void _mdioMdixDelay(PHY_DEVICE *PhyDev)
-+ {
-+ int Delay;
-+ bit32u *PhyState = &PhyDev->PhyState;
-+#ifdef _CPHAL_CPMAC
-+ HAL_DEVICE *HalDev = PhyDev->HalDev;
-+#endif
-+
-+ if(_mdioMdixSupported(PhyDev) == 0)
-+ return; /* AutoMdix not supported */
-+/* Currently only supported when used with the CPMAC */
-+#ifdef _CPHAL_CPMAC
-+ /* Get the Delay value in milli-seconds and convert to ten-milli second value */
-+ Delay = cpmacRandomRange(HalDev, _AUTOMDIX_DELAY_MIN, _AUTOMDIX_DELAY_MAX);
-+ Delay /= 10;
-+
-+ /* Add AutoMidx Random Switch Delay to AutoMdix Link Delay */
-+
-+ Delay += (PHY_MDIX_TO>>PHY_TIM_OFFSET);
-+
-+ /* Change Timeout value to AutoMdix standard */
-+ *PhyState &= ~(PHY_TIM_MASK); /* Clear current Time out value */
-+ *PhyState |= (Delay<<PHY_TIM_OFFSET); /* Set new value */
-+#endif
-+ }
-+
-+
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpmdio.h linux.dev/drivers/net/avalanche_cpmac/cpmdio.h
---- linux.old/drivers/net/avalanche_cpmac/cpmdio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpmdio.h 2005-07-10 03:22:40.515159000 +0200
-@@ -0,0 +1,73 @@
-+/*****************************************************************************
-+** TNETD53xx Software Support
-+** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
-+**
-+** FILE: cpmdio.h User Include for MDIO API Access
-+**
-+** DESCRIPTION:
-+** This include file contains definitions for the the MDIO API
-+**
-+** HISTORY:
-+** 27Mar02 Michael Hanrahan Original (modified from emacmdio.h)
-+** 04Apr02 Michael Hanrahan Added Interrupt Support
-+*****************************************************************************/
-+#ifndef _INC_CPMDIO
-+#define _INC_CPMDIO
-+
-+
-+#ifndef __CPHAL_CPMDIO
-+typedef void PHY_DEVICE;
-+#endif
-+
-+
-+/*Version Information */
-+
-+void cpMacMdioGetVer(bit32u miiBase, bit32u *ModID, bit32u *RevMaj, bit32u *RevMin);
-+
-+/*Called once at the begining of time */
-+
-+int cpMacMdioInit(PHY_DEVICE *PhyDev, bit32u miibase, bit32u inst, bit32u PhyMask, bit32u MLinkMask, bit32u MdixMask, bit32u ResetBase, bit32u ResetBit, bit32u MdioBusFreq, bit32u MdioClockFreq, int verbose, void *Info);
-+int cpMacMdioGetPhyDevSize(void);
-+
-+
-+/*Called every 10 mili Seconds, returns TRUE if there has been a mode change */
-+
-+int cpMacMdioTic(PHY_DEVICE *PhyDev);
-+
-+/*Called to set Phy mode */
-+
-+void cpMacMdioSetPhyMode(PHY_DEVICE *PhyDev,bit32u PhyMode);
-+
-+/*Calls to retreive info after a mode change! */
-+
-+int cpMacMdioGetDuplex(PHY_DEVICE *PhyDev);
-+int cpMacMdioGetSpeed(PHY_DEVICE *PhyDev);
-+int cpMacMdioGetPhyNum(PHY_DEVICE *PhyDev);
-+int cpMacMdioGetLinked(PHY_DEVICE *PhyDev);
-+void cpMacMdioLinkChange(PHY_DEVICE *PhyDev);
-+
-+/* Shot Down */
-+
-+void cpMacMdioClose(PHY_DEVICE *PhyDev, int Full);
-+
-+
-+/* Phy Mode Values */
-+#define NWAY_AUTOMDIX (1<<16)
-+#define NWAY_FD100 (1<<8)
-+#define NWAY_HD100 (1<<7)
-+#define NWAY_FD10 (1<<6)
-+#define NWAY_HD10 (1<<5)
-+#define NWAY_AUTO (1<<0)
-+
-+/*
-+ *
-+ * Tic() return values
-+ *
-+ */
-+
-+#define _MIIMDIO_MDIXFLIP (1<<28)
-+
-+#define _AUTOMDIX_DELAY_MIN 80 /* milli-seconds*/
-+#define _AUTOMDIX_DELAY_MAX 200 /* milli-seconds*/
-+
-+#endif /* _INC_CPMDIO */
-diff -urN linux.old/drivers/net/avalanche_cpmac/cppi_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cppi_cpmac.c
---- linux.old/drivers/net/avalanche_cpmac/cppi_cpmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cppi_cpmac.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,1345 @@
-+/*************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cppi.c
-+ *
-+ * DESCRIPTION:
-+ * This file contains shared code for all CPPI modules.
-+ *
-+ * HISTORY:
-+ * 7Aug02 Greg RC1.00 Original Version created.
-+ * 27Sep02 Mick RC1.01 Merged for use by CPMAC/CPSAR
-+ * 16Oct02 Mick RC1.02 Performance Tweaks (see cppihist.txt)
-+ * 12Nov02 Mick RC1.02 Updated to use cpmac_reg.h
-+ * 09Jan03 Mick RC3.01 Removed modification to RxBuffer ptr
-+ * 28Mar03 Mick 1.03 RxReturn now returns error if Malloc Fails
-+ * 10Apr03 Mick 1.03.02 Added Needs Buffer Support
-+ * 11Jun03 Mick 1.06.02 halSend() errors corrected
-+ * 23Aug04 Mick 1.07.08 cpmac only - Send: bypass threshold check if TxInts re-enabled
-+ *
-+ * @author Greg Guyotte
-+ * @version 1.00
-+ * @date 7-Aug-2002
-+ *****************************************************************************/
-+/* each CPPI module must modify this file, the rest of the
-+ code in cppi.c should be totally shared *//* Each CPPI module MUST properly define all constants shown below */
-+
-+/* CPPI registers */
-+
-+/* the following defines are not CPPI specific */
-+
-+static int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork);
-+
-+static void FreeRx(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ HAL_RCB *rcb_ptr; /*+GSG 030303*/
-+ int rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf; /*+GSG 030303*/
-+ int Num = HalDev->ChData[Ch].RxNumBuffers, i; /*+GSG 030303*/
-+
-+ /* Free Rx data buffers attached to descriptors, if necessary */
-+ if (HalDev->RcbStart[Ch] != 0) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ for(i=0;i<Num;i++) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ rcb_ptr = (HAL_RCB *)(HalDev->RcbStart[Ch] + (i*rcbSize)); /*+GSG 030303*/
-+
-+ /* free the data buffer */
-+ if (rcb_ptr->DatPtr != 0)
-+ {
-+
-+ HalDev->OsFunc->FreeRxBuffer((void *)rcb_ptr->OsInfo, (void *)rcb_ptr->DatPtr);
-+ rcb_ptr->OsInfo=0; /*MJH+030522*/
-+ rcb_ptr->DatPtr=0; /*MJH+030522*/
-+ }
-+ } /*+GSG 030303*/
-+ } /*+GSG 030303*/
-+
-+ /* free up all desciptors at once */
-+ HalDev->OsFunc->FreeDmaXfer(HalDev->RcbStart[Ch]);
-+
-+ /* mark buffers as freed */
-+ HalDev->RcbStart[Ch] = 0;
-+ }
-+
-+static void FreeTx(HAL_DEVICE *HalDev, int Ch, int Queue)
-+ {
-+
-+/*+GSG 030303*/
-+
-+ /* free all descriptors at once */
-+ HalDev->OsFunc->FreeDmaXfer(HalDev->TcbStart[Ch][Queue]);
-+
-+ HalDev->TcbStart[Ch][Queue] = 0;
-+ }
-+
-+/* return of 0 means that this code executed, -1 means the interrupt was not
-+ a teardown interrupt */
-+static int RxTeardownInt(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ bit32u base = HalDev->dev_base;
-+
-+ /* check to see if the interrupt is a teardown interrupt */
-+ if (((CPMAC_RX_INT_ACK( base , Ch )) & TEARDOWN_VAL) == TEARDOWN_VAL)
-+ {
-+ /* finish channel teardown */
-+
-+ /* Free channel resources on a FULL teardown */
-+ if (HalDev->RxTeardownPending[Ch] & FULL_TEARDOWN)
-+ {
-+ FreeRx(HalDev, Ch);
-+ }
-+
-+ /* bug fix - clear Rx channel pointers on teardown */
-+ HalDev->RcbPool[Ch] = 0;
-+ HalDev->RxActQueueHead[Ch] = 0;
-+ HalDev->RxActQueueCount[Ch] = 0;
-+ HalDev->RxActive[Ch] = FALSE;
-+
-+ /* write completion pointer */
-+ (CPMAC_RX_INT_ACK( base , Ch )) = TEARDOWN_VAL;
-+
-+ /* use direction bit as a teardown pending bit! May be able to
-+ use only one teardown pending integer in HalDev */
-+
-+ HalDev->RxTeardownPending[Ch] &= ~RX_TEARDOWN;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
-+ CPMAC_RX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Ch);
-+ if ((HalDev->RxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
-+ {
-+
-+ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_RX);
-+ }
-+ HalDev->RxTeardownPending[Ch] = 0;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+ return (-1);
-+ }
-+
-+/* return of 0 means that this code executed, -1 means the interrupt was not
-+ a teardown interrupt. Note: this code is always called with Queue == 0 (hi priority). */
-+static int TxTeardownInt(HAL_DEVICE *HalDev, int Ch, int Queue)
-+ {
-+ bit32u base = HalDev->dev_base;
-+ HAL_TCB *Last, *Curr, *First; /*+GSG 030303*/
-+ int i;
-+
-+ if (((CPMAC_TX_INT_ACK( base , Ch )) & TEARDOWN_VAL) == TEARDOWN_VAL)
-+ {
-+ /* perform all actions for both queues (+GSG 040212) */
-+ for (i=0; i<HalDev->ChData[Ch].TxNumQueues; i++)
-+ {
-+ /* return outstanding buffers to OS +RC3.02*/
-+ Curr = HalDev->TxActQueueHead[Ch][i]; /*+GSG 030303*/
-+ First = Curr; /*+GSG 030303*/
-+ while (Curr) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ /* Pop TCB(s) for packet from the stack */ /*+GSG 030303*/
-+ Last = Curr->Eop; /*+GSG 030303*/
-+ HalDev->TxActQueueHead[Ch][i] = Last->Next; /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* return to OS */ /*+GSG 030303*/
-+ HalDev->OsFunc->SendComplete(Curr->OsInfo); /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* Push Tcb(s) back onto the stack */ /*+GSG 030303*/
-+ Curr = Last->Next; /*+GSG 030303*/
-+ Last->Next = HalDev->TcbPool[Ch][i]; /*+GSG 030303*/
-+ HalDev->TcbPool[Ch][i] = First; /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* set the first(SOP) pointer for the next packet */ /*+GSG 030303*/
-+ First = Curr; /*+GSG 030303*/
-+ } /*+GSG 030303*/
-+ }
-+
-+ /* finish channel teardown */
-+
-+ if (HalDev->TxTeardownPending[Ch] & FULL_TEARDOWN)
-+ {
-+ FreeTx(HalDev, Ch, 0);
-+
-+ if (HalDev->ChData[Ch].TxNumQueues == 2)
-+ FreeTx(HalDev, Ch, 1);
-+ } /* if FULL teardown */
-+
-+ /* perform all actions for both queues (+GSG 040212) */
-+ for (i=0; i<HalDev->ChData[Ch].TxNumQueues; i++)
-+ {
-+ /* bug fix - clear Tx channel pointers on teardown */
-+ HalDev->TcbPool[Ch][i] = 0;
-+ HalDev->TxActQueueHead[Ch][i] = 0;
-+ HalDev->TxActQueueCount[Ch][i] = 0;
-+ HalDev->TxActive[Ch][i] = FALSE;
-+ }
-+
-+ /* write completion pointer, only needed for the high priority queue */
-+ (CPMAC_TX_INT_ACK( base , Ch )) = TEARDOWN_VAL;
-+
-+ /* no longer pending teardown */
-+ HalDev->TxTeardownPending[Ch] &= ~TX_TEARDOWN;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
-+ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Ch);
-+ if ((HalDev->TxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
-+ {
-+
-+ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX);
-+ }
-+ HalDev->TxTeardownPending[Ch] = 0;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+ return (-1);
-+ }
-+
-+/* +GSG 030421 */
-+static void AddToRxQueue(HAL_DEVICE *HalDev, HAL_RCB *FirstRcb, HAL_RCB *LastRcb, int FragCount, int Ch)
-+ {
-+ if (HalDev->RxActQueueHead[Ch]==0)
-+ {
-+
-+ HalDev->RxActQueueHead[Ch]=FirstRcb;
-+ HalDev->RxActQueueTail[Ch]=LastRcb;
-+ if (!HalDev->RxActive[Ch])
-+ {
-+ /* write Rx Queue Head Descriptor Pointer */
-+ ((CPMAC_RX_HDP( HalDev->dev_base , Ch )) ) = VirtToPhys(FirstRcb) - HalDev->offset;
-+ HalDev->RxActive[Ch]=TRUE;
-+ }
-+ }
-+ else
-+ {
-+ register HAL_RCB *OldTailRcb;
-+ register bit32u rmode;
-+
-+ HalDev->OsFunc->CriticalOn();
-+ OldTailRcb=HalDev->RxActQueueTail[Ch];
-+ OldTailRcb->Next=(void *)FirstRcb;
-+ OldTailRcb=VirtToVirtNoCache(OldTailRcb);
-+ OldTailRcb->HNext=VirtToPhys(FirstRcb) - HalDev->offset;
-+ HalDev->RxActQueueTail[Ch]=LastRcb;
-+ rmode=OldTailRcb->mode;
-+ if (rmode&CB_EOQ_BIT)
-+ {
-+ rmode&=~CB_EOQ_BIT;
-+ ((CPMAC_RX_HDP( HalDev->dev_base , Ch )) ) = VirtToPhys(FirstRcb) - HalDev->offset;
-+ OldTailRcb->mode=rmode;
-+ }
-+ HalDev->OsFunc->CriticalOff();
-+ }
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function is called to indicate to the CPHAL that the upper layer
-+ * software has finished processing the receive data (given to it by
-+ * osReceive()). The CPHAL will then return the appropriate receive buffers
-+ * and buffer descriptors to the available pool.
-+ *
-+ * @param HalReceiveInfo Start of receive buffer descriptor chain returned to
-+ * CPHAL.
-+ * @param StripFlag Flag indicating whether the upper layer software has
-+ * retained ownership of the receive data buffers.
-+ *<BR>
-+ * 'FALSE' means that the CPHAL can reuse the receive data buffers.
-+ *<BR>
-+ * 'TRUE' : indicates the data buffers were retained by the OS
-+ *<BR>
-+ * NOTE: If StripFlag is TRUE, it is the responsibility of the upper layer software to free the buffers when they are no longer needed.
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_RCB_NEEDS_BUFFER "EC_VAL_RCB_NEEDS_BUFFER"<BR>
-+ * @ref EC_VAL_RCB_DROPPED "EC_VAL_RCB_DROPPED"<BR>
-+ */
-+static int halRxReturn(HAL_RECEIVEINFO *HalReceiveInfo,
-+ int StripFlag)
-+ {
-+ int Ch, i;
-+ HAL_RCB *LastRcb;
-+ HAL_DEVICE *HalDev;
-+ int RcbSize;
-+ int FragCount;
-+
-+ Ch = HalReceiveInfo->mode&0x0ff;
-+ HalDev = (HAL_DEVICE *)HalReceiveInfo->Off_BLen;
-+ FragCount = HalReceiveInfo->mode>>8;
-+
-+ if (HalDev->State != enOpened)
-+ return(EC_CPMAC |EC_FUNC_RXRETURN|EC_VAL_INVALID_STATE);
-+
-+ LastRcb=(HAL_RCB *)HalReceiveInfo->Eop;
-+ LastRcb->HNext=0;
-+ LastRcb->Next=0;
-+ RcbSize = HalDev->ChData[Ch].RxBufSize;
-+
-+ if (FragCount>1)
-+ {
-+ LastRcb->Off_BLen=RcbSize;
-+ LastRcb->mode=CB_OWNERSHIP_BIT;
-+ }
-+
-+ HalReceiveInfo->Off_BLen=RcbSize;
-+ HalReceiveInfo->mode=CB_OWNERSHIP_BIT;
-+
-+ /* If OS has kept the buffers for this packet, attempt to alloc new buffers */
-+ if (StripFlag)
-+ {
-+ int rc=0; /*MJH+030417*/
-+ int GoodCount=0; /*GSG+030421*/
-+ HAL_RCB *TempRcb;
-+ char *pBuf;
-+ HAL_RCB *CurrHeadRcb = HalReceiveInfo, *LastGoodRcb=0; /* +GSG 030421 */
-+
-+ TempRcb = HalReceiveInfo;
-+ for (i=0; i<FragCount; i++)
-+ {
-+ if (TempRcb == 0)
-+ {
-+ dbgPrintf("Rx Return error while allocating new buffers\n");
-+ dbgPrintf("Rcb = %08x, Rcb->Eop = %08x, FragCount = %d:%d\n",
-+ (bit32u)HalReceiveInfo, (bit32u)HalReceiveInfo->Eop, FragCount,i);
-+ osfuncSioFlush();
-+
-+ return(EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_CORRUPT_RCB_CHAIN);
-+ }
-+
-+ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(RcbSize,0,
-+ 0xF,HalDev->ChData[Ch].OsSetup,
-+ (void *)TempRcb,
-+ (void *)&TempRcb->OsInfo,
-+ (void *) HalDev->OsDev);
-+ if (!pBuf)
-+ {
-+ /* malloc failed, add this RCB to Needs Buffer List */
-+ (HAL_RCB *)TempRcb->Eop = TempRcb; /* GSG +030430 */
-+ TempRcb->mode=1<<8|Ch;
-+ TempRcb->Off_BLen=(bit32u)HalDev;
-+
-+ if(HalDev->NeedsCount < MAX_NEEDS) /* +MJH 030410 */
-+ { /* +MJH 030410 */
-+ HalDev->Needs[HalDev->NeedsCount] = (HAL_RECEIVEINFO *) TempRcb; /* +MJH 030410 */
-+ HalDev->NeedsCount++; /* +MJH 030410 */
-+ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_NEEDS_BUFFER); /* ~MJH 030417 */
-+ } /* +MJH 030410 */
-+ else /* +MJH 030410 */
-+ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_DROPPED); /* ~MJH 030417 */
-+
-+ /* requeue any previous RCB's that were ready to go before this one */
-+ if (GoodCount > 0) /* +GSG 030421 */
-+ { /* +GSG 030421 */
-+ LastGoodRcb->HNext=0; /* +GSG 030430 */
-+ LastGoodRcb->Next=0; /* +GSG 030430 */
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)LastGoodRcb, 16); /* +GSG 030430 */
-+
-+ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
-+ GoodCount = 0; /* +GSG 030421 */
-+ } /* +GSG 030421 */
-+
-+ CurrHeadRcb = TempRcb->Next; /* +GSG 030421 */
-+ }
-+ else /* +GSG 030421 */
-+ { /* +GSG 030421 */
-+ /* malloc succeeded, requeue the RCB to the hardware */
-+ TempRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
-+ TempRcb->DatPtr=pBuf;
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)TempRcb, 16);
-+
-+ /* i store the last good RCB in case the malloc fails for the
-+ next fragment. This ensures that I can go ahead and return
-+ a partial chain of RCB's to the hardware */
-+ LastGoodRcb = TempRcb; /* +GSG 030421 */
-+ GoodCount++; /* +GSG 030421 */
-+ } /* +GSG 030421 */
-+ TempRcb = TempRcb->Next;
-+ } /* end of Frag loop */
-+ /* if there any good RCB's to requeue, do so here */
-+ if (GoodCount > 0) /* +GSG 030421 */
-+ {
-+ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
-+ }
-+ return(rc); /* ~GSG 030421 */
-+ }
-+ else
-+ {
-+ /* Not Stripping */
-+ /* Emerald */
-+ /* Write Back SOP and last RCB */
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)HalReceiveInfo, 16);
-+
-+ if (FragCount > 1)
-+ {
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)LastRcb, 16);
-+ }
-+ /* if not stripping buffers, always add to queue */
-+ AddToRxQueue(HalDev, HalReceiveInfo, LastRcb, FragCount, Ch); /*MJH~030520*/
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/* +MJH 030410
-+ Trys to liberate an RCB until liberation fails.
-+ Note: If liberation fails then RxReturn will re-add the RCB to the
-+ Needs list.
-+*/
-+static void NeedsCheck(HAL_DEVICE *HalDev)
-+{
-+ HAL_RECEIVEINFO* HalRcb;
-+ int rc;
-+ HalDev->OsFunc->CriticalOn();
-+ while(HalDev->NeedsCount)
-+ {
-+ HalDev->NeedsCount--;
-+ HalRcb = HalDev->Needs[HalDev->NeedsCount];
-+ rc = halRxReturn(HalRcb, 1);
-+ /* short circuit if RxReturn starts to fail */
-+ if (rc != 0)
-+ break;
-+ }
-+ HalDev->OsFunc->CriticalOff();
-+}
-+
-+/*
-+ * This function allocates transmit buffer descriptors (internal CPHAL function).
-+ * It creates a high priority transmit queue by default for a single Tx
-+ * channel. If QoS is enabled for the given CPHAL device, this function
-+ * will also allocate a low priority transmit queue.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel number.
-+ *
-+ * @return 0 OK, Non-Zero Not OK
-+ */
-+static int InitTcb(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ int i, Num = HalDev->ChData[Ch].TxNumBuffers;
-+ HAL_TCB *pTcb=0;
-+ char *AllTcb;
-+ int tcbSize, Queue;
-+ int SizeMalloc;
-+
-+ tcbSize = (sizeof(HAL_TCB)+0xf)&~0xf;
-+ SizeMalloc = (tcbSize*Num)+0xf;
-+
-+ for (Queue=0; Queue < HalDev->ChData[Ch].TxNumQueues; Queue++)
-+ {
-+ if (HalDev->TcbStart[Ch][Queue] == 0)
-+ {
-+
-+ /* malloc all TCBs at once */
-+ AllTcb = (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
-+ if (!AllTcb)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_TCB_MALLOC_FAILED);
-+ }
-+
-+ HalDev->OsFunc->Memset(AllTcb, 0, SizeMalloc);
-+
-+ /* keep this address for freeing later */
-+ HalDev->TcbStart[Ch][Queue] = AllTcb;
-+ }
-+ else
-+ {
-+ /* if the memory has already been allocated, simply reuse it! */
-+ AllTcb = HalDev->TcbStart[Ch][Queue];
-+ }
-+
-+ /* align to cache line */
-+ AllTcb = (char *)(((bit32u)AllTcb + 0xf) &~ 0xf); /*PITS #143 MJH~030522*/
-+
-+ /* default High priority transmit queue */
-+ HalDev->TcbPool[Ch][Queue]=0;
-+ for(i=0;i<Num;i++)
-+ {
-+ /*pTcb=(HAL_TCB *) OsFunc->MallocDmaXfer(sizeof(HAL_TCB),0,0xffffffff); */
-+ pTcb= (HAL_TCB *)(AllTcb + (i*tcbSize));
-+ pTcb->mode=0;
-+ pTcb->BufPtr=0;
-+ pTcb->Next=HalDev->TcbPool[Ch][Queue];
-+ pTcb->Off_BLen=0;
-+ HalDev->TcbPool[Ch][Queue]=pTcb;
-+ }
-+ /*HalDev->TcbEnd = pTcb;*/
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * This function allocates receive buffer descriptors (internal CPHAL function).
-+ * After allocation, the function 'queues' (gives to the hardware) the newly
-+ * created receive buffers to enable packet reception.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel number.
-+ *
-+ * @return 0 OK, Non-Zero Not OK
-+ */
-+static int InitRcb(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ int i, Num = HalDev->ChData[Ch].RxNumBuffers;
-+ int Size = HalDev->ChData[Ch].RxBufSize;
-+ HAL_RCB *pRcb;
-+ char *pBuf;
-+ char *AllRcb;
-+ int rcbSize;
-+ int DoMalloc = 0;
-+ int SizeMalloc;
-+ int MallocSize;
-+
-+ rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;
-+ SizeMalloc = (rcbSize*Num)+0xf;
-+
-+ if (HalDev->RcbStart[Ch] == 0)
-+ {
-+ DoMalloc = 1;
-+
-+ /* malloc all RCBs at once */
-+ AllRcb= (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
-+ if (!AllRcb)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RCB_MALLOC_FAILED);
-+ }
-+
-+ HalDev->OsFunc->Memset(AllRcb, 0, SizeMalloc);
-+
-+ /* keep this address for freeing later */
-+ HalDev->RcbStart[Ch] = AllRcb;
-+ }
-+ else
-+ {
-+ /* if the memory has already been allocated, simply reuse it! */
-+ AllRcb = HalDev->RcbStart[Ch];
-+ }
-+
-+ /* align to cache line */
-+ AllRcb = (char *)(((bit32u)AllRcb + 0xf)&~0xf); /*PITS #143 MJH~030522*/
-+
-+ HalDev->RcbPool[Ch]=0;
-+ for(i=0;i<Num;i++)
-+ {
-+ pRcb = (HAL_RCB *)(AllRcb + (i*rcbSize));
-+
-+ if (DoMalloc == 1)
-+ {
-+
-+ MallocSize = Size; /*~3.01 */
-+ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(MallocSize,0,0xF,HalDev->ChData[Ch].OsSetup, (void *)pRcb, (void *)&pRcb->OsInfo, (void *) HalDev->OsDev);
-+ if(!pBuf)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RX_BUFFER_MALLOC_FAILED);
-+ }
-+ /* -RC3.01 pBuf = (char *)(((bit32u)pBuf+0xF) & ~0xF); */
-+ pRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
-+ pRcb->DatPtr=pBuf;
-+ }
-+ pRcb->mode=(1<<8)|Ch; /* One Frag for Ch */
-+ pRcb->Next=(void *)HalDev->RcbPool[Ch];
-+ pRcb->Off_BLen=(bit32u)HalDev;
-+ HalDev->RcbPool[Ch]=pRcb;
-+ }
-+
-+ /* Give all of the Rx buffers to hardware */
-+
-+ while(HalDev->RcbPool[Ch])
-+ {
-+ pRcb=HalDev->RcbPool[Ch];
-+ HalDev->RcbPool[Ch]=pRcb->Next;
-+ pRcb->Eop=(void*)pRcb;
-+ pRcb->mode=(1<<8)|Ch;
-+ halRxReturn((HAL_RECEIVEINFO *)pRcb, 0);
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function transmits the data in FragList using available transmit
-+ * buffer descriptors. More information on the use of the Mode parameter
-+ * is available in the module-specific appendices. Note: The OS should
-+ * not call Send() for a channel that has been requested to be torndown.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param FragList Fragment List structure.
-+ * @param FragCount Number of fragments in FragList.
-+ * @param PacketSize Number of bytes to transmit.
-+ * @param OsSendInfo OS Send Information structure. <BR>
-+ * @param Mode 32-bit value with the following bit fields: <BR>
-+ * 31-16: Mode (used for module specific data). <BR>
-+ * 15-08: Queue (transmit queue to send on). <BR>
-+ * 07-00: Channel (channel number to send on).
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_NOT_LINKED "EC_VAL_NOT_LINKED"<BR>
-+ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
-+ * @ref EC_VAL_OUT_OF_TCBS "EC_VAL_OUT_OF_TCBS"<BR>
-+ * @ref EC_VAL_NO_TCBS "EC_VAL_NO_TCBS"<BR>
-+ */
-+static int halSend(HAL_DEVICE *HalDev,FRAGLIST *FragList,
-+ int FragCount,int PacketSize, OS_SENDINFO *OsSendInfo,
-+ bit32u Mode)
-+ {
-+ HAL_TCB *tcb_ptr, *head;
-+ int i;
-+ int rc = EC_NO_ERRORS;
-+ int Ch = Mode & 0xFF;
-+ int Queue = (Mode>>8)&0xFF;
-+ /*int DoThresholdCheck=1; */ /* Used when TxIntDisable is set and TxInts are re-enabled */
-+
-+ if (HalDev->State != enOpened)
-+ return(EC_CPPI|EC_FUNC_SEND|EC_VAL_INVALID_STATE);
-+
-+ if (!HalDev->Linked)
-+ {
-+ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NOT_LINKED;
-+ return(rc);
-+ }
-+
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0) /*MJH~030611*/ /*PITS 148*/
-+ return(EC_CPMAC |EC_FUNC_SEND|EC_VAL_INVALID_CH); /*+GSG 030303*/
-+
-+ HalDev->OsFunc->CriticalOn();
-+
-+ /* Setup Tx mode and size */
-+ if (PacketSize<60)
-+ {
-+ FragList[FragCount-1].len += (60 - PacketSize); /*MJH~030506*//*PITS 132*/
-+ PacketSize = 60; /*MJH~030506*/
-+ }
-+ Mode &= CB_PASSCRC_BIT;
-+
-+ tcb_ptr = head = HalDev->TcbPool[Ch][Queue];
-+
-+ if (tcb_ptr)
-+ {
-+
-+ Mode|=PacketSize|CB_SOF_BIT|CB_OWNERSHIP_BIT;
-+
-+ for (i=0; i<FragCount; i++)
-+
-+ {
-+ /* Setup Tx mode and size */
-+ tcb_ptr->Off_BLen = FragList[i].len;
-+
-+ tcb_ptr->mode = Mode;
-+ tcb_ptr->BufPtr = VirtToPhys((bit32 *)FragList[i].data) - HalDev->offset;
-+ tcb_ptr->OsInfo = OsSendInfo;
-+
-+ if (i == (FragCount - 1))
-+ {
-+ /* last fragment */
-+ tcb_ptr->mode |= CB_EOF_BIT;
-+
-+ /* since this is the last fragment, set the TcbPool pointer before
-+ nulling out the Next pointers */
-+
-+ HalDev->TcbPool[Ch][Queue] = tcb_ptr->Next;
-+
-+ tcb_ptr->Next = 0;
-+ tcb_ptr->HNext = 0;
-+
-+ /* In the Tx Interrupt handler, we will need to know which TCB is EOP,
-+ so we can save that information in the SOP */
-+ head->Eop = tcb_ptr;
-+
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)tcb_ptr, 16);
-+
-+ }
-+ else
-+ {
-+ Mode=CB_OWNERSHIP_BIT;
-+ tcb_ptr->HNext = VirtToPhys((bit32 *)tcb_ptr->Next) - HalDev->offset;
-+
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)tcb_ptr, 16);
-+
-+ tcb_ptr = tcb_ptr->Next; /* what about the end of TCB list?? */
-+
-+ if (tcb_ptr == 0)
-+ {
-+ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_OUT_OF_TCBS;
-+ goto ExitSend;
-+ }
-+ }
-+ } /* for */
-+
-+ /* put it on the high priority queue */
-+ if (HalDev->TxActQueueHead[Ch][Queue] == 0)
-+ {
-+ HalDev->TxActQueueHead[Ch][Queue]=head;
-+ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
-+/*+GSG 030303*//*+GSG 030303*/
-+ if (!HalDev->TxActive[Ch][Queue])
-+ {
-+
-+ bit32u base = HalDev->dev_base;
-+
-+ /* write CPPI TX HDP */
-+ (CPMAC_TX_HDP( base , Ch )) = VirtToPhys(head) - HalDev->offset;
-+ HalDev->TxActive[Ch][Queue]=TRUE;
-+
-+ }
-+ }
-+ else
-+ {
-+ register volatile HAL_TCB *pTailTcb;
-+ register bit32u tmode;
-+ register bit32u pCurrentTcb;
-+
-+ HalDev->TxActQueueTail[Ch][Queue]->Next=head;
-+ /* Emerald fix 10/29 */
-+
-+ pTailTcb=(HAL_TCB *)VirtToVirtNoCache(&HalDev->TxActQueueTail[Ch][Queue]->HNext);
-+ pCurrentTcb=VirtToPhys(head) - HalDev->offset;
-+ pTailTcb->HNext=pCurrentTcb;
-+ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
-+/*+GSG 030303*/
-+ tmode=pTailTcb->mode;
-+ if (tmode&CB_EOQ_BIT)
-+ {
-+ bit32u base = HalDev->dev_base;
-+
-+ tmode&=~CB_EOQ_BIT;
-+ pTailTcb->mode=tmode;
-+ ((CPMAC_TX_HDP( base , Ch )) ) = pCurrentTcb;
-+ }
-+
-+ else
-+ {
-+ if(HalDev->TxIntDisable)
-+ {
-+ /* Enable Interrupts, to ensure packet goes out on wire */
-+ CPMAC_TX_INTMASK_SET(HalDev->dev_base) = (1<<Ch);
-+ halPacketProcessEnd(HalDev); /* Allow Interrupt to be seen at the OS */
-+ /*DoThresholdCheck = 0; */ /* Disable Threshold Check */
-+
-+ }
-+ }
-+
-+ }
-+ rc = EC_NO_ERRORS;
-+ goto ExitSend;
-+ } /* if (tcb_ptr) */
-+ else
-+ {
-+ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NO_TCBS;
-+ goto ExitSend;
-+ }
-+ExitSend:
-+
-+/* 15 June 2004 - NSP Performance Update : If Tx Ints are disabled then process them here */
-+/* 29 June 2004 - NSP Performance Update : Moved to end at request of BCIL */
-+/* 23 Aug 2004 - NSP Performance Update : If Tx Ints are re-enabled do not do Threshold check */
-+
-+ if(HalDev->TxIntDisable /*&& DoThresholdCheck*/)
-+ {
-+ if(--HalDev->TxIntThreshold[Ch] <= 0)
-+ {
-+ int MoreWork;
-+ TxInt(HalDev, Ch, 0, &MoreWork);
-+ HalDev->TxIntThreshold[Ch] = HalDev->TxIntThresholdMaster[Ch];
-+ }
-+ }
-+ HalDev->OsFunc->CriticalOff();
-+
-+ return(rc);
-+ }
-+
-+/*
-+ * This function processes receive interrupts. It traverses the receive
-+ * buffer queue, extracting the data and passing it to the upper layer software via
-+ * osReceive(). It handles all error conditions and fragments without valid data by
-+ * immediately returning the RCB's to the RCB pool.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel Number.
-+ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
-+ *
-+ * @return 0 if OK, non-zero otherwise.
-+ */
-+static int RxInt(HAL_DEVICE *HalDev, int Ch, int *MoreWork)
-+ {
-+ HAL_RCB *CurrentRcb, *SopRcb, *EofRcb, *EopRcb;
-+ bit32u RxBufStatus,PacketsServiced, RxPktLen = 0, RxSopStatus,
-+ FrmFrags, TotalFrags, FrmLen;
-+ int base = HalDev->dev_base, Ret;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ int RxServiceMax = HalDev->ChData[Ch].RxServiceMax;
-+ int FragIndex; /* +GSG 030508 */
-+
-+ if(HalDev->NeedsCount) /* +MJH 030410 */
-+ NeedsCheck(HalDev); /* +MJH 030410 */
-+
-+ /* Handle case of teardown interrupt */
-+ if (HalDev->RxTeardownPending[Ch] != 0)
-+ {
-+ Ret = RxTeardownInt(HalDev, Ch);
-+ if (Ret == 0)
-+ { /*+GSG 030303*/
-+ *MoreWork = 0;
-+ return (EC_NO_ERRORS);
-+ } /*+GSG 030303*/
-+ }
-+
-+ /* Examine first RCB on the software active queue */
-+ CurrentRcb=HalDev->RxActQueueHead[Ch];
-+ osfuncDataCacheHitInvalidate((void*)CurrentRcb, 16);
-+ RxBufStatus=CurrentRcb->mode;
-+ PacketsServiced=0;
-+
-+ /* Process received packets until we find hardware owned descriptors
-+ or until we hit RxServiceMax */
-+ while((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)&&
-+ (PacketsServiced<RxServiceMax)) /* ~GSG 030307 */
-+ {
-+
-+ PacketsServiced++; /* ~GSG 030307 */
-+ SopRcb=CurrentRcb;
-+ RxSopStatus=RxBufStatus;
-+ RxPktLen = RxSopStatus&CB_SIZE_MASK;
-+
-+ FrmFrags=0;
-+ TotalFrags=0;
-+ FragIndex=0;
-+ FrmLen=0;
-+ EofRcb=0;
-+
-+/* +GSG 030508 *//* +GSG 030508 */
-+
-+ /* Loop through all fragments that comprise current packet. Build
-+ fraglist and exit when the end of the packet is reached, or the
-+ end of the descriptor list is reached. */
-+ do
-+ {
-+ bit32u DmaLen;
-+
-+
-+ DmaLen=CurrentRcb->Off_BLen;
-+
-+ FrmLen+=DmaLen;
-+ TotalFrags++;
-+ if (!EofRcb)
-+ {
-+ HalDev->fraglist[FragIndex].data=((char *)CurrentRcb->DatPtr); /* ~GSG 030508 */
-+
-+ HalDev->fraglist[FragIndex].len=DmaLen; /* ~GSG 030508 */
-+
-+ /* GSG 12/9 */
-+ HalDev->fraglist[FragIndex].OsInfo = CurrentRcb->OsInfo; /* ~GSG 030508 */
-+
-+ /* Upper layer must do the data invalidate */
-+
-+ FrmFrags++;
-+ FragIndex++; /* ~GSG 030508 */
-+ if (FrmLen>=RxPktLen)
-+ EofRcb=CurrentRcb;
-+ }
-+ EopRcb=CurrentRcb;
-+ CurrentRcb=EopRcb->Next;
-+ if (CurrentRcb)
-+ {
-+ osfuncDataCacheHitInvalidate((void*)CurrentRcb,16);
-+ }
-+ }while(((EopRcb->mode&CB_EOF_BIT)==0)&&(CurrentRcb));
-+
-+ /* Write the completion pointer for interrupt acknowledgement*/
-+ (CPMAC_RX_INT_ACK( base , Ch )) = VirtToPhys(EopRcb) - HalDev->offset;
-+
-+ EopRcb->Next=0;
-+
-+ if (CurrentRcb == 0)
-+ {
-+ /* If we are out of RCB's we must not send this packet
-+ to the OS. */
-+ int RcbSize = HalDev->ChData[Ch].RxBufSize;
-+
-+ if (TotalFrags>1)
-+ {
-+ EopRcb->Off_BLen=RcbSize;
-+ EopRcb->mode=CB_OWNERSHIP_BIT;
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)EopRcb, 16);
-+ }
-+
-+ SopRcb->Off_BLen=RcbSize;
-+ SopRcb->mode=CB_OWNERSHIP_BIT;
-+ osfuncDataCacheHitWritebackAndInvalidate((void *)SopRcb, 16);
-+
-+ ((CPMAC_RX_HDP( base , Ch )) ) = VirtToPhys(SopRcb);
-+ }
-+ else
-+ {
-+ /* Dequeue packet and send to OS */
-+ int mode;
-+
-+ /* setup SopRcb for the packet */
-+ SopRcb->Eop=(void*)EopRcb;
-+
-+ /* dequeue packet */
-+ HalDev->RxActQueueHead[Ch]=CurrentRcb;
-+
-+ if (EopRcb->mode&CB_EOQ_BIT)
-+ {
-+ /* Next pointer is non-null and EOQ bit is set, which
-+ indicates misqueue packet in CPPI protocol. */
-+
-+ ((CPMAC_RX_HDP( base , Ch )) ) = EopRcb->HNext;
-+ }
-+
-+ mode = (SopRcb->mode & 0xFFFF0000) | Ch;
-+
-+ SopRcb->mode=(FrmFrags<<8)|Ch;
-+ SopRcb->Off_BLen=(bit32u)HalDev;
-+
-+ /* send packet up the higher layer driver */
-+ OsFunc->Receive(HalDev->OsDev,HalDev->fraglist,FragIndex,RxPktLen, /* ~GSG 030508 */
-+ (HAL_RECEIVEINFO *)SopRcb,mode);
-+
-+ RxBufStatus=CurrentRcb->mode;
-+ }
-+ } /* while loop */
-+
-+ if ((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)) /*~GSG 030307*/
-+ {
-+ *MoreWork = 1;
-+ }
-+ else
-+ {
-+ *MoreWork = 0;
-+ }
-+
-+ return (EC_NO_ERRORS);
-+}
-+
-+/*
-+ * This function processes transmit interrupts. It traverses the
-+ * transmit buffer queue, detecting sent data buffers and notifying the upper
-+ * layer software via osSendComplete(). (for SAR, i originally had this split
-+ * into two functions, one for each queue, but joined them on 8/8/02)
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Queue Queue number to service (always 0 for MAC, Choose 1 for SAR to service low priority queue)
-+ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
-+ *
-+ * @return 0 if OK, non-zero otherwise.
-+ */
-+int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork)
-+ {
-+ HAL_TCB *CurrentTcb,*LastTcbProcessed,*FirstTcbProcessed;
-+ int PacketsServiced;
-+ bit32u TxFrameStatus;
-+ int base;
-+ int TxServiceMax = HalDev->ChData[Ch].TxServiceMax;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+/*+GSG 030303*//*+GSG 030303*/
-+
-+ /* load the module base address */
-+ base = HalDev->dev_base;
-+
-+ /* Handle case of teardown interrupt. This must be checked at
-+ the top of the function rather than the bottom, because
-+ the normal data processing can wipe out the completion
-+ pointer which is used to determine teardown complete. */
-+ if (HalDev->TxTeardownPending[Ch] != 0)
-+ {
-+ int Ret;
-+
-+ Ret = TxTeardownInt(HalDev, Ch, Queue);
-+ if (Ret == 0)
-+ { /*+GSG 030303*/
-+ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
-+ return (EC_NO_ERRORS);
-+ } /*+GSG 030303*/
-+ }
-+
-+ OsFunc->CriticalOn(); /* 240904 */
-+
-+ CurrentTcb = HalDev->TxActQueueHead[Ch][Queue];
-+ FirstTcbProcessed=CurrentTcb;
-+
-+ if (CurrentTcb==0)
-+ {
-+ /* I saw this error a couple of times when multi-channels were added */
-+ dbgPrintf("[cppi TxInt()]TxH int with no TCB in queue!\n");
-+ dbgPrintf(" Ch=%d, CurrentTcb = 0x%08x\n", Ch, (bit32u)CurrentTcb);
-+ dbgPrintf(" HalDev = 0x%08x\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ OsFunc->CriticalOff();
-+ return(EC_CPPI|EC_FUNC_TXINT|EC_VAL_NULL_TCB);
-+ }
-+
-+ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
-+ TxFrameStatus=CurrentTcb->mode;
-+ PacketsServiced=0;
-+
-+ /* should the ownership bit check be inside of the loop?? could make it a
-+ while-do loop and take this check away */
-+ if ((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ {
-+ do
-+ {
-+ /* Pop TCB(s) for packet from the stack */
-+ LastTcbProcessed=CurrentTcb->Eop;
-+
-+ /* new location for acknowledge */
-+ /* Write the completion pointer */
-+ (CPMAC_TX_INT_ACK( base , Ch )) = VirtToPhys(LastTcbProcessed) - HalDev->offset;
-+
-+ HalDev->TxActQueueHead[Ch][Queue] = LastTcbProcessed->Next;
-+
-+/*+GSG 030303*//*+GSG 030303*/
-+
-+ osfuncDataCacheHitInvalidate((void *)LastTcbProcessed, 16);
-+
-+ if (LastTcbProcessed->mode&CB_EOQ_BIT)
-+ {
-+ if (LastTcbProcessed->Next)
-+ {
-+ /* Misqueued packet */
-+
-+ (CPMAC_TX_HDP( base , Ch )) = LastTcbProcessed->HNext;
-+
-+ }
-+ else
-+ {
-+ /* Tx End of Queue */
-+
-+ HalDev->TxActive[Ch][Queue]=FALSE;
-+ }
-+ }
-+
-+ OsFunc->SendComplete(CurrentTcb->OsInfo);
-+
-+ /* Push Tcb(s) back onto the stack */
-+ CurrentTcb = LastTcbProcessed->Next;
-+
-+ LastTcbProcessed->Next=HalDev->TcbPool[Ch][Queue];
-+
-+ HalDev->TcbPool[Ch][Queue]=FirstTcbProcessed;
-+
-+ PacketsServiced++;
-+
-+ TxFrameStatus=CB_OWNERSHIP_BIT;
-+ /* set the first(SOP) pointer for the next packet */
-+ FirstTcbProcessed = CurrentTcb;
-+ if (CurrentTcb)
-+ {
-+ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
-+ TxFrameStatus=CurrentTcb->mode;
-+ }
-+
-+ }while(((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ &&(PacketsServiced<TxServiceMax));
-+
-+ if (((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ &&(PacketsServiced==TxServiceMax))
-+ {
-+ *MoreWork = 1;
-+ }
-+ else
-+ {
-+ *MoreWork = 0;
-+ }
-+ }
-+ OsFunc->CriticalOff();
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function performs a teardown for the given channel. The value of the
-+ * Mode parameter controls the operation of the function, as documented below.
-+ *
-+ * Note: If bit 3 of Mode is set, this call is blocking, and will not return
-+ * until the teardown interrupt has occurred and been processed. While waiting
-+ * for a blocking teardown to complete, ChannelTeardown() will signal the OS
-+ * (via Control(.."Sleep"..)) to allow the OS to perform other tasks if
-+ * necessary. If and only if bit 3 of Mode is clear, the CPHAL will call the
-+ * OS TeardownComplete() function to indicate that the teardown has completed.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Ch Channel number.
-+ * @param Mode Bit 0 (LSB): Perform Tx teardown (if set).<BR>
-+ * Bit 1: Perform Rx teardown (if set). <BR>
-+ * Bit 2: If set, perform full teardown (free buffers/descriptors).
-+ * If clear, perform partial teardown (keep buffers). <BR>
-+ * Bit 3 (MSB): If set, call is blocking.
-+ * If clear, call is non-blocking.
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
-+ * @ref EC_VAL_TX_TEARDOWN_ALREADY_PEND "EC_VAL_TX_TEARDOWN_ALREADY_PEND"<BR>
-+ * @ref EC_VAL_RX_TEARDOWN_ALREADY_PEND "EC_VAL_RX_TEARDOWN_ALREADY_PEND"<BR>
-+ * @ref EC_VAL_TX_CH_ALREADY_TORNDOWN "EC_VAL_TX_CH_ALREADY_TORNDOWN"<BR>
-+ * @ref EC_VAL_RX_CH_ALREADY_TORNDOWN "EC_VAL_RX_CH_ALREADY_TORNDOWN"<BR>
-+ * @ref EC_VAL_TX_TEARDOWN_TIMEOUT "EC_VAL_TX_TEARDOWN_TIMEOUT"<BR>
-+ * @ref EC_VAL_RX_TEARDOWN_TIMEOUT "EC_VAL_RX_TEARDOWN_TIMEOUT"<BR>
-+ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
-+ */
-+static int halChannelTeardown(HAL_DEVICE *HalDev, int Ch, bit32 Mode)
-+ {
-+ int DoTx, DoRx, Sleep=2048, timeout=0; /*MJH~030306*/
-+ bit32u base = HalDev->dev_base;
-+
-+/* Set the module, used for error returns */
-+
-+ DoTx = (Mode & TX_TEARDOWN);
-+ DoRx = (Mode & RX_TEARDOWN);
-+
-+ if (HalDev->State < enInitialized)
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_STATE);
-+
-+ if ((Ch < 0) || (Ch > (MAX_CHAN-1) ))
-+ {
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
-+ }
-+
-+ /* set teardown pending bits before performing the teardown, because they
-+ will be used in the int handler (this is done for AAL5) */
-+ if (DoTx)
-+ {
-+ if (HalDev->TxTeardownPending[Ch] != 0)
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_ALREADY_PEND);
-+
-+ /* If a full teardown, this also means that the user must
-+ setup all channels again to use them */
-+ if (Mode & FULL_TEARDOWN)
-+ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
-+
-+ if (HalDev->State < enOpened)
-+ {
-+ /* if the hardware has never been opened, the channel has never actually
-+ been setup in the hardware, so I just need to reset the software flag
-+ and leave */
-+ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)
-+ {
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_CH_ALREADY_TORNDOWN);
-+ }
-+
-+ /* set teardown flag */
-+ HalDev->TxTeardownPending[Ch] = Mode;
-+ }
-+ }
-+
-+ if (DoRx)
-+ {
-+ if (HalDev->RxTeardownPending[Ch] != 0)
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_ALREADY_PEND);
-+
-+ if (Mode & FULL_TEARDOWN)
-+ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
-+
-+ if (HalDev->State < enOpened)
-+ {
-+ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == 0)
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_CH_ALREADY_TORNDOWN);
-+
-+ HalDev->RxTeardownPending[Ch] = Mode;
-+ }
-+ }
-+
-+ /* Perform Tx Teardown Duties */
-+ if ((DoTx) && (HalDev->State == enOpened))
-+ {
-+ /* Request TX channel teardown */
-+ (CPMAC_TX_TEARDOWN( base )) = Ch;
-+
-+ /* wait until teardown has completed */
-+ if (Mode & BLOCKING_TEARDOWN)
-+ {
-+ timeout = 0;
-+ while (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
-+ {
-+ osfuncSleep(&Sleep);
-+
-+ timeout++;
-+ if (timeout > 100000)
-+ {
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_TIMEOUT);
-+ }
-+ }
-+ }
-+ } /* if DoTx */
-+
-+ /* Perform Rx Teardown Duties */
-+ if ((DoRx) && (HalDev->State == enOpened))
-+ {
-+
-+ /* perform CPMAC specific RX channel teardown */
-+ CPMAC_RX_TEARDOWN(base) = Ch;
-+
-+ if (Mode & BLOCKING_TEARDOWN)
-+ {
-+ timeout = 0;
-+ while (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
-+ {
-+ osfuncSleep(&Sleep);
-+
-+ timeout++;
-+ if (timeout > 100000)
-+ {
-+ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_TIMEOUT);
-+ }
-+ }
-+ }
-+ } /* if DoRx */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function closes the CPHAL module. The module will be reset.
-+ * The Mode parameter should be used to determine the actions taken by
-+ * Close().
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Mode Indicates actions to take on close. The following integer
-+ * values are valid: <BR>
-+ * 1: Does not free buffer resources, init parameters remain
-+ * intact. User can then call Open() without calling Init()
-+ * to attempt to reset the device and bring it back to the
-+ * last known state.<BR>
-+ * 2: Frees the buffer resources, but keeps init parameters. This
-+ * option is a more aggressive means of attempting a device reset.
-+ * 3: Frees the buffer resources, and clears all init parameters. <BR>
-+ * At this point, the caller would have to call to completely
-+ * reinitialize the device (Init()) before being able to call
-+ * Open(). Use this mode if you are shutting down the module
-+ * and do not plan to restart.
-+ *
-+ * @return EC_NO_ERRORS (ok).<BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * Any error code from halChannelTeardown().<BR>
-+ */
-+static int halClose(HAL_DEVICE *HalDev, bit32 Mode)
-+ {
-+ int Ch, Inst, Ret;
-+ OS_DEVICE *TmpOsDev;
-+ OS_FUNCTIONS *TmpOsFunc;
-+ HAL_FUNCTIONS *TmpHalFunc;
-+ char *TmpDeviceInfo;
-+
-+ int Ticks; /*MJH~030306*/
-+
-+ /* Verify proper device state */
-+ if (HalDev->State != enOpened)
-+ return (EC_CPMAC | EC_FUNC_CLOSE|EC_VAL_INVALID_STATE);
-+
-+ /* Teardown all open channels */
-+ for (Ch = 0; Ch <= (MAX_CHAN-1) ; Ch++)
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
-+ {
-+ if (Mode == 1)
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ else
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ }
-+
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
-+ {
-+ if (Mode == 1)
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ else
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ }
-+ }
-+
-+ /* free fraglist in HalDev */
-+ HalDev->OsFunc->Free(HalDev->fraglist);
-+ HalDev->fraglist = 0;
-+
-+ /* unregister the interrupt */
-+ HalDev->OsFunc->IsrUnRegister(HalDev->OsDev, HalDev->interrupt);
-+
-+ Ticks = 0; /* Disable Tick Timer */ /*MJH+030306*/
-+ HalDev->OsFunc->Control(HalDev->OsDev, hcTick, hcClear, &Ticks); /*MJH+030306*/
-+
-+ /* Free the Phy Information Structure */
-+ if(HalDev->PhyDev)
-+ {
-+ HalDev->OsFunc->Free(HalDev->PhyDev); /*MJH+030513*/
-+ HalDev->PhyDev = 0; /*MJH+030522*/
-+ }
-+
-+ /* Perform CPMAC specific closing functions */
-+ CPMAC_MACCONTROL(HalDev->dev_base) &= ~MII_EN;
-+ CPMAC_TX_CONTROL(HalDev->dev_base) &= ~TX_EN;
-+ CPMAC_RX_CONTROL(HalDev->dev_base) &= ~RX_EN;
-+
-+ /* put device back into reset */
-+ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit);
-+ Ticks = 64; /*MJH~030306*/
-+ osfuncSleep(&Ticks);
-+
-+ /* If mode is 3, than clear the HalDev and set next state to DevFound*/
-+ if (Mode == 3)
-+ {
-+ /* I need to keep the HalDev parameters that were setup in InitModule */
-+ TmpOsDev = HalDev->OsDev;
-+ TmpOsFunc = HalDev->OsFunc;
-+ TmpDeviceInfo = HalDev->DeviceInfo;
-+
-+ TmpHalFunc = HalDev->HalFuncPtr;
-+ Inst = HalDev->Inst;
-+
-+ /* Clear HalDev */
-+
-+ HalDev->OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
-+
-+ /* Restore key parameters */
-+ HalDev->OsDev = TmpOsDev;
-+ HalDev->OsFunc = TmpOsFunc;
-+ HalDev->DeviceInfo = TmpDeviceInfo;
-+
-+ HalDev->HalFuncPtr = TmpHalFunc;
-+ HalDev->Inst = Inst;
-+
-+ HalDev->State = enDevFound;
-+ }
-+ else
-+ {
-+ HalDev->State = enInitialized;
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpremap_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpremap_cpmac.c
---- linux.old/drivers/net/avalanche_cpmac/cpremap_cpmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpremap_cpmac.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,28 @@
-+#ifndef _INC_CPREMAP_C
-+#define _INC_CPREMAP_C
-+
-+#ifdef __ADAM2
-+static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
-+ {
-+ asm(" cache 17, (%0)" : : "r" (ptr));
-+ }
-+
-+static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
-+ {
-+ asm(" cache 25, (%0)" : : "r" (ptr));
-+ }
-+
-+static inline void osfuncDataCacheHitWritebackAndInvalidate(void *ptr, int Size)
-+ {
-+ asm(" cache 21, (%0)" : : "r" (ptr));
-+ }
-+
-+#else
-+
-+#define osfuncDataCacheHitInvalidate(MemPtr, Size) __asm__(" .set mips3; cache 17, (%0); .set mips0" : : "r" (MemPtr))
-+#define osfuncDataCacheHitWritebackAndInvalidate(MemPtr, Size) __asm__(" .set mips3; cache 21, (%0); .set mips0" : : "r" (MemPtr))
-+#define osfuncDataCacheHitWriteback(MemPtr, Size) __asm__(" .set mips3; cache 25, (%0); .set mips0" : : "r" (MemPtr))
-+
-+#endif
-+
-+#endif
-diff -urN linux.old/drivers/net/avalanche_cpmac/cpswhal_cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpswhal_cpmac.h
---- linux.old/drivers/net/avalanche_cpmac/cpswhal_cpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/cpswhal_cpmac.h 2005-07-10 03:22:40.518159000 +0200
-@@ -0,0 +1,632 @@
-+/************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cphal.h
-+ *
-+ * DESCRIPTION:
-+ * User include file, contains data definitions shared between the CPHAL
-+ * and the upper-layer software.
-+ *
-+ * HISTORY:
-+ * Date Modifier Ver Notes
-+ * 28Feb02 Greg 1.00 Original
-+ * 06Mar02 Greg 1.01 Documentation enhanced
-+ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
-+ * 22Nov02 Mick RC2 Additions from Denis' input on Control
-+ *
-+ * author Greg Guyotte
-+ * version 1.02
-+ * date 18-Jul-2002
-+ *****************************************************************************/
-+#ifndef _INC_CPHAL_H
-+#define _INC_CPHAL_H
-+
-+#ifdef _CPHAL_CPMAC
-+#include "ec_errors_cpmac.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "ec_errors_cpaal5.h"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "ec_errors_cpsar.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "ec_errors_cpaal2.h"
-+#endif
-+
-+#ifndef __ADAM2
-+typedef char bit8;
-+typedef short bit16;
-+typedef int bit32;
-+
-+typedef unsigned char bit8u;
-+typedef unsigned short bit16u;
-+typedef unsigned int bit32u;
-+
-+/*
-+typedef char INT8;
-+typedef short INT16;
-+typedef int INT32;
-+typedef unsigned char UINT8;
-+typedef unsigned short UINT16;
-+typedef unsigned int UINT32;
-+*/
-+/*typedef unsigned int size_t;*/
-+#endif
-+
-+#ifdef _CPHAL
-+
-+#ifndef TRUE
-+#define TRUE (1==1)
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE (1==2)
-+#endif
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+#endif
-+
-+#define VirtToPhys(a) (((int)a)&~0xe0000000)
-+#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
-+#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
-+#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
-+#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
-+/*
-+#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
-+#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
-+*/
-+
-+#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
-+#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
-+
-+/* Channel Teardown Defines */
-+#define RX_TEARDOWN 2
-+#define TX_TEARDOWN 1
-+#define BLOCKING_TEARDOWN 8
-+#define FULL_TEARDOWN 4
-+#define PARTIAL_TEARDOWN 0
-+
-+#define MAX_DIR 2
-+#define DIRECTION_TX 0
-+#define DIRECTION_RX 1
-+#define TX_CH 0
-+#define RX_CH 1
-+#define HAL_ERROR_DEVICE_NOT_FOUND 1
-+#define HAL_ERROR_FAILED_MALLOC 2
-+#define HAL_ERROR_OSFUNC_SIZE 3
-+#define HAL_DEFAULT 0xFFFFFFFF
-+#define VALID(val) (val!=HAL_DEFAULT)
-+
-+/*
-+ERROR REPORTING
-+
-+HAL Module Codes. Each HAL module reporting an error code
-+should OR the error code with the respective Module error code
-+from the list below.
-+*/
-+#define EC_AAL5 EC_HAL|EC_DEV_AAL5
-+#define EC_AAL2 EC_HAL|EC_DEV_AAL2
-+#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
-+#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
-+#define EC_VDMA EC_HAL|EC_DEV_VDMA
-+#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
-+#define EC_CPPI EC_HAL|EC_DEV_CPPI
-+
-+/*
-+HAL Function Codes. Each HAL module reporting an error code
-+should OR the error code with one of the function codes from
-+the list below.
-+*/
-+#define EC_FUNC_HAL_INIT EC_FUNC(1)
-+#define EC_FUNC_CHSETUP EC_FUNC(2)
-+#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
-+#define EC_FUNC_RXRETURN EC_FUNC(4)
-+#define EC_FUNC_SEND EC_FUNC(5)
-+#define EC_FUNC_RXINT EC_FUNC(6)
-+#define EC_FUNC_TXINT EC_FUNC(7)
-+#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
-+#define EC_FUNC_OPTIONS EC_FUNC(9)
-+#define EC_FUNC_PROBE EC_FUNC(10)
-+#define EC_FUNC_OPEN EC_FUNC(11)
-+#define EC_FUNC_CONTROL EC_FUNC(12)
-+#define EC_FUNC_DEVICE_INT EC_FUNC(13)
-+#define EC_FUNC_STATUS EC_FUNC(14)
-+#define EC_FUNC_TICK EC_FUNC(15)
-+#define EC_FUNC_CLOSE EC_FUNC(16)
-+#define EC_FUNC_SHUTDOWN EC_FUNC(17)
-+#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
-+
-+/*
-+HAL Error Codes. The list below defines every type of error
-+used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
-+values in integer order to the bottom of the list.
-+*/
-+#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
-+#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
-+#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
-+#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
-+#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
-+#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
-+#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
-+#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
-+#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
-+#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
-+#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
-+#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
-+
-+#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
-+#define EC_VAL_INVALID_CH EC_ERR(0x0E)
-+#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
-+#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
-+#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
-+#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
-+#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
-+#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
-+#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
-+#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
-+#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
-+#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
-+#define EC_VAL_INVALID_VC EC_ERR(0x19)
-+#define EC_VAL_INVALID_LC EC_ERR(0x20)
-+#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
-+#define EC_VAL_INVALID_CID EC_ERR(0x22)
-+#define EC_VAL_INVALID_UUI EC_ERR(0x23)
-+#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
-+#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
-+
-+#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
-+#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
-+#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
-+#define EC_VAL_NO_TCBS EC_ERR(0x29)
-+#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
-+#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
-+#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
-+#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
-+#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
-+#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
-+
-+#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
-+#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
-+#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
-+#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
-+#define EC_VAL_INVALID_STATE EC_ERR(0x40)
-+#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
-+#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
-+#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
-+#define EC_VAL_NOT_LINKED EC_ERR(0x44)
-+#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
-+#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
-+#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
-+#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
-+#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
-+#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
-+#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
-+#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
-+#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
-+#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
-+#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
-+#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
-+#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
-+
-+/**
-+@defgroup shared_data Shared Data Structures
-+
-+The data structures documented here are shared by all modules.
-+*/
-+
-+/**
-+ * @ingroup shared_data
-+ * This is the fragment list structure. Each fragment list entry contains a
-+ * length and a data buffer.
-+ */
-+typedef struct
-+ {
-+ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
-+ void *data; /**< Pointer to fragment data. */
-+ void *OsInfo; /**< Pointer to OS defined data. */
-+ }FRAGLIST;
-+
-+#if defined (_CPHAL_CPMAC)
-+#define CB_PASSCRC_BIT (1<<26)
-+
-+/* CPMAC CPHAL STATUS */
-+#define CPMAC_STATUS_LINK (1 << 0)
-+#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
-+#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
-+
-+/* ADAPTER CHECK Codes */
-+
-+#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
-+#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
-+#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
-+#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
-+
-+#define _CPMDIO_DISABLE (1 << 0)
-+#define _CPMDIO_HD (1 << 1)
-+#define _CPMDIO_FD (1 << 2)
-+#define _CPMDIO_10 (1 << 3)
-+#define _CPMDIO_100 (1 << 4)
-+#define _CPMDIO_NEG_OFF (1 << 5)
-+#define _CPMDIO_LOOPBK (1 << 16)
-+#define _CPMDIO_AUTOMDIX (1 << 17) /* Bit 16 and above not used by MII register */
-+#define _CPMDIO_NOPHY (1 << 20)
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * Channel specific configuration information. This structure should be
-+ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
-+ * configuration item that can be changed on a per channel basis should
-+ * be represented here. Each module may define this structure with additional
-+ * module-specific members.
-+ */
-+typedef struct
-+ {
-+ int Channel; /**< Channel number. */
-+ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
-+ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
-+
-+#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
-+ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
-+ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
-+ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
-+ int RxServiceMax; /**< Maximum number of packets to service at one time. */
-+
-+ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
-+ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
-+ int TxServiceMax; /**< Maximum number of packets to service at one time. */
-+#endif
-+
-+#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
-+ int Gfc; /**< Generic Flow Control. */
-+ int Clp; /**< Cell Loss Priority. */
-+ int Pti; /**< Payload Type Indication. */
-+#endif
-+
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
-+ int Priority; /**< Priority bin this channel will be scheduled within. */
-+ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
-+ int Vci; /**< Virtual Channel Identifier. */
-+ int Vpi; /**< Virtual Path Identifier. */
-+ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
-+
-+ /* Tx VC State */
-+ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
-+ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
-+ int TxVc_Mbs; /**< Min Burst Size in cells.*/
-+ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
-+
-+ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
-+ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
-+ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Rx VC State */
-+ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
-+ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
-+ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Tx VP State */
-+ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
-+ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
-+ /* Rx VP State */
-+ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
-+ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
-+ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
-+#endif
-+
-+
-+#ifdef _CPHAL_VDMAVT
-+ bit32u RemFifoAddr; /* Mirror mode only. */
-+ bit32u FifoAddr;
-+ bit32 PollInt;
-+ bit32 FifoSize;
-+ int Ready;
-+#endif
-+
-+ }CHANNEL_INFO;
-+
-+/*
-+ * This structure contains each statistic value gathered by the CPHAL.
-+ * Applications may access statistics data by using the @c StatsGet() routine.
-+ */
-+/* STATS */
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+typedef struct
-+ {
-+ bit32u CrcErrors[16];
-+ bit32u LenErrors[16];
-+ bit32u DmaLenErrors[16];
-+ bit32u AbortErrors[16];
-+ bit32u StarvErrors[16];
-+ bit32u TxMisQCnt[16][2];
-+ bit32u RxMisQCnt[16];
-+ bit32u RxEOQCnt[16];
-+ bit32u TxEOQCnt[16][2];
-+ bit32u RxPacketsServiced[16];
-+ bit32u TxPacketsServiced[16][2];
-+ bit32u RxMaxServiced;
-+ bit32u TxMaxServiced[16][2];
-+ bit32u RxTotal;
-+ bit32u TxTotal;
-+ } STAT_INFO;
-+#endif
-+
-+/*
-+ * VDMA Channel specific configuration information
-+ */
-+#ifdef _CPHAL_AAL2
-+typedef struct
-+ {
-+ int Ch; /**< Channel Number */
-+ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
-+ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
-+ }VdmaChInfo;
-+#endif
-+
-+#ifndef _CPHAL
-+ typedef void HAL_DEVICE;
-+ typedef void HAL_PRIVATE;
-+ typedef void HAL_RCB;
-+ typedef void HAL_RECEIVEINFO;
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
-+ int (*Close) (HAL_DEVICE *HalDev, int Mode);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*Init) (HAL_DEVICE *HalDev);
-+ int (*Open) (HAL_DEVICE *HalDev);
-+ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
-+ int (*Probe) (HAL_DEVICE *HalDev);
-+ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
-+ int (*Shutdown) (HAL_DEVICE *HalDev);
-+ int (*Tick) (HAL_DEVICE *HalDev);
-+
-+#ifdef _CPHAL_AAL5
-+ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
-+ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
-+ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
-+#endif
-+ } HAL_FUNCTIONS;
-+
-+/**
-+ * @ingroup shared_data
-+ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
-+ * functions accessible to the CPHAL. The upper layer software is responsible
-+ * for providing the correct OS-specific implementations for the following
-+ * functions. It is populated by calling InitModule() (done by the CPHAL in
-+ * xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
-+ void (*CriticalOn)(void);
-+ void (*CriticalOff)(void);
-+ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
-+ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
-+ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
-+ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
-+ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
-+ void (*Free)(void *MemPtr);
-+ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
-+ void (*FreeDev)(void *MemPtr);
-+ void (*FreeDmaXfer)(void *MemPtr);
-+ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
-+ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
-+ void* (*Malloc)(bit32u size);
-+ void* (*MallocDev)(bit32u Size);
-+ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
-+ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
-+ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
-+ void* (*Memset)(void *Dest, int C, bit32u N);
-+ int (*Printf)(const char *Format, ...);
-+ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
-+ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
-+ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
-+ int (*Sprintf)(char *S, const char *Format, ...);
-+ int (*Strcmpi)(const char *Str1, const char *Str2);
-+ unsigned int (*Strlen)(const char *S);
-+ char* (*Strstr)(const char *S1, const char *S2);
-+ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
-+ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
-+ } OS_FUNCTIONS;
-+
-+/************** MODULE SPECIFIC STUFF BELOW **************/
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/*
-+int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
-+*/
-+
-+int halCpmacInitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+/*
-+ * @ingroup shared_data
-+ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+/*
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
-+ bit32u Mode);
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ } AAL5_FUNCTIONS;
-+*/
-+
-+int cpaal5InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+/**
-+ * @ingroup shared_data
-+ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
-+ int VdmaCh, int UUIDiscard);
-+ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
-+ int LC);
-+ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
-+ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
-+ VdmaChInfo *VdmaCh);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
-+ int RxMultiMode, int TxMultiMode, int SchedMode,
-+ int TcCh);
-+ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
-+ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
-+ } AAL2_FUNCTIONS;
-+
-+int cpaal2InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ AAL2_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_VDMAVT
-+/**
-+ * @ingroup shared_data
-+ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to InitModule().
-+ *
-+ * Note that this list is still under definition.
-+ */
-+typedef struct
-+ {
-+ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
-+ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt);
-+ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt); */
-+ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
-+ bit32u RemDevID);
-+ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
-+ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
-+ } VDMA_FUNCTIONS;
-+
-+int VdmaInitModule(HAL_DEVICE **VdmaVt,
-+ OS_DEVICE *OsDev,
-+ VDMA_FUNCTIONS **VdmaVtFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+/*
-+extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
-+ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
-+ int *Size, int Inst);
-+*/
-+
-+
-+#ifdef _CPHAL_AAL5
-+extern const char hcSarFrequency[];
-+#endif
-+
-+#ifdef _CPHAL_CPMAC
-+/* following will be common, once 'utl' added */
-+extern const char hcClear[];
-+extern const char hcGet[];
-+extern const char hcSet[];
-+extern const char hcTick[];
-+
-+extern const char hcCpuFrequency[];
-+extern const char hcCpmacFrequency[];
-+extern const char hcMdioBusFrequency[];
-+extern const char hcMdioClockFrequency[];
-+extern const char hcCpmacBase[];
-+extern const char hcPhyNum[];
-+extern const char hcSize[];
-+extern const char hcCpmacSize[];
-+extern const char hcPhyAccess[];
-+extern const char hcMdixMask[];
-+extern const char hcMdioMdixSwitch[];
-+#endif
-+
-+#endif /* end of _INC_ */
-diff -urN linux.old/drivers/net/avalanche_cpmac/dox_cpmac.h linux.dev/drivers/net/avalanche_cpmac/dox_cpmac.h
---- linux.old/drivers/net/avalanche_cpmac/dox_cpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/dox_cpmac.h 2005-07-10 03:22:40.519159000 +0200
-@@ -0,0 +1,842 @@
-+/*****************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE:
-+ *
-+ * DESCRIPTION:
-+ * This file contains documentation for the CPMAC
-+ *
-+ * HISTORY:
-+ * @author Michael Hanrahan/Greg Guyotte
-+ * @version 1.00
-+ * @date 03-Dec-2002
-+ *****************************************************************************/
-+#ifndef _DOX_CPMAC_H
-+#define _DOX_CPMAC_H
-+/**
-+@page CPMAC_Implementation_Details Version
-+
-+@copydoc CPMAC_Version
-+*/
-+
-+/**
-+@page cpmac_intro Introduction
-+
-+The CPMAC implementation will support 8 channels for transmit and 8 channel for
-+receive. Each of the 8 transmit channels has 1 queue associated with it. It is
-+recommended that only 1 channel is used for @c Receive() per processor.
-+*/
-+
-+/**
-+@page cpmac_details API Implementation Details
-+@par osReceive
-+@p Mode parameter
-+- The Upper 16 bits of Mode match Word 3 of the Rx Buffer Descriptor
-+
-+@par halSend
-+@p Mode parameter
-+- Bits 0-7 contain the Channel Number
-+- Bits 8-25 are reserved
-+- Bit 26 - if 0, the CRC will be calculated, if 1 the CRC will be Passed
-+- Bits 27-31 : reserved
-+@section cpmac_keys Control Keys
-+
-+@par StateChange
-+CPHAL calls the OS when a state change is detected.
-+OS should check the CPMAC Status. See the Control Key 'Status' for more details.
-+
-+@par Status
-+OS calls the CPHAL to obtain Status information. The Returned status is as follows
-+
-+@par MaxFrags
-+The OS may "Set" or "Get" this value. This defines the maximum
-+number of fragments that can be received by the CPMAC Rx port. The default
-+value for CPMAC is 2. This provides enough space to receive a maximum
-+length packet (1,518 bytes) with the default buffer size of 1518 and any
-+amount of RxBufferOffset. If the buffer size is configured to be smaller,
-+the OS *MUST* modify this parameter according to the following formula:
-+((System Max packet length)/(RxBufSize)) + 1. (The extra 1 fragment is to
-+allow for RxBufferOffset)
-+
-+@code
-+// Following defined in "cpswhal_cpmac.h"
-+// CPMAC CPHAL STATUS
-+#define CPMAC_STATUS_LINK (1 << 0)
-+#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) // 0 - HD, 1 - FD
-+#define CPMAC_STATUS_LINK_SPEED (1 << 2) // 0 - 10, 1 - 100
-+
-+// ADAPTER CHECK Codes
-+#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
-+#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8) // 0 - Tx, 1 - Rx
-+#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9) See CPMAC Guide
-+#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13) See CPMAC Guide
-+@endcode
-+
-+@code
-+void osStateChange(OS_DEVICE *OsDev)
-+ {
-+ int status;
-+ OsDev->HalFunc->Control(OsDev->HalDev, "Status", hcGet, &status);
-+ if(status & CPMAC_STATUS_ADAPTER_CHECK)
-+ {
-+ printf("[osStateChange[%d]] HAL notified OS of AdapterCheck (Link Status 0x%08X)\n", OsDev->port, status);
-+ adaptercheck(OsDev->port);
-+ }
-+ else
-+ {
-+ printf("[osStateChange[%d]] HAL notified OS of State Change (Link Status %s)\n", OsDev->port, (status & CPMAC_STATUS_LINK) ? "Up" : "Down");
-+ if(status & CPMAC_STATUS_LINK)
-+ {
-+ printf("Speed %s, Duplex %s\n",
-+ status & CPMAC_STATUS_LINK_SPEED ? "100" : "10",
-+ status & CPMAC_STATUS_LINK_DUPLEX ? "FD" : "HD");
-+ }
-+ }
-+@endcode
-+
-+@par Tick
-+ The CPHAL calls the OS to set the interval for calling halTick()<BR>
-+ Note: Predefined value hcTick now recommended for use.
-+@code
-+*** Example Code ***
-+
-+*** CPHAL code ***
-+int Ticks;
-+HalDev->OsFunc->Control(HalDev->OsDev, hcTick, hcSet, &Ticks);
-+
-+*** OS code ***
-+ ..
-+ if(osStrcmpi(pszKey, hcTick) == 0)
-+ {
-+ if(osStrcmpi(pszAction, hcSet) == 0)
-+ {
-+ // Enable the Tick Interval
-+ if(*(unsigned int *) ParmValue)
-+ printf("osTickSet: Interval = %d ticks\n", Interval);
-+ }
-+ else
-+ if(osStrcmpi(pszAction, hcClear) == 0)
-+ {
-+ // Request disabling of the Tick Timer, ParmValue is ignored
-+ }
-+ }
-+@endcode
-+
-+@par The following information can be obtained by the OS via 'Get'
-+
-+- StatsDump : OS supplies pointer to an 36 element unsigned int array
-+CPHAL will populate the array with the current Statistics values.<BR>
-+Note: all hcXXXX values are predefined and should be used by the OS.
-+
-+- hcPhyNum : Returns the PHY number.
-+- hcCpmacBase : Returns the base-address of the CPMAC device
-+- hcCpmacSize : Returns size of the CPMAC memory map
-+
-+
-+@par Phy Register Communication
-+
-+halControl() is used to read and write the Phy Registers via the key hcPhyAccess
-+
-+Both reading and writing the Phy registers involve setting the Value parameter of halControl()
-+<BR>
-+Value is a 32-bit value with bits partioned as follows
-+<BR>
-+
-+ 0 - 4 Phy Number <BR>
-+ 5 - 9 Phy Register <BR>
-+ 10 - 15 reserved <BR>
-+ 16 - 31 Data (write only)
-+<BR>
-+
-+
-+<B>Reading the Phy register</B>
-+
-+@code
-+ bit32u Value;
-+ bit32u RegAddr;
-+ bit32u PhyNum;
-+ bit32u PhyRegisterData;
-+
-+ // Read Phy 31, register 20
-+
-+ PhyNum = 31;
-+ RegAddr = 20;
-+
-+ Value = (RegAddr << 5);
-+ Value |= (PhyNum & 0x1F);
-+
-+ rc = HalFunc->Control(HalDev, hcPhyAccess, hcGet, (bit32u *) &Value)
-+ If(rc == 0)
-+ {
-+ // Value is overwriten with the value in Register 20 of Phy number 31.
-+ PhyRegisterData = Value;
-+ }
-+@endcode
-+
-+<B>Writing the Phy register</B>
-+@code
-+ bit32u Value;
-+ bit32u RegAddr;
-+ bit32u PhyNum;
-+ bit32u PhyRegisterData;
-+
-+ // Reset Phy 23
-+
-+ PhyNum = 23;
-+ RegAddr = 0;
-+ PhyRegisterData = 0x8000; // Reset bit set
-+
-+ Value = (RegAddr << 5);
-+ Value |= (PhyNum & 0x1F);
-+ Value |= (PhyRegisterData << 16);
-+
-+ rc = HalFunc->Control(HalDev, hcPhyAccess, hcSet, (bit32u *) &Value)
-+
-+ // Check is reset if done
-+
-+ PhyNum = 23;
-+ RegAddr = 0;
-+
-+ Value = (RegAddr << 5);
-+ Value |= (PhyNum & 0x1F);
-+
-+ rc = HalFunc->Control(HalDev, hcPhyAccess, hcGet, (bit32u *) &Value)
-+
-+ If(rc == 0)
-+ {
-+ // Value is overwriten with the value in Register 0 of Phy number 23.
-+ PhyRegisterData = Value;
-+ if((PhyRegisterData & 0x8000) == 0)
-+ ResetIsComplete;
-+ }
-+
-+@endcode
-+<B>
-+*** Example Showing turning values off/on ***
-+<BR>
-+</B>
-+
-+@code
-+
-+int On=1;
-+int Off=0;
-+ # Turn On loopback
-+ OsDev->HalFunc->Control(OsDev->HalDev, "CTRL_LOOPBACK", hcSet, (int*) &On);
-+
-+ # Turn off RX Flow
-+ OsDev->HalFunc->Control(OsDev->HalDev, "RX_FLOW_EN", hcSet, (int*) &Off);
-+@endcode
-+
-+@par CPMAC Configurable Parameters
-+
-+- RX_PASS_CRC : See MBP_Enable description
-+- RX_QOS_EN : See MBP_Enable description
-+- RX_NO_CHAIN : See MBP_Enable description
-+- RX_CMF_EN : See MBP_Enable description
-+- RX_CSF_EN : See MBP_Enable description
-+- RX_CEF_EN : See MBP_Enable description
-+- RX_CAF_EN : See MBP_Enable description
-+- RX_PROM_CH : See MBP_Enable description
-+- RX_BROAD_EN : See MBP_Enable description
-+- RX_BROAD_CH : See MBP_Enable description
-+- RX_MULT_EN : See MBP_Enable description
-+- RX_MULT_CH : See MBP_Enable description
-+
-+- TX_PTYPE : See MacControl description
-+- TX_PACE : See MacControl description
-+- TX_FLOW_EN : See MacControl description
-+- RX_FLOW_EN : See MacControl description
-+- CTRL_LOOPBACK : See MacControl description
-+
-+- RX_MAXLEN : See CPMAC Guide
-+- RX_FILTERLOWTHRESH : See CPMAC Guide
-+- RX0_FLOWTHRESH : See CPMAC Guide
-+- RX_UNICAST_SET : See CPMAC Guide
-+- RX_UNICAST_CLEAR : See CPMAC Guide
-+
-+@par Multicast Support
-+- RX_MULTI_ALL : When used with hcSet, sets all the Hash Bits. When used
-+with hcClear clears all the Hash Bits.
-+- RX_MULTI_SINGLE : When used with hcSet, adds the Hashed Mac Address. When used
-+with hcClear deletes the Hashed Mac Address.
-+Note: Support will be added to keep track of Single additions and deletions.
-+
-+@code
-+*** Example Code ***
-+
-+*** OS code ***
-+ bit8u MacAddress[6];
-+ MacAddress[0] = 0x80;
-+ MacAddress[1] = 0x12;
-+ MacAddress[2] = 0x34;
-+ MacAddress[3] = 0x56;
-+ MacAddress[4] = 0x78;
-+ MacAddress[5] = 0x78;
-+ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_SINGLE", hcSet, (bit8u*) &MacAddress);
-+ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_SINGLE", hcClear, (bit8u*) &MacAddress);
-+ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_ALL", hcSet, NULL);
-+ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_ALL", hcClear, NULL);
-+@endcode
-+@par MdioConnect Fields
-+<BR>
-+- "MdioConnect" : The OS can set the Phy connection using this key. The default connection is Auto-Negotiation ON, All modes possible.
-+
-+
-+- _CPMDIO_HD <----- Allow Half Duplex, default is 1 (On)
-+- _CPMDIO_FD <----- Allow Full Duplex, default is 1 (On)
-+- _CPMDIO_10 <----- Allow 10 Mbs, default is 1 (On)
-+- _CPMDIO_100 <----- Allow 100 Mbs, default is 1 (On)
-+- _CPMDIO_NEG_OFF <----- Turn off Auto Negotiation, default is 0 (Auto Neg is on)
-+- _CPMDIO_NOPHY <----- Set for use with Marvel-type switch, default is 0 (Phy present)
-+- _CPMDIO_AUTOMDIX <---- Enables Auto Mdix (in conjunction with MdixMask), default is 1 (On)
-+
-+Note: When _CPMDIO_NOPHY is set, CPMAC will report being linked at 100/FD. Reported PhyNum will be 0xFFFFFFFF
-+
-+@par Setting CPMAC for use with a Marvel-type Switch
-+@code
-+ bit32u MdioConnect;
-+
-+ MdioConnect = _CPMDIO_NOPHY;
-+ OsDev->HalFunc->Control(OsDev->HalDev, "MdioConnect", hcSet, (bit32u*) &MdioConnect);
-+@endcode
-+
-+@par OS Support for MDIO
-+@p The OS will need to supply the following values which the CPHAL will request via halControl()
-+<BR>
-+- MdioBusFrequency : The frequency of the BUS that MDIO is on (requested via hcMdioBusFrequency)
-+<BR>
-+- MdioClockFrequency : The desired Clock Frequency that MDIO qill operate at (requested via hcMdioClockFrequency)
-+*/
-+
-+/**
-+@page cpmac_conf DeviceFindxxx() Parameters
-+
-+These are some of the parameters that the CPMAC will request via the DeviceFindxxx() functions -
-+<BR>
-+- "Mlink" : bit mask indicating what link status method Phy is using. Default is MDIO state machine (0x0)
-+- "PhyMask" : bit mask indicating PhyNums used by this CPMAC (e.g 0x8000000, PhyNum is 31)
-+- "MdixMask" : bit mask indicating which Phys support AutoMdix. Default is 0x0 (None)
-+<BR>
-+@par Example cpmac definition from the options.conf for the Sangam VDB
-+<BR>
-+- cpmac( id=eth0, base=0xA8610000, size=0x800, reset_bit=17, int_line=19, PhyMask=0x80000000, MLink=0, MdixMask=0 )
-+*/
-+
-+/**
-+@page auto_mdix Auto Mdix Support
-+
-+Auto Mdix selection is controlled by two elements in the CPMAC. First the OS can turn Auto Midx On or Off by the use of the
-+MdioConnect field, _CPMDIO_AUTOMDIX. This is defaulted ON. For actual Auto Mdix operation the Phy must also be Auto Mdix capable.
-+This is specified by the DeviceFindxxx() field, "MdixMask" (supplied as the variable hcMdixMask).
-+If both these fields are set then the CPMDIO state machine will be enabled for Auto Mdix checking.
-+If a switch to MDI or MDIX mode is needed, the CPMAC will signal this to the OS via Control() using
-+the hcMdioMdixSwitch key.
-+
-+@par OS example for responding to a Mdix Switch Request
-+<BR>
-+@code
-+if(osStrcmpi(pszKey, hcMdioMdixSwitch) == 0) // See if key is Mdix Switch Request
-+ {
-+ if(osStrcmpi(pszAction, hcSet) == 0) // Only respond to Set requests
-+ {
-+
-+ bit32u Mdix;
-+
-+ Mdix = *(bit32u *) ParmValue; // Extract requested Mode
-+ // 0 : MDI
-+ // 1 : MDIX
-+ if(Mdix)
-+ osSetPhyIntoMdixMode(); // Device specific logic
-+ else
-+ osSetPhyIntoMdiMode(); // Device specific logic
-+ rc = 0; // Set return code as Successfull
-+ }
-+@endcode
-+*/
-+
-+/**
-+@page cpmac_stats CPMAC Specific Statistics
-+
-+Statistics level '0' contains all CPMAC specific statistics.
-+
-+
-+*/
-+
-+/**
-+@page Example_Driver_Code
-+
-+@section example_intro Introduction
-+This section provides an in-depth code example for driver implementations. The code
-+below illustrates the use of the CPMAC HAL, but is equally applicable to any CPHAL
-+implementation. Note: the CPHAl constants hcGet, hcSet etc., are currently available for use with teh CPMAC module.
-+Other modules should continue to use pszGET, etc. until these are made generally available.
-+
-+@par Pull Model Example
-+
-+@code
-+
-+#define _CPHAL_CPMAC
-+
-+typedef struct _os_device_s OS_DEVICE;
-+typedef struct _os_receive_s OS_RECEIVEINFO;
-+typedef struct _os_send_s OS_SENDINFO;
-+typedef struct _os_setup_s OS_SETUP;
-+
-+#include "cpswhal_cpmac.h"
-+
-+#define dbgPrintf printf
-+
-+typedef struct _os_device_s
-+{
-+ HAL_DEVICE *HalDev;
-+ HAL_FUNCTIONS *HalFunc;
-+ OS_FUNCTIONS *OsFunc;
-+ OS_SETUP *OsSetup;
-+ bit32u Interrupt;
-+ int (*halIsr)(HAL_DEVICE *HalDev, int*);
-+ int ModulePort;
-+ int Protocol;
-+ int LinkStatus; // 0-> down, otherwise up
-+}os_device_s;
-+
-+typedef struct _os_receive_s
-+{
-+ HAL_RECEIVEINFO *HalReceiveInfo;
-+ char *ReceiveBuffer;
-+ OS_DEVICE *OsDev;
-+}os_receive_s;
-+
-+typedef struct _os_send_s
-+{
-+ OS_DEVICE *OsDev;
-+}os_send_s;
-+
-+typedef struct _os_setup_s
-+{
-+ OS_DEVICE *OsDev;
-+}os_setup_s;
-+
-+
-+
-+void FlowForCphal(OS_DEVICE *OsDev)
-+{
-+ CHANNEL_INFO ChannelInfo;
-+ int nChannels = 200;
-+ int halFuncSize;
-+ int rc;
-+
-+ // Populate OsFunc structure
-+ rc = osInitModule(OsDev);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from osInitModule:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+
-+ // OS-Cphal handshake
-+ rc = halCpmacInitModule(&OsDev->HalDev, OsDev, &OsDev->HalFunc, OsDev->OsFunc,
-+ sizeof(OS_FUNCTIONS), &halFuncSize, OsDev->ModulePort);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from halCpmacInitModule:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+ // See if hardware module exists
-+ rc = OsDev->HalFunc->Probe(OsDev->HalDev);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from Probe:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+ // Initialize hardware module
-+ rc = OsDev->HalFunc->Init(OsDev->HalDev);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from Init:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+ // Setup Channel Information (Tranmsit, channel 0)
-+ ChannelInfo.Channel = 0;
-+ ChannelInfo.Direction = DIRECTION_TX;
-+ ChannelInfo.TxNumBuffers = nChannels;
-+ ChannelInfo.TxNumQueues = 1;
-+ ChannelInfo.TxServiceMax = nChannels/3;
-+
-+ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
-+
-+ // Setup Channel Information (Receive, channel 0)
-+ ChannelInfo.Channel = 0;
-+ ChannelInfo.Direction = DIRECTION_RX;
-+ ChannelInfo.RxBufSize = 1518;
-+ ChannelInfo.RxBufferOffset = 0;
-+ ChannelInfo.RxNumBuffers = 2*nChannels;
-+ ChannelInfo.RxServiceMax = nChannels/3;
-+
-+ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
-+
-+ // Open the hardware module
-+ rc = OsDev->HalFunc->Open(OsDev->HalDev);
-+
-+ // Module now ready to Send/Receive data
-+}
-+
-+
-+int osInitModule(OS_FUNCTIONS **pOsFunc)
-+ {
-+ OS_FUNCTIONS *OsFunc;
-+
-+ OsFunc = (OS_FUNCTIONS *) malloc(sizeof(OS_FUNCTIONS));
-+ if (!OsFunc)
-+ return (-1);
-+
-+ *pOsFunc = OsFunc;
-+
-+ OsFunc->CriticalOff = osCriticalOff;
-+ OsFunc->CriticalOn = osCriticalOn;
-+ OsFunc->DataCacheHitInvalidate = osDataCacheHitInvalidate;
-+ OsFunc->DataCacheHitWriteback = osDataCacheHitWriteback;
-+ OsFunc->DeviceFindInfo = osDeviceFindInfo;
-+ OsFunc->DeviceFindParmUint = osDeviceFindParmUint;
-+ OsFunc->DeviceFindParmValue = osDeviceFindParmValue;
-+ OsFunc->Free = osFree;
-+ OsFunc->FreeDev = osFreeDev;
-+ OsFunc->FreeDmaXfer = osFreeDmaXfer;
-+ OsFunc->FreeRxBuffer = osFreeRxBuffer;
-+ OsFunc->IsrRegister = osIsrRegister;
-+ OsFunc->IsrUnRegister = osIsrUnRegister;
-+ OsFunc->Malloc = osMalloc;
-+ OsFunc->MallocDev = osMallocDev;
-+ OsFunc->MallocDmaXfer = osMallocDmaXfer;
-+ OsFunc->MallocRxBuffer = osMallocRxBuffer;
-+
-+
-+ OsFunc->Memset = memset;
-+ OsFunc->Printf = printf;
-+ OsFunc->Sprintf = sprintf;
-+ OsFunc->Strcmpi = osStrcmpi;
-+ OsFunc->Strlen = strlen;
-+ OsFunc->Strstr = strstr;
-+ OsFunc->Strtoul = strtoul;
-+
-+ OsFunc->Control = osControl;
-+ OsFunc->Receive = osReceive;
-+ OsFunc->SendComplete = osSendComplete;
-+ OsFunc->TeardownComplete = osTearDownComplete;
-+
-+ return(0);
-+ }
-+
-+
-+int osReceive(OS_DEVICE *OsDev,FRAGLIST *Fraglist,bit32u FragCount,bit32u PacketSize,HAL_RECEIVEINFO *halInfo, bit32u mode)
-+ {
-+ OS_RECEIVEINFO *skb = (OS_RECEIVEINFO *)Fraglist[0].OsInfo;
-+ dcache_i((char *)Fraglist->data, Fraglist->len);
-+ OsDev->HalFunc->RxReturn(halInfo,0);
-+ return(0);
-+ }
-+
-+int osSendComplete(OS_SENDINFO *skb)
-+ {
-+ return(0);
-+ }
-+
-+
-+static void *osMallocRxBuffer(bit32u Size,void *MemBase, bit32u MemRange,
-+ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev )
-+ {
-+ void *HalBuffer;
-+ OS_RECEIVEINFO *OsPriv;
-+
-+ HalBuffer=malloc(Size);
-+ if (!HalBuffer)
-+ {
-+ return(0);
-+ }
-+
-+ // Malloc the OS block
-+ *OsReceiveInfo = malloc(sizeof(OS_RECEIVEINFO));
-+ if (!*OsReceiveInfo)
-+ {
-+ free(HalBuffer);
-+ return(0);
-+ }
-+
-+ // Initialize the new buffer descriptor
-+ OsPriv = *OsReceiveInfo;
-+ OsPriv->OsDev = OsDev;
-+ OsPriv->ReceiveBuffer = HalBuffer;
-+ OsPriv->HalReceiveInfo = HalReceiveInfo;
-+
-+ return(HalBuffer);
-+ }
-+
-+
-+void SendBuffer(OS_DEVICE *OsDev, char *Buffer, int Size)
-+{
-+ FRAGLIST Fraglist;
-+ bit32u FragCount;
-+
-+ tcb_pending++;
-+ Fraglist.len = Size;
-+ Fraglist.data = (unsigned *) Buffer;
-+ FragCount = 1;
-+ mode = 0; // Channel 0
-+
-+ dcache_wb(Fraglist.data, Fraglist.len);
-+ OsDev->HalFunc->Send(OsDev->HalDev, &Fraglist, FragCount, Size, (OS_SENDINFO *) Buffer, mode);
-+}
-+
-+
-+void osStateChange(OS_DEVICE *OsDev)
-+ {
-+ int status;
-+ int LinkStatus;
-+ OsDev->HalFunc->Control(OsDev->HalDev, "Status", hcGet, &status);
-+ if(status & CPMAC_STATUS_ADAPTER_CHECK)
-+ {
-+ // Adapter Check, take appropiate action
-+ }
-+ else
-+ {
-+ LinkStatus = status & CPMAC_STATUS_LINK;
-+ if(LinkStatus != OsDev->LinkStatus)
-+ {
-+ dbgPrintf("\n%s:Link %s for inst %d Speed %s, Duplex %s\n",
-+ __FUNCTION__,
-+ LinkStatus ? "up" : "down",
-+ OsDev->ModulePort,
-+ status & CPMAC_STATUS_LINK_SPEED ? "100" : "10",
-+ status & CPMAC_STATUS_LINK_DUPLEX ? "FD" : "HD");
-+ OsDev->LinkStatus = LinkStatus;
-+ }
-+ }
-+ }
-+
-+
-+int osControl(OS_DEVICE *OsDev, const char *pszKey, const char* pszAction, void *ParmValue)
-+ {
-+ int rc=-1;
-+
-+ if (osStrcmpi(pszKey, hcCpuFrequency) == 0)
-+ {
-+ if(osStrcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(bit32u*) ParmValue = cpufreq;
-+ rc = 0;
-+ }
-+ }
-+ if (osStrcmpi(pszKey, hcMdioBusFrequency) == 0)
-+ {
-+ if(osStrcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(bit32u *)ParmValue = MdioBusFrequency;
-+ rc = 0;
-+ }
-+ }
-+if (osStrcmpi(pszKey, hcMdioClockFrequency) == 0)
-+ {
-+ if(osStrcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(bit32u *)ParmValue = MdioClockFrequency;
-+ rc = 0;
-+ }
-+ }
-+
-+ if (osStrcmpi(pszKey, hcTick) == 0)
-+ {
-+ if(osStrcmpi(pszAction, hcSet) == 0)
-+ {
-+ osTickSetInterval(OsDev, *(unsigned int *) ParmValue);
-+ rc = 0;
-+ }
-+ else
-+ if(osStrcmpi(pszAction, hcClear) == 0)
-+ {
-+ osTickDisable(OsDev);
-+ rc = 0;
-+ }
-+ }
-+
-+ if (osStrcmpi(pszKey, "SioFlush") == 0)
-+ {
-+ MySioFlush();
-+ rc = 0;
-+ }
-+
-+ if (osStrcmpi(pszKey, "StateChange") == 0)
-+ {
-+ osStateChange(OsDev);
-+ rc = 0;
-+ }
-+
-+ if (osStrcmpi(pszKey, "Sleep") == 0)
-+ {
-+ osSleep(*(int *)ParmValue);
-+ rc = 0;
-+ }
-+ return(rc);
-+ }
-+
-+@endcode
-+
-+
-+@par Push Model Example (Currently Eswitch ONLY)
-+
-+@code
-+
-+typedef struct _os_device_s OS_DEVICE;
-+typedef struct _os_receive_s OS_RECEIVEINFO;
-+typedef struct _os_send_s OS_SENDINFO;
-+typedef struct _os_setup_s OS_SETUP;
-+
-+#include "cpswhal.h" //Get glogal HAL stuff
-+#include "cpswhaleswitch.h" //Get device specific hal stuff
-+
-+
-+typedef struct _os_device_s
-+{
-+ HAL_DEVICE *HalDev;
-+ HAL_FUNCTIONS *HalFunc;
-+ OS_FUNCTIONS *OsFunc;
-+ OS_SETUP *OsSetup;
-+ bit32u Interrupt;
-+ int (*halIsr)(HAL_DEVICE *HalDev, int*);
-+ int ModulePort;
-+ int Protocol;
-+ int LinkStatus; // 0-> down, otherwise up
-+}os_device_s;
-+
-+typedef struct _os_receive_s
-+{
-+ HAL_RECEIVEINFO *HalReceiveInfo;
-+ char *ReceiveBuffer;
-+ OS_DEVICE *OsDev;
-+}os_receive_s;
-+
-+typedef struct _os_send_s
-+{
-+ OS_DEVICE *OsDev;
-+}os_send_s;
-+
-+typedef struct _os_setup_s
-+{
-+ OS_DEVICE *OsDev;
-+}os_setup_s;
-+
-+
-+
-+void FlowForCphal(OS_DEVICE *OsDev)
-+{
-+CHANNEL_INFO ChannelInfo;
-+ int nChannels = 200;
-+ int halFuncSize;
-+ int rc;
-+
-+ // Populate OsFunc structure
-+ rc = osInitModule(OsDev);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from osInitModule:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+
-+ // OS-Cphal handshake
-+ rc = cpswHalEswitchInitModule(&OsDev->HalDev, OsDev, &OsDev->HalFunc, OsDev->OsFunc,
-+ sizeof(OS_FUNCTIONS), &halFuncSize, OsDev->ModulePort);
-+
-+ if(rc)
-+ {
-+ sprintf(bufTmp, "%s: return code from cpswHalEswitchInitModule:'0x%08X'", __FUNCTION__, rc);
-+ errorout(bufTmp);
-+ }
-+
-+
-+ ChannelInfo.Channel = 7;
-+ ChannelInfo.Direction = DIRECTION_RX;
-+ ChanInfo.Receive = osReceiveSS; // Specify function to receive data for this channel
-+
-+ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
-+
-+ MyConfig.debug=0;
-+ MyConfig.CpuFrequency = CpuFreq;
-+ MyConfig.EswitchFrequency = EswitchFreq;
-+ MyConfig.ResetBase = 0xa8611600;
-+ MyConfig.MacAddress = MacAddr;
-+
-+ MyConfig.EswitchResetBit= 27;
-+ MyConfig.Cpmac0ResetBit = 17;
-+ MyConfig.Cpmac1ResetBit = 21;
-+ MyConfig.MdioResetBit = 22;
-+ MyConfig.Phy0ResetBit = 26;
-+ MyConfig.Phy1ResetBit = 28;
-+ MyConfig.HdmaResetBit = 13;
-+ MyConfig.Cpmac0IntBit = 19;
-+ MyConfig.Cpmac1IntBit = 33;
-+ MyConfig.EswitchIntBit = 27;
-+ MyConfig.EswitchBase = 0xa8640000;
-+ MyConfig.EswitchBufferSize = 64;
-+ MyConfig.EswitchHostBufCount = 0;
-+ MyConfig.EswitchDefaultCamSize = 64;
-+ MyConfig.EswitchOverFlowCount = 200;
-+ MyConfig.EswitchOverFlowSize = 256;
-+
-+
-+
-+
-+ rc=EswitchConfig(HalDev,HalFunc,&MyConfig);
-+
-+
-+ // Open the hardware module
-+ rc = OsDev->HalFunc->Open(OsDev->HalDev);
-+
-+ // Module now ready to Send/Receive data
-+}
-+
-+
-+int EswitchConfig(HAL_DEVICE *HalDev, HAL_FUNCTIONS *HalFunc, ESWITCH_CONFIG *Config)
-+{
-+ bit32u sts;
-+ sts = 0;
-+
-+ sts |= cpswhalPushBin(hcdebug, Config->debug);
-+ sts |= cpswhalPushBin(hcCpuFrequency , Config->CpuFrequency );
-+ sts |= cpswhalPushBin(hcEswitchFrequency , Config->EswitchFrequency );
-+ sts |= cpswhalPushBin(hcResetBase , Config->ResetBase );
-+ sts |= cpswhalPushBin(hcMacAddress , Config->MacAddress );
-+ sts |= cpswhalPushBin(hcEswitchResetBit, Config->EswitchResetBit);
-+ sts |= cpswhalPushBin(hcCpmac0ResetBit , Config->Cpmac0ResetBit );
-+ sts |= cpswhalPushBin(hcCpmac1ResetBit , Config->Cpmac1ResetBit );
-+ sts |= cpswhalPushBin(hcMdioResetBit , Config->MdioResetBit );
-+ sts |= cpswhalPushBin(hcPhy0ResetBit , Config->Phy0ResetBit );
-+ sts |= cpswhalPushBin(hcPhy1ResetBit , Config->Phy1ResetBit );
-+ sts |= cpswhalPushBin(hcHdmaResetBit , Config->HdmaResetBit );
-+ sts |= cpswhalPushBin(hcCpmac0IntBit , Config->Cpmac0IntBit );
-+ sts |= cpswhalPushBin(hcCpmac1IntBit , Config->Cpmac1IntBit );
-+ sts |= cpswhalPushBin(hcEswitchIntBit , Config->EswitchIntBit );
-+ sts |= cpswhalPushBin(hcEswitchBase , Config->EswitchBase );
-+ sts |= cpswhalPushBin(hcEswitchBufferSize , Config->EswitchBufferSize );
-+ sts |= cpswhalPushBin(hcEswitchHostBufCount , Config->EswitchHostBufCount );
-+ sts |= cpswhalPushBin(hcEswitchDefaultCamSize , Config->EswitchDefaultCamSize );
-+ sts |= cpswhalPushBin(hcEswitchOverFlowCount , Config->EswitchOverFlowCount );
-+ sts |= cpswhalPushBin(hcEswitchOverFlowSize , Config->EswitchOverFlowSize );
-+ return(sts);
-+}
-+
-+
-+
-+@endcode
-+*/
-+
-+#endif
-diff -urN linux.old/drivers/net/avalanche_cpmac/ec_errors_cpmac.h linux.dev/drivers/net/avalanche_cpmac/ec_errors_cpmac.h
---- linux.old/drivers/net/avalanche_cpmac/ec_errors_cpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/ec_errors_cpmac.h 2005-07-10 03:22:40.519159000 +0200
-@@ -0,0 +1,118 @@
-+/***************************************************************************
-+ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
-+
-+ FILE: ec_errors.h
-+
-+ DESCRIPTION:
-+ This file contains definitions and function declarations for
-+ error code support.
-+
-+ HISTORY:
-+ 14Dec00 MJH Added masking to EC_CLASS etc macros
-+ 17Sep02 GSG Added HAL support (new class&devices)
-+ 03Oct02 GSG Removed C++ style comments
-+***************************************************************************/
-+#ifndef _INC_EC_ERRORS
-+#define _INC_EC_ERRORS
-+
-+/*
-+ 31 - CRITICAL
-+ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
-+ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
-+ 23-16 - DEVICE (ie. EMAC, IIC, etc)
-+ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
-+ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
-+*/
-+
-+/*---------------------------------------------------------------------------
-+ Useful defines for accessing fields within error code
-+---------------------------------------------------------------------------*/
-+#define CRITICAL_SHIFT 31
-+#define CLASS_SHIFT 28
-+#define INST_SHIFT 24
-+#define DEVICE_SHIFT 16
-+#define FUNCTION_SHIFT 8
-+#define ERROR_CODE_SHIFT 0
-+
-+#define CRITICAL_MASK 1
-+#define CLASS_MASK 0x07
-+#define DEVICE_MASK 0xFF
-+#define INST_MASK 0x0F
-+#define FUNCTION_MASK 0xFF
-+#define ERROR_CODE_MASK 0xFF
-+
-+#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
-+#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
-+#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
-+#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
-+#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
-+
-+/*---------------------------------------------------------------------------
-+ Operation classes
-+---------------------------------------------------------------------------*/
-+#define EC_HAL EC_CLASS(0)
-+#define EC_DIAG EC_CLASS(8)
-+
-+/*---------------------------------------------------------------------------
-+ Device types
-+---------------------------------------------------------------------------*/
-+#define EC_DEV_EMAC EC_DEVICE(1)
-+#define EC_DEV_IIC EC_DEVICE(2)
-+#define EC_DEV_RESET EC_DEVICE(3)
-+#define EC_DEV_ATMSAR EC_DEVICE(4)
-+#define EC_DEV_MEM EC_DEVICE(5)
-+#define EC_DEV_DES EC_DEVICE(6)
-+#define EC_DEV_DMA EC_DEVICE(7)
-+#define EC_DEV_DSP EC_DEVICE(8)
-+#define EC_DEV_TMR EC_DEVICE(9)
-+#define EC_DEV_WDT EC_DEVICE(10)
-+#define EC_DEV_DCL EC_DEVICE(11)
-+#define EC_DEV_BBIF EC_DEVICE(12)
-+#define EC_DEV_PCI EC_DEVICE(13)
-+#define EC_DEV_XBUS EC_DEVICE(14)
-+#define EC_DEV_DSLIF EC_DEVICE(15)
-+#define EC_DEV_USB EC_DEVICE(16)
-+#define EC_DEV_CLKC EC_DEVICE(17)
-+#define EC_DEV_RAPTOR EC_DEVICE(18)
-+#define EC_DEV_DSPC EC_DEVICE(19)
-+#define EC_DEV_INTC EC_DEVICE(20)
-+#define EC_DEV_GPIO EC_DEVICE(21)
-+#define EC_DEV_BIST EC_DEVICE(22)
-+#define EC_DEV_HDLC EC_DEVICE(23)
-+#define EC_DEV_UART EC_DEVICE(24)
-+#define EC_DEV_VOIC EC_DEVICE(25)
-+/* 9.17.02 (new HAL modules) */
-+#define EC_DEV_CPSAR EC_DEVICE(0x1A)
-+#define EC_DEV_AAL5 EC_DEVICE(0x1B)
-+#define EC_DEV_AAL2 EC_DEVICE(0x1C)
-+#define EC_DEV_CPMAC EC_DEVICE(0x1D)
-+#define EC_DEV_VDMA EC_DEVICE(0x1E)
-+#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
-+#define EC_DEV_CPPI EC_DEVICE(0x20)
-+#define EC_DEV_CPMDIO EC_DEVICE(0x21)
-+
-+/*---------------------------------------------------------------------------
-+ Function types
-+---------------------------------------------------------------------------*/
-+#define EC_FUNC_READ_CONF EC_FUNC(1)
-+#define EC_FUNC_INIT EC_FUNC(2)
-+
-+/*---------------------------------------------------------------------------
-+ Error codes
-+---------------------------------------------------------------------------*/
-+#define EC_CRITICAL (1<<CRITICAL_SHIFT)
-+#define EC_NO_ERRORS 0
-+#define EC_VAL_NO_BASE EC_ERR(1)
-+#define EC_VAL_NO_RESET_BIT EC_ERR(2)
-+#define EC_VAL_NO_RESET EC_ERR(3)
-+#define EC_VAL_BAD_BASE EC_ERR(4)
-+#define EC_VAL_MALLOCFAILED EC_ERR(5)
-+#define EC_VAL_NO_RESETBASE EC_ERR(6)
-+#define EC_DEVICE_NOT_FOUND EC_ERR(7)
-+
-+/*---------------------------------------------------------------------------
-+ Function declarations
-+---------------------------------------------------------------------------*/
-+extern void ec_log_error( unsigned int );
-+
-+#endif /* _INC_EC_ERRORS */
-diff -urN linux.old/drivers/net/avalanche_cpmac/hcpmac.c linux.dev/drivers/net/avalanche_cpmac/hcpmac.c
---- linux.old/drivers/net/avalanche_cpmac/hcpmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/hcpmac.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,1878 @@
-+/******************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002-2004 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE:
-+ *
-+ * DESCRIPTION:
-+ * This file contains the code for the HAL EMAC Bridge Test
-+ *
-+ * HISTORY:
-+ * xxXxx01 Denis RC1.00 Original Version created.
-+ * 22Jan02 Denis/Mick RC1.01 Modified for HAL EMAC API
-+ * 24Jan02 Denis/Mick RC1.02 Speed Improvements
-+ * 28Jan02 Denis/Mick RC1.16 Made function calls pointers
-+ * 28Jan02 Mick RC1.18 Split into separate modules
-+ * 29Jan02 Mick RC1.19 Hal include file cleaned up
-+ * 15Jul02 Michael Hanrahan RC1.20 Synch'd with Linux Version
-+ * 23Sep02 Michael Hanrahan RC1.21 Added CPPI.C
-+ * 16Oct02 Michael Hanrahan RC1.22 Added CAF etc to Options.Conf
-+ * 09Jan03 Michael Hanrahan RC3.01 Fixed incorrect MDIO check
-+ * 01Feb03 Michael Hanrahan RC3.02 Updated for GPIO/PBUSFREQ
-+ * 29Mar03 Michael Hanrahan 1.03 Corrected ChannelConfigGet
-+ * 29Mar03 Michael Hanrahan 1.03 Removed user setting of TxNumQueues
-+ * 23Aug04 Michael Hanrahan 1.7.8 Support for Setting Mac Address
-+ * @author Michael Hanrahan
-+ * @version 1.02
-+ * @date 24-Jan-2002
-+ *****************************************************************************/
-+#define _HAL_CPMAC
-+#define _CPHAL_CPMAC
-+#define _CPHAL
-+#define __CPHAL_CPMDIO
-+
-+#include "dox_cpmac.h" /* Documentation information */
-+
-+/* OS Data Structure definitions */
-+
-+typedef void OS_PRIVATE;
-+typedef void OS_DEVICE;
-+typedef void OS_SENDINFO;
-+typedef void OS_RECEIVEINFO;
-+typedef void OS_SETUP;
-+
-+/* HAL Data Structure definitions */
-+
-+typedef struct _phy_device PHY_DEVICE;
-+typedef struct hal_device HAL_DEVICE;
-+typedef struct hal_private HAL_PRIVATE;
-+typedef struct hal_private HAL_RECEIVEINFO;
-+
-+#include "cpcommon_cpmac.h"
-+#include "cpswhal_cpmac.h"
-+#include "cpmdio.h"
-+#include "hcpmac.h"
-+#include "cpmac_reg.h"
-+
-+
-+#define EC_MODULE
-+
-+/* MDIO Clock Frequency Default Value */
-+
-+/* Rcb/Tcb Constants */
-+
-+#define CB_SOF_BIT (1<<31)
-+#define CB_EOF_BIT (1<<30)
-+#define CB_SOF_AND_EOF_BIT (CB_SOF_BIT|CB_EOF_BIT)
-+#define CB_OWNERSHIP_BIT (1<<29)
-+#define CB_EOQ_BIT (1<<28)
-+#define CB_SIZE_MASK 0x0000ffff
-+#define RCB_ERRORS_MASK 0x03fe0000
-+
-+static char *channel_names[] = CHANNEL_NAMES; /* GSG 11/22 (may change this implementation) */
-+
-+#define scFound(Module) if (HalDev->State != enDevFound) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
-+#define scInit(Module) if (HalDev->State < enInitialized) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
-+#define scOpen(Module) if (HalDev->State < enOpened) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
-+
-+
-+
-+/********************************************************************
-+**
-+** L O C A L F U N C T I O N S
-+**
-+********************************************************************/
-+static int halIsr(HAL_DEVICE *HalDev, int *MorePackets);
-+static int cpmacRandom(HAL_DEVICE *HalDev);
-+static int cpmacRandomRange(HAL_DEVICE *HalDev, int min, int max);
-+static int halPacketProcessEnd(HAL_DEVICE *HalDev);
-+
-+#include "cpcommon_cpmac.c" /*~RC3.02*/
-+#include "cppi_cpmac.c"
-+#include "cpmdio.c" /*~RC3.02*/
-+
-+static int MacAddressSave(HAL_DEVICE *HalDev, unsigned char *MacAddr)
-+ {
-+ int i;
-+ int inst = HalDev->inst;
-+
-+ HalDev->MacAddr = MacAddr;
-+
-+ if(HalDev->debug)
-+ {
-+ dbgPrintf("MacAddrSave[%d]: ", inst);
-+ for (i=0;i<6;i++)
-+ dbgPrintf("%X", HalDev->MacAddr[i]);
-+ dbgPrintf("\n");
-+ osfuncSioFlush();
-+ }
-+ return(EC_NO_ERRORS);
-+ }
-+static int MacAddressSet(HAL_DEVICE *HalDev)
-+ {
-+ unsigned char *macadr = &HalDev->MacAddr[0];
-+ int base = HalDev->dev_base;
-+
-+ scOpen(EC_CPMAC);
-+ CPMAC_MACADDRLO_0(base) = macadr[5];
-+ CPMAC_MACADDRMID(base) = macadr[4];
-+ CPMAC_MACADDRHI(base) = (macadr[0])|(macadr[1]<<8)|(macadr[2]<<16)|(macadr[3]<<24);
-+ if(HalDev->debug)
-+ {
-+ dbgPrintf("MacAddrSet: MacAddr(%d) %X %X %X\n", HalDev->inst, CPMAC_MACADDRLO_0(base),
-+ CPMAC_MACADDRMID(base),
-+ CPMAC_MACADDRHI(base));
-+
-+ dbgPrintf("Start MAC: %d\n",HalDev->dev_base);
-+ osfuncSioFlush();
-+ }
-+ return(EC_NO_ERRORS);
-+ }
-+
-+
-+/*
-+ Updates the MacHash registers
-+*/
-+static void MacHashSet(HAL_DEVICE *HalDev)
-+ {
-+ if(HalDev->State < enOpened)
-+ return;
-+
-+ CPMAC_MACHASH1(HalDev->dev_base) = HalDev->MacHash1;
-+ CPMAC_MACHASH2(HalDev->dev_base) = HalDev->MacHash2;
-+ if (DBG(11))
-+ dbgPrintf("CPMAC[%X]: MacHash1 0x%08X, MacHash2 0x%08X\n", HalDev->dev_base, CPMAC_MACHASH1(HalDev->dev_base), CPMAC_MACHASH2(HalDev->dev_base));
-+ }
-+
-+/*
-+ Reads the MacControl register and updates
-+ the changable bits. (See MACCONTROL_MASK)
-+*/
-+static void RxMBP_EnableSet(HAL_DEVICE *HalDev)
-+ {
-+ bit32u RxMbpEnable;
-+ if(HalDev->State < enOpened)
-+ return;
-+ RxMbpEnable = CPMAC_RX_MBP_ENABLE(HalDev->dev_base);
-+ RxMbpEnable &= ~RX_MBP_ENABLE_MASK; /* Clear out updatable bits */
-+ RxMbpEnable |= HalDev->RxMbpEnable;
-+ CPMAC_RX_MBP_ENABLE(HalDev->dev_base) = RxMbpEnable;
-+ }
-+/*
-+ Reads the MacControl register and updates
-+ the changable bits. (See MACCONTROL_MASK)
-+*/
-+static void MacControlSet(HAL_DEVICE *HalDev)
-+ {
-+ bit32u MacControl;
-+ if(HalDev->State < enOpened)
-+ return;
-+ MacControl = CPMAC_MACCONTROL(HalDev->dev_base);
-+ MacControl &= ~MACCONTROL_MASK; /* Clear out updatable bits */
-+ MacControl |= HalDev->MacControl;
-+ if(!(MacControl & MII_EN)) /* If Enable is not set just update register */
-+ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
-+ else
-+ {
-+ if(MacControl & CTRL_LOOPBACK) /* Loopback Set */
-+ {
-+ /* mii_en is set and loopback is needed,
-+ clear mii_en, set loopback, then set mii_en
-+ */
-+ MacControl &= ~MII_EN; /* Clear MII_EN */
-+ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
-+ CPMAC_MACCONTROL(HalDev->dev_base) |= MII_EN; /* Set MII_EN */
-+ HalDev->Linked = 1; /* if in loopback the logically linked */
-+ }
-+ else /* If Loopback not set just update */
-+ {
-+ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
-+ }
-+ }
-+ if(DBG(0))
-+ dbgPrintf("[halMacControlSet]MacControl:%08X\n", CPMAC_MACCONTROL(HalDev->dev_base));
-+ }
-+static int UnicastSet(HAL_DEVICE *HalDev)
-+ {
-+ CPMAC_RX_UNICAST_SET(HalDev->dev_base) = HalDev->RxUnicastSet;
-+ CPMAC_RX_UNICAST_CLEAR(HalDev->dev_base) = HalDev->RxUnicastClear;
-+ return(EC_NO_ERRORS);
-+ }
-+
-+
-+static bit32u HashGet(bit8u *Address)
-+ {
-+ bit32u hash;
-+ bit8u tmpval;
-+ int i;
-+
-+ hash = 0;
-+ for( i=0; i<2; i++ )
-+ {
-+ tmpval = *Address++;
-+ hash ^= (tmpval>>2)^(tmpval<<4);
-+ tmpval = *Address++;
-+ hash ^= (tmpval>>4)^(tmpval<<2);
-+ tmpval = *Address++;
-+ hash ^= (tmpval>>6)^(tmpval);
-+ }
-+
-+ return( hash & 0x3F );
-+ }
-+
-+static void HashAdd(HAL_DEVICE *HalDev, bit8u *MacAddress)
-+{
-+ bit32u HashValue;
-+ bit32u HashBit;
-+
-+ HashValue = HashGet(MacAddress);
-+
-+ if(HashValue < 32)
-+ {
-+ HashBit = (1 << HashValue);
-+ HalDev->MacHash1 |= HashBit;
-+ }
-+ else
-+ {
-+ HashBit = (1 << (HashValue-32));
-+ HalDev->MacHash2 |= HashBit;
-+ }
-+}
-+
-+static void HashDel(HAL_DEVICE *HalDev, bit8u *MacAddress)
-+{
-+ bit32u HashValue;
-+ bit32u HashBit;
-+
-+ HashValue = HashGet(MacAddress);
-+
-+ if(HashValue < 32)
-+ {
-+ HashBit = (1 << HashValue);
-+ HalDev->MacHash1 &= ~HashBit;
-+ }
-+ else
-+ {
-+ HashBit = (1 << (HashValue-32));
-+ HalDev->MacHash2 &= ~HashBit;
-+ }
-+}
-+
-+/* Replace with an array based on key, with a ptr to the code to do */
-+/* e.g. [enRX_PASS_CRC] = {Set, MBP_UPDATE() } */
-+static void DuplexUpdate(HAL_DEVICE *HalDev)
-+{
-+ int base = HalDev->dev_base;
-+ PHY_DEVICE *PhyDev = HalDev->PhyDev;
-+
-+ if(HalDev->State < enOpened)
-+ return;
-+
-+ /* No Phy Condition */
-+ if(HalDev->MdioConnect & _CPMDIO_NOPHY) /*MJH+030805*/
-+ {
-+ /* No Phy condition, always linked */
-+ HalDev->Linked = 1;
-+ HalDev->EmacSpeed = 1;
-+ HalDev->EmacDuplex = 1;
-+ HalDev->PhyNum = 0xFFFFFFFF; /* No Phy Num */
-+ CPMAC_MACCONTROL(base) |= FULLDUPLEX; /*MJH+030909*/
-+ osfuncStateChange();
-+ return;
-+ }
-+
-+ if(HalDev->MacControl & CTRL_LOOPBACK) /* Loopback Set */
-+ {
-+ HalDev->Linked = 1;
-+ return;
-+ }
-+
-+ if (HalDev->MdioConnect & _CPMDIO_LOOPBK)
-+ {
-+ HalDev->Linked = cpMacMdioGetLoopback(HalDev->PhyDev);
-+ }
-+ else
-+ {
-+ HalDev->Linked = cpMacMdioGetLinked(HalDev->PhyDev);
-+ }
-+ if (HalDev->Linked)
-+ {
-+ /* Retreive Duplex and Speed and the Phy Number */
-+ if(HalDev->MdioConnect & _CPMDIO_LOOPBK)
-+ HalDev->EmacDuplex = 1;
-+ else
-+ HalDev->EmacDuplex = cpMacMdioGetDuplex(PhyDev);
-+ HalDev->EmacSpeed = cpMacMdioGetSpeed(PhyDev);
-+ HalDev->PhyNum = cpMacMdioGetPhyNum(PhyDev);
-+
-+ if(HalDev->EmacDuplex)
-+ CPMAC_MACCONTROL(base) |= FULLDUPLEX;
-+ else
-+ CPMAC_MACCONTROL(base) &= ~FULLDUPLEX;
-+ if(HalDev->debug)
-+ dbgPrintf("%d: Phy= %d, Speed=%s, Duplex=%s\n",HalDev->inst,HalDev->PhyNum,(HalDev->EmacSpeed)?"100":"10",(HalDev->EmacDuplex)?"Full":"Half");
-+ }
-+ if(HalDev->debug)
-+ dbgPrintf("DuplexUpdate[%d]: MACCONTROL 0x%08X, %s\n", HalDev->inst, CPMAC_MACCONTROL(base),(HalDev->Linked)?"Linked":"Not Linked");
-+}
-+static void MdioSetPhyMode(HAL_DEVICE *HalDev)
-+ {
-+ unsigned int PhyMode;
-+ /* Verify proper device state */
-+ if (HalDev->State < enOpened)
-+ return;
-+
-+ PhyMode = NWAY_AUTO|NWAY_FD100|NWAY_HD100|NWAY_FD10|NWAY_HD10;
-+ if(DBG(0))
-+ {
-+ dbgPrintf("halSetPhyMode1: MdioConnect:%08X ,", HalDev->MdioConnect);
-+ dbgPrintf("PhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
-+ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
-+ PhyMode&NWAY_HD100);
-+ }
-+
-+
-+ if ( HalDev->MdioConnect & _CPMDIO_NEG_OFF) /* ~RC3.01 */
-+ PhyMode &= ~(NWAY_AUTO); /* Disable Auto Neg */
-+ if (!(HalDev->MdioConnect & _CPMDIO_HD))
-+ PhyMode &= ~(NWAY_HD100|NWAY_HD10); /* Cannot support HD */
-+ if (!(HalDev->MdioConnect & _CPMDIO_FD))
-+ PhyMode &= ~(NWAY_FD100|NWAY_FD10); /* Cannot support FD */
-+ if (!(HalDev->MdioConnect & _CPMDIO_10))
-+ PhyMode &= ~(NWAY_HD10|NWAY_FD10); /* Cannot support 10 Mbs */
-+ if (!(HalDev->MdioConnect & _CPMDIO_100))
-+ PhyMode &= ~(NWAY_HD100|NWAY_FD100); /* Cannot support 100 Mbs */
-+
-+ if(HalDev->MdioConnect & _CPMDIO_AUTOMDIX) PhyMode |= NWAY_AUTOMDIX; /* Set AutoMdix */
-+
-+ if (HalDev->CpmacFrequency <= 50000000)
-+ PhyMode &= ~(NWAY_FD100|NWAY_HD100); /* Cannot support 100 MBS */
-+ if(DBG(7))
-+ dbgPrintf("halNeg: PhyMode[0x%08X] %d\n", HalDev->dev_base, PhyMode);
-+
-+ if(DBG(0))
-+ {
-+ dbgPrintf("halSetPhyMode2: MdioConnect:%08X ,", HalDev->MdioConnect);
-+ dbgPrintf("PhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
-+ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
-+ PhyMode&NWAY_HD100);
-+ }
-+
-+
-+ cpMacMdioSetPhyMode(HalDev->PhyDev,PhyMode);
-+ DuplexUpdate(HalDev);
-+ }
-+static int StatsClear(HAL_DEVICE *HalDev)
-+{
-+ int i;
-+ MEM_PTR pStats;
-+
-+ scOpen(EC_CPMAC);
-+
-+ pStats = pCPMAC_RXGOODFRAMES(HalDev->dev_base);
-+ for (i=0;i<STATS_MAX;i++)
-+ {
-+ *(MEM_PTR)(pStats) = 0xFFFFFFFF;
-+ pStats++;
-+ }
-+
-+ return(EC_NO_ERRORS);
-+}
-+static void StatsDump(HAL_DEVICE *HalDev, void *Value)
-+ {
-+ MEM_PTR ptrStats;
-+ MEM_PTR ptrValue;
-+ int i;
-+ ptrStats = pCPMAC_RXGOODFRAMES(HalDev->dev_base);
-+ ptrValue = (bit32u*) Value;
-+ for (i=0; i<STATS_MAX; i++)
-+ {
-+ *ptrValue = *ptrStats;
-+ if(DBG(4))
-+ {
-+ dbgPrintf("halStatsDump: Stat[%d:0x%08X] %d 0x%08X %d\n", i, ptrStats, *ptrStats, ptrValue, *ptrValue);
-+ osfuncSioFlush();
-+ }
-+ ptrStats++;
-+ ptrValue++;
-+ }
-+ }
-+static void ConfigApply(HAL_DEVICE *HalDev)
-+ {
-+ CPMAC_RX_MAXLEN(HalDev->dev_base) = HalDev->RxMaxLen;
-+ CPMAC_RX_FILTERLOWTHRESH(HalDev->dev_base) = HalDev->RxFilterLowThresh;
-+ CPMAC_RX0_FLOWTHRESH(HalDev->dev_base) = HalDev->Rx0FlowThresh;
-+ UnicastSet(HalDev);
-+ MacAddressSet(HalDev);
-+ RxMBP_EnableSet(HalDev);
-+ MacHashSet(HalDev);
-+ MacControlSet(HalDev);
-+ if(DBG(0))
-+ dbgPrintf("ValuesUpdate[%d]: MBP_ENABLE 0x%08X\n", HalDev->inst, CPMAC_RX_MBP_ENABLE(HalDev->dev_base));
-+ }
-+static int halStatus(HAL_DEVICE *HalDev)
-+{
-+ int status;
-+
-+ if(HalDev->State < enOpened)
-+ return (EC_CPMAC|EC_FUNC_STATUS|EC_VAL_INVALID_STATE); /*MJH+030805*/
-+
-+ /* No Phy Condition */
-+ if(HalDev->MdioConnect & _CPMDIO_NOPHY) /*MJH+030805*/
-+ {
-+ /* No Phy condition, always linked */
-+ status = HalDev->Linked;
-+ status |= CPMAC_STATUS_LINK_DUPLEX;
-+ status |= CPMAC_STATUS_LINK_SPEED;
-+ return(status);
-+ }
-+
-+
-+ if (HalDev->HostErr) /* Adapter Check */
-+ {
-+ bit32u tmp;
-+ status = CPMAC_STATUS_ADAPTER_CHECK;
-+ if(HalDev->MacStatus & RX_HOST_ERR_CODE)
-+ {
-+ status |= CPMAC_STATUS_HOST_ERR_DIRECTION;
-+ tmp = (HalDev->MacStatus & RX_HOST_ERR_CODE) >> 12; /* Code */
-+ status |= (tmp << 9); /* Code */
-+ tmp = (HalDev->MacStatus & RX_ERR_CH) >> 8; /* Channel */
-+ status |= (tmp << 13);
-+ }
-+ else
-+ if(HalDev->MacStatus & TX_HOST_ERR_CODE)
-+ {
-+ status |= CPMAC_STATUS_HOST_ERR_DIRECTION;
-+ tmp = (HalDev->MacStatus & TX_HOST_ERR_CODE) >> 20; /* Code */
-+ status |= (tmp << 9); /* Code */
-+ tmp = (HalDev->MacStatus & TX_ERR_CH) >> 16; /* Channel */
-+ status |= (tmp << 13);
-+ }
-+ }
-+ else
-+ {
-+ status = HalDev->Linked;
-+ if(status)
-+ {
-+ status = CPMAC_STATUS_LINK;
-+ if(cpMacMdioGetDuplex(HalDev->PhyDev))
-+ status |= CPMAC_STATUS_LINK_DUPLEX;
-+ if(cpMacMdioGetSpeed(HalDev->PhyDev))
-+ status |= CPMAC_STATUS_LINK_SPEED;
-+ }
-+ }
-+ if(HalDev->debug)
-+ dbgPrintf("[halStatus] Link Status is %d for 0x%X\n", status, HalDev->dev_base);
-+ return(status);
-+}
-+static int InfoAccess(HAL_DEVICE *HalDev, int Key, int Action, void *ParmValue)
-+ {
-+ int rc = 0;
-+ int Update=0;
-+
-+ switch (Key)
-+ {
-+ /********************************************************************/
-+ /* */
-+ /* GENERAL */
-+ /* */
-+ /********************************************************************/
-+
-+ case enVersion :
-+ if(Action==enGET)
-+ {
-+ *(const char **)ParmValue = pszVersion_CPMAC;
-+ }
-+ break;
-+ case enDebug :
-+ if(Action==enSET)
-+ {
-+ HalDev->debug = *(unsigned int *)ParmValue;
-+ }
-+ break;
-+
-+ case enStatus :
-+ if(Action==enGET)
-+ {
-+ int status;
-+ status = halStatus(HalDev);
-+ *(int *)ParmValue = status;
-+ }
-+ break;
-+ /********************************************************************/
-+ /* */
-+ /* RX_MBP_ENABLE */
-+ /* */
-+ /********************************************************************/
-+
-+ case enRX_PASS_CRC :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_PASS_CRC(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_QOS_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_QOS_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_NO_CHAIN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_NO_CHAIN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_CMF_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_CMF_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_CSF_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_CSF_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_CEF_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_CEF_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_CAF_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_CAF_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_PROM_CH :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_PROM_CH(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_BROAD_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_BROAD_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_BROAD_CH :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_BROAD_CH(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_MULT_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_MULT_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_MULT_CH :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_MULT_CH(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+
-+ /********************************************************************/
-+ /* */
-+ /* MAC_CONTROL */
-+ /* */
-+ /********************************************************************/
-+
-+ case enTX_PTYPE :
-+ if(Action==enSET)
-+ {
-+ UPDATE_TX_PTYPE(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enTX_PACE :
-+ if(Action==enSET)
-+ {
-+ UPDATE_TX_PACE(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enTX_FLOW_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_TX_FLOW_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_FLOW_EN :
-+ if(Action==enSET)
-+ {
-+ UPDATE_RX_FLOW_EN(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+
-+ case enCTRL_LOOPBACK :
-+ if(Action==enSET)
-+ {
-+ UPDATE_CTRL_LOOPBACK(*(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ /********************************************************************/
-+ /* */
-+ /* RX_UNICAST_SET */
-+ /* */
-+ /********************************************************************/
-+
-+ case enRX_UNICAST_SET :
-+ if(Action==enSET)
-+ {
-+ HalDev->RxUnicastSet |= (1 << *(unsigned int *)ParmValue);
-+ HalDev->RxUnicastClear &= ~(1 << *(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_UNICAST_CLEAR :
-+ if(Action==enSET)
-+ {
-+ HalDev->RxUnicastClear |= (1 << *(unsigned int *)ParmValue);
-+ HalDev->RxUnicastSet &= ~(1 << *(unsigned int *)ParmValue);
-+ Update=1;
-+ }
-+ break;
-+
-+ case enRX_MAXLEN :
-+ if(Action==enSET)
-+ {
-+ HalDev->RxMaxLen = *(unsigned int *)ParmValue;
-+ Update=1;
-+ }
-+ break;
-+
-+ case enRX_FILTERLOWTHRESH :
-+ if(Action==enSET)
-+ {
-+ HalDev->RxFilterLowThresh = *(unsigned int *)ParmValue;
-+ Update=1;
-+ }
-+ break;
-+ case enRX0_FLOWTHRESH :
-+ if(Action==enSET)
-+ {
-+ HalDev->Rx0FlowThresh = *(unsigned int *)ParmValue;
-+ Update=1;
-+ }
-+ break;
-+ /********************************************************************/
-+ /* */
-+ /* RX_MULTICAST */
-+ /* */
-+ /********************************************************************/
-+
-+ case enRX_MULTICAST :
-+ break;
-+ case enRX_MULTI_SINGLE :
-+ if(DBG(11))
-+ {
-+ int tmpi;
-+ bit8u *MacAddress;
-+ MacAddress = (bit8u *) ParmValue;
-+ dbgPrintf("CPMAC[%X]: MacAddress '", HalDev->dev_base);
-+ for (tmpi=0; tmpi<6; tmpi++)
-+ dbgPrintf("%02X:", MacAddress[tmpi]);
-+ dbgPrintf("\n");
-+ }
-+ if(Action==enCLEAR)
-+ {
-+ HashDel(HalDev, ParmValue);
-+ Update=1;
-+ }
-+ else
-+ if(Action==enSET)
-+ {
-+ HashAdd(HalDev, ParmValue);
-+ Update=1;
-+ }
-+ break;
-+ case enRX_MULTI_ALL :
-+ if(Action==enCLEAR)
-+ {
-+ HalDev->MacHash1 = 0;
-+ HalDev->MacHash2 = 0;
-+ Update=1;
-+ }
-+ else
-+ if(Action==enSET)
-+ {
-+ HalDev->MacHash1 = 0xFFFFFFFF;
-+ HalDev->MacHash2 = 0xFFFFFFFF;
-+ Update=1;
-+ }
-+ break;
-+
-+ /********************************************************************/
-+ /* */
-+ /* MDIO */
-+ /* */
-+ /********************************************************************/
-+
-+ case enMdioConnect :
-+ if(Action==enSET)
-+ {
-+ HalDev->MdioConnect = *(unsigned int *)ParmValue;
-+ MdioSetPhyMode(HalDev);
-+ }
-+ if(Action==enGET)
-+ {
-+ *(unsigned int *)ParmValue = HalDev->MdioConnect;
-+ }
-+ break;
-+
-+
-+ /********************************************************************/
-+ /* */
-+ /* STATISTICS */
-+ /* */
-+ /********************************************************************/
-+ case enStatsClear :
-+ StatsClear(HalDev);
-+ break;
-+ case enStatsDump :
-+ if(Action==enGET)
-+ {
-+ StatsDump(HalDev, ParmValue);
-+ }
-+ break;
-+
-+/* Not implemented
-+ case enStats1 :
-+ if(Action==enGET)
-+ {
-+ StatsGet(HalDev, ParmValue, 1);
-+ }
-+ break;
-+
-+ case enStats2 :
-+ if(Action==enGET)
-+ {
-+ StatsGet(HalDev, ParmValue, 2);
-+ }
-+ break;
-+ case enStats3 :
-+ if(Action==enGET)
-+ {
-+ StatsGet(HalDev, ParmValue, 3);
-+ }
-+ break;
-+ case enStats4 :
-+ if(Action==enGET)
-+ {
-+ StatsGet(HalDev, ParmValue, 4);
-+ }
-+ break;
-+
-+*/
-+
-+ default:
-+ rc = EC_CPMAC|EC_FUNC_OPTIONS|EC_VAL_KEY_NOT_FOUND;
-+ break;
-+ }
-+
-+ /* Verify proper device state */
-+ if (HalDev->State == enOpened)
-+ switch (Update)
-+ {
-+ case 1 :
-+ ConfigApply(HalDev);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return (rc);
-+ }
-+static const char pszStats[] = "Stats;";
-+
-+static int halControl(HAL_DEVICE *HalDev, const char *pszKey, const char *pszAction, void *Value)
-+ {
-+ int i;
-+ int rc=0;
-+ int Action;
-+ int ActionFound;
-+ int KeyFound;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("\nhalControl-HalDev:%08X,Action:%s,Key:%s\n", (bit32u)HalDev, pszAction, pszKey);
-+ }
-+#endif
-+
-+ /* 23Aug04 - BCIL needs to set Mac Address */
-+ if(HalDev->OsFunc->Strcmpi(pszKey, pszMacAddr) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ unsigned char *MacAddr;
-+ MacAddr = (unsigned char *) Value;
-+ MacAddressSave(HalDev, MacAddr);
-+ MacAddressSet(HalDev);
-+ return(0);
-+ }
-+ else
-+ {
-+ return(-1);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcLinked) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ HalDev->Linked = *(int *)Value;
-+ return(0);
-+ }
-+ else
-+ {
-+ return(-1);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, "TxIntDisable") == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ HalDev->TxIntDisable = *(int *)Value;
-+ if(HalDev->TxIntDisable && (HalDev->State == enOpened))
-+ {
-+ /* if Opened and need TxIntDisabled, clear Ints for Channel 0 */
-+ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = 1;
-+ }
-+ return(0);
-+ }
-+ else
-+ {
-+ return(-1);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcPhyAccess) == 0)
-+ {
-+ bit32u RegAddr;
-+ bit32u PhyNum;
-+ bit32u Data;
-+ bit32u ValueIn;
-+
-+ ValueIn = *(bit32u*) Value;
-+
-+ KeyFound=1;
-+ /* Cannot access MII if not opended */
-+
-+ if(HalDev->State < enOpened)
-+ return(-1);
-+
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+
-+ PhyNum = (ValueIn & 0x1F); /* Phynum 0-32 */
-+ RegAddr = (ValueIn >> 5) & 0xFF; /* RegAddr in upper 11 bits */
-+
-+ *(bit32u*)Value = _mdioUserAccessRead(HalDev->PhyDev, RegAddr, PhyNum);
-+
-+ return(0);
-+ } /* end of hcGet */
-+
-+
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ PhyNum = (ValueIn & 0x1F); /* Phynum 0-32 */
-+ RegAddr = (ValueIn >> 5) & 0xFF; /* RegAddr in upper 11 bits of lower 16 */
-+
-+ Data = ValueIn >> 16; /* Data store in upper 16 bits */
-+
-+ _mdioUserAccessWrite(HalDev->PhyDev, RegAddr, PhyNum, Data);
-+ return(0);
-+ }
-+ } /* End of hcPhyAccess */
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcPhyNum) == 0)
-+ {
-+ KeyFound=1;
-+ if(!HalDev->Linked)
-+ return(-1); /* if not linked the no Phy Connected */
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(int *)Value = HalDev->PhyNum;
-+ return(0);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcCpmacSize) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(bit32u *)Value = HalDev->CpmacSize;
-+ return(0);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcCpmacBase) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+ *(int *)Value = HalDev->dev_base;
-+ return(0);
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcFullDuplex) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ UPDATE_FULLDUPLEX(*(unsigned int *)Value);
-+ if(HalDev->State == enOpened)
-+ ConfigApply(HalDev);
-+ return(0);
-+ }
-+ else
-+ return(-1);
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, pszDebug) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ ActionFound=1;
-+ HalDev->debug = *(int *)Value;
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strcmpi(pszKey, hcMaxFrags) == 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ {
-+ ActionFound=1;
-+
-+ if ((*(int *)Value) > 0)
-+ HalDev->MaxFrags = *(int *)Value;
-+ else
-+ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_VALUE);
-+ }
-+
-+ if (HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+ ActionFound=1;
-+
-+ *(int *)Value = HalDev->MaxFrags;
-+ }
-+ }
-+
-+ if(HalDev->OsFunc->Strstr(pszKey, pszStats) != 0)
-+ {
-+ KeyFound=1;
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ {
-+ int Level;
-+ int Ch;
-+ char *TmpKey = (char *)pszKey;
-+ ActionFound=1;
-+ TmpKey += HalDev->OsFunc->Strlen(pszStats);
-+ Level = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+ TmpKey++;
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+ TmpKey++;
-+ osfuncSioFlush();
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("\nhalControl-HalDev:%08X, Level:%d, Ch:%d\n", (bit32u)HalDev, Level, Ch);
-+ }
-+#endif
-+ StatsGet(HalDev, (void **)Value, Level, Ch, 0);
-+ osfuncSioFlush();
-+ }
-+ }
-+
-+
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
-+ Action = enSET;
-+ else
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcClear) == 0)
-+ Action = enCLEAR;
-+ else
-+ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
-+ Action = enGET;
-+ else
-+ Action = enNULL;
-+
-+
-+
-+ for(i=enCommonStart+1;i<enCommonEnd;i++)
-+ {
-+ if(HalDev->OsFunc->Strcmpi(KeyCommon[i].strKey, pszKey)==0)
-+ {
-+ rc = InfoAccess(HalDev, KeyCommon[i].enKey, Action, Value);
-+ }
-+ }
-+ for(i=enCpmacStart+1;i<enCpmacEnd;i++)
-+ {
-+ if(HalDev->OsFunc->Strcmpi(KeyCpmac[i].strKey, pszKey)==0)
-+ {
-+ rc = InfoAccess(HalDev, KeyCpmac[i].enKey, Action, Value);
-+ }
-+ }
-+/*
-+ if (KeyFound == 0)
-+ rc = (EC_MODULE|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND);
-+
-+ if (ActionFound == 0)
-+ rc = (EC_MODULE|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND);
-+*/
-+
-+ return(rc);
-+ }
-+static bit32u ConfigGet(HAL_DEVICE *HalDev)
-+ {
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+ int i = HalDev->inst;
-+ bit32u Value;
-+ int Error;
-+
-+ /* get the configuration parameters common to all modules */
-+ Error = ConfigGetCommon(HalDev);
-+ if (Error) return (EC_CPMAC|Error);
-+
-+ if (HalDev->debug)
-+ {
-+ dbgPrintf("ConfigGet: haldev:0x%08X inst:%d base:0x%08X reset:%d\n", (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
-+ osfuncSioFlush();
-+ }
-+
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, pszMdioConnect,&Value); /*MJH+030805*/
-+ if(!Error) HalDev->MdioConnect = Value;
-+
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, "PhyMask",&Value);
-+ if(!Error) HalDev->PhyMask = Value;
-+
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, "MLink",&Value);
-+ if(!Error) HalDev->MLinkMask = Value;
-+
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, hcMdixMask, &Value);
-+ if(!Error)
-+ HalDev->MdixMask = Value;
-+ else
-+ HalDev->MdixMask = 0;
-+
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, hcSize, &Value); /*MJH+030425*/
-+ if(!Error) HalDev->CpmacSize = Value;
-+
-+ for(i=enCommonStart+1;i<enCommonEnd;i++)
-+ {
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, KeyCommon[i].strKey, (bit32u*)&Value);
-+ if(!Error)
-+ {
-+ InfoAccess(HalDev, KeyCommon[i].enKey, enSET, (bit32u*)&Value);
-+ }
-+ }
-+ for(i=enCpmacStart+1;i<enCpmacEnd;i++)
-+ {
-+ Error = OsFunc->DeviceFindParmUint(DeviceInfo, KeyCpmac[i].strKey, (bit32u*)&Value);
-+ if(!Error)
-+ {
-+ InfoAccess(HalDev, KeyCpmac[i].enKey, enSET, (bit32u*)&Value);
-+ }
-+ }
-+ return (EC_NO_ERRORS);
-+ }
-+
-+
-+static void ConfigInit(HAL_DEVICE *HalDev)
-+ {
-+ if(HalDev->inst == 0)
-+ {
-+ HalDev->dev_base = 0xA8610000;
-+ HalDev->ResetBit = 17;
-+ HalDev->interrupt = 19;
-+ HalDev->MLinkMask = 0;
-+ HalDev->PhyMask = 0xAAAAAAAA;
-+ }
-+ else
-+ {
-+ HalDev->dev_base = 0xA8612800;
-+ HalDev->ResetBit = 21;
-+ HalDev->interrupt = 33; /*~RC3.02*/
-+ HalDev->MLinkMask = 0;
-+ HalDev->PhyMask = 0x55555555;
-+ }
-+ HalDev->RxMaxLen = 1518;
-+ HalDev->MaxFrags = 2;
-+ HalDev->MdioConnect = _CPMDIO_HD|_CPMDIO_FD|_CPMDIO_10|_CPMDIO_100|_CPMDIO_AUTOMDIX;
-+ HalDev->debug=0xFFFFFFFF;
-+ HalDev->debug=0;
-+ }
-+/* Shuts down the EMAC device
-+ *
-+ *@param HalDev EMAC instance. This was returned by halOpen()
-+ *@param mode Indicates actions to tak on close.
-+ <br>
-+ *PARTIAL - Disable EMAC
-+ <br>
-+ *FULL - Disable EMAC and call OS to free all allocated memory
-+ *
-+ *@retval
-+ * 0 OK
-+ <br>
-+ * Non-Zero Not OK
-+ *
-+ */
-+static int halInit( HAL_DEVICE *HalDev)
-+ {
-+ int rc;
-+
-+ /* Verify proper device state */
-+ if (HalDev->State != enDevFound)
-+ return(EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_INVALID_STATE);
-+
-+ /* Configure HAL defaults */
-+ ConfigInit(HalDev);
-+
-+ /* Retrieve HAL configuration parameters from data store */
-+ rc = ConfigGet(HalDev);
-+ if (rc) return (rc);
-+
-+ /* Updated 030403*/
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcCpuFrequency, hcGet, &HalDev->CpuFrequency); /*MJH+030403*/
-+ if(rc)
-+ HalDev->CpuFrequency = 20000000; /*20 Mhz default */ /*MJH+030403*/
-+
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcCpmacFrequency, hcGet, &HalDev->CpmacFrequency); /*MJH+030331*/
-+ if(rc)
-+ HalDev->CpmacFrequency = HalDev->CpuFrequency/2; /*MJH~030404*/
-+
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcMdioBusFrequency, hcGet, &HalDev->MdioBusFrequency); /*MJH+030402*/
-+ if(rc)
-+ HalDev->MdioBusFrequency = HalDev->CpmacFrequency;
-+
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcMdioClockFrequency, hcGet, &HalDev->MdioClockFrequency); /*MJH+030402*/
-+ if(rc)
-+ HalDev->MdioClockFrequency = 2200000; /* 2.2 Mhz PITS #14 */
-+
-+
-+ /* update device state */
-+ HalDev->State = enInitialized;
-+
-+ /* initialize statistics */
-+ StatsInit(HalDev); /* +RC3.02 */
-+
-+ /* -RC3.02
-+ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
-+ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
-+ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
-+ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
-+ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
-+ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
-+ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
-+ */
-+
-+ return(EC_NO_ERRORS);
-+ }
-+static int halProbe(HAL_DEVICE *HalDev)
-+ {
-+ int inst = HalDev->inst;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ int error_code;
-+
-+ if (HalDev->State != enConnected)
-+ return (EC_CPMAC|EC_FUNC_PROBE|EC_VAL_INVALID_STATE);
-+
-+ if(HalDev->debug) dbgPrintf("halProbe: %d ",inst);
-+
-+ error_code = OsFunc->DeviceFindInfo(inst,"cpmac",&HalDev->DeviceInfo);
-+
-+ if(error_code)
-+ return (EC_CPMAC|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND );
-+
-+ /* Set device state to DevFound */
-+ HalDev->State = enDevFound;
-+ return(EC_NO_ERRORS);
-+ }
-+static void ChannelConfigInit(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+ int Direction = HalChn->Direction;
-+ int nTxBuffers = 256;
-+
-+ if (Direction == DIRECTION_TX)
-+ {
-+ HalDev->ChData[Ch].TxNumBuffers = nTxBuffers;
-+ HalDev->ChData[Ch].TxNumQueues = 1;
-+ HalDev->ChData[Ch].TxServiceMax = nTxBuffers/3;
-+ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
-+ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
-+ }
-+
-+ if (Direction == DIRECTION_RX)
-+ {
-+ HalDev->ChData[Ch].RxNumBuffers = nTxBuffers*2;
-+ HalDev->ChData[Ch].RxBufferOffset = 0;
-+ HalDev->ChData[Ch].RxBufSize = 1518;
-+ HalDev->ChData[Ch].RxServiceMax = nTxBuffers/3; /*Not a typo*/
-+ }
-+ }
-+static int ChannelConfigApply(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+ int Direction = HalChn->Direction;
-+
-+ if (DBG(11))
-+ {
-+ dbgPrintf("halChannelConfigApply[%d:%d] haldev:0x%08X inst:%d base:0x%08X reset:%d\n", Ch, Direction, (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
-+ osfuncSioFlush();
-+ }
-+
-+ if (Direction == DIRECTION_TX)
-+ {
-+ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
-+ {
-+ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_TX_CH_ALREADY_OPEN);
-+ }
-+
-+ /* Initialize Queue Data */
-+ HalDev->TxActQueueHead[Ch][0] = 0;
-+ HalDev->TxActQueueCount[Ch][0] = 0;
-+ HalDev->TxActive[Ch][0] = FALSE;
-+
-+ /* Need to use a macro that takes channel as input */
-+ CPMAC_TX0_HDP(HalDev->dev_base)=0;
-+
-+ /* Initialize buffer memory for the channel */
-+ InitTcb(HalDev, Ch);
-+
-+ if(!HalDev->TxIntDisable)
-+ CPMAC_TX_INTMASK_SET(HalDev->dev_base) = (1<<Ch); /* GSG 11/22 */
-+ }
-+ else
-+ {
-+ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
-+ {
-+ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_RX_CH_ALREADY_OPEN);
-+ }
-+
-+ /* Initialize Queue Data */
-+ HalDev->RxActQueueHead[Ch] = 0;
-+ HalDev->RxActQueueCount[Ch] = 0;
-+
-+ HalDev->RxActive[Ch] = FALSE;
-+
-+ /* Need to use a macro that takes channel as input */
-+ CPMAC_RX0_HDP(HalDev->dev_base)=0;
-+
-+ /* Initialize buffer memory for the channel */
-+ InitRcb(HalDev, Ch);
-+
-+ CPMAC_RX_INTMASK_SET(HalDev->dev_base) = (1<<Ch); /* GSG 11/22 */
-+ }
-+
-+ HalDev->ChIsOpen[Ch][Direction] = TRUE; /* channel is open */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/* GSG 11/22
-+ * Retrieves channel parameters from configuration file. Any parameters
-+ * which are not found are ignored, and the HAL default value will apply,
-+ * unless a new value is given through the channel structure in the call
-+ * to ChannelSetup.
-+ */
-+static int ChannelConfigGet(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+ int Direction = HalChn->Direction;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ unsigned int rc, Value;
-+ void *ChInfo;
-+
-+ rc=OsFunc->DeviceFindParmValue(HalDev->DeviceInfo, channel_names[Ch], &ChInfo);
-+ /* Do not fail if Channel Info not available for RC2 */
-+ if (rc) return(0);
-+/* if (rc) return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_CH_INFO_NOT_FOUND);*/
-+
-+ /* i don't care if a value is not found because they are optional */
-+ if(Direction == DIRECTION_TX)
-+ {
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "TxNumBuffers", &Value);
-+ if (!rc) HalDev->ChData[Ch].TxNumBuffers = Value;
-+
-+ /*rc=OsFunc->DeviceFindParmUint(ChInfo, "TxNumQueues", &Value);*/ /*MJH-030329*/
-+ /*if (!rc) HalDev->ChData[Ch].TxNumQueues = Value;*/ /*MJH-030329*/
-+
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "TxServiceMax", &Value);
-+ if (!rc)
-+ {
-+ HalDev->ChData[Ch].TxServiceMax = Value;
-+ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
-+ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
-+ }
-+ }
-+ if(Direction == DIRECTION_RX)
-+ {
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxNumBuffers", &Value);
-+ if (!rc) HalDev->ChData[Ch].RxNumBuffers = Value;
-+
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxBufferOffset", &Value);
-+ if (!rc) HalDev->ChData[Ch].RxBufferOffset = Value;
-+
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxBufSize", &Value);
-+ if (!rc) HalDev->ChData[Ch].RxBufSize = Value;
-+
-+ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxServiceMax", &Value);
-+ if (!rc) HalDev->ChData[Ch].RxServiceMax = Value;
-+ }
-+ return (EC_NO_ERRORS);
-+ }
-+#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
-+
-+static void ChannelConfigUpdate(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+ int Direction = HalChn->Direction;
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("\nChnUpd-HalDev:%08X,Chn:%d:%d\n", (bit32u)HalDev, Ch, Direction); osfuncSioFlush();
-+ }
-+#endif
-+ if (Direction == DIRECTION_TX)
-+ {
-+ ChannelUpdate(TxNumBuffers);
-+ /*ChannelUpdate(TxNumQueues);*/ /*MJH~030329*/
-+ ChannelUpdate(TxServiceMax);
-+ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
-+ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
-+ }
-+ else
-+ if (Direction == DIRECTION_RX)
-+ {
-+ ChannelUpdate(RxBufferOffset);
-+ ChannelUpdate(RxBufSize);
-+ ChannelUpdate(RxNumBuffers);
-+ ChannelUpdate(RxServiceMax);
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("\nRxNumBuffers %d\n",HalChn->RxNumBuffers); osfuncSioFlush();
-+ }
-+#endif
-+ }
-+ }
-+static int halChannelSetup(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn, OS_SETUP *OsSetup)
-+ {
-+ int Direction;
-+ int Ch;
-+ int rc;
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enInitialized)
-+ return (EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE);
-+
-+ /* We require the channel structure to be passed, even if it only contains
-+ the channel number */
-+ if (HalChn == NULL)
-+ {
-+ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_NULL_CH_STRUCT);
-+ }
-+
-+ Ch = HalChn->Channel;
-+ Direction = HalChn->Direction;
-+
-+ /* This should check on Maximum Channels for RX or TX,
-+ they might be different Mick 021124 */
-+ if ((Ch < 0) || (Ch > (MAX_CHAN-1)))
-+ {
-+ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_INVALID_CH);
-+ }
-+
-+ /* if channel is already open, this call is invalid */
-+ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
-+ {
-+ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
-+ }
-+
-+ /* channel is closed, but might be setup. If so, reopen the hardware channel. */
-+ if (HalDev->ChIsSetup[Ch][Direction] == FALSE)
-+ {
-+ /* Setup channel configuration */
-+ HalDev->ChData[Ch].Channel = Ch;
-+
-+ /* Store OS_SETUP */
-+ HalDev->ChData[Ch].OsSetup = OsSetup;
-+
-+ /* Framework :
-+ Set Default Values
-+ Update with options.conf
-+ Apply driver updates
-+ */
-+ ChannelConfigInit(HalDev, HalChn);
-+ ChannelConfigGet(HalDev, HalChn);
-+ ChannelConfigUpdate(HalDev, HalChn);
-+
-+ /* cppi.c needs to use Rx/TxServiceMax */
-+ HalDev->BuffersServicedMax = 169; /* TEMP */
-+
-+ HalDev->ChIsSetup[Ch][Direction] = TRUE;
-+ }
-+
-+ rc = EC_NO_ERRORS;
-+
-+ /* If the hardware has been opened (is out of reset), then configure the channel
-+ in the hardware. NOTE: ChannelConfigApply calls the CPSAR ChannelSetup()! */
-+ if (HalDev->State == enOpened)
-+ {
-+ rc = ChannelConfigApply(HalDev, HalChn);
-+ }
-+
-+ return (rc);
-+ }
-+
-+
-+static int miiInfoGet(HAL_DEVICE *HalDev, bit32u *miiBaseAddress, bit32u *miiResetBit)
-+ {
-+ int rc;
-+ void *DeviceInfo;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ /* Only one instance of cpmdio */
-+ rc = OsFunc->DeviceFindInfo(0,"cpmdio",&DeviceInfo); /*~RC3.02*/
-+
-+ if(rc)
-+ return (EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_DEVICE_NOT_FOUND );
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",miiBaseAddress);
-+ if(rc)
-+ rc=EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_NO_BASE;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",miiResetBit);
-+ if(rc)
-+ rc=EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_NO_BASE;
-+
-+
-+ /* See if need to make mdio functional in GPIO */
-+ gpioCheck(HalDev, DeviceInfo);
-+
-+ if(DBG(0))
-+ dbgPrintf("miiBase: 0x%08X %u\n", *miiBaseAddress, *miiResetBit);
-+ return(rc);
-+ }
-+static void ephyCheck(HAL_DEVICE *HalDev)
-+ { /*+RC3.02*/
-+ int rc;
-+ void *DeviceInfo;
-+ int mii_phy;
-+ int reset_bit;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ rc = OsFunc->DeviceFindInfo(0,"ephy",&DeviceInfo);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "mii_phy",&mii_phy);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
-+ if(rc) return;
-+
-+ if (HalDev->PhyMask & (1 << mii_phy))
-+ {
-+ *(volatile bit32u *)(HalDev->ResetBase) |= (1 << reset_bit); /*+RC3.02*/
-+ resetWait(HalDev);
-+ }
-+ } /*+RC3.02*/
-+static void AutoNegotiate(HAL_DEVICE *HalDev)
-+ {
-+ int size;
-+ bit32u ModID, RevMaj, RevMin;
-+ PHY_DEVICE *PhyDev;
-+ bit32u miiBaseAddress;
-+ bit32u miiResetBit;
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enOpened)
-+ return;
-+
-+ miiInfoGet(HalDev, &miiBaseAddress, &miiResetBit);
-+
-+ cpMacMdioGetVer(miiBaseAddress, &ModID, &RevMaj, &RevMin);
-+ if(HalDev->debug)
-+ dbgPrintf("Mdio Module Id %d, Version %d.%d\n", ModID, RevMaj, RevMin);
-+
-+ size = cpMacMdioGetPhyDevSize();
-+ PhyDev = (PHY_DEVICE *) HalDev->OsFunc->Malloc( size );
-+
-+ HalDev->PhyDev = PhyDev;
-+
-+ ephyCheck(HalDev);
-+
-+ cpMacMdioInit( PhyDev, miiBaseAddress, HalDev->inst, HalDev->PhyMask, HalDev->MLinkMask, HalDev->MdixMask, HalDev->ResetBase, miiResetBit, HalDev->MdioBusFrequency, HalDev->MdioClockFrequency, HalDev->debug, HalDev); /*MJH~030402*/
-+ MdioSetPhyMode(HalDev);
-+
-+ return;
-+ }
-+static int halOpen(HAL_DEVICE *HalDev)
-+ {
-+ unsigned char *MacAddr;
-+ int i;
-+ int j;
-+ int rc, Ticks;
-+
-+ if (HalDev->debug)
-+ {
-+ dbgPrintf("halOpen: haldev:0x%08X inst:%d base:0x%08X reset:%d\n", (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
-+ osfuncSioFlush();
-+ }
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enInitialized)
-+ return (EC_CPMAC|EC_FUNC_OPEN|EC_VAL_INVALID_STATE);
-+
-+
-+ /* take CPMAC out of reset - GSG 11/20*/
-+ if ((VOLATILE32(HalDev->ResetBase) & (1 << HalDev->ResetBit)) != 0)
-+ {
-+ /* perform normal close duties */
-+ CPMAC_MACCONTROL(HalDev->dev_base) &= ~MII_EN;
-+ CPMAC_TX_CONTROL(HalDev->dev_base) &= ~TX_EN;
-+ CPMAC_RX_CONTROL(HalDev->dev_base) &= ~RX_EN;
-+
-+ /* disable interrupt masks */
-+ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = 0xFF;
-+ CPMAC_RX_INTMASK_CLEAR(HalDev->dev_base) = 0xFF;
-+ }
-+
-+ /* take CPMAC out of reset */
-+ *(volatile bit32u *)(HalDev->ResetBase) &= ~(1 << HalDev->ResetBit);
-+ resetWait(HalDev);
-+ *(volatile bit32u *)(HalDev->ResetBase) |= (1 << HalDev->ResetBit);
-+ resetWait(HalDev);
-+
-+ /* After Reset clear the Transmit and Receive DMA Head Descriptor Pointers */
-+
-+ CPMAC_TX0_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX1_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX2_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX3_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX4_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX5_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX6_HDP(HalDev->dev_base)=0;
-+ CPMAC_TX7_HDP(HalDev->dev_base)=0;
-+
-+ /* Rx Init */
-+
-+ CPMAC_RX0_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX1_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX2_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX3_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX4_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX5_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX6_HDP(HalDev->dev_base) = 0;
-+ CPMAC_RX7_HDP(HalDev->dev_base) = 0;
-+
-+ CPMAC_RX_BUFFER_OFFSET(HalDev->dev_base) = 0;
-+
-+ /* Init Tx and Rx DMA */
-+
-+ CPMAC_TX_CONTROL(HalDev->dev_base) |= TX_EN;
-+ CPMAC_RX_CONTROL(HalDev->dev_base) |= RX_EN;
-+
-+ CPMAC_MAC_INTMASK_SET(HalDev->dev_base) |=2; /* Enable Adaptercheck Ints */
-+ HalDev->OsFunc->Control(HalDev->OsDev, pszMacAddr, hcGet, &MacAddr); /* GSG 11/22 */
-+ MacAddressSave(HalDev, MacAddr);
-+
-+ HalDev->HostErr = 0; /* Clear Adapter Check indicator */
-+ HalDev->State = enOpened; /* Change device state */
-+
-+ /* Start MDIO Negotiation */
-+ AutoNegotiate(HalDev);
-+
-+ /* Enable the Os Timer */
-+ Ticks = HalDev->CpuFrequency / 100; /* 10 milli-secs */ /*MJH~030402*/
-+ HalDev->OsFunc->Control(HalDev->OsDev, pszTick, hcSet, &Ticks); /* GSG 11/22 */
-+ HalDev->OsFunc->IsrRegister(HalDev->OsDev, halIsr, HalDev->interrupt);
-+
-+ /* GSG +030523 Malloc space for the Rx fraglist */
-+ HalDev->fraglist = HalDev->OsFunc->Malloc(HalDev->MaxFrags * sizeof(FRAGLIST));
-+
-+ /* Any pre-open configuration */
-+
-+ /* For any channels that have been pre-initialized, set them up now */
-+ /* Note : This loop should not use MAX_CHN, it should only
-+ loop through Channels Setup, memory should not be reserved
-+ until Channel is Setup
-+ */
-+ for(i=0; i<MAX_CHAN; i++) /* i loops through Channels */
-+ for(j=0; j<2; j++) /* j loops through DIRECTION values, 0 and 1 */
-+ {
-+ if(HalDev->ChIsSetup[i][j]==TRUE) /* If the Channel and Direction have been Setup */
-+ if(HalDev->ChIsOpen[i][j]==FALSE) /* but not opened, then Apply Values now */
-+ {
-+ CHANNEL_INFO HalChn;
-+ HalChn.Channel = i;
-+ HalChn.Direction = j;
-+ rc = ChannelConfigApply(HalDev, &HalChn);
-+ if(rc != EC_NO_ERRORS)
-+ return(rc);
-+ }
-+ } /* End of looping through Channel/Direction */
-+
-+ ConfigApply(HalDev); /* Apply Configuration Values to Device */
-+ CPMAC_MACCONTROL(HalDev->dev_base) |= MII_EN; /* MAC_EN */
-+ if(DBG(0))
-+ dbgPrintf("[halOpen]MacControl:%08X\n", CPMAC_MACCONTROL(HalDev->dev_base));
-+ return(EC_NO_ERRORS);
-+ }
-+
-+#define INT_PENDING (MAC_IN_VECTOR_TX_INT_OR | MAC_IN_VECTOR_RX_INT_OR | MAC_IN_VECTOR_HOST_INT)
-+static int halShutdown(HAL_DEVICE *HalDev)
-+ {
-+ int Ch, Queue; /*GSG+030514*/
-+
-+ /* Verify proper device state */
-+ if (HalDev->State == enOpened)
-+ halClose(HalDev, 3); /* GSG ~030429 */
-+
-+ /* Buffer/descriptor resources may still need to be freed if a Close
-+ Mode 1 was performed prior to Shutdown - clean up here */ /*GSG+030514*/
-+ for (Ch=0; Ch<MAX_CHAN; Ch++)
-+ {
-+ if (HalDev->RcbStart[Ch] != 0)
-+ FreeRx(HalDev,Ch);
-+
-+ for(Queue=0; Queue<MAX_QUEUE; Queue++)
-+ {
-+ if (HalDev->TcbStart[Ch][Queue] != 0)
-+ FreeTx(HalDev,Ch,Queue);
-+ }
-+ }
-+
-+ /* free the HalFunc */
-+ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
-+
-+ /* free the HAL device */
-+ HalDev->OsFunc->Free(HalDev);
-+
-+ return(EC_NO_ERRORS);
-+ }
-+int halIsr(HAL_DEVICE *HalDev, int *MorePackets)
-+{
-+ bit32u IntVec;
-+ int Serviced;
-+ int PacketsServiced=0;
-+ int Channel;
-+ int TxMorePackets=0;
-+ int RxMorePackets=0;
-+
-+ /* Verify proper device state - important because a call prior to Open would
-+ result in a lockup */
-+ if (HalDev->State != enOpened)
-+ return(EC_CPMAC|EC_FUNC_DEVICE_INT|EC_VAL_INVALID_STATE);
-+
-+ IntVec = CPMAC_MAC_IN_VECTOR(HalDev->dev_base);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("\nhalIsr: inst %d, IntVec 0x%X\n", HalDev->inst, IntVec); osfuncSioFlush();/* GSG 11/22 */
-+ }
-+#endif
-+
-+ HalDev->IntVec = IntVec;
-+ if (IntVec & MAC_IN_VECTOR_TX_INT_OR)
-+ {
-+ int TxServiceMax=0; /* Compiler complains if not initialized */
-+
-+ Channel = (IntVec & 0x7);
-+
-+ if(HalDev->TxIntDisable)
-+ {
-+ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Channel); /* Disable Interrupt for Channel */
-+ TxServiceMax = HalDev->ChData[Channel].TxServiceMax;
-+ HalDev->ChData[Channel].TxServiceMax = 10000; /* Need to service all packets in the Queue */
-+ }
-+
-+ PacketsServiced |= TxInt(HalDev, Channel, 0, &TxMorePackets);
-+
-+ if(HalDev->TxIntDisable)
-+ HalDev->ChData[Channel].TxServiceMax = TxServiceMax;
-+ }
-+
-+ if (IntVec & MAC_IN_VECTOR_RX_INT_OR)
-+ {
-+ Channel = (IntVec >> 8) & 0x7;
-+ Serviced = RxInt(HalDev, Channel, &RxMorePackets);
-+ PacketsServiced |= (Serviced<<16);
-+ }
-+
-+ if (IntVec & MAC_IN_VECTOR_HOST_INT)
-+ {
-+ /* Adaptercheck */
-+ HalDev->HostErr = 1;
-+ HalDev->MacStatus = CPMAC_MACSTATUS(HalDev->dev_base);
-+ osfuncStateChange(); /*MJH+030328*/
-+ if(DBG(0))
-+ {
-+ dbgPrintf("Adaptercheck: %08x for base:%X\n",HalDev->MacStatus, (bit32u)HalDev->dev_base);
-+ osfuncSioFlush();
-+ }
-+ }
-+ *MorePackets = (TxMorePackets | RxMorePackets);
-+ return (PacketsServiced);
-+}
-+
-+int halPacketProcessEnd(HAL_DEVICE *HalDev)
-+{
-+ int base = HalDev->dev_base;
-+ CPMAC_MAC_EOI_VECTOR(base) = 0;
-+ return(0);
-+}
-+
-+
-+
-+static int PhyCheck(HAL_DEVICE *HalDev)
-+ {
-+ return(cpMacMdioTic(HalDev->PhyDev));
-+ }
-+static int halTick(HAL_DEVICE *HalDev)
-+{
-+ int TickChange;
-+
-+ if(HalDev->State < enOpened)
-+ return (EC_CPMAC|EC_FUNC_TICK|EC_VAL_INVALID_STATE);
-+
-+ /* if NO Phy no need to check Link */
-+ if(HalDev->MdioConnect & _CPMDIO_NOPHY)
-+ return(EC_NO_ERRORS); /* No change in Phy State detected */
-+
-+ TickChange = PhyCheck(HalDev);
-+ /* Phy State Change Detected */
-+ if(TickChange == 1)
-+ {
-+ /* MDIO indicated a change */
-+ DuplexUpdate(HalDev);
-+ osfuncStateChange();
-+ return(EC_NO_ERRORS);
-+ }
-+
-+ /* if in AutoMdix mode, and Flip request received, inform OS */
-+ if( (HalDev->MdioConnect & _CPMDIO_AUTOMDIX) &&
-+ (TickChange & _MIIMDIO_MDIXFLIP))
-+ {
-+ bit32u Mdix;
-+ Mdix = TickChange & 0x1; /* Mdix mode stored in bit 0 */
-+ HalDev->OsFunc->Control(HalDev->OsDev, hcMdioMdixSwitch, hcSet, &Mdix);
-+ return(EC_NO_ERRORS);
-+ }
-+
-+ return(EC_NO_ERRORS);
-+}
-+
-+int halCpmacInitModule(HAL_DEVICE **pHalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS **pHalFunc,
-+ OS_FUNCTIONS *OsFunc, int OsFuncSize, int *HalFuncSize, int Inst)
-+ {
-+ HAL_DEVICE *HalDev;
-+ HAL_FUNCTIONS *HalFunc;
-+
-+ if (OsFuncSize < sizeof(OS_FUNCTIONS))
-+ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_OS_VERSION_NOT_SUPPORTED);
-+
-+ HalDev = (HAL_DEVICE *) OsFunc->MallocDev(sizeof(HAL_DEVICE));
-+ if (!HalDev)
-+ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
-+
-+ /* clear the HalDev area */
-+ OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
-+
-+ /* Initialize the size of hal functions */
-+ *HalFuncSize = sizeof (HAL_FUNCTIONS);
-+
-+ HalFunc = (HAL_FUNCTIONS *) OsFunc->Malloc(sizeof(HAL_FUNCTIONS));
-+ if (!HalFunc)
-+ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
-+
-+ /* clear the function pointers */
-+ OsFunc->Memset(HalFunc, 0, sizeof(HAL_FUNCTIONS));
-+
-+ HalDev->OsDev = OsDev;
-+ HalDev->OsOpen = OsDev;
-+ HalDev->inst = Inst;
-+ HalDev->OsFunc = OsFunc;
-+ HalDev->HalFunc = HalFunc;
-+ /* Remove the following from cppi, replace with HalFunc */
-+ HalDev->HalFuncPtr = HalFunc; /* GSG 11/20 changed name to match cppi */
-+
-+ /****************************************************************/
-+ /* POPULATE HALFUNC */
-+ /****************************************************************/
-+ HalFunc->ChannelSetup = halChannelSetup;
-+ HalFunc->ChannelTeardown = halChannelTeardown; /* GSG 11/20 */
-+ HalFunc->Close = halClose; /* GSG 11/20 */
-+ HalFunc->Control = halControl; /* GSG 11/22 */
-+ HalFunc->Init = halInit;
-+ HalFunc->Open = halOpen;
-+ HalFunc->PacketProcessEnd = halPacketProcessEnd;
-+ HalFunc->Probe = halProbe;
-+ HalFunc->RxReturn = halRxReturn;
-+ HalFunc->Send = halSend;
-+ HalFunc->Shutdown = halShutdown;
-+ HalFunc->Tick = halTick;
-+
-+ /* HalFunc->Status = halStatus;*/ /* GSG 11/22 */
-+ /* pass the HalDev and HalFunc back to the caller */
-+
-+ *pHalDev = HalDev;
-+ *pHalFunc = HalFunc;
-+
-+ HalDev->State = enConnected; /* Initialize the hardware state */
-+
-+ if (HalDev->debug) HalDev->OsFunc->Printf("halCpmacInitModule: Leave\n");
-+ return(0);
-+ }
-+
-+int cpmacRandomRange(HAL_DEVICE *HalDev, int min, int max)
-+{
-+ int iTmp;
-+ iTmp = cpmacRandom(HalDev);
-+ iTmp %= ((max-min)+1);
-+ iTmp += min;
-+ return(iTmp);
-+}
-+
-+int cpmacRandom(HAL_DEVICE *HalDev)
-+{
-+ int iTmp;
-+ iTmp = CPMAC_BOFFTEST(HalDev->dev_base);
-+ iTmp >>= 16; /* get rndnum field */
-+ iTmp &= (0x3FF); /* field is 10 bits wide */
-+ return(iTmp);
-+}
-diff -urN linux.old/drivers/net/avalanche_cpmac/hcpmac.h linux.dev/drivers/net/avalanche_cpmac/hcpmac.h
---- linux.old/drivers/net/avalanche_cpmac/hcpmac.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/hcpmac.h 2005-07-10 03:22:40.522158000 +0200
-@@ -0,0 +1,383 @@
-+/** @file***********************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE:
-+ *
-+ * DESCRIPTION:
-+ * This file contains definitions for the HAL EMAC API
-+ *
-+ * HISTORY:
-+ * xxXxx01 Denis 1.00 Original Version created.
-+ * 22Jan02 Denis/Mick 1.01 Modified for HAL EMAC API
-+ * 24Jan02 Denis/Mick 1.02 Speed Improvements
-+ * 28Jan02 Denis/Mick 1.16 Made function calls pointers
-+ * 28Jan02 Mick 1.18 Split into separate modules
-+ * @author Michael Hanrahan
-+ * @version 1.02
-+ * @date 24-Jan-2002
-+ *****************************************************************************/
-+#ifndef _INC_HCPMAC
-+#define _INC_HCPMAC
-+
-+/** \namespace CPMAC_Version
-+This documents version 01.07.04 of the CPMAC CPHAL.
-+*/
-+const char *pszVersion_CPMAC="CPMAC 01.07.08 "__DATE__" "__TIME__;
-+
-+/* CHECK THESE LOCATIONS */
-+#define TEARDOWN_VAL 0xfffffffc
-+#define CB_OFFSET_MASK 0xFFFF0000
-+
-+
-+#define MAX_CHAN 8
-+#define MAX_QUEUE 1
-+
-+typedef struct
-+ {
-+ bit32 HNext; /*< Hardware's pointer to next buffer descriptor */
-+ bit32 BufPtr; /*< Pointer to the data buffer */
-+ bit32 Off_BLen; /*< Contains buffer offset and buffer length */
-+ bit32 mode; /*< SOP, EOP, Ownership, EOQ, Teardown, Q Starv, Length */
-+ void *Next;
-+ void *OsInfo;
-+ void *Eop;
-+#ifdef __CPHAL_DEBUG
-+ bit32 DbgSop;
-+ bit32 DbgData;
-+ bit32 DbgFraglist;
-+#endif
-+ }HAL_TCB;
-+
-+typedef volatile struct hal_private
-+ {
-+ bit32 HNext; /*< Hardware's pointer to next buffer descriptor */
-+ bit32 BufPtr; /*< Pointer to the data buffer */
-+ bit32 Off_BLen; /*< Contains buffer offset and buffer length */
-+ bit32 mode; /*< SOP, EOP, Ownership, EOQ, Teardown Complete bits */
-+ void *DatPtr;
-+ void *Next;
-+ void *OsInfo;
-+ void *Eop;
-+ }HAL_RCB;
-+
-+#define MAX_NEEDS 512 /*MJH+030409*/
-+/* HAL */
-+
-+typedef struct hal_device
-+ {
-+ OS_DEVICE *OsDev;
-+ OS_FUNCTIONS *OsFunc;
-+ /*OS_SETUP *OsSetup;*/ /* -GSG 030508 */
-+ int inst;
-+ bit32u rxbufseq;
-+
-+
-+ bit32 dev_base;
-+ bit32 offset;
-+
-+ bit32u ResetBase; /* GSG 10/20 */
-+ int ResetBit;
-+ void *OsOpen;
-+ bit32u IntVec;
-+ PHY_DEVICE *PhyDev;
-+ bit32u EmacDuplex;
-+ bit32u EmacSpeed;
-+ bit32u PhyNum;
-+ bit32u MLinkMask;
-+ bit32u PhyMask;
-+ bit32u MdixMask;
-+
-+ bit32u Linked;
-+ DEVICE_STATE State;
-+ unsigned char *MacAddr;
-+ HAL_FUNCTIONS *HalFuncPtr; /* GSG 11/20 changed name to match cppi */
-+ HAL_FUNCTIONS *HalFunc;
-+/* unsigned int CpuFreq;*/ /*MJH-030402*/
-+ unsigned int MdioConnect;
-+ unsigned int HostErr;
-+
-+/************************************************************************/
-+/* */
-+/* R E G I S T E R S */
-+/* */
-+/************************************************************************/
-+
-+ bit32u RxMbpEnable;
-+ bit32u RxUnicastSet;
-+ bit32u RxUnicastClear;
-+ bit32u RxMaxLen;
-+ bit32u RxFilterLowThresh;
-+ bit32u Rx0FlowThresh;
-+ bit32u MacControl;
-+ bit32u MacStatus;
-+ bit32u MacHash1;
-+ bit32u MacHash2;
-+
-+/************************************************************************/
-+/* */
-+/* O P T I O N S */
-+/* */
-+/************************************************************************/
-+
-+ char *DeviceInfo;
-+ bit32u interrupt;
-+
-+
-+ bit32u RxPassCrc;
-+ bit32u RxCaf;
-+ bit32u RxCef;
-+ bit32u RxBcast;
-+ bit32u RxBcastCh;
-+ HAL_RCB *RcbPool[MAX_CHAN];
-+ bit32 RxActQueueCount[MAX_CHAN];
-+ HAL_RCB *RxActQueueHead[MAX_CHAN];
-+ HAL_RCB *RxActQueueTail[MAX_CHAN];
-+ bit32 RxActive[MAX_CHAN];
-+ HAL_TCB *TcbPool[MAX_CHAN][MAX_QUEUE];
-+ bit32 TxActQueueCount[MAX_CHAN][MAX_QUEUE];
-+ HAL_TCB *TxActQueueHead[MAX_CHAN][MAX_QUEUE];
-+ HAL_TCB *TxActQueueTail[MAX_CHAN][MAX_QUEUE];
-+ bit32 TxActive[MAX_CHAN][MAX_QUEUE];
-+ bit32 TxTeardownPending[MAX_CHAN];
-+ bit32 RxTeardownPending[MAX_CHAN];
-+ bit32 ChIsOpen[MAX_CHAN][2];
-+ bit32 ChIsSetup[MAX_CHAN][2];
-+ FRAGLIST *fraglist;
-+ char *TcbStart[MAX_CHAN][MAX_QUEUE];
-+ char *RcbStart[MAX_CHAN];
-+ bit32 RcbSize[MAX_CHAN];
-+/* STAT_INFO Stats; */
-+ bit32 Inst;
-+ bit32u BuffersServicedMax;
-+ CHANNEL_INFO ChData[MAX_CHAN];
-+ bit32u MdioClockFrequency; /*MJH+030402*/
-+ bit32u MdioBusFrequency; /*MJH+030402*/
-+ bit32u CpuFrequency; /*MJH+030402*/
-+ bit32u CpmacFrequency; /*MJH+030403*/
-+ bit32u CpmacSize; /*MJH+030425*/
-+ int debug;
-+ bit32u NeedsCount; /*MJH+030409*/
-+ HAL_RECEIVEINFO *Needs[MAX_NEEDS]; /*MJH+030409*/
-+ int MaxFrags;
-+ int TxIntThreshold[MAX_CHAN]; /* MJH 040621 NSP Performance Update */
-+ int TxIntThresholdMaster[MAX_CHAN]; /* MJH 040827 NSP Performance Update */
-+ int TxIntDisable; /* MJH 040621 NSP Performance Update */
-+ }HALDEVICE;
-+
-+#define STATS_MAX 36
-+
-+#define MACCONTROL_MASK (TX_PTYPE|TX_PACE|TX_FLOW_EN|RX_FLOW_EN|CTRL_LOOPBACK)
-+#define RX_MBP_ENABLE_MASK \
-+ (RX_PASS_CRC|RX_QOS_EN|RX_NO_CHAIN| \
-+ RX_CMF_EN|RX_CSF_EN|RX_CEF_EN|RX_CAF_EN|RX_PROM_CH_MASK| \
-+ RX_BROAD_EN|RX_BROAD_CH_MASK|RX_MULT_EN|RX_MULT_CH_MASK)
-+
-+
-+#define MBP_UPDATE(Mask, On) \
-+ if(On) HalDev->RxMbpEnable |= Mask; \
-+ else HalDev->RxMbpEnable &= ~Mask
-+
-+#define CONTROL_UPDATE(Mask, On) \
-+ if(On) HalDev->MacControl |= Mask; \
-+ else HalDev->MacControl &= ~Mask
-+
-+
-+#define UPDATE_TX_PTYPE(Value) CONTROL_UPDATE(TX_PTYPE,Value)
-+#define UPDATE_TX_PACE(Value) CONTROL_UPDATE(TX_PACE,Value)
-+#define UPDATE_MII_EN(Value) CONTROL_UPDATE(MII_EN,Value)
-+#define UPDATE_TX_FLOW_EN(Value) CONTROL_UPDATE(TX_FLOW_EN,Value)
-+#define UPDATE_RX_FLOW_EN(Value) CONTROL_UPDATE(RX_FLOW_EN,Value)
-+#define UPDATE_CTRL_LOOPBACK(Value) CONTROL_UPDATE(CTRL_LOOPBACK,Value)
-+#define UPDATE_FULLDUPLEX(Value) CONTROL_UPDATE(FULLDUPLEX,(Value))
-+
-+#define UPDATE_RX_PASS_CRC(Value) MBP_UPDATE(RX_PASS_CRC, Value)
-+#define UPDATE_RX_QOS_EN(Value) MBP_UPDATE(RX_QOS_EN, Value)
-+#define UPDATE_RX_NO_CHAIN(Value) MBP_UPDATE(RX_NO_CHAIN, Value)
-+#define UPDATE_RX_CMF_EN(Value) MBP_UPDATE(RX_CMF_EN, Value)
-+#define UPDATE_RX_CSF_EN(Value) MBP_UPDATE(RX_CSF_EN, Value)
-+#define UPDATE_RX_CEF_EN(Value) MBP_UPDATE(RX_CEF_EN, Value)
-+#define UPDATE_RX_CAF_EN(Value) MBP_UPDATE(RX_CAF_EN, Value)
-+#define UPDATE_RX_BROAD_EN(Value) MBP_UPDATE(RX_BROAD_EN, Value)
-+#define UPDATE_RX_MULT_EN(Value) MBP_UPDATE(RX_MULT_EN, Value)
-+
-+#define UPDATE_RX_PROM_CH(Value) \
-+ HalDev->RxMbpEnable &= ~RX_PROM_CH_MASK; \
-+ HalDev->RxMbpEnable |= RX_PROM_CH(Value)
-+
-+#define UPDATE_RX_BROAD_CH(Value) \
-+ HalDev->RxMbpEnable &= ~RX_BROAD_CH_MASK; \
-+ HalDev->RxMbpEnable |= RX_BROAD_CH(Value)
-+
-+#define UPDATE_RX_MULT_CH(Value) \
-+ HalDev->RxMbpEnable &= ~RX_MULT_CH_MASK; \
-+ HalDev->RxMbpEnable |= RX_MULT_CH(Value)
-+
-+
-+
-+typedef enum
-+ {
-+ /* CPMAC */
-+ enCpmacStart=0,
-+ enStats0,
-+ enStats1,
-+ enStats2,
-+ enStats3,
-+ enStats4,
-+ enStatsDump,
-+ enStatsClear,
-+ enRX_PASS_CRC,
-+ enRX_QOS_EN,
-+ enRX_NO_CHAIN,
-+ enRX_CMF_EN,
-+ enRX_CSF_EN,
-+ enRX_CEF_EN,
-+ enRX_CAF_EN,
-+ enRX_PROM_CH,
-+ enRX_BROAD_EN,
-+ enRX_BROAD_CH,
-+ enRX_MULT_EN,
-+ enRX_MULT_CH,
-+
-+ enTX_PTYPE,
-+ enTX_PACE,
-+ enMII_EN,
-+ enTX_FLOW_EN,
-+ enRX_FLOW_EN,
-+ enCTRL_LOOPBACK,
-+
-+ enRX_MAXLEN,
-+ enRX_FILTERLOWTHRESH,
-+ enRX0_FLOWTHRESH,
-+ enRX_UNICAST_SET,
-+ enRX_UNICAST_CLEAR,
-+ enMdioConnect,
-+ enMAC_ADDR_GET,
-+ enTick,
-+ enRX_MULTICAST,
-+ enRX_MULTI_ALL,
-+ enRX_MULTI_SINGLE,
-+ enVersion,
-+ enCpmacEnd /* Last entry */
-+ }INFO_KEY_CPMAC;
-+
-+static const char pszVersion[] = "Version";
-+static const char pszStats0[] = "Stats0";
-+static const char pszStats1[] = "Stats1";
-+static const char pszStats2[] = "Stats2";
-+static const char pszStats3[] = "Stats3";
-+static const char pszStats4[] = "Stats4";
-+static const char pszStatsDump[] = "StatsDump";
-+static const char pszStatsClear[] = "StatsClear";
-+
-+/********************************************************************
-+**
-+** RX MBP ENABLE
-+**
-+********************************************************************/
-+static const char pszRX_PASS_CRC[] = "RX_PASS_CRC";
-+static const char pszRX_QOS_EN[] = "RX_QOS_EN";
-+static const char pszRX_NO_CHAIN[] = "RX_NO_CHAIN";
-+static const char pszRX_CMF_EN[] = "RX_CMF_EN";
-+static const char pszRX_CSF_EN[] = "RX_CSF_EN";
-+static const char pszRX_CEF_EN[] = "RX_CEF_EN";
-+static const char pszRX_CAF_EN[] = "RX_CAF_EN";
-+static const char pszRX_PROM_CH[] = "RX_PROM_CH";
-+static const char pszRX_BROAD_EN[] = "RX_BROAD_EN";
-+static const char pszRX_BROAD_CH[] = "RX_BROAD_CH";
-+static const char pszRX_MULT_EN[] = "RX_MULT_EN";
-+static const char pszRX_MULT_CH[] = "RX_MULT_CH";
-+
-+
-+/********************************************************************
-+**
-+** MAC CONTROL
-+**
-+********************************************************************/
-+static const char pszTX_PTYPE[] = "TX_PTYPE";
-+static const char pszTX_PACE[] = "TX_PACE";
-+static const char pszMII_EN[] = "MII_EN";
-+static const char pszTX_FLOW_EN[] = "TX_FLOW_EN";
-+static const char pszRX_FLOW_EN[] = "RX_FLOW_EN";
-+static const char pszCTRL_LOOPBACK[] = "CTRL_LOOPBACK";
-+
-+static const char pszRX_MAXLEN[] = "RX_MAXLEN";
-+static const char pszRX_FILTERLOWTHRESH[] = "RX_FILTERLOWTHRESH";
-+static const char pszRX0_FLOWTHRESH[] = "RX0_FLOWTHRESH";
-+static const char pszRX_UNICAST_SET[] = "RX_UNICAST_SET";
-+static const char pszRX_UNICAST_CLEAR[] = "RX_UNICAST_CLEAR";
-+static const char pszMdioConnect[] = "MdioConnect";
-+static const char pszMacAddr[] = "MacAddr";
-+static const char pszTick[] = "Tick";
-+
-+/********************************************************************
-+**
-+** MULTICAST
-+**
-+********************************************************************/
-+
-+static const char pszRX_MULTICAST[] = "RX_MULTICAST";
-+static const char pszRX_MULTI_ALL[] = "RX_MULTI_ALL";
-+static const char pszRX_MULTI_SINGLE[] = "RX_MULTI_SINGLE";
-+
-+/*
-+static const char* pszGFHN = "GFHN";
-+*/
-+
-+static const CONTROL_KEY KeyCpmac[] =
-+ {
-+ {"" , enCpmacStart},
-+ {pszStats0 , enStats0},
-+ {pszStats1 , enStats1},
-+ {pszStats2 , enStats2},
-+ {pszStats3 , enStats3},
-+ {pszStats4 , enStats4},
-+ {pszStatsClear , enStatsClear},
-+ {pszStatsDump , enStatsDump},
-+ {pszRX_PASS_CRC , enRX_PASS_CRC},
-+ {pszRX_QOS_EN , enRX_QOS_EN},
-+ {pszRX_NO_CHAIN , enRX_NO_CHAIN},
-+ {pszRX_CMF_EN , enRX_CMF_EN},
-+ {pszRX_CSF_EN , enRX_CSF_EN},
-+ {pszRX_CEF_EN , enRX_CEF_EN},
-+ {pszRX_CAF_EN , enRX_CAF_EN},
-+ {pszRX_PROM_CH , enRX_PROM_CH},
-+ {pszRX_BROAD_EN , enRX_BROAD_EN},
-+ {pszRX_BROAD_CH , enRX_BROAD_CH},
-+ {pszRX_MULT_EN , enRX_MULT_EN},
-+ {pszRX_MULT_CH , enRX_MULT_CH},
-+
-+ {pszTX_PTYPE , enTX_PTYPE},
-+ {pszTX_PACE , enTX_PACE},
-+ {pszMII_EN , enMII_EN},
-+ {pszTX_FLOW_EN , enTX_FLOW_EN},
-+ {pszRX_FLOW_EN , enRX_FLOW_EN},
-+ {pszCTRL_LOOPBACK , enCTRL_LOOPBACK},
-+ {pszRX_MAXLEN , enRX_MAXLEN},
-+ {pszRX_FILTERLOWTHRESH , enRX_FILTERLOWTHRESH},
-+ {pszRX0_FLOWTHRESH , enRX0_FLOWTHRESH},
-+ {pszRX_UNICAST_SET , enRX_UNICAST_SET},
-+ {pszRX_UNICAST_CLEAR , enRX_UNICAST_CLEAR},
-+ {pszMdioConnect , enMdioConnect},
-+ {pszRX_MULTICAST , enRX_MULTICAST},
-+ {pszRX_MULTI_ALL , enRX_MULTI_ALL},
-+ {pszRX_MULTI_SINGLE , enRX_MULTI_SINGLE},
-+ {pszTick , enTick},
-+ {pszVersion , enVersion},
-+ {"" , enCpmacEnd}
-+ };
-+
-+const char hcCpuFrequency[] = "CpuFreq";
-+const char hcCpmacFrequency[] = "CpmacFrequency";
-+const char hcMdioBusFrequency[] = "MdioBusFrequency";
-+const char hcMdioClockFrequency[] = "MdioClockFrequency";
-+const char hcCpmacBase[] = "CpmacBase";
-+const char hcPhyNum[] = "PhyNum";
-+const char hcSize[] = "size";
-+const char hcCpmacSize[] = "CpmacSize";
-+const char hcPhyAccess[] = "PhyAccess";
-+const char hcLinked[] = "Linked";
-+const char hcFullDuplex[] = "FullDuplex";
-+const char hcMdixMask[] = "MdixMask";
-+const char hcMdioMdixSwitch[] = "MdixSet";
-+#endif
-diff -urN linux.old/drivers/net/avalanche_cpmac/Makefile linux.dev/drivers/net/avalanche_cpmac/Makefile
---- linux.old/drivers/net/avalanche_cpmac/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/Makefile 2005-07-10 03:22:40.522158000 +0200
-@@ -0,0 +1,26 @@
-+# File: drivers/net/avalanche_cpmac/Makefile
-+#
-+# Makefile for the Linux network (CPMAC) device drivers.
-+#
-+
-+O_TARGET := avalanche_cpmac.o
-+
-+
-+list-multi := avalanche_cpmac.o
-+obj-$(CONFIG_MIPS_AVALANCHE_CPMAC) := avalanche_cpmac.o
-+
-+avalanche_cpmac-objs += cpmac.o cpmacHalLx.o hcpmac.o \
-+ psp_config_build.o psp_config_mgr.o \
-+ psp_config_parse.o psp_config_util.o
-+
-+
-+include $(TOPDIR)/Rules.make
-+
-+
-+avalanche_cpmac.o: $(avalanche_cpmac-objs)
-+ $(LD) -r -o $@ $(avalanche_cpmac-objs)
-+
-+
-+
-+clean:
-+ rm -f core *.o *.a *.s
-diff -urN linux.old/drivers/net/avalanche_cpmac/mdio_reg.h linux.dev/drivers/net/avalanche_cpmac/mdio_reg.h
---- linux.old/drivers/net/avalanche_cpmac/mdio_reg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/mdio_reg.h 2005-07-10 03:22:40.522158000 +0200
-@@ -0,0 +1,121 @@
-+/****************************************************************************
-+** TNETD53xx Software Support
-+** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
-+**
-+** FILE: mdio_reg.h Register definitions for the VBUS MII module
-+**
-+** DESCRIPTION:
-+** This include file contains register definitions for the
-+** VBUS MII module.
-+**
-+** HISTORY:
-+** 27Mar02 Michael Hanrahan Original (modified from emacmdio.h)
-+** 01Apr02 Michael Hanrahan Modified to include all regs. in spec
-+** 03Apr02 Michael Hanrahan Updated to Version 0.6 of spec
-+** 05Apr02 Michael Hanrahan Moved Phy Mode values into here
-+** 30Apr02 Michael Hanrahan Updated to Version 0.8 of spec
-+** 30Apr02 Michael Hanrahan Updated to recommended format
-+** 10May02 Michael Hanrahan Updated to Version 0.9 of spec
-+*****************************************************************************/
-+#ifndef _INC_MDIO_REG
-+#define _INC_MDIO_REG
-+
-+/***************************************************************************
-+**
-+** M D I O M E M O R Y M A P
-+**
-+***************************************************************************/
-+
-+
-+#define pMDIO_VER(base) ((volatile bit32u *)(base+0x00))
-+#define pMDIO_CONTROL(base) ((volatile bit32u *)(base+0x04))
-+#define pMDIO_ALIVE(base) ((volatile bit32u *)(base+0x08))
-+#define pMDIO_LINK(base) ((volatile bit32u *)(base+0x0C))
-+#define pMDIO_LINKINTRAW(base) ((volatile bit32u *)(base+0x10))
-+#define pMDIO_LINKINTMASKED(base) ((volatile bit32u *)(base+0x14))
-+#define pMDIO_USERINTRAW(base) ((volatile bit32u *)(base+0x20))
-+#define pMDIO_USERINTMASKED(base) ((volatile bit32u *)(base+0x24))
-+#define pMDIO_USERINTMASKED_SET(base) ((volatile bit32u *)(base+0x28))
-+#define pMDIO_USERINTMASKED_CLR(base) ((volatile bit32u *)(base+0x2C))
-+#define pMDIO_USERACCESS(base, channel) ((volatile bit32u *)(base+(0x80+(channel*8))))
-+#define pMDIO_USERPHYSEL(base, channel) ((volatile bit32u *)(base+(0x84+(channel*8))))
-+
-+
-+/***************************************************************************
-+**
-+** M D I O R E G I S T E R A C C E S S M A C R O S
-+**
-+***************************************************************************/
-+
-+
-+#define MDIO_ALIVE(base) (*(pMDIO_ALIVE(base)))
-+#define MDIO_CONTROL(base) (*(pMDIO_CONTROL(base)))
-+#define MDIO_CONTROL_IDLE (1 << 31)
-+#define MDIO_CONTROL_ENABLE (1 << 30)
-+#define MDIO_CONTROL_PREAMBLE (1 << 20)
-+#define MDIO_CONTROL_FAULT (1 << 19)
-+#define MDIO_CONTROL_FAULT_DETECT_ENABLE (1 << 18)
-+#define MDIO_CONTROL_INT_TEST_ENABLE (1 << 17)
-+#define MDIO_CONTROL_HIGHEST_USER_CHANNEL (0x1F << 8)
-+#define MDIO_CONTROL_CLKDIV (0xFF)
-+#define MDIO_LINK(base) (*(pMDIO_LINK(base)))
-+#define MDIO_LINKINTRAW(base) (*(pMDIO_LINKINTRAW(base)))
-+#define MDIO_LINKINTMASKED(base) (*(pMDIO_LINKINTMASKED(base)))
-+#define MDIO_USERINTRAW(base) (*(pMDIO_USERINTRAW(base)))
-+#define MDIO_USERINTMASKED(base) (*(pMDIO_USERINTMASKED(base)))
-+#define MDIO_USERINTMASKED_CLR(base) (*(pMDIO_USERINTMASKED_CLR(base)))
-+#define MDIO_USERINTMASKED_SET(base) (*(pMDIO_USERINTMASKED_SET(base)))
-+#define MDIO_USERINTRAW(base) (*(pMDIO_USERINTRAW(base)))
-+#define MDIO_USERACCESS(base, channel) (*(pMDIO_USERACCESS(base, channel)))
-+#define MDIO_USERACCESS_GO (1 << 31)
-+#define MDIO_USERACCESS_WRITE (1 << 30)
-+#define MDIO_USERACCESS_READ (0 << 30)
-+#define MDIO_USERACCESS_ACK (1 << 29)
-+#define MDIO_USERACCESS_REGADR (0x1F << 21)
-+#define MDIO_USERACCESS_PHYADR (0x1F << 16)
-+#define MDIO_USERACCESS_DATA (0xFFFF)
-+#define MDIO_USERPHYSEL(base, channel) (*(pMDIO_USERPHYSEL(base, channel)))
-+#define MDIO_USERPHYSEL_LINKSEL (1 << 7)
-+#define MDIO_USERPHYSEL_LINKINT_ENABLE (1 << 6)
-+#define MDIO_USERPHYSEL_PHYADR_MON (0x1F)
-+#define MDIO_VER(base) (*(pMDIO_VER(base)))
-+#define MDIO_VER_MODID (0xFFFF << 16)
-+#define MDIO_VER_REVMAJ (0xFF << 8)
-+#define MDIO_VER_REVMIN (0xFF)
-+
-+
-+
-+
-+/****************************************************************************/
-+/* */
-+/* P H Y R E G I S T E R D E F I N I T I O N S */
-+/* */
-+/****************************************************************************/
-+
-+
-+#define PHY_CONTROL_REG 0
-+ #define PHY_RESET (1<<15)
-+ #define PHY_LOOP (1<<14)
-+ #define PHY_100 (1<<13)
-+ #define AUTO_NEGOTIATE_EN (1<<12)
-+ #define PHY_PDOWN (1<<11)
-+ #define PHY_ISOLATE (1<<10)
-+ #define RENEGOTIATE (1<<9)
-+ #define PHY_FD (1<<8)
-+
-+#define PHY_STATUS_REG 1
-+ #define NWAY_COMPLETE (1<<5)
-+ #define NWAY_CAPABLE (1<<3)
-+ #define PHY_LINKED (1<<2)
-+
-+#define NWAY_ADVERTIZE_REG 4
-+#define NWAY_REMADVERTISE_REG 5
-+ #define NWAY_FD100 (1<<8)
-+ #define NWAY_HD100 (1<<7)
-+ #define NWAY_FD10 (1<<6)
-+ #define NWAY_HD10 (1<<5)
-+ #define NWAY_SEL (1<<0)
-+ #define NWAY_AUTO (1<<0)
-+
-+
-+#endif _INC_MDIO_REG
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_build.c linux.dev/drivers/net/avalanche_cpmac/psp_config_build.c
---- linux.old/drivers/net/avalanche_cpmac/psp_config_build.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_build.c 2005-07-10 07:31:18.203326552 +0200
-@@ -0,0 +1,335 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Configuration Build Source
-+ ******************************************************************************
-+ * FILE NAME: psp_config_build.c
-+ *
-+ * DESCRIPTION: Configuration Build API Implementation
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifdef INCLUDE_FFS
-+#include "ffs.h"
-+#endif /* INCLUDE_FFS */
-+
-+#include "psp_config_mgr.h"
-+#include "psp_config_build.h"
-+#include "psp_config_util.h"
-+
-+#define MAX_DEVICE_NAME_LEN 16
-+#define MAX_DEVICE_STR_LEN 512
-+
-+#ifndef NULL
-+#define NULL (char *)0
-+#endif
-+
-+#include <asm/ar7/sangam.h>
-+#include <linux/slab.h>
-+#include <linux/config.h>
-+
-+
-+#define os_malloc(size) kmalloc(size, GFP_KERNEL)
-+
-+int psp_run_enumerator(void)
-+{
-+ return(0);
-+}
-+
-+#if defined (CONFIG_AVALANCHE_CPMAC_AUTO)
-+
-+static int auto_detect_cpmac_phy(void)
-+{
-+
-+#define SELECT_INT_PHY_MAC 0
-+#define SELECT_EXT_PHY_MAC 1
-+
-+ volatile unsigned long *reset_cntl = AVALANCHE_RESET_CONTROL_BASE, *mdio_cntl = ((int)AVALANCHE_MDIO_BASE + 0x4);
-+ unsigned int j= 0, detected_phy_map = 0, auto_select = SELECT_INT_PHY_MAC;
-+
-+ *reset_cntl |= (1 << AVALANCHE_MDIO_RESET_BIT) | (1 << AVALANCHE_LOW_CPMAC_RESET_BIT) | (1 << AVALANCHE_HIGH_CPMAC_RESET_BIT) | (1 << AVALANCHE_LOW_EPHY_RESET_BIT);
-+ *mdio_cntl = (1 << 30) | ((CONFIG_AR7_SYS_FREQUENCY * 1000)/2200);
-+
-+ for(j=0;j < 300000; j++)
-+ {
-+ if(j%100000) continue;
-+
-+ detected_phy_map = *(mdio_cntl + 1);
-+ if(detected_phy_map)
-+ {
-+ detected_phy_map &= ~AVALANCHE_LOW_CPMAC_PHY_MASK;
-+
-+ if(detected_phy_map && !(detected_phy_map & (detected_phy_map - 1)))
-+ {
-+ auto_select = SELECT_EXT_PHY_MAC;
-+ break;
-+ }
-+ }
-+ }
-+
-+ return(auto_select);
-+
-+}
-+
-+#endif
-+
-+
-+#ifndef AVALANCHE_LOW_CPMAC_MDIX_MASK
-+#define AVALANCHE_LOW_CPMAC_MDIX_MASK 0
-+#endif
-+
-+void psp_load_default_static_cfg(void)
-+{
-+ char s2[100], s3[100];
-+ char s4[2000], s6[2000];
-+ int threshold = 20;
-+ char *tx_threshold_ptr = prom_getenv("threshold");
-+
-+ if(tx_threshold_ptr)
-+ threshold = simple_strtol(tx_threshold_ptr, (char **)NULL, 10);
-+
-+ /* Static configuration if options.conf not present */
-+ sprintf(s3,"cpmdio(id=mii, base=%u, reset_bit=%d)", AVALANCHE_MDIO_BASE, 22);
-+ sprintf(s2, "reset( id=[ResetRegister], base=%u)", AVALANCHE_RESET_CONTROL_BASE);
-+
-+ sprintf(s4, "cpmac(id=[cpmac], unit=0, base=%u, size=0x800, reset_bit=%d, PhyMask=%u, MdixMask=%u, MLink=0, int_line=%d, memory_offset=0, RX_CAF=1, RX_PASSCRC=0, RX_CEF=1, RX_BCAST=0, RX_BCASTCH=0, Ch0=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch1=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch2=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128])", AVALANCHE_LOW_CPMAC_BASE, AVALANCHE_LOW_CPMAC_RESET_BIT, AVALANCHE_LOW_CPMAC_PHY_MASK, AVALANCHE_LOW_CPMAC_MDIX_MASK, AVALANCHE_LOW_CPMAC_INT,threshold,threshold,threshold);
-+
-+ sprintf(s6, "cpmac(id=[cpmac], unit=1, base=%u, size=0x800, reset_bit=%d, PhyMask=%u, MLink=0, int_line=%d, memory_offset=0, RX_CAF=1, RX_PASSCRC=0, RX_CEF=1, RX_BCAST=0, RX_BCASTCH=0, Ch0=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch1=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch2=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128])", AVALANCHE_HIGH_CPMAC_BASE, AVALANCHE_HIGH_CPMAC_RESET_BIT, AVALANCHE_HIGH_CPMAC_PHY_MASK, AVALANCHE_HIGH_CPMAC_INT,threshold,threshold,threshold);
-+
-+ psp_config_add("reset", s2, psp_config_strlen(s2), en_compile);
-+
-+
-+#if defined (CONFIG_AVALANCHE_LOW_CPMAC)
-+
-+ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
-+ psp_config_add("cpmac", s4, psp_config_strlen(s4), en_compile);
-+
-+#endif
-+
-+
-+#if defined (CONFIG_AVALANCHE_HIGH_CPMAC)
-+
-+ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
-+ psp_config_add("cpmac", s6, psp_config_strlen(s6), en_compile);
-+
-+#endif
-+
-+#if defined (CONFIG_AVALANCHE_CPMAC_AUTO)
-+ {
-+ char *phy_sel_ptr = prom_getenv("mac_phy_sel");
-+ int phy_sel = SELECT_EXT_PHY_MAC;
-+ char *mac_port = prom_getenv("MAC_PORT"); /* Internal: 0, External: 1 */
-+
-+ if(phy_sel_ptr && (0 == strcmp(phy_sel_ptr, "int")))
-+ {
-+ phy_sel = SELECT_INT_PHY_MAC;
-+ }
-+
-+ //if(phy_sel == auto_detect_cpmac_phy())
-+ if(!mac_port || (0 != strcmp(mac_port, "0")))
-+ {
-+ printk("Using the MAC with external PHY\n");
-+ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
-+ psp_config_add("cpmac", s6, psp_config_strlen(s6), en_compile);
-+ }
-+ else
-+ {
-+ printk("Using the MAC with internal PHY\n");
-+ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
-+ psp_config_add("cpmac", s4, psp_config_strlen(s4), en_compile);
-+ }
-+ }
-+
-+#endif
-+
-+}
-+
-+char* psp_conf_read_file(char *p_file_name)
-+{
-+#ifdef INCLUDE_FFS
-+
-+ char *p_file_data = NULL;
-+ unsigned int file_size;
-+ FFS_FILE *p_file = NULL;
-+
-+ if(p_file_name == NULL)
-+ {
-+ return (NULL);
-+ }
-+
-+ if(!(p_file = ffs_fopen(p_file_name, "r")))
-+ {
-+ return(NULL);
-+ }
-+
-+ file_size = p_file->_AvailableBytes;
-+
-+ p_file_data = os_malloc(file_size + 1);
-+
-+ if(ffs_fread(p_file_data, file_size, 1, p_file) == 0)
-+ {
-+ kfree(p_file_data);
-+ return(NULL);
-+ }
-+
-+ ffs_fclose(p_file);
-+
-+ p_file_data[file_size] = '\0';
-+
-+ return(p_file_data);
-+
-+#else /* NO FFS */
-+ return(NULL);
-+#endif /* INCLUDE_FFS */
-+}
-+
-+int psp_conf_get_line(char *p_in_data, char **next_line)
-+{
-+ char *p = p_in_data;
-+
-+ while(*p && *p++ != '\n')
-+ {
-+
-+ }
-+
-+ *next_line = p;
-+
-+ return(p - 1 - p_in_data);
-+}
-+
-+
-+int psp_conf_is_data_line(char *line)
-+{
-+ int ret_val = 1;
-+
-+ if(*line == '\0' || *line == '\n' || *line == '#')
-+ ret_val = 0;
-+
-+ return(ret_val);
-+}
-+
-+int psp_conf_get_key_size(char *data)
-+{
-+ char *p = data;
-+
-+ while(*p && *p != '\n' && *p != '(' && *p != ' ')
-+ p++;
-+
-+ return(p - data);
-+}
-+
-+char* psp_conf_eat_white_spaces(char *p)
-+{
-+ while(*p && *p != '\n' && *p == ' ')
-+ p++;
-+
-+ return (p);
-+}
-+
-+int psp_build_from_opt_conf(void)
-+{
-+ char *data = NULL;
-+ char *data_hold = NULL;
-+ char *next_line = NULL;
-+ int line_size = 0;
-+
-+ if((data = psp_conf_read_file("/etc/options.conf")) == NULL)
-+ return(-1);
-+
-+ data_hold = data;
-+
-+ while((line_size=psp_conf_get_line(data, &next_line)) != -1)
-+ {
-+
-+ char *name = NULL;
-+ int name_size;
-+
-+ data = psp_conf_eat_white_spaces(data);
-+
-+ if(psp_conf_is_data_line(data))
-+ {
-+ data[line_size] = '\0';
-+
-+ name_size = psp_conf_get_key_size(data);
-+
-+ if(name_size > 0)
-+ {
-+ name = (char *) os_malloc(name_size + 1);
-+ if(name == NULL) break;
-+
-+ psp_config_memcpy(name, data, name_size);
-+ name[name_size] = '\0';
-+
-+ psp_config_add(name, data, line_size, en_opt_conf);
-+
-+ kfree(name);
-+ }
-+
-+ data[line_size] = '\n';
-+ }
-+
-+ data = next_line;
-+ }
-+
-+ kfree(data_hold);
-+ return (0);
-+}
-+
-+
-+int psp_write_conf_file(char *p_write_file, char * dev_cfg_string)
-+{
-+#ifdef INCLUDE_FFS
-+ int bytes_written=0;
-+ FFS_FILE *file_ptr=NULL;
-+
-+ /*
-+ * NOTE: In current implementation of FFS in ADAM2 if the file exists beforehand, it
-+ * can't be opened for write.
-+ */
-+ if(!(file_ptr=ffs_fopen(p_write_file, "w"))) {
-+ return(-1);
-+ }
-+
-+ /* Write into the file "output.con" the character string */
-+ /* write a \n before a writing a line */
-+ if(!(bytes_written = ffs_fwrite("\n", 1, sizeof(char), file_ptr))) {
-+ return (-1);
-+ }
-+
-+ if(!(bytes_written = ffs_fwrite(dev_cfg_string, psp_config_strlen(dev_cfg_string), sizeof(char), file_ptr))) {
-+ return (-1);
-+ }
-+ ffs_fclose(file_ptr);
-+ return (bytes_written+1);
-+#else /* NO FFS */
-+ return(-1);
-+#endif /* INCLUDE_FFS */
-+}
-+
-+void build_psp_config(void)
-+{
-+
-+ /* initialize the repository. */
-+ psp_config_init();
-+
-+#ifdef INCLUDE_FFS
-+ ffs_init();
-+#endif /* INCLUDE_FFS */
-+
-+ /* read the configuration from the options.conf to override default ones */
-+ psp_build_from_opt_conf();
-+
-+ /* read the configuration which were not over ridden in options.conf */
-+ psp_load_default_static_cfg();
-+
-+ /* let the vlynq be enumerated. Enumerator will add cfg info
-+ of the discovered device instances to the repository.*/
-+ psp_run_enumerator();
-+
-+ /* dump the repository*/
-+ dump_device_cfg_pool();
-+
-+}
-+
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_build.h linux.dev/drivers/net/avalanche_cpmac/psp_config_build.h
---- linux.old/drivers/net/avalanche_cpmac/psp_config_build.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_build.h 2005-07-10 03:22:40.523158000 +0200
-@@ -0,0 +1,138 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Configuration Build Header
-+ ******************************************************************************
-+ * FILE NAME: psp_config_build.h
-+ *
-+ * DESCRIPTION: Configuration Build API's.
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __PSP_CONF_BUILD_H__
-+#define __PSP_CONF_BUILD_H__
-+
-+/*------------------------------------------------------------------------------
-+ * Name: psp_conf_read_file
-+ *
-+ * Parameters:
-+ * in: p_file_name - the name of the file to read from.
-+ *
-+ * Description:
-+ * Reads the entire file in one shot. This function opens the
-+ * file, determines the size of the data to be read, allocates
-+ * the required memory, NULL terminates the data and closes the
-+ * file.
-+ *
-+ * It is responsibily of the callee to free the memory after it is
-+ * done with that data.
-+ *
-+ *
-+ * Returns:
-+ * A NULL pointer, if failed to read the data otherwise, a valid
-+ * pointer referring to the data read from the file.
-+ *
-+ * Example:
-+ *
-+ * psp_conf_read_file("/etc/options.conf");
-+ *---------------------------------------------------------------------------*/
-+ char *psp_conf_read_file(char *p_file_name);
-+
-+ /*----------------------------------------------------------------------------
-+ * Function : psp_conf_write_file
-+ *
-+ * Parameters:
-+ * in: p_file_name - the file to which data is to be written.
-+ * in: data - the NULL terminated data string.
-+ *
-+ * Description:
-+ * Write the indicated data into the file. This function opens the file,
-+ * appends the data to end of the file, closes the file.
-+ *
-+ * Returns:
-+ *
-+ * The number of bytes on success.
-+ * 0 on failure.
-+ *
-+ * Example:
-+ *
-+ * psp_conf_write_file("/etc/outcon.conf", data);
-+ *--------------------------------------------------------------------------*/
-+ int psp_conf_write_file(char *p_file_name, char *data);
-+
-+ /*----------------------------------------------------------------------------
-+ * Function: psp_conf_get_line
-+ *
-+ * Parameters:
-+ * in: data - the data from which the line is to identified.
-+ * out: next_line - the pointer to start of the next line.
-+ *
-+ * Description:
-+ * Expects the data to be '\n' separated segments and data is NULL
-+ * terminated. Parses the given data for '\n' or '\0'. Provides a pointer
-+ * to the start of next line in the next_line.
-+ *
-+ * Returns:
-+ * -1 on error.
-+ * 0 or more to indicate the number of bytes in the line starting at
-+ * data.
-+ *--------------------------------------------------------------------------*/
-+ int psp_get_conf_line(char *p_in_data, char **next_line);
-+
-+ /*----------------------------------------------------------------------------
-+ * Function: psp_conf_is_data_line
-+ *
-+ * Parameters:
-+ * in: line - the array of bytes.
-+ *
-+ * Description:
-+ * Tests the first byte in the array for '\0' or '\n' or '#'. Lines
-+ * starting with these characters are not considered data.
-+ *
-+ * Returns:
-+ * 1 if the line has data.
-+ * 0 otherwise.
-+ *
-+ *--------------------------------------------------------------------------*/
-+ int psp_conf_is_data_line(char *line);
-+
-+ /*----------------------------------------------------------------------------
-+ * Function: psp_conf_eat_white_spaces
-+ *
-+ * Parameters:
-+ * in: line - the array of bytes.
-+ *
-+ * Description:
-+ * Eats white spaces at the begining of the line while looking out for
-+ * '\0' or '\n' or ' '.
-+ *
-+ * Returns:
-+ * Pointer to the begining of the non white space character.
-+ * NULL if '\0' or '\n' is found.
-+ *
-+ *--------------------------------------------------------------------------*/
-+ char *psp_conf_eat_white_spaces(char *line);
-+
-+ /*---------------------------------------------------------------------------
-+ * Function: psp_conf_get_key_size
-+ *
-+ * Parameters:
-+ * in: line - the array of bytes.
-+ *
-+ * Description:
-+ * Identifies the size of the 'key' in array formatted as
-+ * key(id=[key1]....). This function also checks out for '\0' and '\n'.
-+ *
-+ * Returns:
-+ * On success, The number of bytes that forms the key.
-+ * 0 otherwise.
-+ *
-+ *-------------------------------------------------------------------------*/
-+ int psp_conf_get_key_size(char *line);
-+
-+
-+
-+#endif /* __PSP_CONF_BUILD_H__ */
-+
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.c linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.c
---- linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,464 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager Source
-+ ******************************************************************************
-+ * FILE NAME: psp_config_mgr.c
-+ *
-+ * DESCRIPTION:
-+ *
-+ * Manages configuration information. The repository is managed on the basis of
-+ * <key, info> pair. It is possible to have multiple occurrence of the same key.
-+ * Multiple occurences of the same keys are referred to as 'instances'.
-+ * 'instances' are assigned in the order of configuration arrival. The first
-+ * config for a 'key' added to the repository would be treated as instance 0 and
-+ * next config to arrive for the same key would be treated as instance '1' and
-+ * so on.
-+ *
-+ * Info is retrieved from the repository based on the 'key' and 'instance' value.
-+ *
-+ * No assumption is made about the format of the information that is put in the
-+ * repository. The only requirement is that 'key' should be NULL terminated
-+ * string.
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+//#include <stdio.h>
-+//#include <stdlib.h>
-+#include "psp_config_mgr.h"
-+#include "psp_config_util.h"
-+
-+#include <linux/slab.h>
-+
-+/*-----------------------------------------------------------
-+ Implemented elsewhere
-+ -----------------------------------------------------------*/
-+extern int sys_read_options_conf(void);
-+extern int sys_write_options_conf(char *cfg_info);
-+extern int sys_load_default_static_cfg(void);
-+extern int sys_run_enumerator(void);
-+
-+#define os_malloc(size) kmalloc(size, GFP_KERNEL)
-+
-+/*---------------------------------------------------------
-+ * Data structures.
-+ *--------------------------------------------------------*/
-+struct device_cfg_data;
-+
-+typedef struct device_instance_cfg_data
-+{
-+ struct device_instance_cfg_data *next;
-+ char locale[100];
-+ unsigned int data_size;
-+ char *data;
-+
-+} DEV_INSTANCE_CFG_DATA_T;
-+
-+struct device_cfg_collection;
-+
-+typedef struct device_cfg_collection
-+{
-+ struct device_cfg_collection *next;
-+ char *device_name;
-+ CFG_TYPE_T cfg_type;
-+ int count;
-+ DEV_INSTANCE_CFG_DATA_T *dev_inst_list_begin;
-+ DEV_INSTANCE_CFG_DATA_T *dev_inst_list_end;
-+} DEVICE_CFG_T;
-+
-+
-+typedef struct device_cfg_list
-+{
-+ DEVICE_CFG_T *device_cfg_begin;
-+ int count;
-+} DEVICE_CFG_LIST_T;
-+
-+/*-----------------------------------------------------------------------------
-+ * Functions used locally with in the file.
-+ *---------------------------------------------------------------------------*/
-+static void p_init_device_cfg_list(void);
-+static int p_add_instance_cfg_data(DEVICE_CFG_T *p_dev_cfg,
-+ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data);
-+static DEVICE_CFG_T* p_create_dev_cfg(char *device_name);
-+static DEVICE_CFG_T* p_get_dev_cfg(char *device_name);
-+static int p_set_device_cfg_type(DEVICE_CFG_T *p_dev_cfg,
-+ CFG_TYPE_T cfg_type);
-+
-+/* PSP Config manager debug */
-+#define PSP_CFG_MGR_DEBUG 0
-+
-+#define dbgPrint if (PSP_CFG_MGR_DEBUG) printk
-+
-+/*-----------------------------------------------------------------------------
-+ * The repository.
-+ *---------------------------------------------------------------------------*/
-+static DEVICE_CFG_LIST_T g_device_cfg_list;
-+
-+/*---------------------------------------------
-+ * Initialize the device collection pool.
-+ *--------------------------------------------*/
-+void p_init_device_cfg_list(void)
-+{
-+ g_device_cfg_list.count = 0;
-+ g_device_cfg_list.device_cfg_begin = NULL;
-+}
-+
-+/*----------------------------------------------------------------------
-+ * Add the device cfg into the device linked list.
-+ *---------------------------------------------------------------------*/
-+int p_add_dev_cfg_to_list(DEVICE_CFG_LIST_T *p_dev_list,
-+ DEVICE_CFG_T *p_dev_cfg)
-+{
-+ if(p_dev_list->count != 0)
-+ p_dev_cfg->next = p_dev_list->device_cfg_begin;
-+
-+ p_dev_list->device_cfg_begin = p_dev_cfg;
-+
-+ p_dev_list->count++;
-+
-+ return (0);
-+}
-+
-+/*------------------------------------------------------------------
-+ * Add the cfg data into the cfg data linked list of the collection.
-+ *------------------------------------------------------------------*/
-+int p_add_instance_cfg_data(DEVICE_CFG_T *p_dev_cfg,
-+ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data)
-+{
-+ if(p_dev_cfg->count == 0)
-+ p_dev_cfg->dev_inst_list_begin = p_dev_inst_data;
-+ else
-+ p_dev_cfg->dev_inst_list_end->next = p_dev_inst_data;
-+
-+ p_dev_cfg->dev_inst_list_end = p_dev_inst_data;
-+
-+ p_dev_cfg->count++;
-+
-+ return (0);
-+}
-+
-+/*-----------------------------------------------------------------------------
-+ * Create the device cfg.
-+ *---------------------------------------------------------------------------*/
-+DEVICE_CFG_T *p_create_dev_cfg(char *device_name)
-+{
-+ DEVICE_CFG_T *p_dev_cfg = NULL;
-+
-+ if((p_dev_cfg = os_malloc(sizeof(DEVICE_CFG_T))) == NULL)
-+ {
-+ dbgPrint("Failed to allocate memory for DEVICE_CFG_T.\n");
-+ }
-+ else if((p_dev_cfg->device_name = os_malloc(psp_config_strlen(device_name) + 1))==NULL)
-+ {
-+ dbgPrint("Failed to allocate memory for device name.\n");
-+ }
-+ else
-+ {
-+ psp_config_strcpy(p_dev_cfg->device_name, device_name);
-+ p_dev_cfg->cfg_type = en_raw;
-+ p_dev_cfg->count = 0;
-+ p_dev_cfg->dev_inst_list_begin = NULL;
-+ p_dev_cfg->dev_inst_list_end = NULL;
-+ p_dev_cfg->next = NULL;
-+ }
-+
-+ return(p_dev_cfg);
-+}
-+
-+/*------------------------------------------------------------------------------
-+ * Get the device cfg collection.
-+ *-----------------------------------------------------------------------------*/
-+DEVICE_CFG_T *p_get_dev_cfg(char *device_name)
-+{
-+ int count = 0;
-+ DEVICE_CFG_T *p_dev_cfg = g_device_cfg_list.device_cfg_begin;
-+
-+ for(count=0; count < g_device_cfg_list.count; count++)
-+ {
-+ if(psp_config_strcmp(device_name, p_dev_cfg->device_name) == 0)
-+ {
-+ break;
-+ }
-+
-+ p_dev_cfg = p_dev_cfg->next;
-+ }
-+
-+ return(p_dev_cfg);
-+}
-+
-+/*-------------------------------------------------------------------------
-+ * Gets the name for the static cfg type. Utility function. Debug purposes.
-+ *-------------------------------------------------------------------------*/
-+char *p_get_cfg_type_name_for_en(CFG_TYPE_T cfg_type)
-+{
-+ static char raw_str [] = "still raw";
-+ static char compile_str [] = "configured at compile time";
-+ static char optconf_str [] = "configured by options.conf";
-+ static char vlynq_str [] = "configured by VLYNQ";
-+ static char no_static_str[] = "no static configuration";
-+
-+ if(cfg_type == en_raw)
-+ return (raw_str);
-+ else if(cfg_type == en_compile)
-+ return (compile_str);
-+ else if(cfg_type == en_opt_conf)
-+ return (optconf_str);
-+ else if(cfg_type == en_vlynq)
-+ return (vlynq_str);
-+ else
-+ return (no_static_str);
-+
-+}
-+
-+/*-----------------------------------------------------------------------------
-+ * Sets the static cfg status of the device collection.
-+ *
-+ * If the collection is en_virgin then, the collection is assigned to cfg_type.
-+ * If the cfg_type is en_vlynq then, the old cfg_type is retained.
-+ * en_compile and en_opt_conf are mutually exclusive. One of these can be
-+ * accomodated.
-+ *
-+ *---------------------------------------------------------------------------*/
-+int p_set_device_cfg_type(DEVICE_CFG_T *p_dev_cfg,
-+ CFG_TYPE_T cfg_type)
-+{
-+ int ret_val = 0;
-+
-+ if(p_dev_cfg->cfg_type == en_raw)
-+ p_dev_cfg->cfg_type = cfg_type;
-+ else if((cfg_type == en_vlynq) || (p_dev_cfg->cfg_type == cfg_type))
-+ ;
-+ else
-+ {
-+ dbgPrint("Device %s has been %s which overrides %s.\n",
-+ p_dev_cfg->device_name,
-+ p_get_cfg_type_name_for_en(p_dev_cfg->cfg_type),
-+ p_get_cfg_type_name_for_en(cfg_type));
-+ ret_val = -1;
-+ }
-+
-+ return(ret_val);
-+}
-+
-+/*------------------------------------------------------------------------
-+ * Add the config str into the repository. The cfg type indicates
-+ * whether the device has been configured statically, from options.conf or
-+ * by vlynq enumeration.
-+ *------------------------------------------------------------------------*/
-+int psp_config_add(char *key, void *p_cfg_str, unsigned int cfg_len,
-+ CFG_TYPE_T cfg_type)
-+{
-+ int ret_val = -1;
-+ DEVICE_CFG_T *p_dev_cfg = NULL;
-+ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data = NULL;
-+
-+ if(p_cfg_str == NULL || key == NULL)
-+ {
-+ dbgPrint("Null input pointer(s).\n");
-+ }
-+ /* check if there exist a dev_cfg for the given key, if not,
-+ then create one and add it to the device list. */
-+ else if(((p_dev_cfg = p_get_dev_cfg(key)) == NULL) &&
-+ (((p_dev_cfg = p_create_dev_cfg(key)) == NULL) ||
-+ p_add_dev_cfg_to_list(&g_device_cfg_list, p_dev_cfg) != 0))
-+ {
-+ dbgPrint("Failed to allocate mem or add dev cfg for %s.\n", key);
-+ }
-+ /* make sure that we can add this cfg type to the repository */
-+ else if(p_set_device_cfg_type(p_dev_cfg, cfg_type) == -1)
-+ {
-+ dbgPrint("Ignoring \"%s\" for device \"%s\".\n",
-+ p_get_cfg_type_name_for_en(cfg_type),
-+ p_dev_cfg->device_name);
-+ }
-+ else if((p_dev_inst_data = os_malloc(sizeof(DEV_INSTANCE_CFG_DATA_T)))== NULL)
-+ {
-+ dbgPrint("Failed to allocate memory for DEV_INSTANCE_CFG_DATA_T.\n");
-+ }
-+ else if((p_dev_inst_data->data = os_malloc(cfg_len) + 1) == NULL)
-+ {
-+ dbgPrint("Failed to allocate memory for the config data.\n");
-+ }
-+ else
-+ {
-+ p_dev_inst_data->next = NULL;
-+
-+ if(cfg_type == en_opt_conf || cfg_type == en_compile)
-+ psp_config_strcpy(p_dev_inst_data->locale, "dev on chip ");
-+ else if(cfg_type == en_vlynq)
-+ psp_config_strcpy(p_dev_inst_data->locale, "dev on vlynq");
-+ else
-+ psp_config_strcpy(p_dev_inst_data->locale, "dev locale ?");
-+
-+ psp_config_memcpy(p_dev_inst_data->data, p_cfg_str, cfg_len);
-+ p_dev_inst_data->data_size = cfg_len;
-+ *(p_dev_inst_data->data + cfg_len) = '\0';
-+
-+ ret_val = p_add_instance_cfg_data(p_dev_cfg, p_dev_inst_data);
-+ }
-+
-+ return(ret_val);
-+}
-+
-+/*-------------------------------------------------------------
-+ * Get the total number of device instances in the repository
-+ *------------------------------------------------------------*/
-+int psp_config_get_num_keys(void)
-+{
-+ return(g_device_cfg_list.count);
-+}
-+
-+
-+/*--------------------------------------------------------------------
-+ * Get the device configuration info from the repository.
-+ *-------------------------------------------------------------------*/
-+int psp_config_get(char *key, int instance, char **cfg_data_out)
-+{
-+ int ret_val = -1;
-+ DEVICE_CFG_T *p_dev_cfg = NULL;
-+ *cfg_data_out = NULL;
-+
-+ if(key == NULL && cfg_data_out == NULL)
-+ {
-+ dbgPrint("Key has a NULL value.\n");
-+ }
-+ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
-+ {
-+ dbgPrint("cfg information for %s could not be found.\n", key);
-+ }
-+ else if(p_dev_cfg->count)
-+ {
-+ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data =
-+ p_dev_cfg->dev_inst_list_begin;
-+ int index = 0;
-+ for(index = 0;
-+ index != instance && index < p_dev_cfg->count;
-+ index++)
-+ {
-+ p_dev_inst_data = p_dev_inst_data->next;
-+ }
-+
-+ if(p_dev_inst_data != NULL && p_dev_inst_data->data != NULL)
-+ {
-+ *cfg_data_out = p_dev_inst_data->data;
-+ ret_val = p_dev_inst_data->data_size;
-+ }
-+ }
-+
-+ return (ret_val);
-+}
-+
-+/*----------------------------------------------------------------
-+ * Returns the number of instances found in the repository for the
-+ * specified key.
-+ *---------------------------------------------------------------*/
-+int psp_config_get_num_instances(char *key)
-+{
-+ int ret_val = 0;
-+ DEVICE_CFG_T *p_dev_cfg = NULL;
-+
-+ if(key == NULL)
-+ {
-+ dbgPrint("Key has a NULL value.\n");
-+ }
-+ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
-+ {
-+ dbgPrint("cfg information for %s could not be found.\n", key);
-+ }
-+ else
-+ {
-+ ret_val = p_dev_cfg->count;
-+ }
-+
-+ return (ret_val);
-+}
-+
-+/*------------------------------------------------------------------
-+ * Dump the configuration repository.
-+ * Caution: DO NOT USE THIS FOR ANY NON NBU specified config format.
-+ *-----------------------------------------------------------------*/
-+void psp_config_print(char *key)
-+{
-+ DEVICE_CFG_T *p_dev_cfg = NULL;
-+
-+ if(key == NULL)
-+ {
-+ dbgPrint("Key has a NULL value.\n");
-+ }
-+ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
-+ {
-+ dbgPrint("cfg information for %s could not be found.\n", key);
-+ }
-+ else if(p_dev_cfg && p_dev_cfg->count)
-+ {
-+ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data;
-+
-+ p_dev_inst_data = p_dev_cfg->dev_inst_list_begin;
-+
-+ do
-+ {
-+ dbgPrint("%s : %s\n", p_dev_inst_data->locale,
-+ p_dev_inst_data->data);
-+ p_dev_inst_data = p_dev_inst_data->next;
-+
-+ } while(p_dev_inst_data);
-+ }
-+ else
-+ {
-+ dbgPrint("Nothing was found for %s.\n", key);
-+ }
-+}
-+
-+void dump_device_cfg_pool(void)
-+{
-+ DEVICE_CFG_T *p_dev_cfg = g_device_cfg_list.device_cfg_begin;
-+
-+ if(p_dev_cfg != NULL && g_device_cfg_list.count)
-+ {
-+ int index=0;
-+
-+ for(index=0; index < g_device_cfg_list.count; index++)
-+ {
-+ psp_config_print(p_dev_cfg->device_name);
-+ p_dev_cfg = p_dev_cfg->next;
-+ }
-+ }
-+ else
-+ {
-+ dbgPrint("repository is empty.\n");
-+ }
-+}
-+
-+void psp_config_init(void)
-+{
-+ p_init_device_cfg_list();
-+}
-+
-+void psp_config_cleanup()
-+{
-+ int dev_count = 0;
-+ int inst_count = 0;
-+ DEVICE_CFG_T *p = g_device_cfg_list.device_cfg_begin;
-+ DEV_INSTANCE_CFG_DATA_T *q = NULL;
-+
-+ for(dev_count = 0; dev_count < g_device_cfg_list.count; dev_count++)
-+ {
-+ DEVICE_CFG_T *p_temp = NULL;
-+ if(p) q = p->dev_inst_list_begin;
-+
-+ for(inst_count = 0; inst_count < p->count && q != NULL; inst_count++)
-+ {
-+ DEV_INSTANCE_CFG_DATA_T *q_temp = q;
-+ q_temp = q->next;
-+ kfree(q->data);
-+ kfree(q);
-+ q = q_temp;
-+ }
-+
-+ p_temp = p->next;
-+ kfree(p);
-+ p = p_temp;
-+ }
-+}
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.h linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.h
---- linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.h 2005-07-10 03:22:40.525158000 +0200
-@@ -0,0 +1,110 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager Header
-+ ******************************************************************************
-+ * FILE NAME: psp_config_mgr.h
-+ *
-+ * DESCRIPTION: Storing and retrieving the configuration based on key
-+ * A set of APIs to be used by one and sundry (including drivers and enumerator) to build
-+ * and read cfg information of the devices for an avalanche SOC.
-+ *
-+ * This set of APIs isolates the configuration management from the world and provides simple
-+ * access convinience.
-+ *
-+ * Device in this set refers to the peripherals that can be found on the SOC or on VLYNQ.
-+ * The configuration is stored in the form of string and drivers can use these APIs to get
-+ * a particular parameter value.
-+ *
-+ * The memory allocation for the pass back parameters is done by the caller.
-+ *
-+ * 0 is returned for SUCCESS or TRUE.
-+ * -1 is returned for FAILURE or FALSE.
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __PSP_CONFIG_MGR_H__
-+#define __PSP_CONFIG_MGR_H__
-+
-+typedef enum cfg_type
-+{
-+ en_raw = 0,
-+ en_compile,
-+ en_opt_conf,
-+ en_vlynq
-+} CFG_TYPE_T;
-+
-+/* Build psp configuration */
-+void build_psp_config(void);
-+
-+/********************************************************
-+ * Access Operations.
-+ ********************************************************/
-+
-+/*-------------------------------------------------------------------------
-+ initializes the configuration repository.
-+ -------------------------------------------------------------------------*/
-+void psp_config_init(void);
-+
-+/*--------------------------------------------------------------------------
-+ Adds the configuration information into the repository. 'key' is required
-+ to be NULL terminated string. 'cfg_ptr' points to the configuration data.
-+ 'cfg_len' is the length of the data pointed to by 'cfg_ptr' in bytes.
-+ 'cfg_type' indicates the type of config information.
-+
-+ psp_config_mgr copies the 'cfg_len' bytes of data pointed to by 'cfg_ptr'
-+ into its internal repository.
-+
-+ Returns: 0 on success, -1 on failure.
-+ -------------------------------------------------------------------------*/
-+int psp_config_add(char *key, void *cfg_ptr,
-+ unsigned int cfg_len, CFG_TYPE_T cfg_type);
-+
-+
-+/* --------------------------------------------------------------------------
-+ Passes back, in "*cfg_out_val" a pointer to the config data in the repository
-+ for the specified 'key' and 'instance'. It returns the size of the config
-+ info
-+
-+ psp_config_mgr passes back a pointer in '*cfg_out_val' which refers to
-+ some location in its internal repository. It is strongly recommended that
-+ if the user intends to modify the contents of the config info for reasons
-+ whatsoever, then, user should allocate memory of size returned by this
-+ routine and copy the contents from '*cfg_out_val'.
-+
-+ Any, modification carried out on the repository would lead to un-expected
-+ results.
-+
-+ Returns: 0 or more for the size of config info, -1 on error.
-+ --------------------------------------------------------------------------*/
-+int psp_config_get(char *key, int instance, char **cfg_out_val);
-+
-+
-+/*--------------------------------------------------------------------------
-+ Get the number of keys that have been added in the repository so far.
-+
-+ Returns: 0 or more for the num of keys, -1 on error.
-+ -------------------------------------------------------------------------*/
-+int psp_config_get_num_keys(void);
-+
-+
-+/*--------------------------------------------------------------------------
-+ Get the number of instances that are present in the repository for the
-+ given 'key'.
-+
-+ Returns: 0 or more for the num of instances, -1 on error.
-+ -------------------------------------------------------------------------*/
-+int psp_config_get_num_instances(char *key);
-+
-+
-+/*--------------------------------------------------------------------------
-+ Prints the config data for all instances associated with the specified
-+ 'key'.
-+ -------------------------------------------------------------------------*/
-+void psp_config_print(char *key);
-+
-+void dump_device_cfg_pool(void);
-+
-+#endif /* __PSP_CONFIG_MGR_H__ */
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_parse.c linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.c
---- linux.old/drivers/net/avalanche_cpmac/psp_config_parse.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,362 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Parse API Source
-+ ******************************************************************************
-+ * FILE NAME: psp_config_parse.c
-+ *
-+ * DESCRIPTION: These APIs should be used only for scanvenging parameters which
-+ * are stored in the following format.
-+ *
-+ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+//#include <stdio.h>
-+#include <linux/stddef.h>
-+
-+/*--------------------------------------------------
-+ * MACROS.
-+ *-------------------------------------------------*/
-+#define my_isdigit(c) (c >= '0' && c <= '9')
-+#define my_isoct(c) (c >= '0' && c <= '7')
-+#define my_xtod(c) ((c) <= '9' ? (c) - '0' : (c) - 'a' + 10)
-+#define my_ifupper(c) (c >= 'A' && c <= 'F')
-+#define XTOD(c) ((c) - 'A' + 10)
-+#define my_ishex(c) ((c >= 'a' && c <='f') || (c >= 'A' && c<='F') || my_isdigit(c) )
-+
-+/*---------------------------------------------------
-+ * Local Functions.
-+ *--------------------------------------------------*/
-+static int p_get_substr_from_str(char *p_in_str, char begin_delimiter,
-+ char end_delimiter, int pair_flag,
-+ char **p_out_str);
-+static int p_get_u_int_from_str(char *p_in_str, char begin_delimiter,
-+ char end_delimiter, unsigned long *out_val);
-+
-+/*---------------------------------------------------
-+ * Return pointer to first instance of the char.
-+ *--------------------------------------------------*/
-+static char* psp_config_strchr(char *str, char chr)
-+{
-+ while(*str)
-+ {
-+ if(*str == chr)
-+ break;
-+ str++;
-+ }
-+
-+ return((*str) ? str : NULL);
-+}
-+
-+/*------------------------------------------------------------------------
-+ * Convert the string upto delimiter to unsigned long.
-+ *-----------------------------------------------------------------------*/
-+unsigned long my_atoul(char *p, char end_delimiter, unsigned long *out_val)
-+{
-+ unsigned long n;
-+ int c;
-+
-+ /* check the for null input */
-+ if (!p)
-+ return -1;
-+
-+ c = *p;
-+
-+ /* pass through the leading spaces */
-+ if (!my_isdigit(c))
-+ {
-+ while ( c == ' ')
-+ c = *++p;
-+
-+ }
-+
-+ if (c == '0')
-+ {
-+ if(*(p + 1) == 'x' || *(p+1) == 'X' )
-+ {
-+ /* string is in hex format */
-+
-+ p += 2;
-+ c = *p;
-+
-+ if(my_ishex(c))
-+ {
-+ if(my_ifupper(c))
-+ n = XTOD(c);
-+ else
-+ n = my_xtod(c);
-+ }
-+ else
-+ return -1; /* invalid hex string format */
-+
-+ while ((c = *++p) && my_ishex(c))
-+ {
-+ n *= 16;
-+ if(my_ifupper(c))
-+ n += XTOD(c);
-+ else
-+ n += my_xtod(c);
-+ }
-+ }
-+ else
-+ {
-+ /* string is in octal format */
-+
-+ if( my_isoct(c) )
-+ n = c - '0';
-+ else
-+ return -1; /* invalid octal string format */
-+
-+ while ((c = *++p) && my_isoct(c))
-+ {
-+ n *= 8;
-+ n += c - '0';
-+ }
-+ }
-+
-+ }
-+ else
-+ {
-+ /* string is in decimal format */
-+
-+ if( my_isdigit(c) )
-+ n = c - '0';
-+ else
-+ return -1; /* invalid decimal string format */
-+
-+ while ((c = *++p) && my_isdigit(c))
-+ {
-+ n *= 10;
-+ n += c - '0';
-+ }
-+ }
-+
-+ /* move through the trailing spaces */
-+ while(*p == ' ')
-+ p++;
-+
-+ if(*p == end_delimiter)
-+ {
-+ *out_val = n;
-+ return 0;
-+ }
-+
-+ else
-+ return -1; /* invalid string format */
-+}
-+
-+/*---------------------------------------------------------------------------------
-+ * Gets the substring de-limited by the 'begin_delimiter' and 'end_delimiter'.
-+ * and returns the size of the substring.
-+ *
-+ * Parses the NULL terminated p_in_str for a character array delimited by
-+ * begin_delimiter and end_delimiter, passes back the pointer to the character
-+ * array in ' *p_out_str '. The passed pointer ' *p_out_str ' should point to
-+ * the location next (byte) to the begin_delimiter. The function routine returns
-+ * the number of characters excluding the begin_delimiter and end_delimiter,
-+ * found in the array delimited by the said delimiters.
-+ *
-+ * If the pair_flag is set to 1, then, number of begin_delimiter and end_delimiter
-+ * found in the parsing should match (equal) and this routine passes back the
-+ * pointer to the character array, starting at a location next (byte) to the
-+ * first begin_delimiter, inclusive of all intermediate matching delimiter
-+ * characters found between outer delimiters. If the pair flag is set and if
-+ * begin_delimiter and end_delimiter happens to be same, then error (-1) is
-+ * returned.
-+ *
-+ * Return: 0 or more to indicate the size of the substring, -1 on error.
-+ *-------------------------------------------------------------------------------*/
-+int p_get_substr_from_str(char *p_in_str, char begin_delimiter,
-+ char end_delimiter, int pair_flag,
-+ char **p_out_str)
-+{
-+ int cnt,pos;
-+
-+ if(pair_flag && begin_delimiter == end_delimiter)
-+ return -1;
-+
-+ if((p_in_str = psp_config_strchr(p_in_str, begin_delimiter)) == 0)
-+ return -1; /* no start delimiter found */
-+
-+ p_in_str++;
-+ *p_out_str = p_in_str;
-+
-+ for(pos = 0,cnt =1; cnt && p_in_str[pos] ; pos++)
-+ {
-+ if(p_in_str[pos] == end_delimiter)
-+ {
-+ if(pair_flag == 0)
-+ return pos;
-+
-+ cnt--;
-+ }
-+ else if(p_in_str[pos] == begin_delimiter)
-+ cnt++;
-+ else
-+ ; /* We do nothing */
-+
-+ }
-+
-+ if( cnt == 0)
-+ return pos - 1;
-+ else
-+ return -1; /* no corresponding end delimiter found */
-+}
-+
-+/*--------------------------------------------------------------------------
-+ * Parses the NULL terminated p_in_str for unsigned long value delimited by
-+ * begin_delimiter and end_delimiter, passes back the found in ' *out_val '.
-+ * The function routine returns 0 on success and returns -1 on failure.
-+ * The first instance of the de-limiter should be accounted for the parsing.
-+ *
-+ * The base for unsigned value would 10, octal and hex. The value passed back
-+ * would be of the base 10. Spaces at the begining of the byte array are valid
-+ * and should be ingnored in the calculation of the value. Space character in
-+ * the middle of the byte array or any character other than the valid ones
-+ * (based on base type) should return error. The octal value begins with '0',
-+ * the hex value begins with "0x" or "0X", the base value can begin with
-+ * '1' to '9'.
-+ *
-+ * Returns: 0 on success, -1 on failure.
-+ *-------------------------------------------------------------------------*/
-+int p_get_u_int_from_str(char *p_in_str, char begin_delimiter,
-+ char end_delimiter, unsigned long *out_val)
-+{
-+ char *start;
-+ unsigned long num;
-+
-+ num = p_get_substr_from_str(p_in_str, begin_delimiter, end_delimiter,
-+ 0, &start);
-+
-+ if(num == (unsigned long)-1)
-+ return -1;
-+
-+ return my_atoul(start,end_delimiter,out_val);
-+}
-+
-+/*--------------------------------------------------------------------------
-+ * Finds the first occurrence of the substring p_find_str in the string
-+ * p_in_str.
-+ *-------------------------------------------------------------------------*/
-+char *my_strstr(char *p_in_str, const char *p_find_str)
-+{
-+ char *p = (char *)p_find_str;
-+ char *ret = NULL;
-+
-+ while(*p_in_str)
-+ {
-+ if(!(*p))
-+ return (ret);
-+ else if(*p_in_str == *p)
-+ {
-+ if(!ret) ret = p_in_str;
-+ p++;
-+ p_in_str++;
-+ }
-+ else if(ret)
-+ {
-+ p = (char *)p_find_str;
-+ p_in_str = ret + 1;
-+ ret = NULL;
-+ }
-+ else
-+ p_in_str++;
-+ }
-+
-+ if(*p_in_str != *p) ret = NULL;
-+
-+ return (ret);
-+
-+}
-+
-+/*------------------------------------------------------------------------------
-+ * Gets the value of the config param in the unsigned int format. The value is
-+ * stored in the following format in the string.
-+ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
-+ *-----------------------------------------------------------------------------*/
-+int psp_config_get_param_uint(char *p_in_str, const char *param, unsigned int *out_val)
-+{
-+ int ret_val = -1;
-+ char *p_strstr;
-+
-+ if(!p_in_str || !param || !out_val)
-+ {
-+ ;
-+ }
-+ else if((p_strstr = my_strstr(p_in_str, param)) == NULL)
-+ {
-+ ;
-+ }
-+ else if(p_get_u_int_from_str(p_strstr, '=', ',', (unsigned long *)out_val) == 0)
-+ {
-+ ret_val = 0;
-+ }
-+ else if(p_get_u_int_from_str(p_strstr, '=', ']', (unsigned long*)out_val) == 0)
-+ {
-+ ret_val = 0;
-+ }
-+ else if(p_get_u_int_from_str(p_strstr, '=', ')', (unsigned long*)out_val) == 0)
-+ {
-+ ret_val = 0;
-+ }
-+ else
-+ {
-+ /* we failed */
-+ }
-+
-+ return (ret_val);
-+}
-+
-+/*------------------------------------------------------------------------------
-+ * Gets the value of the config param in the Non NULL terminated format. The value
-+ * is stored in the following format in the string.
-+ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
-+ *-----------------------------------------------------------------------------*/
-+int psp_config_get_param_string(char *p_in_str, const char *param, char **out_val)
-+{
-+ int ret_val = -1;
-+ char *p_strstr;
-+
-+ if(!p_in_str || !param || !(out_val))
-+ ;
-+ else if((p_strstr = my_strstr(p_in_str, param)) == NULL)
-+ {
-+ ;
-+ }
-+ else if((ret_val = p_get_substr_from_str(p_strstr, '[', ']', 1, out_val)) == -1)
-+ {
-+ ;
-+ }
-+ else
-+ {
-+ ; /* we got the value */
-+ }
-+
-+ return (ret_val);
-+}
-+
-+#ifdef PSP_CONFIG_MGR_DEBUG_TEST
-+main()
-+{
-+ unsigned long num =999;
-+ int ret = 0;
-+ char *val1 = NULL;
-+ char val[30];
-+ char str1[] = "cpmac(id=[cpmac], k0=[a1=[a2=[test], a3=2], k1=100, k2=[k3=300, k4=200], k7=722)";
-+
-+ psp_config_get_param_uint(str1, "k7", &num);
-+ printf("%u.\n", num);
-+ ret = psp_config_get_param_string(str1, "a1", &val1);
-+ if(ret >= 0) { printf("%d.\n", ret); strncpy(val, val1, ret); val[ret] = '\0';}
-+
-+ printf("val = \"%s\", and size = %d \n", val, ret);
-+
-+ if(val[ret]) ; else printf("jeee.\n");
-+}
-+#endif /* PSP_CONFIG_MGR_DEBUG_TEST */
-+
-+
-+
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_parse.h linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.h
---- linux.old/drivers/net/avalanche_cpmac/psp_config_parse.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.h 2005-07-10 03:22:40.526158000 +0200
-@@ -0,0 +1,32 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Parse API Header
-+ ******************************************************************************
-+ * FILE NAME: psp_config_parse.h
-+ *
-+ * DESCRIPTION: Parsing for params from string available in the NBU format.
-+ * These APIs should be used only for scanvenging parameters which
-+ * are stored in the following format.
-+ *
-+ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __PSP_CONFIG_PARSER_H__
-+#define __PSP_CONFIG_PARSER_H__
-+
-+/*------------------------------------------------------------------
-+ * These APIs should be used only for scanvenging parameters which
-+ * are stored in the following format.
-+ *
-+ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
-+ *-----------------------------------------------------------------*/
-+int psp_config_get_param_uint(char *p_in_str, const char *param,
-+ unsigned int *out_val);
-+int psp_config_get_param_string(char *p_in_str, const char *param,
-+ char **out_val);
-+
-+#endif /* __PSP_CONFIG_PARSER_H__ */
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_util.c linux.dev/drivers/net/avalanche_cpmac/psp_config_util.c
---- linux.old/drivers/net/avalanche_cpmac/psp_config_util.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_util.c 2005-07-10 04:06:50.492302104 +0200
-@@ -0,0 +1,106 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Utilities API Source
-+ ******************************************************************************
-+ * FILE NAME: psp_config_util.c
-+ *
-+ * DESCRIPTION: These APIs provide the standard "C" string interfaces.
-+ * Provided here to reduce dependencies on the standard libraries
-+ * and for cases where psp_config would required to run before
-+ * the whole system is loaded or outside the scope of the OS.
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+//#include <stdio.h>
-+#include "psp_config_util.h"
-+#include <linux/stddef.h>
-+
-+/*---------------------------------------------
-+ * strlen.
-+ *-------------------------------------------*/
-+int psp_config_strlen(char *p)
-+{
-+ char *p_orig = p;
-+ while(*p)
-+ p++;
-+ return(p - p_orig);
-+}
-+
-+/*--------------------------------------------
-+ * strcmp.
-+ *-------------------------------------------*/
-+int psp_config_strcmp(char *s1, char *s2)
-+{
-+ while(*s1 && *s2)
-+ {
-+ if(*s1 != *s2)
-+ break;
-+ s1++;
-+ s2++;
-+ }
-+
-+ return(*s1 - *s2);
-+}
-+
-+/*--------------------------------------------
-+ * strcpy.
-+ *------------------------------------------*/
-+char* psp_config_strcpy(char *dest, char *src)
-+{
-+ char *dest_orig = dest;
-+
-+ while(*src)
-+ {
-+ *dest++ = *src++;
-+ }
-+
-+ *dest = '\0';
-+
-+ return(dest_orig);
-+}
-+
-+/*----------------------------------------------
-+ * psp_config_memcpy.
-+ *--------------------------------------------*/
-+void* psp_config_memcpy(void* dest, void* src, unsigned int n)
-+{
-+ void *dest_orig = dest;
-+
-+ while(n)
-+ {
-+ *(char *)dest++ = *(char *)src++;
-+ n--;
-+ }
-+
-+ return (dest_orig);
-+}
-+
-+/*---------------------------------------------------
-+ * Return pointer to first instance of the char.
-+ *--------------------------------------------------*/
-+char* psp_config_strchr(char *str, char chr)
-+{
-+ while(*str)
-+ {
-+ if(*str == chr)
-+ break;
-+ str++;
-+ }
-+
-+ return((*str) ? str : NULL);
-+}
-+
-+#ifdef PSP_CONFIG_MGR_DEBUG_TEST
-+
-+int main( )
-+{
-+ char s[] = "hello ";
-+ printf("%d.\n", psp_config_strlen("hello\n"));
-+ printf("%d.\n", psp_config_strcmp("hells", "hellq"));
-+ printf("%s %s.\n", psp_config_strcpy(s + 6, "test1"), s);
-+}
-+
-+#endif /* PSP_CONFIG_MGR_DEBUG_TEST */
-diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_util.h linux.dev/drivers/net/avalanche_cpmac/psp_config_util.h
---- linux.old/drivers/net/avalanche_cpmac/psp_config_util.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/psp_config_util.h 2005-07-10 03:22:40.526158000 +0200
-@@ -0,0 +1,26 @@
-+/******************************************************************************
-+ * FILE PURPOSE: PSP Config Manager - Utilities API Header
-+ ******************************************************************************
-+ * FILE NAME: psp_config_util.h
-+ *
-+ * DESCRIPTION: These APIs provide the standard "C" string interfaces.
-+ * Provided here to reduce dependencies on the standard libraries
-+ * and for cases where psp_config would required to run before
-+ * the whole system is loaded or outside the scope of the OS.
-+ *
-+ * REVISION HISTORY:
-+ * 27 Nov 02 - PSP TII
-+ *
-+ * (C) Copyright 2002, Texas Instruments, Inc
-+ *******************************************************************************/
-+
-+#ifndef __PSP_CONFIG_UTIL_H__
-+#define __PSP_CONFIG_UTIL_H__
-+
-+extern int psp_config_strlen(char*);
-+extern int psp_config_strcmp(char*, char*);
-+extern char* psp_config_strcpy(char*, char*);
-+extern void* psp_config_memcpy(void*, void*, unsigned int n);
-+extern char* psp_config_strchr(char*, char);
-+
-+#endif /* __PSP_CONFIG_UTIL_H__ */
-diff -urN linux.old/drivers/net/avalanche_cpmac/readme.txt linux.dev/drivers/net/avalanche_cpmac/readme.txt
---- linux.old/drivers/net/avalanche_cpmac/readme.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/avalanche_cpmac/readme.txt 2005-07-10 03:22:40.527158000 +0200
-@@ -0,0 +1,545 @@
-+23 August 2004 CPMAC 1.7.8 (NSP Performance Team Release)
-+
-+CC Labels: REL_20040823_HALdallas_cpmac_01.07.08
-+
-+New features: Key "MacAddr" can now be used to set the Mac Address after Open.
-+
-+ unsigned char MacAddr[6];
-+
-+ // Set Mac Address to "00.B0.D0.10.80.C1"
-+ MacAddr[0] = 0x00;
-+ MacAddr[1] = 0xB0;
-+ MacAddr[2] = 0xD0;
-+ MacAddr[3] = 0x10;
-+ MacAddr[4] = 0x80;
-+ MacAddr[5] = 0xC1;
-+
-+ HalFunc->Control(HalDev, "MacAddr", hcSet, &MacAddr);
-+
-+Bug fixes: in Send(), Threshold is not checked if Tx Ints are re-enabled.
-+
-+Modules affected: hcpmac.c, hcpmac.h, cppi_cpmac.c
-+
-+22 June 2004 CPMAC 1.7.6 (NSP Performance Team Release)
-+
-+CC Labels: REL_20040622_HALdallas_cpmac_01.07.06
-+
-+New features: Key "TxIntDisable" used to disable Tx Interrupts. If it is set, then Tx Interrupts will be processed on Send() controlled by Tx ServiceMax Setting.
-+
-+ int On = 1;
-+ HalFunc->Control(HalDev, "TxIntDisable", "Set", &On);
-+
-+Bug fixes: NTR
-+
-+10 June 2004 CPMAC 1.7.5 (external release)
-+
-+CC Labels: REL_20040610_HALdallas_cpmac_01.07.05
-+
-+New features: NTR
-+
-+Bug fixes: Fixed an issue with calculation for the multicast hash.
-+
-+27 May 2004 CPSAR 1.7.4, CPMAC 1.7.4 (external release)
-+
-+CC Labels: REL_20040527_HALdallas_cpsar_01.07.04
-+ REL_20040527_HALdallas_cpmac_01.07.04
-+
-+New features: NTR
-+
-+Bug fixes: A flaw was fixed in the critical sectioning of the CPPI file, affecting both
-+ the MAC and the SAR releases. This flaw was detected on Titan PSP 4.7 BFT2.
-+
-+05 May 2004 CPSAR 1.7.3, CPMAC 1.7.3 (external release)
-+
-+CC Labels: REL_20040505_HALdallas_cpsar_01.07.03
-+ REL_20040505_HALdallas_cpmac_01.07.03
-+
-+New features: NTR
-+
-+Bug fixes: 1) Firmware has been updated to fix a problem with Host OAM mode operation.
-+ 2) Cache macros have been fixed.
-+
-+Notes: This release contains all performance enhancements currently available for CPHAL 1.x.
-+
-+19 April 2004 CPSAR 1.7.2, CPMAC 1.7.2 (external release)
-+
-+CC Labels: REL_20040419_HALdallas_cpsar_01.07.02
-+ REL_20040419_HALdallas_cpmac_01.07.02
-+
-+New features: NTR
-+
-+Bug fixes: Fixes merge problem in 1.7.1.
-+
-+Notes: This is a branch release which contains only a subset of the performance improvements.
-+ The remaining performance improvements are stiill being qualified at this time.
-+
-+1 April 2004 CPSAR 1.7.1, CPMAC 1.7.1 (external release)
-+
-+NOTICE: DO NOT USE 1.7.1. It has a known problem (see 1.7.2 notes)
-+
-+CC Labels: REL_20040401_HALdallas_cpsar_01.07.01
-+ REL_20040401_HALdallas_cpmac_01.07.01
-+
-+New features: Performance improvement in CPPI layer, affecting both CPSAR and CPMAC.
-+
-+Bug fixes: NTR
-+
-+17 Februrary 2004 CPSAR 1.7.0 (external release)
-+
-+CC Labels: REL_20040217_HALdallas_cpsar_01.07.00
-+
-+New features: Added support for "TxFlush" feature. This allows the upper
-+ layer to flush all or part of a given Tx queue for a given
-+ channel. This is to be used during call setup for a voice
-+ connection.
-+
-+30 January 2004 CPMAC 1.7.0 (external release)
-+
-+CC Labels: REL_20040130_HALdallas_cpmac_01.07.00
-+
-+Bug fixes: CPMDIO - When in manual negotiate mode and linked, dropping link would move into NWAY state rather than manual state.
-+ CPMDIO - Extraneous debug message corrected
-+New features: CPMDIO - Support for AutoMdix usage added.
-+
-+25 September 2003 CPSAR 1.6.6 (external release)
-+
-+CC Labels: REL_20030925_HALdallas_cpsar_01.06.06
-+
-+Bug fixes: PDSP firmware has been updated to fix the OAM padding problem. It previously
-+ wrote pad bytes into a reserved field of the OAM cell. There is a small
-+ change to the CPSAR configuration code which corresponds to the PDSP spec
-+ change.
-+
-+New features: NTR
-+
-+09 September 2003 CPMAC 1.6.6 (external release)
-+
-+CC Labels: REL_20030909_HALdallas_cpmac_01.06.06
-+
-+Bug fixes: CPMAC : When _CPMDIO_NOPHY is set, Cpmac COntrol is set to Full Duplex
-+ Bridge loopback test does not show a problem using 1.6.5 if packet rate is
-+ below 50,000 pbs. Now testing with a 100% send from Ixia.
-+
-+New features: NTR
-+
-+05 August 2003 CPHAL 1.6.5 (external release)
-+
-+CC Labels: REL_20030805_HALdallas_cpmac_01.06.05
-+
-+Bug fixes: NTR
-+
-+New features: CPMAC : Added support for CPMAC modules that do not have a Phy connected.
-+ The CPMAC is informed of this by the MdioConnect option
-+ _CPMDIO_NOPHY. This is the only driver change needed to
-+ receive and transmit packets through the Marvel switch.
-+ Note In this mode Link status will reported linked at 100/FD to
-+ PhyNum 0xFFFFFFFF.
-+
-+ ALL: Cleaned up some Vlynq support logic.
-+
-+16 July 2003 CPSAR 1.6.3 (external release), no CPMAC release
-+
-+CC Labels: REL_20030716_HALdallas_cpsar_01.06.03
-+
-+Bug fixes: 1) Changed default value of CPCS_UU from 0x5aa5 to 0. The old default value caused
-+ problems with Cisco routers.
-+
-+New features: NTR
-+
-+Known issues not addressed in this release: NTR.
-+
-+01 July 2003 CPHAL 1.6.2 (external release)
-+
-+CC Labels: REL_20030701_HALdallas_cpmac_01.06.02
-+ REL_20030701_HALdallas_cpsar_01.06.02
-+
-+Bug fixes: 1) A previous firmware upgrade caused firmware OAM loopback cells to only work on every other
-+ command. This has been fixed in the new firmware version (0.47).
-+ 2) Problem with PTI values changing on transparent mode packets has been resolved.
-+ 3) Previously, successful firmware OAM loopback cells waited 5 seconds before notifying the
-+ OS of success, rather that notifying immediately. This has been resolved in firmware.
-+ 4) PITS #148 (MAC and SAR), #149 (MAC) have been fixed.
-+
-+New features: 1) AAL5 HAL now capable of receiving unknown VCI/VPI cells on a single transparent channel.
-+ See updated HAL document (AAL5 appendix) for implementation details.
-+ 2) AAL5 HAL now allows OS to modify the OAM loopback timeout window. Previously, failed
-+ OAM loopback attempts timed out after a nominal 5 seconds (based on the SAR frequency
-+ provided by the OS). Now, the default is 5 seconds, but the OS may change the
-+ value via halControl() to any integer number of milliseconds. See updated HAL document
-+ (AAL5 appendix) for implementation details.
-+ 3) MAC (cpmdio): added loopback to Istate. Used for debug.
-+
-+Known issues not addressed in this release: NTR.
-+
-+09 June 2003 CPSAR 1.6.1 (external release), CPMAC 1.6.1 (internal release - no functional change)
-+
-+Note: This is the same set of fixes being applied to 1.6.0 that were applied to 1.5.3. The only difference
-+ between 1.6.1 and 1.5.4 is that 1.6.1 has the TurboDSL fix.
-+
-+CC Labels: REL_20030609_HALdallas_cpmac_01.06.01
-+ REL_20030609_HALdallas_cpsar_01.06.01
-+
-+Bug fixes: 1) Bug in OamLoopbackConfig fixed.
-+ 2) New firmware version (.43) to fix Westell issue of dropped downstream packets in
-+ presence of OAM traffic when operating at or near line rate.
-+
-+New features: NTR.
-+
-+09 June 2003 CPSAR 1.5.4 (external release), CPMAC 1.5.4 (internal release - no functional change)
-+
-+Note: This is a branch release from 1.5.3. This does not contain anything from 1.6.0. The CPMAC is
-+only being labeled to keep the release flow consistent.
-+
-+CC Labels: REL_20030609_HALdallas_cpmac_01.05.04
-+ REL_20030609_HALdallas_cpsar_01.05.04
-+
-+Bug fixes: 1) Bug in OamLoopbackConfig fixed.
-+ 2) New firmware version (.43) to fix Westell issue of dropped downstream packets in
-+ presence of OAM traffic when operating at or near line rate.
-+
-+New features: NTR.
-+
-+30 May 2003 CPSAR 1.6.0 (external release), CPMAC 1.6.0 (internal release - no functional change)
-+
-+CC Labels: REL_20030530_HALdallas_cpmac_01.06.00
-+ REL_20030530_HALdallas_cpsar_01.06.00
-+
-+Bug fixes: 1) TurboDSL issue has been fixed with a software workaround in TxInt. This workaround
-+ has been verified under Adam2 ONLY at this point. Testing remains to be done on
-+ Linux and VxWorks.
-+
-+New features: NTR.
-+
-+Known issues not addressed in this release: NTR.
-+
-+30 May 2003 CPSAR 1.5.3 (external release), CPMAC 1.5.3 (internal release - no functional change)
-+
-+CC Labels: REL_20030530_HALdallas_cpmac_01.05.03
-+ REL_20030530_HALdallas_cpsar_01.05.03
-+
-+Bug fixes: NTR.
-+
-+New features: 1) AAL5 Send() has been modified to accept an ATM Header either in the first
-+ fragment by itself, or in the first fragment directly in front of payload data.
-+ The API() does not change.
-+ 2) Documentation updates throughout, reflected in latest version of CPHAL user's
-+ guide.
-+ 3) AAL5 MaxFrags default value is now 46. This is based upon the default AAL5
-+ RxBufSize of 1518 (MaxFrags = (65568/1518) + 2). IF THE OS CHOOSES A SMALLER
-+ RxBufSize, IT MUST INCREASE THE VALUE OF MaxFrags ACCORDINGLY. This is done
-+ via halControl(), prior to Open().
-+
-+Known issues not addressed in this release:
-+ 1) The Linux SAR driver is seeing an issue in which it cannot
-+ reliably send traffic simultaneously on both the high and
-+ low priority queues of a single AAL5 channel. (TurboDSL)
-+
-+23 May 2003 CPHAL 1.5.2 (external release)
-+
-+CC Labels: REL_20030523_HALdallas_cpmac_01.05.02
-+ REL_20030523_HALdallas_cpsar_01.05.02
-+
-+Bug fixes: 1) PITS #138: CPMAC flooding issue resolved.
-+ 2) PITS #142: OS may now set "MaxFrags" via Control(). This controls the
-+ maximum number of fragments expected by the CPHAL. The default value is 2 for
-+ CPMAC and 1028 for AAL5. If the OS chooses a RxBufSize that will cause more
-+ fragments than the defaults, the OS must set "MaxFrags" to a correct value
-+ ((maximum packet length / RxBufSize) + 2).
-+ 3) PITS #143: Fixed.
-+ 4) Firmware OAM bug fixed. (new firmware release in this version)
-+
-+New features: NTR.
-+
-+Known issues not addressed in this release:
-+ 1) The Linux SAR driver is seeing an issue in which it cannot
-+ reliably send traffic simultaneously on both the high and
-+ low priority queues of a single AAL5 channel. (TurboDSL)
-+
-+14 May 2003 CPHAL 1.5.1 (external release)
-+
-+CC Labels: REL_20030514_HALdallas_cpmac_01.05.01
-+ REL_20030514_HALdallas_cpsar_01.05.01
-+
-+Bug fixes: 1) PITS 132 - (CPMAC) Frames < 60 bytes and split into
-+ multi-fragments.
-+ 2) BCIL MR PSP00000353 - (CPMAC) PhyDev not free'd on halClose()
-+ 3) PITS 113 - OsSetup bug in ChannelSetup fixed.
-+ 4) Fixed AAL5 to check return values of InitTcb/InitRcb.
-+ 5) Fixed Shutdown to properly free resources in the case of a Close
-+ mode 1 followed by Shutdown. Previously, buffer and descriptor
-+ resources were left unfreed in this case.
-+
-+New features: 1) AAL5 Send() modified to be capable of accepting ATM header as first four
-+ bytes of first fragment. This allows the OS to "override" the
-+ default ATM header which is constructed from preconfigured channel
-+ parameters.
-+ 2) AAL5 Receive() modified to be capable of passing the received ATM header (4 bytes, no HEC)
-+ in the first fragment (by itself). It also passes up the OS an indication
-+ of what the received packet type was. For Host OAM and transparent mode
-+ packets, the ATM header is passed in this manner, and for other types of packets
-+ (AAL5, NULL AAL) no ATM header is passed currently.
-+
-+Known issues not addressed in this release:
-+ 1) The Linux SAR driver is seeing an issue in which it cannot
-+ reliably send traffic simultaneously on both the high and
-+ low priority queues of a single AAL5 channel.
-+
-+30 April 2003 CPHAL 1.5.0 (external release)
-+
-+CC Labels: REL_20030430_HALdallas_cpmac_01.05.00
-+ REL_20030430_HALdallas_cpsar_01.05.00
-+
-+Bug fixes: 1) Fixed AAL5 bug that rendered the low priority queue
-+ unusable.
-+ 2) Fixed a bug in AAL5's Oam Rate calculations.
-+ 3) Fixed use of "DeviceCPID" key in AAL5's halControl().
-+ 4) Fixed RxReturn logic in HAL. The HAL now can handle
-+ failing MallocRxBuffer calls when multiple fragments
-+ are being used.
-+
-+New features: 1) AAL5 Stats now available on a per queue basis.
-+ 2) AAL5 adds two new keys to halControl() for "Set" actions:
-+ RxVc_OamCh and RxVp_OamCh.
-+ 3) Shutdown() has been modified for both AAL5 and CPMAC to
-+ call Close() if the module is still in the Open state.
-+ 4) CPMAC adds the following access keys to halControl():
-+ hcPhyAccess,hcPhyNum,hcCpmacBase,hcSize,and hcCpmacSize.
-+ 5) CPHAL no longer requests an extra 15 bytes on data buffer
-+ mallocs.
-+
-+Known issues not addressed in this release:
-+ 1) The Linux SAR driver is seeing an issue in which it cannot
-+ reliably send traffic simultaneously on both the high and
-+ low priority queues of a single AAL5 channel.
-+
-+21 April 2003 CPHAL 1.4.1 (external release)
-+
-+CC Labels: REL_20030421_HALdallas_cpmac_01.04.01
-+ REL_20030421_HALdallas_cpsar_01.04.01
-+
-+Bug fixes: 1) Fixed OAM logic in SAR portion of CPHAL.
-+
-+New features: 1) OAM loopback counters exposed through halControl.
-+ 2) Host OAM Send() can now use a single channel to send
-+ OAM cells on unlimited number of VP's/VC's.
-+ 3) CPHAL now requests "SarFreq" through osControl.
-+ 4) CPHAL now calculates all OAM function rates based on
-+ "SarFreq"; function OamRateConfig removed for API.
-+ 5) New OAM function OamLoopbackConfig, used for configuring
-+ loopback functions in firmware OAM mode.
-+
-+Known issues not addressed in this release: Bug fix 1) in release 1.4
-+ (see below) does not work properly for multiple fragments.
-+
-+10 April 2003 CPHAL 1.4 (external release)
-+
-+CC Labels: REL_20030410_HALdallas_cpmac_01.04.00
-+ REL_20030410_HALdallas_cpsar_01.04.00
-+
-+This release is for SAR and MAC.
-+
-+ Bug fixes: 1) Implemented logic in HAL to re-request buffer mallocs
-+ in the case of MallocRxBuffer failing. The HAL now maintains
-+ a NeedsBuffer queue of all RCB's that are without buffers.
-+ On interrupts, or on Send(), the HAL checks to see if any
-+ RCB's are on the queue, and if so, calls MallocRxBuffer
-+ to attempt to get a new buffer and return the RCB to
-+ circulation.
-+ 2) SAR now properly returns all error codes from halOpen and
-+ halChannelSetup.
-+
-+ New features: NTR
-+
-+ Known issues not addressed in this release: NTR
-+
-+08 April 2003 CPHAL 1.3.1 (internal release - SAR only)
-+
-+ CC Labels: REL_20030408_HALdallas_cpsar_01.03.01
-+
-+ This is a SAR only release. The current CPMAC release is still 1.3.
-+
-+ Bug fixes: 1) PDSP State RAM / Scratchpad RAM is now completely cleared after reset.
-+ This resolves a stability issue.
-+
-+ New features: 1) OamMode is now a parameter in halControl(). Both "Set" and "Get"
-+ actions are available. The value may be "0" (Host OAM), or "1"
-+ (Firmware OAM).
-+
-+ Known issues not addressed in this release:
-+ 1) Appropriate action for HAL in the case of MallocRxBuffer failing. We
-+ are investigating whether the HAL should implement a needs buffer
-+ queue.
-+
-+04 April 2003 CPHAL 1.3 (external release)
-+
-+ CC Labels: REL_20030404_HALdallas_cpmac_01.03.00
-+ REL_20030404_HALdallas_cpsar_01.03.00
-+ REL_20030404_HALdallas_cpaal5_01.03.00
-+ REL_20030404_HALdallas_cpaal2_01.03.00
-+
-+ This release requires no changes for the ethernet end driver. The changes necessary
-+ for the sar driver (firmware file name changes) have already been implemented.
-+
-+ Bug fixes: 1) RxReturn now returns an error if MallocRxBuffer fails. On RxReturn error, the driver should
-+ call RxReturn again at a later time (when the malloc may succeed) in order for the CPHAL
-+ to maintain a full complement of Rx buffers. We recommend holding off making this driver
-+ change until we verify that this condition occurs.
-+
-+ New features: 1) Removed benign compiler warnings.
-+ 2) PITS 122: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=122
-+ 3) Cpsar label (above) now is applied to everything
-+ beneath /cpsar.
-+ 4) PITS 14: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=14
-+ Transferred to MR PSP 00000089.
-+ 5) PITS 120: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=120
-+
-+ Known issues not addressed in this release:
-+ 1) PITS 102 (as relating to OamMode configuration):
-+ http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=102
-+ Future release will make OamMode configurable
-+ through halControl(), not on per channel basis.
-+
-+20 March 2003 CPHAL 1.2.1 (internal release)
-+
-+ CC Labels: REL_20030320_HALdallas_cpmac_01.02.01
-+ REL_20030320_HALdallas_cpsar_01.02.01
-+ REL_20030320_HALdallas_cpaal5_01.02.01
-+ REL_20030320_HALdallas_cpaal2_01.02.01
-+
-+ Bug fixes: 1. Fixed modification of buffer pointer following
-+ MallocRxBuffer in cppi.c.
-+ 2. Removed extra firmware files from /cpsar.
-+
-+ New features: NTR.
-+
-+ Known issues not addressed in this release: NTR.
-+
-+07 March 2003 CPHAL 1.2 (external release)
-+
-+ CPMAC/CPSAR feature complete release. SAR added
-+ several features including full OAM support and various
-+ other features and bug fixes to address PITS 99-106, and
-+ 114. CPMAC cleaned up details raised by India PSP
-+ team.
-+
-+29 January 2003 CPHAL RC 3.01a (external release)
-+
-+ Corrects non-static functions to be static in cppi.c.
-+
-+09 Janurary 2003 CPHAL RC 3.01 (external release)
-+
-+ PITS 88: Fixed MDIO re-connection problem (hcpmac.c)
-+ PITS 90: Corrected Rx Buffer Pointer modification (cppi.c)
-+
-+ Corrected error in cpremap.c
-+
-+20 December 2002 CPHAL RC 3 (external release)
-+
-+ Statistics support via halControl(). See Appendix A of guide.
-+ Fixed errors in ChannelTeardown/ChannelSetup CPHAL logic.
-+ Added multicast support as requested.
-+ Several new OS string functions added to OS_FUNCTIONS.
-+ "DebugLevel" configuration parameter changed to "Debug".
-+ "Stats0" changed to "StatsDump" for CPMAC.
-+
-+13 December 2002 CPHAL RC 2.03 (internal release)
-+
-+ Performance improvements.
-+ More debug statements implemented (esp AAL5).
-+ Updated makefile with "make debug" option.
-+ Hbridge performance: [debug library] 15774 tps (53% line rate)
-+ [non-debug library] 13700 tps (46%)
-+
-+10 December 2002 CPHAL Release Candidate 2.02 (internal release)
-+
-+ Much of the configuration code internal to CPMAC and AAL5 has been made common.
-+ [os]Receive API had been modified to remove OsReceiveInfo. This information is now
-+ available as third member of the FRAGLIST structure, on a per buffer basis.
-+ Successfully tested multi-fragment support on CPMAC, using 32 byte buffers.
-+ Code is now Emerald compliant - all buffer descriptors now aligned to cache-line
-+ boundaries.
-+
-+2 December 2002 CPHAL Release Candidate 2.01
-+
-+ Updates to comments in hcpmac.c, cpmdio.c, hcpmac.h
-+ Nested comment in hcpmac.c in RC2 can cause compile errors.
-+
-+25 November 2002 CPHAL Release Candidate 2
-+
-+Project Items not completed for RC2
-+#6 Ship as Library - Once under CC. Moved to RC3
-+#8 Under Clearcase - Moved to RC3
-+#25 Emerald compliant - Moved to RC3
-+#26 Statistics support - Moved to RC3 (some support in RC2)
-+#36 Debug scheme implemented - Moved to RC3 (some support in RC2)
-+
-+8 November 2002 CPHAL Release Candidate 1
-+
-+Notes:
-+
-+Project Items not completed for RC1
-+
-+#8 Under Clearcase - Clearcase server failure this week. Moved to RC2
-+#6 Ship as Library - Once under CC. Moved to RC2
-+#13 Verify Datatypes. Moved to RC2
-+#14 Review APIs. Moved to RC2
-+
-+APIs under review for RC2
-+
-+halIsr()
-+hslRxReturn()
-+halSend()
-+osSendComplete()
-+osReceive()
-+
-+
-+CPMAC Build Instructions
-+
-+Compile the file 'hcpmac.c'.
-+
-+
-+AAL5 Build Instructions
-+
-+The AAL5 build is composed of the source files aal5sar.c and cpsar.c.
-+Refer to the provided makefile for an example of compiling these files
-+into a library.
-+
-+Example CPHAL Code
-+
-+CPMAC:
-+
-+Example CPMAC code is provided in the file hbridge.c.
-+This program is provided simply as an example of using the CPHAL API.
-+It is not intended to be compiled and executed in your environment.
-+
-+AAL5:
-+
-+Example AAL5 code is provided in the file loopback.c. This program
-+is provided simply as an example of using the CPHAL API. It is not
-+intended to be compiled and executed in your environment.
-+
-+
-+Performance Baseline
-+
-+
-+Cpmac
-+
-+RC1: hbridge.bin, running with IXIA cpahl_1.cfg.
-+ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
-+ MIPS core 4Kc.
-+
-+RC2: hbridge.bin, running with IXIA cpahl_1.cfg.
-+ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
-+ MIPS core 4Ke.
-+ CPHAL now includes Emerald support, but this has been disabled by using 'cache -wt' to emulate 4Kc.
-+
-+RC3: hbridge.bin, running with IXIA cpahl_1.cfg.
-+ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
-+ MIPS core 4Ke.
-+ Running as Emerald processor.
-+
-+Release Total Receive Rate Throughput Setting
-+
-+RC1 11300 38%
-+RC2 9524 32%
-+RC3 15190 51%
-diff -urN linux.old/drivers/net/Config.in linux.dev/drivers/net/Config.in
---- linux.old/drivers/net/Config.in 2005-07-10 03:24:49.242590320 +0200
-+++ linux.dev/drivers/net/Config.in 2005-07-10 03:22:40.527158000 +0200
-@@ -25,6 +25,24 @@
- comment 'Ethernet (10 or 100Mbit)'
- bool 'Ethernet (10 or 100Mbit)' CONFIG_NET_ETHERNET
- if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
-+ if [ "$CONFIG_MIPS_TITAN" = "y" -o "$CONFIG_AR7" = "y" ]; then
-+ tristate ' Texas Instruments Avalanche CPMAC support' CONFIG_MIPS_AVALANCHE_CPMAC
-+ fi
-+ if [ "$CONFIG_MIPS_AVALANCHE_CPMAC" != "n" ]; then
-+ if [ "$CONFIG_AR7WRD" = "y" -o "$CONFIG_AR7VWI" = "y" -o "$CONFIG_AR7VW" = "y" ]; then
-+ define_bool CONFIG_MIPS_CPMAC_INIT_BUF_MALLOC y
-+ define_int CONFIG_MIPS_CPMAC_PORTS 1
-+ if [ "$CONFIG_MIPS_AVALANCHE_MARVELL" = "y" ]; then
-+ define_bool CONFIG_AVALANCHE_LOW_CPMAC n
-+ define_bool CONFIG_AVALANCHE_HIGH_CPMAC y
-+ else
-+ define_bool CONFIG_AVALANCHE_CPMAC_AUTO y
-+ define_bool CONFIG_AVALANCHE_LOW_CPMAC n
-+ define_bool CONFIG_AVALANCHE_HIGH_CPMAC n
-+ fi
-+ fi
-+ fi
-+
- if [ "$CONFIG_ARM" = "y" ]; then
- dep_bool ' ARM EBSA110 AM79C961A support' CONFIG_ARM_AM79C961A $CONFIG_ARCH_EBSA110
- tristate ' Cirrus Logic CS8900A support' CONFIG_ARM_CIRRUS
-diff -urN linux.old/drivers/net/Makefile linux.dev/drivers/net/Makefile
---- linux.old/drivers/net/Makefile 2005-07-10 03:24:49.243590168 +0200
-+++ linux.dev/drivers/net/Makefile 2005-07-10 03:22:40.528157000 +0200
-@@ -56,6 +56,16 @@
- subdir-$(CONFIG_BONDING) += bonding
-
- #
-+# Texas Instruments AVALANCHE CPMAC driver
-+#
-+
-+subdir-$(CONFIG_MIPS_AVALANCHE_CPMAC) += avalanche_cpmac
-+#obj-$(CONFIG_MIPS_AVALANCHE_CPMAC) += avalanche_cpmac/avalanche_cpmac.o
-+ifeq ($(CONFIG_MIPS_AVALANCHE_CPMAC),y)
-+ obj-y += avalanche_cpmac/avalanche_cpmac.o
-+endif
-+
-+#
- # link order important here
- #
- obj-$(CONFIG_PLIP) += plip.o
+++ /dev/null
-diff -urN linux.old/drivers/atm/Config.in linux.dev/drivers/atm/Config.in
---- linux.old/drivers/atm/Config.in 2004-08-08 01:26:04.000000000 +0200
-+++ linux.dev/drivers/atm/Config.in 2005-07-10 08:02:01.417115464 +0200
-@@ -99,4 +99,10 @@
- bool 'Use S/UNI PHY driver' CONFIG_ATM_HE_USE_SUNI
- fi
- fi
-+#
-+# Texas Instruments SANGAM ADSL/ATM support
-+#
-+if [ "$CONFIG_AR7" = "y" ]; then
-+ tristate 'Texas Instruments SANGAM ATM/ADSL support' CONFIG_MIPS_SANGAM_ATM
-+fi
- endmenu
-diff -urN linux.old/drivers/atm/Makefile linux.dev/drivers/atm/Makefile
---- linux.old/drivers/atm/Makefile 2005-01-19 15:09:40.000000000 +0100
-+++ linux.dev/drivers/atm/Makefile 2005-07-10 08:02:01.417115464 +0200
-@@ -14,6 +14,32 @@
- obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
- obj-$(CONFIG_ATM_IDT77252) += idt77252.o
-
-+ifeq ($(CONFIG_AR7),y)
-+
-+subdir-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm
-+
-+EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
-+#EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP
-+
-+ifeq ($(ANNEX),B)
-+EXTRA_CFLAGS += -DANNEX_B -DB
-+else
-+ifeq ($(ANNEX),C)
-+EXTRA_CFLAGS += -DANNEX_C -DC
-+else
-+EXTRA_CFLAGS += -DANNEX_A -DP
-+endif
-+endif
-+
-+list-multi := tiatm.o
-+tiatm-objs := sangam_atm/tn7atm.o sangam_atm/tn7dsl.o sangam_atm/tn7sar.o \
-+ sangam_atm/dsl_hal_api.o sangam_atm/dsl_hal_support.o sangam_atm/cpsar.o \
-+ sangam_atm/aal5sar.o
-+
-+obj-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm/tiatm.o
-+
-+endif
-+
- ifeq ($(CONFIG_ATM_NICSTAR_USE_SUNI),y)
- obj-$(CONFIG_ATM_NICSTAR) += suni.o
- endif
-diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.c linux.dev/drivers/atm/sangam_atm/aal5sar.c
---- linux.old/drivers/atm/sangam_atm/aal5sar.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/aal5sar.c 2005-07-10 08:02:01.420115008 +0200
-@@ -0,0 +1,2962 @@
-+
-+/**
-+ *
-+ * aal5sar.c
-+ *
-+ * TNETDxxxx Software Support\n
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * version
-+ * 28Feb02 Greg 1.00 Original Version created.\n
-+ * 06Mar02 Greg 1.01 Documentation (Doxygen-style) enhanced
-+ * 06May02 Greg 1.02 AAL2 added
-+ * 06Jun02 Greg 1.03 Multiple API and bug fixes from emulation
-+ * 12Jul02 Greg 1.04 API Update
-+ */
-+
-+/**
-+@defgroup CPHAL_Functions CPHAL Functions
-+
-+These are the CPHAL Functions.
-+*/
-+
-+/**
-+@page CPHAL_Implementation_Details
-+
-+@section cphal_intro Introduction
-+
-+The CPHAL API described above is generally applicable to all modules. Any
-+implementation differences will be described in the following module-specific
-+appendix sections.
-+
-+Included for your reference is a diagram showing the internal architecture
-+of the CPHAL:
-+
-+@image html SangamSoftware.jpg "HAL Architecture"
-+@image latex SangamSoftware.jpg "HAL Architecture" height=2.8in
-+
-+*/
-+
-+/**
-+@defgroup AAL5_Functions Additional Functions for AAL5 Implementation
-+
-+These functions are used only by the AAL5 module.
-+*/
-+
-+/*
-+@defgroup CPMAC_Functions Additional Functions for CPMAC Implementation
-+
-+No additional functions currently defined.
-+*/
-+
-+/**
-+@page VDMA_Implementation_Details
-+
-+@section vdma_intro Introduction
-+
-+The VDMA-VT module facilitates efficient transfer of data (especially voice)
-+between two devices, as shown in the figure below.
-+
-+@image html vdma.jpg "VDMA System Block Diagram"
-+@image latex vdma.jpg "VDMA System Block Diagram" height=1in
-+
-+The VDMA-VT module supports two modes of operation: mirror mode and credit mode.
-+Mirror mode is intended for systems in which the remote device does not have a
-+VDMA-based module. Credit mode is intended for highest performance when VDMA-based
-+modules exist on both ends of an interface.
-+
-+For more detailed information on the operation of the VDMA module, please
-+reference the VDMA Module Guide.
-+
-+@section vdma_channels VDMA Channels
-+
-+The VDMA-VT module is a single channel, single transmit queue device. Therefore,
-+when using the CHANNEL_INFO structure, the correct value for @c Ch is always 0.
-+Correspondingly, the correct value for the @c Ch parameter in @c ChannelTeardown() is
-+always 0. Further, when calling @c Send(), the driver should always supply the value
-+of 0 for both the @c Ch and @c Queue parameters.
-+
-+For the VDMA-VT, configuring the channel requires the configuration of either 2 FIFO
-+elements (in credit mode) or 4 FIFO elements (in mirror mode). For credit mode, the
-+driver must configure just the local Tx and Rx FIFOs. For mirror mode, the driver must
-+configure the Tx and Rx FIFOs for both the remote and local ends of the interface.
-+
-+This channel configuration is accomplished through multiple calls to @c ChannelSetup().
-+Each call configures a single FIFO, according to the parameters in the CHANNEL_INFO
-+structure. The members of VDMA-VT's CHANNEL_INFO structure are defined below.
-+
-+
-+- int RemFifoAddr; Address of remote FIFO (mirror mode only). Set to 0 for credit mode.
-+- int FifoAddr; Address of the local FIFO. If 0, the CPHAL will allocate the FIFO.
-+- int FifoSize; Size of the FIFO.
-+- int PollInt; Polling interval for the FIFO.
-+- int Endianness; Endianness of the FIFO. If 1, big endian. If 0, little endian.
-+- int RemAddr; Used only in credit mode. This is the base address of the remote
-+ remote VDMA-based device (VDMA-VT or AAL2)
-+- int RemDevID; Used only in credit mode. Identifies the type of remote VDMA-based device.
-+ 0=VDMAVT, 1=AAL2 Ch0, 2=AAL2 Ch1, 3=AAL2 Ch2, 4= AAL2 Ch3.
-+
-+For the VDMA-VT module, the driver must make all calls to @c ChannelSetup() prior to calling
-+@c Open(). This is because several of the channel specific parameters may not be changed
-+while the VDMA-VT module is operational.
-+
-+@section vdma_params VDMA Parameters
-+
-+Defined here are the set of parameters for the VDMA-VT module. Default settings for
-+each parameter should be represented in the device configuration file (options.conf).
-+During @c Init(), the CPHAL will reference the device configuration file and load all
-+default settings. The @c Control() interface gives the driver an opportunity to
-+modify any default settings before the module becomes operational during the @c Open()
-+call.
-+
-+@param NoTxIndication If 1, the CPHAL will not call @c SendComplete(). 0 is default.
-+@param NoRxIndication If 1, the CPHAL will not call @c Receive(). 0 is default.
-+@param RemoteCPU If 1, the CPHAL will not directly manipulate data in FIFO's, leaving
-+ that task for a remote CPU. 0 is default.
-+@param RxIntEn If 1, enables Rx interrupts. 0 is default.
-+@param TxIntEn If 1, enables Tx interrupts. 0 is default.
-+@param Mirror If 1, enables mirror mode. 0 selects credit mode (default).
-+@param RxIntCtl Valid only in mirror mode. If 1, interrupts will occur when the Rx FIFO
-+ RdIndex is updated. If 0, interrupts occur when the Rx FIFO WrIndex
-+ is updated.
-+@param TxIntCtl Valid only in mirror mode. If 1, interrupts will occur when the Rx FIFO
-+ RdIndex is updated. If 0, interrupts occur when the Rx FIFO WrIndex
-+ is updated.
-+@param RBigEn Remote big endian mode. If 1, remote is big endian.
-+@param LBigEn Local big endian mode. If 1, local is big endian.
-+
-+@section vdma_polling Using VDMA-VT without interrupts
-+
-+If your system configuration does not utilize VDMA interrupts, the ability to process the
-+Tx and Rx FIFOs is supported. To process the Tx FIFO, call @c CheckTx(). If the CPHAL is
-+able to process any complete data transmissions, it will call @c SendComplete() as usual.
-+To process the Rx FIFO, call @c CheckRx(). If the CPHAL has received any data, it will
-+call @c Receive() to pass the driver the data. Please reference @ref VDMA_Functions for more
-+information on these interfaces.
-+
-+@section vdma_details VDMA Implementation Details
-+
-+The following functions are not defined for use with VDMA: @c Status(), @c Tick(), @c StatsGet(),
-+and @c StatsClear().
-+
-+*/
-+
-+/**
-+@page AAL5_Implementation_Details
-+
-+@section aal5_ver Version
-+
-+@copydoc AAL5_Version
-+
-+@section aal5_intro Introduction
-+
-+The AAL5 implementation will support 16 channels for transmit and 16 channels for
-+receive. Each of the transmit channels may have up to two transmit queues
-+associated with it. If two queues are used, Queue 0 is the high priority queue,
-+and Queue 1 is the low priority queue.
-+
-+@section aal5_params AAL5 Configuration Parameters
-+
-+AAL5 requires two device entries to be available in the configuration repository, named
-+@p "aal5" and @p "sar". The @p aal5 device entry must contain @p base (base address)
-+and @p int_line (interrupt number). The @p sar device entry must have both @p base
-+(base address) and @p reset_bit (reset bit).
-+
-+@par Device Level Configuration Parameters
-+
-+The following parameters are device-level parameters, which apply across all
-+channels. The value for these parameters may be modified by changing the value in the
-+configuration repository.
-+
-+- "UniNni":
-+AAL5 network setting. 0 = UNI (default), 1 = NNI.
-+
-+@par Channel Configuration Parameters
-+
-+All AAL5 channel parameters may also be configured through the @c ChannelSetup() interface.
-+Following is the list of @p CHANNEL_INFO members that may be modified by the driver when
-+calling @c ChannelSetup(). The driver may provide a value of 0xFFFFFFFF for any channel
-+parameter to select a default value for the parameter. The driver should at a minimum
-+configure @p Vci and @p Vpi. The usage of all parameters beginning with TxVc_,
-+TxVp_, RxVc_, RxVp_ is described in greater detail in the SAR Firmware Spec.
-+These parameters are mainly associated with QoS and OAM functionality.
-+
-+- "RxNumBuffers":
-+The number of Rx buffer descriptors to allocate for Ch.
-+- "RxBufSize":
-+Size (in bytes) for each Rx buffer.
-+- "RxBufferOffset":
-+Number of bytes to offset rx data from start of buffer (must be less than buffer size).
-+- "RxServiceMax":
-+Maximum number of packets to service at one time.
-+- "TxNumBuffers":
-+The number of Tx buffer descriptors to allocate for Ch.
-+- "TxNumQueues":
-+Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue.
-+- "TxServiceMax":
-+Maximum number of packets to service at one time.
-+- "CpcsUU":
-+The 2-byte CPCS UU and CPI information.
-+- "Gfc":
-+Generic Flow Control. Used in ATM header of Tx packets.
-+- "Clp":
-+Cell Loss Priority. Used in ATM header of Tx packets.
-+- "Pti":
-+Payload Type Indication. Used in ATM header of Tx packets.
-+- "DaMask":
-+Specifies whether credit issuance is paused when Tx data not available.
-+- "Priority":
-+Priority bin this channel will be scheduled within.
-+- "PktType":
-+0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2.
-+- "Vci":
-+Virtual Channel Identifier.
-+- "Vpi":
-+Virtual Path Identifier.
-+- "TxVc_AtmHeader":
-+In firmware OAM mode, this
-+is the ATM header to be appended to front of firmware generated VC OAM cells for
-+this channel. Note: To generate host OAM cells, call @c Send() with
-+the appropriate mode.
-+- "TxVc_CellRate":
-+Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR).
-+- "TxVc_QosType":
-+0=CBR,1=VBR,2=UBR,3=UBRmcr.
-+- "TxVc_Mbs":
-+Min Burst Size in cells.
-+- "TxVc_Pcr":
-+Peak Cell Rate for VBR in clock ticks between transmissions.
-+- "TxVc_OamTc":
-+TC Path to transmit OAM cells for TX connections (0,1).
-+- "TxVc_VpOffset":
-+Offset to the OAM VP state table for TX connections. Channels with the same
-+VPI must have the same VpOffset value. Channels with different VPIs
-+must have unique VpOffset values.
-+- "RxVc_OamCh":
-+Channel to which to terminate received OAM cells to be forwarded to the Host
-+for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
-+OAM mode.
-+- "RxVc_OamToHost":
-+Indicates whether to pass received unmatched OAM loopback cells to the host;
-+0=do not pass, 1=pass.
-+- "RxVc_AtmHeader":
-+ATM Header placed on firmware gen'd OAM cells for this channel on a Rx
-+connection (must be big endian with 0 PTI).
-+- "RxVc_OamTc":
-+TC Path to transmit OAM cells for RX connections (0,1).
-+- "RxVc_VpOffset":
-+Offset to the OAM VP state table for RX connections. Channels with the same
-+VPI must have the same VpOffset value. Channels with different VPIs
-+must have unique VpOffset values.
-+- "TxVp_OamTc":
-+TC Path to transmit OAM cells for TX VP connections (0,1).
-+- "TxVp_AtmHeader":
-+ATM Header placed on firmware gen'd VP OAM cells for this channel on a Tx VP
-+connection (must be big endian with 0 VCI).
-+- "RxVp_OamCh":
-+Channel to which to terminate received OAM cells to be forwarded to the Host
-+for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
-+OAM mode.
-+- "RxVp_OamToHost":
-+Indicates whether to pass received unmatched OAM loopback cells to the host;
-+0=do not pass, 1=pass.
-+- "RxVp_AtmHeader":
-+In firmware OAM mode, this
-+is the ATM header to be appended to front of firmware generated VP OAM cells for
-+this channel. Note: To generate host OAM cells, call @c Send() with
-+the appropriate mode.
-+- "RxVp_OamTc":
-+TC Path to transmit OAM cells for RX VP connections (0,1).
-+- "RxVp_OamVcList":
-+This 32-bit field is one-hot encoded to indicate all the VC channels that are
-+associated with this VP channel. A value of 21 will indicate that VC
-+channels 0, 2, and 4 are associated with this VP channel.
-+- "FwdUnkVc":
-+Indicates whether or not to forward unknown VCI/VPI cells to the host. This
-+parameter only takes effect if the channel's PktType is Transparent(3).
-+1=forwarding enabled, 0=forwarding disabled.
-+
-+@section aal5_details API Implementation Details
-+
-+ATTENTION: Documentation given here supplements the documentation given in the general
-+CPHAL API section. The following details are crucial to correct usage of the
-+AAL5 CPHAL.
-+
-+@par Receive()
-+The least significant byte of @p Mode contains the channel number. Bit 31
-+indicates whether or not the ATM header is present in the first fragment of
-+the packet. If bit 31 is set, the 4 byte ATM header (minus HEC) will be provided
-+in the first fragment, with the payload beginning in the second fragment. Currently,
-+this is the default behavior for host OAM and transparent mode packets.
-+Bits 17-16 indicate the packet type that is being received.
-+Mode Parameter Breakdown: <BR>
-+- 31 ATM Header In First Fragment (1=true, 0=false) <BR>
-+- 30-18 Unused. <BR>
-+- 17-16 Pkt Type. <BR>
-+ - 0=AAL5 <BR>
-+ - 1=PTI Based Null AAL <BR>
-+ - 2=OAM <BR>
-+ - 3=Transparent <BR>
-+- 15-08 Unused. <BR>
-+- 07-00 Channel Number.
-+
-+@par Send()
-+The most significant 16 bits of the first fragment 'len' is used as the Offset
-+to be added to the packet. @c Send() will reserve this many bytes at the
-+beginning of the transmit buffer prior to the first byte of valid data.
-+For the @p Mode parameter, Bit 31 must be set if the user has sent a packet with
-+the ATM Header (minus HEC) embedded in the first 4 bytes of the first fragment data buffer.
-+The OS has the option of using a 4 byte first fragment containing only ATM header,
-+or concatenating the ATM Header in front of the data payload.
-+If Bit 31 is set, the ATM Header in the buffer is preserved and sent with
-+each cell of the packet. Otherwise, Send() will build the ATM header based on the
-+values of the Pti, Gfc, Clp, Vpi, and Vci parameters for the given channel.
-+Bits 17-16 are defined as the packet type. Bits 15-08 may be used to specify the
-+transmit queue to send the packet on. Only values 0 (high priority) and 1 (low
-+priority) are accepted. Bits 07-00 should be used to indicate the channel number
-+for the @c Send() operation. Valid channel numbers are 0-15.
-+Mode Parameter Breakdown: <BR>
-+- 31 ATM Header In Packet (1=true, 0=false) <BR>
-+- 30-18 Unused. <BR>
-+- 17-16 Pkt Type. <BR>
-+ - 0=AAL5 <BR>
-+ - 1=PTI Based Null AAL <BR>
-+ - 2=OAM <BR>
-+ - 3=Transparent <BR>
-+- 15-08 Transmit Queue. <BR>
-+- 07-00 Channel Number.
-+
-+@par ChannelSetup()
-+The AAL5 @c ChannelSetup() always configures both the Tx and Rx side of the channel
-+connection in the same call.
-+
-+@par ChannelTeardown()
-+Regardless of the channel teardown direction selected, the AAL5 CPHAL will always
-+teardown both the Tx and Rx side of the channel connection.
-+
-+@par TeardownComplete()
-+The value for the @p Direction parameter should be ignored for the AAL5 implementation,
-+since both directions (Tx and Rx) are always torndown in response to a @c ChannelTeardown()
-+command.
-+
-+@par Control() (HAL version)
-+Defined keys and actions. Unless otherwise stated, the data type
-+for Value is pointer to unsigned integer. The list is broken into
-+three groups, one group which can be used anytime, one group that should
-+be used before halOpen(), and one group which can only be used after
-+halOpen() (but before halClose()). For channelized parameters, replace
-+'Ch' with the integer number of a channel (ex. "Gfc.4" can be used to set
-+Gfc for channel 4).
-+
-+MAY USE ANYTIME AFTER INIT (after halInit() is called):
-+
-+- "Gfc.Ch". The OS may "Set" this value. Changing this value causes
-+the Gfc in each Tx ATM header for this channel to take on the new Gfc value.
-+
-+- "Clp.Ch". The OS may "Set" this value. Changing this value causes
-+the Clp in each Tx ATM header for this channel to take on the new Clp value.
-+
-+- "Pti.Ch". The OS may "Set" this value. Changing this value causes
-+the Pti in each Tx ATM header for this channel to take on the new Pti value.
-+
-+- "CpcsUU.Ch". The OS may "Set" this value. Changing this value causes
-+the CpcsUU in each Tx ATM header for this channel to take on the new CpcsUU value.
-+
-+- "OamMode". Specifies if host or firmware is performing OAM functions; 0 = Host OAM,
-+1 = Firmware OAM. When set, all SAR channels will be configured for
-+the selection, including AAL2 channels.
-+
-+- "OamLbTimeout". Specifies the firmware OAM loopback timeout, in milliseconds.
-+
-+- "DeviceCPID". The OS may "Set" this value. This is the OAM connection
-+point identifier. The OS should provide a pointer to an array of 4 32-bit
-+integers. Each word must be configured in big endian format.
-+
-+- "FwdUnkVc.Ch". Indicates whether or not to forward unknown VCI/VPI cells to the host.
-+This parameter only takes effect if the channel's PktType is Transparent(3).
-+1=forwarding enabled, 0=forwarding disabled.
-+
-+MAY USE ONLY BEFORE HAL IS OPEN (before halOpen() call):
-+- "StrictPriority". The OS may "Set" this value. Setting to 1 causes
-+a different interrupt processing routine to be used, which gives strict
-+priority to channels with lower numbers (channel 0 has highest priority).
-+The default handler gives equal priority to all channels.
-+
-+- "MaxFrags". The OS may "Set" or "Get" this value. This defines the maximum
-+number of fragments that can be received by the AAL5 Rx port. The default
-+value for AAL5 is 46. This provides enough space to receive a maximum
-+length AAL5 packet (65,568 bytes) with the default buffer size of 1518 bytes, and
-+any amount of RxBufferOffset. If the buffer size is configured to be smaller,
-+the OS *MUST* modify this parameter according to the following formula:
-+((System Max AAL5 packet length)/(RxBufSize)) + 2. (The extra two fragments in
-+the formula allow for RxBufferOffset and one fragment for the ATM Header, used
-+when receiving host OAM or transparent mode packets)
-+
-+MAY USE ONLY AFTER HAL IS 'OPEN' (after halOpen() call):
-+- "Stats;Level;Ch;Queue". The OS may "Get" Stats groups with this key, where
-+'Level' is an integer from 0-4, Ch is an integer from 0-15, and Queue is
-+an integer from 0-1. Note that Ch is not required for Level 4 stats, and Queue
-+is not required for Level 0, 3, and 4. The statistics functionality and return
-+value is described in the appendix entitled "Configuration and Control".
-+
-+- "TxVc_CellRate.Ch". The OS may "Set" this value. Can be used to modify
-+CellRate for a channel on the fly.
-+
-+- "TxVc_Mbs.Ch". The OS may "Set" this value. Can be used to modify
-+Mbs for a channel on the fly.
-+
-+- "TxVc_Pcr.Ch". The OS may "Set" this value. Can be used to modify
-+Pcr for a channel on the fly.
-+
-+- "PdspEnable". The OS may "Set" this value. Value 0 disables the PDSP.
-+Value 1 enables to PDSP.
-+
-+- "DeviceCPID". The OS may "Set" this value. The Value should be an array
-+of 4 32-bit integers that comprise the CPID.
-+
-+- "RxVc_RDICount.Ch". The OS may "Get" or "Set" this value. Get returns
-+the current RDI count for the VC channel. Set clears the counter, and the Value
-+is ignored.
-+
-+- "RxVp_RDICount.Ch". The OS may "Get" or "Set" this value. Get returns
-+the current RDI count for the VP channel. Set clears the counter, and the Value
-+is ignored.
-+
-+- "RxVc_AISseg.Ch". The OS may "Get" this value. This is an indication of
-+AIS segment error for the VC channel.
-+
-+- "RxVp_AISseg.Ch". The OS may "Get" this value. This is an indication of
-+AIS segment error for the VP channel.
-+
-+- "RxVc_AISetoe.Ch". The OS may "Get" this value. This is an indication of
-+AIS end-to-end error for the VC channel.
-+
-+- "RxVp_AISetoe.Ch". The OS may "Get" this value. This is an indication of
-+AIS end-to-end error for the VP channel.
-+
-+- "RxVc_OamCh.Ch". The OS may "Set" this value. Channel to which to terminate
-+received OAM cells to be forwarded to the Host for either Host OAM mode, or when
-+RxVc_OamToHost is enabled during Firmware OAM mode.
-+
-+- "RxVp_OamCh.Ch". The OS may "Set" this value. Channel to which to terminate
-+received OAM cells to be forwarded to the Host for either Host OAM mode, or when
-+RxVp_OamToHost is enabled during Firmware OAM mode.
-+
-+- "F4_LB_Counter". The OS may "Get" this value. This is a count of the number
-+ of near-end F4 loopbacks performed by the PDSP in firmware OAM mode.
-+
-+- "F5_LB_Counter". The OS may "Get" this value. This is a count of the number
-+ of near-end F5 loopbacks performed by the PDSP in firmware OAM mode.
-+
-+- "TxVc_AtmHeader.Ch". The OS may "Set" this value. In firmware OAM mode, this
-+is the ATM header to be appended to front of firmware generated VC OAM cells for
-+this channel. In host OAM mode, this is used as the ATM header to be appended
-+to front of host generated VC OAM cells for this channel. It must be configured
-+as big endian with PTI=0. Note: To generate host OAM cells, call @c Send() with
-+the appropriate mode.
-+
-+- "TxVp_AtmHeader.Ch". The OS may "Set" this value. In firmware OAM mode, this
-+is the ATM header to be appended to front of firmware generated VP OAM cells for
-+this channel. In host OAM mode, this is used as the ATM header to be appended
-+to front of host generated VP OAM cells for this channel. It must be configured
-+as big endian with VCI=0. Note: To generate host OAM cells, call @c Send() with
-+the appropriate mode.
-+
-+- "PdspEnable". The OS may "Set" this value. Controls whether or not the PDSP is
-+allowed to fetch new instructions. The PDSP is enabled by the CPHAL during Open(),
-+and disabled during Close(). 0 = disabled, 1 = enabled.
-+
-+@par Control() (OS version)
-+Defined keys and actions:
-+
-+- "Firmware". The CPHAL will perform a "Get" action for the key "Firmware". A pointer
-+to a pointer is passed in @p Value. The OS must modify the referenced pointer to point
-+to the firmware.
-+
-+- "FirmwareSize". The CPHAL will perform a "Get" action for the key "FirmwareSize".
-+The OS must place the firmware size in the memory pointed at by @p Value.
-+
-+- "OamLbResult". When a channel that is in firmware OAM mode is commanded to perform
-+a loopback function, the result of the loopback generates an interrupt that is handled
-+by the OS like any other interrupt. The CPHAL, upon servicing the interrupt, will call
-+osControl with this key, and an action of "Set". The @p Value parameter will be a
-+pointer to the integer result. 1 = pass, 0 = fail.
-+
-+- "SarFreq". The CPHAL will perform a "Get" action for this key. The OS should place
-+the SAR frequency (in Hz) in the memory pointed at by @p Value.
-+
-+@section aal5_stats AAL5 Specific Statistics
-+
-+Statistics level '0' contains all AAL5 specific statistics. The following values will
-+be obtained when requesting stats level 0:
-+
-+- "Crc Errors". Number of CRC errors reported by SAR hardware. Incremented for received
-+packets that contain CRC errors.
-+
-+- "Len Errors". Number of length errors reported by SAR hardware. Incremented for received
-+packets that are in excess of 1366 cells.
-+
-+- "Abort Errors". Number of abort errors reported by SAR hardware.
-+
-+- "Starv Errors". Number of buffer starvation errors reported by SAR hardware. Incremented
-+when a part or all of a buffer cannot be received due to lack of RX buffer resources. The SAR
-+drops all cells associated with the packet for each buffer starvation error that occurs.
-+
-+*/
-+
-+/* register files */
-+#include "cp_sar_reg.h"
-+
-+#define _CPHAL_AAL5
-+#define _CPHAL
-+#define _CPPI_TEST /** @todo remove for release */
-+#define __CPHAL_CPPI_OFFSET /* support use of offset */
-+
-+/* OS Data Structure definitions */
-+
-+typedef void OS_PRIVATE;
-+typedef void OS_DEVICE;
-+typedef void OS_SENDINFO;
-+typedef void OS_RECEIVEINFO;
-+typedef void OS_SETUP;
-+
-+/* CPHAL Data Structure definitions */
-+
-+typedef struct hal_device HAL_DEVICE;
-+typedef struct hal_private HAL_PRIVATE;
-+typedef struct hal_private HAL_RECEIVEINFO;
-+
-+/* include CPHAL header files here */
-+#include "cpcommon_cpaal5.h"
-+#include "cpswhal_cpaal5.h"
-+#include "aal5sar.h"
-+#include "cpcommon_cpaal5.c"
-+
-+#define CR_SERVICE (170-1)
-+#define UTOPIA_PAUSE_REG (*(volatile bit32u *)0xa4000000)
-+
-+/*
-+these masks are for the mode parameter used in halSend/OsReceive
-+(may move these elsewhere)
-+*/
-+#define CH_MASK 0xff
-+#define PRI_MASK 0x10000
-+
-+/* Rcb/Tcb Constants */
-+#define CB_SOF_BIT (1<<31)
-+#define CB_EOF_BIT (1<<30)
-+#define CB_SOF_AND_EOF_BIT (CB_SOF_BIT|CB_EOF_BIT)
-+#define CB_OWNERSHIP_BIT (1<<29)
-+#define CB_EOQ_BIT (1<<28)
-+#define CB_SIZE_MASK 0x0000ffff
-+#define CB_OFFSET_MASK 0xffff0000
-+#define RCB_ERRORS_MASK 0x03fe0000
-+#define RX_ERROR_MASK 0x000f0000
-+#define CRC_ERROR_MASK 0x00010000
-+#define LENGTH_ERROR_MASK 0x00020000
-+#define ABORT_ERROR_MASK 0x00040000
-+#define STARV_ERROR_MASK 0x00080000
-+#define TEARDOWN_VAL 0xfffffffc
-+
-+/* interrupt vector masks */
-+#define TXH_PEND 0x01000000
-+#define TXL_PEND 0x02000000
-+#define RX_PEND 0x04000000
-+#define STS_PEND 0x08000000
-+#define AAL2_PEND 0x10000000
-+#define INT_PENDING (TXH_PEND | TXL_PEND | RX_PEND | STS_PEND | AAL2_PEND)
-+#define STS_PEND_INVEC 0x0001F000
-+#define RX_PEND_INVEC 0x00000F00
-+#define TXL_PEND_INVEC 0x000000F0
-+#define TXH_PEND_INVEC 0x0000000F
-+#define AIS_SEG_MASK 0x1 /* +01.02.00 */
-+#define AIS_SEG_SHIFT 0 /* +01.02.00 */
-+#define AIS_ETOE_MASK 0x20000 /* +01.02.00 */
-+#define AIS_ETOE_SHIFT 17 /* +01.02.00 */
-+#define RDI_CNT_MASK 0xffff0000 /* +01.02.00 */
-+#define RDI_CNT_SHIFT 16 /* +01.02.00 */
-+
-+/*
-+ * This function takes a vpi/vci pair and computes the 4 byte atm header
-+ * (minus the HEC).
-+ *
-+ * @param vpi Virtual Path Identifier.
-+ * @param vci Virtual Channel Identifier.
-+ *
-+ * @return A properly formatted ATM header, without the HEC.
-+ */
-+static int atmheader(int gfc, int vpi, int vci, int pti, int clp)
-+ {
-+ int itmp;
-+
-+ itmp=0;
-+
-+ /* UNI Mode uses the GFC field */
-+ itmp |= ((gfc & 0xF) << 28);
-+ itmp |= ((vpi & 0xFF) << 20);
-+
-+ /* if NNI Mode, no gfc and larger VPI */
-+ /*itmp |= ((vpi & 0xFFF) << 20);*/
-+
-+ itmp|=((vci & 0xFFFF) << 4);
-+ itmp|=((pti & 0x7) << 1);
-+ itmp|=(clp & 0x1);
-+ return(itmp);
-+ }
-+
-+#include "cppi_cpaal5.c"
-+
-+/*
-+ * Re-entrancy Issues
-+ * In order to ensure successful re-entrancy certain sections of the
-+ * CPHAL code will be bracketed as Critical.
-+ * The OS will provide the function Os.CriticalSection(BOOL), which
-+ * will be passed a TRUE to enter the Critical Section and FALSE to exit.
-+ */
-+
-+/*
-+ * @ingroup CPHAL_Functions
-+ * Clears the statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0 OK, Non-zero not OK
-+ */
-+static int StatsClear(HAL_DEVICE *HalDev)
-+ {
-+ int i;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]StatsClear(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* clear stats */
-+ for (i=0; i<NUM_AAL5_CHAN; i++)
-+ {
-+ HalDev->Stats.CrcErrors[i]=0;
-+ HalDev->Stats.LenErrors[i]=0;
-+ HalDev->Stats.DmaLenErrors[i]=0;
-+ HalDev->Stats.AbortErrors[i]=0;
-+ HalDev->Stats.StarvErrors[i]=0;
-+ HalDev->Stats.TxMisQCnt[i][0]=0;
-+ HalDev->Stats.TxMisQCnt[i][1]=0;
-+ HalDev->Stats.RxMisQCnt[i]=0;
-+ HalDev->Stats.RxEOQCnt[i]=0;
-+ HalDev->Stats.TxEOQCnt[i][0]=0;
-+ HalDev->Stats.TxEOQCnt[i][1]=0;
-+ HalDev->Stats.RxPacketsServiced[i]=0;
-+ HalDev->Stats.TxPacketsServiced[i][0]=0;
-+ HalDev->Stats.TxPacketsServiced[i][1]=0;
-+ HalDev->Stats.TxMaxServiced[i][0]=0;
-+ HalDev->Stats.TxMaxServiced[i][1]=0;
-+ }
-+ HalDev->Stats.RxTotal=0;
-+ HalDev->Stats.TxTotal=0;
-+ HalDev->Stats.RxMaxServiced=0;
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * Returns statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0
-+ */
-+/*
-+static STAT_INFO* StatsGet(HAL_DEVICE *HalDev)
-+ {
-+ STAT_INFO* MyStats = &HalDev->Stats;
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]StatsGet(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ dbgPrintf("HAL Stats:\n");
-+ DispStat(HalDev, "Rx Total",MyStats->RxTotal);
-+ DispStat(HalDev, "Tx Total",MyStats->TxTotal);
-+ DispStat(HalDev, "Rx Peak",MyStats->RxMaxServiced);
-+ DispStat(HalDev, "TxH Peak",MyStats->TxMaxServiced[0][0]);
-+ DispStat(HalDev, "TxL Peak",MyStats->TxMaxServiced[0][1]);
-+ DispChStat(HalDev, "CrcErr",&MyStats->CrcErrors[0],1);
-+ DispChStat(HalDev, "LenErr",&MyStats->LenErrors[0],1);
-+ DispChStat(HalDev, "DmaLenErr",&MyStats->DmaLenErrors[0],1);
-+ DispChStat(HalDev, "AbortErr",&MyStats->AbortErrors[0],1);
-+ DispChStat(HalDev, "StarvErr",&MyStats->StarvErrors[0],1);
-+ DispChStat(HalDev, "TxH MisQ Cnt",&MyStats->TxMisQCnt[0][0],2);
-+ DispChStat(HalDev, "TxL MisQ Cnt",&MyStats->TxMisQCnt[0][1],2);
-+ DispChStat(HalDev, "Rx MisQ Cnt",&MyStats->RxMisQCnt[0],1);
-+ DispChStat(HalDev, "Rx EOQ Cnt",&MyStats->RxEOQCnt[0],1);
-+ DispChStat(HalDev, "TxH EOQ Cnt",&MyStats->TxEOQCnt[0][0],2);
-+ DispChStat(HalDev, "TxL EOQ Cnt",&MyStats->TxEOQCnt[0][1],2);
-+ DispChStat(HalDev, "Rx Pkts",&MyStats->RxPacketsServiced[0],1);
-+ DispChStat(HalDev, "TxH Pkts",&MyStats->TxPacketsServiced[0][0],2);
-+ DispChStat(HalDev, "TxL Pkts",&MyStats->TxPacketsServiced[0][1],2);
-+
-+ return (&HalDev->Stats);
-+ }
-+*/
-+
-+#ifdef __CPHAL_DEBUG
-+void dbgChannelConfigDump(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ CHANNEL_INFO *HalCh = &HalDev->ChData[Ch];
-+ dbgPrintf(" [aal5 Inst %d, Ch %d] Config Dump:\n", HalDev->Inst, Ch);
-+ dbgPrintf(" TxNumBuffers :%08d, TxNumQueues :%08d\n",
-+ HalCh->TxNumBuffers, HalCh->TxNumQueues);
-+ dbgPrintf(" RxNumBuffers :%08d, RxBufSize :%08d\n",
-+ HalCh->RxNumBuffers, HalCh->RxBufSize);
-+ dbgPrintf(" TxServiceMax :%08d, RxServiceMax:%08d\n",
-+ HalCh->TxServiceMax, HalCh->RxServiceMax);
-+ dbgPrintf(" RxBufferOffset:%08d, DaMask :%08d\n",
-+ HalCh->RxBufferOffset, HalCh->DaMask);
-+ dbgPrintf(" CpcsUU :%08d, Gfc :%08d\n",
-+ HalCh->CpcsUU, HalCh->Gfc);
-+ dbgPrintf(" Clp :%08d, Pti :%08d\n",
-+ HalCh->Clp, HalCh->Pti);
-+ dbgPrintf(" Priority :%08d, PktType :%08d\n",
-+ HalCh->Priority, HalCh->PktType);
-+ dbgPrintf(" Vci :%08d, Vpi :%08d\n",
-+ HalCh->Vci, HalCh->Vpi);
-+ dbgPrintf(" TxVc_CellRate :%08d, TxVc_QosType:%08d\n",
-+ HalCh->TxVc_CellRate, HalCh->TxVc_QosType);
-+ dbgPrintf(" TxVc_Mbs :%08d, TxVc_Pcr :%08d\n",
-+ HalCh->TxVc_Mbs, HalCh->TxVc_Pcr);
-+ dbgPrintf(" TxVc_AtmHeader:%08d\n",
-+ HalCh->TxVc_AtmHeader);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+/*
-+ * Retrieves channel parameters from configuration file. Any parameters
-+ * which are not found are ignored, and the HAL default value will apply,
-+ * unless a new value is given through the channel structure in the call
-+ * to ChannelSetup.
-+ */
-+static int ChannelConfigGet(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ unsigned int Ret, Value, Ch = HalChn->Channel;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ void *ChInfo;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ChannelConfigGet(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalChn);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ Ret=OsFunc->DeviceFindParmValue(HalDev->DeviceInfo, channel_names[Ch], &ChInfo);
-+ if (Ret) return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_INFO_NOT_FOUND);
-+
-+ /* i don't care if a value is not found because they are optional */
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumBuffers", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxNumBuffers = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumQueues", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxNumQueues = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxServiceMax", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxServiceMax = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxNumBuffers", &Value);
-+ if (!Ret) HalDev->ChData[Ch].RxNumBuffers = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufferOffset", &Value);
-+ if (!Ret) HalDev->ChData[Ch].RxBufferOffset = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufSize", &Value);
-+ if (!Ret) HalDev->ChData[Ch].RxBufSize = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxServiceMax", &Value);
-+ if (!Ret) HalDev->ChData[Ch].RxServiceMax = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "CpcsUU", &Value);
-+ if (!Ret) HalDev->ChData[Ch].CpcsUU = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Gfc", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Gfc = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Clp", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Clp = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Pti", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Pti = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "DaMask", &Value);
-+ if (!Ret) HalDev->ChData[Ch].DaMask = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Priority", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Priority = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "PktType", &Value);
-+ if (!Ret) HalDev->ChData[Ch].PktType = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vci", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Vci = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vpi", &Value);
-+ if (!Ret) HalDev->ChData[Ch].Vpi = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_CellRate", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxVc_CellRate = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_QosType", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxVc_QosType = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Mbs", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxVc_Mbs = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Pcr", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxVc_Pcr = Value;
-+
-+ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_AtmHeader", &Value);
-+ if (!Ret) HalDev->ChData[Ch].TxVc_AtmHeader = Value;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * Sets up channel parameters in the hardware, and initializes the CPPI
-+ * TX and RX buffer descriptors and buffers.
-+ */
-+static int ChannelConfigApply(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int j, Ch = HalChn->Channel;
-+ volatile bit32u *pTmp;
-+ int Ret; /* +GSG 030410 */
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ChannelConfigApply(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalChn);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
-+ }
-+
-+ HalDev->InRxInt[Ch]=FALSE;
-+
-+ /* Initialize Queue Data */
-+ HalDev->RxActQueueHead[Ch]=0;
-+ HalDev->RxActQueueCount[Ch]=0;
-+ HalDev->TxActQueueHead[Ch][0]=0;
-+ HalDev->TxActQueueHead[Ch][1]=0;
-+ HalDev->TxActQueueCount[Ch][0]=0;
-+ HalDev->TxActQueueCount[Ch][1]=0;
-+ HalDev->RxActive[Ch] = FALSE;
-+ HalDev->TxActive[Ch][0] = FALSE;
-+ HalDev->TxActive[Ch][1] = FALSE;
-+
-+ /* Clear Rx State RAM */
-+ pTmp = pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
-+ for (j=0; j<NUM_RX_STATE_WORDS; j++)
-+ *pTmp++ = 0;
-+
-+ /* Check that Rx DMA State RAM was cleared */
-+ pTmp -= NUM_RX_STATE_WORDS;
-+ for (j=0; j<NUM_RX_STATE_WORDS; j++)
-+ {
-+ if (*pTmp++ != 0)
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
-+ }
-+ }
-+
-+ /* Clear Tx State RAM */
-+ pTmp = pTX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
-+ for (j=0; j<NUM_TX_STATE_WORDS; j++)
-+ *pTmp++ = 0;
-+
-+ /* Check that Tx DMA State RAM was cleared */
-+ pTmp -= NUM_TX_STATE_WORDS;
-+ for (j=0; j<NUM_TX_STATE_WORDS; j++)
-+ {
-+ if (*pTmp++ != 0)
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
-+ }
-+ }
-+
-+ /* Initialize Tx State RAM (Nothing to do) */
-+
-+ /* Initialize Rx State RAM */
-+ /* Configure the Rx buffer offset */
-+ pTmp=(pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
-+ *pTmp |= (HalDev->ChData[Ch].RxBufferOffset & 0xFF);
-+
-+ /* Initialize buffer memory for the channel */
-+ Ret = InitTcb(HalDev, Ch);
-+ if (Ret) return (Ret);
-+
-+ Ret = InitRcb(HalDev, Ch);
-+ if (Ret) return (Ret);
-+
-+ /* setup interrupt mask/enable for the channel */
-+ SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch);
-+
-+ /* if using the low priority queue, set up mask for it */
-+ if (HalDev->ChData[Ch].TxNumQueues == 2) /* +GSG 030421 */
-+ SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch)<<16; /* +GSG 030421 */
-+
-+ SAR_RX_MASK_SET(HalDev->dev_base) = (1<<Ch);
-+
-+ /* call SAR layer to complete the channel setup - hardware configuration of ch */
-+ Ret = HalDev->SarFunc->ChannelSetup(HalDev->SarDev, &HalDev->ChData[Ch]); /* ~GSG 030410 */
-+ if (Ret) /* +GSG 030410 */
-+ return (Ret); /* +GSG 030410 */
-+
-+ /* channel officially open for business */
-+ HalDev->ChIsOpen[Ch][DIRECTION_TX] = TRUE;
-+ HalDev->ChIsOpen[Ch][DIRECTION_RX] = TRUE;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * Sets up HAL default channel configuration parameter values.
-+ */
-+static void ChannelConfigInit(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ChannelConfigInit(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalChn);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ HalDev->ChData[Ch].Channel = Ch;
-+ HalDev->ChData[Ch].TxNumBuffers = cfg_tx_num_bufs[Ch];
-+ HalDev->ChData[Ch].RxNumBuffers = cfg_rx_num_bufs[Ch];
-+ HalDev->ChData[Ch].RxBufSize = cfg_rx_buf_size[Ch];
-+ HalDev->ChData[Ch].RxBufferOffset = cfg_rx_buf_offset[Ch];
-+ HalDev->ChData[Ch].TxNumQueues = cfg_tx_num_queues[Ch];
-+ HalDev->ChData[Ch].CpcsUU = cfg_cpcs_uu[Ch];
-+ HalDev->ChData[Ch].DaMask = cfg_da_mask[Ch];
-+ HalDev->ChData[Ch].Priority = cfg_priority[Ch];
-+ HalDev->ChData[Ch].PktType = cfg_pkt_type[Ch];
-+ HalDev->ChData[Ch].Vci = cfg_vci[Ch];
-+ HalDev->ChData[Ch].Vpi = cfg_vpi[Ch];
-+ HalDev->ChData[Ch].TxVc_CellRate = cfg_cell_rate[Ch];
-+ HalDev->ChData[Ch].TxVc_QosType = cfg_qos_type[Ch];
-+ HalDev->ChData[Ch].TxVc_Mbs = cfg_mbs[Ch];
-+ HalDev->ChData[Ch].TxVc_Pcr = cfg_pcr[Ch];
-+ HalDev->ChData[Ch].Gfc = cfg_gfc[Ch];
-+ HalDev->ChData[Ch].Clp = cfg_clp[Ch];
-+ HalDev->ChData[Ch].Pti = cfg_pti[Ch];
-+ HalDev->ChData[Ch].RxServiceMax = cfg_rx_max_service[Ch];
-+ HalDev->ChData[Ch].TxServiceMax = cfg_tx_max_service[Ch];
-+ }
-+
-+/*
-+ * Update per channel data in the HalDev based channel structure.
-+ * If a certain channel parameter has been passed with the HAL_DEFAULT
-+ * value (0xFFFFFFFF), then do not copy it.
-+ */
-+static void ChannelConfigUpdate(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
-+ {
-+ int Ch = HalChn->Channel;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ChannelConfigUpdate(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalChn);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ HalDev->ChData[Ch].Channel = Ch;
-+
-+ /* ChannelUpdate is a macro defined in cpcommon.h. It requires
-+ the presence of the variables named 'Ch' and 'HalChn'.*/
-+ ChannelUpdate(DaMask);
-+ ChannelUpdate(Priority);
-+ ChannelUpdate(PktType);
-+ ChannelUpdate(Vci);
-+ ChannelUpdate(Vpi);
-+ ChannelUpdate(CpcsUU);
-+ ChannelUpdate(Gfc);
-+ ChannelUpdate(Clp);
-+ ChannelUpdate(Pti);
-+ /* AAL5 Stuff */
-+ ChannelUpdate(TxNumBuffers);
-+ ChannelUpdate(RxNumBuffers);
-+ ChannelUpdate(RxBufSize);
-+ ChannelUpdate(RxBufferOffset);
-+ ChannelUpdate(TxNumQueues);
-+ ChannelUpdate(TxServiceMax);
-+ ChannelUpdate(RxServiceMax);
-+ /* PDSP STATE RAM */
-+ ChannelUpdate(TxVc_CellRate);
-+ ChannelUpdate(TxVc_QosType);
-+ ChannelUpdate(TxVc_Mbs);
-+ ChannelUpdate(TxVc_Pcr);
-+ /* OAM */
-+ ChannelUpdate(TxVc_AtmHeader);
-+ ChannelUpdate(TxVc_OamTc);
-+ ChannelUpdate(TxVc_VpOffset);
-+ ChannelUpdate(RxVc_OamCh);
-+ ChannelUpdate(RxVc_OamToHost);
-+ ChannelUpdate(RxVc_AtmHeader);
-+ ChannelUpdate(RxVc_VpOffset);
-+ ChannelUpdate(RxVc_OamTc);
-+ ChannelUpdate(TxVp_AtmHeader);
-+ ChannelUpdate(TxVp_OamTc);
-+ ChannelUpdate(RxVp_AtmHeader);
-+ ChannelUpdate(RxVp_OamCh);
-+ ChannelUpdate(RxVp_OamTc);
-+ ChannelUpdate(RxVp_OamToHost);
-+ ChannelUpdate(RxVp_OamVcList);
-+ ChannelUpdate(FwdUnkVc);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function opens the specified channel. The caller must populate
-+ * the @p HalCh structure. CPHAL default values may be requested for any or all
-+ * members of the @p HalCh structure by supplying a value of 0xFFFFFFFF for the
-+ * given member. The @p OsSetup parameter is a pointer to an OS defined
-+ * data structure. If the CPHAL later calls @c MallocRxBuffer(), this pointer
-+ * is returned in that call.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param HalCh Per channel information structure. Implementation specific.
-+ * @param OsSetup Pointer to an OS-defined data structure.
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_NULL_CH_STRUCT "EC_VAL_NULL_CH_STRUCT"<BR>
-+ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
-+ * @ref EC_VAL_CH_ALREADY_OPEN "EC_VAL_CH_ALREADY_OPEN"<BR>
-+ * @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
-+ * @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
-+ * @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
-+ */
-+static int halChannelSetup(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup)
-+ {
-+ int Ch, Ret;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halChannelSetup(HalDev:%08x, HalCh:%08x, OsSetup:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalCh, (bit32u)OsSetup);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enInitialized)
-+ return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE);
-+
-+ /* We require the channel structure to be passed, even if it only contains
-+ the channel number */
-+ if (HalCh == NULL)
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_NULL_CH_STRUCT);
-+ }
-+
-+ Ch = HalCh->Channel;
-+
-+ if ((Ch < 0) || (Ch > MAX_AAL5_CHAN))
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_CH);
-+ }
-+
-+ /* if channel is already open, this call is invalid */
-+ if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
-+ {
-+ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
-+ }
-+
-+ /* channel is closed, but might be setup. If so, reopen the hardware channel. */
-+ if ((HalDev->ChIsSetup[Ch][DIRECTION_TX] == FALSE) && (HalDev->ChIsSetup[Ch][DIRECTION_RX] == FALSE))
-+ {
-+ /* Setup channel configuration */
-+ /* Store OS_SETUP */
-+ HalDev->ChData[Ch].OsSetup = OsSetup; /* ~GSG 030508 */
-+
-+ /* setup HAL default values for this channel first */
-+ ChannelConfigInit(HalDev, HalCh);
-+
-+ /* retrieve options.conf channel parameters */
-+ /* currently ignoring return value, making the choice that it's okay if
-+ the user does not supply channel configuration in the data store */
-+ ChannelConfigGet(HalDev, HalCh);
-+
-+ /* update HalDev with data given in HalCh */
-+ ChannelConfigUpdate(HalDev, HalCh);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(8))
-+ {
-+ dbgChannelConfigDump(HalDev, Ch);
-+ }
-+#endif
-+
-+ /* HalDev->ChIsSetup[Ch][0] = TRUE; */
-+ HalDev->ChIsSetup[Ch][DIRECTION_TX] = TRUE;
-+ HalDev->ChIsSetup[Ch][DIRECTION_RX] = TRUE;
-+
-+ /* I don't initialize RcbStart or TcbStart here because their values may be
-+ reused across several Setup/Teardown calls */
-+ }
-+
-+ /* If the hardware has been opened (is out of reset), then configure the channel
-+ in the hardware. NOTE: ChannelConfigApply calls the CPSAR ChannelSetup()! */
-+ if (HalDev->State == enOpened)
-+ {
-+ Ret = ChannelConfigApply(HalDev, HalCh);
-+ if (Ret) return (Ret);
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * This function configures the rate at which the OAM timer scheduler
-+ * channels will be scheduled. The value of OamRate is the number of
-+ * clock ticks between cell transmissions (if OAM function is sourcing
-+ * cells), or the number of clock ticks between events or absence of events
-+ * (if OAM function is sinking cells). The value of i indicates
-+ * which OAM function to apply the rate to. A list is given below.
-+ *
-+ * @par Oam Function Values
-+ * - 0 : Loopback source
-+ * - 1 : F4 CC source
-+ * - 2 : F5 CC source
-+ * - 3 : F4 CC sink
-+ * - 4 : F5 CC sink
-+ * - 5 : F4 TX AIS source
-+ * - 6 : F5 TX AIS source
-+ * - 7 : F4 RX RDI source
-+ * - 8 : F5 RX RDI source
-+ * - 9 : F4 AIS monitor
-+ * - 10 : F5 AIS monitor
-+ *
-+ * The following is information on how to calculate the OAM rate. There
-+ * is only one OAM timer that is shared among all channels. Therefore, if
-+ * you wanted an OAM source function (ex. F4 CC source) to generate 1 cell/sec
-+ * across 8 channels, you would need to configure the OAM timer to schedule 8
-+ * cells/sec. In addition, the credits are shared between segment and end-to-end
-+ * type OAM cells, so if you were sending both types of cells, you would
-+ * need to configure the OAM timer for 16 cells/sec. However, the clock
-+ * rate must be specified in clock ticks between events. Using an example
-+ * clock rate of 125 MHz, the rate in clock ticks can be calculated by
-+ * dividing 125 Mhz by 16 cells/sec. The results is 7812500 ticks. Thus,
-+ * every 7812500 clock cycles, an OAM cell will be generated for the F4 CC
-+ * Source function.
-+ */
-+static void OamRateConfig(HAL_DEVICE *HalDev)
-+ {
-+ int i;
-+ bit32u OamRate, Freq = HalDev->SarFrequency;
-+
-+ /* Configure OAM Timer State Block */
-+ for (i=0; i<NUM_OAM_RATES; i++)
-+ {
-+ switch(i)
-+ {
-+ case 0: OamRate = ((Freq/1000)*HalDev->OamLbTimeout);
-+ break;
-+ case 1:
-+ case 2:
-+ case 5:
-+ case 6:
-+ case 7:
-+ case 8: OamRate = (Freq/38);
-+ break;
-+ case 3:
-+ case 4: OamRate = ((Freq*3) + (Freq/2))/38;
-+ break;
-+ case 9:
-+ case 10: OamRate = ((Freq*2) + (Freq/2))/38;
-+ break;
-+ default: OamRate = (Freq*5);
-+ break;
-+ }
-+
-+ *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + (i*64) + 1) = OamRate;
-+ }
-+ }
-+
-+/**
-+ * @ingroup AAL5_Functions
-+ * This function is used to enable OAM functions (other than loopback) for a
-+ * particular channel. The channel (embedded within OamConfig - see below) must
-+ * have been configured for firmware OAM (not host OAM) for these configurations
-+ * to take effect. More than one function may be enabled at one time.
-+ * If more than one function is enabled, they must all be of the same level, all
-+ * F4(VP) or all F5(VC).
-+ *
-+ * The usage of the OamConfig parameter is described through the table below. To
-+ * initiate firmware OAM, set one or more bits in OamConfig corresponding to the
-+ * various OAM functions. To disable firmware OAM functions, set bit 30 along
-+ * with any other combination of bits to shutdown various OAM functions at once.
-+ *
-+ * Acronyms:
-+ * e2e - end to end, seg - segment, CC - continuity check,
-+ * AIS - Alarm Indication Signal
-+ *
-+ * @par Bit: Function: Description
-+ * - 31: Reserved:
-+ * - 30: Setup/Teardown: 0 - enable, 1 - disable (Note 1)
-+ * - 29: F4 CC Source seg: 0 - no action, 1 - configure
-+ * - 28: F4 CC Source e2e: 0 - no action, 1 - configure
-+ * - 27: F4 AIS Source seg: 0 - no action, 1 - configure
-+ * - 26: F4 AIS Source e2e: 0 - no action, 1 - configure
-+ * - 25: F5 CC Source seg: 0 - no action, 1 - configure
-+ * - 24: F5 CC Source e2e: 0 - no action, 1 - configure
-+ * - 23: F5 AIS Source seg: 0 - no action, 1 - configure
-+ * - 22: F5 AIS Source e2e: 0 - no action, 1 - configure
-+ * - 21: F4 CC Sink seg: 0 - no action, 1 - configure
-+ * - 20: F4 CC Sink e2e: 0 - no action, 1 - configure
-+ * - 19: F5 CC Sink seg: 0 - no action, 1 - configure
-+ * - 18: F5 CC Sink e2e: 0 - no action, 1 - configure
-+ * - 17:8: Reserved:
-+ * - 7:0: Channel: AAL5/AAL2 VC/VP channel (Note 2)
-+ *
-+ *
-+ * Note 1: This bit must be clear to enable the specified OAM function.
-+ * Note 2: This must specify the VC channel for F5 functions, and the VP
-+ * channel for F4 functions.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param OamConfig A 32-bit integer field defined as follows:
-+ */
-+static void halOamFuncConfig(HAL_DEVICE *HalDev, unsigned int OamConfig)
-+ {
-+ /* GPR 0 */
-+ SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
-+ }
-+
-+/**
-+ * @ingroup AAL5_Functions
-+ * This function is used to enable OAM loopback functions for a particular
-+ * channel. The channel (embedded within OamConfig - see below) must have been
-+ * configured for firmware OAM (not host OAM) for these configurations to take
-+ * effect. Only one loopback function can be enabled at a time.
-+ *
-+ * The LLID is inserted into to the OAM cell's LLID field, and it specifies the
-+ * LLID of the connection point in the network where the generated loopback cell
-+ * should be turned around. The LLID is composed of 4 32-bit words, and this
-+ * function expects the caller to pass an array of 4 words in the LLID field.
-+ * The CorrelationTag is a 32-bit word that the PDSP uses to correlate loopback
-+ * commands with loopback responses. It should simply be changed for each
-+ * call, and there is no restriction on the value used for CorrelationTag.
-+ *
-+ * The usage of the OamConfig parameter is described through the table below. To
-+ * initiate firmware OAM, set one of the bits corresponding to the
-+ * various loopback OAM functions. Note that only one loopback source may be
-+ * commanded at a time.
-+ *
-+ * Acronyms:
-+ * e2e - end to end, seg - segment, LB - loopback
-+ *
-+ * @par Bit: Function: Description
-+ * - 31:16: Reserved:
-+ * - 15: F4 LB Source seg: 0 - no action, 1 - configure (Note 1)
-+ * - 14: F4 LB Source seg: 0 - no action, 1 - configure (Note 1)
-+ * - 13: F4 LB Source e2e: 0 - no action, 1 - configure (Note 1)
-+ * - 12: F4 LB Source e2e: 0 - no action, 1 - configure (Note 1)
-+ * - 11:8: Reserved:
-+ * - 7:0: Channel: AAL5/AAL2 VC/VP channel (Note 2)
-+ *
-+ *
-+ * Note 1: Only one LB function may be enabled at one time. Once enabled,
-+ * the PDSP will time out after 5 seconds. The host must wait until it
-+ * has received the result of the current LB request before initiating
-+ * a new request. <BR>
-+ * Note 2: This must specify the VC channel for F5 functions, and the VP
-+ * channel for F4 functions.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param OamConfig A 32-bit integer field defined as follows:
-+ * @param LLID Loopback Location Identifier (passed as 4 word array).
-+ * Must be configured in big endian format.
-+ * @param CorrelationTag 32-bit tag correlates loopback commands with loopback
-+ * responses. Must be configured in big endian format.
-+ *
-+ */
-+static void halOamLoopbackConfig(HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag)
-+ {
-+ volatile bit32u *tmp;
-+
-+ /* test to see if this is a loopback command */
-+ if (OamConfig & 0xf000)
-+ {
-+ /* write the OAM correlation tag (GPR 1) */
-+ SAR_PDSP_OAM_CORR_REG(HalDev->dev_base) = CorrelationTag;
-+
-+ /* write the LLID */
-+ tmp = pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base);
-+
-+ /* advance past the CPID */
-+ tmp += 4;
-+
-+ *tmp++ = LLID[0];
-+ *tmp++ = LLID[1];
-+ *tmp++ = LLID[2];
-+ *tmp = LLID[3];
-+
-+ /* GPR 0 */
-+ SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
-+ }
-+ }
-+
-+/*
-+ * This function allows the host software to access any register directly.
-+ * Primarily used for debug.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param RegOffset Hexadecimal offset to desired register (from device base addr)
-+ *
-+ * @return Volatile pointer to desired register.
-+ */
-+static volatile bit32u* halRegAccess(HAL_DEVICE *HalDev, bit32u RegOffset)
-+ {
-+ /* compute the register address */
-+ return ((volatile bit32u *)(HalDev->dev_base + RegOffset));
-+ }
-+
-+#ifdef __CPHAL_DEBUG
-+static void dbgConfigDump(HAL_DEVICE *HalDev)
-+ {
-+ dbgPrintf(" AAL5 Inst %d Config Dump:\n", HalDev->Inst);
-+ dbgPrintf(" Base :%08x, offset:%08d\n",
-+ HalDev->dev_base, HalDev->offset);
-+ dbgPrintf(" Interrupt:%08d, debug :%08d\n",
-+ HalDev->interrupt, HalDev->debug);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * Performs a variety of control functions on the CPHAL module. It is used to
-+ * modify/read configuration parameters and to initiate internal functions.
-+ * The @p Key indicates the function to perform or the parameter to access (note
-+ * that these Keys are identical to those used in accessing the configuration data
-+ * store). @p Action is applicable to parameters only, and indicates what the
-+ * CPHAL should do with the parameter (i.e. "Set", "Get", etc..). The actions
-+ * for each parameter are defined in the module specific documentation.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Key Key specifying the parameter to change or internal function to initiate. See module specific documentation for available keys.
-+ * @param Action Specifies the action to take. See module specific documentation for available actions.
-+ * @param Value Pointer to new value for given @p Key parameter ("Set"), or returned value of Key ("Get").
-+ *
-+ * @return EC_NO_ERRORS (ok).<BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
-+ * @ref EC_VAL_ACTION_NOT_FOUND "EC_VAL_ACTION_NOT_FOUND"<BR>
-+ */
-+static int halControl(HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
-+ {
-+ int Level, Ch, KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Queue;
-+ char *TmpKey = (char *)Key;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
-+ Key, Action, (bit32u)Value);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enInitialized)
-+ return (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_STATE);
-+
-+ if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ HalDev->debug = *(int *)Value;
-+ /* also setup debug variable in CPSAR module */
-+ rc = HalDev->SarFunc->Control(HalDev->SarDev, "Debug", "Set", Value);
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ HalDev->ChData[Ch].FwdUnkVc = *(int *)Value;
-+
-+ if ((HalDev->State == enOpened) && (HalDev->ChData[Ch].PktType == 3))
-+ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
-+ }
-+ }
-+
-+ /* +GSG 030407 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
-+ }
-+
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
-+ }
-+ }
-+
-+ /* +GSG 030307 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "Version") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ *(const char **)Value = pszVersion_CPAAL5;
-+ }
-+ }
-+
-+ /* +GSG 030529 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "TurboDslErrors") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ *(int *)Value = HalDev->TurboDslErrors;
-+ }
-+ }
-+
-+ /* +GSG 030416 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "F4_LB_Counter") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ *(int *)Value = SAR_PDSP_OAM_F4_LB_COUNT_REG(HalDev->dev_base);
-+ }
-+ }
-+
-+ /* +GSG 030416 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "F5_LB_Counter") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ *(int *)Value = SAR_PDSP_OAM_F5_LB_COUNT_REG(HalDev->dev_base);
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "Stats;") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ TmpKey += HalDev->OsFunc->Strlen("Stats;");
-+ Level = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+ TmpKey++;
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+ TmpKey++;
-+ Queue = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+ TmpKey++;
-+ StatsGet(HalDev, (void **)Value, Level, Ch, Queue);
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "Gfc.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("Gfc.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].Gfc = *(int *)Value;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "Clp.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("Clp.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].Clp = *(int *)Value;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "Pti.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("Pti.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].Pti = *(int *)Value;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "CpcsUU.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("CpcsUU.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].CpcsUU = *(int *)Value;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "TxVc_CellRate.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("TxVc_CellRate.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].TxVc_CellRate = *(int *)Value;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVc_CellRate;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "TxVc_Mbs.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("TxVc_Mbs.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].TxVc_Mbs = *(int *)Value;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)= HalDev->ChData[Ch].TxVc_Mbs;
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "TxVc_AtmHeader.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("TxVc_AtmHeader.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].TxVc_AtmHeader = *(int *)Value;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+6)= HalDev->ChData[Ch].TxVc_AtmHeader;
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "TxVp_AtmHeader.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("TxVp_AtmHeader.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].TxVp_AtmHeader = *(int *)Value;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_TX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVp_AtmHeader;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #100 */
-+ if (HalDev->OsFunc->Strstr(Key, "TxVc_Pcr.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("TxVc_Pcr.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].TxVc_Pcr = *(int *)Value;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+4)= HalDev->ChData[Ch].TxVc_Pcr;
-+ }
-+ }
-+
-+ /* +GSG 030428 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVc_OamCh.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVc_OamCh.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].RxVc_OamCh = (*(int *)Value) & 0xff;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)) |= HalDev->ChData[Ch].RxVc_OamCh;
-+ }
-+ }
-+
-+ /* +GSG 030428 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVp_OamCh.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVp_OamCh.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* first, store new value in our channel structure */
-+ HalDev->ChData[Ch].RxVp_OamCh = (*(int *)Value) & 0xff;
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ *(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1) |= HalDev->ChData[Ch].RxVp_OamCh;
-+ }
-+ }
-+
-+ /* +GSG 030304 */
-+ /* Fixes PITS #98 */
-+ if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* this variable is controlled by the CPSAR module */
-+ if (HalDev->State == enOpened)
-+ {
-+ rc=HalDev->SarFunc->Control(HalDev->SarDev, "PdspEnable", "Set", Value);
-+ }
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "OamLbTimeout") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ HalDev->OamLbTimeout = *(int *)Value;
-+ /* this variable is controlled by the CPSAR module */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + 1) =
-+ ((HalDev->SarFrequency/1000) * HalDev->OamLbTimeout);
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 (PITS #114) */
-+ if (HalDev->OsFunc->Strstr(Key, "DeviceCPID") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ unsigned int* local = (unsigned int *)Value;
-+ ActionFound=1;
-+ /* first, store new value in our hal structure */
-+ HalDev->DeviceCPID[0] = local[0];
-+ HalDev->DeviceCPID[1] = local[1];
-+ HalDev->DeviceCPID[2] = local[2];
-+ HalDev->DeviceCPID[3] = local[3];
-+
-+ /* now, apply to PDSP state RAM */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 0) = HalDev->DeviceCPID[0];
-+ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 1) = HalDev->DeviceCPID[1];
-+ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 2) = HalDev->DeviceCPID[2];
-+ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 3) = HalDev->DeviceCPID[3];
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030304 */
-+ /* Fixes PITS #99 */
-+ if (HalDev->OsFunc->Strstr(Key, "StrictPriority") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* used in halOpen to decide which interrupt handler to use */
-+ HalDev->StrictPriority = *(int *)Value;
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, hcMaxFrags) != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ if ((*(int *)Value) > 0)
-+ HalDev->MaxFrags = *(int *)Value;
-+ else
-+ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_VALUE);
-+ }
-+
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ *(int *)Value = HalDev->MaxFrags;
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVc_RDICount.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
-+ }
-+ }
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* All sets write 0, this action is a clear only */
-+ if (HalDev->State == enOpened)
-+ {
-+ (*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) &=~ RDI_CNT_MASK;
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVc_AISseg.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVc_AISseg.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVc_AISetoe.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVc_AISetoe.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVp_RDICount.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
-+ }
-+ }
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* All sets write 0, this action is a clear only */
-+ if (HalDev->State == enOpened)
-+ {
-+ (*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) &=~ RDI_CNT_MASK;
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVp_AISseg.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVp_AISseg.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
-+ }
-+ }
-+ }
-+
-+ /* +GSG 030306 */
-+ /* Fixes PITS #103 */
-+ if (HalDev->OsFunc->Strstr(Key, "RxVp_AISetoe.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("RxVp_AISetoe.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* PDSP's Rx VC State word 3 contains the value */
-+ if (HalDev->State == enOpened)
-+ {
-+ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
-+ }
-+ }
-+ }
-+
-+ if (KeyFound == 0)
-+ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND);
-+
-+ if (ActionFound == 0)
-+ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND);
-+
-+ return(rc);
-+ }
-+
-+/*
-+ * Sets up HAL default configuration parameter values.
-+ */
-+static void ConfigInit(HAL_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* configure some defaults with tnetx7300 values */
-+ HalDev->dev_base = 0xa3000000;
-+ HalDev->offset = 0;
-+ HalDev->interrupt = 15;
-+ HalDev->debug = 0;
-+ HalDev->MaxFrags = 46;
-+ HalDev->OamLbTimeout = 5000;
-+ }
-+
-+/*
-+ * Retrieve HAL configuration parameter values.
-+ */
-+static bit32u ConfigGet(HAL_DEVICE *HalDev)
-+ {
-+ bit32u Ret;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* get the configuration parameters common to all modules */
-+ Ret = ConfigGetCommon(HalDev);
-+ if (Ret) return (EC_AAL5|Ret);
-+
-+ /* get AAL5 specific configuration parameters here */
-+ Ret = HalDev->OsFunc->Control(HalDev->OsDev, hcSarFrequency, pszGET, &HalDev->SarFrequency); /* GSG +030416*/
-+ if (Ret) /* GSG +030416*/
-+ HalDev->SarFrequency = 200000000; /* 200 Mhz default */ /* GSG +030416*/
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function initializes the CPHAL module. It gathers all
-+ * necessary global configuration info from the configuration file, and
-+ * performs initialization and configuration of the device. Note that
-+ * the device operation is not started until the OS calls @c Open().
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_BASE_ADDR_NOT_FOUND "EC_VAL_BASE_ADDR_NOT_FOUND"<BR>
-+ * @ref EC_VAL_RESET_BIT_NOT_FOUND "EC_VAL_RESET_BIT_NOT_FOUND"<BR>
-+ * @ref EC_VAL_INTERRUPT_NOT_FOUND "EC_VAL_INTERRUPT_NOT_FOUND"<BR>
-+ * @ref EC_VAL_OFFSET_NOT_FOUND "EC_VAL_OFFSET_NOT_FOUND"<BR>
-+ */
-+static int halInit(HAL_DEVICE *HalDev)
-+ {
-+ int i;
-+ bit32u error_code;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halInit(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state */
-+ if (HalDev->State != enDevFound)
-+ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_INVALID_STATE);
-+
-+ /* Configure HAL defaults */
-+ ConfigInit(HalDev);
-+
-+ /* Retrieve HAL configuration parameters from data store */
-+ error_code = ConfigGet(HalDev);
-+ if (error_code) return (error_code);
-+
-+ /* Other items (OAM related) that need to be passed in somehow */
-+ HalDev->DeviceCPID[0] = 0xffffffff;
-+ HalDev->DeviceCPID[1] = 0xffffffff;
-+ HalDev->DeviceCPID[2] = 0xffffffff;
-+ HalDev->DeviceCPID[3] = 0xffffffff;
-+ HalDev->LBSourceLLID[0] = 0xffffffff;
-+ HalDev->LBSourceLLID[1] = 0xffffffff;
-+ HalDev->LBSourceLLID[2] = 0xffffffff;
-+ HalDev->LBSourceLLID[3] = 0xffffffff;
-+
-+ /* Initialize SAR layer*/
-+ error_code = HalDev->SarFunc->Init(HalDev->SarDev);
-+ if (error_code) return (error_code);
-+
-+ /* Initialize various HalDev members. This is probably overkill, since these
-+ are initialized in ChannelSetup() and HalDev is cleared in InitModule(). */
-+ for (i=0; i<NUM_AAL5_CHAN; i++)
-+ {
-+ HalDev->InRxInt[i]=FALSE;
-+ HalDev->ChIsOpen[i][DIRECTION_TX] = FALSE;
-+ HalDev->ChIsOpen[i][DIRECTION_RX] = FALSE;
-+ HalDev->TcbStart[i][0] = 0;
-+ HalDev->TcbStart[i][1] = 0;
-+ HalDev->RcbStart[i] = 0;
-+ }
-+
-+ /* initialize SAR stats */
-+ StatsClear(HalDev);
-+
-+ /* init Stat pointers */
-+
-+ /* even though these statistics may be for multiple channels/queues, i need
-+ only configure the pointer to the beginning of the array, and I can index
-+ from there if necessary */
-+ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
-+ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
-+ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
-+ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
-+
-+ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
-+ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
-+ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
-+ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
-+ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
-+ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
-+ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
-+ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
-+ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
-+ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
-+ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
-+
-+ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
-+ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
-+ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
-+ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
-+ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
-+ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
-+ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
-+ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
-+ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
-+ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
-+ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
-+ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
-+ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
-+ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
-+
-+ StatsTable4[0].StatPtr = &HalDev->dev_base;
-+ StatsTable4[1].StatPtr = &HalDev->offset;
-+ StatsTable4[2].StatPtr = &HalDev->interrupt;
-+ StatsTable4[3].StatPtr = &HalDev->debug;
-+ StatsTable4[4].StatPtr = &HalDev->Inst;
-+
-+ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
-+ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
-+ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
-+ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
-+ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
-+ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
-+ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
-+ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
-+ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
-+ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
-+ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
-+ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
-+ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
-+ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
-+ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
-+ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
-+ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
-+ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
-+ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
-+ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
-+
-+ /* update device state */
-+ HalDev->State = enInitialized;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(9))
-+ dbgConfigDump(HalDev);
-+#endif
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * Use this function to actually send after queuing multiple packets using
-+ * Send(). This is a debug only function that should be removed - it was
-+ * necessary to properly implement my loopback tests.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Queue Queue number to kick.
-+ *
-+ * @return 0 OK, Non-Zero Not OK
-+ */
-+static int halKick(HAL_DEVICE *HalDev, int Queue)
-+ {
-+ int Ch;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halKick(HalDev:%08x. Queue:%d)\n", (bit32u)HalDev, Queue);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ for (Ch = 0; Ch < 16; Ch ++)
-+ {
-+ if ((!HalDev->TxActive[Ch][Queue]) && (HalDev->TxActQueueHead[Ch][Queue] != 0))
-+ {
-+ *(pTX_DMA_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+Queue)=
-+ VirtToPhys(HalDev->TxActQueueHead[Ch][Queue]);
-+ HalDev->TxActive[Ch][Queue]=TRUE;
-+ }
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/* +GSG 030305 For PITS #99
-+ * Alternate interrupt handler that uses the INT_VECTOR in order to
-+ * provide strict priority handling among channels, beginning with Ch 0.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param MoreWork (Output) When set to 1, indicates that there is more work to do.
-+ * Caller should ensure that the value pointed at is set to 0
-+ * prior to the call.
-+ * @return 0 OK, non-zero error.
-+ */
-+static int DeviceIntAlt(HAL_DEVICE *HalDev, int *MoreWork)
-+ {
-+ int tmp, Ch, WorkFlag;
-+ bit32u rc;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]DeviceIntAlt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state - important because a call prior to Open would
-+ result in a lockup */
-+ if (HalDev->State != enOpened)
-+ return(EC_AAL5|EC_FUNC_DEVICE_INT_ALT|EC_VAL_INVALID_STATE);
-+
-+ if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
-+ {
-+ /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
-+ HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
-+
-+ if (tmp&TXH_PEND)
-+ {
-+ /* decide which channel to service */
-+ Ch = (SAR_INTR_VECTOR(HalDev->dev_base) & TXH_PEND_INVEC);
-+
-+ rc = TxInt(HalDev,Ch,0,&WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&TXL_PEND)
-+ {
-+ /* decide which channel to service */
-+ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & TXL_PEND_INVEC) >> 4);
-+
-+ rc = TxInt(HalDev,Ch,1,&WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&RX_PEND)
-+ {
-+ /* decide which channel to service */
-+ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & RX_PEND_INVEC) >> 8);
-+
-+ rc = RxInt(HalDev,Ch,&WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&STS_PEND)
-+ {
-+ /* GPR 2 code added for PITS 103 */
-+ /* determine interrupt source */
-+ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
-+
-+ /* only if this is GPR 2 interrupt do we take action */
-+ if (Ch == 26)
-+ {
-+ /* pass loopback result back to OS */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
-+ (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base));
-+ }
-+
-+ /* clear the interrupt */
-+ SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
-+ }
-+
-+ if (tmp&AAL2_PEND)
-+ {
-+ /* no action defined */
-+ }
-+
-+ SAR_INTR_VECTOR(HalDev->dev_base) = 0;
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * Called to service a module interrupt. This function determines
-+ * what type of interrupt occurred and dispatches the correct handler.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param MoreWork (Output) When set to 1, indicates that there is more work to do.
-+ * Caller should ensure that the value pointed at is set to 0
-+ * prior to the call.
-+ * @return 0 OK, non-zero error.
-+ */
-+static int DeviceInt(HAL_DEVICE *HalDev, int *MoreWork)
-+ {
-+ /*static int NextRxCh=0;
-+ static int NextTxCh[2]={0,0};*/
-+
-+ int tmp, Ch, FirstCh, WorkFlag;
-+ int NextTxLCh, NextTxHCh, NextRxCh;
-+ bit32u rc;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]DeviceInt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state - important because a call prior to Open would
-+ result in a lockup */
-+ if (HalDev->State != enOpened)
-+ return(EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_INVALID_STATE);
-+
-+ NextTxHCh = HalDev->NextTxCh[0];
-+ NextTxLCh = HalDev->NextTxCh[1];
-+ NextRxCh = HalDev->NextRxCh;
-+
-+ /* service interrupts while there is more work to do */
-+ /*while (((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING) && (TotalPkts < 500))*/
-+ if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
-+ {
-+ /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
-+ HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
-+
-+ if (tmp&TXH_PEND)
-+ {
-+ /* decide which channel to service */
-+ FirstCh = NextTxHCh;
-+ while (1)
-+ {
-+ Ch = NextTxHCh++;
-+ if (NextTxHCh == 16)
-+ NextTxHCh = 0;
-+ if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<Ch))
-+ break;
-+ if (FirstCh == NextTxHCh)
-+ {
-+ /* we checked every channel and still haven't found anything to do */
-+ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXH_WORK_TO_DO);
-+ }
-+ }
-+
-+ rc = TxInt(HalDev,Ch,0,&WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&TXL_PEND)
-+ {
-+ /* decide which channel to service */
-+ FirstCh = NextTxLCh;
-+ while (1)
-+ {
-+ Ch = NextTxLCh++;
-+ if (NextTxLCh == 16)
-+ NextTxLCh = 0;
-+ if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<(Ch+16)))
-+ break;
-+ if (FirstCh == NextTxLCh)
-+ {
-+ /* we checked every channel and still haven't found anything to do */
-+ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXL_WORK_TO_DO);
-+ }
-+ }
-+
-+ rc = TxInt(HalDev,Ch,1,&WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&RX_PEND)
-+ {
-+ FirstCh = NextRxCh;
-+ while (1)
-+ {
-+ Ch = NextRxCh++;
-+ if (NextRxCh == 16)
-+ NextRxCh = 0;
-+ if (SAR_RX_MASKED_STATUS(HalDev->dev_base) & (1 << Ch))
-+ break; /* found a channel to service */
-+ if (FirstCh == NextRxCh)
-+ {
-+ /* we checked every channel and still haven't found anything to do */
-+ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_RX_WORK_TO_DO);
-+ }
-+ }
-+
-+ rc = RxInt(HalDev,Ch, &WorkFlag);
-+ if (rc) return (rc);
-+
-+ if (WorkFlag == 1)
-+ *MoreWork = 1;
-+ }
-+
-+ if (tmp&STS_PEND)
-+ {
-+ /* +GSG 030305 */
-+ /* GPR 2 code added for PITS 103 */
-+ /* determine interrupt source */
-+ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
-+
-+ /* only if this is GPR 2 interrupt do we take action */
-+ if (Ch == 26)
-+ {
-+ /* pass loopback result back to OS */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
-+ (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base));
-+ }
-+
-+ /* clear the interrupt */
-+ SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
-+ }
-+
-+ if (tmp&AAL2_PEND)
-+ {
-+ /* no action defined */
-+ }
-+
-+ SAR_INTR_VECTOR(HalDev->dev_base) = 0;
-+ }
-+
-+ HalDev->NextTxCh[0] = NextTxHCh;
-+ HalDev->NextTxCh[1] = NextTxLCh;
-+ HalDev->NextRxCh = NextRxCh;
-+
-+ /* This must be done by the upper layer */
-+ /* SAR_EOI(HalDev->dev_base) = 0; */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function starts the operation of the CPHAL device. It takes the device
-+ * out of reset, and calls @c IsrRegister(). This function should be called after
-+ * calling the @c Init() function.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok).<BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
-+ * @ref EC_VAL_FIRMWARE_TOO_LARGE "EC_VAL_FIRMWARE_TOO_LARGE"<BR>
-+ * @ref EC_VAL_PDSP_LOAD_FAIL "EC_VAL_PDSP_LOAD_FAIL"<BR>
-+ * @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
-+ * @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
-+ * @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
-+ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
-+ */
-+static int halOpen(HAL_DEVICE *HalDev)
-+ {
-+ int i,Ret;
-+ bit32 SarBase = HalDev->dev_base;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state */
-+ if (HalDev->State < enInitialized)
-+ return (EC_AAL5|EC_FUNC_OPEN|EC_VAL_INVALID_STATE);
-+
-+ /* Open the SAR (this brings the whole device out of reset */
-+ Ret = HalDev->SarFunc->Open(HalDev->SarDev); /* ~GSG 030410 */
-+ if (Ret) /* +GSG 030410 */
-+ return (Ret); /* +GSG 030410 */
-+
-+ /* Change device state */
-+ HalDev->State = enOpened;
-+
-+
-+#ifdef __CPHAL_DEBUG
-+ /* print out the version information */
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[aal5 halOpen()]Module ID(AAL5-CPSAR):%d, Version:%2d.%02d\n",
-+ (SAR_ID_REG(SarBase)&0xffff0000)>>16,
-+ (SAR_ID_REG(SarBase)&0xff00)>>8,
-+ SAR_ID_REG(SarBase)&0xff);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* GREG 11/1/02: The State RAM clearing code was previously in cpsar.c,
-+ directly after device reset. I moved it here because I believe it is
-+ AAL5 specific code. Also the MAX_CHAN was set to 19 in cpsar.c, which
-+ would have caused this code to clear too much memory! */
-+
-+ /* NOTE: State RAM must be cleared prior to initializing the PDSP!! */
-+
-+ /* GSG 030416: Removed all of this. All PDSP State RAM is cleared
-+ in CPSAR Open(). On Close(), all channels are torndown, thus all
-+ AAL5 channel state RAM is cleared. */
-+
-+ /* Clear Rx State RAM */
-+ /*for (i=0; i<NUM_AAL5_CHAN; i++)
-+ for (j=0; j<NUM_RX_STATE_WORDS; j++)
-+ *(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0; */
-+
-+ /* Check that Rx DMA State RAM was cleared */
-+ /*for (i=0; i<NUM_AAL5_CHAN; i++)
-+ for (j=0; j<NUM_RX_STATE_WORDS; j++)
-+ {
-+ if (*(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
-+ {
-+ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
-+ }
-+ }*/
-+
-+ /* Clear Tx State RAM */
-+ /*for (i=0; i<NUM_AAL5_CHAN; i++)
-+ for (j=0; j<NUM_TX_STATE_WORDS; j++)
-+ {
-+ *(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0;
-+ }*/
-+
-+ /* Check that Tx DMA State RAM was cleared */
-+ /*for (i=0; i<NUM_AAL5_CHAN; i++)
-+ for (j=0; j<NUM_TX_STATE_WORDS; j++)
-+ {
-+ if (*(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
-+ {
-+ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
-+ }
-+ }*/
-+
-+ /* GSG +030523 Malloc space for the Rx fraglist */
-+ HalDev->fraglist = HalDev->OsFunc->Malloc(HalDev->MaxFrags * sizeof(FRAGLIST));
-+
-+ /* For any channels that have been pre-initialized, set them up now */
-+ for (i=0; i<NUM_AAL5_CHAN; i++)
-+ {
-+ if ((HalDev->ChIsSetup[i][0]==TRUE) && (HalDev->ChIsOpen[i][0]==FALSE))
-+ {
-+ CHANNEL_INFO HalChn;
-+ HalChn.Channel = i;
-+ Ret = ChannelConfigApply(HalDev, &HalChn);
-+ if (Ret) return (Ret);
-+ }
-+ }
-+
-+ /* OAM code would be a candidate to go into ConfigApply */
-+
-+ /* Configure OAM Timer State Block */
-+ OamRateConfig(HalDev); /* +GSG 030416 */
-+
-+ /* Setup OAM Configuration Block */
-+ for (i=0; i<8; i++) /* ~GSG 030603 4->8 */
-+ {
-+ if (i < 4)
-+ *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->DeviceCPID[i];
-+ else
-+ *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->LBSourceLLID[i-4];
-+ }
-+
-+ /* Setup OAM Padding Block */
-+ for (i=0; i<12; i++)
-+ {
-+ *(pOAM_PADDING_BLOCK_WORD_0(SarBase) + i) = ((i==11)?0x6a6a0000:0x6a6a6a6a);
-+ }
-+
-+ /* Enable Tx CPPI DMA */
-+ TX_CPPI_CTL_REG(HalDev->dev_base) = 1;
-+
-+ /* Enable Rx CPPI DMA */
-+ RX_CPPI_CTL_REG(HalDev->dev_base) = 1;
-+
-+ /* +GSG 030306 */
-+ /* Fix for PITS 103 */
-+ /* Enable Host Interrupt for GPR 2 (OAM LB result register) */
-+ SAR_HOST_INT_EN_SET_REG(HalDev->dev_base) |= 0x04000000;
-+
-+ /* +GSG 030304 to fix PITS 99 (if block is new)*/
-+ if (HalDev->StrictPriority == 1)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
-+ (bit32u)HalDev->OsDev, (bit32u)DeviceIntAlt, HalDev->interrupt);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* "register" the interrupt handler */
-+ HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceIntAlt, HalDev->interrupt);
-+ }
-+ else /* +GSG 030306 */
-+ { /* +GSG 030306 */
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
-+ (bit32u)HalDev->OsDev, (bit32u)DeviceInt, HalDev->interrupt);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* "register" the interrupt handler */
-+ HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceInt, HalDev->interrupt);
-+ } /* +GSG 030306 */
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * Called to retrigger the interrupt mechanism after packets have been
-+ * processed. Call this function when the HalISR function indicates that
-+ * there is no more work to do. Proper use of this function will guarantee
-+ * that interrupts are never missed.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ */
-+static int halPacketProcessEnd(HAL_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halPacketProcessEnd(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ SAR_EOI(HalDev->dev_base) = 0;
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function probes for the instance of the CPHAL module. It will call
-+ * the OS function @c DeviceFindInfo() to get the information required.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_DEVICE_NOT_FOUND "EC_VAL_DEVICE_NOT_FOUND"<BR>
-+ */
-+static int halProbe(HAL_DEVICE *HalDev)
-+ {
-+ int Ret;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify hardware state is "enConnected */
-+ if (HalDev->State != enConnected)
-+ return (EC_AAL5|EC_FUNC_PROBE|EC_VAL_INVALID_STATE);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("[aal5->os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
-+ HalDev->Inst, "aal5", (bit32u)&HalDev->DeviceInfo);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Attempt to find the device information */
-+ Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "aal5", &HalDev->DeviceInfo);
-+ if (Ret)
-+ return(EC_AAL5|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
-+
-+ /* Call Probe for supporting CPSAR layer */
-+ Ret = HalDev->SarFunc->Probe(HalDev->SarDev);
-+ if (Ret)
-+ return(Ret);
-+
-+ /* Set device state to DevFound */
-+ HalDev->State = enDevFound;
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function shuts down the CPHAL module completely. The caller must call
-+ * Close() to put the device in reset prior shutting down. This call will free
-+ * the HalDev and the HAL function pointer structure, effectively ending
-+ * communications between the driver and the CPHAL. Further use of the module
-+ * must be initiated by a call to xxxInitModule(), which starts the entire process
-+ * over again.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * Any error code from halClose().<BR>
-+ */
-+static int halShutdown(HAL_DEVICE *HalDev)
-+ {
-+ int Ch, Queue; /*GSG+030514*/
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Verify proper device state */
-+ if (HalDev->State == enOpened)
-+ halClose(HalDev, 3); /*GSG+030429*/
-+
-+ /* Buffer/descriptor resources may still need to be freed if a Close
-+ Mode 1 was performed prior to Shutdown - clean up here */ /*GSG+030514*/
-+ for (Ch=0; Ch<NUM_AAL5_CHAN; Ch++)
-+ {
-+ if (HalDev->RcbStart[Ch] != 0)
-+ FreeRx(HalDev,Ch);
-+
-+ for(Queue=0; Queue<MAX_QUEUE; Queue++)
-+ {
-+ if (HalDev->TcbStart[Ch][Queue] != 0)
-+ FreeTx(HalDev,Ch,Queue);
-+ }
-+ }
-+
-+ /* shutdown the CPSAR layer */
-+ HalDev->SarFunc->Shutdown(HalDev->SarDev);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(6))
-+ {
-+ dbgPrintf(" [aal5 halShutdown()]Free AAL5 function pointers\n");
-+ osfuncSioFlush();
-+ }
-+ if (DBG(1)||DBG(3))
-+ {
-+ dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /* free the HalFunc */
-+ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(6))
-+ {
-+ dbgPrintf(" [aal5 halShutdown]Free HalDev\n");
-+ osfuncSioFlush();
-+ }
-+ if (DBG(1)||DBG(3))
-+ {
-+ dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /* free the HAL device */
-+ HalDev->OsFunc->FreeDev(HalDev);
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * Used to perform regular checks on the device. This function should be
-+ * called at a regular interval specified by the @c Tick parameter.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return EC_NO_ERRORS (ok).<BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ */
-+static int halTick(HAL_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[aal5]halTick(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ if (HalDev->State != enOpened)
-+ return(EC_AAL5|EC_FUNC_TICK|EC_VAL_INVALID_STATE);
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ *
-+ * This function will:
-+ * -# allocate a HalDev that will be used by the OS for future communications with the device
-+ * -# save OsDev for use when calling OS functions
-+ * -# allocate and populate HalFunc with the addresses of CPHAL functions.
-+ * -# check OsFuncSize to see if it meets the minimum requirement.
-+ * -# return the size of the HAL_FUNCTIONS structure through the HalFuncSize pointer. The OS
-+ * should check this value to ensure that the HAL meets its minimum requirement.
-+ *
-+ * Version checking between the OS and the CPHAL is done using the OsFuncSize and
-+ * HalFuncSize. Future versions of the CPHAL may add new functions to either
-+ * HAL_FUNCTIONS or OS_FUNCTIONS, but will never remove functionality. This enables
-+ * both the HAL and OS to check the size of the function structure to ensure that
-+ * the current OS and CPHAL are compatible.
-+ *
-+ * Note: This is the only function exported by a CPHAL module.
-+ *
-+ * Please refer to the section "@ref hal_init" for example code.
-+ *
-+ * @param HalDev Pointer to pointer to CPHAL module information. This will
-+ * be used by the OS when communicating to this module via
-+ * CPHAL. Allocated during the call.
-+ * @param OsDev Pointer to OS device information. This will be saved by
-+ * the CPHAL and returned to the OS when required.
-+ * @param HalFunc Pointer to pointer to structure containing function pointers for all CPHAL
-+ * interfaces. Allocated during the call.
-+ * @param OsFunc Pointer to structure containing function pointers for all OS
-+ * provided interfaces. Must be allocated by OS prior to call.
-+ * @param OsFuncSize Size of OS_FUNCTIONS structure.
-+ * @param HalFuncSize Pointer to the size of the HAL_FUNCTIONS structure.
-+ * @param Inst The instance number of the module to initialize. (start at
-+ * 0).
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_OS_VERSION_NOT_SUPPORTED "EC_VAL_OS_VERSION_NOT_SUPPORTED"<BR>
-+ * @ref EC_VAL_MALLOC_DEV_FAILED "EC_VAL_MALLOC_DEV_FAILED"<BR>
-+ * @ref EC_VAL_MALLOC_FAILED "EC_VAL_MALLOC_FAILED"<BR>
-+ */
-+int xxxInitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+
-+int cpaal5InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst)
-+ {
-+ int rc, SarFuncSize;
-+ HAL_DEVICE *HalPtr;
-+ HAL_FUNCTIONS *HalFuncPtr;
-+
-+ /* NEW CODE */
-+ if (OsFuncSize < sizeof(OS_FUNCTIONS))
-+ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_OS_VERSION_NOT_SUPPORTED);
-+
-+ HalPtr = (HAL_DEVICE *) OsFunc->MallocDev(sizeof(HAL_DEVICE));
-+ if (!HalPtr)
-+ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
-+
-+ HalFuncPtr = (HAL_FUNCTIONS *) OsFunc->Malloc(sizeof(HAL_FUNCTIONS));
-+ if (!HalFuncPtr)
-+ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
-+
-+ /* Initialize the size of hal functions */
-+ *HalFuncSize = sizeof (HAL_FUNCTIONS);
-+
-+ /* clear the device structure */
-+ OsFunc->Memset(HalPtr, 0, sizeof(HAL_DEVICE));
-+
-+ /* clear the function pointers */
-+ OsFunc->Memset(HalFuncPtr, 0, sizeof(HAL_FUNCTIONS));
-+
-+ /* initialize the HAL_DEVICE structure */
-+ HalPtr->OsDev = OsDev;
-+ /*HalPtr->OsOpen = OsDev;*/
-+ HalPtr->Inst = Inst;
-+ HalPtr->OsFunc = OsFunc;
-+
-+ /* Supply pointers for the CPHAL API functions */
-+ HalFuncPtr->RxReturn = halRxReturn;
-+ HalFuncPtr->Init = halInit;
-+ HalFuncPtr->Close = halClose;
-+ HalFuncPtr->Send = halSend;
-+ HalFuncPtr->ChannelSetup = halChannelSetup;
-+ HalFuncPtr->ChannelTeardown = halChannelTeardown;
-+ HalFuncPtr->Open = halOpen;
-+ HalFuncPtr->Kick = halKick;
-+ HalFuncPtr->RegAccess = halRegAccess;
-+ HalFuncPtr->Probe = halProbe;
-+ HalFuncPtr->Control = halControl;
-+ HalFuncPtr->Tick = halTick;
-+ HalFuncPtr->Shutdown = halShutdown;
-+ HalFuncPtr->OamFuncConfig = halOamFuncConfig; /* +GSG 030306 */
-+ HalFuncPtr->OamLoopbackConfig = halOamLoopbackConfig; /* ~GSG 030416 */
-+
-+ /* Temporary */
-+ /*HalFuncPtr->StatsGetOld = StatsGet;*/
-+ HalFuncPtr->PacketProcessEnd = halPacketProcessEnd;
-+
-+ /* Now, AAL5 must connect to the CPSAR layer */
-+
-+ /* Attach to SAR HAL Functions */
-+ /*
-+ cpsarInitModule(NULL, NULL, 0, NULL, &SarFuncSize, Inst);
-+
-+ if (SarFuncSize!=sizeof(CPSAR_FUNCTIONS))
-+ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_CPSAR_VERSION_NOT_SUPPORTED);
-+
-+ HalPtr->SarFunc = (CPSAR_FUNCTIONS *) OsFunc->Malloc(SarFuncSize);
-+ */
-+
-+ rc = cpsarInitModule(&HalPtr->SarDev, OsDev, &HalPtr->SarFunc, OsFunc, sizeof(OS_FUNCTIONS), &SarFuncSize, Inst);
-+
-+ /* pass back the error value from the CPSAR layer if necessary */
-+ if (rc)
-+ return(rc);
-+
-+ /*
-+ if (!HalPtr->SarDev)
-+ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_NULL_CPSAR_DEV);
-+ */
-+
-+ /* Initialize the hardware state */
-+ HalPtr->State = enConnected;
-+
-+ /* keep a reference to HalFuncPtr so I can free it later */
-+ HalPtr->HalFuncPtr = HalFuncPtr;
-+
-+ /* pass the HalPtr back to the caller */
-+ *HalDev = HalPtr;
-+ *HalFunc = HalFuncPtr;
-+
-+ return(EC_NO_ERRORS);
-+ }
-diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.h linux.dev/drivers/atm/sangam_atm/aal5sar.h
---- linux.old/drivers/atm/sangam_atm/aal5sar.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/aal5sar.h 2005-07-10 08:02:01.421114856 +0200
-@@ -0,0 +1,198 @@
-+/**@file************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: aal5sar.h
-+ *
-+ * DESCRIPTION:
-+ * This file contains data structure definitions for the AAL5 HAL SAR.
-+ *
-+ * HISTORY:
-+ * 28Feb02 Greg 1.00 Original Version created.
-+ * 06Mar02 Greg 1.01 Documented structures.
-+ * 18Jul02 Greg 1.02 Major reorganization
-+ *
-+ *****************************************************************************/
-+#ifndef _INC_AAL5SAR
-+#define _INC_AAL5SAR
-+
-+/** \namespace AAL5_Version
-+This documents version 01.06.06 of the AAL5 CPHAL.
-+*/
-+const char *pszVersion_CPAAL5="CPAAL5 01.06.06 "__DATE__" "__TIME__;
-+
-+#include "cpsar_cpaal5.h"
-+
-+#define NUM_AAL5_CHAN 16
-+#define MAX_AAL5_CHAN 15
-+#define MAX_QUEUE 2
-+#define MAX_DIRECTION 2
-+
-+#define PKT_TYPE_AAL5 0 /* +GSG 030508 */
-+#define PKT_TYPE_NULL 1 /* +GSG 030508 */
-+#define PKT_TYPE_OAM 2 /* +GSG 030508 */
-+#define PKT_TYPE_TRANS 3 /* +GSG 030508 */
-+#define ATM_HEADER_SIZE 4 /* +GSG 030508 */
-+
-+/*
-+ * HAL Default Parameter Values
-+ */
-+#define CFG_TX_NUM_BUFS {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
-+#define CFG_RX_NUM_BUFS {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
-+#define CFG_RX_BUF_SIZE {1518,1518,1518,1518,1518,1518,1518,1518, 1518,1518,1518,1518,1518,1518,1518,1518}
-+#define CFG_RX_BUF_OFFSET {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_TX_NUM_QUEUES {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
-+#define CFG_CPCS_UU {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_DA_MASK {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_PRIORITY {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_PKT_TYPE {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_VCI {100,101,102,103,104,105,106,107, 108,109,110,111,112,113,114,115}
-+#define CFG_VPI {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_CELL_RATE {0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4, 0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4}
-+#define CFG_QOS_TYPE {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_MBS {8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8}
-+#define CFG_PCR {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
-+#define CFG_GFC {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_CLP {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_PTI {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
-+#define CFG_RX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
-+#define CFG_TX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
-+
-+static int cfg_tx_num_bufs[NUM_AAL5_CHAN] = CFG_TX_NUM_BUFS;
-+static int cfg_rx_num_bufs[NUM_AAL5_CHAN] = CFG_RX_NUM_BUFS;
-+static int cfg_rx_buf_size[NUM_AAL5_CHAN] = CFG_RX_BUF_SIZE;
-+static int cfg_rx_buf_offset[NUM_AAL5_CHAN] = CFG_RX_BUF_OFFSET;
-+static int cfg_tx_num_queues[NUM_AAL5_CHAN] = CFG_TX_NUM_QUEUES;
-+static bit32u cfg_cpcs_uu[NUM_AAL5_CHAN] = CFG_CPCS_UU;
-+static int cfg_da_mask[NUM_AAL5_CHAN] = CFG_DA_MASK;
-+static int cfg_priority[NUM_AAL5_CHAN] = CFG_PRIORITY;
-+static int cfg_pkt_type[NUM_AAL5_CHAN] = CFG_PKT_TYPE;
-+static int cfg_vci[NUM_AAL5_CHAN] = CFG_VCI;
-+static int cfg_vpi[NUM_AAL5_CHAN] = CFG_VPI;
-+static bit32u cfg_cell_rate[NUM_AAL5_CHAN] = CFG_CELL_RATE;
-+static int cfg_qos_type[NUM_AAL5_CHAN] = CFG_QOS_TYPE;
-+static int cfg_mbs[NUM_AAL5_CHAN] = CFG_MBS;
-+static int cfg_pcr[NUM_AAL5_CHAN] = CFG_PCR;
-+static int cfg_gfc[NUM_AAL5_CHAN] = CFG_GFC;
-+static int cfg_clp[NUM_AAL5_CHAN] = CFG_CLP;
-+static int cfg_pti[NUM_AAL5_CHAN] = CFG_PTI;
-+static int cfg_rx_max_service[NUM_AAL5_CHAN]= CFG_RX_MAX_SERVICE;
-+static int cfg_tx_max_service[NUM_AAL5_CHAN]= CFG_TX_MAX_SERVICE;
-+static char *channel_names[] = CHANNEL_NAMES;
-+
-+/*
-+ * The HAL_FUNCTIONS struct defines the function pointers for all HAL functions
-+ * accessible to upper layer software. It is populated by calling
-+ * halInitModules().
-+ *
-+ * Note that this list is still under definition.
-+ */
-+
-+/*
-+ * This is the data structure for a transmit buffer descriptor. The first
-+ * four 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
-+ * words. The other words are SAR/HAL implementation specific.
-+ */
-+typedef struct
-+ {
-+ bit32 HNext; /**< Hardware's pointer to next buffer descriptor */
-+ bit32 BufPtr; /**< Pointer to the data buffer */
-+ bit32 Off_BLen; /**< Contains buffer offset and buffer length */
-+ bit32 mode; /**< SOP, EOP, Ownership, EOQ, Teardown Complete bits */
-+ bit32 AtmHeader; /**< Atm Header to be used for each fragment */
-+ bit32 Word5; /**< General control information for the packet */
-+ bit32 Res6;
-+ bit32 Res7;
-+ void *Next;
-+ void *OsInfo;
-+#ifdef __CPHAL_DEBUG
-+ bit32 DbgSop;
-+ bit32 DbgData;
-+ bit32 DbgFraglist;
-+#endif
-+ void *Eop;
-+ }HAL_TCB;
-+
-+/*
-+ * This is the data structure for a receive buffer descriptor. The first
-+ * six 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
-+ * words. The other words are HAL implementation specific.
-+ */
-+typedef volatile struct hal_private
-+ {
-+ bit32 HNext; /**< Hardware's pointer to next buffer descriptor */
-+ bit32 BufPtr; /**< Pointer to the data buffer */
-+ bit32 Off_BLen; /**< Contains buffer offset and buffer length */
-+ bit32 mode; /**< SOP, EOP, Ownership, EOQ, Teardown, Q Starv, Length */
-+ bit32 AtmHeader;
-+ bit32 UuCpi;
-+ bit32 Res6;
-+ bit32 Res7;
-+ void *DatPtr;
-+ void *Next;
-+ void *OsInfo;
-+ void *Eop;
-+ bit32 FragCount;
-+ bit32 Ch;
-+ HAL_DEVICE *HalDev;
-+ }HAL_RCB;
-+
-+
-+#define MAX_NEEDS 512 /*MJH+030409*/
-+/*
-+ * This is the data structure for a generic HAL device. It contains all device
-+ * specific data for a single instance of that device. This includes Rx/Tx
-+ * buffer queues, device base address, reset bit, and other information.
-+ */
-+typedef struct hal_device
-+ {
-+ HAL_RCB *RcbPool[NUM_AAL5_CHAN];
-+ bit32u rxbufseq;
-+ bit32 RxActQueueCount[NUM_AAL5_CHAN];
-+ HAL_RCB *RxActQueueHead[NUM_AAL5_CHAN];
-+ HAL_RCB *RxActQueueTail[NUM_AAL5_CHAN];
-+ bit32 RxActive[NUM_AAL5_CHAN];
-+ bit32 dev_base;
-+ HAL_TCB *TcbPool[NUM_AAL5_CHAN][MAX_QUEUE];
-+ bit32 offset;
-+ bit32 TxActQueueCount[NUM_AAL5_CHAN][MAX_QUEUE];
-+ HAL_TCB *TxActQueueHead[NUM_AAL5_CHAN][MAX_QUEUE];
-+ HAL_TCB *TxActQueueTail[NUM_AAL5_CHAN][MAX_QUEUE];
-+ bit32 TxActive[NUM_AAL5_CHAN][MAX_QUEUE];
-+ bit32 TxTeardownPending[NUM_AAL5_CHAN];
-+ bit32 RxTeardownPending[NUM_AAL5_CHAN];
-+ bit32 ChIsOpen[NUM_AAL5_CHAN][MAX_DIRECTION];
-+ bit32 ChIsSetup[NUM_AAL5_CHAN][MAX_DIRECTION];
-+ bit32 interrupt;
-+ bit32 debug;
-+ OS_DEVICE *OsDev;
-+ OS_FUNCTIONS *OsFunc;
-+ CPSAR_FUNCTIONS *SarFunc;
-+ CPSAR_DEVICE *SarDev;
-+ /*void *OsOpen;*/
-+ /*FRAGLIST fraglist[MAX_FRAG];*/
-+ FRAGLIST *fraglist;
-+ char *TcbStart[NUM_AAL5_CHAN][MAX_QUEUE];
-+ char *RcbStart[NUM_AAL5_CHAN];
-+ /*bit32 RcbSize[NUM_AAL5_CHAN];*/
-+ bit32 InRxInt[NUM_AAL5_CHAN];
-+ STAT_INFO Stats;
-+ bit32 Inst;
-+ bit32u DeviceCPID[4];
-+ bit32u LBSourceLLID[4];
-+ CHANNEL_INFO ChData[NUM_AAL5_CHAN];
-+ DEVICE_STATE State;
-+ char *DeviceInfo;
-+ HAL_FUNCTIONS *HalFuncPtr;
-+ int NextRxCh;
-+ int NextTxCh[2];
-+ int StrictPriority; /* +GSG 030304 */
-+ bit32u NeedsCount; /*MJH+030409*/
-+ HAL_RECEIVEINFO *Needs[MAX_NEEDS]; /*MJH+030409*/
-+ bit32u SarFrequency; /* +GSG 030416 */
-+ int MaxFrags;
-+ bit32u TurboDslErrors;
-+ bit32u OamLbTimeout;
-+ }HALDEVICE;
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c
---- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c 2005-07-10 08:02:01.422114704 +0200
-@@ -0,0 +1,728 @@
-+#ifndef _INC_CPCOMMON_C
-+#define _INC_CPCOMMON_C
-+
-+#ifdef _CPHAL_CPMAC
-+#include "cpremap_cpmac.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "cpremap_cpaal5.c"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "cpremap_cpsar.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "cpremap_cpaal2.c"
-+#endif
-+
-+/**
-+@defgroup Common_Config_Params Common Configuration Parameters
-+
-+This section documents the configuration parameters that are valid across
-+all CPHAL devices.
-+@{
-+*/
-+/** This is the debug level. The field is bit defined, such that the user
-+should set to 1 all the bits corresponding to desired debug outputs. The following
-+are the meanings for each debug bit:
-+- bit0 (LSB): CPHAL Function Trace
-+- b1 : OS Function call trace
-+- b2 : Critical section entry/exit
-+- b3 : Memory allocation/destruction
-+- b4 : Detailed information in Rx path
-+- b5 : Detailed information in Tx path
-+- b6 : Extended error information
-+- b7 : General info
-+*/
-+static const char pszDebug[] = "debug";
-+/** CPU Frequency. */
-+/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
-+/** Base address for the module. */
-+static const char pszBase[] = "base";
-+/** Reset bit for the module. */
-+static const char pszResetBit[] = "reset_bit";
-+/** Reset base address for the module. */
-+static const char pszResetBase[] = "ResetBase";
-+/** Interrupt line for the module. */
-+static const char pszIntLine[] = "int_line";
-+/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
-+static const char pszOffset[] = "offset";
-+/** The OS may "Get" this parameter, which is a pointer
-+ to a character string that indicates the version of CPHAL. */
-+static const char pszVer[] = "Version";
-+/*@}*/
-+
-+/**
-+@defgroup Common_Control_Params Common Keys for [os]Control()
-+
-+This section documents the keys used with the OS @c Control() interface that
-+are required by CPHAL devices.
-+
-+@{
-+*/
-+/** Used to wait for an integer number of clock ticks, given as an integer
-+ pointer in the @p Value parameter. No actions are defined. */
-+static const char pszSleep[] = "Sleep";
-+/** Requests the OS to flush it's IO buffers. No actions are defined. */
-+static const char pszSioFlush[] = "SioFlush";
-+/*@}*/
-+
-+static const char pszStateChange[] = "StateChange";
-+static const char pszStatus[] = "Status";
-+
-+static const char pszGET[] = "Get";
-+static const char pszSET[] = "Set";
-+static const char pszCLEAR[] = "Clear";
-+static const char pszNULL[] = "";
-+static const char pszLocator[] = "Locator";
-+static const char pszOff[] = "Off";
-+static const char pszOn[] = "On";
-+static const char hcMaxFrags[] = "MaxFrags";
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/* New method for string constants */
-+const char hcClear[] = "Clear";
-+const char hcGet[] = "Get";
-+const char hcSet[] = "Set";
-+
-+const char hcTick[] = "Tick";
-+
-+static const CONTROL_KEY KeyCommon[] =
-+ {
-+ {"" , enCommonStart},
-+ {pszStatus , enStatus},
-+ {pszOff , enOff},
-+ {pszOn , enOn},
-+ {pszDebug , enDebug},
-+ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
-+ {"" , enCommonEnd}
-+ };
-+#endif
-+
-+/**
-+@defgroup Common_Statistics Statistics
-+
-+A broad array of module statistics is available. Statistics values are accessed
-+through the @c Control() interface of the CPHAL. There are 5 different levels
-+of statistics, each of which correspond to a unique set of data. Furthermore,
-+certain statistics data is indexed by using a channel number and Tx queue number.
-+The following is a brief description of each statistics level, along with the
-+indexes used for the level:
-+
-+- Level 0: Hardware Statistics (index with channel)
-+- Level 1: CPHAL Software Statistics (channel, queue)
-+- Level 2: CPHAL Flags (channel, queue)
-+- Level 3: CPHAL Channel Configuration (channel)
-+- Level 4: CPHAL General Configuration (no index)
-+
-+The caller requests statistics information by providing a Key string to the
-+@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
-+The only valid Action parameter for statistics usage is "Get".
-+
-+Code Examples:
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# Get Level 2 stats for Channel 0, Queue 0
-+HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
-+
-+# Get Level 4 stats
-+HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
-+@endcode
-+
-+The information returned in the Value parameter of @c Control() is an
-+array of pointers to strings. The pointers are arranged in pairs.
-+The first pointer is a pointer to a name string for a particular statistic.
-+The next pointer is a pointer to a string containing the representation of
-+the integer statistic value corresponding to the first pointer. This is followed
-+by another pair of pointers, and so on, until a NULL pointer is encountered. The
-+following is example code for processing the statistics data. Note that the OS
-+is responsible for freeing the memory passed back through the Value parameter of
-+@c Control().
-+
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# output Statistics data
-+PrintStats(StatsData);
-+
-+# the upper layer is responsible for freeing stats info
-+free(&StatsPtr);
-+
-+...
-+
-+void PrintStats(unsigned int *StatsPtr)
-+ {
-+ while(*StatsPtr)
-+ {
-+ printf("%20s:", (char *)*StatsPtr);
-+ StatsPtr++;
-+ printf("%11s\n", (char *)*StatsPtr);
-+ StatsPtr++;
-+ }
-+ MySioFlush();
-+ }
-+@endcode
-+
-+Within each statistics level, there are several statistics defined. The statistics that
-+are common to every CPPI module are listed below. In addition, each module may define
-+extra statistics in each level, which will be documented within the module-specific
-+documentation appendices.
-+
-+- Level 0 Statistics
-+ - All level 0 statistics are module-specific.
-+- Level 1 Statistics (CPHAL Software Statistics)
-+ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
-+ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
-+transmitting the previous last packet in the queue (per channel and queue).
-+ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
-+reception of the previous last packet in the queue (per channel).
-+ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
-+ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
-+ - RxPacketsServiced: Number of received packets (per channel).
-+ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
-+ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
-+ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
-+ - RxTotal: Total number of received packets, all channels.
-+ - TxTotal: Total number of transmitted packets, all channels and queues.
-+- Level 2 Statistics (CPHAL Flags)
-+ - RcbPool: Pointer to receive descriptor pool (per channel).
-+ - RxActQueueCount: Number of buffers currently available for receive (per channel).
-+ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
-+ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
-+ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
-+ - RcbStart: Pointer to block of receive descriptors.
-+ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
-+ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
-+ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
-+ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
-+ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
-+ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
-+ - TcbStart: Pointer to block of transmit descriptors.
-+ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
-+- Level 3 Statistics (CPHAL Channel Configuration)
-+ - RxBufSize: Rx buffer size.
-+ - RxBufferOffset: Rx buffer offset.
-+ - RxNumBuffers: Number of Rx buffers.
-+ - RxServiceMax: Maximum number of receive packets to service at a time.
-+ - TxNumBuffers: Number of Tx buffer descriptors.
-+ - TxNumQueues: Number of Tx queues to use.
-+ - TxServiceMax: Maximum number of transmit packets to service at a time.
-+- Level 4 Statistics (CPHAL General Configuration)
-+ - Base Address: Base address of the module.
-+ - Offset (VLYNQ): VLYNQ relative module offset.
-+ - Interrupt Line: Interrupt number.
-+ - Debug: Debug flag, 1 to enable debug.
-+ - Inst: Instance number.
-+*/
-+
-+/*
-+ Data Type 0 = int display
-+ Data Type 1 = hex display
-+ Data Type 2 = channel structure, int display
-+ Data Type 3 = queue index and int display
-+ Data Type 4 = queue index and hex display
-+*/
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
-+static STATS_TABLE StatsTable0[] =
-+ {
-+#ifdef _CPHAL_AAL5
-+ /* Name , Data Ptr, Data Type */
-+ {"Crc Errors", 0, 0},
-+ {"Len Errors", 0, 0},
-+ {"Abort Errors", 0, 0},
-+ {"Starv Errors", 0, 0}
-+#endif
-+#ifdef _CPHAL_CPMAC
-+ {"Rx Good Frames", 0, 0}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable1[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"DmaLenErrors", 0, 0},
-+ {"TxMisQCnt", 0, 3},
-+ {"RxMisQCnt", 0, 0},
-+ {"TxEOQCnt", 0, 3},
-+ {"RxEOQCnt", 0, 0},
-+ {"RxPacketsServiced", 0, 0},
-+ {"TxPacketsServiced", 0, 3},
-+ {"RxMaxServiced", 0, 0},
-+ {"TxMaxServiced", 0, 3},
-+ {"RxTotal", 0, 0},
-+ {"TxTotal", 0, 0},
-+ };
-+
-+static STATS_TABLE StatsTable2[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RcbPool", 0, 1},
-+ {"RxActQueueCount", 0, 0},
-+ {"RxActQueueHead", 0, 1},
-+ {"RxActQueueTail", 0, 1},
-+ {"RxActive", 0, 0},
-+ {"RcbStart", 0, 1},
-+ {"RxTeardownPending", 0, 0},
-+ {"TcbPool", 0, 4},
-+ {"TxActQueueCount", 0, 3},
-+ {"TxActQueueHead", 0, 4},
-+ {"TxActQueueTail", 0, 4},
-+ {"TxActive", 0, 3},
-+ {"TcbStart", 0, 4},
-+ {"TxTeardownPending", 0, 0}
-+ };
-+
-+static STATS_TABLE StatsTable3[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RxBufSize", 0, 2},
-+ {"RxBufferOffset", 0, 2},
-+ {"RxNumBuffers", 0, 2},
-+ {"RxServiceMax", 0, 2},
-+ {"TxNumBuffers", 0, 2},
-+ {"TxNumQueues", 0, 2},
-+ {"TxServiceMax", 0, 2},
-+#ifdef _CPHAL_AAL5
-+ {"CpcsUU", 0, 2},
-+ {"Gfc", 0, 2},
-+ {"Clp", 0, 2},
-+ {"Pti", 0, 2},
-+ {"DaMask", 0, 2},
-+ {"Priority", 0, 2},
-+ {"PktType", 0, 2},
-+ {"Vci", 0, 2},
-+ {"Vpi", 0, 2},
-+ {"CellRate", 0, 2},
-+ {"QosType", 0, 2},
-+ {"Mbs", 0, 2},
-+ {"Pcr", 0, 2}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable4[] =
-+ {
-+ {"Base Address", 0, 1},
-+ {"Offset (VLYNQ)", 0, 0},
-+ {"Interrupt Line", 0, 0},
-+ {"Debug", 0, 0},
-+ {"Instance", 0, 0},
-+#ifdef _CPHAL_AAL5
-+ {"UniNni", 0, 0}
-+#endif
-+ };
-+
-+static STATS_DB StatsDb[] =
-+ {
-+ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
-+ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
-+ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
-+ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
-+ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
-+ };
-+#endif /* +GSG 030307 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void resetWait(HAL_DEVICE *HalDev)
-+ { /*+RC3.02*/
-+ const int TickReset=64;
-+ osfuncSleep((int*)&TickReset);
-+ } /*+RC3.02*/
-+#endif /* +RC 3.02 */
-+
-+/* I only define the reset base function for the modules
-+ that can perform a reset. The AAL5 and AAL2 modules
-+ do not perform a reset, that is done by the shared module
-+ CPSAR */
-+#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
-+/*
-+ * Determines the reset register address to be used for a particular device.
-+ * It will search the current device entry for Locator information. If the
-+ * device is a root device, there will be no Locator information, and the
-+ * function will find and return the root reset register. If a Locator value
-+ * is found, the function will search each VLYNQ device entry in the system
-+ * looking for a matching Locator. Once it finds a VLYNQ device entry with
-+ * a matching Locator, it will extract the "ResetBase" parameter from that
-+ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param ResetBase Pointer to integer address of reset register.
-+ *
-+ * @return 0 OK, Non-zero not OK
-+ */
-+static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
-+ {
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+ char *MyLocator, *NextLocator;
-+ int Inst=1;
-+ bit32u error_code;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
-+ if (error_code)
-+ {
-+ /* if no Locator value, device is on the root, so get the "reset" device */
-+ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
-+ if (error_code)
-+ {
-+ return(EC_VAL_DEVICE_NOT_FOUND);
-+ }
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ /* we have a Locator value, so the device is remote */
-+
-+ /* Find a vlynq device with a matching locator value */
-+ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
-+ if (error_code)
-+ {
-+ /* no Locator value for this VLYNQ, so move on */
-+ continue;
-+ }
-+ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
-+ {
-+ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ Inst++;
-+ } /* while */
-+ } /* else */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif
-+
-+#ifndef _CPHAL_AAL2 /* + RC 3.02 */
-+static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
-+ {
-+ bit32u ParmValue;
-+ bit32 error_code;
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
-+
-+#ifndef _CPHAL_AAL5
-+#ifndef _CPHAL_AAL2
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
-+ if(error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
-+ }
-+ HalDev->ResetBit = ParmValue;
-+
-+ /* Get reset base address */
-+ error_code = ResetBaseGet(HalDev, &ParmValue);
-+ if (error_code)
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
-+ HalDev->ResetBase = ParmValue;
-+#endif
-+#endif
-+
-+#ifndef _CPHAL_CPSAR
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
-+ }
-+ HalDev->interrupt = ParmValue;
-+#endif
-+
-+ /* only look for the offset if there is a Locator field, which indicates that
-+ the module is a VLYNQ module */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
-+ if (!error_code)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
-+ }
-+ HalDev->offset = ParmValue;
-+ }
-+ else
-+ HalDev->offset = 0;
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
-+ if (!error_code) HalDev->debug = ParmValue;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
-+ {
-+ /* even though these statistics may be for multiple channels and
-+ queues, i need only configure the pointer to the beginning
-+ of the array, and I can index from there if necessary */
-+
-+#ifdef _CPHAL_AAL5
-+ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
-+ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
-+ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
-+ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
-+
-+ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
-+ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
-+ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
-+ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
-+ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
-+ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
-+ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
-+ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
-+ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
-+ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
-+ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
-+#endif
-+
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
-+ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
-+ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
-+ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
-+ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
-+ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
-+ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
-+ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
-+ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
-+ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
-+ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
-+ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
-+ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
-+ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
-+ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
-+
-+ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
-+ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
-+ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
-+ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
-+ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
-+ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
-+ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
-+#ifdef _CPHAL_AAL5
-+ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
-+ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
-+ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
-+ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
-+ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
-+ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
-+ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
-+ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
-+ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
-+ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
-+ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
-+ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
-+ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
-+#endif
-+#endif
-+
-+ StatsTable4[0].StatPtr = &HalDev->dev_base;
-+ StatsTable4[1].StatPtr = &HalDev->offset;
-+ StatsTable4[2].StatPtr = &HalDev->interrupt;
-+ StatsTable4[3].StatPtr = &HalDev->debug;
-+ StatsTable4[4].StatPtr = &HalDev->Inst;
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifndef _CPHAL_CPSAR /* +RC 3.02 */
-+#ifndef _CPHAL_AAL2 /* +RC 3.02 */
-+/*
-+ * Returns statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0
-+ */
-+static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
-+ {
-+ int Size;
-+ bit32u *AddrPtr;
-+ char *DataPtr;
-+ STATS_TABLE *StatsTable;
-+ int i, NumberOfStats;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
-+ (bit32u)HalDev, (bit32u)StatPtr);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ StatsTable = StatsDb[Index].StatTable;
-+ NumberOfStats = StatsDb[Index].NumberOfStats;
-+
-+ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
-+ Size += (NumberOfStats*11);
-+ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
-+
-+ AddrPtr = (bit32u *) *StatPtr;
-+ DataPtr = (char *)AddrPtr;
-+ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
-+
-+ for (i=0; i<NumberOfStats; i++)
-+ {
-+ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
-+ *AddrPtr++ = (bit32u)DataPtr;
-+ if (&StatsTable[i].StatPtr[Ch] != 0)
-+ {
-+ switch(StatsTable[i].DataType)
-+ {
-+ case 0:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 1:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 2:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
-+ break;
-+ case 3:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ case 4:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ default:
-+ /* invalid data type, due to CPHAL programming error */
-+ break;
-+ }
-+ }
-+ else
-+ {
-+ /* invalid statistics pointer, probably was not initialized */
-+ }
-+ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
-+ }
-+
-+ *AddrPtr = (bit32u) 0;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC
-+static void gpioFunctional(int base, int bit)
-+ { /*+RC3.02*/
-+ bit32u GpioEnr = base + 0xC;
-+ /* To make functional, set to zero */
-+ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
-+ } /*+RC3.02*/
-+
-+
-+/*+RC3.02*/
-+/* Common function, Checks to see if GPIO should be in functional mode */
-+static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
-+ { /*+RC3.02*/
-+ int rc;
-+ void *DeviceInfo;
-+ char *pszMuxBits;
-+ char pszMuxBit[20];
-+ char *pszTmp;
-+ char szMuxBit[20];
-+ char *ptr;
-+ int base;
-+ int reset_bit;
-+ int bit;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
-+ if(rc) return;
-+ /* gpio entry found, get GPIO register info and make functional */
-+
-+ /* temp copy until FinParmValue fixed */
-+ ptr = &szMuxBit[0];
-+ while ((*ptr++ = *pszTmp++));
-+
-+ pszMuxBits = &szMuxBit[0];
-+
-+ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
-+ if(rc) return;
-+
-+ /* If GPIO still in reset, then exit */
-+ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
-+ return;
-+ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
-+ while (*pszMuxBits)
-+ {
-+ pszTmp = &pszMuxBit[0];
-+ if(*pszMuxBits == ';') pszMuxBits++;
-+ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
-+ {
-+ osfuncSioFlush();
-+ /*If value not a number, skip */
-+ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
-+ pszMuxBits++;
-+ else
-+ *pszTmp++ = *pszMuxBits++;
-+ }
-+ *pszTmp = '\0';
-+ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
-+ gpioFunctional(base, bit);
-+ resetWait(HalDev); /* not sure if this is needed */
-+ }
-+ } /*+RC3.02*/
-+#endif /* CPMAC */
-+
-+#ifdef _CPHAL_AAL5
-+const char hcSarFrequency[] = "SarFreq";
-+#endif
-+
-+#endif /* _INC */
-diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h
---- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h 2005-07-10 08:02:01.422114704 +0200
-@@ -0,0 +1,79 @@
-+#ifndef _INC_CPCOMMON_H
-+#define _INC_CPCOMMON_H
-+
-+#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
-+#ifndef dbgPrintf
-+#define dbgPrintf HalDev->OsFunc->Printf
-+#endif
-+
-+#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
-+
-+#define DBG(level) (HalDev->debug & (1<<(level)))
-+/*
-+#define DBG0() DBG(0)
-+#define DBG1() DBG(1)
-+#define DBG2() DBG(2)
-+#define DBG3() DBG(3)
-+#define DBG4() DBG(4)
-+#define DBG5() DBG(5)
-+#define DBG6() DBG(6)
-+#define DBG7() DBG(7)
-+*/
-+
-+/*
-+ * List of defined actions for use with Control().
-+ */
-+typedef enum
-+ {
-+ enGET=0, /**< Get the value associated with a key */
-+ enSET, /**< Set the value associates with a key */
-+ enCLEAR, /**<Clear the value */
-+ enNULL /**< No data action, used to initiate a service or send a message */
-+ }ACTION;
-+
-+/*
-+ * Enumerated hardware states.
-+ */
-+typedef enum
-+ {
-+ enConnected=1, enDevFound, enInitialized, enOpened
-+ }DEVICE_STATE;
-+
-+typedef enum
-+ {
-+ enCommonStart=0,
-+ /* General */
-+ enOff, enOn, enDebug,
-+ /* Module General */
-+ enCpuFreq,
-+ enStatus,
-+ enCommonEnd
-+ }COMMON_KEY;
-+
-+typedef struct
-+ {
-+ const char *strKey;
-+ int enKey;
-+ }CONTROL_KEY;
-+
-+typedef struct
-+ {
-+ char *StatName;
-+ unsigned int *StatPtr;
-+ int DataType; /* 0: int, 1: hex int, 2:channel data */
-+ }STATS_TABLE;
-+
-+typedef struct
-+ {
-+ int NumberOfStats;
-+ STATS_TABLE *StatTable;
-+ }STATS_DB;
-+
-+#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
-+#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
-+#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
-+
-+#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
-+
-+#endif
-+
-diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c
---- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c 2005-07-10 08:02:01.423114552 +0200
-@@ -0,0 +1,728 @@
-+#ifndef _INC_CPCOMMON_C
-+#define _INC_CPCOMMON_C
-+
-+#ifdef _CPHAL_CPMAC
-+#include "cpremap_cpmac.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "cpremap_cpaal5.c"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "cpremap_cpsar.c"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "cpremap_cpaal2.c"
-+#endif
-+
-+/**
-+@defgroup Common_Config_Params Common Configuration Parameters
-+
-+This section documents the configuration parameters that are valid across
-+all CPHAL devices.
-+@{
-+*/
-+/** This is the debug level. The field is bit defined, such that the user
-+should set to 1 all the bits corresponding to desired debug outputs. The following
-+are the meanings for each debug bit:
-+- bit0 (LSB): CPHAL Function Trace
-+- b1 : OS Function call trace
-+- b2 : Critical section entry/exit
-+- b3 : Memory allocation/destruction
-+- b4 : Detailed information in Rx path
-+- b5 : Detailed information in Tx path
-+- b6 : Extended error information
-+- b7 : General info
-+*/
-+static const char pszDebug[] = "debug";
-+/** CPU Frequency. */
-+/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
-+/** Base address for the module. */
-+static const char pszBase[] = "base";
-+/** Reset bit for the module. */
-+static const char pszResetBit[] = "reset_bit";
-+/** Reset base address for the module. */
-+static const char pszResetBase[] = "ResetBase";
-+/** Interrupt line for the module. */
-+static const char pszIntLine[] = "int_line";
-+/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
-+static const char pszOffset[] = "offset";
-+/** The OS may "Get" this parameter, which is a pointer
-+ to a character string that indicates the version of CPHAL. */
-+static const char pszVer[] = "Version";
-+/*@}*/
-+
-+/**
-+@defgroup Common_Control_Params Common Keys for [os]Control()
-+
-+This section documents the keys used with the OS @c Control() interface that
-+are required by CPHAL devices.
-+
-+@{
-+*/
-+/** Used to wait for an integer number of clock ticks, given as an integer
-+ pointer in the @p Value parameter. No actions are defined. */
-+static const char pszSleep[] = "Sleep";
-+/** Requests the OS to flush it's IO buffers. No actions are defined. */
-+static const char pszSioFlush[] = "SioFlush";
-+/*@}*/
-+
-+static const char pszStateChange[] = "StateChange";
-+static const char pszStatus[] = "Status";
-+
-+static const char pszGET[] = "Get";
-+static const char pszSET[] = "Set";
-+static const char pszCLEAR[] = "Clear";
-+static const char pszNULL[] = "";
-+static const char pszLocator[] = "Locator";
-+static const char pszOff[] = "Off";
-+static const char pszOn[] = "On";
-+static const char hcMaxFrags[] = "MaxFrags";
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/* New method for string constants */
-+const char hcClear[] = "Clear";
-+const char hcGet[] = "Get";
-+const char hcSet[] = "Set";
-+
-+const char hcTick[] = "Tick";
-+
-+static const CONTROL_KEY KeyCommon[] =
-+ {
-+ {"" , enCommonStart},
-+ {pszStatus , enStatus},
-+ {pszOff , enOff},
-+ {pszOn , enOn},
-+ {pszDebug , enDebug},
-+ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
-+ {"" , enCommonEnd}
-+ };
-+#endif
-+
-+/**
-+@defgroup Common_Statistics Statistics
-+
-+A broad array of module statistics is available. Statistics values are accessed
-+through the @c Control() interface of the CPHAL. There are 5 different levels
-+of statistics, each of which correspond to a unique set of data. Furthermore,
-+certain statistics data is indexed by using a channel number and Tx queue number.
-+The following is a brief description of each statistics level, along with the
-+indexes used for the level:
-+
-+- Level 0: Hardware Statistics (index with channel)
-+- Level 1: CPHAL Software Statistics (channel, queue)
-+- Level 2: CPHAL Flags (channel, queue)
-+- Level 3: CPHAL Channel Configuration (channel)
-+- Level 4: CPHAL General Configuration (no index)
-+
-+The caller requests statistics information by providing a Key string to the
-+@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
-+The only valid Action parameter for statistics usage is "Get".
-+
-+Code Examples:
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# Get Level 2 stats for Channel 0, Queue 0
-+HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
-+
-+# Get Level 4 stats
-+HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
-+@endcode
-+
-+The information returned in the Value parameter of @c Control() is an
-+array of pointers to strings. The pointers are arranged in pairs.
-+The first pointer is a pointer to a name string for a particular statistic.
-+The next pointer is a pointer to a string containing the representation of
-+the integer statistic value corresponding to the first pointer. This is followed
-+by another pair of pointers, and so on, until a NULL pointer is encountered. The
-+following is example code for processing the statistics data. Note that the OS
-+is responsible for freeing the memory passed back through the Value parameter of
-+@c Control().
-+
-+@code
-+unsigned int *StatsData;
-+
-+# Get Level 0 stats for Channel 1
-+HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
-+
-+# output Statistics data
-+PrintStats(StatsData);
-+
-+# the upper layer is responsible for freeing stats info
-+free(&StatsPtr);
-+
-+...
-+
-+void PrintStats(unsigned int *StatsPtr)
-+ {
-+ while(*StatsPtr)
-+ {
-+ printf("%20s:", (char *)*StatsPtr);
-+ StatsPtr++;
-+ printf("%11s\n", (char *)*StatsPtr);
-+ StatsPtr++;
-+ }
-+ MySioFlush();
-+ }
-+@endcode
-+
-+Within each statistics level, there are several statistics defined. The statistics that
-+are common to every CPPI module are listed below. In addition, each module may define
-+extra statistics in each level, which will be documented within the module-specific
-+documentation appendices.
-+
-+- Level 0 Statistics
-+ - All level 0 statistics are module-specific.
-+- Level 1 Statistics (CPHAL Software Statistics)
-+ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
-+ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
-+transmitting the previous last packet in the queue (per channel and queue).
-+ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
-+reception of the previous last packet in the queue (per channel).
-+ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
-+ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
-+ - RxPacketsServiced: Number of received packets (per channel).
-+ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
-+ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
-+ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
-+ - RxTotal: Total number of received packets, all channels.
-+ - TxTotal: Total number of transmitted packets, all channels and queues.
-+- Level 2 Statistics (CPHAL Flags)
-+ - RcbPool: Pointer to receive descriptor pool (per channel).
-+ - RxActQueueCount: Number of buffers currently available for receive (per channel).
-+ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
-+ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
-+ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
-+ - RcbStart: Pointer to block of receive descriptors.
-+ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
-+ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
-+ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
-+ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
-+ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
-+ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
-+ - TcbStart: Pointer to block of transmit descriptors.
-+ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
-+- Level 3 Statistics (CPHAL Channel Configuration)
-+ - RxBufSize: Rx buffer size.
-+ - RxBufferOffset: Rx buffer offset.
-+ - RxNumBuffers: Number of Rx buffers.
-+ - RxServiceMax: Maximum number of receive packets to service at a time.
-+ - TxNumBuffers: Number of Tx buffer descriptors.
-+ - TxNumQueues: Number of Tx queues to use.
-+ - TxServiceMax: Maximum number of transmit packets to service at a time.
-+- Level 4 Statistics (CPHAL General Configuration)
-+ - Base Address: Base address of the module.
-+ - Offset (VLYNQ): VLYNQ relative module offset.
-+ - Interrupt Line: Interrupt number.
-+ - Debug: Debug flag, 1 to enable debug.
-+ - Inst: Instance number.
-+*/
-+
-+/*
-+ Data Type 0 = int display
-+ Data Type 1 = hex display
-+ Data Type 2 = channel structure, int display
-+ Data Type 3 = queue index and int display
-+ Data Type 4 = queue index and hex display
-+*/
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
-+static STATS_TABLE StatsTable0[] =
-+ {
-+#ifdef _CPHAL_AAL5
-+ /* Name , Data Ptr, Data Type */
-+ {"Crc Errors", 0, 0},
-+ {"Len Errors", 0, 0},
-+ {"Abort Errors", 0, 0},
-+ {"Starv Errors", 0, 0}
-+#endif
-+#ifdef _CPHAL_CPMAC
-+ {"Rx Good Frames", 0, 0}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable1[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"DmaLenErrors", 0, 0},
-+ {"TxMisQCnt", 0, 3},
-+ {"RxMisQCnt", 0, 0},
-+ {"TxEOQCnt", 0, 3},
-+ {"RxEOQCnt", 0, 0},
-+ {"RxPacketsServiced", 0, 0},
-+ {"TxPacketsServiced", 0, 3},
-+ {"RxMaxServiced", 0, 0},
-+ {"TxMaxServiced", 0, 3},
-+ {"RxTotal", 0, 0},
-+ {"TxTotal", 0, 0},
-+ };
-+
-+static STATS_TABLE StatsTable2[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RcbPool", 0, 1},
-+ {"RxActQueueCount", 0, 0},
-+ {"RxActQueueHead", 0, 1},
-+ {"RxActQueueTail", 0, 1},
-+ {"RxActive", 0, 0},
-+ {"RcbStart", 0, 1},
-+ {"RxTeardownPending", 0, 0},
-+ {"TcbPool", 0, 4},
-+ {"TxActQueueCount", 0, 3},
-+ {"TxActQueueHead", 0, 4},
-+ {"TxActQueueTail", 0, 4},
-+ {"TxActive", 0, 3},
-+ {"TcbStart", 0, 4},
-+ {"TxTeardownPending", 0, 0}
-+ };
-+
-+static STATS_TABLE StatsTable3[] =
-+ {
-+ /* Name , Data Ptr, Data Type */
-+ {"RxBufSize", 0, 2},
-+ {"RxBufferOffset", 0, 2},
-+ {"RxNumBuffers", 0, 2},
-+ {"RxServiceMax", 0, 2},
-+ {"TxNumBuffers", 0, 2},
-+ {"TxNumQueues", 0, 2},
-+ {"TxServiceMax", 0, 2},
-+#ifdef _CPHAL_AAL5
-+ {"CpcsUU", 0, 2},
-+ {"Gfc", 0, 2},
-+ {"Clp", 0, 2},
-+ {"Pti", 0, 2},
-+ {"DaMask", 0, 2},
-+ {"Priority", 0, 2},
-+ {"PktType", 0, 2},
-+ {"Vci", 0, 2},
-+ {"Vpi", 0, 2},
-+ {"CellRate", 0, 2},
-+ {"QosType", 0, 2},
-+ {"Mbs", 0, 2},
-+ {"Pcr", 0, 2}
-+#endif
-+ };
-+
-+static STATS_TABLE StatsTable4[] =
-+ {
-+ {"Base Address", 0, 1},
-+ {"Offset (VLYNQ)", 0, 0},
-+ {"Interrupt Line", 0, 0},
-+ {"Debug", 0, 0},
-+ {"Instance", 0, 0},
-+#ifdef _CPHAL_AAL5
-+ {"UniNni", 0, 0}
-+#endif
-+ };
-+
-+static STATS_DB StatsDb[] =
-+ {
-+ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
-+ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
-+ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
-+ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
-+ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
-+ };
-+#endif /* +GSG 030307 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void resetWait(HAL_DEVICE *HalDev)
-+ { /*+RC3.02*/
-+ const int TickReset=64;
-+ osfuncSleep((int*)&TickReset);
-+ } /*+RC3.02*/
-+#endif /* +RC 3.02 */
-+
-+/* I only define the reset base function for the modules
-+ that can perform a reset. The AAL5 and AAL2 modules
-+ do not perform a reset, that is done by the shared module
-+ CPSAR */
-+#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
-+/*
-+ * Determines the reset register address to be used for a particular device.
-+ * It will search the current device entry for Locator information. If the
-+ * device is a root device, there will be no Locator information, and the
-+ * function will find and return the root reset register. If a Locator value
-+ * is found, the function will search each VLYNQ device entry in the system
-+ * looking for a matching Locator. Once it finds a VLYNQ device entry with
-+ * a matching Locator, it will extract the "ResetBase" parameter from that
-+ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param ResetBase Pointer to integer address of reset register.
-+ *
-+ * @return 0 OK, Non-zero not OK
-+ */
-+static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
-+ {
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+ char *MyLocator, *NextLocator;
-+ int Inst=1;
-+ bit32u error_code;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
-+ if (error_code)
-+ {
-+ /* if no Locator value, device is on the root, so get the "reset" device */
-+ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
-+ if (error_code)
-+ {
-+ return(EC_VAL_DEVICE_NOT_FOUND);
-+ }
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ /* we have a Locator value, so the device is remote */
-+
-+ /* Find a vlynq device with a matching locator value */
-+ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
-+ if (error_code)
-+ {
-+ /* no Locator value for this VLYNQ, so move on */
-+ continue;
-+ }
-+ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
-+ {
-+ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
-+ if (error_code)
-+ {
-+ return(EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
-+
-+ /* found base address for root device, so we're done */
-+ return (EC_NO_ERRORS);
-+ }
-+ Inst++;
-+ } /* while */
-+ } /* else */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif
-+
-+#ifndef _CPHAL_AAL2 /* + RC 3.02 */
-+static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
-+ {
-+ bit32u ParmValue;
-+ bit32 error_code;
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
-+ }
-+ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
-+
-+#ifndef _CPHAL_AAL5
-+#ifndef _CPHAL_AAL2
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
-+ if(error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
-+ }
-+ HalDev->ResetBit = ParmValue;
-+
-+ /* Get reset base address */
-+ error_code = ResetBaseGet(HalDev, &ParmValue);
-+ if (error_code)
-+ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
-+ HalDev->ResetBase = ParmValue;
-+#endif
-+#endif
-+
-+#ifndef _CPHAL_CPSAR
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
-+ }
-+ HalDev->interrupt = ParmValue;
-+#endif
-+
-+ /* only look for the offset if there is a Locator field, which indicates that
-+ the module is a VLYNQ module */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
-+ if (!error_code)
-+ {
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
-+ if (error_code)
-+ {
-+ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
-+ }
-+ HalDev->offset = ParmValue;
-+ }
-+ else
-+ HalDev->offset = 0;
-+
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
-+ if (!error_code) HalDev->debug = ParmValue;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC /* +RC 3.02 */
-+static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
-+ {
-+ /* even though these statistics may be for multiple channels and
-+ queues, i need only configure the pointer to the beginning
-+ of the array, and I can index from there if necessary */
-+
-+#ifdef _CPHAL_AAL5
-+ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
-+ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
-+ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
-+ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
-+
-+ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
-+ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
-+ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
-+ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
-+ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
-+ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
-+ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
-+ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
-+ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
-+ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
-+ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
-+#endif
-+
-+#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
-+ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
-+ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
-+ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
-+ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
-+ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
-+ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
-+ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
-+ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
-+ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
-+ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
-+ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
-+ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
-+ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
-+ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
-+
-+ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
-+ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
-+ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
-+ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
-+ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
-+ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
-+ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
-+#ifdef _CPHAL_AAL5
-+ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
-+ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
-+ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
-+ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
-+ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
-+ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
-+ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
-+ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
-+ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
-+ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
-+ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
-+ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
-+ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
-+#endif
-+#endif
-+
-+ StatsTable4[0].StatPtr = &HalDev->dev_base;
-+ StatsTable4[1].StatPtr = &HalDev->offset;
-+ StatsTable4[2].StatPtr = &HalDev->interrupt;
-+ StatsTable4[3].StatPtr = &HalDev->debug;
-+ StatsTable4[4].StatPtr = &HalDev->Inst;
-+ }
-+#endif /* +RC 3.02 */
-+
-+#ifndef _CPHAL_CPSAR /* +RC 3.02 */
-+#ifndef _CPHAL_AAL2 /* +RC 3.02 */
-+/*
-+ * Returns statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0
-+ */
-+static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
-+ {
-+ int Size;
-+ bit32u *AddrPtr;
-+ char *DataPtr;
-+ STATS_TABLE *StatsTable;
-+ int i, NumberOfStats;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
-+ (bit32u)HalDev, (bit32u)StatPtr);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ StatsTable = StatsDb[Index].StatTable;
-+ NumberOfStats = StatsDb[Index].NumberOfStats;
-+
-+ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
-+ Size += (NumberOfStats*11);
-+ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
-+
-+ AddrPtr = (bit32u *) *StatPtr;
-+ DataPtr = (char *)AddrPtr;
-+ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
-+
-+ for (i=0; i<NumberOfStats; i++)
-+ {
-+ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
-+ *AddrPtr++ = (bit32u)DataPtr;
-+ if (&StatsTable[i].StatPtr[Ch] != 0)
-+ {
-+ switch(StatsTable[i].DataType)
-+ {
-+ case 0:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 1:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
-+ break;
-+ case 2:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
-+ break;
-+ case 3:
-+ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ case 4:
-+ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
-+ break;
-+ default:
-+ /* invalid data type, due to CPHAL programming error */
-+ break;
-+ }
-+ }
-+ else
-+ {
-+ /* invalid statistics pointer, probably was not initialized */
-+ }
-+ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
-+ }
-+
-+ *AddrPtr = (bit32u) 0;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+#endif /* +RC 3.02 */
-+#endif /* +RC 3.02 */
-+
-+#ifdef _CPHAL_CPMAC
-+static void gpioFunctional(int base, int bit)
-+ { /*+RC3.02*/
-+ bit32u GpioEnr = base + 0xC;
-+ /* To make functional, set to zero */
-+ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
-+ } /*+RC3.02*/
-+
-+
-+/*+RC3.02*/
-+/* Common function, Checks to see if GPIO should be in functional mode */
-+static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
-+ { /*+RC3.02*/
-+ int rc;
-+ void *DeviceInfo;
-+ char *pszMuxBits;
-+ char pszMuxBit[20];
-+ char *pszTmp;
-+ char szMuxBit[20];
-+ char *ptr;
-+ int base;
-+ int reset_bit;
-+ int bit;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
-+ if(rc) return;
-+ /* gpio entry found, get GPIO register info and make functional */
-+
-+ /* temp copy until FinParmValue fixed */
-+ ptr = &szMuxBit[0];
-+ while ((*ptr++ = *pszTmp++));
-+
-+ pszMuxBits = &szMuxBit[0];
-+
-+ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
-+ if(rc) return;
-+
-+ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
-+ if(rc) return;
-+
-+ /* If GPIO still in reset, then exit */
-+ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
-+ return;
-+ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
-+ while (*pszMuxBits)
-+ {
-+ pszTmp = &pszMuxBit[0];
-+ if(*pszMuxBits == ';') pszMuxBits++;
-+ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
-+ {
-+ osfuncSioFlush();
-+ /*If value not a number, skip */
-+ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
-+ pszMuxBits++;
-+ else
-+ *pszTmp++ = *pszMuxBits++;
-+ }
-+ *pszTmp = '\0';
-+ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
-+ gpioFunctional(base, bit);
-+ resetWait(HalDev); /* not sure if this is needed */
-+ }
-+ } /*+RC3.02*/
-+#endif /* CPMAC */
-+
-+#ifdef _CPHAL_AAL5
-+const char hcSarFrequency[] = "SarFreq";
-+#endif
-+
-+#endif /* _INC */
-diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h
---- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h 2005-07-10 08:02:01.423114552 +0200
-@@ -0,0 +1,79 @@
-+#ifndef _INC_CPCOMMON_H
-+#define _INC_CPCOMMON_H
-+
-+#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
-+#ifndef dbgPrintf
-+#define dbgPrintf HalDev->OsFunc->Printf
-+#endif
-+
-+#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
-+
-+#define DBG(level) (HalDev->debug & (1<<(level)))
-+/*
-+#define DBG0() DBG(0)
-+#define DBG1() DBG(1)
-+#define DBG2() DBG(2)
-+#define DBG3() DBG(3)
-+#define DBG4() DBG(4)
-+#define DBG5() DBG(5)
-+#define DBG6() DBG(6)
-+#define DBG7() DBG(7)
-+*/
-+
-+/*
-+ * List of defined actions for use with Control().
-+ */
-+typedef enum
-+ {
-+ enGET=0, /**< Get the value associated with a key */
-+ enSET, /**< Set the value associates with a key */
-+ enCLEAR, /**<Clear the value */
-+ enNULL /**< No data action, used to initiate a service or send a message */
-+ }ACTION;
-+
-+/*
-+ * Enumerated hardware states.
-+ */
-+typedef enum
-+ {
-+ enConnected=1, enDevFound, enInitialized, enOpened
-+ }DEVICE_STATE;
-+
-+typedef enum
-+ {
-+ enCommonStart=0,
-+ /* General */
-+ enOff, enOn, enDebug,
-+ /* Module General */
-+ enCpuFreq,
-+ enStatus,
-+ enCommonEnd
-+ }COMMON_KEY;
-+
-+typedef struct
-+ {
-+ const char *strKey;
-+ int enKey;
-+ }CONTROL_KEY;
-+
-+typedef struct
-+ {
-+ char *StatName;
-+ unsigned int *StatPtr;
-+ int DataType; /* 0: int, 1: hex int, 2:channel data */
-+ }STATS_TABLE;
-+
-+typedef struct
-+ {
-+ int NumberOfStats;
-+ STATS_TABLE *StatTable;
-+ }STATS_DB;
-+
-+#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
-+#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
-+#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
-+
-+#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
-+
-+#endif
-+
-diff -urN linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c
---- linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c 2005-07-10 08:02:01.425114248 +0200
-@@ -0,0 +1,1483 @@
-+/*************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cppi.c
-+ *
-+ * DESCRIPTION:
-+ * This file contains shared code for all CPPI modules.
-+ *
-+ * HISTORY:
-+ * 7Aug02 Greg RC1.00 Original Version created.
-+ * 27Sep02 Mick RC1.01 Merged for use by CPMAC/CPSAR
-+ * 16Oct02 Mick RC1.02 Performance Tweaks (see cppihist.txt)
-+ * 12Nov02 Mick RC1.02 Updated to use cpmac_reg.h
-+ * 09Jan03 Mick RC3.01 Removed modification to RxBuffer ptr
-+ * 28Mar03 Mick 1.03 RxReturn now returns error if Malloc Fails
-+ * 10Apr03 Mick 1.03.02 Added Needs Buffer Support
-+ * 11Jun03 Mick 1.06.02 halSend() errors corrected
-+ *
-+ * @author Greg Guyotte
-+ * @version 1.00
-+ * @date 7-Aug-2002
-+ *****************************************************************************/
-+/* each CPPI module must modify this file, the rest of the
-+ code in cppi.c should be totally shared *//* Each CPPI module MUST properly define all constants shown below */
-+
-+/* CPPI registers */
-+
-+/* the following defines are not CPPI specific, but still used by cppi.c */
-+
-+static void FreeRx(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ HAL_RCB *rcb_ptr; /*+GSG 030303*/
-+ int rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf; /*+GSG 030303*/
-+ int Num = HalDev->ChData[Ch].RxNumBuffers, i; /*+GSG 030303*/
-+
-+ /* Free Rx data buffers attached to descriptors, if necessary */
-+ if (HalDev->RcbStart[Ch] != 0) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ for(i=0;i<Num;i++) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ rcb_ptr = (HAL_RCB *)(HalDev->RcbStart[Ch] + (i*rcbSize)); /*+GSG 030303*/
-+
-+ /* free the data buffer */
-+ if (rcb_ptr->DatPtr != 0)
-+ {
-+
-+ HalDev->OsFunc->FreeRxBuffer((void *)rcb_ptr->OsInfo, (void *)rcb_ptr->DatPtr);
-+ rcb_ptr->OsInfo=0; /*MJH+030522*/
-+ rcb_ptr->DatPtr=0; /*MJH+030522*/
-+ }
-+ } /*+GSG 030303*/
-+ } /*+GSG 030303*/
-+
-+ /* free up all desciptors at once */
-+ HalDev->OsFunc->FreeDmaXfer(HalDev->RcbStart[Ch]);
-+
-+ /* mark buffers as freed */
-+ HalDev->RcbStart[Ch] = 0;
-+ }
-+
-+static void FreeTx(HAL_DEVICE *HalDev, int Ch, int Queue)
-+ {
-+
-+/*+GSG 030303*/
-+
-+ /* free all descriptors at once */
-+ HalDev->OsFunc->FreeDmaXfer(HalDev->TcbStart[Ch][Queue]);
-+
-+ HalDev->TcbStart[Ch][Queue] = 0;
-+ }
-+
-+/* return of 0 means that this code executed, -1 means the interrupt was not
-+ a teardown interrupt */
-+static int RxTeardownInt(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ bit32u base = HalDev->dev_base;
-+
-+ int i;
-+ volatile bit32u *pTmp;
-+
-+ /* check to see if the interrupt is a teardown interrupt */
-+ if (((*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) & TEARDOWN_VAL) == TEARDOWN_VAL)
-+ {
-+ /* finish channel teardown */
-+
-+ /* Free channel resources on a FULL teardown */
-+ if (HalDev->RxTeardownPending[Ch] & FULL_TEARDOWN)
-+ {
-+ FreeRx(HalDev, Ch);
-+ }
-+
-+ /* bug fix - clear Rx channel pointers on teardown */
-+ HalDev->RcbPool[Ch] = 0;
-+ HalDev->RxActQueueHead[Ch] = 0;
-+ HalDev->RxActQueueCount[Ch] = 0;
-+ HalDev->RxActive[Ch] = FALSE;
-+
-+ /* write completion pointer */
-+ (*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) = TEARDOWN_VAL;
-+
-+ /* use direction bit as a teardown pending bit! May be able to
-+ use only one teardown pending integer in HalDev */
-+
-+ HalDev->RxTeardownPending[Ch] &= ~RX_TEARDOWN;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
-+
-+ /* call OS Teardown Complete (if TX is also done) */
-+ if ((HalDev->TxTeardownPending[Ch] & TX_TEARDOWN) == 0)
-+ {
-+ /* mark channel as closed */
-+ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
-+
-+ /* disable channel interrupt */
-+ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
-+ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
-+ SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
-+
-+ /* Clear PDSP Channel State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
-+ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
-+ *pTmp++ = 0;
-+
-+ if ((HalDev->RxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
-+ {
-+
-+ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
-+ }
-+ /* clear all teardown pending information for this channel */
-+ HalDev->RxTeardownPending[Ch] = 0;
-+ HalDev->TxTeardownPending[Ch] = 0;
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+ return (-1);
-+ }
-+
-+/* return of 0 means that this code executed, -1 means the interrupt was not
-+ a teardown interrupt */
-+static int TxTeardownInt(HAL_DEVICE *HalDev, int Ch, int Queue)
-+ {
-+ bit32u base = HalDev->dev_base;
-+ HAL_TCB *Last, *Curr, *First; /*+GSG 030303*/
-+
-+ int i;
-+ volatile bit32u *pTmp;
-+
-+ if (((*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) & TEARDOWN_VAL) == TEARDOWN_VAL)
-+ {
-+ /* return outstanding buffers to OS +RC3.02*/
-+ Curr = HalDev->TxActQueueHead[Ch][Queue]; /*+GSG 030303*/
-+ First = Curr; /*+GSG 030303*/
-+ while (Curr) /*+GSG 030303*/
-+ { /*+GSG 030303*/
-+ /* Pop TCB(s) for packet from the stack */ /*+GSG 030303*/
-+ Last = Curr->Eop; /*+GSG 030303*/
-+ HalDev->TxActQueueHead[Ch][Queue] = Last->Next; /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* return to OS */ /*+GSG 030303*/
-+ HalDev->OsFunc->SendComplete(Curr->OsInfo); /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* Push Tcb(s) back onto the stack */ /*+GSG 030303*/
-+ Curr = Last->Next; /*+GSG 030303*/
-+ Last->Next = HalDev->TcbPool[Ch][Queue]; /*+GSG 030303*/
-+ HalDev->TcbPool[Ch][Queue] = First; /*+GSG 030303*/
-+ /*+GSG 030303*/
-+ /* set the first(SOP) pointer for the next packet */ /*+GSG 030303*/
-+ First = Curr; /*+GSG 030303*/
-+ } /*+GSG 030303*/
-+
-+ /* finish channel teardown */
-+
-+ /* save the OsInfo to pass to upper layer
-+ THIS WAS CRASHING - because it's possible that I get the teardown
-+ notification and the TcbHPool is null. In this case, the buffers
-+ to free can be found in the TxHActiveQueue. If I need to get OsInfo
-+ in the future, I can get it from one of those buffers.
-+ OsInfo = HalDev->TcbHPool[Ch]->OsInfo; */
-+
-+ if (HalDev->TxTeardownPending[Ch] & FULL_TEARDOWN)
-+ {
-+ FreeTx(HalDev, Ch, Queue);
-+ } /* if FULL teardown */
-+
-+ /* bug fix - clear Tx channel pointers on teardown */
-+ HalDev->TcbPool[Ch][Queue] = 0;
-+ HalDev->TxActQueueHead[Ch][Queue] = 0;
-+ HalDev->TxActQueueCount[Ch][Queue] = 0;
-+ HalDev->TxActive[Ch][Queue] = FALSE;
-+
-+ /* write completion pointer */
-+ (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) = TEARDOWN_VAL;
-+
-+ /* no longer pending teardown */
-+ HalDev->TxTeardownPending[Ch] &= ~TX_TEARDOWN;
-+
-+ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
-+
-+ /* call OS Teardown Complete (if Rx is also done) */
-+ if ((HalDev->RxTeardownPending[Ch] & RX_TEARDOWN) == 0)
-+ {
-+ /* mark channel as closed */
-+ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
-+
-+ /* disable channel interrupt */
-+ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
-+ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
-+ SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
-+
-+ /* Clear PDSP Channel State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
-+ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
-+ *pTmp++ = 0;
-+
-+ if ((HalDev->TxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
-+ {
-+
-+ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
-+ }
-+
-+ /* clear all teardown pending information for this channel */
-+ HalDev->RxTeardownPending[Ch] = 0;
-+ HalDev->TxTeardownPending[Ch] = 0;
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+ return (-1);
-+ }
-+
-+/* +GSG 030421 */
-+static void AddToRxQueue(HAL_DEVICE *HalDev, HAL_RCB *FirstRcb, HAL_RCB *LastRcb, int FragCount, int Ch)
-+ {
-+ HAL_RCB *OldTailRcb;
-+
-+ if (HalDev->RxActQueueCount[Ch]==0)
-+ {
-+
-+ HalDev->RxActQueueHead[Ch]=FirstRcb;
-+ HalDev->RxActQueueTail[Ch]=LastRcb;
-+ HalDev->RxActQueueCount[Ch]=FragCount;
-+ if ((!HalDev->InRxInt[Ch])&&(!HalDev->RxActive[Ch]))
-+ {
-+ /* write Rx Queue Head Descriptor Pointer */
-+ (*(pRX_DMA_STATE_WORD_1( HalDev->dev_base )+( Ch *64))) = VirtToPhys(FirstRcb) - HalDev->offset;
-+ HalDev->RxActive[Ch]=TRUE;
-+ }
-+ }
-+ else
-+ {
-+
-+ OldTailRcb=HalDev->RxActQueueTail[Ch];
-+ OldTailRcb->Next=(void *)FirstRcb;
-+
-+ /* Emerald fix 10/29 (Denis) */
-+ *((bit32u *) VirtToVirtNoCache(&OldTailRcb->HNext))=VirtToPhys(FirstRcb) - HalDev->offset;
-+
-+ HalDev->RxActQueueTail[Ch]=LastRcb;
-+ HalDev->RxActQueueCount[Ch]+=FragCount;
-+ }
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function is called to indicate to the CPHAL that the upper layer
-+ * software has finished processing the receive data (given to it by
-+ * osReceive()). The CPHAL will then return the appropriate receive buffers
-+ * and buffer descriptors to the available pool.
-+ *
-+ * @param HalReceiveInfo Start of receive buffer descriptor chain returned to
-+ * CPHAL.
-+ * @param StripFlag Flag indicating whether the upper layer software has
-+ * retained ownership of the receive data buffers.
-+ *<BR>
-+ * 'FALSE' means that the CPHAL can reuse the receive data buffers.
-+ *<BR>
-+ * 'TRUE' : indicates the data buffers were retained by the OS
-+ *<BR>
-+ * NOTE: If StripFlag is TRUE, it is the responsibility of the upper layer software to free the buffers when they are no longer needed.
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_RCB_NEEDS_BUFFER "EC_VAL_RCB_NEEDS_BUFFER"<BR>
-+ * @ref EC_VAL_RCB_DROPPED "EC_VAL_RCB_DROPPED"<BR>
-+ */
-+static int halRxReturn(HAL_RECEIVEINFO *HalReceiveInfo,
-+ int StripFlag)
-+ {
-+ int Ch = HalReceiveInfo->Ch, i;
-+ HAL_RCB *LastRcb, *TempRcb;
-+ char *pBuf;
-+ HAL_RCB *CurrHeadRcb = HalReceiveInfo, *LastGoodRcb=0; /* +GSG 030421 */
-+ HAL_DEVICE *HalDev = HalReceiveInfo->HalDev;
-+ int RcbSize = HalDev->ChData[Ch].RxBufSize;
-+ int FragCount = HalReceiveInfo->FragCount;
-+ int rc=0; /*MJH+030417*/
-+ int GoodCount=0; /*GSG+030421*/
-+
-+ if (HalDev->State != enOpened)
-+ return(EC_AAL5 |EC_FUNC_RXRETURN|EC_VAL_INVALID_STATE);
-+
-+ LastRcb=(HAL_RCB *)HalReceiveInfo->Eop;
-+ LastRcb->HNext=0;
-+ LastRcb->Next=0;
-+
-+ if (FragCount>1)
-+ {
-+ LastRcb->Off_BLen=RcbSize;
-+ LastRcb->mode=CB_OWNERSHIP_BIT;
-+ }
-+
-+ HalReceiveInfo->Off_BLen=RcbSize;
-+ HalReceiveInfo->mode=CB_OWNERSHIP_BIT;
-+
-+ /* If OS has kept the buffers for this packet, attempt to alloc new buffers */
-+ if (StripFlag)
-+ {
-+ TempRcb = HalReceiveInfo;
-+ for (i=0; i<FragCount; i++)
-+ {
-+ if (TempRcb == 0)
-+ {
-+ dbgPrintf("Rx Return error while allocating new buffers\n");
-+ dbgPrintf("Rcb = %08x, Rcb->Eop = %08x, FragCount = %d:%d\n",
-+ (bit32u)HalReceiveInfo, (bit32u)HalReceiveInfo->Eop, FragCount,i);
-+ osfuncSioFlush();
-+
-+ return(EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_CORRUPT_RCB_CHAIN);
-+ }
-+
-+ /* size = ((RcbSize+15) & ~15) + 15;*/ /*-3.01b*/
-+ /*size = RcbSize + 15;*/ /* -GSG 030421 */
-+ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(RcbSize,0,
-+ 0xF,HalDev->ChData[Ch].OsSetup,
-+ (void *)TempRcb,
-+ (void *)&TempRcb->OsInfo,
-+ (void *) HalDev->OsDev);
-+ if (!pBuf)
-+ {
-+ /* malloc failed, add this RCB to Needs Buffer List */
-+ TempRcb->FragCount = 1; /*MJH+030417*/
-+ (HAL_RCB *)TempRcb->Eop = TempRcb; /* GSG +030430 */
-+
-+ if(HalDev->NeedsCount < MAX_NEEDS) /* +MJH 030410 */
-+ { /* +MJH 030410 */
-+ HalDev->Needs[HalDev->NeedsCount] = (HAL_RECEIVEINFO *) TempRcb; /* +MJH 030410 */
-+ HalDev->NeedsCount++; /* +MJH 030410 */
-+ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_NEEDS_BUFFER); /* ~MJH 030417 */
-+ } /* +MJH 030410 */
-+ else /* +MJH 030410 */
-+ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_DROPPED); /* ~MJH 030417 */
-+
-+ /* requeue any previous RCB's that were ready to go before this one */
-+ if (GoodCount > 0) /* +GSG 030421 */
-+ { /* +GSG 030421 */
-+ LastGoodRcb->HNext=0; /* +GSG 030430 */
-+ LastGoodRcb->Next=0; /* +GSG 030430 */
-+ osfuncDataCacheHitWriteback((void *)LastGoodRcb, 16); /* +GSG 030430 */
-+
-+ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
-+ GoodCount = 0; /* +GSG 030421 */
-+ } /* +GSG 030421 */
-+
-+ CurrHeadRcb = TempRcb->Next; /* +GSG 030421 */
-+ }
-+ else /* +GSG 030421 */
-+ { /* +GSG 030421 */
-+ /* malloc succeeded, requeue the RCB to the hardware */
-+ TempRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
-+ TempRcb->DatPtr=pBuf;
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWriteback((void *)TempRcb, 16);
-+
-+ /* i store the last good RCB in case the malloc fails for the
-+ next fragment. This ensures that I can go ahead and return
-+ a partial chain of RCB's to the hardware */
-+ LastGoodRcb = TempRcb; /* +GSG 030421 */
-+ GoodCount++; /* +GSG 030421 */
-+ } /* +GSG 030421 */
-+ TempRcb = TempRcb->Next;
-+ } /* end of Frag loop */
-+ /* if there any good RCB's to requeue, do so here */
-+ if (GoodCount > 0) /* +GSG 030421 */
-+ {
-+ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
-+ }
-+ return(rc); /* ~GSG 030421 */
-+ }
-+ else
-+ {
-+ /* Not Stripping */
-+ /* Emerald */
-+ /* Write Back SOP and last RCB */
-+ osfuncDataCacheHitWriteback((void *)HalReceiveInfo, 16);
-+
-+ if (FragCount > 1)
-+ {
-+ osfuncDataCacheHitWriteback((void *)LastRcb, 16);
-+ }
-+ /* if not stripping buffers, always add to queue */
-+ AddToRxQueue(HalDev, HalReceiveInfo, LastRcb, FragCount, Ch); /*MJH~030520*/
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/* +MJH 030410
-+ Trys to liberate an RCB until liberation fails.
-+ Note: If liberation fails then RxReturn will re-add the RCB to the
-+ Needs list.
-+*/
-+static void NeedsCheck(HAL_DEVICE *HalDev)
-+{
-+ HAL_RECEIVEINFO* HalRcb;
-+ int rc;
-+ HalDev->OsFunc->CriticalOn();
-+ while(HalDev->NeedsCount)
-+ {
-+ HalDev->NeedsCount--;
-+ HalRcb = HalDev->Needs[HalDev->NeedsCount];
-+ rc = halRxReturn(HalRcb, 1);
-+ /* short circuit if RxReturn starts to fail */
-+ if (rc != 0)
-+ break;
-+ }
-+ HalDev->OsFunc->CriticalOff();
-+}
-+
-+/*
-+ * This function allocates transmit buffer descriptors (internal CPHAL function).
-+ * It creates a high priority transmit queue by default for a single Tx
-+ * channel. If QoS is enabled for the given CPHAL device, this function
-+ * will also allocate a low priority transmit queue.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel number.
-+ *
-+ * @return 0 OK, Non-Zero Not OK
-+ */
-+static int InitTcb(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ int i, Num = HalDev->ChData[Ch].TxNumBuffers;
-+ HAL_TCB *pTcb=0;
-+ char *AllTcb;
-+ int tcbSize, Queue;
-+ int SizeMalloc;
-+
-+ tcbSize = (sizeof(HAL_TCB)+0xf)&~0xf;
-+ SizeMalloc = (tcbSize*Num)+0xf;
-+
-+ for (Queue=0; Queue < HalDev->ChData[Ch].TxNumQueues; Queue++)
-+ {
-+ if (HalDev->TcbStart[Ch][Queue] == 0)
-+ {
-+
-+ /* malloc all TCBs at once */
-+ AllTcb = (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
-+ if (!AllTcb)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_TCB_MALLOC_FAILED);
-+ }
-+
-+ HalDev->OsFunc->Memset(AllTcb, 0, SizeMalloc);
-+
-+ /* keep this address for freeing later */
-+ HalDev->TcbStart[Ch][Queue] = AllTcb;
-+ }
-+ else
-+ {
-+ /* if the memory has already been allocated, simply reuse it! */
-+ AllTcb = HalDev->TcbStart[Ch][Queue];
-+ }
-+
-+ /* align to cache line */
-+ AllTcb = (char *)(((bit32u)AllTcb + 0xf) &~ 0xf); /*PITS #143 MJH~030522*/
-+
-+ /* default High priority transmit queue */
-+ HalDev->TcbPool[Ch][Queue]=0;
-+ for(i=0;i<Num;i++)
-+ {
-+ /*pTcb=(HAL_TCB *) OsFunc->MallocDmaXfer(sizeof(HAL_TCB),0,0xffffffff); */
-+ pTcb= (HAL_TCB *)(AllTcb + (i*tcbSize));
-+ pTcb->mode=0;
-+ pTcb->BufPtr=0;
-+ pTcb->Next=HalDev->TcbPool[Ch][Queue];
-+ pTcb->Off_BLen=0;
-+ HalDev->TcbPool[Ch][Queue]=pTcb;
-+ }
-+ /*HalDev->TcbEnd = pTcb;*/
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * This function allocates receive buffer descriptors (internal CPHAL function).
-+ * After allocation, the function 'queues' (gives to the hardware) the newly
-+ * created receive buffers to enable packet reception.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel number.
-+ *
-+ * @return 0 OK, Non-Zero Not OK
-+ */
-+static int InitRcb(HAL_DEVICE *HalDev, int Ch)
-+ {
-+ int i, Num = HalDev->ChData[Ch].RxNumBuffers;
-+ int Size = HalDev->ChData[Ch].RxBufSize;
-+ HAL_RCB *pRcb;
-+ char *pBuf;
-+ char *AllRcb;
-+ int rcbSize;
-+ int DoMalloc = 0;
-+ int SizeMalloc;
-+ int MallocSize;
-+
-+ rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;
-+ SizeMalloc = (rcbSize*Num)+0xf;
-+
-+ if (HalDev->RcbStart[Ch] == 0)
-+ {
-+ DoMalloc = 1;
-+
-+ /* malloc all RCBs at once */
-+ AllRcb= (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
-+ if (!AllRcb)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RCB_MALLOC_FAILED);
-+ }
-+
-+ HalDev->OsFunc->Memset(AllRcb, 0, SizeMalloc);
-+
-+ /* keep this address for freeing later */
-+ HalDev->RcbStart[Ch] = AllRcb;
-+ }
-+ else
-+ {
-+ /* if the memory has already been allocated, simply reuse it! */
-+ AllRcb = HalDev->RcbStart[Ch];
-+ }
-+
-+ /* align to cache line */
-+ AllRcb = (char *)(((bit32u)AllRcb + 0xf)&~0xf); /*PITS #143 MJH~030522*/
-+
-+ HalDev->RcbPool[Ch]=0;
-+ for(i=0;i<Num;i++)
-+ {
-+ pRcb = (HAL_RCB *)(AllRcb + (i*rcbSize));
-+
-+ if (DoMalloc == 1)
-+ {
-+
-+ MallocSize = Size; /*~3.01 */
-+ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(MallocSize,0,0xF,HalDev->ChData[Ch].OsSetup, (void *)pRcb, (void *)&pRcb->OsInfo, (void *) HalDev->OsDev);
-+ if(!pBuf)
-+ {
-+ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RX_BUFFER_MALLOC_FAILED);
-+ }
-+ /* -RC3.01 pBuf = (char *)(((bit32u)pBuf+0xF) & ~0xF); */
-+ pRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
-+ pRcb->DatPtr=pBuf;
-+ /*pRcb->BufSize=Size;*/
-+ }
-+ pRcb->mode=0;
-+ pRcb->Ch=Ch;
-+ pRcb->Next=(void *)HalDev->RcbPool[Ch];
-+ pRcb->Off_BLen=0;
-+ pRcb->HalDev = HalDev;
-+ HalDev->RcbPool[Ch]=pRcb;
-+ }
-+
-+ /* Give all of the Rx buffers to hardware */
-+
-+ while(HalDev->RcbPool[Ch])
-+ {
-+ pRcb=HalDev->RcbPool[Ch];
-+ HalDev->RcbPool[Ch]=pRcb->Next;
-+ pRcb->Eop=(void*)pRcb;
-+ pRcb->FragCount=1;
-+ halRxReturn((HAL_RECEIVEINFO *)pRcb, 0);
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function transmits the data in FragList using available transmit
-+ * buffer descriptors. More information on the use of the Mode parameter
-+ * is available in the module-specific appendices. Note: The OS should
-+ * not call Send() for a channel that has been requested to be torndown.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param FragList Fragment List structure.
-+ * @param FragCount Number of fragments in FragList.
-+ * @param PacketSize Number of bytes to transmit.
-+ * @param OsSendInfo OS Send Information structure. <BR>
-+ * @param Mode 32-bit value with the following bit fields: <BR>
-+ * 31-16: Mode (used for module specific data). <BR>
-+ * 15-08: Queue (transmit queue to send on). <BR>
-+ * 07-00: Channel (channel number to send on).
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_NOT_LINKED "EC_VAL_NOT_LINKED"<BR>
-+ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
-+ * @ref EC_VAL_OUT_OF_TCBS "EC_VAL_OUT_OF_TCBS"<BR>
-+ * @ref EC_VAL_NO_TCBS "EC_VAL_NO_TCBS"<BR>
-+ */
-+static int halSend(HAL_DEVICE *HalDev,FRAGLIST *FragList,
-+ int FragCount,int PacketSize, OS_SENDINFO *OsSendInfo,
-+ bit32u Mode)
-+ {
-+ HAL_TCB *tcb_ptr, *head;
-+ int i;
-+ bit32u base = HalDev->dev_base;
-+ int rc = EC_NO_ERRORS;
-+ int Ch = Mode & 0xFF;
-+ int Queue = (Mode>>8)&0xFF;
-+
-+ int WaitFlag = (Mode>>30)&1; /* This is for AAL5 testing only */ /* ~GSG 030508 */
-+ int Offset = (FragList[0].len >> 16);
-+ int PktType = (Mode>>16)&3; /* 0=AAL5, 1=Null AAL, 2=OAM, 3=Transparent */ /* +GSG 030508 */
-+ int AtmHeaderInData = (Mode>>31)&1; /* +GSG 030508 */
-+ int FragIndex = 0;
-+
-+ if (HalDev->State != enOpened)
-+ return(EC_CPPI|EC_FUNC_SEND|EC_VAL_INVALID_STATE);
-+
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0) /*MJH~030611*/ /*PITS 148*/
-+ return(EC_AAL5 |EC_FUNC_SEND|EC_VAL_INVALID_CH); /*+GSG 030303*/
-+
-+ HalDev->OsFunc->CriticalOn();
-+
-+ tcb_ptr = head = HalDev->TcbPool[Ch][Queue];
-+
-+ if (tcb_ptr)
-+ {
-+
-+ /* these two TCB words are only valid on SOP */
-+ if (AtmHeaderInData == 1)
-+ {
-+ tcb_ptr->AtmHeader = 0; /* bug fix for transparent mode PTI problem */
-+ /* Expect AtmHeader in the data */
-+ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 24;
-+ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 16;
-+ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 8;
-+ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++);
-+
-+ /* decrement data buffer length accordingly */
-+ FragList[FragIndex].len -= ATM_HEADER_SIZE;
-+
-+ /* if the first fragment was ATM Header only, go to next fragment for loop */
-+ if (FragList[FragIndex].len == 0)
-+ FragIndex++;
-+
-+ /* No CPCS_UU/CPI if not AAL5 */
-+ tcb_ptr->Word5 = ((PktType & 0x3)<<16);
-+ }
-+ else
-+ {
-+ /* calculate AtmHeader from fields */
-+ tcb_ptr->AtmHeader = atmheader(HalDev->ChData[Ch].Gfc, /* ~GSG 030306 */
-+ HalDev->ChData[Ch].Vpi, HalDev->ChData[Ch].Vci,
-+ HalDev->ChData[Ch].Pti, HalDev->ChData[Ch].Clp);
-+
-+ tcb_ptr->Word5 = HalDev->ChData[Ch].CpcsUU | ((HalDev->ChData[Ch].PktType &0x3)<<16);
-+ }
-+
-+ for (i=FragIndex; i<FragCount; i++)
-+
-+ {
-+ /* Setup Tx mode and size */
-+ tcb_ptr->HNext = VirtToPhys((bit32 *)tcb_ptr->Next) - HalDev->offset;
-+ tcb_ptr->Off_BLen = FragList[i].len;
-+
-+ if (i==0)
-+ tcb_ptr->Off_BLen |= (Offset << 16);
-+
-+ tcb_ptr->mode = 0; /* MUST clear this for each frag !!! */
-+ tcb_ptr->BufPtr = VirtToPhys((bit32 *)FragList[i].data) -
-+ HalDev->offset;
-+
-+ /* first fragment */
-+ if (i == 0)
-+ {
-+ tcb_ptr->mode |= CB_SOF_BIT;
-+
-+ }
-+
-+ tcb_ptr->mode |= (PacketSize | CB_OWNERSHIP_BIT);
-+ tcb_ptr->OsInfo = OsSendInfo;
-+
-+ if (i == (FragCount - 1))
-+ {
-+ /* last fragment */
-+ tcb_ptr->mode |= CB_EOF_BIT;
-+
-+ /* since this is the last fragment, set the TcbPool pointer before
-+ nulling out the Next pointers */
-+
-+ HalDev->TcbPool[Ch][Queue] = tcb_ptr->Next;
-+
-+ tcb_ptr->Next = 0;
-+ tcb_ptr->HNext = 0;
-+
-+ /* In the Tx Interrupt handler, we will need to know which TCB is EOP,
-+ so we can save that information in the SOP */
-+ head->Eop = tcb_ptr;
-+
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
-+
-+ osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
-+
-+ }
-+ else
-+ {
-+ /* Emerald fix 10/29 */
-+ osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
-+
-+ osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
-+
-+ tcb_ptr = tcb_ptr->Next; /* what about the end of TCB list?? */
-+
-+ if (tcb_ptr == 0)
-+ {
-+ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_OUT_OF_TCBS;
-+ goto ExitSend;
-+ }
-+ }
-+ } /* for */
-+
-+ /* put it on the high priority queue */
-+ if (HalDev->TxActQueueHead[Ch][Queue] == 0)
-+ {
-+ HalDev->TxActQueueHead[Ch][Queue]=head;
-+ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
-+/*+GSG 030303*//*+GSG 030303*/
-+ if (!HalDev->TxActive[Ch][Queue])
-+ {
-+
-+ if (!WaitFlag)
-+ {
-+
-+ /* write CPPI TX HDP */
-+ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue ))) = VirtToPhys(head) - HalDev->offset;
-+ HalDev->TxActive[Ch][Queue]=TRUE;
-+
-+ }
-+
-+ }
-+ }
-+ else
-+ {
-+ HalDev->TxActQueueTail[Ch][Queue]->Next=head;
-+ /* Emerald fix 10/29 */
-+ *((bit32u *) VirtToVirtNoCache(&HalDev->TxActQueueTail[Ch][Queue]->HNext))=VirtToPhys(head) - HalDev->offset;
-+ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
-+/*+GSG 030303*//*+GSG 030303*/
-+ }
-+ rc = EC_NO_ERRORS;
-+ goto ExitSend;
-+ } /* if (tcb_ptr) */
-+ else
-+ {
-+ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NO_TCBS;
-+ goto ExitSend;
-+ }
-+ExitSend:
-+
-+ HalDev->OsFunc->CriticalOff();
-+ return(rc);
-+ }
-+
-+/*
-+ * This function processes receive interrupts. It traverses the receive
-+ * buffer queue, extracting the data and passing it to the upper layer software via
-+ * osReceive(). It handles all error conditions and fragments without valid data by
-+ * immediately returning the RCB's to the RCB pool.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel Number.
-+ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
-+ *
-+ * @return 0 if OK, non-zero otherwise.
-+ */
-+static int RxInt(HAL_DEVICE *HalDev, int Ch, int *MoreWork)
-+ {
-+ HAL_RCB *CurrentRcb, *LastRcb=0, *SopRcb, *EofRcb, *EopRcb;
-+ bit32u RxBufStatus,PacketsServiced, RxPktLen = 0, RxSopStatus,
-+ FrmFrags, TotalFrags, CurrDmaLen, DmaLen, FrmLen;
-+ int base = HalDev->dev_base, Ret;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+ int RxServiceMax = HalDev->ChData[Ch].RxServiceMax;
-+ int FragIndex; /* +GSG 030508 */
-+ int EarlyReturn = 0; /* +GSG 030521 */
-+
-+ bit32u PktType, ExpDmaSize, Cells;
-+ int PassHeader=0;
-+
-+ int mode;
-+
-+ bit32u SopOffset;
-+
-+ if(HalDev->NeedsCount) /* +MJH 030410 */
-+ NeedsCheck(HalDev); /* +MJH 030410 */
-+
-+ /* Handle case of teardown interrupt */
-+ if (HalDev->RxTeardownPending[Ch] != 0)
-+ {
-+ Ret = RxTeardownInt(HalDev, Ch);
-+ if (Ret == 0)
-+ { /*+GSG 030303*/
-+ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
-+ return (EC_NO_ERRORS);
-+ } /*+GSG 030303*/
-+ }
-+
-+ CurrentRcb=HalDev->RxActQueueHead[Ch];
-+
-+ osfuncDataCacheHitInvalidate((void*)CurrentRcb, 16);
-+
-+ RxBufStatus=CurrentRcb->mode;
-+
-+ /* I think I need to do this to ensure that i read UuCpi properly,
-+ which is on the second cache line of the Rcb */
-+ osfuncDataCacheHitInvalidate((void*)((bit32u)CurrentRcb+16), 16);
-+
-+ PacketsServiced=0;
-+ HalDev->InRxInt[Ch]=TRUE;
-+
-+ while((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)&&
-+ (PacketsServiced<RxServiceMax)) /* ~GSG 030307 */
-+ {
-+
-+ PacketsServiced++; /* ~GSG 030307 */
-+ SopRcb=CurrentRcb;
-+ RxSopStatus=RxBufStatus;
-+
-+ RxPktLen = RxSopStatus&CB_SIZE_MASK;
-+ /* Not sure what MAC needs to do for next block */
-+
-+ PktType=((SopRcb->UuCpi & 0x00030000) >> 16); /* GSG ~030508 */
-+ /* Calculate the expected DMA length */
-+ if (RxPktLen != 0)
-+ {
-+ Cells=RxPktLen/48;
-+ if ((RxPktLen%48) > 40)
-+ Cells++;
-+ if (PktType == PKT_TYPE_AAL5) /* ~GSG 030508 */
-+ Cells++;
-+ ExpDmaSize=Cells*48;
-+ }
-+ else
-+ {
-+ ExpDmaSize=0;
-+ }
-+
-+ SopOffset=(SopRcb->Off_BLen&CB_OFFSET_MASK)>>16;
-+
-+ CurrDmaLen=0;
-+ FrmFrags=0;
-+ TotalFrags=0;
-+ FragIndex=0;
-+ FrmLen=0;
-+ EofRcb=0;
-+
-+/* +GSG 030508 */
-+ if ((PktType == PKT_TYPE_OAM) || (PktType == PKT_TYPE_TRANS)) /* +GSG 030508 */
-+ { /* +GSG 030508 */
-+ /* first frag is ATM Header */ /* +GSG 030508 */
-+ PassHeader = 1; /* +GSG 030508 */
-+ HalDev->fraglist[FragIndex].data = (void *)&SopRcb->AtmHeader; /* +GSG 030508 */
-+ HalDev->fraglist[FragIndex].len = 4; /* +GSG 030508 */
-+ HalDev->fraglist[FragIndex].OsInfo = SopRcb->OsInfo; /* +GSG 030701 */
-+ FragIndex++; /* +GSG 030508 */
-+ } /* +GSG 030508 */
-+/* +GSG 030508 */
-+
-+ do
-+ {
-+
-+ DmaLen=CurrentRcb->Off_BLen&CB_SIZE_MASK;
-+
-+ CurrDmaLen+=DmaLen;
-+ FrmLen+=DmaLen;
-+ TotalFrags++;
-+ if (!EofRcb)
-+ {
-+ HalDev->fraglist[FragIndex].data=((char *)CurrentRcb->DatPtr); /* ~GSG 030508 */
-+
-+ HalDev->fraglist[FragIndex].data+=((FrmFrags==0)?SopOffset:0); /* ~GSG 030508 */
-+
-+ HalDev->fraglist[FragIndex].len=DmaLen; /* ~GSG 030508 */
-+
-+ /* GSG 12/9 */
-+ HalDev->fraglist[FragIndex].OsInfo = CurrentRcb->OsInfo; /* ~GSG 030508 */
-+
-+ /* Upper layer must do the data invalidate */
-+
-+ FrmFrags++;
-+ FragIndex++; /* ~GSG 030508 */
-+ if (FrmLen>=RxPktLen)
-+ EofRcb=CurrentRcb;
-+ }
-+ LastRcb=CurrentRcb;
-+ CurrentRcb=LastRcb->Next;
-+ if (CurrentRcb)
-+ {
-+ osfuncDataCacheHitInvalidate((void*)CurrentRcb,16);
-+ /* RxBufStatus=CurrentRcb->mode; */ /*DRB~030522*/
-+ }
-+ }while(((LastRcb->mode&CB_EOF_BIT)==0)&&(CurrentRcb));
-+
-+ /* New location for interrupt acknowledge */
-+ /* Write the completion pointer */
-+ (*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) = VirtToPhys(LastRcb) - HalDev->offset;
-+
-+ EopRcb=LastRcb;
-+ HalDev->RxActQueueHead[Ch]=CurrentRcb;
-+ HalDev->RxActQueueCount[Ch]-=TotalFrags;
-+
-+ if (LastRcb->mode&CB_EOQ_BIT)
-+ {
-+ if (CurrentRcb)
-+ {
-+
-+ HalDev->Stats.RxMisQCnt[Ch]++;
-+
-+ (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64))) = LastRcb->HNext;
-+ }
-+ else
-+ {
-+
-+ /* Rx EOQ */
-+ HalDev->Stats.RxMisQCnt[Ch]++;
-+
-+ HalDev->RxActive[Ch]=FALSE;
-+ }
-+ }
-+
-+ EopRcb->Next=0;
-+
-+ /* setup SopRcb for the packet */
-+ SopRcb->Eop=(void*)EopRcb;
-+ SopRcb->FragCount=TotalFrags;
-+
-+ if ((ExpDmaSize!=CurrDmaLen)||(RxSopStatus&RX_ERROR_MASK))
-+ {
-+ /* check for Rx errors (only valid on SOP) */
-+ if (RxSopStatus & RX_ERROR_MASK)
-+ {
-+ if (RxSopStatus & CRC_ERROR_MASK)
-+ HalDev->Stats.CrcErrors[Ch]++;
-+
-+ if (RxSopStatus & LENGTH_ERROR_MASK)
-+ HalDev->Stats.LenErrors[Ch]++;
-+
-+ if (RxSopStatus & ABORT_ERROR_MASK)
-+ HalDev->Stats.AbortErrors[Ch]++;
-+
-+ if (RxSopStatus & STARV_ERROR_MASK)
-+ HalDev->Stats.StarvErrors[Ch]++;
-+ }
-+ else
-+ {
-+ HalDev->Stats.DmaLenErrors[Ch]++; /* different type of length error */
-+ }
-+
-+ EarlyReturn = 1;
-+ }
-+
-+ /* do not pass up the packet if we're out of RCB's (or have an errored packet)*/
-+ if ((CurrentRcb == 0) || (EarlyReturn == 1))
-+ {
-+ halRxReturn((HAL_RECEIVEINFO *)SopRcb,0);
-+ }
-+ else
-+ {
-+
-+ if (EopRcb!=EofRcb)
-+ {
-+ HAL_RCB *FirstEmptyRcb;
-+
-+ FirstEmptyRcb = EofRcb->Next;
-+ FirstEmptyRcb->Eop = (void*)EopRcb;
-+ FirstEmptyRcb->FragCount = TotalFrags-FrmFrags;
-+
-+ halRxReturn((HAL_RECEIVEINFO *)FirstEmptyRcb,0);
-+ SopRcb->Eop=(void*)EofRcb;
-+ SopRcb->FragCount=FrmFrags;
-+ EofRcb->Next=0; /* Optional */
-+ }
-+
-+ mode = Ch | (PktType << 16) | (PassHeader << 31); /* ~GSG 030508 */
-+
-+ OsFunc->Receive(HalDev->OsDev,HalDev->fraglist,FragIndex,RxPktLen, /* ~GSG 030508 */
-+ (HAL_RECEIVEINFO *)SopRcb,mode);
-+ } /* else */
-+
-+ if (CurrentRcb) /*MJH+030522*/
-+ {
-+ RxBufStatus=CurrentRcb->mode;
-+ }
-+ } /* while */
-+
-+ if ((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)) /*~GSG 030307*/
-+ {
-+ *MoreWork = 1;
-+ }
-+ else
-+ {
-+ *MoreWork = 0;
-+ }
-+
-+ if (PacketsServiced != 0)
-+ {
-+ /* REMOVED when removing InRxInt */
-+ if ((!HalDev->RxActive[Ch]) && (HalDev->RxActQueueCount[Ch]))
-+ {
-+ (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64))) = VirtToPhys(HalDev->RxActQueueHead[Ch]);
-+ HalDev->RxActive[Ch]=TRUE;
-+ }
-+ }
-+
-+ HalDev->InRxInt[Ch]=FALSE;
-+
-+ /* update stats */
-+ HalDev->Stats.RxPacketsServiced[Ch] += PacketsServiced;
-+ HalDev->Stats.RxTotal += PacketsServiced;
-+ if (HalDev->Stats.RxMaxServiced < PacketsServiced)
-+ HalDev->Stats.RxMaxServiced = PacketsServiced;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * This function processes transmit interrupts. It traverses the
-+ * transmit buffer queue, detecting sent data buffers and notifying the upper
-+ * layer software via osSendComplete(). (for SAR, i originally had this split
-+ * into two functions, one for each queue, but joined them on 8/8/02)
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Queue Queue number to service (always 0 for MAC, Choose 1 for SAR to service low priority queue)
-+ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
-+ *
-+ * @return 0 if OK, non-zero otherwise.
-+ */
-+static int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork)
-+ {
-+ HAL_TCB *CurrentTcb,*LastTcbProcessed,*FirstTcbProcessed;
-+ int PacketsServiced;
-+ bit32u TxFrameStatus;
-+ int base = HalDev->dev_base, Ret;
-+ int TxServiceMax = HalDev->ChData[Ch].TxServiceMax;
-+ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
-+
-+ int OtherQueue = Queue^1;
-+
-+/*+GSG 030303*//*+GSG 030303*/
-+
-+ /* Handle case of teardown interrupt. This must be checked at
-+ the top of the function rather than the bottom, because
-+ the normal data processing can wipe out the completion
-+ pointer which is used to determine teardown complete. */
-+ if (HalDev->TxTeardownPending[Ch] != 0)
-+ {
-+ Ret = TxTeardownInt(HalDev, Ch, Queue);
-+ if (Ret == 0)
-+ { /*+GSG 030303*/
-+ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
-+ return (EC_NO_ERRORS);
-+ } /*+GSG 030303*/
-+ }
-+
-+ CurrentTcb = HalDev->TxActQueueHead[Ch][Queue];
-+ FirstTcbProcessed=CurrentTcb;
-+
-+ if (CurrentTcb==0)
-+ {
-+ /* I saw this error a couple of times when multi-channels were added */
-+ dbgPrintf("[cppi TxInt()]TxH int with no TCB in queue!\n");
-+ dbgPrintf(" Ch=%d, CurrentTcb = 0x%08x\n", Ch, (bit32u)CurrentTcb);
-+ dbgPrintf(" HalDev = 0x%08x\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ return(EC_CPPI|EC_FUNC_TXINT|EC_VAL_NULL_TCB);
-+ }
-+
-+ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
-+ TxFrameStatus=CurrentTcb->mode;
-+ PacketsServiced=0;
-+
-+ /* should the ownership bit check be inside of the loop?? could make it a
-+ while-do loop and take this check away */
-+ if ((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ {
-+ OsFunc->CriticalOn(); /* +GSG 030307 */
-+ do
-+ {
-+ /* Pop TCB(s) for packet from the stack */
-+ LastTcbProcessed=CurrentTcb->Eop;
-+
-+ /* new location for acknowledge */
-+ /* Write the completion pointer */
-+ (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) = VirtToPhys(LastTcbProcessed);
-+
-+ HalDev->TxActQueueHead[Ch][Queue] = LastTcbProcessed->Next;
-+
-+/*+GSG 030303*//*+GSG 030303*/
-+
-+ osfuncDataCacheHitInvalidate((void *)LastTcbProcessed, 16);
-+
-+ if (LastTcbProcessed->mode&CB_EOQ_BIT)
-+ {
-+ if (LastTcbProcessed->Next)
-+ {
-+ /* Misqueued packet */
-+
-+ HalDev->Stats.TxMisQCnt[Ch][Queue]++;
-+
-+ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue ))) = LastTcbProcessed->HNext;
-+ }
-+ else
-+ {
-+ /* Tx End of Queue */
-+
-+ HalDev->Stats.TxEOQCnt[Ch][Queue]++;
-+
-+ HalDev->TxActive[Ch][Queue]=FALSE;
-+ }
-+ }
-+
-+ OsFunc->SendComplete(CurrentTcb->OsInfo);
-+
-+ /* Push Tcb(s) back onto the stack */
-+ CurrentTcb = LastTcbProcessed->Next;
-+
-+ LastTcbProcessed->Next=HalDev->TcbPool[Ch][Queue];
-+
-+ HalDev->TcbPool[Ch][Queue]=FirstTcbProcessed;
-+
-+ PacketsServiced++;
-+
-+ TxFrameStatus=CB_OWNERSHIP_BIT;
-+ /* set the first(SOP) pointer for the next packet */
-+ FirstTcbProcessed = CurrentTcb;
-+ if (CurrentTcb)
-+ {
-+ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
-+ TxFrameStatus=CurrentTcb->mode;
-+ }
-+
-+ }while(((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ &&(PacketsServiced<TxServiceMax));
-+
-+ /* this fixes the SAR TurboDSL hardware bug (multiple queue failure) */
-+ if (HalDev->TxActive[Ch][OtherQueue])
-+ if (HalDev->TxActQueueHead[Ch][OtherQueue])
-+ if ((*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue ))) == 0)
-+ {
-+ osfuncDataCacheHitInvalidate(HalDev->TxActQueueHead[Ch][OtherQueue],16);
-+ if ((HalDev->TxActQueueHead[Ch][OtherQueue]->mode) & CB_OWNERSHIP_BIT)
-+ {
-+ HalDev->TurboDslErrors++;
-+ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue ))) =
-+ VirtToPhys(HalDev->TxActQueueHead[Ch][OtherQueue]);
-+ }
-+ }
-+
-+ OsFunc->CriticalOff(); /* +GSG 030307 */
-+ if (((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
-+ &&(PacketsServiced==TxServiceMax))
-+ {
-+ *MoreWork = 1;
-+ }
-+ else
-+ {
-+ *MoreWork = 0;
-+ }
-+ }
-+
-+ /* update stats */
-+ HalDev->Stats.TxPacketsServiced[Ch][Queue] += PacketsServiced;
-+ HalDev->Stats.TxTotal += PacketsServiced;
-+ if (HalDev->Stats.TxMaxServiced[Ch][Queue] < PacketsServiced)
-+ HalDev->Stats.TxMaxServiced[Ch][Queue] = PacketsServiced;
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function performs a teardown for the given channel. The value of the
-+ * Mode parameter controls the operation of the function, as documented below.
-+ *
-+ * Note: If bit 3 of Mode is set, this call is blocking, and will not return
-+ * until the teardown interrupt has occurred and been processed. While waiting
-+ * for a blocking teardown to complete, ChannelTeardown() will signal the OS
-+ * (via Control(.."Sleep"..)) to allow the OS to perform other tasks if
-+ * necessary. If and only if bit 3 of Mode is clear, the CPHAL will call the
-+ * OS TeardownComplete() function to indicate that the teardown has completed.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Ch Channel number.
-+ * @param Mode Bit 0 (LSB): Perform Tx teardown (if set).<BR>
-+ * Bit 1: Perform Rx teardown (if set). <BR>
-+ * Bit 2: If set, perform full teardown (free buffers/descriptors).
-+ * If clear, perform partial teardown (keep buffers). <BR>
-+ * Bit 3 (MSB): If set, call is blocking.
-+ * If clear, call is non-blocking.
-+ *
-+ * @return EC_NO_ERRORS (ok). <BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
-+ * @ref EC_VAL_TX_TEARDOWN_ALREADY_PEND "EC_VAL_TX_TEARDOWN_ALREADY_PEND"<BR>
-+ * @ref EC_VAL_RX_TEARDOWN_ALREADY_PEND "EC_VAL_RX_TEARDOWN_ALREADY_PEND"<BR>
-+ * @ref EC_VAL_TX_CH_ALREADY_TORNDOWN "EC_VAL_TX_CH_ALREADY_TORNDOWN"<BR>
-+ * @ref EC_VAL_RX_CH_ALREADY_TORNDOWN "EC_VAL_RX_CH_ALREADY_TORNDOWN"<BR>
-+ * @ref EC_VAL_TX_TEARDOWN_TIMEOUT "EC_VAL_TX_TEARDOWN_TIMEOUT"<BR>
-+ * @ref EC_VAL_RX_TEARDOWN_TIMEOUT "EC_VAL_RX_TEARDOWN_TIMEOUT"<BR>
-+ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
-+ */
-+static int halChannelTeardown(HAL_DEVICE *HalDev, int Ch, bit32 Mode)
-+ {
-+ int DoTx, DoRx, Sleep=2048, timeout=0; /*MJH~030306*/
-+ bit32u base = HalDev->dev_base;
-+
-+/* Set the module, used for error returns */
-+
-+ int Ret;
-+
-+ /* AAL5 only supports tearing down both sides at once (currently)*/
-+ Mode = (Mode | TX_TEARDOWN | RX_TEARDOWN);
-+
-+ DoTx = (Mode & TX_TEARDOWN);
-+ DoRx = (Mode & RX_TEARDOWN);
-+
-+ if (HalDev->State < enInitialized)
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_STATE);
-+
-+ if ((Ch < 0) || (Ch > MAX_AAL5_CHAN ))
-+ {
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
-+ }
-+
-+ /* set teardown pending bits before performing the teardown, because they
-+ will be used in the int handler (this is done for AAL5) */
-+ if (DoTx)
-+ {
-+ if (HalDev->TxTeardownPending[Ch] != 0)
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_ALREADY_PEND);
-+
-+ /* If a full teardown, this also means that the user must
-+ setup all channels again to use them */
-+ if (Mode & FULL_TEARDOWN)
-+ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
-+
-+ if (HalDev->State < enOpened)
-+ {
-+ /* if the hardware has never been opened, the channel has never actually
-+ been setup in the hardware, so I just need to reset the software flag
-+ and leave */
-+ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)
-+ {
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_CH_ALREADY_TORNDOWN);
-+ }
-+
-+ /* set teardown flag */
-+ HalDev->TxTeardownPending[Ch] = Mode;
-+ }
-+ }
-+
-+ if (DoRx)
-+ {
-+ if (HalDev->RxTeardownPending[Ch] != 0)
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_ALREADY_PEND);
-+
-+ if (Mode & FULL_TEARDOWN)
-+ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
-+
-+ if (HalDev->State < enOpened)
-+ {
-+ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
-+ return (EC_NO_ERRORS);
-+ }
-+ else
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == 0)
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_CH_ALREADY_TORNDOWN);
-+
-+ HalDev->RxTeardownPending[Ch] = Mode;
-+ }
-+ }
-+
-+ /* Perform Tx Teardown Duties */
-+ if ((DoTx) && (HalDev->State == enOpened))
-+ {
-+ /* Request TX channel teardown */
-+ (TX_CPPI_TEARDOWN_REG( base )) = Ch;
-+
-+ /* wait until teardown has completed */
-+ if (Mode & BLOCKING_TEARDOWN)
-+ {
-+ timeout = 0;
-+ while (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
-+ {
-+ osfuncSleep(&Sleep);
-+
-+ timeout++;
-+ if (timeout > 100000)
-+ {
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_TIMEOUT);
-+ }
-+ }
-+ }
-+ } /* if DoTx */
-+
-+ /* Perform Rx Teardown Duties */
-+ if ((DoRx) && (HalDev->State == enOpened))
-+ {
-+
-+ /* call main teardown routine for Rx */
-+ Ret = HalDev->SarFunc->ChannelTeardown(HalDev->SarDev, Ch, Mode);
-+ if (Ret) return (Ret);
-+
-+ if (Mode & BLOCKING_TEARDOWN)
-+ {
-+ timeout = 0;
-+ while (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
-+ {
-+ osfuncSleep(&Sleep);
-+
-+ timeout++;
-+ if (timeout > 100000)
-+ {
-+ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_TIMEOUT);
-+ }
-+ }
-+ }
-+ } /* if DoRx */
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/**
-+ * @ingroup CPHAL_Functions
-+ * This function closes the CPHAL module. The module will be reset.
-+ * The Mode parameter should be used to determine the actions taken by
-+ * Close().
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ * @param Mode Indicates actions to take on close. The following integer
-+ * values are valid: <BR>
-+ * 1: Does not free buffer resources, init parameters remain
-+ * intact. User can then call Open() without calling Init()
-+ * to attempt to reset the device and bring it back to the
-+ * last known state.<BR>
-+ * 2: Frees the buffer resources, but keeps init parameters. This
-+ * option is a more aggressive means of attempting a device reset.
-+ * 3: Frees the buffer resources, and clears all init parameters. <BR>
-+ * At this point, the caller would have to call to completely
-+ * reinitialize the device (Init()) before being able to call
-+ * Open(). Use this mode if you are shutting down the module
-+ * and do not plan to restart.
-+ *
-+ * @return EC_NO_ERRORS (ok).<BR>
-+ * Possible Error Codes:<BR>
-+ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
-+ * Any error code from halChannelTeardown().<BR>
-+ */
-+static int halClose(HAL_DEVICE *HalDev, bit32 Mode)
-+ {
-+ int Ch, Inst, Ret;
-+ OS_DEVICE *TmpOsDev;
-+ OS_FUNCTIONS *TmpOsFunc;
-+ HAL_FUNCTIONS *TmpHalFunc;
-+ char *TmpDeviceInfo;
-+
-+ CPSAR_FUNCTIONS *TmpSarFunc;
-+ CPSAR_DEVICE *TmpSarDev;
-+
-+ /* Verify proper device state */
-+ if (HalDev->State != enOpened)
-+ return (EC_AAL5 | EC_FUNC_CLOSE|EC_VAL_INVALID_STATE);
-+
-+ /* Teardown all open channels */
-+ for (Ch = 0; Ch <= MAX_AAL5_CHAN ; Ch++)
-+ {
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
-+ {
-+ if (Mode == 1)
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ else
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ }
-+
-+ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
-+ {
-+ if (Mode == 1)
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ else
-+ {
-+ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
-+ if (Ret) return (Ret);
-+ }
-+ }
-+ }
-+
-+ /* free fraglist in HalDev */
-+ HalDev->OsFunc->Free(HalDev->fraglist);
-+ HalDev->fraglist = 0;
-+
-+ /* unregister the interrupt */
-+ HalDev->OsFunc->IsrUnRegister(HalDev->OsDev, HalDev->interrupt);
-+
-+ /* Disable the Tx CPPI DMA */
-+ TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
-+
-+ /* Disable the Rx CPPI DMA */
-+ RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
-+
-+ /* Close the SAR hardware - puts the device in reset if this module is the
-+ "last one out" */
-+ HalDev->SarFunc->Close(HalDev->SarDev, Mode);
-+
-+ /* If mode is 3, than clear the HalDev and set next state to DevFound*/
-+ if (Mode == 3)
-+ {
-+ /* I need to keep the HalDev parameters that were setup in InitModule */
-+ TmpOsDev = HalDev->OsDev;
-+ TmpOsFunc = HalDev->OsFunc;
-+ TmpDeviceInfo = HalDev->DeviceInfo;
-+
-+ TmpSarFunc = HalDev->SarFunc;
-+ TmpSarDev = HalDev->SarDev;
-+
-+ TmpHalFunc = HalDev->HalFuncPtr;
-+ Inst = HalDev->Inst;
-+
-+ /* Clear HalDev */
-+
-+ HalDev->OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
-+
-+ /* Restore key parameters */
-+ HalDev->OsDev = TmpOsDev;
-+ HalDev->OsFunc = TmpOsFunc;
-+ HalDev->DeviceInfo = TmpDeviceInfo;
-+
-+ HalDev->SarFunc = TmpSarFunc;
-+ HalDev->SarDev = TmpSarDev;
-+
-+ HalDev->HalFuncPtr = TmpHalFunc;
-+ HalDev->Inst = Inst;
-+
-+ HalDev->State = enDevFound;
-+ }
-+ else
-+ {
-+ HalDev->State = enInitialized;
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c
---- linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c 2005-07-10 08:02:01.425114248 +0200
-@@ -0,0 +1,27 @@
-+#ifndef _INC_CPREMAP_C
-+#define _INC_CPREMAP_C
-+
-+#ifdef __ADAM2
-+static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
-+ {
-+ asm(" cache 17, (%0)" : : "r" (ptr));
-+ }
-+
-+static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
-+ {
-+ asm(" cache 25, (%0)" : : "r" (ptr));
-+ }
-+
-+#else
-+ #define osfuncDataCacheHitInvalidate(MemPtr, Size) HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
-+ #define osfuncDataCacheHitWriteback(MemPtr, Size) HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
-+#endif
-+
-+/*
-+#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache 17, (%0)" : : "r" (ptr))
-+#define osfuncDataCacheHitWriteback(ptr, Size) asm(" cache 25, (%0)" : : "r" (ptr))
-+*/
-+
-+
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c
---- linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c 2005-07-10 08:02:01.426114096 +0200
-@@ -0,0 +1,27 @@
-+#ifndef _INC_CPREMAP_C
-+#define _INC_CPREMAP_C
-+
-+#ifdef __ADAM2
-+static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
-+ {
-+ asm(" cache 17, (%0)" : : "r" (ptr));
-+ }
-+
-+static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
-+ {
-+ asm(" cache 25, (%0)" : : "r" (ptr));
-+ }
-+
-+#else
-+ #define osfuncDataCacheHitInvalidate(MemPtr, Size) HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
-+ #define osfuncDataCacheHitWriteback(MemPtr, Size) HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
-+#endif
-+
-+/*
-+#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache 17, (%0)" : : "r" (ptr))
-+#define osfuncDataCacheHitWriteback(ptr, Size) asm(" cache 25, (%0)" : : "r" (ptr))
-+*/
-+
-+
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/cpsar.c linux.dev/drivers/atm/sangam_atm/cpsar.c
---- linux.old/drivers/atm/sangam_atm/cpsar.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpsar.c 2005-07-10 08:02:01.427113944 +0200
-@@ -0,0 +1,881 @@
-+/**
-+ * cpsar.c
-+ *
-+ * TNETDxxxx Software Support\n
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * This file contains the HAL for the CPSAR module. In the software
-+ * architecture, the CPSAR module is used exclusively by the AAL5 and AAL2
-+ * CPHAL modules. AAL5 and AAL2 may utilize the same CPSAR instance
-+ * simulataneously.
-+ *
-+ * version
-+ * 5Sep02 Greg 1.00 Original Version created.
-+ */
-+
-+/* register files */
-+#include "cp_sar_reg.h"
-+
-+#define _CPHAL_CPSAR
-+#define _CPHAL
-+
-+#define WAIT_THRESH 200000
-+#define IRAM_SIZE 1536
-+#define MAX_INST 2
-+
-+/* OS Data Structure definition */
-+
-+typedef void OS_PRIVATE;
-+typedef void OS_DEVICE;
-+typedef void OS_SENDINFO;
-+typedef void OS_RECEIVEINFO;
-+typedef void OS_SETUP;
-+
-+/* CPHAL Data Structure definitions */
-+
-+typedef struct cpsar_device CPSAR_DEVICE;
-+typedef struct cpsar_device HAL_DEVICE;
-+typedef void HAL_RECEIVEINFO;
-+
-+#define MAX_QUEUE 2
-+#define MAX_CHAN 19
-+
-+#include "cpcommon_cpsar.h"
-+#include "cpswhal_cpsar.h"
-+#include "cpsar.h"
-+#include "cpcommon_cpsar.c"
-+
-+static CPSAR_DEVICE *CpsarDev[MAX_INST]= {0,0};
-+
-+/*
-+ * Returns statistics information.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0
-+ */
-+static int StatsGet3(CPSAR_DEVICE *HalDev)
-+ {
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]StatsGet3(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /*
-+ dbgPrintf("CPSAR General Stats:\n");
-+ DispHexStat(HalDev, "Base Address",HalDev->dev_base);
-+ DispStat(HalDev, "Offset (VLYNQ)",HalDev->offset);
-+ DispStat(HalDev, "Debug Level",HalDev->debug);
-+ DispStat(HalDev, "Instance",HalDev->Inst);
-+ DispHexStat(HalDev, "Reset Address",HalDev->ResetBase);
-+ DispStat(HalDev, "Reset Bit",HalDev->ResetBit);
-+ */
-+ return (EC_NO_ERRORS);
-+ }
-+
-+/* +GSG 030407 */
-+static void SetOamMode(HAL_DEVICE *HalDev)
-+ {
-+ int Ch;
-+ volatile bit32u *pTmp;
-+ int OamMode = (1<<8);
-+
-+ /* any configuration of OamMode affects all VC's, including AAL2 */
-+ for (Ch = 0; Ch < MAX_CHAN; Ch++)
-+ {
-+ if (Ch < 16)
-+ pTmp = (pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
-+ else
-+ pTmp = (pPDSP_AAL2_RX_STATE_WORD_0(HalDev->dev_base) + ((Ch-16)*64));
-+
-+ if (HalDev->OamMode == 0)
-+ {
-+ *pTmp &=~ OamMode;
-+ }
-+ else
-+ {
-+ *pTmp |= OamMode;
-+ }
-+ }
-+ }
-+
-+static int halControl(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
-+ {
-+ int KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Ch; /* +RC3.02*/
-+ char *TmpKey = (char *)Key;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
-+ Key, Action, (bit32u)Value);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
-+ {
-+ KeyFound=1; /* +RC3.02*/
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1; /* +RC3.02*/
-+ HalDev->debug = *(int *)Value;
-+ }
-+ }
-+
-+ /* +GSG 030407 */
-+ if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+ HalDev->OamMode = *(int *)Value;
-+
-+ /* only do this if we're open */
-+ if (HalDev->OpenCount > 0)
-+ SetOamMode(HalDev);
-+ }
-+
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ {
-+ ActionFound=1;
-+ *(int *)Value = HalDev->OamMode;
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strcmpi(Key, "Stats3") == 0)
-+ {
-+ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
-+ StatsGet3(HalDev);
-+ }
-+
-+ /* +RC3.02 (if statement) */
-+ /* Fixes PITS #98 */
-+ if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* Configure PDSP enable bit based on Value*/
-+ if (*(int *)Value & 1)
-+ {
-+ /* enable PDSP */
-+ PDSP_CTRL_REG(HalDev->dev_base) |= 0x2;
-+ }
-+ else
-+ {
-+ /* disable PDSP */
-+ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x2;
-+ }
-+ }
-+ }
-+
-+ if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
-+ {
-+ KeyFound=1;
-+ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
-+ {
-+ ActionFound=1;
-+
-+ /* extract channel number */
-+ TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
-+ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
-+
-+ /* Configure forwarding of unknown VCI/VPI cells */
-+ SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = (((*(int*)Value)<<31) | Ch);
-+ }
-+ }
-+
-+ if (KeyFound == 0) /* +RC3.02 */
-+ rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND); /* +RC3.02 */
-+
-+ if (ActionFound == 0) /* +RC3.02 */
-+ rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND); /* +RC3.02 */
-+
-+ return(rc); /* ~RC3.02 */
-+ }
-+
-+/*
-+ * This function opens the specified channel.
-+ *
-+ * @param HalDev CPHAL module instance. (set by cphalInitModule())
-+ * @param Ch Channel number.
-+ *
-+ * @return 0 OK, Non-zero Not OK
-+ */
-+static int halChannelSetup(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh)
-+ {
-+ int i;
-+ int Ch = HalCh->Channel;
-+ int PdspChBlock = Ch;
-+ int PdspBlockOffset = 0;
-+ volatile bit32u *pTmp;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halChannelSetup(HalDev:%08x, HalCh:%08x)\n", (bit32u)HalDev,
-+ (bit32u)HalCh);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Figure out the correct offset from the start of the PDSP
-+ Scratchpad RAM (starting at 0x8050 in the SAR) */
-+ if (Ch > 15)
-+ {
-+ /* this is an AAL2 channel, which are channels 16-18 */
-+ PdspChBlock = Ch - 16;
-+ /* Get the offset to the AAL2 portion of the block (in words) */
-+ PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + (PdspChBlock*64);
-+ /* Clear PDSP State RAM */
-+ /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
-+ for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
-+ *pTmp++ = 0;*/
-+ }
-+ else
-+ {
-+ /* Get the offset to the AAL5 portion of the block (in words) */
-+ PdspBlockOffset = (PdspChBlock*64);
-+ /* Clear PDSP State RAM */
-+ /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
-+ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
-+ *pTmp++ = 0;*/
-+ }
-+
-+ /* Configure PDSP State RAM */
-+
-+ /* Setup TX PDSP State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
-+ *pTmp++ = HalCh->TxVc_CellRate; /* Set the cell rate in cells/sec */
-+ *pTmp++ = HalCh->TxVc_QosType; /* Configure the QoS Type */
-+ *pTmp++ = HalCh->TxVc_Mbs; /* Set minimum burst size */
-+ *pTmp++ = 0; /* (skip a register) */
-+ *pTmp++ = HalCh->TxVc_Pcr; /* set the peak cell rate */
-+ *pTmp++ = 0; /* new addition 4.9.02 */
-+ *pTmp++ = HalCh->TxVc_AtmHeader; /* give the ATM header */
-+ *pTmp++ = (HalCh->TxVc_OamTc << 8)
-+ |(HalCh->TxVc_VpOffset); /* Set the OAM TC Path and VP Offset */
-+
-+ /* Setup RX PDSP State RAM */
-+ *pTmp++ = (HalCh->RxVc_OamCh)|
-+ (HalDev->OamMode << 8) |
-+ (HalCh->RxVc_OamToHost<<9); /* Set OAM Channel, Mode, and ToHost options */
-+ *pTmp++ = HalCh->RxVc_AtmHeader; /* ATM hdr put on firmware generated OAM */
-+ *pTmp++ = (HalCh->RxVc_VpOffset)| /* Set Rx OAM TC Path and VP Offset */
-+ (HalCh->RxVc_OamTc<<8);
-+
-+ /* Setup TX VP PDSP State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+16); /*GSG~030703 12->16 */
-+ *pTmp++ = HalCh->TxVp_AtmHeader;
-+ *pTmp++ = (HalCh->TxVp_OamTc << 8);
-+
-+ /* Setup RX VP PDSP State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+20); /*GSG~030703 16->20 */
-+ *pTmp++ = HalCh->RxVp_AtmHeader;
-+ *pTmp++ = (HalCh->RxVp_OamCh)|
-+ (HalCh->RxVp_OamTc<<8)|
-+ (HalCh->RxVp_OamToHost<<9); /* Set OAM Channel, Mode, and ToHost options */
-+ *pTmp++ = 0;
-+ *pTmp++ = HalCh->RxVp_OamVcList;
-+
-+ /* Configure forwarding of unknown VCI/VPI cells */
-+ if (HalCh->PktType == 3)
-+ SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = ((HalCh->FwdUnkVc<<31)|Ch);
-+
-+ /* Configure Tx Channel Mapping Register (turn channel "ON") */
-+ TX_CH_MAPPING_REG(HalDev->dev_base) = 0x80000000 |
-+ (HalCh->DaMask << 30)
-+ | (HalCh->Priority << 24) | Ch;
-+
-+ /* Setup Rx Channel in the LUT */
-+ i=0;
-+ while (!(RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) & 0x80000000))
-+ {
-+ if (i > WAIT_THRESH)
-+ {
-+ return(EC_CPSAR|EC_FUNC_CHSETUP|EC_VAL_LUT_NOT_READY);
-+ }
-+ else
-+ i++;
-+ }
-+
-+ /* RX LUT is ready */
-+ RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) = (HalCh->PktType << 24) | Ch;
-+ RX_LUT_CH_SETUP_REQ_VC_REG(HalDev->dev_base) = ((HalCh->Vpi << 20) |
-+ (HalCh->Vci << 4));
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+static int halChannelTeardown(CPSAR_DEVICE *HalDev, int Ch, bit32 Mode)
-+ {
-+ int waitcnt = 0;
-+ int PdspBlockOffset = 0, i;
-+ volatile bit32u *pTmp;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halChannelTeardown(HalDev:%08x, Ch:%d, Mode:%d\n",
-+ (bit32u)HalDev, Ch, Mode);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ if ((Ch < 0) || (Ch > MAX_CHAN))
-+ return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
-+
-+ /* Request RX channel teardown through LUT */
-+ while ((RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) & 0x80000000) == 0)
-+ {
-+ waitcnt++;
-+ if (waitcnt == WAIT_THRESH)
-+ {
-+ return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_LUT_NOT_READY);
-+ }
-+ }
-+
-+ RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) = (Ch & 0xffff);
-+
-+ /* for AAL2, clear channel PDSP RAM here. AAL5 does it when the teardown
-+ has completed (which is asynchronous)*/
-+ if (Ch > 15)
-+ {
-+ /* Get the offset to the AAL2 portion of the block (in words) */
-+ PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + ((Ch-16)*64);
-+ /* Clear PDSP State RAM */
-+ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
-+ for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
-+ *pTmp++ = 0;
-+ }
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+int InitPdsp(CPSAR_DEVICE *HalDev)
-+ {
-+ bit32u NumOfEntries,i,IRamAddress,iTmp;
-+ int *SarPdspFirmware; /* ~GSG 030403 */
-+ int FirmwareSize, rc; /* ~GSG 030403 */
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]InitPdsp(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Get firmware */
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, "Firmware", "Get", &SarPdspFirmware); /* ~GSG 030403 */
-+ if (rc) /* +GSG 030403 */
-+ return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND); /* +GSG 030403 */
-+
-+ /* Get firmware size */
-+ rc = HalDev->OsFunc->Control(HalDev->OsDev, "FirmwareSize", "Get", &FirmwareSize); /* ~GSG 030403 */
-+ if (rc) /* +GSG 030403 */
-+ return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND); /* +GSG 030403 */
-+
-+ IRamAddress = (bit32u) pPDSP_CTRL_REG(HalDev->dev_base);
-+
-+ NumOfEntries = (FirmwareSize)/4; /* ~GSG 030403 */
-+ if (NumOfEntries > IRAM_SIZE)
-+ {
-+ /* Note: On Avalanche, they truncated the PDSP firmware and warned */
-+ /* NumOfEntries = IRAM_SIZE; */
-+ return(EC_CPSAR|EC_FUNC_INIT|EC_VAL_FIRMWARE_TOO_LARGE);
-+ }
-+ for(i=8;i<NumOfEntries;i++)
-+ (*((bit32 *) (IRamAddress+(i*4))))=SarPdspFirmware[i]; /* ~GSG 030403 */
-+
-+ /* Check code */
-+ for(i=8;i<NumOfEntries;i++)
-+ {
-+ iTmp=(*((bit32 *) (IRamAddress+(i*4))));
-+ if (iTmp != SarPdspFirmware[i]) /* ~GSG 030403 */
-+ {
-+ return(EC_CPSAR|EC_FUNC_OPEN|EC_VAL_PDSP_LOAD_FAIL);
-+ }
-+ }
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * This function probes for the instance of the CPHAL module. It will call
-+ * the OS function @c DeviceFindInfo() to get the information required.
-+ *
-+ * @param HalDev CPHAL module instance. (set by xxxInitModule())
-+ *
-+ * @return 0 OK, Otherwise error.
-+ */
-+static int halProbe(CPSAR_DEVICE *HalDev)
-+ {
-+ int Ret;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(1))
-+ {
-+ dbgPrintf("[os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
-+ HalDev->Inst, "sar", (bit32u)&HalDev->DeviceInfo);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Attempt to find the device information */
-+ Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "sar", &HalDev->DeviceInfo);
-+ if (Ret)
-+ return(EC_CPSAR|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+#ifdef __CPHAL_DEBUG
-+static void dbgConfigDump(HAL_DEVICE *HalDev)
-+ {
-+ dbgPrintf(" [cpsar Inst %d] Config Dump:\n", HalDev->Inst);
-+ dbgPrintf(" Base :%08x, offset :%08d\n",
-+ HalDev->dev_base, HalDev->offset);
-+ dbgPrintf(" ResetBit:%08d, ResetBase:%08x\n",
-+ HalDev->ResetBit, HalDev->ResetBase);
-+ dbgPrintf(" UniNni :%08d, debug :%08d\n",
-+ HalDev->ResetBit, HalDev->debug);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+/*
-+ * Sets up HAL default configuration parameter values.
-+ */
-+static void ConfigInit(CPSAR_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /* configure some defaults with tnetd7300 values */
-+ HalDev->dev_base = 0xa3000000;
-+ HalDev->offset = 0;
-+ HalDev->UniNni = CFG_UNI_NNI;
-+ HalDev->ResetBit = 9;
-+ HalDev->debug = 0;
-+ HalDev->ResetBase = 0xa8611600;
-+ }
-+
-+/*
-+ * Retrieve HAL configuration parameter values.
-+ */
-+static bit32u ConfigGet(HAL_DEVICE *HalDev)
-+ {
-+ bit32u ParmValue, error_code;
-+ char *DeviceInfo = HalDev->DeviceInfo;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* get the configuration parameters common to all modules */
-+ error_code = ConfigGetCommon(HalDev);
-+ if (error_code) return (EC_CPSAR|error_code);
-+
-+ /* get SAR specific configuration parameters */
-+ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo,"UniNni",&ParmValue);
-+ if (!error_code) HalDev->UniNni = ParmValue;
-+
-+ return (EC_NO_ERRORS);
-+ }
-+
-+static int halInit(CPSAR_DEVICE *HalDev)
-+ {
-+ bit32u Ret;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halInit(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[cpsar halInit()]InitCount = %d\n", HalDev->InitCount);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Only run the init code for the first calling module per instance */
-+ if (HalDev->InitCount > 1)
-+ {
-+ return (EC_NO_ERRORS);
-+ }
-+
-+ /* Configure HAL defaults */
-+ ConfigInit(HalDev);
-+
-+ /* Retrieve HAL configuration parameters from data store */
-+ Ret = ConfigGet(HalDev);
-+ if (Ret) return (Ret);
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(9))
-+ dbgConfigDump(HalDev);
-+#endif
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+static int halOpen(CPSAR_DEVICE *HalDev)
-+ {
-+ int Ret, Ticks=64;
-+ int i; /*+GSG 030407*/
-+ volatile int *pTmp; /*+GSG 030407*/
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[cpsar halOpen()]OpenCount = %d\n", HalDev->OpenCount);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Only run the open code for the first calling module per instance */
-+ if (HalDev->OpenCount++ > 0)
-+ {
-+ return (EC_NO_ERRORS);
-+ }
-+
-+ /* Take SAR out of reset */
-+ if (((*(volatile bit32u *)(HalDev->ResetBase)) & (1<<HalDev->ResetBit)) != 0)
-+ {
-+ /** @todo Should I somehow call AAL5/AAL2 Close() here? All I've done
-+ here is copy the Close code from each and paste it here. */
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[cpsar halOpen()]Module was already out of reset.\n");
-+ dbgPrintf(" Closing module and resetting.\n");
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Disable the Tx CPPI DMA */
-+ TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
-+
-+ /* Disable the Rx CPPI DMA */
-+ RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
-+
-+ /* Disable the PDSP */
-+ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
-+
-+ /* disable interrupt masks */
-+ SAR_TX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
-+ SAR_RX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
-+
-+#ifndef NO_RESET /* GSG+ 030428 */
-+ /* clear reset bit */
-+ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
-+
-+ /* set reset bit */
-+ (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
-+#endif /* GSG+ 030428 */
-+ }
-+ else
-+ {
-+ (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
-+ }
-+
-+ /* Configure UNI/NNI */
-+ RX_LUT_GLOBAL_CFG_REG(HalDev->dev_base) |= (HalDev->UniNni & 0x1);
-+
-+ /* Clear entire PDSP state RAM */ /*+GSG 030407*/
-+ pTmp = (pTX_DMA_STATE_WORD_0(HalDev->dev_base)); /*+GSG 030407*/
-+ for (i=0; i<PDSP_STATE_RAM_SIZE; i++) /*+GSG 030407*/
-+ *pTmp++ = 0; /*+GSG 030407*/
-+
-+ /* Configure Oam Mode */ /*+GSG 030407*/
-+ SetOamMode(HalDev); /*+GSG 030407*/
-+
-+ /* Initialize PDSP */
-+ Ret=InitPdsp(HalDev);
-+ if(Ret)
-+ return(Ret);
-+
-+ /* Reset and Enable the PDSP */
-+ PDSP_CTRL_REG(HalDev->dev_base) = 0x00080003;
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+static int halClose(CPSAR_DEVICE *HalDev, int Mode)
-+ {
-+ int Ticks = 64;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halClose(HalDev:%08x, Mode:%d)\n", (bit32u)HalDev, Mode);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* handle the error case if there is nothing open */
-+ if (HalDev->OpenCount == 0)
-+ {
-+ return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_CLOSED);
-+ }
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[cpsar halClose()]OpenCount = %d\n", HalDev->OpenCount);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Only run the close code for the last calling module per instance */
-+ if (HalDev->OpenCount-- > 1)
-+ {
-+ return (EC_NO_ERRORS);
-+ }
-+
-+ /* Disable the PDSP */
-+ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
-+
-+#ifndef NO_RESET /* GSG +030428 */
-+ /* put device back into reset */
-+ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
-+ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
-+#endif /* GSG +030428 */
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+static int halShutdown(CPSAR_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* handle the error case */
-+ if (HalDev->InitCount == 0)
-+ {
-+ return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_SHUTDOWN);
-+ }
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(7))
-+ {
-+ dbgPrintf("[cpsar halShutdown()]InitCount = %d\n", HalDev->InitCount);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ /* Only run the shutdown code for the last calling module per instance */
-+ if (HalDev->InitCount-- > 1)
-+ {
-+ return (EC_NO_ERRORS);
-+ }
-+
-+ /* free the SAR functions */
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(6))
-+ {
-+ dbgPrintf(" [cpsar halShutdown()]: Free CPSAR function pointers\n");
-+ osfuncSioFlush();
-+ }
-+ if (DBG(1)||DBG(3))
-+ {
-+ dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /* free the HalFunc */
-+ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
-+
-+ /* we have a static global, so I should clear it's value as well */
-+ CpsarDev[HalDev->Inst] = 0;
-+
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(6))
-+ {
-+ dbgPrintf(" [cpsar halShutdown()]Free HalDev\n");
-+ osfuncSioFlush();
-+ }
-+ if (DBG(1)||DBG(3))
-+ {
-+ dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+ /* free the CPSAR device */
-+ HalDev->OsFunc->Free(HalDev);
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+static int halTick(CPSAR_DEVICE *HalDev)
-+ {
-+#ifdef __CPHAL_DEBUG
-+ if (DBG(0))
-+ {
-+ dbgPrintf("[cpsar]halTick(HalDev:%08x)\n", (bit32u)HalDev);
-+ osfuncSioFlush();
-+ }
-+#endif
-+
-+ return(EC_NO_ERRORS);
-+ }
-+
-+/*
-+ * The CPSAR version of InitModule() should be passed the OS_FUNCTIONS pointer,
-+ * and will return the HalDev pointer.
-+ *
-+ * @param HalDev Pointer to CPSAR module information. This will
-+ * be used by the OS when communicating to this module via
-+ * CPSAR.
-+ * @param OsDev Pointer to OS device information. This will be saved by
-+ * the CPSAR and returned to the OS when required.
-+ * @param HalFunc HAL_FUNCTIONS pointer.
-+ * @param Size Pointer to the size of the HAL_FUNCTIONS structure. (If
-+ * HalFunc is 0, the value will be set by CPSAR, otherwise
-+ * ignored)
-+ * @param Inst The instance number of the module to initialize. (start at
-+ * 0).
-+ *
-+ * @return 0 OK, Nonzero - error.
-+ */
-+/*
-+int cpsarInitModule(CPSAR_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ CPSAR_FUNCTIONS *HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int *Size,
-+ int Inst)
-+*/
-+int cpsarInitModule(CPSAR_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ CPSAR_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst)
-+ {
-+ CPSAR_DEVICE *HalPtr;
-+ CPSAR_FUNCTIONS *HalFuncPtr;
-+
-+ /*
-+ if ( HalFunc == 0 )
-+ {
-+ *Size = sizeof(CPSAR_FUNCTIONS);
-+ return(EC_NO_ERRORS);
-+ }
-+ */
-+
-+ if (CpsarDev[Inst] != 0)
-+ {
-+ /* this SAR module has been connected to before, so do not
-+ allocate another CPSAR_DEVICE */
-+ HalPtr = CpsarDev[Inst];
-+
-+ /* increase count of attached modules */
-+ HalPtr->InitCount++;
-+ }
-+ else
-+ {
-+ /* allocate the CPSAR_DEVICE structure */
-+ HalPtr = (CPSAR_DEVICE *) OsFunc->MallocDev(sizeof(CPSAR_DEVICE));
-+ if(!HalPtr)
-+ return(EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
-+
-+ HalFuncPtr = (CPSAR_FUNCTIONS *) OsFunc->Malloc(sizeof(CPSAR_FUNCTIONS));
-+ if (!HalFuncPtr)
-+ return (EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
-+
-+ /* Initialize the size of hal functions */
-+ *HalFuncSize = sizeof (CPSAR_FUNCTIONS);
-+
-+ /* ensure the device structure is cleared */
-+ OsFunc->Memset(HalPtr, 0, sizeof(CPSAR_DEVICE));
-+
-+ /* clear the function pointers */
-+ OsFunc->Memset(HalFuncPtr, 0, sizeof(CPSAR_FUNCTIONS));
-+
-+ /* Supply pointers for the CPSAR API functions */
-+ HalFuncPtr->ChannelSetup = halChannelSetup;
-+ HalFuncPtr->ChannelTeardown = halChannelTeardown;
-+ HalFuncPtr->Close = halClose;
-+ HalFuncPtr->Control = halControl;
-+ HalFuncPtr->Init = halInit;
-+ HalFuncPtr->Open = halOpen;
-+ HalFuncPtr->Probe = halProbe;
-+ HalFuncPtr->Shutdown = halShutdown;
-+ HalFuncPtr->Tick = halTick;
-+
-+ /* keep a reference to HalFuncPtr so I can free it later */
-+ HalPtr->HalFuncPtr = HalFuncPtr;
-+
-+ /* store the CPSAR_DEVICE, so the CPSAR module will know whether
-+ it is in use for the given instance */
-+ CpsarDev[Inst] = HalPtr;
-+
-+ /* increase count of attached modules */
-+ HalPtr->InitCount++;
-+ }
-+
-+ /* @todo Does this need modification to deal with multiple callers/
-+ drivers? If different callers will use different OsDev/OsFunc,
-+ then the current code will not work.
-+ */
-+
-+ /* initialize the CPSAR_DEVICE structure */
-+ HalPtr->OsDev = OsDev;
-+ /*HalPtr->OsOpen = OsDev;*/
-+ HalPtr->Inst = Inst;
-+ HalPtr->OsFunc = OsFunc;
-+
-+ /* pass the HalPtr back to the caller */
-+ *HalDev = HalPtr;
-+ *HalFunc = HalPtr->HalFuncPtr;
-+
-+ return (EC_NO_ERRORS);
-+ }
-diff -urN linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h
---- linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h 2005-07-10 08:02:01.427113944 +0200
-@@ -0,0 +1,103 @@
-+/*******************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cpsar.h
-+ *
-+ * DESCRIPTION:
-+ * This file contains data structure definitions for the CPSAR HAL.
-+ *
-+ * HISTORY:
-+ * 6Sep02 Greg 1.00 Original Version created.
-+ *
-+ *****************************************************************************/
-+#ifndef _INC_CPSAR
-+#define _INC_CPSAR
-+
-+#define NUM_RX_STATE_WORDS 7
-+#define NUM_TX_STATE_WORDS 9
-+#define MAX_CHAN 19
-+
-+
-+#ifndef _CPHAL_CPSAR
-+typedef void CPSAR_DEVICE;
-+#endif
-+
-+/*
-+ * HAL Default Parameter Values
-+ */
-+#define CFG_UNI_NNI 0
-+
-+/**
-+ * @ingroup shared_data
-+ *
-+ * List of defined keys for use with Control().
-+ */
-+typedef enum
-+ {
-+ /* SAR */
-+ enGET_FIRMWARE, /**< Used by the SAR to request a pointer to firmware */
-+ enGET_FIRMWARE_SIZE, /**< Used by the SAR to request the size of the firmware */
-+ enEND=9999 /* Last entry */
-+ }INFO_KEY;
-+
-+/*
-+ * The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
-+ int (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(CPSAR_DEVICE *HalDev, int Mode);
-+ int (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*Init)(CPSAR_DEVICE *HalDev);
-+ int (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(CPSAR_DEVICE *HalDev);
-+ int (*Probe)(CPSAR_DEVICE *HalDev);
-+ int (*Shutdown)(CPSAR_DEVICE *HalDev);
-+ int (*Tick)(CPSAR_DEVICE *HalDev);
-+ } CPSAR_FUNCTIONS;
-+
-+/*
-+ * This is the data structure for a generic HAL device. It contains all device
-+ * specific data for a single instance of that device. This includes Rx/Tx
-+ * buffer queues, device base address, reset bit, and other information.
-+ */
-+typedef struct cpsar_device
-+ {
-+ bit32 dev_base;
-+ bit32 offset;
-+ bit32 TxTeardownPending[MAX_CHAN];
-+ bit32 RxTeardownPending[MAX_CHAN];
-+ bit32 ChIsOpen[MAX_CHAN];
-+ bit32 ResetBit;
-+ bit32 debug;
-+ OS_DEVICE *OsDev;
-+ OS_FUNCTIONS *OsFunc;
-+ /*void *OsOpen;*/
-+ bit32 UniNni;
-+ bit32 Inst;
-+ bit32u DeviceCPID[4];
-+ bit32u LBSourceLLID[4];
-+ bit32u OamRate[11];
-+ CHANNEL_INFO ChData[MAX_CHAN];
-+ int InitCount;
-+ int OpenCount;
-+ char *DeviceInfo;
-+ bit32u ResetBase;
-+ DEVICE_STATE State;
-+ CPSAR_FUNCTIONS *HalFuncPtr;
-+ int OamMode; /* +GSG 030407 */
-+ }CPSARDEVICE;
-+
-+extern int cpsarInitModule(CPSAR_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ CPSAR_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/cpsar.h linux.dev/drivers/atm/sangam_atm/cpsar.h
---- linux.old/drivers/atm/sangam_atm/cpsar.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpsar.h 2005-07-10 08:02:01.427113944 +0200
-@@ -0,0 +1,103 @@
-+/*******************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cpsar.h
-+ *
-+ * DESCRIPTION:
-+ * This file contains data structure definitions for the CPSAR HAL.
-+ *
-+ * HISTORY:
-+ * 6Sep02 Greg 1.00 Original Version created.
-+ *
-+ *****************************************************************************/
-+#ifndef _INC_CPSAR
-+#define _INC_CPSAR
-+
-+#define NUM_RX_STATE_WORDS 7
-+#define NUM_TX_STATE_WORDS 9
-+#define MAX_CHAN 19
-+
-+
-+#ifndef _CPHAL_CPSAR
-+typedef void CPSAR_DEVICE;
-+#endif
-+
-+/*
-+ * HAL Default Parameter Values
-+ */
-+#define CFG_UNI_NNI 0
-+
-+/**
-+ * @ingroup shared_data
-+ *
-+ * List of defined keys for use with Control().
-+ */
-+typedef enum
-+ {
-+ /* SAR */
-+ enGET_FIRMWARE, /**< Used by the SAR to request a pointer to firmware */
-+ enGET_FIRMWARE_SIZE, /**< Used by the SAR to request the size of the firmware */
-+ enEND=9999 /* Last entry */
-+ }INFO_KEY;
-+
-+/*
-+ * The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
-+ int (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(CPSAR_DEVICE *HalDev, int Mode);
-+ int (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*Init)(CPSAR_DEVICE *HalDev);
-+ int (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(CPSAR_DEVICE *HalDev);
-+ int (*Probe)(CPSAR_DEVICE *HalDev);
-+ int (*Shutdown)(CPSAR_DEVICE *HalDev);
-+ int (*Tick)(CPSAR_DEVICE *HalDev);
-+ } CPSAR_FUNCTIONS;
-+
-+/*
-+ * This is the data structure for a generic HAL device. It contains all device
-+ * specific data for a single instance of that device. This includes Rx/Tx
-+ * buffer queues, device base address, reset bit, and other information.
-+ */
-+typedef struct cpsar_device
-+ {
-+ bit32 dev_base;
-+ bit32 offset;
-+ bit32 TxTeardownPending[MAX_CHAN];
-+ bit32 RxTeardownPending[MAX_CHAN];
-+ bit32 ChIsOpen[MAX_CHAN];
-+ bit32 ResetBit;
-+ bit32 debug;
-+ OS_DEVICE *OsDev;
-+ OS_FUNCTIONS *OsFunc;
-+ /*void *OsOpen;*/
-+ bit32 UniNni;
-+ bit32 Inst;
-+ bit32u DeviceCPID[4];
-+ bit32u LBSourceLLID[4];
-+ bit32u OamRate[11];
-+ CHANNEL_INFO ChData[MAX_CHAN];
-+ int InitCount;
-+ int OpenCount;
-+ char *DeviceInfo;
-+ bit32u ResetBase;
-+ DEVICE_STATE State;
-+ CPSAR_FUNCTIONS *HalFuncPtr;
-+ int OamMode; /* +GSG 030407 */
-+ }CPSARDEVICE;
-+
-+extern int cpsarInitModule(CPSAR_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ CPSAR_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/cp_sar_reg.h linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h
---- linux.old/drivers/atm/sangam_atm/cp_sar_reg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h 2005-07-10 08:02:01.428113792 +0200
-@@ -0,0 +1,217 @@
-+/***************************************************************************
-+ TNETD73xx Software Support
-+ Copyright(c) 2000, Texas Instruments Incorporated. All Rights Reserved.
-+
-+ FILE: cp_sar_reg.h Register definitions for the SAR module
-+
-+ DESCRIPTION:
-+ This include file contains register definitions for the
-+ SAR module.
-+
-+ HISTORY:
-+ 15 Jan 02 G. Guyotte Original version written
-+ 03 Oct 02 G. Guyotte C++ style comments removed
-+****************************************************************************/
-+#ifndef _INC_SAR_REG
-+#define _INC_SAR_REG
-+
-+/* Global Registers */
-+#define pSAR_ID_REG(base) ((volatile bit32u *)(base+0x0000))
-+#define SAR_ID_REG(base) (*pSAR_ID_REG(base))
-+#define pSAR_STATUS_SET_REG(base) ((volatile bit32u *)(base+0x0008))
-+#define SAR_STATUS_SET_REG(base) (*pSAR_STATUS_SET_REG(base))
-+#define pSAR_STATUS_CLR_REG(base) ((volatile bit32u *)(base+0x000C))
-+#define SAR_STATUS_CLR_REG(base) (*pSAR_STATUS_CLR_REG(base))
-+#define pSAR_HOST_INT_EN_SET_REG(base) ((volatile bit32u *)(base+0x0010))
-+#define SAR_HOST_INT_EN_SET_REG(base) (*pSAR_HOST_INT_EN_SET_REG(base))
-+#define pSAR_HOST_INT_EN_CLR_REG(base) ((volatile bit32u *)(base+0x0014))
-+#define SAR_HOST_INT_EN_CLR_REG(base) (*pSAR_HOST_INT_EN_CLR_REG(base))
-+#define pSAR_PDSP_INT_EN_SET_REG(base) ((volatile bit32u *)(base+0x0018))
-+#define SAR_PDSP_INT_EN_SET_REG(base) (*pSAR_PDSP_INT_EN_SET_REG(base))
-+#define pSAR_PDSP_INT_EN_CLR_REG(base) ((volatile bit32u *)(base+0x001C))
-+#define SAR_PDSP_INT_EN_CLR_REG(base) (*pSAR_PDSP_INT_EN_CLR_REG(base))
-+
-+/* PDSP OAM General Purpose Registers */
-+#define pSAR_PDSP_HOST_OAM_CONFIG_REG(base) ((volatile bit32u *)(base+0x0020))
-+#define SAR_PDSP_HOST_OAM_CONFIG_REG(base) (*pSAR_PDSP_HOST_OAM_CONFIG_REG(base))
-+#define pSAR_PDSP_OAM_CORR_REG(base) ((volatile bit32u *)(base+0x0024))
-+#define SAR_PDSP_OAM_CORR_REG(base) (*pSAR_PDSP_OAM_CORR_REG(base))
-+#define pSAR_PDSP_OAM_LB_RESULT_REG(base) ((volatile bit32u *)(base+0x0028))
-+#define SAR_PDSP_OAM_LB_RESULT_REG(base) (*pSAR_PDSP_OAM_LB_RESULT_REG(base))
-+#define pSAR_PDSP_OAM_F5_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x002c)) /* +GSG 030416 */
-+#define SAR_PDSP_OAM_F5_LB_COUNT_REG(base) (*pSAR_PDSP_OAM_F5_LB_COUNT_REG(base)) /* +GSG 030416 */
-+#define pSAR_PDSP_OAM_F4_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x0030)) /* +GSG 030416 */
-+#define SAR_PDSP_OAM_F4_LB_COUNT_REG(base) (*pSAR_PDSP_OAM_F4_LB_COUNT_REG(base)) /* +GSG 030416 */
-+#define pSAR_PDSP_FWD_UNK_VC_REG(base) ((volatile bit32u *)(base+0x0034)) /* +GSG 030701 */
-+#define SAR_PDSP_FWD_UNK_VC_REG(base) (*pSAR_PDSP_FWD_UNK_VC_REG(base)) /* +GSG 030701 */
-+
-+
-+/* Rx Lookup Table Registers */
-+#define pRX_LUT_GLOBAL_CFG_REG(base) ((volatile bit32u *)(base+0x0080))
-+#define RX_LUT_GLOBAL_CFG_REG(base) (*pRX_LUT_GLOBAL_CFG_REG(base))
-+#define pRX_LUT_CH_SETUP_REQ_REG(base) ((volatile bit32u *)(base+0x0090))
-+#define RX_LUT_CH_SETUP_REQ_REG(base) (*pRX_LUT_CH_SETUP_REQ_REG(base))
-+#define pRX_LUT_CH_SETUP_REQ_VC_REG(base) ((volatile bit32u *)(base+0x0094))
-+#define RX_LUT_CH_SETUP_REQ_VC_REG(base) (*pRX_LUT_CH_SETUP_REQ_VC_REG(base))
-+#define pRX_LUT_CH_TEARDOWN_REQ_REG(base) ((volatile bit32u *)(base+0x009C))
-+#define RX_LUT_CH_TEARDOWN_REQ_REG(base) (*pRX_LUT_CH_TEARDOWN_REQ_REG(base))
-+
-+/* Tx Scheduler Registers */
-+#define pTX_CH_MAPPING_REG(base) ((volatile bit32u *)(base+0x0170))
-+#define TX_CH_MAPPING_REG(base) (*pTX_CH_MAPPING_REG(base))
-+
-+/* Tx CPPI DMA Controller Registers */
-+#define pTX_CPPI_CTL_REG(base) ((volatile bit32u *)(base+0x0700))
-+#define TX_CPPI_CTL_REG(base) (*pTX_CPPI_CTL_REG(base))
-+#define pTX_CPPI_TEARDOWN_REG(base) ((volatile bit32u *)(base+0x0704))
-+#define TX_CPPI_TEARDOWN_REG(base) (*pTX_CPPI_TEARDOWN_REG(base))
-+
-+/* EOI Interrupt Additions */
-+#define pSAR_EOI(base) ((volatile bit32u *)(base+0x0708))
-+#define SAR_EOI(base) (*pSAR_EOI(base))
-+#define pSAR_INTR_VECTOR(base) ((volatile bit32u *)(base+0x070c))
-+#define SAR_INTR_VECTOR(base) (*pSAR_INTR_VECTOR(base))
-+#define pSAR_TX_MASKED_STATUS(base) ((volatile bit32u *)(base+0x0710))
-+#define SAR_TX_MASKED_STATUS(base) (*pSAR_TX_MASKED_STATUS(base))
-+#define pSAR_TX_RAW_STATUS(base) ((volatile bit32u *)(base+0x0714))
-+#define SAR_TX_RAW_STATUS(base) (*pSAR_TX_RAW_STATUS(base))
-+#define pSAR_TX_MASK_SET(base) ((volatile bit32u *)(base+0x0718))
-+#define SAR_TX_MASK_SET(base) (*pSAR_TX_MASK_SET(base))
-+#define pSAR_TX_MASK_CLR(base) ((volatile bit32u *)(base+0x071c))
-+#define SAR_TX_MASK_CLR(base) (*pSAR_TX_MASK_CLR(base))
-+
-+/* Rx CPPI DMA Controller Registers */
-+#define pRX_CPPI_CTL_REG(base) ((volatile bit32u *)(base+0x0780))
-+#define RX_CPPI_CTL_REG(base) (*pRX_CPPI_CTL_REG(base))
-+#define pSAR_RX_MASKED_STATUS(base) ((volatile bit32u *)(base+0x0790))
-+#define SAR_RX_MASKED_STATUS(base) (*pSAR_RX_MASKED_STATUS(base))
-+#define pSAR_RX_RAW_STATUS(base) ((volatile bit32u *)(base+0x0794))
-+#define SAR_RX_RAW_STATUS(base) (*pSAR_RX_RAW_STATUS(base))
-+#define pSAR_RX_MASK_SET(base) ((volatile bit32u *)(base+0x0798))
-+#define SAR_RX_MASK_SET(base) (*pSAR_RX_MASK_SET(base))
-+#define pSAR_RX_MASK_CLR(base) ((volatile bit32u *)(base+0x079c))
-+#define SAR_RX_MASK_CLR(base) (*pSAR_RX_MASK_CLR(base))
-+
-+/* PDSP Control/Status Registers */
-+#define pPDSP_CTRL_REG(base) ((volatile bit32u *)(base+0x4000))
-+#define PDSP_CTRL_REG(base) (*pPDSP_CTRL_REG(base))
-+
-+/* PDSP Instruction RAM */
-+#define pPDSP_IRAM(base) ((volatile bit32u *)(base+0x4020))
-+#define PDSP_IRAM(base) (*pPDSP_IRAM(base))
-+
-+/*
-+ * Channel 0 State/Scratchpad RAM Block
-+ *
-+ * The following registers (Tx DMA State, Rx DMA State, CPPI Completion PTR,
-+ * and PDSP Data) have been given the correct address for channel 0. To
-+ * reach the registers for channel X, add (X * 0x100) to the pointer address.
-+ *
-+ */
-+
-+#define PDSP_STATE_RAM_SIZE 1024
-+
-+/* Tx DMA State RAM */
-+#define pTX_DMA_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8000))
-+#define TX_DMA_STATE_WORD_0(base) (*pTX_DMA_STATE_WORD_0(base))
-+#define pTX_DMA_STATE_WORD_1(base) ((volatile bit32u *)(base+0x8004))
-+#define TX_DMA_STATE_WORD_1(base) (*pTX_DMA_STATE_WORD_1(base))
-+#define pTX_DMA_STATE_WORD_2(base) ((volatile bit32u *)(base+0x8008))
-+#define TX_DMA_STATE_WORD_2(base) (*pTX_DMA_STATE_WORD_2(base))
-+#define pTX_DMA_STATE_WORD_3(base) ((volatile bit32u *)(base+0x800C))
-+#define TX_DMA_STATE_WORD_3(base) (*pTX_DMA_STATE_WORD_3(base))
-+#define pTX_DMA_STATE_WORD_4(base) ((volatile bit32u *)(base+0x8010))
-+#define TX_DMA_STATE_WORD_4(base) (*pTX_DMA_STATE_WORD_4(base))
-+#define pTX_DMA_STATE_WORD_5(base) ((volatile bit32u *)(base+0x8014))
-+#define TX_DMA_STATE_WORD_5(base) (*pTX_DMA_STATE_WORD_5(base))
-+#define pTX_DMA_STATE_WORD_6(base) ((volatile bit32u *)(base+0x8018))
-+#define TX_DMA_STATE_WORD_6(base) (*pTX_DMA_STATE_WORD_6(base))
-+#define pTX_DMA_STATE_WORD_7(base) ((volatile bit32u *)(base+0x801C))
-+#define TX_DMA_STATE_WORD_7(base) (*pTX_DMA_STATE_WORD_7(base))
-+#define pTX_DMA_STATE_WORD_8(base) ((volatile bit32u *)(base+0x8020))
-+#define TX_DMA_STATE_WORD_8(base) (*pTX_DMA_STATE_WORD_8(base))
-+
-+/* Rx DMA State RAM */
-+#define pRX_DMA_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8024))
-+#define RX_DMA_STATE_WORD_0(base) (*pRX_DMA_STATE_WORD_0(base))
-+#define pRX_DMA_STATE_WORD_1(base) ((volatile bit32u *)(base+0x8028))
-+#define RX_DMA_STATE_WORD_1(base) (*pRX_DMA_STATE_WORD_1(base))
-+#define pRX_DMA_STATE_WORD_2(base) ((volatile bit32u *)(base+0x802C))
-+#define RX_DMA_STATE_WORD_2(base) (*pRX_DMA_STATE_WORD_2(base))
-+#define pRX_DMA_STATE_WORD_3(base) ((volatile bit32u *)(base+0x8030))
-+#define RX_DMA_STATE_WORD_3(base) (*pRX_DMA_STATE_WORD_3(base))
-+#define pRX_DMA_STATE_WORD_4(base) ((volatile bit32u *)(base+0x8034))
-+#define RX_DMA_STATE_WORD_4(base) (*pRX_DMA_STATE_WORD_4(base))
-+#define pRX_DMA_STATE_WORD_5(base) ((volatile bit32u *)(base+0x8038))
-+#define RX_DMA_STATE_WORD_5(base) (*pRX_DMA_STATE_WORD_5(base))
-+#define pRX_DMA_STATE_WORD_6(base) ((volatile bit32u *)(base+0x803C))
-+#define RX_DMA_STATE_WORD_6(base) (*pRX_DMA_STATE_WORD_6(base))
-+
-+/* Tx CPPI Completion Pointers */
-+#define pTXH_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8040))
-+#define TXH_CPPI_COMP_PTR(base) (*pTXH_CPPI_COMP_PTR(base))
-+#define pTXL_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8044))
-+#define TXL_CPPI_COMP_PTR(base) (*pTXL_CPPI_COMP_PTR(base))
-+
-+/* Rx CPPI Completion Pointer */
-+#define pRX_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8048))
-+#define RX_CPPI_COMP_PTR(base) (*pRX_CPPI_COMP_PTR(base))
-+
-+/* Tx PDSP Defines */
-+#define NUM_PDSP_AAL5_STATE_WORDS 24
-+#define NUM_PDSP_AAL2_STATE_WORDS 20
-+
-+/* PDSP State RAM Block 0 */
-+#define pPDSP_BLOCK_0(base) ((volatile bit32u *)(base+0x8050))
-+#define PDSP_BLOCK_0(base) (*pPDSP_BLOCK_0(base))
-+
-+/* AAL5 Tx PDSP State RAM */
-+#define pPDSP_AAL5_TX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8050))
-+#define PDSP_AAL5_TX_STATE_WORD_0(base) (*pPDSP_AAL5_TX_STATE_WORD_0(base))
-+
-+/* AAL5 Rx PDSP State RAM */
-+#define pPDSP_AAL5_RX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8070))
-+#define PDSP_AAL5_RX_STATE_WORD_0(base) (*pPDSP_AAL5_RX_STATE_WORD_0(base))
-+
-+/* AAL5 Tx VP PDSP State RAM */
-+#define pPDSP_AAL5_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8090))
-+#define PDSP_AAL5_TX_VP_STATE_WORD_0(base) (*pPDSP_AAL5_TX_VP_STATE_WORD_0(base))
-+
-+/* AAL5 Rx VP PDSP State RAM */
-+#define pPDSP_AAL5_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80A0))
-+#define PDSP_AAL5_RX_VP_STATE_WORD_0(base) (*pPDSP_AAL5_RX_VP_STATE_WORD_0(base))
-+
-+/* AAL2 Tx PDSP State RAM */
-+#define pPDSP_AAL2_TX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80B0))
-+#define PDSP_AAL2_TX_STATE_WORD_0(base) (*pPDSP_AAL2_TX_STATE_WORD_0(base))
-+
-+/* AAL2 Rx PDSP State RAM */
-+#define pPDSP_AAL2_RX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80D0))
-+#define PDSP_AAL2_RX_STATE_WORD_0(base) (*pPDSP_AAL2_RX_STATE_WORD_0(base))
-+
-+/* AAL2 Tx VP PDSP State RAM */
-+#define pPDSP_AAL2_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80E0))
-+#define PDSP_AAL2_TX_VP_STATE_WORD_0(base) (*pPDSP_AAL2_TX_VP_STATE_WORD_0(base))
-+
-+/* AAL2 Rx VP PDSP State RAM */
-+#define pPDSP_AAL2_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80F0))
-+#define PDSP_AAL2_RX_VP_STATE_WORD_0(base) (*pPDSP_AAL2_RX_VP_STATE_WORD_0(base))
-+
-+/* PDSP OAM Configuration Block */
-+#define pOAM_CONFIG_BLOCK_WORD_0(base) ((volatile bit32u *)(base+0x83C0))
-+#define OAM_CONFIG_BLOCK_WORD_0(base) (*pOAM_CONFIG_BLOCK_WORD_0(base))
-+
-+/* PDSP OAM Padding Block */
-+#define pOAM_PADDING_BLOCK_WORD_0(base) ((volatile bit32u *)(base+0x84C0))
-+#define OAM_PADDING_BLOCK_WORD_0(base) (*pOAM_PADDING_BLOCK_WORD_0(base))
-+
-+#define NUM_OAM_RATES 11
-+
-+/* PDSP OAM Timer State RAM */
-+#define pOAM_TIMER_STATE_WORD_0(base) ((volatile bit32u *)(base+0x85B0))
-+#define OAM_TIMER_STATE_WORD_0(base) (*pOAM_TIMER_STATE_WORD_0(base))
-+
-+
-+/* END OF FILE */
-+
-+#endif _INC_SAR_REG
-diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h
---- linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h 2005-07-10 08:02:01.429113640 +0200
-@@ -0,0 +1,629 @@
-+/************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cphal.h
-+ *
-+ * DESCRIPTION:
-+ * User include file, contains data definitions shared between the CPHAL
-+ * and the upper-layer software.
-+ *
-+ * HISTORY:
-+ * Date Modifier Ver Notes
-+ * 28Feb02 Greg 1.00 Original
-+ * 06Mar02 Greg 1.01 Documentation enhanced
-+ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
-+ * 22Nov02 Mick RC2 Additions from Denis' input on Control
-+ *
-+ * author Greg Guyotte
-+ * version 1.02
-+ * date 18-Jul-2002
-+ *****************************************************************************/
-+#ifndef _INC_CPHAL_H
-+#define _INC_CPHAL_H
-+
-+#ifdef _CPHAL_CPMAC
-+#include "ec_errors_cpmac.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "ec_errors_cpaal5.h"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "ec_errors_cpsar.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "ec_errors_cpaal2.h"
-+#endif
-+
-+#ifndef __ADAM2
-+typedef char bit8;
-+typedef short bit16;
-+typedef int bit32;
-+
-+typedef unsigned char bit8u;
-+typedef unsigned short bit16u;
-+typedef unsigned int bit32u;
-+
-+/*
-+typedef char INT8;
-+typedef short INT16;
-+typedef int INT32;
-+typedef unsigned char UINT8;
-+typedef unsigned short UINT16;
-+typedef unsigned int UINT32;
-+*/
-+/*typedef unsigned int size_t;*/
-+#endif
-+
-+#ifdef _CPHAL
-+
-+#ifndef TRUE
-+#define TRUE (1==1)
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE (1==2)
-+#endif
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+#endif
-+
-+#define VirtToPhys(a) (((int)a)&~0xe0000000)
-+#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
-+#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
-+#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
-+#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
-+/*
-+#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
-+#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
-+*/
-+
-+#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
-+#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
-+
-+/* Channel Teardown Defines */
-+#define RX_TEARDOWN 2
-+#define TX_TEARDOWN 1
-+#define BLOCKING_TEARDOWN 8
-+#define FULL_TEARDOWN 4
-+#define PARTIAL_TEARDOWN 0
-+
-+#define MAX_DIR 2
-+#define DIRECTION_TX 0
-+#define DIRECTION_RX 1
-+#define TX_CH 0
-+#define RX_CH 1
-+#define HAL_ERROR_DEVICE_NOT_FOUND 1
-+#define HAL_ERROR_FAILED_MALLOC 2
-+#define HAL_ERROR_OSFUNC_SIZE 3
-+#define HAL_DEFAULT 0xFFFFFFFF
-+#define VALID(val) (val!=HAL_DEFAULT)
-+
-+/*
-+ERROR REPORTING
-+
-+HAL Module Codes. Each HAL module reporting an error code
-+should OR the error code with the respective Module error code
-+from the list below.
-+*/
-+#define EC_AAL5 EC_HAL|EC_DEV_AAL5
-+#define EC_AAL2 EC_HAL|EC_DEV_AAL2
-+#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
-+#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
-+#define EC_VDMA EC_HAL|EC_DEV_VDMA
-+#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
-+#define EC_CPPI EC_HAL|EC_DEV_CPPI
-+
-+/*
-+HAL Function Codes. Each HAL module reporting an error code
-+should OR the error code with one of the function codes from
-+the list below.
-+*/
-+#define EC_FUNC_HAL_INIT EC_FUNC(1)
-+#define EC_FUNC_CHSETUP EC_FUNC(2)
-+#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
-+#define EC_FUNC_RXRETURN EC_FUNC(4)
-+#define EC_FUNC_SEND EC_FUNC(5)
-+#define EC_FUNC_RXINT EC_FUNC(6)
-+#define EC_FUNC_TXINT EC_FUNC(7)
-+#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
-+#define EC_FUNC_OPTIONS EC_FUNC(9)
-+#define EC_FUNC_PROBE EC_FUNC(10)
-+#define EC_FUNC_OPEN EC_FUNC(11)
-+#define EC_FUNC_CONTROL EC_FUNC(12)
-+#define EC_FUNC_DEVICE_INT EC_FUNC(13)
-+#define EC_FUNC_STATUS EC_FUNC(14)
-+#define EC_FUNC_TICK EC_FUNC(15)
-+#define EC_FUNC_CLOSE EC_FUNC(16)
-+#define EC_FUNC_SHUTDOWN EC_FUNC(17)
-+#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
-+
-+/*
-+HAL Error Codes. The list below defines every type of error
-+used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
-+values in integer order to the bottom of the list.
-+*/
-+#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
-+#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
-+#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
-+#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
-+#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
-+#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
-+#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
-+#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
-+#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
-+#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
-+#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
-+#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
-+
-+#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
-+#define EC_VAL_INVALID_CH EC_ERR(0x0E)
-+#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
-+#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
-+#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
-+#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
-+#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
-+#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
-+#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
-+#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
-+#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
-+#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
-+#define EC_VAL_INVALID_VC EC_ERR(0x19)
-+#define EC_VAL_INVALID_LC EC_ERR(0x20)
-+#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
-+#define EC_VAL_INVALID_CID EC_ERR(0x22)
-+#define EC_VAL_INVALID_UUI EC_ERR(0x23)
-+#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
-+#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
-+
-+#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
-+#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
-+#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
-+#define EC_VAL_NO_TCBS EC_ERR(0x29)
-+#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
-+#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
-+#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
-+#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
-+#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
-+#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
-+
-+#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
-+#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
-+#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
-+#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
-+#define EC_VAL_INVALID_STATE EC_ERR(0x40)
-+#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
-+#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
-+#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
-+#define EC_VAL_NOT_LINKED EC_ERR(0x44)
-+#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
-+#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
-+#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
-+#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
-+#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
-+#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
-+#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
-+#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
-+#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
-+#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
-+#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
-+#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
-+#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
-+
-+/**
-+@defgroup shared_data Shared Data Structures
-+
-+The data structures documented here are shared by all modules.
-+*/
-+
-+/**
-+ * @ingroup shared_data
-+ * This is the fragment list structure. Each fragment list entry contains a
-+ * length and a data buffer.
-+ */
-+typedef struct
-+ {
-+ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
-+ void *data; /**< Pointer to fragment data. */
-+ void *OsInfo; /**< Pointer to OS defined data. */
-+ }FRAGLIST;
-+
-+#if defined (_CPHAL_CPMAC)
-+#define CB_PASSCRC_BIT (1<<26)
-+
-+/* CPMAC CPHAL STATUS */
-+#define CPMAC_STATUS_LINK (1 << 0)
-+#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
-+#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
-+
-+/* ADAPTER CHECK Codes */
-+
-+#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
-+#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
-+#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
-+#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
-+
-+#define _CPMDIO_DISABLE (1 << 0)
-+#define _CPMDIO_HD (1 << 1)
-+#define _CPMDIO_FD (1 << 2)
-+#define _CPMDIO_10 (1 << 3)
-+#define _CPMDIO_100 (1 << 4)
-+#define _CPMDIO_NEG_OFF (1 << 5)
-+#define _CPMDIO_LOOPBK (1 << 16)
-+#define _CPMDIO_NOPHY (1 << 20)
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * Channel specific configuration information. This structure should be
-+ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
-+ * configuration item that can be changed on a per channel basis should
-+ * be represented here. Each module may define this structure with additional
-+ * module-specific members.
-+ */
-+typedef struct
-+ {
-+ int Channel; /**< Channel number. */
-+ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
-+ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
-+
-+#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
-+ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
-+ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
-+ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
-+ int RxServiceMax; /**< Maximum number of packets to service at one time. */
-+
-+ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
-+ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
-+ int TxServiceMax; /**< Maximum number of packets to service at one time. */
-+#endif
-+
-+#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
-+ int Gfc; /**< Generic Flow Control. */
-+ int Clp; /**< Cell Loss Priority. */
-+ int Pti; /**< Payload Type Indication. */
-+#endif
-+
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
-+ int Priority; /**< Priority bin this channel will be scheduled within. */
-+ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
-+ int Vci; /**< Virtual Channel Identifier. */
-+ int Vpi; /**< Virtual Path Identifier. */
-+ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
-+
-+ /* Tx VC State */
-+ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
-+ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
-+ int TxVc_Mbs; /**< Min Burst Size in cells.*/
-+ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
-+
-+ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
-+ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
-+ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Rx VC State */
-+ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
-+ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
-+ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Tx VP State */
-+ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
-+ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
-+ /* Rx VP State */
-+ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
-+ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
-+ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
-+#endif
-+
-+
-+#ifdef _CPHAL_VDMAVT
-+ bit32u RemFifoAddr; /* Mirror mode only. */
-+ bit32u FifoAddr;
-+ bit32 PollInt;
-+ bit32 FifoSize;
-+ int Ready;
-+#endif
-+
-+ }CHANNEL_INFO;
-+
-+/*
-+ * This structure contains each statistic value gathered by the CPHAL.
-+ * Applications may access statistics data by using the @c StatsGet() routine.
-+ */
-+/* STATS */
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+typedef struct
-+ {
-+ bit32u CrcErrors[16];
-+ bit32u LenErrors[16];
-+ bit32u DmaLenErrors[16];
-+ bit32u AbortErrors[16];
-+ bit32u StarvErrors[16];
-+ bit32u TxMisQCnt[16][2];
-+ bit32u RxMisQCnt[16];
-+ bit32u RxEOQCnt[16];
-+ bit32u TxEOQCnt[16][2];
-+ bit32u RxPacketsServiced[16];
-+ bit32u TxPacketsServiced[16][2];
-+ bit32u RxMaxServiced;
-+ bit32u TxMaxServiced[16][2];
-+ bit32u RxTotal;
-+ bit32u TxTotal;
-+ } STAT_INFO;
-+#endif
-+
-+/*
-+ * VDMA Channel specific configuration information
-+ */
-+#ifdef _CPHAL_AAL2
-+typedef struct
-+ {
-+ int Ch; /**< Channel Number */
-+ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
-+ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
-+ }VdmaChInfo;
-+#endif
-+
-+#ifndef _CPHAL
-+ typedef void HAL_DEVICE;
-+ typedef void HAL_PRIVATE;
-+ typedef void HAL_RCB;
-+ typedef void HAL_RECEIVEINFO;
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
-+ int (*Close) (HAL_DEVICE *HalDev, int Mode);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*Init) (HAL_DEVICE *HalDev);
-+ int (*Open) (HAL_DEVICE *HalDev);
-+ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
-+ int (*Probe) (HAL_DEVICE *HalDev);
-+ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
-+ int (*Shutdown) (HAL_DEVICE *HalDev);
-+ int (*Tick) (HAL_DEVICE *HalDev);
-+
-+#ifdef _CPHAL_AAL5
-+ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
-+ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
-+ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
-+#endif
-+ } HAL_FUNCTIONS;
-+
-+/**
-+ * @ingroup shared_data
-+ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
-+ * functions accessible to the CPHAL. The upper layer software is responsible
-+ * for providing the correct OS-specific implementations for the following
-+ * functions. It is populated by calling InitModule() (done by the CPHAL in
-+ * xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
-+ void (*CriticalOn)(void);
-+ void (*CriticalOff)(void);
-+ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
-+ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
-+ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
-+ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
-+ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
-+ void (*Free)(void *MemPtr);
-+ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
-+ void (*FreeDev)(void *MemPtr);
-+ void (*FreeDmaXfer)(void *MemPtr);
-+ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
-+ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
-+ void* (*Malloc)(bit32u size);
-+ void* (*MallocDev)(bit32u Size);
-+ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
-+ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
-+ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
-+ void* (*Memset)(void *Dest, int C, bit32u N);
-+ int (*Printf)(const char *Format, ...);
-+ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
-+ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
-+ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
-+ int (*Sprintf)(char *S, const char *Format, ...);
-+ int (*Strcmpi)(const char *Str1, const char *Str2);
-+ unsigned int (*Strlen)(const char *S);
-+ char* (*Strstr)(const char *S1, const char *S2);
-+ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
-+ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
-+ } OS_FUNCTIONS;
-+
-+/************** MODULE SPECIFIC STUFF BELOW **************/
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/*
-+int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
-+*/
-+
-+int halCpmacInitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+/*
-+ * @ingroup shared_data
-+ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+/*
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
-+ bit32u Mode);
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ } AAL5_FUNCTIONS;
-+*/
-+
-+int cpaal5InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+/**
-+ * @ingroup shared_data
-+ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
-+ int VdmaCh, int UUIDiscard);
-+ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
-+ int LC);
-+ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
-+ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
-+ VdmaChInfo *VdmaCh);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
-+ int RxMultiMode, int TxMultiMode, int SchedMode,
-+ int TcCh);
-+ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
-+ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
-+ } AAL2_FUNCTIONS;
-+
-+int cpaal2InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ AAL2_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_VDMAVT
-+/**
-+ * @ingroup shared_data
-+ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to InitModule().
-+ *
-+ * Note that this list is still under definition.
-+ */
-+typedef struct
-+ {
-+ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
-+ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt);
-+ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt); */
-+ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
-+ bit32u RemDevID);
-+ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
-+ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
-+ } VDMA_FUNCTIONS;
-+
-+int VdmaInitModule(HAL_DEVICE **VdmaVt,
-+ OS_DEVICE *OsDev,
-+ VDMA_FUNCTIONS **VdmaVtFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+/*
-+extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
-+ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
-+ int *Size, int Inst);
-+*/
-+
-+
-+#ifdef _CPHAL_AAL5
-+extern const char hcSarFrequency[];
-+#endif
-+
-+#ifdef _CPHAL_CPMAC
-+/* following will be common, once 'utl' added */
-+extern const char hcClear[];
-+extern const char hcGet[];
-+extern const char hcSet[];
-+extern const char hcTick[];
-+
-+extern const char hcCpuFrequency[];
-+extern const char hcCpmacFrequency[];
-+extern const char hcMdioBusFrequency[];
-+extern const char hcMdioClockFrequency[];
-+extern const char hcCpmacBase[];
-+extern const char hcPhyNum[];
-+extern const char hcSize[];
-+extern const char hcCpmacSize[];
-+extern const char hcPhyAccess[];
-+#endif
-+
-+#endif /* end of _INC_ */
-diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h
---- linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h 2005-07-10 08:02:01.430113488 +0200
-@@ -0,0 +1,629 @@
-+/************************************************************************
-+ * TNETDxxxx Software Support
-+ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
-+ *
-+ * FILE: cphal.h
-+ *
-+ * DESCRIPTION:
-+ * User include file, contains data definitions shared between the CPHAL
-+ * and the upper-layer software.
-+ *
-+ * HISTORY:
-+ * Date Modifier Ver Notes
-+ * 28Feb02 Greg 1.00 Original
-+ * 06Mar02 Greg 1.01 Documentation enhanced
-+ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
-+ * 22Nov02 Mick RC2 Additions from Denis' input on Control
-+ *
-+ * author Greg Guyotte
-+ * version 1.02
-+ * date 18-Jul-2002
-+ *****************************************************************************/
-+#ifndef _INC_CPHAL_H
-+#define _INC_CPHAL_H
-+
-+#ifdef _CPHAL_CPMAC
-+#include "ec_errors_cpmac.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+#include "ec_errors_cpaal5.h"
-+#endif
-+
-+#ifdef _CPHAL_CPSAR
-+#include "ec_errors_cpsar.h"
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+#include "ec_errors_cpaal2.h"
-+#endif
-+
-+#ifndef __ADAM2
-+typedef char bit8;
-+typedef short bit16;
-+typedef int bit32;
-+
-+typedef unsigned char bit8u;
-+typedef unsigned short bit16u;
-+typedef unsigned int bit32u;
-+
-+/*
-+typedef char INT8;
-+typedef short INT16;
-+typedef int INT32;
-+typedef unsigned char UINT8;
-+typedef unsigned short UINT16;
-+typedef unsigned int UINT32;
-+*/
-+/*typedef unsigned int size_t;*/
-+#endif
-+
-+#ifdef _CPHAL
-+
-+#ifndef TRUE
-+#define TRUE (1==1)
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE (1==2)
-+#endif
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+#endif
-+
-+#define VirtToPhys(a) (((int)a)&~0xe0000000)
-+#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
-+#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
-+#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
-+#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
-+/*
-+#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
-+#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
-+*/
-+
-+#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
-+#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
-+
-+/* Channel Teardown Defines */
-+#define RX_TEARDOWN 2
-+#define TX_TEARDOWN 1
-+#define BLOCKING_TEARDOWN 8
-+#define FULL_TEARDOWN 4
-+#define PARTIAL_TEARDOWN 0
-+
-+#define MAX_DIR 2
-+#define DIRECTION_TX 0
-+#define DIRECTION_RX 1
-+#define TX_CH 0
-+#define RX_CH 1
-+#define HAL_ERROR_DEVICE_NOT_FOUND 1
-+#define HAL_ERROR_FAILED_MALLOC 2
-+#define HAL_ERROR_OSFUNC_SIZE 3
-+#define HAL_DEFAULT 0xFFFFFFFF
-+#define VALID(val) (val!=HAL_DEFAULT)
-+
-+/*
-+ERROR REPORTING
-+
-+HAL Module Codes. Each HAL module reporting an error code
-+should OR the error code with the respective Module error code
-+from the list below.
-+*/
-+#define EC_AAL5 EC_HAL|EC_DEV_AAL5
-+#define EC_AAL2 EC_HAL|EC_DEV_AAL2
-+#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
-+#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
-+#define EC_VDMA EC_HAL|EC_DEV_VDMA
-+#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
-+#define EC_CPPI EC_HAL|EC_DEV_CPPI
-+
-+/*
-+HAL Function Codes. Each HAL module reporting an error code
-+should OR the error code with one of the function codes from
-+the list below.
-+*/
-+#define EC_FUNC_HAL_INIT EC_FUNC(1)
-+#define EC_FUNC_CHSETUP EC_FUNC(2)
-+#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
-+#define EC_FUNC_RXRETURN EC_FUNC(4)
-+#define EC_FUNC_SEND EC_FUNC(5)
-+#define EC_FUNC_RXINT EC_FUNC(6)
-+#define EC_FUNC_TXINT EC_FUNC(7)
-+#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
-+#define EC_FUNC_OPTIONS EC_FUNC(9)
-+#define EC_FUNC_PROBE EC_FUNC(10)
-+#define EC_FUNC_OPEN EC_FUNC(11)
-+#define EC_FUNC_CONTROL EC_FUNC(12)
-+#define EC_FUNC_DEVICE_INT EC_FUNC(13)
-+#define EC_FUNC_STATUS EC_FUNC(14)
-+#define EC_FUNC_TICK EC_FUNC(15)
-+#define EC_FUNC_CLOSE EC_FUNC(16)
-+#define EC_FUNC_SHUTDOWN EC_FUNC(17)
-+#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
-+
-+/*
-+HAL Error Codes. The list below defines every type of error
-+used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
-+values in integer order to the bottom of the list.
-+*/
-+#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
-+#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
-+#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
-+#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
-+#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
-+#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
-+#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
-+#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
-+#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
-+#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
-+#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
-+#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
-+
-+#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
-+#define EC_VAL_INVALID_CH EC_ERR(0x0E)
-+#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
-+#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
-+#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
-+#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
-+#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
-+#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
-+#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
-+#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
-+#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
-+#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
-+#define EC_VAL_INVALID_VC EC_ERR(0x19)
-+#define EC_VAL_INVALID_LC EC_ERR(0x20)
-+#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
-+#define EC_VAL_INVALID_CID EC_ERR(0x22)
-+#define EC_VAL_INVALID_UUI EC_ERR(0x23)
-+#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
-+#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
-+
-+#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
-+#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
-+#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
-+#define EC_VAL_NO_TCBS EC_ERR(0x29)
-+#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
-+#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
-+#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
-+#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
-+#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
-+#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
-+
-+#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
-+#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
-+#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
-+#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
-+#define EC_VAL_INVALID_STATE EC_ERR(0x40)
-+#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
-+#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
-+#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
-+#define EC_VAL_NOT_LINKED EC_ERR(0x44)
-+#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
-+#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
-+#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
-+#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
-+#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
-+#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
-+#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
-+#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
-+#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
-+#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
-+#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
-+#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
-+#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
-+
-+/**
-+@defgroup shared_data Shared Data Structures
-+
-+The data structures documented here are shared by all modules.
-+*/
-+
-+/**
-+ * @ingroup shared_data
-+ * This is the fragment list structure. Each fragment list entry contains a
-+ * length and a data buffer.
-+ */
-+typedef struct
-+ {
-+ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
-+ void *data; /**< Pointer to fragment data. */
-+ void *OsInfo; /**< Pointer to OS defined data. */
-+ }FRAGLIST;
-+
-+#if defined (_CPHAL_CPMAC)
-+#define CB_PASSCRC_BIT (1<<26)
-+
-+/* CPMAC CPHAL STATUS */
-+#define CPMAC_STATUS_LINK (1 << 0)
-+#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
-+#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
-+
-+/* ADAPTER CHECK Codes */
-+
-+#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
-+#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
-+#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
-+#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
-+
-+#define _CPMDIO_DISABLE (1 << 0)
-+#define _CPMDIO_HD (1 << 1)
-+#define _CPMDIO_FD (1 << 2)
-+#define _CPMDIO_10 (1 << 3)
-+#define _CPMDIO_100 (1 << 4)
-+#define _CPMDIO_NEG_OFF (1 << 5)
-+#define _CPMDIO_LOOPBK (1 << 16)
-+#define _CPMDIO_NOPHY (1 << 20)
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * Channel specific configuration information. This structure should be
-+ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
-+ * configuration item that can be changed on a per channel basis should
-+ * be represented here. Each module may define this structure with additional
-+ * module-specific members.
-+ */
-+typedef struct
-+ {
-+ int Channel; /**< Channel number. */
-+ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
-+ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
-+
-+#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
-+ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
-+ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
-+ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
-+ int RxServiceMax; /**< Maximum number of packets to service at one time. */
-+
-+ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
-+ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
-+ int TxServiceMax; /**< Maximum number of packets to service at one time. */
-+#endif
-+
-+#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
-+ int Gfc; /**< Generic Flow Control. */
-+ int Clp; /**< Cell Loss Priority. */
-+ int Pti; /**< Payload Type Indication. */
-+#endif
-+
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
-+ int Priority; /**< Priority bin this channel will be scheduled within. */
-+ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
-+ int Vci; /**< Virtual Channel Identifier. */
-+ int Vpi; /**< Virtual Path Identifier. */
-+ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
-+
-+ /* Tx VC State */
-+ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
-+ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
-+ int TxVc_Mbs; /**< Min Burst Size in cells.*/
-+ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
-+
-+ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
-+ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
-+ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Rx VC State */
-+ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
-+ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
-+ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
-+ /* Tx VP State */
-+ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
-+ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
-+ /* Rx VP State */
-+ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
-+ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
-+ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
-+ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
-+ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
-+#endif
-+
-+
-+#ifdef _CPHAL_VDMAVT
-+ bit32u RemFifoAddr; /* Mirror mode only. */
-+ bit32u FifoAddr;
-+ bit32 PollInt;
-+ bit32 FifoSize;
-+ int Ready;
-+#endif
-+
-+ }CHANNEL_INFO;
-+
-+/*
-+ * This structure contains each statistic value gathered by the CPHAL.
-+ * Applications may access statistics data by using the @c StatsGet() routine.
-+ */
-+/* STATS */
-+#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
-+typedef struct
-+ {
-+ bit32u CrcErrors[16];
-+ bit32u LenErrors[16];
-+ bit32u DmaLenErrors[16];
-+ bit32u AbortErrors[16];
-+ bit32u StarvErrors[16];
-+ bit32u TxMisQCnt[16][2];
-+ bit32u RxMisQCnt[16];
-+ bit32u RxEOQCnt[16];
-+ bit32u TxEOQCnt[16][2];
-+ bit32u RxPacketsServiced[16];
-+ bit32u TxPacketsServiced[16][2];
-+ bit32u RxMaxServiced;
-+ bit32u TxMaxServiced[16][2];
-+ bit32u RxTotal;
-+ bit32u TxTotal;
-+ } STAT_INFO;
-+#endif
-+
-+/*
-+ * VDMA Channel specific configuration information
-+ */
-+#ifdef _CPHAL_AAL2
-+typedef struct
-+ {
-+ int Ch; /**< Channel Number */
-+ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
-+ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
-+ }VdmaChInfo;
-+#endif
-+
-+#ifndef _CPHAL
-+ typedef void HAL_DEVICE;
-+ typedef void HAL_PRIVATE;
-+ typedef void HAL_RCB;
-+ typedef void HAL_RECEIVEINFO;
-+#endif
-+
-+/**
-+ * @ingroup shared_data
-+ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
-+ int (*Close) (HAL_DEVICE *HalDev, int Mode);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*Init) (HAL_DEVICE *HalDev);
-+ int (*Open) (HAL_DEVICE *HalDev);
-+ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
-+ int (*Probe) (HAL_DEVICE *HalDev);
-+ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
-+ int (*Shutdown) (HAL_DEVICE *HalDev);
-+ int (*Tick) (HAL_DEVICE *HalDev);
-+
-+#ifdef _CPHAL_AAL5
-+ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
-+ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
-+ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
-+#endif
-+ } HAL_FUNCTIONS;
-+
-+/**
-+ * @ingroup shared_data
-+ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
-+ * functions accessible to the CPHAL. The upper layer software is responsible
-+ * for providing the correct OS-specific implementations for the following
-+ * functions. It is populated by calling InitModule() (done by the CPHAL in
-+ * xxxInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
-+ void (*CriticalOn)(void);
-+ void (*CriticalOff)(void);
-+ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
-+ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
-+ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
-+ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
-+ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
-+ void (*Free)(void *MemPtr);
-+ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
-+ void (*FreeDev)(void *MemPtr);
-+ void (*FreeDmaXfer)(void *MemPtr);
-+ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
-+ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
-+ void* (*Malloc)(bit32u size);
-+ void* (*MallocDev)(bit32u Size);
-+ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
-+ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
-+ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
-+ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
-+ void* (*Memset)(void *Dest, int C, bit32u N);
-+ int (*Printf)(const char *Format, ...);
-+ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
-+ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
-+ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
-+ int (*Sprintf)(char *S, const char *Format, ...);
-+ int (*Strcmpi)(const char *Str1, const char *Str2);
-+ unsigned int (*Strlen)(const char *S);
-+ char* (*Strstr)(const char *S1, const char *S2);
-+ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
-+ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
-+ } OS_FUNCTIONS;
-+
-+/************** MODULE SPECIFIC STUFF BELOW **************/
-+
-+#ifdef _CPHAL_CPMAC
-+
-+/*
-+int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
-+*/
-+
-+int halCpmacInitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL5
-+/*
-+ * @ingroup shared_data
-+ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+/*
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
-+ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
-+ bit32u Mode);
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ } AAL5_FUNCTIONS;
-+*/
-+
-+int cpaal5InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ HAL_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_AAL2
-+/**
-+ * @ingroup shared_data
-+ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to cphalInitModule().
-+ */
-+typedef struct
-+ {
-+ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
-+ int (*Close)(HAL_DEVICE *HalDev, int Mode);
-+ int (*Init)(HAL_DEVICE *HalDev);
-+ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
-+ int (*Open)(HAL_DEVICE *HalDev);
-+ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
-+ int (*Probe)(HAL_DEVICE *HalDev);
-+
-+ int (*StatsClear)(HAL_DEVICE *HalDev);
-+ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
-+ int (*Status)(HAL_DEVICE *HalDev);
-+ void (*Tick)(HAL_DEVICE *HalDev);
-+ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
-+ int VdmaCh, int UUIDiscard);
-+ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
-+ int LC);
-+ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
-+ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
-+ VdmaChInfo *VdmaCh);
-+ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
-+ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
-+ int RxMultiMode, int TxMultiMode, int SchedMode,
-+ int TcCh);
-+ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
-+ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
-+ } AAL2_FUNCTIONS;
-+
-+int cpaal2InitModule(HAL_DEVICE **HalDev,
-+ OS_DEVICE *OsDev,
-+ AAL2_FUNCTIONS **HalFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+#ifdef _CPHAL_VDMAVT
-+/**
-+ * @ingroup shared_data
-+ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
-+ * software. The upper layer software receives these pointers through the
-+ * call to InitModule().
-+ *
-+ * Note that this list is still under definition.
-+ */
-+typedef struct
-+ {
-+ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
-+ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt);
-+ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
-+ bit32u Addr, bit32u Size, bit32u PollInt); */
-+ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
-+ bit32u RemDevID);
-+ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
-+ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
-+ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
-+ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
-+ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
-+ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
-+ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
-+ } VDMA_FUNCTIONS;
-+
-+int VdmaInitModule(HAL_DEVICE **VdmaVt,
-+ OS_DEVICE *OsDev,
-+ VDMA_FUNCTIONS **VdmaVtFunc,
-+ OS_FUNCTIONS *OsFunc,
-+ int OsFuncSize,
-+ int *HalFuncSize,
-+ int Inst);
-+#endif
-+
-+/*
-+extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
-+ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
-+ int *Size, int Inst);
-+*/
-+
-+
-+#ifdef _CPHAL_AAL5
-+extern const char hcSarFrequency[];
-+#endif
-+
-+#ifdef _CPHAL_CPMAC
-+/* following will be common, once 'utl' added */
-+extern const char hcClear[];
-+extern const char hcGet[];
-+extern const char hcSet[];
-+extern const char hcTick[];
-+
-+extern const char hcCpuFrequency[];
-+extern const char hcCpmacFrequency[];
-+extern const char hcMdioBusFrequency[];
-+extern const char hcMdioClockFrequency[];
-+extern const char hcCpmacBase[];
-+extern const char hcPhyNum[];
-+extern const char hcSize[];
-+extern const char hcCpmacSize[];
-+extern const char hcPhyAccess[];
-+#endif
-+
-+#endif /* end of _INC_ */
-diff -urN linux.old/drivers/atm/sangam_atm/dev_host_interface.h linux.dev/drivers/atm/sangam_atm/dev_host_interface.h
---- linux.old/drivers/atm/sangam_atm/dev_host_interface.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dev_host_interface.h 2005-07-10 08:02:01.432113184 +0200
-@@ -0,0 +1,1162 @@
-+#ifndef __DEV_HOST_INTERFACE_H__
-+#define __DEV_HOST_INTERFACE_H__ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: Public header file for the Host-to-DSP interface
-+********************************************************************************
-+*
-+* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
-+*
-+* (C) Copyright Texas Instruments Inc. 2002. All rights reserved.
-+*
-+* Property of Texas Instruments Incorporated
-+*
-+* Restricted Rights - Use, duplication, or disclosure is subject to
-+* restrictions set forth in TI's program license agreement and
-+* associated documentation
-+*
-+*
-+* FILE NAME: dev_host_interface.h
-+*
-+* DESCRIPTION:
-+* This header file defines the variables and parameters used between the
-+* host processor and the DSP. This file is included in both the DSP
-+* software and the host software.
-+*
-+* RULES FOR MODIFICATION AND USE OF THIS FILE:
-+*
-+* --The main pointer to the struct of pointers will always be at the same fixed
-+* location (0x80000000).
-+*
-+* --Each pointer element in the struct of pointers (indicated by the main pointer)
-+* will always point to a struct only.
-+*
-+* --Any new structures added to the host interface in subsequent versions must
-+* each have a corresponding new pointer element added to the END of the struct
-+* of pointers. Other than this, there will never be any moving or rearranging
-+* of the pointer elements in the struct of pointers.
-+*
-+* --Any new elements added to existing structures will be added at the END of the
-+* structure. Other than this, there will never be any moving or rearranging
-+* of structure elements.
-+*
-+* --A new structure will never be added as a new element in an old structure.
-+* New structures must be added separately with a new entry in the struct of
-+* pointers, as noted above.
-+*
-+* --Also, the sizes of existing arrays within old structures will never be changed.
-+*
-+* --The modem code in the DSP will never reference the struct of pointers in order
-+* to avoid aliasing issues in the DSP code. The modem code will only use the
-+* specific structures directly.
-+*
-+* --The host processor never accesses the DSP side of the ATM-TC hardware directly.
-+* The DSP interfaces directly to the ATM-TC hardware and relays information to
-+* the host processor through the host interface.
-+*
-+* --The host processor can track the modem's transition through important states
-+* by accessing the Modem State Bit Field in the host interface. Each bit in
-+* the bit field represents an important state to track in the modem. As the
-+* modem transitions through each important state, the corresponding bit will
-+* change from a zero to a one. Each bit in the bit field will only be reset to
-+* zero if the modem retrains. If new states need to be tracked and are added
-+* in subsequent versions of the host interface, a corresponding bit will be
-+* added at the END of the bit field to ensure backwards compatibility. The
-+* Modem State Bit Field is reset if the modem retrains or falls out of Showtime.
-+*
-+* --An interrupt will be sent to the host processor when a change occurs in the
-+* Modem State Bit Field. There is an interrupt masking register which can mask
-+* specific interrupts corresponding to the bits of the Modem State Bit Field.
-+* This allows the host to keep an interrupt from being generated for those
-+* states that are masked.
-+*
-+* HISTORY:
-+*
-+* 11/20/02 J. Bergsagel Written from the previous host interface file
-+* 11/27/02 J. Bergsagel Added comments for mailbox control struct and
-+* fixed a couple items for overlay page stuff.
-+* Also, added temporary elements for SWTC code.
-+* 12/04/02 J. Bergsagel Added extra dummy byte to DEV_HOST_eocVarDef_t
-+* for proper word alignment.
-+* 12/12/02 J. Bergsagel Changed initial states in the modem state bit field
-+* and added more instructions for adding more states.
-+* 12/16/02 J. Bergsagel Changed name "hostVersion_p" to "hostIntfcVersion_p".
-+* Removed dspAturState from DEV_HOST_modemStateBitField_t.
-+* Reorganized several struct elements to clean up the
-+* host interface.
-+* 12/27/02 Sameer V Added missing channel 0 statistics for TC. Added
-+* ocd error information.
-+* 12/27/02 Sameer V Added overlayState to OlayDP_Parms to indicate whether
-+* overlays are being executed in current state.
-+* 01/06/03 J. Bergsagel Added maxAllowedMargin and minRequiredMargin to
-+* DEV_HOST_msg_t.
-+* Renamed TC chan 1 items to be chan 0 items to start out.
-+* 01/17/03 Sameer V Moved delineationState to atmStats structure.
-+* 01/21/03 Barnett Implemented Ax7 UNIT-MODULE modular software framework.
-+* 01/22/03 J. Bergsagel Added warning comments for certain struct typedefs.
-+* 01/23/03 C. Perez-N. Removed old AX5-only diags. command/response entries in the
-+* HOST and DSP ennumerations, and added the AX7 new ones
-+* Added pointer entries in the DEV_HOST_dspOamSharedInterface_t
-+* structure pointing to the analog diags. input/output/options
-+* structures.
-+* 01/29/03 Sameer V Removed TC_IDLE in enum for delineation state. Hardware
-+* only reports TC_HUNT, TC_PRESYNC and TC_SYNC.
-+* 03/07/03 Sameer/Jonathan Put SWTC token around structs and elements only used by SWTC
-+* 03/12/03 Mannering Add CO profile data structures
-+* 03/18/03 J. Bergsagel Removed the obsolete DSP_CHECK_TC response message.
-+* 03/24/03 J. Bergsagel Added DEV_HOST_hostInterruptMask_t for masking DSP interrupt sources
-+* 03/28/03 C. Perez-N Changed the C-style comments and made them C++ sytle instead.
-+* Replaced the occurrences of "SINT32 *" pointer declarations with
-+* "PSINT32"
-+* 03/28/03 Mannering Update CO profile data structures
-+* 04/04/03 S. Yim Add host I/F hooks for switchable hybrid and RJ11
-+* inner/outer pair selection
-+* 04/11/03 J. Bergsagel Changed modem state bit field struct types to enums instead and used
-+* a single integer variable for each "bitfield".
-+* Changed bit field for host interrupt masks to an integer value also.
-+* 04/14/03 J. Bergsagel Changed name of table pointer "meanSquareTblDstrm_p" to "marginTblDstrm_p".
-+* 04/03/03 Umesh Iyer CMsg1 and RMsg1 use the same storage as CMSGPCB and RMSGPCB.
-+* The string lengths for these have been adjusted to hold the longest
-+* message in each case. The PCB messages from ADSL2 are longer.
-+* 04/21/03 Sameeer V Added new host mailbox message for shutting down the DSLSS peripherals.
-+* 04/23/03 J. Bergsagel Fixed comments for overlay mailbox messages and for losErrors.
-+* 04/28/03 Mannering Added skip phase op flag to CO profile data structure
-+* 05/05/03 Mannering Review Comments - Removed "#if CO_PROFILE" from around structure
-+* definitions and define the number of profiles (DEV_HOST_LIST_ENTRIES)
-+* 05/13/03 J. Bergsagel Added new elements to DEV_HOST_phyPerf_t for host control of hybrid.
-+* 05/15/03 J. Bergsagel Added "farEndLosErrors" and "farEndRdiErrors" to DEV_HOST_modemStatsDef_t.
-+* 05/16/03 Mannering Updated CO profile structure to support updated bit allocation and
-+* interopability.
-+* 05/20/03 Sameer V Added DSP message to inicate DYING GASP.
-+* 05/22/03 J. Bergsagel Added a new struct typedef "DEV_HOST_hostInterruptSource_t".
-+* Added "atucGhsRevisionNum" to "DEV_HOST_dspWrNegoParaDef_t".
-+* Moved the following struct typedef's here to the public host interface:
-+* DEV_HOST_dspBitSwapDef_t
-+* DEV_HOST_atmDsBert_t
-+* 05/28/03 A. Redfern Changed pointer type and location for margin reporting.
-+* 05/28/03 Mannering Moved CO profile defines to dev_host_interface_pvt.h
-+* 05/28/03 J. Bergsagel Moved subStateIndex and STM BERT controls into new struct "DEV_HOST_modemEnvPublic_t"
-+* 05/29/03 J. Bergsagel Added elements to "DEV_HOST_modemEnvPublic_t" for host control of DSLSS LED's.
-+* 06/10/03 Umesh Iyer Modified trainMode check to be compliant with the new host i/f mods.
-+* 06/05/03 J. Bergsagel Added enum that will eventually replace the bitfield: DEV_HOST_diagAnlgOptionsVar_t.
-+* Added new element "currentHybridNumUsed" in the DEV_HOST_phyPerf_t typedef
-+* Added new host control flags for LPR signal detection on GPIO[0].
-+* 06/06/03 A. Redfern Removed fine gain scale from the CO profile and added max downstream power cutback.
-+* Changed "test1" in CO profile struct to "phyEcDelayAdjustment".
-+* 06/26/03 J. Bergsagel Added genericStructure typedef and two pointer elements of this type in the big table.
-+* 07/03/03 Jack Huang Renamed test2 to bSwapThresholdUpdate
-+* 07/07/03 Mallesh Changed phySigTxPowerCutback_f flag to a variable phySigTxGainReductionAt0kft which indicates the
-+* amount of gain reduction in linear scale.
-+* 07/15/03 Sameer V Changed DEV_HOST_diagAnlgOptionsVar_t to be an enum instead of a bit field. Host code
-+* does not support setting bit fields.
-+* 07/22/03 Jack Huang Added bitswap control flag in host i/f for API calls
-+* 08/06/03 Sameer V Added missingToneDs_p to the DEV_HOST_oamWrNegoParaDef_t to enable host to switch off
-+* DS tones on specified bins
-+* 08/21/03 Jack Huang Added pcbEnabled flag in the DEV_HOST_modemEnvPublic_t structure
-+* Added g.hs buffer definitions to DEV_HOST_dspOamSharedInterface_t
-+* Added DEV_HOST_consBufDef_t to the DEV_HOST_dspOamSharedInterface_t structure
-+* 08/26/03 J. Bergsagel Fixed name of "missingToneDs_p" to be "missingToneDsAddr" instead (since it is
-+* not really used as a pointer).
-+* 09/11/03 Mallesh Added a flag "usPilotInT1413ModeInMedley" to determine the need to send Upstream Pilot
-+* in medley in T1.413 mode.
-+* 09/12/03 J. Bergsagel Changed "test3" to "phyBitaFastPathExcessFineGainBump" in CO profile struct.
-+* Changed "test4" to "phyBitaSkipGapAdjustment" in CO profile struct.
-+* 09/23/03 J. Bergsagel Changed "T1413vendorRevisionNumber" to "vendorRevisionNumber" in DEV_HOST_msg_t.
-+* Added ADSL2 and ADSL2 diag. states to the modem state bit field.
-+* 10/01/03 J. Bergsagel Changed define of "MULTI_MODE" to be 255 to indicate that all possible bits
-+* in the 8-bit bit field are turned on for any current and future training modes.
-+* 10/09/03 M. Turkboylari Added DSP_TRAINING_MSGS and adsl2DeltMsgs_p, which is a pointer to a pointer,
-+* in order to pass the ADSL2 training and DELT messages to the host side. This is for ACT.
-+* 10/20/03 Mallesh Added a GHS state enumerator for cleardown
-+* 10/20/03 Xiaohui Li Add definition for READSL2_MODE and READSL2_DELT
-+* 11/07/03 J. Bergsagel Removed all code for when SWTC==1, which therefore allows removal of include of
-+* "env_def_defines.h". We shouldn't have any compile tokens used in this file.
-+* (the SWTC token is always off in any Ax7 code).
-+* 11/14/03 J. Bergsagel Also removed READSL2_ENABLE token (no more compile tokens to be used in this .h file).
-+* 12/12/03 Sameer/Ram Added DEV_HOST_EOCAOC_INTERRUPT_MASK to enable host to disable response code for AOC/EOC
-+* mailbox messages
-+* 12/09/03 Jack Huang Changed G.hs txbuf size from 60 to 64 to fit the max segment size
-+* 12/15/03 Mallesh Changed vendor ID type defenition from SINT16 to UINT16
-+* 12/23/03 Sameer V Added ability to turn off constellation display reporting to host using oamFeature bit field.
-+* 12/24/03 Sameer V Changed comment for Constellation Display Current Address to Host Write instead of DSP Write.
-+* 12/26/03 Sameer/Ram Added DEV_HOST_GHSMSG_INTERRUPT_MASK to enable host to disable response code for GHS Messages
-+* (C) Copyright Texas Instruments Inc. 2002. All rights reserved.
-+*******************************************************************************/
-+
-+#include "dev_host_verdef.h"
-+
-+// ---------------------------------------------------------------------------------
-+// Address of the pointer to the DEV_HOST_dspOamSharedInterface_s struct of pointers
-+// This is where it all starts.
-+// ---------------------------------------------------------------------------------
-+#define DEV_HOST_DSP_OAM_POINTER_LOCATION 0x80000000
-+
-+// The define "MAX_NUM_UPBINS" is used in "DEV_HOST_diagAnlgInputVar_t" below.
-+// This value can never be changed (for host intf. backwards compatibility)
-+#define MAX_NUM_UPBINS 64
-+
-+// -----------------------------------------------
-+// Begin common enumerations between DSP and host.
-+// -----------------------------------------------
-+
-+// These Host-to-DSP commands are organized into two groups:
-+// immediate state change commands and status affecting commands.
-+// Do not add or remove commands except at the bottom since the DSP assumes this sequence.
-+
-+enum
-+{
-+ HOST_ACTREQ, // Send R-ACKREQ and monitor for C-ACKx
-+ HOST_QUIET, // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
-+ HOST_XMITBITSWAP, // Perform upstream bitswap - FOR INTERNAL USE ONLY
-+ HOST_RCVBITSWAP, // Perform downstream bitswap - FOR INTERNAL USE ONLY
-+ HOST_RTDLPKT, // Send a remote download packet - FOR INTERNAL USE ONLY
-+ HOST_CHANGELED, // Read the LED settings and change accordingly
-+ HOST_IDLE, // Sit quiet
-+ HOST_REVERBTEST, // Generate REVERB for manufacturing test
-+ HOST_CAGCTEST, // Set coarse receive gain for manufacturing test
-+ HOST_DGASP, // send Dying Gasp messages through EOC channel
-+ HOST_GHSREQ, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHS_SENDGALF, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSEXIT, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSMSG1, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_HYBRID, // Enable/Disable automatic hybrid switch
-+ HOST_RJ11SELECT, // RJ11 inner/outer pair select
-+ HOST_DIGITAL_MEM, // Digital Diags: run external memory tests
-+ HOST_TXREVERB, // AFE Diags: TX path Reverb
-+ HOST_TXMEDLEY, // AFE Diags: TX path Medley
-+ HOST_RXNOISEPOWER, // AFE Diags: RX noise power
-+ HOST_ECPOWER, // AFE Diags: RX eco power
-+ HOST_ALL_ADIAG, // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
-+ HOST_USER_ADIAG, // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
-+ HOST_QUIT_ADIAG, // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
-+ HOST_NO_CMD, // All others - G.hs - FOR INTERNAL USE ONLY
-+ HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
-+ HOST_SET_GENERIC, // Set generic CO profile
-+ HOST_UNDO_GENERIC, // Set profile previous to Generic
-+ HOST_GHS_CLEARDOWN // G.hs - FOR INTERNAL USE ONLY to start cleardown
-+};
-+
-+// These DSP-to-Host responses are organized into two groups:
-+// responses to commands and requests for OAM services.
-+
-+enum
-+{
-+ DSP_IDLE, // R_IDLE state entered
-+ DSP_ACTMON, // R_ACTMON state entered
-+ DSP_TRAIN, // R_TRAIN state entered
-+ DSP_ACTIVE, // R_ACTIVE state entered
-+ DSP_XMITBITSWAP, // Upstream bitswap complete - FOR INTERNAL USE ONLY
-+ DSP_RCVBITSWAP, // Downstream bitswap complete - FOR INTERNAL USE ONLY
-+ DSP_RTDL, // R_RTDL state entered - FOR INTERNAL USE ONLY
-+ DSP_RRTDLPKT, // RTDL packet received - FOR INTERNAL USE ONLY
-+ DSP_XRTDLPKT, // RTDL packet transmitted - FOR INTERNAL USE ONLY
-+ DSP_ERROR, // Command rejected, wrong state for this command
-+ DSP_REVERBTEST, // Manufacturing REVERB test mode entered
-+ DSP_CAGCTEST, // Manufacturing receive gain test done
-+ DSP_OVERLAY_START, // Notify host that page overlay has started - overlay number indicated by "tag"
-+ DSP_OVERLAY_END, // Notify host that page overlay has ended - overlay number indicated by "tag"
-+ DSP_CRATES1, // CRATES1 message is valid and should be copied to host memory now
-+ DSP_SNR, // SNR calculations are ready and should be copied to host memory now
-+ DSP_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
-+ DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
-+ DSP_ATM_TC_SYNC, // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
-+ DSP_ATM_NO_TC_SYNC, // Indicates loss of sync on phy layer on either US or DS.
-+ DSP_HYBRID, // DSP completed hybrid switch
-+ DSP_RJ11SELECT, // DSP completed RJ11 inner/outer pair select
-+ DSP_INVALID_CMD, // Manufacturing (Digital and AFE) diags: CMD received not recognized
-+ DSP_TEST_PASSED, // Manufacturing diags: test passed
-+ DSP_TEST_FAILED, // Manufacturing diags: test failed
-+ DSP_TXREVERB, // Manufacturing AFE diags: Response to HOST_TXREVERB
-+ DSP_TXMEDLEY, // Manufacturing AFE diags: Response to HOST_TXMEDLEY
-+ DSP_RXNOISEPOWER, // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
-+ DSP_ECPOWER, // Manufacturing AFE diags: Response to HOST_ECPOWER
-+ DSP_ALL_ADIAG, // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
-+ DSP_USER_ADIAG, // Manufacturing AFE diags: Response to HOST_USER_ADIAG
-+ DSP_QUIT_ADIAG, // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
-+ DSP_DGASP, // DSP Message to indicate dying gasp
-+ DSP_EOC, // DSP Message to indicate that DSP sent an EOC message to CO
-+ DSP_TRAINING_MSGS // DSP Message to indicate that host has to copy the training message specified in the tag field.
-+};
-+
-+// Define different ADSL training modes.
-+//Defintions as per new host interface.
-+#define NO_MODE 0
-+#define GDMT_MODE 2
-+#define GLITE_MODE 4
-+#define ADSL2_MODE 8
-+#define ADSL2_DELT (ADSL2_MODE+1)
-+#define ADSL2PLUS_MODE 16
-+#define ADSL2PLUS_DELT (ADSL2PLUS_MODE+1)
-+#define READSL2_MODE 32
-+#define READSL2_DELT (READSL2_MODE+1)
-+#define T1413_MODE 128
-+#define MULTI_MODE 255 // all possible bits are set in the bit field
-+
-+// Define the reason for dropping the connection
-+
-+enum
-+{
-+ REASON_LOS = 0x01,
-+ REASON_DYING_GASP = 0x02,
-+ REASON_USCRCERR = 0x04,
-+ REASON_MARGIN_DROP = 0x08
-+};
-+
-+
-+// ----------------------------------------------------
-+// Begin modem state bit field definitions - DSP write.
-+// ----------------------------------------------------
-+
-+// BitField1 for initial states and G.hs states.
-+// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
-+// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
-+// that causes the proper values to be entered into the modem state bit fields.
-+typedef enum
-+{
-+ ZERO_STATE1 = 0,
-+ RTEST = 0x1,
-+ RIDLE = 0x2,
-+ RINIT = 0x4,
-+ RRESET = 0x8,
-+ GNSFLR = 0x10,
-+ GTONE = 0x20,
-+ GSILENT = 0x40,
-+ GNEGO = 0x80,
-+ GFAIL = 0x100,
-+ GACKX = 0x200,
-+ GQUIET2 = 0x400
-+} DEV_HOST_stateBitField1_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
-+
-+// BitField2 for T1.413 states and for the rest of the modem states (so far)
-+// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
-+// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
-+// that causes the proper values to be entered into the modem state bit fields.
-+typedef enum
-+{
-+ ZERO_STATE2 = 0,
-+ TNSFLR = 0x1,
-+ TACTREQ = 0x2,
-+ TACTMON = 0x4,
-+ TFAIL = 0x8,
-+ TACKX = 0x10,
-+ TQUIET2 = 0x20,
-+ RQUIET2 = 0x40,
-+ RREVERB1 = 0x80,
-+ RQUIET3 = 0x100,
-+ RECT = 0x200,
-+ RREVERB2 = 0x400,
-+ RSEGUE1 = 0x800,
-+ RREVERB3 = 0x1000,
-+ RSEGUE2 = 0x2000,
-+ RRATES1 = 0x4000,
-+ RMSGS1 = 0x8000,
-+ RMEDLEY = 0x10000,
-+ RREVERB4 = 0x20000,
-+ RSEGUE3 = 0x40000,
-+ RMSGSRA = 0x80000,
-+ RRATESRA = 0x100000,
-+ RREVERBRA = 0x200000,
-+ RSEGUERA = 0x400000,
-+ RMSGS2 = 0x800000,
-+ RRATES2 = 0x1000000,
-+ RREVERB5 = 0x2000000,
-+ RSEGUE4 = 0x4000000,
-+ RBNG = 0x8000000,
-+ RREVERB6 = 0x10000000,
-+ RSHOWTIME = 0x20000000
-+} DEV_HOST_stateBitField2_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
-+
-+// BitField3 for ADSL2 states
-+// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
-+// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
-+// that causes the proper values to be entered into the modem state bit fields.
-+typedef enum
-+{
-+ ZERO_STATE3 = 0,
-+ G2QUIET1 = 0x1,
-+ G2COMB1 = 0x2,
-+ G2QUIET2 = 0x4,
-+ G2COMB2 = 0x8,
-+ G2ICOMB1 = 0x10,
-+ G2LINEPROBE = 0x20,
-+ G2QUIET3 = 0x40,
-+ G2COMB3 = 0x80,
-+ G2ICOMB2 = 0x100,
-+ G2RMSGFMT = 0x200,
-+ G2RMSGPCB = 0x400,
-+ G2REVERB1 = 0x800,
-+ G2QUIET4 = 0x1000,
-+ G2REVERB2 = 0x2000,
-+ G2QUIET5 = 0x4000,
-+ G2REVERB3 = 0x8000,
-+ G2ECT = 0x10000,
-+ G2REVERB4 = 0x20000,
-+ G2SEGUE1 = 0x40000,
-+ G2REVERB5 = 0x80000,
-+ G2SEGUE2 = 0x100000,
-+ G2RMSG1 = 0x200000,
-+ G2MEDLEY = 0x400000,
-+ G2EXCHANGE = 0x800000,
-+ G2RMSG2 = 0x1000000,
-+ G2REVERB6 = 0x2000000,
-+ G2SEGUE3 = 0x4000000,
-+ G2RPARAMS = 0x8000000,
-+ G2REVERB7 = 0x10000000,
-+ G2SEGUE4 = 0x20000000
-+} DEV_HOST_stateBitField3_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
-+
-+// BitField4 for ADSL2 diag. states
-+// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
-+// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
-+// that causes the proper values to be entered into the modem state bit fields.
-+typedef enum
-+{
-+ ZERO_STATE4 = 0,
-+ GDSEGUE1 = 0x1,
-+ GDREVERB5 = 0x2,
-+ GDSEGUE2 = 0x4,
-+ GDEXCHANGE = 0x8,
-+ GDSEGUELD = 0x10,
-+ GDRMSGLD = 0x20,
-+ GDQUIET1LD = 0x40,
-+ GDQUIET2LD = 0x80,
-+ GDRACK1 = 0x100,
-+ GDRNACK1 = 0x200,
-+ GDQUIETLAST = 0x400
-+} DEV_HOST_stateBitField4_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
-+
-+// This struct collects all of the bitfield types listed above for the modem state bit field(s)
-+typedef struct
-+{
-+ DEV_HOST_stateBitField1_t bitField1; // this is the first modem state bit field (mostly init. and G.hs)
-+ DEV_HOST_stateBitField2_t bitField2; // this is the second modem state bit field (T1.413 and G.dmt)
-+ DEV_HOST_stateBitField3_t bitField3; // this is the third modem state bit field (ADSL2)
-+ DEV_HOST_stateBitField4_t bitField4; // this is the fourth modem state bit field (ADSL2 diag.)
-+} DEV_HOST_modemStateBitField_t;
-+
-+
-+// -----------------------------------------------
-+// Begin NegoPara message definitions - DSP write.
-+// -----------------------------------------------
-+
-+typedef struct
-+{
-+ UINT8 trainMode; // Train mode selected. See training modes defined above.
-+ UINT8 bDummy1; // dummy byte for explicit 32-bit alignment
-+ UINT16 lineLength; // Contains loop length estimate. Accuracy w/i 500 ft. LSbit = 1 for straight loop, = 0 for bridge tap
-+ UINT32 atucVendorId; // Pass the vendor id of the CO to the host
-+ UINT8 cMsgs1[8]; // CMsgs1 and CMSGPCB
-+ UINT16 adsl2DSRate; //
-+ UINT8 cRates2; //
-+ UINT8 rRates2; //
-+ UINT8 rRates1[4][11]; //
-+ UINT8 cMsgs2[4]; //
-+ UINT8 cRates1[4][30]; //
-+ UINT8 rMsgs2[4]; //
-+ UINT16 adsl2USRate; //
-+ UINT8 atucGhsRevisionNum; // Pass the G.hs Revision number of the CO to the host
-+ UINT8 reserved1; //
-+ PUINT8 *adsl2DeltMsgs_p; // This pointer to a pointer passes the address of the globalvar.pString, which is also
-+ // a pointer list of pointers. It will be used to pass all the new ADSL2 DELT messages to
-+ // host side. This is for ACT.
-+} DEV_HOST_dspWrNegoParaDef_t;
-+
-+
-+// ----------------------------------------------------
-+// Begin OAM NegoPara message definitions - Host write.
-+// ----------------------------------------------------
-+
-+// OAM Feature bit fields.
-+//
-+// Bit 0 - Enable auto retrain of modem
-+// Bit 1 - Detect and report TC sync to host
-+// Bit 2-31 - Reserved
-+
-+#define DEV_HOST_AUTORETRAIN_ON 0x00000001
-+#define DEV_HOST_TC_SYNC_DETECT_ON 0x00000002
-+
-+#define DEV_HOST_AUTORETRAIN_MASK 0x00000001
-+#define DEV_HOST_TC_SYNC_DETECT_MASK 0x00000002
-+#define DEV_HOST_EOCAOC_INTERRUPT_MASK 0x00000004
-+#define DEV_HOST_CONS_DISP_DISABLE_MASK 0x00000008
-+#define DEV_HOST_GHSMSG_INTERRUPT_MASK 0x00000010
-+
-+typedef struct
-+{
-+ UINT8 stdMode; // Desired train mode. See training modes defined above.
-+ UINT8 ghsSequence; // Selected G.hs session as shown in Appendix 1
-+ UINT8 usPilotFlag; // Value of 1 indicates transmit an upstream pilot on bin 16
-+ UINT8 bDummy1; // dummy byte for 32-bit alignment
-+ UINT8 rMsgs1[38]; // RMSG-1(6) and RMSG_PCB (38)
-+ UINT8 bDummy2[2]; // dummy bytes for 32-bit alignment
-+ UINT32 oamFeature; // 32 bit wide bit field to set OAM-specific features.
-+ SINT8 marginThreshold; // Threshold for margin reporting
-+ UINT8 hostFixAgc; // flag to force datapump to bypass AGC training and use the following values
-+ UINT8 hostFixEqualizer; // forced analog equalizer value used during AGC training when hostfix_agc is on
-+ UINT8 hostFixPga1; // forced pga1 value used during AGC training when hostFixAgc is on
-+ UINT8 hostFixPga2; // forced pga2 value used during AGC training when hostFixAgc is on
-+ UINT8 hostFixPga3; // forced pga3 value used during AGC training when hostFixAgc is on
-+ UINT8 marginMonitorShwtme; // margin monitoring flag (during showtime)
-+ UINT8 marginMonitorTrning; // margin monitoring flag (during training)
-+ UINT8 disableLosAlarm; // flag to disable training based on los
-+ UINT8 usCrcRetrain; // flag to disable retrain due to excessive USCRC
-+ UINT8 t1413VendorId[2]; // Vendor ID used for T1.413 trainings
-+ UINT8 gdmtVendorId[8]; // Vendor ID used for G.dmt trainings (ITU VendorID)
-+ UINT8 missingTones[64]; // 64 element array to define missing tones for TX_MEDLEY and TX REVERB tests
-+ UINT32 missingToneDsAddr; // Address given to DSP for tones to be switched off in DS direction
-+ UINT8 dsToneTurnoff_f; // This flag controls the DS tone turn off logic
-+ UINT8 reserved1; // Dummy bytes
-+ UINT8 reserved2; // Dummy bytes
-+ UINT8 reserved3; // Dummy bytes
-+} DEV_HOST_oamWrNegoParaDef_t;
-+
-+
-+// ----------------------------------------
-+// Begin Rate-adaptive message definitions.
-+// ----------------------------------------
-+
-+// The four values below can never be changed (for host intf. backwards compatibility)
-+#define DEV_HOST_RMSGSRA_LENGTH 10
-+#define DEV_HOST_RRATESRA_LENGTH 1
-+#define DEV_HOST_CRATESRA_LENGTH 120
-+#define DEV_HOST_CMSGSRA_LENGTH 6
-+
-+typedef struct
-+{
-+ UINT8 rRatesRaString[DEV_HOST_RRATESRA_LENGTH+3];
-+ UINT8 rMsgsRaString[DEV_HOST_RMSGSRA_LENGTH+2];
-+ UINT8 cMsgsRaString[DEV_HOST_CMSGSRA_LENGTH+2];
-+} DEV_HOST_raMsgsDef_t;
-+
-+
-+// ----------------------------------------------
-+// Begin superframe cnts definitions - DSP write.
-+// ----------------------------------------------
-+
-+#define DEV_HOST_FRAMES_PER_SUPER 68
-+#define DEV_HOST_SUPERFRAMECNTDSTRM 0
-+#define DEV_HOST_SUPERFRAMECNTUSTRM 4
-+
-+// Although only the least significant 8 bits should be used as an
-+// unsigned char for computing the bitswap superframe number, a
-+// full 32 bit counter is provided here in order to have an
-+// accurate indicator of the length of time that the modem has
-+// been connected. This counter will overflow after 2.35 years
-+// of connect time.
-+
-+typedef struct
-+{
-+ UINT32 wSuperFrameCntDstrm;
-+ UINT32 wSuperFrameCntUstrm;
-+} DEV_HOST_dspWrSuperFrameCntDef_t;
-+
-+
-+// --------------------------------
-+// Begin ATUR/ATUC msg definitions.
-+// --------------------------------
-+
-+// Grouping used by the DSP to simplify parameter passing.
-+// All of these are written by the DSP.
-+
-+typedef struct
-+{
-+ UINT16 vendorId; // TI's vendor ID = 0x0004; Amati's vendor ID = 0x0006
-+ UINT8 versionNum; // T1.413 issue number
-+ UINT8 rateAdapt; // 0 = fix rate (Default); 1= adaptive rate
-+ UINT8 trellis; // 0 = disable trellis(default); 1 = enable trellis
-+ UINT8 echoCancelling; // 0 = disable echo cancelling; 1 = enable echo cancelling(default)
-+ UINT8 maxBits; // value range: 0-15; default = 15
-+ UINT8 maxPsd; //
-+ UINT8 actualPsd; //
-+ UINT8 maxIntlvDepth; // 0, 1, 2, or 3 for 64, 128, 256, or 512 max depth
-+ UINT8 framingMode; // 0 for asynchronous, 1 for synchronous full overhead
-+ // 2 for reduced overhead, 3 for merged reduced overhead DSP write.
-+ UINT8 maxFrameMode; // maximum framing mode desired. Nor 0 or 3.
-+ SINT16 targetMargin; //
-+ SINT16 maxAllowedMargin; //
-+ SINT16 minRequiredMargin; //
-+ SINT16 maxTotBits; //
-+ UINT8 grossGain; //
-+ UINT8 ntr; // Enable/disable NTR support
-+ SINT16 loopAttn; // Loop Attenuation
-+ UINT8 vendorRevisionNumber; // Reported Vendor Revision Number
-+ UINT8 reserved1; // for 32-bit alignment
-+ UINT8 reserved2; // for 32-bit alignment
-+ UINT8 reserved3; // for 32-bit alignment
-+} DEV_HOST_msg_t;
-+
-+
-+// --------------------------------------
-+// Begin bits and gains table definitions
-+// --------------------------------------
-+
-+typedef struct
-+{
-+ PUINT8 aturBng_p; // pointer to ATU-R bits and gains table
-+ PUINT8 atucBng_p; // pointer to ATU-C bits and gains table
-+ PUINT8 bitAllocTblDstrm_p; // pointer to Downstream Bit Allocation table
-+ PUINT8 bitAllocTblUstrm_p; // pointer to Upstream Bit Allocation table
-+ PSINT8 marginTblDstrm_p; // pointer to Downstream Margin table
-+} DEV_HOST_dspWrSharedTables_t;
-+
-+
-+// ----------------------------------------
-+// Begin datapump code overlay definitions.
-+// ----------------------------------------
-+
-+#define DEV_HOST_PAGE_NUM 4 // number of overlay pages
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_olayDpDef_t struct
-+typedef struct
-+{
-+ UINT32 overlayHostAddr; // source address in host memory
-+ UINT32 overlayXferCount; // number of 32bit words to be transfered
-+ UINT32 overlayDspAddr; // destination address in DSP's PMEM
-+} DEV_HOST_olayDpPageDef_t;
-+
-+
-+typedef struct
-+{
-+ UINT32 overlayStatus; // Status of current overlay to DSP PMEM
-+ UINT32 overlayNumber; // DSP PMEM overlay page number
-+ UINT32 overlayState; // Indicates whether current state is an overlay state
-+ DEV_HOST_olayDpPageDef_t *olayDpPage_p[DEV_HOST_PAGE_NUM]; // Def's for the Pages
-+} DEV_HOST_olayDpDef_t;
-+
-+
-+// -------------------------
-+// Begin ATM-TC definitions.
-+// -------------------------
-+
-+// TC cell states.
-+typedef enum
-+{
-+ TC_HUNT,
-+ TC_PRESYNC,
-+ TC_SYNC
-+} DEV_HOST_cellDelinState_t;
-+
-+
-+// --------------------------------------------
-+// Begin datapump error/statistics definitions.
-+// --------------------------------------------
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_modemStatsDef_t struct.
-+typedef struct
-+{
-+ UINT32 crcErrors; // Num of CRC errored ADSL frames
-+ UINT32 fecErrors; // Num of FEC errored (corrected) ADSL frames
-+ UINT32 ocdErrors; // Out of Cell Delineation
-+ UINT32 ncdError; // No Cell Delineation
-+ UINT32 lcdErrors; // Loss of Cell Delineation (within the same connection)
-+ UINT32 hecErrors; // Num of HEC errored ADSL frames
-+} DEV_HOST_errorStats_t;
-+
-+
-+typedef struct
-+{
-+ DEV_HOST_errorStats_t *usErrorStatsIntlv_p; // us error stats - interleave path
-+ DEV_HOST_errorStats_t *dsErrorStatsIntlv_p; // ds error stats - interleave path
-+ DEV_HOST_errorStats_t *usErrorStatsFast_p; // us error stats - fast path
-+ DEV_HOST_errorStats_t *dsErrorStatsFast_p; // ds error stats - fast path
-+ UINT32 losErrors; // Num of ADSL frames where loss-of-signal
-+ UINT32 sefErrors; // Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames
-+ UINT32 farEndLosErrors; // Number of reported LOS defects by the CO.
-+ UINT32 farEndRdiErrors; // Number of reported RDI defects by the CO.
-+} DEV_HOST_modemStatsDef_t;
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_atmStats_t struct.
-+typedef struct
-+{
-+ UINT32 goodCount; // Upstream Good Cell Count
-+ UINT32 idleCount; // Upstream Idle Cell Count
-+} DEV_HOST_usAtmStats_t;
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_atmStats_t struct.
-+typedef struct
-+{
-+ UINT32 goodCount; // Downstream Good Cell Count
-+ UINT32 idleCount; // Downstream Idle Cell Count
-+ UINT32 badHecCount; // Downstream Bad Hec Cell Count
-+ UINT32 ovflwDropCount; // Downstream Overflow Dropped Cell Count
-+ DEV_HOST_cellDelinState_t delineationState; // Indicates current delineation state
-+} DEV_HOST_dsAtmStats_t;
-+
-+
-+typedef struct
-+{
-+ DEV_HOST_usAtmStats_t *us0_p; // US ATM stats for TC channel 0
-+ DEV_HOST_dsAtmStats_t *ds0_p; // DS ATM stats for TC channel 0
-+ DEV_HOST_usAtmStats_t *us1_p; // US ATM stats for TC channel 1
-+ DEV_HOST_dsAtmStats_t *ds1_p; // DS ATM stats for TC channel 1
-+} DEV_HOST_atmStats_t;
-+
-+
-+// ----------------------
-+// Begin EOC definitions.
-+// ----------------------
-+
-+// The two values below can never change (for backwards compatibility of host intf.)
-+#define DEV_HOST_EOCREG4LENGTH 32
-+#define DEV_HOST_EOCREG5LENGTH 32
-+
-+typedef struct
-+{
-+ UINT8 eocReg4[DEV_HOST_EOCREG4LENGTH]; // Host/Dsp Write, vendor specific EOC Register 4
-+ UINT8 eocReg5[DEV_HOST_EOCREG5LENGTH]; // Host/Dsp Write, vendor specific EOC Register 5
-+ UINT8 vendorId[8]; // Host write
-+ UINT8 revNumber[4]; // Host, ATU-R Revision Number
-+ UINT8 serialNumber[32]; // Host write
-+ UINT8 eocReg4Length; // Host Write, valid length for EOC register 4
-+ UINT8 eocReg5Length; // Host Write, valid length for EOC register 5
-+ UINT8 dummy[2]; // dummy bytes for 32-bit alignment
-+ UINT32 eocModemStatusReg; // Dsp Write, status bits to host
-+ UINT8 lineAtten; // Dsp Write, line attenuation in 0.5 db step
-+ SINT8 dsMargin; // DSP Write, measured DS margin
-+ UINT8 aturConfig[30]; // Dsp Write, also used by EOC for ATUR Configuration
-+} DEV_HOST_eocVarDef_t;
-+
-+typedef struct
-+{
-+ UINT16 endEocThresh; // Host Write, end of Clear EOC stream threshold
-+ UINT16 dummy; // dummy value to fill gap
-+ UINT32 dropEocCount; // Dsp Write, counter of dropped Clear EOC bytes
-+ UINT16 eocRxLength; // Host/DSP write, number of valid Rx Clear EOC bytes
-+ UINT16 eocTxLength; // Host/DSP write, number of valid Tx Clear EOC bytes
-+ UINT8 eocRxBuf[64]; // Dsp Write, Buffer for receiving Rx Clear EOC bytes
-+ UINT8 eocTxBuf[64]; // Host Write, Buffer for writing Tx Clear EOC bytes
-+} DEV_HOST_clearEocVarDef_t;
-+
-+
-+// -----------------------------------
-+// Begin CO profile Definitions.
-+// -----------------------------------
-+
-+/* struct size must be a word size */
-+typedef struct
-+{
-+
-+ SINT16 devCodecRxdf4Coeff[12] ; // (BOTH) IIR Coefficients
-+ SINT16 devCodecTxdf2aCoeff[64] ; // (BOTH) FIR filter coefficients
-+ SINT16 devCodecTxdf2bCoeff[64] ; // (BOTH) FIR filter coefficients
-+ SINT16 devCodecTxdf1Coeff[12] ; // (BOTH) IIR filter coefficients
-+ UINT16 devCodecTxDf2aDen; // (BOTH) denominator for IIR filter
-+ UINT16 devCodecTxDf2bDen; // (BOTH) denominator for IIR filter
-+ SINT16 ctrlMsmSpecGain[32]; // (BOTH)
-+
-+ SINT16 phyBitaRateNegIntNoTrellis ; // (BOTH) value to set
-+ SINT16 phyBitaRateNegIntTrellis ; // (BOTH) value to set
-+ SINT16 phyBitaRateNegFastNoTrellis ; // (BOTH) value to set
-+ SINT16 phyBitaRateNegFastTrellis ; // (BOTH) value to set
-+ SINT16 phyBitaRsFlag ; // (BOTH)
-+ SINT16 phyBitaFirstSubChannel ; // (BOTH)
-+ SINT16 phyBitaMaxFineGainBump; // max fine gain bump
-+ SINT16 phyBitaFineGainReduction; // fine gain reduction
-+ SINT16 phyBitaMaxDownstreamPowerCutback; // max downstream power cutback
-+
-+ SINT16 phySigTxGainReductionAt0kft; // upstream power reduction at 0 kft.
-+
-+ SINT16 phyAgcPgaTarget ; // (BOTH) compare value
-+
-+ UINT16 imsg413TxRate ; // (BOTH) Tx rate
-+ SINT16 imsg413RsBytesAdjust ; // (BOTH) subtract value
-+ UINT16 imsg413PstringMask ; // (POTS) Or'ed into pString[RMSGS1_INDEX][1]
-+ SINT16 imsg413UsPilot ; // (BOTH)??
-+ UINT16 imsg413SkipPhaseOp ; // (POTS)
-+
-+ UINT16 ctrlMsmSensitivity1 ; // (BOTH) value to set
-+ UINT16 ctrlMsmTxPsdShape_f; // (BOTH) upstream spectral shaping flag
-+
-+ UINT16 ovhdAocUsBswapReq_f ; // (BOTH)value to set
-+ UINT16 ovhdAocScanMse_f ; // (BOTH)value to set
-+
-+ SINT16 phyRevFullFirstBin ; //
-+ SINT16 phyRevFullLastBin ; //
-+ SINT16 phyRevFirstBin ; //
-+ SINT16 phyRevLastBin ; //
-+ SINT16 phyMedFirstBin ; //
-+ SINT16 phyMedLastBin ; //
-+ SINT16 phyMedOptionalLastBin; // Medley last bin - optional
-+
-+ SINT16 phyEcDelayAdjustment; // Echo delay adjustment
-+ SINT16 bSwapThresholdUpdate; // bSwapThresholdUpdate
-+ SINT16 phyBitaFastPathExcessFineGainBump; // Used in phy_bita.c
-+ SINT16 phyBitaSkipGapAdjustment; // Used in phy_bita.c
-+ SINT16 usPilotInT1413ModeInMedley; // To send Upstream Pilot in medley in T1.413 mode.
-+
-+ UINT32 profileVendorId ; // vendor id
-+
-+} DEV_HOST_coData_t ;
-+
-+typedef struct
-+{
-+ DEV_HOST_coData_t * hostProfileBase_p; // base address of profile list
-+} DEV_HOST_profileBase_t ;
-+
-+
-+
-+// -----------------------------------
-+// Begin DSP/Host Mailbox Definitions.
-+// -----------------------------------
-+
-+// The 3 values below can never be decreased, only increased.
-+// If you increase one of the values, you must add more to the
-+// initializers in "dev_host_interface.c".
-+#define DEV_HOST_HOSTQUEUE_LENGTH 8
-+#define DEV_HOST_DSPQUEUE_LENGTH 8
-+#define DEV_HOST_TEXTQUEUE_LENGTH 8
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_mailboxControl_t struct.
-+typedef struct
-+{
-+ UINT8 cmd;
-+ UINT8 tag;
-+ UINT8 param1;
-+ UINT8 param2;
-+} DEV_HOST_dspHostMsg_t;
-+
-+// Never access a struct of this typedef directly. Always go through the DEV_HOST_mailboxControl_t struct.
-+typedef struct
-+{
-+ UINT32 msgPart1;
-+ UINT32 msgPart2;
-+} DEV_HOST_textMsg_t;
-+
-+// The structure below has been ordered so that the Host need only write to
-+// even byte locations to update the indices.
-+
-+// The Buffer pointers in the struct below each point to a different
-+// struct array that has an array size of one of the matching Queue Length
-+// values defined above (DEV_HOST_HOSTQUEUE_LENGTH, DEV_HOST_DSPQUEUE_LENGTH,
-+// and DEV_HOST_TEXTQUEUE_LENGTH).
-+
-+typedef struct
-+{
-+ UINT8 hostInInx; // Host write, DSP must never write except for init
-+ UINT8 bDummy0[3]; // dummy bytes for explicit 32-bit alignment
-+ UINT8 hostOutInx; // DSP write, Host must never write
-+ UINT8 bDummy1[3]; // dummy bytes for explicit 32-bit alignment
-+ UINT8 dspOutInx; // Host write, DSP must never write except for init
-+ UINT8 bDummy2[3]; // dummy bytes for explicit 32-bit alignment
-+ UINT8 dspInInx; // DSP write, Host must never write
-+ UINT8 bDummy3[3]; // dummy bytes for explicit 32-bit alignment
-+ UINT8 textInInx; // DSP write, Host must never write
-+ UINT8 bDummy4[3]; // dummy bytes for explicit 32-bit alignment
-+ UINT8 textOutInx; // Host write, DSP must never write except for init
-+ UINT8 bDummy5[3]; // dummy bytes for explicit 32-bit alignment
-+ DEV_HOST_dspHostMsg_t *hostMsgBuf_p; // pointer to Host Mailbox Buffer (Host writes the buffer)
-+ DEV_HOST_dspHostMsg_t *dspMsgBuf_p; // pointer to DSP Mailbox Buffer (DSP writes the buffer)
-+ DEV_HOST_textMsg_t *textMsgBuf_p; // pointer to Text Mailbox Buffer (DSP writes the buffer)
-+} DEV_HOST_mailboxControl_t;
-+
-+
-+//-----------------------------------------
-+// Physical layer performance parameter
-+//-----------------------------------------
-+typedef struct
-+{
-+ SINT32 hybridCost[5]; // Cost functions for hybrids (0: none, 1-4 hybrid options)
-+ SINT32 usAvgGain; // upstream average gain in 20log10 (Q8)
-+ SINT32 dsAvgGain; // downstream average gain in 20log10 (Q8)
-+ UINT8 disableDspHybridSelect_f; // Allows host to disable the automatic hybrid selection by the DSP
-+ UINT8 hostSelectHybridNum; // DSP will use this hybrid number only if DSP Select is disabled (values: 1-4)
-+ UINT8 currentHybridNumUsed; // DSP indicates to the host the current hybrid number in use
-+ UINT8 reserved1; // reserved for future use
-+} DEV_HOST_phyPerf_t;
-+
-+
-+/***********************************************************
-+ * The 3 structures below are used only for analog
-+ * diagnostic functions originally defined in diag.h
-+ * Moved here by Carlos A. Perez under J. Bergsagel request
-+ ***********************************************************/
-+
-+/****************************************************************************/
-+/* Options for the Analog Diagnostic user input data structure */
-+/* (MUST be word aligned) */
-+/****************************************************************************/
-+typedef enum
-+{
-+ ZERO_DIAG_OPT = 0, // dummy value for zero place-holder
-+ NOISE_ONLY = 0x1, // diagnostic in noise only mode (on=1, off=0), disregard diagMode 0-4
-+ EXTERNAL_CO = 0x2, // operates against external CO (external=1, internal=0)
-+ DIAG_AGC = 0x4, // agc selects gains control (agc=1, manual=0)
-+ CROSSTALK_TEQ = 0x8, // crosstalk selects teq (crosstalk=1, manual=0)
-+ LEAKY_TEQ = 0x10, // use leaky teq (on=1, off=0)
-+ AUX_AMPS = 0x20, // auxamps (on=1, off=0)
-+ BW_SELECT = 0x40, // change rxhpf/txlpf fc (modify=1, default=0)
-+ DIAG_HYB_SELECT = 0x80, // change hybrid (modify=1, default=0)
-+ POWER_DOWN_CDC = 0x100, // power down codec (power down=1, no power down=0)
-+ ISDN_OP_MODE = 0x200, // operation mode (pots=0, isdn=1)
-+ BYPASS_RXAF2 = 0x400, // Bypass except RXAF2 (on=1, off = 0)
-+ TX_TEST_CONT = 0x800, // Continuous tx test (on=1, off=0)
-+ TX_SCALE_MTT = 0x1000 // Scale tx signal for Mtt test (on=1, off=0)
-+} DEV_HOST_diagAnlgOptionsVar_t;
-+
-+/****************************************************************************/
-+/* Analog Diagnostic user input data structure (MUST be word align) */
-+/****************************************************************************/
-+
-+typedef struct
-+{
-+ DEV_HOST_diagAnlgOptionsVar_t diagOption; // Other diagnostic optional settings
-+
-+ UINT8 diagMode; // Performance diagnostic mode
-+ UINT8 txMode; // transmit mode
-+ UINT8 rxMode; // receive mode
-+ UINT8 teqSp; // Select teq starting pt
-+ UINT8 txDf1; // see dev_codec_filters.c and
-+ UINT8 txDf2a; // dev_codec.h for filter coefficients
-+ UINT8 txDf2b;
-+ UINT8 rxDf4;
-+
-+ UINT16 codingGain256Log2; // 256*Log2(coding gain)
-+ UINT16 noiseMargin256Log2; // 256*Log2(noise margin)
-+
-+ UINT16 rxPga1; // PGA1
-+ UINT16 rxPga2; // PGA2
-+ UINT16 rxPga3; // PGA3
-+ UINT16 anlgEq; // AEQ settings (dB/MHz)
-+
-+ SINT8 pilotBin; // Select pilot subchannel
-+ SINT8 txSwGain; // manual set for bridge tap loop
-+ SINT8 tdw1Len; // TDW1 length - 0,2,4,8,16
-+ SINT8 tdw2Len; // TDW2 length - 0,2,4,8,16
-+
-+ UINT8 teqEcMode; // TEQ/EC mode
-+ UINT8 hybrid;
-+ UINT8 txAttn; // Codec Tx attenuation
-+ UINT8 txGain; // Codec Tx gain (Sangam only)
-+
-+ SINT16 txPda; //Codec Tx Digital gain/attn
-+ UINT8 txTone[MAX_NUM_UPBINS]; // Turning tones on/off
-+ // Still govern by lastbin
-+ UINT16 rsvd; //for 32 bits alignment
-+}DEV_HOST_diagAnlgInputVar_t;
-+
-+/****************************************************************************/
-+/* Analog diagnostic output data structure */
-+/****************************************************************************/
-+typedef struct
-+{
-+ PSINT32 rxSnr_p[2]; // Pointer to estimated snr
-+ PSINT32 rxSubChannelCapacity_p[2]; // Pointer to estimated subchan capacity
-+ PSINT32 rxSignalPower_p[2]; // Pointer to estimated signal power
-+ PSINT32 rxNoisePower_p[2]; // Pointer to estimated noise power
-+ PSINT32 rxAvg_p; // Pointer to average of rcvd signal
-+ SINT32 chanCapacity[2] ; // Channel total capacity
-+ SINT32 dataRate[2]; // Modem data rate (SNR)
-+ SINT32 avgNoiseFloor; // Average noise floor
-+ SINT16 snrGap256Log2; // 256*Log2(snr gap)
-+ SINT16 rxPga1; // PGA1
-+ SINT16 rxPga2; // PGA2
-+ SINT16 rxPga3; // PGA3
-+ SINT16 anlgEq; // AEQ settings (dB/MHz)
-+ SINT16 rsvd;
-+}DEV_HOST_diagAnlgOutputVar_t;
-+
-+
-+// Bit field structure that allows the host to mask off interrupt sources for possible DSP-to-Host interrupts.
-+// Each bit represents a possible source of interrupts in the DSP code that might cause a DSP-to-Host
-+// interrupt to occur.
-+// This mask structure is not intended to show how interrupt sources in the DSP code correspond to the actual
-+// DSP-to-Host interrupts. There could be multiple ways to cause an interrupt in the DSP code, but they all
-+// eventually tie into one of the three possible DSP-to-Host interrupts.
-+// The host should write a "1" to an individual bit when it wants to mask possible interrupts from that source.
-+
-+// enum that represents individual bits in maskBitField1
-+typedef enum
-+{
-+ ZERO_MASK1 = 0, // dummy value for zero place-holder
-+ DSP_MSG_BUF = 0x1, // mask interrupts due to DSP-to-Host message mailbox updates
-+ STATE_BIT_FIELD = 0x2, // mask interrupts due to changes in the modem state bit fields
-+ DSP_HEARTBEAT = 0x4 // mask interrupts for the DSP hearbeat
-+} DEV_HOST_intMask1_t; // this enum should only have 32 values in it (maximum).
-+
-+// Add more "mask bit fields" at the end of this struct if you need more mask values
-+typedef struct
-+{
-+ DEV_HOST_intMask1_t maskBitField1;
-+} DEV_HOST_hostInterruptMask_t; // this struct should only have 32 bits in it.
-+
-+// Bit field structure that allows the host to determine the source(s) of DSP-to-Host interrupts in case
-+// several of the interrupt sources get combined onto a single DSP-to-Host interrupt.
-+// DSP will set each bit to a "1"as an interrupt occurs.
-+// Host has the reponsibility to clear each bit to a "0" after it has determined the source(s) of interrupts.
-+// Each source bit field in this struct will use the same enum typedef that matches the corresponding mask
-+// bit field in "DEV_HOST_hostInterruptMask_t"
-+typedef struct
-+{
-+ DEV_HOST_intMask1_t sourceBitField1;
-+} DEV_HOST_hostInterruptSource_t;
-+
-+
-+// --------------------------
-+// Begin bitswap definitions.
-+// --------------------------
-+
-+// bitSwapSCnt contains the superframe to perform bit swap
-+// The entries must be ordered so that the first group only contains bit change commands
-+// The other entries may contain power adjustment instructions and must be
-+// written with something. NOP (0) is an available instruction.
-+typedef struct
-+{
-+ PUINT8 fineGains_p; // pointer to bng string, needed to check fine gains for powerswap
-+ UINT8 bitSwapNewIndices[6]; // Bin before bitSwapBin to process
-+ UINT8 bitSwapCmd[6]; // Bitswap command for bitSwapBin
-+ UINT8 bitSwapBin[6]; // bin to modify
-+ UINT8 bitSwapSCnt; // Superframe count on which to perform bitswap
-+ UINT8 bitSwapEnabled; // bitSwapEnabled
-+} DEV_HOST_dspBitSwapDef_t;
-+
-+
-+// ---------------------------
-+// Begin ATM BERT definitions.
-+// ---------------------------
-+
-+// Structure used for ATM Idle Cells based bit error rate computation.
-+typedef struct
-+{
-+ UINT8 atmBertFlag; // Feature enable/disable flag (Host write)
-+ UINT8 dummy1;
-+ UINT8 dummy[2]; // Dummy bytes for 32-bit alignment
-+ UINT32 bitCountLow; // Low part of 64-bit BERT bit count (DSP write)
-+ UINT32 bitCountHigh; // High part of 64-bit BERT bit count (DSP write)
-+ UINT32 bitErrorCountLow; // Low part of 64-bit BERT bit count (DSP write)
-+ UINT32 bitErrorCountHigh;// High part of 64-bit BERT bit count (DSP write)
-+} DEV_HOST_atmDsBert_t;
-+
-+
-+// ------------------------------------
-+// Misc. modem environment definitions.
-+// ------------------------------------
-+
-+
-+typedef struct
-+{
-+ SINT16 subStateIndex; // Index that signifies datapump substate. (DSP write)
-+ UINT8 externalBert; // Turn on/off external BERT interface. 0 = OFF; 1 = ON. (Host write)
-+ UINT8 usBertPattern; // BERT pattern for US TX data. 0 = 2^15-1; 1 = 2^23-1. (Host write)
-+ UINT8 overrideDslLinkLed_f; // Overrides DSP operation of the DSL_LINK LED. (Host write)
-+ // 0 = DSP is in control; 1 = Host is in control.
-+ UINT8 dslLinkLedState_f; // DSL_LINK LED state when override flag has been set. (Host write)
-+ // DSL_LINK LED will be updated with this value once per frame.
-+ // LED is active-low: 0 = ON, 1 = OFF.
-+ UINT8 overrideDslActLed_f; // Overrides DSP operation of the DSL_ACT LED. (Host write)
-+ // 0 = DSP is in control; 1 = Host is in control.
-+ UINT8 dslActLedState_f; // DSL_ACT LED state when override flag has been set. (Host write)
-+ // DSL_ACT LED will be updated with this value once per frame.
-+ // LED is active-low: 0 = ON, 1 = OFF.
-+ UINT8 dGaspLprIndicator_f; // How LPR signal (GPIO[0]) is to be interpreted. (Host write)
-+ // 0 = LPR is active-low; 1 = LPR is active-high.
-+ UINT8 overrideDspLprGasp_f; // Overrides DSP detection of LPR signal to send out DGASP. (Host write)
-+ // 0 = DSP detects LPR; 1 = Host detects LPR and sends "HOST_DGASP" to DSP.
-+ UINT8 pcbEnabled; // DS power cut back
-+ UINT8 maxAvgFineGainCtrl_f; // If maxAvgFineGainCtrl_f == 0, then the datapump controls the maximum average fine gain value.
-+ // If maxAvgFineGainCtrl_f == 1, then the host controls the maximum average fine gain value.
-+ UINT32 reasonForDrop; // This field will tell the host what might be the reason for a dropped connection.
-+ SINT16 maxAverageFineGain; // When maxAvgFineGainCtrl_f == 1, the value in maxAverageFineGain is the maximum average fine gain level in 256log2 units.
-+ UINT8 reserved1; // These are for 32-bit alignment.
-+ UINT8 reserved2; // These are for 32-bit alignment.
-+} DEV_HOST_modemEnvPublic_t;
-+
-+
-+// -----------------------------
-+// Generic structure definition.
-+// -----------------------------
-+
-+typedef struct
-+{
-+ PSINT8 parameter1_p;
-+ PSINT16 parameter2_p;
-+ PSINT32 parameter3_p;
-+ PUINT8 parameter4_p;
-+ PUINT16 parameter5_p;
-+ PUINT32 parameter6_p;
-+} DEV_HOST_genericStructure_t;
-+
-+
-+// ------------------------------
-+// Begin G.hs buffer definitions.
-+// ------------------------------
-+
-+typedef struct
-+{
-+ UINT8 txBuf[64]; // G.hs xmt buffer
-+} DEV_HOST_ghsDspTxBufDef_t;
-+
-+
-+typedef struct
-+{
-+ UINT8 rxBuf[80]; // G.hs rcv buffer
-+} DEV_HOST_ghsDspRxBufDef_t;
-+
-+// -----------------------------------------
-+// Begin Constellation Display definitions.
-+// -----------------------------------------
-+
-+typedef struct
-+{
-+ UINT32 consDispStartAddr; // Host write
-+ UINT32 consDispCurrentAddr; // Host write
-+ UINT32 consDispBufLen; // Constellation Buffer Length
-+ UINT32 consDispBin; // Host write, DS band only
-+} DEV_HOST_consBufDef_t;
-+
-+typedef struct
-+{
-+ PSINT16 buffer1_p; //DSP write
-+ PSINT16 buffer2_p; //DSP write
-+} DEV_HOST_snrBuffer_t;
-+
-+// --------------------------------------------------------------------------------------
-+// Typedef to be used for the DEV_HOST_dspOamSharedInterface_s struct of pointers
-+// (this is used in dev_host_interface.c).
-+// NOTE: This struct of pointers is NEVER to be referenced anywhere else in the DSP code.
-+// IMPORTANT: Only pointers to other structs go into this struct !!
-+// --------------------------------------------------------------------------------------
-+typedef struct
-+{
-+ DEV_HOST_hostIntfcVersionDef_t *hostIntfcVersion_p;
-+ DEV_HOST_dspVersionDef_t *datapumpVersion_p;
-+ DEV_HOST_modemStateBitField_t *modemStateBitField_p;
-+ DEV_HOST_dspWrNegoParaDef_t *dspWriteNegoParams_p;
-+ DEV_HOST_oamWrNegoParaDef_t *oamWriteNegoParams_p;
-+ DEV_HOST_raMsgsDef_t *raMsgs_p;
-+ DEV_HOST_dspWrSuperFrameCntDef_t *dspWriteSuperFrameCnt_p;
-+ DEV_HOST_msg_t *atucMsg_p;
-+ DEV_HOST_msg_t *aturMsg_p;
-+ DEV_HOST_dspWrSharedTables_t *dspWrSharedTables_p;
-+ DEV_HOST_olayDpDef_t *olayDpParms_p;
-+ DEV_HOST_eocVarDef_t *eocVar_p;
-+ DEV_HOST_clearEocVarDef_t *clearEocVar_p;
-+ DEV_HOST_modemStatsDef_t *modemStats_p;
-+ DEV_HOST_atmStats_t *atmStats_p;
-+ DEV_HOST_mailboxControl_t *dspHostMailboxControl_p;
-+ DEV_HOST_phyPerf_t *phyPerf_p;
-+ DEV_HOST_diagAnlgInputVar_t *analogInputVar_p;
-+ DEV_HOST_diagAnlgOutputVar_t *analogOutputVar_p;
-+ DEV_HOST_hostInterruptMask_t *hostInterruptMask_p;
-+ DEV_HOST_profileBase_t *profileList_p;
-+ DEV_HOST_hostInterruptSource_t *hostInterruptSource_p;
-+ DEV_HOST_dspBitSwapDef_t *dspBitSwapDstrm_p;
-+ DEV_HOST_dspBitSwapDef_t *dspBitSwapUstrm_p;
-+ DEV_HOST_atmDsBert_t *atmDsBert_p;
-+ DEV_HOST_modemEnvPublic_t *modemEnvPublic_p;
-+ DEV_HOST_genericStructure_t *genericStructure1_p;
-+ DEV_HOST_genericStructure_t *genericStructure2_p;
-+ DEV_HOST_ghsDspTxBufDef_t *ghsDspTxBuf_p;
-+ DEV_HOST_ghsDspRxBufDef_t *ghsDspRxBuf_p;
-+ DEV_HOST_consBufDef_t *consDispVar_p;
-+ DEV_HOST_snrBuffer_t *snrBuffer_p;
-+} DEV_HOST_dspOamSharedInterface_t;
-+
-+
-+// ---------------------------------------------------------------------------------
-+// Typedef to be used for the pointer to the DEV_HOST_dspOamSharedInterface_s struct
-+// of pointers (this is used in dev_host_interface.c).
-+// ---------------------------------------------------------------------------------
-+typedef DEV_HOST_dspOamSharedInterface_t *DEV_HOST_dspOamSharedInterfacePtr_t;
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/dev_host_verdef.h linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h
---- linux.old/drivers/atm/sangam_atm/dev_host_verdef.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h 2005-07-10 08:02:01.432113184 +0200
-@@ -0,0 +1,102 @@
-+#ifndef __DEV_HOST_VERDEF_H__
-+#define __DEV_HOST_VERDEF_H__ 1
-+
-+//********************************************************************
-+//*
-+//* DMT-BASE ADSL MODEM PROGRAM
-+//* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
-+//* AMATI CONFIDENTIAL PROPRIETARY
-+//*
-+//* (c) Copyright April 1999, Texas Instruments Incorporated.
-+//* All Rights Reserved.
-+//*
-+//* Property of Texas Instruments Incorporated and Amati Communications Corp.
-+//*
-+//* Restricted Rights - Use, duplication, or disclosure is subject to
-+//* restrictions set forth in TI's and Amati program license agreement and
-+//* associated documentation
-+//*
-+//*********************************************************************
-+//*
-+//* FILENAME: dev_host_verdef.h
-+//*
-+//* ABSTRACT: This file defines the version structure
-+//*
-+//* TARGET: Non specific.
-+//*
-+//* TOOLSET: Non specific.
-+//*
-+//* ACTIVATION:
-+//*
-+//* HISTORY: DATE AUTHOR DESCRIPTION
-+//* 04/29/99 FLW Created
-+//* 01/17/00 Barnett Mod's in support of merging NIC
-+//* hardware rev 6/7 T1.413 codebases.
-+//* 01/21/00 Wagner derfmake mods
-+//* 05/11/00 Barnett hardware_rev is a 2 char string.
-+//* 07/24/00 Barnett Rework as part of host interface redesign.
-+//* 11/29/00 Hunt added chipset_id2
-+//* 03/30/01 Barnett Prefixed all public elements with DSPDP_.
-+//* This insures uniqueness of names that might
-+//* match host names by coincidence.
-+//* 03/30/01 Barnett Added DSPDP_Host_VersionDef to facilitate
-+//* representing a version id for the host i/f
-+//* separate from the firmware version id as
-+//* a courtesy to the host.
-+//* 07/23/01 JEB Changed name from verdef_u.h to dpsys_verdef.h
-+//* 04/12/02 Barnett Make timestamp unsigned 32-bit field.
-+//* Generalizes for all kinds of hosts.
-+//* 11/15/02 JEB Changed name from dpsys_verdef.h to dev_host_verdef.h
-+//* Updated structs according to coding guidelines
-+//* 12/16/02 JEB Renamed some struct elements for new usage in Ax7
-+//* 01/21/03 MCB Implemented Ax7 UNIT-MODULE modular software framework.
-+//* 03/19/03 JEB Added back in "bugFix" elements into each struct type.
-+//* Rearranged elements.
-+//*
-+//********************************************************************
-+
-+#include "env_def_typedefs.h"
-+
-+#define DSPDP_FLAVOR_NEWCODES 0xFF // Other values are valid old-style flavors
-+
-+// ------------------------------
-+// ------------------------------
-+// Begin DSP version definitions.
-+// ------------------------------
-+// ------------------------------
-+
-+typedef struct
-+{
-+ UINT32 timestamp; // Number of seconds since 01/01/1970
-+ UINT8 major; // Major "00".00.00.00 revision nomenclature
-+ UINT8 minor; // Minor 00."00".00.00 revision nomenclature
-+ UINT8 bugFix; // Bug Fix 00.00."00".00 revision nomenclature
-+ UINT8 buildNum; // Build Number 00.00.00."00" revision nomenclature
-+ UINT8 netService; // Network service identifier
-+ UINT8 chipsetGen; // chipset generation
-+ UINT8 chipsetId; // chipset identifier
-+ UINT8 chipsetId2; // second byte for "RV" chipset et al.
-+ UINT8 hardwareRev1; // hardware revision, 1st char
-+ UINT8 hardwareRev2; // hardware revision, 2nd char
-+ UINT8 featureCode; // feature code
-+ UINT8 dummy1; // dummy byte for explicit 32-bit alignment
-+} DEV_HOST_dspVersionDef_t;
-+
-+// -------------------------------
-+// -------------------------------
-+// Begin host version definitions.
-+// -------------------------------
-+// -------------------------------
-+
-+typedef struct
-+{
-+ UINT8 major; // Major "00".00.00.00 revision nomenclature
-+ UINT8 minor; // Minor 00."00".00.00 revision nomenclature
-+ UINT8 bugFix; // Bug Fix 00.00."00".00 revision nomenclature
-+ UINT8 buildNum; // Build Number 00.00.00."00" revision nomenclature
-+ UINT8 netService; // Network service identifier
-+ UINT8 dummy[3]; // dummy bytes for explicit 32-bit alignment
-+} DEV_HOST_hostIntfcVersionDef_t;
-+
-+
-+#endif // __DEV_HOST_VERDEF_H__
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.c linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c
---- linux.old/drivers/atm/sangam_atm/dsl_hal_api.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c 2005-07-10 08:02:01.436112576 +0200
-@@ -0,0 +1,3339 @@
-+/*******************************************************************************
-+* FILE PURPOSE: DSL Driver API functions for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_hal_basicapi.c
-+*
-+* DESCRIPTION:
-+* Contains basic DSL HAL APIs for Sangam
-+*
-+*
-+* (C) Copyright 2001-02, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 06Feb03 0.00.00 RamP Original Version Created
-+* 10Mar03 0.00.01 RamP Initial Revision for Modular Code Branch
-+* 19Mar03 0.00.02 RamP Fixed DSL and DSP Version API Structures
-+* 20Mar03 0.00.03 RamP Changed byteswap function names
-+* 21Mar03 0.00.03 RamP/ZT Malloc for DSP f/w done in dslStartup
-+* 25Mar03 0.00.04 RamP Removed statistics used only by SWTC
-+* Created Checkpoint 3
-+* 26Mar03 0.00.05 RamP Added Memory allocation for fwimage in
-+* dslStartup function.
-+* 07Apr03 0.00.06 RamP Implemented new error reporting scheme
-+* Changed Commenting to C style only
-+* 09Apr03 0.00.07 RamP Reorganized code to delete POST_SILICON
-+* 10Apr03 0.00.08 RamP Removed ptidsl from loadFWImage function
-+* moved size and fwimage initialization to
-+* dslStartup function
-+* 14Apr03 0.00.09 RamP Moved modemStateBitField processing to a
-+* support function; deleted stateHistory
-+* renamed the REG32 macro
-+* 15Apr03 0.00.10 RamP Changed firmware allocate to shim_
-+* osAllocateVMemory function
-+* 15Apr03 0.00.11 RamP Changed host version number to 07.00.00.01
-+* 16Apr03 0.00.12 RamP Modified return condition on dslShutdown
-+* 16Apr03 0.00.13 RamP Changed host version number to 07.00.00.02
-+* 21Apr03 0.01.00 RamP Cleaned up dslShutdown function
-+* Added new function calls to allocate
-+* (Alpha) /free overlay pages for different OS
-+* Fixed typecasting for allocate/free fxns
-+* Added Interrupt Acknowledge logic
-+* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt into api
-+* Added static global for intr source
-+* 24Apr03 0.01.02 RamP Added processing for OVERLAY_END in
-+* DSP message handlers, verified crc32
-+* recovery for overlays
-+* 28Apr03 0.01.03 RamP Removed global variable intrSource
-+* Added parameter to handleInterrupt fxn
-+* (Alpha Plus) to indicate interrupt source
-+* Changed version number to 01.00.01.00
-+* Fixed setTrainingMode function problem
-+* 07May03 0.01.04 RamP Removed delineation state check in
-+* message handling functions, added more
-+* safety for setting lConnected in TC_SYNC
-+* Changed version number to 01.00.01.01
-+* 14May03 0.01.05 RamP Added 3 Switchable Hybrid APIs
-+* Added additional statistics us/ds TxPower,
-+* us margin,attenuation, us/ds bitallocation
-+* moved versioning to dsl_hal_version.h
-+* 14May03 0.01.06 RamP Fixed problem with CMsgs2 parsing
-+* 20May03 0.01.07 RamP Added Inner/Outer pair API support. Added
-+* dying gasp message.
-+* 29May03 0.01.08 ZT/RamP Added memory optimizations for overlay pages
-+* and coProfiles; added functions to free,
-+* reload overlays and profiles
-+* 04Jun03 0.01.09 RamP Added tick counters, fail states reporting
-+* Made statistics fixes for higher data rates
-+* Added Margin per tone to statistics
-+* Added configuration checks for trellis/FEC
-+* 06Jun03 0.01.10 RamP Added LED, STM Bert, dGasp LPR Config APIs
-+* Modified interrupt acknowledge logic
-+* Added current hybrid flag as statistic
-+* 09Jun03 0.01.11 RamP Added function to send dying Gasp to Modem
-+* fixed problem with reading OamNegoPara var
-+* (Beta) fixed problem with reading current config
-+* Added function to configure ATM Bert
-+* fixed memory leak due to coProfiles
-+* Added us/ds R/S FEC statistics
-+* Added additional config capability for LED
-+* fixed problem in free memory for CO profiles
-+* 18Jul03 0.01.12 RamP Fixed problem with reading modemEnv structure
-+* affects LED, DGaspLpr APIs
-+* Sending Dying Gasp from shutdown function
-+* 01Aug03 0.01.13 RamP Added preferred training mode to statistics
-+* 13Aug03 0.01.14 MCB Set rev id for D3/R1.1 (ADSL2).
-+* 21Aug03 0.01.15 RamP Added g.hs and aoc bitswap message gathering
-+* Added new references to bits n gains table
-+* Decoupled modem idle/retrain from pair select
-+* Added line length and gross gain to statistics
-+* 29Sep03 0.01.16 RamP Replaced advcfg function calls with support
-+* module function switches
-+* 01Oct03 0.01.17 RamP Added enum translation to set training mode
-+* & to read statistics
-+* 08Oct03 0.01.18 RamP Fixed problems with usTxPower statistic in
-+* Annex B target, fixed problem with Trellis
-+* 12Oct03 0.01.19 RamP Added API calls to gather ADSL2 Messages
-+* 29Oct03 0.01.20 RamP Restored TC_SYNC detect logic
-+* 30Oct03 0.01.21 RamP Removed Scaling factor for adsl2DSConRate
-+* Setting Showtime state upon DSP_ACTIVE
-+* 14Nov03 0.01.22 RamP Fixed scaling for usTxPower & dsTxPower
-+* 14Nov03 0.01.23 RamP Added logic to gather CRates1/RRates1
-+* by parsing DSP_CRATES1
-+* 20Nov03 0.01.24 RamP Added generic & interface Read
-+* and Write functions to read from
-+* DSP - Host Interface
-+* 24Nov03 0.01.25 RamP Modified interface Read/Write functions
-+* to seperate element offsets from pointers
-+* 19Dec03 0.01.26 RamP Modified pointer accessing problems with
-+* block read functions
-+* 26Dec03 0.01.27 RamP Made ghsIndex a local variable & added
-+* check to avoid buffer overflow
-+* 30Dec03 0.01.28 RamP Added generic mailbox command function
-+*******************************************************************************/
-+#include "dsl_hal_register.h"
-+#include "dsl_hal_support.h"
-+#include "dsl_hal_logtable.h"
-+#include "dsl_hal_version.h"
-+
-+static unsigned int hybrid_selected;
-+static unsigned int showtimeFlag = FALSE;
-+
-+#ifdef PRE_SILICON
-+/*********************************************/
-+/* Base Addresses */
-+/*********************************************/
-+#define DEV_MDMA_BASE 0x02000500
-+
-+/*********************************************/
-+/* MC DMA Control Registers in DSL */
-+/*********************************************/
-+
-+#define DEV_MDMA0_SRC_ADDR (DEV_MDMA_BASE + 0x00000000)
-+#define DEV_MDMA0_DST_ADDR (DEV_MDMA_BASE + 0x00000004)
-+#define DEV_MDMA0_CTL_ADDR (DEV_MDMA_BASE + 0x00000008)
-+#define DEV_MDMA1_SRC_ADDR (DEV_MDMA_BASE + 0x00000040)
-+#define DEV_MDMA1_DST_ADDR (DEV_MDMA_BASE + 0x00000044)
-+#define DEV_MDMA1_CTL_ADDR (DEV_MDMA_BASE + 0x00000048)
-+#define DEV_MDMA2_SRC_ADDR (DEV_MDMA_BASE + 0x00000080)
-+#define DEV_MDMA2_DST_ADDR (DEV_MDMA_BASE + 0x00000084)
-+#define DEV_MDMA2_CTL_ADDR (DEV_MDMA_BASE + 0x00000088)
-+#define DEV_MDMA3_SRC_ADDR (DEV_MDMA_BASE + 0x000000C0)
-+#define DEV_MDMA3_DST_ADDR (DEV_MDMA_BASE + 0x000000C4)
-+#define DEV_MDMA3_CTL_ADDR (DEV_MDMA_BASE + 0x000000C8)
-+
-+#define DEV_MDMA0_SRC (*((volatile UINT32 *) DEV_MDMA0_SRC_ADDR))
-+#define DEV_MDMA0_DST (*((volatile UINT32 *) DEV_MDMA0_DST_ADDR))
-+#define DEV_MDMA0_CTL (*((volatile UINT32 *) DEV_MDMA0_CTL_ADDR))
-+#define DEV_MDMA1_SRC (*((volatile UINT32 *) DEV_MDMA1_SRC_ADDR))
-+#define DEV_MDMA1_DST (*((volatile UINT32 *) DEV_MDMA1_DST_ADDR))
-+#define DEV_MDMA1_CTL (*((volatile UINT32 *) DEV_MDMA1_CTL_ADDR))
-+#define DEV_MDMA2_SRC (*((volatile UINT32 *) DEV_MDMA2_SRC_ADDR))
-+#define DEV_MDMA2_DST (*((volatile UINT32 *) DEV_MDMA2_DST_ADDR))
-+#define DEV_MDMA2_CTL (*((volatile UINT32 *) DEV_MDMA2_CTL_ADDR))
-+#define DEV_MDMA3_SRC (*((volatile UINT32 *) DEV_MDMA3_SRC_ADDR))
-+#define DEV_MDMA3_DST (*((volatile UINT32 *) DEV_MDMA3_DST_ADDR))
-+#define DEV_MDMA3_CTL (*((volatile UINT32 *) DEV_MDMA3_CTL_ADDR))
-+
-+/* MDMA control bits */
-+
-+#define DEV_MDMA_START 0x80000000
-+#define DEV_MDMA_STOP 0x00000000
-+#define DEV_MDMA_STATUS 0x40000000
-+#define DEV_MDMA_DST_INC 0x00000000
-+#define DEV_MDMA_DST_FIX 0x02000000
-+#define DEV_MDMA_SRC_INC 0x00000000
-+#define DEV_MDMA_SRC_FIX 0x00800000
-+#define DEV_MDMA_BURST1 0x00000000
-+#define DEV_MDMA_BURST2 0x00100000
-+#define DEV_MDMA_BURST4 0x00200000
-+
-+#define DEV_MDMA_LEN_SHF 2
-+#define DEV_MDMA_LEN_MASK 0x0000FFFF
-+
-+#define DMA0 0
-+#define DMA1 1
-+#define DMA2 2
-+#define DMA3 3
-+#endif
-+#ifdef DMA
-+SINT32 getDmaStatus(UINT32 mask)
-+{
-+ if(!(IFR & mask))
-+ {
-+ return DSLHAL_ERROR_NO_ERRORS;
-+ }
-+ else
-+ {
-+ ICR = mask ;
-+ return 1 ;
-+ }
-+}
-+
-+void programMdma(UINT32 dma, UINT32 source, UINT32 destination, UINT32 length, UINT32 wait)
-+{
-+ volatile UINT32 statusMask ;
-+
-+ switch(dma)
-+ {
-+ case DMA0:
-+ {
-+ DEV_MDMA0_SRC = source ;
-+ DEV_MDMA0_DST = destination ;
-+ DEV_MDMA0_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
-+ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
-+ statusMask = 0x00000010 ;
-+ }
-+ break ;
-+ case DMA1:
-+ {
-+ DEV_MDMA1_SRC = source ;
-+ DEV_MDMA1_DST = destination ;
-+ DEV_MDMA1_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
-+ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
-+ statusMask = 0x00000020 ;
-+ }
-+ break ;
-+ case DMA2:
-+ {
-+ DEV_MDMA2_SRC = source ;
-+ DEV_MDMA2_DST = destination ;
-+ DEV_MDMA2_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
-+ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
-+ statusMask = 0x00000040 ;
-+ }
-+ break ;
-+ case DMA3:
-+ {
-+ DEV_MDMA3_SRC = source ;
-+ DEV_MDMA3_DST = destination ;
-+ DEV_MDMA3_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
-+ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
-+ statusMask = 0x00000080 ;
-+ }
-+ break ;
-+
-+ }
-+
-+ if(wait)
-+ {
-+ while(!(getDmaStatus(statusMask))) ;
-+ }
-+
-+}
-+#endif
-+
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_dslStartup
-+*
-+*******************************************************************************************
-+* DESCRIPTION: Entry point to initialize and load ax5 daughter board
-+*
-+* INPUT: PITIDSLHW_T *ppIHw
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_api_dslStartup(PITIDSLHW_T *ppIHw)
-+{
-+
-+ ITIDSLHW_T *ptidsl;
-+ int i;
-+ int rc;
-+ dprintf(4,"dslhal_api_dslStartup() NEW 1\n");
-+
-+ ptidsl=(ITIDSLHW_T *)shim_osAllocateMemory(sizeof(ITIDSLHW_T));
-+ if(ptidsl==NULL)
-+ {
-+ dprintf(1, "unable to allocate memory for ptidsl\n");
-+ return 1;
-+ }
-+ *ppIHw=ptidsl;
-+ shim_osZeroMemory((char *) ptidsl, sizeof(ITIDSLHW_T));
-+
-+ /* Unreset the ADSL Subsystem */
-+ rc=dslhal_support_unresetDslSubsystem();
-+ if(rc)
-+ {
-+ dprintf(1, "unable to reset ADSL Subsystem \n");
-+ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
-+ return DSLHAL_ERROR_UNRESET_ADSLSS;
-+ }
-+ ptidsl->fwimage = shim_osAllocateVMemory(DSP_FIRMWARE_MALLOC_SIZE);
-+ if(!ptidsl->fwimage)
-+ {
-+ dprintf(1,"Failed to Allocate Memory for DSP firmware binary \n");
-+ return DSLHAL_ERROR_FIRMWARE_MALLOC;
-+ }
-+ /* read firmware file from flash */
-+ rc=shim_osLoadFWImage(ptidsl->fwimage);
-+ if(rc<0)
-+ {
-+ dprintf(1, "unable to get fw image\n");
-+ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
-+ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
-+ return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
-+ }
-+ else
-+ {
-+ ptidsl->imagesize = rc;
-+ }
-+ /* Compute the CRC checksum on the image and validate the image */
-+
-+ /* Validate the image in the RAM */
-+
-+ /* load fw to DSP */
-+
-+ if(dslhal_support_hostDspCodeDownload(ptidsl))
-+ {
-+ dprintf(0,"dsp load error\n");
-+ for(i=0; i<NUM_PAGES; i++)
-+ {
-+ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
-+ {
-+ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
-+ ptidsl->olayDpPage[i].OverlayXferCount);
-+ }
-+ }
-+ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
-+ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
-+ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
-+ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
-+ return DSLHAL_ERROR_CODE_DOWNLOAD;
-+ }
-+
-+ /* set flag to indicated overlay pages are loaded */
-+ ptidsl->bOverlayPageLoaded = 1;
-+ /* set auto retrain to 1 to disble the overlay page reload */
-+ ptidsl->bAutoRetrain = 1;
-+
-+ /* unreset Raptor */
-+ /* change this to new function */
-+ /* This function should basically bring DSP out of reset bit 23 of PRCR */
-+ /* Function is ready but bypassed for Pre-Silicon */
-+
-+ rc=dslhal_support_unresetDsp();
-+ if (rc)
-+ {
-+ dprintf(0,"unable to bring DSP out of Reset\n");
-+ for(i=0; i<NUM_PAGES; i++)
-+ {
-+ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
-+ {
-+ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
-+ ptidsl->olayDpPage[i].OverlayXferCount);
-+ }
-+ }
-+ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
-+ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
-+ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
-+ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
-+ return DSLHAL_ERROR_UNRESET_DSP;
-+ }
-+ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
-+ dprintf(4,"dslhal_api_dslStartup() done\n");
-+
-+ /* Add the code to initialize the host interface variables */
-+ /* Add code to tickle the host interface */
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_dslShutdown
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: routine to shutdown ax5 modem and free the resource
-+ *
-+ * INPUT: tidsl_t *ptidsl
-+ *
-+ * RETURN: NULL
-+ *
-+ *
-+ *****************************************************************************************/
-+
-+int dslhal_api_dslShutdown(tidsl_t *ptidsl)
-+{
-+ int rc= DSLHAL_ERROR_NO_ERRORS;
-+ int i;
-+
-+ dprintf(5, "dslhal_api_dslShutdown\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DSLSS_SHUTDOWN, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1, " unable to reset DSP \n");
-+ rc = DSLHAL_ERROR_RESET_DSP;
-+ }
-+ /* DSP need 50 ms to send out the message*/
-+
-+ shim_osClockWait(60 * 1000);
-+
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0);
-+
-+ /* free memory allocated*/
-+
-+ for(i=0; i<NUM_PAGES; i++)
-+ {
-+ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
-+ {
-+ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
-+ ptidsl->olayDpPage[i].OverlayXferCount);
-+ }
-+ }
-+ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
-+ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
-+ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
-+ shim_osFreeMemory((void *)ptidsl, sizeof(tidsl_t));
-+ rc = dslhal_support_resetDsp();
-+ if(rc)
-+ {
-+ dprintf(1, " unable to reset ADSL subsystem \n");
-+ rc = DSLHAL_ERROR_RESET_DSP;
-+ }
-+ rc = dslhal_support_resetDslSubsystem();
-+ if(rc)
-+ {
-+ dprintf(1, " unable to reset ADSL subsystem \n");
-+ rc = DSLHAL_ERROR_RESET_ADSLSS;
-+ }
-+return rc;
-+}
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_getDslHalVersion
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This routine supply DSL Driver version.
-+*
-+* INPUT: tidsl_t * ptidsl
-+* void *pVer, DSP Driver Version Pointer
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+* Note: See verdef_u.h for version structure definition.
-+*****************************************************************************************/
-+
-+void dslhal_api_getDslHalVersion(void *pVer)
-+{
-+ dslVer *pVersion;
-+ pVersion = (dslVer *)pVer;
-+ pVersion->major = (unsigned char) DSLHAL_VERSION_MAJOR;
-+ pVersion->minor = (unsigned char) DSLHAL_VERSION_MINOR;
-+ pVersion->bugfix = (unsigned char) DSLHAL_VERSION_BUGFIX;
-+ pVersion->buildNum = (unsigned char) DSLHAL_VERSION_BUILDNUM;
-+ pVersion->timeStamp = (unsigned char) DSLHAL_VERSION_TIMESTAMP;
-+}
-+
-+/********************************************************************************************
-+ * FUNCTION NAME: dslhal_api_pollTrainingStatus()
-+ *
-+ *********************************************************************************************
-+ * DESCRIPTION: code to decode modem status and to start modem training
-+ * Input: tidsl_t *ptidsl
-+ *
-+ * Return: modem status
-+ * -1 failed
-+ *
-+ ********************************************************************************************/
-+
-+int dslhal_api_pollTrainingStatus(tidsl_t *ptidsl)
-+{
-+ int cmd;
-+ int tag;
-+ int parm1,parm2;
-+ int rc;
-+ unsigned int failState;
-+ static unsigned int pollGhsIndex=0;
-+
-+ /*char *tmp;*/
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+#if SWTC
-+ DEV_HOST_tcHostCommDef_t TCHostCommDef;
-+#endif
-+
-+ dprintf(5,"dslhal_api_pollTrainingStatus\n");
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+#if SWTC
-+ dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
-+ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+#endif
-+
-+ rc = dslhal_support_processTrainingState(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Modem Training State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ rc = dslhal_support_processModemStateBitField(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Modem Training State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ /*
-+ rc = dslhal_support_readDelineationState(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Delineation State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ */
-+ while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
-+ {
-+ dprintf(4,"mailbox message: 0x%x\n", cmd);
-+ /*
-+ for(rc=0;rc<8;rc++)
-+ {
-+ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
-+ }
-+ */
-+
-+ if (cmd == DSP_IDLE)
-+ {
-+ dprintf(4,"DSP_IDLE\n");
-+ ptidsl->lConnected=0;
-+ hybrid_selected=888;
-+ /* add code for reload overlay pages */
-+ if(ptidsl->bAutoRetrain == 0)
-+ {
-+ while(ptidsl->bOverlayPageLoaded == 0)
-+ {
-+ shim_osClockWait(6400);
-+ }
-+ //dslhal_support_restoreTrainingInfo(ptidsl);
-+ //ptidsl->bOverlayPageLoaded = 1;
-+ }
-+ /* command DSP to ACTREQ */
-+ if(showtimeFlag == TRUE)
-+ {
-+ dslhal_api_resetTrainFailureLog(ptidsl);
-+ dslhal_support_advancedIdleProcessing(ptidsl);
-+ showtimeFlag = FALSE;
-+ }
-+ failState = (unsigned int)parm1;
-+ if(failState!=0)
-+ {
-+ ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
-+ ptidsl->AppData.trainFails++;
-+ if(ptidsl->AppData.trainFails > 30)
-+ ptidsl->AppData.trainFails=0;
-+ }
-+ for(pollGhsIndex=0;pollGhsIndex<10;pollGhsIndex++)
-+ {
-+ for(rc=0;rc<62;rc++)
-+ ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex][rc]=0;
-+ }
-+ pollGhsIndex=0;
-+ rc = dslhal_support_writeHostMailbox(ptidsl,HOST_ACTREQ, 0, 0, 0);
-+ if (rc)
-+ return DSLHAL_ERROR_MAILBOX_WRITE;
-+ }
-+
-+ if(cmd == DSP_ATM_TC_SYNC)
-+ {
-+ dprintf(4,"\nTC_SYNC\n");
-+ showtimeFlag = TRUE;
-+ ptidsl->lConnected=1;
-+ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
-+ {
-+ dslhal_support_clearTrainingInfo(ptidsl);
-+ ptidsl->bOverlayPageLoaded = 0;
-+ }
-+ }
-+ if(cmd == DSP_ACTIVE)
-+ {
-+ dprintf(4,"DSP_ACTIVE");
-+ ptidsl->lConnected=0;
-+ ptidsl->AppData.bState = RSTATE_SHOWTIME;
-+ dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
-+ dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
-+ }
-+ if(cmd == DSP_ATM_NO_TC_SYNC)
-+ {
-+ dprintf(4,"\nTC_NOSYNC\n");
-+ ptidsl->lConnected=0;
-+ }
-+ if(cmd == DSP_DGASP)
-+ {
-+ dprintf(0,"\n GASP!!! \n");
-+ }
-+ if(cmd == DSP_OVERLAY_END)
-+ {
-+ dprintf(4,"Overlay Page Done %d \n",tag);
-+ rc = dslhal_support_checkOverlayPage(ptidsl,tag);
-+ if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
-+ {
-+ dprintf(0,"Overlay Page: %d CORRUPTED \n",tag);
-+ return (0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
-+ }
-+ }
-+ if(cmd == DSP_HYBRID)
-+ {
-+ dprintf(2,"Hybrid Metrics Available: %d\n",tag);
-+ hybrid_selected = tag;
-+ }
-+ if(cmd == DSP_DGASP)
-+ {
-+ dprintf(0,"\n GASP!!! \n");
-+ }
-+ if(cmd == DSP_XMITBITSWAP)
-+ {
-+ dslhal_support_aocBitSwapProcessing(ptidsl,0);
-+ }
-+ if(cmd == DSP_RCVBITSWAP)
-+ {
-+ dslhal_support_aocBitSwapProcessing(ptidsl,1);
-+ }
-+ if(cmd == DSP_GHSMSG)
-+ {
-+ dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
-+ dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
-+ if(pollGhsIndex > 9)
-+ pollGhsIndex=0;
-+ rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex++][0], tag);
-+ }
-+ if(cmd == DSP_CRATES1)
-+ {
-+ dprintf(3,"DSP C-Rates1 Data Ready \n");
-+ rc = dslhal_support_gatherRateMessages(ptidsl);
-+ }
-+ if(cmd == DSP_SNR)
-+ {
-+ dprintf(3,"DSP SNR Data Ready \n");
-+ rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
-+ }
-+ if(cmd == DSP_EOC)
-+ {
-+ dprintf(3,"DSP_EOC message \n");
-+ rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
-+ }
-+
-+ if(cmd == DSP_TRAINING_MSGS)
-+ {
-+ dprintf(3,"DSP_TRAINING_MSGS \n");
-+ rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
-+ }
-+ }
-+ dprintf(6,"dslhal_api_pollTrainingStatus done\n");
-+ return(ptidsl->AppData.bState);
-+
-+} /* end of dslhal_api_pollTrainingStatus() */
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Code to handle ax5 hardware interrupts
-+*
-+* Input: tidsl_t *ptidsl
-+* int *pMsg, pointer to returned hardware messages. Each byte represent a messge
-+* int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+int dslhal_api_handleTrainingInterrupt(tidsl_t *ptidsl, int intrSource)
-+{
-+ int cmd;
-+ int tag;
-+ int parm1,parm2;
-+ unsigned int msg1;
-+ unsigned int msg2;
-+ int rc;
-+ unsigned int failState;
-+ static unsigned int interruptGhsIndex=0;
-+ /*char *tmp;*/
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+#if SWTC
-+ DEV_HOST_tcHostCommDef_t TCHostCommDef;
-+#endif
-+ dprintf(6,"dslhal_api_handleTrainingInterrupt\n");
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+#if SWTC
-+ dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
-+ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+#endif
-+
-+ if(intrSource & MASK_BITFIELD_INTERRUPTS)
-+ {
-+ dspOamSharedInterface.modemStateBitField_p =(DEV_HOST_modemStateBitField_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStateBitField_p);
-+ rc = dslhal_support_processTrainingState(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Modem Training State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ rc = dslhal_support_processModemStateBitField(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Modem Training State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ }
-+ if(intrSource & MASK_MAILBOX_INTERRUPTS)
-+ {
-+ /*
-+ rc = dslhal_support_readDelineationState(ptidsl);
-+ if(rc)
-+ {
-+ dprintf(0,"Error Reading Delineation State \n");
-+ return DSLHAL_ERROR_MODEMSTATE;
-+ }
-+ */
-+ while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
-+ {
-+ dprintf(4,"mailbox message: 0x%x\n", cmd);
-+ /*
-+ for(rc=0;rc<8;rc++)
-+ {
-+ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
-+ }
-+ */
-+ if (cmd == DSP_IDLE)
-+ {
-+ dprintf(4,"DSP_IDLE\n");
-+ ptidsl->lConnected=0;
-+ hybrid_selected=888;
-+ if(showtimeFlag == TRUE)
-+ {
-+ dslhal_api_resetTrainFailureLog(ptidsl);
-+ dslhal_support_advancedIdleProcessing(ptidsl);
-+ showtimeFlag = FALSE;
-+ }
-+ failState = (unsigned int)parm1;
-+ if(failState!=0)
-+ {
-+ ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
-+ ptidsl->AppData.trainFails++;
-+ if(ptidsl->AppData.trainFails > 30)
-+ ptidsl->AppData.trainFails=0;
-+ }
-+ for(interruptGhsIndex=0;interruptGhsIndex<10;interruptGhsIndex++)
-+ {
-+ for(rc=0;rc<62;rc++)
-+ ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex][rc]=0;
-+ }
-+ interruptGhsIndex=0;
-+
-+ /* add code for reload overlay pages */
-+ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 0)
-+ {
-+ dslhal_support_restoreTrainingInfo(ptidsl);
-+ ptidsl->bOverlayPageLoaded = 1;
-+ }
-+ /* command DSP to ACTREQ */
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_ACTREQ, 0, 0, 0);
-+ if (rc)
-+ return DSLHAL_ERROR_MAILBOX_WRITE;
-+ }
-+ if(cmd == DSP_ATM_TC_SYNC)
-+ {
-+ dprintf(4,"\nTC_SYNC\n");
-+ showtimeFlag = TRUE;
-+ ptidsl->lConnected=1;
-+ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
-+ {
-+ dslhal_support_clearTrainingInfo(ptidsl);
-+ ptidsl->bOverlayPageLoaded = 0;
-+ }
-+ }
-+ if(cmd == DSP_ACTIVE)
-+ {
-+ ptidsl->lConnected=0;
-+ ptidsl->AppData.bState = RSTATE_SHOWTIME;
-+ dprintf(4,"DSP_ACTIVE");
-+ dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
-+ dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
-+ }
-+ if(cmd == DSP_ATM_NO_TC_SYNC)
-+ {
-+ dprintf(4,"\nTC_NOSYNC\n");
-+ ptidsl->lConnected=0;
-+ /* add code for reload overlay pages */
-+ }
-+ if(cmd == DSP_OVERLAY_END)
-+ {
-+ dprintf(4,"Overlay Page Done %d \n",tag);
-+ rc = dslhal_support_checkOverlayPage(ptidsl,tag);
-+ if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
-+ {
-+ dprintf(4,"Overlay Page: %d CORRUPTED \n",tag);
-+ return(0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
-+ }
-+ }
-+ if(cmd == DSP_HYBRID)
-+ {
-+ dprintf(2,"Hybrid Metrics Available\n");
-+ hybrid_selected = tag;
-+ }
-+ if(cmd == DSP_XMITBITSWAP)
-+ {
-+ rc = dslhal_support_aocBitSwapProcessing(ptidsl,0);
-+ }
-+ if(cmd == DSP_RCVBITSWAP)
-+ {
-+ rc = dslhal_support_aocBitSwapProcessing(ptidsl,1);
-+ }
-+ if(cmd == DSP_GHSMSG)
-+ {
-+ dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
-+ dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
-+ if(interruptGhsIndex > 9)
-+ interruptGhsIndex=0;
-+ rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex++][0], tag);
-+ }
-+ if(cmd == DSP_CRATES1)
-+ {
-+ dprintf(3,"DSP C-Rates1 Data Ready \n");
-+ rc = dslhal_support_gatherRateMessages(ptidsl);
-+ }
-+ if(cmd == DSP_SNR)
-+ {
-+ dprintf(3,"DSP SNR Data Ready \n");
-+ rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
-+ }
-+ if(cmd == DSP_EOC)
-+ {
-+ dprintf(3,"DSP_EOC message \n");
-+ rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
-+ }
-+ if(cmd == DSP_TRAINING_MSGS)
-+ {
-+ dprintf(3,"DSP_TRAINING_MSGS \n");
-+ rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
-+ }
-+ }
-+
-+ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
-+ dprintf(5,"Text Message Part1: 0x%x \t Text Message Part2: 0x%x \n",msg1,msg2);
-+ }
-+ dprintf(6,"dslhal_api_handleTrainingInterrupt done\n");
-+ return(ptidsl->AppData.bState);
-+} /* end of dslhal_api_handleTrainingInterrupt() */
-+
-+
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_dslRetrain(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends CMD_ACTREQ to the DSP to issue a retrain
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_dslRetrain(tidsl_t *ptidsl)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_cfg_dslRetrain \n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_cfg_dslRetrain failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendQuiet(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendQuiet(tidsl_t *ptidsl)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_api_sendQuiet\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_api_sendQuiet failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendIdle(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendIdle(tidsl_t *ptidsl)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_api_sendIdle\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_IDLE, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_api_sendIdle failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendDgasp(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendDgasp(tidsl_t *ptidsl)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_api_sendDgasp\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_api_sendDgasp failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Desired Training Mode {None/Multimode/G.dmt/lite
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
-+* 2: T1.413, 3:G.dmt, 4: G.lite
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
-+{
-+ DEV_HOST_oamWrNegoParaDef_t NegoPara;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setTrainingMode()\n");
-+ if(trainmode>255)
-+ {
-+ dprintf(3,"Invalid Value for Desired Training Mode (must be <255)\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ /* Enum Translation to maintain backwards compatibility for train modes */
-+ if(trainmode == DSLTRAIN_MULTI_MODE)
-+ trainmode = MULTI_MODE;
-+ if(trainmode == DSLTRAIN_T1413_MODE)
-+ trainmode = T1413_MODE;
-+ if(trainmode == DSLTRAIN_GDMT_MODE)
-+ trainmode = GDMT_MODE;
-+
-+ NegoPara.stdMode = trainmode;
-+ dprintf(5,"Train Mode: 0x%x\n",trainmode);
-+ rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+
-+ dprintf(5," dslhal_api_setTrainingMode() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_getDspVersion
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This routine supply AX5 daugther card DSP version.
-+*
-+* INPUT: tidsl_t * ptidsl
-+* void *pVer, DSP version struct is returned starting at this pointer
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+* Note: See verdef_u.h for version structure definition.
-+*****************************************************************************************/
-+int dslhal_api_getDspVersion(tidsl_t *ptidsl, void *pVer)
-+{
-+ /* DEV_HOST_dspVersionDef_t dspVersion; */
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5, "dslhal_api_getDspVersion\n");
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ if(!pVer)
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+
-+ *(unsigned int *) pVer = 0;
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,
-+ pVer, sizeof(dspVer));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ pVer = (DEV_HOST_dspVersionDef_t *)(dslhal_support_byteSwap32((unsigned int)pVer));
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_gatherStatistics()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Read statistical infromation from ax5 modem daugter card.
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+void dslhal_api_gatherStatistics(tidsl_t * ptidsl)
-+{
-+ int rc,optIdxU,optIdxD,i;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_dspWrNegoParaDef_t rateparms;
-+ DEV_HOST_oamWrNegoParaDef_t configParms;
-+ DEV_HOST_modemStatsDef_t StatisticsDef;
-+ DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
-+ DEV_HOST_atmStats_t atmStats;
-+ DEV_HOST_usAtmStats_t usAtmStats0, usAtmStats1;
-+ DEV_HOST_dsAtmStats_t dsAtmStats0,dsAtmStats1;
-+ DEV_HOST_dspWrSuperFrameCntDef_t SuperFrameCnt;
-+ DEV_HOST_msg_t atuc_msg, aturMsg;
-+ DEV_HOST_eocVarDef_t eocVar;
-+ DEV_HOST_dspWrSharedTables_t sharedTables;
-+ DEV_HOST_phyPerf_t phyPerf;
-+ unsigned char usBits[64],dsBits[256];
-+ unsigned char dsPowerCutBack;
-+ int usNumLoadedTones=0, dsNumLoadedTones=0;
-+
-+ dprintf(5, "dslhal_api_gatherStatistics\n");
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ if(!ptidsl->bStatisticsInitialized && ptidsl->lConnected == LINE_CONNECTED)
-+ {
-+ dslhal_api_initStatistics(ptidsl);
-+ ptidsl->bStatisticsInitialized = TRUE;
-+ }
-+
-+ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p,
-+ &rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ if(!rc)
-+ {
-+ /* trained mode */
-+ ptidsl->AppData.dsl_modulation = (unsigned int)rateparms.trainMode;
-+ if(rateparms.trainMode == T1413_MODE)
-+ ptidsl->AppData.dsl_modulation = DSLTRAIN_T1413_MODE;
-+ if(rateparms.trainMode == GDMT_MODE)
-+ ptidsl->AppData.dsl_modulation = DSLTRAIN_GDMT_MODE;
-+ /* rate */
-+ /* shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, 120); */
-+ ptidsl->AppData.bCRates2 = rateparms.cRates2;
-+ /* shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
-+ ptidsl->AppData.bRRates2 = rateparms.rRates2;
-+ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
-+ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
-+ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4);
-+ ptidsl->AppData.atucVendorId = (unsigned int)rateparms.atucVendorId;
-+ ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
-+ ptidsl->AppData.atucRevisionNum = (unsigned int)rateparms.atucGhsRevisionNum;
-+ ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
-+ ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
-+
-+ if((rateparms.cRates2 & 0x0f) == 0x01)
-+ optIdxU = 0;
-+ else if((rateparms.cRates2 & 0x0f) == 0x02)
-+ optIdxU = 1;
-+ else if((rateparms.cRates2 & 0x0f) == 0x04)
-+ optIdxU = 2;
-+ else if((rateparms.cRates2 & 0x0f) == 0x08)
-+ optIdxU = 3;
-+ else
-+ optIdxU = -1;
-+
-+ dprintf(5, "optIdxU=%d\n", optIdxU);
-+
-+ /* Obtain the US Rates using Opt# and CRates1 Table */
-+ /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32 */
-+ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
-+ ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
-+ else
-+ ptidsl->AppData.USConRate = 32 * dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
-+
-+ ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate;
-+
-+ if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01)
-+ optIdxD = 0;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)
-+ optIdxD = 1;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04)
-+ optIdxD = 2;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)
-+ optIdxD = 3;
-+ else
-+ optIdxD = -1;
-+ /* Obtain the DS Rates using Opt# and CRates1 Table */
-+ /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32 */
-+ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
-+ ptidsl->AppData.DSConRate = (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
-+ else
-+ ptidsl->AppData.DSConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
-+
-+ dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
-+ /* Determine which Path has Modem Trained with */
-+ if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
-+ ptidsl->AppData.TrainedPath = FAST_PATH;
-+ else
-+ ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
-+
-+ /* Set the mode in which the modem is trained */
-+ ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
-+ if(rateparms.trainMode == T1413_MODE)
-+ ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
-+ if(rateparms.trainMode == GDMT_MODE)
-+ ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
-+
-+ if(ptidsl->AppData.TrainedPath == FAST_PATH)
-+ ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
-+ else
-+ ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
-+ ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
-+ ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
-+
-+ if(ptidsl->AppData.TrainedPath == FAST_PATH)
-+ ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
-+ else
-+ ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
-+ ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
-+ ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
-+ }
-+
-+ dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ /* Populate the Error Structure Variables */
-+
-+ /* US Interleave Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* DS Interleave Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* US Fast Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* DS Fast Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+ if(!rc)
-+ {
-+ if(ptidsl->AppData.bState > 2)
-+ {
-+ /* Get CRC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsICRC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
-+ ptidsl->AppData.dsFCRC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
-+ ptidsl->AppData.usICRC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
-+ ptidsl->AppData.usFCRC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
-+ /* Get FEC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsIFEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
-+ ptidsl->AppData.dsFFEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
-+ ptidsl->AppData.usIFEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
-+ ptidsl->AppData.usFFEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
-+ /* Get NCD Errors Stats for both US and DS */
-+ ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
-+ ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
-+ ptidsl->AppData.usINCD_error = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
-+ ptidsl->AppData.usFNCD_error = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
-+ /* Get LCD Errors Stats for both US and DS */
-+ ptidsl->AppData.dsILCD_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
-+ ptidsl->AppData.dsFLCD_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
-+ ptidsl->AppData.usILCD_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
-+ ptidsl->AppData.usFLCD_errors = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
-+ /*Get HEC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsIHEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
-+ ptidsl->AppData.dsFHEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
-+ ptidsl->AppData.usIHEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
-+ ptidsl->AppData.usFHEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
-+
-+ /* Get LOS and SEF error Stats */
-+ ptidsl->AppData.LOS_errors = dslhal_support_byteSwap32(StatisticsDef.losErrors);
-+ ptidsl->AppData.SEF_errors = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
-+ ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
-+ ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);
-+
-+ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ /* Populate the US/DS ATM Stats Variables */
-+
-+ /* US ATM Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* DS ATM Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+ atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* Get ATM Stats for both US and DS for Channel 0*/
-+ ptidsl->AppData.usAtm_count[0] = dslhal_support_byteSwap32(usAtmStats0.goodCount);
-+ ptidsl->AppData.usIdle_count[0] = dslhal_support_byteSwap32(usAtmStats0.idleCount);
-+#if SWTC
-+ ptidsl->AppData.usPdu_count[0] = dslhal_support_byteSwap32(usAtmStats0.pduCount);
-+#endif
-+ ptidsl->AppData.dsGood_count[0] = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
-+ ptidsl->AppData.dsIdle_count[0] = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
-+#if SWTC
-+ ptidsl->AppData.dsPdu_count[0] = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
-+#endif
-+ ptidsl->AppData.dsBadHec_count[0] = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
-+ ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
-+ /* Get ATM Stats for both US and DS for Channel 1*/
-+ ptidsl->AppData.usAtm_count[1] = dslhal_support_byteSwap32(usAtmStats1.goodCount);
-+ ptidsl->AppData.usIdle_count[1] = dslhal_support_byteSwap32(usAtmStats1.idleCount);
-+#if SWTC
-+ ptidsl->AppData.usPdu_count[1] = dslhal_support_byteSwap32(usAtmStats1.pduCount);
-+#endif
-+ ptidsl->AppData.dsGood_count[1] = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
-+ ptidsl->AppData.dsIdle_count[1] = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
-+#if SWTC
-+ ptidsl->AppData.dsPdu_count[1] = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
-+#endif
-+ ptidsl->AppData.dsBadHec_count[1] = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
-+ ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
-+
-+ /* Determine the US and DS Superframe Count */
-+
-+ dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ ptidsl->AppData.usSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
-+ ptidsl->AppData.dsSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
-+
-+ /* Determine Frame Mode and Max Frame Mode */
-+
-+ dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ ptidsl->AppData.FrmMode = (unsigned int)atuc_msg.framingMode;
-+ ptidsl->AppData.MaxFrmMode = (unsigned int)atuc_msg.maxFrameMode;
-+
-+ /* Determine Gross Gain */
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
-+
-+ /* Determine DS Line Attenuation & Margin */
-+ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ ptidsl->AppData.dsLineAttn = (unsigned int)eocVar.lineAtten;
-+ ptidsl->AppData.dsMargin = (unsigned int)eocVar.dsMargin;
-+ }
-+ }
-+
-+ /* Read in the Shared Tables structure */
-+ dspOamSharedInterface.dspWrSharedTables_p = (DEV_HOST_dspWrSharedTables_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWrSharedTables_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWrSharedTables_p,&sharedTables, sizeof(DEV_HOST_dspWrSharedTables_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ /* Read the ATU-R Bits and Gains Table */
-+ sharedTables.aturBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.aturBng_p);
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.aturBng_p,ptidsl->AppData.rBng,255*2*sizeof(unsigned char));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ /* Read the ATU-C Bits and Gains Table */
-+ sharedTables.atucBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.atucBng_p);
-+ if(ptidsl->netService == 2) /* for Annex_B */
-+ {
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,126*sizeof(unsigned char));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ for(i=0;i<US_BNG_LENGTH*2;i++)
-+ usBits[i]=0;
-+ for(i=1;i<US_BNG_LENGTH*2;i++)
-+ {
-+ usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
-+ dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
-+ }
-+ for(i=1;i<US_BNG_LENGTH*2;i++)
-+ {
-+ if(usBits[i])
-+ usNumLoadedTones++;
-+ }
-+ }
-+ else
-+ {
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,62*sizeof(unsigned char));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ for(i=0;i<US_BNG_LENGTH;i++)
-+ usBits[i]=0;
-+ for(i=1;i<US_BNG_LENGTH;i++)
-+ {
-+ usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
-+ dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
-+ }
-+ for(i=1;i<US_BNG_LENGTH;i++)
-+ {
-+ if(usBits[i])
-+ usNumLoadedTones++;
-+ }
-+ }
-+
-+ /* Determine Number U/S of Loaded Tones */
-+
-+ /* U/S Power Computation */
-+ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
-+ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ ptidsl->AppData.currentHybridNum = phyPerf.currentHybridNumUsed;
-+ phyPerf.usAvgGain = dslhal_support_byteSwap32(phyPerf.usAvgGain);
-+ ptidsl->AppData.usTxPower = LOG43125 + phyPerf.usAvgGain + (256*US_NOMINAL_POWER)+log10[usNumLoadedTones-1];
-+ dprintf(7,"Avg Gain: 0x%x usNumLoadedTones: 0x%x log: 0x%x\n",phyPerf.usAvgGain, usNumLoadedTones, log10[usNumLoadedTones-1]);
-+
-+ /* Determine Number D/S of Loaded Tones */
-+ dsBits[0]=0;
-+ for(i=0;i<DS_BNG_LENGTH;i++)
-+ {
-+ dsBits[i]=0;
-+ /* ptidsl->AppData.rBng[i-1]=dslhal_support_byteSwap32((unsigned int)ptidsl->AppData.rBng[i-1]);*/
-+ }
-+ for(i=1;i<DS_BNG_LENGTH;i++)
-+ {
-+ dsBits[i]=((ptidsl->AppData.rBng[(i-1)*2])&0xf);
-+ dprintf(5,"Bit #%d : 0x%x\n",i,dsBits[i]);
-+ }
-+ for(i=1;i<DS_BNG_LENGTH;i++)
-+ {
-+ if(dsBits[i])
-+ dsNumLoadedTones++;
-+ }
-+ /* D/S Power Computation */
-+ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
-+ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ /* D/S Power Cutback */
-+ dsPowerCutBack = (unsigned char)((((ptidsl->AppData.bCMsgs1[0]) >>6) &0x3)+(((ptidsl->AppData.bCMsgs1[1]) &0x1) <<2));
-+ phyPerf.dsAvgGain = dslhal_support_byteSwap32(phyPerf.dsAvgGain);
-+ ptidsl->AppData.dsTxPower = LOG43125 + phyPerf.dsAvgGain + (256*((2*(dsPowerCutBack-1))-52)) + log10[dsNumLoadedTones-1];
-+ dprintf(7,"Avg Gain: %d dsNumLoadedTones: %d log: %d pcb: %d \n",phyPerf.dsAvgGain, dsNumLoadedTones, log10[dsNumLoadedTones-1], dsPowerCutBack);
-+ /* ds bit allocation */
-+ sharedTables.bitAllocTblDstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblDstrm_p);
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblDstrm_p,ptidsl->AppData.BitAllocTblDstrm, 256*sizeof(unsigned char));
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed \n");
-+ return;
-+ }
-+
-+ /* us bit allocation */
-+ sharedTables.bitAllocTblUstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblUstrm_p);
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblUstrm_p,ptidsl->AppData.BitAllocTblUstrm, 32*sizeof(unsigned char));
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed \n");
-+ return;
-+ }
-+ /* margin per tone */
-+ sharedTables.marginTblDstrm_p = (signed char *)dslhal_support_byteSwap32((unsigned int)sharedTables.marginTblDstrm_p);
-+ rc = dslhal_support_blockRead((PVOID)sharedTables.marginTblDstrm_p,ptidsl->AppData.marginTblDstrm, 256*sizeof(signed char));
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed \n");
-+ return;
-+ }
-+ /* Read Configured Options */
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p,
-+ &configParms, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ else
-+ {
-+ /* r-Msg1 */
-+ ptidsl->AppData.StdMode = (unsigned int)configParms.stdMode;
-+ if(configParms.stdMode == T1413_MODE)
-+ ptidsl->AppData.StdMode = DSLTRAIN_T1413_MODE;
-+ if(configParms.stdMode == GDMT_MODE)
-+ ptidsl->AppData.StdMode = DSLTRAIN_GDMT_MODE;
-+ if(configParms.stdMode == MULTI_MODE)
-+ ptidsl->AppData.StdMode = DSLTRAIN_MULTI_MODE;
-+
-+ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs1, (void *)configParms.rMsgs1, 6*sizeof(char));
-+ if((ptidsl->AppData.bRMsgs1[2] & 0x02) == 0x02)
-+ {
-+ dprintf(7,"Trellis!\n");
-+ ptidsl->configFlag |= CONFIG_FLAG_TRELLIS;
-+ }
-+ else
-+ ptidsl->configFlag &= ~CONFIG_FLAG_TRELLIS;
-+ if(ptidsl->AppData.bRMsgs1[2]&0x01)
-+ ptidsl->configFlag |= CONFIG_FLAG_EC;
-+ else
-+ ptidsl->configFlag &= ~CONFIG_FLAG_EC;
-+ }
-+ return;
-+}
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_initStatistics()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: init statistical information of ax5 modem daugter card.
-+*
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: NULL
-+*
-+********************************************************************************************/
-+void dslhal_api_initStatistics(tidsl_t * ptidsl)
-+{
-+ int rc;
-+ /*TCHostCommDef TCHostCommParms; */
-+ int optIdxU, optIdxD;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_dspWrNegoParaDef_t rateparms;
-+ DEV_HOST_modemStatsDef_t StatisticsDef;
-+ DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
-+ DEV_HOST_atmStats_t atmStats;
-+ DEV_HOST_usAtmStats_t usAtmStats0, usAtmStats1;
-+ DEV_HOST_dsAtmStats_t dsAtmStats0,dsAtmStats1;
-+ DEV_HOST_dspWrSuperFrameCntDef_t SuperFrameCnt;
-+ DEV_HOST_msg_t atuc_msg, aturMsg;
-+ DEV_HOST_eocVarDef_t eocVar;
-+
-+ dprintf(5, "dslhal_api_initStatistics\n");
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p,&rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ if(!rc)
-+ {
-+ /* shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, SIZE_OF_CRATES1_TABLE); */
-+ ptidsl->AppData.bCRates2 = rateparms.cRates2;
-+ /* shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
-+ ptidsl->AppData.bRRates2 = rateparms.rRates2;
-+ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
-+ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
-+ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4);
-+
-+ ptidsl->AppData.atucVendorId = dslhal_support_byteSwap32((unsigned int)rateparms.atucVendorId);
-+ ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
-+ ptidsl->AppData.atucRevisionNum = rateparms.atucGhsRevisionNum;
-+ ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
-+ ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
-+
-+ /* Get the UpStream Connection Rate */
-+ /* Based on the Bit Pattern Get the Opt# */
-+ if((rateparms.cRates2 & 0x0f) == 0x01)
-+ optIdxU = 0;
-+ else if((rateparms.cRates2 & 0x0f) == 0x02)
-+ optIdxU = 1;
-+ else if((rateparms.cRates2 & 0x0f) == 0x04)
-+ optIdxU = 2;
-+ else if((rateparms.cRates2 & 0x0f) == 0x08)
-+ optIdxU = 3;
-+ else
-+ optIdxU = -1;
-+ dprintf(5, "optIdxU=%d\n", optIdxU);
-+ /* Obtain the US Rates using Opt# and CRates1 Table */
-+ /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32 */
-+ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
-+ ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
-+ else
-+ ptidsl->AppData.USConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
-+ ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate;
-+
-+ /* Get the DownStream Connection Rate */
-+ /* Based on the Bit Pattern Get the Opt# */
-+ if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01)
-+ optIdxD = 0;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)
-+ optIdxD = 1;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04)
-+ optIdxD = 2;
-+ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)
-+ optIdxD = 3;
-+ else
-+ optIdxD = -1;
-+ /* Obtain the DS Rates using Opt# and CRates1 Table */
-+ /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32 */
-+ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
-+ ptidsl->AppData.DSConRate = (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
-+ else
-+ ptidsl->AppData.DSConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
-+ dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
-+ /* Determine which Path has Modem Trained with */
-+ if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
-+ ptidsl->AppData.TrainedPath = FAST_PATH;
-+ else
-+ ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
-+
-+ /* Set the mode in which the modem is trained */
-+ ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
-+ if(rateparms.trainMode == T1413_MODE)
-+ ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
-+ if(rateparms.trainMode == GDMT_MODE)
-+ ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
-+
-+ if(ptidsl->AppData.TrainedPath == FAST_PATH)
-+ ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
-+ else
-+ ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
-+ ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
-+ ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
-+
-+ if(ptidsl->AppData.TrainedPath == FAST_PATH)
-+ ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
-+ else
-+ ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
-+ ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
-+ ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
-+ }
-+
-+ /* get the Statistics itself */
-+
-+ dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ /* Populate the Error Structure Variables */
-+
-+ /* US Interleave Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* DS Interleave Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* US Fast Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+
-+ /* DS Fast Path Error Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ if(ptidsl->AppData.bState > 2)
-+ {
-+ /* Get CRC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsICRC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
-+ ptidsl->AppData.dsFCRC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
-+ ptidsl->AppData.usICRC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
-+ ptidsl->AppData.usFCRC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
-+ /* Get FEC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsIFEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
-+ ptidsl->AppData.dsFFEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
-+ ptidsl->AppData.usIFEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
-+ ptidsl->AppData.usFFEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
-+ /* Get NCD Errors Stats for both US and DS */
-+ ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
-+ ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
-+ ptidsl->AppData.usINCD_error = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
-+ ptidsl->AppData.usFNCD_error = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
-+ /* Get LCD Errors Stats for both US and DS */
-+ ptidsl->AppData.dsILCD_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
-+ ptidsl->AppData.dsFLCD_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
-+ ptidsl->AppData.usILCD_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
-+ ptidsl->AppData.usFLCD_errors = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
-+ /*Get HEC Errors Stats for both US and DS */
-+ ptidsl->AppData.dsIHEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
-+ ptidsl->AppData.dsFHEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
-+ ptidsl->AppData.usIHEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
-+ ptidsl->AppData.usFHEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
-+
-+ /* Get LOS and SEF error Stats */
-+ ptidsl->AppData.LOS_errors = dslhal_support_byteSwap32(StatisticsDef.losErrors);
-+ ptidsl->AppData.SEF_errors = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
-+ ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
-+ ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);
-+
-+ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ /* Populate the US/DS ATM Stats Variables */
-+
-+ /* US ATM Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+
-+ /* DS ATM Statistics */
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+
-+ /* Change the endianness of the Pointer */
-+ atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
-+
-+ if (rc)
-+ return;
-+ /* Get ATM Stats for both US and DS Channel 0*/
-+ ptidsl->AppData.usAtm_count[0] = dslhal_support_byteSwap32(usAtmStats0.goodCount);
-+ ptidsl->AppData.usIdle_count[0] = dslhal_support_byteSwap32(usAtmStats0.idleCount);
-+#if SWTC
-+ ptidsl->AppData.usPdu_count[0] = dslhal_support_byteSwap32(usAtmStats0.pduCount);
-+#endif
-+ ptidsl->AppData.dsGood_count[0] = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
-+ ptidsl->AppData.dsIdle_count[0] = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
-+#if SWTC
-+ ptidsl->AppData.dsPdu_count[0] = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
-+#endif
-+ ptidsl->AppData.dsBadHec_count[0] = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
-+ ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
-+
-+ /* Get ATM Stats for both US and DS Channel 1*/
-+ ptidsl->AppData.usAtm_count[1] = dslhal_support_byteSwap32(usAtmStats1.goodCount);
-+ ptidsl->AppData.usIdle_count[1] = dslhal_support_byteSwap32(usAtmStats1.idleCount);
-+#if SWTC
-+ ptidsl->AppData.usPdu_count[1] = dslhal_support_byteSwap32(usAtmStats1.pduCount);
-+#endif
-+ ptidsl->AppData.dsGood_count[1] = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
-+ ptidsl->AppData.dsIdle_count[1] = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
-+#if SWTC
-+ ptidsl->AppData.dsPdu_count[1] = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
-+#endif
-+ ptidsl->AppData.dsBadHec_count[1] = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
-+ ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
-+
-+
-+ /* Determine the US and DS Superframe Count */
-+
-+ dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ ptidsl->AppData.usSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
-+ ptidsl->AppData.dsSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
-+
-+ /* Determine Frame Mode and Max Frame Mode */
-+
-+ dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ ptidsl->AppData.FrmMode = (unsigned int)atuc_msg.framingMode;
-+ ptidsl->AppData.MaxFrmMode = (unsigned int)atuc_msg.maxFrameMode;
-+
-+ /* Determine Gross Gain */
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+ ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
-+ /* Determine DS Line Attenuation & Margin */
-+ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return;
-+ }
-+
-+ ptidsl->AppData.dsLineAttn = (unsigned int)eocVar.lineAtten;
-+ ptidsl->AppData.dsMargin = (unsigned int)eocVar.dsMargin;
-+ }
-+
-+#if __HOST_FORINTERNALUSEONLY_R_H__
-+ ptidsl->AppData.BER = dslhal_INTERNAL_computeAtmBitErrorRate(ptidsl);
-+#endif
-+ dprintf(5, "initstatistics done\n");
-+ return;
-+ }
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction enables/disables all the LOS alarms
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int set; //if set is TRUE: LOS Alarms are disabled else enabled
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ * NOTES: Currently not supported in any version other than MR4 Patch release..
-+ *****************************************************************************************/
-+unsigned int dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set)
-+{
-+ DEV_HOST_oamWrNegoParaDef_t NegoPara;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setTrainingMode()\n");
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(set)
-+ {
-+ NegoPara.disableLosAlarm = TRUE;
-+ /* NegoPara.marginMonitorTrning = TRUE;
-+ NegoPara.marginMonitorShwtme = TRUE;*/
-+ }
-+ else
-+ {
-+ NegoPara.disableLosAlarm = FALSE;
-+ /* NegoPara.marginMonitorTrning = FALSE;
-+ NegoPara.marginMonitorShwtme = FALSE;*/
-+ }
-+
-+ rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ dprintf(5," dslhal_api_disableLosAlarm() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setMarginThreshold(tidsl_t *ptidsl,int threshold)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction does sets the Margin threshold
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * int threshold
-+ *
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)
-+{
-+ DEV_HOST_oamWrNegoParaDef_t NegoPara;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+
-+ dprintf(5," dslhal_ctrl_setThreshold()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+
-+ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ NegoPara.marginThreshold = threshold;
-+
-+ rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+
-+ if(rc)
-+ return DSLHAL_ERROR_MARGIN_API_FAILURE;
-+
-+ dprintf(5," dslhal_api_setThreshold() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction does sets the Margin monitoring flag
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int trainflag
-+ * unsigned int shwtflag
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl,unsigned int trainflag,unsigned int shwtflag)
-+{
-+ DEV_HOST_oamWrNegoParaDef_t NegoPara;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+
-+ dprintf(5," dslhal_ctrl_setMonitorFlags()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+
-+ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ if (trainflag)
-+ {
-+ NegoPara.marginMonitorTrning = TRUE;
-+ }
-+ else
-+ {
-+ NegoPara.marginMonitorTrning = FALSE;
-+ }
-+ if (shwtflag)
-+ {
-+ NegoPara.marginMonitorShwtme = TRUE;
-+ }
-+ else
-+ {
-+ NegoPara.marginMonitorShwtme = FALSE;
-+ }
-+
-+ rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_MARGIN_API_FAILURE;
-+ dprintf(5," dslhal_api_setMonitorFlags() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNum)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the eoc Serial Number
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *SerialNum : Input eoc Serial Number
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)
-+{
-+ DEV_HOST_eocVarDef_t eocVar;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setEocSerialNumber()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
-+ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ shim_osMoveMemory(eocVar.serialNumber,SerialNumber,32);
-+
-+ rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_EOCREG_API_FAILURE;
-+ dprintf(5," dslhal_api_setEocSerialNumber() Done\n");
-+
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+}
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the eoc Vendor ID
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *VendorID : Input eoc Vendor ID
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
-+{
-+ DEV_HOST_oamWrNegoParaDef_t NegoPara;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setEocVendorId()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+
-+
-+ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ shim_osMoveMemory(NegoPara.gdmtVendorId,VendorID,8);
-+ rc= dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_EOCREG_API_FAILURE;
-+
-+ dprintf(5," dslhal_api_setEocVendorId() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the eoc Revision Number
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *RevNum : Input eoc Revision Number
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNumber)
-+{
-+
-+ DEV_HOST_eocVarDef_t eocVar;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ /*add for UR2 test */
-+ UINT8 selfTestResults[2];
-+ memset(selfTestResults,0x00,sizeof(selfTestResults));
-+ /* add for UR2 test */
-+ dprintf(5," dslhal_api_setEocRevisionNumber()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
-+ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ shim_osMoveMemory(eocVar.revNumber,RevNumber,4);
-+ /* add for UR2 test */
-+ shim_osMoveMemory(eocVar.dummy,selfTestResults,2);
-+ /* add for UR2 test */
-+ rc=dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_EOCREG_API_FAILURE;
-+ dprintf(5," dslhal_api_setEocRevisionNumber Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the eoc ATUR Config Register
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *ATURConfig : Input eoc ATUR Config Register
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
-+{
-+
-+ DEV_HOST_eocVarDef_t eocVar;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setAturConfig()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
-+ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ shim_osMoveMemory(eocVar.aturConfig,ATURConfig,30);
-+ rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_EOCREG_API_FAILURE;
-+ dprintf(5," dslhal_api_setAturConfig() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int flag; //if flag = TRUE set rateadapt flag else reset it
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
-+{
-+ DEV_HOST_msg_t aturMsg;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setRateAdaptFlag()\n");
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
-+ &aturMsg, sizeof(DEV_HOST_msg_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ if(flag)
-+ aturMsg.rateAdapt = TRUE;
-+ else
-+ aturMsg.rateAdapt = FALSE;
-+
-+ rc= dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ dprintf(5," dslhal_api_setRateAdaptFlag() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int flag; // if flag = TRUE, set trellis flag else reset
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
-+{
-+
-+ DEV_HOST_msg_t aturMsg;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_oamWrNegoParaDef_t negoPara;
-+ int rc;
-+ dprintf(5," dslhal_api_setTrellisFlag()\n");
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+ rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+ rc += dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&negoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ if(flag)
-+ {
-+ aturMsg.trellis = TRUE;
-+ negoPara.rMsgs1[2] |= 0x02;
-+ }
-+ else
-+ {
-+ aturMsg.trellis = FALSE;
-+ negoPara.rMsgs1[2] &= 0xFD;
-+ }
-+ rc=0;
-+ rc+=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
-+ rc+= dslhal_support_blockWrite(&negoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+
-+ dprintf(5," dslhal_api_setTrellisFlag() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int maxbits : should be a value between 0-15
-+*
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
-+{
-+
-+ DEV_HOST_msg_t aturMsg;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+
-+ dprintf(5," dslhal_api_setMaxBitsPerCarrier()\n");
-+ if(maxbits>15)
-+ {
-+ dprintf(3,"Maximum Number of Bits per carrier cannot exceed 15!\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
-+ &aturMsg, sizeof(DEV_HOST_msg_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ aturMsg.maxBits = maxbits;
-+
-+ rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ dprintf(5," dslhal_api_setMaxBitsPerCarrier() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
-+* size 64-512
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
-+{
-+ DEV_HOST_msg_t aturMsg;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ int rc;
-+ dprintf(5," dslhal_api_setMaxInterleaverDepth()\n");
-+ if(maxdepth>3)
-+ {
-+ dprintf(3,"Invalid Value for maximum interleave depth (must be <3)\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
-+ &aturMsg, sizeof(DEV_HOST_msg_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ aturMsg.maxIntlvDepth = maxdepth;
-+
-+ rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ dprintf(5," dslhal_api_setMaxInterleaverDepth() Done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_acknowledgeInterrupt(tidsl_t * ptidsl)
-+{
-+ unsigned int interruptSources=0;
-+ /* Clear out the DSLSS Interrupt Registers to acknowledge Interrupt */
-+ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_MAILBOX_INTERRUPTS)
-+ {
-+ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_MAILBOX_INTERRUPTS;
-+ dprintf(5,"Mailbox Interrupt \n");
-+ }
-+ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_BITFIELD_INTERRUPTS)
-+ {
-+ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_BITFIELD_INTERRUPTS;
-+ dprintf(5,"Bitfield Interrupt \n");
-+ }
-+ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_HEARTBEAT_INTERRUPTS)
-+ {
-+ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_HEARTBEAT_INTERRUPTS;
-+ dprintf(5,"HeartBeat Interrupt \n");
-+ }
-+ interruptSources = dslhal_support_parseInterruptSource(ptidsl);
-+ if(interruptSources < 0)
-+ return DSLHAL_ERROR_INTERRUPT_FAILURE;
-+ else
-+ return interruptSources;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_disableDspHybridSelect(tidsl_t * ptidsl,unsigned int disable)
-+{
-+ int rc;
-+ DEV_HOST_phyPerf_t phyPerf;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
-+ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(disable==1)
-+ {
-+ phyPerf.disableDspHybridSelect_f = TRUE;
-+ // hybrid_selected = 888;
-+ }
-+ else
-+ {
-+ phyPerf.disableDspHybridSelect_f = FALSE;
-+ // hybrid_selected = 888;
-+ }
-+ rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t));
-+ if(rc)
-+ return DSLHAL_ERROR_HYBRID_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_selectHybrid()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_selectHybrid(tidsl_t * ptidsl,unsigned int hybridNum)
-+{
-+ int rc;
-+ DEV_HOST_phyPerf_t phyPerf;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(hybridNum<1||hybridNum>4)
-+ {
-+ dprintf(3,"Invalid Value for Hybrid Number \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
-+ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ phyPerf.hostSelectHybridNum = hybridNum;
-+ rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t));
-+ if(rc)
-+ return DSLHAL_ERROR_HYBRID_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_reportHybridMetrics()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_reportHybridMetrics(tidsl_t * ptidsl,int *metric)
-+{
-+ int rc,i;
-+ DEV_HOST_phyPerf_t phyPerf;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(hybrid_selected>5)
-+ {
-+ dprintf(4,"Hybrid Metrics Not Yet Available \n");
-+ }
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return (0-DSLHAL_ERROR_INVALID_PARAM);
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return (0-DSLHAL_ERROR_BLOCK_READ);
-+ }
-+
-+ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
-+ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return (0-DSLHAL_ERROR_BLOCK_READ);
-+ }
-+ rc = sizeof(phyPerf.hybridCost);
-+ for(i=0;i<(rc/4);i++)
-+ {
-+ metric[i] = dslhal_support_byteSwap32(phyPerf.hybridCost[i]);
-+ }
-+ return hybrid_selected;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction selects inner/outer pair on RJ11.
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl , unsigned int pairSelect
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_api_sendQuiet\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_RJ11SELECT, (unsigned int)pairSelect, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_api_sendQuiet failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction resets the failed state log stored
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
-+{
-+
-+ int rc;
-+ dprintf(5, "dslhal_api_resetTrainFailureLog \n");
-+ for(rc=0;rc<ptidsl->AppData.trainFails;rc++)
-+ {
-+ ptidsl->AppData.trainFailStates[rc]=0;
-+ }
-+ ptidsl->AppData.trainFails = 0;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureLed()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureLed(tidsl_t * ptidsl,unsigned int idLed, unsigned int onOff)
-+{
-+ int rc;
-+ DEV_HOST_modemEnvPublic_t modemEnv;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(idLed>2 || onOff>2)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
-+ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(idLed==ID_DSL_LINK_LED)
-+ {
-+ modemEnv.overrideDslLinkLed_f = TRUE;
-+ if(onOff!=2)
-+ modemEnv.dslLinkLedState_f = onOff;
-+ }
-+ if(idLed==ID_DSL_ACT_LED)
-+ {
-+ modemEnv.overrideDslLinkLed_f = TRUE;
-+ if(onOff!=2)
-+ modemEnv.dslLinkLedState_f = onOff;
-+ }
-+ if(idLed==ID_RESTORE_DEFAULT_LED)
-+ {
-+ modemEnv.overrideDslLinkLed_f = FALSE;
-+ modemEnv.overrideDslActLed_f = FALSE;
-+ }
-+ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
-+ if(rc)
-+ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureExternBert()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureExternBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
-+{
-+ int rc;
-+ DEV_HOST_modemEnvPublic_t modemEnv;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(configParm>1 || parmVal>1)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
-+ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(configParm==0)
-+ {
-+ modemEnv.externalBert = parmVal;
-+ }
-+ if(configParm==1)
-+ {
-+ modemEnv.usBertPattern = parmVal;
-+ }
-+ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
-+ if(rc)
-+ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureAtmBert()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureAtmBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
-+{
-+ int rc;
-+ DEV_HOST_atmDsBert_t atmDsBert;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(configParm>1 || parmVal>1)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.atmDsBert_p = (DEV_HOST_atmDsBert_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmDsBert_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmDsBert_p,
-+ &atmDsBert, sizeof(DEV_HOST_atmDsBert_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(configParm==0)
-+ {
-+ atmDsBert.atmBertFlag = parmVal;
-+ rc=dslhal_support_blockWrite(&atmDsBert,dspOamSharedInterface.atmDsBert_p,sizeof(DEV_HOST_atmDsBert_t));
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ }
-+ if(configParm==1)
-+ {
-+ ptidsl->AppData.atmBertBitCountLow = atmDsBert.bitCountLow;
-+ ptidsl->AppData.atmBertBitCountHigh = atmDsBert.bitCountHigh;
-+ ptidsl->AppData.atmBertBitErrorCountLow = atmDsBert.bitErrorCountLow;
-+ ptidsl->AppData.atmBertBitErrorCountHigh = atmDsBert.bitErrorCountHigh;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureDgaspLpr()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Configures dying gasp LPR signal
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureDgaspLpr(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
-+{
-+ int rc;
-+ DEV_HOST_modemEnvPublic_t modemEnv;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ if(configParm>1 || parmVal>1)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ if(!ptidsl)
-+ {
-+ dprintf(3, "Error: PTIDSL pointer invalid\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
-+ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(configParm==0)
-+ {
-+ modemEnv.dGaspLprIndicator_f = parmVal;
-+ }
-+ if(configParm==1)
-+ {
-+ modemEnv.overrideDspLprGasp_f = parmVal;
-+ }
-+ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
-+ if(rc)
-+ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_genericDspRead()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads from a Generic Location in the DSP Host Interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_genericDspRead(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2,
-+ unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
-+{
-+ int rc=0;
-+ unsigned int hostIfLoc,structLoc,elementLoc;
-+ hostIfLoc = (unsigned int)ptidsl->pmainAddr;
-+ if(numBytes<=0 || !localBuffer || !ptidsl)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ rc += dslhal_support_blockRead((PVOID)(hostIfLoc+sizeof(int)*offset1), &structLoc,sizeof(int));
-+ structLoc = dslhal_support_byteSwap32(structLoc);
-+ rc += dslhal_support_blockRead((PVOID)(structLoc+sizeof(int)*offset2), &elementLoc,sizeof(int));
-+ elementLoc = dslhal_support_byteSwap32(elementLoc);
-+ dprintf(3,"Host IF Location: 0x%x Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
-+ rc += dslhal_support_blockRead((PVOID)(elementLoc+(offset3*4)), localBuffer,numBytes);
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_genericDspWrite()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Writes to a Generic Location in the DSP Host Interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_genericDspWrite(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2,
-+ unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
-+{
-+
-+ int rc=0;
-+ unsigned int hostIfLoc,structLoc,elementLoc;
-+ hostIfLoc = (unsigned int)ptidsl->pmainAddr;
-+ if(numBytes<=0 || !localBuffer || !ptidsl)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ rc += dslhal_support_blockRead((PVOID)(hostIfLoc+(offset1*4)), &structLoc,4);
-+ structLoc = dslhal_support_byteSwap32(structLoc);
-+ rc += dslhal_support_blockRead((PVOID)(structLoc+(offset2*4)), &elementLoc,4);
-+ elementLoc = dslhal_support_byteSwap32(elementLoc);
-+ dprintf(3,"Host IF Location: 0x%x Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
-+ rc += dslhal_support_blockWrite(localBuffer,(PVOID)(elementLoc+(offset3*4)),numBytes);
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_dspInterfaceRead()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads from a Generic Location in the DSP Host Interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_dspInterfaceRead(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets,
-+ unsigned int *offsets, unsigned char *localBuffer, unsigned int numBytes)
-+{
-+ int rc=0, off=0;
-+ unsigned int prevAddr,currAddr;
-+ prevAddr = baseAddr;
-+ if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ for(off=0;off<numOffsets-1;off++)
-+ {
-+ rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
-+ currAddr = dslhal_support_byteSwap32(currAddr);
-+ prevAddr = currAddr;
-+ dprintf(5,"Curr Addr = 0x%x Current Level: %d \n",currAddr,off);
-+ }
-+ currAddr = currAddr + offsets[numOffsets-1]*4;
-+ rc += dslhal_support_blockRead((PVOID)(currAddr),localBuffer,numBytes);
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Writes to a Generic Location in the DSP Host Interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_dspInterfaceWrite(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets,
-+ unsigned int *offsets,unsigned char *localBuffer, unsigned int numBytes)
-+{
-+
-+ int rc=0, off=0;
-+ unsigned int prevAddr,currAddr;
-+ prevAddr = baseAddr;
-+ if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
-+ {
-+ dprintf(3,"Invalid input parameter \n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+ for(off=0;off<numOffsets-1;off++)
-+ {
-+ rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
-+ currAddr = dslhal_support_byteSwap32(currAddr);
-+ prevAddr = currAddr;
-+ dprintf(5,"Curr Addr = 0x%x Current Level: %d \n",currAddr,off);
-+ }
-+ currAddr = currAddr + offsets[numOffsets-1]*4;
-+ rc += dslhal_support_blockWrite(localBuffer,(PVOID)(currAddr),numBytes);
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the passed mailbox command to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int cmd
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+/* Function is commented out for now since, its not tested */
-+ /*unsigned int dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
-+{
-+ int rc;
-+
-+ dprintf(5, "dslhal_api_sendMailboxCommand\n");
-+ rc = dslhal_support_writeHostMailbox(ptidsl, cmd, 0, 0, 0);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_api_sendMailboxCommand failed\n");
-+ return DSLHAL_ERROR_CTRL_API_FAILURE;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+} */
-+
-+
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.h linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h
---- linux.old/drivers/atm/sangam_atm/dsl_hal_api.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h 2005-07-10 08:02:01.438112272 +0200
-@@ -0,0 +1,1721 @@
-+#ifndef __DSL_HAL_API_H__
-+#define __DSL_HAL_API_H__ 1
-+/*******************************************************************************
-+* FILE PURPOSE: DSL HAL to Application Interface for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_application_interface.h
-+*
-+* DESCRIPTION:
-+* DSL-Application Interface Structures
-+*
-+*
-+* By: Ramakrishnan Parasuraman
-+*
-+* (C) Copyright 2003, Texas Instruments, Inc.
-+* History
-+* Data Version By Notes
-+* 06Feb03 0.00 RamP Initial Version Written
-+* 07Apr03 0.01 RamP Commented out typedefs
-+* 09Apr03 0.02 RamP Added deviceContext and extended
-+* dspVer to include bugfixes
-+* 14Apr03 0.03 RamP Added stateTransition to structure
-+* 16Apr03 0.04 RamP Removed typedefs; changed dspVer
-+* 22Apr03 0.05 RamP Moved acknowledgeInterrupt from
-+* (alpha) support module into this
-+* 24Apr03 0.06 RamP Moved the RSTATE enum from register
-+*
-+* 28Apr03 0.07 RamP Added additional parameter to the
-+* (alpha +) handleInterrupt function for intrSrc
-+* 14May03 0.08 RamP Added hybrid switching APIs
-+* (alpha ++) Added statistics fields in AppData
-+* Added netService identifier
-+* 20May03 0.09 RamP Added Inner/Outer pair API support.
-+* Added dying gasp message.
-+* 29May03 0.10 RamP Added coProfile structure
-+* 04Jun03 0.11 RamP Added margin per tone statistics,
-+* Added timing counters, added train
-+* failure functions,added config flags
-+* 06Jun03 0.12 RamP Added LED, STM Bert, dGasp LPR
-+* config API functions
-+* 09Jun03 0.13 RamP Added ATM Bert function, CO stats
-+* Moved stateTransition to ITIDSLHW
-+* (Beta) Moved configFlag to ITIDSLHW,
-+* Cleaned up fifoInfo structure
-+* Added US/DS R/S FEC parameters
-+* 21Aug03 0.14 RamP Added g.hs message buffer, us/ds
-+* bits n gains table, negoMsgs struct
-+* (act) bitswap stucts/indices, trainstate,
-+* Added functions for advanced config
-+* Added gross gain and line length
-+* 29Sep03 0.15 RamP Added tokens for advanced config
-+* module api functions
-+* 12Oct03 0.16 RamP Added adsl2Msgs structure with worst
-+* case size for variable length msgs
-+* Added API function prototypes
-+* 21Oct03 0.17 RamP Added typedef for current modem
-+* user settings
-+* 28Oct03 0.18 RamP Added function to config blackout
-+* bitmap in the RMSGPCB message
-+* 20Nov03 0.19 RamP Added functions for generic and
-+* host interface read - write
-+* 24Nov03 0.20 RamP Added enum for detailed state track
-+* Added element for state bit fields
-+* Addded rState for encoded main state
-+* Added blackout valid flag
-+* 26Dec03 0.21 RamP Added defines for oamFeature masks
-+* 30Dec03 0.22 RamP Increased sizes for cMsgPcb,RMsgPcb
-+* to incorporate DELT mode messages
-+* 30Dec03 0.23 RamP Added generic mailbox command fxn
-+*******************************************************************************/
-+
-+#ifdef INTERNAL_BUILD
-+#include <dsl_hal_api_pvt.h>
-+#endif
-+
-+#define NUM_PAGES 4
-+#define OAMFEATURE_AUTORETRAIN_MASK 0x00000001
-+#define OAMFEATURE_TC_SYNC_DETECT_MASK 0x00000002
-+#define OAMFEATURE_EOCAOC_INTERRUPT_MASK 0x00000004
-+#define OAMFEATURE_CONS_DISP_DISABLE_MASK 0x00000008
-+#define OAMFEATURE_GHSMSG_INTERRUPT_MASK 0x00000010
-+
-+typedef struct tagTIOIDINFO
-+{
-+ unsigned int bState; /* addr->bDSPATURState */
-+ unsigned int USConRate; /* US Conection Rates */
-+ unsigned int DSConRate; /* DS Connection Rates */
-+ unsigned int USPayload; /* ennic_tx_pullup*/
-+ unsigned int DSPayload; /* ennic_indicate_receive_packet*/
-+ unsigned int FrmMode; /* addr->atur_msg.framing_mode*/
-+ unsigned int MaxFrmMode;
-+ unsigned int TrainedPath; /* Status of the Modem in which trained (Fast or Interleaved Path) */
-+ unsigned int TrainedMode; /* Status of the mode in which the modem is trained (G.dmt, T1.413, etc) */
-+
-+ /* Superframe Count */
-+ unsigned int usSuperFrmCnt; /* Num of US Superframes */
-+ unsigned int dsSuperFrmCnt; /* Num of DS Superframes */
-+
-+ /* LOS & SEF Stats */
-+ unsigned int LOS_errors; /* Num of ADSL frames where loss-of-sync */
-+ unsigned int SEF_errors; /* Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames */
-+ unsigned int coLosErrors; /* CO LOS Defects */
-+ unsigned int coRdiErrors; /* CO RDI defects */
-+ /* CRC Stats */
-+ unsigned int usICRC_errors; /* Num of Upstream CRC errored ADSL frames on Interleaved Path */
-+ unsigned int usFCRC_errors; /* Num of Upstream CRC errored ADSL frames on Fast Path */
-+ unsigned int dsICRC_errors; /* Num of Downstream CRC errored ADSL frames on Interleaved Path */
-+ unsigned int dsFCRC_errors; /* Num of Downstream CRC errored ADSL frames on Fast Path */
-+
-+ /* FEC Stats */
-+ unsigned int usIFEC_errors; /* Num of Upstream FEC errored (corrected) ADSL frames on Interleaved Path */
-+ unsigned int usFFEC_errors; /* Num of Upstream FEC errored (corrected) ADSL frames on Fast Path */
-+ unsigned int dsIFEC_errors; /* Num of Downstream FEC errored (corrected) ADSL frames on Interleaved Path */
-+ unsigned int dsFFEC_errors; /* Num of Downstream FEC errored (corrected) ADSL frames on Fast Path */
-+
-+ /* NCD Stats */
-+ unsigned int usINCD_error; /* UpStream No Cell Delineation on Interleaved Path */
-+ unsigned int usFNCD_error; /* UpStream No Cell Delineation on Fast Path */
-+ unsigned int dsINCD_error; /* Downstream No Cell Delineation on Interleaved Path */
-+ unsigned int dsFNCD_error; /* Downstream No Cell Delineation on Fast Path */
-+
-+ /* LCD Stats */
-+ unsigned int usILCD_errors; /* UpStream Loss of Cell Delineation (within the same connection) on Interleaved Path */
-+ unsigned int usFLCD_errors; /* UpStream Loss of Cell Delineation (within the same connection) on Fast Path */
-+ unsigned int dsILCD_errors; /* Downstream Loss of Cell Delineation (within the same connection) on Interleaved Path */
-+ unsigned int dsFLCD_errors; /* Downstream Loss of Cell Delineation (within the same connection) on Fast Path */
-+
-+ /* HEC Stats */
-+ unsigned int usIHEC_errors; /* Num of Upstream HEC errored ADSL frames on Interleaved Path */
-+ unsigned int usFHEC_errors; /* Num of Upstream HEC errored ADSL frames on Fast Path */
-+ unsigned int dsIHEC_errors; /* Num of Downstream HEC errored ADSL frames on Interleaved Path */
-+ unsigned int dsFHEC_errors; /* Num of Downstream HEC errored ADSL frames on Fast Path */
-+
-+ /* Upstream ATM Stats */
-+ unsigned int usAtm_count[2]; /* Upstream Good Cell Count */
-+ unsigned int usIdle_count[2]; /* Upstream Idle Cell Count */
-+ unsigned int usPdu_count[2]; /* UpStream PDU Count */
-+
-+ /* Downstream ATM Stats */
-+ unsigned int dsGood_count[2]; /* Downstream Good Cell Count */
-+ unsigned int dsIdle_count[2]; /* Downstream Idle Cell Count */
-+ unsigned int dsBadHec_count[2]; /* Downstream Bad Hec Cell Count */
-+ unsigned int dsOVFDrop_count[2]; /* Downstream Overflow Dropped Cell Count */
-+ unsigned int dsPdu_count[2]; /* Downstream PDU Count */
-+ /* (only looks for end of pdu on good atm cells received, */
-+ /* not on Bad_Hec or Overflow cell) */
-+
-+ unsigned int dsLineAttn; /* DS Line Attenuation */
-+ unsigned int dsMargin; /* Measured DS MArgin */
-+
-+ unsigned int usLineAttn;
-+ unsigned int usMargin;
-+
-+ unsigned char bCMsgs1[6];
-+ unsigned char bRMsgs1[6];
-+ unsigned char bCRates2;
-+ unsigned char bRRates2;
-+ unsigned char bRRates1[4][11];
-+ unsigned char bCMsgs2[4];
-+ unsigned char bCRates1[4][30];
-+ unsigned char bRMsgs2[4];
-+
-+ unsigned int USPeakCellRate;
-+
-+ unsigned int dsl_status;
-+ unsigned int dsl_modulation;
-+ unsigned char dsl_ghsRxBuf[10][64];
-+ unsigned char dsl_GHS_msg_type[2];
-+
-+ int TxVCs[12];
-+ int RxVCs[12];
-+
-+ unsigned int vci_vpi_val;
-+
-+ unsigned char BitAllocTblDstrm[256];
-+ unsigned char BitAllocTblUstrm[32];
-+ signed char marginTblDstrm[256];
-+ unsigned char rBng[512];
-+ unsigned char cBng[126];
-+ int usTxPower;
-+ int dsTxPower;
-+ short rxSnrPerBin0[256];
-+ short rxSnrPerBin1[256];
-+ short rxSnrPerBin2[256];
-+
-+ unsigned int StdMode;
-+ unsigned int atucVendorId;
-+ unsigned char currentHybridNum;
-+ unsigned char atucRevisionNum;
-+ unsigned int trainFails;
-+ unsigned int trainFailStates[30];
-+ unsigned int idleTick;
-+ unsigned int initTick;
-+ unsigned int showtimeTick;
-+ unsigned char dsFastParityBytesPerSymbol;
-+ unsigned char dsIntlvParityBytesPerSymbol;
-+ unsigned char dsSymbolsPerCodeWord;
-+ unsigned int dsInterleaverDepth;
-+ unsigned char usFastParityBytesPerSymbol;
-+ unsigned char usIntlvParityBytesPerSymbol;
-+ unsigned char usSymbolsPerCodeWord;
-+ unsigned int usInterleaverDepth;
-+ unsigned int atmBertBitCountLow;
-+ unsigned int atmBertBitCountHigh;
-+ unsigned int atmBertBitErrorCountLow;
-+ unsigned int atmBertBitErrorCountHigh;
-+ unsigned int lineLength;
-+ unsigned int grossGain;
-+ int rxNoisePower0[256];
-+ int rxNoisePower1[256];
-+}TIOIDINFO,*PTIOIDINFO;
-+
-+typedef struct{
-+ unsigned char bCMsgs1[6];
-+ unsigned char bCRates2;
-+ unsigned char bRRates2;
-+ unsigned char bRRates1[4][11];
-+ unsigned char bCMsgs2[4];
-+ unsigned char bCRates1[4][30];
-+ unsigned char bCRatesRA[4][30];
-+ unsigned char bRMsgs2[4];
-+ unsigned char bRRatesRA[4];
-+ unsigned char bRMsgsRA[12];
-+ unsigned char bCMsgsRA[6];
-+}negoMsgs;
-+
-+typedef struct{
-+ unsigned char cMsgFmt[2];
-+ unsigned char rMsgFmt[2];
-+ unsigned char cMsgPcb[12];
-+ unsigned char rMsgPcb[70];
-+ unsigned char dummy1[2];
-+ unsigned char cMsg1[40];
-+ unsigned char rMsg1[4];
-+ unsigned char cMsg2[8];
-+ unsigned char rMsg2[64];
-+ unsigned char cParams[264];
-+ unsigned char rParams[2088];
-+ unsigned short cMsgPcbLen;
-+ unsigned short rMsgPcbLen;
-+ unsigned short cMsg1Len;
-+ unsigned short rMsg1Len;
-+ unsigned short cMsg2Len;
-+ unsigned short rMsg2Len;
-+ unsigned short cParamsLen;
-+ unsigned short rParamsLen;
-+}adsl2Msgs;
-+
-+typedef struct{
-+ unsigned char rMsg1Ld[16];
-+ unsigned char rMsg2Ld[260];
-+ unsigned char rMsg3Ld[260];
-+ unsigned char rMsg4Ld[260];
-+ unsigned char rMsg5Ld[260];
-+ unsigned char rMsg6Ld[260];
-+ unsigned char rMsg7Ld[260];
-+ unsigned char rMsg8Ld[260];
-+ unsigned char rMsg9Ld[260];
-+ unsigned char cMsg1Ld[16];
-+ unsigned char cMsg2Ld[260];
-+ unsigned char cMsg3Ld[132];
-+ unsigned char cMsg4Ld[68];
-+ unsigned char cMsg5Ld[68];
-+ unsigned short rMsg1LdLen;
-+ unsigned short rMsgxLdLen;
-+ unsigned short cMsg1LdLen;
-+ unsigned short cMsg2LdLen;
-+ unsigned short cMsg3LdLen;
-+ unsigned short cMsg4LdLen;
-+ unsigned short cMsg5LdLen;
-+ unsigned short dummy8;
-+}adsl2DeltMsgs;
-+
-+typedef struct{
-+ unsigned char trellisFlag;
-+ unsigned char rateAdaptFlag;
-+ unsigned char marginMonitorTraining;
-+ unsigned char marginMonitorShowtime;
-+ signed char marginThreshold;
-+ unsigned char disableLosFlag;
-+ unsigned char aturConfig[30];
-+ unsigned char eocVendorId[8];
-+ unsigned char eocSerialNumber[32];
-+ unsigned char eocRevisionNumber[4];
-+}currentPhySettings;
-+
-+
-+typedef struct
-+{
-+ unsigned int PmemStartWtAddr; /* source address in host memory */
-+ unsigned int OverlayXferCount; /* number of 32bit words to be transfered */
-+ unsigned int BinAddr; /* destination address in dsp's pmem */
-+ unsigned int overlayHostAddr;
-+ unsigned int olayPageCrc32;
-+ unsigned int SecOffset;
-+} OlayDP_Def;
-+
-+typedef struct
-+{
-+ unsigned int timeStamp; /* TimeStp revision */
-+ unsigned char major; /* Major revision */
-+ unsigned char minor; /* Minor revision */
-+ unsigned char bugFix; /* BugFix revision */
-+ unsigned char buildNum; /* BuildNum revision */
-+ unsigned char reserved; /* for future use */
-+}dspVer;
-+
-+typedef struct{
-+ unsigned char major;
-+ unsigned char minor;
-+ unsigned char bugfix;
-+ unsigned char buildNum;
-+ unsigned int timeStamp;
-+}dslVer;
-+
-+typedef struct{
-+ unsigned char bitSwapCommand[6];
-+ unsigned char bitSwapBinNum[6];
-+ unsigned char bitSwapSFrmCnt;
-+}dslBitSwapDef;
-+
-+typedef struct{
-+ unsigned int aturState;
-+ unsigned int subStateIndex;
-+ unsigned int timeStamp;
-+}trainStateInfo;
-+
-+typedef struct{
-+ unsigned char ctrlBits;
-+ unsigned char infoBits;
-+}eocMessageDef;
-+
-+enum
-+{
-+ RSTATE_TEST,
-+ RSTATE_IDLE,
-+ RSTATE_INIT,
-+ RSTATE_HS,
-+ RSTATE_RTDL,
-+ RSTATE_SHOWTIME,
-+};
-+
-+typedef enum
-+{
-+ ATU_RZERO1 = 100,
-+ ATU_RTEST = 101,
-+ ATU_RIDLE = 102,
-+ ATU_RINIT = 103,
-+ ATU_RRESET = 104,
-+ GDMT_NSFLR = 105,
-+ GDMT_TONE = 106,
-+ GDMT_SILENT = 107,
-+ GDMT_NEGO = 108,
-+ GDMT_FAIL = 109,
-+ GDMT_ACKX = 110,
-+ GDMT_QUIET2 = 111,
-+ ATU_RZERO2 = 200,
-+ T1413_NSFLR = 201,
-+ T1413_ACTREQ = 202,
-+ T1413_ACTMON = 203,
-+ T1413_FAIL = 204,
-+ T1413_ACKX = 205,
-+ T1413_QUIET2 = 206,
-+ ATU_RQUIET2 = 207,
-+ ATU_RREVERB1 = 208,
-+ ATU_RQUIET3 = 209,
-+ ATU_RECT = 210,
-+ ATU_RREVERB2 = 211,
-+ ATU_RSEGUE1 = 212,
-+ ATU_RREVERB3 = 213,
-+ ATU_RSEGUE2 = 214,
-+ ATU_RRATES1 = 215,
-+ ATU_RMSGS1 = 216,
-+ ATU_RMEDLEY = 217,
-+ ATU_RREVERB4 = 218,
-+ ATU_RSEGUE3 = 219,
-+ ATU_RMSGSRA = 220,
-+ ATU_RRATESRA = 221,
-+ ATU_RREVERBRA = 222,
-+ ATU_RSEGUERA = 223,
-+ ATU_RMSGS2 = 224,
-+ ATU_RRATES2 = 225,
-+ ATU_RREVERB5 = 226,
-+ ATU_RSEGUE4 = 227,
-+ ATU_RBNG = 228,
-+ ATU_RREVERB6 = 229,
-+ ATU_RSHOWTIME = 230,
-+ ATU_RZERO3 = 300,
-+ ADSL2_QUIET1 = 301,
-+ ADSL2_COMB1 = 302,
-+ ADSL2_QUIET2 = 303,
-+ ADSL2_COMB2 = 304,
-+ ADSL2_ICOMB1 = 305,
-+ ADSL2_LINEPROBE = 306,
-+ ADSL2_QUIET3 = 307,
-+ ADSL2_COMB3 = 308,
-+ ADSL2_ICOMB2 = 309,
-+ ADSL2_RMSGFMT = 310,
-+ ADSL2_RMSGPCB = 311,
-+ ADSL2_REVERB1 = 312,
-+ ADSL2_QUIET4 = 313,
-+ ADSL2_REVERB2 = 314,
-+ ADSL2_QUIET5 = 315,
-+ ADSL2_REVERB3 = 316,
-+ ADSL2_ECT = 317,
-+ ADSL2_REVERB4 = 318,
-+ ADSL2_SEGUE1 = 319,
-+ ADSL2_REVERB5 = 320,
-+ ADSL2_SEGUE2 = 321,
-+ ADSL2_RMSG1 = 322,
-+ ADSL2_MEDLEY = 323,
-+ ADSL2_EXCHANGE = 324,
-+ ADSL2_RMSG2 = 325,
-+ ADSL2_REVERB6 = 326,
-+ ADSL2_SEGUE3 = 327,
-+ ADSL2_RPARAMS = 328,
-+ ADSL2_REVERB7 = 329,
-+ ADSL2_SEGUE4 = 330,
-+ ATU_RZERO4 = 400,
-+ DELT_SEGUE1 = 401,
-+ DELT_REVERB5 = 402,
-+ DELT_SEGUE2 = 403,
-+ DELT_EXCHANGE = 404,
-+ DELT_SEGUELD = 405,
-+ DELT_RMSGLD = 406,
-+ DELT_QUIET1LD = 407,
-+ DELT_QUIET2LD = 408,
-+ DELT_RACK1 = 409,
-+ DELT_RNACK1 = 410,
-+ DELT_QUIETLAST = 411
-+} modemStates_t;
-+
-+enum
-+{
-+ DSLTRAIN_NO_MODE,
-+ DSLTRAIN_MULTI_MODE,
-+ DSLTRAIN_T1413_MODE,
-+ DSLTRAIN_GDMT_MODE,
-+ DSLTRAIN_GLITE_MODE
-+};
-+
-+enum
-+{
-+ ID_RESTORE_DEFAULT_LED,
-+ ID_DSL_LINK_LED,
-+ ID_DSL_ACT_LED
-+};
-+
-+typedef struct _ITIDSLHW
-+{
-+ /* struct _TIDSL_IHwVtbl * pVtbl; */
-+ unsigned char* fwimage;
-+ void* pmainAddr;
-+ void* pOsContext;
-+ unsigned int ReferenceCount;
-+ unsigned int netService;
-+
-+ int InitFlag;
-+
-+ int imagesize;
-+
-+ unsigned int lConnected;
-+ unsigned int bStatisticsInitialized;
-+ unsigned int rState;
-+ unsigned int bShutdown;
-+ unsigned int blackOutValid_f;
-+ unsigned char blackOutBits[64];
-+ unsigned int bAutoRetrain;
-+ volatile unsigned int bOverlayPageLoaded;
-+ unsigned int stateTransition;
-+ unsigned int configFlag;
-+ unsigned int dsBitSwapInx;
-+ unsigned int usBitSwapInx;
-+ unsigned int trainStateInx;
-+ unsigned int usEocMsgInx;
-+ unsigned int dsEocMsgInx;
-+ unsigned int reasonForDrop;
-+ TIOIDINFO AppData;
-+ dspVer dspVer;
-+
-+ OlayDP_Def olayDpPage[NUM_PAGES];
-+ OlayDP_Def coProfiles;
-+ OlayDP_Def constDisplay;
-+ dslBitSwapDef dsBitSwap[30];
-+ dslBitSwapDef usBitSwap[30];
-+ trainStateInfo trainHistory[120];
-+ eocMessageDef usEocMsgBuf[30];
-+ eocMessageDef dsEocMsgBuf[30];
-+ adsl2Msgs adsl2TrainingMessages;
-+ adsl2DeltMsgs adsl2DiagnosticMessages;
-+ unsigned int modemStateBitField[4];
-+#ifdef INTERNAL_BUILD
-+ internalParameters internalVars;
-+#endif
-+} ITIDSLHW_T, *PITIDSLHW_T, tidsl_t;
-+
-+
-+/**********************************************************************************
-+* API proto type defines
-+**********************************************************************************/
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_dslStartup
-+*
-+*******************************************************************************************
-+* DESCRIPTION: Entry point to initialize and load ax5 daughter board
-+*
-+* INPUT: PITIDSLHW_T *ppIHw
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+* Notes: external function osAllocateMemory(), osZeroMemory(), osLoadFWImage() are required
-+*****************************************************************************************/
-+int dslhal_api_dslStartup
-+(
-+ PITIDSLHW_T *ppIHw
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_gatherStatistics
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Read statistical infromation from ax5 modem daugter card.
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+
-+void dslhal_api_gatherStatistics
-+(
-+ tidsl_t * ptidsl
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_initStatistics
-+*
-+*********************************************************************************************
-+* DESCRIPTION: init statistical infromation of ax5 modem daugter card.
-+*
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+void dslhal_api_initStatistics
-+(
-+ tidsl_t * ptidsl
-+);
-+
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_getDslDriverVersion
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This routine supply DSL Driver version.
-+*
-+* INPUT: tidsl_t * ptidsl
-+* void *pVer, DSP Driver Version Pointer
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+* Note: See verdef_u.h for version structure definition.
-+*****************************************************************************************/
-+
-+void dslhal_api_getDslHalVersion
-+(
-+ void *pVer
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_dslShutdown
-+*
-+*******************************************************************************************
-+* DESCRIPTION: routine to shutdown ax5 modem and free the resource
-+*
-+* INPUT: tidsl_t *ptidsl
-+*
-+* RETURN: NULL
-+*
-+* Notes: external function osFreeMemory() is required.
-+*****************************************************************************************/
-+
-+int dslhal_api_dslShutdown
-+(
-+ tidsl_t *ptidsl
-+);
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_getDspVersion
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This routine supply AX5 daugther card DSP version.
-+*
-+* INPUT: tidsl_t * ptidsl
-+* void *pVer, DSP version struct is returned starting at this pointer
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_api_getDspVersion
-+(
-+ tidsl_t *ptidsl,
-+ void *pVer
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_digi_memTestA()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
-+* memory tests on the external and internal memories of DSP, Codec Interconnect
-+* test and Interrupt Test.
-+*
-+* Input: Test selects the test to be performed based on the elements set of 9 element
-+* array passed the the parameter.
-+*
-+* Return: Status of the Tests Failed
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_digi_memTestA
-+(
-+unsigned int* Test
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_digi_memTestB()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
-+* memory tests on the external and internal memories of DSP, Codec Interconnect
-+* test and Interrupt Test.
-+*
-+* Input: Test selects the digital test to be performed.
-+*
-+* Return: Status of the Tests Failed
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_digi_memTestB
-+(
-+unsigned int Test,
-+unsigned int *Status
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_tonesTestA()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Array is a 64 element unsigned integer type array. The element of this array
-+* describe which tones are to be generated by selecting the element of
-+* the array to be non zero.
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+void dslhal_diags_anlg_tonesTestA
-+(
-+unsigned int Test,
-+unsigned int* Array
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_tonesTestB()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Array is a 64 element unsigned integer type array. The element of this array
-+* describe which tones are to be generated by selecting the element of
-+* the array to be non zero.
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+void dslhal_diags_anlg_tonesTestB
-+(
-+unsigned int Test,
-+unsigned int Tones
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_rxNoiseTest()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Tones selects the .
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+void dslhal_diags_anlg_rxNoiseTest
-+(int agcFlag,
-+short pga1,
-+short pga2,
-+short pga3,
-+short aeq
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_ecNoiseTest()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Tones selects the .
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+void dslhal_diags_anlg_ecNoiseTest
-+(int agcFlag,
-+short pga1,
-+short pga2,
-+short pga3,
-+short aeq
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_pollTrainingStatus()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: code to decode modem status and to start modem training
-+*
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0-? status mode training
-+* -1 failed
-+*
-+********************************************************************************************/
-+int dslhal_api_pollTrainingStatus
-+(
-+ tidsl_t *ptidsl
-+);
-+
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Code to handle ax5 hardware interrupts
-+*
-+* Input: tidsl_t *ptidsl
-+* int *pMsg, pointer to returned hardware messages. Each byte represent a messge
-+* int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+int dslhal_api_handleTrainingInterrupt
-+(
-+ tidsl_t *ptidsl,
-+ int intrSource
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the EOC Serial Number
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *SerialNumber : Input EOC Serial Number
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocSerialNumber
-+(
-+tidsl_t *ptidsl,
-+char *SerialNumber
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the EOC Serial Number
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *VendorID : EOC Vendor ID
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocVendorId
-+(
-+tidsl_t *ptidsl,
-+char *VendorID
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the EOC Revision Number
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *RevNum : Input EOC Revision Number
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setEocRevisionNumber
-+(
-+tidsl_t *ptidsl,
-+char *RevNumber
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction Sets the EOC ATUR Config Register
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * char *RevNum : Input EOC ATUR Config Register
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setAturConfig
-+(
-+tidsl_t *ptidsl,
-+char *ATURConfig
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_disableLosAlarm(tidsl_t *ptidsl, unsigned int set)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction disables all the LOS alarms
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int set // if set == TRUE : Disable LOS alarms, else enable
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ * NOTES: Currently not supported in any version other than MR4 Patch release..
-+ *****************************************************************************************/
-+unsigned int dslhal_api_disableLosAlarm
-+(
-+tidsl_t *ptidsl,
-+unsigned int
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendIdle(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendIdle
-+(
-+tidsl_t *ptidsl
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendQuiet(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendQuiet
-+(
-+tidsl_t *ptidsl
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendDgasp(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendDgasp
-+(
-+tidsl_t *ptidsl
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction does sets the Margin threshold
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * int threshold
-+ *
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setMarginThreshold
-+(
-+tidsl_t *ptidsl,
-+int threshold
-+);
-+
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction does sets the Margin monitoring flag
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int trainflag
-+ * unsigned int shwtflag
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_setMarginMonitorFlags
-+(
-+tidsl_t *ptidsl,
-+unsigned int trainflag,
-+unsigned int shwtflag
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int flag //if flag = TRUE set flag else reset
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setRateAdaptFlag
-+(
-+tidsl_t *ptidsl,
-+unsigned int flag
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setTrellisFlag(tidsl_t *ptidsl, unsigned int flag)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int flag //if flag = TRUE set flag else reset
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setTrellisFlag
-+(
-+tidsl_t *ptidsl,
-+unsigned int flag
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int maxbits : should be a value between 0-15
-+*
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setMaxBitsPerCarrier
-+(
-+tidsl_t *ptidsl,
-+unsigned int maxbits
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
-+* size 64-512
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+unsigned int dslhal_api_setMaxInterleaverDepth
-+(
-+tidsl_t *ptidsl,
-+unsigned int maxdepth
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction Sets the desired training mode(none/T1.413/G.dmt/G.lite)
-+*
-+* INPUT: PITIDSLHW_T *ptidsl
-+* unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
-+* 2: T1.413, 3:G.dmt, 4: G.lite
-+* RETURN: 0 SUCCESS
-+* 1 FAILED
-+*
-+*****************************************************************************************/
-+
-+unsigned int dslhal_api_setTrainingMode
-+(
-+tidsl_t *ptidsl,
-+unsigned int trainmode
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_dslRetrain(tidsl_t *ptidsl)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_dslRetrain
-+(
-+tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_acknowledgeInterrupt
-+(tidsl_t * ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_disableDspHybridSelect
-+(tidsl_t * ptidsl,
-+ unsigned int disable
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_selectHybrid
-+(tidsl_t * ptidsl,
-+ unsigned int hybridNum
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_reportHybridMetrics()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_reportHybridMetrics
-+(tidsl_t * ptidsl,
-+ int *metric
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl, unsigned int pairSelect)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+
-+unsigned int dslhal_api_selectInnerOuterPair
-+(tidsl_t *ptidsl,
-+unsigned int pairSelect
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl, unsigned int pairSelect)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+
-+unsigned int dslhal_api_resetTrainFailureLog
-+(tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_controlLed()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureLed
-+(tidsl_t * ptidsl,
-+unsigned int idLed,
-+unsigned int onOff
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureExternBert()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureExternBert
-+(tidsl_t * ptidsl,
-+unsigned int configParm,
-+unsigned int parmVal
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureAtmBert()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureAtmBert
-+(tidsl_t * ptidsl,
-+unsigned int configParm,
-+unsigned int parmVal
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_configureDgaspLpr()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_configureDgaspLpr
-+(tidsl_t * ptidsl,
-+unsigned int configParm,
-+unsigned int parmVal
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_onOffPcb()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_onOffPcb
-+(tidsl_t * ptidsl,
-+unsigned int onOff
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_onOffBitSwap()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Turns on / off the power cutback feature;
-+* Input
-+* usDs; 0 = us and 1 = ds;
-+* onOff; 0 = OFF and 1 = ON
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_onOffBitSwap
-+(tidsl_t * ptidsl,
-+ unsigned int usDs,
-+ unsigned int onOff
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_configDsTones()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Turns on / off specific tones in the downstream direction;
-+* Input
-+* pointer to the array specifying the tones to be turned on/off
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_configDsTones
-+(tidsl_t * ptidsl,
-+ unsigned int *dsTones
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_getAocBitSwapBuffer()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Fetches the Tx/Rx AOC bitswap Buffer;
-+* Input
-+* Transmit / Receive buffer to be fetched
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_getAocBitswapBuffer
-+(tidsl_t * ptidsl,
-+unsigned int usDs
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_readTrainingMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads all the training messages on demand;
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* void *msgStruct : Pointer to Message Structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_readTrainingMessages
-+(tidsl_t * ptidsl,
-+void *msgPtr
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_getTrainingState()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads all the training messages on demand;
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* void *msgStruct : Pointer to training state structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_getTrainingState
-+(tidsl_t * ptidsl,
-+void *statePtr
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_resetBitSwapMessageLog()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Clears the Aoc Bitswap Message Log
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* unsigned int usDs ; Upstream=0, Downstream=1
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_resetBitSwapMessageLog
-+(tidsl_t * ptidsl,
-+ unsigned int usDs
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_setConstellationBinNumber()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Specifies the bin number for which constellation data should be fetched
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* unsigned int binNum : constellation bin number whose data is required
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_setConstellationBinNumber
-+(tidsl_t * ptidsl,
-+ unsigned int binNum
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_resetTrainStateHistory()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Clears the Training State History Log
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_resetTrainStateHistory
-+(tidsl_t * ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_getSnrPerBin()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Get SNR data per bin
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_getSnrPerBin
-+(tidsl_t * ptidsl,
-+ unsigned int snrBufferOpt
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_logEocMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Logs EOC messages sent by the Modem to the CO
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* unsigned int eocLowerBytes : Lower [1-5] bits of EOC Message
-+* unsigned int eocUpperBytes : Upper [6-13] bits of EOC Message
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_logEocMessages
-+(tidsl_t * ptidsl,
-+ unsigned int usDs,
-+ unsigned int eocLowerBytes,
-+ unsigned int eocUpperBytes
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_getReasonForDrop()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads the reason for dropping DSL connection;
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_getReasonForDrop
-+(tidsl_t * ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_ctrlMaxAvgFineGains()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Turns on / off the host control for Max Avg Fine Gains; 0 = OFF and 1 = ON
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_ctrlMaxAvgFineGains
-+(tidsl_t * ptidsl,
-+unsigned int onOff
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_setMaxAvgFineGain()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Set the Maximum Average Fine Gain Value
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_setMaxAvgFineGain
-+(tidsl_t * ptidsl,
-+ short fineGain
-+);
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_readPhySettings()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads the advanced Phy layer settings on demand;
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+* void *cfgStruct : Pointer to Phy Config Structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_readPhySettings
-+(tidsl_t * ptidsl,
-+void *cfgPtr
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_advcfg_setBlackOutBits()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the Blackout Bits in the RMSGPCB message
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_advcfg_setBlackOutBits
-+(tidsl_t * ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_genericDspRead()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads from a generic location in the host interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_genericDspRead
-+(tidsl_t * ptidsl,
-+ unsigned int offset1,
-+ unsigned int offset2,
-+ unsigned int offset3,
-+ unsigned char* localBuffer,
-+ unsigned int numBytes
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_genericDspWrite()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Writes to a generic location in the host interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_genericDspWrite
-+(tidsl_t * ptidsl,
-+ unsigned int offset1,
-+ unsigned int offset2,
-+ unsigned int offset3,
-+ unsigned char* localBuffer,
-+ unsigned int numBytes
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_dspInterfaceRead()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reads from a generic location in the host interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_dspInterfaceRead
-+(tidsl_t * ptidsl,
-+ unsigned int baseAddr,
-+ unsigned int numOffsets,
-+ unsigned int *offsets,
-+ unsigned char* localBuffer,
-+ unsigned int numBytes
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Writes to a generic location in the host interface
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_api_dspInterfaceWrite
-+(tidsl_t * ptidsl,
-+ unsigned int baseAddr,
-+ unsigned int numOffsets,
-+ unsigned int *offsets,
-+ unsigned char* localBuffer,
-+ unsigned int numBytes
-+);
-+
-+/******************************************************************************************
-+ * FUNCTION NAME: dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
-+ *
-+ *******************************************************************************************
-+ * DESCRIPTION: This fuction sends the passed mailbox command to the DSP
-+ *
-+ * INPUT: PITIDSLHW_T *ptidsl
-+ * unsigned int cmd
-+ *
-+ * RETURN: 0 SUCCESS
-+ * 1 FAILED
-+ *
-+ *****************************************************************************************/
-+unsigned int dslhal_api_sendMailboxCommand
-+(tidsl_t *ptidsl,
-+unsigned int cmd
-+);
-+
-+#ifdef INTERNAL_BUILD
-+#include <dsl_hal_internal_api.h>
-+#endif
-+
-+
-+#endif /* pairs #ifndef __DSL_APPLICATION_INTERFACE_H__ */
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h
---- linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h 2005-07-10 08:02:01.439112120 +0200
-@@ -0,0 +1,259 @@
-+unsigned int log10[]=
-+{
-+ 0,
-+ 771,
-+ 1221,
-+ 1541,
-+ 1789,
-+ 1992,
-+ 2163,
-+ 2312,
-+ 2443,
-+ 2560,
-+ 2666,
-+ 2763,
-+ 2852,
-+ 2934,
-+ 3011,
-+ 3083,
-+ 3150,
-+ 3213,
-+ 3274,
-+ 3331,
-+ 3385,
-+ 3437,
-+ 3486,
-+ 3533,
-+ 3579,
-+ 3622,
-+ 3664,
-+ 3705,
-+ 3744,
-+ 3781,
-+ 3818,
-+ 3853,
-+ 3887,
-+ 3921,
-+ 3953,
-+ 3984,
-+ 4015,
-+ 4044,
-+ 4073,
-+ 4101,
-+ 4129,
-+ 4156,
-+ 4182,
-+ 4207,
-+ 4232,
-+ 4257,
-+ 4281,
-+ 4304,
-+ 4327,
-+ 4349,
-+ 4371,
-+ 4393,
-+ 4414,
-+ 4435,
-+ 4455,
-+ 4475,
-+ 4495,
-+ 4514,
-+ 4533,
-+ 4552,
-+ 4570,
-+ 4589,
-+ 4606,
-+ 4624,
-+ 4641,
-+ 4658,
-+ 4675,
-+ 4691,
-+ 4707,
-+ 4723,
-+ 4739,
-+ 4755,
-+ 4770,
-+ 4785,
-+ 4800,
-+ 4815,
-+ 4829,
-+ 4844,
-+ 4858,
-+ 4872,
-+ 4886,
-+ 4899,
-+ 4913,
-+ 4926,
-+ 4939,
-+ 4952,
-+ 4965,
-+ 4978,
-+ 4990,
-+ 5003,
-+ 5015,
-+ 5027,
-+ 5039,
-+ 5051,
-+ 5063,
-+ 5075,
-+ 5086,
-+ 5098,
-+ 5109,
-+ 5120,
-+ 5131,
-+ 5142,
-+ 5153,
-+ 5164,
-+ 5174,
-+ 5185,
-+ 5195,
-+ 5206,
-+ 5216,
-+ 5226,
-+ 5236,
-+ 5246,
-+ 5256,
-+ 5266,
-+ 5275,
-+ 5285,
-+ 5295,
-+ 5304,
-+ 5313,
-+ 5323,
-+ 5332,
-+ 5341,
-+ 5350,
-+ 5359,
-+ 5368,
-+ 5377,
-+ 5386,
-+ 5394,
-+ 5403,
-+ 5412,
-+ 5420,
-+ 5429,
-+ 5437,
-+ 5445,
-+ 5454,
-+ 5462,
-+ 5470,
-+ 5478,
-+ 5486,
-+ 5494,
-+ 5502,
-+ 5510,
-+ 5518,
-+ 5525,
-+ 5533,
-+ 5541,
-+ 5548,
-+ 5556,
-+ 5563,
-+ 5571,
-+ 5578,
-+ 5586,
-+ 5593,
-+ 5600,
-+ 5607,
-+ 5614,
-+ 5622,
-+ 5629,
-+ 5636,
-+ 5643,
-+ 5649,
-+ 5656,
-+ 5663,
-+ 5670,
-+ 5677,
-+ 5683,
-+ 5690,
-+ 5697,
-+ 5703,
-+ 5710,
-+ 5716,
-+ 5723,
-+ 5729,
-+ 5736,
-+ 5742,
-+ 5749,
-+ 5755,
-+ 5761,
-+ 5767,
-+ 5773,
-+ 5780,
-+ 5786,
-+ 5792,
-+ 5798,
-+ 5804,
-+ 5810,
-+ 5816,
-+ 5822,
-+ 5828,
-+ 5834,
-+ 5839,
-+ 5845,
-+ 5851,
-+ 5857,
-+ 5862,
-+ 5868,
-+ 5874,
-+ 5879,
-+ 5885,
-+ 5891,
-+ 5896,
-+ 5902,
-+ 5907,
-+ 5913,
-+ 5918,
-+ 5924,
-+ 5929,
-+ 5934,
-+ 5940,
-+ 5945,
-+ 5950,
-+ 5955,
-+ 5961,
-+ 5966,
-+ 5971,
-+ 5976,
-+ 5981,
-+ 5986,
-+ 5992,
-+ 5997,
-+ 6002,
-+ 6007,
-+ 6012,
-+ 6017,
-+ 6022,
-+ 6027,
-+ 6031,
-+ 6036,
-+ 6041,
-+ 6046,
-+ 6051,
-+ 6056,
-+ 6060,
-+ 6065,
-+ 6070,
-+ 6075,
-+ 6079,
-+ 6084,
-+ 6089,
-+ 6093,
-+ 6098,
-+ 6103,
-+ 6107,
-+ 6112,
-+ 6116,
-+ 6121,
-+ 6125,
-+ 6130,
-+ 6134,
-+ 6139,
-+ 6143,
-+ 6148,
-+ 6152,
-+ 6156,
-+ 6161,
-+ 6165
-+ };
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_register.h linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h
---- linux.old/drivers/atm/sangam_atm/dsl_hal_register.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h 2005-07-10 08:02:01.440111968 +0200
-@@ -0,0 +1,337 @@
-+#ifndef ___DSL_REGISTER_DEFINES_H___
-+#define ___DSL_REGISTER_DEFINES_H___ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: DSL HAL H/W Registers and Constant Declarations for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_hal_register.h
-+*
-+* DESCRIPTION:
-+* Contains DSL HAL APIs for Adam2 OS functions
-+*
-+*
-+* (C) Copyright 2001-02, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 06Feb03 0.00.00 RamP Created
-+* 21Mar03 0.00.01 RamP Changed header files for Modular
-+* build framework
-+* 21Mar03 0.00.02 RamP Introduced malloc size for DSP f/w
-+* 07Apr03 0.00.03 RamP Implemented new error reporting scheme
-+* Changed Commenting to C style only
-+* 12Apr03 0.00.04 RamP Added Interrupt Mask defines
-+* 14Apr03 0.00.05 RamP Renamed macros for REG8, REG16 & REG32
-+* 21Apr03 0.01.00 RamP Added Interrupt source/clear registers
-+* Changed enum RSTATE_SHOWTIME to 5
-+* 24Apr03 0.01.01 RamP Moved the RSTATE enum to api.h
-+* Added olay recovery error condition
-+* 14May03 0.01.02 RamP Added defines for power computation
-+* Added error condition for hybrids
-+* 04Jun03 0.01.03 RamP Added enum for config flags,
-+* Cleaned up AR5 register defines
-+* Added defines for higher data rate
-+* 06Jun03 0.01.04 RamP Added error & interrupt defines
-+* 09Jun03 0.01.05 RamP Modified enum for current config
-+* Added additional C-Rates defines
-+* 18Jul03 0.01.06 RamP Modified internal build flow
-+* 21Aug03 0.01.07 RamP Added constellation buffer size
-+* 08Oct03 0.01.08 RamP Added us/ds Bits n gains size
-+* 12Oct03 0.01.08 RamP Added ADSL2 Message sizes, lengths
-+* and offsets for various formats
-+* 29Oct03 0.01.09 RamP Added ADSL2 Delt offsets & sizes
-+* 24Nov03 0.01.10 RamP Added bit field number, scan vector
-+* 26Dec03 0.01.11 RamP Removed the oamFeature masks to api.h
-+*******************************************************************************/
-+
-+#include "env_def_typedefs.h"
-+#ifdef INTERNAL_BUILD
-+#include "dev_host_internalinterface.h"
-+#endif
-+#include "dev_host_interface.h"
-+#include "dsl_hal_api.h"
-+
-+#define ADSLSS_BASE 0x01000000
-+#define BBIF_BASE 0x02000000
-+
-+#define ADSLSSADR (BBIF_BASE+0x0000)
-+#define ADSLSSADRMASK 0xff000000
-+#define WAKEUP_DSP 0x00000001
-+
-+/* Ax7 Reset Control */
-+
-+#define RST_CNTRL_BASE 0x8611600
-+#define RST_CNTRL_PRCR (RST_CNTRL_BASE + 0x00 )
-+
-+#define RST_CNTRL_PRCR_GPIO 0x00000040
-+#define RST_CNTRL_PRCR_ADSLSS 0x00000080
-+#define RST_CNTRL_PRCR_USB 0x00000100
-+#define RST_CNTRL_PRCR_SAR 0x00000200
-+#define RST_CNTRL_PRCR_DSP 0x00800000
-+#define RST_CNTRL_PRCR_EMAC1 0x00200000 /* EMAC1 reset */
-+
-+#define RST_CNTRL_SWRCR (RST_CNTRL_BASE + 0x04 )
-+#define RST_SWRCR_SWR0 0x00000001
-+#define RST_SWRCR_SWR1 0x00000002
-+
-+#define RST_CNTRL_RSR (TNETD53XX_RST_CNTRL_BASE + 0x08 )
-+#define RST_RSR_RSCAUSE 0x00000003 /* Software Reset Caused by writing to SWR1 bit */
-+
-+
-+/* ******************************************************
-+Interrupt sources on Ax7 interrupt controller.
-+The reserved sources are noted.
-+********************************************************* */
-+
-+#define INTR_CNTRL_SRC_SECOND 0
-+#define INTR_CNTRL_SRC_EXTERNAL0 1
-+#define INTR_CNTRL_SRC_EXTERNAL1 2
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_TIMER0 5
-+#define INTR_CNTRL_SRC_TIMER1 6
-+#define INTR_CNTRL_SRC_UART0 7
-+#define INTR_CNTRL_SRC_UART1 8
-+#define INTR_CNTRL_SRC_DMA0 9
-+#define INTR_CNTRL_SRC_DMA1 10
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_SAR 15
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_EMAC0 19
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_VLYNQ0 21
-+#define INTR_CNTRL_SRC_CODEC_WAKE 22
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_USB 24
-+#define INTR_CNTRL_SRC_VLYNQ1 25
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_EMAC1 28
-+#define INTR_CNTRL_SRC_I2C 29
-+#define INTR_CNTRL_SRC_DMA2 30
-+#define INTR_CNTRL_SRC_DMA3 31
-+/* reserved sources ... */
-+#define INTR_CNTRL_SRC_VDMA_RX 37
-+#define INTR_CNTRL_SRC_VDMA_TX 38
-+#define INTR_CNTRL_SRC_ADSLSS 39
-+
-+#ifndef K0BASE
-+#define K0BASE 0x80000000
-+#endif
-+
-+#ifndef K1BASE
-+#define K1BASE 0xA0000000
-+#endif
-+
-+#ifndef PHYS_ADDR
-+#define PHYS_ADDR(X) ((X) & 0X1FFFFFFF)
-+#endif
-+
-+#ifndef PHYS_TO_K0
-+#define PHYS_TO_K0(X) (PHYS_ADDR(X)|K0BASE)
-+#endif
-+
-+#ifndef PHYS_TO_K1
-+#define PHYS_TO_K1(X) (PHYS_ADDR(X)|K1BASE)
-+#endif
-+
-+#ifndef DSLHAL_REG8
-+#define DSLHAL_REG8( addr ) (*(volatile unsigned short *) PHYS_TO_K1(addr))
-+#endif
-+
-+#ifndef DSLHAL_REG16
-+#define DSLHAL_REG16( addr ) (*(volatile unsigned short *)PHYS_TO_K1(addr))
-+#endif
-+
-+#ifndef DSLHAL_REG32
-+#define DSLHAL_REG32( addr ) (*(volatile unsigned int *)PHYS_TO_K1(addr))
-+#endif
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+#ifndef TRUE
-+#define TRUE (1==1)
-+#endif
-+
-+#ifndef FALSE
-+#define FALSE (1==2)
-+#endif
-+
-+/*******************************************************************************
-+* Type Defines for Library
-+********************************************************************************/
-+typedef unsigned int size_t;
-+
-+#define TIDSL_HW_CREATED 0x00000001
-+#define TIDSL_HW_OPENED 0x00000002
-+#define TIDSL_HW_STARTED 0x00000004
-+#define TIDSL_OS_INITIALIZED 0x00000008
-+
-+/* Data Pump CRATES Table Defines */
-+#define SIZE_OF_CRATES1_TABLE 120
-+#define CRATES1_BF_LS0 7
-+#define CRATES1_BI_LS0 17
-+#define CRATES1_BF_AS0 0
-+#define CRATES1_BI_AS0 10
-+#define CRATES1_BF_DSRS 20
-+#define CRATES1_BI_DSRS 21
-+#define CRATES1_BFI_DSS 22
-+#define CRATES1_BFI_DSI 23
-+#define CRATES1_BF_USRS 25
-+#define CRATES1_BI_USRS 26
-+#define CRATES1_BFI_USS 27
-+#define CRATES1_BFI_USI 28
-+
-+#define FAST_PATH 0
-+#define INTERLEAVED_PATH 1
-+
-+#define LINE_NOT_CONNECTED 0
-+#define LINE_CONNECTED 1
-+#define LINE_DISCONNECTED 2
-+#define LINE_NOT_TO_CONNECT 3
-+
-+#define MAXSECTIONS 125
-+
-+/*****************************************************************************************
-+ * Localstructure declarations
-+ *
-+ ****************************************************************************************/
-+enum
-+{
-+ DSLHAL_ERROR_NO_ERRORS, /* 00 */
-+ DSLHAL_ERROR_UNRESET_ADSLSS, /* 01 */
-+ DSLHAL_ERROR_RESET_ADSLSS, /* 02 */
-+ DSLHAL_ERROR_UNRESET_DSP, /* 03 */
-+ DSLHAL_ERROR_RESET_DSP, /* 04 */
-+ DSLHAL_ERROR_NO_FIRMWARE_IMAGE, /* 05 */
-+ DSLHAL_ERROR_MALLOC, /* 06 */
-+ DSLHAL_ERROR_FIRMWARE_MALLOC, /* 07 */
-+ DSLHAL_ERROR_DIAG_MALLOC, /* 08 */
-+ DSLHAL_ERROR_OVERLAY_MALLOC, /* 09 */
-+ DSLHAL_ERROR_CODE_DOWNLOAD, /* 10 */
-+ DSLHAL_ERROR_DIAGCODE_DOWNLOAD, /* 11 */
-+ DSLHAL_ERROR_BLOCK_READ, /* 12 */
-+ DSLHAL_ERROR_BLOCK_WRITE, /* 13 */
-+ DSLHAL_ERROR_MAILBOX_READ, /* 14 */
-+ DSLHAL_ERROR_MAILBOX_WRITE, /* 15 */
-+ DSLHAL_ERROR_MAILBOX_NOMAIL, /* 16 */
-+ DSLHAL_ERROR_MAILBOX_OVERFLOW, /* 17 */
-+ DSLHAL_ERROR_INVALID_PARAM, /* 18 */
-+ DSLHAL_ERROR_ADDRESS_TRANSLATE, /* 19 */
-+ DSLHAL_ERROR_FIRMWARE_CRC, /* 20 */
-+ DSLHAL_ERROR_FIRMWARE_OFFSET, /* 21 */
-+ DSLHAL_ERROR_CONFIG_API_FAILURE, /* 22 */
-+ DSLHAL_ERROR_EOCREG_API_FAILURE, /* 23 */
-+ DSLHAL_ERROR_VERSION_API_FAILURE, /* 24 */
-+ DSLHAL_ERROR_STATS_API_FAILURE, /* 25 */
-+ DSLHAL_ERROR_MARGIN_API_FAILURE, /* 26 */
-+ DSLHAL_ERROR_CTRL_API_FAILURE, /* 27 */
-+ DSLHAL_ERROR_HYBRID_API_FAILURE, /* 28 */
-+ DSLHAL_ERROR_MODEMENV_API_FAILURE, /* 29 */
-+ DSLHAL_ERROR_INTERRUPT_FAILURE, /* 30 */
-+ DSLHAL_ERROR_INTERNAL_API_FAILURE, /* 31 */
-+ DSLHAL_ERROR_DIGIDIAG_FAILURE, /* 32 */
-+ DSLHAL_ERROR_TONETEST_FAILURE, /* 33 */
-+ DSLHAL_ERROR_NOISETEST_FAILURE, /* 34 */
-+ DSLHAL_ERROR_MODEMSTATE, /* 35 */
-+ DSLHAL_ERROR_OVERLAY_CORRUPTED /* 36 */
-+};
-+
-+enum
-+{
-+ CONFIG_FLAG_NOFLAG, /* 00 */
-+ CONFIG_FLAG_TRELLIS, /* 01 */
-+ CONFIG_FLAG_EC, /* 02 */
-+ CONFIG_FLAG_RS /* 03 */
-+};
-+
-+#define USE_EMIF_REV 0
-+#define USE_CVR_REV 1
-+#define TNETD53XX_MAXLOOP 10000
-+#define REVERB 0
-+#define MEDLEY 1
-+#define NONINTENSE 0
-+#define slavespace0 0xa1000000
-+
-+#define MASK_MAILBOX_INTERRUPTS 0x00000001
-+#define MASK_BITFIELD_INTERRUPTS 0x00000002
-+#define MASK_HEARTBEAT_INTERRUPTS 0x00000004
-+#define DSP_INTERRUPT_SOURCE_REGISTER 0x020007A0
-+#define DSP_INTERRUPT_CLEAR_REGISTER 0x020007A4
-+
-+#define DIGITAL_DIAG_MEMSIZE 1048576
-+#define CRC32_QUOTIENT 0x04c11db7
-+#define DSP_FIRMWARE_MALLOC_SIZE 0x7ffff
-+#define DSP_CONSTELLATION_BUFFER_SIZE 1024*4
-+#define LOG43125 9303
-+#define US_NOMINAL_POWER (-38)
-+#define US_BNG_LENGTH 32
-+#define DS_BNG_LENGTH 256
-+#define NUMBER_OF_BITFIELDS 4
-+#define BITFIELD_SCAN 0x80000000
-+
-+/* ADSL Message offsets from Host Interface Pointer */
-+
-+/* ADSL2 Messages Index and Length defines */
-+
-+#define CMSGFMT_INDEX 0
-+#define CMSGPCB_INDEX 1
-+#define RMSGFMT_INDEX 2
-+#define RMSGPCB_INDEX 3
-+#define RMSG1LD_INDEX 13
-+#define RMSG2LD_INDEX 14
-+#define RMSG3LD_INDEX 15
-+#define RMSG4LD_INDEX 16
-+#define RMSG5LD_INDEX 17
-+#define RMSG6LD_INDEX 18
-+#define RMSG7LD_INDEX 19
-+#define RMSG8LD_INDEX 20
-+#define RMSG9LD_INDEX 21
-+#define CMSG1LD_INDEX 22
-+#define CMSG2LD_INDEX 23
-+#define CMSG3LD_INDEX 24
-+#define CMSG4LD_INDEX 25
-+#define CMSG5LD_INDEX 26
-+#define CMSGPCB2_INDEX 28
-+#define CMSGPCB2L_INDEX 29
-+#define RMSGFMT2_INDEX 30
-+#define RMSGPCB2L_INDEX 31
-+#define CMSG1ADSL2_INDEX 32
-+#define RMSG1ADSL2_INDEX 33
-+#define CMSG2ADSL2_INDEX 34
-+#define RMSG2ADSL2_INDEX 35
-+#define CPARAMS_INDEX 36
-+#define RPARAMS_INDEX 37
-+
-+/* ADSL2 Message Sizes */
-+
-+#define CMSGFMT_SIZE 2
-+#define RMSGFMT_SIZE 2
-+#define CMSGPCB_SIZE 2
-+#define CMSGPCB2_SIZE 6 /* Annex A with Blackout */
-+#define CMSGPCB2L_SIZE 10 /* Annex B with Blackout */
-+#define RMSGPCB_SIZE 36
-+#define RMSG1LD_SIZE 16
-+#define RMSGxLD_SIZE 258
-+#define CMSG1LD_SIZE 16
-+#define CMSG2LD_SIZE 130
-+#define CMSG3LD_SIZE 66
-+#define CMSG4LD_SIZE 34
-+#define CMSG5LD_SIZE 34
-+#define CMSG1ADSL2_SIZE 24
-+#define RMSG1ADSL2_SIZE 4
-+#define CMSG2ADSL2_SIZE 4
-+#define RMSG2ADSL2_SIZE 32
-+#define CPARAMS_SIZE 136
-+#define RPARAMS_SIZE 808
-+
-+/* ADSL2 Plus Message Sizes (if Different from ADSL2) */
-+
-+#define RMSGPCB_P_SIZE 68
-+#define CMSG1ADSL2P_SIZE 40 /* With Blackout */
-+#define CPARAMS_PA_SIZE 168
-+#define RPARAMS_PA_SIZE 2088
-+#define CPARAMS_PB_SIZE 296
-+#define RPARAMS_PB_SIZE 2088
-+
-+#endif /* pairs #ifndef ___DSL_REGISTER_DEFINES_H___ */
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.c linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c
---- linux.old/drivers/atm/sangam_atm/dsl_hal_support.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c 2005-07-10 08:02:01.443111512 +0200
-@@ -0,0 +1,2788 @@
-+/*******************************************************************************
-+* FILE PURPOSE: DSL Driver API functions for Sangam
-+*********************************************************************************
-+* FILE NAME: dsl_hal_support.c
-+*
-+* DESCRIPTION:
-+* Contains DSL HAL APIs for Modem Control
-+*
-+*
-+* (C) Copyright 2001-02, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 06Feb03 0.00.00 RamP Created
-+* 21Mar03 0.00.01 RamP Inserted byteswap functions
-+* 07Apr03 0.00.02 RamP Implemented new error reporting scheme
-+* Changed Commenting to C style only
-+* 12Apr03 0.00.03 RamP Added function to set Interrupt Bit
-+* Masks for bitfield & Mailboxes
-+* 14Apr03 0.00.04 RamP Added function to process modem state
-+* bit fields; renamed REG32 macros
-+* Changed interrupt bit field settings
-+* 15Apr03 0.00.05 RamP Fixed exit condition on dslShutdown
-+* 21Apr03 0.01.00 RamP Fixed dslShutdown function & changed
-+* loop counter for overlay byteswaps
-+* (Alpha) Added cache writeback for overlays
-+* Added function acknowledgeInterrupt
-+* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt into api
-+* 24Apr03 0.01.02 RamP Added function to compare crc32 with
-+* pre-computed value as a recovery
-+* scheme for corrupt overlay pages
-+* 28Apr03 0.01.03 RamP Fixed a parameter in crc32 fxn call
-+* 05May03 0.01.04 RamP Fixed Message structure access in
-+* writeHostMailbox function
-+* 14May03 0.01.05 RamP Lookup to netService of dsp version
-+* (alpha ++) to determine pots/isdn service
-+* 21May03 0.01.06 RamP Added support for CO profiles
-+* 29May03 0.01.07 RamP Added critical section tabs for block
-+* read/write operations
-+* Added functions to reload overlay pages
-+* and CO Profiles
-+* 04Jun03 0.01.08 RamP Added state transition timing counters
-+* 06Jun03 0.01.09 RamP Added Interrupt source parsing function
-+* Interrupt masking for heartbeat added
-+* 09Jun03 0.01.10 RamP Modified modem state bit field processing
-+* for structure changes in ITIDSLHW
-+* fixed problem in free memory for CO prof
-+* 18Jul03 0.01.11 RamP Optimized free memory for CO profiles &
-+* overlay pages in the supporting APIs
-+* 28Jul03 0.02.00 RamP Modified the process bitfield functn
-+* for LED & Application State report
-+* 21Aug03 0.03.00 RamP Added logic to allocate & communicate
-+* memory for constellation buffer display
-+* 29Sep03 0.03.01 RamP Added API switch calls to advcfg module
-+* to abstract them from the API module
-+* 12Oct03 0.03.02 RamP Added API to gather ADSL2 Messages
-+* 14Oct03 0.03.03 RamP Added function to read CMsgsRA
-+* 23Oct03 0.03.04 RamP Changed train history index to circular
-+* buffer upon rollover
-+* 29Oct03 0.03.05 RamP Added Adsl2 Delt Message Parsing
-+* 12Nov03 0.03.06 RamP Fixed endianness issues with
-+* Constellation Display
-+* 14Nov03 0.03.07 RamP Added function to gather CRates1/RRates1
-+* before they get overwritten by CRatesRA
-+* 19Nov03 0.03.08 JohnP Revised dslhal_support_aocBitSwapProcessing to
-+* prevent duplicate ATU-R bitswaps going to ACT
-+* 24Nov03 0.03.09 RamP Implemented detailed State Tracking through
-+* Modem State bit fields for ADSL/2
-+* 12Dec03 0.03.10 RamP Tokenized advanced configuration code
-+* 12Dec03 0.03.11 RamP Added state reset upon IDLE
-+* 19Dec03 0.03.12 RamP Added static adsl2 byteswap function for
-+* handling pointer to pointer cases
-+* Changed adsl2 messages to correct pointer to
-+* pointer dereferencing problems in some OS
-+* 26Dec03 0.03.13 RamP Setting Current Address for Constellation
-+* buffer in addition to start address
-+* Added additional check to overlay page malloc
-+*******************************************************************************/
-+#include "dsl_hal_register.h"
-+#include "dsl_hal_support.h"
-+
-+static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_unresetDslSubsystem
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This function unreset Dsl Subsystem
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 if Pass; 1 if Fail
-+*
-+*****************************************************************************************/
-+int dslhal_support_unresetDslSubsystem(void)
-+{
-+ dprintf(4," dslhal_support_unresetDslSubsystem()\n");
-+ /* Put ADSLSS in to reset */
-+ DSLHAL_REG32(0xa8611a10) = 0x1;
-+ shim_osClockWait(64);
-+ dprintf(5,"Selected APLL Reg \n");
-+
-+ DSLHAL_REG32(0xa8610a90) = 0x4;
-+ shim_osClockWait(64);
-+ dprintf(5,"Enable Analog PLL \n");
-+
-+ DSLHAL_REG32(0xa8610a90) = 0x77fe;
-+ shim_osClockWait(64);
-+ dprintf(5,"Set PLL for DSP\n");
-+
-+ /* DSLHAL_REG32(0xa8611600) = 0x007f1bdf;*/
-+ DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_ADSLSS;
-+ shim_osClockWait(64);
-+ dprintf(5,"Brought ADSLSS out of Reset \n");
-+
-+ DSLHAL_REG32(0xa861090c) &= ~((1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)|(1<<25));
-+ shim_osClockWait(64);
-+ dprintf(5,"Configured GPIO 20-25 for McBSP \n");
-+
-+ /*DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_ADSLSS;*/
-+
-+
-+ /* DSLHAL_REG32(0xa8611a04) = 0x00000001;
-+ shim_osClockWait(64); */
-+
-+ dprintf(4," dslhal_support_unresetDslSubsystem done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_resetDslSubsystem
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This function unreset Dsl Subsystem
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 if Pass; 1 if Fail
-+*
-+*****************************************************************************************/
-+int dslhal_support_resetDslSubsystem(void)
-+{
-+ dprintf(4, "dslhal_support_resetDslSubsystem \n");
-+ /* Put ADSLSS into reset */
-+ DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_ADSLSS;
-+ shim_osClockWait(64);
-+ /* DSLHAL_REG32(0xa8611a04) = 0x00000000;
-+ shim_osClockWait(64); */
-+ dprintf(4, "dslhal_support_resetDslSubsystem Done \n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_unresetDsp()
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 --successful.
-+* 1 --failed
-+*
-+*****************************************************************************************/
-+int dslhal_support_unresetDsp(void)
-+{
-+#ifdef PRE_SILICON
-+ /* unsigned char value; */
-+ int rc;
-+
-+ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_SRC_ADDR);
-+ if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
-+ {
-+ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
-+ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
-+ }
-+ dprintf(5,"MDMA SRC: %08x\n", rc);
-+ DSLHAL_REG32(rc) = 0x80000001;
-+ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_DST_ADDR);
-+ if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
-+ {
-+ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
-+ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
-+ }
-+ dprintf(5,"MDMA DST: %08x\n", rc);
-+ DSLHAL_REG32(rc) = 0x02090001;
-+ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_CTL_ADDR);
-+ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
-+ {
-+ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
-+ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
-+ }
-+ dprintf(5,"MDMA CTL: %08x\n", rc);
-+ DSLHAL_REG32(rc) = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
-+ DEV_MDMA_BURST1 | (1 << DEV_MDMA_LEN_SHF));
-+ /* statusMask = 0x00000010;*/
-+#else
-+ dprintf(4, "dslhal_support_unresetDsp()\n");
-+
-+ /* Bring the DSP core out of reset */
-+ /* DSLHAL_REG32(0xa8611600) = 0x00ff1bdf; */
-+ DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_DSP;
-+ shim_osClockWait(64);
-+ dprintf(5,"Brought DSP out of Reset \n");
-+ dprintf(6,"Current Contents of PRCR: 0x%x\n",(unsigned int)DSLHAL_REG32(0xa8611600));
-+ /* DSLHAL_REG32(0xa8611a0c) = 0x00000007;
-+ shim_osClockWait(64); */
-+#endif
-+
-+ dprintf(4, "dslhal_support_unresetDsp() done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_resetDsp()
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction takes ax5 daugter board into reset.
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 --successful.
-+* 1 --failed
-+*
-+*****************************************************************************************/
-+int dslhal_support_resetDsp(void)
-+{
-+ dprintf(4, "dslhal_support_resetDsp \n");
-+ /* Put ADSLSS into reset */
-+ DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_DSP;
-+ shim_osClockWait(64);
-+ dprintf(4, "dslhal_support_resetDsp Done \n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_hostDspAddressTranslate()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Maps ax5 daugter card dsp memory address to avalanche memory space
-+*
-+* Input: unsigned int addr, dsp memory address.
-+*
-+* Return: >=0, unsigned int, mapped Avalanche address(VBUS address).
-+* -1, mapping failed
-+*
-+*
-+********************************************************************************************/
-+/* static unsigned int bbifmap0,bbifmap1; */
-+
-+unsigned int dslhal_support_hostDspAddressTranslate( unsigned int addr )
-+{
-+ unsigned int addrMap;
-+ /* This function should just be used to move the memory window of the ADSLSS */
-+ dprintf(5, "dslhal_support_hostDspAddressTranslate()\n");
-+
-+ /* select vbus to xbus memory */
-+ /* addrMap = addr & 0xff000000; */
-+ addrMap = addr & ADSLSSADRMASK;
-+
-+ DSLHAL_REG32(ADSLSSADR) = addrMap;
-+
-+ dprintf(6, "dslhal_support_hostDspAddressTranslate() done\n");
-+#ifdef PRE_SILICON
-+ return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr))+ 0x00000100);
-+ /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
-+#else
-+ return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr)));
-+ /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
-+#endif
-+
-+}
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_blockWrite
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card
-+*
-+* INPUT: void *buffer, data need to written
-+* void *adde, memory address to be written
-+* size_t count, number of bytes to be written
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_blockWrite(void *buffer, void *addr, size_t count)
-+{
-+ int rc, byteCnt=0;
-+ unsigned char* ptr;
-+ union
-+ {
-+ unsigned char *cptr;
-+ short *sptr;
-+ int *iptr;
-+ } src;
-+ union
-+ {
-+ int anint; /* DSP location */
-+ unsigned char *cptr; /* to avoid casts */
-+ } dst;
-+ union
-+ {
-+ unsigned int anint;
-+ unsigned char byte[4];
-+ }data,dword,sword;
-+
-+ /* Enter Critical Section */
-+ shim_osCriticalEnter();
-+
-+ dprintf(6, "dslhal_support_blockWrite\n");
-+
-+ dprintf(6,"addr=0x%X, length=0x%X, buffer=0x%X\n", (unsigned int) addr, (unsigned int) count, (unsigned int)buffer);
-+
-+ src.cptr = (unsigned char*) buffer; /* local buffer */
-+ dst.cptr = addr; /* DSP memory location */
-+
-+ /*Maps address first*/
-+ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
-+ dprintf(5, "NewAddr: %08x\n", rc);
-+ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
-+ {
-+ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
-+ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
-+ }
-+
-+ dst.cptr=(unsigned char *)rc;
-+
-+ /* check wether address is at 32bits boundary */
-+
-+ if ((dst.anint & 0x3) && count)
-+ {
-+ sword.anint = *(unsigned int*)((unsigned int)src.cptr & 0xfffffffc);
-+ dword.anint = DSLHAL_REG32((unsigned int)dst.cptr & 0xfffffffc);
-+ sword.anint = (unsigned int) dslhal_support_byteSwap32(sword.anint);
-+ dword.anint = (unsigned int) dslhal_support_byteSwap32(dword.anint);
-+ ptr = (unsigned char *)((unsigned int)dst.cptr & 0xfffffffc);
-+
-+ if((dst.anint & 3) ==3) /* last byte of a dword */
-+ {
-+ dword.byte[3] = sword.byte[3];
-+ dst.anint++; /* bump the address by one */
-+ byteCnt++;
-+ count--;
-+ }
-+
-+ if((dst.anint & 3) ==1) /* second byte */
-+ {
-+ if(count>3)
-+ {
-+ dword.byte[3] = sword.byte[3];
-+ dst.anint++;
-+ count--;
-+ byteCnt++;
-+ }
-+ if(count>2)
-+ {
-+ dword.byte[2] = sword.byte[2];
-+ dst.anint++;
-+ count--;
-+ byteCnt++;
-+ }
-+ if(count)
-+ {
-+ dword.byte[1] = sword.byte[1];
-+ dst.anint++;
-+ count--;
-+ byteCnt++;
-+ }
-+ }
-+
-+ if((dst.anint & 3) && (count >1))
-+ {
-+ dword.byte[2] = sword.byte[2];
-+ dword.byte[3] = sword.byte[3];
-+ byteCnt+=2;
-+ dst.anint += 2; /* bump the address by two */
-+ count -= 2; /* decrement the byte count by two */
-+ }
-+
-+ if((dst.anint & 3) && (count==1))
-+ {
-+ dword.byte[2] = sword.byte[2];
-+ dst.anint++;
-+ byteCnt++;
-+ count--;
-+ }
-+ src.cptr = (char *)((unsigned int)src.cptr & 0xfffffffc); /* fix 032802 */
-+ dword.anint = dslhal_support_byteSwap32(dword.anint);
-+ DSLHAL_REG32((unsigned int)ptr) = dword.anint;
-+ ptr = src.cptr;
-+ for(rc=0;rc<count;rc++)
-+ {
-+ *ptr = *(ptr+byteCnt);
-+ ptr++;
-+ }
-+ }
-+
-+ /* the dst pointer should now be on a 32-bit boundary */
-+
-+ while (count > 3)
-+ {
-+ DSLHAL_REG32((unsigned int)dst.cptr) = dslhal_support_byteSwap32(*src.iptr);
-+ src.iptr++; /* bump the data pointer by four */
-+ dst.anint += 4; /* bump the address by four */
-+ count -= 4; /* decrement the byte count by four */
-+ }
-+
-+ /* write remaining bytes */
-+ if(count)
-+ {
-+ int i;
-+
-+ data.anint= DSLHAL_REG32((unsigned int)dst.cptr);
-+ data.anint=dslhal_support_byteSwap32(data.anint);
-+ for (i=0; i< count; i++)
-+ {
-+ data.byte[i]=*(src.cptr+i);
-+ }
-+ data.anint=dslhal_support_byteSwap32(data.anint);
-+ DSLHAL_REG32((unsigned int)dst.cptr) = data.anint;
-+ src.cptr +=count;
-+ dst.anint +=count;
-+ count=0;
-+ }
-+ dprintf(6, "dslhal_support_blockWrite done\n");
-+ /* Exit Critical Section */
-+ shim_osCriticalExit();
-+ return DSLHAL_ERROR_NO_ERRORS;
-+} /* end of dslhal_support_blockWrite() */
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_blockRead
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
-+*
-+* INPUT: void *addr, memory address to be read
-+* void *buffer, dat buffer to be filled with from memmory
-+* size_t count, number of bytes to be written
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_blockRead(void *addr, void *buffer, size_t count)
-+{
-+ int rc;
-+ union
-+ {
-+ int anint; /* DSP location */
-+ char *cptr; /* to avoid casts */
-+ } src;
-+ union
-+ {
-+ char byte[4];
-+ int anint; /* DSP data */
-+ } data;
-+ union
-+ {
-+ char *cptr;
-+ int *iptr;
-+ } dst;
-+
-+ /* Enter Critical Section */
-+ shim_osCriticalEnter();
-+
-+ dprintf(6,"dslhal_support_blockRead\n");
-+
-+
-+ src.cptr = addr; /* DSP memory location */
-+ dst.cptr = buffer; /* local buffer */
-+
-+ dprintf(6, "Read addr=0x%X, size=0x%X\n", (unsigned int)addr, count);
-+
-+
-+ /*Maps address first*/
-+ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
-+ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
-+ {
-+ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
-+ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
-+ }
-+
-+ src.cptr=(unsigned char *)rc;
-+
-+ /**********************************************
-+ * if the source is NOT on a 32-bit boundary *
-+ * then we read the full word *
-+ * and ignore the first part of it *
-+ **********************************************/
-+
-+ if ((src.anint & 3) && count)
-+ {
-+ unsigned int anword;
-+
-+ anword = DSLHAL_REG32((unsigned int)src.cptr & 0xfffffffc);
-+ data.anint = dslhal_support_byteSwap32(anword);
-+
-+ /************************************
-+ * there is no need for case 0 *
-+ * notice that there are no breaks *
-+ * each falls through to the next *
-+ ************************************/
-+
-+ switch (src.anint & 3)
-+ {
-+ case 1:
-+ /* use only byte[1-3] */
-+ *(dst.cptr++) = data.byte[1];
-+ src.anint++;
-+ count--;
-+ case 2:
-+ /* use byte[2-3] */
-+ if (count)
-+ {
-+ *(dst.cptr++) = data.byte[2];
-+ src.anint++;
-+ count--;
-+ }
-+ case 3:
-+ /* use byte[3] */
-+ if (count)
-+ {
-+ *(dst.cptr++) = data.byte[3];
-+ src.anint++;
-+ count--;
-+ }
-+ }
-+ }
-+
-+ /* the src pointer should now be on a 32-bit boundary */
-+ while (count > 3)
-+ {
-+ unsigned int anword;
-+
-+ anword=DSLHAL_REG32((unsigned int)src.cptr);
-+
-+ *dst.iptr = dslhal_support_byteSwap32(anword);
-+ src.anint += 4; /* bump the address by four */
-+ dst.iptr++; /* bump the data pointer by four */
-+ count -= 4; /* decrement the byte count by four */
-+ }
-+
-+ /*******************************
-+ * if there's any count left *
-+ * then we read the next word *
-+ * and ignore the end of it *
-+ *******************************/
-+ if (count)
-+ {
-+ unsigned int anword;
-+
-+ anword= DSLHAL_REG32((unsigned int)src.cptr);
-+ data.anint = dslhal_support_byteSwap32(anword);
-+
-+ /************************************
-+ * there is no need for case 0 *
-+ * notice that there are no breaks *
-+ * each falls through to the next *
-+ ************************************/
-+ switch (count)
-+ {
-+ case 1:
-+ /* use byte[0] */
-+ *(dst.cptr++) = data.byte[0];
-+ src.anint++;
-+ count--;
-+ break;
-+ case 2:
-+ /* use byte[0-1] */
-+ *(dst.cptr++) = data.byte[0];
-+ *(dst.cptr++) = data.byte[1];
-+ src.anint +=2;
-+ count -= 2;
-+ break;
-+ case 3:
-+ /* use only byte[0-2] */
-+ *(dst.cptr++) = data.byte[0];
-+ *(dst.cptr++) = data.byte[1];
-+ *(dst.cptr++) = data.byte[2];
-+ src.anint +=3;
-+ count -= 3;
-+ break;
-+ }
-+ }
-+ /* Exit Critical Section */
-+ shim_osCriticalExit();
-+
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+} /* end of dslhal_support_blockRead() */
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readDspMailbox
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Reads a message from the mailbox
-+*
-+* ARGUMENTS: int *pcmd Pointer to command read
-+*
-+* RETURNS: 0 if successful
-+* 1 if no mail
-+* NZ otherwise
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_readDspMailbox(tidsl_t *ptidsl, int *pcmd, int *ptag, int *pprm1, int *pprm2)
-+{
-+ int rc;
-+ int cmd;
-+ int tag;
-+ int prm1;
-+ int prm2;
-+ unsigned char dspOutInx;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_mailboxControl_t mailboxControl;
-+ DEV_HOST_dspHostMsg_t dspMailboxMsg[DEV_HOST_DSPQUEUE_LENGTH];
-+
-+ dprintf(6,"dslhal_support_readDspMailbox\n");
-+
-+ /* get the DSP main pointer */
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* Read in the command/response buffer */
-+ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
-+
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
-+ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* Change the endianness of the Mailbox Pointer */
-+ mailboxControl.dspMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.dspMsgBuf_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)mailboxControl.dspMsgBuf_p,
-+ &dspMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
-+
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ /* Extract the command/response message index */
-+ mailboxControl.hostInInx &= 7;
-+ mailboxControl.hostOutInx &= 7;
-+ mailboxControl.dspOutInx &= 7;
-+ mailboxControl.dspInInx &= 7;
-+
-+
-+ /* check for messages in the mailbox */
-+
-+ if (mailboxControl.dspOutInx == mailboxControl.dspInInx)
-+ {
-+ return DSLHAL_ERROR_MAILBOX_NOMAIL;
-+ /* no messages to read */
-+ }
-+
-+ /* use bDRESPOutInx as index to DRESPMsgBuf */
-+
-+ cmd = dspMailboxMsg[mailboxControl.dspOutInx].cmd;
-+ tag = dspMailboxMsg[mailboxControl.dspOutInx].tag;
-+ prm1= dspMailboxMsg[mailboxControl.dspOutInx].param1;
-+ prm2= dspMailboxMsg[mailboxControl.dspOutInx].param2;
-+
-+ mailboxControl.dspOutInx++; /* increment count */
-+ mailboxControl.dspOutInx &= 7; /* only two bits */
-+
-+ dspOutInx = mailboxControl.dspOutInx;
-+
-+ /* Read in the command response buffer again to take care of changes */
-+ mailboxControl.dspOutInx = dspOutInx;
-+ rc = dslhal_support_blockWrite(&mailboxControl.dspOutInx,
-+ &dspOamSharedInterface.dspHostMailboxControl_p->dspOutInx, sizeof(BYTE));
-+
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+
-+ /* Is the input parameter address non-zero*/
-+
-+ if (pcmd)
-+ {
-+ *pcmd = cmd;
-+ }
-+ if (ptag)
-+ {
-+ *ptag = tag;
-+ }
-+ if (pprm1)
-+ {
-+ *pprm1 = prm1;
-+ }
-+ if (pprm2)
-+ {
-+ *pprm2 = prm2;
-+ }
-+
-+ dprintf(6,"dslhal_support_readDspMailbox done\n");
-+ dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);
-+ dprintf(6,"dslhal_support_readDspMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+} /* end of dslhal_support_readDspMailbox() */
-+
-+/*******************************************************************************************
-+* FUNCTION NAME: dslhal_support_writeHostMailbox
-+*
-+********************************************************************************************
-+* DESCRIPTION: Send a message to a mailbox
-+*
-+* ARGUMENTS: int cmd command to write
-+* int tag tag (currently unused)
-+* int p1 parameter 1 (currently unused)
-+* int p2 parameter 2 (currently unused)
-+*
-+* RETURNS: 0 if successful
-+* NZ otherwise
-+*
-+*******************************************************************************************/
-+
-+int dslhal_support_writeHostMailbox(tidsl_t *ptidsl, int cmd, int tag, int p1, int p2)
-+{
-+ int rc;
-+ int index;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_mailboxControl_t mailboxControl;
-+ DEV_HOST_dspHostMsg_t hostMailboxMsg[DEV_HOST_HOSTQUEUE_LENGTH];
-+ unsigned char hostInInx;
-+
-+ dprintf(6,"dslhal_support_writeHostMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
-+
-+ dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ /* Read in the command/response buffer */
-+ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
-+ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ /* Change the endianness of the Mailbox Control Pointer */
-+ mailboxControl.hostMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.hostMsgBuf_p);
-+ rc = dslhal_support_blockRead((PVOID)mailboxControl.hostMsgBuf_p,
-+ &hostMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH));
-+
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ /* Extract the command/response message index */
-+ mailboxControl.hostInInx &= 7;
-+ mailboxControl.hostOutInx &= 7;
-+ mailboxControl.dspOutInx &= 7;
-+ mailboxControl.dspInInx &= 7;
-+
-+ /* make sure there's room in the mailbox */
-+
-+ index = mailboxControl.hostInInx;
-+ mailboxControl.hostInInx++;
-+ mailboxControl.hostInInx &= 7;
-+ hostInInx = mailboxControl.hostInInx;
-+ if (mailboxControl.hostInInx == mailboxControl.hostOutInx)
-+ {
-+ /* mailbox is full */
-+ return DSLHAL_ERROR_MAILBOX_OVERFLOW;
-+ }
-+
-+ /* use bOCMDInInx as index to OCMDMsgBuf */
-+ hostMailboxMsg[index].cmd = (BYTE) cmd;
-+ hostMailboxMsg[index].tag = (BYTE) tag;
-+ hostMailboxMsg[index].param1 = (BYTE) p1;
-+ hostMailboxMsg[index].param2 = (BYTE) p2;
-+ rc = dslhal_support_blockWrite(&hostMailboxMsg,
-+ (PVOID)mailboxControl.hostMsgBuf_p,
-+ sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH);
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockWrite failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ rc = dslhal_support_blockWrite(&mailboxControl,
-+ &dspOamSharedInterface.dspHostMailboxControl_p,
-+ sizeof(DEV_HOST_mailboxControl_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+ /* update the index */
-+ mailboxControl.hostInInx = hostInInx;
-+ rc = dslhal_support_blockWrite(&mailboxControl.hostInInx,
-+ &dspOamSharedInterface.dspHostMailboxControl_p->hostInInx,
-+ sizeof(BYTE));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+
-+ dprintf(6,"dslhal_support_writeHostMailbox done\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+}
-+/* end of dslhal_support_writeHostMailbox() */
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readTextMailbox
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Reads a message from the mailbox
-+*
-+* ARGUMENTS: int *pcmd Pointer to command read
-+*
-+* RETURNS: 0 if successful
-+* 1 if no mail
-+* NZ otherwise
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_readTextMailbox(tidsl_t *ptidsl, int *pmsg1, int *pmsg2)
-+{
-+ int rc;
-+ unsigned int msg1;
-+ unsigned int msg2;
-+ unsigned char textOutInx;
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_mailboxControl_t mailboxControl;
-+ DEV_HOST_textMsg_t textMailboxMsg[DEV_HOST_TEXTQUEUE_LENGTH];
-+
-+ dprintf(6,"dslhal_support_readTextMailbox\n");
-+
-+ /* get the DSP main pointer */
-+
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
-+
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* Read in the command/response buffer */
-+ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
-+
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
-+ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* Change the endianness of the Mailbox Pointer */
-+ mailboxControl.textMsgBuf_p = (DEV_HOST_textMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.textMsgBuf_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)mailboxControl.textMsgBuf_p,
-+ &textMailboxMsg, (sizeof(DEV_HOST_textMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
-+
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ /* Extract the command/response message index */
-+
-+ mailboxControl.textInInx &= 7;
-+ mailboxControl.textOutInx &= 7;
-+
-+ /* check for messages in the mailbox */
-+
-+ if (mailboxControl.textOutInx == mailboxControl.textInInx)
-+ {
-+ return DSLHAL_ERROR_MAILBOX_NOMAIL;
-+ /* no messages to read */
-+ }
-+
-+ /* use bDRESPOutInx as index to DRESPMsgBuf */
-+
-+ msg1 = textMailboxMsg[mailboxControl.textOutInx].msgPart1;
-+ msg2 = textMailboxMsg[mailboxControl.textOutInx].msgPart2;
-+ msg1 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg1);
-+ msg2 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg2);
-+
-+ mailboxControl.textOutInx++; /* increment count */
-+ mailboxControl.textOutInx &= 7; /* only two bits */
-+
-+ textOutInx = mailboxControl.textOutInx;
-+
-+ /* Read in the command response buffer again to take care of changes */
-+
-+ mailboxControl.textOutInx = textOutInx;
-+
-+ rc = dslhal_support_blockWrite(&mailboxControl.textOutInx,
-+ &dspOamSharedInterface.dspHostMailboxControl_p->textOutInx, sizeof(BYTE));
-+
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+
-+ /* Is the input parameter address non-zero*/
-+
-+ if (pmsg1)
-+ {
-+ *pmsg1 = msg1;
-+ }
-+ if (pmsg2)
-+ {
-+ *pmsg2 = msg2;
-+ }
-+
-+ dprintf(6,"dslhal_support_readTextMailbox done\n");
-+ dprintf(6,"msgPart1=%d, msgPart2=%d\n", msg1, msg2);
-+ dprintf(6,"dslhal_support_readTextMailbox:Message Part1: 0x%x, tag=0x%x\n", msg1, msg2);
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+} /* end of dslhal_support_readTextMailbox() */
-+
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_hostDspCodeDownload(tidsl_t * ptidsl)
-+{
-+
-+ unsigned int index;
-+ int rc = 0, i;
-+ unsigned char *iptr; /* image pointer */
-+ unsigned int numbytes,olayXfer,olayStore;
-+ /* unsigned int holdSecPhyAddr=0,holdSecVirtAddr; */
-+ unsigned int *olayStart;
-+ size_t len; /* size of the file */
-+ size_t expoffset; /* expected offset for next section header */
-+ unsigned short checksum;
-+ unsigned int crc32;
-+ unsigned char * image;
-+ char *tmp = (char *)DEV_HOST_DSP_OAM_POINTER_LOCATION;
-+ DEV_HOST_dspVersionDef_t dspVersion;
-+#if SWTC
-+ DEV_HOST_tcHostCommDef_t TCHostCommDef;
-+#endif
-+ DEV_HOST_oamWrNegoParaDef_t OamWrNegoParaDef;
-+ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface, *pdspOamSharedInterface;
-+ DEV_HOST_olayDpDef_t olayDpParms;
-+ DEV_HOST_profileBase_t profileList;
-+#ifndef NO_ACT
-+ DEV_HOST_consBufDef_t constDisp;
-+#endif
-+#if CO_PROFILES
-+ DEV_HOST_coData_t coData;
-+#endif
-+ DEV_HOST_olayDpPageDef_t olayDpPageDef[NUM_PAGES];
-+ union
-+ {
-+ char byte[4];
-+ unsigned short hword[2];
-+ unsigned int aword;
-+ } data;
-+
-+ struct _header
-+ {
-+ char signature[6];
-+ unsigned short sectcount;
-+ unsigned int length;
-+ } header;
-+
-+ struct _section
-+ {
-+ unsigned int addr;
-+ unsigned int length;
-+ unsigned int offset;
-+ unsigned int page;
-+ };/* section[MAXSECTIONS]; */
-+
-+ struct _section *sptr;
-+ unsigned int secAddr, secLength, secOffset, secPage;
-+
-+
-+ dprintf(5,"dslhal_support_hostDspCodeDownload\n");
-+ image = ptidsl->fwimage;
-+
-+ if (!image)
-+ {
-+ dprintf(1,"no image file\n");
-+ return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
-+ }
-+
-+ iptr=image;
-+
-+ numbytes = sizeof(header);
-+
-+ shim_osMoveMemory((char *) &header, (char *)iptr, numbytes);
-+ header.length = dslhal_support_byteSwap32(header.length);
-+ header.sectcount = dslhal_support_byteSwap16(header.sectcount);
-+#if 0
-+ crc32 = dslhal_support_computeCrc32((unsigned char*)&crcTest[0],20);
-+ dprintf(6,"CRC-32 for the crcTest: 0x%x",crc32);
-+ dprintf(4,"header.length=%d, header.sectcount=0x%X\n", header.length, header.sectcount);
-+#endif
-+ /* point to the checksum */
-+ /* compute the checksum on CRC32 here */
-+ iptr = image + header.length-4;
-+ numbytes = sizeof(data.aword);
-+
-+ dprintf(5,"tiload: check checksum\n");
-+ shim_osMoveMemory((char *)&(data.byte), (char *)iptr, numbytes);
-+
-+ crc32 = dslhal_support_computeCrc32(image,ptidsl->imagesize);
-+ dprintf(5,"CRC-32 for the Binary: 0x%x",crc32);
-+ /* CRC currently not added to the DSP binary, so this code is commented out */
-+ /*
-+ data.aword = dslhal_support_byteSwap32(data.aword);
-+ if (data.aword != crc32)
-+ {
-+ dprintf(1,"Checksum error\n");
-+ }
-+ */
-+ /* Verify signature - Changed from "320C6x" to "TIDSL" for load 80 */
-+
-+ header.signature[5]='\0';
-+ dprintf(5, "signature=%s\n", header.signature);
-+
-+ if (shim_osStringCmp(header.signature, "TIDSL"))
-+ {
-+ dprintf(1,"Signature not match\n");
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+
-+ dprintf(5,"tiload: check sect count\n");
-+ /* check section count */
-+
-+ if (header.sectcount > MAXSECTIONS)
-+ {
-+ dprintf(1,"Section # %d exceeds max %d\n", header.sectcount, MAXSECTIONS);
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+ else
-+ {
-+ dprintf(5,"found %d sections\n", header.sectcount);
-+ }
-+
-+ /* Validation of Section offsets */
-+
-+ /* point to the first section */
-+ len = header.length; /* file size in bytes */
-+ expoffset = sizeof(struct _header) + header.sectcount * sizeof(struct _section);
-+
-+ dprintf(5,"tiload: check offset\n");
-+ for (index=0; index<header.sectcount; index++) /* parse the sections one by one */
-+ {
-+ numbytes = sizeof(struct _header) + index * sizeof(struct _section); /* Compute Section Offset */
-+ sptr = (struct _section *)(image + numbytes); /* Section Pointer to beginning of the section */
-+
-+ secAddr = dslhal_support_byteSwap32(sptr->addr);
-+ secOffset = dslhal_support_byteSwap32(sptr->offset);
-+ secLength = dslhal_support_byteSwap32(sptr->length);
-+ secPage = dslhal_support_byteSwap32(sptr->page);
-+
-+ /* validate offset */
-+ if ( secOffset== 0xffffffff)
-+ {
-+ /* special case: zero fill */
-+ /* offset is valid, don't change expoffset */
-+ }
-+ else
-+ {
-+ if (secOffset > len-4)
-+ {
-+ dprintf(5,"Offset error\n");
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+
-+ /* determine expected offset of NEXT section */
-+ expoffset = secLength + secOffset;
-+
-+ /* all addresses must be on word boundaries */
-+ if (secAddr & 3)
-+ {
-+
-+ }
-+ }
-+ }
-+
-+ /* check final offset - should just be a checksum left */
-+/* IMPORTANT 11/24/02 --> Got this error... but bypassed for Pf of Concept*/
-+ /*
-+ if (expoffset != len-4)
-+ {
-+ dprintf(5,"Final offset error\n");
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+ */
-+
-+ /* Actual Code loading to DSP Memory */
-+
-+ /* Initialize DSP Data Memory before code load*/
-+ dprintf(5,"Zero Prefill DSP DMEM\n");
-+ DSLHAL_REG32(ADSLSSADR)=0x80000000;
-+ shim_osZeroMemory((char *)0xa1000000, 0x10000);
-+ /* Load sections from the image */
-+ for (index=0; index<header.sectcount; index++) /* Parse each section */
-+ {
-+ numbytes = sizeof(header) + index * sizeof(struct _section); /* Compute offset to next section */
-+ sptr = (struct _section *)(image + numbytes); /* Point to next section */
-+
-+ secAddr = dslhal_support_byteSwap32(sptr->addr);
-+ secOffset = dslhal_support_byteSwap32(sptr->offset);
-+ secLength = dslhal_support_byteSwap32(sptr->length);
-+ secPage = dslhal_support_byteSwap32(sptr->page);
-+
-+ data.aword = secAddr;
-+ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
-+
-+ data.aword = secLength;
-+ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
-+
-+ data.aword = secOffset;
-+ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
-+
-+ data.aword = secPage;
-+ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
-+
-+
-+ /* validate offset */
-+ if (secOffset == 0xffffffff)
-+ {
-+ /* special case: zero fill */
-+ /* offset is valid, don't change expoffset */
-+ }
-+ else
-+ {
-+ /* real offset */
-+ if(secOffset > len-4)
-+ {
-+ dprintf(5,"section[%u] offset too big (%X/%X)\n", index,
-+ secOffset, len-4);
-+
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+
-+ /* determine expected offset of NEXT section */
-+ expoffset = secLength + secOffset;
-+
-+ }
-+
-+ }
-+
-+ /* check final offset - should just be a checksum left */
-+ /*
-+ if(expoffset != len-4)
-+ {
-+ dprintf(1,"sections don't span full file (%X/%X)\n",expoffset,len-2);
-+ return DSLHAL_ERROR_FIRMWARE_OFFSET;
-+ }
-+ */
-+ dprintf(5,"tiload: load binary\n");
-+
-+ for (index=0; index<header.sectcount; index++)
-+ {
-+ numbytes = sizeof(header) + index * sizeof(struct _section);
-+ sptr = (struct _section *)(image + numbytes);
-+
-+ secAddr = dslhal_support_byteSwap32(sptr->addr);
-+ secOffset = dslhal_support_byteSwap32(sptr->offset);
-+ secLength = dslhal_support_byteSwap32(sptr->length);
-+ secPage = dslhal_support_byteSwap32(sptr->page);
-+ dprintf(5,"loading section %u\n", index);
-+ dprintf(5,"section %u: addr: %X\n", index, secAddr);
-+ dprintf(5,"section %u: length: %X\n", index, secLength);
-+ dprintf(5,"section %u: offset: %X\n", index, secOffset);
-+ dprintf(5,"section %u: page: %X\n", index, secPage);
-+
-+ /* point to the section's data */
-+ if(secOffset != 0xffffffff)
-+ {
-+ /* Load this section of data */
-+ iptr = image + secOffset;
-+ dprintf(6, "iptr %8x\n", (unsigned int)iptr);
-+ }
-+
-+ if(secPage)
-+ {
-+ dprintf(6,"OVERLAY PAGE #%d\n",secPage);
-+ /* overlay page, don't write to dsp yet, save into host memory*/
-+
-+ dprintf(6,"Section Length: %d \n",secLength);
-+ ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
-+ if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
-+ {
-+ dprintf(1, "overlay page allocate error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+#ifdef PRE_SILICON
-+ ptidsl->olayDpPage[secPage].overlayHostAddr = ((((ptidsl->olayDpPage[secPage].PmemStartWtAddr)-0x84000000)-0x10000000)+0x030b0000);
-+#else
-+ /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
-+ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
-+#endif
-+ dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
-+
-+ ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
-+ ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
-+ ptidsl->olayDpPage[secPage].BinAddr = secAddr;
-+ ptidsl->olayDpPage[secPage].SecOffset = secOffset;
-+ shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
-+ /* RamP Image ByteSwap test */
-+ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
-+
-+ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
-+ {
-+ olayStore = *(unsigned int *)olayStart;
-+ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
-+ *(unsigned int*)olayStart = olayStore;
-+ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
-+ olayStart++;
-+ olayStore=0;
-+ }
-+ /* RamP Image ByteSwap test */
-+ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
-+ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
-+ ptidsl->olayDpPage[secPage].olayPageCrc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
-+
-+ shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
-+ }
-+ else
-+ {
-+ rc = secAddr&0xff000000;
-+ if(rc && rc!=0x80000000)
-+ {
-+ dprintf(4,"Not DSP PMEM/DMEM\n");
-+ /* don't write to dsp, save into host memory*/
-+ dprintf(4,"Section Addr: %x Section Length: %d \n",secAddr,secLength);
-+ ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
-+ if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
-+ {
-+ dprintf(1, "memory allocate error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+ ptidsl->coProfiles.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
-+ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
-+ ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
-+ ptidsl->coProfiles.OverlayXferCount = secLength;
-+ ptidsl->coProfiles.BinAddr = secAddr;
-+ ptidsl->coProfiles.SecOffset = secOffset;
-+
-+ shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);
-+ /* RamP Image ByteSwap test */
-+ olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
-+
-+ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
-+ {
-+ olayStore = *(unsigned int *)olayStart;
-+ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
-+ *(unsigned int*)olayStart = olayStore;
-+ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
-+ olayStart++;
-+ olayStore=0;
-+ }
-+ shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
-+ }
-+ else
-+ {
-+ /* IMPORTANT: write image to DSP memory */
-+ rc=dslhal_support_blockWrite((void *)iptr, (void *)secAddr, secLength);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ shim_osClockWait(0x50000);
-+ /*
-+ rc=dslhal_support_blockRead((void*)secAddr, (void*)tmpBuffer, secLength);
-+ if(rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ for(i=0;i<secLength;i++)
-+ {
-+ if(*iptr
-+ }*/
-+ }
-+ }
-+ } /* end of write dsp image */
-+
-+ /***********************************************************************************
-+ * Start to fillup various values to our hardware structure for late use
-+ ************************************************************************************/
-+
-+ /* get main pointer for data */
-+
-+ rc = dslhal_support_blockRead(tmp, &pdspOamSharedInterface, sizeof(unsigned int));
-+ dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
-+ pdspOamSharedInterface= (DEV_HOST_dspOamSharedInterface_t *)dslhal_support_byteSwap32((unsigned int)pdspOamSharedInterface);
-+ dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ if(!pdspOamSharedInterface)
-+ {
-+ dprintf(1,"Couldn't read main pointer\n");
-+ return DSLHAL_ERROR_INVALID_PARAM;
-+ }
-+
-+ ptidsl->pmainAddr=pdspOamSharedInterface;
-+
-+ /* read the OamSharedInterfaceStructure */
-+
-+ dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
-+
-+ /* get the pointer to DSP-OAM Shared Interface */
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
-+
-+ /* Change the Endianness of the profileList pointer */
-+ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
-+ /* Access the profileList Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ dprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr);
-+ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
-+ rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+
-+ /* Communicate the Allocated Memory Address to DSP to do overlays */
-+
-+ /* Change the Endianness of the olayDpDef pointer */
-+ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
-+ /* Access the olayDpDef Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+
-+ for(i=1;i<NUM_PAGES;i++)
-+ {
-+ /* Change the endianness of the olayDpPageDef Pointer */
-+ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
-+ /* Access the olayDpPageDef Structure */
-+ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
-+ rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+ }
-+
-+ /* Change the endianness of the Datapump Version Pointer */
-+ dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
-+
-+ /* get DSPVersion itself */
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,&dspVersion, sizeof(DEV_HOST_dspVersionDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* table_dsp info */
-+#if SWTC
-+ dspOamSharedInterface.tcHostComm_p = (DEV_HOST_tcHostCommDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
-+ rc = dslhal_support_blockRead(&pdspOamSharedInterface->tcHostComm_p,
-+ &pTCHostCommDef, 4);
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ pTCHostCommDef=(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)pTCHostCommDef);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
-+ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+#endif
-+ /* Select the Multimode Training */
-+ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, &OamWrNegoParaDef, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+switch(dspVersion.netService)
-+ {
-+ case 1: OamWrNegoParaDef.stdMode = MULTI_MODE;
-+ dprintf(5,"POTS Service \n");
-+ ptidsl->netService = 1;
-+ break;
-+ case 2: OamWrNegoParaDef.stdMode = GDMT_MODE;
-+ dprintf(5,"ISDN Service \n");
-+ ptidsl->netService = 2;
-+ break;
-+ default: OamWrNegoParaDef.stdMode = T1413_MODE;
-+ dprintf(5,"Default Service \n");
-+ break;
-+ }
-+
-+ ptidsl->AppData.StdMode = (unsigned int)OamWrNegoParaDef.stdMode;
-+
-+ OamWrNegoParaDef.oamFeature = dslhal_support_byteSwap32((OAMFEATURE_TC_SYNC_DETECT_MASK));
-+ /* Set the flag to start retraining if the margin of the modem drops below
-+ default margin during showtime */
-+
-+ OamWrNegoParaDef.marginMonitorShwtme = FALSE;
-+ /* Set the flag to start retraining if the margin of the modem drops below default margin during training */
-+
-+ OamWrNegoParaDef.marginMonitorTrning = FALSE;
-+ OamWrNegoParaDef.dsToneTurnoff_f = 0;
-+ dslhal_support_blockWrite(&OamWrNegoParaDef,
-+ (PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
-+ rc=dslhal_support_setInterruptMask(ptidsl,0);
-+ if(rc!=DSLHAL_ERROR_NO_ERRORS)
-+ return rc;
-+ /* Co Profile Test */
-+#if CO_PROFILES
-+ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
-+ /* Access the profileList Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p);
-+ rc = dslhal_support_blockRead((PVOID)profileList.hostProfileBase_p,&coData, sizeof(DEV_HOST_coData_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ dprintf(2,"Current Profile Vendor Id: %x \n",coData.phyAgcPgaTarget);
-+ coData.phyAgcPgaTarget = 0xcaba;
-+ rc = dslhal_support_blockWrite(&coData,(PVOID)profileList.hostProfileBase_p,sizeof(DEV_HOST_coData_t));
-+ if(rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+#endif
-+ /* End of CO Profile Test */
-+
-+#ifndef NO_ACT
-+ /* Constellation Display Buffer Allocate */
-+ ptidsl->constDisplay.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(DSP_CONSTELLATION_BUFFER_SIZE);
-+ if(ptidsl->constDisplay.PmemStartWtAddr == NULL)
-+ {
-+ dprintf(1, "memory allocate error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+ shim_osZeroMemory((void*)ptidsl->constDisplay.PmemStartWtAddr,DSP_CONSTELLATION_BUFFER_SIZE);
-+ ptidsl->constDisplay.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->constDisplay.PmemStartWtAddr);
-+ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.overlayHostAddr);
-+ ptidsl->constDisplay.OverlayXferCount = DSP_CONSTELLATION_BUFFER_SIZE;
-+
-+ /* Communicate the Allocated Buffer for DSP load Constellation Data */
-+
-+ /* Change the Endianness of the profileList pointer */
-+ dspOamSharedInterface.consDispVar_p = (DEV_HOST_consBufDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.consDispVar_p);
-+ /* Access the profileList Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.consDispVar_p,&constDisp, sizeof(DEV_HOST_consBufDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ dprintf(2,"Constellation Old Addr:%x New: %x \n",constDisp.consDispStartAddr,ptidsl->constDisplay.overlayHostAddr);
-+ constDisp.consDispStartAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->constDisplay.overlayHostAddr);
-+ constDisp.consDispCurrentAddr = constDisp.consDispStartAddr;
-+ constDisp.consDispBufLen = (unsigned int)dslhal_support_byteSwap32(DSP_CONSTELLATION_BUFFER_SIZE);
-+ rc = dslhal_support_blockWrite(&constDisp,(PVOID)dspOamSharedInterface.consDispVar_p,sizeof(DEV_HOST_consBufDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+#endif
-+ dprintf(5,"dslhal_support_hostDspCodeDownload() completed.\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+
-+} /* end of dslhal_support_hostDspCodeDownload() */
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readDelineationState()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_readDelineationState(tidsl_t * ptidsl)
-+{
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_atmStats_t atmStats;
-+ DEV_HOST_dsAtmStats_t dsAtmStats0;
-+ unsigned int rc=0, delinState=0;
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
-+
-+ if (rc)
-+ return rc;
-+ delinState = dslhal_support_byteSwap32(dsAtmStats0.delineationState);
-+ if(delinState == TC_SYNC)
-+ ptidsl->lConnected = 1;
-+ else
-+ ptidsl->lConnected = 0;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_processModemStateBitField()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_processModemStateBitField(tidsl_t * ptidsl)
-+{
-+ int rc, offset[2]={2,0};
-+ int modemStateBitFields[NUMBER_OF_BITFIELDS],changedField=0;
-+ rc = dslhal_api_dspInterfaceRead(ptidsl,(unsigned int)ptidsl->pmainAddr,2,(unsigned int *)&offset,
-+ (unsigned char *)&modemStateBitFields,NUMBER_OF_BITFIELDS*sizeof(int));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ for(rc=0;rc<NUMBER_OF_BITFIELDS;rc++)
-+ dprintf(4,"Bit Field %d: 0x%x \n",rc+1,dslhal_support_byteSwap32((unsigned int)modemStateBitFields[rc]));
-+
-+ for(rc=NUMBER_OF_BITFIELDS;rc>0;rc--)
-+ {
-+ if(ptidsl->modemStateBitField[rc-1]!=modemStateBitFields[rc-1])
-+ {
-+ changedField = rc;
-+ break;
-+ }
-+ }
-+ if(changedField)
-+ {
-+ for(rc=0;rc<32;rc++)
-+ {
-+ if(modemStateBitFields[changedField-1] & dslhal_support_byteSwap32((BITFIELD_SCAN >> rc)))
-+ break;
-+ }
-+ dprintf(5,"Changed Field : %d Changed Bit : %d \n",changedField,(31-rc));
-+ ptidsl->rState = ((changedField*100) + (31-rc));
-+ dprintf(5,"Modem State : %d \n",ptidsl->rState);
-+ shim_osMoveMemory((void *)ptidsl->modemStateBitField,(void *)modemStateBitFields, 4*NUMBER_OF_BITFIELDS);
-+ }
-+
-+ switch(changedField)
-+ {
-+ case 1: if((ptidsl->rState >= ATU_RIDLE) && (ptidsl->AppData.bState < RSTATE_IDLE))
-+ ptidsl->AppData.bState = RSTATE_IDLE;
-+ if((ptidsl->rState >= GDMT_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
-+ ptidsl->AppData.bState = RSTATE_INIT;
-+ if((ptidsl->rState >= GDMT_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
-+ ptidsl->AppData.bState = RSTATE_HS;
-+ break;
-+
-+ case 2: if((ptidsl->rState >= T1413_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
-+ ptidsl->AppData.bState = RSTATE_INIT;
-+ if((ptidsl->rState >= T1413_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
-+ ptidsl->AppData.bState = RSTATE_HS;
-+ if((ptidsl->rState == ATU_RSHOWTIME) && (ptidsl->AppData.bState < RSTATE_SHOWTIME))
-+ ptidsl->AppData.bState = RSTATE_SHOWTIME;
-+ break;
-+
-+ case 3: if((ptidsl->rState >= ADSL2_COMB3) && (ptidsl->AppData.bState < RSTATE_INIT))
-+ ptidsl->AppData.bState = RSTATE_INIT;
-+ if((ptidsl->rState >= ADSL2_RPARAMS) && (ptidsl->AppData.bState < RSTATE_HS))
-+ ptidsl->AppData.bState = RSTATE_HS;
-+ break;
-+
-+ case 4: break;
-+ default: break;
-+ }
-+
-+ ptidsl->stateTransition = modemStateBitFields[1];
-+ switch(ptidsl->AppData.bState)
-+ {
-+ case RSTATE_IDLE: ptidsl->AppData.idleTick=shim_osClockTick();
-+ ptidsl->AppData.initTick=0;
-+ ptidsl->AppData.showtimeTick=0;
-+ break;
-+ case RSTATE_HS: if(!ptidsl->AppData.initTick)
-+ {
-+ ptidsl->AppData.initTick=shim_osClockTick();
-+ }
-+ ptidsl->AppData.showtimeTick=0;
-+ break;
-+ case RSTATE_SHOWTIME: if(!ptidsl->AppData.showtimeTick)
-+ ptidsl->AppData.showtimeTick=shim_osClockTick();
-+ break;
-+ default: break;
-+ }
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_setInterruptMask()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_setInterruptMask(tidsl_t * ptidsl,unsigned int inputMask)
-+{
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_hostInterruptMask_t interruptMask;
-+ unsigned int rc=0;
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ dspOamSharedInterface.hostInterruptMask_p =(DEV_HOST_hostInterruptMask_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptMask_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptMask_p,
-+ &interruptMask, sizeof(DEV_HOST_hostInterruptMask_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ if(inputMask & MASK_MAILBOX_INTERRUPTS)
-+ {
-+ dprintf(7,"Mailbox Interrupts Masked \n");
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS);
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ }
-+ if(inputMask & MASK_BITFIELD_INTERRUPTS)
-+ {
-+ dprintf(7,"Bit field Interrupts Masked \n");
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS);
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ }
-+ if(inputMask & MASK_HEARTBEAT_INTERRUPTS)
-+ {
-+ dprintf(7,"Bit field Interrupts Masked \n");
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS);
-+ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
-+ }
-+ dslhal_support_blockWrite(&interruptMask,
-+ dspOamSharedInterface.hostInterruptMask_p, sizeof(DEV_HOST_hostInterruptMask_t));
-+ dprintf(5,"dslhal_support_setInterruptMask() completed.\n");
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_parseInterruptSource()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Parses the Interrupt Source Bit Field
-+*
-+* Return: interrupt Code if successful
-+* negative error code if failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl)
-+{
-+ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
-+ DEV_HOST_hostInterruptSource_t interruptSource;
-+ unsigned int rc=0,intrCode=0;
-+ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return (0-DSLHAL_ERROR_BLOCK_READ);
-+ }
-+ dspOamSharedInterface.hostInterruptSource_p =(DEV_HOST_hostInterruptSource_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptSource_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptSource_p,
-+ &interruptSource, sizeof(DEV_HOST_hostInterruptSource_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return (0-DSLHAL_ERROR_BLOCK_READ);
-+ }
-+ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS))
-+ {
-+ dprintf(7,"Mailbox Interrupts Acknowledge \n");
-+ intrCode |= 0x00000011;
-+ }
-+ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS))
-+ {
-+ dprintf(7,"Bit field Interrupt Acknowledge \n");
-+ intrCode |= 0x00001002;
-+ }
-+ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS))
-+ {
-+ dprintf(7,"HeartBeat Interrupt Acknowledge \n");
-+ intrCode |= 0x00100004;
-+ }
-+
-+ interruptSource.sourceBitField1 &=0x0;
-+ rc=dslhal_support_blockWrite(&interruptSource,
-+ dspOamSharedInterface.hostInterruptSource_p, sizeof(DEV_HOST_hostInterruptSource_t));
-+ if(rc)
-+ return (0-DSLHAL_ERROR_BLOCK_WRITE);
-+ dprintf(5,"dslhal_support_parseInterruptSource() completed.\n");
-+ return intrCode;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_byteSwap16()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* input 16 bit short, byte swap from little endian to big endian or vise versa
-+*
-+********************************************************************************************/
-+
-+unsigned short dslhal_support_byteSwap16(unsigned short in16Bits)
-+{
-+ unsigned short out16Bits;
-+
-+#ifdef EB
-+ unsigned char *pchar;
-+ unsigned char tmp;
-+#endif
-+
-+ out16Bits = in16Bits;
-+
-+#ifdef EB
-+ pchar = (unsigned char *)(&out16Bits);
-+
-+ tmp = *pchar;
-+ *pchar = *(pchar + 1);
-+ *(pchar + 1) = tmp;
-+#endif
-+
-+ return out16Bits;
-+
-+} /* end of dslhal_support_byteSwap16() */
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_byteSwap32()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* input 32 bit int, byte swap from little endian to big endian or vise versa
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_byteSwap32(unsigned int in32Bits)
-+{
-+ int out32Bits;
-+
-+#ifdef EB
-+ unsigned char tmp;
-+ unsigned char *pchar;
-+#endif
-+
-+ out32Bits = in32Bits;
-+
-+#ifdef EB
-+ pchar = (unsigned char *)(&out32Bits);
-+
-+ tmp = *pchar;
-+ *pchar = *(pchar + 3);
-+ *(pchar + 3) = tmp;
-+
-+ tmp = *(pchar + 1);
-+ *(pchar + 1) = *(pchar + 2);
-+ *(pchar + 2) = tmp;
-+#endif
-+
-+ return out32Bits;
-+
-+} /* end of dslhal_support_byteSwap32() */
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_computeCrc32()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data
-+*
-+* Return: 32 bit CRC of the input data
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_computeCrc32(unsigned char *data, int len)
-+{
-+ unsigned int result;
-+ int i,j;
-+ unsigned char octet;
-+
-+ if ((len < 4) || (data==NULL))
-+ return(0xdeaddead);
-+ result = *data++ << 24;
-+ result |= *data++ << 16;
-+ result |= *data++ << 8;
-+ result |= *data++;
-+ result = ~ result;
-+
-+ len -=4;
-+
-+ for (i=0; i<len; i++)
-+ {
-+ octet = *(data++);
-+ for (j=0; j<8; j++)
-+ {
-+ if (result & 0x80000000)
-+ {
-+ result = (result << 1) ^ CRC32_QUOTIENT ^ (octet >> 7);
-+ }
-+ else
-+ {
-+ result = (result << 1) ^ (octet >> 7);
-+ }
-+ octet <<= 1;
-+ }
-+ }
-+ return ~result; /* The complement of the remainder */
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_checkOverlayPage()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_checkOverlayPage(tidsl_t *ptidsl, unsigned int tag)
-+{
-+ unsigned int computedCrc;
-+ if((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr == NULL)
-+ {
-+ dprintf(5,"Null Address for Page: %d\n",tag);
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+ computedCrc = dslhal_support_computeCrc32((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr, ptidsl->olayDpPage[tag].OverlayXferCount);
-+ dprintf(6,"\n Pre-Computed CRC32 = 0x%x \t Current CRC32 = 0x%x \n",ptidsl->olayDpPage[tag].olayPageCrc32,computedCrc);
-+ if(computedCrc != ptidsl->olayDpPage[tag].olayPageCrc32)
-+ return DSLHAL_ERROR_OVERLAY_CORRUPTED;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_clearTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_clearTrainingInfo(tidsl_t *ptidsl)
-+{
-+ int i;
-+
-+ for(i=0; i<NUM_PAGES; i++)
-+ {
-+ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
-+ {
-+ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
-+ ptidsl->olayDpPage[i].OverlayXferCount);
-+ ptidsl->olayDpPage[i].PmemStartWtAddr =NULL;
-+ }
-+ }
-+ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
-+ {
-+ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
-+ ptidsl->coProfiles.PmemStartWtAddr = NULL;
-+ }
-+ return 0;
-+}
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Reload overlay pages from flash or memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl)
-+{
-+
-+ int rc = 0, i;
-+ unsigned int olayXfer,olayStore;
-+ unsigned int *olayStart;
-+
-+ unsigned int crc32;
-+ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
-+ DEV_HOST_olayDpDef_t olayDpParms;
-+ DEV_HOST_olayDpPageDef_t olayDpPageDef[NUM_PAGES];
-+ DEV_HOST_profileBase_t profileList;
-+
-+ unsigned int secLength, secOffset, secPage;
-+
-+ /* co profile */
-+ secLength = ptidsl->coProfiles.OverlayXferCount;
-+ secOffset = ptidsl->coProfiles.SecOffset;
-+ ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
-+ if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
-+ {
-+ dprintf(1, "memory allocate error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+ /* holdSecPhyAddr = virtual2Physical((unsigned int)holdSecVirtAddr); */
-+ ptidsl->coProfiles.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
-+ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
-+ ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
-+
-+ rc = shim_read_overlay_page((void *)ptidsl->coProfiles.PmemStartWtAddr, secOffset, secLength);
-+ if(rc != secLength)
-+ {
-+ dprintf(1, "shim_read_overlay_page failed\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+
-+ /*shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);*/
-+ /* RamP Image ByteSwap test */
-+ olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
-+
-+ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
-+ {
-+ olayStore = *(unsigned int *)olayStart;
-+ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
-+ *(unsigned int*)olayStart = olayStore;
-+ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
-+ olayStart++;
-+ olayStore=0;
-+ }
-+ shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
-+
-+
-+ for (secPage=1;secPage<NUM_PAGES; secPage++)
-+ {
-+
-+ dprintf(6,"OVERLAY PAGE #%d\n",secPage);
-+
-+ secLength = ptidsl->olayDpPage[secPage].OverlayXferCount;
-+
-+ dprintf(4,"Section[%d] Length: %d \n",secPage, secLength);
-+
-+ secOffset = ptidsl->olayDpPage[secPage].SecOffset;
-+ ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
-+ if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
-+ {
-+ dprintf(1, "overlay page allocate error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+
-+ rc = shim_read_overlay_page((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr,secOffset, secLength);
-+ if(rc != secLength)
-+ {
-+ dprintf(1, "overlay page read error\n");
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+ }
-+
-+ /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
-+ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
-+ dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
-+
-+ ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
-+ /*ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
-+ ptidsl->olayDpPage[secPage].BinAddr = secAddr;
-+ shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
-+ */
-+ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
-+
-+ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
-+ {
-+ olayStore = *(unsigned int *)olayStart;
-+ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
-+ *(unsigned int*)olayStart = olayStore;
-+ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
-+ olayStart++;
-+ olayStore=0;
-+ }
-+ /* RamP Image ByteSwap test */
-+ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
-+ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
-+ crc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
-+ if(crc32 != ptidsl->olayDpPage[secPage].olayPageCrc32)
-+ return DSLHAL_ERROR_OVERLAY_MALLOC;
-+
-+ shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
-+ }
-+
-+
-+ dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
-+
-+ /* get the pointer to DSP-OAM Shared Interface */
-+ rc = dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,
-+ sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
-+
-+ /* Change the Endianness of the profileList pointer */
-+ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
-+ /* Access the profileList Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+ dprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr);
-+ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
-+ rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+
-+ /* Communicate the Allocated Memory Address to DSP to do overlays */
-+
-+ /* Change the Endianness of the olayDpDef pointer */
-+ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
-+ /* Access the olayDpDef Structure */
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+
-+ for(i=1;i<NUM_PAGES;i++)
-+ {
-+ /* Change the endianness of the olayDpPageDef Pointer */
-+ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
-+ /* Access the olayDpPageDef Structure */
-+ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
-+ rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_WRITE;
-+ }
-+
-+ ptidsl->bOverlayPageLoaded = 1;
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+ /* end of dslhal_support_reloadTrainingInfo() */
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+
-+int dslhal_support_restoreTrainingInfo(tidsl_t *ptidsl)
-+{
-+ int rc;
-+
-+ rc=1;
-+ while(rc != 0)
-+ {
-+ dslhal_support_clearTrainingInfo(ptidsl);
-+ //shim_osCriticalEnter();
-+ rc = dslhal_support_reloadTrainingInfo(ptidsl);
-+ //shim_osCriticalExit();
-+ shim_osClockWait(6400);
-+ }
-+ return 0;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Idle State Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl)
-+{
-+ int rc=0;
-+ ptidsl->AppData.bState = RSTATE_IDLE;
-+#ifndef NO_ACT
-+ rc += dslhal_advcfg_resetBitSwapMessageLog(ptidsl,0);
-+ rc += dslhal_advcfg_resetBitSwapMessageLog(ptidsl,1);
-+ rc += dslhal_advcfg_resetTrainStateHistory(ptidsl);
-+ rc += dslhal_advcfg_getReasonForDrop(ptidsl);
-+#endif
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Idle State Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs)
-+{
-+ int rc=0;
-+#ifndef NO_ACT
-+ int i;
-+ int differentCmd_f;
-+ unsigned int dsSwapInx;
-+
-+ static UINT8 lastAturBitSwapCommands[6] = {0, 0, 0, 0, 0, 0};
-+ static UINT8 lastAturBitSwapBinNum[6] = {0, 0, 0, 0, 0, 0};
-+
-+ if (usDs == 0)
-+ {
-+ dprintf(4," DSP_XMITBITSWAP\n");
-+ rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,0);
-+ ptidsl->usBitSwapInx++;
-+ if (ptidsl->usBitSwapInx > 29)
-+ ptidsl->usBitSwapInx=0;
-+ }
-+
-+ if (usDs == 1)
-+ {
-+ dprintf(4," DSP_RCVBITSWAP\n");
-+ rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,1);
-+ differentCmd_f = FALSE;
-+ dsSwapInx = ptidsl->dsBitSwapInx;
-+ if (! rc)
-+ {
-+ for (i = 0; i < 6; i++)
-+ {
-+ if (lastAturBitSwapCommands[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand[i])
-+ {
-+ differentCmd_f = TRUE;
-+ break;
-+ }
-+ }
-+ if (! differentCmd_f)
-+ {
-+ for (i = 0; i < 6; i++)
-+ {
-+ if (lastAturBitSwapBinNum[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum[i])
-+ {
-+ differentCmd_f = TRUE;
-+ break;
-+ }
-+ }
-+ }
-+ //CPE data pump seems to occasionally send us the same bit swap twice in a row with different sframe counter.
-+ //Since these are never counted twice by the debug output of AC5, we should not count them twice either.
-+ //So, we ignore the sframe_counter in determining whether the most recent bitswap is a duplicate.
-+ if (differentCmd_f)
-+ {
-+ shim_osMoveMemory((void *)lastAturBitSwapCommands, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand, 6);
-+ shim_osMoveMemory((void *)lastAturBitSwapBinNum, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum, 6);
-+ ptidsl->dsBitSwapInx++;
-+ if (ptidsl->dsBitSwapInx > 29)
-+ ptidsl->dsBitSwapInx = 0;
-+ }
-+ }
-+ }
-+#endif
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherEocMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced EOC Buffering functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2)
-+{
-+ int rc=0;
-+#ifndef NO_ACT
-+ rc = dslhal_advcfg_logEocMessages(ptidsl,usDs, msgPart1, msgPart2);
-+#endif
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Snr per bin buffering Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParam)
-+{
-+ int rc=0;
-+#ifndef NO_ACT
-+ rc = dslhal_advcfg_getSnrPerBin(ptidsl,snrParam);
-+#endif
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_processTrainingState()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Training State Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl)
-+{
-+ int rc=0;
-+#ifndef NO_ACT
-+
-+ if(ptidsl->trainStateInx<120)
-+ {
-+ rc = dslhal_advcfg_getTrainingState(ptidsl,(void *)&ptidsl->trainHistory[ptidsl->trainStateInx++]);
-+ if(ptidsl->trainHistory[(ptidsl->trainStateInx-1)].subStateIndex ==
-+ ptidsl->trainHistory[(ptidsl->trainStateInx-2)].subStateIndex)
-+ ptidsl->trainStateInx--;
-+ }
-+ else
-+ ptidsl->trainStateInx = 0;
-+#endif
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Gathers ADSL2 Training Messages
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int tag, int param1, int param2)
-+{
-+ int rc=0;
-+ unsigned int adsl2MsgLoc;
-+ switch(tag)
-+ {
-+ case CMSGFMT_INDEX:
-+ dprintf(5,"C-Msg-FMT rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSGFMT_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsgFmt,CMSGFMT_SIZE);
-+ break;
-+ case RMSGFMT_INDEX:
-+ case RMSGFMT2_INDEX:
-+ dprintf(5,"R-Msg-FMT rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSGFMT_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.rMsgFmt,RMSGFMT_SIZE);
-+ break;
-+ case CMSGPCB_INDEX:
-+ dprintf(5,"C-Msg-PCB rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSGPCB_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB_SIZE);
-+ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB_SIZE;
-+ break;
-+ case CMSGPCB2_INDEX:
-+ dprintf(5,"C-Msg-PCB2 rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSGPCB2_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2_SIZE);
-+ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2_SIZE;
-+#ifndef NO_ACT
-+ rc += dslhal_advcfg_setBlackOutBits(ptidsl);
-+#endif
-+ break;
-+ case CMSGPCB2L_INDEX:
-+ dprintf(5,"C-Msg-PCB2L rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSGPCB2L_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2L_SIZE);
-+ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2L_SIZE;
-+ break;
-+ case RMSGPCB_INDEX:
-+ case RMSGPCB2L_INDEX:
-+ dprintf(5,"R-Msg-PCB rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSGPCB_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB_SIZE);
-+ ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB_SIZE;
-+ break;
-+
-+ case CMSG1ADSL2_INDEX:
-+ dprintf(5,"C-Msg1 rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG1ADSL2_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsg1,CMSG1ADSL2_SIZE);
-+ ptidsl->adsl2TrainingMessages.cMsg1Len = CMSG1ADSL2_SIZE;
-+ break;
-+ case CMSG2ADSL2_INDEX:
-+ dprintf(5,"C-Msg2 rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG2ADSL2_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cMsg2,CMSG2ADSL2_SIZE);
-+ ptidsl->adsl2TrainingMessages.cMsg2Len = CMSG2ADSL2_SIZE;
-+ break;
-+ case RMSG1ADSL2_INDEX:
-+ dprintf(5,"R-Msg1 rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG1ADSL2_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.rMsg1,RMSG1ADSL2_SIZE);
-+ ptidsl->adsl2TrainingMessages.rMsg1Len = RMSG1ADSL2_SIZE;
-+ break;
-+ case RMSG2ADSL2_INDEX:
-+ dprintf(5,"R-Msg2 rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG2ADSL2_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.rMsg2,RMSG2ADSL2_SIZE);
-+ ptidsl->adsl2TrainingMessages.rMsg2Len = RMSG2ADSL2_SIZE;
-+ break;
-+ case CPARAMS_INDEX:
-+ dprintf(5,"C-Params rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CPARAMS_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.cParams,CPARAMS_SIZE);
-+ ptidsl->adsl2TrainingMessages.cParamsLen = CPARAMS_SIZE;
-+ break;
-+ case RPARAMS_INDEX:
-+ dprintf(5,"R-Params rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RPARAMS_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2TrainingMessages.rParams,RPARAMS_SIZE);
-+ ptidsl->adsl2TrainingMessages.rParamsLen = RPARAMS_SIZE;
-+ break;
-+ case RMSG1LD_INDEX:
-+ dprintf(5,"R-Msg1 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG1LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg1Ld,RMSG1LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsg1LdLen = RMSG1LD_SIZE;
-+ break;
-+ case RMSG2LD_INDEX:
-+ dprintf(5,"R-Msg2 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG2LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg2Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG3LD_INDEX:
-+ dprintf(5,"R-Msg3 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG3LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg3Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG4LD_INDEX:
-+ dprintf(5,"R-Msg4 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG4LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg4Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG5LD_INDEX:
-+ dprintf(5,"R-Msg5 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG5LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg5Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG6LD_INDEX:
-+ dprintf(5,"R-Msg6 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG6LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg6Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG7LD_INDEX:
-+ dprintf(5,"R-Msg7 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG7LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg7Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG8LD_INDEX:
-+ dprintf(5,"R-Msg8 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG8LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg8Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case RMSG9LD_INDEX:
-+ dprintf(5,"R-Msg9 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, RMSG9LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.rMsg9Ld,RMSGxLD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
-+ break;
-+ case CMSG1LD_INDEX:
-+ dprintf(5,"C-Msg1 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG1LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.cMsg1Ld,CMSG1LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.cMsg1LdLen = CMSG1LD_SIZE;
-+ break;
-+ case CMSG2LD_INDEX:
-+ dprintf(5,"C-Msg2 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG2LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.cMsg2Ld,CMSG2LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.cMsg2LdLen = CMSG2LD_SIZE;
-+ break;
-+ case CMSG3LD_INDEX:
-+ dprintf(5,"C-Msg3 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG3LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.cMsg3Ld,CMSG3LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.cMsg3LdLen = CMSG3LD_SIZE;
-+ break;
-+ case CMSG4LD_INDEX:
-+ dprintf(5,"C-Msg4 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG4LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.cMsg4Ld,CMSG4LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.cMsg4LdLen = CMSG4LD_SIZE;
-+ break;
-+ case CMSG5LD_INDEX:
-+ dprintf(5,"C-Msg5 LD rec'd\n");
-+ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
-+ (ptidsl, CMSG5LD_INDEX);
-+ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
-+ ptidsl->adsl2DiagnosticMessages.cMsg5Ld,CMSG5LD_SIZE);
-+ ptidsl->adsl2DiagnosticMessages.cMsg5LdLen = CMSG5LD_SIZE;
-+ break;
-+ default:
-+ dprintf(5,"Unknown ADSL2 Message rec'd\n");
-+ break;
-+ }
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_getAdsl2MessageLocation()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Gets the address to the ADSL2 Message being looked up
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset)
-+{
-+ int rc=0;
-+
-+ DEV_HOST_dspOamSharedInterface_t *pSharedInterface, sharedInterface;
-+ DEV_HOST_dspWrNegoParaDef_t dspNegoPara;
-+ int adsl2MsgString, adsl2MsgAddr;
-+
-+ pSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
-+ rc += dslhal_support_blockRead(pSharedInterface, &sharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ sharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_adsl2ByteSwap32((unsigned int)sharedInterface.dspWriteNegoParams_p);
-+ rc += dslhal_support_blockRead((PVOID)sharedInterface.dspWriteNegoParams_p,&dspNegoPara, sizeof(DEV_HOST_dspWrNegoParaDef_t));
-+
-+ if (rc)
-+ {
-+ dprintf(1,"dslhal_support_blockRead failed\n");
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ }
-+
-+ adsl2MsgString = dslhal_support_adsl2ByteSwap32((unsigned int)dspNegoPara.adsl2DeltMsgs_p);
-+ dprintf(5,"ADSL2 Message String Address: 0x%x\n",adsl2MsgString);
-+ rc += dslhal_support_blockRead((PVOID)(adsl2MsgString +
-+ ((sizeof(unsigned char *)*msgOffset))),
-+ &adsl2MsgAddr, sizeof(int));
-+ adsl2MsgAddr = dslhal_support_adsl2ByteSwap32((unsigned int)adsl2MsgAddr);
-+ dprintf(5," Message Address: 0x%x\n",adsl2MsgAddr);
-+
-+ if(rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ else
-+ return adsl2MsgAddr;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_getCMsgsRa()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Training Message functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg)
-+{
-+ int rc=0;
-+ DEV_HOST_raMsgsDef_t raMsgParms;
-+ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
-+ rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+
-+ dspOamSharedInterface.raMsgs_p = (DEV_HOST_raMsgsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.raMsgs_p);
-+
-+ rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.raMsgs_p,
-+ &raMsgParms, sizeof(DEV_HOST_raMsgsDef_t));
-+ shim_osMoveMemory((void *)cMsg,(void *)raMsgParms.cMsgsRaString,6);
-+
-+ if(rc)
-+ return DSLHAL_ERROR_CONFIG_API_FAILURE;
-+ else
-+ return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherRateMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Gathers Rate Training Messages
-+* Input
-+* tidsl_t *ptidsl : Pointer to application structure
-+*
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherRateMessages(tidsl_t * ptidsl)
-+{
-+ int rc;
-+ DEV_HOST_dspWrNegoParaDef_t negoParms;
-+ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
-+
-+ dprintf(1, "dslhal_support_gatherRateMessages\n");
-+
-+ rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
-+ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
-+
-+ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p, &negoParms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
-+ if (rc)
-+ return DSLHAL_ERROR_BLOCK_READ;
-+ else
-+ {
-+ shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)negoParms.cRates1, 120);
-+ shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)negoParms.rRates1, 44);
-+ }
-+return DSLHAL_ERROR_NO_ERRORS;
-+}
-+
-+static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits)
-+{
-+ int out32Bits=0;
-+
-+#ifdef EB
-+ out32Bits = (in32Bits << 24);
-+ out32Bits |=((in32Bits & 0x0000ff00) << 8);
-+ out32Bits |=((in32Bits & 0xff000000) >> 24);
-+ out32Bits |=((in32Bits & 0x00ff0000) >> 8);
-+#else
-+ out32Bits = in32Bits;
-+#endif
-+
-+ return out32Bits;
-+
-+} /* end of dslhal_support_byteSwap32() */
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.h linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h
---- linux.old/drivers/atm/sangam_atm/dsl_hal_support.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h 2005-07-10 08:02:01.444111360 +0200
-@@ -0,0 +1,718 @@
-+#ifndef DSL_HAL_SUPPORT_H__
-+#define DSL_HAL_SUPPORT_H__ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: DSL Driver API functions for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_hal_functiondefines.c
-+*
-+* DESCRIPTION:
-+* Contains basic DSL HAL API declarations for Sangam
-+*
-+*
-+* (C) Copyright 2001-02, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 06Feb03 0.00.00 RamP Created
-+* 21Mar03 0.00.01 RamP Removed byteswap functions
-+* 21Mar03 0.00.02 RamP Added extern osFreeVMemory declaration
-+* 10Apr03 0.00.03 RamP Changed declaration for loadFWImage &
-+* loadDebugFWImage to remove ptidsl param
-+* 12Apr03 0.00.04 RamP Added function to set Interrupt Bit
-+* Masks for bitfield & Mailboxes
-+* 14Apr03 0.00.05 RamP Added modem state bit field processing
-+* 15Apr03 0.00.06 RamP Added function osAllocateVMemory
-+* 21Apr03 0.01.00 RamP Added function osAllocateDmaMemory
-+* Added function osFreeDmaMemory
-+* (Alpha) Added macro virtual2Physical,
-+* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt to api.h
-+* 24Apr03 0.01.02 RamP Added checkOvelayPage function
-+* 29May03 0.01.03 RamP Added critical enter/exit function decl
-+* 06Jun03 0.01.04 RamP Added Interrupt source parsing function
-+* 06Oct03 0.01.05 RamP Added function abstraction switches
-+* 12Oct03 0.01.06 RamP Added ADSL2 Message function prototypes
-+* 14Nov03 0.03.07 RamP Added function to gather Rate Messages
-+*******************************************************************************/
-+
-+#include "dsl_hal_api.h"
-+
-+#define virtual2Physical(a) (((int)a)&~0xe0000000)
-+/* External Function Prototype Declarations */
-+
-+extern unsigned int shim_osGetCpuFrequency(void);
-+extern void shim_osClockWait(int val);
-+extern unsigned int shim_osClockTick(void);
-+
-+extern int shim_osStringCmp(const char *s1, const char *s2);
-+
-+extern void dprintf( int uDbgLevel, char * szFmt, ...);
-+
-+extern int shim_osLoadFWImage(unsigned char *firmwareImage);
-+extern int shim_osLoadDebugFWImage(unsigned char *debugFirmwareImage);
-+extern unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength);
-+extern void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes);
-+extern void shim_osZeroMemory(char *dst, unsigned int numBytes);
-+
-+extern void *shim_osAllocateMemory(unsigned int size);
-+extern void *shim_osAllocateVMemory(unsigned int size);
-+extern void *shim_osAllocateDmaMemory(unsigned int size);
-+
-+extern void shim_osFreeMemory(void *ptr, unsigned int size);
-+extern void shim_osFreeVMemory(void *ptr, unsigned int size);
-+extern void shim_osFreeDmaMemory(void *ptr, unsigned int size);
-+
-+extern void shim_osWriteBackCache(void *pMem, unsigned int size);
-+extern void shim_osCriticalEnter(void);
-+extern void shim_osCriticalExit(void);
-+
-+
-+/*******************************************************************************************
-+* FUNCTION NAME: dslhal_support_writeHostMailbox
-+*
-+********************************************************************************************
-+* DESCRIPTION: Send a message to a mailbox
-+*
-+* ARGUMENTS: int cmd command to write
-+* int tag tag (currently unused)
-+* int p1 parameter 1 (currently unused)
-+* int p2 parameter 2 (currently unused)
-+*
-+* RETURNS: 0 if successful
-+* NZ otherwise
-+*
-+*******************************************************************************************/
-+
-+int dslhal_support_writeHostMailbox
-+(tidsl_t *ptidsl,
-+ int cmd,
-+ int tag,
-+ int p1,
-+ int p2);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readDspMailbox
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Reads a message from the mailbox
-+*
-+* ARGUMENTS: int *pcmd Pointer to command read
-+*
-+* RETURNS: 0 if successful
-+* 1 if no mail
-+* NZ otherwise
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_readDspMailbox
-+(tidsl_t *ptidsl,
-+ int *pcmd,
-+ int *ptag,
-+ int *pprm1,
-+ int *pprm2);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readTextMailbox
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Reads a message from the mailbox
-+*
-+* ARGUMENTS: int *pcmd Pointer to command read
-+*
-+* RETURNS: 0 if successful
-+* 1 if no mail
-+* NZ otherwise
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_readTextMailbox
-+(tidsl_t *ptidsl,
-+ int *pmsg1,
-+ int *pmsg2);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_blockRead
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
-+*
-+* INPUT: void *addr, memory address to be read
-+* void *buffer, dat buffer to be filled with from memmory
-+* size_t count, number of bytes to be written
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_blockRead
-+(void *addr,
-+ void *buffer,
-+ size_t count);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_blockWrite
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card
-+*
-+* INPUT: void *buffer, data need to written
-+* void *adde, memory address to be written
-+* size_t count, number of bytes to be written
-+*
-+* RETURN: 0 --succeeded
-+* 1 --Failed
-+*
-+*****************************************************************************************/
-+
-+int dslhal_support_blockWrite
-+(void *buffer,
-+ void *addr,
-+ size_t count);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_hostDspAddressTranslate
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This function moves the address window to translate physical address
-+*
-+* INPUT: unsigned int addr : address that requires translation
-+*
-+* RETURN: Translated address or error condition
-+*
-+*
-+*****************************************************************************************/
-+
-+unsigned int dslhal_support_hostDspAddressTranslate
-+( unsigned int addr
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_unresetDslSubsystem
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This function unreset Dsl Subsystem
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 if Pass; 1 if Fail
-+*
-+*****************************************************************************************/
-+int dslhal_support_unresetDslSubsystem
-+(void
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_unresetDsp()
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 --successful.
-+* 1 --failed
-+*
-+*****************************************************************************************/
-+int dslhal_support_unresetDsp
-+(void
-+);
-+
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_resetDslSubsystem
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This function unreset Dsl Subsystem
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 if Pass; 1 if Fail
-+*
-+*****************************************************************************************/
-+int dslhal_support_resetDslSubsystem
-+(void
-+);
-+
-+/******************************************************************************************
-+* FUNCTION NAME: dslhal_support_resetDsp()
-+*
-+*******************************************************************************************
-+* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
-+*
-+* INPUT: None
-+*
-+* RETURN: 0 --successful.
-+* 1 --failed
-+*
-+*****************************************************************************************/
-+int dslhal_support_resetDsp
-+(void
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_hostDspCodeDownload
-+(tidsl_t * ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_digi_assignMemTestSpace()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Assigns Memory Space in SDRAM for External Memory Test
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_digi_assignMemTestSpace
-+(tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_digi_readMemTestResult()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Reads Results of External Memory Test
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_digi_readMemTestResult
-+(tidsl_t *ptidsl,
-+unsigned int testResult
-+);
-+
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_codeDownload()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: Brings DSLSS out of Reset, Downloads Diag Firmware,
-+* brings DSP out of Reset
-+* Input: tidsl_t *ptidsl
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_codeDownload
-+(tidsl_t *ptidsl,
-+unsigned char* missingTones
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_setPgaParams()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Tones selects the .
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_anlg_setPgaParams
-+(tidsl_t *ptidsl,
-+int agcFlag,
-+short pga1,
-+short pga2,
-+short pga3,
-+short aeq
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_getRxNoisePower()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Tones selects the .
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_anlg_getRxNoisePower
-+(tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_diags_anlg_setMissingTones()
-+*
-+*********************************************************************************************
-+* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
-+* tones and Medley's with missing tones. These signals are defined in ITU
-+* G.992.1 ADSL Standards.
-+*
-+* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
-+* Tones selects the .
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_diags_anlg_setMissingTones
-+(tidsl_t *ptidsl,
-+unsigned char* missingTones
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_readDelineationState()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_readDelineationState
-+(tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_processModemStateBitField()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* download DSP image from host memory to dsp memory
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_processModemStateBitField
-+(tidsl_t *ptidsl
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_setInterruptMask()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_setInterruptMask
-+(tidsl_t * ptidsl,
-+unsigned int inputMask
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_computeCrc32()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data
-+*
-+* Return: 32 bit CRC of the input data
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_computeCrc32
-+(unsigned char *data,
-+int len
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_checkOverlayPage()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_checkOverlayPage
-+(tidsl_t *ptidsl,
-+unsigned int tag
-+);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_restoreTrainingInfo(tidsl_t * ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_clearTrainingInfo()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Computes the CRC-32 for the input data and compares it with reference
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+int dslhal_support_clearTrainingInfo(tidsl_t * ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_parseInterruptSource()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Sets the host interrupt bit masks
-+*
-+* Return: 0 success
-+* 1 failed
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl);
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Idle State Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Bitswap buffer Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherEocMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced EOC Buffering functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Snr per bin buffering Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParm);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_processTrainingState()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Training State Processing Functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced EOC Buffering functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int msgTag, int param1, int param2);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_getAdsl2MsgLocation()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Gets the address to the ADSL2 Message being looked up
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_getCMsgsRa()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Calls Advanced Training Message functions
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_gatherRateMessages()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* Gathers Advanced Training Messages
-+*
-+* Return: Error Condition (if any)
-+*
-+*
-+* NOTE:
-+* DSP image is based on LITTLE endian
-+*
-+********************************************************************************************/
-+unsigned int dslhal_support_gatherRateMessages(tidsl_t *ptidsl);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_byteSwap16()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* byteswap a short
-+*
-+* INPUT:
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+unsigned short dslhal_support_byteSwap16(unsigned short in16Bits);
-+
-+/********************************************************************************************
-+* FUNCTION NAME: dslhal_support_byteSwap32()
-+*
-+*********************************************************************************************
-+* DESCRIPTION:
-+* byteswap a word
-+*
-+* INPUT:
-+* Return: NULL
-+*
-+********************************************************************************************/
-+
-+unsigned int dslhal_support_byteSwap32(unsigned int in32Bits);
-+
-+#endif /* Pairs #ifndef DSL_HAL_FUNCTIONDEFINES_H__ */
-diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_version.h linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h
---- linux.old/drivers/atm/sangam_atm/dsl_hal_version.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h 2005-07-10 08:02:01.444111360 +0200
-@@ -0,0 +1,94 @@
-+#ifndef __SYSSW_VERSION_H__
-+#define __SYSSW_VERSION_H__ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: DSL Driver API functions for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_hal_basicapi.c
-+*
-+* DESCRIPTION:
-+* Contains basic DSL HAL APIs for Sangam
-+*
-+* (C) Copyright 2003-04, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 14May03 0.00.00 RamP Original Version Created
-+* 14May03 0.00.01 RamP Initial Rev numbers inserted
-+* 14May03 0.00.02 RamP Bumped version numbers for Dsl Hal
-+* & dhalapp for alpha plus
-+* 19May03 0.00.03 MCB Bumped dslhal version number
-+* because of dependant changes
-+* wrt. linux-nsp atm drivers.
-+* 22May03 0.00.04 RamP Bumped dslhal & dhalapp buildnum
-+* for inner/outer pair & DGASP code
-+* 06Jun03 0.00.05 RamP Bumped up buildnum for LED, STM,
-+* interrupt processing, statistics
-+* and other pre-beta features
-+* 09Jun03 0.00.06 JEB Fixed error in DHALAPP bugfix/buildnum
-+* 09Jun03 0.00.07 RamP Bumped up buildnum for incremental
-+* changes to apis, statistics, memory
-+* fixes, parameter configurations
-+* 11Jun03 0.00.08 RamP Bumped up buildnum for Co profile
-+* free memory fix
-+* 12Jun03 0.00.09 JEB Bumped version numbers for AR7 1.00 Beta
-+* 02Jul03 0.00.10 ZT Bumped HAL version for overlay page
-+* 18Jul03 0.00.11 RamP Bumped HAL version for analog diags
-+* 22Jul03 0.00.12 JEB Bumped DHALAPP buildnum for analog diags
-+* 31Jul03 0.00.13 RamP Bumped HAL version for engr. drop
-+* 04Aug03 0.00.14 JEB Bumped HAL version buildnum for CHECKPOINT65 changes
-+* Bumped LINUX version buildnum for CHECKPOINT65 changes
-+* 06Aug03 0.00.15 MCB Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
-+* 13Aug03 0.00.16 MCB Set rev id's for D3/R1.1 (ADSL2).
-+* 21Aug03 0.00.17 JEB Bumped up build numbers for merge of code additions from D1
-+* 26Sep03 0.00.18 JEB Set rev id's for another D3/R1 (ADSL2).
-+* 14Oct03 0.00.19 JEB Bumped Linux minor number and reset bugfix number for release.
-+* Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
-+* 14Oct03 0.00.20 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
-+* 21Oct03 0.00.21 JEB Bumped build number on DSLHAL for CHECKPOINT16.
-+* 22Oct03 0.00.22 MCB Bumped all version numbers in support of D3R1 release.
-+* 27Oct03 0.00.23 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
-+* Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
-+* 30Oct03 0.00.24 JEB Bumped bugfix number on LINUXATM Version for next release.
-+* Bumped build numbers on DSLHAL and DHALAPP
-+* 31Oct03 0.00.25 MCB Bumped all version numbers in support of D3R2 release.
-+* 14Nov03 0.00.26 JEB Bumped build numbers on DSLHAL and DHALAPP
-+* Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
-+* 20Nov03 0.00.27 JEB Bumped build number on DSLHAL.
-+* Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
-+* 21Nov03 0.00.28 MCB Bumped all version numbers in support of D3R2 release.
-+* 21Nov03 0.00.29 JEB Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
-+* 16Dec03 0.00.30 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
-+* 21Dec03 0.00.31 MCB Bumped all version numbers in support of D3R2 release.
-+* 05Jan04 0.00.32 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
-+* 15Jan04 0.00.33 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
-+* 26Jan04 0.00.34 JEB Changed Linux ATM version number to be 04.02.03.00.
-+* 27Jan04 0.00.35 MCB Bumped all version numbers in support of D3R2 release.
-+*******************************************************************************/
-+
-+/* Dsl Hal API Version Numbers */
-+#define DSLHAL_VERSION_MAJOR 03
-+#define DSLHAL_VERSION_MINOR 00
-+#define DSLHAL_VERSION_BUGFIX 06
-+#define DSLHAL_VERSION_BUILDNUM 00
-+#define DSLHAL_VERSION_TIMESTAMP 00
-+
-+/* dhalapp Adam2 Application Version Numbers */
-+#define DHALAPP_VERSION_MAJOR 03
-+#define DHALAPP_VERSION_MINOR 00
-+#define DHALAPP_VERSION_BUGFIX 05
-+#define DHALAPP_VERSION_BUILDNUM 00
-+
-+/* Linux ATM Driver Version Numbers */
-+#define LINUXATM_VERSION_MAJOR 04
-+#define LINUXATM_VERSION_MINOR 02
-+#define LINUXATM_VERSION_BUGFIX 04
-+#define LINUXATM_VERSION_BUILDNUM 00
-+
-+/* DSL Agent Version Numbers */
-+#define DSLAGENT_VERSION_MAJOR 02
-+#define DSLAGENT_VERSION_MINOR 00
-+#define DSLAGENT_VERSION_BUGFIX 02
-+#define DSLAGENT_VERSION_BUILDNUM 00
-+
-+#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
-diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h
---- linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h 2005-07-10 08:02:01.445111208 +0200
-@@ -0,0 +1,118 @@
-+/***************************************************************************
-+ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
-+
-+ FILE: ec_errors.h
-+
-+ DESCRIPTION:
-+ This file contains definitions and function declarations for
-+ error code support.
-+
-+ HISTORY:
-+ 14Dec00 MJH Added masking to EC_CLASS etc macros
-+ 17Sep02 GSG Added HAL support (new class&devices)
-+ 03Oct02 GSG Removed C++ style comments
-+***************************************************************************/
-+#ifndef _INC_EC_ERRORS
-+#define _INC_EC_ERRORS
-+
-+/*
-+ 31 - CRITICAL
-+ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
-+ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
-+ 23-16 - DEVICE (ie. EMAC, IIC, etc)
-+ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
-+ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
-+*/
-+
-+/*---------------------------------------------------------------------------
-+ Useful defines for accessing fields within error code
-+---------------------------------------------------------------------------*/
-+#define CRITICAL_SHIFT 31
-+#define CLASS_SHIFT 28
-+#define INST_SHIFT 24
-+#define DEVICE_SHIFT 16
-+#define FUNCTION_SHIFT 8
-+#define ERROR_CODE_SHIFT 0
-+
-+#define CRITICAL_MASK 1
-+#define CLASS_MASK 0x07
-+#define DEVICE_MASK 0xFF
-+#define INST_MASK 0x0F
-+#define FUNCTION_MASK 0xFF
-+#define ERROR_CODE_MASK 0xFF
-+
-+#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
-+#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
-+#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
-+#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
-+#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
-+
-+/*---------------------------------------------------------------------------
-+ Operation classes
-+---------------------------------------------------------------------------*/
-+#define EC_HAL EC_CLASS(0)
-+#define EC_DIAG EC_CLASS(8)
-+
-+/*---------------------------------------------------------------------------
-+ Device types
-+---------------------------------------------------------------------------*/
-+#define EC_DEV_EMAC EC_DEVICE(1)
-+#define EC_DEV_IIC EC_DEVICE(2)
-+#define EC_DEV_RESET EC_DEVICE(3)
-+#define EC_DEV_ATMSAR EC_DEVICE(4)
-+#define EC_DEV_MEM EC_DEVICE(5)
-+#define EC_DEV_DES EC_DEVICE(6)
-+#define EC_DEV_DMA EC_DEVICE(7)
-+#define EC_DEV_DSP EC_DEVICE(8)
-+#define EC_DEV_TMR EC_DEVICE(9)
-+#define EC_DEV_WDT EC_DEVICE(10)
-+#define EC_DEV_DCL EC_DEVICE(11)
-+#define EC_DEV_BBIF EC_DEVICE(12)
-+#define EC_DEV_PCI EC_DEVICE(13)
-+#define EC_DEV_XBUS EC_DEVICE(14)
-+#define EC_DEV_DSLIF EC_DEVICE(15)
-+#define EC_DEV_USB EC_DEVICE(16)
-+#define EC_DEV_CLKC EC_DEVICE(17)
-+#define EC_DEV_RAPTOR EC_DEVICE(18)
-+#define EC_DEV_DSPC EC_DEVICE(19)
-+#define EC_DEV_INTC EC_DEVICE(20)
-+#define EC_DEV_GPIO EC_DEVICE(21)
-+#define EC_DEV_BIST EC_DEVICE(22)
-+#define EC_DEV_HDLC EC_DEVICE(23)
-+#define EC_DEV_UART EC_DEVICE(24)
-+#define EC_DEV_VOIC EC_DEVICE(25)
-+/* 9.17.02 (new HAL modules) */
-+#define EC_DEV_CPSAR EC_DEVICE(0x1A)
-+#define EC_DEV_AAL5 EC_DEVICE(0x1B)
-+#define EC_DEV_AAL2 EC_DEVICE(0x1C)
-+#define EC_DEV_CPMAC EC_DEVICE(0x1D)
-+#define EC_DEV_VDMA EC_DEVICE(0x1E)
-+#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
-+#define EC_DEV_CPPI EC_DEVICE(0x20)
-+#define EC_DEV_CPMDIO EC_DEVICE(0x21)
-+
-+/*---------------------------------------------------------------------------
-+ Function types
-+---------------------------------------------------------------------------*/
-+#define EC_FUNC_READ_CONF EC_FUNC(1)
-+#define EC_FUNC_INIT EC_FUNC(2)
-+
-+/*---------------------------------------------------------------------------
-+ Error codes
-+---------------------------------------------------------------------------*/
-+#define EC_CRITICAL (1<<CRITICAL_SHIFT)
-+#define EC_NO_ERRORS 0
-+#define EC_VAL_NO_BASE EC_ERR(1)
-+#define EC_VAL_NO_RESET_BIT EC_ERR(2)
-+#define EC_VAL_NO_RESET EC_ERR(3)
-+#define EC_VAL_BAD_BASE EC_ERR(4)
-+#define EC_VAL_MALLOCFAILED EC_ERR(5)
-+#define EC_VAL_NO_RESETBASE EC_ERR(6)
-+#define EC_DEVICE_NOT_FOUND EC_ERR(7)
-+
-+/*---------------------------------------------------------------------------
-+ Function declarations
-+---------------------------------------------------------------------------*/
-+extern void ec_log_error( unsigned int );
-+
-+#endif /* _INC_EC_ERRORS */
-diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h
---- linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h 2005-07-10 08:02:01.445111208 +0200
-@@ -0,0 +1,118 @@
-+/***************************************************************************
-+ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
-+
-+ FILE: ec_errors.h
-+
-+ DESCRIPTION:
-+ This file contains definitions and function declarations for
-+ error code support.
-+
-+ HISTORY:
-+ 14Dec00 MJH Added masking to EC_CLASS etc macros
-+ 17Sep02 GSG Added HAL support (new class&devices)
-+ 03Oct02 GSG Removed C++ style comments
-+***************************************************************************/
-+#ifndef _INC_EC_ERRORS
-+#define _INC_EC_ERRORS
-+
-+/*
-+ 31 - CRITICAL
-+ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
-+ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
-+ 23-16 - DEVICE (ie. EMAC, IIC, etc)
-+ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
-+ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
-+*/
-+
-+/*---------------------------------------------------------------------------
-+ Useful defines for accessing fields within error code
-+---------------------------------------------------------------------------*/
-+#define CRITICAL_SHIFT 31
-+#define CLASS_SHIFT 28
-+#define INST_SHIFT 24
-+#define DEVICE_SHIFT 16
-+#define FUNCTION_SHIFT 8
-+#define ERROR_CODE_SHIFT 0
-+
-+#define CRITICAL_MASK 1
-+#define CLASS_MASK 0x07
-+#define DEVICE_MASK 0xFF
-+#define INST_MASK 0x0F
-+#define FUNCTION_MASK 0xFF
-+#define ERROR_CODE_MASK 0xFF
-+
-+#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
-+#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
-+#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
-+#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
-+#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
-+
-+/*---------------------------------------------------------------------------
-+ Operation classes
-+---------------------------------------------------------------------------*/
-+#define EC_HAL EC_CLASS(0)
-+#define EC_DIAG EC_CLASS(8)
-+
-+/*---------------------------------------------------------------------------
-+ Device types
-+---------------------------------------------------------------------------*/
-+#define EC_DEV_EMAC EC_DEVICE(1)
-+#define EC_DEV_IIC EC_DEVICE(2)
-+#define EC_DEV_RESET EC_DEVICE(3)
-+#define EC_DEV_ATMSAR EC_DEVICE(4)
-+#define EC_DEV_MEM EC_DEVICE(5)
-+#define EC_DEV_DES EC_DEVICE(6)
-+#define EC_DEV_DMA EC_DEVICE(7)
-+#define EC_DEV_DSP EC_DEVICE(8)
-+#define EC_DEV_TMR EC_DEVICE(9)
-+#define EC_DEV_WDT EC_DEVICE(10)
-+#define EC_DEV_DCL EC_DEVICE(11)
-+#define EC_DEV_BBIF EC_DEVICE(12)
-+#define EC_DEV_PCI EC_DEVICE(13)
-+#define EC_DEV_XBUS EC_DEVICE(14)
-+#define EC_DEV_DSLIF EC_DEVICE(15)
-+#define EC_DEV_USB EC_DEVICE(16)
-+#define EC_DEV_CLKC EC_DEVICE(17)
-+#define EC_DEV_RAPTOR EC_DEVICE(18)
-+#define EC_DEV_DSPC EC_DEVICE(19)
-+#define EC_DEV_INTC EC_DEVICE(20)
-+#define EC_DEV_GPIO EC_DEVICE(21)
-+#define EC_DEV_BIST EC_DEVICE(22)
-+#define EC_DEV_HDLC EC_DEVICE(23)
-+#define EC_DEV_UART EC_DEVICE(24)
-+#define EC_DEV_VOIC EC_DEVICE(25)
-+/* 9.17.02 (new HAL modules) */
-+#define EC_DEV_CPSAR EC_DEVICE(0x1A)
-+#define EC_DEV_AAL5 EC_DEVICE(0x1B)
-+#define EC_DEV_AAL2 EC_DEVICE(0x1C)
-+#define EC_DEV_CPMAC EC_DEVICE(0x1D)
-+#define EC_DEV_VDMA EC_DEVICE(0x1E)
-+#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
-+#define EC_DEV_CPPI EC_DEVICE(0x20)
-+#define EC_DEV_CPMDIO EC_DEVICE(0x21)
-+
-+/*---------------------------------------------------------------------------
-+ Function types
-+---------------------------------------------------------------------------*/
-+#define EC_FUNC_READ_CONF EC_FUNC(1)
-+#define EC_FUNC_INIT EC_FUNC(2)
-+
-+/*---------------------------------------------------------------------------
-+ Error codes
-+---------------------------------------------------------------------------*/
-+#define EC_CRITICAL (1<<CRITICAL_SHIFT)
-+#define EC_NO_ERRORS 0
-+#define EC_VAL_NO_BASE EC_ERR(1)
-+#define EC_VAL_NO_RESET_BIT EC_ERR(2)
-+#define EC_VAL_NO_RESET EC_ERR(3)
-+#define EC_VAL_BAD_BASE EC_ERR(4)
-+#define EC_VAL_MALLOCFAILED EC_ERR(5)
-+#define EC_VAL_NO_RESETBASE EC_ERR(6)
-+#define EC_DEVICE_NOT_FOUND EC_ERR(7)
-+
-+/*---------------------------------------------------------------------------
-+ Function declarations
-+---------------------------------------------------------------------------*/
-+extern void ec_log_error( unsigned int );
-+
-+#endif /* _INC_EC_ERRORS */
-diff -urN linux.old/drivers/atm/sangam_atm/env_def_defines.h linux.dev/drivers/atm/sangam_atm/env_def_defines.h
---- linux.old/drivers/atm/sangam_atm/env_def_defines.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/env_def_defines.h 2005-07-10 08:02:01.446111056 +0200
-@@ -0,0 +1,926 @@
-+#ifndef __ENV_DEF_DEFINES_H__
-+#define __ENV_DEF_DEFINES_H__ 1
-+
-+//********************************************************************
-+//* DMT-BASE ADSL MODEM PROGRAM
-+//* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
-+//* AMATI CONFIDENTIAL PROPRIETARY
-+//*
-+//* (c) Copyright May 1999, Texas Instruments Incorporated.
-+//* All Rights Reserved.
-+//*
-+//* Property of Texas Instruments Incorporated and Amati Communications Corp.
-+//*
-+//* Restricted Rights - Use, duplication, or disclosure is subject to
-+//* restrictions set forth in TI's and Amati program license agreement and
-+//* associated documentation
-+//*
-+//*********************************************************************
-+//*
-+//* FILENAME: dpsys_defines.h
-+//*
-+//* ABSTRACT: This file provides a mechanism for defining standard
-+//* preprocessor flag sets for datapump.
-+//*
-+//* TARGET: Non specific.
-+//*
-+//* TOOLSET: Non specific.
-+//*
-+//* ACTIVATION:
-+//*
-+//* HISTORY: DATE AUTHOR DESCRIPTION
-+//* 05/11/99 FLW Created
-+//* 01/21/00 FLW derfmake changes
-+//* 02/07/00 FLW/M.Seidl added _debug targets
-+//* 02/23/00 FLW/M.Barnett merged in from G.lite branch
-+//* 03/03/00 FLW/M.Barnett added TRELLIS token
-+//* 05/11/00 Barnett Added ap036btp & ap037btp support.
-+//* 02/07/00 M.Seidl added HW_TEQ, HW_DEC and DC_BIAS tokens
-+//* 02/28/00 Derf/Seidl Mod's in support of suppressing compiler warnings for empty source files
-+//* 02/28/00 M. Seidl added SWTC token
-+//* 02/28/00 M. Seidl added ap0501tp and its _debug target
-+//* 03/03/00 M. Seidl added MODPILOT token, ap0307tp_debug has SWDI and FDD enabled
-+//* 03/08/00 Jack Huang Added HWRSDEC token
-+//* 03/29/00 Derf/Seidl Mod's in support Soft-TC and derfmake
-+//* 04/10/00 Jack Huang Added PCIMASTER token
-+//* 04/11/00 Jack Huang Added STBFIX token
-+//* 04/24/00 M. Seidl ap0500tp has OLAYDP turned on, ap0500tp_debug has OLAYDP turned off now
-+//* 04/28/00 M.Seidl added KAPIL token for ap0501tp targets
-+//* 06/02/00 P.Sexton Added OAM_EOC token
-+//* 06/06/00 M. Seidl added au0501tp target
-+//* 06/12/00 Michael Seidl activated h/w TEQ for KAPIL targets, disabled STBFIX for all targets
-+//* 06/14/00 Derf added ap0308tp, alphabetized token lists
-+//* 06/16/00 Jack Huang added au0501tp_debug target
-+//* 06/22/00 M. Seidl Enabled code overlays through EMIF from external memory. Now there are 3
-+//* different code overlay schemes that are differentiated by the following tokens:
-+//* OLAYDP_PCI: uses PCI DMA in PCI Master Mode
-+//* OLAYDP_HOST: Host downloads overlay code into DMEM upon request from DSP
-+//* OLAYDP_EMIF: Host downloads overlay code into ext. mem at boot-time. DSP uses
-+//* DMA channel 0 to load code into on-chip PMEM
-+//* OLAYDP: turns overlays generally on or off
-+//* 07/15/00 B.Srinivasan Cleaned up default tokens and tokens for au0501tp, au0501tp_debug,
-+//* ap0501tp and ap0501tp_debug targets as well
-+//* 07/19/00 B.Srinivasan Made changes w.r.t cleaning/fixing Rufus Interrupt related code
-+//* (changed token TC_INTRPT_RUFUS to INTRPT_RUFUS
-+//* 06/14/00 Derf added au0501cp
-+//* 08/12/00 Yinong Ding Added DPLL_MODE token.
-+//* 08/16/00 F. Mujica Moved DOUBLE_XMT_RATE, RX_HPF, and LEAKY_LMS tokens here.
-+//* 09/05/00 M. Seidl Changed ap0501tp back to do overlay through PCI (OLAY_PCI = 1)
-+//* 09/11/00 M. Seidl moved USB and OLAYDP_HOST definitions to be CHIPSET specific, not target specific
-+//* 09/21/00 U.Dasgupta/ Added a token for separate transmit and receive buffers.
-+//* F.Mujica (SEPARATE_TX_RX_BUFFERS).
-+//* 10/02/00 U.Dasgupta/ Added DPLL and SEPARATE_TX_RX_BUFFER tokens for au0502 target.
-+//* F.Mujica
-+//* 10/02/00 M. Castellano Added new tokens for new Host/EMIF DSP code overlay.
-+//* OLAYDP_2STEP: Host downloads overlay code into ext. mem upon DSP request. DSP
-+//* DMA channel 0 to load code into on-chip PMEM. It is a somewhat hybrid version
-+//* of OLAYDP_HOST and OLAYDP_EMIF. The test target is ap0502tp.
-+//* 10/25/00 Balaji Added tokens for arv500tp target
-+//* 10/31/00 U. Iyer Added TEQ_AVG token and set it one for Ax5
-+//* 11/02/00 Barnett Added OAM_EOC=0 in defaults at bottom of file.
-+//* 11/21/00 M. Seidl turned OLAYDP and AOC off for ap0307tp to make binary compatible w. whql'ed driver
-+//* 11/28/00 Paul Hunt added FASTRETRAIN token for fast retrain specific code
-+//* 11/28/00 Paul Hunt added PILOTDATA token to control channel estimation and transmission
-+//* of data on the upstream pilot tone for ITU standard code loads
-+//* 12/20/00 Jack Huang added EIGHTBITSRAM toekn for the targets that use 8-bit SRAM for
-+//* interleaver/deinterleaver
-+//* 01/11/01 U.Dasgupta Added mp targets and cleaned up GHS/PILOTDATA variables
-+//* 01/23/01 U.Dasgupta Cleaned up code within GLITE tokens
-+//* 01/23/00 Barnett Added in full EOC support for AP3/Ax5. Got rid of UTC. No longer needed.
-+//* 02/08/01 Barnett Added DDC token.
-+//* 03/09/01 Nirmal Warke Added in TOKEN definition for line diagnostics (LINE_DIAG): IMP DEPENDENCIES -
-+//* TEQ_AVG must be off when LINE_DIAG is on (since they share a union buffer at the same time)
-+//* 03/13/01 M. Seidl Recovered ap0500tp target. Added GHS token as PMEM saving option
-+//* 03/14/01 Barnett Added ap0500mb target support. Look-and-feel is similar to ap0500tp.
-+//* Added seperate-but-equal def's wrt. ISDN Annex B, Annex C, and PROP.
-+//* 03/14/01 J. Bergsagel Added EXTERNBERT token.
-+//* 03/15/01 Barnett/Balaji Merged AR5(H) -> 03.00.00 datapump.
-+//* 03/16/01 Nirmal Warke Added in TOKEN definition for crosstalk performance mods (CROSSTALK): IMP DEPENDENCIES -
-+//* TEQ_AVG must be off and LEAKY_LMS must be on when CROSSTALK is on
-+//* 03/21/01 Barnett Added support for ar0500lp, ar0500mp, ar0500dp, arv500lp, arv500mp, and arv500dp.
-+//* 03/26/01 M. Seidl enabled 64pt IFFT for ap0500mb (Raptor+AD11, FDM)
-+//* 03/28/01 J. Bergsagel Removed EXTERNBERT token (now use host intf. var. instead)
-+//* 04/03/01 J. Bergsagel Removed condition of DSPDP_CHIPSET_GEN==5 for default defines
-+//* Removed LEAKY_LMS token (assumed always 1)
-+//* Removed OLAYDP_HOST token (assumed always 0)
-+//* Removed RX_HPF token (assumed always 1)
-+//* Removed TRIBRID token (not used any more)
-+//* Removed FDD token (assumed always 1)
-+//* Removed HW_DEC token (assumed always 1)
-+//* Removed HW_TEQ token (assumed always 1)
-+//* Removed HWRSDEC token (assumed always 1)
-+//* Removed ILEC_AD11_ALCATEL337 token (assumed always 0)
-+//* Removed ILEC_AD11_HDSLNOISEFIX token (assumed always 0)
-+//* Removed ILEC_AD11_MODULATEPILOT token (assumed always 0)
-+//* Removed ILEC_AD11_NEWINTERPOLATE token (assumed always 0)
-+//* Removed ILEC_AD11_USTXHPF token (assumed always 0)
-+//* Removed SWDI token (assumed always 1)
-+//* Removed TD_AGC token (assumed always 1)
-+//* Removed DSPDP_LEGACY_TARGET token (assumed always 0)
-+//* Removed AD11_20, AD11_20NL and AD11_20_NEWPREC token (always 1)
-+//* Removed AI token (assumed always 1)
-+//* Removed ATUC token (assumed always 0)
-+//* Removed EU token (assumed always 0)
-+//* Removed EVM2 token (assumed always 0)
-+//* Removed INTRPT_RUFUS token (assumed always 0)
-+//* Removed MODPILOT token (assumed always 0)
-+//* Removed SL and SL_EVM tokens (assumed always 0)
-+//* Removed STBIFX token (assumed always 0)
-+//* Removed STD token (assumed always 1)
-+//* Removed SWDI_LOOPBACK token (assumed always 0)
-+//* Removed TID token (assumed always 0)
-+//* Removed TII token (assumed always 1)
-+//* Removed TIPCI token (assumed always 1)
-+//* Removed UDI token (assumed always 1)
-+//* Removed DC_BIAS token (assumed always 1)
-+//* 04/05/01 Barnett Added DSPDP_ prefix to tokens that originate
-+//* in the public interface.
-+//* 05/07/01 Jack Huang Removed DOUBLE_XMT_RATE token.
-+//* 05/16/01 Barnett Added back in EXTERNBERT token in support
-+//* of saving PMEM.
-+//* 06/05/01 Jack Huang Fixed the rules for ar0500mp_debug target
-+//* 04/23/01 M. Halleck Merge Astro Wu's DDC enhancements
-+//* 06/05/01 M. Capps Changed DSP_DEBUG to ENHANCED_SERIAL_DEBUG
-+//* 07/03/01 M. Capps Replaced ESD token with !DDC, added DEV_DEBUG
-+//* 06/26/01 J. Bergsagel Removed all the old ap03... stuff
-+//* Removed OLAYDP_HOST token (again)
-+//* Removed CROSSTALK token (assumed always 1)
-+//* Removed TEQ_AVG token (assumed always 0)
-+//* Removed DE token (assumed always 1)
-+//* Removed PVAT token and au0501cp target
-+//* Removed FASTRETRAIN token (assumed always 0)
-+//* 07/05/01 J. Bergsagel Changed PCIMASTER token to TC_ATM_PCIMASTER
-+//* 07/20/01 Umesh Iyer Added ATMBERT token. ATMBERT is conditional on SWTC definition. if SWTC is 0
-+//* ATMBERT should be 0. Else it can be 0/1. Default 0.
-+//* 07/23/01 J. Bergsagel Changed name from defines_u.h to dpsys_defines.h
-+//* 07/24/01 Barnett Added support for build of $(TARGET)_diag mfgr'ing targets.
-+//* 08/02/01 Michael Seidl renamed KAPIL token to !AD1X
-+//* 08/02/01 Michael Seidl renamed GHS token to PMEMSAVE_GHS
-+//* 08/03/01 S.Yim Added MFGR_DIAG token for afe diagnostic
-+//* Added AFEDEV token for afe device driver
-+//* Added DSPBIOSII token for dsp bios
-+//* 09/21/01 Sameer Enable EXTERNBERT. Disable ATMBERT.
-+//* 10/01/01 U.Dasgupta Turned off SMART_MARGIN for ap0500mb because of FECs/CRCs;
-+//* 10/09/01 Barnett Added support for ar0500db.
-+//* 10/12/01 Barnett Disable EXTERNBERT.
-+//* 10/15/01 Barnett Turn off SMART_MARGIN.
-+//* 11/07/01 Barnett Def'ed ISDN_DEBUG for all targets to avoid compiler warnings.
-+//* Assumed defaul value is zero.
-+//* 11/13/01 Barnett Reworked ar0500db_debug to build JTAG-bootable load.
-+//* The equivalent production target should only be flash-bootable.
-+//* 01/11/02 Yim Added TOKEN JTAG to build JTAG load ar0500db_diag.
-+//* 01/23/02 U Iyer Added DEBUG_LOG token. Default value 0
-+//* 01/31/02 Barnett Added support for ar0700mp target.
-+//* 02/04/02 S.Yim Added TOKEN JTAG to build JTAG load ar0500mp_diag
-+//* 02/11/02 U Iyer Added MARGIN_DELTA_RETRAIN token. Default value 1
-+//* 05/15/02 Sameer V Enabled EXTERNBERT token for AR5 and AU5 platforms. EXTERNBERT is
-+//* not supported on AR5H.
-+//* 02/14/02 Barnett Don't ref the SWTC feature token if mfgr'ing diag target.
-+//* 02/19/02 Yim Added support to build au0502db_diag target.
-+//* 03/08/02 Nirmal Warke Added feature token HYBRID_SWITCH
-+//* 03/15/02 U G Jani Turned ON Bitswap support for AU5I (au0502db) targets.
-+//* 04/08/02 U G Jani Enabled NLNOISEADJSNR token for AU5I targets.
-+//* 06/24/02 Seungmok Oh Added PERTONE_EQ token support for those targets:
-+//* (ar0500mp_debug, au0502mp_debug, ar0500mp, au0502mp)
-+//* 06/26/02 Mallesh Added DS_PWR_CUTBACK token. Default value 1.
-+//* 06/27/02 Mallesh Changed default value of DS_PWR_CUTBACK token to 0.
-+//* 06/29/02 U.Dasgupta Token cleanup: Removed ISDN_DEBUG token
-+//* 04/29/02 Mannering Remove EIGHTBITSRAM, Combined DOUBLEBUFFER with
-+//* BITSWAP, added FPGA token
-+//* 05/03/02 Mannering cleanup token changed by the new routine names
-+//* 05/06/02 Mannering Add tokens OUTBAND and INBAND for codec commands
-+//* If both OUTBAND and INBAND are 0 codec register are
-+//* memory mapped.
-+//* 05/29/2002 S.Yim Removed AD1X, AFEDEV
-+//* 08/31/2002 Paul Hunt Added PERTONE_EQ and HYBRID_SWITCH for ar0700mp
-+//* 09/12/2002 Paul Hunt Added support for ar0700db target.
-+//* 08/07/2002 U.Dasgupta Turned off MARGIN_DELTA_RETRAIN feature for ISDN platforms
-+//* 11/14/2002 Paul Hunt Merged AX5 MR6 PC modifications into AR7 codebase, specifically
-+//* turned off MARGIN_DELTA_RETRAIN feature for ar0700db target
-+//* 08/26/2002 N. Warke Added DUAL_TEQ token. Active only for Ax7 target
-+//* 09/26/2002 Mannering Add token CODEC_EMU for codec emulator board
-+//* 10/15/2002 Iyer/Molla Added DMT_BIS token for DELT support
-+//* 10/21/2002 A. Redfern Added PHY_EC_ENABLE and PHY_PATH_ENABLE tokens
-+//* 10/23/2002 A. Redfern Removed LINE_DIAG token
-+//* 10/28/2002 J. Bergsagel Cleaned up old targets and cleaned up the token list
-+//* 10/30/2002 A. Redfern Added PHY_TDW_ENABLE
-+//* 11/01/2002 A. Redfern Removed SMART_MARGIN token
-+//* 11/01/2002 Mustafa Turned on SPECTRAL_SHAPING features for Lucent AnyMedia O.69 Interop.
-+//* 11/15/2002 Yim/Mannering Added CODEC_EMU token for analog emulation board specifics
-+//* 11/15/2002 Iyer/Molla Added DEBUG_DELT and MEM_STR token to support DELT debug
-+//* 12/27/2002 Sameer V Added ATM_TC_HW token for Sangam.
-+//* 01/06/2003 J. Bergsagel Added default values for NLNOISEADJSNR, ARTT and DS_PWR_CUTBACK
-+//* 01/07/2003 S.Yim Modified ar0700db_diag target to turn on ISDN token
-+//* 01/22/2003 J. Bergsagel Added back in defines for the debug targets.
-+//* 01/21/2003 MCB Implemented Ax7 UNIT-MODULE modular software framework.
-+//* 01/31/2003 J. Bergsagel Made debug targets to be for the FPGA platform; non-debug for Sangam.
-+//* Turned off DUAL_TEQ, PHY_EC_ENABLE and PHY_PATH_ENABLE by default
-+//* for the Sangam (non-debug) targets.
-+//* Turned off OLAYDP token by default.
-+//* Turned off SWTC and turned on ATM_TC_HW by default for Sangam targets.
-+//* 01/29/2003 Sameer V Added ATMBERT_HW token for Sangam.
-+//* 02/04/2003 D. Mannering Added CO_PROFILE token
-+//* 02/19/2003 Sameer V Added back EXTERNBERT token for ar0700mp_dp and ar0700db_dp targets.
-+//* Disabled EXTERNBERT for debug target since it is not supported on the
-+//* FPGA platform.
-+//* 02/21/2003 A. Redfern Turned off OAM_EOC, AOC and BITSWAP (until memory issues are resolved).
-+//* Turned on DUAL_TEQ, PHY_PATH_ENABLE and PHY_EC_ENABLE.
-+//* 02/21/2003 D. Mannering Added DEBUG_DUMP.
-+//* 03/06/2003 J. Bergsagel Cleaned up tokens for each target and switched diag targets
-+//* over to the Sangam platform (instead of the FPGA platform).
-+//* 03/07/2003 J. Bergsagel Cleaned up TC and BERT tokens
-+//* 03/11/2003 J. Bergsagel Turned on AOC and BITSWAP for Sangam POTS and ISDN targets.
-+//* 03/20/2003 Mallesh Added SHALF token.
-+//* 03/24/2003 F. Mujica Enable hybrid selection
-+//* 03/26/2003 A. Redfern Removed PMEMSAVE_GHS (always = 1).
-+//* 04/08/2003 F. Mujica Renamed HYBRID_SWITCH token to PHY_HYB_ENABLE
-+//* 04/08/2003 J. Bergsagel Turned off PHY_HYB_ENABLE for _debug targets (FPGA board builds)
-+//* 04/09/2003 J. Bergsagel Turned on OLAYDP only for ar0700mp and ar0700db.
-+//* Turned on AOC, BITSWAP, and OAM_EOC for ar0700mp and ar0700db.
-+//* 04/09/2003 J. Bergsagel Corrected name "PHY_HYB_SELECT" to "PHY_HYB_ENABLE"
-+//* 04/15/2003 A. Redfern Turned on ECI_PULSECOM_INTEROP because phase optimization was enabled.
-+//* 05/05/2003 D. Mannering Review Comments - turn on AOC, EXTERNBERT, SHALF, for ar0700mp; amd
-+//* turn on AOC for ar0700db
-+//* 05/11/2003 Prashant S Added DMT_BIS token for AR7 Soft DI work
-+//* 05/13/2003 J. Bergsagel Turned on IMPROVED_STAT_SUPPORT_06_03_00 by default for necessary statistics
-+//* 05/15/2003 J. Bergsagel Turned off CO_PROFILE for diag targets.
-+//* 05/27/2003 U.Dasgupta Added NLNOISEADJSNR_EC token for ISDN - to take care of non-linear noise
-+//* (from ISDN splitter) compensation.
-+//* 06/02/2003 Z. Yang Added PHY_NDIAG_ENABLE token.
-+//* 06/02/2003 Z. Yang Added COMB_LINEDIAG_ENABLE token.
-+//* 06/05/2003 P. Hunt Turned on ATUC_CLEARDOWN_CHANGE token for all targets.
-+//* 06/05/2003 Mallesh Turned on CENTILLIUM_VENDORID_AND_TXRATE_CHNG to enable logging the vendor ID
-+//* for centillium and litespan
-+//* 06/05/2003 U.Dasgupta Turned on SHALF token for ISDN.
-+//* 06/06/2003 U.Dasgupta Turned on G.hs nonstandard field token for ar0700db target.
-+//* 06/12/2003 J. Bergsagel Changed *_debug targets to be for JTAG=1 instead of FPGA targets
-+//* IMPORTANT: For non-JTAG cases, "JTAG" should be undefined.
-+//* Therefore, "JTAG" should not have a default case at the bottom (JTAG 0)
-+//* 06/18/2003 A. Redfern Turned on spectral shaping token for all targets.
-+//* 06/23/2003 J. Bergsagel Turned off GHS_NON_STD_FIELD token for ar0700db until bugs are fixed.
-+//* 06/23/2003 U G Jani Undid the above change since the bug is fixed.
-+//* 06/27/2003 Mallesh Removed all the interop tokens which are no longer required.
-+//* 08/20/2003 J. Bergsagel Added default value for OVHD_PMDTEST_PARA and put default section
-+//* tokens in alphabetical order.
-+//* 10/09/2003 Hanyu Liu Defined token ADSL2_1BIT_TONE to support Rx one bit constellation.
-+//* 10/12/2003 Hanyu Liu Defined token ADSL2_BSWP for bitswap.
-+//* 10/20/2003 Xiaohui Li Added READSL2_ENABLE token.
-+//* 12/01/2003 Seungmok Oh Added TXDF2B_PROFILING token, which is active only for POTS target.
-+//* 12/09/2003 Jack Huang Turned on GHS_NON_STD_FIELD support for AR7 POTS targets
-+//* 12/16/2003 Mustafa T. Added the necessary definitions for diag target.
-+//*****************************************************************************************************
-+//*
-+//* The default flag settings are:
-+//*
-+//* -dATUC=1 -dSTD=0 -dISDN=0 -dTIPCI=0 -dTID=0 -dTII=0 -dAI=0
-+//* -dEVM2=0 -dEU=0 -dSL=0 -dSL_EVM=1 -dGLITE=0
-+//*
-+//* and are set after all the per-suffix options have had a chance to
-+//* set them. Each flag is only set if it has not previously been set, so
-+//* per-suffix settings can override defaults, and command-line defines can
-+//* override per-suffix settings.
-+//*
-+//*****************************************************************************
-+
-+
-+//* ===========================================================================
-+//* Suffix codes
-+//* The command-line can include -dOBJSFX_xxx to get a flag set
-+//* instead of explicitly setting each flag on each CC/ASM command-line.
-+//* and the object suffix will control the settings of "feature" constants.
-+//* ===========================================================================
-+//
-+//* ===========================================================================
-+// Flag settings for new suffixes (in alphabetical order of suffix)
-+// Each suffix has to specify only those flags which differ from the
-+// default settings.
-+//* ===========================================================================
-+// NOTE: Try to keep feature flags in alphabetical order to ease maintenance.
-+//* ===========================================================================
-+//*
-+
-+#define CHIPSET_ID_UNKN '?'
-+#define CHIPSET_ID_AH 'H'
-+#define CHIPSET_ID_AP 'P'
-+#define CHIPSET_ID_AR 'R'
-+#define CHIPSET_ID_ARV 'R'
-+#define CHIPSET_ID_AT 'T'
-+#define CHIPSET_ID_AU 'U'
-+
-+#define CHIPSET_ID2_GENERIC '0'
-+#define CHIPSET_ID2_ARV 'R'
-+
-+ #define DSPDP_IMAGE_ID_STANDARD(code) ( \
-+ STANDARD_is_MULTIMODE(code) ? "M" : \
-+ STANDARD_is_GDMT(code) ? "D" : \
-+ STANDARD_is_GLITE(code) ? "L" : \
-+ STANDARD_is_T1413(code) ? "T" : "_")
-+
-+ #define DSPDP_IMAGE_ID_SERVICE(code) ( \
-+ SERVICE_is_POTS(code) ? "P" : \
-+ SERVICE_is_ISDN_ANNEXB(code) ? "B" : \
-+ SERVICE_is_ISDN_ANNEXC(code) ? "C" : \
-+ SERVICE_is_ISDN_PROP(code) ? "I" : "")
-+
-+// Bit-codes for feature byte in new version.
-+//
-+// 0000 0000
-+// |||| ||||
-+// |||| |||+ -- POTS
-+// |||| ||+---- ISDN_ANNEXB
-+// |||| |+----- ISDN_ANNEXC
-+// |||| +------ ISDN_PROP
-+// |||+--------
-+// ||+--------- GHS
-+// |+---------- GLITE
-+// +----------- T1413
-+//
-+//
-+#define FEATURE_BIT_T1413 0x80
-+#define FEATURE_BIT_GLITE 0x40
-+#define FEATURE_BIT_GHS 0x20
-+#define FEATURE_BIT_ISDN_PROP 0x08
-+#define FEATURE_BIT_ISDN_ANNEXC 0x04
-+#define FEATURE_BIT_ISDN_ANNEXB 0x02
-+#define FEATURE_BIT_POTS 0x01
-+
-+#define STANDARD_BITS_MASK (FEATURE_BIT_T1413 | FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
-+#define STANDARD_BITS_T1413 FEATURE_BIT_T1413
-+#define STANDARD_BITS_GHS FEATURE_BIT_GHS
-+#define STANDARD_BITS_GLITE (FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
-+#define STANDARD_BITS_GDMT (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)
-+#define STANDARD_BITS_MULTIMODE (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)
-+
-+#define SERVICE_BIT_ISDN_ANNEXB FEATURE_BIT_ISDN_ANNEXB
-+#define SERVICE_BIT_ISDN_ANNEXC FEATURE_BIT_ISDN_ANNEXC
-+#define SERVICE_BIT_ISDN_PROP FEATURE_BIT_ISDN_PROP
-+#define SERVICE_BIT_POTS FEATURE_BIT_POTS
-+
-+//
-+// Debug new-style suffixes
-+//
-+//
-+
-+#if defined(OBJSFX_ar0700db_debugobj)
-+#ifndef OBJSFX_ar0700dbobj
-+#define OBJSFX_ar0700dbobj 1
-+#endif
-+// Here, in alphabetic order, are the feature tokens that
-+// distinguish this suffix from its non-_debug partner:
-+// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
-+
-+#ifndef JTAG
-+#define JTAG 1
-+#endif
-+
-+#elif defined(OBJSFX_ar0700mp_debugobj)
-+#ifndef OBJSFX_ar0700mpobj
-+#define OBJSFX_ar0700mpobj 1
-+#endif
-+// Here, in alphabetic order, are the feature tokens that
-+// distinguish this suffix from its non-_debug partner:
-+// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
-+
-+#ifndef ADSL2_BSWP
-+#define ADSL2_BSWP 1
-+#endif
-+#ifndef AOC
-+#define AOC 1
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 1
-+#endif
-+#ifndef DEBUG_ADSL2
-+#define DEBUG_ADSL2 0
-+#endif
-+#ifndef DEBUG_LOG
-+#define DEBUG_LOG 0
-+#endif
-+#ifndef GHS_NON_STD_FIELD
-+#define GHS_NON_STD_FIELD 1
-+#endif
-+#ifndef JTAG
-+#define JTAG 1
-+#endif
-+#endif // end of the series of "#elif defined" for debug targets
-+
-+
-+//
-+// Standard new-style suffixes for operational and mfgr'ing diag.
-+//
-+
-+#if defined(OBJSFX_ar0700dbobj)
-+#define CHIPSET_AR07 1
-+#define PLATFORM_AR0700 1
-+#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
-+#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
-+#define DSPDP_CHIPSET_GEN 7
-+#define DSPDP_HARDWARE_REV1 '0'
-+#define DSPDP_HARDWARE_REV2 '0'
-+#define DSPDP_FEATURE_CODE (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
-+#ifndef AOC
-+#define AOC 1
-+#endif
-+// ATM_TC_HW and SWTC are mutually exclusive
-+#ifndef ATM_TC_HW
-+#define ATM_TC_HW 1
-+#endif
-+#ifndef SWTC
-+#define SWTC 0
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 1
-+#endif
-+#ifndef EXTERNBERT
-+#define EXTERNBERT 0
-+#endif
-+#ifndef GHS_NON_STD_FIELD
-+#define GHS_NON_STD_FIELD 1
-+#endif
-+#ifndef MARGIN_DELTA_RETRAIN
-+#define MARGIN_DELTA_RETRAIN 0
-+#endif
-+#ifndef NLNOISEADJSNR_EC
-+#define NLNOISEADJSNR_EC 1
-+#endif
-+#ifndef OLAYDP
-+#define OLAYDP 1
-+#endif
-+#ifndef SHALF
-+#define SHALF 1
-+#endif
-+
-+
-+#elif defined(OBJSFX_ar0700db_diagobj)
-+#define CHIPSET_AR07 1
-+#define PLATFORM_AR0700 1
-+#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
-+#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
-+#define DSPDP_CHIPSET_GEN 7
-+#define DSPDP_HARDWARE_REV1 '0'
-+#define DSPDP_HARDWARE_REV2 '0'
-+#define DSPDP_FEATURE_CODE (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
-+#ifndef AOC
-+#define AOC 0
-+#endif
-+// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
-+#ifndef ATM_TC_HW
-+#define ATM_TC_HW 0
-+#endif
-+#ifndef SWTC
-+#define SWTC 0
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 0
-+#endif
-+#ifndef CO_PROFILE
-+#define CO_PROFILE 0
-+#endif
-+#ifndef MARGIN_DELTA_RETRAIN
-+#define MARGIN_DELTA_RETRAIN 0
-+#endif
-+#ifndef MFGR_DIAG
-+#define MFGR_DIAG 1
-+#endif
-+#ifndef OAM_EOC
-+#define OAM_EOC 0
-+#endif
-+#ifndef OLAYDP
-+#define OLAYDP 0
-+#endif
-+#ifndef SNR_UPDATE
-+#define SNR_UPDATE 0
-+#endif
-+
-+#elif defined(OBJSFX_ar0700mpobj)
-+#define CHIPSET_AR07 1
-+#define PLATFORM_AR0700 1
-+#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
-+#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
-+#define DSPDP_CHIPSET_GEN 7
-+#define DSPDP_HARDWARE_REV1 '0'
-+#define DSPDP_HARDWARE_REV2 '0'
-+#define DSPDP_FEATURE_CODE (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
-+#ifndef AOC
-+#define AOC 1
-+#endif
-+// ATM_TC_HW and SWTC are mutually exclusive
-+#ifndef ADSL2_1BIT_TONE
-+#define ADSL2_1BIT_TONE 0
-+#endif
-+#ifndef ADSL2_BSWP
-+#define ADSL2_BSWP 1
-+#endif
-+#ifndef ATM_TC_HW
-+#define ATM_TC_HW 1
-+#endif
-+#ifndef SWTC
-+#define SWTC 0
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 1
-+#endif
-+#ifndef EXTERNBERT
-+#define EXTERNBERT 0
-+#endif
-+#ifndef OLAYDP
-+#define OLAYDP 1
-+#endif
-+#ifndef DMT_BIS
-+#define DMT_BIS 1
-+#endif
-+#ifndef SHALF
-+#define SHALF 1
-+#endif
-+#ifndef MEM_STR
-+#define MEM_STR 0
-+#endif
-+#ifndef DS_LOOP_BACK
-+#define DS_LOOP_BACK 0
-+#endif
-+#ifndef LOOP_BACK_DEBUG
-+#define LOOP_BACK_DEBUG 0
-+#endif
-+#ifndef US_LOOP_BACK
-+#define US_LOOP_BACK 0
-+#endif
-+#ifndef OVHD_PMDTEST_PARA
-+#define OVHD_PMDTEST_PARA 0
-+#endif
-+#ifndef DS_RX_CODEWORD
-+#define DS_RX_CODEWORD 1
-+#endif
-+#ifndef READSL2_ENABLE
-+#define READSL2_ENABLE 1
-+#endif
-+#ifndef GHS_NON_STD_FIELD
-+#define GHS_NON_STD_FIELD 1
-+#endif
-+
-+#elif defined(OBJSFX_ar0700mp_diagobj)
-+#define CHIPSET_AR07 1
-+#define PLATFORM_AR0700 1
-+#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
-+#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
-+#define DSPDP_CHIPSET_GEN 7
-+#define DSPDP_HARDWARE_REV1 '0'
-+#define DSPDP_HARDWARE_REV2 '0'
-+#define DSPDP_FEATURE_CODE (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
-+#ifndef ADSL2_BSWP
-+#define ADSL2_BSWP 0
-+#endif
-+#ifndef AOC
-+#define AOC 0
-+#endif
-+// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
-+#ifndef ATM_TC_HW
-+#define ATM_TC_HW 0
-+#endif
-+#ifndef SWTC
-+#define SWTC 0
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 0
-+#endif
-+#ifndef CO_PROFILE
-+#define CO_PROFILE 0
-+#endif
-+#ifndef DMT_BIS
-+#define DMT_BIS 0
-+#endif
-+#ifndef MARGIN_DELTA_RETRAIN
-+#define MARGIN_DELTA_RETRAIN 0
-+#endif
-+#ifndef MFGR_DIAG
-+#define MFGR_DIAG 1
-+#endif
-+#ifndef OAM_EOC
-+#define OAM_EOC 0
-+#endif
-+#ifndef OLAYDP
-+#define OLAYDP 0
-+#endif
-+#ifndef SNR_UPDATE
-+#define SNR_UPDATE 0
-+#endif
-+#ifndef US_CRC_RETRAIN
-+#define US_CRC_RETRAIN 0
-+#endif
-+#ifndef ADSL2_BSWP
-+#define ADSL2_BSWP 0
-+#endif
-+#ifndef DMT_BIS
-+#define DMT_BIS 0
-+#endif
-+#ifndef DS_RX_CODEWORD
-+#define DS_RX_CODEWORD 0
-+#endif
-+
-+#else
-+#define DSPDP_CHIPSET_ID CHIPSET_ID_UNKN
-+#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
-+#define DSPDP_CHIPSET_GEN 0
-+#define DSPDP_HARDWARE_REV1 '0'
-+#define DSPDP_HARDWARE_REV2 '0'
-+#define DSPDP_FEATURE_CODE 0
-+#endif
-+
-+// For use in checking the code in drivers -- indented to avoid .h->.ah
-+ #define STANDARD_is_T1413(code) (!(((code) & STANDARD_BITS_MASK) ^ STANDARD_BITS_T1413))
-+ #define STANDARD_is_GLITE(code) (!(((code) & STANDARD_BITS_MASK) ^ STANDARD_BITS_GLITE))
-+ #define STANDARD_is_GHS(code) (((code) & STANDARD_BITS_MASK) & STANDARD_BITS_GHS)
-+ #define STANDARD_is_GDMT(code) (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
-+ #define STANDARD_is_MULTIMODE(code) (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
-+ #define SERVICE_is_POTS(code) ((code) & SERVICE_BIT_POTS)
-+ #define SERVICE_is_ISDN_ANNEXB(code) ((code) & SERVICE_BIT_ISDN_ANNEXB)
-+ #define SERVICE_is_ISDN_ANNEXC(code) ((code) & SERVICE_BIT_ISDN_ANNEXC)
-+ #define SERVICE_is_ISDN_PROP(code) ((code) & SERVICE_BIT_ISDN_PROP)
-+
-+#define STANDARD_T1413 (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ STANDARD_BITS_T1413))
-+#define STANDARD_GLITE (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ STANDARD_BITS_GLITE))
-+#define STANDARD_GHS ((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) & STANDARD_BITS_GHS)
-+#define STANDARD_GDMT (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
-+#define STANDARD_MULTIMODE (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
-+
-+#define SERVICE_POTS (DSPDP_FEATURE_CODE & SERVICE_BIT_POTS)
-+#define SERVICE_ISDN_ANNEXB (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXB)
-+#define SERVICE_ISDN_ANNEXC (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXC)
-+#define SERVICE_ISDN_PROP (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_PROP)
-+#define SERVICE_ISDN (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_ANNEXC | SERVICE_ISDN_PROP)
-+
-+
-+//
-+// Backwards compatibility with old tokens
-+//
-+
-+#if (SERVICE_POTS)
-+#ifndef ISDN
-+#define ISDN 0
-+#endif
-+#endif
-+
-+#if (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_PROP)
-+#ifndef ISDN
-+#define ISDN 1
-+#endif
-+#endif
-+
-+
-+//
-+//* ===========================================================================
-+// More Default settings
-+//* ===========================================================================
-+//
-+
-+//
-+// BEGIN Could automatically generate showdefs code
-+//
-+#ifndef AOC
-+#define AOC 1
-+#endif
-+#ifndef ARTT
-+#define ARTT 0
-+#endif
-+#ifndef ATMBERT
-+#define ATMBERT 0
-+#endif
-+// ATM_TC_HW and SWTC are mutually exclusive
-+#ifndef ATM_TC_HW
-+#define ATM_TC_HW 1
-+#endif
-+#if ATM_TC_HW
-+#ifndef ATMBERT_HW
-+#define ATMBERT_HW 1
-+#endif
-+#ifndef SWTC
-+#define SWTC 0
-+#endif
-+#else // else case for #if ATM_TC_HW
-+#ifndef ATMBERT_HW
-+#define ATMBERT_HW 0
-+#endif
-+#ifndef SWTC
-+#define SWTC 1
-+#endif
-+#endif // end of #if ATM_TC_HW
-+#ifndef ATM_TC_PATH1_ON
-+#define ATM_TC_PATH1_ON 0
-+#endif
-+#ifndef BITSWAP
-+#define BITSWAP 1
-+#endif
-+#ifndef COMB_LINEDIAG_ENABLE
-+#define COMB_LINEDIAG_ENABLE 0
-+#endif
-+#ifndef CODEC_EMU
-+#define CODEC_EMU 0
-+#endif
-+#ifndef CO_PROFILE
-+#define CO_PROFILE 1
-+#endif
-+#ifndef DDC
-+#define DDC 0
-+#endif
-+#ifndef DEBUG_ADSL2
-+#define DEBUG_ADSL2 0
-+#endif
-+#ifndef DEBUG_DUMP
-+#define DEBUG_DUMP 0
-+#endif
-+#ifndef DEBUG_LOG
-+#define DEBUG_LOG 0
-+#endif
-+#ifndef DEV_DEBUG
-+#define DEV_DEBUG 0
-+#endif
-+#ifndef DS_LOOP_BACK
-+#define DS_LOOP_BACK 0
-+#endif
-+#ifndef DS_RX_CODEWORD
-+#define DS_RX_CODEWORD 1
-+#endif
-+#ifndef LOOP_BACK_DEBUG
-+#define LOOP_BACK_DEBUG 0
-+#endif
-+#ifndef US_LOOP_BACK
-+#define US_LOOP_BACK 0
-+#endif
-+#ifndef DPLL_MODE
-+#define DPLL_MODE 0
-+#endif
-+#ifndef DSPBIOSII
-+#define DSPBIOSII 0
-+#endif
-+#ifndef DMT_BIS
-+#define DMT_BIS 1
-+#endif
-+#ifndef ADSL2_1BIT_TONE
-+#define ADSL2_1BIT_TONE 0
-+#endif
-+#ifndef ADSL2_BSWP
-+#define ADSL2_BSWP 1
-+#endif
-+#ifndef MEM_STR
-+#define MEM_STR 0
-+#endif
-+#ifndef DS_PWR_CUTBACK
-+#define DS_PWR_CUTBACK 0
-+#endif
-+#ifndef DUAL_TEQ
-+#define DUAL_TEQ 1
-+#endif
-+#ifndef EXTERNBERT
-+#define EXTERNBERT 0
-+#endif
-+#ifndef FPGA
-+#define FPGA 0
-+#endif
-+#ifndef INBAND
-+#define INBAND 0
-+#endif
-+#ifndef ISDN
-+#define ISDN 0
-+#endif
-+#ifndef ISDN_DEBUG
-+#define ISDN_DEBUG 0
-+#endif
-+#ifndef LINE_DIAG
-+#define LINE_DIAG 1
-+#endif
-+#ifndef LOOP_BACK_DEBUG
-+#define LOOP_BACK_DEBUG 0
-+#endif
-+#ifndef MANUFACTURING_TESTS
-+#define MANUFACTURING_TESTS 0
-+#endif
-+#ifndef MARGIN_DELTA_RETRAIN
-+#define MARGIN_DELTA_RETRAIN 1
-+#endif
-+#ifndef MEM_STR
-+#define MEM_STR 0
-+#endif
-+#ifndef MFGR_DIAG
-+#define MFGR_DIAG 0
-+#endif
-+#ifndef NLNOISEADJSNR
-+#define NLNOISEADJSNR 0
-+#endif
-+#ifndef NLNOISEADJSNR_EC
-+#define NLNOISEADJSNR_EC 0
-+#endif
-+#ifndef NTR_MODE
-+#define NTR_MODE 0
-+#endif
-+#ifndef OAM_EOC
-+#define OAM_EOC 1
-+#endif
-+#ifndef OLAYDP
-+#define OLAYDP 0
-+#endif
-+#ifndef OLAYDP_EMIF
-+#define OLAYDP_EMIF 0
-+#endif
-+#ifndef OLAYDP_2STEP
-+#define OLAYDP_2STEP 0
-+#endif
-+#ifndef OLAYDP_PCI
-+#define OLAYDP_PCI 0
-+#endif
-+#ifndef OUTBAND
-+#define OUTBAND 0
-+#endif
-+#ifndef OVHD_PMDTEST_PARA
-+#define OVHD_PMDTEST_PARA 0
-+#endif
-+#ifndef PERTONE_EQ
-+#define PERTONE_EQ 0
-+#endif
-+#ifndef PHY_EC_ENABLE
-+#define PHY_EC_ENABLE 1
-+#endif
-+#ifndef PHY_HYB_ENABLE
-+#define PHY_HYB_ENABLE 1
-+#endif
-+#ifndef PHY_NDIAG_ENABLE
-+#define PHY_NDIAG_ENABLE 0
-+#endif
-+#ifndef PHY_PATH_ENABLE
-+#define PHY_PATH_ENABLE 1
-+#endif
-+#ifndef PHY_TDW_ENABLE
-+#define PHY_TDW_ENABLE 0
-+#endif
-+#ifndef TC_ATM_PCIMASTER
-+#define TC_ATM_PCIMASTER 0
-+#endif
-+#ifndef SEPARATE_TX_RX_BUFFERS
-+#define SEPARATE_TX_RX_BUFFERS 0
-+#endif
-+#ifndef SHALF
-+#define SHALF 0
-+#endif
-+#ifndef SPECTRAL_SHAPING
-+#define SPECTRAL_SHAPING 1
-+#endif
-+#ifndef SNR_UPDATE
-+#define SNR_UPDATE 1
-+#endif
-+#ifndef TC_DEBUG
-+#define TC_DEBUG 0
-+#endif
-+#ifndef TC_LOOPBACK
-+#define TC_LOOPBACK 0
-+#endif
-+#ifndef TESTMODE
-+#define TESTMODE 0
-+#endif
-+#ifndef TRELLIS
-+#define TRELLIS 1
-+#endif
-+#ifndef TXDF2B_PROFILING
-+#if (SERVICE_POTS & (!MFGR_DIAG) & (CO_PROFILE))
-+#define TXDF2B_PROFILING 1
-+#else
-+#define TXDF2B_PROFILING 0
-+#endif
-+#endif
-+#ifndef US_CRC_RETRAIN
-+#define US_CRC_RETRAIN 1
-+#endif
-+#ifndef US_LOOP_BACK
-+#define US_LOOP_BACK 0
-+#endif
-+#ifndef USB
-+#define USB 0
-+#endif
-+#ifndef READSL2_ENABLE
-+#define READSL2_ENABLE 1
-+#endif
-+
-+// Interop tokens
-+#ifndef GHS_NON_STD_FIELD
-+#define GHS_NON_STD_FIELD 0
-+#endif
-+#ifndef LUCENT_ANYMEDIA_ENIATT_INTEROP
-+#define LUCENT_ANYMEDIA_ENIATT_INTEROP 0
-+#endif
-+
-+
-+//
-+// END Could automatically generate showdefs code
-+//
-+#if DSPDP_FEATURE_CODE
-+#else
-+// Unrecognized_suffix____check_spelling
-+#endif
-+//
-+// LNK_CMD is set when running CPP to generate lnk_cpe.cmd file
-+// -- the linker is not happy when it sees C code show up in the
-+// result!
-+//
-+#ifndef LNK_CMD
-+extern int compile_happy; // Keep the compiler from complaining about an empty file
-+#endif
-+
-+#endif
-+
-diff -urN linux.old/drivers/atm/sangam_atm/env_def_typedefs.h linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h
---- linux.old/drivers/atm/sangam_atm/env_def_typedefs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h 2005-07-10 08:02:01.447110904 +0200
-@@ -0,0 +1,228 @@
-+#ifndef __ENV_DEF_TYPEDEFS_H__
-+#define __ENV_DEF_TYPEDEFS_H__ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: Define data types for C and TMS320C6x C compilers
-+********************************************************************************
-+*
-+* FILE NAME: dpsys_typedefs.h
-+*
-+* DESCRIPTION:
-+* This file contains the main typedefs that we need.
-+*
-+* HISTORY:
-+*
-+* 03/11/97 Bob Lee Created
-+* 03/13/97 Chishtie
-+* 03/14/97 Bob Lee Format change to meet "Engineering Model
-+* - System Architucture Specification"
-+* Rev AP3. Jan. 29, 1997
-+* 07/21/00 Barnett Moved many common typedefs from
-+* host i/f header file to here.
-+* 03/30/01 Barnett Mod's per driver team feedback.
-+* Some tokens cannot be def'ed
-+* if _WINDEF_ is def'ed.
-+* 04/05/01 Barnett Added DSPDP_ prefix to tokens that originate
-+* in the public interface.
-+* 06/01/01 J. Bergsagel Modified to add standard typedefs
-+* 07/25/01 J. Bergsagel Changed name from typedefs.h to dpsys_typedefs.h
-+* 07/30/01 J. Bergsagel Moved typedefs that were conflicting with Windows
-+* driver software to the "#ifndef _WINDEF_" section.
-+* 08/09/01 S. Yim Moved FALSE/TRUE definitions from ctl_interface_u.h
-+* (conflict with BIOS/std.h)
-+* 09/03/01 S. Yim Do not include typedef char and float if _STD defined
-+* (conflict with BIOS/std.h)
-+* 01/21/03 MCB Implemented Ax7 UNIT-MODULE modular software framework.
-+* 03/20/03 Mallesh Defined size of basic variables
-+* 03/27/03 F. Mujica Added SINT40 and UINT40 definitions.
-+*
-+* (C) Copyright Texas Instruments Inc. 1997-2001. All rights reserved.
-+*******************************************************************************/
-+
-+// Common type definitions
-+
-+// Basic constants needed everywhere
-+#ifndef STD_
-+#define FALSE 0
-+#define TRUE 1
-+#endif
-+
-+// Read-Write Data Types
-+typedef signed char SINT8; // Signed 8-bit integer (7-bit magnitude)
-+typedef unsigned char UINT8; // Unsigned 8-bit integer
-+typedef signed short SINT16; // Signed 16-bit integer (15-bit magnitude)
-+typedef unsigned short UINT16; // Unsigned 16-bit integer
-+typedef signed int SINT32; // Signed 32-bit integer (31-bit magnitude)
-+typedef unsigned int UINT32; // Unsigned 32-bit integer
-+typedef long signed int SINT40; // Long signed 40-bit integer
-+typedef long unsigned int UINT40; // Long unsigned 40-bit integer
-+
-+// All pointers are 32 bits long
-+typedef SINT8 *PSINT8; // Pointer to SINT8
-+typedef UINT8 *PUINT8; // Pointer to UINT8
-+typedef SINT16 *PSINT16; // Pointer to SINT16
-+typedef UINT16 *PUINT16; // Pointer to UINT16
-+typedef SINT32 *PSINT32; // Pointer to SINT32
-+typedef UINT32 *PUINT32; // Pointer to UINT32
-+
-+#define SIZEOF_SINT8 1
-+#define SIZEOF_UINT8 1
-+#define SIZEOF_SINT16 2
-+#define SIZEOF_UINT16 2
-+#define SIZEOF_SINT32 4
-+#define SIZEOF_UINT32 4
-+#define SIZEOF_SINT40 8
-+#define SIZEOF_UINT40 8
-+
-+// Size of Read-Write Data Types - in bytes
-+#define SIZEOF_char 1
-+#define SIZEOF_Int8 1
-+#define SIZEOF_UChar 1
-+#define SIZEOF_UInt8 1
-+#define SIZEOF_Float 4
-+#define SIZEOF_Double 8
-+#define SIZEOF_byte 1
-+
-+// Read-Only Data Types - should be only used for ROM code
-+typedef const char CharRom; // 8 bit signed character
-+typedef const signed char Int8Rom; // 8 bit signed integer
-+typedef const unsigned char UCharRom; // 8 bit unsigned character
-+typedef const unsigned char UInt8Rom; // 8 bit unsigned integer
-+typedef const float FloatRom; // IEEE 32-bit
-+typedef const double DoubleRom; // IEEE 64-bit
-+
-+#ifndef _WINDEF_
-+
-+// Read-Write Data Types
-+typedef signed char Int8; // 8 bit signed integer
-+typedef unsigned char UChar; // 8 bit unsigned character
-+typedef unsigned char UInt8; // 8 bit unsigned integer
-+#ifndef STD_
-+typedef char Char; // 8 bit signed character
-+typedef float Float; // IEEE 32-bit
-+#endif
-+typedef double Double; // IEEE 64-bit
-+typedef signed char byte; // 8 bit signed integer
-+
-+
-+// These typedefs collide with those in Win2k DDK inc\WINDEF.H
-+
-+// common type definition
-+typedef unsigned char BYTE; // 8-bit
-+typedef signed short SHORT; // 16-bit signed
-+typedef unsigned short WORD; // 16-bit
-+typedef unsigned int DWORD; // 32-bit, TI DSP has 40 bit longs
-+
-+// All pointers are 32 bits long
-+typedef BYTE *PBYTE; // pointer to 8 bit data
-+typedef unsigned char *PCHAR; // pointer to 8 bit data
-+typedef SHORT *PSHORT; // pointer to 16 bit data
-+typedef WORD *PWORD; // pointer to 16 bit data
-+typedef DWORD *PDWORD; // pointer to 32 bit data
-+
-+#endif // #ifndef _WINDEF_
-+
-+
-+#define SIZEOF_BYTE 1
-+#define SIZEOF_SHORT 2
-+#define SIZEOF_WORD 2
-+#define SIZEOF_DWORD 4
-+#define SIZEOF_PCHAR 4
-+#define SIZEOF_PWORD 4
-+#define SIZEOF_PDWORD 4
-+
-+// Size of Read-Only Data Types - in bytes
-+#define SIZEOF_CharRom 1
-+#define SIZEOF_Int8Rom 1
-+#define SIZEOF_UCharRom 1
-+#define SIZEOF_UInt8Rom 1
-+#define SIZEOF_FloatRom 4
-+#define SIZEOF_DoubleRom 8
-+
-+#define SIZEOF_complex_byte (2*SIZEOF_byte)
-+#define SIZEOF_PTR_complex_byte 4
-+typedef struct {
-+ byte re;
-+ byte im;
-+} complex_byte, *PTR_complex_byte;
-+
-+#define SIZEOF_complex_short 4
-+#define SIZEOF_PTR_complex_short 4
-+typedef struct {
-+ short re;
-+ short im;
-+} complex_short, *PTR_complex_short;
-+
-+#define SIZEOF_complex_int 8
-+#define SIZEOF_PTR_complex_int 4
-+typedef struct {
-+ int re;
-+ int im;
-+} complex_int, *PTR_complex_int;
-+
-+typedef struct {
-+ int high;
-+ unsigned int low;
-+} int64;
-+
-+typedef struct {
-+ int64 real;
-+ int64 imag;
-+} complex_int64;
-+
-+#define SIZEOF_PVOID 4
-+typedef void *PVOID; // pointer to void
-+
-+//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-+
-+#if defined(_TMS320C6X) // TMS320C6xx type definitions
-+
-+// Read-Write Data Types
-+typedef short Int16; // 16 bit signed integer
-+typedef unsigned short UInt16; // 16 bit unsigned integer
-+typedef int Int32; // 32 bit signed integer
-+typedef unsigned int UInt32; // 32 bit unsigned signed integer
-+typedef long Long40; // 40 bit signed integer
-+typedef unsigned long ULong40; // 40 bit unsigned signed integer
-+
-+// Size of Read-Write Data Types - in bytes
-+#define SIZEOF_Int16 2
-+#define SIZEOF_UInt16 2
-+#define SIZEOF_Int32 4
-+#define SIZEOF_UInt32 4
-+#define SIZEOF_Long40 5
-+#define SIZEOF_ULong40 5
-+
-+// Read-Only Data Types - should be only used for ROM code
-+typedef const short Int16Rom; // 16 bit signed integer
-+typedef const unsigned short UInt16Rom; // 16 bit unsigned integer
-+typedef const int Int32Rom; // 32 bit signed integer
-+typedef const unsigned int UInt32Rom; // 32 bit unsigned signed integer
-+typedef const long Long40Rom; // 40 bit signed integer
-+typedef const unsigned long ULong40Rom; // 40 bit unsigned signed integer
-+
-+// Size of Read-Only Data Types - in bytes
-+#define SIZEOF_Int16Rom 2
-+#define SIZEOF_UInt16Rom 2
-+#define SIZEOF_Int32Rom 4
-+#define SIZEOF_UInt32Rom 4
-+#define SIZEOF_Long40Rom 5
-+#define SIZEOF_ULong40Rom 5
-+
-+#else // 32 bits PC Host type definitions
-+
-+// Read-Write Data Types
-+typedef short Int16; // 16 bit signed integer
-+typedef unsigned short UInt16; // 16 bit unsigned integer
-+typedef int Int32; // 32 bit signed integer
-+typedef unsigned int UInt32; // 32 bit unsigned integer
-+
-+// Read-Only Data Types - should be only used for ROM code
-+typedef const short Int16Rom; // 16 bit signed integer
-+typedef const unsigned short UInt16Rom; // 16 bit unsigned integer
-+typedef const int Int32Rom; // 32 bit signed integer
-+typedef const unsigned int UInt32Rom; // 32 bit unsigned integer
-+
-+#endif
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/Makefile linux.dev/drivers/atm/sangam_atm/Makefile
---- linux.old/drivers/atm/sangam_atm/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/Makefile 2005-07-10 08:02:01.448110752 +0200
-@@ -0,0 +1,35 @@
-+# File: drivers/net/avalanche_cpmac/Makefile
-+#
-+# Makefile for the Linux network (CPMAC) device drivers.
-+#
-+
-+
-+O_TARGET := tiatm.o
-+obj-$(CONFIG_MIPS_SANGAM_ATM) += tiatm.o
-+list-multi := tiatm.o
-+
-+tiatm-objs := tn7atm.o tn7dsl.o tn7sar.o dsl_hal_api.o dsl_hal_support.o cpsar.o aal5sar.o
-+
-+EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
-+
-+ifeq ($(ANNEX),B)
-+EXTRA_CFLAGS += -DANNEX_B -DB
-+else
-+ifeq ($(ANNEX),C)
-+EXTRA_CFLAGS += -DANNEX_C -DC
-+else
-+EXTRA_CFLAGS += -DANNEX_A -DP
-+endif
-+endif
-+
-+
-+include $(TOPDIR)/Rules.make
-+
-+tiatm.o: $(tiatm-objs)
-+ $(LD) -r -o $@ $(tiatm-objs)
-+
-+#avalanche_cpmac.o: $(avalanche_cpmac-objs)
-+# $(LD) -r -o $@ $(avalanche_cpmac-objs)
-+
-+clean:
-+ rm -f core *.o *.a *.s
-diff -urN linux.old/drivers/atm/sangam_atm/queue.h linux.dev/drivers/atm/sangam_atm/queue.h
---- linux.old/drivers/atm/sangam_atm/queue.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/queue.h 2005-07-10 08:02:01.448110752 +0200
-@@ -0,0 +1,167 @@
-+
-+#if !defined( __QUEUE_H__ )
-+#define __QUEUE_H__
-+
-+typedef spinlock_t OS_SPIN_LOCK;
-+#define osFreeSpinLock(pLock) while(0)
-+void osAcquireSpinLock(OS_SPIN_LOCK *pLock);
-+void osReleaseSpinLock(OS_SPIN_LOCK *pLock);
-+void osAllocateSpinLock(OS_SPIN_LOCK *pLock);
-+
-+//#define osAcquireSpinLock(pLock) spin_lock(pLock)
-+//#define osReleaseSpinLock(pLock) spin_unlock(pLock)
-+//#define osAllocateSpinLock(pLock) spin_lock_init(pLock)
-+
-+
-+typedef struct _TI_LIST_ENTRY {
-+ struct _TI_LIST_ENTRY *Flink;
-+ struct _TI_LIST_ENTRY *Blink;
-+} TI_LIST_ENTRY, *PTI_LIST_ENTRY, TQE, *PTQE;
-+
-+typedef struct _TIATM_LIST_ENTRY
-+{
-+ TI_LIST_ENTRY Link;
-+} TIATM_LIST_ENTRY, *PTIATM_LIST_ENTRY;
-+
-+//-------------------------------------------------------------------------
-+// QueueInitList -- Macro which will initialize a queue to NULL.
-+//-------------------------------------------------------------------------
-+#define QueueInitList(_L) (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY)0;
-+
-+//-------------------------------------------------------------------------
-+// QueueEmpty -- Macro which checks to see if a queue is empty.
-+//-------------------------------------------------------------------------
-+#define QueueEmpty(_L) (QueueGetHead((_L)) == (PTIATM_LIST_ENTRY)0)
-+
-+//-------------------------------------------------------------------------
-+// QueueGetHead -- Macro which returns the head of the queue, but does not
-+// remove the head from the queue.
-+//-------------------------------------------------------------------------
-+#define QueueGetHead(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Flink))
-+
-+#define QueueGetNext(Elem) ((PTIATM_LIST_ENTRY)((Elem)->Link.Flink))
-+
-+//-------------------------------------------------------------------------
-+// QueuePushHead -- Macro which puts an element at the head of the queue.
-+//-------------------------------------------------------------------------
-+#define QueuePushHead(_L,_E) \
-+ if (!((_E)->Link.Flink = (_L)->Link.Flink)) \
-+ { \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
-+ } \
-+(_L)->Link.Flink = (PTI_LIST_ENTRY)(_E);
-+
-+//-------------------------------------------------------------------------
-+// QueueRemoveHead -- Macro which removes the head of the head of queue.
-+//-------------------------------------------------------------------------
-+#define QueueRemoveHead(_L) \
-+{ \
-+ PTIATM_LIST_ENTRY ListElem; \
-+ if (ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink) \
-+ { \
-+ if(!((_L)->Link.Flink = ListElem->Link.Flink)) \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
-+ } \
-+}
-+
-+//-------------------------------------------------------------------------
-+// QueuePutTail -- Macro which puts an element at the tail (end) of the queue.
-+//-------------------------------------------------------------------------
-+#define QueuePutTail(_L,_E) \
-+{ \
-+ if ((_L)->Link.Blink) \
-+ { \
-+ ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
-+ } \
-+ else \
-+ { \
-+ (_L)->Link.Flink = \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
-+ } \
-+ (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
-+}
-+
-+//-------------------------------------------------------------------------
-+// QueuePutTailWithLock -- Macro which puts an element at the tail (end) of
-+// the queue, using spin lock.
-+//-------------------------------------------------------------------------
-+#define QueuePutTailWithLock(_L,_E, pLock) \
-+{ \
-+ osAcquireSpinLock(pLock); \
-+ if ((_L)->Link.Blink) \
-+ { \
-+ ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
-+ } \
-+ else \
-+ { \
-+ (_L)->Link.Flink = \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
-+ } \
-+ (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
-+ osReleaseSpinLock(pLock); \
-+}
-+
-+//-------------------------------------------------------------------------
-+// QueueGetTail -- Macro which returns the tail of the queue, but does not
-+// remove the tail from the queue.
-+//-------------------------------------------------------------------------
-+#define QueueGetTail(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Blink))
-+
-+//-------------------------------------------------------------------------
-+// QueuePopHead -- Macro which will pop the head off of a queue (list), and
-+// return it (this differs only from queueremovehead only in
-+// the 1st line)
-+//-------------------------------------------------------------------------
-+#define QueuePopHead(_L) \
-+(PTIATM_LIST_ENTRY) (_L)->Link.Flink; QueueRemoveHead(_L);
-+
-+#define QueueRemoveTail(_L) \
-+{ \
-+ PTIATM_LIST_ENTRY ListElem; \
-+ ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
-+ if(ListElem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
-+ { \
-+ (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
-+ } \
-+ else \
-+ { \
-+ while(ListElem->Link.Flink != (PTI_LIST_ENTRY)(_L)->Link.Blink) \
-+ { \
-+ ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
-+ } \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY) ListElem; \
-+ ListElem->Link.Flink = (PTI_LIST_ENTRY)0; \
-+ } \
-+}
-+
-+#define QueueRemoveItem(_L, Elem) \
-+{ \
-+ PTIATM_LIST_ENTRY ListElem; \
-+ ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
-+ if(ListElem == Elem) \
-+ { \
-+ QueueRemoveHead(_L); \
-+ } \
-+ else \
-+ { \
-+ while(ListElem) \
-+ { \
-+ if(Elem == (PTIATM_LIST_ENTRY)ListElem->Link.Flink) \
-+ { \
-+ ListElem->Link.Flink = ((PTIATM_LIST_ENTRY)Elem)->Link.Flink; \
-+ if(Elem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
-+ (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
-+ break; \
-+ } \
-+ ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
-+ }\
-+ } \
-+ ((PTIATM_LIST_ENTRY)Elem)->Link.Flink = (PTI_LIST_ENTRY) 0; \
-+}
-+
-+#define QueuePopTail(_L) \
-+((PTIATM_LIST_ENTRY)((_L)->Link.Blink)); QueueRemoveTail(_L);
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/release.txt linux.dev/drivers/atm/sangam_atm/release.txt
---- linux.old/drivers/atm/sangam_atm/release.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/release.txt 2005-07-10 08:02:01.449110600 +0200
-@@ -0,0 +1,118 @@
-+This is release notes for AR7 Linux ATM driver.
-+
-+version 04.02.04.00
-+-------------------
-+
-+1. Corrected the conditional logic from logical AND to logical OR in the case
-+ of check for DSL line down condition. This is to fix PPPoA crashing
-+ problem when DSL line is unplugged.
-+
-+version 04.02.03.00
-+-------------------
-+1. Changed overlay page to static allocation.
-+2. Added flag to stop TX during channel closing.
-+3. Changed DMA memory allocation back to "GFP_ATOMIC" flag.
-+
-+version 04.02.02.00
-+-------------------
-+1. Changed DMA memory allocation from "GFP_ATOMIC" to "GFP_KERNEL" flag.
-+2. Added "DoMask" setting for VBR channel setup.
-+
-+version 04.02.01.01
-+-------------------
-+1. Modified priority check scheme per SPTC request.
-+
-+Version 04.02.01.00
-+-------------------
-+1. Add check to skb->priority to place packets to either normal or priority queue.
-+2. Add spin lock to increment and decrement of queued buffer number.
-+
-+Version 04.02.00.00
-+-------------------
-+Features:
-+1. Add MBS and CDVT QoS support for ATM driver.
-+2. Add "stop/start queue" for ToS application.
-+3. Add Showtime margin retrain based on EOC message.
-+4. Add EOC vendor ID customalization logic for Annex B.
-+5. Supports D3 datapump.
-+
-+Version 04.01.00.00
-+-------------------
-+Re-release of 04.00.07.00 for D1.1 datapump.
-+
-+Version 04.00.07.00
-+-------------------
-+Features:
-+1. Add marging retrain capability by setting following Adam2 Env.
-+ setenv enable_margin_retrain 1
-+ setenv margin_threshold xx, xx is in half db, i.e., 10 means 5db.
-+
-+Bugfixs:
-+1. New PDSP firmware that fix the F5 OAM cell loopback probelm in Cisco DSLAM.
-+
-+Version 04.00.06.00
-+-------------------
-+1. ATM interrupt pacing is defauted to 2 interrupts/s.
-+2. Rx Service MAX changed ftom 16 to 8.
-+
-+Version 04.00.05.00
-+-------------------
-+Features:
-+1. Add Adam2 env to disable the TurboDSL by entering "setenv TurboDSL 0".
-+2. Add ability to set interrupt pacing for ATM driver.
-+
-+Bugfixs:
-+1. Fixed the RFC2684 and CLIP problems for Cisco router.
-+2. Fixed LED blinking problem when DSL cable is unplugged.
-+3. Fixed problem that "selected mode" is not updated.
-+
-+Version 04.00.04.00
-+-------------------
-+Features:
-+1. Added feature so OAM F5 ping will not require a corresponding PVC channel to
-+ be setup.
-+2. Added timeout value for F5 OAM ping. The new command are "exxxpyyycdzzzt" for
-+ end-to-end and "sxxxpyyycdzzzt" for segment. "zzz" is timeout value in milli-second.
-+3. Added proc entry "avsar_pvc_table" to record received VPIs and VCIs. The format is
-+ vpi,vci
-+ seperated by new line. To search for PVCs, an application can do the following.
-+ i) Send a (or several) F5 OAM cell on a VPI/VPI pairs with command
-+ echo exxxpyyycd2t > /proc/sys/dev/dslmod
-+ ii) Wait >2ms or poll proc entry /proc/avalanche/avsar_oam_ping until the result
-+ indicates a failure. (It will be failed all the time with 2ms timeout.)
-+ iii) Repeat above two steps for new VPI/VCI pairs.
-+ iv) Check proc entry /proc/avalanche/avsar_pvc_table any time for PVCs that responded.
-+
-+Version 04.00.03.00
-+-------------------
-+Bug Fixs:
-+1. Fixed bug that caused crash when phone cable is unplugged.
-+2. Fixed LED operation for "flexible LEDs".
-+
-+Features:
-+1. Added the proc entry "avsar_oam_ping" to signal oam ping result.
-+ 0 - failed; 1 - success; 2 - in progress.
-+2. Added oam ping timeout env variable. The timeout can be specified by
-+ adding Adam2 env "oam_lb_timeout". The value is in millisecond.
-+
-+Version 04.00.02.00
-+-------------------
-+1. The driver uses hardware queue for Turbo DSL.
-+2. Added new modem statistics listed below:
-+ US and DS TX powers, atuc Vendor ID and revision, training mode selected,
-+ Hybrid Selected, and etc.
-+
-+Version 04.00.01.00
-+-------------------
-+
-+1. This driver release contains all the features that exists in AR5 Linux ATM
-+ 3.1 driver.
-+
-+2. F4 OAM generation is added.
-+
-+3. Software queuing is used for TURBO DSL.
-+
-+4. Porting guide "is created. Please look into that document for detailed
-+ information.
-+
-+
-diff -urN linux.old/drivers/atm/sangam_atm/syssw_version.h linux.dev/drivers/atm/sangam_atm/syssw_version.h
---- linux.old/drivers/atm/sangam_atm/syssw_version.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/syssw_version.h 2005-07-10 08:02:01.449110600 +0200
-@@ -0,0 +1,94 @@
-+#ifndef __SYSSW_VERSION_H__
-+#define __SYSSW_VERSION_H__ 1
-+
-+/*******************************************************************************
-+* FILE PURPOSE: DSL Driver API functions for Sangam
-+*
-+********************************************************************************
-+* FILE NAME: dsl_hal_basicapi.c
-+*
-+* DESCRIPTION:
-+* Contains basic DSL HAL APIs for Sangam
-+*
-+* (C) Copyright 2003-04, Texas Instruments, Inc.
-+* History
-+* Date Version Notes
-+* 14May03 0.00.00 RamP Original Version Created
-+* 14May03 0.00.01 RamP Initial Rev numbers inserted
-+* 14May03 0.00.02 RamP Bumped version numbers for Dsl Hal
-+* & dhalapp for alpha plus
-+* 19May03 0.00.03 MCB Bumped dslhal version number
-+* because of dependant changes
-+* wrt. linux-nsp atm drivers.
-+* 22May03 0.00.04 RamP Bumped dslhal & dhalapp buildnum
-+* for inner/outer pair & DGASP code
-+* 06Jun03 0.00.05 RamP Bumped up buildnum for LED, STM,
-+* interrupt processing, statistics
-+* and other pre-beta features
-+* 09Jun03 0.00.06 JEB Fixed error in DHALAPP bugfix/buildnum
-+* 09Jun03 0.00.07 RamP Bumped up buildnum for incremental
-+* changes to apis, statistics, memory
-+* fixes, parameter configurations
-+* 11Jun03 0.00.08 RamP Bumped up buildnum for Co profile
-+* free memory fix
-+* 12Jun03 0.00.09 JEB Bumped version numbers for AR7 1.00 Beta
-+* 02Jul03 0.00.10 ZT Bumped HAL version for overlay page
-+* 18Jul03 0.00.11 RamP Bumped HAL version for analog diags
-+* 22Jul03 0.00.12 JEB Bumped DHALAPP buildnum for analog diags
-+* 31Jul03 0.00.13 RamP Bumped HAL version for engr. drop
-+* 04Aug03 0.00.14 JEB Bumped HAL version buildnum for CHECKPOINT65 changes
-+* Bumped LINUX version buildnum for CHECKPOINT65 changes
-+* 06Aug03 0.00.15 MCB Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
-+* 13Aug03 0.00.16 MCB Set rev id's for D3/R1.1 (ADSL2).
-+* 21Aug03 0.00.17 JEB Bumped up build numbers for merge of code additions from D1
-+* 26Sep03 0.00.18 JEB Set rev id's for another D3/R1 (ADSL2).
-+* 14Oct03 0.00.19 JEB Bumped Linux minor number and reset bugfix number for release.
-+* Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
-+* 14Oct03 0.00.20 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
-+* 21Oct03 0.00.21 JEB Bumped build number on DSLHAL for CHECKPOINT16.
-+* 22Oct03 0.00.22 MCB Bumped all version numbers in support of D3R1 release.
-+* 27Oct03 0.00.23 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
-+* Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
-+* 30Oct03 0.00.24 JEB Bumped bugfix number on LINUXATM Version for next release.
-+* Bumped build numbers on DSLHAL and DHALAPP
-+* 31Oct03 0.00.25 MCB Bumped all version numbers in support of D3R2 release.
-+* 14Nov03 0.00.26 JEB Bumped build numbers on DSLHAL and DHALAPP
-+* Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
-+* 20Nov03 0.00.27 JEB Bumped build number on DSLHAL.
-+* Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
-+* 21Nov03 0.00.28 MCB Bumped all version numbers in support of D3R2 release.
-+* 21Nov03 0.00.29 JEB Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
-+* 16Dec03 0.00.30 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
-+* 21Dec03 0.00.31 MCB Bumped all version numbers in support of D3R2 release.
-+* 05Jan04 0.00.32 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
-+* 15Jan04 0.00.33 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
-+* 26Jan04 0.00.34 JEB Changed Linux ATM version number to be 04.02.03.00.
-+* 27Jan04 0.00.35 MCB Bumped all version numbers in support of D3R2 release.
-+*******************************************************************************/
-+
-+/* Dsl Hal API Version Numbers */
-+#define DSLHAL_VERSION_MAJOR 03
-+#define DSLHAL_VERSION_MINOR 00
-+#define DSLHAL_VERSION_BUGFIX 06
-+#define DSLHAL_VERSION_BUILDNUM 00
-+#define DSLHAL_VERSION_TIMESTAMP 00
-+
-+/* dhalapp Adam2 Application Version Numbers */
-+#define DHALAPP_VERSION_MAJOR 03
-+#define DHALAPP_VERSION_MINOR 00
-+#define DHALAPP_VERSION_BUGFIX 05
-+#define DHALAPP_VERSION_BUILDNUM 00
-+
-+/* Linux ATM Driver Version Numbers */
-+#define LINUXATM_VERSION_MAJOR 04
-+#define LINUXATM_VERSION_MINOR 02
-+#define LINUXATM_VERSION_BUGFIX 04
-+#define LINUXATM_VERSION_BUILDNUM 00
-+
-+/* DSL Agent Version Numbers */
-+#define DSLAGENT_VERSION_MAJOR 02
-+#define DSLAGENT_VERSION_MINOR 00
-+#define DSLAGENT_VERSION_BUGFIX 02
-+#define DSLAGENT_VERSION_BUILDNUM 00
-+
-+#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
-diff -urN linux.old/drivers/atm/sangam_atm/tn7api.h linux.dev/drivers/atm/sangam_atm/tn7api.h
---- linux.old/drivers/atm/sangam_atm/tn7api.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tn7api.h 2005-07-10 08:02:01.450110448 +0200
-@@ -0,0 +1,54 @@
-+/*
-+ * Tnetd73xx ATM driver.
-+ * by Zhicheng Tang, ztang@ti.com
-+ * 2000 (c) Texas Instruments Inc.
-+ *
-+ *
-+*/
-+
-+#ifndef __SAPI_H
-+#define __SAPI_H
-+
-+/* tn7atm.c */
-+void xdump(unsigned char *buff, int len, int debugLev);
-+int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data);
-+void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size);
-+void tn7atm_free_rx_skb(void *skb);
-+void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num);
-+int tn7atm_send_complete(void *osSendInfo);
-+int tn7atm_device_connect_status(void *priv, int state);
-+int tn7atm_lut_find(short vpi, int vci);
-+
-+/* tn7dsl.h */
-+void tn7dsl_exit(void);
-+int tn7dsl_init(void *priv);
-+int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+int tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+int tn7dsl_handle_interrupt(void);
-+void dprintf( int uDbgLevel, char * szFmt, ...);
-+void tn7dsl_dslmod_sysctl_register(void);
-+void tn7dsl_dslmod_sysctl_unregister(void);
-+int tn7dsl_get_dslhal_version(char *pVer);
-+int tn7dsl_get_dsp_version(char *pVer);
-+
-+int os_atoi(const char *pStr);
-+int os_atoh(const char *pStr);
-+unsigned long os_atoul(const char *pStr);
-+
-+/* tn7sar.c */
-+int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos);
-+int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv);
-+int tn7sar_register_interrupt_handle(void *os_dev, void *hal_isr, int *interrupt_num);
-+void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv);
-+int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan);
-+int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv);
-+int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority);
-+void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer);
-+int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count);
-+int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout);
-+int tn7sar_get_stats(void *priv1);
-+int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls);
-+int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.c linux.dev/drivers/atm/sangam_atm/tn7atm.c
---- linux.old/drivers/atm/sangam_atm/tn7atm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tn7atm.c 2005-07-10 08:27:20.947111792 +0200
-@@ -0,0 +1,1237 @@
-+/*
-+ * tn7.c
-+ * Linux atm module implementation.
-+ * Zhicheng Tang 01/08/2003
-+ * 2003 (c) Texas Instruments Inc.
-+ *
-+ *
-+*/
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/atmdev.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <asm/io.h>
-+#include <asm/mips-boards/prom.h>
-+#include <linux/proc_fs.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+#include "tn7atm.h"
-+#include "tn7api.h"
-+#include "syssw_version.h"
-+
-+#ifdef CONFIG_LED_MODULE
-+#include <asm/ar7/ledapp.h>
-+#endif
-+
-+#ifdef MODULE
-+MODULE_DESCRIPTION ("Tnetd73xx ATM Device Driver");
-+MODULE_AUTHOR ("Zhicheng Tang");
-+#endif
-+
-+/* Version Information */
-+//static char atm_version[] ="1.0.0.1";
-+
-+
-+#define TRUE 1
-+#define FALSE 0
-+
-+#define STOP_EMPTY_BUFF 2
-+#define START_EMPTY_BUFF 3
-+/* externs */
-+
-+/*end of externs */
-+
-+#define tn7atm_kfree_skb(x) dev_kfree_skb(x)
-+
-+/* prototypes */
-+int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci);
-+
-+void tn7atm_close (struct atm_vcc *vcc);
-+
-+static int tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg);
-+
-+int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb);
-+
-+static int tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags);
-+
-+static int tn7atm_detect(void);
-+static int tn7atm_init(struct atm_dev* dev);
-+//static int tn7atm_reset(void);
-+static int tn7atm_irq_request(struct atm_dev* dev);
-+static int tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+static void tn7atm_exit(void);
-+static int tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data);
-+static int tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof,void *data);
-+//static void tn7atm_free_packet(void *vcc1, void *priv, void *skb1);
-+static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1);
-+
-+#include "turbodsl.c"
-+
-+/* ATM device operations */
-+
-+struct atm_dev *mydev;
-+
-+static const struct atmdev_ops tn7atm_ops = {
-+ open: tn7atm_open,
-+ close: tn7atm_close,
-+ ioctl: tn7atm_ioctl,
-+ getsockopt: NULL,
-+ setsockopt: NULL,
-+ send: tn7atm_send,
-+ sg_send: NULL,
-+ phy_put: NULL,
-+ phy_get: NULL,
-+ change_qos: tn7atm_change_qos,
-+};
-+
-+
-+int __guDbgLevel = 1;
-+
-+
-+void xdump(unsigned char *buff, int len, int debugLev)
-+{
-+#ifdef DEBUG_BUILD
-+ int i, j;
-+ if( __guDbgLevel < debugLev)
-+ return;
-+
-+ j=0;
-+ for(i=0;i<len;i++)
-+ {
-+ printk("%02x ", buff[i]);
-+ j++;
-+ if(j==8)
-+ {
-+ j=0;
-+ printk("\n");
-+ }
-+ }
-+ printk("\n");
-+#endif
-+}
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_walk_vccs(struct atm_dev *dev, short *vcc, int *vci)
-+ *
-+ * Description: retrieve VPI/VCI for connection
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+static int
-+tn7atm_walk_vccs(struct atm_vcc *vcc, short *vpi, int *vci)
-+{
-+ struct atm_vcc* walk;
-+
-+ // printk(tn7 "tn7atm_walk_vccs\n");
-+ /* find a free VPI */
-+ if (*vpi == ATM_VPI_ANY) {
-+
-+ for (*vpi = 0, walk = vcc->dev->vccs; walk; walk = walk->next) {
-+
-+ if ((walk->vci == *vci) && (walk->vpi == *vpi)) {
-+ (*vpi)++;
-+ walk = vcc->dev->vccs;
-+ }
-+ }
-+ }
-+
-+ /* find a free VCI */
-+ if (*vci == ATM_VCI_ANY) {
-+
-+ for (*vci = ATM_NOT_RSV_VCI, walk = vcc->dev->vccs; walk; walk = walk->next) {
-+
-+ if ((walk->vpi = *vpi) && (walk->vci == *vci)) {
-+ *vci = walk->vci + 1;
-+ walk = vcc->dev->vccs;
-+ }
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_sar_irq(void)
-+ *
-+ * Description: tnetd73xx SAR interrupt.
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+static void
-+tn7atm_sar_irq(int irq , void *voiddev , struct pt_regs *regs)
-+{
-+ struct atm_dev *atmdev;
-+ Tn7AtmPrivate *priv;
-+
-+ dprintf(6, "tn7atm_sar_irq\n");
-+ atmdev = (struct atm_dev *) voiddev;
-+ priv = (Tn7AtmPrivate *)atmdev->dev_data;
-+
-+ tn7sar_handle_interrupt(atmdev, priv);
-+
-+ dprintf(6, "Leaving tn7atm_sar_irq\n");
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_dsl_irq(void)
-+ *
-+ * Description: tnetd73xx DSL interrupt.
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+static void
-+tn7atm_dsl_irq(int irq , void *voiddev , struct pt_regs *regs)
-+{
-+ struct atm_dev *atmdev;
-+ Tn7AtmPrivate *priv;
-+
-+ dprintf(4, "tn7atm_dsl_irq\n");
-+ atmdev = (struct atm_dev *) voiddev;
-+ priv = (Tn7AtmPrivate *)atmdev->dev_data;
-+
-+ tn7dsl_handle_interrupt();
-+
-+ dprintf(4, "Leaving tn7atm_dsl_irq\n");
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_Inittxcomp(struct tn7* tn7)
-+ *
-+ * Description: Initialize Interrupt handler
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-+static int __init
-+tn7atm_irq_request (struct atm_dev *dev)
-+{
-+ Tn7AtmPrivate *priv;
-+ char *ptr;
-+ int ipace=2;
-+
-+ dprintf(4, "tn7atm_irq_request()\n");
-+ priv = (Tn7AtmPrivate *) dev->dev_data;
-+
-+ /* Register SAR interrupt */
-+ priv->sar_irq = LNXINTNUM(ATM_SAR_INT); /* Interrupt line # */
-+ if (request_irq(priv->sar_irq, tn7atm_sar_irq, SA_INTERRUPT, "SAR ", dev))
-+ printk ("Could not register tn7atm_sar_irq\n");
-+
-+ /* interrupt pacing */
-+ ptr= prom_getenv("sar_ipacemax");
-+ if(ptr)
-+ {
-+ ipace=os_atoi(ptr);
-+ }
-+ avalanche_request_pacing(priv->sar_irq, ATM_SAR_INT_PACING_BLOCK_NUM, ipace);
-+
-+ /* Reigster Receive interrupt A */
-+ priv->dsl_irq = LNXINTNUM(ATM_DSL_INT); /* Interrupt line # */
-+ if (request_irq(priv->dsl_irq, tn7atm_dsl_irq, SA_INTERRUPT, "DSL ", dev))
-+ printk ("Could not register tn7atm_dsl_irq\n");
-+
-+ return 0;
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_lut_find(struct atm_vcc *vcc)
-+ *
-+ * Description: find an TX DMA channel
-+ * that matches a vpi/vci pair
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-+int
-+tn7atm_lut_find(short vpi, int vci)
-+{
-+ int i;
-+ Tn7AtmPrivate *priv;
-+
-+ priv = (Tn7AtmPrivate *)mydev->dev_data;
-+
-+ if(vci==0) // find first vpi channel
-+ {
-+ for(i=0; i< MAX_DMA_CHAN; i++)
-+ {
-+ if((priv->lut[i].vpi == vpi))
-+ return i;
-+ }
-+ }
-+
-+ dprintf(4, "vpi=%d, vci=%d\n", vpi, vci);
-+ for(i=0; i< MAX_DMA_CHAN; i++)
-+ {
-+ if((priv->lut[i].vpi == vpi) && (priv->lut[i].vci == vci))
-+ return i;
-+ }
-+
-+
-+
-+ return ATM_NO_DMA_CHAN;
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_lut_clear(struct atm_vcc *vcc,int chan)
-+ *
-+ * Description: find an TX DMA channel
-+ * that matches a vpi/vci pair
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-+static int
-+tn7atm_lut_clear(struct atm_vcc *vcc, int chan)
-+{
-+ Tn7AtmPrivate *priv;
-+
-+ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
-+
-+ memset(&priv->lut[chan], 0, sizeof(priv->lut[chan]));
-+
-+ return 0;
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_walk_lut(void)
-+ *
-+ * Description: find an available TX DMA channel
-+ * and initialize LUT
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-+static int
-+tn7atm_walk_lut(Tn7AtmPrivate *priv)
-+{
-+ int i;
-+
-+ for(i=0; i< MAX_DMA_CHAN; i++){
-+ if(!priv->lut[i].inuse)
-+ {
-+ return i; /* return available dma channel number */
-+ }
-+ }
-+ return ATM_NO_DMA_CHAN; /* no tx dma channels available */
-+}
-+
-+static int
-+tn7atm_set_lut(Tn7AtmPrivate *priv, struct atm_vcc *vcc, int chan)
-+{
-+
-+ if(!priv->lut[chan].inuse)
-+ {
-+ priv->lut[chan].vpi = (int)vcc->vpi;
-+ priv->lut[chan].vci = vcc->vci;
-+ priv->lut[chan].chanid = chan;
-+ priv->lut[chan].inuse = 1; /* claim the channel */
-+ priv->lut[chan].vcc = (void *)vcc;
-+ priv->lut[chan].bClosing = 0;
-+ priv->lut[chan].ready = 0;
-+ priv->lut[chan].tx_total_bufs = TX_BUFFER_NUM;
-+ priv->lut[chan].tx_used_bufs[0] = 0;
-+ priv->lut[chan].tx_used_bufs[1] = 0;
-+ return 0;
-+ }
-+ return -1; /* no tx dma channels available */
-+}
-+
-+#if 0
-+static void tn7atm_free_packet(void *pVc, void *pDev, void *pPacket)
-+ {
-+ Tn7AtmPrivate *priv;
-+ struct atm_vcc *vcc;
-+ struct sk_buff *skb;
-+
-+ vcc = (struct atm_vcc *)pVc;
-+ priv = (Tn7AtmPrivate *)pDev;
-+ skb = (struct sk_buff *) pPacket;
-+
-+ if(vcc->pop)
-+ vcc->pop(vcc, skb);
-+ else
-+ tn7atm_kfree_skb(skb);
-+ }
-+#endif
-+
-+static void str2eaddr(char *pMac, char *pStr)
-+{
-+ char tmp[3];
-+ int i;
-+
-+ for(i=0;i<6;i++)
-+ {
-+ tmp[0]=pStr[i*3];
-+ tmp[1]=pStr[i*3+1];
-+ tmp[2]=0;
-+ pMac[i]=os_atoh(tmp);
-+ }
-+}
-+
-+static int __init
-+tn7atm_get_ESI(struct atm_dev *dev)
-+{
-+ int i;
-+ char esi_addr[ESI_LEN]={0x00,0x00,0x11,0x22,0x33,0x44};
-+ char *esiaddr_str = NULL;
-+
-+ esiaddr_str = prom_getenv("macc");
-+
-+ if (!esiaddr_str) {
-+ //printk("macc address not set in adam2 environment space\n");
-+ //printk("Using default macc address = 00:01:02:03:04:05\n");
-+ esiaddr_str = "00:00:02:03:04:05";
-+ }
-+ str2eaddr(esi_addr, esiaddr_str);
-+
-+ for(i=0; i < ESI_LEN; i++)
-+ dev->esi[i] = esi_addr[i];
-+
-+ return 0;
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_open(struct atm_vcc *vcc, short vpi, int vci)
-+ *
-+ * Description: Device operation: open
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-+//static int
-+int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci)
-+{
-+ Tn7AtmPrivate *priv;
-+ int dmachan;
-+ int rc;
-+ int traffic_type;
-+ int pcr = 0x20000;
-+ int scr = 0x20000;
-+ int mbs = 0x20000;
-+ int cdvt = 10000;
-+
-+ dprintf(1, "tn7atm_open()\n");
-+
-+ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
-+ if(priv==NULL)
-+ {
-+ printk("null priv\n");
-+ return -1;
-+ }
-+
-+ MOD_INC_USE_COUNT;
-+
-+ /* find a free VPI/VCI */
-+ tn7atm_walk_vccs(vcc, &vpi, &vci);
-+
-+ vcc->vpi = vpi;
-+ vcc->vci = vci;
-+
-+ if (vci == ATM_VCI_UNSPEC || vpi == ATM_VCI_UNSPEC)
-+ {
-+ MOD_DEC_USE_COUNT;
-+ return -EBUSY;
-+ }
-+
-+ /* check to see whether PVC is opened or not */
-+ if((dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci)) != ATM_NO_DMA_CHAN)
-+ {
-+ MOD_DEC_USE_COUNT;
-+ printk("PVC already opened. dmachan = %d\n", dmachan);
-+ return -EBUSY;
-+ }
-+ /*check for available channel */
-+ if((dmachan = tn7atm_walk_lut(priv)) == ATM_NO_DMA_CHAN)
-+ {
-+ printk("No TX DMA channels available\n");
-+ return -EBUSY;
-+ }
-+
-+ set_bit(ATM_VF_ADDR, &vcc->flags); /* claim address */
-+
-+ vcc->itf = vcc->dev->number; /* interface number */
-+
-+ switch(vcc->qos.txtp.traffic_class)
-+ {
-+ case ATM_CBR: /* Constant Bit Rate */
-+ traffic_type = 0;
-+ pcr = vcc->qos.txtp.pcr;
-+ scr = vcc->qos.txtp.pcr;
-+ cdvt = vcc->qos.txtp.max_cdv;
-+ printk("cdvt=%d\n", cdvt);
-+ break;
-+ case ATM_UBR: /* Unspecified Bit Rate */
-+ traffic_type = 2;
-+ break;
-+ case ATM_VBR: /* Variable Bit Rate */
-+ traffic_type = 1;
-+ pcr = vcc->qos.txtp.pcr;
-+ scr = vcc->qos.txtp.scr;
-+ if(vcc->qos.txtp.max_pcr >= 0)
-+ mbs = vcc->qos.txtp.max_pcr;
-+ cdvt = vcc->qos.txtp.max_cdv;
-+ printk("cdvt=%d\n", cdvt);
-+ printk("mbs=%d\n", mbs);
-+ break;
-+ default:
-+ traffic_type = 2;
-+ }
-+
-+ dprintf(4, "vpi=%d, vci=%d, pcr=%d, dmachan=%d, qos=%d\n", vpi,vci,pcr,dmachan,traffic_type);
-+ /* Activate SAR channel */
-+ rc = tn7sar_activate_vc(priv, vpi, vci, pcr, scr, mbs, cdvt, dmachan, traffic_type);
-+ if(rc < 0)
-+ {
-+
-+ MOD_DEC_USE_COUNT;
-+ return -EBUSY;
-+ }
-+
-+ /* insure that the the vcc struct points to the correct entry
-+ in the lookup table */
-+
-+ tn7atm_set_lut(priv,vcc, dmachan);
-+ vcc->dev_data = (void *)&priv->lut[dmachan];
-+ set_bit(ATM_VF_READY, &vcc->flags);
-+
-+ mdelay(100);
-+ priv->lut[dmachan].ready = 1;
-+ dprintf (1, "Leave tn7atm_open\n");
-+ return 0;
-+}
-+
-+
-+//static void
-+void tn7atm_close (struct atm_vcc *vcc)
-+{
-+ Tn7AtmPrivate *priv;
-+ int dmachan;
-+
-+ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
-+ dprintf(4, "closing %d.%d.%d.%d\n", vcc->itf, vcc->vpi, vcc->vci, vcc->qos.aal);
-+
-+ clear_bit(ATM_VF_READY, &vcc->flags); /* ATM_VF_READY: channel is ready to transfer data */
-+
-+ dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
-+ printk("closing channel: %d\n", dmachan);
-+ if(dmachan == ATM_NO_DMA_CHAN)
-+ {
-+ printk("Closing channel not found.\n");
-+ return;
-+ }
-+ priv->lut[dmachan].bClosing = 1;
-+ priv->lut[dmachan].ready = 0;
-+ if(tn7sar_deactivate_vc(priv,dmachan)) /* tear down channel */
-+ {
-+ printk("failed to close channel %d.\n", dmachan);
-+ }
-+
-+ clear_bit(ATM_VF_READY, &vcc->flags); /* ATM_VF_READY: channel is ready to transfer data */
-+ tn7atm_lut_clear(vcc, dmachan);
-+
-+ MOD_DEC_USE_COUNT;
-+
-+ dprintf (1, "Leave tn7atm_close\n");
-+}
-+
-+#define ATM_TXSTOP 0x800c61f4
-+static int
-+tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg)
-+{
-+ Tn7AtmPrivate *priv;
-+ priv = (Tn7AtmPrivate *) dev->dev_data;
-+
-+ //printk("tn7atm_ioctl\n");
-+ //printk("arg = %x\n", *(int *)arg);
-+ //printk("cmd =%x\n", cmd);
-+ switch(cmd)
-+ {
-+
-+ case ATM_TXSTOP: /*temp fix for SAR tear down problem */
-+// printk("ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
-+// printk("arg = %d\n", *(int*)arg);
-+ priv->xmitStop = *(int *)arg;
-+ //printk("Executing ATM_SETLOOP for tn7 \n");
-+ //printk("Stop variable = :%d: \n",priv->xmitStop);
-+ return 0;
-+
-+ //case SAR_DSL_RESET_SOFTBOOT:
-+ // return tn7atm_dsl_clean_reboot();
-+ case 0:
-+ return 0;
-+ }
-+
-+ return -ENOSYS;
-+
-+}
-+
-+static int
-+tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags)
-+{
-+ dprintf (1, "Enter tn7atm_change_qos\n");
-+ dprintf (1, "Leave tn7atm_change_qos\n");
-+ return 0;
-+}
-+
-+
-+int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
-+{
-+
-+ Tn7AtmPrivate *priv;
-+ int bret;
-+ int chan;
-+
-+ dprintf(4, "tn7atm_send()\n");
-+
-+ priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
-+
-+ //if(skb->len < 64)
-+ //xdump((unsigned char *)skb->data, skb->len, 1);
-+ //else
-+ //xdump((unsigned char *)skb->data, 64, 1);
-+ /* check for dsl line connection */
-+
-+ /* add vcc field in skb for clip inATMARP fix */
-+ ATM_SKB(skb)->vcc = vcc;
-+ /* Ron change 2.3 -> 2.4 ??*/
-+ //if(priv->lConnected != 1 || priv->xmitStop == 1)
-+ if(priv->lConnected != 1 && priv->xmitStop == 1)
-+ {
-+ dprintf(4,"dsl line down\n");
-+ if(vcc->pop)
-+ vcc->pop(vcc, skb);
-+ else
-+ tn7atm_kfree_skb(skb);
-+ return 1;
-+ }
-+
-+ /* check whether PVC is closing */
-+ chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
-+ /* set br2684 dev pointer */
-+ priv->lut[chan].net_device = skb->dev;
-+ if(chan == ATM_NO_DMA_CHAN || priv->lut[chan].bClosing == 1)
-+ {
-+ dprintf(4, "can find sar channel\n");
-+ if(vcc->pop)
-+ vcc->pop(vcc, skb);
-+ else
-+ tn7atm_kfree_skb(skb);
-+ return 1;
-+ }
-+
-+ bret=tn7atm_queue_packet_to_sar(vcc, skb);
-+
-+ return bret;
-+}
-+
-+
-+static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1)
-+{
-+ struct atm_vcc *vcc;
-+ struct sk_buff *skb;
-+ int priority = 1;
-+ Tn7AtmPrivate *priv;
-+ int dmachan;
-+
-+ vcc = (struct atm_vcc *)vcc1;
-+ skb = (struct sk_buff *)skb1;
-+
-+ priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
-+
-+ dprintf(4, "vcc->vci=%d\n", vcc->vci);
-+ dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
-+ if(dmachan == ATM_NO_DMA_CHAN)
-+ {
-+ dprintf(4, "can find sar channel\n");
-+ if(vcc->pop)
-+ vcc->pop(vcc, skb);
-+ else
-+ tn7atm_kfree_skb(skb);
-+ return 1;
-+ }
-+
-+ // turbo dsl TCP ack check
-+ if(priv->bTurboDsl)
-+ priority = turbodsl_check_priority_type(skb->data);
-+
-+ //skb priority check
-+ if(priority != 0)
-+ {
-+ if((skb->cb[47])>>1)
-+ priority=1;
-+ else
-+ priority = 0;
-+ }
-+
-+ /* add queue info here */
-+ skb->cb[47] = (char)priority;
-+ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+ priv->lut[dmachan].tx_used_bufs[priority]++;
-+ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+
-+ if(tn7sar_send_packet(priv,dmachan, skb, skb->data, skb->len, priority) != 0)
-+ {
-+ dprintf(1, "failed to send packet\n");
-+ if(vcc->pop)
-+ vcc->pop(vcc, skb);
-+ else
-+ tn7atm_kfree_skb(skb);
-+
-+ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+ priv->lut[dmachan].tx_used_bufs[priority]--;
-+ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+ return 1;
-+ }
-+
-+ /* check for whether tx queue is full or not */
-+ //printk("bufs used = %d\n", priv->lut[dmachan].tx_used_bufs[1]);
-+ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+ if(priv->lut[dmachan].tx_used_bufs[1] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF) ||
-+ priv->lut[dmachan].tx_used_bufs[0] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF))
-+ {
-+ //printk("net queue stoped\n");
-+ netif_stop_queue(priv->lut[dmachan].net_device);
-+ priv->lut[dmachan].netqueue_stop = 1;
-+ }
-+ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+
-+ return 0;
-+}
-+
-+/* functions needed by SAR HAL */
-+
-+int tn7atm_send_complete(void *osSendInfo)
-+{
-+ Tn7AtmPrivate *priv;
-+ //struct atm_dev *dev;
-+ struct sk_buff *skb;
-+ struct atm_vcc *vcc;
-+ int chan;
-+
-+ dprintf(4, "tn7atm_send_complete()\n");
-+
-+
-+ skb = (struct sk_buff *)osSendInfo;
-+ //dev = (struct atm_dev *) (skb->dev);
-+ priv = (Tn7AtmPrivate *)mydev->dev_data;
-+ vcc =ATM_SKB(skb)->vcc;
-+ if(vcc)
-+ {
-+ dprintf(4, "vcc->vci=%d\n",vcc->vci );
-+ chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
-+ if(chan==ATM_NO_DMA_CHAN)
-+ return 1;
-+
-+ /*decreament packet queued number */
-+ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+ priv->lut[chan].tx_used_bufs[(int)skb->cb[47]] --;
-+ if(priv->lut[chan].tx_used_bufs[1] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF &&
-+ priv->lut[chan].tx_used_bufs[0] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF)
-+ {
-+ if(priv->lut[chan].netqueue_stop)
-+ {
-+ //printk("net queue restarted\n");
-+ netif_wake_queue(priv->lut[chan].net_device);
-+ priv->lut[chan].netqueue_stop = 0;
-+ }
-+ }
-+ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
-+
-+ if(vcc->pop)
-+ {
-+ dprintf(5, "free packet\n");
-+ vcc->pop(vcc, skb);
-+ }
-+
-+
-+ }
-+
-+
-+
-+ /* Update Stats: There may be a better place to do this, but this is a start */
-+ priv->stats.tx_packets++;
-+#ifdef CONFIG_LED_MODULE
-+ led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);
-+#endif
-+
-+ /* track number of buffer used */
-+
-+ dprintf(4, "tn7atm_send_complete() done\n");
-+
-+ return 0;
-+}
-+
-+void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size)
-+{
-+ struct sk_buff *skb;
-+ dprintf(4, "tn7atm_allocate_rx_skb size=%d\n", size);
-+ size = ((size+3)&0xfffffffc);
-+ skb = dev_alloc_skb(size);
-+ if(skb==NULL)
-+ {
-+ //printk("rx allocate skb failed\n");
-+ return NULL;
-+ }
-+ *os_receive_info = (void *)skb;
-+ return (skb->data);
-+}
-+
-+void tn7atm_free_rx_skb(void *skb)
-+{
-+ dprintf(4, "tn7atm_free_rx_skb\n");
-+ tn7atm_kfree_skb((struct sk_buff *)skb);
-+}
-+
-+
-+int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data)
-+{
-+ Tn7AtmPrivate *priv;
-+ struct atm_dev *dev;
-+ struct sk_buff *skb;
-+ struct atm_vcc *vcc;
-+
-+
-+ dprintf(4, "tn7atm_receive()\n");
-+ dev = (struct atm_dev *)os_dev;
-+
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+
-+ if(priv->lConnected != 1 || priv->lut[ch].ready == 0)
-+ {
-+ //printk("channel not ready\n");
-+ return 1;
-+ }
-+
-+ vcc = (struct atm_vcc *)priv->lut[ch].vcc;
-+ if(vcc == NULL)
-+ {
-+ printk("vcc=Null");
-+ return 1;
-+ }
-+
-+
-+ /* assume no fragment packet for now */
-+ skb = (struct sk_buff *)os_receive_info;
-+
-+ if(skb==NULL)
-+ {
-+ dprintf(1, "received empty skb.\n");
-+ return 1;
-+ }
-+ /* see skbuff->cb definition in include/linux/skbuff.h */
-+ ATM_SKB(skb)->vcc = vcc;
-+
-+ skb->len = packet_size;
-+ dprintf(3, "skb:[0x%p]:0x%x pdu_len: 0x%04x\n",skb,skb->len,packet_size);
-+ dprintf(3, "data location: 0x%x, 0x%x\n", (unsigned int)skb->data, (unsigned int)data);
-+
-+ /*skb_trim(skb,skb->len); */ /* skb size is incorrect for large packets > 1428 bytes ?? */
-+ __skb_trim(skb,skb->len); /* change to correct > 1500 ping when firewall is on */
-+
-+ dprintf(3, "pushing the skb...\n");
-+ skb->stamp = vcc->timestamp = xtime;
-+
-+ xdump((unsigned char *)skb->data, skb->len, 5);
-+
-+ if(atm_charge(vcc, skb->truesize) == 0)
-+ {
-+ dprintf(1,"Receive buffers saturated for %d.%d.%d - PDU dropped\n", vcc->itf, vcc->vci, vcc->vpi);
-+ return 1;
-+ }
-+
-+ /*pass it up to kernel networking layer and update stats*/
-+ vcc->push(vcc,skb);
-+
-+ /* Update receive packet stats */
-+ priv->stats.rx_packets++;
-+ atomic_inc(&vcc->stats->rx);
-+
-+#ifdef CONFIG_LED_MODULE
-+ led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);
-+#endif
-+ dprintf(3, "(a) Receiving:vpi/vci[%d/%d] chan_id: %d skb len:0x%x skb truesize:0x%x\n",
-+ vcc->vpi,vcc->vci,ch,skb->len, skb->truesize);
-+
-+ return 0;
-+}
-+
-+static int
-+tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ int limit = count - 80;
-+ int i;
-+
-+ struct atm_dev *dev;
-+ Tn7AtmPrivate *priv;
-+
-+ dev = (struct atm_dev *)data;
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+
-+ if(len<=limit)
-+ len += sprintf(buf+len,"Chan Inuse ChanID VPI VCI \n");
-+ if(len<=limit)
-+ len += sprintf(buf+len,"------------------------------------------------------------------\n");
-+
-+ for(i=0; i < MAX_DMA_CHAN; i++)
-+ {
-+ if(len<=limit)
-+ {
-+ len += sprintf(buf+len,
-+ " %02d %05d %05d %05d %05d \n",
-+ i,priv->lut[i].inuse,priv->lut[i].chanid,
-+ priv->lut[i].vpi,priv->lut[i].vci);
-+ }
-+ }
-+
-+ return len;
-+}
-+
-+static int
-+tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ int limit = count - 80;
-+ struct atm_dev *dev;
-+ Tn7AtmPrivate *priv;
-+
-+ dev = (struct atm_dev *)data;
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\nPrivate Data Structure(%s):\n",priv->name);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "----------------------------------------\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "priv: 0x%p\n",priv);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "next: 0x%p",priv->next);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tdev: 0x%p\n",priv->dev);
-+
-+ if(len<=limit)
-+ len += sprintf(buf+len, "tx_irq: %02d",priv->sar_irq);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "rx_irq: %02d",priv->dsl_irq);
-+
-+
-+ return len;
-+}
-+
-+void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num)
-+{
-+ struct atm_dev *dev;
-+ Tn7AtmPrivate *priv;
-+
-+ dprintf(4, "tn7atm_sarhal_isr_register()\n");
-+
-+ dev = (struct atm_dev *)os_dev;
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+ priv->halIsr = (void *)hal_isr;
-+ priv->int_num = interrupt_num;
-+}
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_exit(void)
-+ *
-+ * Description: Avalanche SAR exit function
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+
-+static void
-+tn7atm_exit (void)
-+{
-+
-+ struct atm_dev *dev;
-+
-+ Tn7AtmPrivate *priv;
-+
-+ dprintf(4, "tn7atm_exit()\n");
-+
-+ dev=mydev;
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+ priv->lConnected = 0;
-+ tn7dsl_exit();
-+
-+ tn7sar_exit(dev, priv);
-+
-+ /* freeup irq's */
-+ free_irq(priv->dsl_irq,priv->dev);
-+ free_irq(priv->sar_irq,priv->dev);
-+
-+ kfree (dev->dev_data);
-+
-+ // atm_dev_deregister (dev);
-+ shutdown_atm_dev(dev);
-+
-+ /* remove proc entries */
-+#ifdef COMMON_NSP
-+ remove_proc_entry("avalanche/avsar_ver",NULL);
-+ remove_proc_entry("avalanche/avsar_modem_stats",NULL);
-+ remove_proc_entry("avalanche/avsar_modem_training",NULL);
-+ remove_proc_entry("avalanche/avsar_channels",NULL);
-+ remove_proc_entry("avalanche/avsar_private",NULL);
-+ remove_proc_entry("avalanche/avsar_sarhal_stats",NULL);
-+ remove_proc_entry("avalanche/avsar_oam_ping",NULL);
-+ remove_proc_entry("avalanche/avsar_pvc_table",NULL);
-+#else
-+ remove_proc_entry("ti_commproc/atm/modem_ver",NULL);
-+ remove_proc_entry("ti_commproc/atm/modem_stats",NULL);
-+ remove_proc_entry("ti_commproc/atm/modem_training",NULL);
-+ remove_proc_entry("ti_commproc/atm/modem_channels",NULL);
-+ remove_proc_entry("ti_commproc/atm/modem_private",NULL);
-+ remove_proc_entry("ti_commproc/atm/sarhal_stats",NULL);
-+ remove_proc_entry("ti_commproc/atm/oam_ping",NULL);
-+ remove_proc_entry("ti_commproc/atm/pvc_table",NULL);
-+#endif
-+ tn7dsl_dslmod_sysctl_unregister();
-+
-+ printk ("Module Removed\n");
-+
-+}
-+
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_registration(struct tn7* tn7)
-+ *
-+ * Description: ATM driver registration
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+
-+static int __init
-+tn7atm_register (Tn7AtmPrivate * priv)
-+{
-+ /* allocate memory for the device */
-+
-+ dprintf(4,"device %s being registered\n", priv->name);
-+
-+ mydev = atm_dev_register (priv->proc_name, &tn7atm_ops, -1, NULL);
-+
-+ if (mydev == NULL)
-+ {
-+ printk ("atm_dev_register returning NULL\n");
-+ return ATM_REG_FAILED;
-+ }
-+
-+ printk ("registered device %s\n", priv->name);
-+
-+ mydev->dev_data = priv; /* setup device data in atm_dev struct */
-+ priv->dev = mydev; /* setup atm_device in avalanche sar struct */
-+
-+ mydev->ci_range.vpi_bits = ATM_CI_MAX; /* atm supports 11 bits */
-+ mydev->ci_range.vci_bits = 16; /* atm VCI max = 16 bits */
-+
-+
-+ return ATM_REG_OK;
-+}
-+
-+static int
-+tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ char dslVer[8];
-+ char dspVer[10];
-+ char *pSarVer;
-+ Tn7AtmPrivate *priv;
-+ int i;
-+ unsigned int pdspV1, pdspV2;
-+
-+ priv = mydev->dev_data;
-+
-+ len += sprintf(buf+len, "ATM Driver version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
-+ LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
-+
-+ tn7dsl_get_dslhal_version(dslVer);
-+
-+ len += sprintf(buf+len, "DSL HAL version: [%d.%02d.%02d.%02d]\n", dslVer[0], dslVer[1], dslVer[2],
-+ dslVer[3]);
-+ tn7dsl_get_dsp_version(dspVer);
-+
-+ len += sprintf(buf+len, "DSP Datapump version: [%d.%02d.%02d.%02d] ", dspVer[4], dspVer[5], dspVer[6],
-+ dspVer[7]);
-+ if(dspVer[8]==2) // annex B
-+ len += sprintf(buf+len, "Annex B\n");
-+ else if(dspVer[8]==3) //annex c
-+ len += sprintf(buf+len, "Annex c\n");
-+ else
-+ len += sprintf(buf+len, "Annex A\n");
-+
-+ tn7sar_get_sar_version(priv, &pSarVer);
-+
-+ len += sprintf(buf+len, "SAR HAL version: [");
-+ for(i=0;i<8;i++)
-+ {
-+ len += sprintf(buf+len, "%c", pSarVer[i+7]);
-+ }
-+ len += sprintf(buf+len, "]\n");
-+
-+ tn7sar_get_sar_firmware_version(&pdspV1, &pdspV2);
-+ len += sprintf(buf+len, "PDSP Firmware version:[%01x.%02x]\n",
-+ pdspV1,pdspV2);
-+
-+ return len;
-+}
-+
-+/*
-+static struct net_device_stats
-+*tn7atm_get_stats(struct atm_dev *dev)
-+{
-+ Tn7AtmPrivate *priv;
-+ //unsigned long flags;
-+
-+ //spin_lock_irqsave(&priv->stats_lock,flags);
-+ priv= (Tn7AtmPrivate *)dev->dev_data;
-+ //spin_unlock_irqrestore(&priv->stats_lock,flags);
-+
-+ return &priv->stats;
-+
-+}
-+*/
-+/* Device detection */
-+
-+static int __init
-+tn7atm_detect (void)
-+{
-+ Tn7AtmPrivate *priv;
-+ //static struct proc_dir_entry *proc_dir;
-+
-+ dprintf(4, "tn7atm_detect().\n");
-+ /* Device allocated as a global static structure at top of code "mydev" */
-+
-+ /* Alloc priv struct */
-+ priv=kmalloc(sizeof(Tn7AtmPrivate),GFP_KERNEL);
-+ if(!priv)
-+ {
-+ printk("unable to kmalloc priv structure. Killing autoprobe.\n");
-+ return -ENODEV;
-+ }
-+ memset(priv, 0, sizeof(Tn7AtmPrivate));
-+#ifdef COMMON_NSP
-+ priv->name = "TI Avalanche SAR";
-+ priv->proc_name = "avsar";
-+#else
-+ priv->name = "TI tnetd73xx ATM Driver";
-+ priv->proc_name = "tn7";
-+#endif
-+
-+ if ((tn7atm_register (priv)) == ATM_REG_FAILED)
-+ return -ENODEV;
-+
-+ tn7atm_init(mydev);
-+
-+ /* Set up proc entry for atm stats */
-+#ifdef COMMON_NSP
-+#define PROC_DIR "avalanche"
-+ //proc_dir = proc_mkdir(PROC_DIR, NULL);
-+ create_proc_read_entry("avalanche/avsar_modem_stats",0,NULL,tn7dsl_proc_stats,NULL);
-+ //create_proc_read_entry("avsar_modem_stats",0,proc_dir,tn7dsl_proc_stats,NULL);
-+ create_proc_read_entry("avalanche/avsar_modem_training",0,NULL,tn7dsl_proc_modem,NULL);
-+ create_proc_read_entry("avalanche/avsar_ver",0,NULL,tn7atm_proc_version,NULL);
-+ create_proc_read_entry("avalanche/avsar_channels",0,NULL,tn7atm_proc_channels,mydev);
-+ create_proc_read_entry("avalanche/avsar_private",0,NULL,tn7atm_proc_private,mydev);
-+ create_proc_read_entry("avalanche/avsar_sarhal_stats",0,NULL,tn7sar_proc_sar_stat,mydev);
-+ create_proc_read_entry("avalanche/avsar_oam_ping",0,NULL,tn7sar_proc_oam_ping,mydev);
-+ create_proc_read_entry("avalanche/avsar_pvc_table",0,NULL,tn7sar_proc_pvc_table,mydev);
-+#else
-+#define PROC_DIR "atm"
-+ proc_dir = proc_mkdir(PROC_DIR, "ti_commproc");
-+ create_proc_read_entry("modem_stats",0,pro_dir,tn7dsl_proc_stats,NULL);
-+ create_proc_read_entry("modem_training",0,pro_dir,tn7dsl_proc_modem,NULL);
-+ create_proc_read_entry("modem_ver",0,pro_dir,tn7atm_proc_version,NULL);
-+ create_proc_read_entry("modem_channels",0,pro_dir,tn7atm_proc_channels,mydev);
-+ create_proc_read_entry("modem_private",0,pro_dir,tn7atm_proc_private,mydev);
-+ create_proc_read_entry("sarhal_stats", pro_dir,tn7sar_proc_sar_stat,mydev);
-+ create_proc_read_entry("oam_ping",0,pro_dir,tn7sar_proc_oam_ping,mydev);
-+ create_proc_read_entry("pvc_table",0,pro_dir,tn7sar_proc_pvc_table,mydev);
-+#endif
-+
-+ tn7dsl_dslmod_sysctl_register();
-+
-+ printk("Texas Instruments ATM driver: version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
-+ LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
-+ return 0;
-+}
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_probe(void)
-+ *
-+ * Description: Avalanche SAR driver probe (see net/atm/pvc.c)
-+ * this is utilized when the SAR driver is built
-+ * into the kernel and needs to be configured.
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+int __init tn7atm_probe(void)
-+{
-+ tn7atm_detect();
-+ return -ENODEV;
-+}
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int tn7atm_init(struct atm_dev *dev)
-+ *
-+ * Description: Device Initialization
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+static int __init
-+tn7atm_init(struct atm_dev *dev)
-+{
-+ Tn7AtmPrivate *priv;
-+ char *ptr;
-+
-+ dprintf(4, "tn7atm_init()\n");
-+
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+
-+ if(tn7sar_init(dev, priv) != 0)
-+ {
-+ printk("Failed to init SAR.\n");
-+ return -ENODEV;
-+ }
-+
-+ if(tn7dsl_init(priv) < 0)
-+ {
-+ printk("Failed to init DSL.\n");
-+ return -ENODEV;
-+ }
-+
-+ if(tn7atm_get_ESI(dev) < 0) /* set ESI */
-+ return -ENODEV;
-+
-+ if(tn7atm_irq_request(dev) < 0)
-+ return -EBUSY;
-+
-+ priv->bTurboDsl = 1;
-+ // read config for turbo dsl
-+ ptr = prom_getenv("TurboDSL");
-+ if(ptr)
-+ {
-+ priv->bTurboDsl = os_atoi(ptr);
-+ }
-+
-+ return 0;
-+}
-+
-+int tn7atm_device_connect_status(void *priv, int state)
-+{
-+ Tn7AtmPrivate *priv1;
-+
-+ dprintf(5, "tn7atm_device_connect_status()\n");
-+ priv1 = (Tn7AtmPrivate *)priv;
-+
-+ priv1->lConnected = state;
-+ dprintf(5, "priv1->lConnected=%d\n", priv1->lConnected);
-+ return 0;
-+}
-+
-+
-+#ifdef MODULE
-+module_init (tn7atm_detect);
-+module_exit (tn7atm_exit);
-+#endif /* MODULE */
-diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.h linux.dev/drivers/atm/sangam_atm/tn7atm.h
---- linux.old/drivers/atm/sangam_atm/tn7atm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tn7atm.h 2005-07-10 08:02:01.452110144 +0200
-@@ -0,0 +1,115 @@
-+/*
-+ * Tnetd73xx ATM driver.
-+ * by Zhicheng Tang, ztang@ti.com
-+ * 2000 (c) Texas Instruments Inc.
-+ *
-+ *
-+*/
-+
-+#ifndef __TN7ATM_H
-+#define __TN7ATM_H
-+
-+//#include "mips_support.h"
-+#include <linux/list.h>
-+
-+#define ATM_REG_OK 1
-+#define ATM_REG_FAILED 0
-+
-+#define TX_SERVICE_MAX 32
-+#define RX_SERVICE_MAX 20
-+#define TX_BUFFER_NUM 64
-+#define RX_BUFFER_NUM 28
-+#define TX_QUEUE_NUM 2
-+#define RX_BUFFER_SIZE 1582
-+
-+#define TX_DMA_CHAN 16 /* number of tx dma channels available */
-+#define MAX_DMA_CHAN 16
-+#define ATM_NO_DMA_CHAN MAX_DMA_CHAN + 1 /* no tx dma channels available */
-+#define ATM_SAR_INT 15
-+#define ATM_SAR_INT_PACING_BLOCK_NUM 2
-+#define ATM_DSL_INT 39
-+
-+#define CONFIG_ATM_TN7ATM_DEBUG 0 /* Debug level (0=no mtn7s 5=verbose) */
-+
-+#define TN7ATM_DEV(d) ((struct tn7atm*)((d)->dev_data))
-+
-+
-+/* Avalanche SAR state information */
-+
-+typedef enum tn7atm_state
-+{
-+ TN7ATM_STATE_REGISTER /* device registered */
-+}tn7atm_state;
-+
-+typedef struct _sar_stat
-+{
-+ unsigned int txErrors;
-+ unsigned int rxErrors;
-+ unsigned int rxPktCnt;
-+ unsigned int txPktCnt;
-+ unsigned int rxBytes;
-+ unsigned int txBytes;
-+}sar_stat_t;
-+
-+/* Host based look up table to xref Channel Id's, VPI/VCI, LC, CID, packet type */
-+typedef struct _tn7atm_tx_lut
-+{
-+ int inuse; /* is DMA channel available (1=y) */
-+ int chanid; /* DMA channel ID (0-0x1f) This corresponds to the Channel ID
-+ that is used in the connection config reg (TN7ATM_CONN_CONFIG) */
-+ int vpi; /* Virtual path identifier */
-+ int vci; /* Virtual channel identifier */
-+ void *vcc;
-+ int bClosing;
-+ int ready;
-+ void *net_device;
-+ int tx_total_bufs;
-+ int tx_used_bufs[2];
-+ int netqueue_stop;
-+}tn7atm_lut_t;
-+
-+/* per device data */
-+
-+typedef struct _tn7atm_private
-+{
-+ struct _tn7atm_private *next; /* next device */
-+ struct atm_dev *dev; /* ATM device */
-+ struct net_device_stats stats; /* Used to report Tx/Rx frames from ifconfig */
-+ tn7atm_lut_t lut[MAX_DMA_CHAN]; /* Tx DMA look up table (LUT) */
-+ int dsl_irq; /* ATM SAR TransmitA interrupt number */
-+ int sar_irq; /* ATM SAR ReceiveA interrupt number */
-+ char* name; /* device name */
-+ char* proc_name; /* board name under /proc/atm */
-+ unsigned int available_cell_rate; /* cell rate */
-+ unsigned int connection_cell_rate; /* cell rate */
-+ int lConnected;
-+
-+ /* Tnetd73xx CPHAL */
-+ void *pSarHalDev;
-+ void *pSarHalFunc;
-+ void *pSarOsFunc;
-+ void *halIsr;
-+ int int_num;
-+
-+ /* turbo dsl */
-+ int bTurboDsl;
-+
-+ /* spin lock for netifqueue */
-+ spinlock_t netifqueueLock;
-+ int netifqueueLockFlag;
-+ int xmitStop; /* temp fix for SAR problem */
-+}tn7atm_private_t, Tn7AtmPrivate;
-+
-+
-+
-+/* ATM adaptation layer id */
-+typedef enum tn7atm_aal {
-+ TN7ATM_AAL0 = 0,
-+ TN7ATM_AAL2 = 2,
-+ TN7ATM_AAL5 = 5,
-+} tn7atm_aal_t;
-+
-+
-+
-+
-+#endif
-diff -urN linux.old/drivers/atm/sangam_atm/tn7dsl.c linux.dev/drivers/atm/sangam_atm/tn7dsl.c
---- linux.old/drivers/atm/sangam_atm/tn7dsl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tn7dsl.c 2005-07-10 08:27:39.683263464 +0200
-@@ -0,0 +1,1778 @@
-+/*
-+ * $Id$
-+ *
-+ * Avalanche SAR driver
-+ *
-+ * Zhicheng Tang, ztang@ti.com
-+ * 2000 (c) Texas Instruments Inc.
-+ *
-+ *
-+*/
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/atmdev.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <asm/io.h>
-+#include <asm/mips-boards/prom.h>
-+#include <linux/proc_fs.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+#include <linux/sysctl.h>
-+#include <linux/timer.h>
-+#include <linux/vmalloc.h>
-+
-+#include "tn7atm.h"
-+#include "tn7api.h"
-+#include "dsl_hal_api.h"
-+
-+#ifdef CONFIG_LED_MODULE
-+#include <asm/ar7/ledapp.h>
-+#define MOD_ADSL 1
-+#define DEF_ADSL_IDLE 1
-+#define DEF_ADSL_TRAINING 2
-+#define DEF_ADSL_SYNC 3
-+#define DEF_ADSL_ACTIVITY 4
-+
-+#define LED_NUM_1 3
-+#define LED_NUM_2 4
-+
-+led_reg_t ledreg[2];
-+
-+static int led_on;
-+#endif
-+
-+extern int __guDbgLevel;
-+extern sar_stat_t sarStat;
-+static int dslInSync = 0;
-+static int bMarginThConfig;
-+static int bMarginRetrainEnable;
-+static char EOCVendorID[8]= {0xb5, 0x00, 0x54, 0x53, 0x54, 0x43, 0x00, 0x00};
-+
-+#define TC_SYNC 1
-+#define SYNC_TIME_DELAY 500000
-+
-+
-+#define DEV_DSLMOD 1
-+#define MAX_STR_SIZE 256
-+#define DSL_MOD_SIZE 256
-+
-+#define TRUE 1
-+#define FALSE 0
-+
-+
-+enum
-+{
-+ NO_MODE,
-+ MULTI_MODE,
-+ T1413_MODE,
-+ GDMT_MODE,
-+ GLITE_MODE
-+};
-+
-+
-+
-+/* a structure to store all information we need
-+ for our thread */
-+typedef struct kthread_struct
-+{
-+ /* private data */
-+
-+ /* Linux task structure of thread */
-+ struct task_struct *thread;
-+ /* Task queue need to launch thread */
-+ struct tq_struct tq;
-+ /* function to be started as thread */
-+ void (*function) (struct kthread_struct *kthread);
-+ /* semaphore needed on start and creation of thread. */
-+ struct semaphore startstop_sem;
-+
-+ /* public data */
-+
-+ /* queue thread is waiting on. Gets initialized by
-+ init_kthread, can be used by thread itself.
-+ */
-+ wait_queue_head_t queue;
-+ /* flag to tell thread whether to die or not.
-+ When the thread receives a signal, it must check
-+ the value of terminate and call exit_kthread and terminate
-+ if set.
-+ */
-+ int terminate;
-+ /* additional data to pass to kernel thread */
-+ void *arg;
-+} kthread_t;
-+
-+#ifndef ADIAG
-+#define DSP_FIRMWARE_PATH "/lib/modules/ar0700xx.bin"
-+#else
-+#define DSP_FIRMWARE_PATH "/var/tmp/ar0700xx_diag.bin"
-+#endif
-+
-+/* externs */
-+extern struct atm_dev *mydev;
-+extern unsigned int oamFarLBCount[4];
-+extern int dslhal_support_restoreTrainingInfo(PITIDSLHW_T pIhw);
-+/* gloabal functions */
-+
-+/* end of global functions */
-+
-+/* module wide declars */
-+static PITIDSLHW_T pIhw;
-+static char mod_req[16]={'\t'};
-+static volatile int bshutdown;
-+static char info[MAX_STR_SIZE];
-+static DECLARE_MUTEX_LOCKED(adsl_sem_overlay); /* Used for DSL Polling enable */
-+kthread_t overlay_thread;
-+/* end of module wide declars */
-+
-+/* Internal Functions */
-+static void tn7dsl_chng_modulation(void* data);
-+static void tn7dsl_set_modulation(void* data);
-+static int tn7dsl_reload_overlay(void);
-+static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp);
-+static void tn7dsl_register_dslss_led(void);
-+void tn7dsl_dslmod_sysctl_register(void);
-+void tn7dsl_dslmod_sysctl_unregister(void);
-+/* end of internal functions */
-+
-+
-+
-+
-+
-+/* prototypes */
-+
-+/* start new kthread (called by creator) */
-+void start_kthread(void (*func)(kthread_t *), kthread_t *kthread);
-+
-+/* stop a running thread (called by "killer") */
-+void stop_kthread(kthread_t *kthread);
-+
-+/* setup thread environment (called by new thread) */
-+void init_kthread(kthread_t *kthread, char *name);
-+
-+/* cleanup thread environment (called by thread upon receiving termination signal) */
-+void exit_kthread(kthread_t *kthread);
-+
-+
-+
-+/* private functions */
-+static void kthread_launcher(void *data)
-+{
-+ kthread_t *kthread = data;
-+ kernel_thread((int (*)(void *))kthread->function, (void *)kthread, 0);
-+
-+}
-+
-+/* public functions */
-+
-+/* create a new kernel thread. Called by the creator. */
-+void start_kthread(void (*func)(kthread_t *), kthread_t *kthread)
-+{
-+ /* initialize the semaphore:
-+ we start with the semaphore locked. The new kernel
-+ thread will setup its stuff and unlock it. This
-+ control flow (the one that creates the thread) blocks
-+ in the down operation below until the thread has reached
-+ the up() operation.
-+ */
-+ //init_MUTEX_LOCKED(&kthread->startstop_sem);
-+
-+ /* store the function to be executed in the data passed to
-+ the launcher */
-+ kthread->function=func;
-+
-+ /* create the new thread my running a task through keventd */
-+
-+ /* initialize the task queue structure */
-+ kthread->tq.sync = 0;
-+ INIT_LIST_HEAD(&kthread->tq.list);
-+ kthread->tq.routine = kthread_launcher;
-+ kthread->tq.data = kthread;
-+
-+ /* and schedule it for execution */
-+ schedule_task(&kthread->tq);
-+
-+ /* wait till it has reached the setup_thread routine */
-+ //down(&kthread->startstop_sem);
-+
-+}
-+
-+/* stop a kernel thread. Called by the removing instance */
-+void stop_kthread(kthread_t *kthread)
-+{
-+ if (kthread->thread == NULL)
-+ {
-+ printk("stop_kthread: killing non existing thread!\n");
-+ return;
-+ }
-+
-+ /* this function needs to be protected with the big
-+ kernel lock (lock_kernel()). The lock must be
-+ grabbed before changing the terminate
-+ flag and released after the down() call. */
-+ lock_kernel();
-+
-+ /* initialize the semaphore. We lock it here, the
-+ leave_thread call of the thread to be terminated
-+ will unlock it. As soon as we see the semaphore
-+ unlocked, we know that the thread has exited.
-+ */
-+ //init_MUTEX_LOCKED(&kthread->startstop_sem);
-+
-+ /* We need to do a memory barrier here to be sure that
-+ the flags are visible on all CPUs.
-+ */
-+ mb();
-+
-+ /* set flag to request thread termination */
-+ kthread->terminate = 1;
-+
-+ /* We need to do a memory barrier here to be sure that
-+ the flags are visible on all CPUs.
-+ */
-+ mb();
-+ kill_proc(kthread->thread->pid, SIGKILL, 1);
-+
-+ /* block till thread terminated */
-+ //down(&kthread->startstop_sem);
-+
-+ /* release the big kernel lock */
-+ unlock_kernel();
-+
-+ /* now we are sure the thread is in zombie state. We
-+ notify keventd to clean the process up.
-+ */
-+ kill_proc(2, SIGCHLD, 1);
-+
-+}
-+
-+/* initialize new created thread. Called by the new thread. */
-+void init_kthread(kthread_t *kthread, char *name)
-+{
-+ /* lock the kernel. A new kernel thread starts without
-+ the big kernel lock, regardless of the lock state
-+ of the creator (the lock level is *not* inheritated)
-+ */
-+ lock_kernel();
-+
-+ /* fill in thread structure */
-+ kthread->thread = current;
-+
-+ /* set signal mask to what we want to respond */
-+ siginitsetinv(¤t->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM));
-+
-+ /* initialise wait queue */
-+ init_waitqueue_head(&kthread->queue);
-+
-+ /* initialise termination flag */
-+ kthread->terminate = 0;
-+
-+ /* set name of this process (max 15 chars + 0 !) */
-+ sprintf(current->comm, name);
-+
-+ /* let others run */
-+ unlock_kernel();
-+
-+ /* tell the creator that we are ready and let him continue */
-+ //up(&kthread->startstop_sem);
-+
-+}
-+
-+/* cleanup of thread. Called by the exiting thread. */
-+void exit_kthread(kthread_t *kthread)
-+{
-+ /* we are terminating */
-+
-+ /* lock the kernel, the exit will unlock it */
-+ lock_kernel();
-+ kthread->thread = NULL;
-+ mb();
-+
-+ /* notify the stop_kthread() routine that we are terminating. */
-+ //up(&kthread->startstop_sem);
-+ /* the kernel_thread that called clone() does a do_exit here. */
-+
-+ /* there is no race here between execution of the "killer" and real termination
-+ of the thread (race window between up and do_exit), since both the
-+ thread and the "killer" function are running with the kernel lock held.
-+ The kernel lock will be freed after the thread exited, so the code
-+ is really not executed anymore as soon as the unload functions gets
-+ the kernel lock back.
-+ The init process may not have made the cleanup of the process here,
-+ but the cleanup can be done safely with the module unloaded.
-+ */
-+
-+}
-+
-+
-+
-+int os_atoi(const char *pStr)
-+{
-+ int retVal = -1;
-+
-+ if(*pStr=='-')
-+ retVal = -simple_strtoul(pStr+1, (char **)NULL, 10);
-+ else
-+ retVal = simple_strtoul(pStr, (char **)NULL, 10);
-+ return retVal ;
-+}
-+
-+
-+int os_atoh(const char *pStr)
-+{
-+ int retVal = -1;
-+
-+ if(*pStr=='-')
-+ retVal = -simple_strtoul(pStr+1, (char **)NULL, 16);
-+ else
-+ retVal = simple_strtoul(pStr, (char **)NULL, 16);
-+ return retVal ;
-+}
-+
-+unsigned long os_atoul(const char *pStr)
-+{
-+ unsigned long retVal = -1;
-+
-+ retVal = simple_strtoul(pStr, (char **)NULL, 10);
-+ return retVal ;
-+}
-+
-+void dprintf( int uDbgLevel, char * szFmt, ...)
-+{
-+#ifdef DEBUG_BUILD
-+ static char buff[256];
-+ va_list ap;
-+
-+ if( __guDbgLevel < uDbgLevel)
-+ return;
-+
-+ va_start( ap, szFmt);
-+ vsprintf((char *)buff, szFmt, ap);
-+ va_end(ap);
-+ printk("%s", buff);
-+#endif
-+}
-+
-+/*int strcmp(const char *s1, const char *s2)
-+{
-+
-+ int i=0;
-+
-+ while(s1[i] !=0)
-+ {
-+ if(s2[i]==0)
-+ return -1;
-+ if(s1[i] != s2[i])
-+ return 1;
-+ i++;
-+ }
-+ if(s2[i] != 0)
-+ return 1;
-+ return 0;
-+}
-+*/
-+
-+int shim_osLoadFWImage(char *ptr)
-+{
-+ unsigned int bytesRead;
-+ mm_segment_t oldfs;
-+ static struct file *filp;
-+ unsigned int imageLength=0x4ffff;
-+
-+
-+ dprintf(4, "tn7dsl_read_dsp()\n");
-+
-+ dprintf(4,"open file %s\n", DSP_FIRMWARE_PATH);
-+
-+ filp=filp_open(DSP_FIRMWARE_PATH
-+ ,00,O_RDONLY);
-+
-+ if(filp ==NULL)
-+ {
-+ printk("Failed: Could not open DSP binary file\n");
-+ return -1;
-+ }
-+
-+ if (filp->f_op->read==NULL)
-+ return -1; /* File(system) doesn't allow reads */
-+
-+ /* Now read bytes from postion "StartPos" */
-+ filp->f_pos = 0;
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytesRead = filp->f_op->read(filp,ptr,imageLength,&filp->f_pos);
-+
-+ dprintf(4,"file length = %d\n", bytesRead);
-+
-+ set_fs(oldfs);
-+
-+ /* Close the file */
-+ fput(filp);
-+
-+ return bytesRead;
-+}
-+
-+unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength)
-+{
-+ unsigned int bytesRead;
-+ mm_segment_t oldfs;
-+ struct file *filp;
-+
-+ dprintf(4,"shim_read_overlay_page\n");
-+ //dprintf(4,"sec offset=%d, sec length =%d\n", secOffset, secLength);
-+
-+ filp=filp_open(DSP_FIRMWARE_PATH,00,O_RDONLY);
-+ if(filp ==NULL)
-+ {
-+ printk("Failed: Could not open DSP binary file\n");
-+ return -1;
-+ }
-+
-+ if (filp->f_op->read==NULL)
-+ return -1; /* File(system) doesn't allow reads */
-+
-+ /* Now read bytes from postion "StartPos" */
-+
-+ if(filp->f_op->llseek)
-+ filp->f_op->llseek(filp,secOffset, 0);
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ filp->f_pos = secOffset;
-+ bytesRead = filp->f_op->read(filp,ptr,secLength,&filp->f_pos);
-+
-+ set_fs(oldfs);
-+ /* Close the file */
-+ fput(filp);
-+ return bytesRead;
-+}
-+
-+int shim_osLoadDebugFWImage(char *ptr)
-+{
-+ return 0;
-+}
-+int shim_osStringCmp(const char *s1, const char *s2)
-+{
-+ return strcmp(s1, s2);
-+}
-+
-+void *shim_osAllocateMemory(unsigned int size)
-+{
-+ return ((void *)kmalloc(size, GFP_KERNEL));
-+}
-+
-+void *shim_osAllocateDmaMemory(unsigned int size)
-+{
-+ /*
-+ int order;
-+
-+ order=1;
-+ size=size/4096;
-+ while(size >= 1)
-+ {
-+ order++;
-+ size=size/2;
-+ }
-+
-+ return ( (void *)__get_free_pages(GFP_ATOMIC, order));
-+ */
-+ //return ((void *)kmalloc(size, GFP_ATOMIC));
-+ //return ((void *)kmalloc(size, GFP_KERNEL));
-+ void *ptr;
-+
-+ ptr = kmalloc(size, GFP_ATOMIC);
-+ if(ptr==NULL)
-+ {
-+ printk("failed atomic\n");
-+ ptr = kmalloc(size, GFP_KERNEL);
-+ if(ptr==NULL)
-+ {
-+ printk("failed kernel\n");
-+ ptr = kmalloc(size, GFP_KERNEL|GFP_DMA);
-+ }
-+ }
-+ printk("size=%d\n", size);
-+ return ptr;
-+
-+}
-+
-+
-+void shim_osFreeMemory(void *ptr, unsigned int size)
-+{
-+
-+ kfree(ptr);
-+}
-+
-+void shim_osFreeDmaMemory(void *ptr, unsigned int size)
-+{
-+/*
-+ int order;
-+
-+ order=1;
-+ size=size/4096;
-+ while(size >=1)
-+ {
-+ order++;
-+ size=size/2;
-+ }
-+ free_pages(ptr, order);
-+*/
-+ kfree(ptr);
-+}
-+
-+void *shim_osAllocateVMemory(unsigned int size)
-+{
-+
-+ return ((void *)vmalloc(size));
-+}
-+
-+void shim_osFreeVMemory(void *ptr, unsigned int size)
-+{
-+ vfree(ptr);
-+}
-+
-+void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes)
-+{
-+ memcpy(dst, src, numBytes);
-+}
-+
-+void shim_osZeroMemory(char *dst, unsigned int numBytes)
-+{
-+ memset(dst, 0, numBytes);
-+}
-+
-+void shim_osWriteBackCache(void *addr, unsigned int size)
-+{
-+ unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
-+
-+ for (i=0;i<Size;i+=16,addr+=16)
-+ {
-+ __asm__(" .set mips3 ");
-+ __asm__(" cache 25, (%0)" : : "r" (addr));
-+ __asm__(" .set mips0 ");
-+ }
-+}
-+
-+void shim_osInvalidateCache(void *addr, unsigned int size)
-+{
-+ unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
-+
-+ for (i=0;i<Size;i+=16,addr+=16)
-+ {
-+ __asm__(" .set mips3 ");
-+ __asm__("cache 17, (%0)" : : "r" (addr));
-+ __asm__(" .set mips0 ");
-+ }
-+}
-+
-+void shim_osClockWait(int val)
-+{
-+ unsigned int chkvalue;
-+ chkvalue=val/64;
-+
-+ if(chkvalue > 1000)
-+ {
-+ mdelay(chkvalue/1000);
-+ return;
-+ }
-+ else
-+ udelay(val/64);
-+} /* end of cwait() */
-+
-+unsigned int shim_osClockTick(int val)
-+{
-+ return jiffies;
-+}
-+
-+int flags;
-+spinlock_t shimLock;
-+
-+void shim_osCriticalEnter(void)
-+{
-+ spin_lock_irqsave(&shimLock, flags);
-+
-+}
-+
-+
-+void shim_osCriticalExit(void)
-+{
-+ spin_unlock_irqrestore(&shimLock, flags);
-+}
-+
-+
-+int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,
-+ int *eof, void *data)
-+{
-+
-+ int len = 0;
-+ int limit = count - 80;
-+ int F4count, F5count;
-+
-+
-+ /* Read Ax5 Stats */
-+ dslhal_api_gatherStatistics(pIhw);
-+
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\nAR7 DSL Modem Statistics:\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "--------------------------------\n");
-+ /* us and ds Connection Rates */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "[DSL Modem Stats]\n");
-+
-+
-+ if(len<=limit)
-+ {
-+ if(pIhw->lConnected != 1)
-+ {
-+ pIhw->AppData.USConRate = 0;
-+ pIhw->AppData.DSConRate = 0;
-+ }
-+ len += sprintf(buf+len, "\tUS Connection Rate:\t%u\tDS Connection Rate:\t%u\n",
-+ (unsigned int)pIhw->AppData.USConRate,
-+ (unsigned int)pIhw->AppData.DSConRate );
-+ }
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tDS Line Attenuation:\t%u\tDS Margin:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.dsLineAttn/2,
-+ (unsigned int)pIhw->AppData.dsMargin/2 );
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tUS Line Attenuation:\t%u\tUS Margin:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.usLineAttn,
-+ (unsigned int)pIhw->AppData.usMargin );
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tUS Payload :\t\t%u\tDS Payload:\t\t%u\n",
-+ ((unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1])*48,
-+ ((unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1])*48);
-+ /* Superframe Count */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tUS Superframe Cnt :\t%u\tDS Superframe Cnt:\t%u\n",
-+ (unsigned int)pIhw->AppData.usSuperFrmCnt,
-+ (unsigned int)pIhw->AppData.dsSuperFrmCnt );
-+
-+ /* US and DS power */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tUS Transmit Power :\t%u\tDS Transmit Power:\t%u\n",
-+ (unsigned int)pIhw->AppData.usTxPower/256,
-+ (unsigned int)pIhw->AppData.dsTxPower/256 );
-+ /* DSL Stats Errors*/
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tLOS errors:\t\t%u\tSEF errors:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.LOS_errors,
-+ (unsigned int)pIhw->AppData.SEF_errors );
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tFrame mode:\t\t%u\tMax Frame mode:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.FrmMode,
-+ (unsigned int)pIhw->AppData.MaxFrmMode );
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tTrained Path:\t\t%u\tUS Peak Cell Rate:\t%u\n",
-+ (unsigned int)pIhw->AppData.TrainedPath,
-+ (unsigned int)pIhw->AppData.USConRate*1000/8/53 );
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tTrained Mode:\t\t%u\tSelected Mode:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.TrainedMode, (unsigned int)pIhw->AppData.StdMode );
-+
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tATUC Vendor ID:\t%u\tATUC Revision:\t\t%u\n",
-+ (unsigned int)pIhw->AppData.atucVendorId, pIhw->AppData.atucRevisionNum);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tHybrid Selected:\t%u\n",
-+ (unsigned int)pIhw->AppData.currentHybridNum);
-+
-+ /* Upstream Interleaved Errors */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Upstream (TX) Interleave path]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
-+ (unsigned int)pIhw->AppData.usICRC_errors,
-+ (unsigned int)pIhw->AppData.usIFEC_errors,
-+ (unsigned int)pIhw->AppData.usINCD_error);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
-+ (unsigned int)pIhw->AppData.usILCD_errors,
-+ (unsigned int)pIhw->AppData.usIHEC_errors);
-+ /* Downstream Interleaved Errors */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Downstream (RX) Interleave path]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
-+ (unsigned int)pIhw->AppData.dsICRC_errors,
-+ (unsigned int)pIhw->AppData.dsIFEC_errors,
-+ (unsigned int)pIhw->AppData.dsINCD_error);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
-+ (unsigned int)pIhw->AppData.dsILCD_errors,
-+ (unsigned int)pIhw->AppData.dsIHEC_errors);
-+ /* Upstream Fast Errors */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Upstream (TX) Fast path]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
-+ (unsigned int)pIhw->AppData.usFCRC_errors,
-+ (unsigned int)pIhw->AppData.usFFEC_errors,
-+ (unsigned int)pIhw->AppData.usFNCD_error);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
-+ (unsigned int)pIhw->AppData.usFLCD_errors,
-+ (unsigned int)pIhw->AppData.usFHEC_errors);
-+ /* Downstream Fast Errors */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Downstream (RX) Fast path]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
-+ (unsigned int)pIhw->AppData.dsFCRC_errors,
-+ (unsigned int)pIhw->AppData.dsFFEC_errors,
-+ (unsigned int)pIhw->AppData.dsFNCD_error);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
-+ (unsigned int)pIhw->AppData.dsFLCD_errors,
-+ (unsigned int)pIhw->AppData.dsFHEC_errors);
-+ /* ATM stats upstream */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n[ATM Stats]");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Upstream/TX]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\n",
-+ (unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1],
-+ (unsigned int)pIhw->AppData.usIdle_count[0] + (unsigned int)pIhw->AppData.usIdle_count[1]);
-+ /* ATM stats downstream */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n\t[Downstream/RX)]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\tBad Hec Cell Cnt:\t%u\n",
-+ (unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1],
-+ (unsigned int)pIhw->AppData.dsIdle_count[0] + (unsigned int)pIhw->AppData.dsIdle_count[1],
-+ (unsigned int)pIhw->AppData.dsBadHec_count[0] + (unsigned int)pIhw->AppData.dsBadHec_count[1]);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tOverflow Dropped Cell Cnt:\t%u\n",
-+ (unsigned int)pIhw->AppData.dsOVFDrop_count[0] + (unsigned int)pIhw->AppData.dsOVFDrop_count[1]);
-+ tn7sar_get_stats(pIhw->pOsContext);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n[SAR AAL5 Stats]\n");
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tTx PDU's:\t%u\n\tRx PDU's:\t%u\n",
-+ sarStat.txPktCnt,
-+ sarStat.rxPktCnt);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tTx Total Bytes:\t%u\n\tRx Total Bytes:\t%u\n",
-+ sarStat.txBytes,
-+ sarStat.rxBytes);
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\tTx Total Error Counts:\t%u\n\tRx Total Error Counts:\t%u\n\n",
-+ sarStat.txErrors,
-+ sarStat.rxErrors);
-+
-+ /* oam loopback info */
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n[OAM Stats]\n");
-+
-+ tn7sar_get_near_end_loopback_count(&F4count, &F5count);
-+
-+ if(len<=limit)
-+ {
-+ len += sprintf(buf+len, "\tNear End F5 Loop Back Count:\t%u\n\tNear End F4 Loop Back Count:\t%u\n\tFar End F5 Loop Back Count:\t%u\n\tFar End F4 Loop Back Count:\t%u\n",
-+ F5count,
-+ F4count,
-+ oamFarLBCount[0] + oamFarLBCount[2],
-+ oamFarLBCount[1] + oamFarLBCount[3]);
-+ }
-+ return len;
-+}
-+
-+int
-+tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,
-+ int *eof, void *data)
-+{
-+
-+ int len = 0;
-+ int limit = count - 80;
-+
-+ char *state;
-+ int tag;
-+
-+ tag= dslhal_api_pollTrainingStatus(pIhw);
-+ tag = pIhw->AppData.bState;
-+
-+ switch(tag){
-+ case 0: state = "ACTREQ"; break;
-+ case 1: state = "QUIET1"; break;
-+ case 2: state = "IDLE"; break;
-+ case 3: state = "INIT"; break;
-+ case 4: state = "RTDL"; break;
-+ case 5: state = "SHOWTIME"; break;
-+ default: state = "unknown"; break;
-+ }
-+
-+ if(pIhw->lConnected == 1)
-+ state = "SHOWTIME";
-+ if(len<=limit)
-+ len += sprintf(buf+len,"%s\n",state);
-+
-+ return len;
-+}
-+
-+
-+
-+int tn7dsl_handle_interrupt(void)
-+{
-+ int intsrc;
-+ unsigned char cMsgRa[6];
-+ short margin;
-+
-+ dprintf(4, "tn7dsl_handle_dsl_interrupt()\n");
-+ if(pIhw)
-+ {
-+ intsrc=dslhal_api_acknowledgeInterrupt(pIhw);
-+ dslhal_api_handleTrainingInterrupt(pIhw, intsrc);
-+
-+ if(pIhw->lConnected == TC_SYNC)
-+ {
-+
-+ if(dslInSync == 0)
-+ {
-+ printk("DSL in Sync\n");
-+ tn7atm_device_connect_status(pIhw->pOsContext, 1);
-+ dslhal_api_initStatistics(pIhw);
-+ dslhal_api_gatherStatistics(pIhw);
-+#ifdef CONFIG_LED_MODULE
-+ led_operation(MOD_ADSL, DEF_ADSL_SYNC);
-+ led_on = DEF_ADSL_SYNC;
-+#endif
-+ /* add auto margin retrain */
-+ if(pIhw->AppData.TrainedMode < 5)
-+ {
-+ if(bMarginRetrainEnable && bMarginThConfig == 0)
-+ {
-+ dslhal_support_getCMsgsRa(pIhw, cMsgRa);
-+ margin = *(unsigned short *)&cMsgRa[4];
-+ margin = (margin >> 6) & 0x3f;
-+ if(margin & 0x20) // highest bit is 1
-+ {
-+ margin = -(margin & 0x1f);
-+ }
-+
-+ //printk("margin = %d, cmsg-ra = %02x %02x %02x %02x %02x %02x\n", margin, cMsgRa[0],cMsgRa[1],cMsgRa[2],cMsgRa[3],cMsgRa[4],cMsgRa[5]);
-+ dslhal_api_setMarginThreshold(pIhw, margin*2); /* DSL margin is in 0.5db */
-+ }
-+ }
-+
-+ }
-+ dslInSync = 1;
-+ }
-+ else
-+ {
-+ if(dslInSync == 1)
-+ {
-+ dslInSync = 0;
-+ tn7atm_device_connect_status(pIhw->pOsContext, 0);
-+ up(&adsl_sem_overlay);
-+ printk("DSL out of syn\n");
-+ }
-+#ifdef CONFIG_LED_MODULE
-+ if(pIhw->AppData.bState < RSTATE_INIT)
-+ {
-+ if(led_on != DEF_ADSL_IDLE)
-+ {
-+ led_operation(MOD_ADSL, DEF_ADSL_IDLE);
-+ led_on = DEF_ADSL_IDLE;
-+ }
-+ }
-+ else
-+ {
-+ if(led_on != DEF_ADSL_TRAINING)
-+ {
-+ led_operation(MOD_ADSL, DEF_ADSL_TRAINING);
-+ led_on = DEF_ADSL_TRAINING;
-+ }
-+
-+ }
-+
-+#endif
-+
-+ }
-+ }
-+ return 0;
-+}
-+
-+
-+int tn7dsl_get_dslhal_version(char *pVer)
-+{
-+ dslVer ver;
-+
-+ dslhal_api_getDslHalVersion(&ver);
-+
-+ memcpy(pVer,&ver,8);
-+ return 0;
-+}
-+
-+int tn7dsl_get_dsp_version(char *pVer)
-+{
-+ dspVer ver;
-+ dslhal_api_getDspVersion(pIhw, &ver);
-+ memcpy(pVer, &ver, 9);
-+ return 0;
-+}
-+
-+
-+static int
-+tn7dsl_get_modulation(void)
-+{
-+ char *ptr = NULL;
-+
-+ dprintf(4, "tn7dsl_get_modulation\n");
-+ //printk("tn7dsl_get_modulation\n");
-+ ptr = prom_getenv("modulation");
-+
-+ if (!ptr) {
-+ //printk("modulation is not set in adam2 env\n");
-+ //printk("Using multimode\n");
-+ return 0;
-+ }
-+ printk("dsl modulation = %s\n", ptr);
-+
-+ tn7dsl_set_modulation(ptr);
-+
-+ return 0;
-+}
-+
-+
-+static int tn7dsl_set_dsl(void)
-+{
-+
-+ char *ptr = NULL;
-+ int value;
-+ int i, offset[2]={4,11},oamFeature=0;
-+ char tmp[4];
-+ char dspVer[10];
-+
-+ // OAM Feature Configuration
-+ dslhal_api_dspInterfaceRead(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
-+ oamFeature |= dslhal_support_byteSwap32(0x0000000C);
-+ dslhal_api_dspInterfaceWrite(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
-+
-+ // modulation
-+ ptr = prom_getenv("modulation");
-+ if (ptr)
-+ {
-+ printk("dsl modulation = %s\n", ptr);
-+ tn7dsl_set_modulation(ptr);
-+ }
-+
-+ // margin retrain
-+ ptr = NULL;
-+ ptr = prom_getenv("enable_margin_retrain");
-+ if(ptr)
-+ {
-+ value = os_atoi(ptr);
-+ if(value == 1)
-+ {
-+ dslhal_api_setMarginMonitorFlags(pIhw, 0, 1);
-+ bMarginRetrainEnable = 1;
-+ printk("enable showtime margin monitor.\n");
-+ ptr = NULL;
-+ ptr = prom_getenv("margin_threshold");
-+ if(ptr)
-+ {
-+ value = os_atoi(ptr);
-+ printk("Set margin threshold to %d x 0.5 db\n",value);
-+ if(value >= 0)
-+ {
-+ dslhal_api_setMarginThreshold(pIhw, value);
-+ bMarginThConfig=1;
-+ }
-+ }
-+ }
-+ }
-+
-+ // rate adapt
-+ ptr = NULL;
-+ ptr = prom_getenv("enable_rate_adapt");
-+ if(ptr)
-+ {
-+ dslhal_api_setRateAdaptFlag(pIhw, os_atoi(ptr));
-+ }
-+
-+ // trellis
-+ ptr = NULL;
-+ ptr = prom_getenv("enable_trellis");
-+ if(ptr)
-+ {
-+ dslhal_api_setTrellisFlag(pIhw, os_atoi(ptr));
-+ }
-+
-+ // maximum bits per carrier
-+ ptr = NULL;
-+ ptr = prom_getenv("maximum_bits_per_carrier");
-+ if(ptr)
-+ {
-+ dslhal_api_setMaxBitsPerCarrier(pIhw, os_atoi(ptr));
-+ }
-+
-+ // maximum interleave depth
-+ ptr = NULL;
-+ ptr = prom_getenv("maximum_interleave_depth");
-+ if(ptr)
-+ {
-+ dslhal_api_setMaxInterleaverDepth(pIhw, os_atoi(ptr));
-+ }
-+
-+ // inner and outer pairs
-+ ptr = NULL;
-+ ptr = prom_getenv("pair_selection");
-+ if(ptr)
-+ {
-+ dslhal_api_selectInnerOuterPair(pIhw, os_atoi(ptr));
-+ }
-+
-+ ptr = NULL;
-+ ptr = prom_getenv("dgas_polarity");
-+ if(ptr)
-+ {
-+ dslhal_api_configureDgaspLpr(pIhw, 1, 1);
-+ dslhal_api_configureDgaspLpr(pIhw, 0, os_atoi(ptr));
-+ }
-+
-+ ptr = NULL;
-+ ptr = prom_getenv("los_alarm");
-+ if(ptr)
-+ {
-+ dslhal_api_disableLosAlarm(pIhw, os_atoi(ptr));
-+ }
-+
-+ ptr = NULL;
-+ ptr = prom_getenv("eoc_vendor_id");
-+ if(ptr)
-+ {
-+ for(i=0;i<8;i++)
-+ {
-+ tmp[0]=ptr[i*2];
-+ tmp[1]=ptr[i*2+1];
-+ tmp[2]=0;
-+ EOCVendorID[i] = os_atoh(tmp);
-+ //printk("tmp=%s--", tmp);
-+ //printk("ID[%d]=0x%02x ", i, (unsigned char)EOCVendorID[i]);
-+ }
-+ tn7dsl_get_dsp_version(dspVer);
-+ //printk("Annex =%d\n", dspVer[8]);
-+ if(dspVer[8]==2) // annex b
-+ {
-+ //printk("EOCVendorID=%02x %02x %02x %02x %02x %02x %02x %02x\n", EOCVendorID[0], EOCVendorID[1], EOCVendorID[2], EOCVendorID[3],
-+ // EOCVendorID[4], EOCVendorID[5], EOCVendorID[6], EOCVendorID[7]);
-+ dslhal_api_setEocVendorId(pIhw, EOCVendorID);
-+ }
-+
-+ }
-+
-+ return 0;
-+}
-+
-+
-+
-+
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: static void tn7dsl_init(void)
-+ *
-+ * Description: This function initializes
-+ * Ar7 DSL interface
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+
-+int tn7dsl_init(void *priv)
-+{
-+
-+ printk("Initializing DSL interface\n");
-+
-+
-+ /* start dsl */
-+ if(dslhal_api_dslStartup(&pIhw) !=0 )
-+ {
-+ printk("DSL start failed.\n");
-+ return -1;
-+ }
-+
-+ // set dsl into overlay page reload mode
-+ pIhw->bAutoRetrain = 1;
-+
-+ // set default training properties
-+ tn7dsl_set_dsl();
-+
-+ pIhw->pOsContext = priv;
-+
-+ //start_kthread(tn7dsl_reload_overlay, &overlay_thread);
-+
-+ /*register dslss LED with led module */
-+#ifdef CONFIG_LED_MODULE
-+ tn7dsl_register_dslss_led();
-+#endif
-+
-+
-+ return 0; /* What do we return here? */
-+}
-+
-+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ * Function: int avsar_exit(void)
-+ *
-+ * Description: Avalanche SAR exit function
-+ *
-+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-+
-+void tn7dsl_exit (void)
-+{
-+
-+ bshutdown = 1;
-+#ifdef CONFIG_LED_MODULE
-+#ifdef DEREGISTER_LED
-+ //down(&adsl_sem_overlay);
-+ deregister_led_drv(LED_NUM_1);
-+ deregister_led_drv(LED_NUM_2);
-+#else
-+ led_operation(MOD_ADSL,DEF_ADSL_IDLE);
-+#endif
-+#endif
-+ stop_kthread(&overlay_thread);
-+ dslhal_api_dslShutdown(pIhw);
-+
-+}
-+
-+
-+static int tn7dsl_process_oam_string(int *type, int *pvpi, int *pvci, int *pdelay)
-+{
-+ int i=1;
-+ int j=0;
-+ int vci, vpi;
-+ char tmp[16];
-+ int chan;
-+ int tt;
-+
-+ while(j<8)
-+ {
-+ tmp[j] = mod_req[i];
-+ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
-+ if(tmp[j] == 0x50 || tmp[j] == 0x70)
-+ break;
-+ j++;
-+ i++;
-+ }
-+
-+ tmp[j] = 0;
-+ vpi = os_atoi(tmp);
-+
-+ i++;
-+ j=0;
-+ while(j<8)
-+ {
-+ tmp[j] = mod_req[i];
-+ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
-+ if(tmp[j] == 0x43 || tmp[j] == 0x63)
-+ break;
-+
-+ j++;
-+ i++;
-+ }
-+
-+ vci = os_atoi(tmp);
-+
-+ if(vci==0) // f4 oam
-+ *type = 1;
-+ else
-+ *type = 0;
-+
-+
-+ tt=5000;
-+ i++;
-+ j=0;
-+ tmp[j] = mod_req[i];
-+ if(tmp[j]==0x44 || tmp[j]==0x64)
-+ {
-+ i++;
-+ while(j<8)
-+ {
-+ tmp[j] = mod_req[i];
-+
-+ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
-+ if(tmp[j] == 0x54 || tmp[j] == 0x74)
-+ break;
-+
-+ j++;
-+ i++;
-+ }
-+ tt = os_atoi(tmp);
-+ }
-+
-+ chan = tn7atm_lut_find(vpi, vci);
-+
-+ *pvci=vci;
-+ *pvpi=vpi;
-+ *pdelay =tt;
-+ dprintf(2, "oam chan=%d, type =%d\n", chan, *type);
-+
-+ return chan;
-+}
-+
-+static void tn7dsl_dump_memory(void)
-+{
-+ unsigned int *pUi;
-+ int i=1;
-+ int j=0;
-+ int addr, len;
-+ char tmp[16];
-+
-+
-+ while(j<8)
-+ {
-+ tmp[j] = mod_req[i];
-+ j++;
-+ i++;
-+ }
-+
-+ tmp[j] = 0;
-+
-+ addr = os_atoh(tmp);
-+
-+ printk("start dump address =0x%x\n", addr);
-+ pUi = (unsigned int *)addr;
-+ i++;
-+ j=0;
-+ while(j<8)
-+ {
-+ tmp[j] = mod_req[i];
-+ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
-+ if(tmp[j] == 0x43 || tmp[j] == 0x63)
-+ break;
-+
-+ j++;
-+ i++;
-+ }
-+
-+ len = os_atoi(tmp);
-+ j=0;
-+ for(i=0; i<len; i++)
-+ {
-+ if(j==0)
-+ printk("0x%08x: ", (unsigned int)pUi);
-+ printk("%08x ", *pUi);
-+ pUi++;
-+ j++;
-+ if(j==4)
-+ {
-+ printk("\n");
-+ j=0;
-+ }
-+ }
-+
-+}
-+
-+
-+
-+static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp,
-+ void *buffer, size_t *lenp)
-+{
-+ char *ptr;
-+ int ret, len = 0;
-+ int chan;
-+ int type;
-+ int vpi,vci,timeout;
-+
-+ if (!*lenp || (filp->f_pos && !write)) {
-+ *lenp = 0;
-+ return 0;
-+ }
-+ /* DSL MODULATION is changed */
-+ if(write)
-+ {
-+ ret = proc_dostring(ctl, write, filp, buffer, lenp);
-+
-+ switch (ctl->ctl_name)
-+ {
-+ case DEV_DSLMOD:
-+ ptr = strpbrk(info, " \t");
-+ strcpy(mod_req, info);
-+
-+ /* parse the string to determine the action */
-+ if(mod_req[0] == 0x45 || mod_req[0] == 0x65 ) // 'e', or 'E' f5 end to end
-+ {
-+ chan = tn7dsl_process_oam_string(&type, &vpi, &vci, &timeout);
-+ tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci, timeout);
-+ }
-+ else if(mod_req[0] == 0x53 || mod_req[0] == 0x73 ) // 's', or 'S' f5 seg to seg
-+ {
-+ chan=tn7dsl_process_oam_string(&type, &vpi, &vci,&timeout);
-+ type = type | (1<<1);
-+ tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci,timeout);
-+ }
-+ //debug only. Dump memory
-+ else if(mod_req[0] == 0x44 || mod_req[0] == 0x64 ) // 'd' or 'D'
-+ tn7dsl_dump_memory();
-+ else
-+ tn7dsl_chng_modulation(info);
-+ break;
-+ }
-+ }
-+ else
-+ {
-+ len += sprintf(info+len, mod_req);
-+ ret = proc_dostring(ctl, write, filp, buffer, lenp);
-+ }
-+ return ret;
-+}
-+
-+
-+ctl_table dslmod_table[] = {
-+ {DEV_DSLMOD, "dslmod", info, DSL_MOD_SIZE, 0644, NULL, &dslmod_sysctl},
-+ {0}
-+ };
-+
-+/* Make sure that /proc/sys/dev is there */
-+ctl_table dslmod_root_table[] = {
-+#ifdef CONFIG_PROC_FS
-+ {CTL_DEV, "dev", NULL, 0, 0555, dslmod_table},
-+#endif /* CONFIG_PROC_FS */
-+ {0}
-+ };
-+
-+static struct ctl_table_header *dslmod_sysctl_header;
-+
-+void tn7dsl_dslmod_sysctl_register(void)
-+{
-+ static int initialized;
-+
-+ if (initialized == 1)
-+ return;
-+
-+ dslmod_sysctl_header = register_sysctl_table(dslmod_root_table, 1);
-+ dslmod_root_table->child->de->owner = THIS_MODULE;
-+
-+ /* set the defaults */
-+ info[0] = 0;
-+
-+ initialized = 1;
-+}
-+
-+void tn7dsl_dslmod_sysctl_unregister(void)
-+{
-+ unregister_sysctl_table(dslmod_sysctl_header);
-+}
-+
-+static void
-+tn7dsl_set_modulation(void* data)
-+{
-+ dprintf(4,"tn7dsl_set_modulation\n");
-+
-+ if(!strcmp(data, "T1413"))
-+ {
-+ printk("retraining in T1413 mode\n");
-+ dslhal_api_setTrainingMode(pIhw, T1413_MODE);
-+ return;
-+ }
-+ if(!strcmp(data, "GDMT"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
-+ return;
-+ }
-+ if(!strcmp(data, "GLITE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
-+ return;
-+ }
-+ if(!strcmp(data, "MMODE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
-+ return;
-+ }
-+ if(!strcmp(data, "NMODE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, NO_MODE);
-+ return;
-+ }
-+
-+ return;
-+}
-+
-+
-+/* Codes added for compiling tiadiag.o for Analog Diagnostic tests */
-+#ifdef ADIAG
-+
-+enum
-+{
-+ HOST_ACTREQ, // Send R-ACKREQ and monitor for C-ACKx
-+ HOST_QUIET, // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
-+ HOST_XMITBITSWAP, // Perform upstream bitswap - FOR INTERNAL USE ONLY
-+ HOST_RCVBITSWAP, // Perform downstream bitswap - FOR INTERNAL USE ONLY
-+ HOST_RTDLPKT, // Send a remote download packet - FOR INTERNAL USE ONLY
-+ HOST_CHANGELED, // Read the LED settings and change accordingly
-+ HOST_IDLE, // Sit quiet
-+ HOST_REVERBTEST, // Generate REVERB for manufacturing test
-+ HOST_CAGCTEST, // Set coarse receive gain for manufacturing test
-+ HOST_DGASP, // send Dying Gasp messages through EOC channel
-+ HOST_GHSREQ, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHS_SENDGALF, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSEXIT, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_GHSMSG1, // G.hs - FOR INTERNAL USE ONLY
-+ HOST_HYBRID, // Enable/Disable automatic hybrid switch
-+ HOST_RJ11SELECT, // RJ11 inner/outer pair select
-+ HOST_DIGITAL_MEM, // Digital Diags: run external memory tests
-+ HOST_TXREVERB, // AFE Diags: TX path Reverb
-+ HOST_TXMEDLEY, // AFE Diags: TX path Medley
-+ HOST_RXNOISEPOWER, // AFE Diags: RX noise power
-+ HOST_ECPOWER, // AFE Diags: RX eco power
-+ HOST_ALL_ADIAG, // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
-+ HOST_USER_ADIAG, // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
-+ HOST_QUIT_ADIAG, // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
-+ HOST_NO_CMD, // All others - G.hs - FOR INTERNAL USE ONLY
-+ HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
-+ HOST_SET_GENERIC, // Set generic CO profile
-+ HOST_UNDO_GENERIC // Set profile previous to Generic
-+};
-+
-+enum
-+{
-+ DSP_IDLE, // R_IDLE state entered
-+ DSP_ACTMON, // R_ACTMON state entered
-+ DSP_TRAIN, // R_TRAIN state entered
-+ DSP_ACTIVE, // R_ACTIVE state entered
-+ DSP_XMITBITSWAP, // Upstream bitswap complete - FOR INTERNAL USE ONLY
-+ DSP_RCVBITSWAP, // Downstream bitswap complete - FOR INTERNAL USE ONLY
-+ DSP_RTDL, // R_RTDL state entered - FOR INTERNAL USE ONLY
-+ DSP_RRTDLPKT, // RTDL packet received - FOR INTERNAL USE ONLY
-+ DSP_XRTDLPKT, // RTDL packet transmitted - FOR INTERNAL USE ONLY
-+ DSP_ERROR, // Command rejected, wrong state for this command
-+ DSP_REVERBTEST, // Manufacturing REVERB test mode entered
-+ DSP_CAGCTEST, // Manufacturing receive gain test done
-+ DSP_OVERLAY_START, // Notify host that page overlay has started - overlay number indicated by "tag"
-+ DSP_OVERLAY_END, // Notify host that page overlay has ended - overlay number indicated by "tag"
-+ DSP_CRATES1, // CRATES1 message is valid and should be copied to host memory now
-+ DSP_SNR, // SNR calculations are ready and should be copied to host memory now
-+ DSP_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
-+ DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
-+ DSP_ATM_TC_SYNC, // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
-+ DSP_ATM_NO_TC_SYNC, // Indicates loss of sync on phy layer on either US or DS.
-+ DSP_HYBRID, // DSP completed hybrid switch
-+ DSP_RJ11SELECT, // DSP completed RJ11 inner/outer pair select
-+ DSP_INVALID_CMD, // Manufacturing (Digital and AFE) diags: CMD received not recognized
-+ DSP_TEST_PASSED, // Manufacturing diags: test passed
-+ DSP_TEST_FAILED, // Manufacturing diags: test failed
-+ DSP_TXREVERB, // Manufacturing AFE diags: Response to HOST_TXREVERB
-+ DSP_TXMEDLEY, // Manufacturing AFE diags: Response to HOST_TXMEDLEY
-+ DSP_RXNOISEPOWER, // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
-+ DSP_ECPOWER, // Manufacturing AFE diags: Response to HOST_ECPOWER
-+ DSP_ALL_ADIAG, // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
-+ DSP_USER_ADIAG, // Manufacturing AFE diags: Response to HOST_USER_ADIAG
-+ DSP_QUIT_ADIAG, // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
-+ DSP_DGASP // DSP Message to indicate dying gasp
-+};
-+
-+static unsigned char analogNoTonesTestArray[64]=
-+ {
-+ 0,0,0,0,0,0,0,0, // Tones 01-08
-+ 0,0,0,0,0,0,0,0, // Tones 09-16
-+ 0,0,0,0,0,0,0,0, // Tones 17-24
-+ 0,0,0,0,0,0,0,0, // Tones 25-32
-+ 0,0,0,0,0,0,0,0, // Tones 33-40
-+ 0,0,0,0,0,0,0,0, // Tones 41-48
-+ 0,0,0,0,0,0,0,0, // Tones 49-56
-+ 0,0,0,0,0,0,0,0 // Tones 57-64
-+ };
-+
-+static unsigned char analogAllTonesTestArray[64]=
-+ {
-+ 1,1,1,1,1,1,1,1, // Tones 01-08
-+ 1,1,1,1,1,1,1,1, // Tones 09-16
-+ 1,1,1,1,1,1,1,1, // Tones 17-24
-+ 1,1,1,1,1,1,1,1, // Tones 25-32
-+ 1,1,1,1,1,1,1,1, // Tones 33-40
-+ 1,1,1,1,1,1,1,1, // Tones 41-48
-+ 1,1,1,1,1,1,1,1, // Tones 49-56
-+ 1,1,1,1,1,1,1,1 // Tones 57-64
-+ };
-+
-+static unsigned char analogEvenTonesTestArray[64]=
-+ {
-+ 0,1,0,1,0,1,0,1, // Tones 01-08
-+ 0,1,0,1,0,1,0,1, // Tones 09-16
-+ 0,1,0,1,0,1,0,1, // Tones 17-24
-+ 0,1,0,1,0,1,0,1, // Tones 25-32
-+ 0,1,0,1,0,1,0,1, // Tones 33-40
-+ 0,1,0,1,0,1,0,1, // Tones 41-48
-+ 0,1,0,1,0,1,0,1, // Tones 49-56
-+ 0,1,0,1,0,1,0,1 // Tones 57-64
-+ };
-+
-+static unsigned char analogOddTonesTestArray[64]=
-+ {
-+ 1,0,1,0,1,0,1,0, // Tones 01-08
-+ 1,0,1,0,1,0,1,0, // Tones 09-16
-+ 1,0,1,0,1,0,1,0, // Tones 17-24
-+ 1,0,1,0,1,0,1,0, // Tones 25-32
-+ 1,0,1,0,1,0,1,0, // Tones 33-40
-+ 1,0,1,0,1,0,1,0, // Tones 41-48
-+ 1,0,1,0,1,0,1,0, // Tones 49-56
-+ 1,0,1,0,1,0,1,0 // Tones 57-64
-+ };
-+
-+int shim_osGetCpuFrequency(void)
-+{
-+ return 150;
-+}
-+
-+static void tn7dsl_adiag(int Test, unsigned char *missingTones)
-+{
-+ int rc,cmd, tag;
-+
-+ rc = dslhal_diags_anlg_setMissingTones(pIhw,missingTones);
-+ if(rc)
-+ {
-+ printk(" failed to set Missing town\n");
-+ return;
-+ }
-+
-+/*********** Start the actual test **********************/
-+
-+ if(Test==0)
-+ {
-+ printk("TX REVERB Test\n");
-+ rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXREVERB, 0, 0, 0);
-+ if (rc)
-+ {
-+ printk("HOST_TXREVERB failed\n");
-+ return;
-+ }
-+
-+ }
-+ if(Test==1)
-+ {
-+ dprintf(0,"TX MEDLEY Test\n");
-+ rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXMEDLEY, 0, 0, 0);
-+ if (rc)
-+ return;
-+ }
-+ dprintf(4,"dslhal_diags_anlg_testA() done\n");
-+ return;
-+}
-+
-+
-+static void tn7dsl_diagnostic_test(char *data)
-+{
-+ if(!strcmp(data, "ADIAGRALL"))
-+ {
-+ printk("TX Reverb All tone\n");
-+ tn7dsl_adiag(0,analogAllTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGRNONE"))
-+ {
-+ printk("TX Reverb No tone\n");
-+ tn7dsl_adiag(0,analogNoTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGREVEN"))
-+ {
-+ printk("TX Reverb Even tone\n");
-+ tn7dsl_adiag(0,analogEvenTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGRODD"))
-+ {
-+ printk("TX Reverb Odd tone\n");
-+ tn7dsl_adiag(0,analogOddTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGMALL"))
-+ {
-+ printk("TX Mdelay All tone\n");
-+ tn7dsl_adiag(1,analogAllTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGMNONE"))
-+ {
-+ printk("TX Mdelay No tone\n");
-+ tn7dsl_adiag(1,analogNoTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGMEVEN"))
-+ {
-+ printk("TX Mdelay Even tone\n");
-+ tn7dsl_adiag(1,analogEvenTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGMODD"))
-+ {
-+ printk("TX Mdelay Odd tone\n");
-+ tn7dsl_adiag(1,analogOddTonesTestArray);
-+ return;
-+ }
-+ if(!strcmp(data, "ADIAGQUIET"))
-+ {
-+ dslhal_api_sendIdle(pIhw);
-+ return;
-+ }
-+ if(!strncmp(data, "ADIAGRN", 7))
-+ {
-+ char tones[64], tmp[4];
-+ int nth, i;
-+
-+ tmp[0]=data[7];
-+ tmp[1]=data[8];
-+ tmp[2]=data[9];
-+
-+ nth = os_atoi(tmp);
-+
-+ for(i=0;i<64;i++)
-+ {
-+ if(((i+1)% nth)==0)
-+ {
-+ tones[i]=0;
-+ }
-+ else
-+ {
-+ tones[i]=1;
-+ }
-+ }
-+ printk("TX Reverb with %dth tones missing.\n", nth);
-+ tn7dsl_adiag(0,tones);
-+ return;
-+ }
-+ if(!strncmp(data, "ADIAGMN", 7))
-+ {
-+ char tones[64], tmp[4];
-+ int nth, i;
-+
-+ tmp[0]=data[7];
-+ tmp[1]=data[8];
-+ tmp[2]=data[9];
-+ nth = os_atoi(tmp);
-+
-+ for(i=0;i<64;i++)
-+ {
-+ if(((i+1)% nth)==0)
-+ {
-+ tones[i]=0;
-+ }
-+ else
-+ {
-+ tones[i]=1;
-+ }
-+ }
-+ printk("TX Mdelay with %dth tones missing.\n", nth);
-+ tn7dsl_adiag(1,tones);
-+ return;
-+ }
-+
-+
-+}
-+
-+#endif
-+
-+static void
-+tn7dsl_chng_modulation(void* data)
-+{
-+ //printk("DSL Modem Retraining\n");
-+
-+ if(!strcmp(data, "T1413"))
-+ {
-+ printk("retraining in T1413 mode\n");
-+ dslhal_api_setTrainingMode(pIhw, T1413_MODE);
-+ dslhal_api_sendQuiet(pIhw);
-+ return;
-+ }
-+ if(!strcmp(data, "GDMT"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
-+ dslhal_api_sendQuiet(pIhw);
-+ return;
-+ }
-+ if(!strcmp(data, "GLITE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
-+ dslhal_api_sendQuiet(pIhw);
-+ return;
-+ }
-+ if(!strcmp(data, "MMODE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
-+ dslhal_api_sendQuiet(pIhw);
-+ return;
-+ }
-+ if(!strcmp(data, "NMODE"))
-+ {
-+ dslhal_api_setTrainingMode(pIhw, NO_MODE);
-+ dslhal_api_sendQuiet(pIhw);
-+ return;
-+ }
-+
-+#ifdef ADIAG
-+ tn7dsl_diagnostic_test(data);
-+#endif
-+
-+
-+ return;
-+}
-+
-+#ifdef CONFIG_LED_MODULE
-+static void tn7dsl_led_on(unsigned long parm)
-+{
-+ dslhal_api_configureLed(pIhw,parm, 0);
-+}
-+
-+
-+static void tn7dsl_led_off(unsigned long parm)
-+{
-+ dslhal_api_configureLed(pIhw,parm, 1);
-+}
-+
-+static void tn7dsl_led_init(unsigned long parm)
-+{
-+ dslhal_api_configureLed(pIhw,parm, 2);
-+}
-+#endif
-+
-+static void tn7dsl_register_dslss_led(void)
-+{
-+#ifdef CONFIG_LED_MODULE
-+
-+ // register led0 with led module
-+ ledreg[0].param = 0;
-+ ledreg[0].init = (void *)tn7dsl_led_init;
-+ ledreg[0].onfunc = (void *)tn7dsl_led_on;
-+ ledreg[0].offfunc = (void *)tn7dsl_led_off;
-+ register_led_drv(LED_NUM_1, &ledreg[0]);
-+
-+ // register led1 output with led module
-+ ledreg[1].param = 1;
-+ ledreg[1].init = (void *)tn7dsl_led_init;
-+ ledreg[1].onfunc = (void *)tn7dsl_led_on;
-+ ledreg[1].offfunc = (void *)tn7dsl_led_off;
-+ register_led_drv(LED_NUM_2, &ledreg[1]);
-+#endif
-+}
-+
-+static int tn7dsl_reload_overlay(void)
-+{
-+ int overlayFlag;
-+ spinlock_t overlayLock;
-+
-+ init_kthread(&overlay_thread, "adsl");
-+ down(&adsl_sem_overlay);
-+ while(1)
-+ {
-+ mdelay(500);
-+ if(pIhw->lConnected == 0)
-+ {
-+ spin_lock_irqsave(&overlayLock, overlayFlag);
-+ dslhal_support_restoreTrainingInfo(pIhw);
-+ spin_unlock_irqrestore(&overlayLock, overlayFlag);
-+ }
-+ down(&adsl_sem_overlay);
-+ }
-+ return 0;
-+}
-+
-+
-+
-+
-diff -urN linux.old/drivers/atm/sangam_atm/tn7sar.c linux.dev/drivers/atm/sangam_atm/tn7sar.c
---- linux.old/drivers/atm/sangam_atm/tn7sar.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tn7sar.c 2005-07-10 08:02:01.454109840 +0200
-@@ -0,0 +1,1376 @@
-+/******************************************************************************
-+ * FILE PURPOSE: OS files for CPSAR
-+ ******************************************************************************
-+ * FILE NAME: tn7sar.c
-+ *
-+ * DESCRIPTION: This file contains source for required os files for CPSAR
-+ *
-+ * (C) Copyright 2002, Texas Instruments Inc
-+ *
-+ *
-+ * Revision History:
-+ * 0/11/02 Zhicheng Tang, created.
-+ *
-+ *******************************************************************************/
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/atmdev.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <asm/io.h>
-+#include <asm/mips-boards/prom.h>
-+#include <linux/proc_fs.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+
-+
-+#define _CPHAL_AAL5
-+#define _CPHAL_SAR
-+#define _CPHAL_HAL
-+typedef void OS_PRIVATE;
-+typedef void OS_DEVICE;
-+typedef void OS_SENDINFO;
-+typedef void OS_RECEIVEINFO;
-+typedef void OS_SETUP;
-+
-+#include "cpswhal_cpsar.h"
-+#include "tn7atm.h"
-+#include "tn7api.h"
-+
-+
-+/* PDSP Firmware files */
-+#include "tnetd7300_sar_firm.h"
-+
-+
-+enum
-+{
-+ PACKET_TYPE_AAL5,
-+ PACKET_TYPE_NULL,
-+ PACKET_TYPE_OAM,
-+ PACKET_TYPE_TRANS,
-+ PACKET_TYPE_AAL2
-+}PACKET_TYPE;
-+
-+enum
-+{
-+ OAM_PING_FAILED,
-+ OAM_PING_SUCCESS,
-+ OAM_PING_PENDING,
-+ OAM_PING_NOT_STARTED
-+}OAM_PING;
-+
-+/* PDSP OAM General Purpose Registers (@todo: These need to be used in the HAL!) */
-+
-+#define SAR_PDSP_HOST_OAM_CONFIG_REG_ADDR 0xa3000020
-+#define SAR_PDSP_OAM_CORR_REG_ADDR 0xa3000024
-+#define SAR_PDSP_OAM_LB_RESULT_REG_ADDR 0xa3000028
-+#define SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR 0xa300002c
-+#define SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR 0xa3000030
-+
-+#define SAR_FREQUNCY 50000000
-+
-+#define AAL5_PARM "id=aal5, base = 0x03000000, offset = 0, int_line=15, ch0=[RxBufSize=1522; RxNumBuffers = 32; RxServiceMax = 50; TxServiceMax=50; TxNumBuffers=32; CpcsUU=0x5aa5; TxVc_CellRate=0x3000; TxVc_AtmHeader=0x00000640]"
-+#define SAR_PARM "id=sar,base = 0x03000000, reset_bit = 9, offset = 0; UniNni = 0, PdspEnable = 1"
-+#define RESET_PARM "id=ResetControl, base=0xA8611600"
-+#define CH0_PARM "RxBufSize=1522, RxNumBuffers = 32, RxServiceMax = 50, TxServiceMax=50, TxNumBuffers=32, CpcsUU=0x5aa5, TxVc_CellRate=0x3000, TxVc_AtmHeader=0x00000640"
-+
-+#define MAX_PVC_TABLE_ENTRY 16
-+
-+sar_stat_t sarStat;
-+
-+typedef struct _channel_parm
-+{
-+ unsigned int RxBufSize;
-+ unsigned int RxNumBuffers;
-+ unsigned int RxServiceMax;
-+ unsigned int TxServiceMax;
-+ unsigned int TxNumBuffers;
-+ unsigned int CpcsUU;
-+ unsigned int TxVc_CellRate;
-+ unsigned int TxVc_AtmHeader;
-+}channel_parm_t;
-+
-+typedef struct _aal5_parm
-+{
-+ unsigned int base;
-+ unsigned int offset;
-+ unsigned int int_line;
-+ channel_parm_t chan[8];
-+}aal5_parm_t;
-+
-+
-+typedef struct _sar_parm
-+{
-+ unsigned int base;
-+ unsigned int reset_bit;
-+ unsigned int offset;
-+ unsigned int UniNni;
-+}sar_parm_t;
-+
-+typedef struct _pvc_table
-+{
-+ int bInUse;
-+ int vpi;
-+ int vci;
-+}pvc_table;
-+
-+static aal5_parm_t aal5Parm;
-+static sar_parm_t sarParm;
-+static char *pAal5, *pSar, *pReset;
-+static int oam_type;
-+static unsigned int oamPingStatus;
-+static int oamAtmHdr;
-+static int oamLbTimeout;
-+static char parm_data[1024];
-+static char aal5Data[1024];
-+static char sarData[1024];
-+static char resetData[256];
-+static pvc_table pvc_result[MAX_PVC_TABLE_ENTRY];
-+
-+/* external function */
-+extern int __guDbgLevel;
-+
-+/* gloabal function */
-+unsigned int oamFarLBCount[4];
-+/* end of gloabal function */
-+
-+/* internal APIs */
-+static int tn7sar_atm_header(int vpi, int vci);
-+static void tn7sar_record_pvc(int atmheader);
-+
-+/*end of internal APIs */
-+spinlock_t sar_lock;
-+
-+/* HAL OS support functions */
-+
-+
-+unsigned long tn7sar_strtoul(const char *str, char **endptr, int base)
-+{
-+ unsigned long ret;
-+
-+ ret= simple_strtoul(str, endptr, base);
-+ return ret;
-+}
-+
-+static void *tn7sar_malloc(unsigned int size)
-+{
-+ return(kmalloc(size, GFP_KERNEL));
-+}
-+
-+static unsigned long lockflags;
-+static void tn7sar_critical_on(void)
-+{
-+ spin_lock_irqsave(&sar_lock,lockflags);
-+}
-+
-+static void tn7sar_critical_off(void)
-+{
-+ spin_unlock_irqrestore(&sar_lock,lockflags);
-+}
-+
-+static void tn7sar_data_invalidate(void *pmem, int size)
-+{
-+ unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
-+
-+ for (i=0;i<Size;i+=16,pmem+=16)
-+ {
-+ __asm__(" .set mips3 ");
-+ __asm__("cache 17, (%0)" : : "r" (pmem));
-+ __asm__(" .set mips0 ");
-+ }
-+
-+}
-+
-+static void tn7sar_data_writeback(void *pmem, int size)
-+{
-+ unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
-+
-+ for (i=0;i<Size;i+=16,pmem+=16)
-+ {
-+ __asm__(" .set mips3 ");
-+ __asm__(" cache 25, (%0)" : : "r" (pmem));
-+ __asm__(" .set mips0 ");
-+ }
-+}
-+
-+
-+static int
-+tn7sar_find_device(int unit, const char *find_name, void *device_info)
-+{
-+ int ret_val = 0;
-+ char **ptr;
-+
-+ ptr = (char **)device_info;
-+ dprintf(3,"tn7sar_find_device\n");
-+ if(strcmp(find_name, "aal5")==0)
-+ {
-+ //dprintf(4,"pAal5=%s\n", pAal5);
-+ *ptr = pAal5;
-+ }
-+ else if(strcmp(find_name, "sar")==0)
-+ {
-+ dprintf(3, "pSar=%s\n", pSar);
-+ *ptr = pSar;
-+ }
-+ else if(strcmp(find_name, "reset")==0)
-+ {
-+ dprintf(3, "pReset=%s\n", pReset);
-+ *ptr = pReset;
-+ }
-+
-+ device_info = NULL;
-+
-+ return(ret_val);
-+}
-+
-+static int
-+tn7sar_get_device_parm_uint(void *dev_info, const char *param, unsigned int *value)
-+{
-+ char *dev_str;
-+ char *pMatch;
-+ int i=0, j=0;
-+ char val_str[64];
-+ unsigned int val;
-+ int base = 10;
-+
-+ dprintf(6, "tn7sar_get_device_parm_uint()\n");
-+
-+ dev_str = (char *)dev_info;
-+ dprintf(3, "parm=%s\n", param);
-+ pMatch = strstr(dev_str, param);
-+ //dprintf(4, "pMatch=%s\n", pMatch);
-+ if(pMatch)
-+ {
-+ //get "=" position
-+ while(pMatch[i] != 0x3d)
-+ {
-+ i++;
-+ }
-+ i++;
-+ // get rid of spaces
-+ while(pMatch[i]==0x20)
-+ {
-+ i++;
-+ }
-+ //get rid of 0x
-+ if(pMatch[i]==0x30)
-+ {
-+ if(pMatch[i+1] == 0x58 || pMatch[i+1] == 0x78)
-+ {
-+ i+=2;
-+ base = 16;
-+ }
-+ }
-+
-+ // get next delineator
-+ while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
-+ {
-+ val_str[j]=pMatch[i];
-+ j++;
-+ i++;
-+ }
-+ val_str[j]=0;
-+ //dprintf(4, "val_str=\n%s\n", val_str);
-+ //xdump(val_str, strlen(val_str) + 1, 4);
-+ val = simple_strtoul(val_str, (char **)NULL, base);
-+ dprintf(4, "val =%d\n", val);
-+ *value = val;
-+ return 0;
-+ }
-+
-+
-+ dprintf(3, "match not found.\n");
-+ if(strcmp(dev_str, "debug")==0)
-+ {
-+ dprintf(6,"debug..\n");
-+ *value = 6;
-+ return 0;
-+ }
-+ return (1);
-+}
-+
-+static int tn7sar_get_device_parm_value(void *dev_info, const char *param, void *value)
-+{
-+ char *dev_str;
-+ char *pMatch;
-+ int i=0, j=0;
-+ char *pVal;
-+
-+
-+ dprintf(3, "tn7sar_get_device_parm_value().\n");
-+
-+ pVal = (char *) parm_data;
-+ dev_str = (char *)dev_info;
-+ dprintf(3, "dev_info: \n%s\n", dev_str);
-+ dprintf(3, "param=%s\n", param);
-+ if(strcmp(param, "Ch0")==0)
-+ {
-+ *(char **)value = CH0_PARM;
-+ dprintf(3, "value =%s\n", *(char **)value);
-+ return 0;
-+ }
-+
-+ pMatch = strstr(dev_str, param);
-+ if(pMatch)
-+ {
-+ //get "=" position
-+ while(pMatch[i] != 0x3d)
-+ {
-+ i++;
-+ }
-+ i++;
-+ // get rid of spaces
-+ while(pMatch[i]==0x20)
-+ {
-+ i++;
-+ }
-+
-+ if(pMatch[i] != 0x5b) //"["
-+ {
-+ // get next delineator
-+ while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
-+ {
-+ pVal[j] = pMatch[i];
-+ j++;
-+ i++;
-+ }
-+ pVal[j]=0;
-+
-+ *(char **)value = pVal;
-+ return 0;
-+ }
-+ else
-+ {
-+ i++; //skip "["
-+ while(pMatch[i] != 0x5d)
-+ {
-+ if(pMatch[i] == 0x3b) //";"
-+ pVal[j] = 0x2c;
-+ else
-+ pVal[j] = pMatch[i];
-+ j++;
-+ i++;
-+ }
-+ pVal[j] = 0;
-+ *(char **)value = pVal;
-+ return 0;
-+ }
-+
-+ }
-+
-+ return (1);
-+}
-+
-+static void tn7sar_free(void *pmem)
-+{
-+ kfree(pmem);
-+}
-+
-+static void
-+tn7sar_free_buffer(OS_RECEIVEINFO *os_receive_info, void *pmem)
-+{
-+ tn7atm_free_rx_skb(os_receive_info);
-+}
-+
-+static void tn7sar_free_dev(void *pmem)
-+{
-+ kfree(pmem);
-+}
-+
-+static void tn7sar_free_dma_xfer(void *pmem)
-+{
-+ kfree(pmem);
-+}
-+
-+
-+static int
-+tn7sar_control(void *dev_info, const char *key, const char *action, void *value)
-+{
-+ int ret_val = -1;
-+
-+ if (strcmp(key, "Firmware") == 0)
-+ {
-+ if (strcmp(action, "Get") == 0)
-+ {
-+ *(int **)value = &SarPdspFirmware[0];
-+ }
-+ ret_val=0;
-+ }
-+
-+ if (strcmp(key, "FirmwareSize") == 0)
-+ {
-+ if (strcmp(action, "Get") == 0)
-+ {
-+ *(int *)value = sizeof(SarPdspFirmware);
-+ }
-+ ret_val=0;
-+ }
-+
-+ if (strcmp(key, "OamLbResult") == 0)
-+ {
-+ dprintf(2, "get looback source call back\n");
-+ if (strcmp(action, "Set") == 0)
-+ {
-+ dprintf(2, "oam result = %d\n", *(unsigned int *)value);
-+ oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + *(unsigned int *)value;
-+ if(oamPingStatus == OAM_PING_PENDING)
-+ {
-+ oamPingStatus = *(unsigned int *)value;
-+ if(oamPingStatus == OAM_PING_SUCCESS)
-+ {
-+ /* record pvc */
-+ tn7sar_record_pvc(oamAtmHdr);
-+ }
-+ }
-+
-+ }
-+ ret_val=0;
-+ }
-+
-+ if (strcmp(key, "SarFreq") == 0)
-+ {
-+ if (strcmp(action, "Get") == 0)
-+ {
-+ *(int *)value = SAR_FREQUNCY;
-+ }
-+ ret_val=0;
-+ }
-+ return(ret_val);
-+}
-+
-+
-+static void
-+tn7sar_sarhal_isr_register(OS_DEVICE *os_dev, int(*hal_isr)(HAL_DEVICE *, int *), int interrupt_num)
-+{
-+ tn7atm_sarhal_isr_register(os_dev, hal_isr, interrupt_num);
-+}
-+
-+static void
-+tn7sar_isr_unregister(OS_DEVICE *os_dev, int interrupt_num)
-+{
-+ /* TODO */
-+}
-+
-+
-+static void *
-+tn7sar_malloc_rxbuffer(unsigned int size, void *mem_base, unsigned int mem_range, HAL_DEVICE *hal_dev,
-+ HAL_RECEIVEINFO *hal_info, OS_RECEIVEINFO **os_receive_info, OS_DEVICE *os_dev)
-+{
-+ return tn7atm_allocate_rx_skb(os_dev, os_receive_info, size);
-+}
-+
-+static void *
-+tn7sar_malloc_dev(unsigned int size)
-+{
-+ return(kmalloc(size, GFP_KERNEL));
-+}
-+
-+static void *
-+tn7sar_malloc_dma_xfer(unsigned int size, void *mem_base, unsigned int mem_range)
-+{
-+ dprintf(4, "tn7sar_malloc_dma_xfer, size =%d\n", size);
-+
-+ return (kmalloc(size, GFP_DMA |GFP_KERNEL));
-+
-+}
-+
-+static void *
-+tn7sar_memset(void *dst, int set_char, size_t count)
-+{
-+ return (memset(dst, set_char, count));
-+}
-+
-+static int tn7sar_printf(const char *format, ...)
-+{
-+ /* TODO: add debug levels */
-+ static char buff[256];
-+ va_list ap;
-+
-+ va_start( ap, format);
-+ vsprintf((char *)buff, format, ap);
-+ va_end(ap);
-+
-+ printk("SAR HAL: %s\n", buff);
-+ return(0);
-+}
-+
-+static void tn7sar_record_pvc(int atmheader)
-+{
-+ int vci,vpi;
-+ int i;
-+
-+ vci = 0xffff & (atmheader >> 4);
-+ vpi = 0xff & (atmheader >> 20);
-+ for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
-+ {
-+ if(pvc_result[i].bInUse)
-+ {
-+ if(pvc_result[i].vpi == vpi && pvc_result[i].vci == vci)
-+ {
-+ return;
-+ }
-+ }
-+ }
-+ for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
-+ {
-+ if(pvc_result[i].bInUse == 0)
-+ {
-+ pvc_result[i].bInUse = 1;
-+ pvc_result[i].vpi = vpi;
-+ pvc_result[i].vci = vci;
-+ return;
-+ }
-+ }
-+ return;
-+}
-+
-+static void tn7sar_clear_pvc_table(void)
-+{
-+ int i;
-+
-+ for(i=0;i<MAX_PVC_TABLE_ENTRY; i++)
-+ {
-+ pvc_result[i].bInUse = 0;
-+ pvc_result[i].vpi = 0;
-+ pvc_result[i].vci = 0;
-+ }
-+}
-+
-+int tn7sar_process_unmatched_oam(FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size, unsigned int mode)
-+{
-+
-+ FRAGLIST *local_list;
-+ int i;
-+ unsigned int atmHdr;
-+
-+ local_list = frag_list;
-+
-+ for(i=0;i<(int)frag_count;i++)
-+ {
-+ tn7sar_data_invalidate(local_list->data, (int)local_list->len);
-+ local_list ++;
-+ }
-+ local_list = frag_list;
-+ if((mode>>31)) /*vci, vpi is attached */
-+ {
-+ atmHdr = *(unsigned int *)frag_list->data;
-+ tn7sar_record_pvc(atmHdr);
-+ if(atmHdr & 0x8) //oam cell
-+ {
-+ atmHdr &= 0xfffffff0;
-+ if(atmHdr == oamAtmHdr)
-+ {
-+ if(oamPingStatus == OAM_PING_PENDING)
-+ {
-+ oamPingStatus = OAM_PING_SUCCESS;
-+ oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + 1;
-+ }
-+ return 0;
-+ }
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static int
-+tn7sar_receive(OS_DEVICE *os_dev,FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size,
-+ HAL_RECEIVEINFO *hal_receive_info, unsigned int mode)
-+{
-+ int ch;
-+ struct atm_dev *dev;
-+ Tn7AtmPrivate *priv;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ int bRet;
-+
-+
-+ dprintf(4, "tn7sar_receive\n");
-+
-+ dev = (struct atm_dev *)os_dev;
-+ priv= (Tn7AtmPrivate *)dev->dev_data;
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+
-+ /* Mode contains channel info */
-+ ch = (mode & 0xFF);
-+
-+ if(ch == 15)
-+ {
-+ tn7sar_process_unmatched_oam(frag_list, frag_count, packet_size, mode);
-+ pHalFunc->RxReturn(hal_receive_info, 0);
-+ return 0;
-+ }
-+
-+ if(frag_count > 1 || frag_list->len == 0)
-+ {
-+ printk("Packet fragment count > 1, not handdle.\n");
-+ return 1;
-+ }
-+
-+ tn7sar_data_invalidate(frag_list->data, (int)frag_list->len);
-+ bRet=tn7atm_receive(os_dev, ch, packet_size, frag_list->OsInfo, frag_list->data);
-+
-+ if(bRet==0)
-+ {
-+ sarStat.rxPktCnt++;
-+ sarStat.rxBytes += packet_size;
-+ pHalFunc->RxReturn(hal_receive_info, 1);
-+ }
-+ else
-+ {
-+ pHalFunc->RxReturn(hal_receive_info, 0);
-+ }
-+
-+ return bRet;
-+}
-+
-+static int
-+tn7sar_send_complete(OS_SENDINFO *osSendInfo)
-+{
-+ return (tn7atm_send_complete(osSendInfo));
-+}
-+
-+void
-+tn7sar_teardown_complete(OS_DEVICE *OsDev, int ch, int Dir)
-+{
-+ return;
-+}
-+
-+
-+/*
-+unsigned int tn7sar_virt(unsigned int address)
-+{
-+ return phys_to_virt(address);
-+}
-+*/
-+
-+int tn7sar_init_module(OS_FUNCTIONS *os_funcs)
-+{
-+ dprintf(4, "tn7sar_init_module\n");
-+ if( os_funcs == 0 )
-+ {
-+ return(-1);
-+ }
-+ os_funcs->Control = tn7sar_control;
-+ os_funcs->CriticalOn = tn7sar_critical_on;
-+ os_funcs->CriticalOff = tn7sar_critical_off;
-+ os_funcs->DataCacheHitInvalidate = tn7sar_data_invalidate;
-+ os_funcs->DataCacheHitWriteback = tn7sar_data_writeback;
-+ os_funcs->DeviceFindInfo = tn7sar_find_device;
-+ os_funcs->DeviceFindParmUint = tn7sar_get_device_parm_uint;
-+ os_funcs->DeviceFindParmValue = tn7sar_get_device_parm_value;
-+ os_funcs->Free = tn7sar_free;
-+ os_funcs->FreeRxBuffer = tn7sar_free_buffer;
-+ os_funcs->FreeDev = tn7sar_free_dev;
-+ os_funcs->FreeDmaXfer = tn7sar_free_dma_xfer;
-+ os_funcs->IsrRegister = tn7sar_sarhal_isr_register;
-+ os_funcs->IsrUnRegister = tn7sar_isr_unregister;
-+ os_funcs->Malloc = tn7sar_malloc;
-+ os_funcs->MallocRxBuffer = tn7sar_malloc_rxbuffer;
-+ os_funcs->MallocDev = tn7sar_malloc_dev;
-+ os_funcs->MallocDmaXfer = tn7sar_malloc_dma_xfer;
-+ os_funcs->Memset = tn7sar_memset;
-+ os_funcs->Printf = tn7sar_printf;
-+ os_funcs->Receive = tn7sar_receive;
-+ os_funcs->SendComplete = tn7sar_send_complete;
-+ os_funcs->Strcmpi = strcmp;
-+ os_funcs->Sprintf = sprintf;
-+ os_funcs->Strlen = strlen;
-+ os_funcs->Strstr = strstr;
-+ os_funcs->Strtoul = tn7sar_strtoul;
-+ os_funcs->TeardownComplete = tn7sar_teardown_complete;
-+
-+ return(0);
-+}
-+
-+
-+static void tn7sar_init_dev_parm(void)
-+{
-+ int i;
-+
-+
-+ /* aal5 */
-+ //strcpy(aal5Parm.id, "aal5");
-+ aal5Parm.base = 0x03000000;
-+ aal5Parm.offset = 0;
-+ aal5Parm.int_line=15;
-+ aal5Parm.chan[0].RxBufSize=1600;
-+ aal5Parm.chan[0].RxNumBuffers = 32;
-+ aal5Parm.chan[0].RxServiceMax = 50;
-+ aal5Parm.chan[0].TxServiceMax=50;
-+ aal5Parm.chan[0].TxNumBuffers=32;
-+ aal5Parm.chan[0].CpcsUU=0x5aa5;
-+ aal5Parm.chan[0].TxVc_CellRate=0x3000;
-+ aal5Parm.chan[0].TxVc_AtmHeader=0x00000640;
-+ for(i=1;i<8;i++)
-+ {
-+ memcpy(&aal5Parm.chan[i], &aal5Parm.chan[0], sizeof(aal5Parm.chan[0]));
-+ }
-+
-+
-+ /* sar */
-+ //strcpy(sarParm.id, "sar");
-+ sarParm.base = 0x03000000;
-+ sarParm.reset_bit = 9;
-+ sarParm.offset = 0;
-+ sarParm.UniNni = 0;
-+
-+ pAal5 = aal5Data;
-+ pSar = sarData;
-+ pReset = resetData;
-+ strcpy(pAal5, AAL5_PARM);
-+ strcpy(pSar, SAR_PARM);
-+ strcpy(pReset, RESET_PARM);
-+
-+}
-+
-+
-+int tn7sar_get_stats(void *priv1)
-+{
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ Tn7AtmPrivate *priv;
-+ int i, j;
-+ unsigned int *pSarStat, *pStateBase;
-+ char statString[64];
-+ int len;
-+
-+ dprintf(2, "tn7sar_get_stats\n");
-+
-+ priv = (Tn7AtmPrivate *)priv1;
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ //memset(&sarStat, 0, sizeof(sarStat));
-+ sarStat.txErrors = 0;
-+ sarStat.rxErrors = 0;
-+ for(i=0;i<MAX_DMA_CHAN;i++)
-+ {
-+ if(priv->lut[i].inuse)
-+ {
-+ for(j=0;j<1;j++)
-+ {
-+ len=sprintf(statString, "Stats;0;%d", priv->lut[i].chanid);
-+ statString[len]=0;
-+ dprintf(2, "statString=%s\n",statString);
-+ pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
-+ pStateBase = pSarStat;
-+ while(pSarStat)
-+ {
-+ if((char *)*pSarStat == NULL)
-+ break;
-+ dprintf(2, "%s\n", (char *) *pSarStat);
-+ pSarStat++;
-+ dprintf(2, "%s\n", (char *) *pSarStat);
-+ sarStat.rxErrors += os_atoul((char *) *pSarStat);
-+ pSarStat++;
-+ }
-+
-+ kfree(pStateBase);
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+
-+int tn7sar_setup_oam_channel(Tn7AtmPrivate *priv)
-+{
-+
-+ CHANNEL_INFO chInfo;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ int chan=15;
-+ dprintf(4, "tn7sar_setup_oam_channel\n");
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ memset(&chInfo, 0xff, sizeof(chInfo));
-+
-+ /* channel specific */
-+ chInfo.Channel = 15; /* hardcoded for last channel */
-+ chInfo.Direction = 0;
-+ chInfo.Vci = 30; /* just need below 32 */
-+ chInfo.Vpi = 0;
-+ chInfo.TxVc_QosType = 2;
-+
-+ /*default */
-+ chInfo.PktType = PACKET_TYPE_TRANS;
-+ chInfo.TxServiceMax = 2;
-+ chInfo.RxServiceMax = 2;
-+ chInfo.TxNumQueues = 1;
-+ chInfo.TxNumBuffers = 4;
-+ chInfo.RxNumBuffers = 4;
-+ chInfo.RxBufSize = 256;
-+ chInfo.RxVc_OamToHost = 0;
-+ chInfo.RxVp_OamToHost = 0;
-+ chInfo.FwdUnkVc = 1; //enable forwarding of unknown vc
-+ chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
-+ chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
-+ chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
-+ chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
-+
-+ dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
-+
-+ if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
-+ {
-+ printk("failed to setup channel =%d.\n", chan);
-+ return -1;
-+ }
-+
-+ // claiming the channel
-+ priv->lut[chan].vpi = 0;
-+ priv->lut[chan].vci = 30;
-+ priv->lut[chan].chanid = chan;
-+ priv->lut[chan].inuse = 1;
-+ return 0;
-+}
-+
-+int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv)
-+{
-+ int retCode;
-+ int hal_funcs_size;
-+
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ OS_FUNCTIONS *pOsFunc;
-+ int oamMod;
-+ char *pLbTimeout;
-+ int lbTimeout;
-+
-+
-+ dprintf(4, "tn7sar_init\n");
-+
-+ pOsFunc = (OS_FUNCTIONS *)kmalloc(sizeof(OS_FUNCTIONS), GFP_KERNEL);
-+
-+
-+ priv->pSarOsFunc = ( void *)pOsFunc;
-+
-+ /* init boot parms */
-+ tn7sar_init_dev_parm();
-+
-+ /* init sar os call back functions */
-+ retCode = tn7sar_init_module(pOsFunc);
-+ if (retCode != 0) /* error */
-+ {
-+ printk("Failed to init SAR OS Functions\n");
-+ return (1);
-+ }
-+
-+ /* Init sar hal */
-+ retCode = cpaal5InitModule(&pHalDev, (OS_DEVICE*) dev, &pHalFunc,
-+ pOsFunc, sizeof(OS_FUNCTIONS), &hal_funcs_size, 0);
-+ if (retCode != 0) /* error */
-+ {
-+ printk("Failed to init SAR HAL\n");
-+ return (1);
-+ }
-+
-+ /* sanity check */
-+ if (pHalDev == NULL || pHalFunc == NULL || hal_funcs_size != sizeof(HAL_FUNCTIONS) )
-+ {
-+ printk("Invalid SAR hal and/or functions.\n");
-+ return (1);
-+ }
-+
-+ /* remeber HAL pointers */
-+ priv->pSarHalDev = (void *)pHalDev;
-+ priv->pSarHalFunc = (void *)pHalFunc;
-+
-+ /* Probe for the Device to get hardware info from driver */
-+ retCode = pHalFunc->Probe(pHalDev);
-+ if (retCode !=0)
-+ {
-+ printk("SAR hal probing error.\n");
-+ return (1);
-+ }
-+
-+ /* init sar hal */
-+ retCode = pHalFunc->Init(pHalDev);
-+ if (retCode != 0) /* error */
-+ {
-+
-+ printk("pHalFunc->Init failed. err code =%d\n", retCode);
-+ return (1);
-+ }
-+
-+ /* open hal module */
-+ retCode = pHalFunc->Open(pHalDev);
-+ if (retCode != 0) /* error */
-+ {
-+ printk("pHalFunc->open failed, err code: %d\n",retCode );
-+ return (1);
-+ }
-+
-+ /* init sar for firmware oam */
-+ oamMod= 1;
-+ pHalFunc->Control(pHalDev,"OamMode", "Set", &oamMod);
-+
-+ /* read in oam lb timeout value */
-+ pLbTimeout = prom_getenv("oam_lb_timeout");
-+ if(pLbTimeout)
-+ {
-+ lbTimeout =tn7sar_strtoul(pLbTimeout, NULL, 10);
-+ oamLbTimeout = lbTimeout;
-+ pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &lbTimeout);
-+ }
-+ else
-+ {
-+ oamLbTimeout = 5000;
-+ }
-+
-+ oamFarLBCount[0]=0;
-+ oamFarLBCount[1]=0;
-+ oamFarLBCount[2]=0;
-+ oamFarLBCount[3]=0;
-+
-+ memset(&sarStat, 0 , sizeof(sarStat));
-+
-+ /* setup channel 15 for oam operation */
-+ tn7sar_setup_oam_channel(priv);
-+ dprintf(4, "tn7sar_init done");
-+ return 0;
-+}
-+
-+static int
-+tn7sar_atm_header(int vpi, int vci)
-+{
-+ union
-+ {
-+ unsigned char byte[4];
-+ unsigned int dword;
-+ }atm_h;
-+ int itmp = 0;
-+
-+ //vci
-+ itmp = vci &0xf;
-+ atm_h.byte[0] = 0;
-+ atm_h.byte[0] |= (itmp << 4);
-+ atm_h.byte[1] = ((vci & 0xff0) >> 4);
-+ atm_h.byte[2] = 0;
-+ atm_h.byte[2] |= ((vci & 0xf000) >>12);;
-+ atm_h.byte[2] |= ((vpi & 0xf) << 4);
-+ atm_h.byte[3] = 0;
-+ atm_h.byte[3] = ((vpi & 0xff0) >> 4);
-+ return atm_h.dword;
-+}
-+
-+int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos)
-+{
-+ CHANNEL_INFO chInfo;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+
-+ dprintf(4, "tn7sar_activate_vc\n");
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ memset(&chInfo, 0xff, sizeof(chInfo));
-+
-+ /* channel specific */
-+ chInfo.Channel = chan;
-+ chInfo.Direction = 0;
-+ chInfo.Vci = vci;
-+ chInfo.Vpi = vpi;
-+ chInfo.TxVc_QosType = qos;
-+ chInfo.Priority = qos;
-+
-+ if(chInfo.TxVc_QosType == 1) /* if the connection is VBR than set the DaMask value to tell the schedular to accumalte the credit */
-+ {
-+ chInfo.DaMask = 1;
-+ }
-+ chInfo.TxVc_Mbs = mbs; /* use pcr as MBS */
-+ pcr = SAR_FREQUNCY/pcr;
-+ scr = SAR_FREQUNCY/scr;
-+ chInfo.TxVc_CellRate = scr;
-+ chInfo.TxVc_Pcr = pcr;
-+
-+ /*default */
-+ chInfo.PktType = PACKET_TYPE_AAL5;
-+ chInfo.TxServiceMax = TX_SERVICE_MAX;
-+ chInfo.RxServiceMax = RX_SERVICE_MAX;
-+ chInfo.TxNumQueues = TX_QUEUE_NUM;
-+ chInfo.TxNumBuffers = TX_BUFFER_NUM;
-+ chInfo.RxNumBuffers = RX_BUFFER_NUM;
-+ chInfo.RxBufSize = RX_BUFFER_SIZE;
-+ chInfo.RxVc_OamToHost = 0;
-+ chInfo.RxVp_OamToHost = 0;
-+ chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
-+ chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
-+ chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
-+ chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
-+ chInfo.CpcsUU = 0;
-+
-+ dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
-+
-+ if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
-+ {
-+ printk("failed to setup channel =%d.\n", chan);
-+ return -1;
-+ }
-+
-+
-+ return 0;
-+}
-+
-+int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority)
-+{
-+ FRAGLIST fragList;
-+ unsigned int mode;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+
-+ dprintf(4, "tn7sar_send_packet\n");
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ fragList.len = len;
-+ fragList.data = (void *)data;
-+
-+ xdump((char *)fragList.data , fragList.len, 6);
-+
-+ /*mode bit
-+ 31-19 unused
-+ 18 oam cell, 1 = true, 0=false
-+ 17-16 oam type, 0=F4 seg, 1=F4 End, 2=F5 seg, 3=F5 end
-+ 15-08 transimit queue, current, 0=priority queue, 1=normal queue
-+ 07-00 channel number
-+ */
-+ mode = 0;
-+ mode |= (0xff & chan);
-+ mode |= ((0xff & priority) << 8);
-+
-+ dprintf(4, "mode = %d\n", mode);
-+
-+ tn7sar_data_writeback(fragList.data, len);
-+ if(pHalFunc->Send(pHalDev, &fragList, 1, len, new_skb, mode) != 0)
-+ {
-+ dprintf(1, "SAR hal failed to send packet.\n");
-+ return 1;
-+ }
-+ //tn7sar_get_stats(priv);
-+ sarStat.txPktCnt++;
-+ sarStat.txBytes +=len;
-+ return 0;
-+}
-+
-+
-+
-+int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv)
-+{
-+ int more;
-+ int rc;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ int (*halIsr)(HAL_DEVICE *halDev, int *work);
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+ halIsr = priv->halIsr;
-+
-+ rc = halIsr(pHalDev, &more);
-+
-+ pHalFunc->PacketProcessEnd(pHalDev);
-+
-+ return rc;
-+}
-+
-+
-+int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan)
-+{
-+ unsigned int mode;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+
-+ dprintf(4, "tn7sar_deactivate_vc\n");
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ mode = 0xf; //tear down everything, wait for return;
-+
-+ pHalFunc->ChannelTeardown(pHalDev, chan, mode);
-+ return 0;
-+}
-+
-+void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv)
-+{
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+
-+ dprintf(4, "tn7sar_exit()\n");
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ tn7sar_deactivate_vc(priv, 15); // de-activate oam channel
-+
-+ pHalFunc->Close(pHalDev, 2);
-+ pHalFunc->Shutdown(pHalDev);
-+
-+ kfree(priv->pSarOsFunc);
-+
-+}
-+
-+void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer)
-+{
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+
-+ dprintf(4, "tn7sar_get_sar_version()\n");
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+ pHalFunc->Control(pHalDev, "Version", "Get", pVer);
-+}
-+
-+
-+int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count)
-+{
-+ unsigned int f4c, f5c;
-+
-+ f4c = *(volatile unsigned int *)SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR;
-+ f5c = *(volatile unsigned int *)SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR;
-+ *pF4count = f4c;
-+ *pF5count = f5c;
-+
-+ return 0;
-+}
-+
-+
-+int tn7sar_unmatched_oam_generation(void *privContext, int vpi, int vci, int type)
-+{
-+
-+ unsigned int regv = 0;
-+ int chan=15;
-+ static unsigned int tag;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ Tn7AtmPrivate *priv;
-+ unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
-+
-+ dprintf(4, "tn7sar_unknow_oam_generation()\n");
-+
-+ priv = (Tn7AtmPrivate *)privContext;
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ if(vci==0)
-+ {
-+ oamPingStatus = OAM_PING_FAILED;
-+ return 0;
-+ }
-+ /* calculate atm header */
-+ oamAtmHdr = tn7sar_atm_header(vpi,vci);
-+
-+ /* config the atm header */
-+ pHalFunc->Control(pHalDev,"TxVc_AtmHeader.15", "Set", &oamAtmHdr);
-+
-+ /*record oam type */
-+ oam_type = type;
-+
-+ regv = (0xff & chan);
-+
-+ switch(type)
-+ {
-+ case 0:
-+ regv |= (1<<12); //f5 end
-+ dprintf(2, "f5 loop back\n");
-+ break;
-+ case 1:
-+ regv |= (1<<13); // f4 end
-+ break;
-+ case 2:
-+ regv |= (1<<14); //f5 seg
-+ break;
-+ case 3:
-+ regv |= (1<<15); //f4 seg
-+ break;
-+ default:
-+ break;
-+ }
-+ oamPingStatus = OAM_PING_PENDING;
-+ pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
-+ tag++;
-+ return 0;
-+
-+}
-+
-+int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout)
-+{
-+ unsigned int regv = 0;
-+ static unsigned int tag;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ Tn7AtmPrivate *priv;
-+ unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
-+
-+ dprintf(2, "tn7sar_oam_generation()\n");
-+
-+ priv = (Tn7AtmPrivate *)privContext;
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ if(timeout >= 5000)
-+ {
-+ if(timeout == 6000)
-+ {
-+ tn7sar_clear_pvc_table();
-+ return 0;
-+ }
-+ timeout = oamLbTimeout;
-+ }
-+
-+
-+ pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &timeout);
-+
-+ if(chan == ATM_NO_DMA_CHAN)
-+ {
-+ tn7sar_unmatched_oam_generation(priv, vpi, vci, type);
-+ return 0;
-+ }
-+
-+ /* calculate atm header */
-+ oamAtmHdr = tn7sar_atm_header(vpi,vci);
-+
-+ oam_type = type;
-+
-+ regv = (0xff & chan);
-+ switch(type)
-+ {
-+ case 0:
-+ regv |= (1<<12); //f5 end
-+ dprintf(2, "f5 loop back\n");
-+ break;
-+ case 1:
-+ regv |= (1<<13); // f4 end
-+ break;
-+ case 2:
-+ regv |= (1<<14); //f5 seg
-+ break;
-+ case 3:
-+ regv |= (1<<15); //f4 seg
-+ break;
-+ default:
-+ break;
-+ }
-+ oamPingStatus = OAM_PING_PENDING;
-+ pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
-+ tag++;
-+
-+ return 0;
-+}
-+
-+int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+
-+ len += sprintf(buf+len, "%d\n", oamPingStatus);
-+
-+ return len;
-+}
-+
-+int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ int i;
-+
-+ for(i=0;i<16;i++)
-+ {
-+ if(pvc_result[i].bInUse)
-+ {
-+ len += sprintf(buf+len, "%d,%d\n", pvc_result[i].vpi,pvc_result[i].vci);
-+ }
-+ else
-+ {
-+ len += sprintf(buf+len, "0,0\n");
-+ }
-+ }
-+ return len;
-+}
-+
-+
-+
-+int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data)
-+{
-+ int len = 0;
-+ int limit = count - 80;
-+ struct atm_dev *dev;
-+ Tn7AtmPrivate *priv;
-+ int i, j, k;
-+ int stat_len;
-+ char statString[32];
-+ unsigned int *pStateBase, *pSarStat;
-+ HAL_FUNCTIONS *pHalFunc;
-+ HAL_DEVICE *pHalDev;
-+ int dBytes;
-+
-+ dev = (struct atm_dev *)data;
-+ priv = (Tn7AtmPrivate *)dev->dev_data;
-+
-+ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
-+ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
-+
-+ len += sprintf(buf+len, "SAR HAL Statistics\n");
-+ for(i=0;i<MAX_DMA_CHAN;i++)
-+ {
-+ if(priv->lut[i].inuse)
-+ {
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\nChannel %d:\n",priv->lut[i].chanid);
-+ k=0;
-+ for(j=0;j<4;j++)
-+ {
-+ stat_len =sprintf(statString, "Stats;%d;%d", j,priv->lut[i].chanid);
-+ statString[stat_len]=0;
-+ pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
-+ pStateBase = pSarStat;
-+ while(pSarStat)
-+ {
-+ if((char *)*pSarStat == NULL)
-+ break;
-+ if(len<=limit)
-+ {
-+ dBytes = sprintf(buf+len, "%s: ",(char *) *pSarStat);
-+ len += dBytes;
-+ k += dBytes;
-+ }
-+ pSarStat++;
-+ if(len<=limit)
-+ {
-+ dBytes = sprintf(buf+len, "%s; ",(char *) *pSarStat);
-+ len += dBytes;
-+ k += dBytes;
-+ }
-+ pSarStat++;
-+
-+ if(k > 60)
-+ {
-+ k=0;
-+ if(len<=limit)
-+ len += sprintf(buf+len, "\n");
-+ }
-+ }
-+
-+ kfree(pStateBase);
-+ }
-+ }
-+ }
-+
-+ return len;
-+}
-+
-+void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls)
-+{
-+
-+ *pdsp_version_ms = (SarPdspFirmware[9]>>20) & 0xF;
-+ *pdsp_version_ls = (SarPdspFirmware[9]>>12) & 0xFF;
-+ return;
-+}
-diff -urN linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h
---- linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h 2005-07-10 08:02:01.456109536 +0200
-@@ -0,0 +1,988 @@
-+//SarPdspFirmware Revision: 49
-+
-+static int SarPdspFirmware[] = {
-+ 0xb0a8d1f1,
-+ 0x000003d8,
-+ 0x00000000,
-+ 0x00000004,
-+ 0x00000000,
-+ 0x00000000,
-+ 0x00000000,
-+ 0x00000000,
-+ 0x21000900,
-+ 0x24049080,
-+ 0x24000080,
-+ 0x240000c0,
-+ 0x10e0e0e1,
-+ 0x10e0e0e2,
-+ 0x10e0e0e3,
-+ 0x10e0e0e4,
-+ 0x10e0e0e5,
-+ 0x10e0e0e6,
-+ 0x10e0e0e7,
-+ 0x10e0e0e8,
-+ 0x10e0e0e9,
-+ 0x10e0e0ea,
-+ 0x10e0e0eb,
-+ 0x10e0e0ec,
-+ 0x10e0e0ed,
-+ 0x10e0e0ee,
-+ 0x10e0e0ef,
-+ 0x10e0e0f0,
-+ 0x10e0e0f1,
-+ 0x10e0e0f2,
-+ 0x10e0e0f3,
-+ 0x10e0e0f4,
-+ 0x10e0e0f5,
-+ 0x10e0e0f6,
-+ 0x10e0e0f7,
-+ 0x10e0e0f8,
-+ 0x10e0e0f9,
-+ 0x10e0e0fa,
-+ 0x10e0e0fb,
-+ 0x10e0e0fc,
-+ 0x10e0e0fd,
-+ 0x10e0e0fe,
-+ 0x10e0e0ff,
-+ 0x81042680,
-+ 0x810c2680,
-+ 0x81042680,
-+ 0x2483c080,
-+ 0x81180b80,
-+ 0x2484c080,
-+ 0x811a0b80,
-+ 0x2485c080,
-+ 0x811c0b80,
-+ 0x240100dd,
-+ 0xa07d06fd,
-+ 0x240400dd,
-+ 0xa07d04fd,
-+ 0x24c000dd,
-+ 0x2400169d,
-+ 0xa07d5cfd,
-+ 0x511f9d03,
-+ 0x01019d9d,
-+ 0x7f0000fd,
-+ 0xd11eff05,
-+ 0x97c06890,
-+ 0x1d00e5e5,
-+ 0x2301229e,
-+ 0x81bc2890,
-+ 0x24000000,
-+ 0xc917ff02,
-+ 0x81000100,
-+ 0x01010000,
-+ 0xc918ff02,
-+ 0x81000100,
-+ 0x01010000,
-+ 0xc919ff02,
-+ 0x81000100,
-+ 0xd110e70a,
-+ 0xd11cff09,
-+ 0x1d00e5e5,
-+ 0xd100e704,
-+ 0xd114ff06,
-+ 0x2301179e,
-+ 0x79000004,
-+ 0xd70ffffd,
-+ 0x91382486,
-+ 0x2301059e,
-+ 0xc903ff07,
-+ 0xa06047e0,
-+ 0xb10043e6,
-+ 0xc910e602,
-+ 0x81000106,
-+ 0x24006025,
-+ 0x2300d39e,
-+ 0xd11dff09,
-+ 0x1f00e5e5,
-+ 0xc901e705,
-+ 0xd111ff06,
-+ 0x91382586,
-+ 0x2301059e,
-+ 0x79000003,
-+ 0xd715fffc,
-+ 0x2301179e,
-+ 0xc910e706,
-+ 0x110f2760,
-+ 0x240000c6,
-+ 0x24000086,
-+ 0x13106006,
-+ 0x7b00005a,
-+ 0x11079f80,
-+ 0x51008010,
-+ 0xc912ff0f,
-+ 0xd100ff04,
-+ 0xd101ff05,
-+ 0xa06046e0,
-+ 0x79000004,
-+ 0xa06044e0,
-+ 0x79000002,
-+ 0xa06045e0,
-+ 0xb10043e6,
-+ 0x61150602,
-+ 0x2101c500,
-+ 0xc910e602,
-+ 0xa1001006,
-+ 0x24000025,
-+ 0x2300d39e,
-+ 0xd11fff05,
-+ 0x97c06a90,
-+ 0x1f00e5e5,
-+ 0x2301229e,
-+ 0x81bc2a90,
-+ 0xd11cff09,
-+ 0x1d00e5e5,
-+ 0xc900e705,
-+ 0xd10fff06,
-+ 0x91382486,
-+ 0x2301059e,
-+ 0x79000003,
-+ 0xd714fffc,
-+ 0x2301179e,
-+ 0xc907ff07,
-+ 0xa0604be0,
-+ 0xb10043e6,
-+ 0xc910e602,
-+ 0x81000106,
-+ 0x24006025,
-+ 0x2300d39e,
-+ 0xd111e70a,
-+ 0xd11dff09,
-+ 0x1f00e5e5,
-+ 0xd101e704,
-+ 0xd115ff06,
-+ 0x2301179e,
-+ 0x79000004,
-+ 0xd711fffd,
-+ 0x91382586,
-+ 0x2301059e,
-+ 0xc911e706,
-+ 0x0b042760,
-+ 0x240000c6,
-+ 0x24000086,
-+ 0x13106006,
-+ 0x7b000024,
-+ 0x11709f80,
-+ 0x5100800e,
-+ 0xc913ff0d,
-+ 0xd104ff04,
-+ 0xd105ff05,
-+ 0xa0604ae0,
-+ 0x79000004,
-+ 0xa06048e0,
-+ 0x79000002,
-+ 0xa06049e0,
-+ 0xb10043e6,
-+ 0xc910e602,
-+ 0xa1001106,
-+ 0x24000025,
-+ 0x2300d39e,
-+ 0xc90bff02,
-+ 0x7900000b,
-+ 0xc90aff02,
-+ 0x79000012,
-+ 0xcf08ff89,
-+ 0xb10002e0,
-+ 0xcf18e087,
-+ 0x790000b6,
-+ 0x24000080,
-+ 0x24fb00c0,
-+ 0xa06003e0,
-+ 0x7f000082,
-+ 0xb10024e6,
-+ 0xb10025e0,
-+ 0xa06628e6,
-+ 0xa06029e0,
-+ 0x248000c6,
-+ 0xa06624e6,
-+ 0x671006f0,
-+ 0x81082186,
-+ 0x7f0000ee,
-+ 0xb10027e6,
-+ 0x61100604,
-+ 0xa0662be6,
-+ 0x810c2186,
-+ 0x79000006,
-+ 0xd70cffea,
-+ 0xa0662be6,
-+ 0x1f1be6e6,
-+ 0x81382686,
-+ 0x813c2680,
-+ 0x248000c6,
-+ 0xa06627e6,
-+ 0x7f0000e3,
-+ 0x110f0600,
-+ 0x81100b00,
-+ 0x01502545,
-+ 0x90457888,
-+ 0x5103091c,
-+ 0x6901092a,
-+ 0xc910e603,
-+ 0xd108e90d,
-+ 0x79000027,
-+ 0x01582545,
-+ 0x9045788a,
-+ 0xd108e904,
-+ 0x1f08e9e9,
-+ 0x01552545,
-+ 0x80451829,
-+ 0x50eaeb20,
-+ 0x0101ebeb,
-+ 0x015c2545,
-+ 0x8045388b,
-+ 0x7900001c,
-+ 0x015c2545,
-+ 0x9045788b,
-+ 0x6900eb05,
-+ 0x1d08e9e9,
-+ 0x01552545,
-+ 0x80451829,
-+ 0x79000004,
-+ 0x0501ebeb,
-+ 0x015c2545,
-+ 0x8045388b,
-+ 0x10ecece8,
-+ 0x79000010,
-+ 0x24000000,
-+ 0x5110000e,
-+ 0x690f6903,
-+ 0x24000069,
-+ 0x79000002,
-+ 0x01016969,
-+ 0x01010000,
-+ 0x81100b69,
-+ 0x01542545,
-+ 0x90451809,
-+ 0x6f0209f7,
-+ 0xa1001069,
-+ 0x81100b06,
-+ 0x01572545,
-+ 0x80451869,
-+ 0xa06841e8,
-+ 0xa1414006,
-+ 0x209e0000,
-+ 0x81100b06,
-+ 0xd11fe603,
-+ 0x9164388d,
-+ 0x8108248d,
-+ 0xd100e507,
-+ 0x97406490,
-+ 0x9108248d,
-+ 0x813c2480,
-+ 0x2302b4de,
-+ 0x1d00e7e7,
-+ 0x79000006,
-+ 0x97406590,
-+ 0x9108258d,
-+ 0x813c2580,
-+ 0x1d01e7e7,
-+ 0x2302b9de,
-+ 0x8164388d,
-+ 0x209e0000,
-+ 0x81040105,
-+ 0x91002286,
-+ 0x97086290,
-+ 0x81042280,
-+ 0xd100e504,
-+ 0x2302b4de,
-+ 0x1f00e7e7,
-+ 0x209e0000,
-+ 0x2302b9de,
-+ 0x1f01e7e7,
-+ 0x209e0000,
-+ 0xd109ff00,
-+ 0xa0702cf0,
-+ 0x79000001,
-+ 0xd109ff00,
-+ 0xb1002de6,
-+ 0xd11ee609,
-+ 0xb1000de0,
-+ 0xc91fe044,
-+ 0x24c338c6,
-+ 0x10000006,
-+ 0x81382686,
-+ 0x87406690,
-+ 0x813c2680,
-+ 0x7900003e,
-+ 0x110f0600,
-+ 0x81100b00,
-+ 0x24000045,
-+ 0x24000025,
-+ 0x61100603,
-+ 0x24006045,
-+ 0x24006025,
-+ 0x01704545,
-+ 0x90451888,
-+ 0x0b034600,
-+ 0x11070000,
-+ 0x69040004,
-+ 0xc916ff2c,
-+ 0x01019e9e,
-+ 0x7900002f,
-+ 0xc90cff04,
-+ 0x6f0200fd,
-+ 0xd308e8a1,
-+ 0x7f0000fb,
-+ 0x69020008,
-+ 0xd308e89e,
-+ 0xb1002fe6,
-+ 0x91b82880,
-+ 0xc91ce002,
-+ 0x1f1ce6e6,
-+ 0x10080806,
-+ 0x79000015,
-+ 0xb1002fe6,
-+ 0x69030003,
-+ 0x13c06666,
-+ 0x79000011,
-+ 0x91807809,
-+ 0xc910ea09,
-+ 0x81082689,
-+ 0x01018a8a,
-+ 0xc91ee60a,
-+ 0x1d10eaea,
-+ 0x240557c0,
-+ 0x60c08a07,
-+ 0x1f1de6e6,
-+ 0x79000005,
-+ 0x2400018a,
-+ 0x1f10eaea,
-+ 0x1f1fe6e6,
-+ 0xd71ee6f8,
-+ 0x51000002,
-+ 0x11c76666,
-+ 0x81382686,
-+ 0x87406690,
-+ 0x91082689,
-+ 0x813c2680,
-+ 0xb1002ee6,
-+ 0xd103e609,
-+ 0x81807809,
-+ 0xc908e807,
-+ 0x21039400,
-+ 0x81002386,
-+ 0x87086390,
-+ 0x81042380,
-+ 0xc908e802,
-+ 0x21039400,
-+ 0x209e0000,
-+ 0xb10008ef,
-+ 0x110f0f00,
-+ 0x81100b00,
-+ 0x24000025,
-+ 0x61100f02,
-+ 0x24005025,
-+ 0x01952545,
-+ 0x9045382e,
-+ 0xc91def03,
-+ 0x24000900,
-+ 0x2301c09e,
-+ 0xc91cef03,
-+ 0x24001900,
-+ 0x2301c09e,
-+ 0xc91bef03,
-+ 0x24000a00,
-+ 0x2301c09e,
-+ 0xc91aef03,
-+ 0x24001a00,
-+ 0x2301c09e,
-+ 0x8045382e,
-+ 0x01a82545,
-+ 0x9045388e,
-+ 0xc915ef03,
-+ 0x24000000,
-+ 0x2301c09e,
-+ 0xc914ef03,
-+ 0x24001000,
-+ 0x2301c09e,
-+ 0x8045388e,
-+ 0x61100f02,
-+ 0x24006025,
-+ 0x016d2545,
-+ 0x9045382e,
-+ 0xc919ef03,
-+ 0x24000900,
-+ 0x2301c09e,
-+ 0xc918ef03,
-+ 0x24001900,
-+ 0x2301c09e,
-+ 0xc917ef03,
-+ 0x24000a00,
-+ 0x2301c09e,
-+ 0xc916ef03,
-+ 0x24001a00,
-+ 0x2301c09e,
-+ 0x8045382e,
-+ 0x017c2545,
-+ 0x9045388e,
-+ 0xc913ef03,
-+ 0x24000000,
-+ 0x2301c09e,
-+ 0xc912ef03,
-+ 0x24001000,
-+ 0x2301c09e,
-+ 0x8045388e,
-+ 0xd11eef19,
-+ 0x11f02f00,
-+ 0x51000017,
-+ 0x24001520,
-+ 0x81140b20,
-+ 0x81b01a0f,
-+ 0x1f02e7e7,
-+ 0x24c000c0,
-+ 0x24001580,
-+ 0xa0605ce0,
-+ 0xc90fef04,
-+ 0x1d04e7e7,
-+ 0x1d05e7e7,
-+ 0x7900000c,
-+ 0xc90eef04,
-+ 0x1d04e7e7,
-+ 0x1f05e7e7,
-+ 0x79000008,
-+ 0xc90def04,
-+ 0x1f04e7e7,
-+ 0x1d05e7e7,
-+ 0x79000004,
-+ 0xc90cef03,
-+ 0x1f04e7e7,
-+ 0x1f05e7e7,
-+ 0x2100b900,
-+ 0xd11eef03,
-+ 0x1e00eeee,
-+ 0x209e0000,
-+ 0x1c00eeee,
-+ 0x209e0000,
-+ 0x110f0606,
-+ 0x81140b06,
-+ 0x13100606,
-+ 0x91b01a83,
-+ 0x24000025,
-+ 0x61100304,
-+ 0x24005025,
-+ 0xc905e702,
-+ 0x24006025,
-+ 0x110f0300,
-+ 0x81100b00,
-+ 0x81120b00,
-+ 0x51150611,
-+ 0x61100302,
-+ 0x24005025,
-+ 0x1d01e5e5,
-+ 0x51160639,
-+ 0x511a0650,
-+ 0x511c0657,
-+ 0x5118065e,
-+ 0x511e0685,
-+ 0x61100302,
-+ 0x24006025,
-+ 0x1f01e5e5,
-+ 0x51170634,
-+ 0x511b064b,
-+ 0x511d0652,
-+ 0x51190658,
-+ 0x511f067f,
-+ 0xc903e708,
-+ 0x1d03e7e7,
-+ 0x24000060,
-+ 0xa1000a60,
-+ 0x244000c0,
-+ 0x24001580,
-+ 0xa0605ce0,
-+ 0x21007d00,
-+ 0xcf02e7fc,
-+ 0x1d02e7e7,
-+ 0x1f03e7e7,
-+ 0xc904e703,
-+ 0x1f08e3e3,
-+ 0x79000002,
-+ 0x1d08e3e3,
-+ 0xc905e705,
-+ 0x01682545,
-+ 0x9045588d,
-+ 0x2302879e,
-+ 0x79000004,
-+ 0x01902545,
-+ 0x9045588d,
-+ 0x2302819e,
-+ 0x24001872,
-+ 0x24000152,
-+ 0xb10009e0,
-+ 0x108080d3,
-+ 0x10c0c092,
-+ 0x2400102c,
-+ 0x2302c8de,
-+ 0x91021c97,
-+ 0x91001cd8,
-+ 0x91061c98,
-+ 0x91041cd9,
-+ 0x910a1c99,
-+ 0x91081cda,
-+ 0x910e1c9a,
-+ 0x910c1cdb,
-+ 0x91261d9b,
-+ 0x91287d9c,
-+ 0x23028dde,
-+ 0x1f02e7e7,
-+ 0x1d03e7e7,
-+ 0x7d000070,
-+ 0x01902545,
-+ 0x9045798d,
-+ 0x79000003,
-+ 0x01682545,
-+ 0x9045788d,
-+ 0x0b09eee0,
-+ 0x24001472,
-+ 0xd108e303,
-+ 0xc900e00b,
-+ 0x79000002,
-+ 0xc910e009,
-+ 0xd101e503,
-+ 0x2302819e,
-+ 0x79000002,
-+ 0x2302879e,
-+ 0x91013d12,
-+ 0x9504bd93,
-+ 0x23028dde,
-+ 0x7d00005d,
-+ 0xd108ee03,
-+ 0x1d10e7e7,
-+ 0x7900009a,
-+ 0x1d11e7e7,
-+ 0x79000098,
-+ 0x01902545,
-+ 0x9045798d,
-+ 0x79000003,
-+ 0x01682545,
-+ 0x9045788d,
-+ 0x0b0aeee0,
-+ 0x24001072,
-+ 0x7f0000e8,
-+ 0x01a02545,
-+ 0x9045b98d,
-+ 0x79000003,
-+ 0x01742545,
-+ 0x9045b88d,
-+ 0x0b01efe0,
-+ 0x24001172,
-+ 0x7f0000e0,
-+ 0x2302d1de,
-+ 0x79000002,
-+ 0x2302d6de,
-+ 0x000c2545,
-+ 0x9045198f,
-+ 0xd100ef07,
-+ 0x1d02efef,
-+ 0xc901ef0c,
-+ 0xc905ef0b,
-+ 0x1d01efef,
-+ 0x1d05efef,
-+ 0x79000008,
-+ 0xd102ef04,
-+ 0x1f02efef,
-+ 0x8045198f,
-+ 0x79000078,
-+ 0xd101ef04,
-+ 0x1f01efef,
-+ 0x1f05efef,
-+ 0x8045198f,
-+ 0x69180673,
-+ 0x01ac2545,
-+ 0x2302dbde,
-+ 0xd100ef03,
-+ 0x23036c9e,
-+ 0x7900006e,
-+ 0xc800e40b,
-+ 0x110f0020,
-+ 0x81100b20,
-+ 0x100c0c45,
-+ 0x61100002,
-+ 0x01604545,
-+ 0x9045188f,
-+ 0xd101ef04,
-+ 0x1f01efef,
-+ 0x1f07efef,
-+ 0x8045188f,
-+ 0x01010000,
-+ 0x6f1300f4,
-+ 0x79000060,
-+ 0x2302d1de,
-+ 0x79000002,
-+ 0x2302d6de,
-+ 0x000c2545,
-+ 0x9045198f,
-+ 0xc903ef05,
-+ 0x1d03efef,
-+ 0x1f04efef,
-+ 0x8045198f,
-+ 0x79000056,
-+ 0xc904ef55,
-+ 0x1d04efef,
-+ 0xc901ef04,
-+ 0xc906ef03,
-+ 0x1d01efef,
-+ 0x1d06efef,
-+ 0x8045198f,
-+ 0x691e064e,
-+ 0x01ac2545,
-+ 0x2302dbde,
-+ 0xc800e40c,
-+ 0x110f0020,
-+ 0x81100b20,
-+ 0x100c0c45,
-+ 0x61100002,
-+ 0x01604545,
-+ 0x9045188f,
-+ 0xc901ef05,
-+ 0xc908ef04,
-+ 0x1d01efef,
-+ 0x1d07efef,
-+ 0x8045188f,
-+ 0x01010000,
-+ 0x6f1300f3,
-+ 0x7900003d,
-+ 0x10ededf0,
-+ 0xc908e303,
-+ 0x13401010,
-+ 0x209e0000,
-+ 0x13301010,
-+ 0x209e0000,
-+ 0x10ededf0,
-+ 0xc908e303,
-+ 0x130a1010,
-+ 0x209e0000,
-+ 0x13081010,
-+ 0x209e0000,
-+ 0x24000266,
-+ 0x2400c800,
-+ 0x24000020,
-+ 0xd108ee17,
-+ 0x01012020,
-+ 0xc91cff09,
-+ 0x6e0020fe,
-+ 0xc910e702,
-+ 0x20de0000,
-+ 0x1f10e7e7,
-+ 0x110f0600,
-+ 0x11f02727,
-+ 0x12002727,
-+ 0x20de0000,
-+ 0x1d10e7e7,
-+ 0x2302b4de,
-+ 0x511d0605,
-+ 0x511c0602,
-+ 0x7900001e,
-+ 0x01a62545,
-+ 0x79000002,
-+ 0x01722545,
-+ 0x90451880,
-+ 0x01018080,
-+ 0x80451880,
-+ 0x79000017,
-+ 0x01012020,
-+ 0xc91dff09,
-+ 0x6e0020fe,
-+ 0xc911e702,
-+ 0x20de0000,
-+ 0x1f11e7e7,
-+ 0x09040600,
-+ 0x110f2727,
-+ 0x12002727,
-+ 0x20de0000,
-+ 0x1d11e7e7,
-+ 0x2302b9de,
-+ 0x7f0000ea,
-+ 0x81b82786,
-+ 0x240000d1,
-+ 0x87c06790,
-+ 0x81bc2780,
-+ 0x20de0000,
-+ 0x81b82986,
-+ 0x87c06990,
-+ 0x81bc2980,
-+ 0x20de0000,
-+ 0x91b43a88,
-+ 0x2301029e,
-+ 0x51150608,
-+ 0xc908e305,
-+ 0x51120303,
-+ 0x01010303,
-+ 0x79000002,
-+ 0x24000003,
-+ 0x01012323,
-+ 0x81b01a83,
-+ 0x21007d00,
-+ 0x902cfc88,
-+ 0x10c8c893,
-+ 0x108888d4,
-+ 0x10c9c994,
-+ 0x108989d5,
-+ 0x10caca95,
-+ 0x108a8ad6,
-+ 0x10cbcb96,
-+ 0x108b8bd7,
-+ 0xd108e303,
-+ 0x2400a80c,
-+ 0x20de0000,
-+ 0x2400aa0c,
-+ 0x20de0000,
-+ 0xd108e303,
-+ 0x24007c0c,
-+ 0x20de0000,
-+ 0x24007e0c,
-+ 0x20de0000,
-+ 0x24000000,
-+ 0x90453904,
-+ 0xd108e303,
-+ 0x24007c0c,
-+ 0x20de0000,
-+ 0x24007e0c,
-+ 0x20de0000,
-+ 0xb1002fe6,
-+ 0x91b82880,
-+ 0xc91ce002,
-+ 0x209e0000,
-+ 0xb1002ee6,
-+ 0x69187279,
-+ 0xd110f230,
-+ 0xc903e769,
-+ 0xc90be604,
-+ 0xc904e767,
-+ 0xd105e766,
-+ 0x7900000c,
-+ 0xc90ae604,
-+ 0xd104e763,
-+ 0xd105e762,
-+ 0x79000008,
-+ 0xc907e604,
-+ 0xc904e75f,
-+ 0xc905e75e,
-+ 0x79000004,
-+ 0xc906e65c,
-+ 0xd104e75b,
-+ 0xc905e75a,
-+ 0x91003c80,
-+ 0x6897c058,
-+ 0x68d88057,
-+ 0x91043c80,
-+ 0x6898c055,
-+ 0x68d98054,
-+ 0x91083c80,
-+ 0x6899c052,
-+ 0x68da8051,
-+ 0x910c3c80,
-+ 0x689ac04f,
-+ 0x68db804e,
-+ 0xb10009e0,
-+ 0x6892c04c,
-+ 0x68d3804b,
-+ 0x24000160,
-+ 0xa1000a60,
-+ 0x244000c0,
-+ 0x24001580,
-+ 0xa0605ce0,
-+ 0x1d03e7e7,
-+ 0x109393c8,
-+ 0x10d4d488,
-+ 0x109494c9,
-+ 0x10d5d589,
-+ 0x109595ca,
-+ 0x10d6d68a,
-+ 0x109696cb,
-+ 0x10d7d78b,
-+ 0x8110fc88,
-+ 0x209e0000,
-+ 0x91003c80,
-+ 0x6893c00c,
-+ 0x68d4800b,
-+ 0x91043c80,
-+ 0x6894c009,
-+ 0x68d58008,
-+ 0x91083c80,
-+ 0x6895c006,
-+ 0x68d68005,
-+ 0x910c3c80,
-+ 0x6896c003,
-+ 0x68d78002,
-+ 0x79000010,
-+ 0x24ffff80,
-+ 0x24ffffc0,
-+ 0x68809306,
-+ 0x68e0f405,
-+ 0x68e0f504,
-+ 0x68e0f603,
-+ 0x6880d702,
-+ 0x79000008,
-+ 0x24000080,
-+ 0x240000c0,
-+ 0x68809323,
-+ 0x68e0f422,
-+ 0x68e0f521,
-+ 0x68e0f620,
-+ 0x6880d71f,
-+ 0x1d10f2f2,
-+ 0x2400002c,
-+ 0x2302c8de,
-+ 0x24000f80,
-+ 0x240000c0,
-+ 0x0101c0c0,
-+ 0xd100e504,
-+ 0xc91cff06,
-+ 0x6e80c0fd,
-+ 0x21016d00,
-+ 0xc91dff03,
-+ 0x6e80c0fa,
-+ 0x21016d00,
-+ 0xd104e606,
-+ 0xc909e608,
-+ 0xb1000ce0,
-+ 0x0101e0e0,
-+ 0xa0600ce0,
-+ 0x79000004,
-+ 0xb1000be0,
-+ 0x0101e0e0,
-+ 0xa0600be0,
-+ 0xb1002fe6,
-+ 0xd100e504,
-+ 0x2302b4de,
-+ 0x24000022,
-+ 0x209e0000,
-+ 0x2302b9de,
-+ 0x24000042,
-+ 0x209e0000,
-+ 0xd104e609,
-+ 0x01782545,
-+ 0x9045180e,
-+ 0x110f0e00,
-+ 0x81100b00,
-+ 0x2400a445,
-+ 0x51002502,
-+ 0x01504545,
-+ 0x90451888,
-+ 0xc909e87d,
-+ 0xb1002fe6,
-+ 0x1f1fe6e6,
-+ 0x10080806,
-+ 0x21015f00,
-+ 0x6914721b,
-+ 0x01782545,
-+ 0x2303bade,
-+ 0x900c188f,
-+ 0x1d02efef,
-+ 0xc901ef05,
-+ 0xc905ef04,
-+ 0x1d01efef,
-+ 0x1d05efef,
-+ 0x800c188f,
-+ 0xc909e66e,
-+ 0x2303d0de,
-+ 0xc800e40c,
-+ 0x110f0020,
-+ 0x81100b20,
-+ 0x100c0c45,
-+ 0x61100002,
-+ 0x01604545,
-+ 0x9045188f,
-+ 0xc901ef05,
-+ 0xc907ef04,
-+ 0x1d01efef,
-+ 0x1d07efef,
-+ 0x8045188f,
-+ 0x01010000,
-+ 0x6f1300f3,
-+ 0x7900005e,
-+ 0x6910725d,
-+ 0x01782545,
-+ 0x2303bade,
-+ 0x900c188f,
-+ 0x1f03efef,
-+ 0xd101ef03,
-+ 0x1f01efef,
-+ 0x1f06efef,
-+ 0x800c188f,
-+ 0xc909e654,
-+ 0x2303d0de,
-+ 0xc800e40b,
-+ 0x110f0020,
-+ 0x81100b20,
-+ 0x100c0c45,
-+ 0x61100002,
-+ 0x01604545,
-+ 0x9045188f,
-+ 0xd101ef04,
-+ 0x1f01efef,
-+ 0x1f08efef,
-+ 0x8045188f,
-+ 0x01010000,
-+ 0x6f1300f4,
-+ 0x79000045,
-+ 0x01782545,
-+ 0x9045788e,
-+ 0x1d02efef,
-+ 0x1d12efef,
-+ 0xc905ef04,
-+ 0x1d05efef,
-+ 0x1d01efef,
-+ 0x7900000c,
-+ 0xc915ef04,
-+ 0x1d15efef,
-+ 0x1d11efef,
-+ 0x79000008,
-+ 0xc907ef04,
-+ 0x1d07efef,
-+ 0x1d01efef,
-+ 0x79000004,
-+ 0xc917ef03,
-+ 0x1d17efef,
-+ 0x1d11efef,
-+ 0x017c2545,
-+ 0x8045388f,
-+ 0x110f0e00,
-+ 0x81100b00,
-+ 0x2400a845,
-+ 0x51002502,
-+ 0x01504545,
-+ 0x9045388f,
-+ 0x1d02efef,
-+ 0x1d12efef,
-+ 0xc905ef04,
-+ 0x1d05efef,
-+ 0x1d01efef,
-+ 0x79000004,
-+ 0xc915ef03,
-+ 0x1d15efef,
-+ 0x1d11efef,
-+ 0x8045388f,
-+ 0x7900001f,
-+ 0xc909e60d,
-+ 0x9045180e,
-+ 0x110f0e00,
-+ 0x81100b00,
-+ 0xc90ae603,
-+ 0x2400a80c,
-+ 0x79000003,
-+ 0xc90be617,
-+ 0x2400aa0c,
-+ 0x51002503,
-+ 0x01500c0c,
-+ 0x24005025,
-+ 0x20de0000,
-+ 0xc904e611,
-+ 0xc906e603,
-+ 0x24007c0c,
-+ 0x79000003,
-+ 0xc907e60d,
-+ 0x24007e0c,
-+ 0x51002502,
-+ 0x01600c0c,
-+ 0x20de0000,
-+ 0x01ac2545,
-+ 0x24000000,
-+ 0x90453804,
-+ 0xd10be603,
-+ 0x24007c0c,
-+ 0x20de0000,
-+ 0x24007e0c,
-+ 0x20de0000,
-+ 0x209e0000};
-diff -urN linux.old/drivers/atm/sangam_atm/turbodsl.c linux.dev/drivers/atm/sangam_atm/turbodsl.c
---- linux.old/drivers/atm/sangam_atm/turbodsl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/atm/sangam_atm/turbodsl.c 2005-07-10 08:02:01.456109536 +0200
-@@ -0,0 +1,223 @@
-+
-+
-+/*
-+ *
-+ * Turbo DSL Implementaion
-+ *
-+ * Zhicheng Tang ztang@ti.com
-+ *
-+ * 2002 (c) Texas Instruments Inc.
-+ *
-+*/
-+
-+/* defines and variables */
-+#define RFC2684_BRIDGED_HDR_SIZE 10
-+unsigned char LLC_BRIDGED_HEADER_2684[RFC2684_BRIDGED_HDR_SIZE] =
-+ {0xAA, 0xAA, 0x03, 0x00, 0x80, 0xC2, 0x00, 0x07, 0x00, 0x00};
-+
-+#define RFC2684_ROUTED_HDR_SIZE 6
-+unsigned char LLC_ROUTED_HEADER_2684[6] ={0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
-+
-+unsigned long PPP_LLC_HEADER = 0xCF03FEFE;
-+
-+/* struct definition */
-+enum
-+{
-+ AAL5_ENCAP_PPP_LLC,
-+ AAL5_ENCAP_PPP_VCMUX,
-+ AAL5_ENCAP_RFC2684_LLC_BRIDGED,
-+ AAL5_ENCAP_RFC2684_LLC_ROUTED
-+};
-+
-+/* Etherent header */
-+typedef struct _turbodsl_ether_header
-+{
-+ unsigned char dst_mac_addr[6];
-+ unsigned char src_mac_addr[6];
-+ unsigned short ether_type;
-+} turbodsl_ether_header_t;
-+
-+
-+/* Ip header define */
-+typedef struct _turbodsl_ip_header
-+{
-+
-+ unsigned short vit;
-+ unsigned short total_length;
-+ unsigned short ip_id;
-+ unsigned char flag; /* bit 0 = 0, bit1 = don't fragment, bit2=more frag */
-+ unsigned char fragment_offset; /* offset include remaining 5 bits above, which make it 13 bits */
-+ unsigned char time_to_live;
-+ unsigned char protocol;
-+ unsigned short checksum;
-+ unsigned int src_ip;
-+ unsigned int dst_ip;
-+} turbodsl_ip_header_t;
-+
-+/* Arp packet define */
-+typedef struct _turbodsl_arp_header
-+{
-+ unsigned short hardware_type;
-+ unsigned short protocol_type;
-+ unsigned char h_len;
-+ unsigned char p_len;
-+ unsigned short operation ;
-+ unsigned char snd_hw_address[6];
-+ unsigned char snd_pt_address[4];
-+ unsigned char dst_hw_address[6];
-+ unsigned char dst_pt_address[4];
-+} turbodsl_arp_header_t;
-+
-+#define FIN_FLAG 1
-+#define SYN_FLAG 1<<1
-+#define RST_FLAG 1<<2
-+#define PSH_FLAG 1<<3
-+#define ACK_FLAG 1<<4
-+#define URG_FLAG 1<<5
-+
-+typedef struct _turbodsl_tcp_header
-+{
-+ unsigned short src_port;
-+ unsigned short dst_port;
-+ unsigned int seq_num;
-+ unsigned int ack_num;
-+ unsigned char offset; /* only bits 4-7 are for offset */
-+ unsigned char flags; /* bits: 0-FIN, 1-SYN, 2-RST, 3-PSH, 4-ACK, 5-URG */
-+ unsigned short windows;
-+ unsigned short checksum;
-+ unsigned short urgent_ptr;
-+} turbodsl_tcp_header_t;
-+
-+
-+
-+/***************************************************************************
-+ * Function: turbodsl_memory_compare
-+ * Descripation: Memory compare
-+ ****************************************************************************/
-+int turbodsl_memory_compare(unsigned char *pIn, unsigned char *pOut, unsigned int len)
-+ {
-+ int i;
-+
-+ for(i=0;i<(int)len; i++)
-+ {
-+ if(pIn[i] != pOut[i])
-+ return 0;
-+ }
-+ return 1;
-+ }
-+
-+/***************************************************************************
-+ * Function: turbodsl_check_aal5_encap_type
-+ * Descripation: Determine AAL5 Encapsulation type
-+ * Input:
-+ * unsigned char *pData, AAL5 Packet buffer pointer
-+ ****************************************************************************/
-+int turbodsl_check_aal5_encap_type(unsigned char *pData)
-+ {
-+
-+ if(turbodsl_memory_compare(pData, LLC_BRIDGED_HEADER_2684, 6))
-+ return AAL5_ENCAP_RFC2684_LLC_BRIDGED;
-+ if(turbodsl_memory_compare(pData, LLC_ROUTED_HEADER_2684, 6))
-+ return AAL5_ENCAP_RFC2684_LLC_ROUTED;
-+ if(turbodsl_memory_compare(pData, (unsigned char *)&PPP_LLC_HEADER, sizeof(PPP_LLC_HEADER)))
-+ return AAL5_ENCAP_PPP_LLC;
-+
-+ return AAL5_ENCAP_PPP_VCMUX;
-+ }
-+
-+/***************************************************************************
-+ * Function: turbodsl_check_priority_type
-+ * Descripation: Determine AAL5 Encapsulation type
-+ * Input:
-+ * unsigned char *pData, AAL5 Packet buffer pointer.
-+ * short vpi, VPI.
-+ * int vci, VCI
-+ ****************************************************************************/
-+int turbodsl_check_priority_type(unsigned char *pData)
-+ {
-+ int encap;
-+ unsigned char *pP;
-+ unsigned short etherType;
-+ turbodsl_ip_header_t *pIp;
-+ turbodsl_tcp_header_t *pTcp;
-+ unsigned short ip_length;
-+
-+ dprintf(2, "turbodsl_check_priority_type ==>\n");
-+
-+ encap = turbodsl_check_aal5_encap_type(pData);
-+ pP = pData;
-+
-+ switch(encap)
-+ {
-+ case AAL5_ENCAP_RFC2684_LLC_BRIDGED:
-+ pP += RFC2684_BRIDGED_HDR_SIZE; //skip off aal5 encap
-+ pP += 12; //skip of mac address
-+ etherType = *(unsigned short *)pP;
-+ if(etherType != 0x6488 && etherType != 0x0008)
-+ {
-+ //Not an IP packet
-+ return 1;
-+ }
-+
-+ pP +=2; //skip ether type
-+ if(etherType == 0x6488)
-+ {
-+ pP += 6;
-+ }
-+ break;
-+ case AAL5_ENCAP_RFC2684_LLC_ROUTED:
-+ pP += RFC2684_ROUTED_HDR_SIZE; //skip of encap
-+ pP += 2; //skip ether type
-+ break;
-+ case AAL5_ENCAP_PPP_LLC:
-+ pP += sizeof(PPP_LLC_HEADER);
-+ if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
-+ pP += 2;
-+ break;
-+ case AAL5_ENCAP_PPP_VCMUX:
-+ if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
-+ pP += 2;
-+ break;
-+ default:
-+ return 1;
-+ }
-+
-+ pIp = (turbodsl_ip_header_t *)pP;
-+ if(pIp->vit != 0x0045)
-+ {
-+ //Not a IP packet
-+ return 1;
-+ }
-+
-+ if(pIp->protocol != 0x06)
-+ {
-+ //not tcp packet
-+ return 1;
-+ }
-+
-+ pTcp = (turbodsl_tcp_header_t *)(pP + sizeof(turbodsl_ip_header_t));
-+
-+ ip_length = (pIp->total_length>>8) + (pIp->total_length<<8);
-+
-+ if((pTcp->flags & ACK_FLAG) && ip_length <=40)
-+ return 0;
-+
-+ return 1;
-+ }
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff -urN linux.old/include/linux/atmdev.h linux.dev/include/linux/atmdev.h
---- linux.old/include/linux/atmdev.h 2004-08-08 01:26:06.000000000 +0200
-+++ linux.dev/include/linux/atmdev.h 2005-07-10 08:02:01.476106496 +0200
-@@ -30,6 +30,9 @@
- #define ATM_DS3_PCR (8000*12)
- /* DS3: 12 cells in a 125 usec time slot */
-
-+#define ATM_PDU_OVHD 0 /* number of bytes to charge against buffer
-+ quota per PDU */
-+
- #define ATM_SD(s) ((s)->sk->protinfo.af_atm)
-
-
-@@ -94,7 +97,8 @@
- /* set backend handler */
- #define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
- /* use backend to make new if */
--
-+#define ATM_STOPTX _IOW('a',ATMIOC_SPECIAL+4,struct atmif_sioc)
-+ /* Stop Tx on Sangam DSL */
- /*
- * These are backend handkers that can be set via the ATM_SETBACKEND call
- * above. In the future we may support dynamic loading of these - for now,
-@@ -199,7 +203,9 @@
- "SESSION", "HASSAP", "BOUND", "CLOSE"
-
-
--#ifdef __KERNEL__
-+#ifndef __KERNEL__
-+#undef __AAL_STAT_ITEMS
-+#else
-
- #include <linux/sched.h> /* wait_queue_head_t */
- #include <linux/time.h> /* struct timeval */
-@@ -277,6 +283,7 @@
-
- struct atm_vcc {
- atm_vcc_flags_t flags; /* VCC flags (ATM_VF_*) */
-+ unsigned char family; /* address family; 0 if unused */
- short vpi; /* VPI and VCI (types must be equal */
- /* with sockaddr) */
- int vci;
-@@ -285,20 +292,31 @@
- struct atm_dev *dev; /* device back pointer */
- struct atm_qos qos; /* QOS */
- struct atm_sap sap; /* SAP */
-+ atomic_t tx_inuse,rx_inuse; /* buffer space in use */
- void (*push)(struct atm_vcc *vcc,struct sk_buff *skb);
- void (*pop)(struct atm_vcc *vcc,struct sk_buff *skb); /* optional */
-+ struct sk_buff *(*alloc_tx)(struct atm_vcc *vcc,unsigned int size);
-+ /* TX allocation routine - can be */
-+ /* modified by protocol or by driver.*/
-+ /* NOTE: this interface will change */
- int (*push_oam)(struct atm_vcc *vcc,void *cell);
- int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);
- void *dev_data; /* per-device data */
- void *proto_data; /* per-protocol data */
-+ struct timeval timestamp; /* AAL timestamps */
-+ struct sk_buff_head recvq; /* receive queue */
- struct k_atm_aal_stats *stats; /* pointer to AAL stats group */
- wait_queue_head_t sleep; /* if socket is busy */
- struct sock *sk; /* socket backpointer */
-+ struct atm_vcc *prev,*next;
- /* SVC part --- may move later ------------------------------------- */
- short itf; /* interface number */
- struct sockaddr_atmsvc local;
- struct sockaddr_atmsvc remote;
- void (*callback)(struct atm_vcc *vcc);
-+ struct sk_buff_head listenq;
-+ int backlog_quota; /* number of connection requests we */
-+ /* can still accept */
- int reply; /* also used by ATMTCP */
- /* Multipoint part ------------------------------------------------- */
- struct atm_vcc *session; /* session VCC descriptor */
-@@ -324,6 +342,8 @@
- /* (NULL) */
- const char *type; /* device type name */
- int number; /* device index */
-+ struct atm_vcc *vccs; /* VCC table (or NULL) */
-+ struct atm_vcc *last; /* last VCC (or undefined) */
- void *dev_data; /* per-device data */
- void *phy_data; /* private PHY date */
- atm_dev_flags_t flags; /* device flags (ATM_DF_*) */
-@@ -333,13 +353,15 @@
- struct k_atm_dev_stats stats; /* statistics */
- char signal; /* signal status (ATM_PHY_SIG_*) */
- int link_rate; /* link rate (default: OC3) */
-- atomic_t refcnt; /* reference count */
-- spinlock_t lock; /* protect internal members */
-+ atomic_t refcnt; /* reference count */
-+ spinlock_t lock; /* protect internal members */
- #ifdef CONFIG_PROC_FS
- struct proc_dir_entry *proc_entry; /* proc entry */
- char *proc_name; /* proc entry name */
- #endif
-- struct list_head dev_list; /* linkage */
-+ struct atm_dev *prev,*next; /* linkage */
-+ struct list_head dev_list; /* linkage */
-+
- };
-
-
-@@ -375,6 +397,8 @@
- void (*feedback)(struct atm_vcc *vcc,struct sk_buff *skb,
- unsigned long start,unsigned long dest,int len);
- int (*change_qos)(struct atm_vcc *vcc,struct atm_qos *qos,int flags);
-+ void (*free_rx_skb)(struct atm_vcc *vcc, struct sk_buff *skb);
-+ /* @@@ temporary hack */
- int (*proc_read)(struct atm_dev *dev,loff_t *pos,char *page);
- struct module *owner;
- };
-@@ -389,6 +413,7 @@
-
- struct atm_skb_data {
- struct atm_vcc *vcc; /* ATM VCC */
-+ int iovcnt; /* 0 for "normal" operation */
- unsigned long atm_options; /* ATM layer options */
- };
-
-@@ -399,11 +424,10 @@
-
- struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
- int number,atm_dev_flags_t *flags); /* number == -1: pick first available */
--struct atm_dev *atm_dev_lookup(int number);
-+struct atm_dev *atm_find_dev(int number);
- void atm_dev_deregister(struct atm_dev *dev);
- void shutdown_atm_dev(struct atm_dev *dev);
--void vcc_insert_socket(struct sock *sk);
--void vcc_remove_socket(struct sock *sk);
-+void bind_vcc(struct atm_vcc *vcc,struct atm_dev *dev);
-
-
- /*
-@@ -411,54 +435,52 @@
- *
- */
-
--static inline int atm_guess_pdu2truesize(int size)
-+static __inline__ int atm_guess_pdu2truesize(int pdu_size)
- {
-- return (SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info));
-+ return ((pdu_size+15) & ~15) + sizeof(struct sk_buff);
- }
-
-
--static inline void atm_force_charge(struct atm_vcc *vcc,int truesize)
-+static __inline__ void atm_force_charge(struct atm_vcc *vcc,int truesize)
- {
-- atomic_add(truesize, &vcc->sk->rmem_alloc);
-+ atomic_add(truesize+ATM_PDU_OVHD,&vcc->rx_inuse);
- }
-
-
--static inline void atm_return(struct atm_vcc *vcc,int truesize)
-+static __inline__ void atm_return(struct atm_vcc *vcc,int truesize)
- {
-- atomic_sub(truesize, &vcc->sk->rmem_alloc);
-+ atomic_sub(truesize+ATM_PDU_OVHD,&vcc->rx_inuse);
- }
-
-
--static inline int atm_may_send(struct atm_vcc *vcc,unsigned int size)
-+static __inline__ int atm_may_send(struct atm_vcc *vcc,unsigned int size)
- {
-- return (size + atomic_read(&vcc->sk->wmem_alloc)) < vcc->sk->sndbuf;
-+ return size+atomic_read(&vcc->tx_inuse)+ATM_PDU_OVHD < vcc->sk->sndbuf;
- }
-
-
-+int atm_charge(struct atm_vcc *vcc,int truesize);
-+struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
-+ int gfp_flags);
-+int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci);
-+int atm_pcr_goal(struct atm_trafprm *tp);
-+
-+void atm_async_release_vcc(struct atm_vcc *vcc,int reply);
-+
- static inline void atm_dev_hold(struct atm_dev *dev)
- {
-- atomic_inc(&dev->refcnt);
-+ atomic_inc(&dev->refcnt);
- }
-
--
- static inline void atm_dev_put(struct atm_dev *dev)
- {
-- atomic_dec(&dev->refcnt);
-+ atomic_dec(&dev->refcnt);
-
-- if ((atomic_read(&dev->refcnt) == 1) &&
-- test_bit(ATM_DF_CLOSE,&dev->flags))
-- shutdown_atm_dev(dev);
-+ if ((atomic_read(&dev->refcnt) == 1) &&
-+ test_bit(ATM_DF_CLOSE,&dev->flags))
-+ shutdown_atm_dev(dev);
- }
-
--
--int atm_charge(struct atm_vcc *vcc,int truesize);
--struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
-- int gfp_flags);
--int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci);
--int atm_pcr_goal(struct atm_trafprm *tp);
--
--void vcc_release_async(struct atm_vcc *vcc, int reply);
--
- #endif /* __KERNEL__ */
-
- #endif
-diff -urN linux.old/include/linux/atm.h linux.dev/include/linux/atm.h
---- linux.old/include/linux/atm.h 2001-11-22 20:48:41.000000000 +0100
-+++ linux.dev/include/linux/atm.h 2005-07-10 08:02:01.476106496 +0200
-@@ -135,9 +135,12 @@
- unsigned char traffic_class; /* traffic class (ATM_UBR, ...) */
- int max_pcr; /* maximum PCR in cells per second */
- int pcr; /* desired PCR in cells per second */
-+ int scr; /* desired SCR in cells per second */
- int min_pcr; /* minimum PCR in cells per second */
- int max_cdv; /* maximum CDV in microseconds */
- int max_sdu; /* maximum SDU in bytes */
-+ /* Ron remove for old tiatm driver 1.00.09 */
-+ //int mbs; /* Maximum Burst size */
- /* extra params for ABR */
- unsigned int icr; /* Initial Cell Rate (24-bit) */
- unsigned int tbe; /* Transient Buffer Exposure (24-bit) */
--- /dev/null
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.c
+--- linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.c 2005-07-10 04:06:50.491302256 +0200
+@@ -0,0 +1,728 @@
++#ifndef _INC_CPCOMMON_C
++#define _INC_CPCOMMON_C
++
++#ifdef _CPHAL_CPMAC
++#include "cpremap_cpmac.c"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "cpremap_cpaal5.c"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "cpremap_cpsar.c"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "cpremap_cpaal2.c"
++#endif
++
++/**
++@defgroup Common_Config_Params Common Configuration Parameters
++
++This section documents the configuration parameters that are valid across
++all CPHAL devices.
++@{
++*/
++/** This is the debug level. The field is bit defined, such that the user
++should set to 1 all the bits corresponding to desired debug outputs. The following
++are the meanings for each debug bit:
++- bit0 (LSB): CPHAL Function Trace
++- b1 : OS Function call trace
++- b2 : Critical section entry/exit
++- b3 : Memory allocation/destruction
++- b4 : Detailed information in Rx path
++- b5 : Detailed information in Tx path
++- b6 : Extended error information
++- b7 : General info
++*/
++static const char pszDebug[] = "debug";
++/** CPU Frequency. */
++/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
++/** Base address for the module. */
++static const char pszBase[] = "base";
++/** Reset bit for the module. */
++static const char pszResetBit[] = "reset_bit";
++/** Reset base address for the module. */
++static const char pszResetBase[] = "ResetBase";
++/** Interrupt line for the module. */
++static const char pszIntLine[] = "int_line";
++/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
++static const char pszOffset[] = "offset";
++/** The OS may "Get" this parameter, which is a pointer
++ to a character string that indicates the version of CPHAL. */
++static const char pszVer[] = "Version";
++/*@}*/
++
++/**
++@defgroup Common_Control_Params Common Keys for [os]Control()
++
++This section documents the keys used with the OS @c Control() interface that
++are required by CPHAL devices.
++
++@{
++*/
++/** Used to wait for an integer number of clock ticks, given as an integer
++ pointer in the @p Value parameter. No actions are defined. */
++static const char pszSleep[] = "Sleep";
++/** Requests the OS to flush it's IO buffers. No actions are defined. */
++static const char pszSioFlush[] = "SioFlush";
++/*@}*/
++
++static const char pszStateChange[] = "StateChange";
++static const char pszStatus[] = "Status";
++
++static const char pszGET[] = "Get";
++static const char pszSET[] = "Set";
++static const char pszCLEAR[] = "Clear";
++static const char pszNULL[] = "";
++static const char pszLocator[] = "Locator";
++static const char pszOff[] = "Off";
++static const char pszOn[] = "On";
++static const char hcMaxFrags[] = "MaxFrags";
++
++#ifdef _CPHAL_CPMAC
++
++/* New method for string constants */
++const char hcClear[] = "Clear";
++const char hcGet[] = "Get";
++const char hcSet[] = "Set";
++
++const char hcTick[] = "Tick";
++
++static const CONTROL_KEY KeyCommon[] =
++ {
++ {"" , enCommonStart},
++ {pszStatus , enStatus},
++ {pszOff , enOff},
++ {pszOn , enOn},
++ {pszDebug , enDebug},
++ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
++ {"" , enCommonEnd}
++ };
++#endif
++
++/**
++@defgroup Common_Statistics Statistics
++
++A broad array of module statistics is available. Statistics values are accessed
++through the @c Control() interface of the CPHAL. There are 5 different levels
++of statistics, each of which correspond to a unique set of data. Furthermore,
++certain statistics data is indexed by using a channel number and Tx queue number.
++The following is a brief description of each statistics level, along with the
++indexes used for the level:
++
++- Level 0: Hardware Statistics (index with channel)
++- Level 1: CPHAL Software Statistics (channel, queue)
++- Level 2: CPHAL Flags (channel, queue)
++- Level 3: CPHAL Channel Configuration (channel)
++- Level 4: CPHAL General Configuration (no index)
++
++The caller requests statistics information by providing a Key string to the
++@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
++The only valid Action parameter for statistics usage is "Get".
++
++Code Examples:
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# Get Level 2 stats for Channel 0, Queue 0
++HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
++
++# Get Level 4 stats
++HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
++@endcode
++
++The information returned in the Value parameter of @c Control() is an
++array of pointers to strings. The pointers are arranged in pairs.
++The first pointer is a pointer to a name string for a particular statistic.
++The next pointer is a pointer to a string containing the representation of
++the integer statistic value corresponding to the first pointer. This is followed
++by another pair of pointers, and so on, until a NULL pointer is encountered. The
++following is example code for processing the statistics data. Note that the OS
++is responsible for freeing the memory passed back through the Value parameter of
++@c Control().
++
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# output Statistics data
++PrintStats(StatsData);
++
++# the upper layer is responsible for freeing stats info
++free(&StatsPtr);
++
++...
++
++void PrintStats(unsigned int *StatsPtr)
++ {
++ while(*StatsPtr)
++ {
++ printf("%20s:", (char *)*StatsPtr);
++ StatsPtr++;
++ printf("%11s\n", (char *)*StatsPtr);
++ StatsPtr++;
++ }
++ MySioFlush();
++ }
++@endcode
++
++Within each statistics level, there are several statistics defined. The statistics that
++are common to every CPPI module are listed below. In addition, each module may define
++extra statistics in each level, which will be documented within the module-specific
++documentation appendices.
++
++- Level 0 Statistics
++ - All level 0 statistics are module-specific.
++- Level 1 Statistics (CPHAL Software Statistics)
++ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
++ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
++transmitting the previous last packet in the queue (per channel and queue).
++ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
++reception of the previous last packet in the queue (per channel).
++ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
++ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
++ - RxPacketsServiced: Number of received packets (per channel).
++ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
++ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
++ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
++ - RxTotal: Total number of received packets, all channels.
++ - TxTotal: Total number of transmitted packets, all channels and queues.
++- Level 2 Statistics (CPHAL Flags)
++ - RcbPool: Pointer to receive descriptor pool (per channel).
++ - RxActQueueCount: Number of buffers currently available for receive (per channel).
++ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
++ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
++ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
++ - RcbStart: Pointer to block of receive descriptors.
++ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
++ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
++ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
++ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
++ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
++ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
++ - TcbStart: Pointer to block of transmit descriptors.
++ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
++- Level 3 Statistics (CPHAL Channel Configuration)
++ - RxBufSize: Rx buffer size.
++ - RxBufferOffset: Rx buffer offset.
++ - RxNumBuffers: Number of Rx buffers.
++ - RxServiceMax: Maximum number of receive packets to service at a time.
++ - TxNumBuffers: Number of Tx buffer descriptors.
++ - TxNumQueues: Number of Tx queues to use.
++ - TxServiceMax: Maximum number of transmit packets to service at a time.
++- Level 4 Statistics (CPHAL General Configuration)
++ - Base Address: Base address of the module.
++ - Offset (VLYNQ): VLYNQ relative module offset.
++ - Interrupt Line: Interrupt number.
++ - Debug: Debug flag, 1 to enable debug.
++ - Inst: Instance number.
++*/
++
++/*
++ Data Type 0 = int display
++ Data Type 1 = hex display
++ Data Type 2 = channel structure, int display
++ Data Type 3 = queue index and int display
++ Data Type 4 = queue index and hex display
++*/
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
++static STATS_TABLE StatsTable0[] =
++ {
++#ifdef _CPHAL_AAL5
++ /* Name , Data Ptr, Data Type */
++ {"Crc Errors", 0, 0},
++ {"Len Errors", 0, 0},
++ {"Abort Errors", 0, 0},
++ {"Starv Errors", 0, 0}
++#endif
++#ifdef _CPHAL_CPMAC
++ {"Rx Good Frames", 0, 0}
++#endif
++ };
++
++static STATS_TABLE StatsTable1[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"DmaLenErrors", 0, 0},
++ {"TxMisQCnt", 0, 3},
++ {"RxMisQCnt", 0, 0},
++ {"TxEOQCnt", 0, 3},
++ {"RxEOQCnt", 0, 0},
++ {"RxPacketsServiced", 0, 0},
++ {"TxPacketsServiced", 0, 3},
++ {"RxMaxServiced", 0, 0},
++ {"TxMaxServiced", 0, 3},
++ {"RxTotal", 0, 0},
++ {"TxTotal", 0, 0},
++ };
++
++static STATS_TABLE StatsTable2[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RcbPool", 0, 1},
++ {"RxActQueueCount", 0, 0},
++ {"RxActQueueHead", 0, 1},
++ {"RxActQueueTail", 0, 1},
++ {"RxActive", 0, 0},
++ {"RcbStart", 0, 1},
++ {"RxTeardownPending", 0, 0},
++ {"TcbPool", 0, 4},
++ {"TxActQueueCount", 0, 3},
++ {"TxActQueueHead", 0, 4},
++ {"TxActQueueTail", 0, 4},
++ {"TxActive", 0, 3},
++ {"TcbStart", 0, 4},
++ {"TxTeardownPending", 0, 0}
++ };
++
++static STATS_TABLE StatsTable3[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RxBufSize", 0, 2},
++ {"RxBufferOffset", 0, 2},
++ {"RxNumBuffers", 0, 2},
++ {"RxServiceMax", 0, 2},
++ {"TxNumBuffers", 0, 2},
++ {"TxNumQueues", 0, 2},
++ {"TxServiceMax", 0, 2},
++#ifdef _CPHAL_AAL5
++ {"CpcsUU", 0, 2},
++ {"Gfc", 0, 2},
++ {"Clp", 0, 2},
++ {"Pti", 0, 2},
++ {"DaMask", 0, 2},
++ {"Priority", 0, 2},
++ {"PktType", 0, 2},
++ {"Vci", 0, 2},
++ {"Vpi", 0, 2},
++ {"CellRate", 0, 2},
++ {"QosType", 0, 2},
++ {"Mbs", 0, 2},
++ {"Pcr", 0, 2}
++#endif
++ };
++
++static STATS_TABLE StatsTable4[] =
++ {
++ {"Base Address", 0, 1},
++ {"Offset (VLYNQ)", 0, 0},
++ {"Interrupt Line", 0, 0},
++ {"Debug", 0, 0},
++ {"Instance", 0, 0},
++#ifdef _CPHAL_AAL5
++ {"UniNni", 0, 0}
++#endif
++ };
++
++static STATS_DB StatsDb[] =
++ {
++ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
++ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
++ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
++ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
++ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
++ };
++#endif /* +GSG 030307 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void resetWait(HAL_DEVICE *HalDev)
++ { /*+RC3.02*/
++ const int TickReset=64;
++ osfuncSleep((int*)&TickReset);
++ } /*+RC3.02*/
++#endif /* +RC 3.02 */
++
++/* I only define the reset base function for the modules
++ that can perform a reset. The AAL5 and AAL2 modules
++ do not perform a reset, that is done by the shared module
++ CPSAR */
++#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
++/*
++ * Determines the reset register address to be used for a particular device.
++ * It will search the current device entry for Locator information. If the
++ * device is a root device, there will be no Locator information, and the
++ * function will find and return the root reset register. If a Locator value
++ * is found, the function will search each VLYNQ device entry in the system
++ * looking for a matching Locator. Once it finds a VLYNQ device entry with
++ * a matching Locator, it will extract the "ResetBase" parameter from that
++ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param ResetBase Pointer to integer address of reset register.
++ *
++ * @return 0 OK, Non-zero not OK
++ */
++static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
++ {
++ char *DeviceInfo = HalDev->DeviceInfo;
++ char *MyLocator, *NextLocator;
++ int Inst=1;
++ bit32u error_code;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
++ if (error_code)
++ {
++ /* if no Locator value, device is on the root, so get the "reset" device */
++ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
++ if (error_code)
++ {
++ return(EC_VAL_DEVICE_NOT_FOUND);
++ }
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ /* we have a Locator value, so the device is remote */
++
++ /* Find a vlynq device with a matching locator value */
++ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
++ if (error_code)
++ {
++ /* no Locator value for this VLYNQ, so move on */
++ continue;
++ }
++ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
++ {
++ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ Inst++;
++ } /* while */
++ } /* else */
++
++ return (EC_NO_ERRORS);
++ }
++#endif
++
++#ifndef _CPHAL_AAL2 /* + RC 3.02 */
++static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
++ {
++ bit32u ParmValue;
++ bit32 error_code;
++ char *DeviceInfo = HalDev->DeviceInfo;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
++
++#ifndef _CPHAL_AAL5
++#ifndef _CPHAL_AAL2
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
++ if(error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
++ }
++ HalDev->ResetBit = ParmValue;
++
++ /* Get reset base address */
++ error_code = ResetBaseGet(HalDev, &ParmValue);
++ if (error_code)
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
++ HalDev->ResetBase = ParmValue;
++#endif
++#endif
++
++#ifndef _CPHAL_CPSAR
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
++ }
++ HalDev->interrupt = ParmValue;
++#endif
++
++ /* only look for the offset if there is a Locator field, which indicates that
++ the module is a VLYNQ module */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
++ if (!error_code)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
++ }
++ HalDev->offset = ParmValue;
++ }
++ else
++ HalDev->offset = 0;
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
++ if (!error_code) HalDev->debug = ParmValue;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
++ {
++ /* even though these statistics may be for multiple channels and
++ queues, i need only configure the pointer to the beginning
++ of the array, and I can index from there if necessary */
++
++#ifdef _CPHAL_AAL5
++ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
++ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
++ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
++ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
++
++ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
++ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
++ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
++ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
++ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
++ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
++ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
++ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
++ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
++ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
++ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
++#endif
++
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
++ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
++ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
++ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
++ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
++ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
++ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
++ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
++ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
++ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
++ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
++ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
++ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
++ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
++ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
++
++ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
++ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
++ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
++ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
++ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
++ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
++ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
++#ifdef _CPHAL_AAL5
++ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
++ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
++ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
++ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
++ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
++ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
++ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
++ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
++ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
++ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
++ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
++ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
++ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
++#endif
++#endif
++
++ StatsTable4[0].StatPtr = &HalDev->dev_base;
++ StatsTable4[1].StatPtr = &HalDev->offset;
++ StatsTable4[2].StatPtr = &HalDev->interrupt;
++ StatsTable4[3].StatPtr = &HalDev->debug;
++ StatsTable4[4].StatPtr = &HalDev->Inst;
++ }
++#endif /* +RC 3.02 */
++
++#ifndef _CPHAL_CPSAR /* +RC 3.02 */
++#ifndef _CPHAL_AAL2 /* +RC 3.02 */
++/*
++ * Returns statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0
++ */
++static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
++ {
++ int Size;
++ bit32u *AddrPtr;
++ char *DataPtr;
++ STATS_TABLE *StatsTable;
++ int i, NumberOfStats;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
++ (bit32u)HalDev, (bit32u)StatPtr);
++ osfuncSioFlush();
++ }
++#endif
++
++ StatsTable = StatsDb[Index].StatTable;
++ NumberOfStats = StatsDb[Index].NumberOfStats;
++
++ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
++ Size += (NumberOfStats*11);
++ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
++
++ AddrPtr = (bit32u *) *StatPtr;
++ DataPtr = (char *)AddrPtr;
++ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
++
++ for (i=0; i<NumberOfStats; i++)
++ {
++ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
++ *AddrPtr++ = (bit32u)DataPtr;
++ if (&StatsTable[i].StatPtr[Ch] != 0)
++ {
++ switch(StatsTable[i].DataType)
++ {
++ case 0:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 1:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 2:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
++ break;
++ case 3:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ case 4:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ default:
++ /* invalid data type, due to CPHAL programming error */
++ break;
++ }
++ }
++ else
++ {
++ /* invalid statistics pointer, probably was not initialized */
++ }
++ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
++ }
++
++ *AddrPtr = (bit32u) 0;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC
++static void gpioFunctional(int base, int bit)
++ { /*+RC3.02*/
++ bit32u GpioEnr = base + 0xC;
++ /* To make functional, set to zero */
++ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
++ } /*+RC3.02*/
++
++
++/*+RC3.02*/
++/* Common function, Checks to see if GPIO should be in functional mode */
++static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
++ { /*+RC3.02*/
++ int rc;
++ void *DeviceInfo;
++ char *pszMuxBits;
++ char pszMuxBit[20];
++ char *pszTmp;
++ char szMuxBit[20];
++ char *ptr;
++ int base;
++ int reset_bit;
++ int bit;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
++ if(rc) return;
++ /* gpio entry found, get GPIO register info and make functional */
++
++ /* temp copy until FinParmValue fixed */
++ ptr = &szMuxBit[0];
++ while ((*ptr++ = *pszTmp++));
++
++ pszMuxBits = &szMuxBit[0];
++
++ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
++ if(rc) return;
++
++ /* If GPIO still in reset, then exit */
++ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
++ return;
++ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
++ while (*pszMuxBits)
++ {
++ pszTmp = &pszMuxBit[0];
++ if(*pszMuxBits == ';') pszMuxBits++;
++ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
++ {
++ osfuncSioFlush();
++ /*If value not a number, skip */
++ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
++ pszMuxBits++;
++ else
++ *pszTmp++ = *pszMuxBits++;
++ }
++ *pszTmp = '\0';
++ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
++ gpioFunctional(base, bit);
++ resetWait(HalDev); /* not sure if this is needed */
++ }
++ } /*+RC3.02*/
++#endif /* CPMAC */
++
++#ifdef _CPHAL_AAL5
++const char hcSarFrequency[] = "SarFreq";
++#endif
++
++#endif /* _INC */
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/cpcommon_cpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpcommon_cpmac.h 2005-07-10 03:22:40.508160000 +0200
+@@ -0,0 +1,79 @@
++#ifndef _INC_CPCOMMON_H
++#define _INC_CPCOMMON_H
++
++#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
++#ifndef dbgPrintf
++#define dbgPrintf HalDev->OsFunc->Printf
++#endif
++
++#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
++
++#define DBG(level) (HalDev->debug & (1<<(level)))
++/*
++#define DBG0() DBG(0)
++#define DBG1() DBG(1)
++#define DBG2() DBG(2)
++#define DBG3() DBG(3)
++#define DBG4() DBG(4)
++#define DBG5() DBG(5)
++#define DBG6() DBG(6)
++#define DBG7() DBG(7)
++*/
++
++/*
++ * List of defined actions for use with Control().
++ */
++typedef enum
++ {
++ enGET=0, /**< Get the value associated with a key */
++ enSET, /**< Set the value associates with a key */
++ enCLEAR, /**<Clear the value */
++ enNULL /**< No data action, used to initiate a service or send a message */
++ }ACTION;
++
++/*
++ * Enumerated hardware states.
++ */
++typedef enum
++ {
++ enConnected=1, enDevFound, enInitialized, enOpened
++ }DEVICE_STATE;
++
++typedef enum
++ {
++ enCommonStart=0,
++ /* General */
++ enOff, enOn, enDebug,
++ /* Module General */
++ enCpuFreq,
++ enStatus,
++ enCommonEnd
++ }COMMON_KEY;
++
++typedef struct
++ {
++ const char *strKey;
++ int enKey;
++ }CONTROL_KEY;
++
++typedef struct
++ {
++ char *StatName;
++ unsigned int *StatPtr;
++ int DataType; /* 0: int, 1: hex int, 2:channel data */
++ }STATS_TABLE;
++
++typedef struct
++ {
++ int NumberOfStats;
++ STATS_TABLE *StatTable;
++ }STATS_DB;
++
++#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
++#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
++#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
++
++#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
++
++#endif
++
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpmac.c
+--- linux.old/drivers/net/avalanche_cpmac/cpmac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmac.c 2005-07-10 07:39:15.514764184 +0200
+@@ -0,0 +1,2509 @@
++/******************************************************************************
++ * FILE PURPOSE: CPMAC Linux Network Device Driver Source
++ ******************************************************************************
++ * FILE NAME: cpmac.c
++ *
++ * DESCRIPTION: CPMAC Network Device Driver Source
++ *
++ * REVISION HISTORY:
++ *
++ * Date Description Author
++ *-----------------------------------------------------------------------------
++ * 27 Nov 2002 Initial Creation Suraj S Iyer
++ * 09 Jun 2003 Updates for GA Suraj S Iyer
++ * 30 Sep 2003 Updates for LED, Reset stats Suraj S Iyer
++ *
++ * (C) Copyright 2003, Texas Instruments, Inc
++ *******************************************************************************/
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/proc_fs.h>
++#include <linux/ioport.h>
++#include <asm/io.h>
++
++#include <linux/skbuff.h>
++
++#include <asm/mips-boards/prom.h>
++#include <linux/string.h>
++#include <asm/uaccess.h>
++#include <linux/config.h>
++#include <asm/ar7/if_port.h>
++
++extern void build_psp_config(void);
++extern void psp_config_cleanup(void);
++
++#include "cpmacHalLx.h"
++#include "cpmac.h"
++
++static struct net_device *last_cpmac_device = NULL;
++static int cpmac_devices_installed = 0;
++
++void xdump( u_char* cp, int length, char* prefix );
++
++unsigned int cpmac_cpu_freq = 0;
++
++char cpmac_version[] = "1.5";
++
++char l3_align_array[] = {0x02, 0x01, 0x00, 0x03};
++#define L3_ALIGN(i) l3_align_array[i]
++
++char add_for_4byte_align[] = {0x04, 0x03, 0x02, 0x05};
++#define ADD_FOR_4BYTE_ALIGN(i) add_for_4byte_align[i]
++
++
++#define TPID 0x8100
++#define IS_802_1Q_FRAME(byte_ptr) (*(unsigned short*)byte_ptr == TPID)
++#define TPID_START_OFFSET 12
++#define TCI_START_OFFSET 14
++#define TCI_LENGTH 2
++#define TPID_LENGTH 2
++#define TPID_END_OFFSET (TPID_START_OFFSET + TPID_LENGTH)
++#define TCI_END_OFFSET (TCI_START_OFFSET + TCI_LENGTH)
++#define IS_VALID_VLAN_ID(byte_ptr) ((*(unsigned short*)byte_ptr) && 0xfff != 0)
++#define MAX_CLASSES 8
++#define MAX_USER_PRIORITY 8
++#define CONTROL_802_1Q_SIZE (TCI_LENGTH + TPID_LENGTH)
++
++unsigned char user_priority_to_traffic_class_map[MAX_CLASSES][MAX_USER_PRIORITY] =
++{
++ {0, 0, 0, 1, 1, 1, 1, 2},
++ {0, 0, 0, 0, 0, 0, 0, 0},
++ {0, 0, 0, 0, 0, 0, 0, 1},
++ {0, 0, 0, 1, 1, 2, 2, 3},
++ {0, 1, 1, 2, 2, 3, 3, 4},
++ {0, 1, 1, 2, 3, 4, 4, 5},
++ {0, 1, 2, 3, 4, 5, 5, 6},
++ {0, 1, 2, 3, 4, 5, 6, 7}
++};
++
++#define GET_802_1P_CHAN(x,y) user_priority_to_traffic_class_map[x][(y & 0xe0)]
++
++#if defined(CONFIG_MIPS_SEAD2)
++unsigned long temp_base_address[2] = {0xa8610000, 0xa8612800};
++unsigned long temp_reset_value[2] = { 1<< 17,1<<21};
++#define RESET_REG_PRCR (*(volatile unsigned int *)((0xa8611600 + 0x0)))
++#define VERSION(base) (*(volatile unsigned int *)(((base)|0xa0000000) + 0x0))
++#endif
++
++MODULE_AUTHOR("Maintainer: Suraj S Iyer <ssiyer@ti.com>");
++MODULE_DESCRIPTION("Driver for TI CPMAC");
++
++static int cfg_link_speed = 0;
++MODULE_PARM(cfg_link_speed, "i");
++MODULE_PARM_DESC(cfg_link_speed, "Fixed speed of the Link: <100/10>");
++
++static char *cfg_link_mode = NULL;
++MODULE_PARM(cfg_link_mode, "1-3s");
++MODULE_PARM_DESC(cfg_link_mode, "Fixed mode of the Link: <fd/hd>");
++
++int cpmac_debug_mode = 0;
++MODULE_PARM(debug_mode, "i");
++MODULE_PARM_DESC(debug_mode, "Turn on the debug info: <0/1>. Default is 0 (off)");
++
++#define dbgPrint if (cpmac_debug_mode) printk
++#define errPrint printk
++
++static int g_cfg_start_link_params = CFG_START_LINK_SPEED;
++static int g_init_enable_flag = 0;
++static int cfg_start_link_speed;
++static int cpmac_max_frame_size;
++
++static struct net_device *g_dev_array[2];
++static struct proc_dir_entry *gp_stats_file = NULL;
++
++//-----------------------------------------------------------------------------
++// Statistics related private functions.
++//-----------------------------------------------------------------------------
++static int cpmac_p_update_statistics(struct net_device *p_dev, char *buf, int limit, int *len);
++static int cpmac_p_read_rfc2665_stats(char *buf, char **start, off_t offset, int count, int *eof, void *data);
++static int cpmac_p_read_link(char *buf, char **start, off_t offset, int count, int *eof, void *data);
++static int cpmac_p_read_stats(char* buf, char **start, off_t offset, int count, int *eof, void *data);
++static int cpmac_p_write_stats (struct file *fp, const char * buf, unsigned long count, void * data);
++static int cpmac_p_reset_statistics (struct net_device *p_dev);
++static int cpmac_p_get_version(char *buf, char **start, off_t offset, int count, int *eof, void *data);
++
++static int cpmac_p_detect_manual_cfg(int, char*, int);
++static int cpmac_p_process_status_ind(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
++
++//-----------------------------------------------------------------------------
++// Timer related private functions.
++//-----------------------------------------------------------------------------
++static int cpmac_p_timer_init(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
++// static int cpmac_timer_cleanup(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
++static void cpmac_p_tick_timer_expiry(unsigned long p_cb_param);
++inline static int cpmac_p_start_timer(struct timer_list *p_timer, unsigned int delay_ticks);
++static int cpmac_p_stop_timer(struct timer_list *p_timer);
++
++//------------------------------------------------------------------------------
++// Device configuration and setup related private functions.
++//------------------------------------------------------------------------------
++static int cpmac_p_probe_and_setup_device(CPMAC_PRIVATE_INFO_T *p_cpmac_priv, unsigned long *p_dev_flags);
++static int cpmac_p_setup_driver_params(CPMAC_PRIVATE_INFO_T *p_cpmac_priv);
++inline static int cpmac_p_rx_buf_setup(CPMAC_RX_CHAN_INFO_T *p_rx_chan);
++
++//-----------------------------------------------------------------------------
++// Net device related private functions.
++//-----------------------------------------------------------------------------
++static int cpmac_dev_init(struct net_device *p_dev);
++static int cpmac_dev_open( struct net_device *dev );
++static int cpmac_dev_close(struct net_device *p_dev);
++static void cpmac_dev_mcast_set(struct net_device *p_dev);
++static int cpmac_dev_set_mac_addr(struct net_device *p_dev,void * addr);
++static int cpmac_dev_tx( struct sk_buff *skb, struct net_device *p_dev);
++static struct net_device_stats *cpmac_dev_get_net_stats (struct net_device *dev);
++
++static int cpmac_p_dev_enable( struct net_device *p_dev);
++
++
++
++/* Max. Reserved headroom in front of each packet so that the headers can be added to
++ * a packet. Worst case scenario would be PPPoE + 2684 LLC Encapsulation + Ethernet
++ * header. */
++#define MAX_RESERVED_HEADROOM 20
++
++/* This is the MAX size of the static buffer for pure data. */
++#define MAX_SIZE_STATIC_BUFFER 1600
++
++typedef struct DRIVER_BUFFER
++{
++ /* Pointer to the allocated data buffer. This is the static data buffer
++ * allocated for the TI-Cache. 60 bytes out of the below buffer are required
++ * by the SKB shared info. We always reserve at least MAX_RESERVED_HEADROOM bytes
++ * so that the packets always have sufficient headroom. */
++ char ptr_buffer[MAX_SIZE_STATIC_BUFFER + MAX_RESERVED_HEADROOM + 60];
++
++ /* List of the driver buffers. */
++ struct DRIVER_BUFFER* ptr_next;
++}DRIVER_BUFFER;
++
++typedef struct DRIVER_BUFFER_MCB
++{
++ /* List of the driver buffers. */
++ DRIVER_BUFFER* ptr_available_driver_buffers;
++
++ /* The number of available buffers. */
++ int num_available_buffers;
++}DRIVER_BUFFER_MCB;
++
++DRIVER_BUFFER_MCB driver_mcb;
++int hybrid_mode = 0;
++
++static union {
++ struct sk_buff_head list;
++ char pad[SMP_CACHE_BYTES];
++} skb_head_pool[NR_CPUS];
++
++/**************************************************************************
++ * FUNCTION NAME : ti_release_skb
++ **************************************************************************
++ * DESCRIPTION :
++ * This function is called from the ti_alloc_skb when there were no more
++ * data buffers available. The allocated SKB had to released back to the
++ * data pool. The reason why this function was moved from the fast path
++ * below was because '__skb_queue_head' is an inline function which adds
++ * a large code chunk on the fast path.
++ *
++ * NOTES :
++ * This function is called with interrupts disabled.
++ **************************************************************************/
++static void ti_release_skb (struct sk_buff_head* list, struct sk_buff* skb)
++{
++ __skb_queue_head(list, skb);
++ return;
++}
++
++/**************************************************************************
++ * FUNCTION NAME : ti_alloc_skb
++ **************************************************************************
++ * DESCRIPTION :
++ * The function is called to allocate memory from the static allocated
++ * TI-Cached memory pool.
++ *
++ * RETURNS :
++ * Allocated static memory buffer - Success
++ * NULL - Error.
++ **************************************************************************/
++struct sk_buff *ti_alloc_skb(unsigned int size,int gfp_mask)
++{
++ register struct sk_buff* skb;
++ unsigned long flags;
++ struct sk_buff_head* list;
++ DRIVER_BUFFER* ptr_node = NULL;
++
++ /* Critical Section Begin: Lock out interrupts. */
++ local_irq_save(flags);
++
++ /* Get the SKB Pool list associated with the processor and dequeue the head. */
++ list = &skb_head_pool[smp_processor_id()].list;
++ skb = __skb_dequeue(list);
++
++ /* Align the data size. */
++ size = SKB_DATA_ALIGN(size);
++
++ /* Did we get one. */
++ if (skb != NULL)
++ {
++ /* YES. Now get a data block from the head of statically allocated block. */
++ ptr_node = driver_mcb.ptr_available_driver_buffers;
++ if (ptr_node != NULL)
++ {
++ /* YES. Got a data block. Advance the free list pointer to the next available buffer. */
++ driver_mcb.ptr_available_driver_buffers = ptr_node->ptr_next;
++ ptr_node->ptr_next = NULL;
++
++ /* Decrement the number of available data buffers. */
++ driver_mcb.num_available_buffers = driver_mcb.num_available_buffers - 1;
++ }
++ else
++ {
++ /* NO. Was unable to get a data block. So put the SKB back on the free list.
++ * This is slow path. */
++#ifdef DEBUG_SKB
++ printk ("DEBUG: No Buffer memory available: Number of free buffer:%d.\n",
++ driver_mcb.num_available_buffers);
++#endif
++ ti_release_skb (list, skb);
++ }
++ }
++
++ /* Critical Section End: Unlock interrupts. */
++ local_irq_restore(flags);
++
++ /* Did we get an SKB and data buffer. Proceed only if we were succesful in getting both else drop */
++ if (skb != NULL && ptr_node != NULL)
++ {
++ /* XXX: does not include slab overhead */
++ skb->truesize = size + sizeof(struct sk_buff);
++
++ /* Load the data pointers. */
++ skb->head = ptr_node->ptr_buffer;
++ skb->data = ptr_node->ptr_buffer + MAX_RESERVED_HEADROOM;
++ skb->tail = ptr_node->ptr_buffer + MAX_RESERVED_HEADROOM;
++ skb->end = ptr_node->ptr_buffer + size + MAX_RESERVED_HEADROOM;
++
++ /* Set up other state */
++ skb->len = 0;
++ skb->cloned = 0;
++ skb->data_len = 0;
++
++ /* Mark the SKB indicating that the SKB is from the TI cache. */
++ skb->cb[45] = 1;
++
++ atomic_set(&skb->users, 1);
++ atomic_set(&(skb_shinfo(skb)->dataref), 1);
++ skb_shinfo(skb)->nr_frags = 0;
++ skb_shinfo(skb)->frag_list = NULL;
++ return skb;
++ }
++ else
++ {
++ /* Control comes here only when there is no statically allocated data buffers
++ * available. This case is handled using the mode selected
++ *
++ * 1. Hybrid Mode.
++ * In that case lets jump to the old allocation code. This way we
++ * can allocate a small number of data buffers upfront and the rest will hit
++ * this portion of the code, which is slow path. Note the number of hits here
++ * should be kept as low as possible to satisfy performance requirements.
++ *
++ * 2. Pure Static Mode.
++ * Return NULL the user should have tuned the number of static buffers for
++ * worst case scenario. So return NULL and let the drivers handle the error. */
++ if (hybrid_mode == 1)
++ {
++ /* Hybrid Mode: Old allocation. */
++ return dev_alloc_skb(size);
++ }
++ else
++ {
++ /* Pure Static Mode: No buffers available. */
++ return NULL;
++ }
++ }
++}
++
++/**************************************************************************
++ * FUNCTION NAME : ti_skb_release_fragment
++ **************************************************************************
++ * DESCRIPTION :
++ * This function is called to release fragmented packets. This is NOT in
++ * the fast path and this function requires some work.
++ **************************************************************************/
++static void ti_skb_release_fragment(struct sk_buff *skb)
++{
++ if (skb_shinfo(skb)->nr_frags)
++ {
++ /* PANKAJ TODO: This portion has not been tested. */
++ int i;
++#ifdef DEBUG_SKB
++ printk ("DEBUG: Releasing fragments in TI-Cached code.\n");
++#endif
++ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
++ printk ("DEBUG: Fragmented Page = 0x%p.\n", skb_shinfo(skb)->frags[i].page);
++ }
++
++ /* Check if there were any fragments present and if so clean all the SKB's.
++ * This is required to recursivly clean the SKB's. */
++ if (skb_shinfo(skb)->frag_list)
++ skb_drop_fraglist(skb);
++
++ return;
++}
++
++/**************************************************************************
++ * FUNCTION NAME : ti_skb_release_data
++ **************************************************************************
++ * DESCRIPTION :
++ * The function is called to release the SKB back into the TI-Cached static
++ * memory pool.
++ **************************************************************************/
++static void ti_skb_release_data(struct sk_buff *skb)
++{
++ DRIVER_BUFFER* ptr_node;
++ unsigned long flags;
++
++ /* The SKB data can be cleaned only if the packet has not been cloned and we
++ * are the only one holding a reference to the data. */
++ if (!skb->cloned || atomic_dec_and_test(&(skb_shinfo(skb)->dataref)))
++ {
++ /* Are there any fragments associated with the SKB ?*/
++ if ((skb_shinfo(skb)->nr_frags != 0) || (skb_shinfo(skb)->frag_list != NULL))
++ {
++ /* Slow Path: Try and clean up the fragments. */
++ ti_skb_release_fragment (skb);
++ }
++
++ /* Cleanup the SKB data memory. This is fast path. */
++ ptr_node = (DRIVER_BUFFER *)skb->head;
++
++ /* Critical Section: Lock out interrupts. */
++ local_irq_save(flags);
++
++ /* Add the data buffer to the list of available buffers. */
++ ptr_node->ptr_next = driver_mcb.ptr_available_driver_buffers;
++ driver_mcb.ptr_available_driver_buffers = ptr_node;
++
++ /* Increment the number of available data buffers. */
++ driver_mcb.num_available_buffers = driver_mcb.num_available_buffers + 1;
++
++ /* Criticial Section: Unlock interrupts. */
++ local_irq_restore(flags);
++ }
++ return;
++}
++
++
++
++
++static unsigned char str2hexnum(unsigned char c)
++{
++ if(c >= '0' && c <= '9')
++ return c - '0';
++ if(c >= 'a' && c <= 'f')
++ return c - 'a' + 10;
++ if(c >= 'A' && c <= 'F')
++ return c - 'A' + 10;
++ return 0;
++}
++
++static void str2eaddr(unsigned char *ea, unsigned char *str)
++{
++ int i;
++ unsigned char num;
++ for(i = 0; i < 6; i++) {
++ if((*str == '.') || (*str == ':'))
++ str++;
++ num = str2hexnum(*str++) << 4;
++ num |= (str2hexnum(*str++));
++ ea[i] = num;
++ }
++}
++
++//-----------------------------------------------------------------------------
++// Statistics related private functions.
++//-----------------------------------------------------------------------------
++static int cpmac_p_update_statistics(struct net_device *p_dev, char *buf, int limit, int *p_len)
++{
++ int ret_val = -1;
++ unsigned long rx_hal_errors = 0;
++ unsigned long rx_hal_discards = 0;
++ unsigned long tx_hal_errors = 0;
++ unsigned long ifOutDiscards = 0;
++ unsigned long ifInDiscards = 0;
++ unsigned long ifOutErrors = 0;
++ unsigned long ifInErrors = 0;
++
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ CPMAC_DEVICE_MIB_T *p_device_mib = p_cpmac_priv->device_mib;
++ CPMAC_DRV_STATS_T *p_stats = p_cpmac_priv->stats;
++ CPMAC_DEVICE_MIB_T local_mib;
++ CPMAC_DEVICE_MIB_T *p_local_mib = &local_mib;
++
++ struct net_device_stats *p_net_dev_stats = &p_cpmac_priv->net_dev_stats;
++
++ int len = 0;
++ int dev_mib_elem_count = 0;
++
++ /* do not access the hardware if it is in the reset state. */
++ if(!test_bit(0, &p_cpmac_priv->set_to_close))
++ {
++ if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsDump", "Get",
++ p_local_mib) != 0)
++ {
++ errPrint("The stats dump for %s is failing.\n", p_dev->name);
++ return(ret_val);
++ }
++
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsClear", "Set", NULL);
++
++ dev_mib_elem_count = sizeof(CPMAC_DEVICE_MIB_T)/sizeof(unsigned long);
++
++ /* Update the history of the stats. This takes care of any reset of the
++ * device and stats that might have taken place during the life time of
++ * the driver.
++ */
++ while(dev_mib_elem_count--)
++ {
++ *((unsigned long*) p_device_mib + dev_mib_elem_count) +=
++ *((unsigned long*) p_local_mib + dev_mib_elem_count);
++ }
++ }
++
++ /* RFC2665, section 3.2.7, page 9 */
++ rx_hal_errors = p_device_mib->ifInFragments +
++ p_device_mib->ifInCRCErrors +
++ p_device_mib->ifInAlignCodeErrors +
++ p_device_mib->ifInJabberFrames;
++
++ /* RFC2233 */
++ rx_hal_discards = p_device_mib->ifRxDMAOverruns;
++
++ /* RFC2665, section 3.2.7, page 9 */
++ tx_hal_errors = p_device_mib->ifExcessiveCollisionFrames +
++ p_device_mib->ifLateCollisions +
++ p_device_mib->ifCarrierSenseErrors +
++ p_device_mib->ifOutUnderrun;
++
++ /* if not set, the short frames (< 64 bytes) are considered as errors */
++ if(!p_cpmac_priv->flags & IFF_PRIV_SHORT_FRAMES)
++ rx_hal_errors += p_device_mib->ifInUndersizedFrames;
++
++ /* if not set, the long frames ( > 1518) are considered as errors
++ * RFC2665, section 3.2.7, page 9. */
++ if(!p_cpmac_priv->flags & IFF_PRIV_JUMBO_FRAMES)
++ rx_hal_errors += p_device_mib->ifInOversizedFrames;
++
++ /* if not in promiscous, then non addr matching frames are discarded */
++ /* CPMAC 2.0 Manual Section 2.8.1.14 */
++ if(!p_dev->flags & IFF_PROMISC)
++ {
++ ifInDiscards += p_device_mib->ifInFilteredFrames;
++ }
++
++ /* total rx discards = hal discards + driver discards. */
++ ifInDiscards = rx_hal_discards + p_net_dev_stats->rx_dropped;
++ ifInErrors = rx_hal_errors;
++
++ ifOutErrors = tx_hal_errors;
++ ifOutDiscards = p_net_dev_stats->tx_dropped;
++
++ /* Let us update the net device stats struct. To be updated in the later releases.*/
++ p_cpmac_priv->net_dev_stats.rx_errors = ifInErrors;
++ p_cpmac_priv->net_dev_stats.collisions = p_device_mib->ifCollisionFrames;
++
++ if(buf == NULL || limit == 0)
++ {
++ return(0);
++ }
++
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %ld\n", "ifSpeed", (long)p_cpmac_priv->link_speed);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "dot3StatsDuplexStatus", (long)p_cpmac_priv->link_mode);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifAdminStatus", (long)(p_dev->flags & IFF_UP ? 1:2));
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOperStatus", (long)(((p_dev->flags & IFF_UP) && netif_carrier_ok(p_dev)) ? 1:2));
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifLastChange", p_stats->start_tick);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInDiscards", ifInDiscards);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInErrors", ifInErrors);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutDiscards", ifOutDiscards);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutErrors", ifOutErrors);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInGoodFrames", p_device_mib->ifInGoodFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInBroadcasts", p_device_mib->ifInBroadcasts);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInMulticasts", p_device_mib->ifInMulticasts);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInPauseFrames", p_device_mib->ifInPauseFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInCRCErrors", p_device_mib->ifInCRCErrors);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInAlignCodeErrors", p_device_mib->ifInAlignCodeErrors);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInOversizedFrames", p_device_mib->ifInOversizedFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInJabberFrames", p_device_mib->ifInJabberFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInUndersizedFrames", p_device_mib->ifInUndersizedFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInFragments", p_device_mib->ifInFragments);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInFilteredFrames", p_device_mib->ifInFilteredFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInQosFilteredFrames", p_device_mib->ifInQosFilteredFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifInOctets", p_device_mib->ifInOctets);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutGoodFrames", p_device_mib->ifOutGoodFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutBroadcasts", p_device_mib->ifOutBroadcasts);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutMulticasts", p_device_mib->ifOutMulticasts);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutPauseFrames", p_device_mib->ifOutPauseFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifDeferredTransmissions", p_device_mib->ifDeferredTransmissions);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifCollisionFrames", p_device_mib->ifCollisionFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifSingleCollisionFrames", p_device_mib->ifSingleCollisionFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifMultipleCollisionFrames", p_device_mib->ifMultipleCollisionFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifExcessiveCollisionFrames", p_device_mib->ifExcessiveCollisionFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifLateCollisions", p_device_mib->ifLateCollisions);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutUnderrun", p_device_mib->ifOutUnderrun);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifCarrierSenseErrors", p_device_mib->ifCarrierSenseErrors);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifOutOctets", p_device_mib->ifOutOctets);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if64OctetFrames", p_device_mib->if64OctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if65To127POctetFrames", p_device_mib->if65To127OctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if128To255OctetFrames", p_device_mib->if128To255OctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if256To511OctetFrames", p_device_mib->if256To511OctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if512To1023OctetFrames", p_device_mib->if512To1023OctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "if1024ToUpOctetFrames", p_device_mib->if1024ToUPOctetFrames);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifNetOctets", p_device_mib->ifNetOctets);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxSofOverruns", p_device_mib->ifRxSofOverruns);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxMofOverruns", p_device_mib->ifRxMofOverruns);
++ if(len <= limit)
++ len+= sprintf(buf + len, "%-35s: %lu\n", "ifRxDMAOverruns", p_device_mib->ifRxDMAOverruns);
++
++ *p_len = len;
++
++ return(0);
++}
++
++
++static int cpmac_p_read_rfc2665_stats(char* buf, char **start, off_t offset,
++ int count, int *eof, void *data)
++{
++ int limit = count - 80;
++ int len = 0;
++ struct net_device *p_dev = (struct net_device*)data;
++
++ cpmac_p_update_statistics(p_dev, buf, limit, &len);
++
++ *eof = 1;
++
++ return len;
++}
++
++static int cpmac_p_read_link(char *buf, char **start, off_t offset, int count,
++ int *eof, void *data)
++{
++ int len = 0;
++
++ struct net_device *p_dev;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
++ struct net_device *cpmac_dev_list[cpmac_devices_installed];
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal;
++
++ int i;
++ int phy; /* what phy are we using? */
++
++ len += sprintf(buf+len, "CPMAC devices = %d\n",cpmac_devices_installed);
++
++ p_dev = last_cpmac_device;
++
++ /* Reverse the the device link list to list eth0,eth1...in correct order */
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ cpmac_dev_list[cpmac_devices_installed -(i+1)] = p_dev;
++ p_cpmac_priv = p_dev->priv;
++ p_dev = p_cpmac_priv->next_device;
++ }
++
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ p_dev = cpmac_dev_list[i];
++ p_cpmac_priv = p_dev->priv;
++ p_drv_hal = p_cpmac_priv->drv_hal;
++
++ /* This prints them out from high to low because of how the devices are linked */
++ if(netif_carrier_ok(p_dev))
++ {
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "PhyNum", "Get", &phy);
++
++
++ len += sprintf(buf+len,"eth%d: Link State: %s Phy:0x%x, Speed = %s, Duplex = %s\n",
++ p_cpmac_priv->instance_num, "UP", phy,
++ (p_cpmac_priv->link_speed == 100000000) ? "100":"10",
++ (p_cpmac_priv->link_mode == 2) ? "Half":"Full");
++
++ }
++ else
++ len += sprintf(buf+len,"eth%d: Link State: DOWN\n",p_cpmac_priv->instance_num);
++
++ p_dev = p_cpmac_priv->next_device;
++ }
++
++ return len;
++
++}
++
++static int cpmac_p_read_stats(char* buf, char **start, off_t offset, int count,
++ int *eof, void *data)
++{
++ struct net_device *p_dev = last_cpmac_device;
++ int len = 0;
++ int limit = count - 80;
++ int i;
++ struct net_device *cpmac_dev_list[cpmac_devices_installed];
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
++ CPMAC_DEVICE_MIB_T *p_device_mib;
++
++ /* Reverse the the device link list to list eth0,eth1...in correct order */
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ cpmac_dev_list[cpmac_devices_installed - (i+1)] = p_dev;
++ p_cpmac_priv = p_dev->priv;
++ p_dev = p_cpmac_priv->next_device;
++ }
++
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ p_dev = cpmac_dev_list[i];
++
++ if(!p_dev)
++ goto proc_error;
++
++ /* Get Stats */
++ cpmac_p_update_statistics(p_dev, NULL, 0, NULL);
++
++ p_cpmac_priv = p_dev->priv;
++ p_device_mib = p_cpmac_priv->device_mib;
++
++ /* Transmit stats */
++ if(len<=limit)
++ len+= sprintf(buf+len, "\nCpmac %d, Address %lx\n",i+1, p_dev->base_addr);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Transmit Stats\n");
++ if(len<=limit)
++ len+= sprintf(buf+len, " Tx Valid Bytes Sent :%lu\n",p_device_mib->ifOutOctets);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Tx Frames (Hardware) :%lu\n",p_device_mib->ifOutGoodFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Tx Frames (Software) :%lu\n",p_cpmac_priv->net_dev_stats.tx_packets);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Tx Broadcast Frames :%lu\n",p_device_mib->ifOutBroadcasts);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Tx Multicast Frames :%lu\n",p_device_mib->ifOutMulticasts);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Pause Frames Sent :%lu\n",p_device_mib->ifOutPauseFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Collisions :%lu\n",p_device_mib->ifCollisionFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Tx Error Frames :%lu\n",p_cpmac_priv->net_dev_stats.tx_errors);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Carrier Sense Errors :%lu\n",p_device_mib->ifCarrierSenseErrors);
++ if(len<=limit)
++ len+= sprintf(buf+len, "\n");
++
++
++ /* Receive Stats */
++ if(len<=limit)
++ len+= sprintf(buf+len, "\nCpmac %d, Address %lx\n",i+1,p_dev->base_addr);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Receive Stats\n");
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Valid Bytes Received :%lu\n",p_device_mib->ifInOctets);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Rx Frames (Hardware) :%lu\n",p_device_mib->ifInGoodFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Rx Frames (Software) :%lu\n",p_cpmac_priv->net_dev_stats.rx_packets);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Rx Broadcast Frames :%lu\n",p_device_mib->ifInBroadcasts);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Good Rx Multicast Frames :%lu\n",p_device_mib->ifInMulticasts);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Pause Frames Received :%lu\n",p_device_mib->ifInPauseFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx CRC Errors :%lu\n",p_device_mib->ifInCRCErrors);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Align/Code Errors :%lu\n",p_device_mib->ifInAlignCodeErrors);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Jabbers :%lu\n",p_device_mib->ifInOversizedFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Filtered Frames :%lu\n",p_device_mib->ifInFilteredFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Fragments :%lu\n",p_device_mib->ifInFragments);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Undersized Frames :%lu\n",p_device_mib->ifInUndersizedFrames);
++ if(len<=limit)
++ len+= sprintf(buf+len, " Rx Overruns :%lu\n",p_device_mib->ifRxDMAOverruns);
++ }
++
++
++ return len;
++
++ proc_error:
++ *eof=1;
++ return len;
++}
++
++static int cpmac_p_write_stats (struct file *fp, const char * buf, unsigned long count, void * data)
++{
++ char local_buf[31];
++ int ret_val = 0;
++
++ if(count > 30)
++ {
++ printk("Error : Buffer Overflow\n");
++ printk("Use \"echo 0 > cpmac_stat\" to reset the statistics\n");
++ return -EFAULT;
++ }
++
++ copy_from_user(local_buf,buf,count);
++ local_buf[count-1]='\0'; /* Ignoring last \n char */
++ ret_val = count;
++
++ if(strcmp("0",local_buf)==0)
++ {
++ struct net_device *p_dev = last_cpmac_device;
++ int i;
++ struct net_device *cpmac_dev_list[cpmac_devices_installed];
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
++
++ /* Valid command */
++ printk("Resetting statistics for CPMAC interface.\n");
++
++ /* Reverse the the device link list to list eth0,eth1...in correct order */
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ cpmac_dev_list[cpmac_devices_installed - (i+1)] = p_dev;
++ p_cpmac_priv = p_dev->priv;
++ p_dev = p_cpmac_priv->next_device;
++ }
++
++ for(i=0; i< cpmac_devices_installed; i++)
++ {
++ p_dev = cpmac_dev_list[i];
++ if(!p_dev)
++ {
++ ret_val = -EFAULT;
++ break;
++ }
++
++ cpmac_p_reset_statistics(p_dev);
++ }
++ }
++ else
++ {
++ printk("Error: Unknown operation on cpmac statistics\n");
++ printk("Use \"echo 0 > cpmac_stats\" to reset the statistics\n");
++ return -EFAULT;
++ }
++
++ return ret_val;
++}
++
++static int cpmac_p_reset_statistics(struct net_device *p_dev)
++{
++ int ret_val = 0;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++
++ memset(p_cpmac_priv->device_mib, 0, sizeof(CPMAC_DEVICE_MIB_T));
++ memset(p_cpmac_priv->stats, 0, sizeof(CPMAC_DRV_STATS_T));
++ memset(&p_cpmac_priv->net_dev_stats, 0, sizeof(struct net_device_stats));
++
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "StatsClear", "Set", NULL);
++
++ return(ret_val);
++}
++
++static int cpmac_p_get_version(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ int limit = count - 80;
++ char *hal_version = NULL;
++ struct net_device *p_dev = last_cpmac_device;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "Version", "Get", &hal_version);
++
++ len += sprintf(buf+len, "Texas Instruments CPMAC driver version: %s\n", cpmac_version);
++
++ if(len <= limit && hal_version)
++ len += sprintf(buf+len, "Texas Instruments CPMAC HAL version: %s\n", hal_version);
++
++ return len;
++}
++
++static struct net_device_stats *cpmac_dev_get_net_stats (struct net_device *p_dev)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = (CPMAC_PRIVATE_INFO_T *) p_dev->priv;
++
++ cpmac_p_update_statistics(p_dev, NULL, 0, NULL);
++
++ return &p_cpmac_priv->net_dev_stats;
++}
++
++static int cpmac_p_detect_manual_cfg(int link_speed, char* link_mode, int debug)
++{
++ char *pSpeed = NULL;
++
++ if(debug == 1)
++ {
++ cpmac_debug_mode = 1;
++ dbgPrint("Enabled the debug print.\n");
++ }
++
++ if(!link_speed && !link_mode)
++ {
++ dbgPrint("No manual link params, defaulting to auto negotiation.\n");
++ return (0);
++ }
++
++ if(!link_speed || (link_speed != 10 && link_speed != 100))
++ {
++ dbgPrint("Invalid or No value of link speed specified, defaulting to auto speed.\n");
++ pSpeed = "auto";
++ }
++ else if(link_speed == 10)
++ {
++ g_cfg_start_link_params &= ~(_CPMDIO_100);
++ pSpeed = "10 Mbps";
++ }
++ else
++ {
++ g_cfg_start_link_params &= ~(_CPMDIO_10);
++ pSpeed = "100 Mbps";
++ }
++
++ if(!link_mode || (!strcmp(link_mode, "fd") && !strcmp(link_mode, "hd")))
++ {
++ dbgPrint("Invalid or No value of link mode specified, defaulting to auto mode.\n");
++ }
++ else if(!strcmp(link_mode, "hd"))
++ {
++ g_cfg_start_link_params &= ~(_CPMDIO_FD);
++ }
++ else
++ {
++ g_cfg_start_link_params &= ~(_CPMDIO_HD);
++ }
++
++ dbgPrint("Link is manually set to the speed of %s speed and %s mode.\n",
++ pSpeed, link_mode ? link_mode : "auto");
++
++ return(0);
++}
++
++//------------------------------------------------------------------------------
++// Call back from the HAL.
++//------------------------------------------------------------------------------
++static int cpmac_p_process_status_ind(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
++{
++ struct net_device *p_dev = p_cpmac_priv->owner;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ int status;
++
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "Status", "Get", &status);
++
++ /* We do not reflect the real link status if in loopback.
++ * After all, we want the packets to reach the hardware so
++ * that Send() should work. */
++ if(p_dev->flags & IFF_LOOPBACK)
++ {
++ dbgPrint("Maintaining the link up loopback for %s.\n", p_dev->name);
++ netif_carrier_on(p_dev);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
++#endif
++
++ return(0);
++ }
++
++ if(status & CPMAC_STATUS_ADAPTER_CHECK) /* ???? */
++ {
++ ; /* what to do ? */
++ }
++ else if(status)
++ {
++ if(!netif_carrier_ok(p_dev))
++ {
++ netif_carrier_on(p_cpmac_priv->owner);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
++#endif
++ dbgPrint("Found the Link for the CPMAC instance %s.\n", p_dev->name);
++ }
++
++ if(netif_running(p_dev) & netif_queue_stopped(p_dev))
++ {
++ netif_wake_queue(p_dev);
++ }
++
++ p_cpmac_priv->link_speed = status & CPMAC_STATUS_LINK_SPEED ? 100000000:10000000;
++ p_cpmac_priv->link_mode = status & CPMAC_STATUS_LINK_DUPLEX? 3:2;
++
++ }
++ else
++ {
++ if(netif_carrier_ok(p_dev))
++ {
++ /* do we need to register synchronization issues with stats here. */
++ p_cpmac_priv->link_speed = 100000000;
++ p_cpmac_priv->link_mode = 1;
++
++ netif_carrier_off(p_dev);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
++#endif
++
++ dbgPrint("Lost the Link for the CPMAC for %s.\n", p_dev->name);
++ }
++
++ if(!netif_queue_stopped(p_dev))
++ {
++ netif_stop_queue(p_dev); /* So that kernel does not keep on xmiting pkts. */
++ }
++ }
++
++ return(0);
++}
++
++//-----------------------------------------------------------------------------
++// Timer related private functions.
++//-----------------------------------------------------------------------------
++static int cpmac_p_timer_init(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
++{
++ struct timer_list *p_timer = p_cpmac_priv->timer;
++
++ init_timer(p_timer);
++
++ p_timer = p_cpmac_priv->timer + TICK_TIMER;
++ p_timer->expires = 0;
++ p_timer->data = (unsigned long)p_cpmac_priv;
++ p_timer->function = cpmac_p_tick_timer_expiry;
++
++ return(0);
++}
++
++#if 0
++static int cpmac_timer_cleanup(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
++{
++ struct timer_list *p_timer;
++
++ p_timer = p_cpmac_priv->timer + TICK_TIMER;
++
++ /* use spin lock to establish synchronization with the dispatch */
++ if(p_timer->function) del_timer_sync(p_timer);
++ p_timer->function = NULL;
++
++ return (0);
++}
++#endif
++
++static int cpmac_p_start_timer(struct timer_list *p_timer, unsigned int delay_ticks)
++{
++ p_timer->expires = jiffies + delay_ticks;
++
++ if(p_timer->function)
++ {
++ add_timer(p_timer);
++ }
++
++ return(0);
++}
++
++static void cpmac_p_tick_timer_expiry(unsigned long p_cb_param)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = (CPMAC_PRIVATE_INFO_T*) p_cb_param;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ struct timer_list *p_timer = p_cpmac_priv->timer + TICK_TIMER;
++
++ if(test_bit(0, &p_cpmac_priv->set_to_close))
++ {
++ return;
++ }
++
++ p_drv_hal->hal_funcs->Tick(p_drv_hal->hal_dev);
++
++ cpmac_p_start_timer(p_timer, p_cpmac_priv->delay_ticks);
++}
++
++static int cpmac_p_stop_timer(struct timer_list *p_timer)
++{
++ /* Ideally we need to a set flag indicating not to start the timer again
++ before del_timer_sync() is called up. But here we assume that the
++ caller has set the p_cpmac_priv->set_to_close (ok for now). */
++ del_timer_sync(p_timer);
++
++ return(0);
++}
++
++//------------------------------------------------------------------------------
++// Device configuration and setup related private functions.
++//------------------------------------------------------------------------------
++static int cpmac_p_probe_and_setup_device(CPMAC_PRIVATE_INFO_T *p_cpmac_priv,
++ unsigned long *p_dev_flags)
++{
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ CPMAC_ABILITY_INFO_T *p_capability= p_cpmac_priv->ability_info;
++ unsigned int val = 0;
++ int channel = 0;
++
++ p_cpmac_priv->flags = 0;
++
++ p_capability->promiscous = CFG_PROMISCOUS;
++ p_capability->broadcast = CFG_BROADCAST;
++ p_capability->multicast = CFG_MULTICAST;
++ p_capability->all_multi = CFG_ALL_MULTI;
++ p_capability->jumbo_frames = CFG_JUMBO_FRAMES;
++ p_capability->short_frames = CFG_SHORT_FRAMES;
++ p_capability->auto_negotiation = CFG_AUTO_NEGOTIATION;
++ p_capability->link_speed = cfg_start_link_speed;
++ p_capability->loop_back = CFG_LOOP_BACK;
++ p_capability->tx_flow_control = CFG_TX_FLOW_CNTL;
++ p_capability->rx_flow_control = CFG_RX_FLOW_CNTL;
++ p_capability->tx_pacing = CFG_TX_PACING;
++ p_capability->rx_pass_crc = CFG_RX_PASS_CRC;
++ p_capability->qos_802_1q = CFG_QOS_802_1Q;
++ p_capability->tx_num_chan = CFG_TX_NUM_CHAN;
++
++ /* Lets probe the device for the configured capabilities (netdev specific).*/
++
++ /* Following are set in the set_multi_list, when indicated by the kernel
++ * Promiscous and all multi.
++ */
++
++ if(p_capability->broadcast)
++ {
++ channel = 0;
++ val = 1;
++ if((p_hal_funcs->Control(p_hal_dev, pszRX_BROAD_EN, pszSet, &val) == 0) &&
++ (p_hal_funcs->Control(p_hal_dev, pszRX_BROAD_CH, pszSet, &channel) == 0))
++ *p_dev_flags |= IFF_BROADCAST;
++ else
++ p_capability->broadcast = 0; /* no broadcast capabilities */
++ }
++
++ if(p_capability->multicast)
++ {
++ val = 1;
++ channel = 0;
++ if((p_hal_funcs->Control(p_hal_dev, pszRX_MULT_EN, pszSet, &val) == 0) &&
++ (p_hal_funcs->Control(p_hal_dev, pszRX_MULT_CH, pszSet, &channel) == 0))
++ *p_dev_flags |= IFF_MULTICAST;
++ else
++ {
++ p_capability->multicast = 0;
++ p_capability->all_multi = 0; /* no multicast, no all-multi. */
++ }
++ }
++
++ if(p_capability->loop_back)
++ {
++ ; /* We do not put the device in loopback, if required use ioctl */
++ }
++
++ /* Lets probe the device for the configured capabilities (Non net device specific).*/
++
++ if(p_capability->jumbo_frames)
++ {
++ val = 0;
++ if(p_hal_funcs->Control(p_hal_dev, pszRX_NO_CHAIN, pszSet, &val) == 0)
++ p_cpmac_priv->flags |= IFF_PRIV_JUMBO_FRAMES;
++ else
++ p_capability->jumbo_frames = 0;
++ }
++
++ if(p_capability->short_frames)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev, pszRX_CSF_EN, pszSet, &val) == 0)
++ p_cpmac_priv->flags |= IFF_PRIV_SHORT_FRAMES;
++ else
++ p_capability->short_frames = 0;
++ }
++
++ val = g_cfg_start_link_params;
++
++#ifdef CONFIG_AR7_MDIX
++ if( avalanche_is_mdix_on_chip() )
++ {
++ val |= _CPMDIO_AUTOMDIX;
++ }
++#endif
++
++ if(p_hal_funcs->Control(p_hal_dev,pszMdioConnect,pszSet, &val) !=0)
++ {
++ p_capability->link_speed = 0;
++ }
++ else
++ {
++ if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_HD | _CPMDIO_FD | _CPMDIO_10))
++ p_cpmac_priv->flags |= IFF_PRIV_AUTOSPEED;
++ else if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_HD))
++ p_cpmac_priv->flags |= IFF_PRIV_LINK100_HD;
++ else if(g_cfg_start_link_params & (_CPMDIO_100 | _CPMDIO_FD))
++ p_cpmac_priv->flags |= IFF_PRIV_LINK100_FD;
++ else if(g_cfg_start_link_params & (_CPMDIO_10 | _CPMDIO_HD))
++ p_cpmac_priv->flags |= IFF_PRIV_LINK10_HD;
++ else if(g_cfg_start_link_params & (_CPMDIO_10 | _CPMDIO_FD))
++ p_cpmac_priv->flags |= IFF_PRIV_LINK10_FD;
++ else
++ ;
++ }
++
++ if(p_capability->tx_flow_control)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev,pszTX_FLOW_EN, pszSet, &val) ==0)
++ p_cpmac_priv->flags |= IFF_PRIV_TX_FLOW_CNTL;
++ else
++ p_capability->tx_flow_control = 0;
++ }
++
++ if(p_capability->rx_flow_control)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev, pszRX_FLOW_EN, pszSet, &val) ==0)
++ p_cpmac_priv->flags |= IFF_PRIV_RX_FLOW_CNTL;
++ else
++ p_capability->rx_flow_control = 0;
++ }
++
++ if(p_capability->tx_pacing)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev, pszTX_PACE, pszSet, &val) ==0)
++ p_cpmac_priv->flags |= IFF_PRIV_TX_PACING;
++ else
++ p_capability->tx_pacing = 0;
++ }
++
++ if(p_capability->rx_pass_crc)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev, pszRX_PASS_CRC, pszSet, &val) == 0)
++ p_cpmac_priv->flags |= IFF_PRIV_RX_PASS_CRC;
++ else
++ p_capability->rx_pass_crc = 0;
++ }
++
++ if(p_capability->qos_802_1q)
++ {
++ val = 1;
++ if(p_hal_funcs->Control(p_hal_dev, pszRX_QOS_EN, pszSet, &val) == 0)
++ p_cpmac_priv->flags |= IFF_PRIV_8021Q_EN;
++ else
++ {
++ p_capability->qos_802_1q = 0;
++ p_capability->tx_num_chan= 1;
++ }
++ }
++
++ if(p_capability->tx_num_chan > 1)
++ {
++ int cfg_tx_num_chan = p_capability->tx_num_chan;
++ val = 0;
++#ifdef TEST
++ if(p_hal_funcs->Control(p_hal_dev, pszTX_NUM_CH, pszGet, &val) == 0)
++ cfg_tx_num_chan = cfg_tx_num_chan > val ? val : cfg_tx_num_chan;
++ else
++ cfg_tx_num_chan = 1;
++#endif
++ p_capability->tx_num_chan = cfg_tx_num_chan;
++ }
++
++ return(0);
++}
++
++static int cpmac_p_setup_driver_params(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
++{
++ int i=0;
++ int threshold = CFG_TX_NUM_BUF_SERVICE;
++
++ char *tx_threshold_ptr = prom_getenv("threshold");
++
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info = p_cpmac_priv->tx_chan_info;
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
++ CPMAC_ABILITY_INFO_T *p_capability = p_cpmac_priv->ability_info;
++
++ /* Timer stuff */
++ p_cpmac_priv->timer_count = 1; /* should be < or = the MAX TIMER */
++ p_cpmac_priv->timer_created = 0;
++ p_cpmac_priv->timer_access_hal = 1;
++
++ for(i=0; i < MAX_TIMER; i++)
++ p_cpmac_priv->timer[i].function = NULL;
++
++ p_cpmac_priv->enable_802_1q = p_capability->qos_802_1q;
++
++ /* Tx channel related.*/
++ p_tx_chan_info->cfg_chan = p_capability->tx_num_chan;
++ p_tx_chan_info->opened_chan = 0;
++
++ if(tx_threshold_ptr)
++ threshold = simple_strtol(tx_threshold_ptr, (char **)NULL, 10);
++
++ if((threshold <= 0) && tx_threshold_ptr) /* If threshold set to 0 then Enable the TX interrupt */
++ {
++ threshold = CFG_TX_NUM_BUF_SERVICE;
++ p_tx_chan_info->tx_int_disable = 0;
++
++ }
++ else
++ {
++ p_tx_chan_info->tx_int_disable = CFG_TX_INT_DISABLE;
++ }
++
++ for(i=0; i < MAX_TX_CHAN; i++)
++ {
++
++
++
++ p_tx_chan_info->chan[i].state = CHAN_CLOSE;
++ p_tx_chan_info->chan[i].num_BD = CFG_TX_NUM_BUF_DESC;
++ p_tx_chan_info->chan[i].buffer_size = cpmac_max_frame_size;
++ p_tx_chan_info->chan[i].buffer_offset = CFG_TX_BUF_OFFSET;
++
++
++
++ p_tx_chan_info->chan[i].service_max = threshold;
++ }
++
++ if (p_tx_chan_info->tx_int_disable)
++ printk("Cpmac driver Disable TX complete interrupt setting threshold to %d.\n",threshold);
++ else
++ printk("Cpmac driver Enable TX complete interrupt\n");
++
++
++ /* Assuming just one rx channel for now */
++ p_rx_chan_info->cfg_chan = 1;
++ p_rx_chan_info->opened_chan = 0;
++ p_rx_chan_info->chan->state = CHAN_CLOSE;
++ p_rx_chan_info->chan->num_BD = CFG_RX_NUM_BUF_DESC;
++ p_rx_chan_info->chan->buffer_size = cpmac_max_frame_size;
++ p_rx_chan_info->chan->buffer_offset = CFG_RX_BUF_OFFSET;
++ p_rx_chan_info->chan->service_max = CFG_RX_NUM_BUF_SERVICE;
++
++ /* Set as per RFC 2665 */
++ p_cpmac_priv->link_speed = 100000000;
++ p_cpmac_priv->link_mode = 1;
++
++ p_cpmac_priv->loop_back = 0;
++
++ return(0);
++}
++
++inline static int cpmac_p_rx_buf_setup(CPMAC_RX_CHAN_INFO_T *p_rx_chan)
++{
++ /* Number of ethernet packets & max pkt length */
++ p_rx_chan->chan->tot_buf_size = p_rx_chan->chan->buffer_size +
++ 2*(CONTROL_802_1Q_SIZE) +
++ p_rx_chan->chan->buffer_offset +
++ ADD_FOR_4BYTE_ALIGN(p_rx_chan->chan->buffer_offset & 0x3);
++
++ p_rx_chan->chan->tot_reserve_bytes = CONTROL_802_1Q_SIZE +
++ p_rx_chan->chan->buffer_offset +
++ L3_ALIGN(p_rx_chan->chan->buffer_offset & 0x3);
++
++ return(0);
++}
++
++//-----------------------------------------------------------------------------
++// Net device related private functions.
++//-----------------------------------------------------------------------------
++
++/***************************************************************
++ * cpmac_dev_init
++ *
++ * Returns:
++ * 0 on success, error code otherwise.
++ * Parms:
++ * dev The structure of the device to be
++ * init'ed.
++ *
++ * This function completes the initialization of the
++ * device structure and driver. It reserves the IO
++ * addresses and assignes the device's methods.
++ *
++ *
++ **************************************************************/
++
++static int cpmac_dev_init(struct net_device *p_dev)
++{
++ int retVal = -1;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ int instance_num = p_cpmac_priv->instance_num;
++ unsigned long net_flags = 0;
++ char *mac_name = NULL;
++ char *mac_string = NULL;
++
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info;
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal;
++ int i;
++
++ int mem_size = sizeof(CPMAC_DRV_HAL_INFO_T)
++ + sizeof(CPMAC_TX_CHAN_INFO_T)
++ + sizeof(CPMAC_RX_CHAN_INFO_T)
++ + sizeof(CPMAC_ABILITY_INFO_T)
++ + sizeof(CPMAC_DEVICE_MIB_T)
++ + sizeof(CPMAC_DRV_STATS_T);
++
++
++#if defined(CONFIG_MIPS_SEAD2)
++ int prev_reset_val = RESET_REG_PRCR;
++ /* Bring the module out of reset */
++ RESET_REG_PRCR |= temp_reset_value[p_cpmac_priv->instance_num];
++
++ /* Read the version id of the device to check if the device really exists */
++ if( VERSION(temp_base_address[p_cpmac_priv->instance_num]) == 0)
++ {
++ printk(" CPMAC:Device not found\n");
++ RESET_REG_PRCR = prev_reset_val;
++ return -ENODEV;
++ }
++
++ RESET_REG_PRCR = prev_reset_val;
++#endif
++
++
++ if((p_drv_hal = kmalloc(mem_size, GFP_KERNEL)) == NULL)
++ {
++ errPrint("Failed to allocate memory; rewinding.\n");
++ return(-1);
++ }
++
++ memset(p_drv_hal, 0, mem_size);
++
++ /* build the cpmac private object */
++ p_cpmac_priv->drv_hal = p_drv_hal;
++ p_cpmac_priv->tx_chan_info = p_tx_chan_info
++ = (CPMAC_TX_CHAN_INFO_T*)((char*)p_drv_hal
++ + sizeof(CPMAC_DRV_HAL_INFO_T));
++ p_cpmac_priv->rx_chan_info = p_rx_chan_info
++ = (CPMAC_RX_CHAN_INFO_T*)((char *)p_tx_chan_info
++ + sizeof(CPMAC_TX_CHAN_INFO_T));
++ p_cpmac_priv->ability_info = (CPMAC_ABILITY_INFO_T *)((char *)p_rx_chan_info
++ + sizeof(CPMAC_RX_CHAN_INFO_T));
++ p_cpmac_priv->device_mib = (CPMAC_DEVICE_MIB_T *)((char *)p_cpmac_priv->ability_info
++ + sizeof(CPMAC_ABILITY_INFO_T));
++ p_cpmac_priv->stats = (CPMAC_DRV_STATS_T *)((char *)p_cpmac_priv->device_mib
++ + sizeof(CPMAC_DEVICE_MIB_T));
++
++ p_drv_hal->owner = p_cpmac_priv;
++
++
++ switch(instance_num)
++ {
++
++ case 0:
++ mac_name="maca";
++
++ /* Also setting port information */
++ p_dev->if_port = AVALANCHE_CPMAC_LOW_PORT_ID;
++
++ break;
++
++ case 1:
++ mac_name="macb";
++
++ /* Also setting port information */
++ p_dev->if_port = AVALANCHE_CPMAC_HIGH_PORT_ID;
++
++ break;
++ }
++
++ if(mac_name)
++ mac_string=prom_getenv(mac_name);
++
++ if(!mac_string)
++ {
++ mac_string="08.00.28.32.06.02";
++ printk("Error getting mac from Boot enviroment for %s\n",p_dev->name);
++ printk("Using default mac address: %s\n",mac_string);
++ if(mac_name)
++ {
++ printk("Use Bootloader command:\n");
++ printk(" setenv %s xx.xx.xx.xx.xx.xx\n","<env_name>");
++ printk("to set mac address\n");
++ }
++ }
++
++ str2eaddr(p_cpmac_priv->mac_addr,mac_string);
++
++ for (i=0; i <= ETH_ALEN; i++)
++ {
++ /* This sets the hardware address */
++ p_dev->dev_addr[i] = p_cpmac_priv->mac_addr[i];
++ }
++
++ p_cpmac_priv->set_to_close = 1;
++ p_cpmac_priv->non_data_irq_expected = 0;
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ if((p_cpmac_priv->led_handle = avalanche_led_register("cpmac", instance_num)) == NULL)
++ {
++ errPrint("Could not allocate handle for CPMAC[%d] LED.\n", instance_num);
++ goto cpmac_init_mod_error;
++ }
++#endif
++
++ if(cpmac_drv_init_module(p_drv_hal, p_dev, instance_num) != 0)
++ {
++ errPrint("Could not initialize the HAL for %s.\n", p_dev->name);
++ goto cpmac_init_mod_error;
++ }
++
++ /* initialize the CPMAC device */
++ if (cpmac_drv_init(p_drv_hal) == -1)
++ {
++ errPrint("HAL init failed for %s.\n", p_dev->name);
++ goto cpmac_init_device_error;
++ }
++
++ if(cpmac_p_probe_and_setup_device(p_cpmac_priv, &net_flags) == -1)
++ {
++ errPrint("Failed to configure up %s.\n", p_dev->name);
++ goto cpmac_init_device_error;
++ }
++
++ if(cpmac_p_setup_driver_params(p_cpmac_priv) == -1)
++ {
++ errPrint("Failed to set driver parameters for %s.\n", p_dev->name);
++ goto cpmac_init_device_error;
++ }
++
++ cpmac_p_rx_buf_setup(p_rx_chan_info);
++
++ /* initialize the timers for the net device */
++ if(cpmac_p_timer_init(p_cpmac_priv) == -1)
++ {
++ errPrint("Failed to set timer(s) for %s.\n", p_dev->name);
++ goto cpmac_timer_init_error;
++ }
++
++ p_dev->addr_len = 6;
++
++ p_dev->open = &cpmac_dev_open; /* i.e. Start Device */
++ p_dev->hard_start_xmit = &cpmac_dev_tx;
++ p_dev->stop = &cpmac_dev_close;
++ p_dev->get_stats = &cpmac_dev_get_net_stats;
++
++ p_dev->set_multicast_list = &cpmac_dev_mcast_set;
++ p_dev->set_mac_address = cpmac_dev_set_mac_addr;
++ /* Knocking off the default broadcast and multicast flags. Allowing the
++ device configuration to control the flags. */
++ p_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
++ p_dev->flags |= net_flags;
++
++ netif_carrier_off(p_dev);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
++#endif
++
++ /* Tasklet is initialized at the isr registeration time. */
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "CpmacBase", "Get", &p_dev->base_addr);
++ p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "CpmacSize", "Get", &p_cpmac_priv->dev_size);
++
++ request_mem_region(p_dev->base_addr, p_cpmac_priv->dev_size, p_dev->name);
++
++ retVal = 0;
++
++ if(g_init_enable_flag)
++ cpmac_p_dev_enable(p_dev);
++
++ return(retVal);
++
++cpmac_timer_init_error:
++cpmac_init_device_error :
++ cpmac_drv_cleanup(p_drv_hal);
++
++cpmac_init_mod_error:
++ kfree(p_drv_hal);
++
++ return (retVal);
++
++} /* cpmac_dev_init */
++
++
++/***************************************************************
++ * cpmac_p_dev_enable
++ *
++ * Returns:
++ * 0 on success, error code otherwise.
++ * Parms:
++ * dev Structure of device to be opened.
++ *
++ * This routine puts the driver and CPMAC adapter in a
++ * state where it is ready to send and receive packets.
++ *
++ *
++ **************************************************************/
++int cpmac_p_dev_enable( struct net_device *p_dev)
++{
++ int ret_val = 0;
++ int channel = 0;
++
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
++ int max_length = p_rx_chan_info->chan->tot_buf_size;
++
++ p_cpmac_priv->set_to_close = 0;
++
++ if((ret_val = cpmac_drv_start(p_drv_hal, p_cpmac_priv->tx_chan_info,
++ p_cpmac_priv->rx_chan_info, CHAN_SETUP))==-1)
++ {
++ errPrint("%s error: failed to start the device.\n", p_dev->name);
++ ret_val = -1;
++ }
++ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev,"RX_UNICAST_SET",
++ "Set", &channel)!=0)
++ {
++ errPrint("%s error: device chan 0 could not be enabled.\n", p_dev->name);
++ ret_val = -1;
++ }
++ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, pszRX_MAXLEN, pszSet, &max_length) != 0)
++ {
++ errPrint(" CPMAC registers can't be written \n");
++ ret_val = -1;
++ }
++ else if(p_drv_hal->hal_funcs->Control(p_drv_hal->hal_dev, "TxIntDisable", "Set",
++ &p_cpmac_priv->tx_chan_info->tx_int_disable) != 0)
++ {
++ errPrint(" CPMAC registers can't be written \n");
++ ret_val = -1;
++ }
++ else
++ {
++ ; // Every thing went OK.
++ }
++
++ return(ret_val);
++} /* cpmac_dev_enable */
++
++
++static int cpmac_dev_open(struct net_device *p_dev)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
++
++ if(!g_init_enable_flag)
++ cpmac_p_dev_enable(p_dev);
++
++ if(request_irq(p_isr_cb_param->intr, cpmac_hal_isr, SA_INTERRUPT,
++ "Cpmac Driver", p_isr_cb_param))
++ {
++ errPrint("Failed to register the irq %d for Cpmac %s.\n",
++ p_isr_cb_param->intr, p_dev->name);
++ return (-1);
++ }
++
++ netif_start_queue(p_dev);
++
++ MOD_INC_USE_COUNT;
++ p_cpmac_priv->stats->start_tick = jiffies;
++ dbgPrint("Started the network queue for %s.\n", p_dev->name);
++ return(0);
++}
++
++/***************************************************************
++ * cpmac_p_dev_disable
++ *
++ * Returns:
++ * An error code.
++ * Parms:
++ * dev The device structure of the device to
++ * close.
++ *
++ * This function shuts down the adapter.
++ *
++ **************************************************************/
++int cpmac_p_dev_disable(struct net_device *p_dev)
++{
++ int ret_val = 0;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++
++ set_bit(0, &p_cpmac_priv->set_to_close);
++ set_bit(0, &p_cpmac_priv->non_data_irq_expected);
++
++ /* The driver does not re-schedule the tasklet after kill is called. So, this
++ should take care of the bug in the kernel. */
++ tasklet_kill(&p_cpmac_priv->cpmac_isr.tasklet);
++
++ if(cpmac_drv_stop(p_drv_hal, p_cpmac_priv->tx_chan_info,
++ p_cpmac_priv->rx_chan_info,
++ CHAN_TEARDOWN | FREE_BUFFER | BLOCKING | COMPLETE) == -1)
++ {
++ ret_val = -1;
++ }
++ else
++ {
++ /* hope that the HAL closes down the tick timer.*/
++
++ dbgPrint("Device %s Closed.\n", p_dev->name);
++ p_cpmac_priv->stats->start_tick = jiffies;
++
++ p_cpmac_priv->link_speed = 100000000;
++ p_cpmac_priv->link_mode = 1;
++ netif_carrier_off(p_dev);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_OFF);
++#endif
++
++ clear_bit(0, &p_cpmac_priv->non_data_irq_expected);
++
++ }
++
++ return (ret_val);
++
++} /* cpmac_dev_close */
++
++
++/***************************************************************
++ * cpmac_dev_close
++ *
++ * Returns:
++ * An error code.
++ * Parms:
++ * dev The device structure of the device to
++ * close.
++ *
++ * This function shuts down the adapter.
++ *
++ **************************************************************/
++static int cpmac_dev_close(struct net_device *p_dev)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
++
++ /* inform the upper layers. */
++ netif_stop_queue(p_dev);
++
++ if(!g_init_enable_flag)
++ cpmac_p_dev_disable(p_dev);
++ else
++ free_irq(p_isr_cb_param->intr, p_isr_cb_param);
++
++ MOD_DEC_USE_COUNT;
++
++ return(0);
++}
++
++static void cpmac_dev_mcast_set(struct net_device *p_dev)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ CPMAC_ABILITY_INFO_T *p_capability = p_cpmac_priv->ability_info;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ int val = 1;
++ int channel = 0;
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ if(netif_carrier_ok(p_dev))
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_LINK_ON);
++#endif
++
++ if(p_dev->flags & IFF_PROMISC)
++ {
++ if(p_capability->promiscous)
++ {
++ /* multi mode in the HAL, check this */
++ val = 0;
++ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
++
++ val = 1;
++ /* set the promiscous mode in the HAL */
++ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
++ p_hal_funcs->Control(p_hal_dev, pszRX_PROM_CH, pszSet, &channel);
++
++ dbgPrint("%s set in the Promisc mode.\n", p_dev->name);
++ }
++ else
++ {
++ errPrint("%s not configured for Promisc mode.\n", p_dev->name);
++ }
++ }
++ else if(p_dev->flags & IFF_ALLMULTI)
++ {
++ if(p_capability->all_multi)
++ {
++ val = 0;
++ /* disable the promiscous mode in the HAL */
++ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, "Clear", &val);
++
++ val = 1;
++ /* set the all multi mode in the HAL */
++ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, pszSet, &val);
++ p_hal_funcs->Control(p_hal_dev, pszRX_MULT_CH, pszSet, &channel);
++
++ dbgPrint("%s has been set to the ALL_MULTI mode.\n", p_dev->name);
++ }
++ else
++ {
++ errPrint("%s not configured for ALL MULTI mode.\n", p_dev->name);
++ }
++ }
++ else if(p_dev->mc_count)
++ {
++ if(p_capability->multicast)
++ {
++ struct dev_mc_list *p_dmi = p_dev->mc_list;
++ int count;
++
++ val = 0;
++ /* clear all the previous data, we are going to populate new ones.*/
++ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
++ /* disable the promiscous mode in the HAL */
++ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
++
++ for(count = 0; count < p_dev->mc_count; count++, p_dmi = p_dmi->next)
++ {
++ p_hal_funcs->Control(p_hal_dev, "RX_MULTI_SINGLE", "Set", p_dmi->dmi_addr);
++ }
++
++ dbgPrint("%s configured for %d multicast addresses.\n", p_dev->name, p_dev->mc_count);
++ }
++ else
++ {
++ errPrint("%s has not been configuted for multicast handling.\n", p_dev->name);
++ }
++ }
++ else
++ {
++ val = 0;
++ /* clear all the previous data, we are going to populate new ones.*/
++ p_hal_funcs->Control(p_hal_dev, pszRX_MULTI_ALL, "Clear", &val);
++ /* disable the promiscous mode in the HAL */
++ p_hal_funcs->Control(p_hal_dev, pszRX_CAF_EN, pszSet, &val);
++ dbgPrint("Dev set to Unicast mode.\n");
++ }
++}
++
++static int cpmac_dev_set_mac_addr(struct net_device *p_dev,void * addr)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ struct sockaddr *sa = addr;
++
++ memcpy(p_cpmac_priv->mac_addr,sa->sa_data,p_dev->addr_len);
++ memcpy(p_dev->dev_addr,sa->sa_data,p_dev->addr_len);
++ p_hal_funcs->Control(p_hal_dev, pszMacAddr, pszSet, p_cpmac_priv->mac_addr);
++
++ return 0;
++
++}
++
++/* VLAN is handled by vlan/vconfig support. Here, we just check for the
++ * 802.1q configuration of the device and en-queue the packet accordingly.
++ * We do not do any 802.1q processing here.
++ */
++static int cpmac_dev_tx( struct sk_buff *skb, struct net_device *p_dev)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ int channel = 0;
++ int ret_val = 0;
++ FRAGLIST send_frag_list[1];
++
++#ifdef CPMAC_8021Q_SUPPORT
++ if(skb->len < TCI_END_OFFSET)
++ {
++ /* Whee, frame shorter than 14 bytes !! We need to copy
++ * fragments to understand the frame. Too much work.
++ * Hmm, dump it. */
++
++ /* Free the buffer */
++ goto cpmac_dev_tx_drop_pkt;
++ }
++
++ /* 802.1p/q stuff */
++ if(IS_802_1Q_FRAME(skb->data + TPID_START_OFFSET))
++ {
++ /* IEEE 802.1q, section 8.8 and section 8.11.9 */
++ if(!p_cpmac_priv->enable_802_1q)
++ {
++ /* free the buffer */
++ goto cpmac_dev_tx_drop_pkt;
++ }
++
++ channel = GET_802_1P_CHAN(p_cpmac_priv->tx_chan_info->opened_chan,
++ skb->data[TCI_START_OFFSET]);
++
++ }
++ /* sending a non 802.1q frame, when configured for 802.1q: dump it.*/
++ else if(p_cpmac_priv->enable_802_1q)
++ {
++ /* free the buffer */
++ goto cpmac_dev_tx_drop_pkt;
++ }
++ else
++ {
++ ;/* it is the good old non 802.1q */
++ }
++#endif
++
++ send_frag_list->len = skb->len;
++ send_frag_list->data = skb->data;
++
++#ifdef CPMAC_TEST
++ xdump(skb->data, skb->len, "send");
++#endif
++
++ dma_cache_wback_inv((unsigned long)skb->data, skb->len);
++
++ if(p_drv_hal->hal_funcs->Send(p_drv_hal->hal_dev, send_frag_list, 1,
++ skb->len, skb, channel) != 0)
++ {
++ /* code here to stop the queue, when allowing tx timeout, perhaps next release.*/
++ p_cpmac_priv->net_dev_stats.tx_errors++;
++#ifndef TI_SLOW_PATH
++ /* Free the skb in case of Send return error */
++ dev_kfree_skb_any(skb);
++ p_cpmac_priv->net_dev_stats.tx_dropped++;
++ return 0;
++#endif
++ goto cpmac_dev_tx_drop_pkt;
++ }
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_TX_ACTIVITY);
++#endif
++
++ return(ret_val);
++
++cpmac_dev_tx_drop_pkt:
++
++ p_cpmac_priv->net_dev_stats.tx_dropped++;
++ ret_val = -1;
++ return (ret_val);
++
++} /*cpmac_dev_tx */
++
++
++//------------------------------------------------------------------------------
++// Public functions : Called by outsiders to this file.
++//------------------------------------------------------------------------------
++
++
++void *cpmac_hal_malloc_buffer(unsigned int size, void* mem_base, unsigned int mem_range,
++ OS_SETUP *p_os_setup, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **osReceiveInfo, OS_DEVICE *p_dev)
++{
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = (CPMAC_RX_CHAN_INFO_T *)p_os_setup;
++ int tot_buf_size = p_rx_chan_info->chan->tot_buf_size;
++ int tot_reserve_bytes = p_rx_chan_info->chan->tot_reserve_bytes;
++ struct sk_buff *p_skb;
++ void *ret_ptr;
++
++ /* use TI SKB private pool */
++ p_skb = dev_alloc_skb(tot_buf_size);
++
++ if(p_skb == NULL)
++ {
++ errPrint("Failed to allocate skb for %s.\n", ((struct net_device*)p_dev)->name);
++ return (NULL);
++ }
++
++ p_skb->dev = p_dev;
++ skb_reserve(p_skb, tot_reserve_bytes);
++
++ *osReceiveInfo = p_skb;
++
++ ret_ptr = skb_put(p_skb, p_rx_chan_info->chan->buffer_size);
++
++ return(ret_ptr);
++}
++
++void cpmac_hal_isr(int irq, void *p_param, struct pt_regs *regs)
++{
++ CPMAC_ISR_INFO_T *p_cb_param = (CPMAC_ISR_INFO_T*) p_param;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cb_param->owner;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_drv_hal->owner;
++ int pkts_to_handle = 0;
++
++ if(p_cpmac_priv->non_data_irq_expected)
++ {
++ p_cb_param->hal_isr(p_drv_hal->hal_dev, &pkts_to_handle);
++ p_drv_hal->hal_funcs->PacketProcessEnd(p_drv_hal->hal_dev);
++ }
++ else if(!p_cpmac_priv->set_to_close)
++ tasklet_schedule(&((CPMAC_ISR_INFO_T*) p_param)->tasklet);
++ else
++ ; // back off from doing anything more. We are closing down.
++}
++
++void cpmac_handle_tasklet(unsigned long data)
++{
++ CPMAC_ISR_INFO_T *p_cb_param = (CPMAC_ISR_INFO_T*) data;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cb_param->owner;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_drv_hal->owner;
++ int pkts_to_handle;
++
++ p_cb_param->hal_isr(p_drv_hal->hal_dev, &pkts_to_handle);
++
++ if(test_bit(0, &p_cpmac_priv->non_data_irq_expected) || !pkts_to_handle)
++ p_drv_hal->hal_funcs->PacketProcessEnd(p_drv_hal->hal_dev);
++ else if(!test_bit(0, &p_cpmac_priv->set_to_close))
++ tasklet_schedule(&p_cb_param->tasklet);
++ else
++ ; // Back off from processing packets we are closing down.
++}
++
++int cpmac_hal_control(OS_DEVICE *p_dev, const char *key,
++ const char *action, void *value)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ int ret_val = -1;
++
++ if(key == NULL)
++ {
++ dbgPrint("Encountered NULL key.\n");
++ return (-1);
++ }
++
++ if(cpmac_ci_strcmp(key, "Sleep") == 0 && value != NULL)
++ {
++ unsigned int clocks_per_tick = cpmac_cpu_freq/HZ;
++ unsigned int requested_clocks = *(unsigned int*)value;
++ unsigned int requested_ticks = (requested_clocks + clocks_per_tick - 1)/clocks_per_tick;
++ mdelay(requested_ticks);
++ ret_val = 0;
++ }
++ else if(cpmac_ci_strcmp(key, "StateChange") == 0)
++ {
++ ret_val = cpmac_p_process_status_ind(p_cpmac_priv);
++ }
++ else if(cpmac_ci_strcmp(key, "Tick") == 0 && action != NULL)
++ {
++ if(cpmac_ci_strcmp(action, "Set") == 0 && value != NULL)
++ {
++ if(*(unsigned int*)value == 0)
++ {
++ cpmac_p_stop_timer(p_cpmac_priv->timer + TICK_TIMER);
++ ret_val = 0;
++ }
++ else
++ {
++ unsigned int clocks_per_tick = cpmac_cpu_freq/HZ;
++ unsigned int requested_clocks = *(unsigned int*)value;
++ unsigned int requested_ticks = (requested_clocks + clocks_per_tick - 1)/clocks_per_tick;
++
++ p_cpmac_priv->delay_ticks = requested_ticks; /* save it for re-triggering */
++ ret_val = cpmac_p_start_timer(p_cpmac_priv->timer + TICK_TIMER,
++ p_cpmac_priv->delay_ticks);
++ }
++ }
++ else if(cpmac_ci_strcmp(action, "Clear") == 0)
++ {
++ ret_val = cpmac_p_stop_timer(p_cpmac_priv->timer + TICK_TIMER);
++ }
++ else
++ ;
++ }
++ else if(cpmac_ci_strcmp(key, "MacAddr") == 0 && action != NULL)
++ {
++ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
++ {
++ *(char **)value = p_cpmac_priv->mac_addr;
++ ret_val = 0;
++ }
++ }
++ else if(cpmac_ci_strcmp(key, "CpuFreq") == 0)
++ {
++ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
++ {
++ *(unsigned int *)value = cpmac_cpu_freq;
++ dbgPrint("Cpu frequency for cpmacs is %u\n",cpmac_cpu_freq);
++ ret_val = 0;
++ }
++ }
++ else if(cpmac_ci_strcmp(key, "SioFlush") == 0)
++ {
++ ret_val = 0;
++ dbgPrint("\n");
++ }
++ else if(cpmac_ci_strcmp(key, "CpmacFrequency") == 0)
++ {
++ /* For Sangam cpmac clock is off the PBUS */
++ /* OS Needs to supply CORRECT frequency */
++ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
++ {
++ *(unsigned int *)value = CONFIG_AR7_SYS_FREQUENCY * 1000 * 1000;
++ ret_val = 0;
++ }
++ }
++ /* For now, providing back the default values. */
++ else if(cpmac_ci_strcmp(key, "MdioClockFrequency") == 0)
++ {
++ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
++ {
++ *(unsigned int *)value = 2200000; /*DEFAULT */
++ ret_val = 0;
++ }
++ }
++ /* For now, providing back the default values. */
++ else if(cpmac_ci_strcmp(key, "MdioBusFrequency") == 0)
++ {
++ /* For Sangam MdioBusFreq is off the PBUS */
++ if(cpmac_ci_strcmp(action, "Get") == 0 && value != NULL)
++ {
++ *(unsigned int *)value = CONFIG_AR7_SYS_FREQUENCY * 1000 * 1000;
++ ret_val = 0;
++ }
++ }
++
++#if 0
++#if defined(CONFIG_AVALANCHE_AUTO_MDIX)
++ /* supporting Mdio Mdix switching */
++ else if(cpmac_ci_strcmp(key, hcMdioMdixSwitch) == 0)
++ {
++ /* For Sangam Mdio-switching action should be always "set"*/
++ if(cpmac_ci_strcmp(action, hcSet) == 0 && value != NULL )
++ {
++ unsigned int mdix = *((unsigned int *) value) ;
++
++ if(mdix)
++ avalanche_set_phy_into_mdix_mode();
++
++ else
++ avalanche_set_phy_into_mdi_mode();
++
++ ret_val = 0;
++ }
++
++ }
++#endif
++#endif
++ else if(cpmac_ci_strcmp(key, hcMdioMdixSwitch) == 0)
++ {
++ /* For Sangam Mdio-switching action should be always "set"*/
++ if(cpmac_ci_strcmp(action, hcSet) == 0 && value != NULL )
++ {
++ unsigned int mdix = *((unsigned int *) value) ;
++
++#ifdef CONFIG_AR7_MDIX
++ avalanche_set_mdix_on_chip(0xa8610000 , mdix ? 1: 0);
++#endif
++
++ ret_val = 0;
++ }
++
++ }
++
++ return(ret_val);
++}
++
++
++int cpmac_hal_receive(OS_DEVICE *p_dev, FRAGLIST *fragList,
++ unsigned int fragCount,
++ unsigned int packet_size,
++ HAL_RECEIVEINFO *hal_receive_info,
++ unsigned int mode)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ struct sk_buff *p_skb = fragList[0].OsInfo;
++ p_skb->len = fragList[0].len;
++
++ /* invalidate the cache. */
++ dma_cache_inv((unsigned long)p_skb->data, fragList[0].len);
++#ifdef CPMAC_TEST
++ xdump(p_skb->data, p_skb->len, "recv");
++#endif
++#ifdef CPMAC_8021Q_SUPPORT
++ /* 802.1q stuff, just does the basic checking here. */
++ if(!p_cpmac_priv->enable_802_1q &&
++ p_skb->len > TCI_END_OFFSET &&
++ IS_802_1Q_FRAME(p_skb->data + TPID_START_OFFSET))
++ {
++ goto cpmac_hal_recv_frame_mismatch;
++ }
++#endif
++ if(fragCount > 1)
++ {
++ int len;
++ struct sk_buff *p_temp_skb;
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info = p_cpmac_priv->rx_chan_info;
++ int count;
++
++ dbgPrint("Recv: It is multifragment for %s.\n", p_dev->name);
++
++ p_skb = dev_alloc_skb(packet_size +
++ p_rx_chan_info->chan->tot_reserve_bytes);
++ if(p_skb == NULL)
++ {
++ p_cpmac_priv->net_dev_stats.rx_errors++;
++ goto cpmac_hal_recv_alloc_failed;
++ }
++
++ p_skb->dev = p_dev;
++ skb_reserve(p_skb, p_rx_chan_info->chan->tot_reserve_bytes);
++
++ for(count = 0; count < fragCount; count++)
++ {
++ p_temp_skb = fragList[count].OsInfo;
++ len = fragList[count].len;
++
++ dma_cache_inv((unsigned long)p_temp_skb->data, len);
++
++ memcpy(skb_put(p_skb, len), p_temp_skb->data, len);
++ dev_kfree_skb_any(p_temp_skb);
++ }
++ }
++
++
++#if defined(CONFIG_MIPS_AVALANCHE_MARVELL)
++ /* Fetch the receiving port information from EGRESS TRAILOR Bytes*/
++ p_dev->if_port = (unsigned char)p_skb->data[packet_size -(EGRESS_TRAILOR_LEN-1)] + AVALANCHE_MARVELL_BASE_PORT_ID;
++ skb_trim(p_skb, packet_size - EGRESS_TRAILOR_LEN);
++#else
++ /* set length & tail */
++ skb_trim(p_skb, packet_size);
++#endif
++
++#ifndef TI_SLOW_PATH
++ /* TI Optimization: This is NOT required if the ethernet resides below the bridge. But is
++ * required only if the ethernet is directly connected to the IP stack. */
++ if (p_dev->br_port == NULL)
++#endif
++ p_skb->protocol = eth_type_trans(p_skb, p_dev);
++
++ netif_rx(p_skb);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_action(p_cpmac_priv->led_handle, CPMAC_RX_ACTIVITY);
++#endif
++
++ p_cpmac_priv->net_dev_stats.rx_packets++;
++ p_cpmac_priv->net_dev_stats.rx_bytes += packet_size;
++
++ p_drv_hal->hal_funcs->RxReturn(hal_receive_info,1);
++
++ return(0);
++
++cpmac_hal_recv_alloc_failed:
++
++#ifdef CPMAC_8021Q_SUPPORT
++cpmac_hal_recv_frame_mismatch:
++#endif
++
++ fragCount--;
++
++ do
++ {
++ dev_kfree_skb_any(fragList[fragCount].OsInfo);
++ }
++ while(fragCount--);
++
++ p_cpmac_priv->net_dev_stats.rx_dropped++;
++
++ return(-1);
++} /*cpmac_receive*/
++
++
++void cpmac_hal_tear_down_complete(OS_DEVICE*a, int b, int ch)
++{
++ dbgPrint("what to do with this.\n");
++}
++
++
++int cpmac_hal_send_complete(OS_SENDINFO *p_skb)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_skb->dev->priv;
++
++ p_cpmac_priv->net_dev_stats.tx_packets++;
++ p_cpmac_priv->net_dev_stats.tx_bytes += p_skb->len;
++
++ dev_kfree_skb_any(p_skb);
++
++ return(0);
++}
++
++
++int cpmac_reset(CPMAC_PRIVATE_INFO_T *p_cpmac_priv)
++{
++ // code here to reset the device/hal. Not now.
++
++ netif_wake_queue(p_cpmac_priv->owner);
++ return(0);
++}
++
++#ifdef CPMAC_TEST
++
++#define isprint(a) ((a >=' ')&&(a<= '~'))
++void xdump( u_char* cp, int length, char* prefix )
++{
++ int col, count;
++ u_char prntBuf[120];
++ u_char* pBuf = prntBuf;
++ count = 0;
++ while(count < length){
++ pBuf += sprintf( pBuf, "%s", prefix );
++ for(col = 0;count + col < length && col < 16; col++){
++ if (col != 0 && (col % 4) == 0)
++ pBuf += sprintf( pBuf, " " );
++ pBuf += sprintf( pBuf, "%02X ", cp[count + col] );
++ }
++ while(col++ < 16){ /* pad end of buffer with blanks */
++ if ((col % 4) == 0)
++ sprintf( pBuf, " " );
++ pBuf += sprintf( pBuf, " " );
++ }
++ pBuf += sprintf( pBuf, " " );
++ for(col = 0;count + col < length && col < 16; col++){
++ if (isprint((int)cp[count + col]))
++ pBuf += sprintf( pBuf, "%c", cp[count + col] );
++ else
++ pBuf += sprintf( pBuf, "." );
++ }
++ sprintf( pBuf, "\n" );
++ // SPrint(prntBuf);
++ printk(prntBuf);
++ count += col;
++ pBuf = prntBuf;
++ }
++
++} /* close xdump(... */
++#endif
++
++
++static int __init cpmac_dev_probe(void)
++{
++ int retVal = 0;
++ int unit;
++ int instance_count = CONFIG_MIPS_CPMAC_PORTS;
++
++ //cpmac_cpu_freq = avalanche_clkc_get_freq(CLKC_MIPS);
++ cpmac_cpu_freq = CONFIG_AR7_CPU_FREQUENCY * 1000 * 1000;
++
++ build_psp_config();
++
++ for(unit = 0; unit < instance_count; unit++)
++ {
++ struct net_device *p_dev;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
++ size_t dev_size;
++ int failed;
++
++ dev_size = sizeof(struct net_device)
++ + sizeof(CPMAC_PRIVATE_INFO_T);
++
++
++ if((p_dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL)) == NULL)
++ {
++ dbgPrint( "Could not allocate memory for device.\n" );
++ retVal = -ENOMEM;
++ break;
++ }
++
++ memset(p_dev, 0, dev_size );
++
++ p_dev->priv = p_cpmac_priv
++ = (CPMAC_PRIVATE_INFO_T*)(((char *) p_dev) + sizeof(struct net_device));
++ p_cpmac_priv->owner = p_dev;
++
++ ether_setup(p_dev);
++
++ p_cpmac_priv->instance_num = unit;
++ p_dev->init = cpmac_dev_init;
++
++ g_dev_array[p_cpmac_priv->instance_num] = p_dev;
++
++#if defined CONFIG_MIPS_CPMAC_INIT_BUF_MALLOC
++ g_init_enable_flag = 1;
++ printk("Cpmac driver is allocating buffer memory at init time.\n");
++#endif
++
++ /* This section gives a default value by the number of PHY in order to
++ * replace the default MACRO. */
++ {
++ char *mac_port = prom_getenv("MAC_PORT"); /* Internal: 0, External: 1 */
++ if(!mac_port || (0 != strcmp(mac_port, "0"))) {
++ printk("Using the MAC with external PHY\n");
++ cfg_start_link_speed = _CPMDIO_NOPHY;
++ cpmac_max_frame_size = CPMAC_MAX_FRAME_SIZE + 4;
++ }
++ else {
++ printk("Using the MAC with internal PHY\n");
++ cfg_start_link_speed = CFG_START_LINK_SPEED;
++ cpmac_max_frame_size = CPMAC_MAX_FRAME_SIZE;
++ }
++ g_cfg_start_link_params = cfg_start_link_speed;
++ }
++
++ cpmac_p_detect_manual_cfg(cfg_link_speed, cfg_link_mode, cpmac_debug_mode);
++
++ failed = register_netdev(p_dev);
++ if (failed)
++ {
++ dbgPrint("Could not register device for inst %d because of reason \
++ code %d.\n", unit, failed);
++ retVal = -1;
++ kfree(p_dev);
++ break;
++ }
++ else
++ {
++
++ char proc_name[100];
++ int proc_category_name_len = 0;
++
++ p_cpmac_priv->next_device = last_cpmac_device;
++ last_cpmac_device = p_dev;
++
++ dbgPrint(" %s irq=%2d io=%04x\n",p_dev->name, (int) p_dev->irq,
++ (int) p_dev->base_addr);
++
++ strcpy(proc_name, "avalanche/");
++ strcat(proc_name, p_dev->name);
++ proc_category_name_len = strlen(proc_name);
++
++ strcpy(proc_name + proc_category_name_len, "_rfc2665_stats");
++ create_proc_read_entry(proc_name,0,NULL,cpmac_p_read_rfc2665_stats, p_dev);
++
++ }
++ }
++
++ if(retVal == 0)
++ {
++ /* To maintain backward compatibility with NSP. */
++ gp_stats_file = create_proc_entry("avalanche/cpmac_stats", 0644, NULL);
++ if(gp_stats_file)
++ {
++ gp_stats_file->read_proc = cpmac_p_read_stats;
++ gp_stats_file->write_proc = cpmac_p_write_stats;
++ }
++ create_proc_read_entry("avalanche/cpmac_link", 0, NULL, cpmac_p_read_link, NULL);
++ create_proc_read_entry("avalanche/cpmac_ver", 0, NULL, cpmac_p_get_version, NULL);
++
++ }
++
++ cpmac_devices_installed = unit;
++ dbgPrint("Installed %d cpmac instances.\n", unit);
++ return ( (unit >= 0 ) ? 0 : -ENODEV );
++
++} /* init_module */
++
++
++/***************************************************************
++ * cleanup_module
++ *
++ * Returns:
++ * Nothing
++ * Parms:
++ * None
++ *
++ * Goes through the CpmacDevices list and frees the device
++ * structs and memory associated with each device (lists
++ * and buffers). It also ureserves the IO port regions
++ * associated with this device.
++ *
++ **************************************************************/
++
++void cpmac_exit(void)
++{
++ struct net_device *p_dev;
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv;
++
++ while (cpmac_devices_installed)
++ {
++ char proc_name[100];
++ int proc_category_name_len = 0;
++
++ p_dev = last_cpmac_device;
++ p_cpmac_priv = (CPMAC_PRIVATE_INFO_T *) p_dev->priv;
++
++ dbgPrint("Unloading %s irq=%2d io=%04x\n",p_dev->name, (int) p_dev->irq, (int) p_dev->base_addr);
++
++ if(g_init_enable_flag)
++ cpmac_p_dev_disable(p_dev);
++
++ cpmac_drv_cleanup(p_cpmac_priv->drv_hal);
++
++#if defined (CONFIG_MIPS_AVALANCHE_LED)
++ avalanche_led_unregister(p_cpmac_priv->led_handle);
++#endif
++ strcpy(proc_name, "avalanche/");
++ strcat(proc_name, p_dev->name);
++ proc_category_name_len = strlen(proc_name);
++
++ strcpy(proc_name + proc_category_name_len, "_rfc2665_stats");
++ remove_proc_entry(proc_name, NULL);
++
++ release_mem_region(p_dev->base_addr, p_cpmac_priv->dev_size);
++ unregister_netdev(p_dev);
++ last_cpmac_device = p_cpmac_priv->next_device;
++
++ kfree(p_cpmac_priv->drv_hal);
++ kfree(p_dev);
++
++ cpmac_devices_installed--;
++ }
++
++ if(gp_stats_file)
++ remove_proc_entry("avalanche/cpmac_stats", NULL);
++
++ remove_proc_entry("avalanche/cpmac_link", NULL);
++ remove_proc_entry("avalanche/cpmac_ver", NULL);
++
++ psp_config_cleanup();
++}
++
++
++module_init(cpmac_dev_probe);
++module_exit(cpmac_exit);
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/cpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmac.h 2005-07-10 03:22:40.511160000 +0200
+@@ -0,0 +1,379 @@
++/******************************************************************************
++ * FILE PURPOSE: CPMAC Linux Network Device Driver Header
++ ******************************************************************************
++ * FILE NAME: cpmac.h
++ *
++ * DESCRIPTION: CPMAC Network Device Driver Header
++ *
++ * REVISION HISTORY:
++ * Date Name Details
++ *-----------------------------------------------------------------------------
++ * 27 Nov 2002 Suraj S Iyer Initial Create.
++ * 09 Jun 2003 Suraj S Iyer Preparing for GA.
++ *
++ * (C) Copyright 2003, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef CPMAC_H
++#define CPMAC_H
++
++#include <linux/timer.h>
++#include <linux/netdevice.h>
++#include <asm/semaphore.h>
++#include <linux/ctype.h>
++#include <linux/interrupt.h>
++
++#include "cpmacHalLx.h"
++/*-----------------------------------------------------------------------------
++ * Config macros. Use these to config the driver.
++ *---------------------------------------------------------------------------*/
++#define CPMAC_MAX_FRAME_SIZE 1518
++
++#if defined(CONFIG_AR7WRD) || defined(CONFIG_AR7WI) || defined(CONFIG_AR7VWI)|| defined(CONFIG_AR7VW)
++#define CFG_RX_NUM_BUF_DESC 64
++#define CFG_RX_NUM_BUF_SERVICE 32
++#else
++#define CFG_RX_NUM_BUF_DESC 16
++#define CFG_RX_NUM_BUF_SERVICE 8
++#endif
++
++#define CFG_RX_BUF_OFFSET 0
++
++#define CFG_TX_NUM_BUF_DESC 128
++#define CFG_TX_NUM_BUF_SERVICE 20
++#define CFG_TX_BUF_OFFSET 0 /* Lets not change this. */
++#define CFG_TX_TIMEOUT 2000 /* ticks*/
++#define CFG_TX_INT_DISABLE 1 /* Disable the Tx Complete interrupt */
++
++#define CFG_JUMBO_FRAMES 1
++#define CFG_SHORT_FRAMES 1
++#define CFG_PROMISCOUS 1
++#define CFG_BROADCAST 1
++#define CFG_MULTICAST 1
++#define CFG_ALL_MULTI (1*(CFG_MULTICAST))
++#define CFG_AUTO_NEGOTIATION 1
++
++#if defined (CONFIG_MIPS_AVALANCHE_MARVELL)
++#define EGRESS_TRAILOR_LEN 4
++#define CFG_START_LINK_SPEED (_CPMDIO_NOPHY)
++#undef CPMAC_MAX_FRAME_SIZE
++#define CPMAC_MAX_FRAME_SIZE (1518 + EGRESS_TRAILOR_LEN)
++#else
++#define CFG_START_LINK_SPEED (_CPMDIO_10 | _CPMDIO_100 | _CPMDIO_HD | _CPMDIO_FD) /* auto nego */
++#endif
++
++#define CFG_LOOP_BACK 1
++#define CFG_TX_FLOW_CNTL 0
++#define CFG_RX_FLOW_CNTL 0
++#define CFG_TX_PACING 0
++#define CFG_RX_PASS_CRC 0
++#define CFG_QOS_802_1Q 0
++#define CFG_TX_NUM_CHAN 1
++
++
++/*-----------------------------------------------------------------------------
++ * Private macros.
++ *---------------------------------------------------------------------------*/
++#define MAX_TIMER 2
++#define TX_TIMER 0
++#define TICK_TIMER 0
++#define MAX_TX_CHAN 8
++
++#define CPMAC_LINK_OFF 0
++#define CPMAC_LINK_ON 1
++/*#define CPMAC_SPEED_100 2
++#define CPMAC_SPEED_10 3
++#define CPMAC_FULL_DPLX 4
++#define CPMAC_HALF_DPLX 5*/
++#define CPMAC_RX_ACTIVITY 2
++#define CPMAC_TX_ACTIVITY 3
++
++struct cpmac_timer_info;
++
++typedef int (*CPMAC_HAL_ISR_FUNC_T)(HAL_DEVICE*, int*);
++typedef int (*CPMAC_TIMEOUT_CB_T)(struct cpmac_timer_info*);
++
++typedef struct cpmac_ability_info
++{
++ int promiscous;
++ int broadcast;
++ int multicast;
++ int all_multi;
++ int loop_back;
++ int jumbo_frames;
++ int short_frames;
++ int auto_negotiation;
++ int tx_flow_control;
++ int rx_flow_control;
++ int tx_pacing;
++ int link_speed;
++ int rx_pass_crc;
++ int qos_802_1q;
++ int tx_num_chan;
++}
++CPMAC_ABILITY_INFO_T;
++
++#ifdef DEBUG
++typedef struct cpmac_timer_info
++{
++ void *owner;
++ UINT32 delay_ticks;
++ WDOG_ID timer_id;
++ UINT32 is_running;
++ UINT32 timer_set_at;
++ CPMAC_TIMEOUT_CB_T timeout_CB;
++} CPMAC_TIMER_INFO_T;
++
++typedef struct
++{
++ void *owner;
++ unsigned int num_cl_desc;
++ CL_DESC *cl_desc_tbl;
++ M_CL_CONFIG *m_cl_blk_config;
++ NET_POOL *net_pool;
++ CL_POOL_ID clPoolId;
++
++} CPMAC_NET_MEM_INFO_T;
++
++#endif
++
++typedef struct
++{
++ void *owner;
++ CPMAC_HAL_ISR_FUNC_T hal_isr;
++ struct tasklet_struct tasklet;
++ int intr;
++
++} CPMAC_ISR_INFO_T;
++
++typedef struct cpmac_chan
++{
++ int num_BD;
++ int buffer_size;
++ int buffer_offset;
++ int service_max;
++ int state;
++ int tot_buf_size;
++ int tot_reserve_bytes;
++
++} CPMAC_CHAN_T;
++
++#define CHAN_CLOSE 0
++#define CHAN_OPENED 1
++
++typedef struct
++{
++ int cfg_chan;
++ int dev_chan;
++ int opened_chan;
++ CPMAC_CHAN_T chan[1];
++ int enable_802_1q;
++
++} CPMAC_RX_CHAN_INFO_T;
++
++typedef struct
++{
++ int cfg_chan;
++ int dev_chan;
++ int opened_chan;
++ int tx_int_disable;
++ CPMAC_CHAN_T chan[MAX_TX_CHAN];
++
++} CPMAC_TX_CHAN_INFO_T;
++
++
++
++typedef struct
++{
++ void *owner;
++ HAL_FUNCTIONS *hal_funcs;
++ HAL_DEVICE *hal_dev;
++ OS_FUNCTIONS *os_funcs;
++// SEM_ID chan_teardown_sem;
++ int non_data_irq_expected;
++} CPMAC_DRV_HAL_INFO_T;
++
++
++typedef struct
++{
++ unsigned long tx_discards;
++ unsigned long rx_discards;
++ unsigned long start_tick;
++
++} CPMAC_DRV_STATS_T;
++
++typedef struct
++{
++ unsigned long ifInGoodFrames;
++ unsigned long ifInBroadcasts;
++ unsigned long ifInMulticasts;
++ unsigned long ifInPauseFrames;
++ unsigned long ifInCRCErrors;
++ unsigned long ifInAlignCodeErrors;
++ unsigned long ifInOversizedFrames;
++ unsigned long ifInJabberFrames;
++ unsigned long ifInUndersizedFrames;
++ unsigned long ifInFragments;
++ unsigned long ifInFilteredFrames;
++ unsigned long ifInQosFilteredFrames;
++ unsigned long ifInOctets;
++ unsigned long ifOutGoodFrames;
++ unsigned long ifOutBroadcasts;
++ unsigned long ifOutMulticasts;
++ unsigned long ifOutPauseFrames;
++ unsigned long ifDeferredTransmissions;
++ unsigned long ifCollisionFrames;
++ unsigned long ifSingleCollisionFrames;
++ unsigned long ifMultipleCollisionFrames;
++ unsigned long ifExcessiveCollisionFrames;
++ unsigned long ifLateCollisions;
++ unsigned long ifOutUnderrun;
++ unsigned long ifCarrierSenseErrors;
++ unsigned long ifOutOctets;
++ unsigned long if64OctetFrames;
++ unsigned long if65To127OctetFrames;
++ unsigned long if128To255OctetFrames;
++ unsigned long if256To511OctetFrames;
++ unsigned long if512To1023OctetFrames;
++ unsigned long if1024ToUPOctetFrames;
++ unsigned long ifNetOctets;
++ unsigned long ifRxSofOverruns;
++ unsigned long ifRxMofOverruns;
++ unsigned long ifRxDMAOverruns;
++
++} CPMAC_DEVICE_MIB_T;
++
++
++typedef struct
++{
++ void *owner;
++ int timer_count;
++ int timer_created;
++ struct timer_list timer[1];
++ CPMAC_DRV_HAL_INFO_T *drv_hal;
++ unsigned int num_of_intr;
++ CPMAC_ISR_INFO_T cpmac_isr;
++ unsigned int link_speed;
++ unsigned int link_mode;
++ unsigned int enable_802_1q;
++ unsigned int timer_access_hal;
++ unsigned int loop_back;
++ CPMAC_RX_CHAN_INFO_T *rx_chan_info;
++ CPMAC_TX_CHAN_INFO_T *tx_chan_info;
++ CPMAC_ABILITY_INFO_T *ability_info;
++ CPMAC_DEVICE_MIB_T *device_mib;
++ CPMAC_DRV_STATS_T *stats;
++ unsigned int flags;
++ unsigned int delay_ticks;
++ char mac_addr[6];
++ struct net_device_stats net_dev_stats;
++// rwlock_t rw_lock;
++ int set_to_close;
++ struct net_device *next_device;
++ unsigned int instance_num;
++ unsigned int non_data_irq_expected;
++ unsigned long dev_size;
++ void* led_handle;
++} CPMAC_PRIVATE_INFO_T;
++
++
++/* Private flags */
++
++/* bit 0 to 31, bit 32 is used to indicate set or reset */
++
++#define IFF_PRIV_SHORT_FRAMES 0x00010000
++#define IFF_PRIV_JUMBO_FRAMES 0x00020000
++#define IFF_PRIV_AUTOSPEED 0x00080000
++#define IFF_PRIV_LINK10_HD 0x00100000
++#define IFF_PRIV_LINK10_FD 0x00200000
++#define IFF_PRIV_LINK100_HD 0x00400000
++#define IFF_PRIV_LINK100_FD 0x00800000
++#define IFF_PRIV_8021Q_EN 0x01000000
++#define IFF_PRIV_NUM_TX_CHAN 0x02000000
++#define IFF_PRIV_TX_FLOW_CNTL 0x04000000
++#define IFF_PRIV_RX_FLOW_CNTL 0x08000000
++#define IFF_PRIV_TX_PACING 0x10000000
++#define IFF_PRIV_RX_PASS_CRC 0x20000000
++
++#define PRIVCSFLAGS 0x200
++#define PRIVCGFLAGS 0x201
++
++
++#define BLOCKING 1
++#define CHAN_TEARDOWN 2
++#define CHAN_SETUP 4
++#define COMPLETE 8
++#define FREE_BUFFER 16
++
++
++static const char pszStats0[] = "Stats0";
++static const char pszStats1[] = "Stats1";
++static const char pszStats2[] = "Stats2";
++static const char pszStats3[] = "Stats3";
++static const char pszStats4[] = "Stats4";
++static const char pszStatsDump[] = "StatsDump";
++static const char pszStatsClear[] = "StatsClear";
++static const char pszRX_PASS_CRC[] = "RX_PASS_CRC";
++static const char pszRX_QOS_EN[] = "RX_QOS_EN";
++static const char pszRX_NO_CHAIN[] = "RX_NO_CHAIN";
++static const char pszRX_CMF_EN[] = "RX_CMF_EN";
++static const char pszRX_CSF_EN[] = "RX_CSF_EN";
++static const char pszRX_CEF_EN[] = "RX_CEF_EN";
++static const char pszRX_CAF_EN[] = "RX_CAF_EN";
++static const char pszRX_PROM_CH[] = "RX_PROM_CH";
++static const char pszRX_BROAD_EN[] = "RX_BROAD_EN";
++static const char pszRX_BROAD_CH[] = "RX_BROAD_CH";
++static const char pszRX_MULT_EN[] = "RX_MULT_EN";
++static const char pszRX_MULT_CH[] = "RX_MULT_CH";
++static const char pszTX_PTYPE[] = "TX_PTYPE";
++static const char pszTX_PACE[] = "TX_PACE";
++static const char pszMII_EN[] = "MII_EN";
++static const char pszTX_FLOW_EN[] = "TX_FLOW_EN";
++static const char pszRX_FLOW_EN[] = "RX_FLOW_EN";
++static const char pszRX_MAXLEN[] = "RX_MAXLEN";
++static const char pszRX_FILTERLOWTHRESH[] = "RX_FILTERLOWTHRESH";
++static const char pszRX0_FLOWTHRESH[] = "RX0_FLOWTHRESH";
++static const char pszRX_UNICAST_SET[] = "RX_UNICAST_SET";
++static const char pszRX_UNICAST_CLEAR[] = "RX_UNICAST_CLEAR";
++static const char pszMdioConnect[] = "MdioConnect";
++static const char pszMacAddr[] = "MacAddr";
++static const char pszTick[] = "Tick";
++static const char pszRX_MULTICAST[] = "RX_MULTICAST";
++static const char pszRX_MULTI_ALL[] = "RX_MULTI_ALL";
++static const char pszRX_MULTI_SINGLE[] = "RX_MULTI_SINGLE";
++
++static const char pszSet[] = "Set";
++static const char pszGet[] = "Get";
++static const char pszClear[] = "Clear";
++
++
++void *cpmac_hal_malloc_buffer(unsigned int size, void *MemBase, unsigned int MemRange,
++ HAL_DEVICE *HalDev, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
++
++void cpmac_hal_tear_down_complete(OS_DEVICE*, int, int);
++int cpmac_hal_control(OS_DEVICE *p_END_obj, const char *key,
++ const char *action, void *value);
++int cpmac_hal_receive(OS_DEVICE *p_END_obj, FRAGLIST *fragList,
++ unsigned int FragCount, unsigned int pkt_len,
++ HAL_RECEIVEINFO *halReceiveInfo,
++ unsigned int mode);
++int cpmac_hal_send_complete(OS_SENDINFO*);
++
++void cpmac_hal_isr(int irq, void *p_param, struct pt_regs *p_cb_param);
++void cpmac_handle_tasklet(unsigned long data);
++
++inline static int cpmac_ci_strcmp(const char *s1, const char *s2)
++{
++ while(*s1 && *s2)
++ {
++ if(tolower(*s1) != tolower(*s2))
++ break;
++ s1++;
++ s2++;
++ }
++
++ return(tolower(*s1) - tolower(*s2));
++}
++
++#endif
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.c linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.c
+--- linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.c 2005-07-10 04:06:50.491302256 +0200
+@@ -0,0 +1,492 @@
++/******************************************************************************
++ * FILE PURPOSE: CPMAC Net Driver HAL support Source
++ ******************************************************************************
++ * FILE NAME: cpmacHalLx.c
++ *
++ * DESCRIPTION: CPMAC Network Device Driver Source
++ *
++ * REVISION HISTORY:
++ *
++ * Date Description Author
++ *-----------------------------------------------------------------------------
++ * 27 Nov 2002 Initial Creation Suraj S Iyer
++ * 09 Jun 2003 Updates for GA Suraj S Iyer
++ * 18 Dec 2003 Updated for 5.7 Suraj S Iyer
++ *
++ * (C) Copyright 2003, Texas Instruments, Inc
++ *******************************************************************************/
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/proc_fs.h>
++#include <asm/io.h>
++#include <linux/string.h>
++
++#include "cpmacHalLx.h"
++#include "cpmac.h"
++
++/* PSP config headers */
++#include "psp_config_parse.h"
++#include "psp_config_mgr.h"
++
++/* Probe Debug Section*/
++
++/* debug */
++extern int cpmac_debug_mode;
++#define dbgPrint if (cpmac_debug_mode) printk
++#define errPrint printk
++
++char CpmacSignature[] = "Cpmac driver";
++static unsigned long irq_flags = 0;
++OS_SETUP *p_os_setup = NULL;
++
++extern int avalanche_request_intr_pacing(int, unsigned int, unsigned int);
++extern int avalanche_free_intr_pacing(unsigned int blk_num);
++
++/*----------------------------------------------------------------------------
++ * Parameter extracting functionalities.
++ *--------------------------------------------------------------------------*/
++static int os_find_parm_u_int(void *info_ptr, const char *param, unsigned int *val)
++{
++ int ret_val = 0;
++
++ if((ret_val = psp_config_get_param_uint(info_ptr, param, val)) == -1)
++ {
++ dbgPrint("Error: could not locate the requested \"%s\" param.\n",param);
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++static int os_find_parm_val(void *info_ptr, const char *param, void *val)
++{
++ int ret_val = 0;
++
++ if(psp_config_get_param_string(info_ptr, param, val) == -1)
++ {
++ dbgPrint("Error: could not locate the requested \"%s\" param.\n",param);
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++static int os_find_device(int unit, const char *find_name, void *device_info)
++{
++ int ret_val = 0;
++
++ if(psp_config_get((char *)find_name, unit, device_info) == -1)
++ {
++ dbgPrint("Error: could not locate the requested \"%s\" param.\n", find_name);
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++/*---------------------------------------------------------------------------
++ * Memory related OS abstraction.
++ *--------------------------------------------------------------------------*/
++void os_free(void *mem_ptr)
++{
++ kfree(mem_ptr);
++}
++
++void os_free_buffer(OS_RECEIVEINFO *osReceiveInfo, void *mem_ptr)
++{
++ dev_kfree_skb_any(osReceiveInfo);
++}
++
++void os_free_dev(void *mem_ptr)
++{
++ kfree(mem_ptr);
++}
++
++void os_free_dma_xfer(void *mem_ptr)
++{
++ kfree(mem_ptr);
++}
++
++static void *os_malloc(unsigned int size)
++{
++ return(kmalloc(size, GFP_KERNEL));
++}
++
++static void *os_malloc_dma_xfer(unsigned int size,
++ void *mem_base,
++ unsigned int mem_range)
++{
++ return(kmalloc(size, GFP_KERNEL));
++}
++
++static void *os_malloc_dev(unsigned int size)
++{
++ return(kmalloc(size, GFP_KERNEL));
++}
++
++
++/*----------------------------------------------------------------------------
++ * CRITICAL SECTION ENABLING/DISABLING.
++ *--------------------------------------------------------------------------*/
++static void os_critical_on(void)
++{
++ save_and_cli(irq_flags);
++}
++
++static void os_critical_off(void)
++{
++ restore_flags(irq_flags);
++}
++
++/*----------------------------------------------------------------------------
++ * Cache related abstraction
++ *--------------------------------------------------------------------------*/
++static void os_cache_invalidate(void *mem_ptr, int size)
++{
++ dma_cache_inv((unsigned long)mem_ptr, size);
++}
++
++static void os_cache_writeback(void *mem_ptr, int size)
++{
++ dma_cache_wback_inv((unsigned long)mem_ptr, size);
++}
++
++/*-----------------------------------------------------------------------------
++ * Support functions.
++ *---------------------------------------------------------------------------*/
++
++static void hal_drv_unregister_isr(OS_DEVICE *p_dev, int intr)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
++ intr = LNXINTNUM(intr);
++
++ free_irq(p_isr_cb_param->intr, p_isr_cb_param);
++
++ dbgPrint("cpmac_hal_unregister called for the intr %d for unit %x and isr_cb_param %x.\n",
++ intr, p_cpmac_priv->instance_num, (unsigned int )&p_cpmac_priv->cpmac_isr);
++}
++
++
++static void hal_drv_register_isr(OS_DEVICE *p_dev,
++ CPMAC_HAL_ISR_FUNC_T hal_isr, int intr)
++{
++ CPMAC_PRIVATE_INFO_T *p_cpmac_priv = p_dev->priv;
++ CPMAC_DRV_HAL_INFO_T *p_drv_hal = p_cpmac_priv->drv_hal;
++ CPMAC_ISR_INFO_T *p_isr_cb_param = &p_cpmac_priv->cpmac_isr;
++ intr = LNXINTNUM(intr);
++
++ dbgPrint("osRegister called for the intr %d for device %x and p_isr_cb_param %x.\n",
++ intr, (bit32u)p_dev, (bit32u)p_isr_cb_param);
++
++ p_isr_cb_param->owner = p_drv_hal;
++ p_isr_cb_param->hal_isr = hal_isr;
++ p_isr_cb_param->intr = intr;
++
++ tasklet_init(&p_isr_cb_param->tasklet, cpmac_handle_tasklet, (unsigned long)p_isr_cb_param);
++ dbgPrint("Success in registering irq %d for Cpmac unit# %d.\n", intr, p_cpmac_priv->instance_num);
++}
++
++/*---------------------------------------------------------------------------
++ * FUNCTIONS called by the CPMAC Net Device.
++ *-------------------------------------------------------------------------*/
++static int load_os_funcs(OS_FUNCTIONS *os_func)
++{
++ dbgPrint("os_init_module: Start\n");
++ if( os_func == 0 )
++ {
++ return(sizeof(OS_FUNCTIONS));
++ }
++
++ os_func->Control = cpmac_hal_control;
++ os_func->CriticalOn = os_critical_on;
++ os_func->CriticalOff = os_critical_off;
++ os_func->DataCacheHitInvalidate = os_cache_invalidate;
++ os_func->DataCacheHitWriteback = os_cache_writeback;
++ os_func->DeviceFindInfo = os_find_device;
++ os_func->DeviceFindParmUint = os_find_parm_u_int;
++ os_func->DeviceFindParmValue= os_find_parm_val;
++ os_func->Free = os_free;
++ os_func->FreeRxBuffer = os_free_buffer;
++ os_func->FreeDev = os_free_dev;
++ os_func->FreeDmaXfer = os_free_dma_xfer;
++ os_func->IsrRegister = hal_drv_register_isr;
++ os_func->IsrUnRegister = hal_drv_unregister_isr;
++ os_func->Malloc = os_malloc;
++ os_func->MallocDev = os_malloc_dev;
++ os_func->MallocDmaXfer = os_malloc_dma_xfer;
++ os_func->MallocRxBuffer = cpmac_hal_malloc_buffer;
++ os_func->Memset = memset;
++ os_func->Printf = printk;
++ os_func->Receive = cpmac_hal_receive;
++ os_func->SendComplete = cpmac_hal_send_complete;
++ os_func->Strcmpi = cpmac_ci_strcmp;
++ os_func->TeardownComplete = cpmac_hal_tear_down_complete;
++ os_func->Strstr = strstr;
++ os_func->Strtoul = simple_strtol;
++ os_func->Sprintf = sprintf;
++ os_func->Strlen = strlen;
++
++ dbgPrint("os_init_module: Leave\n");
++
++ return(0);
++}
++
++
++int cpmac_drv_init(CPMAC_DRV_HAL_INFO_T *p_drv_hal)
++{
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++
++ return(p_hal_funcs->Init(p_hal_dev));
++}
++
++int cpmac_drv_cleanup(CPMAC_DRV_HAL_INFO_T *p_drv_hal)
++{
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++
++ int ret_val = p_hal_funcs->Shutdown(p_hal_dev);
++
++#if 0
++ if(ret_val == 0)
++ kfree(p_hal_funcs);
++ else
++ ret_val = -1;
++#endif
++
++ kfree(p_drv_hal->os_funcs);
++
++ return (ret_val);
++}
++
++int cpmac_drv_tx_setup(HAL_FUNCTIONS *p_hal_funcs,
++ HAL_DEVICE *p_hal_dev,
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info)
++{
++ int ret_val = 0;
++ int count = 0;
++ CHANNEL_INFO chan_info;
++
++ /* Let's setup the TX Channels. */
++ for(count=0; count < p_tx_chan_info->cfg_chan; count++)
++ {
++ chan_info.Channel = count;
++ chan_info.Direction = DIRECTION_TX;
++ chan_info.TxNumBuffers = p_tx_chan_info->chan[count].num_BD;
++ chan_info.TxServiceMax = p_tx_chan_info->chan[count].service_max;
++ chan_info.TxNumQueues = 0;
++
++ if((ret_val = p_hal_funcs->ChannelSetup(p_hal_dev, &chan_info,
++ NULL)) != 0)
++ {
++ errPrint("Error in opening channel %d for TX.\n", count);
++ ret_val = -1;
++ break;
++ }
++
++ p_tx_chan_info->opened_chan++;
++ }
++
++ return(ret_val);
++}
++
++int cpmac_drv_rx_setup(HAL_FUNCTIONS *p_hal_funcs,
++ HAL_DEVICE *p_hal_dev,
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info)
++{
++ int ret_val = 0;
++ CHANNEL_INFO chan_info;
++
++ chan_info.Channel = 0;
++ chan_info.Direction = DIRECTION_RX;
++ chan_info.RxBufSize = p_rx_chan_info->chan[0].buffer_size;
++ chan_info.RxBufferOffset= p_rx_chan_info->chan[0].buffer_offset;
++ chan_info.RxNumBuffers = p_rx_chan_info->chan[0].num_BD;
++ chan_info.RxServiceMax = p_rx_chan_info->chan[0].service_max;
++
++ if(p_hal_funcs->ChannelSetup(p_hal_dev, &chan_info, p_rx_chan_info) != 0)
++ {
++ errPrint("Error in opening channel %d for RX.\n", 0);
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++int cpmac_drv_start(CPMAC_DRV_HAL_INFO_T *p_drv_hal,
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,
++ unsigned int flags)
++{
++ int ret_val = 0;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++
++ dbgPrint("It is in cpmac_drv_start for %x.\n", (unsigned int)p_drv_hal);
++
++ if(flags & CHAN_SETUP)
++ {
++ if(cpmac_drv_tx_setup(p_hal_funcs, p_hal_dev,
++ p_tx_chan_info)!=0)
++ {
++ errPrint("Failed to set up tx channel(s).\n");
++ ret_val = -1;
++ }
++ else if(cpmac_drv_rx_setup(p_hal_funcs, p_hal_dev,
++ p_rx_chan_info)!=0)
++ {
++ errPrint("Failed to set up rx channel.\n");
++ ret_val = -1;
++ }
++ else
++ {
++ ret_val = 0;
++ }
++ }
++
++ /* Error in setting up the Channels, quit. */
++ if((ret_val == 0) && (ret_val = p_hal_funcs->Open(p_hal_dev)) != 0)
++ {
++ errPrint("failed to open the HAL!!!.\n");
++ ret_val = -1;
++ }
++
++ return (ret_val);
++} /* cpmac_drv_start */
++
++
++
++int cpmac_drv_tx_teardown(HAL_FUNCTIONS *p_hal_funcs,
++ HAL_DEVICE *p_hal_dev,
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
++ unsigned int flags)
++{
++ int ret_val = 0;
++ int count = 0;
++
++ /* Let's setup the TX Channels. */
++ for(; p_tx_chan_info->opened_chan > 0;
++ p_tx_chan_info->opened_chan--, count++)
++ {
++ if(p_hal_funcs->ChannelTeardown(p_hal_dev, count, flags) != 0)
++ {
++ errPrint("Error in tearing down channel %d for TX.\n", count);
++ ret_val = -1;
++ break;
++ }
++ }
++
++ return(ret_val);
++}
++
++
++int cpmac_drv_rx_teardown(HAL_FUNCTIONS *p_hal_funcs,
++ HAL_DEVICE *p_hal_dev,
++ unsigned int flags)
++{
++ int ret_val = 0;
++
++ if(p_hal_funcs->ChannelTeardown(p_hal_dev, 0, flags) != 0)
++ {
++ errPrint("Error in tearing down channel %d for RX.\n", 0);
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++int cpmac_drv_stop(CPMAC_DRV_HAL_INFO_T *p_drv_hal,
++ CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,
++ unsigned int flags)
++{
++ HAL_DEVICE *p_hal_dev = p_drv_hal->hal_dev;
++ HAL_FUNCTIONS *p_hal_funcs = p_drv_hal->hal_funcs;
++ int ret_val = 0;
++
++ if(flags & CHAN_TEARDOWN)
++ {
++ unsigned int chan_flags = 0;
++
++ if(flags & FREE_BUFFER) chan_flags |= 0x4; /* full tear down */
++ if(flags & BLOCKING) chan_flags |= 0x8; /* blocking call */
++
++ dbgPrint("The teardown flags are %d.\n", flags);
++ dbgPrint("The teardown chan flags are %d.\n", chan_flags);
++
++ if(cpmac_drv_tx_teardown(p_hal_funcs, p_hal_dev,
++ p_tx_chan_info, chan_flags | 0x1) != 0)
++ {
++ ret_val = -1;
++ errPrint("The tx channel teardown failed.\n");
++ }
++ else if(cpmac_drv_rx_teardown(p_hal_funcs, p_hal_dev, chan_flags | 0x2) != 0)
++ {
++ ret_val = -1;
++ errPrint("The rx channel teardown failed.\n");
++ }
++ else
++ {
++ ;
++ }
++ }
++
++ if(ret_val == 0)
++ {
++ int close_flags = 1;
++
++ if(flags & FREE_BUFFER) close_flags = 2;
++// if(flags & COMPLETE) close_flags = 3;
++
++ if(p_hal_funcs->Close(p_hal_dev, close_flags) != 0)
++ {
++ ret_val = -1;
++ }
++ }
++
++ return(ret_val);
++}
++
++int cpmac_drv_init_module(CPMAC_DRV_HAL_INFO_T *p_drv_hal, OS_DEVICE *p_os_dev, int inst)
++{
++ int ret_val = -1;
++ int hal_func_size;
++
++ dbgPrint("Entering the CpmacInitModule for the inst %d \n", inst);
++
++ if((p_drv_hal->os_funcs = kmalloc(sizeof(OS_FUNCTIONS), GFP_KERNEL)) == NULL)
++ {
++ errPrint("Failed to allocate memory for OS_FUNCTIONS.\n");
++ }
++ else if(load_os_funcs(p_drv_hal->os_funcs) != 0)
++ {
++ errPrint("Failed to load OS funcs.\n");
++ os_free(p_drv_hal->os_funcs);
++ }
++ else if(halCpmacInitModule(&p_drv_hal->hal_dev, p_os_dev,
++ &p_drv_hal->hal_funcs, p_drv_hal->os_funcs,
++ sizeof(*p_drv_hal->os_funcs),
++ &hal_func_size, inst) != 0)
++ {
++ errPrint("halCpmacInitModule failed for inst %d \n", inst);
++ os_free(p_drv_hal->os_funcs);
++ }
++ else if(p_drv_hal->hal_funcs->Probe(p_drv_hal->hal_dev) != 0)
++ {
++ errPrint("halCpmacProbe failed for inst %d \n", inst);
++ os_free(p_drv_hal->os_funcs);
++ }
++ else
++ {
++ /* every thing went well. */
++ ret_val = 0;
++ }
++
++ return (ret_val);
++}
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.h linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.h
+--- linux.old/drivers/net/avalanche_cpmac/cpmacHalLx.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmacHalLx.h 2005-07-10 03:22:40.512160000 +0200
+@@ -0,0 +1,51 @@
++/******************************************************************************
++ * FILE PURPOSE: CPMAC Linux Device Driver HAL support Header
++ ******************************************************************************
++ * FILE NAME: cpmacHalVx.h
++ *
++ * DESCRIPTION: CPMAC Linux Device Driver Header
++ *
++ * REVISION HISTORY:
++ *
++ * Date Description Author
++ *-----------------------------------------------------------------------------
++ * 27 Nov 2002 Initial Creation Suraj S Iyer
++ * 09 Jun 2003 Updates for GA Suraj S Iyer
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __CPMAC_HAL_LX_H
++#define __CPMAC_HAL_LX_H
++
++
++typedef struct net_device OS_DEVICE;
++typedef struct sk_buff OS_RECEIVEINFO;
++typedef struct sk_buff OS_SENDINFO;
++
++#ifdef DEBUG
++typedef void HAL_RECEIVEINFO;
++typedef void HAL_DEVICE;
++typedef void OS_SETUP;
++#endif
++
++#define OS_SETUP void
++#define HAL_DEVICE void
++#define HAL_RECEIVEINFO void
++
++#define _CPHAL_CPMAC
++
++#include "cpswhal_cpmac.h"
++#include "cpmac.h"
++
++int cpmac_drv_start(CPMAC_DRV_HAL_INFO_T *, CPMAC_TX_CHAN_INFO_T*,
++ CPMAC_RX_CHAN_INFO_T *, unsigned int);
++int cpmac_drv_cleanup(CPMAC_DRV_HAL_INFO_T *);
++int cpmac_drv_init(CPMAC_DRV_HAL_INFO_T*);
++int cpmac_drv_close(CPMAC_DRV_HAL_INFO_T*);
++int cpmac_drv_open(CPMAC_DRV_HAL_INFO_T*);
++int cpmac_drv_init_module(CPMAC_DRV_HAL_INFO_T*, OS_DEVICE*, int);
++int cpmac_drv_stop(CPMAC_DRV_HAL_INFO_T *p_drv_hal,CPMAC_TX_CHAN_INFO_T *p_tx_chan_info,
++ CPMAC_RX_CHAN_INFO_T *p_rx_chan_info,unsigned int flags);
++
++#endif
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmac_reg.h linux.dev/drivers/net/avalanche_cpmac/cpmac_reg.h
+--- linux.old/drivers/net/avalanche_cpmac/cpmac_reg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmac_reg.h 2005-07-10 03:22:40.513160000 +0200
+@@ -0,0 +1,406 @@
++/****************************************************************************
++ TNETD73xx Software Support
++ Copyright(c) 2000, Texas Instruments Incorporated. All Rights Reserved.
++
++ FILE: cpmac_reg.h Register definitions for the CPMAC module
++
++ DESCRIPTION:
++ This include file contains register definitions for the
++ CPMAC module.
++
++ HISTORY:
++ 15Nov00 BEGR Original version written
++ 30May02 MICK Added bits for Int Vector
++ 19Sep02 MICK Added INT_ACK per Channel
++ 08Nov02 GDUN Updated to use base
++ 12Nov02 MICK Incorporated into CPHAL
++*****************************************************************************/
++#ifndef _INC_CPMAC_REG
++#define _INC_CPMAC_REG
++
++#ifndef MEM_PTR
++#define MEM_PTR volatile bit32u *
++#endif
++
++/***************************************************************************
++ *
++ * C P M A C M E M O R Y M A P
++ *
++ **************************************************************************/
++
++#define pCPMAC_TX_IDVER(base) ((MEM_PTR)(base+0x000))
++#define CPMAC_TX_IDVER(base) (*pCPMAC_TX_IDVER(base))
++#define pCPMAC_TX_CONTROL(base) ((MEM_PTR)(base+0x004))
++#define CPMAC_TX_CONTROL(base) (*pCPMAC_TX_CONTROL(base))
++#define pCPMAC_TX_TEARDOWN(base) ((MEM_PTR)(base+0x008))
++#define CPMAC_TX_TEARDOWN(base) (*pCPMAC_TX_TEARDOWN(base))
++#define pCPMAC_RX_IDVER(base) ((MEM_PTR)(base+0x010))
++#define CPMAC_RX_IDVER(base) (*pCPMAC_RX_IDVER(base))
++#define pCPMAC_RX_CONTROL(base) ((MEM_PTR)(base+0x014))
++#define CPMAC_RX_CONTROL(base) (*pCPMAC_RX_CONTROL(base))
++#define pCPMAC_RX_TEARDOWN(base) ((MEM_PTR)(base+0x018))
++#define CPMAC_RX_TEARDOWN(base) (*pCPMAC_RX_TEARDOWN(base))
++#define pCPMAC_RX_MBP_ENABLE(base) ((MEM_PTR)(base+0x100))
++#define CPMAC_RX_MBP_ENABLE(base) (*pCPMAC_RX_MBP_ENABLE(base))
++#define pCPMAC_RX_UNICAST_SET(base) ((MEM_PTR)(base+0x104))
++#define CPMAC_RX_UNICAST_SET(base) (*pCPMAC_RX_UNICAST_SET(base))
++#define pCPMAC_RX_UNICAST_CLEAR(base) ((MEM_PTR)(base+0x108))
++#define CPMAC_RX_UNICAST_CLEAR(base) (*pCPMAC_RX_UNICAST_CLEAR(base))
++#define pCPMAC_RX_MAXLEN(base) ((MEM_PTR)(base+0x10C))
++#define CPMAC_RX_MAXLEN(base) (*pCPMAC_RX_MAXLEN(base))
++#define pCPMAC_RX_BUFFER_OFFSET(base) ((MEM_PTR)(base+0x110))
++#define CPMAC_RX_BUFFER_OFFSET(base) (*pCPMAC_RX_BUFFER_OFFSET(base))
++#define pCPMAC_RX_FILTERLOWTHRESH(base) ((MEM_PTR)(base+0x114))
++#define CPMAC_RX_FILTERLOWTHRESH(base) (*pCPMAC_RX_FILTERLOWTHRESH(base))
++#define pCPMAC_RX0_FLOWTHRESH(base) ((MEM_PTR)(base+0x120))
++#define CPMAC_RX0_FLOWTHRESH(base) (*pCPMAC_RX0_FLOWTHRESH(base))
++#define pCPMAC_RX1_FLOWTHRESH(base) ((MEM_PTR)(base+0x124))
++#define CPMAC_RX1_FLOWTHRESH(base) (*pCPMAC_RX1_FLOWTHRESH(base))
++#define pCPMAC_RX2_FLOWTHRESH(base) ((MEM_PTR)(base+0x128))
++#define CPMAC_RX2_FLOWTHRESH(base) (*pCPMAC_RX2_FLOWTHRESH(base))
++#define pCPMAC_RX3_FLOWTHRESH(base) ((MEM_PTR)(base+0x12C))
++#define CPMAC_RX3_FLOWTHRESH(base) (*pCPMAC_RX3_FLOWTHRESH(base))
++#define pCPMAC_RX4_FLOWTHRESH(base) ((MEM_PTR)(base+0x130))
++#define CPMAC_RX4_FLOWTHRESH(base) (*pCPMAC_RX4_FLOWTHRESH(base))
++#define pCPMAC_RX5_FLOWTHRESH(base) ((MEM_PTR)(base+0x134))
++#define CPMAC_RX5_FLOWTHRESH(base) (*pCPMAC_RX5_FLOWTHRESH(base))
++#define pCPMAC_RX6_FLOWTHRESH(base) ((MEM_PTR)(base+0x138))
++#define CPMAC_RX6_FLOWTHRESH(base) (*pCPMAC_RX6_FLOWTHRESH(base))
++#define pCPMAC_RX7_FLOWTHRESH(base) ((MEM_PTR)(base+0x13C))
++#define CPMAC_RX7_FLOWTHRESH(base) (*pCPMAC_RX7_FLOWTHRESH(base))
++#define pCPMAC_RX0_FREEBUFFER(base) ((MEM_PTR)(base+0x140))
++#define CPMAC_RX0_FREEBUFFER(base) (*pCPMAC_RX0_FREEBUFFER(base))
++#define pCPMAC_RX1_FREEBUFFER(base) ((MEM_PTR)(base+0x144))
++#define CPMAC_RX1_FREEBUFFER(base) (*pCPMAC_RX1_FREEBUFFER(base))
++#define pCPMAC_RX2_FREEBUFFER(base) ((MEM_PTR)(base+0x148))
++#define CPMAC_RX2_FREEBUFFER(base) (*pCPMAC_RX2_FREEBUFFER(base))
++#define pCPMAC_RX3_FREEBUFFER(base) ((MEM_PTR)(base+0x14C))
++#define CPMAC_RX3_FREEBUFFER(base) (*pCPMAC_RX3_FREEBUFFER(base))
++#define pCPMAC_RX4_FREEBUFFER(base) ((MEM_PTR)(base+0x150))
++#define CPMAC_RX4_FREEBUFFER(base) (*pCPMAC_RX4_FREEBUFFER(base))
++#define pCPMAC_RX5_FREEBUFFER(base) ((MEM_PTR)(base+0x154))
++#define CPMAC_RX5_FREEBUFFER(base) (*pCPMAC_RX5_FREEBUFFER(base))
++#define pCPMAC_RX6_FREEBUFFER(base) ((MEM_PTR)(base+0x158))
++#define CPMAC_RX6_FREEBUFFER(base) (*pCPMAC_RX6_FREEBUFFER(base))
++#define pCPMAC_RX7_FREEBUFFER(base) ((MEM_PTR)(base+0x15C))
++#define CPMAC_RX7_FREEBUFFER(base) (*pCPMAC_RX7_FREEBUFFER(base))
++#define pCPMAC_MACCONTROL(base) ((MEM_PTR)(base+0x160))
++#define CPMAC_MACCONTROL(base) (*pCPMAC_MACCONTROL(base))
++#define pCPMAC_MACSTATUS(base) ((MEM_PTR)(base+0x164))
++#define CPMAC_MACSTATUS(base) (*pCPMAC_MACSTATUS(base))
++#define pCPMAC_EMCONTROL(base) ((MEM_PTR)(base+0x168))
++#define CPMAC_EMCONTROL(base) (*pCPMAC_EMCONTROL(base))
++#define pCPMAC_TX_INTSTAT_RAW(base) ((MEM_PTR)(base+0x170))
++#define CPMAC_TX_INTSTAT_RAW(base) (*pCPMAC_TX_INTSTAT_RAW(base))
++#define pCPMAC_TX_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x174))
++#define CPMAC_TX_INTSTAT_MASKED(base) (*pCPMAC_TX_INTSTAT_MASKED(base))
++#define pCPMAC_TX_INTMASK_SET(base) ((MEM_PTR)(base+0x178))
++#define CPMAC_TX_INTMASK_SET(base) (*pCPMAC_TX_INTMASK_SET(base))
++#define pCPMAC_TX_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x17C))
++#define CPMAC_TX_INTMASK_CLEAR(base) (*pCPMAC_TX_INTMASK_CLEAR(base))
++#define pCPMAC_MAC_IN_VECTOR(base) ((MEM_PTR)(base+0x180))
++#define CPMAC_MAC_IN_VECTOR(base) (*pCPMAC_MAC_IN_VECTOR(base))
++#define pCPMAC_MAC_EOI_VECTOR(base) ((MEM_PTR)(base+0x184))
++#define CPMAC_MAC_EOI_VECTOR(base) (*pCPMAC_MAC_EOI_VECTOR(base))
++#define pCPMAC_RX_INTSTAT_RAW(base) ((MEM_PTR)(base+0x190))
++#define CPMAC_RX_INTSTAT_RAW(base) (*pCPMAC_RX_INTSTAT_RAW(base))
++#define pCPMAC_RX_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x194))
++#define CPMAC_RX_INTSTAT_MASKED(base) (*pCPMAC_RX_INTSTAT_MASKED(base))
++#define pCPMAC_RX_INTMASK_SET(base) ((MEM_PTR)(base+0x198))
++#define CPMAC_RX_INTMASK_SET(base) (*pCPMAC_RX_INTMASK_SET(base))
++#define pCPMAC_RX_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x19C))
++#define CPMAC_RX_INTMASK_CLEAR(base) (*pCPMAC_RX_INTMASK_CLEAR(base))
++#define pCPMAC_MAC_INTSTAT_RAW(base) ((MEM_PTR)(base+0x1A0))
++#define CPMAC_MAC_INTSTAT_RAW(base) (*pCPMAC_MAC_INTSTAT_RAW(base))
++#define pCPMAC_MAC_INTSTAT_MASKED(base) ((MEM_PTR)(base+0x1A4))
++#define CPMAC_MAC_INTSTAT_MASKED(base) (*pCPMAC_MAC_INTSTAT_MASKED(base))
++#define pCPMAC_MAC_INTMASK_SET(base) ((MEM_PTR)(base+0x1A8))
++#define CPMAC_MAC_INTMASK_SET(base) (*pCPMAC_MAC_INTMASK_SET(base))
++#define pCPMAC_MAC_INTMASK_CLEAR(base) ((MEM_PTR)(base+0x1AC))
++#define CPMAC_MAC_INTMASK_CLEAR(base) (*pCPMAC_MAC_INTMASK_CLEAR(base))
++#define pCPMAC_MACADDRLO_0(base) ((MEM_PTR)(base+0x1B0))
++#define CPMAC_MACADDRLO_0(base) (*pCPMAC_MACADDRLO_0(base))
++#define pCPMAC_MACADDRLO_1(base) ((MEM_PTR)(base+0x1B4))
++#define CPMAC_MACADDRLO_1(base) (*pCPMAC_MACADDRLO_1(base))
++#define pCPMAC_MACADDRLO_2(base) ((MEM_PTR)(base+0x1B8))
++#define CPMAC_MACADDRLO_2(base) (*pCPMAC_MACADDRLO_2(base))
++#define pCPMAC_MACADDRLO_3(base) ((MEM_PTR)(base+0x1BC))
++#define CPMAC_MACADDRLO_3(base) (*pCPMAC_MACADDRLO_3(base))
++#define pCPMAC_MACADDRLO_4(base) ((MEM_PTR)(base+0x1C0))
++#define CPMAC_MACADDRLO_4(base) (*pCPMAC_MACADDRLO_4(base))
++#define pCPMAC_MACADDRLO_5(base) ((MEM_PTR)(base+0x1C4))
++#define CPMAC_MACADDRLO_5(base) (*pCPMAC_MACADDRLO_5(base))
++#define pCPMAC_MACADDRLO_6(base) ((MEM_PTR)(base+0x1C8))
++#define CPMAC_MACADDRLO_6(base) (*pCPMAC_MACADDRLO_6(base))
++#define pCPMAC_MACADDRLO_7(base) ((MEM_PTR)(base+0x1CC))
++#define CPMAC_MACADDRLO_7(base) (*pCPMAC_MACADDRLO_7(base))
++#define pCPMAC_MACADDRMID(base) ((MEM_PTR)(base+0x1D0))
++#define CPMAC_MACADDRMID(base) (*pCPMAC_MACADDRMID(base))
++#define pCPMAC_MACADDRHI(base) ((MEM_PTR)(base+0x1D4))
++#define CPMAC_MACADDRHI(base) (*pCPMAC_MACADDRHI(base))
++#define pCPMAC_MACHASH1(base) ((MEM_PTR)(base+0x1D8))
++#define CPMAC_MACHASH1(base) (*pCPMAC_MACHASH1(base))
++#define pCPMAC_MACHASH2(base) ((MEM_PTR)(base+0x1DC))
++#define CPMAC_MACHASH2(base) (*pCPMAC_MACHASH2(base))
++#define pCPMAC_BOFFTEST(base) ((MEM_PTR)(base+0x1E0))
++#define CPMAC_BOFFTEST(base) (*pCPMAC_BOFFTEST(base))
++#define pCPMAC_PACTEST(base) ((MEM_PTR)(base+0x1E4))
++#define CPMAC_PACTEST(base) (*pCPMAC_PACTEST(base))
++#define pCPMAC_RXPAUSE(base) ((MEM_PTR)(base+0x1E8))
++#define CPMAC_RXPAUSE(base) (*pCPMAC_RXPAUSE(base))
++#define pCPMAC_TXPAUSE(base) ((MEM_PTR)(base+0x1EC))
++#define CPMAC_TXPAUSE(base) (*pCPMAC_TXPAUSE(base))
++/* STATISTICS */
++#define pCPMAC_RXGOODFRAMES(base) ((MEM_PTR)(base+0x200))
++#define CPMAC_RXGOODFRAMES(base) (*pCPMAC_RXGOODFRAMES(base))
++#define pCPMAC_RXBROADCASTFRAMES(base) ((MEM_PTR)(base+0x204))
++#define CPMAC_RXBROADCASTFRAMES(base) (*pCPMAC_RXBROADCASTFRAMES(base))
++#define pCPMAC_RXMULTICASTFRAMES(base) ((MEM_PTR)(base+0x208))
++#define CPMAC_RXMULTICASTFRAMES(base) (*pCPMAC_RXMULTICASTFRAMES(base))
++#define pCPMAC_RXPAUSEFRAMES(base) ((MEM_PTR)(base+0x20C))
++#define CPMAC_RXPAUSEFRAMES(base) (*pCPMAC_RXPAUSEFRAMES(base))
++#define pCPMAC_RXCRCERRORS(base) ((MEM_PTR)(base+0x210))
++#define CPMAC_RXCRCERRORS(base) (*pCPMAC_RXCRCERRORS(base))
++#define pCPMAC_RXALIGNCODEERRORS(base) ((MEM_PTR)(base+0x214))
++#define CPMAC_RXALIGNCODEERRORS(base) (*pCPMAC_RXALIGNCODEERRORS(base))
++#define pCPMAC_RXOVERSIZEDFRAMES(base) ((MEM_PTR)(base+0x218))
++#define CPMAC_RXOVERSIZEDFRAMES(base) (*pCPMAC_RXOVERSIZEDFRAMES(base))
++#define pCPMAC_RXJABBERFRAMES(base) ((MEM_PTR)(base+0x21C))
++#define CPMAC_RXJABBERFRAMES(base) (*pCPMAC_RXJABBERFRAMES(base))
++#define pCPMAC_RXUNDERSIZEDFRAMES(base) ((MEM_PTR)(base+0x220))
++#define CPMAC_RXUNDERSIZEDFRAMES(base) (*pCPMAC_RXUNDERSIZEDFRAMES(base))
++#define pCPMAC_RXFRAGMENTS(base) ((MEM_PTR)(base+0x224))
++#define CPMAC_RXFRAGMENTS(base) (*pCPMAC_RXFRAGMENTS(base))
++#define pCPMAC_RXFILTEREDFRAMES(base) ((MEM_PTR)(base+0x228))
++#define CPMAC_RXFILTEREDFRAMES(base) (*pCPMAC_RXFILTEREDFRAMES(base))
++#define pCPMAC_RXQOSFILTEREDFRAMES(base) ((MEM_PTR)(base+0x22C))
++#define CPMAC_RXQOSFILTEREDFRAMES(base) (*pCPMAC_RXQOSFILTEREDFRAMES(base))
++#define pCPMAC_RXOCTETS(base) ((MEM_PTR)(base+0x230))
++#define CPMAC_RXOCTETS(base) (*pCPMAC_RXOCTETS(base))
++#define pCPMAC_TXGOODFRAMES(base) ((MEM_PTR)(base+0x234))
++#define CPMAC_TXGOODFRAMES(base) (*pCPMAC_TXGOODFRAMES(base))
++#define pCPMAC_TXBROADCASTFRAMES(base) ((MEM_PTR)(base+0x238))
++#define CPMAC_TXBROADCASTFRAMES(base) (*pCPMAC_TXBROADCASTFRAMES(base))
++#define pCPMAC_TXMULTICASTFRAMES(base) ((MEM_PTR)(base+0x23C))
++#define CPMAC_TXMULTICASTFRAMES(base) (*pCPMAC_TXMULTICASTFRAMES(base))
++#define pCPMAC_TXPAUSEFRAMES(base) ((MEM_PTR)(base+0x240))
++#define CPMAC_TXPAUSEFRAMES(base) (*pCPMAC_TXPAUSEFRAMES(base))
++#define pCPMAC_TXDEFERREDFRAMES(base) ((MEM_PTR)(base+0x244))
++#define CPMAC_TXDEFERREDFRAMES(base) (*pCPMAC_TXDEFERREDFRAMES(base))
++#define pCPMAC_TXCOLLISIONFRAMES(base) ((MEM_PTR)(base+0x248))
++#define CPMAC_TXCOLLISIONFRAMES(base) (*pCPMAC_TXCOLLISIONFRAMES(base))
++#define pCPMAC_TXSINGLECOLLFRAMES(base) ((MEM_PTR)(base+0x24C))
++#define CPMAC_TXSINGLECOLLFRAMES(base) (*pCPMAC_TXSINGLECOLLFRAMES(base))
++#define pCPMAC_TXMULTCOLLFRAMES(base) ((MEM_PTR)(base+0x250))
++#define CPMAC_TXMULTCOLLFRAMES(base) (*pCPMAC_TXMULTCOLLFRAMES(base))
++#define pCPMAC_TXEXCESSIVECOLLISIONS(base) ((MEM_PTR)(base+0x254))
++#define CPMAC_TXEXCESSIVECOLLISIONS(base) (*pCPMAC_TXEXCESSIVECOLLISIONS(base))
++#define pCPMAC_TXLATECOLLISIONS(base) ((MEM_PTR)(base+0x258))
++#define CPMAC_TXLATECOLLISIONS(base) (*pCPMAC_TXLATECOLLISIONS(base))
++#define pCPMAC_TXUNDERRUN(base) ((MEM_PTR)(base+0x25C))
++#define CPMAC_TXUNDERRUN(base) (*pCPMAC_TXUNDERRUN(base))
++#define pCPMAC_TXCARRIERSENSEERRORS(base) ((MEM_PTR)(base+0x260))
++#define CPMAC_TXCARRIERSENSEERRORS(base) (*pCPMAC_TXCARRIERSENSEERRORS(base))
++#define pCPMAC_TXOCTETS(base) ((MEM_PTR)(base+0x264))
++#define CPMAC_TXOCTETS(base) (*pCPMAC_TXOCTETS(base))
++#define pCPMAC_64OCTETFRAMES(base) ((MEM_PTR)(base+0x268))
++#define CPMAC_64OCTETFRAMES(base) (*pCPMAC_64OCTETFRAMES(base))
++#define pCPMAC_65T127OCTETFRAMES(base) ((MEM_PTR)(base+0x26C))
++#define CPMAC_65T127OCTETFRAMES(base) (*pCPMAC_65T127OCTETFRAMES(base))
++#define pCPMAC_128T255OCTETFRAMES(base) ((MEM_PTR)(base+0x270))
++#define CPMAC_128T255OCTETFRAMES(base) (*pCPMAC_128T255OCTETFRAMES(base))
++#define pCPMAC_256T511OCTETFRAMES(base) ((MEM_PTR)(base+0x274))
++#define CPMAC_256T511OCTETFRAMES(base) (*pCPMAC_256T511OCTETFRAMES(base))
++#define pCPMAC_512T1023OCTETFRAMES(base) ((MEM_PTR)(base+0x278))
++#define CPMAC_512T1023OCTETFRAMES(base) (*pCPMAC_512T1023OCTETFRAMES(base))
++#define pCPMAC_1024TUPOCTETFRAMES(base) ((MEM_PTR)(base+0x27C))
++#define CPMAC_1024TUPOCTETFRAMES(base) (*pCPMAC_1024TUPOCTETFRAMES(base))
++#define pCPMAC_NETOCTETS(base) ((MEM_PTR)(base+0x280))
++#define CPMAC_NETOCTETS(base) (*pCPMAC_NETOCTETS(base))
++#define pCPMAC_RXSOFOVERRUNS(base) ((MEM_PTR)(base+0x284))
++#define CPMAC_RXSOFOVERRUNS(base) (*pCPMAC_RXSOFOVERRUNS(base))
++#define pCPMAC_RXMOFOVERRUNS(base) ((MEM_PTR)(base+0x288))
++#define CPMAC_RXMOFOVERRUNS(base) (*pCPMAC_RXMOFOVERRUNS(base))
++#define pCPMAC_RXDMAOVERRUNS(base) ((MEM_PTR)(base+0x28C))
++#define CPMAC_RXDMAOVERRUNS(base) (*pCPMAC_RXDMAOVERRUNS(base))
++
++#define CPMAC_TX_HDP(base,ch) (*(MEM_PTR)(base+0x600+(4*ch)))
++#define pCPMAC_TX0_HDP(base) ((MEM_PTR)(base+0x600))
++#define CPMAC_TX0_HDP(base) (*pCPMAC_TX0_HDP(base))
++#define pCPMAC_TX1_HDP(base) ((MEM_PTR)(base+0x604))
++#define CPMAC_TX1_HDP(base) (*pCPMAC_TX1_HDP(base))
++#define pCPMAC_TX2_HDP(base) ((MEM_PTR)(base+0x608))
++#define CPMAC_TX2_HDP(base) (*pCPMAC_TX2_HDP(base))
++#define pCPMAC_TX3_HDP(base) ((MEM_PTR)(base+0x60C))
++#define CPMAC_TX3_HDP(base) (*pCPMAC_TX3_HDP(base))
++#define pCPMAC_TX4_HDP(base) ((MEM_PTR)(base+0x610))
++#define CPMAC_TX4_HDP(base) (*pCPMAC_TX4_HDP(base))
++#define pCPMAC_TX5_HDP(base) ((MEM_PTR)(base+0x614))
++#define CPMAC_TX5_HDP(base) (*pCPMAC_TX5_HDP(base))
++#define pCPMAC_TX6_HDP(base) ((MEM_PTR)(base+0x618))
++#define CPMAC_TX6_HDP(base) (*pCPMAC_TX6_HDP(base))
++#define pCPMAC_TX7_HDP(base) ((MEM_PTR)(base+0x61C))
++#define CPMAC_TX7_HDP(base) (*pCPMAC_TX7_HDP(base))
++#define CPMAC_RX_HDP(base,ch) (*(MEM_PTR)(base+0x620+(4*ch)))
++#define pCPMAC_RX0_HDP(base) ((MEM_PTR)(base+0x620))
++#define CPMAC_RX0_HDP(base) (*pCPMAC_RX0_HDP(base))
++#define pCPMAC_RX1_HDP(base) ((MEM_PTR)(base+0x624))
++#define CPMAC_RX1_HDP(base) (*pCPMAC_RX1_HDP(base))
++#define pCPMAC_RX2_HDP(base) ((MEM_PTR)(base+0x628))
++#define CPMAC_RX2_HDP(base) (*pCPMAC_RX2_HDP(base))
++#define pCPMAC_RX3_HDP(base) ((MEM_PTR)(base+0x62C))
++#define CPMAC_RX3_HDP(base) (*pCPMAC_RX3_HDP(base))
++#define pCPMAC_RX4_HDP(base) ((MEM_PTR)(base+0x630))
++#define CPMAC_RX4_HDP(base) (*pCPMAC_RX4_HDP(base))
++#define pCPMAC_RX5_HDP(base) ((MEM_PTR)(base+0x634))
++#define CPMAC_RX5_HDP(base) (*pCPMAC_RX5_HDP(base))
++#define pCPMAC_RX6_HDP(base) ((MEM_PTR)(base+0x638))
++#define CPMAC_RX6_HDP(base) (*pCPMAC_RX6_HDP(base))
++#define pCPMAC_RX7_HDP(base) ((MEM_PTR)(base+0x63C))
++#define CPMAC_RX7_HDP(base) (*pCPMAC_RX7_HDP(base))
++
++
++#define CPMAC_TX_INT_ACK(base,ch) (*(MEM_PTR)(base+0x640+(4*ch)))
++
++#define pCPMAC_TX0_INT_ACK(base) ((MEM_PTR)(base+0x640))
++#define CPMAC_TX0_INT_ACK(base) (*pCPMAC_TX0_INT_ACK(base))
++#define pCPMAC_TX1_INT_ACK(base) ((MEM_PTR)(base+0x644))
++#define CPMAC_TX1_INT_ACK(base) (*pCPMAC_TX1_INT_ACK(base))
++#define pCPMAC_TX2_INT_ACK(base) ((MEM_PTR)(base+0x648))
++#define CPMAC_TX2_INT_ACK(base) (*pCPMAC_TX2_INT_ACK(base))
++#define pCPMAC_TX3_INT_ACK(base) ((MEM_PTR)(base+0x64C))
++#define CPMAC_TX3_INT_ACK(base) (*pCPMAC_TX3_INT_ACK(base))
++#define pCPMAC_TX4_INT_ACK(base) ((MEM_PTR)(base+0x650))
++#define CPMAC_TX4_INT_ACK(base) (*pCPMAC_TX4_INT_ACK(base))
++#define pCPMAC_TX5_INT_ACK(base) ((MEM_PTR)(base+0x654))
++#define CPMAC_TX5_INT_ACK(base) (*pCPMAC_TX5_INT_ACK(base))
++#define pCPMAC_TX6_INT_ACK(base) ((MEM_PTR)(base+0x658))
++#define CPMAC_TX6_INT_ACK(base) (*pCPMAC_TX6_INT_ACK(base))
++#define pCPMAC_TX7_INT_ACK(base) ((MEM_PTR)(base+0x65C))
++#define CPMAC_TX7_INT_ACK(base) (*pCPMAC_TX7_INT_ACK(base))
++#define CPMAC_RX_INT_ACK(base,ch) (*(MEM_PTR)(base+0x660+(4*ch)))
++
++#define pCPMAC_RX0_INT_ACK(base) ((MEM_PTR)(base+0x660))
++#define CPMAC_RX0_INT_ACK(base) (*pCPMAC_RX0_INT_ACK(base))
++#define pCPMAC_RX1_INT_ACK(base) ((MEM_PTR)(base+0x664))
++#define CPMAC_RX1_INT_ACK(base) (*pCPMAC_RX1_INT_ACK(base))
++#define pCPMAC_RX2_INT_ACK(base) ((MEM_PTR)(base+0x668))
++#define CPMAC_RX2_INT_ACK(base) (*pCPMAC_RX2_INT_ACK(base))
++#define pCPMAC_RX3_INT_ACK(base) ((MEM_PTR)(base+0x66C))
++#define CPMAC_RX3_INT_ACK(base) (*pCPMAC_RX3_INT_ACK(base))
++#define pCPMAC_RX4_INT_ACK(base) ((MEM_PTR)(base+0x670))
++#define CPMAC_RX4_INT_ACK(base) (*pCPMAC_RX4_INT_ACK(base))
++#define pCPMAC_RX5_INT_ACK(base) ((MEM_PTR)(base+0x674))
++#define CPMAC_RX5_INT_ACK(base) (*pCPMAC_RX5_INT_ACK(base))
++#define pCPMAC_RX6_INT_ACK(base) ((MEM_PTR)(base+0x678))
++#define CPMAC_RX6_INT_ACK(base) (*pCPMAC_RX6_INT_ACK(base))
++#define pCPMAC_RX7_INT_ACK(base) ((MEM_PTR)(base+0x67C))
++#define CPMAC_RX7_INT_ACK(base) (*pCPMAC_RX7_INT_ACK(base))
++
++/****************************************************************************/
++/* */
++/* R E G I S T E R B I T D E F I N I T I O N S */
++/* */
++/****************************************************************************/
++
++/* TX_CONTROL */
++
++#define TX_EN (1 << 0)
++
++/* RX_CONTROL */
++
++#define RX_EN (1 << 0)
++
++/* RX_MBP_ENABLE */
++
++#define RX_PASS_CRC (1 << 30)
++#define RX_QOS_EN (1 << 29)
++#define RX_NO_CHAIN (1 << 28)
++
++#define RX_CMF_EN (1 << 24)
++#define RX_CSF_EN (1 << 23)
++#define RX_CEF_EN (1 << 22)
++#define RX_CAF_EN (1 << 21)
++
++#define RX_PROM_CH(n) (n << 16)
++#define RX_PROM_CH_MASK RX_PROM_CH(7)
++#define RX_PROM_CH_7 RX_PROM_CH(7)
++#define RX_PROM_CH_6 RX_PROM_CH(6)
++#define RX_PROM_CH_5 RX_PROM_CH(5)
++#define RX_PROM_CH_4 RX_PROM_CH(4)
++#define RX_PROM_CH_3 RX_PROM_CH(3)
++#define RX_PROM_CH_2 RX_PROM_CH(2)
++#define RX_PROM_CH_1 RX_PROM_CH(1)
++#define RX_PROM_CH_0 RX_PROM_CH(0)
++
++#define RX_BROAD_EN (1 << 13)
++
++#define RX_BROAD_CH(n) (n << 8)
++#define RX_BROAD_CH_MASK RX_BROAD_CH(7)
++#define RX_BROAD_CH_7 RX_BROAD_CH(7)
++#define RX_BROAD_CH_6 RX_BROAD_CH(6)
++#define RX_BROAD_CH_5 RX_BROAD_CH(5)
++#define RX_BROAD_CH_4 RX_BROAD_CH(4)
++#define RX_BROAD_CH_3 RX_BROAD_CH(3)
++#define RX_BROAD_CH_2 RX_BROAD_CH(2)
++#define RX_BROAD_CH_1 RX_BROAD_CH(1)
++#define RX_BROAD_CH_0 RX_BROAD_CH(0)
++
++#define RX_MULT_EN (1 << 5)
++
++#define RX_MULT_CH(n) (n << 0)
++#define RX_MULT_CH_MASK RX_MULT_CH(7)
++#define RX_MULT_CH_7 RX_MULT_CH(7)
++#define RX_MULT_CH_6 RX_MULT_CH(6)
++#define RX_MULT_CH_5 RX_MULT_CH(5)
++#define RX_MULT_CH_4 RX_MULT_CH(4)
++#define RX_MULT_CH_3 RX_MULT_CH(3)
++#define RX_MULT_CH_2 RX_MULT_CH(2)
++#define RX_MULT_CH_1 RX_MULT_CH(1)
++#define RX_MULT_CH_0 RX_MULT_CH(0)
++
++
++
++/* RX_UNICAST_SET */
++
++#define RX_CH7_EN (1 << 7)
++#define RX_CH6_EN (1 << 6)
++#define RX_CH5_EN (1 << 5)
++#define RX_CH4_EN (1 << 4)
++#define RX_CH3_EN (1 << 3)
++#define RX_CH2_EN (1 << 2)
++#define RX_CH1_EN (1 << 1)
++#define RX_CH0_EN (1 << 0)
++
++
++
++/* MAC control */
++#define TX_PTYPE (1 << 9)
++#define TX_PACE (1 << 6)
++#define MII_EN (1 << 5)
++#define TX_FLOW_EN (1 << 4)
++#define RX_FLOW_EN (1 << 3)
++#define MTEST (1 << 2)
++#define CTRL_LOOPBACK (1 << 1)
++#define FULLDUPLEX (1 << 0)
++
++
++/* IntVec definitions */
++#define MAC_IN_VECTOR_STATUS_INT (1 << 19)
++#define MAC_IN_VECTOR_HOST_INT (1 << 18)
++#define MAC_IN_VECTOR_RX_INT_OR (1 << 17)
++#define MAC_IN_VECTOR_TX_INT_OR (1 << 16)
++#define MAC_IN_VECTOR_RX_INT_VEC (7 << 8)
++#define MAC_IN_VECTOR_TX_INT_VEC (7)
++
++
++/* MacStatus */
++
++#define TX_HOST_ERR_CODE (0xF << 20)
++#define TX_ERR_CH (0x7 << 16)
++#define RX_HOST_ERR_CODE (0xF << 12)
++#define RX_ERR_CH (0x7 << 8)
++#define RX_QOS_ACT (1 << 2)
++#define RX_FLOW_ACT (1 << 1)
++#define TX_FLOW_ACT (1 << 0)
++#endif _INC_CPMAC_REG
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmdio.c linux.dev/drivers/net/avalanche_cpmac/cpmdio.c
+--- linux.old/drivers/net/avalanche_cpmac/cpmdio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmdio.c 2005-07-10 04:06:50.491302256 +0200
+@@ -0,0 +1,960 @@
++/***************************************************************************
++** TNETD53xx Software Support
++** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
++**
++** FILE: cpmdio.c
++**
++** DESCRIPTION:
++** MDIO Polling State Machine API. Functions will enable mii-Phy
++** negotiation.
++**
++** HISTORY:
++** 01Jan01 Denis, Bill Original
++** 27Mar02 Michael Hanrahan (modified from emacmdio.c)
++** 07May02 Michael Hanrahan replaced clockwait for code delay
++** 10Jul02 Michael Hanrahan more debug, if fallback link is selected
++*****************************************************************************/
++#define __CPHAL_CPMDIO
++
++#include "mdio_reg.h"
++
++#ifdef _CPHAL_CPMAC
++#define mdioPrintf PhyDev->HalDev->OsFunc->Printf
++#else
++#define mdioPrintf printf
++#endif
++
++typedef struct _phy_device
++{
++ bit32u miibase;
++ bit32u inst;
++ bit32u PhyState;
++ bit32u MdixMask;
++ bit32u PhyMask;
++ bit32u MLinkMask;
++ bit32u PhyMode;
++#ifdef _CPHAL_CPMAC
++ HAL_DEVICE *HalDev;
++#endif
++} _PHY_DEVICE;
++
++static void _mdioDelayEmulate(PHY_DEVICE *PhyDev, int ClockWait);
++static void _mdioWaitForAccessComplete(PHY_DEVICE *PhyDev);
++static void _mdioUserAccess(PHY_DEVICE *PhyDev, bit32u method, bit32u regadr, bit32u phyadr, bit32u data);
++static bit32u _mdioUserAccessRead(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr);
++static void _mdioUserAccessWrite(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr, bit32u data);
++
++static void _mdioDisablePhy(PHY_DEVICE *PhyDev,bit32u PhyNum);
++static void _mdioPhyTimeOut(PHY_DEVICE *PhyDev);
++static void _mdioResetPhy(PHY_DEVICE *PhyDev,bit32u PhyNum);
++
++static void _mdioDumpPhy(PHY_DEVICE *PhyDev, bit32u p);
++static void _mdioDumpState(PHY_DEVICE *PhyDev);
++
++/* Auto Mdix */
++static void _mdioMdixDelay(PHY_DEVICE *PhyDev);
++static int _mdioMdixSupported(PHY_DEVICE *PhyDev);
++
++static void _MdioDefaultState (PHY_DEVICE *PhyDev);
++static void _MdioFindingState (PHY_DEVICE *PhyDev);
++static void _MdioFoundState (PHY_DEVICE *PhyDev);
++static void _MdioInitState (PHY_DEVICE *PhyDev);
++static void _MdioLinkedState (PHY_DEVICE *PhyDev);
++static void _MdioLinkWaitState (PHY_DEVICE *PhyDev);
++static void _MdioLoopbackState (PHY_DEVICE *PhyDev);
++static void _MdioNwayStartState(PHY_DEVICE *PhyDev);
++static void _MdioNwayWaitState (PHY_DEVICE *PhyDev);
++
++
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++
++#ifndef FALSE
++#define FALSE (1==2)
++#endif
++
++#define PHY_NOT_FOUND 0xFFFF /* Used in Phy Detection */
++
++/*PhyState breakout */
++
++#define PHY_DEV_OFFSET (0)
++#define PHY_DEV_SIZE (5) /* 5 Bits used */
++#define PHY_DEV_MASK (0x1f<<PHY_DEV_OFFSET)
++
++#define PHY_STATE_OFFSET (PHY_DEV_SIZE+PHY_DEV_OFFSET)
++#define PHY_STATE_SIZE (5) /* 10 Bits used */
++#define PHY_STATE_MASK (0x1f<<PHY_STATE_OFFSET)
++ #define INIT (1<<PHY_STATE_OFFSET)
++ #define FINDING (2<<PHY_STATE_OFFSET)
++ #define FOUND (3<<PHY_STATE_OFFSET)
++ #define NWAY_START (4<<PHY_STATE_OFFSET)
++ #define NWAY_WAIT (5<<PHY_STATE_OFFSET)
++ #define LINK_WAIT (6<<PHY_STATE_OFFSET)
++ #define LINKED (7<<PHY_STATE_OFFSET)
++ #define LOOPBACK (8<<PHY_STATE_OFFSET)
++
++#define PHY_SPEED_OFFSET (PHY_STATE_OFFSET+PHY_STATE_SIZE)
++#define PHY_SPEED_SIZE (1) /* 11 Bits used */
++#define PHY_SPEED_MASK (1<<PHY_SPEED_OFFSET)
++
++#define PHY_DUPLEX_OFFSET (PHY_SPEED_OFFSET+PHY_SPEED_SIZE)
++#define PHY_DUPLEX_SIZE (1) /* 12 Bits used */
++#define PHY_DUPLEX_MASK (1<<PHY_DUPLEX_OFFSET)
++
++#define PHY_TIM_OFFSET (PHY_DUPLEX_OFFSET+PHY_DUPLEX_SIZE)
++#define PHY_TIM_SIZE (10) /* 22 Bits used */
++#define PHY_TIM_MASK (0x3ff<<PHY_TIM_OFFSET)
++ #define PHY_FIND_TO ( 2<<PHY_TIM_OFFSET)
++ #define PHY_RECK_TO (200<<PHY_TIM_OFFSET)
++ #define PHY_LINK_TO (500<<PHY_TIM_OFFSET)
++ #define PHY_NWST_TO (500<<PHY_TIM_OFFSET)
++ #define PHY_NWDN_TO (800<<PHY_TIM_OFFSET)
++ #define PHY_MDIX_TO (274<<PHY_TIM_OFFSET) /* 2.74 Seconds <--Spec and empirical */
++
++#define PHY_SMODE_OFFSET (PHY_TIM_OFFSET+PHY_TIM_SIZE)
++#define PHY_SMODE_SIZE (5) /* 27 Bits used */
++#define PHY_SMODE_MASK (0x1f<<PHY_SMODE_OFFSET)
++ #define SMODE_AUTO (0x10<<PHY_SMODE_OFFSET)
++ #define SMODE_FD100 (0x08<<PHY_SMODE_OFFSET)
++ #define SMODE_HD100 (0x04<<PHY_SMODE_OFFSET)
++ #define SMODE_FD10 (0x02<<PHY_SMODE_OFFSET)
++ #define SMODE_HD10 (0x01<<PHY_SMODE_OFFSET)
++ #define SMODE_ALL (0x1f<<PHY_SMODE_OFFSET)
++
++#define PHY_CHNG_OFFSET (PHY_SMODE_OFFSET+PHY_SMODE_SIZE)
++#define PHY_CHNG_SIZE (1) /* 28 Bits used */
++#define PHY_CHNG_MASK (1<<PHY_CHNG_OFFSET)
++ #define PHY_CHANGE (1<<PHY_CHNG_OFFSET)
++
++#define PHY_TIMEDOUT_OFFSET (PHY_CHNG_OFFSET+PHY_CHNG_SIZE)
++#define PHY_TIMEDOUT_SIZE (1) /* 29 Bits used */
++#define PHY_TIMEDOUT_MASK (1<<PHY_TIMEDOUT_OFFSET)
++ #define PHY_MDIX_SWITCH (1<<PHY_TIMEDOUT_OFFSET)
++
++#define PHY_MDIX_OFFSET (PHY_TIMEDOUT_OFFSET+PHY_TIMEDOUT_SIZE)
++#define PHY_MDIX_SIZE (1) /* 30 Bits used */
++#define PHY_MDIX_MASK (1<<PHY_MDIX_OFFSET)
++ #define PHY_MDIX (1<<PHY_MDIX_OFFSET)
++
++static char *lstate[]={"NULL","INIT","FINDING","FOUND","NWAY_START","NWAY_WAIT","LINK_WAIT","LINKED", "LOOPBACK"};
++static int cpMacDebug;
++
++/* Local MDIO Register Macros */
++
++#define myMDIO_ALIVE MDIO_ALIVE (PhyDev->miibase)
++#define myMDIO_CONTROL MDIO_CONTROL (PhyDev->miibase)
++#define myMDIO_LINK MDIO_LINK (PhyDev->miibase)
++#define myMDIO_LINKINT MDIO_LINKINT (PhyDev->miibase)
++#define myMDIO_USERACCESS MDIO_USERACCESS(PhyDev->miibase, PhyDev->inst)
++#define myMDIO_USERPHYSEL MDIO_USERPHYSEL(PhyDev->miibase, PhyDev->inst)
++#define myMDIO_VER MDIO_VER (PhyDev->miibase)
++
++#ifndef VOLATILE32
++#define VOLATILE32(addr) (*((volatile bit32u *)(addr)))
++#endif
++
++/************************************
++***
++*** Delays at least ClockWait cylces
++*** before returning
++***
++**************************************/
++void _mdioDelayEmulate(PHY_DEVICE *PhyDev, int ClockWait)
++ {
++#ifdef _CPHAL_CPMAC /*+RC3.02*/
++ HAL_DEVICE *HalDev = PhyDev->HalDev; /*+RC3.02*/
++ osfuncSleep((int*)&ClockWait); /*+RC3.02*/
++#else /*+RC3.02*/
++ volatile bit32u i=0;
++ while(ClockWait--)
++ {
++ i |= myMDIO_LINK; /* MDIO register access to burn cycles */
++ }
++#endif
++ }
++
++void _mdioWaitForAccessComplete(PHY_DEVICE *PhyDev)
++ {
++ while((myMDIO_USERACCESS & MDIO_USERACCESS_GO)!=0)
++ {
++ }
++ }
++
++void _mdioUserAccess(PHY_DEVICE *PhyDev, bit32u method, bit32u regadr, bit32u phyadr, bit32u data)
++ {
++ bit32u control;
++
++ control = MDIO_USERACCESS_GO |
++ (method) |
++ (((regadr) << 21) & MDIO_USERACCESS_REGADR) |
++ (((phyadr) << 16) & MDIO_USERACCESS_PHYADR) |
++ ((data) & MDIO_USERACCESS_DATA);
++
++ myMDIO_USERACCESS = control;
++ }
++
++
++
++/************************************
++***
++*** Waits for MDIO_USERACCESS to be ready and reads data
++*** If 'WaitForData' set, waits for read to complete and returns Data,
++*** otherwise returns 0
++*** Note: 'data' is 16 bits but we use 32 bits
++*** to be consistent with rest of the code.
++***
++**************************************/
++bit32u _mdioUserAccessRead(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr)
++ {
++
++ _mdioWaitForAccessComplete(PhyDev); /* Wait until UserAccess ready */
++ _mdioUserAccess(PhyDev, MDIO_USERACCESS_READ, regadr, phyadr, 0);
++ _mdioWaitForAccessComplete(PhyDev); /* Wait for Read to complete */
++
++ return(myMDIO_USERACCESS & MDIO_USERACCESS_DATA);
++ }
++
++
++/************************************
++***
++*** Waits for MDIO_USERACCESS to be ready and writes data
++***
++**************************************/
++void _mdioUserAccessWrite(PHY_DEVICE *PhyDev, bit32u regadr, bit32u phyadr, bit32u data)
++ {
++ _mdioWaitForAccessComplete(PhyDev); /* Wait until UserAccess ready */
++ _mdioUserAccess(PhyDev, MDIO_USERACCESS_WRITE, regadr, phyadr, data);
++ }
++
++void _mdioDumpPhyDetailed(PHY_DEVICE *PhyDev)
++{
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum;
++ int RegData;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ RegData = _mdioUserAccessRead(PhyDev, 0, PhyNum);
++ mdioPrintf("PhyControl: %04X, Lookback=%s, Speed=%s, Duplex=%s\n",
++ RegData,
++ RegData&PHY_LOOP?"On":"Off",
++ RegData&PHY_100?"100":"10",
++ RegData&PHY_FD?"Full":"Half");
++ RegData = _mdioUserAccessRead(PhyDev, 1, PhyNum);
++ mdioPrintf("PhyStatus: %04X, AutoNeg=%s, Link=%s\n",
++ RegData,
++ RegData&NWAY_COMPLETE?"Complete":"NotComplete",
++ RegData&PHY_LINKED?"Up":"Down");
++ RegData = _mdioUserAccessRead(PhyDev, 4, PhyNum);
++ mdioPrintf("PhyMyCapability: %04X, 100FD=%s, 100HD=%s, 10FD=%s, 10HD=%s\n",
++ RegData,
++ RegData&NWAY_FD100?"Yes":"No",
++ RegData&NWAY_HD100?"Yes":"No",
++ RegData&NWAY_FD10?"Yes":"No",
++ RegData&NWAY_HD10?"Yes":"No");
++
++ RegData = _mdioUserAccessRead(PhyDev, 5, PhyNum);
++ mdioPrintf("PhyPartnerCapability: %04X, 100FD=%s, 100HD=%s, 10FD=%s, 10HD=%s\n",
++ RegData,
++ RegData&NWAY_FD100?"Yes":"No",
++ RegData&NWAY_HD100?"Yes":"No",
++ RegData&NWAY_FD10?"Yes":"No",
++ RegData&NWAY_HD10?"Yes":"No");
++}
++void _mdioDumpPhy(PHY_DEVICE *PhyDev, bit32u p)
++ {
++ bit32u j,n,PhyAcks;
++ bit32u PhyRegAddr;
++ bit32u phy_num;
++ bit32u PhyMask = PhyDev->PhyMask;
++
++ PhyAcks=myMDIO_ALIVE;
++ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
++
++ for(phy_num=0,j=1;phy_num<32;phy_num++,j<<=1)
++ {
++ if (PhyAcks&j)
++ {
++ mdioPrintf("%2d%s:",phy_num,(phy_num==p)?">":" ");
++ for(PhyRegAddr=0;PhyRegAddr<6;PhyRegAddr++)
++ {
++ n = _mdioUserAccessRead(PhyDev, PhyRegAddr, phy_num);
++ mdioPrintf(" %04x",n&0x0ffff);
++ }
++ mdioPrintf("\n");
++ }
++ }
++ _mdioDumpPhyDetailed(PhyDev);
++ }
++
++void _mdioDumpState(PHY_DEVICE *PhyDev)
++ {
++ bit32u state = PhyDev->PhyState;
++
++ if (!cpMacDebug) return;
++
++ mdioPrintf("Phy: %d, ",(state&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
++ mdioPrintf("State: %d/%s, ",(state&PHY_STATE_MASK)>>PHY_STATE_OFFSET,lstate[(state&PHY_STATE_MASK)>>PHY_STATE_OFFSET]);
++ mdioPrintf("Speed: %d, ",(state&PHY_SPEED_MASK)>>PHY_SPEED_OFFSET);
++ mdioPrintf("Dup: %d, ",(state&PHY_DUPLEX_MASK)>>PHY_DUPLEX_OFFSET);
++ mdioPrintf("Tim: %d, ",(state&PHY_TIM_MASK)>>PHY_TIM_OFFSET);
++ mdioPrintf("SMode: %d, ",(state&PHY_SMODE_MASK)>>PHY_SMODE_OFFSET);
++ mdioPrintf("Chng: %d",(state&PHY_CHNG_MASK)>>PHY_CHNG_OFFSET);
++ mdioPrintf("\n");
++
++ if (((state&PHY_STATE_MASK)!=FINDING)&&((state&PHY_STATE_MASK)!=INIT))
++ _mdioDumpPhy(PhyDev, (state&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
++ }
++
++
++void _mdioResetPhy(PHY_DEVICE *PhyDev,bit32u PhyNum)
++ {
++ bit16u PhyControlReg;
++
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_RESET);
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioPhYReset(%d)\n",PhyNum);
++
++ /* Read control register until Phy Reset is complete */
++ do
++ {
++ PhyControlReg = _mdioUserAccessRead(PhyDev, PHY_CONTROL_REG, PhyNum);
++ }
++ while (PhyControlReg & PHY_RESET); /* Wait for Reset to clear */
++ }
++
++void _mdioDisablePhy(PHY_DEVICE *PhyDev,bit32u PhyNum)
++ {
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_ISOLATE|PHY_PDOWN);
++
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioDisablePhy(%d)\n",PhyNum);
++
++ }
++
++void _MdioInitState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u CurrentState;
++
++ CurrentState=*PhyState;
++ CurrentState=(CurrentState&~PHY_TIM_MASK)|(PHY_FIND_TO);
++ CurrentState=(CurrentState&~PHY_STATE_MASK)|(FINDING);
++ CurrentState=(CurrentState&~PHY_SPEED_MASK);
++ CurrentState=(CurrentState&~PHY_DUPLEX_MASK);
++ CurrentState|=PHY_CHANGE;
++
++ *PhyState=CurrentState;
++
++ }
++
++void _MdioFindingState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyMask = PhyDev->PhyMask;
++ bit32u PhyNum,i,j,PhyAcks;
++
++
++ PhyNum=PHY_NOT_FOUND;
++
++ if (*PhyState&PHY_TIM_MASK)
++ {
++ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
++ }
++ else
++ {
++ PhyAcks=myMDIO_ALIVE;
++ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
++
++ for(i=0,j=1;(i<32)&&((j&PhyAcks)==0);i++,j<<=1);
++
++ if ((PhyAcks)&&(i<32)) PhyNum=i;
++ if (PhyNum!=PHY_NOT_FOUND)
++ {
++ /* Phy Found! */
++ *PhyState=(*PhyState&~PHY_DEV_MASK)|((PhyNum&PHY_DEV_MASK)<<PHY_DEV_OFFSET);
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|(FOUND);
++ *PhyState|=PHY_CHANGE;
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioFindingState: PhyNum: %d\n",PhyNum);
++ }
++ else
++ {
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioFindingState: Timed Out looking for a Phy!\n");
++ *PhyState|=PHY_RECK_TO; /* This state currently has no support?*/
++ }
++ }
++ }
++
++void _MdioFoundState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyMask = PhyDev->PhyMask;
++ bit32u MLinkMask = PhyDev->MLinkMask;
++ bit32u PhyNum,PhyStatus,NWAYadvertise,m,phynum,i,j,PhyAcks;
++ bit32u PhySel;
++
++ if ((*PhyState&PHY_SMODE_MASK)==0) return;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ PhyAcks=myMDIO_ALIVE;
++ PhyAcks&=PhyMask; /* Only interested in 'our' Phys */
++
++ /* Will now isolate all our Phys, except the one we have decided to use */
++ for(phynum=0,j=1;phynum<32;phynum++,j<<=1)
++ {
++ if (PhyAcks&j)
++ {
++ if (phynum!=PhyNum) /* Do not disabled Found Phy */
++ _mdioDisablePhy(PhyDev,phynum);
++ }
++ }
++
++ /* Reset the Phy and proceed with auto-negotiation */
++ _mdioResetPhy(PhyDev,PhyNum);
++
++ /* Now setup the MDIOUserPhySel register */
++
++ PhySel=PhyNum; /* Set the phy address */
++
++ /* Set the way Link will be Monitored */
++ /* Check the Link Selection Method */
++ if ((1 << PhyNum) & MLinkMask)
++ PhySel |= MDIO_USERPHYSEL_LINKSEL;
++
++ myMDIO_USERPHYSEL = PhySel; /* update PHYSEL */
++
++ /* Get the Phy Status */
++ PhyStatus = _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
++
++
++#ifdef _CPHAL_CPMAC
++ /* For Phy Internal loopback test, need to wait until Phy
++ found, then set Loopback */
++ if (PhyDev->HalDev->MdioConnect & _CPMDIO_LOOPBK)
++ {
++ /* Set Phy in Loopback */
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, PHY_LOOP|PHY_FD);
++ /* Do a read to ensure PHY_LOOP has completed */
++ _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|(LOOPBACK);
++ *PhyState|=PHY_CHANGE;
++ return;
++ }
++#endif
++
++
++ if (cpMacDebug)
++ mdioPrintf("Enable Phy to negotiate external connection\n");
++
++ NWAYadvertise=NWAY_SEL;
++ if (*PhyState&SMODE_FD100) NWAYadvertise|=NWAY_FD100;
++ if (*PhyState&SMODE_HD100) NWAYadvertise|=NWAY_HD100;
++ if (*PhyState&SMODE_FD10) NWAYadvertise|=NWAY_FD10;
++ if (*PhyState&SMODE_HD10) NWAYadvertise|=NWAY_HD10;
++
++ *PhyState&=~(PHY_TIM_MASK|PHY_STATE_MASK);
++ if ((PhyStatus&NWAY_CAPABLE)&&(*PhyState&SMODE_AUTO)) /*NWAY Phy Detected*/
++ {
++ /*For NWAY compliant Phys */
++
++ _mdioUserAccessWrite(PhyDev, NWAY_ADVERTIZE_REG, PhyNum, NWAYadvertise);
++
++ if (cpMacDebug)
++ {
++ mdioPrintf("NWAY Advertising: ");
++ if (NWAYadvertise&NWAY_FD100) mdioPrintf("FullDuplex-100 ");
++ if (NWAYadvertise&NWAY_HD100) mdioPrintf("HalfDuplex-100 ");
++ if (NWAYadvertise&NWAY_FD10) mdioPrintf("FullDuplex-10 ");
++ if (NWAYadvertise&NWAY_HD10) mdioPrintf("HalfDuplex-10 ");
++ mdioPrintf("\n");
++ }
++
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN);
++
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN|RENEGOTIATE);
++
++ *PhyState|=PHY_CHANGE|PHY_NWST_TO|NWAY_START;
++ }
++ else
++ {
++ *PhyState&=~SMODE_AUTO; /*The Phy is not capable of auto negotiation! */
++ m=NWAYadvertise;
++ for(j=0x8000,i=0;(i<16)&&((j&m)==0);i++,j>>=1);
++ m=j;
++ j=0;
++ if (m&(NWAY_FD100|NWAY_HD100))
++ {
++ j=PHY_100;
++ m&=(NWAY_FD100|NWAY_HD100);
++ }
++ if (m&(NWAY_FD100|NWAY_FD10))
++ j |= PHY_FD;
++ if (cpMacDebug)
++ mdioPrintf("Requested PHY mode %s Duplex %s Mbps\n",(j&PHY_FD)?"Full":"Half",(j&PHY_100)?"100":"10");
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, j);
++ *PhyState&=~PHY_SPEED_MASK;
++ if (j&PHY_100)
++ *PhyState|=(1<<PHY_SPEED_OFFSET);
++ *PhyState&=~PHY_DUPLEX_MASK;
++ if (j&PHY_FD)
++ *PhyState|=(1<<PHY_DUPLEX_OFFSET);
++ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
++ }
++ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
++ }
++
++void _MdioNwayStartState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum,PhyMode;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ /*Wait for Negotiation to start */
++
++ PhyMode=_mdioUserAccessRead(PhyDev, PHY_CONTROL_REG, PhyNum);
++
++ if((PhyMode&RENEGOTIATE)==0)
++ {
++ _mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum); /*Flush pending latch bits*/
++ *PhyState&=~(PHY_STATE_MASK|PHY_TIM_MASK);
++ *PhyState|=PHY_CHANGE|NWAY_WAIT|PHY_NWDN_TO;
++ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
++ }
++ else
++ {
++ if (*PhyState&PHY_TIM_MASK)
++ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
++ else
++ _mdioPhyTimeOut(PhyDev);
++ }
++ }
++
++void _MdioNwayWaitState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum,PhyStatus,NWAYadvertise,NWAYREadvertise,NegMode,i,j;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
++
++ if (PhyStatus&NWAY_COMPLETE)
++ {
++ *PhyState|=PHY_CHANGE;
++ *PhyState&=~PHY_SPEED_MASK;
++ *PhyState&=~PHY_DUPLEX_MASK;
++
++ NWAYadvertise =_mdioUserAccessRead(PhyDev, NWAY_ADVERTIZE_REG, PhyNum);
++ NWAYREadvertise =_mdioUserAccessRead(PhyDev, NWAY_REMADVERTISE_REG, PhyNum);
++
++ /* Negotiated mode is we and the remote have in common */
++ NegMode = NWAYadvertise & NWAYREadvertise;
++
++ if (cpMacDebug)
++ {
++ mdioPrintf("Phy: %d, ",(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
++ mdioPrintf("NegMode %04X, NWAYadvertise %04X, NWAYREadvertise %04X\n",
++ NegMode, NWAYadvertise, NWAYREadvertise);
++ }
++
++ /* Limit negotiation to fields below */
++ NegMode &= (NWAY_FD100|NWAY_HD100|NWAY_FD10|NWAY_HD10);
++
++ if (NegMode==0)
++ {
++ NegMode=(NWAY_HD100|NWAY_HD10)&NWAYadvertise; /*or 10 ?? who knows, Phy is not MII compliant*/
++ if(cpMacDebug)
++ {
++ mdioPrintf("Mdio:WARNING: Negotiation complete but NO agreement, default is HD\n");
++ _mdioDumpPhyDetailed(PhyDev);
++ }
++ }
++ for(j=0x8000,i=0;(i<16)&&((j&NegMode)==0);i++,j>>=1);
++
++
++ NegMode=j;
++ if (cpMacDebug)
++ {
++ mdioPrintf("Negotiated connection: ");
++ if (NegMode&NWAY_FD100) mdioPrintf("FullDuplex 100 Mbs\n");
++ if (NegMode&NWAY_HD100) mdioPrintf("HalfDuplex 100 Mbs\n");
++ if (NegMode&NWAY_FD10) mdioPrintf("FullDuplex 10 Mbs\n");
++ if (NegMode&NWAY_HD10) mdioPrintf("HalfDuplex 10 Mbs\n");
++ }
++ if (NegMode!=0)
++ {
++ if (PhyStatus&PHY_LINKED)
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINKED;
++ else
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINK_WAIT;
++ if (NegMode&(NWAY_FD100|NWAY_HD100))
++ *PhyState=(*PhyState&~PHY_SPEED_MASK)|(1<<PHY_SPEED_OFFSET);
++ if (NegMode&(NWAY_FD100|NWAY_FD10))
++ *PhyState=(*PhyState&~PHY_DUPLEX_MASK)|(1<<PHY_DUPLEX_OFFSET);
++ }
++ }
++ else
++ {
++ if (*PhyState&PHY_TIM_MASK)
++ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
++ else
++ _mdioPhyTimeOut(PhyDev);
++ }
++ }
++
++void _MdioLinkWaitState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyStatus;
++ bit32u PhyNum;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
++
++ if (PhyStatus&PHY_LINKED)
++ {
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|LINKED;
++ *PhyState|=PHY_CHANGE;
++ }
++ else
++ {
++ if (*PhyState&PHY_TIM_MASK)
++ *PhyState=(*PhyState&~PHY_TIM_MASK)|((*PhyState&PHY_TIM_MASK)-(1<<PHY_TIM_OFFSET));
++ else
++ _mdioPhyTimeOut(PhyDev);
++ }
++ }
++
++void _mdioPhyTimeOut(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState;
++
++ if(_mdioMdixSupported(PhyDev) == 0)
++ return; /* AutoMdix not supported */
++
++ PhyState = &PhyDev->PhyState;
++
++ /* Indicate MDI/MDIX mode switch is needed */
++ *PhyState|=PHY_MDIX_SWITCH;
++
++ /* Toggle the MDIX mode indicatir */
++ if(*PhyState & PHY_MDIX)
++ *PhyState &= ~PHY_MDIX_MASK; /* Current State is MDIX, set to MDI */
++ else
++ *PhyState |= PHY_MDIX_MASK; /* Current State is MDI, set to MDIX */
++
++ /* Reset state machine to FOUND */
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|(FOUND);
++ }
++
++void _MdioLoopbackState(PHY_DEVICE *PhyDev)
++ {
++ return;
++ }
++
++void _MdioLinkedState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum = (*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ if (myMDIO_LINK&(1<<PhyNum)) return; /* if still Linked, exit*/
++
++ /* Not Linked */
++ *PhyState&=~(PHY_STATE_MASK|PHY_TIM_MASK);
++ if (*PhyState&SMODE_AUTO)
++ *PhyState|=PHY_CHANGE|NWAY_WAIT|PHY_NWDN_TO;
++ else
++ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
++
++ _mdioMdixDelay(PhyDev); /* If AutoMdix add delay */
++ }
++
++void _MdioDefaultState(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ /*Awaiting a cpMacMdioInit call */
++ *PhyState|=PHY_CHANGE;
++ }
++
++
++/*User Calls********************************************************* */
++
++void cpMacMdioClose(PHY_DEVICE *PhyDev, int Full)
++ {
++ }
++
++
++int cpMacMdioInit(PHY_DEVICE *PhyDev, bit32u miibase, bit32u inst, bit32u PhyMask, bit32u MLinkMask, bit32u MdixMask, bit32u ResetReg, bit32u ResetBit, bit32u MdioBusFreq, bit32u MdioClockFreq, int verbose, void *Info)
++ {
++ bit32u HighestChannel;
++ bit32u ControlState;
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u clkdiv; /*MJH+030328*/
++
++ cpMacDebug=verbose;
++
++ PhyDev->miibase = miibase;
++ PhyDev->inst = inst;
++ PhyDev->PhyMask = PhyMask;
++ PhyDev->MLinkMask = MLinkMask;
++ PhyDev->MdixMask = MdixMask;
++#ifdef _CPHAL_CPMAC
++ PhyDev->HalDev = (HAL_DEVICE*) Info;
++#endif
++
++ *PhyState &= ~PHY_MDIX_MASK; /* Set initial State to MDI */
++
++ /* Check that the channel supplied is within range */
++ HighestChannel = (myMDIO_CONTROL & MDIO_CONTROL_HIGHEST_USER_CHANNEL) > 8;
++ if(inst > HighestChannel)
++ return(HighestChannel);
++
++ /*Setup MII MDIO access regs */
++
++ /* Calculate the correct value for the mclkdiv */
++ /* See PITS #14 */
++ if (MdioClockFreq) /*MJH+030402*/
++ clkdiv = (MdioBusFreq / MdioClockFreq) - 1; /*MJH+030402*/
++ else /*MJH+030402*/
++ clkdiv = 0xFF; /*MJH+030402*/
++
++ ControlState = MDIO_CONTROL_ENABLE;
++ ControlState |= (clkdiv & MDIO_CONTROL_CLKDIV); /*MJH+030328*/
++
++ /*
++ If mii is not out of reset or if the Control Register is not set correctly
++ then initalize
++ */
++ if( !(VOLATILE32(ResetReg) & (1 << ResetBit)) ||
++ ((myMDIO_CONTROL & (MDIO_CONTROL_CLKDIV | MDIO_CONTROL_ENABLE)) != ControlState) )/*GSG~030404*/
++ {
++ /* MII not setup, Setup initial condition */
++ VOLATILE32(ResetReg) &= ~(1 << ResetBit);
++ _mdioDelayEmulate(PhyDev, 64);
++ VOLATILE32(ResetReg) |= (1 << ResetBit); /* take mii out of reset */
++ _mdioDelayEmulate(PhyDev, 64);
++ myMDIO_CONTROL = ControlState; /* Enable MDIO */
++ }
++
++ *PhyState=INIT;
++
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioInit\n");
++ _mdioDumpState(PhyDev);
++ return(0);
++ }
++
++void cpMacMdioSetPhyMode(PHY_DEVICE *PhyDev,bit32u PhyMode)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u CurrentState;
++
++ PhyDev->PhyMode = PhyMode; /* used for AUTOMIDX, planned to replace PhyState fields */
++
++ *PhyState&=~PHY_SMODE_MASK;
++
++ if (PhyMode&NWAY_AUTO) *PhyState|=SMODE_AUTO;
++ if (PhyMode&NWAY_FD100) *PhyState|=SMODE_FD100;
++ if (PhyMode&NWAY_HD100) *PhyState|=SMODE_HD100;
++ if (PhyMode&NWAY_FD10) *PhyState|=SMODE_FD10;
++ if (PhyMode&NWAY_HD10) *PhyState|=SMODE_HD10;
++
++ CurrentState=*PhyState&PHY_STATE_MASK;
++ if ((CurrentState==NWAY_START)||
++ (CurrentState==NWAY_WAIT) ||
++ (CurrentState==LINK_WAIT) ||
++ (CurrentState==LINKED) )
++ *PhyState=(*PhyState&~PHY_STATE_MASK)|FOUND|PHY_CHANGE;
++ if (cpMacDebug)
++ mdioPrintf("cpMacMdioSetPhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
++ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
++ PhyMode&NWAY_HD100);
++ _mdioDumpState(PhyDev);
++ }
++
++/* cpMacMdioTic is called every 10 mili seconds to process Phy states */
++
++int cpMacMdioTic(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u CurrentState;
++
++ /*Act on current state of the Phy */
++
++ CurrentState=*PhyState;
++ switch(CurrentState&PHY_STATE_MASK)
++ {
++ case INIT: _MdioInitState(PhyDev); break;
++ case FINDING: _MdioFindingState(PhyDev); break;
++ case FOUND: _MdioFoundState(PhyDev); break;
++ case NWAY_START: _MdioNwayStartState(PhyDev); break;
++ case NWAY_WAIT: _MdioNwayWaitState(PhyDev); break;
++ case LINK_WAIT: _MdioLinkWaitState(PhyDev); break;
++ case LINKED: _MdioLinkedState(PhyDev); break;
++ case LOOPBACK: _MdioLoopbackState(PhyDev); break;
++ default: _MdioDefaultState(PhyDev); break;
++ }
++
++ /*Dump state info if a change has been detected */
++
++ if ((CurrentState&~PHY_TIM_MASK)!=(*PhyState&~PHY_TIM_MASK))
++ _mdioDumpState(PhyDev);
++
++ /* Check is MDI/MDIX mode switch is needed */
++ if(*PhyState & PHY_MDIX_SWITCH)
++ {
++ bit32u Mdix;
++
++ *PhyState &= ~PHY_MDIX_SWITCH; /* Clear Mdix Flip indicator */
++
++ if(*PhyState & PHY_MDIX)
++ Mdix = 1;
++ else
++ Mdix = 0;
++ return(_MIIMDIO_MDIXFLIP|Mdix);
++ }
++
++ /*Return state change to user */
++
++ if (*PhyState&PHY_CHNG_MASK)
++ {
++ *PhyState&=~PHY_CHNG_MASK;
++ return(1);
++ }
++ else
++ return(0);
++ }
++
++/* cpMacMdioGetDuplex is called to retrieve the Duplex info */
++
++int cpMacMdioGetDuplex(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ return((*PhyState&PHY_DUPLEX_MASK)?1:0); /* return 0 or a 1 */
++ }
++
++/* cpMacMdioGetSpeed is called to retreive the Speed info */
++
++int cpMacMdioGetSpeed(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ return(*PhyState&PHY_SPEED_MASK);
++ }
++
++/* cpMacMdioGetPhyNum is called to retreive the Phy Device Adr info */
++
++int cpMacMdioGetPhyNum(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ return((*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET);
++ }
++
++/* cpMacMdioGetLoopback is called to Determine if the LOOPBACK state has been reached*/
++
++int cpMacMdioGetLoopback(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ return((*PhyState&PHY_STATE_MASK)==LOOPBACK);
++ }
++/* cpMacMdioGetLinked is called to Determine if the LINKED state has been reached*/
++
++int cpMacMdioGetLinked(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ return((*PhyState&PHY_STATE_MASK)==LINKED);
++ }
++
++void cpMacMdioLinkChange(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum,PhyStatus;
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++
++ if (cpMacMdioGetLinked(PhyDev))
++ {
++ PhyStatus=_mdioUserAccessRead(PhyDev, PHY_STATUS_REG, PhyNum);
++
++ if ((PhyStatus&PHY_LINKED)==0)
++ {
++ *PhyState&=~(PHY_TIM_MASK|PHY_STATE_MASK);
++ if (*PhyState&SMODE_AUTO)
++ {
++ _mdioUserAccessWrite(PhyDev, PHY_CONTROL_REG, PhyNum, AUTO_NEGOTIATE_EN|RENEGOTIATE);
++ *PhyState|=PHY_CHANGE|PHY_NWST_TO|NWAY_START;
++ }
++ else
++ {
++ *PhyState|=PHY_CHANGE|PHY_LINK_TO|LINK_WAIT;
++ }
++ }
++ }
++ }
++
++void cpMacMdioGetVer(bit32u miibase, bit32u *ModID, bit32u *RevMaj, bit32u *RevMin)
++ {
++ bit32u Ver;
++
++ Ver = MDIO_VER(miibase);
++
++ *ModID = (Ver & MDIO_VER_MODID) >> 16;
++ *RevMaj = (Ver & MDIO_VER_REVMAJ) >> 8;
++ *RevMin = (Ver & MDIO_VER_REVMIN);
++ }
++
++int cpMacMdioGetPhyDevSize(void)
++ {
++ return(sizeof(PHY_DEVICE));
++ }
++
++ /* returns 0 if current Phy has AutoMdix support, otherwise 0 */
++int _mdioMdixSupported(PHY_DEVICE *PhyDev)
++ {
++ bit32u *PhyState = &PhyDev->PhyState;
++ bit32u PhyNum;
++
++ if((PhyDev->PhyMode & NWAY_AUTOMDIX) == 0)
++ return(0); /* AutoMdix not turned on */
++
++ PhyNum=(*PhyState&PHY_DEV_MASK)>>PHY_DEV_OFFSET;
++ if( ((1<<PhyNum) & PhyDev->MdixMask) == 0)
++ return(0); /* Phy does not support AutoMdix*/
++
++ return(1);
++ }
++
++/* If current Phy has AutoMdix support add Mdix Delay to the Timer State Value */
++void _mdioMdixDelay(PHY_DEVICE *PhyDev)
++ {
++ int Delay;
++ bit32u *PhyState = &PhyDev->PhyState;
++#ifdef _CPHAL_CPMAC
++ HAL_DEVICE *HalDev = PhyDev->HalDev;
++#endif
++
++ if(_mdioMdixSupported(PhyDev) == 0)
++ return; /* AutoMdix not supported */
++/* Currently only supported when used with the CPMAC */
++#ifdef _CPHAL_CPMAC
++ /* Get the Delay value in milli-seconds and convert to ten-milli second value */
++ Delay = cpmacRandomRange(HalDev, _AUTOMDIX_DELAY_MIN, _AUTOMDIX_DELAY_MAX);
++ Delay /= 10;
++
++ /* Add AutoMidx Random Switch Delay to AutoMdix Link Delay */
++
++ Delay += (PHY_MDIX_TO>>PHY_TIM_OFFSET);
++
++ /* Change Timeout value to AutoMdix standard */
++ *PhyState &= ~(PHY_TIM_MASK); /* Clear current Time out value */
++ *PhyState |= (Delay<<PHY_TIM_OFFSET); /* Set new value */
++#endif
++ }
++
++
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpmdio.h linux.dev/drivers/net/avalanche_cpmac/cpmdio.h
+--- linux.old/drivers/net/avalanche_cpmac/cpmdio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpmdio.h 2005-07-10 03:22:40.515159000 +0200
+@@ -0,0 +1,73 @@
++/*****************************************************************************
++** TNETD53xx Software Support
++** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
++**
++** FILE: cpmdio.h User Include for MDIO API Access
++**
++** DESCRIPTION:
++** This include file contains definitions for the the MDIO API
++**
++** HISTORY:
++** 27Mar02 Michael Hanrahan Original (modified from emacmdio.h)
++** 04Apr02 Michael Hanrahan Added Interrupt Support
++*****************************************************************************/
++#ifndef _INC_CPMDIO
++#define _INC_CPMDIO
++
++
++#ifndef __CPHAL_CPMDIO
++typedef void PHY_DEVICE;
++#endif
++
++
++/*Version Information */
++
++void cpMacMdioGetVer(bit32u miiBase, bit32u *ModID, bit32u *RevMaj, bit32u *RevMin);
++
++/*Called once at the begining of time */
++
++int cpMacMdioInit(PHY_DEVICE *PhyDev, bit32u miibase, bit32u inst, bit32u PhyMask, bit32u MLinkMask, bit32u MdixMask, bit32u ResetBase, bit32u ResetBit, bit32u MdioBusFreq, bit32u MdioClockFreq, int verbose, void *Info);
++int cpMacMdioGetPhyDevSize(void);
++
++
++/*Called every 10 mili Seconds, returns TRUE if there has been a mode change */
++
++int cpMacMdioTic(PHY_DEVICE *PhyDev);
++
++/*Called to set Phy mode */
++
++void cpMacMdioSetPhyMode(PHY_DEVICE *PhyDev,bit32u PhyMode);
++
++/*Calls to retreive info after a mode change! */
++
++int cpMacMdioGetDuplex(PHY_DEVICE *PhyDev);
++int cpMacMdioGetSpeed(PHY_DEVICE *PhyDev);
++int cpMacMdioGetPhyNum(PHY_DEVICE *PhyDev);
++int cpMacMdioGetLinked(PHY_DEVICE *PhyDev);
++void cpMacMdioLinkChange(PHY_DEVICE *PhyDev);
++
++/* Shot Down */
++
++void cpMacMdioClose(PHY_DEVICE *PhyDev, int Full);
++
++
++/* Phy Mode Values */
++#define NWAY_AUTOMDIX (1<<16)
++#define NWAY_FD100 (1<<8)
++#define NWAY_HD100 (1<<7)
++#define NWAY_FD10 (1<<6)
++#define NWAY_HD10 (1<<5)
++#define NWAY_AUTO (1<<0)
++
++/*
++ *
++ * Tic() return values
++ *
++ */
++
++#define _MIIMDIO_MDIXFLIP (1<<28)
++
++#define _AUTOMDIX_DELAY_MIN 80 /* milli-seconds*/
++#define _AUTOMDIX_DELAY_MAX 200 /* milli-seconds*/
++
++#endif /* _INC_CPMDIO */
+diff -urN linux.old/drivers/net/avalanche_cpmac/cppi_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cppi_cpmac.c
+--- linux.old/drivers/net/avalanche_cpmac/cppi_cpmac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cppi_cpmac.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,1345 @@
++/*************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cppi.c
++ *
++ * DESCRIPTION:
++ * This file contains shared code for all CPPI modules.
++ *
++ * HISTORY:
++ * 7Aug02 Greg RC1.00 Original Version created.
++ * 27Sep02 Mick RC1.01 Merged for use by CPMAC/CPSAR
++ * 16Oct02 Mick RC1.02 Performance Tweaks (see cppihist.txt)
++ * 12Nov02 Mick RC1.02 Updated to use cpmac_reg.h
++ * 09Jan03 Mick RC3.01 Removed modification to RxBuffer ptr
++ * 28Mar03 Mick 1.03 RxReturn now returns error if Malloc Fails
++ * 10Apr03 Mick 1.03.02 Added Needs Buffer Support
++ * 11Jun03 Mick 1.06.02 halSend() errors corrected
++ * 23Aug04 Mick 1.07.08 cpmac only - Send: bypass threshold check if TxInts re-enabled
++ *
++ * @author Greg Guyotte
++ * @version 1.00
++ * @date 7-Aug-2002
++ *****************************************************************************/
++/* each CPPI module must modify this file, the rest of the
++ code in cppi.c should be totally shared *//* Each CPPI module MUST properly define all constants shown below */
++
++/* CPPI registers */
++
++/* the following defines are not CPPI specific */
++
++static int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork);
++
++static void FreeRx(HAL_DEVICE *HalDev, int Ch)
++ {
++ HAL_RCB *rcb_ptr; /*+GSG 030303*/
++ int rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf; /*+GSG 030303*/
++ int Num = HalDev->ChData[Ch].RxNumBuffers, i; /*+GSG 030303*/
++
++ /* Free Rx data buffers attached to descriptors, if necessary */
++ if (HalDev->RcbStart[Ch] != 0) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ for(i=0;i<Num;i++) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ rcb_ptr = (HAL_RCB *)(HalDev->RcbStart[Ch] + (i*rcbSize)); /*+GSG 030303*/
++
++ /* free the data buffer */
++ if (rcb_ptr->DatPtr != 0)
++ {
++
++ HalDev->OsFunc->FreeRxBuffer((void *)rcb_ptr->OsInfo, (void *)rcb_ptr->DatPtr);
++ rcb_ptr->OsInfo=0; /*MJH+030522*/
++ rcb_ptr->DatPtr=0; /*MJH+030522*/
++ }
++ } /*+GSG 030303*/
++ } /*+GSG 030303*/
++
++ /* free up all desciptors at once */
++ HalDev->OsFunc->FreeDmaXfer(HalDev->RcbStart[Ch]);
++
++ /* mark buffers as freed */
++ HalDev->RcbStart[Ch] = 0;
++ }
++
++static void FreeTx(HAL_DEVICE *HalDev, int Ch, int Queue)
++ {
++
++/*+GSG 030303*/
++
++ /* free all descriptors at once */
++ HalDev->OsFunc->FreeDmaXfer(HalDev->TcbStart[Ch][Queue]);
++
++ HalDev->TcbStart[Ch][Queue] = 0;
++ }
++
++/* return of 0 means that this code executed, -1 means the interrupt was not
++ a teardown interrupt */
++static int RxTeardownInt(HAL_DEVICE *HalDev, int Ch)
++ {
++ bit32u base = HalDev->dev_base;
++
++ /* check to see if the interrupt is a teardown interrupt */
++ if (((CPMAC_RX_INT_ACK( base , Ch )) & TEARDOWN_VAL) == TEARDOWN_VAL)
++ {
++ /* finish channel teardown */
++
++ /* Free channel resources on a FULL teardown */
++ if (HalDev->RxTeardownPending[Ch] & FULL_TEARDOWN)
++ {
++ FreeRx(HalDev, Ch);
++ }
++
++ /* bug fix - clear Rx channel pointers on teardown */
++ HalDev->RcbPool[Ch] = 0;
++ HalDev->RxActQueueHead[Ch] = 0;
++ HalDev->RxActQueueCount[Ch] = 0;
++ HalDev->RxActive[Ch] = FALSE;
++
++ /* write completion pointer */
++ (CPMAC_RX_INT_ACK( base , Ch )) = TEARDOWN_VAL;
++
++ /* use direction bit as a teardown pending bit! May be able to
++ use only one teardown pending integer in HalDev */
++
++ HalDev->RxTeardownPending[Ch] &= ~RX_TEARDOWN;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
++ CPMAC_RX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Ch);
++ if ((HalDev->RxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
++ {
++
++ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_RX);
++ }
++ HalDev->RxTeardownPending[Ch] = 0;
++
++ return (EC_NO_ERRORS);
++ }
++ return (-1);
++ }
++
++/* return of 0 means that this code executed, -1 means the interrupt was not
++ a teardown interrupt. Note: this code is always called with Queue == 0 (hi priority). */
++static int TxTeardownInt(HAL_DEVICE *HalDev, int Ch, int Queue)
++ {
++ bit32u base = HalDev->dev_base;
++ HAL_TCB *Last, *Curr, *First; /*+GSG 030303*/
++ int i;
++
++ if (((CPMAC_TX_INT_ACK( base , Ch )) & TEARDOWN_VAL) == TEARDOWN_VAL)
++ {
++ /* perform all actions for both queues (+GSG 040212) */
++ for (i=0; i<HalDev->ChData[Ch].TxNumQueues; i++)
++ {
++ /* return outstanding buffers to OS +RC3.02*/
++ Curr = HalDev->TxActQueueHead[Ch][i]; /*+GSG 030303*/
++ First = Curr; /*+GSG 030303*/
++ while (Curr) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ /* Pop TCB(s) for packet from the stack */ /*+GSG 030303*/
++ Last = Curr->Eop; /*+GSG 030303*/
++ HalDev->TxActQueueHead[Ch][i] = Last->Next; /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* return to OS */ /*+GSG 030303*/
++ HalDev->OsFunc->SendComplete(Curr->OsInfo); /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* Push Tcb(s) back onto the stack */ /*+GSG 030303*/
++ Curr = Last->Next; /*+GSG 030303*/
++ Last->Next = HalDev->TcbPool[Ch][i]; /*+GSG 030303*/
++ HalDev->TcbPool[Ch][i] = First; /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* set the first(SOP) pointer for the next packet */ /*+GSG 030303*/
++ First = Curr; /*+GSG 030303*/
++ } /*+GSG 030303*/
++ }
++
++ /* finish channel teardown */
++
++ if (HalDev->TxTeardownPending[Ch] & FULL_TEARDOWN)
++ {
++ FreeTx(HalDev, Ch, 0);
++
++ if (HalDev->ChData[Ch].TxNumQueues == 2)
++ FreeTx(HalDev, Ch, 1);
++ } /* if FULL teardown */
++
++ /* perform all actions for both queues (+GSG 040212) */
++ for (i=0; i<HalDev->ChData[Ch].TxNumQueues; i++)
++ {
++ /* bug fix - clear Tx channel pointers on teardown */
++ HalDev->TcbPool[Ch][i] = 0;
++ HalDev->TxActQueueHead[Ch][i] = 0;
++ HalDev->TxActQueueCount[Ch][i] = 0;
++ HalDev->TxActive[Ch][i] = FALSE;
++ }
++
++ /* write completion pointer, only needed for the high priority queue */
++ (CPMAC_TX_INT_ACK( base , Ch )) = TEARDOWN_VAL;
++
++ /* no longer pending teardown */
++ HalDev->TxTeardownPending[Ch] &= ~TX_TEARDOWN;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
++ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Ch);
++ if ((HalDev->TxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
++ {
++
++ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX);
++ }
++ HalDev->TxTeardownPending[Ch] = 0;
++
++ return (EC_NO_ERRORS);
++ }
++ return (-1);
++ }
++
++/* +GSG 030421 */
++static void AddToRxQueue(HAL_DEVICE *HalDev, HAL_RCB *FirstRcb, HAL_RCB *LastRcb, int FragCount, int Ch)
++ {
++ if (HalDev->RxActQueueHead[Ch]==0)
++ {
++
++ HalDev->RxActQueueHead[Ch]=FirstRcb;
++ HalDev->RxActQueueTail[Ch]=LastRcb;
++ if (!HalDev->RxActive[Ch])
++ {
++ /* write Rx Queue Head Descriptor Pointer */
++ ((CPMAC_RX_HDP( HalDev->dev_base , Ch )) ) = VirtToPhys(FirstRcb) - HalDev->offset;
++ HalDev->RxActive[Ch]=TRUE;
++ }
++ }
++ else
++ {
++ register HAL_RCB *OldTailRcb;
++ register bit32u rmode;
++
++ HalDev->OsFunc->CriticalOn();
++ OldTailRcb=HalDev->RxActQueueTail[Ch];
++ OldTailRcb->Next=(void *)FirstRcb;
++ OldTailRcb=VirtToVirtNoCache(OldTailRcb);
++ OldTailRcb->HNext=VirtToPhys(FirstRcb) - HalDev->offset;
++ HalDev->RxActQueueTail[Ch]=LastRcb;
++ rmode=OldTailRcb->mode;
++ if (rmode&CB_EOQ_BIT)
++ {
++ rmode&=~CB_EOQ_BIT;
++ ((CPMAC_RX_HDP( HalDev->dev_base , Ch )) ) = VirtToPhys(FirstRcb) - HalDev->offset;
++ OldTailRcb->mode=rmode;
++ }
++ HalDev->OsFunc->CriticalOff();
++ }
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function is called to indicate to the CPHAL that the upper layer
++ * software has finished processing the receive data (given to it by
++ * osReceive()). The CPHAL will then return the appropriate receive buffers
++ * and buffer descriptors to the available pool.
++ *
++ * @param HalReceiveInfo Start of receive buffer descriptor chain returned to
++ * CPHAL.
++ * @param StripFlag Flag indicating whether the upper layer software has
++ * retained ownership of the receive data buffers.
++ *<BR>
++ * 'FALSE' means that the CPHAL can reuse the receive data buffers.
++ *<BR>
++ * 'TRUE' : indicates the data buffers were retained by the OS
++ *<BR>
++ * NOTE: If StripFlag is TRUE, it is the responsibility of the upper layer software to free the buffers when they are no longer needed.
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_RCB_NEEDS_BUFFER "EC_VAL_RCB_NEEDS_BUFFER"<BR>
++ * @ref EC_VAL_RCB_DROPPED "EC_VAL_RCB_DROPPED"<BR>
++ */
++static int halRxReturn(HAL_RECEIVEINFO *HalReceiveInfo,
++ int StripFlag)
++ {
++ int Ch, i;
++ HAL_RCB *LastRcb;
++ HAL_DEVICE *HalDev;
++ int RcbSize;
++ int FragCount;
++
++ Ch = HalReceiveInfo->mode&0x0ff;
++ HalDev = (HAL_DEVICE *)HalReceiveInfo->Off_BLen;
++ FragCount = HalReceiveInfo->mode>>8;
++
++ if (HalDev->State != enOpened)
++ return(EC_CPMAC |EC_FUNC_RXRETURN|EC_VAL_INVALID_STATE);
++
++ LastRcb=(HAL_RCB *)HalReceiveInfo->Eop;
++ LastRcb->HNext=0;
++ LastRcb->Next=0;
++ RcbSize = HalDev->ChData[Ch].RxBufSize;
++
++ if (FragCount>1)
++ {
++ LastRcb->Off_BLen=RcbSize;
++ LastRcb->mode=CB_OWNERSHIP_BIT;
++ }
++
++ HalReceiveInfo->Off_BLen=RcbSize;
++ HalReceiveInfo->mode=CB_OWNERSHIP_BIT;
++
++ /* If OS has kept the buffers for this packet, attempt to alloc new buffers */
++ if (StripFlag)
++ {
++ int rc=0; /*MJH+030417*/
++ int GoodCount=0; /*GSG+030421*/
++ HAL_RCB *TempRcb;
++ char *pBuf;
++ HAL_RCB *CurrHeadRcb = HalReceiveInfo, *LastGoodRcb=0; /* +GSG 030421 */
++
++ TempRcb = HalReceiveInfo;
++ for (i=0; i<FragCount; i++)
++ {
++ if (TempRcb == 0)
++ {
++ dbgPrintf("Rx Return error while allocating new buffers\n");
++ dbgPrintf("Rcb = %08x, Rcb->Eop = %08x, FragCount = %d:%d\n",
++ (bit32u)HalReceiveInfo, (bit32u)HalReceiveInfo->Eop, FragCount,i);
++ osfuncSioFlush();
++
++ return(EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_CORRUPT_RCB_CHAIN);
++ }
++
++ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(RcbSize,0,
++ 0xF,HalDev->ChData[Ch].OsSetup,
++ (void *)TempRcb,
++ (void *)&TempRcb->OsInfo,
++ (void *) HalDev->OsDev);
++ if (!pBuf)
++ {
++ /* malloc failed, add this RCB to Needs Buffer List */
++ (HAL_RCB *)TempRcb->Eop = TempRcb; /* GSG +030430 */
++ TempRcb->mode=1<<8|Ch;
++ TempRcb->Off_BLen=(bit32u)HalDev;
++
++ if(HalDev->NeedsCount < MAX_NEEDS) /* +MJH 030410 */
++ { /* +MJH 030410 */
++ HalDev->Needs[HalDev->NeedsCount] = (HAL_RECEIVEINFO *) TempRcb; /* +MJH 030410 */
++ HalDev->NeedsCount++; /* +MJH 030410 */
++ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_NEEDS_BUFFER); /* ~MJH 030417 */
++ } /* +MJH 030410 */
++ else /* +MJH 030410 */
++ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_DROPPED); /* ~MJH 030417 */
++
++ /* requeue any previous RCB's that were ready to go before this one */
++ if (GoodCount > 0) /* +GSG 030421 */
++ { /* +GSG 030421 */
++ LastGoodRcb->HNext=0; /* +GSG 030430 */
++ LastGoodRcb->Next=0; /* +GSG 030430 */
++ osfuncDataCacheHitWritebackAndInvalidate((void *)LastGoodRcb, 16); /* +GSG 030430 */
++
++ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
++ GoodCount = 0; /* +GSG 030421 */
++ } /* +GSG 030421 */
++
++ CurrHeadRcb = TempRcb->Next; /* +GSG 030421 */
++ }
++ else /* +GSG 030421 */
++ { /* +GSG 030421 */
++ /* malloc succeeded, requeue the RCB to the hardware */
++ TempRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
++ TempRcb->DatPtr=pBuf;
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWritebackAndInvalidate((void *)TempRcb, 16);
++
++ /* i store the last good RCB in case the malloc fails for the
++ next fragment. This ensures that I can go ahead and return
++ a partial chain of RCB's to the hardware */
++ LastGoodRcb = TempRcb; /* +GSG 030421 */
++ GoodCount++; /* +GSG 030421 */
++ } /* +GSG 030421 */
++ TempRcb = TempRcb->Next;
++ } /* end of Frag loop */
++ /* if there any good RCB's to requeue, do so here */
++ if (GoodCount > 0) /* +GSG 030421 */
++ {
++ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
++ }
++ return(rc); /* ~GSG 030421 */
++ }
++ else
++ {
++ /* Not Stripping */
++ /* Emerald */
++ /* Write Back SOP and last RCB */
++ osfuncDataCacheHitWritebackAndInvalidate((void *)HalReceiveInfo, 16);
++
++ if (FragCount > 1)
++ {
++ osfuncDataCacheHitWritebackAndInvalidate((void *)LastRcb, 16);
++ }
++ /* if not stripping buffers, always add to queue */
++ AddToRxQueue(HalDev, HalReceiveInfo, LastRcb, FragCount, Ch); /*MJH~030520*/
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/* +MJH 030410
++ Trys to liberate an RCB until liberation fails.
++ Note: If liberation fails then RxReturn will re-add the RCB to the
++ Needs list.
++*/
++static void NeedsCheck(HAL_DEVICE *HalDev)
++{
++ HAL_RECEIVEINFO* HalRcb;
++ int rc;
++ HalDev->OsFunc->CriticalOn();
++ while(HalDev->NeedsCount)
++ {
++ HalDev->NeedsCount--;
++ HalRcb = HalDev->Needs[HalDev->NeedsCount];
++ rc = halRxReturn(HalRcb, 1);
++ /* short circuit if RxReturn starts to fail */
++ if (rc != 0)
++ break;
++ }
++ HalDev->OsFunc->CriticalOff();
++}
++
++/*
++ * This function allocates transmit buffer descriptors (internal CPHAL function).
++ * It creates a high priority transmit queue by default for a single Tx
++ * channel. If QoS is enabled for the given CPHAL device, this function
++ * will also allocate a low priority transmit queue.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel number.
++ *
++ * @return 0 OK, Non-Zero Not OK
++ */
++static int InitTcb(HAL_DEVICE *HalDev, int Ch)
++ {
++ int i, Num = HalDev->ChData[Ch].TxNumBuffers;
++ HAL_TCB *pTcb=0;
++ char *AllTcb;
++ int tcbSize, Queue;
++ int SizeMalloc;
++
++ tcbSize = (sizeof(HAL_TCB)+0xf)&~0xf;
++ SizeMalloc = (tcbSize*Num)+0xf;
++
++ for (Queue=0; Queue < HalDev->ChData[Ch].TxNumQueues; Queue++)
++ {
++ if (HalDev->TcbStart[Ch][Queue] == 0)
++ {
++
++ /* malloc all TCBs at once */
++ AllTcb = (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
++ if (!AllTcb)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_TCB_MALLOC_FAILED);
++ }
++
++ HalDev->OsFunc->Memset(AllTcb, 0, SizeMalloc);
++
++ /* keep this address for freeing later */
++ HalDev->TcbStart[Ch][Queue] = AllTcb;
++ }
++ else
++ {
++ /* if the memory has already been allocated, simply reuse it! */
++ AllTcb = HalDev->TcbStart[Ch][Queue];
++ }
++
++ /* align to cache line */
++ AllTcb = (char *)(((bit32u)AllTcb + 0xf) &~ 0xf); /*PITS #143 MJH~030522*/
++
++ /* default High priority transmit queue */
++ HalDev->TcbPool[Ch][Queue]=0;
++ for(i=0;i<Num;i++)
++ {
++ /*pTcb=(HAL_TCB *) OsFunc->MallocDmaXfer(sizeof(HAL_TCB),0,0xffffffff); */
++ pTcb= (HAL_TCB *)(AllTcb + (i*tcbSize));
++ pTcb->mode=0;
++ pTcb->BufPtr=0;
++ pTcb->Next=HalDev->TcbPool[Ch][Queue];
++ pTcb->Off_BLen=0;
++ HalDev->TcbPool[Ch][Queue]=pTcb;
++ }
++ /*HalDev->TcbEnd = pTcb;*/
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/*
++ * This function allocates receive buffer descriptors (internal CPHAL function).
++ * After allocation, the function 'queues' (gives to the hardware) the newly
++ * created receive buffers to enable packet reception.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel number.
++ *
++ * @return 0 OK, Non-Zero Not OK
++ */
++static int InitRcb(HAL_DEVICE *HalDev, int Ch)
++ {
++ int i, Num = HalDev->ChData[Ch].RxNumBuffers;
++ int Size = HalDev->ChData[Ch].RxBufSize;
++ HAL_RCB *pRcb;
++ char *pBuf;
++ char *AllRcb;
++ int rcbSize;
++ int DoMalloc = 0;
++ int SizeMalloc;
++ int MallocSize;
++
++ rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;
++ SizeMalloc = (rcbSize*Num)+0xf;
++
++ if (HalDev->RcbStart[Ch] == 0)
++ {
++ DoMalloc = 1;
++
++ /* malloc all RCBs at once */
++ AllRcb= (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
++ if (!AllRcb)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RCB_MALLOC_FAILED);
++ }
++
++ HalDev->OsFunc->Memset(AllRcb, 0, SizeMalloc);
++
++ /* keep this address for freeing later */
++ HalDev->RcbStart[Ch] = AllRcb;
++ }
++ else
++ {
++ /* if the memory has already been allocated, simply reuse it! */
++ AllRcb = HalDev->RcbStart[Ch];
++ }
++
++ /* align to cache line */
++ AllRcb = (char *)(((bit32u)AllRcb + 0xf)&~0xf); /*PITS #143 MJH~030522*/
++
++ HalDev->RcbPool[Ch]=0;
++ for(i=0;i<Num;i++)
++ {
++ pRcb = (HAL_RCB *)(AllRcb + (i*rcbSize));
++
++ if (DoMalloc == 1)
++ {
++
++ MallocSize = Size; /*~3.01 */
++ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(MallocSize,0,0xF,HalDev->ChData[Ch].OsSetup, (void *)pRcb, (void *)&pRcb->OsInfo, (void *) HalDev->OsDev);
++ if(!pBuf)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RX_BUFFER_MALLOC_FAILED);
++ }
++ /* -RC3.01 pBuf = (char *)(((bit32u)pBuf+0xF) & ~0xF); */
++ pRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
++ pRcb->DatPtr=pBuf;
++ }
++ pRcb->mode=(1<<8)|Ch; /* One Frag for Ch */
++ pRcb->Next=(void *)HalDev->RcbPool[Ch];
++ pRcb->Off_BLen=(bit32u)HalDev;
++ HalDev->RcbPool[Ch]=pRcb;
++ }
++
++ /* Give all of the Rx buffers to hardware */
++
++ while(HalDev->RcbPool[Ch])
++ {
++ pRcb=HalDev->RcbPool[Ch];
++ HalDev->RcbPool[Ch]=pRcb->Next;
++ pRcb->Eop=(void*)pRcb;
++ pRcb->mode=(1<<8)|Ch;
++ halRxReturn((HAL_RECEIVEINFO *)pRcb, 0);
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function transmits the data in FragList using available transmit
++ * buffer descriptors. More information on the use of the Mode parameter
++ * is available in the module-specific appendices. Note: The OS should
++ * not call Send() for a channel that has been requested to be torndown.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param FragList Fragment List structure.
++ * @param FragCount Number of fragments in FragList.
++ * @param PacketSize Number of bytes to transmit.
++ * @param OsSendInfo OS Send Information structure. <BR>
++ * @param Mode 32-bit value with the following bit fields: <BR>
++ * 31-16: Mode (used for module specific data). <BR>
++ * 15-08: Queue (transmit queue to send on). <BR>
++ * 07-00: Channel (channel number to send on).
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_NOT_LINKED "EC_VAL_NOT_LINKED"<BR>
++ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
++ * @ref EC_VAL_OUT_OF_TCBS "EC_VAL_OUT_OF_TCBS"<BR>
++ * @ref EC_VAL_NO_TCBS "EC_VAL_NO_TCBS"<BR>
++ */
++static int halSend(HAL_DEVICE *HalDev,FRAGLIST *FragList,
++ int FragCount,int PacketSize, OS_SENDINFO *OsSendInfo,
++ bit32u Mode)
++ {
++ HAL_TCB *tcb_ptr, *head;
++ int i;
++ int rc = EC_NO_ERRORS;
++ int Ch = Mode & 0xFF;
++ int Queue = (Mode>>8)&0xFF;
++ /*int DoThresholdCheck=1; */ /* Used when TxIntDisable is set and TxInts are re-enabled */
++
++ if (HalDev->State != enOpened)
++ return(EC_CPPI|EC_FUNC_SEND|EC_VAL_INVALID_STATE);
++
++ if (!HalDev->Linked)
++ {
++ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NOT_LINKED;
++ return(rc);
++ }
++
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0) /*MJH~030611*/ /*PITS 148*/
++ return(EC_CPMAC |EC_FUNC_SEND|EC_VAL_INVALID_CH); /*+GSG 030303*/
++
++ HalDev->OsFunc->CriticalOn();
++
++ /* Setup Tx mode and size */
++ if (PacketSize<60)
++ {
++ FragList[FragCount-1].len += (60 - PacketSize); /*MJH~030506*//*PITS 132*/
++ PacketSize = 60; /*MJH~030506*/
++ }
++ Mode &= CB_PASSCRC_BIT;
++
++ tcb_ptr = head = HalDev->TcbPool[Ch][Queue];
++
++ if (tcb_ptr)
++ {
++
++ Mode|=PacketSize|CB_SOF_BIT|CB_OWNERSHIP_BIT;
++
++ for (i=0; i<FragCount; i++)
++
++ {
++ /* Setup Tx mode and size */
++ tcb_ptr->Off_BLen = FragList[i].len;
++
++ tcb_ptr->mode = Mode;
++ tcb_ptr->BufPtr = VirtToPhys((bit32 *)FragList[i].data) - HalDev->offset;
++ tcb_ptr->OsInfo = OsSendInfo;
++
++ if (i == (FragCount - 1))
++ {
++ /* last fragment */
++ tcb_ptr->mode |= CB_EOF_BIT;
++
++ /* since this is the last fragment, set the TcbPool pointer before
++ nulling out the Next pointers */
++
++ HalDev->TcbPool[Ch][Queue] = tcb_ptr->Next;
++
++ tcb_ptr->Next = 0;
++ tcb_ptr->HNext = 0;
++
++ /* In the Tx Interrupt handler, we will need to know which TCB is EOP,
++ so we can save that information in the SOP */
++ head->Eop = tcb_ptr;
++
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWritebackAndInvalidate((void *)tcb_ptr, 16);
++
++ }
++ else
++ {
++ Mode=CB_OWNERSHIP_BIT;
++ tcb_ptr->HNext = VirtToPhys((bit32 *)tcb_ptr->Next) - HalDev->offset;
++
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWritebackAndInvalidate((void *)tcb_ptr, 16);
++
++ tcb_ptr = tcb_ptr->Next; /* what about the end of TCB list?? */
++
++ if (tcb_ptr == 0)
++ {
++ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_OUT_OF_TCBS;
++ goto ExitSend;
++ }
++ }
++ } /* for */
++
++ /* put it on the high priority queue */
++ if (HalDev->TxActQueueHead[Ch][Queue] == 0)
++ {
++ HalDev->TxActQueueHead[Ch][Queue]=head;
++ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
++/*+GSG 030303*//*+GSG 030303*/
++ if (!HalDev->TxActive[Ch][Queue])
++ {
++
++ bit32u base = HalDev->dev_base;
++
++ /* write CPPI TX HDP */
++ (CPMAC_TX_HDP( base , Ch )) = VirtToPhys(head) - HalDev->offset;
++ HalDev->TxActive[Ch][Queue]=TRUE;
++
++ }
++ }
++ else
++ {
++ register volatile HAL_TCB *pTailTcb;
++ register bit32u tmode;
++ register bit32u pCurrentTcb;
++
++ HalDev->TxActQueueTail[Ch][Queue]->Next=head;
++ /* Emerald fix 10/29 */
++
++ pTailTcb=(HAL_TCB *)VirtToVirtNoCache(&HalDev->TxActQueueTail[Ch][Queue]->HNext);
++ pCurrentTcb=VirtToPhys(head) - HalDev->offset;
++ pTailTcb->HNext=pCurrentTcb;
++ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
++/*+GSG 030303*/
++ tmode=pTailTcb->mode;
++ if (tmode&CB_EOQ_BIT)
++ {
++ bit32u base = HalDev->dev_base;
++
++ tmode&=~CB_EOQ_BIT;
++ pTailTcb->mode=tmode;
++ ((CPMAC_TX_HDP( base , Ch )) ) = pCurrentTcb;
++ }
++
++ else
++ {
++ if(HalDev->TxIntDisable)
++ {
++ /* Enable Interrupts, to ensure packet goes out on wire */
++ CPMAC_TX_INTMASK_SET(HalDev->dev_base) = (1<<Ch);
++ halPacketProcessEnd(HalDev); /* Allow Interrupt to be seen at the OS */
++ /*DoThresholdCheck = 0; */ /* Disable Threshold Check */
++
++ }
++ }
++
++ }
++ rc = EC_NO_ERRORS;
++ goto ExitSend;
++ } /* if (tcb_ptr) */
++ else
++ {
++ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NO_TCBS;
++ goto ExitSend;
++ }
++ExitSend:
++
++/* 15 June 2004 - NSP Performance Update : If Tx Ints are disabled then process them here */
++/* 29 June 2004 - NSP Performance Update : Moved to end at request of BCIL */
++/* 23 Aug 2004 - NSP Performance Update : If Tx Ints are re-enabled do not do Threshold check */
++
++ if(HalDev->TxIntDisable /*&& DoThresholdCheck*/)
++ {
++ if(--HalDev->TxIntThreshold[Ch] <= 0)
++ {
++ int MoreWork;
++ TxInt(HalDev, Ch, 0, &MoreWork);
++ HalDev->TxIntThreshold[Ch] = HalDev->TxIntThresholdMaster[Ch];
++ }
++ }
++ HalDev->OsFunc->CriticalOff();
++
++ return(rc);
++ }
++
++/*
++ * This function processes receive interrupts. It traverses the receive
++ * buffer queue, extracting the data and passing it to the upper layer software via
++ * osReceive(). It handles all error conditions and fragments without valid data by
++ * immediately returning the RCB's to the RCB pool.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel Number.
++ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
++ *
++ * @return 0 if OK, non-zero otherwise.
++ */
++static int RxInt(HAL_DEVICE *HalDev, int Ch, int *MoreWork)
++ {
++ HAL_RCB *CurrentRcb, *SopRcb, *EofRcb, *EopRcb;
++ bit32u RxBufStatus,PacketsServiced, RxPktLen = 0, RxSopStatus,
++ FrmFrags, TotalFrags, FrmLen;
++ int base = HalDev->dev_base, Ret;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ int RxServiceMax = HalDev->ChData[Ch].RxServiceMax;
++ int FragIndex; /* +GSG 030508 */
++
++ if(HalDev->NeedsCount) /* +MJH 030410 */
++ NeedsCheck(HalDev); /* +MJH 030410 */
++
++ /* Handle case of teardown interrupt */
++ if (HalDev->RxTeardownPending[Ch] != 0)
++ {
++ Ret = RxTeardownInt(HalDev, Ch);
++ if (Ret == 0)
++ { /*+GSG 030303*/
++ *MoreWork = 0;
++ return (EC_NO_ERRORS);
++ } /*+GSG 030303*/
++ }
++
++ /* Examine first RCB on the software active queue */
++ CurrentRcb=HalDev->RxActQueueHead[Ch];
++ osfuncDataCacheHitInvalidate((void*)CurrentRcb, 16);
++ RxBufStatus=CurrentRcb->mode;
++ PacketsServiced=0;
++
++ /* Process received packets until we find hardware owned descriptors
++ or until we hit RxServiceMax */
++ while((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)&&
++ (PacketsServiced<RxServiceMax)) /* ~GSG 030307 */
++ {
++
++ PacketsServiced++; /* ~GSG 030307 */
++ SopRcb=CurrentRcb;
++ RxSopStatus=RxBufStatus;
++ RxPktLen = RxSopStatus&CB_SIZE_MASK;
++
++ FrmFrags=0;
++ TotalFrags=0;
++ FragIndex=0;
++ FrmLen=0;
++ EofRcb=0;
++
++/* +GSG 030508 *//* +GSG 030508 */
++
++ /* Loop through all fragments that comprise current packet. Build
++ fraglist and exit when the end of the packet is reached, or the
++ end of the descriptor list is reached. */
++ do
++ {
++ bit32u DmaLen;
++
++
++ DmaLen=CurrentRcb->Off_BLen;
++
++ FrmLen+=DmaLen;
++ TotalFrags++;
++ if (!EofRcb)
++ {
++ HalDev->fraglist[FragIndex].data=((char *)CurrentRcb->DatPtr); /* ~GSG 030508 */
++
++ HalDev->fraglist[FragIndex].len=DmaLen; /* ~GSG 030508 */
++
++ /* GSG 12/9 */
++ HalDev->fraglist[FragIndex].OsInfo = CurrentRcb->OsInfo; /* ~GSG 030508 */
++
++ /* Upper layer must do the data invalidate */
++
++ FrmFrags++;
++ FragIndex++; /* ~GSG 030508 */
++ if (FrmLen>=RxPktLen)
++ EofRcb=CurrentRcb;
++ }
++ EopRcb=CurrentRcb;
++ CurrentRcb=EopRcb->Next;
++ if (CurrentRcb)
++ {
++ osfuncDataCacheHitInvalidate((void*)CurrentRcb,16);
++ }
++ }while(((EopRcb->mode&CB_EOF_BIT)==0)&&(CurrentRcb));
++
++ /* Write the completion pointer for interrupt acknowledgement*/
++ (CPMAC_RX_INT_ACK( base , Ch )) = VirtToPhys(EopRcb) - HalDev->offset;
++
++ EopRcb->Next=0;
++
++ if (CurrentRcb == 0)
++ {
++ /* If we are out of RCB's we must not send this packet
++ to the OS. */
++ int RcbSize = HalDev->ChData[Ch].RxBufSize;
++
++ if (TotalFrags>1)
++ {
++ EopRcb->Off_BLen=RcbSize;
++ EopRcb->mode=CB_OWNERSHIP_BIT;
++ osfuncDataCacheHitWritebackAndInvalidate((void *)EopRcb, 16);
++ }
++
++ SopRcb->Off_BLen=RcbSize;
++ SopRcb->mode=CB_OWNERSHIP_BIT;
++ osfuncDataCacheHitWritebackAndInvalidate((void *)SopRcb, 16);
++
++ ((CPMAC_RX_HDP( base , Ch )) ) = VirtToPhys(SopRcb);
++ }
++ else
++ {
++ /* Dequeue packet and send to OS */
++ int mode;
++
++ /* setup SopRcb for the packet */
++ SopRcb->Eop=(void*)EopRcb;
++
++ /* dequeue packet */
++ HalDev->RxActQueueHead[Ch]=CurrentRcb;
++
++ if (EopRcb->mode&CB_EOQ_BIT)
++ {
++ /* Next pointer is non-null and EOQ bit is set, which
++ indicates misqueue packet in CPPI protocol. */
++
++ ((CPMAC_RX_HDP( base , Ch )) ) = EopRcb->HNext;
++ }
++
++ mode = (SopRcb->mode & 0xFFFF0000) | Ch;
++
++ SopRcb->mode=(FrmFrags<<8)|Ch;
++ SopRcb->Off_BLen=(bit32u)HalDev;
++
++ /* send packet up the higher layer driver */
++ OsFunc->Receive(HalDev->OsDev,HalDev->fraglist,FragIndex,RxPktLen, /* ~GSG 030508 */
++ (HAL_RECEIVEINFO *)SopRcb,mode);
++
++ RxBufStatus=CurrentRcb->mode;
++ }
++ } /* while loop */
++
++ if ((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)) /*~GSG 030307*/
++ {
++ *MoreWork = 1;
++ }
++ else
++ {
++ *MoreWork = 0;
++ }
++
++ return (EC_NO_ERRORS);
++}
++
++/*
++ * This function processes transmit interrupts. It traverses the
++ * transmit buffer queue, detecting sent data buffers and notifying the upper
++ * layer software via osSendComplete(). (for SAR, i originally had this split
++ * into two functions, one for each queue, but joined them on 8/8/02)
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Queue Queue number to service (always 0 for MAC, Choose 1 for SAR to service low priority queue)
++ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
++ *
++ * @return 0 if OK, non-zero otherwise.
++ */
++int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork)
++ {
++ HAL_TCB *CurrentTcb,*LastTcbProcessed,*FirstTcbProcessed;
++ int PacketsServiced;
++ bit32u TxFrameStatus;
++ int base;
++ int TxServiceMax = HalDev->ChData[Ch].TxServiceMax;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++/*+GSG 030303*//*+GSG 030303*/
++
++ /* load the module base address */
++ base = HalDev->dev_base;
++
++ /* Handle case of teardown interrupt. This must be checked at
++ the top of the function rather than the bottom, because
++ the normal data processing can wipe out the completion
++ pointer which is used to determine teardown complete. */
++ if (HalDev->TxTeardownPending[Ch] != 0)
++ {
++ int Ret;
++
++ Ret = TxTeardownInt(HalDev, Ch, Queue);
++ if (Ret == 0)
++ { /*+GSG 030303*/
++ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
++ return (EC_NO_ERRORS);
++ } /*+GSG 030303*/
++ }
++
++ OsFunc->CriticalOn(); /* 240904 */
++
++ CurrentTcb = HalDev->TxActQueueHead[Ch][Queue];
++ FirstTcbProcessed=CurrentTcb;
++
++ if (CurrentTcb==0)
++ {
++ /* I saw this error a couple of times when multi-channels were added */
++ dbgPrintf("[cppi TxInt()]TxH int with no TCB in queue!\n");
++ dbgPrintf(" Ch=%d, CurrentTcb = 0x%08x\n", Ch, (bit32u)CurrentTcb);
++ dbgPrintf(" HalDev = 0x%08x\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ OsFunc->CriticalOff();
++ return(EC_CPPI|EC_FUNC_TXINT|EC_VAL_NULL_TCB);
++ }
++
++ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
++ TxFrameStatus=CurrentTcb->mode;
++ PacketsServiced=0;
++
++ /* should the ownership bit check be inside of the loop?? could make it a
++ while-do loop and take this check away */
++ if ((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ {
++ do
++ {
++ /* Pop TCB(s) for packet from the stack */
++ LastTcbProcessed=CurrentTcb->Eop;
++
++ /* new location for acknowledge */
++ /* Write the completion pointer */
++ (CPMAC_TX_INT_ACK( base , Ch )) = VirtToPhys(LastTcbProcessed) - HalDev->offset;
++
++ HalDev->TxActQueueHead[Ch][Queue] = LastTcbProcessed->Next;
++
++/*+GSG 030303*//*+GSG 030303*/
++
++ osfuncDataCacheHitInvalidate((void *)LastTcbProcessed, 16);
++
++ if (LastTcbProcessed->mode&CB_EOQ_BIT)
++ {
++ if (LastTcbProcessed->Next)
++ {
++ /* Misqueued packet */
++
++ (CPMAC_TX_HDP( base , Ch )) = LastTcbProcessed->HNext;
++
++ }
++ else
++ {
++ /* Tx End of Queue */
++
++ HalDev->TxActive[Ch][Queue]=FALSE;
++ }
++ }
++
++ OsFunc->SendComplete(CurrentTcb->OsInfo);
++
++ /* Push Tcb(s) back onto the stack */
++ CurrentTcb = LastTcbProcessed->Next;
++
++ LastTcbProcessed->Next=HalDev->TcbPool[Ch][Queue];
++
++ HalDev->TcbPool[Ch][Queue]=FirstTcbProcessed;
++
++ PacketsServiced++;
++
++ TxFrameStatus=CB_OWNERSHIP_BIT;
++ /* set the first(SOP) pointer for the next packet */
++ FirstTcbProcessed = CurrentTcb;
++ if (CurrentTcb)
++ {
++ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
++ TxFrameStatus=CurrentTcb->mode;
++ }
++
++ }while(((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ &&(PacketsServiced<TxServiceMax));
++
++ if (((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ &&(PacketsServiced==TxServiceMax))
++ {
++ *MoreWork = 1;
++ }
++ else
++ {
++ *MoreWork = 0;
++ }
++ }
++ OsFunc->CriticalOff();
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function performs a teardown for the given channel. The value of the
++ * Mode parameter controls the operation of the function, as documented below.
++ *
++ * Note: If bit 3 of Mode is set, this call is blocking, and will not return
++ * until the teardown interrupt has occurred and been processed. While waiting
++ * for a blocking teardown to complete, ChannelTeardown() will signal the OS
++ * (via Control(.."Sleep"..)) to allow the OS to perform other tasks if
++ * necessary. If and only if bit 3 of Mode is clear, the CPHAL will call the
++ * OS TeardownComplete() function to indicate that the teardown has completed.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Ch Channel number.
++ * @param Mode Bit 0 (LSB): Perform Tx teardown (if set).<BR>
++ * Bit 1: Perform Rx teardown (if set). <BR>
++ * Bit 2: If set, perform full teardown (free buffers/descriptors).
++ * If clear, perform partial teardown (keep buffers). <BR>
++ * Bit 3 (MSB): If set, call is blocking.
++ * If clear, call is non-blocking.
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
++ * @ref EC_VAL_TX_TEARDOWN_ALREADY_PEND "EC_VAL_TX_TEARDOWN_ALREADY_PEND"<BR>
++ * @ref EC_VAL_RX_TEARDOWN_ALREADY_PEND "EC_VAL_RX_TEARDOWN_ALREADY_PEND"<BR>
++ * @ref EC_VAL_TX_CH_ALREADY_TORNDOWN "EC_VAL_TX_CH_ALREADY_TORNDOWN"<BR>
++ * @ref EC_VAL_RX_CH_ALREADY_TORNDOWN "EC_VAL_RX_CH_ALREADY_TORNDOWN"<BR>
++ * @ref EC_VAL_TX_TEARDOWN_TIMEOUT "EC_VAL_TX_TEARDOWN_TIMEOUT"<BR>
++ * @ref EC_VAL_RX_TEARDOWN_TIMEOUT "EC_VAL_RX_TEARDOWN_TIMEOUT"<BR>
++ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
++ */
++static int halChannelTeardown(HAL_DEVICE *HalDev, int Ch, bit32 Mode)
++ {
++ int DoTx, DoRx, Sleep=2048, timeout=0; /*MJH~030306*/
++ bit32u base = HalDev->dev_base;
++
++/* Set the module, used for error returns */
++
++ DoTx = (Mode & TX_TEARDOWN);
++ DoRx = (Mode & RX_TEARDOWN);
++
++ if (HalDev->State < enInitialized)
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_STATE);
++
++ if ((Ch < 0) || (Ch > (MAX_CHAN-1) ))
++ {
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
++ }
++
++ /* set teardown pending bits before performing the teardown, because they
++ will be used in the int handler (this is done for AAL5) */
++ if (DoTx)
++ {
++ if (HalDev->TxTeardownPending[Ch] != 0)
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_ALREADY_PEND);
++
++ /* If a full teardown, this also means that the user must
++ setup all channels again to use them */
++ if (Mode & FULL_TEARDOWN)
++ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
++
++ if (HalDev->State < enOpened)
++ {
++ /* if the hardware has never been opened, the channel has never actually
++ been setup in the hardware, so I just need to reset the software flag
++ and leave */
++ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)
++ {
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_CH_ALREADY_TORNDOWN);
++ }
++
++ /* set teardown flag */
++ HalDev->TxTeardownPending[Ch] = Mode;
++ }
++ }
++
++ if (DoRx)
++ {
++ if (HalDev->RxTeardownPending[Ch] != 0)
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_ALREADY_PEND);
++
++ if (Mode & FULL_TEARDOWN)
++ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
++
++ if (HalDev->State < enOpened)
++ {
++ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == 0)
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_CH_ALREADY_TORNDOWN);
++
++ HalDev->RxTeardownPending[Ch] = Mode;
++ }
++ }
++
++ /* Perform Tx Teardown Duties */
++ if ((DoTx) && (HalDev->State == enOpened))
++ {
++ /* Request TX channel teardown */
++ (CPMAC_TX_TEARDOWN( base )) = Ch;
++
++ /* wait until teardown has completed */
++ if (Mode & BLOCKING_TEARDOWN)
++ {
++ timeout = 0;
++ while (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
++ {
++ osfuncSleep(&Sleep);
++
++ timeout++;
++ if (timeout > 100000)
++ {
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_TIMEOUT);
++ }
++ }
++ }
++ } /* if DoTx */
++
++ /* Perform Rx Teardown Duties */
++ if ((DoRx) && (HalDev->State == enOpened))
++ {
++
++ /* perform CPMAC specific RX channel teardown */
++ CPMAC_RX_TEARDOWN(base) = Ch;
++
++ if (Mode & BLOCKING_TEARDOWN)
++ {
++ timeout = 0;
++ while (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
++ {
++ osfuncSleep(&Sleep);
++
++ timeout++;
++ if (timeout > 100000)
++ {
++ return(EC_CPMAC |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_TIMEOUT);
++ }
++ }
++ }
++ } /* if DoRx */
++
++ return (EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function closes the CPHAL module. The module will be reset.
++ * The Mode parameter should be used to determine the actions taken by
++ * Close().
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Mode Indicates actions to take on close. The following integer
++ * values are valid: <BR>
++ * 1: Does not free buffer resources, init parameters remain
++ * intact. User can then call Open() without calling Init()
++ * to attempt to reset the device and bring it back to the
++ * last known state.<BR>
++ * 2: Frees the buffer resources, but keeps init parameters. This
++ * option is a more aggressive means of attempting a device reset.
++ * 3: Frees the buffer resources, and clears all init parameters. <BR>
++ * At this point, the caller would have to call to completely
++ * reinitialize the device (Init()) before being able to call
++ * Open(). Use this mode if you are shutting down the module
++ * and do not plan to restart.
++ *
++ * @return EC_NO_ERRORS (ok).<BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * Any error code from halChannelTeardown().<BR>
++ */
++static int halClose(HAL_DEVICE *HalDev, bit32 Mode)
++ {
++ int Ch, Inst, Ret;
++ OS_DEVICE *TmpOsDev;
++ OS_FUNCTIONS *TmpOsFunc;
++ HAL_FUNCTIONS *TmpHalFunc;
++ char *TmpDeviceInfo;
++
++ int Ticks; /*MJH~030306*/
++
++ /* Verify proper device state */
++ if (HalDev->State != enOpened)
++ return (EC_CPMAC | EC_FUNC_CLOSE|EC_VAL_INVALID_STATE);
++
++ /* Teardown all open channels */
++ for (Ch = 0; Ch <= (MAX_CHAN-1) ; Ch++)
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
++ {
++ if (Mode == 1)
++ {
++ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ else
++ {
++ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ }
++
++ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
++ {
++ if (Mode == 1)
++ {
++ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ else
++ {
++ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ }
++ }
++
++ /* free fraglist in HalDev */
++ HalDev->OsFunc->Free(HalDev->fraglist);
++ HalDev->fraglist = 0;
++
++ /* unregister the interrupt */
++ HalDev->OsFunc->IsrUnRegister(HalDev->OsDev, HalDev->interrupt);
++
++ Ticks = 0; /* Disable Tick Timer */ /*MJH+030306*/
++ HalDev->OsFunc->Control(HalDev->OsDev, hcTick, hcClear, &Ticks); /*MJH+030306*/
++
++ /* Free the Phy Information Structure */
++ if(HalDev->PhyDev)
++ {
++ HalDev->OsFunc->Free(HalDev->PhyDev); /*MJH+030513*/
++ HalDev->PhyDev = 0; /*MJH+030522*/
++ }
++
++ /* Perform CPMAC specific closing functions */
++ CPMAC_MACCONTROL(HalDev->dev_base) &= ~MII_EN;
++ CPMAC_TX_CONTROL(HalDev->dev_base) &= ~TX_EN;
++ CPMAC_RX_CONTROL(HalDev->dev_base) &= ~RX_EN;
++
++ /* put device back into reset */
++ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit);
++ Ticks = 64; /*MJH~030306*/
++ osfuncSleep(&Ticks);
++
++ /* If mode is 3, than clear the HalDev and set next state to DevFound*/
++ if (Mode == 3)
++ {
++ /* I need to keep the HalDev parameters that were setup in InitModule */
++ TmpOsDev = HalDev->OsDev;
++ TmpOsFunc = HalDev->OsFunc;
++ TmpDeviceInfo = HalDev->DeviceInfo;
++
++ TmpHalFunc = HalDev->HalFuncPtr;
++ Inst = HalDev->Inst;
++
++ /* Clear HalDev */
++
++ HalDev->OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
++
++ /* Restore key parameters */
++ HalDev->OsDev = TmpOsDev;
++ HalDev->OsFunc = TmpOsFunc;
++ HalDev->DeviceInfo = TmpDeviceInfo;
++
++ HalDev->HalFuncPtr = TmpHalFunc;
++ HalDev->Inst = Inst;
++
++ HalDev->State = enDevFound;
++ }
++ else
++ {
++ HalDev->State = enInitialized;
++ }
++
++ return(EC_NO_ERRORS);
++ }
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpremap_cpmac.c linux.dev/drivers/net/avalanche_cpmac/cpremap_cpmac.c
+--- linux.old/drivers/net/avalanche_cpmac/cpremap_cpmac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpremap_cpmac.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,28 @@
++#ifndef _INC_CPREMAP_C
++#define _INC_CPREMAP_C
++
++#ifdef __ADAM2
++static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
++ {
++ asm(" cache 17, (%0)" : : "r" (ptr));
++ }
++
++static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
++ {
++ asm(" cache 25, (%0)" : : "r" (ptr));
++ }
++
++static inline void osfuncDataCacheHitWritebackAndInvalidate(void *ptr, int Size)
++ {
++ asm(" cache 21, (%0)" : : "r" (ptr));
++ }
++
++#else
++
++#define osfuncDataCacheHitInvalidate(MemPtr, Size) __asm__(" .set mips3; cache 17, (%0); .set mips0" : : "r" (MemPtr))
++#define osfuncDataCacheHitWritebackAndInvalidate(MemPtr, Size) __asm__(" .set mips3; cache 21, (%0); .set mips0" : : "r" (MemPtr))
++#define osfuncDataCacheHitWriteback(MemPtr, Size) __asm__(" .set mips3; cache 25, (%0); .set mips0" : : "r" (MemPtr))
++
++#endif
++
++#endif
+diff -urN linux.old/drivers/net/avalanche_cpmac/cpswhal_cpmac.h linux.dev/drivers/net/avalanche_cpmac/cpswhal_cpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/cpswhal_cpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/cpswhal_cpmac.h 2005-07-10 03:22:40.518159000 +0200
+@@ -0,0 +1,632 @@
++/************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cphal.h
++ *
++ * DESCRIPTION:
++ * User include file, contains data definitions shared between the CPHAL
++ * and the upper-layer software.
++ *
++ * HISTORY:
++ * Date Modifier Ver Notes
++ * 28Feb02 Greg 1.00 Original
++ * 06Mar02 Greg 1.01 Documentation enhanced
++ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
++ * 22Nov02 Mick RC2 Additions from Denis' input on Control
++ *
++ * author Greg Guyotte
++ * version 1.02
++ * date 18-Jul-2002
++ *****************************************************************************/
++#ifndef _INC_CPHAL_H
++#define _INC_CPHAL_H
++
++#ifdef _CPHAL_CPMAC
++#include "ec_errors_cpmac.h"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "ec_errors_cpaal5.h"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "ec_errors_cpsar.h"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "ec_errors_cpaal2.h"
++#endif
++
++#ifndef __ADAM2
++typedef char bit8;
++typedef short bit16;
++typedef int bit32;
++
++typedef unsigned char bit8u;
++typedef unsigned short bit16u;
++typedef unsigned int bit32u;
++
++/*
++typedef char INT8;
++typedef short INT16;
++typedef int INT32;
++typedef unsigned char UINT8;
++typedef unsigned short UINT16;
++typedef unsigned int UINT32;
++*/
++/*typedef unsigned int size_t;*/
++#endif
++
++#ifdef _CPHAL
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++
++#ifndef FALSE
++#define FALSE (1==2)
++#endif
++
++#ifndef NULL
++#define NULL 0
++#endif
++
++#endif
++
++#define VirtToPhys(a) (((int)a)&~0xe0000000)
++#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
++#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
++#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
++#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
++/*
++#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
++#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
++*/
++
++#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
++#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
++
++/* Channel Teardown Defines */
++#define RX_TEARDOWN 2
++#define TX_TEARDOWN 1
++#define BLOCKING_TEARDOWN 8
++#define FULL_TEARDOWN 4
++#define PARTIAL_TEARDOWN 0
++
++#define MAX_DIR 2
++#define DIRECTION_TX 0
++#define DIRECTION_RX 1
++#define TX_CH 0
++#define RX_CH 1
++#define HAL_ERROR_DEVICE_NOT_FOUND 1
++#define HAL_ERROR_FAILED_MALLOC 2
++#define HAL_ERROR_OSFUNC_SIZE 3
++#define HAL_DEFAULT 0xFFFFFFFF
++#define VALID(val) (val!=HAL_DEFAULT)
++
++/*
++ERROR REPORTING
++
++HAL Module Codes. Each HAL module reporting an error code
++should OR the error code with the respective Module error code
++from the list below.
++*/
++#define EC_AAL5 EC_HAL|EC_DEV_AAL5
++#define EC_AAL2 EC_HAL|EC_DEV_AAL2
++#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
++#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
++#define EC_VDMA EC_HAL|EC_DEV_VDMA
++#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
++#define EC_CPPI EC_HAL|EC_DEV_CPPI
++
++/*
++HAL Function Codes. Each HAL module reporting an error code
++should OR the error code with one of the function codes from
++the list below.
++*/
++#define EC_FUNC_HAL_INIT EC_FUNC(1)
++#define EC_FUNC_CHSETUP EC_FUNC(2)
++#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
++#define EC_FUNC_RXRETURN EC_FUNC(4)
++#define EC_FUNC_SEND EC_FUNC(5)
++#define EC_FUNC_RXINT EC_FUNC(6)
++#define EC_FUNC_TXINT EC_FUNC(7)
++#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
++#define EC_FUNC_OPTIONS EC_FUNC(9)
++#define EC_FUNC_PROBE EC_FUNC(10)
++#define EC_FUNC_OPEN EC_FUNC(11)
++#define EC_FUNC_CONTROL EC_FUNC(12)
++#define EC_FUNC_DEVICE_INT EC_FUNC(13)
++#define EC_FUNC_STATUS EC_FUNC(14)
++#define EC_FUNC_TICK EC_FUNC(15)
++#define EC_FUNC_CLOSE EC_FUNC(16)
++#define EC_FUNC_SHUTDOWN EC_FUNC(17)
++#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
++
++/*
++HAL Error Codes. The list below defines every type of error
++used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
++values in integer order to the bottom of the list.
++*/
++#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
++#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
++#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
++#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
++#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
++#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
++#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
++#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
++#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
++#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
++#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
++#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
++
++#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
++#define EC_VAL_INVALID_CH EC_ERR(0x0E)
++#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
++#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
++#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
++#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
++#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
++#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
++#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
++#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
++#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
++#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
++#define EC_VAL_INVALID_VC EC_ERR(0x19)
++#define EC_VAL_INVALID_LC EC_ERR(0x20)
++#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
++#define EC_VAL_INVALID_CID EC_ERR(0x22)
++#define EC_VAL_INVALID_UUI EC_ERR(0x23)
++#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
++#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
++
++#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
++#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
++#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
++#define EC_VAL_NO_TCBS EC_ERR(0x29)
++#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
++#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
++#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
++#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
++#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
++#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
++
++#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
++#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
++#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
++#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
++#define EC_VAL_INVALID_STATE EC_ERR(0x40)
++#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
++#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
++#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
++#define EC_VAL_NOT_LINKED EC_ERR(0x44)
++#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
++#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
++#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
++#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
++#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
++#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
++#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
++#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
++#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
++#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
++#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
++#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
++#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
++
++/**
++@defgroup shared_data Shared Data Structures
++
++The data structures documented here are shared by all modules.
++*/
++
++/**
++ * @ingroup shared_data
++ * This is the fragment list structure. Each fragment list entry contains a
++ * length and a data buffer.
++ */
++typedef struct
++ {
++ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
++ void *data; /**< Pointer to fragment data. */
++ void *OsInfo; /**< Pointer to OS defined data. */
++ }FRAGLIST;
++
++#if defined (_CPHAL_CPMAC)
++#define CB_PASSCRC_BIT (1<<26)
++
++/* CPMAC CPHAL STATUS */
++#define CPMAC_STATUS_LINK (1 << 0)
++#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
++#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
++
++/* ADAPTER CHECK Codes */
++
++#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
++#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
++#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
++#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
++
++#define _CPMDIO_DISABLE (1 << 0)
++#define _CPMDIO_HD (1 << 1)
++#define _CPMDIO_FD (1 << 2)
++#define _CPMDIO_10 (1 << 3)
++#define _CPMDIO_100 (1 << 4)
++#define _CPMDIO_NEG_OFF (1 << 5)
++#define _CPMDIO_LOOPBK (1 << 16)
++#define _CPMDIO_AUTOMDIX (1 << 17) /* Bit 16 and above not used by MII register */
++#define _CPMDIO_NOPHY (1 << 20)
++#endif
++
++/**
++ * @ingroup shared_data
++ * Channel specific configuration information. This structure should be
++ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
++ * configuration item that can be changed on a per channel basis should
++ * be represented here. Each module may define this structure with additional
++ * module-specific members.
++ */
++typedef struct
++ {
++ int Channel; /**< Channel number. */
++ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
++ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
++
++#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
++ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
++ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
++ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
++ int RxServiceMax; /**< Maximum number of packets to service at one time. */
++
++ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
++ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
++ int TxServiceMax; /**< Maximum number of packets to service at one time. */
++#endif
++
++#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
++ int Gfc; /**< Generic Flow Control. */
++ int Clp; /**< Cell Loss Priority. */
++ int Pti; /**< Payload Type Indication. */
++#endif
++
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
++ int Priority; /**< Priority bin this channel will be scheduled within. */
++ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
++ int Vci; /**< Virtual Channel Identifier. */
++ int Vpi; /**< Virtual Path Identifier. */
++ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
++
++ /* Tx VC State */
++ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
++ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
++ int TxVc_Mbs; /**< Min Burst Size in cells.*/
++ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
++
++ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
++ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
++ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Rx VC State */
++ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
++ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
++ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Tx VP State */
++ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
++ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
++ /* Rx VP State */
++ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
++ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
++ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
++#endif
++
++
++#ifdef _CPHAL_VDMAVT
++ bit32u RemFifoAddr; /* Mirror mode only. */
++ bit32u FifoAddr;
++ bit32 PollInt;
++ bit32 FifoSize;
++ int Ready;
++#endif
++
++ }CHANNEL_INFO;
++
++/*
++ * This structure contains each statistic value gathered by the CPHAL.
++ * Applications may access statistics data by using the @c StatsGet() routine.
++ */
++/* STATS */
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++typedef struct
++ {
++ bit32u CrcErrors[16];
++ bit32u LenErrors[16];
++ bit32u DmaLenErrors[16];
++ bit32u AbortErrors[16];
++ bit32u StarvErrors[16];
++ bit32u TxMisQCnt[16][2];
++ bit32u RxMisQCnt[16];
++ bit32u RxEOQCnt[16];
++ bit32u TxEOQCnt[16][2];
++ bit32u RxPacketsServiced[16];
++ bit32u TxPacketsServiced[16][2];
++ bit32u RxMaxServiced;
++ bit32u TxMaxServiced[16][2];
++ bit32u RxTotal;
++ bit32u TxTotal;
++ } STAT_INFO;
++#endif
++
++/*
++ * VDMA Channel specific configuration information
++ */
++#ifdef _CPHAL_AAL2
++typedef struct
++ {
++ int Ch; /**< Channel Number */
++ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
++ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
++ }VdmaChInfo;
++#endif
++
++#ifndef _CPHAL
++ typedef void HAL_DEVICE;
++ typedef void HAL_PRIVATE;
++ typedef void HAL_RCB;
++ typedef void HAL_RECEIVEINFO;
++#endif
++
++/**
++ * @ingroup shared_data
++ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to xxxInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
++ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
++ int (*Close) (HAL_DEVICE *HalDev, int Mode);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*Init) (HAL_DEVICE *HalDev);
++ int (*Open) (HAL_DEVICE *HalDev);
++ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
++ int (*Probe) (HAL_DEVICE *HalDev);
++ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
++ int (*Shutdown) (HAL_DEVICE *HalDev);
++ int (*Tick) (HAL_DEVICE *HalDev);
++
++#ifdef _CPHAL_AAL5
++ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
++ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
++ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
++#endif
++ } HAL_FUNCTIONS;
++
++/**
++ * @ingroup shared_data
++ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
++ * functions accessible to the CPHAL. The upper layer software is responsible
++ * for providing the correct OS-specific implementations for the following
++ * functions. It is populated by calling InitModule() (done by the CPHAL in
++ * xxxInitModule().
++ */
++typedef struct
++ {
++ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
++ void (*CriticalOn)(void);
++ void (*CriticalOff)(void);
++ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
++ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
++ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
++ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
++ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
++ void (*Free)(void *MemPtr);
++ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
++ void (*FreeDev)(void *MemPtr);
++ void (*FreeDmaXfer)(void *MemPtr);
++ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
++ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
++ void* (*Malloc)(bit32u size);
++ void* (*MallocDev)(bit32u Size);
++ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
++ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
++ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
++ void* (*Memset)(void *Dest, int C, bit32u N);
++ int (*Printf)(const char *Format, ...);
++ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
++ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
++ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
++ int (*Sprintf)(char *S, const char *Format, ...);
++ int (*Strcmpi)(const char *Str1, const char *Str2);
++ unsigned int (*Strlen)(const char *S);
++ char* (*Strstr)(const char *S1, const char *S2);
++ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
++ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
++ } OS_FUNCTIONS;
++
++/************** MODULE SPECIFIC STUFF BELOW **************/
++
++#ifdef _CPHAL_CPMAC
++
++/*
++int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
++*/
++
++int halCpmacInitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL5
++/*
++ * @ingroup shared_data
++ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++/*
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
++ bit32u Mode);
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ } AAL5_FUNCTIONS;
++*/
++
++int cpaal5InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL2
++/**
++ * @ingroup shared_data
++ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
++ int VdmaCh, int UUIDiscard);
++ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
++ int LC);
++ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
++ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
++ VdmaChInfo *VdmaCh);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
++ int RxMultiMode, int TxMultiMode, int SchedMode,
++ int TcCh);
++ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
++ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
++ } AAL2_FUNCTIONS;
++
++int cpaal2InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ AAL2_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_VDMAVT
++/**
++ * @ingroup shared_data
++ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to InitModule().
++ *
++ * Note that this list is still under definition.
++ */
++typedef struct
++ {
++ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
++ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt);
++ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt); */
++ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
++ bit32u RemDevID);
++ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
++ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
++ } VDMA_FUNCTIONS;
++
++int VdmaInitModule(HAL_DEVICE **VdmaVt,
++ OS_DEVICE *OsDev,
++ VDMA_FUNCTIONS **VdmaVtFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++/*
++extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
++ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
++ int *Size, int Inst);
++*/
++
++
++#ifdef _CPHAL_AAL5
++extern const char hcSarFrequency[];
++#endif
++
++#ifdef _CPHAL_CPMAC
++/* following will be common, once 'utl' added */
++extern const char hcClear[];
++extern const char hcGet[];
++extern const char hcSet[];
++extern const char hcTick[];
++
++extern const char hcCpuFrequency[];
++extern const char hcCpmacFrequency[];
++extern const char hcMdioBusFrequency[];
++extern const char hcMdioClockFrequency[];
++extern const char hcCpmacBase[];
++extern const char hcPhyNum[];
++extern const char hcSize[];
++extern const char hcCpmacSize[];
++extern const char hcPhyAccess[];
++extern const char hcMdixMask[];
++extern const char hcMdioMdixSwitch[];
++#endif
++
++#endif /* end of _INC_ */
+diff -urN linux.old/drivers/net/avalanche_cpmac/dox_cpmac.h linux.dev/drivers/net/avalanche_cpmac/dox_cpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/dox_cpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/dox_cpmac.h 2005-07-10 03:22:40.519159000 +0200
+@@ -0,0 +1,842 @@
++/*****************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE:
++ *
++ * DESCRIPTION:
++ * This file contains documentation for the CPMAC
++ *
++ * HISTORY:
++ * @author Michael Hanrahan/Greg Guyotte
++ * @version 1.00
++ * @date 03-Dec-2002
++ *****************************************************************************/
++#ifndef _DOX_CPMAC_H
++#define _DOX_CPMAC_H
++/**
++@page CPMAC_Implementation_Details Version
++
++@copydoc CPMAC_Version
++*/
++
++/**
++@page cpmac_intro Introduction
++
++The CPMAC implementation will support 8 channels for transmit and 8 channel for
++receive. Each of the 8 transmit channels has 1 queue associated with it. It is
++recommended that only 1 channel is used for @c Receive() per processor.
++*/
++
++/**
++@page cpmac_details API Implementation Details
++@par osReceive
++@p Mode parameter
++- The Upper 16 bits of Mode match Word 3 of the Rx Buffer Descriptor
++
++@par halSend
++@p Mode parameter
++- Bits 0-7 contain the Channel Number
++- Bits 8-25 are reserved
++- Bit 26 - if 0, the CRC will be calculated, if 1 the CRC will be Passed
++- Bits 27-31 : reserved
++@section cpmac_keys Control Keys
++
++@par StateChange
++CPHAL calls the OS when a state change is detected.
++OS should check the CPMAC Status. See the Control Key 'Status' for more details.
++
++@par Status
++OS calls the CPHAL to obtain Status information. The Returned status is as follows
++
++@par MaxFrags
++The OS may "Set" or "Get" this value. This defines the maximum
++number of fragments that can be received by the CPMAC Rx port. The default
++value for CPMAC is 2. This provides enough space to receive a maximum
++length packet (1,518 bytes) with the default buffer size of 1518 and any
++amount of RxBufferOffset. If the buffer size is configured to be smaller,
++the OS *MUST* modify this parameter according to the following formula:
++((System Max packet length)/(RxBufSize)) + 1. (The extra 1 fragment is to
++allow for RxBufferOffset)
++
++@code
++// Following defined in "cpswhal_cpmac.h"
++// CPMAC CPHAL STATUS
++#define CPMAC_STATUS_LINK (1 << 0)
++#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) // 0 - HD, 1 - FD
++#define CPMAC_STATUS_LINK_SPEED (1 << 2) // 0 - 10, 1 - 100
++
++// ADAPTER CHECK Codes
++#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
++#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8) // 0 - Tx, 1 - Rx
++#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9) See CPMAC Guide
++#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13) See CPMAC Guide
++@endcode
++
++@code
++void osStateChange(OS_DEVICE *OsDev)
++ {
++ int status;
++ OsDev->HalFunc->Control(OsDev->HalDev, "Status", hcGet, &status);
++ if(status & CPMAC_STATUS_ADAPTER_CHECK)
++ {
++ printf("[osStateChange[%d]] HAL notified OS of AdapterCheck (Link Status 0x%08X)\n", OsDev->port, status);
++ adaptercheck(OsDev->port);
++ }
++ else
++ {
++ printf("[osStateChange[%d]] HAL notified OS of State Change (Link Status %s)\n", OsDev->port, (status & CPMAC_STATUS_LINK) ? "Up" : "Down");
++ if(status & CPMAC_STATUS_LINK)
++ {
++ printf("Speed %s, Duplex %s\n",
++ status & CPMAC_STATUS_LINK_SPEED ? "100" : "10",
++ status & CPMAC_STATUS_LINK_DUPLEX ? "FD" : "HD");
++ }
++ }
++@endcode
++
++@par Tick
++ The CPHAL calls the OS to set the interval for calling halTick()<BR>
++ Note: Predefined value hcTick now recommended for use.
++@code
++*** Example Code ***
++
++*** CPHAL code ***
++int Ticks;
++HalDev->OsFunc->Control(HalDev->OsDev, hcTick, hcSet, &Ticks);
++
++*** OS code ***
++ ..
++ if(osStrcmpi(pszKey, hcTick) == 0)
++ {
++ if(osStrcmpi(pszAction, hcSet) == 0)
++ {
++ // Enable the Tick Interval
++ if(*(unsigned int *) ParmValue)
++ printf("osTickSet: Interval = %d ticks\n", Interval);
++ }
++ else
++ if(osStrcmpi(pszAction, hcClear) == 0)
++ {
++ // Request disabling of the Tick Timer, ParmValue is ignored
++ }
++ }
++@endcode
++
++@par The following information can be obtained by the OS via 'Get'
++
++- StatsDump : OS supplies pointer to an 36 element unsigned int array
++CPHAL will populate the array with the current Statistics values.<BR>
++Note: all hcXXXX values are predefined and should be used by the OS.
++
++- hcPhyNum : Returns the PHY number.
++- hcCpmacBase : Returns the base-address of the CPMAC device
++- hcCpmacSize : Returns size of the CPMAC memory map
++
++
++@par Phy Register Communication
++
++halControl() is used to read and write the Phy Registers via the key hcPhyAccess
++
++Both reading and writing the Phy registers involve setting the Value parameter of halControl()
++<BR>
++Value is a 32-bit value with bits partioned as follows
++<BR>
++
++ 0 - 4 Phy Number <BR>
++ 5 - 9 Phy Register <BR>
++ 10 - 15 reserved <BR>
++ 16 - 31 Data (write only)
++<BR>
++
++
++<B>Reading the Phy register</B>
++
++@code
++ bit32u Value;
++ bit32u RegAddr;
++ bit32u PhyNum;
++ bit32u PhyRegisterData;
++
++ // Read Phy 31, register 20
++
++ PhyNum = 31;
++ RegAddr = 20;
++
++ Value = (RegAddr << 5);
++ Value |= (PhyNum & 0x1F);
++
++ rc = HalFunc->Control(HalDev, hcPhyAccess, hcGet, (bit32u *) &Value)
++ If(rc == 0)
++ {
++ // Value is overwriten with the value in Register 20 of Phy number 31.
++ PhyRegisterData = Value;
++ }
++@endcode
++
++<B>Writing the Phy register</B>
++@code
++ bit32u Value;
++ bit32u RegAddr;
++ bit32u PhyNum;
++ bit32u PhyRegisterData;
++
++ // Reset Phy 23
++
++ PhyNum = 23;
++ RegAddr = 0;
++ PhyRegisterData = 0x8000; // Reset bit set
++
++ Value = (RegAddr << 5);
++ Value |= (PhyNum & 0x1F);
++ Value |= (PhyRegisterData << 16);
++
++ rc = HalFunc->Control(HalDev, hcPhyAccess, hcSet, (bit32u *) &Value)
++
++ // Check is reset if done
++
++ PhyNum = 23;
++ RegAddr = 0;
++
++ Value = (RegAddr << 5);
++ Value |= (PhyNum & 0x1F);
++
++ rc = HalFunc->Control(HalDev, hcPhyAccess, hcGet, (bit32u *) &Value)
++
++ If(rc == 0)
++ {
++ // Value is overwriten with the value in Register 0 of Phy number 23.
++ PhyRegisterData = Value;
++ if((PhyRegisterData & 0x8000) == 0)
++ ResetIsComplete;
++ }
++
++@endcode
++<B>
++*** Example Showing turning values off/on ***
++<BR>
++</B>
++
++@code
++
++int On=1;
++int Off=0;
++ # Turn On loopback
++ OsDev->HalFunc->Control(OsDev->HalDev, "CTRL_LOOPBACK", hcSet, (int*) &On);
++
++ # Turn off RX Flow
++ OsDev->HalFunc->Control(OsDev->HalDev, "RX_FLOW_EN", hcSet, (int*) &Off);
++@endcode
++
++@par CPMAC Configurable Parameters
++
++- RX_PASS_CRC : See MBP_Enable description
++- RX_QOS_EN : See MBP_Enable description
++- RX_NO_CHAIN : See MBP_Enable description
++- RX_CMF_EN : See MBP_Enable description
++- RX_CSF_EN : See MBP_Enable description
++- RX_CEF_EN : See MBP_Enable description
++- RX_CAF_EN : See MBP_Enable description
++- RX_PROM_CH : See MBP_Enable description
++- RX_BROAD_EN : See MBP_Enable description
++- RX_BROAD_CH : See MBP_Enable description
++- RX_MULT_EN : See MBP_Enable description
++- RX_MULT_CH : See MBP_Enable description
++
++- TX_PTYPE : See MacControl description
++- TX_PACE : See MacControl description
++- TX_FLOW_EN : See MacControl description
++- RX_FLOW_EN : See MacControl description
++- CTRL_LOOPBACK : See MacControl description
++
++- RX_MAXLEN : See CPMAC Guide
++- RX_FILTERLOWTHRESH : See CPMAC Guide
++- RX0_FLOWTHRESH : See CPMAC Guide
++- RX_UNICAST_SET : See CPMAC Guide
++- RX_UNICAST_CLEAR : See CPMAC Guide
++
++@par Multicast Support
++- RX_MULTI_ALL : When used with hcSet, sets all the Hash Bits. When used
++with hcClear clears all the Hash Bits.
++- RX_MULTI_SINGLE : When used with hcSet, adds the Hashed Mac Address. When used
++with hcClear deletes the Hashed Mac Address.
++Note: Support will be added to keep track of Single additions and deletions.
++
++@code
++*** Example Code ***
++
++*** OS code ***
++ bit8u MacAddress[6];
++ MacAddress[0] = 0x80;
++ MacAddress[1] = 0x12;
++ MacAddress[2] = 0x34;
++ MacAddress[3] = 0x56;
++ MacAddress[4] = 0x78;
++ MacAddress[5] = 0x78;
++ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_SINGLE", hcSet, (bit8u*) &MacAddress);
++ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_SINGLE", hcClear, (bit8u*) &MacAddress);
++ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_ALL", hcSet, NULL);
++ OsDev->HalFunc->Control(OsDev->HalDev, "RX_MULTI_ALL", hcClear, NULL);
++@endcode
++@par MdioConnect Fields
++<BR>
++- "MdioConnect" : The OS can set the Phy connection using this key. The default connection is Auto-Negotiation ON, All modes possible.
++
++
++- _CPMDIO_HD <----- Allow Half Duplex, default is 1 (On)
++- _CPMDIO_FD <----- Allow Full Duplex, default is 1 (On)
++- _CPMDIO_10 <----- Allow 10 Mbs, default is 1 (On)
++- _CPMDIO_100 <----- Allow 100 Mbs, default is 1 (On)
++- _CPMDIO_NEG_OFF <----- Turn off Auto Negotiation, default is 0 (Auto Neg is on)
++- _CPMDIO_NOPHY <----- Set for use with Marvel-type switch, default is 0 (Phy present)
++- _CPMDIO_AUTOMDIX <---- Enables Auto Mdix (in conjunction with MdixMask), default is 1 (On)
++
++Note: When _CPMDIO_NOPHY is set, CPMAC will report being linked at 100/FD. Reported PhyNum will be 0xFFFFFFFF
++
++@par Setting CPMAC for use with a Marvel-type Switch
++@code
++ bit32u MdioConnect;
++
++ MdioConnect = _CPMDIO_NOPHY;
++ OsDev->HalFunc->Control(OsDev->HalDev, "MdioConnect", hcSet, (bit32u*) &MdioConnect);
++@endcode
++
++@par OS Support for MDIO
++@p The OS will need to supply the following values which the CPHAL will request via halControl()
++<BR>
++- MdioBusFrequency : The frequency of the BUS that MDIO is on (requested via hcMdioBusFrequency)
++<BR>
++- MdioClockFrequency : The desired Clock Frequency that MDIO qill operate at (requested via hcMdioClockFrequency)
++*/
++
++/**
++@page cpmac_conf DeviceFindxxx() Parameters
++
++These are some of the parameters that the CPMAC will request via the DeviceFindxxx() functions -
++<BR>
++- "Mlink" : bit mask indicating what link status method Phy is using. Default is MDIO state machine (0x0)
++- "PhyMask" : bit mask indicating PhyNums used by this CPMAC (e.g 0x8000000, PhyNum is 31)
++- "MdixMask" : bit mask indicating which Phys support AutoMdix. Default is 0x0 (None)
++<BR>
++@par Example cpmac definition from the options.conf for the Sangam VDB
++<BR>
++- cpmac( id=eth0, base=0xA8610000, size=0x800, reset_bit=17, int_line=19, PhyMask=0x80000000, MLink=0, MdixMask=0 )
++*/
++
++/**
++@page auto_mdix Auto Mdix Support
++
++Auto Mdix selection is controlled by two elements in the CPMAC. First the OS can turn Auto Midx On or Off by the use of the
++MdioConnect field, _CPMDIO_AUTOMDIX. This is defaulted ON. For actual Auto Mdix operation the Phy must also be Auto Mdix capable.
++This is specified by the DeviceFindxxx() field, "MdixMask" (supplied as the variable hcMdixMask).
++If both these fields are set then the CPMDIO state machine will be enabled for Auto Mdix checking.
++If a switch to MDI or MDIX mode is needed, the CPMAC will signal this to the OS via Control() using
++the hcMdioMdixSwitch key.
++
++@par OS example for responding to a Mdix Switch Request
++<BR>
++@code
++if(osStrcmpi(pszKey, hcMdioMdixSwitch) == 0) // See if key is Mdix Switch Request
++ {
++ if(osStrcmpi(pszAction, hcSet) == 0) // Only respond to Set requests
++ {
++
++ bit32u Mdix;
++
++ Mdix = *(bit32u *) ParmValue; // Extract requested Mode
++ // 0 : MDI
++ // 1 : MDIX
++ if(Mdix)
++ osSetPhyIntoMdixMode(); // Device specific logic
++ else
++ osSetPhyIntoMdiMode(); // Device specific logic
++ rc = 0; // Set return code as Successfull
++ }
++@endcode
++*/
++
++/**
++@page cpmac_stats CPMAC Specific Statistics
++
++Statistics level '0' contains all CPMAC specific statistics.
++
++
++*/
++
++/**
++@page Example_Driver_Code
++
++@section example_intro Introduction
++This section provides an in-depth code example for driver implementations. The code
++below illustrates the use of the CPMAC HAL, but is equally applicable to any CPHAL
++implementation. Note: the CPHAl constants hcGet, hcSet etc., are currently available for use with teh CPMAC module.
++Other modules should continue to use pszGET, etc. until these are made generally available.
++
++@par Pull Model Example
++
++@code
++
++#define _CPHAL_CPMAC
++
++typedef struct _os_device_s OS_DEVICE;
++typedef struct _os_receive_s OS_RECEIVEINFO;
++typedef struct _os_send_s OS_SENDINFO;
++typedef struct _os_setup_s OS_SETUP;
++
++#include "cpswhal_cpmac.h"
++
++#define dbgPrintf printf
++
++typedef struct _os_device_s
++{
++ HAL_DEVICE *HalDev;
++ HAL_FUNCTIONS *HalFunc;
++ OS_FUNCTIONS *OsFunc;
++ OS_SETUP *OsSetup;
++ bit32u Interrupt;
++ int (*halIsr)(HAL_DEVICE *HalDev, int*);
++ int ModulePort;
++ int Protocol;
++ int LinkStatus; // 0-> down, otherwise up
++}os_device_s;
++
++typedef struct _os_receive_s
++{
++ HAL_RECEIVEINFO *HalReceiveInfo;
++ char *ReceiveBuffer;
++ OS_DEVICE *OsDev;
++}os_receive_s;
++
++typedef struct _os_send_s
++{
++ OS_DEVICE *OsDev;
++}os_send_s;
++
++typedef struct _os_setup_s
++{
++ OS_DEVICE *OsDev;
++}os_setup_s;
++
++
++
++void FlowForCphal(OS_DEVICE *OsDev)
++{
++ CHANNEL_INFO ChannelInfo;
++ int nChannels = 200;
++ int halFuncSize;
++ int rc;
++
++ // Populate OsFunc structure
++ rc = osInitModule(OsDev);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from osInitModule:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++
++ // OS-Cphal handshake
++ rc = halCpmacInitModule(&OsDev->HalDev, OsDev, &OsDev->HalFunc, OsDev->OsFunc,
++ sizeof(OS_FUNCTIONS), &halFuncSize, OsDev->ModulePort);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from halCpmacInitModule:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++ // See if hardware module exists
++ rc = OsDev->HalFunc->Probe(OsDev->HalDev);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from Probe:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++ // Initialize hardware module
++ rc = OsDev->HalFunc->Init(OsDev->HalDev);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from Init:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++ // Setup Channel Information (Tranmsit, channel 0)
++ ChannelInfo.Channel = 0;
++ ChannelInfo.Direction = DIRECTION_TX;
++ ChannelInfo.TxNumBuffers = nChannels;
++ ChannelInfo.TxNumQueues = 1;
++ ChannelInfo.TxServiceMax = nChannels/3;
++
++ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
++
++ // Setup Channel Information (Receive, channel 0)
++ ChannelInfo.Channel = 0;
++ ChannelInfo.Direction = DIRECTION_RX;
++ ChannelInfo.RxBufSize = 1518;
++ ChannelInfo.RxBufferOffset = 0;
++ ChannelInfo.RxNumBuffers = 2*nChannels;
++ ChannelInfo.RxServiceMax = nChannels/3;
++
++ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
++
++ // Open the hardware module
++ rc = OsDev->HalFunc->Open(OsDev->HalDev);
++
++ // Module now ready to Send/Receive data
++}
++
++
++int osInitModule(OS_FUNCTIONS **pOsFunc)
++ {
++ OS_FUNCTIONS *OsFunc;
++
++ OsFunc = (OS_FUNCTIONS *) malloc(sizeof(OS_FUNCTIONS));
++ if (!OsFunc)
++ return (-1);
++
++ *pOsFunc = OsFunc;
++
++ OsFunc->CriticalOff = osCriticalOff;
++ OsFunc->CriticalOn = osCriticalOn;
++ OsFunc->DataCacheHitInvalidate = osDataCacheHitInvalidate;
++ OsFunc->DataCacheHitWriteback = osDataCacheHitWriteback;
++ OsFunc->DeviceFindInfo = osDeviceFindInfo;
++ OsFunc->DeviceFindParmUint = osDeviceFindParmUint;
++ OsFunc->DeviceFindParmValue = osDeviceFindParmValue;
++ OsFunc->Free = osFree;
++ OsFunc->FreeDev = osFreeDev;
++ OsFunc->FreeDmaXfer = osFreeDmaXfer;
++ OsFunc->FreeRxBuffer = osFreeRxBuffer;
++ OsFunc->IsrRegister = osIsrRegister;
++ OsFunc->IsrUnRegister = osIsrUnRegister;
++ OsFunc->Malloc = osMalloc;
++ OsFunc->MallocDev = osMallocDev;
++ OsFunc->MallocDmaXfer = osMallocDmaXfer;
++ OsFunc->MallocRxBuffer = osMallocRxBuffer;
++
++
++ OsFunc->Memset = memset;
++ OsFunc->Printf = printf;
++ OsFunc->Sprintf = sprintf;
++ OsFunc->Strcmpi = osStrcmpi;
++ OsFunc->Strlen = strlen;
++ OsFunc->Strstr = strstr;
++ OsFunc->Strtoul = strtoul;
++
++ OsFunc->Control = osControl;
++ OsFunc->Receive = osReceive;
++ OsFunc->SendComplete = osSendComplete;
++ OsFunc->TeardownComplete = osTearDownComplete;
++
++ return(0);
++ }
++
++
++int osReceive(OS_DEVICE *OsDev,FRAGLIST *Fraglist,bit32u FragCount,bit32u PacketSize,HAL_RECEIVEINFO *halInfo, bit32u mode)
++ {
++ OS_RECEIVEINFO *skb = (OS_RECEIVEINFO *)Fraglist[0].OsInfo;
++ dcache_i((char *)Fraglist->data, Fraglist->len);
++ OsDev->HalFunc->RxReturn(halInfo,0);
++ return(0);
++ }
++
++int osSendComplete(OS_SENDINFO *skb)
++ {
++ return(0);
++ }
++
++
++static void *osMallocRxBuffer(bit32u Size,void *MemBase, bit32u MemRange,
++ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev )
++ {
++ void *HalBuffer;
++ OS_RECEIVEINFO *OsPriv;
++
++ HalBuffer=malloc(Size);
++ if (!HalBuffer)
++ {
++ return(0);
++ }
++
++ // Malloc the OS block
++ *OsReceiveInfo = malloc(sizeof(OS_RECEIVEINFO));
++ if (!*OsReceiveInfo)
++ {
++ free(HalBuffer);
++ return(0);
++ }
++
++ // Initialize the new buffer descriptor
++ OsPriv = *OsReceiveInfo;
++ OsPriv->OsDev = OsDev;
++ OsPriv->ReceiveBuffer = HalBuffer;
++ OsPriv->HalReceiveInfo = HalReceiveInfo;
++
++ return(HalBuffer);
++ }
++
++
++void SendBuffer(OS_DEVICE *OsDev, char *Buffer, int Size)
++{
++ FRAGLIST Fraglist;
++ bit32u FragCount;
++
++ tcb_pending++;
++ Fraglist.len = Size;
++ Fraglist.data = (unsigned *) Buffer;
++ FragCount = 1;
++ mode = 0; // Channel 0
++
++ dcache_wb(Fraglist.data, Fraglist.len);
++ OsDev->HalFunc->Send(OsDev->HalDev, &Fraglist, FragCount, Size, (OS_SENDINFO *) Buffer, mode);
++}
++
++
++void osStateChange(OS_DEVICE *OsDev)
++ {
++ int status;
++ int LinkStatus;
++ OsDev->HalFunc->Control(OsDev->HalDev, "Status", hcGet, &status);
++ if(status & CPMAC_STATUS_ADAPTER_CHECK)
++ {
++ // Adapter Check, take appropiate action
++ }
++ else
++ {
++ LinkStatus = status & CPMAC_STATUS_LINK;
++ if(LinkStatus != OsDev->LinkStatus)
++ {
++ dbgPrintf("\n%s:Link %s for inst %d Speed %s, Duplex %s\n",
++ __FUNCTION__,
++ LinkStatus ? "up" : "down",
++ OsDev->ModulePort,
++ status & CPMAC_STATUS_LINK_SPEED ? "100" : "10",
++ status & CPMAC_STATUS_LINK_DUPLEX ? "FD" : "HD");
++ OsDev->LinkStatus = LinkStatus;
++ }
++ }
++ }
++
++
++int osControl(OS_DEVICE *OsDev, const char *pszKey, const char* pszAction, void *ParmValue)
++ {
++ int rc=-1;
++
++ if (osStrcmpi(pszKey, hcCpuFrequency) == 0)
++ {
++ if(osStrcmpi(pszAction, hcGet) == 0)
++ {
++ *(bit32u*) ParmValue = cpufreq;
++ rc = 0;
++ }
++ }
++ if (osStrcmpi(pszKey, hcMdioBusFrequency) == 0)
++ {
++ if(osStrcmpi(pszAction, hcGet) == 0)
++ {
++ *(bit32u *)ParmValue = MdioBusFrequency;
++ rc = 0;
++ }
++ }
++if (osStrcmpi(pszKey, hcMdioClockFrequency) == 0)
++ {
++ if(osStrcmpi(pszAction, hcGet) == 0)
++ {
++ *(bit32u *)ParmValue = MdioClockFrequency;
++ rc = 0;
++ }
++ }
++
++ if (osStrcmpi(pszKey, hcTick) == 0)
++ {
++ if(osStrcmpi(pszAction, hcSet) == 0)
++ {
++ osTickSetInterval(OsDev, *(unsigned int *) ParmValue);
++ rc = 0;
++ }
++ else
++ if(osStrcmpi(pszAction, hcClear) == 0)
++ {
++ osTickDisable(OsDev);
++ rc = 0;
++ }
++ }
++
++ if (osStrcmpi(pszKey, "SioFlush") == 0)
++ {
++ MySioFlush();
++ rc = 0;
++ }
++
++ if (osStrcmpi(pszKey, "StateChange") == 0)
++ {
++ osStateChange(OsDev);
++ rc = 0;
++ }
++
++ if (osStrcmpi(pszKey, "Sleep") == 0)
++ {
++ osSleep(*(int *)ParmValue);
++ rc = 0;
++ }
++ return(rc);
++ }
++
++@endcode
++
++
++@par Push Model Example (Currently Eswitch ONLY)
++
++@code
++
++typedef struct _os_device_s OS_DEVICE;
++typedef struct _os_receive_s OS_RECEIVEINFO;
++typedef struct _os_send_s OS_SENDINFO;
++typedef struct _os_setup_s OS_SETUP;
++
++#include "cpswhal.h" //Get glogal HAL stuff
++#include "cpswhaleswitch.h" //Get device specific hal stuff
++
++
++typedef struct _os_device_s
++{
++ HAL_DEVICE *HalDev;
++ HAL_FUNCTIONS *HalFunc;
++ OS_FUNCTIONS *OsFunc;
++ OS_SETUP *OsSetup;
++ bit32u Interrupt;
++ int (*halIsr)(HAL_DEVICE *HalDev, int*);
++ int ModulePort;
++ int Protocol;
++ int LinkStatus; // 0-> down, otherwise up
++}os_device_s;
++
++typedef struct _os_receive_s
++{
++ HAL_RECEIVEINFO *HalReceiveInfo;
++ char *ReceiveBuffer;
++ OS_DEVICE *OsDev;
++}os_receive_s;
++
++typedef struct _os_send_s
++{
++ OS_DEVICE *OsDev;
++}os_send_s;
++
++typedef struct _os_setup_s
++{
++ OS_DEVICE *OsDev;
++}os_setup_s;
++
++
++
++void FlowForCphal(OS_DEVICE *OsDev)
++{
++CHANNEL_INFO ChannelInfo;
++ int nChannels = 200;
++ int halFuncSize;
++ int rc;
++
++ // Populate OsFunc structure
++ rc = osInitModule(OsDev);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from osInitModule:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++
++ // OS-Cphal handshake
++ rc = cpswHalEswitchInitModule(&OsDev->HalDev, OsDev, &OsDev->HalFunc, OsDev->OsFunc,
++ sizeof(OS_FUNCTIONS), &halFuncSize, OsDev->ModulePort);
++
++ if(rc)
++ {
++ sprintf(bufTmp, "%s: return code from cpswHalEswitchInitModule:'0x%08X'", __FUNCTION__, rc);
++ errorout(bufTmp);
++ }
++
++
++ ChannelInfo.Channel = 7;
++ ChannelInfo.Direction = DIRECTION_RX;
++ ChanInfo.Receive = osReceiveSS; // Specify function to receive data for this channel
++
++ rc = OsDev->HalFunc->ChannelSetup(OsDev->HalDev, &ChannelInfo, OsDev->OsSetup);
++
++ MyConfig.debug=0;
++ MyConfig.CpuFrequency = CpuFreq;
++ MyConfig.EswitchFrequency = EswitchFreq;
++ MyConfig.ResetBase = 0xa8611600;
++ MyConfig.MacAddress = MacAddr;
++
++ MyConfig.EswitchResetBit= 27;
++ MyConfig.Cpmac0ResetBit = 17;
++ MyConfig.Cpmac1ResetBit = 21;
++ MyConfig.MdioResetBit = 22;
++ MyConfig.Phy0ResetBit = 26;
++ MyConfig.Phy1ResetBit = 28;
++ MyConfig.HdmaResetBit = 13;
++ MyConfig.Cpmac0IntBit = 19;
++ MyConfig.Cpmac1IntBit = 33;
++ MyConfig.EswitchIntBit = 27;
++ MyConfig.EswitchBase = 0xa8640000;
++ MyConfig.EswitchBufferSize = 64;
++ MyConfig.EswitchHostBufCount = 0;
++ MyConfig.EswitchDefaultCamSize = 64;
++ MyConfig.EswitchOverFlowCount = 200;
++ MyConfig.EswitchOverFlowSize = 256;
++
++
++
++
++ rc=EswitchConfig(HalDev,HalFunc,&MyConfig);
++
++
++ // Open the hardware module
++ rc = OsDev->HalFunc->Open(OsDev->HalDev);
++
++ // Module now ready to Send/Receive data
++}
++
++
++int EswitchConfig(HAL_DEVICE *HalDev, HAL_FUNCTIONS *HalFunc, ESWITCH_CONFIG *Config)
++{
++ bit32u sts;
++ sts = 0;
++
++ sts |= cpswhalPushBin(hcdebug, Config->debug);
++ sts |= cpswhalPushBin(hcCpuFrequency , Config->CpuFrequency );
++ sts |= cpswhalPushBin(hcEswitchFrequency , Config->EswitchFrequency );
++ sts |= cpswhalPushBin(hcResetBase , Config->ResetBase );
++ sts |= cpswhalPushBin(hcMacAddress , Config->MacAddress );
++ sts |= cpswhalPushBin(hcEswitchResetBit, Config->EswitchResetBit);
++ sts |= cpswhalPushBin(hcCpmac0ResetBit , Config->Cpmac0ResetBit );
++ sts |= cpswhalPushBin(hcCpmac1ResetBit , Config->Cpmac1ResetBit );
++ sts |= cpswhalPushBin(hcMdioResetBit , Config->MdioResetBit );
++ sts |= cpswhalPushBin(hcPhy0ResetBit , Config->Phy0ResetBit );
++ sts |= cpswhalPushBin(hcPhy1ResetBit , Config->Phy1ResetBit );
++ sts |= cpswhalPushBin(hcHdmaResetBit , Config->HdmaResetBit );
++ sts |= cpswhalPushBin(hcCpmac0IntBit , Config->Cpmac0IntBit );
++ sts |= cpswhalPushBin(hcCpmac1IntBit , Config->Cpmac1IntBit );
++ sts |= cpswhalPushBin(hcEswitchIntBit , Config->EswitchIntBit );
++ sts |= cpswhalPushBin(hcEswitchBase , Config->EswitchBase );
++ sts |= cpswhalPushBin(hcEswitchBufferSize , Config->EswitchBufferSize );
++ sts |= cpswhalPushBin(hcEswitchHostBufCount , Config->EswitchHostBufCount );
++ sts |= cpswhalPushBin(hcEswitchDefaultCamSize , Config->EswitchDefaultCamSize );
++ sts |= cpswhalPushBin(hcEswitchOverFlowCount , Config->EswitchOverFlowCount );
++ sts |= cpswhalPushBin(hcEswitchOverFlowSize , Config->EswitchOverFlowSize );
++ return(sts);
++}
++
++
++
++@endcode
++*/
++
++#endif
+diff -urN linux.old/drivers/net/avalanche_cpmac/ec_errors_cpmac.h linux.dev/drivers/net/avalanche_cpmac/ec_errors_cpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/ec_errors_cpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/ec_errors_cpmac.h 2005-07-10 03:22:40.519159000 +0200
+@@ -0,0 +1,118 @@
++/***************************************************************************
++ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
++
++ FILE: ec_errors.h
++
++ DESCRIPTION:
++ This file contains definitions and function declarations for
++ error code support.
++
++ HISTORY:
++ 14Dec00 MJH Added masking to EC_CLASS etc macros
++ 17Sep02 GSG Added HAL support (new class&devices)
++ 03Oct02 GSG Removed C++ style comments
++***************************************************************************/
++#ifndef _INC_EC_ERRORS
++#define _INC_EC_ERRORS
++
++/*
++ 31 - CRITICAL
++ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
++ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
++ 23-16 - DEVICE (ie. EMAC, IIC, etc)
++ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
++ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
++*/
++
++/*---------------------------------------------------------------------------
++ Useful defines for accessing fields within error code
++---------------------------------------------------------------------------*/
++#define CRITICAL_SHIFT 31
++#define CLASS_SHIFT 28
++#define INST_SHIFT 24
++#define DEVICE_SHIFT 16
++#define FUNCTION_SHIFT 8
++#define ERROR_CODE_SHIFT 0
++
++#define CRITICAL_MASK 1
++#define CLASS_MASK 0x07
++#define DEVICE_MASK 0xFF
++#define INST_MASK 0x0F
++#define FUNCTION_MASK 0xFF
++#define ERROR_CODE_MASK 0xFF
++
++#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
++#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
++#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
++#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
++#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
++
++/*---------------------------------------------------------------------------
++ Operation classes
++---------------------------------------------------------------------------*/
++#define EC_HAL EC_CLASS(0)
++#define EC_DIAG EC_CLASS(8)
++
++/*---------------------------------------------------------------------------
++ Device types
++---------------------------------------------------------------------------*/
++#define EC_DEV_EMAC EC_DEVICE(1)
++#define EC_DEV_IIC EC_DEVICE(2)
++#define EC_DEV_RESET EC_DEVICE(3)
++#define EC_DEV_ATMSAR EC_DEVICE(4)
++#define EC_DEV_MEM EC_DEVICE(5)
++#define EC_DEV_DES EC_DEVICE(6)
++#define EC_DEV_DMA EC_DEVICE(7)
++#define EC_DEV_DSP EC_DEVICE(8)
++#define EC_DEV_TMR EC_DEVICE(9)
++#define EC_DEV_WDT EC_DEVICE(10)
++#define EC_DEV_DCL EC_DEVICE(11)
++#define EC_DEV_BBIF EC_DEVICE(12)
++#define EC_DEV_PCI EC_DEVICE(13)
++#define EC_DEV_XBUS EC_DEVICE(14)
++#define EC_DEV_DSLIF EC_DEVICE(15)
++#define EC_DEV_USB EC_DEVICE(16)
++#define EC_DEV_CLKC EC_DEVICE(17)
++#define EC_DEV_RAPTOR EC_DEVICE(18)
++#define EC_DEV_DSPC EC_DEVICE(19)
++#define EC_DEV_INTC EC_DEVICE(20)
++#define EC_DEV_GPIO EC_DEVICE(21)
++#define EC_DEV_BIST EC_DEVICE(22)
++#define EC_DEV_HDLC EC_DEVICE(23)
++#define EC_DEV_UART EC_DEVICE(24)
++#define EC_DEV_VOIC EC_DEVICE(25)
++/* 9.17.02 (new HAL modules) */
++#define EC_DEV_CPSAR EC_DEVICE(0x1A)
++#define EC_DEV_AAL5 EC_DEVICE(0x1B)
++#define EC_DEV_AAL2 EC_DEVICE(0x1C)
++#define EC_DEV_CPMAC EC_DEVICE(0x1D)
++#define EC_DEV_VDMA EC_DEVICE(0x1E)
++#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
++#define EC_DEV_CPPI EC_DEVICE(0x20)
++#define EC_DEV_CPMDIO EC_DEVICE(0x21)
++
++/*---------------------------------------------------------------------------
++ Function types
++---------------------------------------------------------------------------*/
++#define EC_FUNC_READ_CONF EC_FUNC(1)
++#define EC_FUNC_INIT EC_FUNC(2)
++
++/*---------------------------------------------------------------------------
++ Error codes
++---------------------------------------------------------------------------*/
++#define EC_CRITICAL (1<<CRITICAL_SHIFT)
++#define EC_NO_ERRORS 0
++#define EC_VAL_NO_BASE EC_ERR(1)
++#define EC_VAL_NO_RESET_BIT EC_ERR(2)
++#define EC_VAL_NO_RESET EC_ERR(3)
++#define EC_VAL_BAD_BASE EC_ERR(4)
++#define EC_VAL_MALLOCFAILED EC_ERR(5)
++#define EC_VAL_NO_RESETBASE EC_ERR(6)
++#define EC_DEVICE_NOT_FOUND EC_ERR(7)
++
++/*---------------------------------------------------------------------------
++ Function declarations
++---------------------------------------------------------------------------*/
++extern void ec_log_error( unsigned int );
++
++#endif /* _INC_EC_ERRORS */
+diff -urN linux.old/drivers/net/avalanche_cpmac/hcpmac.c linux.dev/drivers/net/avalanche_cpmac/hcpmac.c
+--- linux.old/drivers/net/avalanche_cpmac/hcpmac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/hcpmac.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,1878 @@
++/******************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002-2004 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE:
++ *
++ * DESCRIPTION:
++ * This file contains the code for the HAL EMAC Bridge Test
++ *
++ * HISTORY:
++ * xxXxx01 Denis RC1.00 Original Version created.
++ * 22Jan02 Denis/Mick RC1.01 Modified for HAL EMAC API
++ * 24Jan02 Denis/Mick RC1.02 Speed Improvements
++ * 28Jan02 Denis/Mick RC1.16 Made function calls pointers
++ * 28Jan02 Mick RC1.18 Split into separate modules
++ * 29Jan02 Mick RC1.19 Hal include file cleaned up
++ * 15Jul02 Michael Hanrahan RC1.20 Synch'd with Linux Version
++ * 23Sep02 Michael Hanrahan RC1.21 Added CPPI.C
++ * 16Oct02 Michael Hanrahan RC1.22 Added CAF etc to Options.Conf
++ * 09Jan03 Michael Hanrahan RC3.01 Fixed incorrect MDIO check
++ * 01Feb03 Michael Hanrahan RC3.02 Updated for GPIO/PBUSFREQ
++ * 29Mar03 Michael Hanrahan 1.03 Corrected ChannelConfigGet
++ * 29Mar03 Michael Hanrahan 1.03 Removed user setting of TxNumQueues
++ * 23Aug04 Michael Hanrahan 1.7.8 Support for Setting Mac Address
++ * @author Michael Hanrahan
++ * @version 1.02
++ * @date 24-Jan-2002
++ *****************************************************************************/
++#define _HAL_CPMAC
++#define _CPHAL_CPMAC
++#define _CPHAL
++#define __CPHAL_CPMDIO
++
++#include "dox_cpmac.h" /* Documentation information */
++
++/* OS Data Structure definitions */
++
++typedef void OS_PRIVATE;
++typedef void OS_DEVICE;
++typedef void OS_SENDINFO;
++typedef void OS_RECEIVEINFO;
++typedef void OS_SETUP;
++
++/* HAL Data Structure definitions */
++
++typedef struct _phy_device PHY_DEVICE;
++typedef struct hal_device HAL_DEVICE;
++typedef struct hal_private HAL_PRIVATE;
++typedef struct hal_private HAL_RECEIVEINFO;
++
++#include "cpcommon_cpmac.h"
++#include "cpswhal_cpmac.h"
++#include "cpmdio.h"
++#include "hcpmac.h"
++#include "cpmac_reg.h"
++
++
++#define EC_MODULE
++
++/* MDIO Clock Frequency Default Value */
++
++/* Rcb/Tcb Constants */
++
++#define CB_SOF_BIT (1<<31)
++#define CB_EOF_BIT (1<<30)
++#define CB_SOF_AND_EOF_BIT (CB_SOF_BIT|CB_EOF_BIT)
++#define CB_OWNERSHIP_BIT (1<<29)
++#define CB_EOQ_BIT (1<<28)
++#define CB_SIZE_MASK 0x0000ffff
++#define RCB_ERRORS_MASK 0x03fe0000
++
++static char *channel_names[] = CHANNEL_NAMES; /* GSG 11/22 (may change this implementation) */
++
++#define scFound(Module) if (HalDev->State != enDevFound) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
++#define scInit(Module) if (HalDev->State < enInitialized) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
++#define scOpen(Module) if (HalDev->State < enOpened) return (Module|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE)
++
++
++
++/********************************************************************
++**
++** L O C A L F U N C T I O N S
++**
++********************************************************************/
++static int halIsr(HAL_DEVICE *HalDev, int *MorePackets);
++static int cpmacRandom(HAL_DEVICE *HalDev);
++static int cpmacRandomRange(HAL_DEVICE *HalDev, int min, int max);
++static int halPacketProcessEnd(HAL_DEVICE *HalDev);
++
++#include "cpcommon_cpmac.c" /*~RC3.02*/
++#include "cppi_cpmac.c"
++#include "cpmdio.c" /*~RC3.02*/
++
++static int MacAddressSave(HAL_DEVICE *HalDev, unsigned char *MacAddr)
++ {
++ int i;
++ int inst = HalDev->inst;
++
++ HalDev->MacAddr = MacAddr;
++
++ if(HalDev->debug)
++ {
++ dbgPrintf("MacAddrSave[%d]: ", inst);
++ for (i=0;i<6;i++)
++ dbgPrintf("%X", HalDev->MacAddr[i]);
++ dbgPrintf("\n");
++ osfuncSioFlush();
++ }
++ return(EC_NO_ERRORS);
++ }
++static int MacAddressSet(HAL_DEVICE *HalDev)
++ {
++ unsigned char *macadr = &HalDev->MacAddr[0];
++ int base = HalDev->dev_base;
++
++ scOpen(EC_CPMAC);
++ CPMAC_MACADDRLO_0(base) = macadr[5];
++ CPMAC_MACADDRMID(base) = macadr[4];
++ CPMAC_MACADDRHI(base) = (macadr[0])|(macadr[1]<<8)|(macadr[2]<<16)|(macadr[3]<<24);
++ if(HalDev->debug)
++ {
++ dbgPrintf("MacAddrSet: MacAddr(%d) %X %X %X\n", HalDev->inst, CPMAC_MACADDRLO_0(base),
++ CPMAC_MACADDRMID(base),
++ CPMAC_MACADDRHI(base));
++
++ dbgPrintf("Start MAC: %d\n",HalDev->dev_base);
++ osfuncSioFlush();
++ }
++ return(EC_NO_ERRORS);
++ }
++
++
++/*
++ Updates the MacHash registers
++*/
++static void MacHashSet(HAL_DEVICE *HalDev)
++ {
++ if(HalDev->State < enOpened)
++ return;
++
++ CPMAC_MACHASH1(HalDev->dev_base) = HalDev->MacHash1;
++ CPMAC_MACHASH2(HalDev->dev_base) = HalDev->MacHash2;
++ if (DBG(11))
++ dbgPrintf("CPMAC[%X]: MacHash1 0x%08X, MacHash2 0x%08X\n", HalDev->dev_base, CPMAC_MACHASH1(HalDev->dev_base), CPMAC_MACHASH2(HalDev->dev_base));
++ }
++
++/*
++ Reads the MacControl register and updates
++ the changable bits. (See MACCONTROL_MASK)
++*/
++static void RxMBP_EnableSet(HAL_DEVICE *HalDev)
++ {
++ bit32u RxMbpEnable;
++ if(HalDev->State < enOpened)
++ return;
++ RxMbpEnable = CPMAC_RX_MBP_ENABLE(HalDev->dev_base);
++ RxMbpEnable &= ~RX_MBP_ENABLE_MASK; /* Clear out updatable bits */
++ RxMbpEnable |= HalDev->RxMbpEnable;
++ CPMAC_RX_MBP_ENABLE(HalDev->dev_base) = RxMbpEnable;
++ }
++/*
++ Reads the MacControl register and updates
++ the changable bits. (See MACCONTROL_MASK)
++*/
++static void MacControlSet(HAL_DEVICE *HalDev)
++ {
++ bit32u MacControl;
++ if(HalDev->State < enOpened)
++ return;
++ MacControl = CPMAC_MACCONTROL(HalDev->dev_base);
++ MacControl &= ~MACCONTROL_MASK; /* Clear out updatable bits */
++ MacControl |= HalDev->MacControl;
++ if(!(MacControl & MII_EN)) /* If Enable is not set just update register */
++ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
++ else
++ {
++ if(MacControl & CTRL_LOOPBACK) /* Loopback Set */
++ {
++ /* mii_en is set and loopback is needed,
++ clear mii_en, set loopback, then set mii_en
++ */
++ MacControl &= ~MII_EN; /* Clear MII_EN */
++ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
++ CPMAC_MACCONTROL(HalDev->dev_base) |= MII_EN; /* Set MII_EN */
++ HalDev->Linked = 1; /* if in loopback the logically linked */
++ }
++ else /* If Loopback not set just update */
++ {
++ CPMAC_MACCONTROL(HalDev->dev_base) = MacControl;
++ }
++ }
++ if(DBG(0))
++ dbgPrintf("[halMacControlSet]MacControl:%08X\n", CPMAC_MACCONTROL(HalDev->dev_base));
++ }
++static int UnicastSet(HAL_DEVICE *HalDev)
++ {
++ CPMAC_RX_UNICAST_SET(HalDev->dev_base) = HalDev->RxUnicastSet;
++ CPMAC_RX_UNICAST_CLEAR(HalDev->dev_base) = HalDev->RxUnicastClear;
++ return(EC_NO_ERRORS);
++ }
++
++
++static bit32u HashGet(bit8u *Address)
++ {
++ bit32u hash;
++ bit8u tmpval;
++ int i;
++
++ hash = 0;
++ for( i=0; i<2; i++ )
++ {
++ tmpval = *Address++;
++ hash ^= (tmpval>>2)^(tmpval<<4);
++ tmpval = *Address++;
++ hash ^= (tmpval>>4)^(tmpval<<2);
++ tmpval = *Address++;
++ hash ^= (tmpval>>6)^(tmpval);
++ }
++
++ return( hash & 0x3F );
++ }
++
++static void HashAdd(HAL_DEVICE *HalDev, bit8u *MacAddress)
++{
++ bit32u HashValue;
++ bit32u HashBit;
++
++ HashValue = HashGet(MacAddress);
++
++ if(HashValue < 32)
++ {
++ HashBit = (1 << HashValue);
++ HalDev->MacHash1 |= HashBit;
++ }
++ else
++ {
++ HashBit = (1 << (HashValue-32));
++ HalDev->MacHash2 |= HashBit;
++ }
++}
++
++static void HashDel(HAL_DEVICE *HalDev, bit8u *MacAddress)
++{
++ bit32u HashValue;
++ bit32u HashBit;
++
++ HashValue = HashGet(MacAddress);
++
++ if(HashValue < 32)
++ {
++ HashBit = (1 << HashValue);
++ HalDev->MacHash1 &= ~HashBit;
++ }
++ else
++ {
++ HashBit = (1 << (HashValue-32));
++ HalDev->MacHash2 &= ~HashBit;
++ }
++}
++
++/* Replace with an array based on key, with a ptr to the code to do */
++/* e.g. [enRX_PASS_CRC] = {Set, MBP_UPDATE() } */
++static void DuplexUpdate(HAL_DEVICE *HalDev)
++{
++ int base = HalDev->dev_base;
++ PHY_DEVICE *PhyDev = HalDev->PhyDev;
++
++ if(HalDev->State < enOpened)
++ return;
++
++ /* No Phy Condition */
++ if(HalDev->MdioConnect & _CPMDIO_NOPHY) /*MJH+030805*/
++ {
++ /* No Phy condition, always linked */
++ HalDev->Linked = 1;
++ HalDev->EmacSpeed = 1;
++ HalDev->EmacDuplex = 1;
++ HalDev->PhyNum = 0xFFFFFFFF; /* No Phy Num */
++ CPMAC_MACCONTROL(base) |= FULLDUPLEX; /*MJH+030909*/
++ osfuncStateChange();
++ return;
++ }
++
++ if(HalDev->MacControl & CTRL_LOOPBACK) /* Loopback Set */
++ {
++ HalDev->Linked = 1;
++ return;
++ }
++
++ if (HalDev->MdioConnect & _CPMDIO_LOOPBK)
++ {
++ HalDev->Linked = cpMacMdioGetLoopback(HalDev->PhyDev);
++ }
++ else
++ {
++ HalDev->Linked = cpMacMdioGetLinked(HalDev->PhyDev);
++ }
++ if (HalDev->Linked)
++ {
++ /* Retreive Duplex and Speed and the Phy Number */
++ if(HalDev->MdioConnect & _CPMDIO_LOOPBK)
++ HalDev->EmacDuplex = 1;
++ else
++ HalDev->EmacDuplex = cpMacMdioGetDuplex(PhyDev);
++ HalDev->EmacSpeed = cpMacMdioGetSpeed(PhyDev);
++ HalDev->PhyNum = cpMacMdioGetPhyNum(PhyDev);
++
++ if(HalDev->EmacDuplex)
++ CPMAC_MACCONTROL(base) |= FULLDUPLEX;
++ else
++ CPMAC_MACCONTROL(base) &= ~FULLDUPLEX;
++ if(HalDev->debug)
++ dbgPrintf("%d: Phy= %d, Speed=%s, Duplex=%s\n",HalDev->inst,HalDev->PhyNum,(HalDev->EmacSpeed)?"100":"10",(HalDev->EmacDuplex)?"Full":"Half");
++ }
++ if(HalDev->debug)
++ dbgPrintf("DuplexUpdate[%d]: MACCONTROL 0x%08X, %s\n", HalDev->inst, CPMAC_MACCONTROL(base),(HalDev->Linked)?"Linked":"Not Linked");
++}
++static void MdioSetPhyMode(HAL_DEVICE *HalDev)
++ {
++ unsigned int PhyMode;
++ /* Verify proper device state */
++ if (HalDev->State < enOpened)
++ return;
++
++ PhyMode = NWAY_AUTO|NWAY_FD100|NWAY_HD100|NWAY_FD10|NWAY_HD10;
++ if(DBG(0))
++ {
++ dbgPrintf("halSetPhyMode1: MdioConnect:%08X ,", HalDev->MdioConnect);
++ dbgPrintf("PhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
++ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
++ PhyMode&NWAY_HD100);
++ }
++
++
++ if ( HalDev->MdioConnect & _CPMDIO_NEG_OFF) /* ~RC3.01 */
++ PhyMode &= ~(NWAY_AUTO); /* Disable Auto Neg */
++ if (!(HalDev->MdioConnect & _CPMDIO_HD))
++ PhyMode &= ~(NWAY_HD100|NWAY_HD10); /* Cannot support HD */
++ if (!(HalDev->MdioConnect & _CPMDIO_FD))
++ PhyMode &= ~(NWAY_FD100|NWAY_FD10); /* Cannot support FD */
++ if (!(HalDev->MdioConnect & _CPMDIO_10))
++ PhyMode &= ~(NWAY_HD10|NWAY_FD10); /* Cannot support 10 Mbs */
++ if (!(HalDev->MdioConnect & _CPMDIO_100))
++ PhyMode &= ~(NWAY_HD100|NWAY_FD100); /* Cannot support 100 Mbs */
++
++ if(HalDev->MdioConnect & _CPMDIO_AUTOMDIX) PhyMode |= NWAY_AUTOMDIX; /* Set AutoMdix */
++
++ if (HalDev->CpmacFrequency <= 50000000)
++ PhyMode &= ~(NWAY_FD100|NWAY_HD100); /* Cannot support 100 MBS */
++ if(DBG(7))
++ dbgPrintf("halNeg: PhyMode[0x%08X] %d\n", HalDev->dev_base, PhyMode);
++
++ if(DBG(0))
++ {
++ dbgPrintf("halSetPhyMode2: MdioConnect:%08X ,", HalDev->MdioConnect);
++ dbgPrintf("PhyMode:%08X Auto:%d, FD10:%d, HD10:%d, FD100:%d, HD100:%d\n", PhyMode,
++ PhyMode&NWAY_AUTO, PhyMode&NWAY_FD10, PhyMode&NWAY_HD10, PhyMode&NWAY_FD100,
++ PhyMode&NWAY_HD100);
++ }
++
++
++ cpMacMdioSetPhyMode(HalDev->PhyDev,PhyMode);
++ DuplexUpdate(HalDev);
++ }
++static int StatsClear(HAL_DEVICE *HalDev)
++{
++ int i;
++ MEM_PTR pStats;
++
++ scOpen(EC_CPMAC);
++
++ pStats = pCPMAC_RXGOODFRAMES(HalDev->dev_base);
++ for (i=0;i<STATS_MAX;i++)
++ {
++ *(MEM_PTR)(pStats) = 0xFFFFFFFF;
++ pStats++;
++ }
++
++ return(EC_NO_ERRORS);
++}
++static void StatsDump(HAL_DEVICE *HalDev, void *Value)
++ {
++ MEM_PTR ptrStats;
++ MEM_PTR ptrValue;
++ int i;
++ ptrStats = pCPMAC_RXGOODFRAMES(HalDev->dev_base);
++ ptrValue = (bit32u*) Value;
++ for (i=0; i<STATS_MAX; i++)
++ {
++ *ptrValue = *ptrStats;
++ if(DBG(4))
++ {
++ dbgPrintf("halStatsDump: Stat[%d:0x%08X] %d 0x%08X %d\n", i, ptrStats, *ptrStats, ptrValue, *ptrValue);
++ osfuncSioFlush();
++ }
++ ptrStats++;
++ ptrValue++;
++ }
++ }
++static void ConfigApply(HAL_DEVICE *HalDev)
++ {
++ CPMAC_RX_MAXLEN(HalDev->dev_base) = HalDev->RxMaxLen;
++ CPMAC_RX_FILTERLOWTHRESH(HalDev->dev_base) = HalDev->RxFilterLowThresh;
++ CPMAC_RX0_FLOWTHRESH(HalDev->dev_base) = HalDev->Rx0FlowThresh;
++ UnicastSet(HalDev);
++ MacAddressSet(HalDev);
++ RxMBP_EnableSet(HalDev);
++ MacHashSet(HalDev);
++ MacControlSet(HalDev);
++ if(DBG(0))
++ dbgPrintf("ValuesUpdate[%d]: MBP_ENABLE 0x%08X\n", HalDev->inst, CPMAC_RX_MBP_ENABLE(HalDev->dev_base));
++ }
++static int halStatus(HAL_DEVICE *HalDev)
++{
++ int status;
++
++ if(HalDev->State < enOpened)
++ return (EC_CPMAC|EC_FUNC_STATUS|EC_VAL_INVALID_STATE); /*MJH+030805*/
++
++ /* No Phy Condition */
++ if(HalDev->MdioConnect & _CPMDIO_NOPHY) /*MJH+030805*/
++ {
++ /* No Phy condition, always linked */
++ status = HalDev->Linked;
++ status |= CPMAC_STATUS_LINK_DUPLEX;
++ status |= CPMAC_STATUS_LINK_SPEED;
++ return(status);
++ }
++
++
++ if (HalDev->HostErr) /* Adapter Check */
++ {
++ bit32u tmp;
++ status = CPMAC_STATUS_ADAPTER_CHECK;
++ if(HalDev->MacStatus & RX_HOST_ERR_CODE)
++ {
++ status |= CPMAC_STATUS_HOST_ERR_DIRECTION;
++ tmp = (HalDev->MacStatus & RX_HOST_ERR_CODE) >> 12; /* Code */
++ status |= (tmp << 9); /* Code */
++ tmp = (HalDev->MacStatus & RX_ERR_CH) >> 8; /* Channel */
++ status |= (tmp << 13);
++ }
++ else
++ if(HalDev->MacStatus & TX_HOST_ERR_CODE)
++ {
++ status |= CPMAC_STATUS_HOST_ERR_DIRECTION;
++ tmp = (HalDev->MacStatus & TX_HOST_ERR_CODE) >> 20; /* Code */
++ status |= (tmp << 9); /* Code */
++ tmp = (HalDev->MacStatus & TX_ERR_CH) >> 16; /* Channel */
++ status |= (tmp << 13);
++ }
++ }
++ else
++ {
++ status = HalDev->Linked;
++ if(status)
++ {
++ status = CPMAC_STATUS_LINK;
++ if(cpMacMdioGetDuplex(HalDev->PhyDev))
++ status |= CPMAC_STATUS_LINK_DUPLEX;
++ if(cpMacMdioGetSpeed(HalDev->PhyDev))
++ status |= CPMAC_STATUS_LINK_SPEED;
++ }
++ }
++ if(HalDev->debug)
++ dbgPrintf("[halStatus] Link Status is %d for 0x%X\n", status, HalDev->dev_base);
++ return(status);
++}
++static int InfoAccess(HAL_DEVICE *HalDev, int Key, int Action, void *ParmValue)
++ {
++ int rc = 0;
++ int Update=0;
++
++ switch (Key)
++ {
++ /********************************************************************/
++ /* */
++ /* GENERAL */
++ /* */
++ /********************************************************************/
++
++ case enVersion :
++ if(Action==enGET)
++ {
++ *(const char **)ParmValue = pszVersion_CPMAC;
++ }
++ break;
++ case enDebug :
++ if(Action==enSET)
++ {
++ HalDev->debug = *(unsigned int *)ParmValue;
++ }
++ break;
++
++ case enStatus :
++ if(Action==enGET)
++ {
++ int status;
++ status = halStatus(HalDev);
++ *(int *)ParmValue = status;
++ }
++ break;
++ /********************************************************************/
++ /* */
++ /* RX_MBP_ENABLE */
++ /* */
++ /********************************************************************/
++
++ case enRX_PASS_CRC :
++ if(Action==enSET)
++ {
++ UPDATE_RX_PASS_CRC(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_QOS_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_QOS_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_NO_CHAIN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_NO_CHAIN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_CMF_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_CMF_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_CSF_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_CSF_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_CEF_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_CEF_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_CAF_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_CAF_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_PROM_CH :
++ if(Action==enSET)
++ {
++ UPDATE_RX_PROM_CH(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_BROAD_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_BROAD_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_BROAD_CH :
++ if(Action==enSET)
++ {
++ UPDATE_RX_BROAD_CH(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_MULT_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_MULT_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_MULT_CH :
++ if(Action==enSET)
++ {
++ UPDATE_RX_MULT_CH(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++
++ /********************************************************************/
++ /* */
++ /* MAC_CONTROL */
++ /* */
++ /********************************************************************/
++
++ case enTX_PTYPE :
++ if(Action==enSET)
++ {
++ UPDATE_TX_PTYPE(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enTX_PACE :
++ if(Action==enSET)
++ {
++ UPDATE_TX_PACE(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enTX_FLOW_EN :
++ if(Action==enSET)
++ {
++ UPDATE_TX_FLOW_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_FLOW_EN :
++ if(Action==enSET)
++ {
++ UPDATE_RX_FLOW_EN(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++
++ case enCTRL_LOOPBACK :
++ if(Action==enSET)
++ {
++ UPDATE_CTRL_LOOPBACK(*(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ /********************************************************************/
++ /* */
++ /* RX_UNICAST_SET */
++ /* */
++ /********************************************************************/
++
++ case enRX_UNICAST_SET :
++ if(Action==enSET)
++ {
++ HalDev->RxUnicastSet |= (1 << *(unsigned int *)ParmValue);
++ HalDev->RxUnicastClear &= ~(1 << *(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_UNICAST_CLEAR :
++ if(Action==enSET)
++ {
++ HalDev->RxUnicastClear |= (1 << *(unsigned int *)ParmValue);
++ HalDev->RxUnicastSet &= ~(1 << *(unsigned int *)ParmValue);
++ Update=1;
++ }
++ break;
++
++ case enRX_MAXLEN :
++ if(Action==enSET)
++ {
++ HalDev->RxMaxLen = *(unsigned int *)ParmValue;
++ Update=1;
++ }
++ break;
++
++ case enRX_FILTERLOWTHRESH :
++ if(Action==enSET)
++ {
++ HalDev->RxFilterLowThresh = *(unsigned int *)ParmValue;
++ Update=1;
++ }
++ break;
++ case enRX0_FLOWTHRESH :
++ if(Action==enSET)
++ {
++ HalDev->Rx0FlowThresh = *(unsigned int *)ParmValue;
++ Update=1;
++ }
++ break;
++ /********************************************************************/
++ /* */
++ /* RX_MULTICAST */
++ /* */
++ /********************************************************************/
++
++ case enRX_MULTICAST :
++ break;
++ case enRX_MULTI_SINGLE :
++ if(DBG(11))
++ {
++ int tmpi;
++ bit8u *MacAddress;
++ MacAddress = (bit8u *) ParmValue;
++ dbgPrintf("CPMAC[%X]: MacAddress '", HalDev->dev_base);
++ for (tmpi=0; tmpi<6; tmpi++)
++ dbgPrintf("%02X:", MacAddress[tmpi]);
++ dbgPrintf("\n");
++ }
++ if(Action==enCLEAR)
++ {
++ HashDel(HalDev, ParmValue);
++ Update=1;
++ }
++ else
++ if(Action==enSET)
++ {
++ HashAdd(HalDev, ParmValue);
++ Update=1;
++ }
++ break;
++ case enRX_MULTI_ALL :
++ if(Action==enCLEAR)
++ {
++ HalDev->MacHash1 = 0;
++ HalDev->MacHash2 = 0;
++ Update=1;
++ }
++ else
++ if(Action==enSET)
++ {
++ HalDev->MacHash1 = 0xFFFFFFFF;
++ HalDev->MacHash2 = 0xFFFFFFFF;
++ Update=1;
++ }
++ break;
++
++ /********************************************************************/
++ /* */
++ /* MDIO */
++ /* */
++ /********************************************************************/
++
++ case enMdioConnect :
++ if(Action==enSET)
++ {
++ HalDev->MdioConnect = *(unsigned int *)ParmValue;
++ MdioSetPhyMode(HalDev);
++ }
++ if(Action==enGET)
++ {
++ *(unsigned int *)ParmValue = HalDev->MdioConnect;
++ }
++ break;
++
++
++ /********************************************************************/
++ /* */
++ /* STATISTICS */
++ /* */
++ /********************************************************************/
++ case enStatsClear :
++ StatsClear(HalDev);
++ break;
++ case enStatsDump :
++ if(Action==enGET)
++ {
++ StatsDump(HalDev, ParmValue);
++ }
++ break;
++
++/* Not implemented
++ case enStats1 :
++ if(Action==enGET)
++ {
++ StatsGet(HalDev, ParmValue, 1);
++ }
++ break;
++
++ case enStats2 :
++ if(Action==enGET)
++ {
++ StatsGet(HalDev, ParmValue, 2);
++ }
++ break;
++ case enStats3 :
++ if(Action==enGET)
++ {
++ StatsGet(HalDev, ParmValue, 3);
++ }
++ break;
++ case enStats4 :
++ if(Action==enGET)
++ {
++ StatsGet(HalDev, ParmValue, 4);
++ }
++ break;
++
++*/
++
++ default:
++ rc = EC_CPMAC|EC_FUNC_OPTIONS|EC_VAL_KEY_NOT_FOUND;
++ break;
++ }
++
++ /* Verify proper device state */
++ if (HalDev->State == enOpened)
++ switch (Update)
++ {
++ case 1 :
++ ConfigApply(HalDev);
++ break;
++ default:
++ break;
++ }
++
++ return (rc);
++ }
++static const char pszStats[] = "Stats;";
++
++static int halControl(HAL_DEVICE *HalDev, const char *pszKey, const char *pszAction, void *Value)
++ {
++ int i;
++ int rc=0;
++ int Action;
++ int ActionFound;
++ int KeyFound;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("\nhalControl-HalDev:%08X,Action:%s,Key:%s\n", (bit32u)HalDev, pszAction, pszKey);
++ }
++#endif
++
++ /* 23Aug04 - BCIL needs to set Mac Address */
++ if(HalDev->OsFunc->Strcmpi(pszKey, pszMacAddr) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ unsigned char *MacAddr;
++ MacAddr = (unsigned char *) Value;
++ MacAddressSave(HalDev, MacAddr);
++ MacAddressSet(HalDev);
++ return(0);
++ }
++ else
++ {
++ return(-1);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcLinked) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ HalDev->Linked = *(int *)Value;
++ return(0);
++ }
++ else
++ {
++ return(-1);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, "TxIntDisable") == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ HalDev->TxIntDisable = *(int *)Value;
++ if(HalDev->TxIntDisable && (HalDev->State == enOpened))
++ {
++ /* if Opened and need TxIntDisabled, clear Ints for Channel 0 */
++ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = 1;
++ }
++ return(0);
++ }
++ else
++ {
++ return(-1);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcPhyAccess) == 0)
++ {
++ bit32u RegAddr;
++ bit32u PhyNum;
++ bit32u Data;
++ bit32u ValueIn;
++
++ ValueIn = *(bit32u*) Value;
++
++ KeyFound=1;
++ /* Cannot access MII if not opended */
++
++ if(HalDev->State < enOpened)
++ return(-1);
++
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++
++ PhyNum = (ValueIn & 0x1F); /* Phynum 0-32 */
++ RegAddr = (ValueIn >> 5) & 0xFF; /* RegAddr in upper 11 bits */
++
++ *(bit32u*)Value = _mdioUserAccessRead(HalDev->PhyDev, RegAddr, PhyNum);
++
++ return(0);
++ } /* end of hcGet */
++
++
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ PhyNum = (ValueIn & 0x1F); /* Phynum 0-32 */
++ RegAddr = (ValueIn >> 5) & 0xFF; /* RegAddr in upper 11 bits of lower 16 */
++
++ Data = ValueIn >> 16; /* Data store in upper 16 bits */
++
++ _mdioUserAccessWrite(HalDev->PhyDev, RegAddr, PhyNum, Data);
++ return(0);
++ }
++ } /* End of hcPhyAccess */
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcPhyNum) == 0)
++ {
++ KeyFound=1;
++ if(!HalDev->Linked)
++ return(-1); /* if not linked the no Phy Connected */
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++ *(int *)Value = HalDev->PhyNum;
++ return(0);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcCpmacSize) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++ *(bit32u *)Value = HalDev->CpmacSize;
++ return(0);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcCpmacBase) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++ *(int *)Value = HalDev->dev_base;
++ return(0);
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcFullDuplex) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ UPDATE_FULLDUPLEX(*(unsigned int *)Value);
++ if(HalDev->State == enOpened)
++ ConfigApply(HalDev);
++ return(0);
++ }
++ else
++ return(-1);
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, pszDebug) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ ActionFound=1;
++ HalDev->debug = *(int *)Value;
++ }
++ }
++
++ if(HalDev->OsFunc->Strcmpi(pszKey, hcMaxFrags) == 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ {
++ ActionFound=1;
++
++ if ((*(int *)Value) > 0)
++ HalDev->MaxFrags = *(int *)Value;
++ else
++ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_VALUE);
++ }
++
++ if (HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++ ActionFound=1;
++
++ *(int *)Value = HalDev->MaxFrags;
++ }
++ }
++
++ if(HalDev->OsFunc->Strstr(pszKey, pszStats) != 0)
++ {
++ KeyFound=1;
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ {
++ int Level;
++ int Ch;
++ char *TmpKey = (char *)pszKey;
++ ActionFound=1;
++ TmpKey += HalDev->OsFunc->Strlen(pszStats);
++ Level = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++ TmpKey++;
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++ TmpKey++;
++ osfuncSioFlush();
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("\nhalControl-HalDev:%08X, Level:%d, Ch:%d\n", (bit32u)HalDev, Level, Ch);
++ }
++#endif
++ StatsGet(HalDev, (void **)Value, Level, Ch, 0);
++ osfuncSioFlush();
++ }
++ }
++
++
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcSet) == 0)
++ Action = enSET;
++ else
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcClear) == 0)
++ Action = enCLEAR;
++ else
++ if(HalDev->OsFunc->Strcmpi(pszAction, hcGet) == 0)
++ Action = enGET;
++ else
++ Action = enNULL;
++
++
++
++ for(i=enCommonStart+1;i<enCommonEnd;i++)
++ {
++ if(HalDev->OsFunc->Strcmpi(KeyCommon[i].strKey, pszKey)==0)
++ {
++ rc = InfoAccess(HalDev, KeyCommon[i].enKey, Action, Value);
++ }
++ }
++ for(i=enCpmacStart+1;i<enCpmacEnd;i++)
++ {
++ if(HalDev->OsFunc->Strcmpi(KeyCpmac[i].strKey, pszKey)==0)
++ {
++ rc = InfoAccess(HalDev, KeyCpmac[i].enKey, Action, Value);
++ }
++ }
++/*
++ if (KeyFound == 0)
++ rc = (EC_MODULE|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND);
++
++ if (ActionFound == 0)
++ rc = (EC_MODULE|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND);
++*/
++
++ return(rc);
++ }
++static bit32u ConfigGet(HAL_DEVICE *HalDev)
++ {
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ char *DeviceInfo = HalDev->DeviceInfo;
++ int i = HalDev->inst;
++ bit32u Value;
++ int Error;
++
++ /* get the configuration parameters common to all modules */
++ Error = ConfigGetCommon(HalDev);
++ if (Error) return (EC_CPMAC|Error);
++
++ if (HalDev->debug)
++ {
++ dbgPrintf("ConfigGet: haldev:0x%08X inst:%d base:0x%08X reset:%d\n", (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
++ osfuncSioFlush();
++ }
++
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, pszMdioConnect,&Value); /*MJH+030805*/
++ if(!Error) HalDev->MdioConnect = Value;
++
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, "PhyMask",&Value);
++ if(!Error) HalDev->PhyMask = Value;
++
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, "MLink",&Value);
++ if(!Error) HalDev->MLinkMask = Value;
++
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, hcMdixMask, &Value);
++ if(!Error)
++ HalDev->MdixMask = Value;
++ else
++ HalDev->MdixMask = 0;
++
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, hcSize, &Value); /*MJH+030425*/
++ if(!Error) HalDev->CpmacSize = Value;
++
++ for(i=enCommonStart+1;i<enCommonEnd;i++)
++ {
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, KeyCommon[i].strKey, (bit32u*)&Value);
++ if(!Error)
++ {
++ InfoAccess(HalDev, KeyCommon[i].enKey, enSET, (bit32u*)&Value);
++ }
++ }
++ for(i=enCpmacStart+1;i<enCpmacEnd;i++)
++ {
++ Error = OsFunc->DeviceFindParmUint(DeviceInfo, KeyCpmac[i].strKey, (bit32u*)&Value);
++ if(!Error)
++ {
++ InfoAccess(HalDev, KeyCpmac[i].enKey, enSET, (bit32u*)&Value);
++ }
++ }
++ return (EC_NO_ERRORS);
++ }
++
++
++static void ConfigInit(HAL_DEVICE *HalDev)
++ {
++ if(HalDev->inst == 0)
++ {
++ HalDev->dev_base = 0xA8610000;
++ HalDev->ResetBit = 17;
++ HalDev->interrupt = 19;
++ HalDev->MLinkMask = 0;
++ HalDev->PhyMask = 0xAAAAAAAA;
++ }
++ else
++ {
++ HalDev->dev_base = 0xA8612800;
++ HalDev->ResetBit = 21;
++ HalDev->interrupt = 33; /*~RC3.02*/
++ HalDev->MLinkMask = 0;
++ HalDev->PhyMask = 0x55555555;
++ }
++ HalDev->RxMaxLen = 1518;
++ HalDev->MaxFrags = 2;
++ HalDev->MdioConnect = _CPMDIO_HD|_CPMDIO_FD|_CPMDIO_10|_CPMDIO_100|_CPMDIO_AUTOMDIX;
++ HalDev->debug=0xFFFFFFFF;
++ HalDev->debug=0;
++ }
++/* Shuts down the EMAC device
++ *
++ *@param HalDev EMAC instance. This was returned by halOpen()
++ *@param mode Indicates actions to tak on close.
++ <br>
++ *PARTIAL - Disable EMAC
++ <br>
++ *FULL - Disable EMAC and call OS to free all allocated memory
++ *
++ *@retval
++ * 0 OK
++ <br>
++ * Non-Zero Not OK
++ *
++ */
++static int halInit( HAL_DEVICE *HalDev)
++ {
++ int rc;
++
++ /* Verify proper device state */
++ if (HalDev->State != enDevFound)
++ return(EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_INVALID_STATE);
++
++ /* Configure HAL defaults */
++ ConfigInit(HalDev);
++
++ /* Retrieve HAL configuration parameters from data store */
++ rc = ConfigGet(HalDev);
++ if (rc) return (rc);
++
++ /* Updated 030403*/
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcCpuFrequency, hcGet, &HalDev->CpuFrequency); /*MJH+030403*/
++ if(rc)
++ HalDev->CpuFrequency = 20000000; /*20 Mhz default */ /*MJH+030403*/
++
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcCpmacFrequency, hcGet, &HalDev->CpmacFrequency); /*MJH+030331*/
++ if(rc)
++ HalDev->CpmacFrequency = HalDev->CpuFrequency/2; /*MJH~030404*/
++
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcMdioBusFrequency, hcGet, &HalDev->MdioBusFrequency); /*MJH+030402*/
++ if(rc)
++ HalDev->MdioBusFrequency = HalDev->CpmacFrequency;
++
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, hcMdioClockFrequency, hcGet, &HalDev->MdioClockFrequency); /*MJH+030402*/
++ if(rc)
++ HalDev->MdioClockFrequency = 2200000; /* 2.2 Mhz PITS #14 */
++
++
++ /* update device state */
++ HalDev->State = enInitialized;
++
++ /* initialize statistics */
++ StatsInit(HalDev); /* +RC3.02 */
++
++ /* -RC3.02
++ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
++ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
++ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
++ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
++ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
++ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
++ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
++ */
++
++ return(EC_NO_ERRORS);
++ }
++static int halProbe(HAL_DEVICE *HalDev)
++ {
++ int inst = HalDev->inst;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ int error_code;
++
++ if (HalDev->State != enConnected)
++ return (EC_CPMAC|EC_FUNC_PROBE|EC_VAL_INVALID_STATE);
++
++ if(HalDev->debug) dbgPrintf("halProbe: %d ",inst);
++
++ error_code = OsFunc->DeviceFindInfo(inst,"cpmac",&HalDev->DeviceInfo);
++
++ if(error_code)
++ return (EC_CPMAC|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND );
++
++ /* Set device state to DevFound */
++ HalDev->State = enDevFound;
++ return(EC_NO_ERRORS);
++ }
++static void ChannelConfigInit(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++ int Direction = HalChn->Direction;
++ int nTxBuffers = 256;
++
++ if (Direction == DIRECTION_TX)
++ {
++ HalDev->ChData[Ch].TxNumBuffers = nTxBuffers;
++ HalDev->ChData[Ch].TxNumQueues = 1;
++ HalDev->ChData[Ch].TxServiceMax = nTxBuffers/3;
++ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
++ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
++ }
++
++ if (Direction == DIRECTION_RX)
++ {
++ HalDev->ChData[Ch].RxNumBuffers = nTxBuffers*2;
++ HalDev->ChData[Ch].RxBufferOffset = 0;
++ HalDev->ChData[Ch].RxBufSize = 1518;
++ HalDev->ChData[Ch].RxServiceMax = nTxBuffers/3; /*Not a typo*/
++ }
++ }
++static int ChannelConfigApply(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++ int Direction = HalChn->Direction;
++
++ if (DBG(11))
++ {
++ dbgPrintf("halChannelConfigApply[%d:%d] haldev:0x%08X inst:%d base:0x%08X reset:%d\n", Ch, Direction, (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
++ osfuncSioFlush();
++ }
++
++ if (Direction == DIRECTION_TX)
++ {
++ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
++ {
++ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_TX_CH_ALREADY_OPEN);
++ }
++
++ /* Initialize Queue Data */
++ HalDev->TxActQueueHead[Ch][0] = 0;
++ HalDev->TxActQueueCount[Ch][0] = 0;
++ HalDev->TxActive[Ch][0] = FALSE;
++
++ /* Need to use a macro that takes channel as input */
++ CPMAC_TX0_HDP(HalDev->dev_base)=0;
++
++ /* Initialize buffer memory for the channel */
++ InitTcb(HalDev, Ch);
++
++ if(!HalDev->TxIntDisable)
++ CPMAC_TX_INTMASK_SET(HalDev->dev_base) = (1<<Ch); /* GSG 11/22 */
++ }
++ else
++ {
++ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
++ {
++ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_RX_CH_ALREADY_OPEN);
++ }
++
++ /* Initialize Queue Data */
++ HalDev->RxActQueueHead[Ch] = 0;
++ HalDev->RxActQueueCount[Ch] = 0;
++
++ HalDev->RxActive[Ch] = FALSE;
++
++ /* Need to use a macro that takes channel as input */
++ CPMAC_RX0_HDP(HalDev->dev_base)=0;
++
++ /* Initialize buffer memory for the channel */
++ InitRcb(HalDev, Ch);
++
++ CPMAC_RX_INTMASK_SET(HalDev->dev_base) = (1<<Ch); /* GSG 11/22 */
++ }
++
++ HalDev->ChIsOpen[Ch][Direction] = TRUE; /* channel is open */
++
++ return (EC_NO_ERRORS);
++ }
++
++/* GSG 11/22
++ * Retrieves channel parameters from configuration file. Any parameters
++ * which are not found are ignored, and the HAL default value will apply,
++ * unless a new value is given through the channel structure in the call
++ * to ChannelSetup.
++ */
++static int ChannelConfigGet(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++ int Direction = HalChn->Direction;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ unsigned int rc, Value;
++ void *ChInfo;
++
++ rc=OsFunc->DeviceFindParmValue(HalDev->DeviceInfo, channel_names[Ch], &ChInfo);
++ /* Do not fail if Channel Info not available for RC2 */
++ if (rc) return(0);
++/* if (rc) return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_CH_INFO_NOT_FOUND);*/
++
++ /* i don't care if a value is not found because they are optional */
++ if(Direction == DIRECTION_TX)
++ {
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "TxNumBuffers", &Value);
++ if (!rc) HalDev->ChData[Ch].TxNumBuffers = Value;
++
++ /*rc=OsFunc->DeviceFindParmUint(ChInfo, "TxNumQueues", &Value);*/ /*MJH-030329*/
++ /*if (!rc) HalDev->ChData[Ch].TxNumQueues = Value;*/ /*MJH-030329*/
++
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "TxServiceMax", &Value);
++ if (!rc)
++ {
++ HalDev->ChData[Ch].TxServiceMax = Value;
++ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
++ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
++ }
++ }
++ if(Direction == DIRECTION_RX)
++ {
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxNumBuffers", &Value);
++ if (!rc) HalDev->ChData[Ch].RxNumBuffers = Value;
++
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxBufferOffset", &Value);
++ if (!rc) HalDev->ChData[Ch].RxBufferOffset = Value;
++
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxBufSize", &Value);
++ if (!rc) HalDev->ChData[Ch].RxBufSize = Value;
++
++ rc=OsFunc->DeviceFindParmUint(ChInfo, "RxServiceMax", &Value);
++ if (!rc) HalDev->ChData[Ch].RxServiceMax = Value;
++ }
++ return (EC_NO_ERRORS);
++ }
++#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
++
++static void ChannelConfigUpdate(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++ int Direction = HalChn->Direction;
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("\nChnUpd-HalDev:%08X,Chn:%d:%d\n", (bit32u)HalDev, Ch, Direction); osfuncSioFlush();
++ }
++#endif
++ if (Direction == DIRECTION_TX)
++ {
++ ChannelUpdate(TxNumBuffers);
++ /*ChannelUpdate(TxNumQueues);*/ /*MJH~030329*/
++ ChannelUpdate(TxServiceMax);
++ HalDev->TxIntThreshold[Ch] = HalDev->ChData[Ch].TxServiceMax;
++ HalDev->TxIntThresholdMaster[Ch] = HalDev->TxIntThreshold[Ch];
++ }
++ else
++ if (Direction == DIRECTION_RX)
++ {
++ ChannelUpdate(RxBufferOffset);
++ ChannelUpdate(RxBufSize);
++ ChannelUpdate(RxNumBuffers);
++ ChannelUpdate(RxServiceMax);
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("\nRxNumBuffers %d\n",HalChn->RxNumBuffers); osfuncSioFlush();
++ }
++#endif
++ }
++ }
++static int halChannelSetup(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn, OS_SETUP *OsSetup)
++ {
++ int Direction;
++ int Ch;
++ int rc;
++
++ /* Verify proper device state */
++ if (HalDev->State < enInitialized)
++ return (EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE);
++
++ /* We require the channel structure to be passed, even if it only contains
++ the channel number */
++ if (HalChn == NULL)
++ {
++ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_NULL_CH_STRUCT);
++ }
++
++ Ch = HalChn->Channel;
++ Direction = HalChn->Direction;
++
++ /* This should check on Maximum Channels for RX or TX,
++ they might be different Mick 021124 */
++ if ((Ch < 0) || (Ch > (MAX_CHAN-1)))
++ {
++ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_INVALID_CH);
++ }
++
++ /* if channel is already open, this call is invalid */
++ if (HalDev->ChIsOpen[Ch][Direction] == TRUE)
++ {
++ return(EC_CPMAC|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
++ }
++
++ /* channel is closed, but might be setup. If so, reopen the hardware channel. */
++ if (HalDev->ChIsSetup[Ch][Direction] == FALSE)
++ {
++ /* Setup channel configuration */
++ HalDev->ChData[Ch].Channel = Ch;
++
++ /* Store OS_SETUP */
++ HalDev->ChData[Ch].OsSetup = OsSetup;
++
++ /* Framework :
++ Set Default Values
++ Update with options.conf
++ Apply driver updates
++ */
++ ChannelConfigInit(HalDev, HalChn);
++ ChannelConfigGet(HalDev, HalChn);
++ ChannelConfigUpdate(HalDev, HalChn);
++
++ /* cppi.c needs to use Rx/TxServiceMax */
++ HalDev->BuffersServicedMax = 169; /* TEMP */
++
++ HalDev->ChIsSetup[Ch][Direction] = TRUE;
++ }
++
++ rc = EC_NO_ERRORS;
++
++ /* If the hardware has been opened (is out of reset), then configure the channel
++ in the hardware. NOTE: ChannelConfigApply calls the CPSAR ChannelSetup()! */
++ if (HalDev->State == enOpened)
++ {
++ rc = ChannelConfigApply(HalDev, HalChn);
++ }
++
++ return (rc);
++ }
++
++
++static int miiInfoGet(HAL_DEVICE *HalDev, bit32u *miiBaseAddress, bit32u *miiResetBit)
++ {
++ int rc;
++ void *DeviceInfo;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ /* Only one instance of cpmdio */
++ rc = OsFunc->DeviceFindInfo(0,"cpmdio",&DeviceInfo); /*~RC3.02*/
++
++ if(rc)
++ return (EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_DEVICE_NOT_FOUND );
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",miiBaseAddress);
++ if(rc)
++ rc=EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_NO_BASE;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",miiResetBit);
++ if(rc)
++ rc=EC_DEV_CPMDIO|EC_FUNC_OPEN|EC_VAL_NO_BASE;
++
++
++ /* See if need to make mdio functional in GPIO */
++ gpioCheck(HalDev, DeviceInfo);
++
++ if(DBG(0))
++ dbgPrintf("miiBase: 0x%08X %u\n", *miiBaseAddress, *miiResetBit);
++ return(rc);
++ }
++static void ephyCheck(HAL_DEVICE *HalDev)
++ { /*+RC3.02*/
++ int rc;
++ void *DeviceInfo;
++ int mii_phy;
++ int reset_bit;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ rc = OsFunc->DeviceFindInfo(0,"ephy",&DeviceInfo);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "mii_phy",&mii_phy);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
++ if(rc) return;
++
++ if (HalDev->PhyMask & (1 << mii_phy))
++ {
++ *(volatile bit32u *)(HalDev->ResetBase) |= (1 << reset_bit); /*+RC3.02*/
++ resetWait(HalDev);
++ }
++ } /*+RC3.02*/
++static void AutoNegotiate(HAL_DEVICE *HalDev)
++ {
++ int size;
++ bit32u ModID, RevMaj, RevMin;
++ PHY_DEVICE *PhyDev;
++ bit32u miiBaseAddress;
++ bit32u miiResetBit;
++
++ /* Verify proper device state */
++ if (HalDev->State < enOpened)
++ return;
++
++ miiInfoGet(HalDev, &miiBaseAddress, &miiResetBit);
++
++ cpMacMdioGetVer(miiBaseAddress, &ModID, &RevMaj, &RevMin);
++ if(HalDev->debug)
++ dbgPrintf("Mdio Module Id %d, Version %d.%d\n", ModID, RevMaj, RevMin);
++
++ size = cpMacMdioGetPhyDevSize();
++ PhyDev = (PHY_DEVICE *) HalDev->OsFunc->Malloc( size );
++
++ HalDev->PhyDev = PhyDev;
++
++ ephyCheck(HalDev);
++
++ cpMacMdioInit( PhyDev, miiBaseAddress, HalDev->inst, HalDev->PhyMask, HalDev->MLinkMask, HalDev->MdixMask, HalDev->ResetBase, miiResetBit, HalDev->MdioBusFrequency, HalDev->MdioClockFrequency, HalDev->debug, HalDev); /*MJH~030402*/
++ MdioSetPhyMode(HalDev);
++
++ return;
++ }
++static int halOpen(HAL_DEVICE *HalDev)
++ {
++ unsigned char *MacAddr;
++ int i;
++ int j;
++ int rc, Ticks;
++
++ if (HalDev->debug)
++ {
++ dbgPrintf("halOpen: haldev:0x%08X inst:%d base:0x%08X reset:%d\n", (bit32u) &HalDev, HalDev->inst, HalDev->dev_base, HalDev->ResetBit);
++ osfuncSioFlush();
++ }
++
++ /* Verify proper device state */
++ if (HalDev->State < enInitialized)
++ return (EC_CPMAC|EC_FUNC_OPEN|EC_VAL_INVALID_STATE);
++
++
++ /* take CPMAC out of reset - GSG 11/20*/
++ if ((VOLATILE32(HalDev->ResetBase) & (1 << HalDev->ResetBit)) != 0)
++ {
++ /* perform normal close duties */
++ CPMAC_MACCONTROL(HalDev->dev_base) &= ~MII_EN;
++ CPMAC_TX_CONTROL(HalDev->dev_base) &= ~TX_EN;
++ CPMAC_RX_CONTROL(HalDev->dev_base) &= ~RX_EN;
++
++ /* disable interrupt masks */
++ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = 0xFF;
++ CPMAC_RX_INTMASK_CLEAR(HalDev->dev_base) = 0xFF;
++ }
++
++ /* take CPMAC out of reset */
++ *(volatile bit32u *)(HalDev->ResetBase) &= ~(1 << HalDev->ResetBit);
++ resetWait(HalDev);
++ *(volatile bit32u *)(HalDev->ResetBase) |= (1 << HalDev->ResetBit);
++ resetWait(HalDev);
++
++ /* After Reset clear the Transmit and Receive DMA Head Descriptor Pointers */
++
++ CPMAC_TX0_HDP(HalDev->dev_base)=0;
++ CPMAC_TX1_HDP(HalDev->dev_base)=0;
++ CPMAC_TX2_HDP(HalDev->dev_base)=0;
++ CPMAC_TX3_HDP(HalDev->dev_base)=0;
++ CPMAC_TX4_HDP(HalDev->dev_base)=0;
++ CPMAC_TX5_HDP(HalDev->dev_base)=0;
++ CPMAC_TX6_HDP(HalDev->dev_base)=0;
++ CPMAC_TX7_HDP(HalDev->dev_base)=0;
++
++ /* Rx Init */
++
++ CPMAC_RX0_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX1_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX2_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX3_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX4_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX5_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX6_HDP(HalDev->dev_base) = 0;
++ CPMAC_RX7_HDP(HalDev->dev_base) = 0;
++
++ CPMAC_RX_BUFFER_OFFSET(HalDev->dev_base) = 0;
++
++ /* Init Tx and Rx DMA */
++
++ CPMAC_TX_CONTROL(HalDev->dev_base) |= TX_EN;
++ CPMAC_RX_CONTROL(HalDev->dev_base) |= RX_EN;
++
++ CPMAC_MAC_INTMASK_SET(HalDev->dev_base) |=2; /* Enable Adaptercheck Ints */
++ HalDev->OsFunc->Control(HalDev->OsDev, pszMacAddr, hcGet, &MacAddr); /* GSG 11/22 */
++ MacAddressSave(HalDev, MacAddr);
++
++ HalDev->HostErr = 0; /* Clear Adapter Check indicator */
++ HalDev->State = enOpened; /* Change device state */
++
++ /* Start MDIO Negotiation */
++ AutoNegotiate(HalDev);
++
++ /* Enable the Os Timer */
++ Ticks = HalDev->CpuFrequency / 100; /* 10 milli-secs */ /*MJH~030402*/
++ HalDev->OsFunc->Control(HalDev->OsDev, pszTick, hcSet, &Ticks); /* GSG 11/22 */
++ HalDev->OsFunc->IsrRegister(HalDev->OsDev, halIsr, HalDev->interrupt);
++
++ /* GSG +030523 Malloc space for the Rx fraglist */
++ HalDev->fraglist = HalDev->OsFunc->Malloc(HalDev->MaxFrags * sizeof(FRAGLIST));
++
++ /* Any pre-open configuration */
++
++ /* For any channels that have been pre-initialized, set them up now */
++ /* Note : This loop should not use MAX_CHN, it should only
++ loop through Channels Setup, memory should not be reserved
++ until Channel is Setup
++ */
++ for(i=0; i<MAX_CHAN; i++) /* i loops through Channels */
++ for(j=0; j<2; j++) /* j loops through DIRECTION values, 0 and 1 */
++ {
++ if(HalDev->ChIsSetup[i][j]==TRUE) /* If the Channel and Direction have been Setup */
++ if(HalDev->ChIsOpen[i][j]==FALSE) /* but not opened, then Apply Values now */
++ {
++ CHANNEL_INFO HalChn;
++ HalChn.Channel = i;
++ HalChn.Direction = j;
++ rc = ChannelConfigApply(HalDev, &HalChn);
++ if(rc != EC_NO_ERRORS)
++ return(rc);
++ }
++ } /* End of looping through Channel/Direction */
++
++ ConfigApply(HalDev); /* Apply Configuration Values to Device */
++ CPMAC_MACCONTROL(HalDev->dev_base) |= MII_EN; /* MAC_EN */
++ if(DBG(0))
++ dbgPrintf("[halOpen]MacControl:%08X\n", CPMAC_MACCONTROL(HalDev->dev_base));
++ return(EC_NO_ERRORS);
++ }
++
++#define INT_PENDING (MAC_IN_VECTOR_TX_INT_OR | MAC_IN_VECTOR_RX_INT_OR | MAC_IN_VECTOR_HOST_INT)
++static int halShutdown(HAL_DEVICE *HalDev)
++ {
++ int Ch, Queue; /*GSG+030514*/
++
++ /* Verify proper device state */
++ if (HalDev->State == enOpened)
++ halClose(HalDev, 3); /* GSG ~030429 */
++
++ /* Buffer/descriptor resources may still need to be freed if a Close
++ Mode 1 was performed prior to Shutdown - clean up here */ /*GSG+030514*/
++ for (Ch=0; Ch<MAX_CHAN; Ch++)
++ {
++ if (HalDev->RcbStart[Ch] != 0)
++ FreeRx(HalDev,Ch);
++
++ for(Queue=0; Queue<MAX_QUEUE; Queue++)
++ {
++ if (HalDev->TcbStart[Ch][Queue] != 0)
++ FreeTx(HalDev,Ch,Queue);
++ }
++ }
++
++ /* free the HalFunc */
++ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
++
++ /* free the HAL device */
++ HalDev->OsFunc->Free(HalDev);
++
++ return(EC_NO_ERRORS);
++ }
++int halIsr(HAL_DEVICE *HalDev, int *MorePackets)
++{
++ bit32u IntVec;
++ int Serviced;
++ int PacketsServiced=0;
++ int Channel;
++ int TxMorePackets=0;
++ int RxMorePackets=0;
++
++ /* Verify proper device state - important because a call prior to Open would
++ result in a lockup */
++ if (HalDev->State != enOpened)
++ return(EC_CPMAC|EC_FUNC_DEVICE_INT|EC_VAL_INVALID_STATE);
++
++ IntVec = CPMAC_MAC_IN_VECTOR(HalDev->dev_base);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("\nhalIsr: inst %d, IntVec 0x%X\n", HalDev->inst, IntVec); osfuncSioFlush();/* GSG 11/22 */
++ }
++#endif
++
++ HalDev->IntVec = IntVec;
++ if (IntVec & MAC_IN_VECTOR_TX_INT_OR)
++ {
++ int TxServiceMax=0; /* Compiler complains if not initialized */
++
++ Channel = (IntVec & 0x7);
++
++ if(HalDev->TxIntDisable)
++ {
++ CPMAC_TX_INTMASK_CLEAR(HalDev->dev_base) = (1<<Channel); /* Disable Interrupt for Channel */
++ TxServiceMax = HalDev->ChData[Channel].TxServiceMax;
++ HalDev->ChData[Channel].TxServiceMax = 10000; /* Need to service all packets in the Queue */
++ }
++
++ PacketsServiced |= TxInt(HalDev, Channel, 0, &TxMorePackets);
++
++ if(HalDev->TxIntDisable)
++ HalDev->ChData[Channel].TxServiceMax = TxServiceMax;
++ }
++
++ if (IntVec & MAC_IN_VECTOR_RX_INT_OR)
++ {
++ Channel = (IntVec >> 8) & 0x7;
++ Serviced = RxInt(HalDev, Channel, &RxMorePackets);
++ PacketsServiced |= (Serviced<<16);
++ }
++
++ if (IntVec & MAC_IN_VECTOR_HOST_INT)
++ {
++ /* Adaptercheck */
++ HalDev->HostErr = 1;
++ HalDev->MacStatus = CPMAC_MACSTATUS(HalDev->dev_base);
++ osfuncStateChange(); /*MJH+030328*/
++ if(DBG(0))
++ {
++ dbgPrintf("Adaptercheck: %08x for base:%X\n",HalDev->MacStatus, (bit32u)HalDev->dev_base);
++ osfuncSioFlush();
++ }
++ }
++ *MorePackets = (TxMorePackets | RxMorePackets);
++ return (PacketsServiced);
++}
++
++int halPacketProcessEnd(HAL_DEVICE *HalDev)
++{
++ int base = HalDev->dev_base;
++ CPMAC_MAC_EOI_VECTOR(base) = 0;
++ return(0);
++}
++
++
++
++static int PhyCheck(HAL_DEVICE *HalDev)
++ {
++ return(cpMacMdioTic(HalDev->PhyDev));
++ }
++static int halTick(HAL_DEVICE *HalDev)
++{
++ int TickChange;
++
++ if(HalDev->State < enOpened)
++ return (EC_CPMAC|EC_FUNC_TICK|EC_VAL_INVALID_STATE);
++
++ /* if NO Phy no need to check Link */
++ if(HalDev->MdioConnect & _CPMDIO_NOPHY)
++ return(EC_NO_ERRORS); /* No change in Phy State detected */
++
++ TickChange = PhyCheck(HalDev);
++ /* Phy State Change Detected */
++ if(TickChange == 1)
++ {
++ /* MDIO indicated a change */
++ DuplexUpdate(HalDev);
++ osfuncStateChange();
++ return(EC_NO_ERRORS);
++ }
++
++ /* if in AutoMdix mode, and Flip request received, inform OS */
++ if( (HalDev->MdioConnect & _CPMDIO_AUTOMDIX) &&
++ (TickChange & _MIIMDIO_MDIXFLIP))
++ {
++ bit32u Mdix;
++ Mdix = TickChange & 0x1; /* Mdix mode stored in bit 0 */
++ HalDev->OsFunc->Control(HalDev->OsDev, hcMdioMdixSwitch, hcSet, &Mdix);
++ return(EC_NO_ERRORS);
++ }
++
++ return(EC_NO_ERRORS);
++}
++
++int halCpmacInitModule(HAL_DEVICE **pHalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS **pHalFunc,
++ OS_FUNCTIONS *OsFunc, int OsFuncSize, int *HalFuncSize, int Inst)
++ {
++ HAL_DEVICE *HalDev;
++ HAL_FUNCTIONS *HalFunc;
++
++ if (OsFuncSize < sizeof(OS_FUNCTIONS))
++ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_OS_VERSION_NOT_SUPPORTED);
++
++ HalDev = (HAL_DEVICE *) OsFunc->MallocDev(sizeof(HAL_DEVICE));
++ if (!HalDev)
++ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
++
++ /* clear the HalDev area */
++ OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
++
++ /* Initialize the size of hal functions */
++ *HalFuncSize = sizeof (HAL_FUNCTIONS);
++
++ HalFunc = (HAL_FUNCTIONS *) OsFunc->Malloc(sizeof(HAL_FUNCTIONS));
++ if (!HalFunc)
++ return (EC_CPMAC|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
++
++ /* clear the function pointers */
++ OsFunc->Memset(HalFunc, 0, sizeof(HAL_FUNCTIONS));
++
++ HalDev->OsDev = OsDev;
++ HalDev->OsOpen = OsDev;
++ HalDev->inst = Inst;
++ HalDev->OsFunc = OsFunc;
++ HalDev->HalFunc = HalFunc;
++ /* Remove the following from cppi, replace with HalFunc */
++ HalDev->HalFuncPtr = HalFunc; /* GSG 11/20 changed name to match cppi */
++
++ /****************************************************************/
++ /* POPULATE HALFUNC */
++ /****************************************************************/
++ HalFunc->ChannelSetup = halChannelSetup;
++ HalFunc->ChannelTeardown = halChannelTeardown; /* GSG 11/20 */
++ HalFunc->Close = halClose; /* GSG 11/20 */
++ HalFunc->Control = halControl; /* GSG 11/22 */
++ HalFunc->Init = halInit;
++ HalFunc->Open = halOpen;
++ HalFunc->PacketProcessEnd = halPacketProcessEnd;
++ HalFunc->Probe = halProbe;
++ HalFunc->RxReturn = halRxReturn;
++ HalFunc->Send = halSend;
++ HalFunc->Shutdown = halShutdown;
++ HalFunc->Tick = halTick;
++
++ /* HalFunc->Status = halStatus;*/ /* GSG 11/22 */
++ /* pass the HalDev and HalFunc back to the caller */
++
++ *pHalDev = HalDev;
++ *pHalFunc = HalFunc;
++
++ HalDev->State = enConnected; /* Initialize the hardware state */
++
++ if (HalDev->debug) HalDev->OsFunc->Printf("halCpmacInitModule: Leave\n");
++ return(0);
++ }
++
++int cpmacRandomRange(HAL_DEVICE *HalDev, int min, int max)
++{
++ int iTmp;
++ iTmp = cpmacRandom(HalDev);
++ iTmp %= ((max-min)+1);
++ iTmp += min;
++ return(iTmp);
++}
++
++int cpmacRandom(HAL_DEVICE *HalDev)
++{
++ int iTmp;
++ iTmp = CPMAC_BOFFTEST(HalDev->dev_base);
++ iTmp >>= 16; /* get rndnum field */
++ iTmp &= (0x3FF); /* field is 10 bits wide */
++ return(iTmp);
++}
+diff -urN linux.old/drivers/net/avalanche_cpmac/hcpmac.h linux.dev/drivers/net/avalanche_cpmac/hcpmac.h
+--- linux.old/drivers/net/avalanche_cpmac/hcpmac.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/hcpmac.h 2005-07-10 03:22:40.522158000 +0200
+@@ -0,0 +1,383 @@
++/** @file***********************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE:
++ *
++ * DESCRIPTION:
++ * This file contains definitions for the HAL EMAC API
++ *
++ * HISTORY:
++ * xxXxx01 Denis 1.00 Original Version created.
++ * 22Jan02 Denis/Mick 1.01 Modified for HAL EMAC API
++ * 24Jan02 Denis/Mick 1.02 Speed Improvements
++ * 28Jan02 Denis/Mick 1.16 Made function calls pointers
++ * 28Jan02 Mick 1.18 Split into separate modules
++ * @author Michael Hanrahan
++ * @version 1.02
++ * @date 24-Jan-2002
++ *****************************************************************************/
++#ifndef _INC_HCPMAC
++#define _INC_HCPMAC
++
++/** \namespace CPMAC_Version
++This documents version 01.07.04 of the CPMAC CPHAL.
++*/
++const char *pszVersion_CPMAC="CPMAC 01.07.08 "__DATE__" "__TIME__;
++
++/* CHECK THESE LOCATIONS */
++#define TEARDOWN_VAL 0xfffffffc
++#define CB_OFFSET_MASK 0xFFFF0000
++
++
++#define MAX_CHAN 8
++#define MAX_QUEUE 1
++
++typedef struct
++ {
++ bit32 HNext; /*< Hardware's pointer to next buffer descriptor */
++ bit32 BufPtr; /*< Pointer to the data buffer */
++ bit32 Off_BLen; /*< Contains buffer offset and buffer length */
++ bit32 mode; /*< SOP, EOP, Ownership, EOQ, Teardown, Q Starv, Length */
++ void *Next;
++ void *OsInfo;
++ void *Eop;
++#ifdef __CPHAL_DEBUG
++ bit32 DbgSop;
++ bit32 DbgData;
++ bit32 DbgFraglist;
++#endif
++ }HAL_TCB;
++
++typedef volatile struct hal_private
++ {
++ bit32 HNext; /*< Hardware's pointer to next buffer descriptor */
++ bit32 BufPtr; /*< Pointer to the data buffer */
++ bit32 Off_BLen; /*< Contains buffer offset and buffer length */
++ bit32 mode; /*< SOP, EOP, Ownership, EOQ, Teardown Complete bits */
++ void *DatPtr;
++ void *Next;
++ void *OsInfo;
++ void *Eop;
++ }HAL_RCB;
++
++#define MAX_NEEDS 512 /*MJH+030409*/
++/* HAL */
++
++typedef struct hal_device
++ {
++ OS_DEVICE *OsDev;
++ OS_FUNCTIONS *OsFunc;
++ /*OS_SETUP *OsSetup;*/ /* -GSG 030508 */
++ int inst;
++ bit32u rxbufseq;
++
++
++ bit32 dev_base;
++ bit32 offset;
++
++ bit32u ResetBase; /* GSG 10/20 */
++ int ResetBit;
++ void *OsOpen;
++ bit32u IntVec;
++ PHY_DEVICE *PhyDev;
++ bit32u EmacDuplex;
++ bit32u EmacSpeed;
++ bit32u PhyNum;
++ bit32u MLinkMask;
++ bit32u PhyMask;
++ bit32u MdixMask;
++
++ bit32u Linked;
++ DEVICE_STATE State;
++ unsigned char *MacAddr;
++ HAL_FUNCTIONS *HalFuncPtr; /* GSG 11/20 changed name to match cppi */
++ HAL_FUNCTIONS *HalFunc;
++/* unsigned int CpuFreq;*/ /*MJH-030402*/
++ unsigned int MdioConnect;
++ unsigned int HostErr;
++
++/************************************************************************/
++/* */
++/* R E G I S T E R S */
++/* */
++/************************************************************************/
++
++ bit32u RxMbpEnable;
++ bit32u RxUnicastSet;
++ bit32u RxUnicastClear;
++ bit32u RxMaxLen;
++ bit32u RxFilterLowThresh;
++ bit32u Rx0FlowThresh;
++ bit32u MacControl;
++ bit32u MacStatus;
++ bit32u MacHash1;
++ bit32u MacHash2;
++
++/************************************************************************/
++/* */
++/* O P T I O N S */
++/* */
++/************************************************************************/
++
++ char *DeviceInfo;
++ bit32u interrupt;
++
++
++ bit32u RxPassCrc;
++ bit32u RxCaf;
++ bit32u RxCef;
++ bit32u RxBcast;
++ bit32u RxBcastCh;
++ HAL_RCB *RcbPool[MAX_CHAN];
++ bit32 RxActQueueCount[MAX_CHAN];
++ HAL_RCB *RxActQueueHead[MAX_CHAN];
++ HAL_RCB *RxActQueueTail[MAX_CHAN];
++ bit32 RxActive[MAX_CHAN];
++ HAL_TCB *TcbPool[MAX_CHAN][MAX_QUEUE];
++ bit32 TxActQueueCount[MAX_CHAN][MAX_QUEUE];
++ HAL_TCB *TxActQueueHead[MAX_CHAN][MAX_QUEUE];
++ HAL_TCB *TxActQueueTail[MAX_CHAN][MAX_QUEUE];
++ bit32 TxActive[MAX_CHAN][MAX_QUEUE];
++ bit32 TxTeardownPending[MAX_CHAN];
++ bit32 RxTeardownPending[MAX_CHAN];
++ bit32 ChIsOpen[MAX_CHAN][2];
++ bit32 ChIsSetup[MAX_CHAN][2];
++ FRAGLIST *fraglist;
++ char *TcbStart[MAX_CHAN][MAX_QUEUE];
++ char *RcbStart[MAX_CHAN];
++ bit32 RcbSize[MAX_CHAN];
++/* STAT_INFO Stats; */
++ bit32 Inst;
++ bit32u BuffersServicedMax;
++ CHANNEL_INFO ChData[MAX_CHAN];
++ bit32u MdioClockFrequency; /*MJH+030402*/
++ bit32u MdioBusFrequency; /*MJH+030402*/
++ bit32u CpuFrequency; /*MJH+030402*/
++ bit32u CpmacFrequency; /*MJH+030403*/
++ bit32u CpmacSize; /*MJH+030425*/
++ int debug;
++ bit32u NeedsCount; /*MJH+030409*/
++ HAL_RECEIVEINFO *Needs[MAX_NEEDS]; /*MJH+030409*/
++ int MaxFrags;
++ int TxIntThreshold[MAX_CHAN]; /* MJH 040621 NSP Performance Update */
++ int TxIntThresholdMaster[MAX_CHAN]; /* MJH 040827 NSP Performance Update */
++ int TxIntDisable; /* MJH 040621 NSP Performance Update */
++ }HALDEVICE;
++
++#define STATS_MAX 36
++
++#define MACCONTROL_MASK (TX_PTYPE|TX_PACE|TX_FLOW_EN|RX_FLOW_EN|CTRL_LOOPBACK)
++#define RX_MBP_ENABLE_MASK \
++ (RX_PASS_CRC|RX_QOS_EN|RX_NO_CHAIN| \
++ RX_CMF_EN|RX_CSF_EN|RX_CEF_EN|RX_CAF_EN|RX_PROM_CH_MASK| \
++ RX_BROAD_EN|RX_BROAD_CH_MASK|RX_MULT_EN|RX_MULT_CH_MASK)
++
++
++#define MBP_UPDATE(Mask, On) \
++ if(On) HalDev->RxMbpEnable |= Mask; \
++ else HalDev->RxMbpEnable &= ~Mask
++
++#define CONTROL_UPDATE(Mask, On) \
++ if(On) HalDev->MacControl |= Mask; \
++ else HalDev->MacControl &= ~Mask
++
++
++#define UPDATE_TX_PTYPE(Value) CONTROL_UPDATE(TX_PTYPE,Value)
++#define UPDATE_TX_PACE(Value) CONTROL_UPDATE(TX_PACE,Value)
++#define UPDATE_MII_EN(Value) CONTROL_UPDATE(MII_EN,Value)
++#define UPDATE_TX_FLOW_EN(Value) CONTROL_UPDATE(TX_FLOW_EN,Value)
++#define UPDATE_RX_FLOW_EN(Value) CONTROL_UPDATE(RX_FLOW_EN,Value)
++#define UPDATE_CTRL_LOOPBACK(Value) CONTROL_UPDATE(CTRL_LOOPBACK,Value)
++#define UPDATE_FULLDUPLEX(Value) CONTROL_UPDATE(FULLDUPLEX,(Value))
++
++#define UPDATE_RX_PASS_CRC(Value) MBP_UPDATE(RX_PASS_CRC, Value)
++#define UPDATE_RX_QOS_EN(Value) MBP_UPDATE(RX_QOS_EN, Value)
++#define UPDATE_RX_NO_CHAIN(Value) MBP_UPDATE(RX_NO_CHAIN, Value)
++#define UPDATE_RX_CMF_EN(Value) MBP_UPDATE(RX_CMF_EN, Value)
++#define UPDATE_RX_CSF_EN(Value) MBP_UPDATE(RX_CSF_EN, Value)
++#define UPDATE_RX_CEF_EN(Value) MBP_UPDATE(RX_CEF_EN, Value)
++#define UPDATE_RX_CAF_EN(Value) MBP_UPDATE(RX_CAF_EN, Value)
++#define UPDATE_RX_BROAD_EN(Value) MBP_UPDATE(RX_BROAD_EN, Value)
++#define UPDATE_RX_MULT_EN(Value) MBP_UPDATE(RX_MULT_EN, Value)
++
++#define UPDATE_RX_PROM_CH(Value) \
++ HalDev->RxMbpEnable &= ~RX_PROM_CH_MASK; \
++ HalDev->RxMbpEnable |= RX_PROM_CH(Value)
++
++#define UPDATE_RX_BROAD_CH(Value) \
++ HalDev->RxMbpEnable &= ~RX_BROAD_CH_MASK; \
++ HalDev->RxMbpEnable |= RX_BROAD_CH(Value)
++
++#define UPDATE_RX_MULT_CH(Value) \
++ HalDev->RxMbpEnable &= ~RX_MULT_CH_MASK; \
++ HalDev->RxMbpEnable |= RX_MULT_CH(Value)
++
++
++
++typedef enum
++ {
++ /* CPMAC */
++ enCpmacStart=0,
++ enStats0,
++ enStats1,
++ enStats2,
++ enStats3,
++ enStats4,
++ enStatsDump,
++ enStatsClear,
++ enRX_PASS_CRC,
++ enRX_QOS_EN,
++ enRX_NO_CHAIN,
++ enRX_CMF_EN,
++ enRX_CSF_EN,
++ enRX_CEF_EN,
++ enRX_CAF_EN,
++ enRX_PROM_CH,
++ enRX_BROAD_EN,
++ enRX_BROAD_CH,
++ enRX_MULT_EN,
++ enRX_MULT_CH,
++
++ enTX_PTYPE,
++ enTX_PACE,
++ enMII_EN,
++ enTX_FLOW_EN,
++ enRX_FLOW_EN,
++ enCTRL_LOOPBACK,
++
++ enRX_MAXLEN,
++ enRX_FILTERLOWTHRESH,
++ enRX0_FLOWTHRESH,
++ enRX_UNICAST_SET,
++ enRX_UNICAST_CLEAR,
++ enMdioConnect,
++ enMAC_ADDR_GET,
++ enTick,
++ enRX_MULTICAST,
++ enRX_MULTI_ALL,
++ enRX_MULTI_SINGLE,
++ enVersion,
++ enCpmacEnd /* Last entry */
++ }INFO_KEY_CPMAC;
++
++static const char pszVersion[] = "Version";
++static const char pszStats0[] = "Stats0";
++static const char pszStats1[] = "Stats1";
++static const char pszStats2[] = "Stats2";
++static const char pszStats3[] = "Stats3";
++static const char pszStats4[] = "Stats4";
++static const char pszStatsDump[] = "StatsDump";
++static const char pszStatsClear[] = "StatsClear";
++
++/********************************************************************
++**
++** RX MBP ENABLE
++**
++********************************************************************/
++static const char pszRX_PASS_CRC[] = "RX_PASS_CRC";
++static const char pszRX_QOS_EN[] = "RX_QOS_EN";
++static const char pszRX_NO_CHAIN[] = "RX_NO_CHAIN";
++static const char pszRX_CMF_EN[] = "RX_CMF_EN";
++static const char pszRX_CSF_EN[] = "RX_CSF_EN";
++static const char pszRX_CEF_EN[] = "RX_CEF_EN";
++static const char pszRX_CAF_EN[] = "RX_CAF_EN";
++static const char pszRX_PROM_CH[] = "RX_PROM_CH";
++static const char pszRX_BROAD_EN[] = "RX_BROAD_EN";
++static const char pszRX_BROAD_CH[] = "RX_BROAD_CH";
++static const char pszRX_MULT_EN[] = "RX_MULT_EN";
++static const char pszRX_MULT_CH[] = "RX_MULT_CH";
++
++
++/********************************************************************
++**
++** MAC CONTROL
++**
++********************************************************************/
++static const char pszTX_PTYPE[] = "TX_PTYPE";
++static const char pszTX_PACE[] = "TX_PACE";
++static const char pszMII_EN[] = "MII_EN";
++static const char pszTX_FLOW_EN[] = "TX_FLOW_EN";
++static const char pszRX_FLOW_EN[] = "RX_FLOW_EN";
++static const char pszCTRL_LOOPBACK[] = "CTRL_LOOPBACK";
++
++static const char pszRX_MAXLEN[] = "RX_MAXLEN";
++static const char pszRX_FILTERLOWTHRESH[] = "RX_FILTERLOWTHRESH";
++static const char pszRX0_FLOWTHRESH[] = "RX0_FLOWTHRESH";
++static const char pszRX_UNICAST_SET[] = "RX_UNICAST_SET";
++static const char pszRX_UNICAST_CLEAR[] = "RX_UNICAST_CLEAR";
++static const char pszMdioConnect[] = "MdioConnect";
++static const char pszMacAddr[] = "MacAddr";
++static const char pszTick[] = "Tick";
++
++/********************************************************************
++**
++** MULTICAST
++**
++********************************************************************/
++
++static const char pszRX_MULTICAST[] = "RX_MULTICAST";
++static const char pszRX_MULTI_ALL[] = "RX_MULTI_ALL";
++static const char pszRX_MULTI_SINGLE[] = "RX_MULTI_SINGLE";
++
++/*
++static const char* pszGFHN = "GFHN";
++*/
++
++static const CONTROL_KEY KeyCpmac[] =
++ {
++ {"" , enCpmacStart},
++ {pszStats0 , enStats0},
++ {pszStats1 , enStats1},
++ {pszStats2 , enStats2},
++ {pszStats3 , enStats3},
++ {pszStats4 , enStats4},
++ {pszStatsClear , enStatsClear},
++ {pszStatsDump , enStatsDump},
++ {pszRX_PASS_CRC , enRX_PASS_CRC},
++ {pszRX_QOS_EN , enRX_QOS_EN},
++ {pszRX_NO_CHAIN , enRX_NO_CHAIN},
++ {pszRX_CMF_EN , enRX_CMF_EN},
++ {pszRX_CSF_EN , enRX_CSF_EN},
++ {pszRX_CEF_EN , enRX_CEF_EN},
++ {pszRX_CAF_EN , enRX_CAF_EN},
++ {pszRX_PROM_CH , enRX_PROM_CH},
++ {pszRX_BROAD_EN , enRX_BROAD_EN},
++ {pszRX_BROAD_CH , enRX_BROAD_CH},
++ {pszRX_MULT_EN , enRX_MULT_EN},
++ {pszRX_MULT_CH , enRX_MULT_CH},
++
++ {pszTX_PTYPE , enTX_PTYPE},
++ {pszTX_PACE , enTX_PACE},
++ {pszMII_EN , enMII_EN},
++ {pszTX_FLOW_EN , enTX_FLOW_EN},
++ {pszRX_FLOW_EN , enRX_FLOW_EN},
++ {pszCTRL_LOOPBACK , enCTRL_LOOPBACK},
++ {pszRX_MAXLEN , enRX_MAXLEN},
++ {pszRX_FILTERLOWTHRESH , enRX_FILTERLOWTHRESH},
++ {pszRX0_FLOWTHRESH , enRX0_FLOWTHRESH},
++ {pszRX_UNICAST_SET , enRX_UNICAST_SET},
++ {pszRX_UNICAST_CLEAR , enRX_UNICAST_CLEAR},
++ {pszMdioConnect , enMdioConnect},
++ {pszRX_MULTICAST , enRX_MULTICAST},
++ {pszRX_MULTI_ALL , enRX_MULTI_ALL},
++ {pszRX_MULTI_SINGLE , enRX_MULTI_SINGLE},
++ {pszTick , enTick},
++ {pszVersion , enVersion},
++ {"" , enCpmacEnd}
++ };
++
++const char hcCpuFrequency[] = "CpuFreq";
++const char hcCpmacFrequency[] = "CpmacFrequency";
++const char hcMdioBusFrequency[] = "MdioBusFrequency";
++const char hcMdioClockFrequency[] = "MdioClockFrequency";
++const char hcCpmacBase[] = "CpmacBase";
++const char hcPhyNum[] = "PhyNum";
++const char hcSize[] = "size";
++const char hcCpmacSize[] = "CpmacSize";
++const char hcPhyAccess[] = "PhyAccess";
++const char hcLinked[] = "Linked";
++const char hcFullDuplex[] = "FullDuplex";
++const char hcMdixMask[] = "MdixMask";
++const char hcMdioMdixSwitch[] = "MdixSet";
++#endif
+diff -urN linux.old/drivers/net/avalanche_cpmac/Makefile linux.dev/drivers/net/avalanche_cpmac/Makefile
+--- linux.old/drivers/net/avalanche_cpmac/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/Makefile 2005-07-10 03:22:40.522158000 +0200
+@@ -0,0 +1,26 @@
++# File: drivers/net/avalanche_cpmac/Makefile
++#
++# Makefile for the Linux network (CPMAC) device drivers.
++#
++
++O_TARGET := avalanche_cpmac.o
++
++
++list-multi := avalanche_cpmac.o
++obj-$(CONFIG_MIPS_AVALANCHE_CPMAC) := avalanche_cpmac.o
++
++avalanche_cpmac-objs += cpmac.o cpmacHalLx.o hcpmac.o \
++ psp_config_build.o psp_config_mgr.o \
++ psp_config_parse.o psp_config_util.o
++
++
++include $(TOPDIR)/Rules.make
++
++
++avalanche_cpmac.o: $(avalanche_cpmac-objs)
++ $(LD) -r -o $@ $(avalanche_cpmac-objs)
++
++
++
++clean:
++ rm -f core *.o *.a *.s
+diff -urN linux.old/drivers/net/avalanche_cpmac/mdio_reg.h linux.dev/drivers/net/avalanche_cpmac/mdio_reg.h
+--- linux.old/drivers/net/avalanche_cpmac/mdio_reg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/mdio_reg.h 2005-07-10 03:22:40.522158000 +0200
+@@ -0,0 +1,121 @@
++/****************************************************************************
++** TNETD53xx Software Support
++** Copyright(c) 2002, Texas Instruments Incorporated. All Rights Reserved.
++**
++** FILE: mdio_reg.h Register definitions for the VBUS MII module
++**
++** DESCRIPTION:
++** This include file contains register definitions for the
++** VBUS MII module.
++**
++** HISTORY:
++** 27Mar02 Michael Hanrahan Original (modified from emacmdio.h)
++** 01Apr02 Michael Hanrahan Modified to include all regs. in spec
++** 03Apr02 Michael Hanrahan Updated to Version 0.6 of spec
++** 05Apr02 Michael Hanrahan Moved Phy Mode values into here
++** 30Apr02 Michael Hanrahan Updated to Version 0.8 of spec
++** 30Apr02 Michael Hanrahan Updated to recommended format
++** 10May02 Michael Hanrahan Updated to Version 0.9 of spec
++*****************************************************************************/
++#ifndef _INC_MDIO_REG
++#define _INC_MDIO_REG
++
++/***************************************************************************
++**
++** M D I O M E M O R Y M A P
++**
++***************************************************************************/
++
++
++#define pMDIO_VER(base) ((volatile bit32u *)(base+0x00))
++#define pMDIO_CONTROL(base) ((volatile bit32u *)(base+0x04))
++#define pMDIO_ALIVE(base) ((volatile bit32u *)(base+0x08))
++#define pMDIO_LINK(base) ((volatile bit32u *)(base+0x0C))
++#define pMDIO_LINKINTRAW(base) ((volatile bit32u *)(base+0x10))
++#define pMDIO_LINKINTMASKED(base) ((volatile bit32u *)(base+0x14))
++#define pMDIO_USERINTRAW(base) ((volatile bit32u *)(base+0x20))
++#define pMDIO_USERINTMASKED(base) ((volatile bit32u *)(base+0x24))
++#define pMDIO_USERINTMASKED_SET(base) ((volatile bit32u *)(base+0x28))
++#define pMDIO_USERINTMASKED_CLR(base) ((volatile bit32u *)(base+0x2C))
++#define pMDIO_USERACCESS(base, channel) ((volatile bit32u *)(base+(0x80+(channel*8))))
++#define pMDIO_USERPHYSEL(base, channel) ((volatile bit32u *)(base+(0x84+(channel*8))))
++
++
++/***************************************************************************
++**
++** M D I O R E G I S T E R A C C E S S M A C R O S
++**
++***************************************************************************/
++
++
++#define MDIO_ALIVE(base) (*(pMDIO_ALIVE(base)))
++#define MDIO_CONTROL(base) (*(pMDIO_CONTROL(base)))
++#define MDIO_CONTROL_IDLE (1 << 31)
++#define MDIO_CONTROL_ENABLE (1 << 30)
++#define MDIO_CONTROL_PREAMBLE (1 << 20)
++#define MDIO_CONTROL_FAULT (1 << 19)
++#define MDIO_CONTROL_FAULT_DETECT_ENABLE (1 << 18)
++#define MDIO_CONTROL_INT_TEST_ENABLE (1 << 17)
++#define MDIO_CONTROL_HIGHEST_USER_CHANNEL (0x1F << 8)
++#define MDIO_CONTROL_CLKDIV (0xFF)
++#define MDIO_LINK(base) (*(pMDIO_LINK(base)))
++#define MDIO_LINKINTRAW(base) (*(pMDIO_LINKINTRAW(base)))
++#define MDIO_LINKINTMASKED(base) (*(pMDIO_LINKINTMASKED(base)))
++#define MDIO_USERINTRAW(base) (*(pMDIO_USERINTRAW(base)))
++#define MDIO_USERINTMASKED(base) (*(pMDIO_USERINTMASKED(base)))
++#define MDIO_USERINTMASKED_CLR(base) (*(pMDIO_USERINTMASKED_CLR(base)))
++#define MDIO_USERINTMASKED_SET(base) (*(pMDIO_USERINTMASKED_SET(base)))
++#define MDIO_USERINTRAW(base) (*(pMDIO_USERINTRAW(base)))
++#define MDIO_USERACCESS(base, channel) (*(pMDIO_USERACCESS(base, channel)))
++#define MDIO_USERACCESS_GO (1 << 31)
++#define MDIO_USERACCESS_WRITE (1 << 30)
++#define MDIO_USERACCESS_READ (0 << 30)
++#define MDIO_USERACCESS_ACK (1 << 29)
++#define MDIO_USERACCESS_REGADR (0x1F << 21)
++#define MDIO_USERACCESS_PHYADR (0x1F << 16)
++#define MDIO_USERACCESS_DATA (0xFFFF)
++#define MDIO_USERPHYSEL(base, channel) (*(pMDIO_USERPHYSEL(base, channel)))
++#define MDIO_USERPHYSEL_LINKSEL (1 << 7)
++#define MDIO_USERPHYSEL_LINKINT_ENABLE (1 << 6)
++#define MDIO_USERPHYSEL_PHYADR_MON (0x1F)
++#define MDIO_VER(base) (*(pMDIO_VER(base)))
++#define MDIO_VER_MODID (0xFFFF << 16)
++#define MDIO_VER_REVMAJ (0xFF << 8)
++#define MDIO_VER_REVMIN (0xFF)
++
++
++
++
++/****************************************************************************/
++/* */
++/* P H Y R E G I S T E R D E F I N I T I O N S */
++/* */
++/****************************************************************************/
++
++
++#define PHY_CONTROL_REG 0
++ #define PHY_RESET (1<<15)
++ #define PHY_LOOP (1<<14)
++ #define PHY_100 (1<<13)
++ #define AUTO_NEGOTIATE_EN (1<<12)
++ #define PHY_PDOWN (1<<11)
++ #define PHY_ISOLATE (1<<10)
++ #define RENEGOTIATE (1<<9)
++ #define PHY_FD (1<<8)
++
++#define PHY_STATUS_REG 1
++ #define NWAY_COMPLETE (1<<5)
++ #define NWAY_CAPABLE (1<<3)
++ #define PHY_LINKED (1<<2)
++
++#define NWAY_ADVERTIZE_REG 4
++#define NWAY_REMADVERTISE_REG 5
++ #define NWAY_FD100 (1<<8)
++ #define NWAY_HD100 (1<<7)
++ #define NWAY_FD10 (1<<6)
++ #define NWAY_HD10 (1<<5)
++ #define NWAY_SEL (1<<0)
++ #define NWAY_AUTO (1<<0)
++
++
++#endif _INC_MDIO_REG
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_build.c linux.dev/drivers/net/avalanche_cpmac/psp_config_build.c
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_build.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_build.c 2005-07-10 07:31:18.203326552 +0200
+@@ -0,0 +1,335 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Configuration Build Source
++ ******************************************************************************
++ * FILE NAME: psp_config_build.c
++ *
++ * DESCRIPTION: Configuration Build API Implementation
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifdef INCLUDE_FFS
++#include "ffs.h"
++#endif /* INCLUDE_FFS */
++
++#include "psp_config_mgr.h"
++#include "psp_config_build.h"
++#include "psp_config_util.h"
++
++#define MAX_DEVICE_NAME_LEN 16
++#define MAX_DEVICE_STR_LEN 512
++
++#ifndef NULL
++#define NULL (char *)0
++#endif
++
++#include <asm/ar7/sangam.h>
++#include <linux/slab.h>
++#include <linux/config.h>
++
++
++#define os_malloc(size) kmalloc(size, GFP_KERNEL)
++
++int psp_run_enumerator(void)
++{
++ return(0);
++}
++
++#if defined (CONFIG_AVALANCHE_CPMAC_AUTO)
++
++static int auto_detect_cpmac_phy(void)
++{
++
++#define SELECT_INT_PHY_MAC 0
++#define SELECT_EXT_PHY_MAC 1
++
++ volatile unsigned long *reset_cntl = AVALANCHE_RESET_CONTROL_BASE, *mdio_cntl = ((int)AVALANCHE_MDIO_BASE + 0x4);
++ unsigned int j= 0, detected_phy_map = 0, auto_select = SELECT_INT_PHY_MAC;
++
++ *reset_cntl |= (1 << AVALANCHE_MDIO_RESET_BIT) | (1 << AVALANCHE_LOW_CPMAC_RESET_BIT) | (1 << AVALANCHE_HIGH_CPMAC_RESET_BIT) | (1 << AVALANCHE_LOW_EPHY_RESET_BIT);
++ *mdio_cntl = (1 << 30) | ((CONFIG_AR7_SYS_FREQUENCY * 1000)/2200);
++
++ for(j=0;j < 300000; j++)
++ {
++ if(j%100000) continue;
++
++ detected_phy_map = *(mdio_cntl + 1);
++ if(detected_phy_map)
++ {
++ detected_phy_map &= ~AVALANCHE_LOW_CPMAC_PHY_MASK;
++
++ if(detected_phy_map && !(detected_phy_map & (detected_phy_map - 1)))
++ {
++ auto_select = SELECT_EXT_PHY_MAC;
++ break;
++ }
++ }
++ }
++
++ return(auto_select);
++
++}
++
++#endif
++
++
++#ifndef AVALANCHE_LOW_CPMAC_MDIX_MASK
++#define AVALANCHE_LOW_CPMAC_MDIX_MASK 0
++#endif
++
++void psp_load_default_static_cfg(void)
++{
++ char s2[100], s3[100];
++ char s4[2000], s6[2000];
++ int threshold = 20;
++ char *tx_threshold_ptr = prom_getenv("threshold");
++
++ if(tx_threshold_ptr)
++ threshold = simple_strtol(tx_threshold_ptr, (char **)NULL, 10);
++
++ /* Static configuration if options.conf not present */
++ sprintf(s3,"cpmdio(id=mii, base=%u, reset_bit=%d)", AVALANCHE_MDIO_BASE, 22);
++ sprintf(s2, "reset( id=[ResetRegister], base=%u)", AVALANCHE_RESET_CONTROL_BASE);
++
++ sprintf(s4, "cpmac(id=[cpmac], unit=0, base=%u, size=0x800, reset_bit=%d, PhyMask=%u, MdixMask=%u, MLink=0, int_line=%d, memory_offset=0, RX_CAF=1, RX_PASSCRC=0, RX_CEF=1, RX_BCAST=0, RX_BCASTCH=0, Ch0=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch1=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch2=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128])", AVALANCHE_LOW_CPMAC_BASE, AVALANCHE_LOW_CPMAC_RESET_BIT, AVALANCHE_LOW_CPMAC_PHY_MASK, AVALANCHE_LOW_CPMAC_MDIX_MASK, AVALANCHE_LOW_CPMAC_INT,threshold,threshold,threshold);
++
++ sprintf(s6, "cpmac(id=[cpmac], unit=1, base=%u, size=0x800, reset_bit=%d, PhyMask=%u, MLink=0, int_line=%d, memory_offset=0, RX_CAF=1, RX_PASSCRC=0, RX_CEF=1, RX_BCAST=0, RX_BCASTCH=0, Ch0=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch1=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128], Ch2=[TxNumBuffers=256, TxNumQueues=1, TxServiceMax=%d, RxNumBuffers=256, RxBufferOffset=0, RxBufSize=1000, RxServiceMax=128])", AVALANCHE_HIGH_CPMAC_BASE, AVALANCHE_HIGH_CPMAC_RESET_BIT, AVALANCHE_HIGH_CPMAC_PHY_MASK, AVALANCHE_HIGH_CPMAC_INT,threshold,threshold,threshold);
++
++ psp_config_add("reset", s2, psp_config_strlen(s2), en_compile);
++
++
++#if defined (CONFIG_AVALANCHE_LOW_CPMAC)
++
++ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
++ psp_config_add("cpmac", s4, psp_config_strlen(s4), en_compile);
++
++#endif
++
++
++#if defined (CONFIG_AVALANCHE_HIGH_CPMAC)
++
++ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
++ psp_config_add("cpmac", s6, psp_config_strlen(s6), en_compile);
++
++#endif
++
++#if defined (CONFIG_AVALANCHE_CPMAC_AUTO)
++ {
++ char *phy_sel_ptr = prom_getenv("mac_phy_sel");
++ int phy_sel = SELECT_EXT_PHY_MAC;
++ char *mac_port = prom_getenv("MAC_PORT"); /* Internal: 0, External: 1 */
++
++ if(phy_sel_ptr && (0 == strcmp(phy_sel_ptr, "int")))
++ {
++ phy_sel = SELECT_INT_PHY_MAC;
++ }
++
++ //if(phy_sel == auto_detect_cpmac_phy())
++ if(!mac_port || (0 != strcmp(mac_port, "0")))
++ {
++ printk("Using the MAC with external PHY\n");
++ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
++ psp_config_add("cpmac", s6, psp_config_strlen(s6), en_compile);
++ }
++ else
++ {
++ printk("Using the MAC with internal PHY\n");
++ psp_config_add("cpmdio", s3, psp_config_strlen(s3), en_compile);
++ psp_config_add("cpmac", s4, psp_config_strlen(s4), en_compile);
++ }
++ }
++
++#endif
++
++}
++
++char* psp_conf_read_file(char *p_file_name)
++{
++#ifdef INCLUDE_FFS
++
++ char *p_file_data = NULL;
++ unsigned int file_size;
++ FFS_FILE *p_file = NULL;
++
++ if(p_file_name == NULL)
++ {
++ return (NULL);
++ }
++
++ if(!(p_file = ffs_fopen(p_file_name, "r")))
++ {
++ return(NULL);
++ }
++
++ file_size = p_file->_AvailableBytes;
++
++ p_file_data = os_malloc(file_size + 1);
++
++ if(ffs_fread(p_file_data, file_size, 1, p_file) == 0)
++ {
++ kfree(p_file_data);
++ return(NULL);
++ }
++
++ ffs_fclose(p_file);
++
++ p_file_data[file_size] = '\0';
++
++ return(p_file_data);
++
++#else /* NO FFS */
++ return(NULL);
++#endif /* INCLUDE_FFS */
++}
++
++int psp_conf_get_line(char *p_in_data, char **next_line)
++{
++ char *p = p_in_data;
++
++ while(*p && *p++ != '\n')
++ {
++
++ }
++
++ *next_line = p;
++
++ return(p - 1 - p_in_data);
++}
++
++
++int psp_conf_is_data_line(char *line)
++{
++ int ret_val = 1;
++
++ if(*line == '\0' || *line == '\n' || *line == '#')
++ ret_val = 0;
++
++ return(ret_val);
++}
++
++int psp_conf_get_key_size(char *data)
++{
++ char *p = data;
++
++ while(*p && *p != '\n' && *p != '(' && *p != ' ')
++ p++;
++
++ return(p - data);
++}
++
++char* psp_conf_eat_white_spaces(char *p)
++{
++ while(*p && *p != '\n' && *p == ' ')
++ p++;
++
++ return (p);
++}
++
++int psp_build_from_opt_conf(void)
++{
++ char *data = NULL;
++ char *data_hold = NULL;
++ char *next_line = NULL;
++ int line_size = 0;
++
++ if((data = psp_conf_read_file("/etc/options.conf")) == NULL)
++ return(-1);
++
++ data_hold = data;
++
++ while((line_size=psp_conf_get_line(data, &next_line)) != -1)
++ {
++
++ char *name = NULL;
++ int name_size;
++
++ data = psp_conf_eat_white_spaces(data);
++
++ if(psp_conf_is_data_line(data))
++ {
++ data[line_size] = '\0';
++
++ name_size = psp_conf_get_key_size(data);
++
++ if(name_size > 0)
++ {
++ name = (char *) os_malloc(name_size + 1);
++ if(name == NULL) break;
++
++ psp_config_memcpy(name, data, name_size);
++ name[name_size] = '\0';
++
++ psp_config_add(name, data, line_size, en_opt_conf);
++
++ kfree(name);
++ }
++
++ data[line_size] = '\n';
++ }
++
++ data = next_line;
++ }
++
++ kfree(data_hold);
++ return (0);
++}
++
++
++int psp_write_conf_file(char *p_write_file, char * dev_cfg_string)
++{
++#ifdef INCLUDE_FFS
++ int bytes_written=0;
++ FFS_FILE *file_ptr=NULL;
++
++ /*
++ * NOTE: In current implementation of FFS in ADAM2 if the file exists beforehand, it
++ * can't be opened for write.
++ */
++ if(!(file_ptr=ffs_fopen(p_write_file, "w"))) {
++ return(-1);
++ }
++
++ /* Write into the file "output.con" the character string */
++ /* write a \n before a writing a line */
++ if(!(bytes_written = ffs_fwrite("\n", 1, sizeof(char), file_ptr))) {
++ return (-1);
++ }
++
++ if(!(bytes_written = ffs_fwrite(dev_cfg_string, psp_config_strlen(dev_cfg_string), sizeof(char), file_ptr))) {
++ return (-1);
++ }
++ ffs_fclose(file_ptr);
++ return (bytes_written+1);
++#else /* NO FFS */
++ return(-1);
++#endif /* INCLUDE_FFS */
++}
++
++void build_psp_config(void)
++{
++
++ /* initialize the repository. */
++ psp_config_init();
++
++#ifdef INCLUDE_FFS
++ ffs_init();
++#endif /* INCLUDE_FFS */
++
++ /* read the configuration from the options.conf to override default ones */
++ psp_build_from_opt_conf();
++
++ /* read the configuration which were not over ridden in options.conf */
++ psp_load_default_static_cfg();
++
++ /* let the vlynq be enumerated. Enumerator will add cfg info
++ of the discovered device instances to the repository.*/
++ psp_run_enumerator();
++
++ /* dump the repository*/
++ dump_device_cfg_pool();
++
++}
++
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_build.h linux.dev/drivers/net/avalanche_cpmac/psp_config_build.h
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_build.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_build.h 2005-07-10 03:22:40.523158000 +0200
+@@ -0,0 +1,138 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Configuration Build Header
++ ******************************************************************************
++ * FILE NAME: psp_config_build.h
++ *
++ * DESCRIPTION: Configuration Build API's.
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __PSP_CONF_BUILD_H__
++#define __PSP_CONF_BUILD_H__
++
++/*------------------------------------------------------------------------------
++ * Name: psp_conf_read_file
++ *
++ * Parameters:
++ * in: p_file_name - the name of the file to read from.
++ *
++ * Description:
++ * Reads the entire file in one shot. This function opens the
++ * file, determines the size of the data to be read, allocates
++ * the required memory, NULL terminates the data and closes the
++ * file.
++ *
++ * It is responsibily of the callee to free the memory after it is
++ * done with that data.
++ *
++ *
++ * Returns:
++ * A NULL pointer, if failed to read the data otherwise, a valid
++ * pointer referring to the data read from the file.
++ *
++ * Example:
++ *
++ * psp_conf_read_file("/etc/options.conf");
++ *---------------------------------------------------------------------------*/
++ char *psp_conf_read_file(char *p_file_name);
++
++ /*----------------------------------------------------------------------------
++ * Function : psp_conf_write_file
++ *
++ * Parameters:
++ * in: p_file_name - the file to which data is to be written.
++ * in: data - the NULL terminated data string.
++ *
++ * Description:
++ * Write the indicated data into the file. This function opens the file,
++ * appends the data to end of the file, closes the file.
++ *
++ * Returns:
++ *
++ * The number of bytes on success.
++ * 0 on failure.
++ *
++ * Example:
++ *
++ * psp_conf_write_file("/etc/outcon.conf", data);
++ *--------------------------------------------------------------------------*/
++ int psp_conf_write_file(char *p_file_name, char *data);
++
++ /*----------------------------------------------------------------------------
++ * Function: psp_conf_get_line
++ *
++ * Parameters:
++ * in: data - the data from which the line is to identified.
++ * out: next_line - the pointer to start of the next line.
++ *
++ * Description:
++ * Expects the data to be '\n' separated segments and data is NULL
++ * terminated. Parses the given data for '\n' or '\0'. Provides a pointer
++ * to the start of next line in the next_line.
++ *
++ * Returns:
++ * -1 on error.
++ * 0 or more to indicate the number of bytes in the line starting at
++ * data.
++ *--------------------------------------------------------------------------*/
++ int psp_get_conf_line(char *p_in_data, char **next_line);
++
++ /*----------------------------------------------------------------------------
++ * Function: psp_conf_is_data_line
++ *
++ * Parameters:
++ * in: line - the array of bytes.
++ *
++ * Description:
++ * Tests the first byte in the array for '\0' or '\n' or '#'. Lines
++ * starting with these characters are not considered data.
++ *
++ * Returns:
++ * 1 if the line has data.
++ * 0 otherwise.
++ *
++ *--------------------------------------------------------------------------*/
++ int psp_conf_is_data_line(char *line);
++
++ /*----------------------------------------------------------------------------
++ * Function: psp_conf_eat_white_spaces
++ *
++ * Parameters:
++ * in: line - the array of bytes.
++ *
++ * Description:
++ * Eats white spaces at the begining of the line while looking out for
++ * '\0' or '\n' or ' '.
++ *
++ * Returns:
++ * Pointer to the begining of the non white space character.
++ * NULL if '\0' or '\n' is found.
++ *
++ *--------------------------------------------------------------------------*/
++ char *psp_conf_eat_white_spaces(char *line);
++
++ /*---------------------------------------------------------------------------
++ * Function: psp_conf_get_key_size
++ *
++ * Parameters:
++ * in: line - the array of bytes.
++ *
++ * Description:
++ * Identifies the size of the 'key' in array formatted as
++ * key(id=[key1]....). This function also checks out for '\0' and '\n'.
++ *
++ * Returns:
++ * On success, The number of bytes that forms the key.
++ * 0 otherwise.
++ *
++ *-------------------------------------------------------------------------*/
++ int psp_conf_get_key_size(char *line);
++
++
++
++#endif /* __PSP_CONF_BUILD_H__ */
++
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.c linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.c
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,464 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager Source
++ ******************************************************************************
++ * FILE NAME: psp_config_mgr.c
++ *
++ * DESCRIPTION:
++ *
++ * Manages configuration information. The repository is managed on the basis of
++ * <key, info> pair. It is possible to have multiple occurrence of the same key.
++ * Multiple occurences of the same keys are referred to as 'instances'.
++ * 'instances' are assigned in the order of configuration arrival. The first
++ * config for a 'key' added to the repository would be treated as instance 0 and
++ * next config to arrive for the same key would be treated as instance '1' and
++ * so on.
++ *
++ * Info is retrieved from the repository based on the 'key' and 'instance' value.
++ *
++ * No assumption is made about the format of the information that is put in the
++ * repository. The only requirement is that 'key' should be NULL terminated
++ * string.
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++//#include <stdio.h>
++//#include <stdlib.h>
++#include "psp_config_mgr.h"
++#include "psp_config_util.h"
++
++#include <linux/slab.h>
++
++/*-----------------------------------------------------------
++ Implemented elsewhere
++ -----------------------------------------------------------*/
++extern int sys_read_options_conf(void);
++extern int sys_write_options_conf(char *cfg_info);
++extern int sys_load_default_static_cfg(void);
++extern int sys_run_enumerator(void);
++
++#define os_malloc(size) kmalloc(size, GFP_KERNEL)
++
++/*---------------------------------------------------------
++ * Data structures.
++ *--------------------------------------------------------*/
++struct device_cfg_data;
++
++typedef struct device_instance_cfg_data
++{
++ struct device_instance_cfg_data *next;
++ char locale[100];
++ unsigned int data_size;
++ char *data;
++
++} DEV_INSTANCE_CFG_DATA_T;
++
++struct device_cfg_collection;
++
++typedef struct device_cfg_collection
++{
++ struct device_cfg_collection *next;
++ char *device_name;
++ CFG_TYPE_T cfg_type;
++ int count;
++ DEV_INSTANCE_CFG_DATA_T *dev_inst_list_begin;
++ DEV_INSTANCE_CFG_DATA_T *dev_inst_list_end;
++} DEVICE_CFG_T;
++
++
++typedef struct device_cfg_list
++{
++ DEVICE_CFG_T *device_cfg_begin;
++ int count;
++} DEVICE_CFG_LIST_T;
++
++/*-----------------------------------------------------------------------------
++ * Functions used locally with in the file.
++ *---------------------------------------------------------------------------*/
++static void p_init_device_cfg_list(void);
++static int p_add_instance_cfg_data(DEVICE_CFG_T *p_dev_cfg,
++ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data);
++static DEVICE_CFG_T* p_create_dev_cfg(char *device_name);
++static DEVICE_CFG_T* p_get_dev_cfg(char *device_name);
++static int p_set_device_cfg_type(DEVICE_CFG_T *p_dev_cfg,
++ CFG_TYPE_T cfg_type);
++
++/* PSP Config manager debug */
++#define PSP_CFG_MGR_DEBUG 0
++
++#define dbgPrint if (PSP_CFG_MGR_DEBUG) printk
++
++/*-----------------------------------------------------------------------------
++ * The repository.
++ *---------------------------------------------------------------------------*/
++static DEVICE_CFG_LIST_T g_device_cfg_list;
++
++/*---------------------------------------------
++ * Initialize the device collection pool.
++ *--------------------------------------------*/
++void p_init_device_cfg_list(void)
++{
++ g_device_cfg_list.count = 0;
++ g_device_cfg_list.device_cfg_begin = NULL;
++}
++
++/*----------------------------------------------------------------------
++ * Add the device cfg into the device linked list.
++ *---------------------------------------------------------------------*/
++int p_add_dev_cfg_to_list(DEVICE_CFG_LIST_T *p_dev_list,
++ DEVICE_CFG_T *p_dev_cfg)
++{
++ if(p_dev_list->count != 0)
++ p_dev_cfg->next = p_dev_list->device_cfg_begin;
++
++ p_dev_list->device_cfg_begin = p_dev_cfg;
++
++ p_dev_list->count++;
++
++ return (0);
++}
++
++/*------------------------------------------------------------------
++ * Add the cfg data into the cfg data linked list of the collection.
++ *------------------------------------------------------------------*/
++int p_add_instance_cfg_data(DEVICE_CFG_T *p_dev_cfg,
++ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data)
++{
++ if(p_dev_cfg->count == 0)
++ p_dev_cfg->dev_inst_list_begin = p_dev_inst_data;
++ else
++ p_dev_cfg->dev_inst_list_end->next = p_dev_inst_data;
++
++ p_dev_cfg->dev_inst_list_end = p_dev_inst_data;
++
++ p_dev_cfg->count++;
++
++ return (0);
++}
++
++/*-----------------------------------------------------------------------------
++ * Create the device cfg.
++ *---------------------------------------------------------------------------*/
++DEVICE_CFG_T *p_create_dev_cfg(char *device_name)
++{
++ DEVICE_CFG_T *p_dev_cfg = NULL;
++
++ if((p_dev_cfg = os_malloc(sizeof(DEVICE_CFG_T))) == NULL)
++ {
++ dbgPrint("Failed to allocate memory for DEVICE_CFG_T.\n");
++ }
++ else if((p_dev_cfg->device_name = os_malloc(psp_config_strlen(device_name) + 1))==NULL)
++ {
++ dbgPrint("Failed to allocate memory for device name.\n");
++ }
++ else
++ {
++ psp_config_strcpy(p_dev_cfg->device_name, device_name);
++ p_dev_cfg->cfg_type = en_raw;
++ p_dev_cfg->count = 0;
++ p_dev_cfg->dev_inst_list_begin = NULL;
++ p_dev_cfg->dev_inst_list_end = NULL;
++ p_dev_cfg->next = NULL;
++ }
++
++ return(p_dev_cfg);
++}
++
++/*------------------------------------------------------------------------------
++ * Get the device cfg collection.
++ *-----------------------------------------------------------------------------*/
++DEVICE_CFG_T *p_get_dev_cfg(char *device_name)
++{
++ int count = 0;
++ DEVICE_CFG_T *p_dev_cfg = g_device_cfg_list.device_cfg_begin;
++
++ for(count=0; count < g_device_cfg_list.count; count++)
++ {
++ if(psp_config_strcmp(device_name, p_dev_cfg->device_name) == 0)
++ {
++ break;
++ }
++
++ p_dev_cfg = p_dev_cfg->next;
++ }
++
++ return(p_dev_cfg);
++}
++
++/*-------------------------------------------------------------------------
++ * Gets the name for the static cfg type. Utility function. Debug purposes.
++ *-------------------------------------------------------------------------*/
++char *p_get_cfg_type_name_for_en(CFG_TYPE_T cfg_type)
++{
++ static char raw_str [] = "still raw";
++ static char compile_str [] = "configured at compile time";
++ static char optconf_str [] = "configured by options.conf";
++ static char vlynq_str [] = "configured by VLYNQ";
++ static char no_static_str[] = "no static configuration";
++
++ if(cfg_type == en_raw)
++ return (raw_str);
++ else if(cfg_type == en_compile)
++ return (compile_str);
++ else if(cfg_type == en_opt_conf)
++ return (optconf_str);
++ else if(cfg_type == en_vlynq)
++ return (vlynq_str);
++ else
++ return (no_static_str);
++
++}
++
++/*-----------------------------------------------------------------------------
++ * Sets the static cfg status of the device collection.
++ *
++ * If the collection is en_virgin then, the collection is assigned to cfg_type.
++ * If the cfg_type is en_vlynq then, the old cfg_type is retained.
++ * en_compile and en_opt_conf are mutually exclusive. One of these can be
++ * accomodated.
++ *
++ *---------------------------------------------------------------------------*/
++int p_set_device_cfg_type(DEVICE_CFG_T *p_dev_cfg,
++ CFG_TYPE_T cfg_type)
++{
++ int ret_val = 0;
++
++ if(p_dev_cfg->cfg_type == en_raw)
++ p_dev_cfg->cfg_type = cfg_type;
++ else if((cfg_type == en_vlynq) || (p_dev_cfg->cfg_type == cfg_type))
++ ;
++ else
++ {
++ dbgPrint("Device %s has been %s which overrides %s.\n",
++ p_dev_cfg->device_name,
++ p_get_cfg_type_name_for_en(p_dev_cfg->cfg_type),
++ p_get_cfg_type_name_for_en(cfg_type));
++ ret_val = -1;
++ }
++
++ return(ret_val);
++}
++
++/*------------------------------------------------------------------------
++ * Add the config str into the repository. The cfg type indicates
++ * whether the device has been configured statically, from options.conf or
++ * by vlynq enumeration.
++ *------------------------------------------------------------------------*/
++int psp_config_add(char *key, void *p_cfg_str, unsigned int cfg_len,
++ CFG_TYPE_T cfg_type)
++{
++ int ret_val = -1;
++ DEVICE_CFG_T *p_dev_cfg = NULL;
++ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data = NULL;
++
++ if(p_cfg_str == NULL || key == NULL)
++ {
++ dbgPrint("Null input pointer(s).\n");
++ }
++ /* check if there exist a dev_cfg for the given key, if not,
++ then create one and add it to the device list. */
++ else if(((p_dev_cfg = p_get_dev_cfg(key)) == NULL) &&
++ (((p_dev_cfg = p_create_dev_cfg(key)) == NULL) ||
++ p_add_dev_cfg_to_list(&g_device_cfg_list, p_dev_cfg) != 0))
++ {
++ dbgPrint("Failed to allocate mem or add dev cfg for %s.\n", key);
++ }
++ /* make sure that we can add this cfg type to the repository */
++ else if(p_set_device_cfg_type(p_dev_cfg, cfg_type) == -1)
++ {
++ dbgPrint("Ignoring \"%s\" for device \"%s\".\n",
++ p_get_cfg_type_name_for_en(cfg_type),
++ p_dev_cfg->device_name);
++ }
++ else if((p_dev_inst_data = os_malloc(sizeof(DEV_INSTANCE_CFG_DATA_T)))== NULL)
++ {
++ dbgPrint("Failed to allocate memory for DEV_INSTANCE_CFG_DATA_T.\n");
++ }
++ else if((p_dev_inst_data->data = os_malloc(cfg_len) + 1) == NULL)
++ {
++ dbgPrint("Failed to allocate memory for the config data.\n");
++ }
++ else
++ {
++ p_dev_inst_data->next = NULL;
++
++ if(cfg_type == en_opt_conf || cfg_type == en_compile)
++ psp_config_strcpy(p_dev_inst_data->locale, "dev on chip ");
++ else if(cfg_type == en_vlynq)
++ psp_config_strcpy(p_dev_inst_data->locale, "dev on vlynq");
++ else
++ psp_config_strcpy(p_dev_inst_data->locale, "dev locale ?");
++
++ psp_config_memcpy(p_dev_inst_data->data, p_cfg_str, cfg_len);
++ p_dev_inst_data->data_size = cfg_len;
++ *(p_dev_inst_data->data + cfg_len) = '\0';
++
++ ret_val = p_add_instance_cfg_data(p_dev_cfg, p_dev_inst_data);
++ }
++
++ return(ret_val);
++}
++
++/*-------------------------------------------------------------
++ * Get the total number of device instances in the repository
++ *------------------------------------------------------------*/
++int psp_config_get_num_keys(void)
++{
++ return(g_device_cfg_list.count);
++}
++
++
++/*--------------------------------------------------------------------
++ * Get the device configuration info from the repository.
++ *-------------------------------------------------------------------*/
++int psp_config_get(char *key, int instance, char **cfg_data_out)
++{
++ int ret_val = -1;
++ DEVICE_CFG_T *p_dev_cfg = NULL;
++ *cfg_data_out = NULL;
++
++ if(key == NULL && cfg_data_out == NULL)
++ {
++ dbgPrint("Key has a NULL value.\n");
++ }
++ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
++ {
++ dbgPrint("cfg information for %s could not be found.\n", key);
++ }
++ else if(p_dev_cfg->count)
++ {
++ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data =
++ p_dev_cfg->dev_inst_list_begin;
++ int index = 0;
++ for(index = 0;
++ index != instance && index < p_dev_cfg->count;
++ index++)
++ {
++ p_dev_inst_data = p_dev_inst_data->next;
++ }
++
++ if(p_dev_inst_data != NULL && p_dev_inst_data->data != NULL)
++ {
++ *cfg_data_out = p_dev_inst_data->data;
++ ret_val = p_dev_inst_data->data_size;
++ }
++ }
++
++ return (ret_val);
++}
++
++/*----------------------------------------------------------------
++ * Returns the number of instances found in the repository for the
++ * specified key.
++ *---------------------------------------------------------------*/
++int psp_config_get_num_instances(char *key)
++{
++ int ret_val = 0;
++ DEVICE_CFG_T *p_dev_cfg = NULL;
++
++ if(key == NULL)
++ {
++ dbgPrint("Key has a NULL value.\n");
++ }
++ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
++ {
++ dbgPrint("cfg information for %s could not be found.\n", key);
++ }
++ else
++ {
++ ret_val = p_dev_cfg->count;
++ }
++
++ return (ret_val);
++}
++
++/*------------------------------------------------------------------
++ * Dump the configuration repository.
++ * Caution: DO NOT USE THIS FOR ANY NON NBU specified config format.
++ *-----------------------------------------------------------------*/
++void psp_config_print(char *key)
++{
++ DEVICE_CFG_T *p_dev_cfg = NULL;
++
++ if(key == NULL)
++ {
++ dbgPrint("Key has a NULL value.\n");
++ }
++ else if((p_dev_cfg = p_get_dev_cfg(key)) == NULL)
++ {
++ dbgPrint("cfg information for %s could not be found.\n", key);
++ }
++ else if(p_dev_cfg && p_dev_cfg->count)
++ {
++ DEV_INSTANCE_CFG_DATA_T *p_dev_inst_data;
++
++ p_dev_inst_data = p_dev_cfg->dev_inst_list_begin;
++
++ do
++ {
++ dbgPrint("%s : %s\n", p_dev_inst_data->locale,
++ p_dev_inst_data->data);
++ p_dev_inst_data = p_dev_inst_data->next;
++
++ } while(p_dev_inst_data);
++ }
++ else
++ {
++ dbgPrint("Nothing was found for %s.\n", key);
++ }
++}
++
++void dump_device_cfg_pool(void)
++{
++ DEVICE_CFG_T *p_dev_cfg = g_device_cfg_list.device_cfg_begin;
++
++ if(p_dev_cfg != NULL && g_device_cfg_list.count)
++ {
++ int index=0;
++
++ for(index=0; index < g_device_cfg_list.count; index++)
++ {
++ psp_config_print(p_dev_cfg->device_name);
++ p_dev_cfg = p_dev_cfg->next;
++ }
++ }
++ else
++ {
++ dbgPrint("repository is empty.\n");
++ }
++}
++
++void psp_config_init(void)
++{
++ p_init_device_cfg_list();
++}
++
++void psp_config_cleanup()
++{
++ int dev_count = 0;
++ int inst_count = 0;
++ DEVICE_CFG_T *p = g_device_cfg_list.device_cfg_begin;
++ DEV_INSTANCE_CFG_DATA_T *q = NULL;
++
++ for(dev_count = 0; dev_count < g_device_cfg_list.count; dev_count++)
++ {
++ DEVICE_CFG_T *p_temp = NULL;
++ if(p) q = p->dev_inst_list_begin;
++
++ for(inst_count = 0; inst_count < p->count && q != NULL; inst_count++)
++ {
++ DEV_INSTANCE_CFG_DATA_T *q_temp = q;
++ q_temp = q->next;
++ kfree(q->data);
++ kfree(q);
++ q = q_temp;
++ }
++
++ p_temp = p->next;
++ kfree(p);
++ p = p_temp;
++ }
++}
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.h linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.h
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_mgr.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_mgr.h 2005-07-10 03:22:40.525158000 +0200
+@@ -0,0 +1,110 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager Header
++ ******************************************************************************
++ * FILE NAME: psp_config_mgr.h
++ *
++ * DESCRIPTION: Storing and retrieving the configuration based on key
++ * A set of APIs to be used by one and sundry (including drivers and enumerator) to build
++ * and read cfg information of the devices for an avalanche SOC.
++ *
++ * This set of APIs isolates the configuration management from the world and provides simple
++ * access convinience.
++ *
++ * Device in this set refers to the peripherals that can be found on the SOC or on VLYNQ.
++ * The configuration is stored in the form of string and drivers can use these APIs to get
++ * a particular parameter value.
++ *
++ * The memory allocation for the pass back parameters is done by the caller.
++ *
++ * 0 is returned for SUCCESS or TRUE.
++ * -1 is returned for FAILURE or FALSE.
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __PSP_CONFIG_MGR_H__
++#define __PSP_CONFIG_MGR_H__
++
++typedef enum cfg_type
++{
++ en_raw = 0,
++ en_compile,
++ en_opt_conf,
++ en_vlynq
++} CFG_TYPE_T;
++
++/* Build psp configuration */
++void build_psp_config(void);
++
++/********************************************************
++ * Access Operations.
++ ********************************************************/
++
++/*-------------------------------------------------------------------------
++ initializes the configuration repository.
++ -------------------------------------------------------------------------*/
++void psp_config_init(void);
++
++/*--------------------------------------------------------------------------
++ Adds the configuration information into the repository. 'key' is required
++ to be NULL terminated string. 'cfg_ptr' points to the configuration data.
++ 'cfg_len' is the length of the data pointed to by 'cfg_ptr' in bytes.
++ 'cfg_type' indicates the type of config information.
++
++ psp_config_mgr copies the 'cfg_len' bytes of data pointed to by 'cfg_ptr'
++ into its internal repository.
++
++ Returns: 0 on success, -1 on failure.
++ -------------------------------------------------------------------------*/
++int psp_config_add(char *key, void *cfg_ptr,
++ unsigned int cfg_len, CFG_TYPE_T cfg_type);
++
++
++/* --------------------------------------------------------------------------
++ Passes back, in "*cfg_out_val" a pointer to the config data in the repository
++ for the specified 'key' and 'instance'. It returns the size of the config
++ info
++
++ psp_config_mgr passes back a pointer in '*cfg_out_val' which refers to
++ some location in its internal repository. It is strongly recommended that
++ if the user intends to modify the contents of the config info for reasons
++ whatsoever, then, user should allocate memory of size returned by this
++ routine and copy the contents from '*cfg_out_val'.
++
++ Any, modification carried out on the repository would lead to un-expected
++ results.
++
++ Returns: 0 or more for the size of config info, -1 on error.
++ --------------------------------------------------------------------------*/
++int psp_config_get(char *key, int instance, char **cfg_out_val);
++
++
++/*--------------------------------------------------------------------------
++ Get the number of keys that have been added in the repository so far.
++
++ Returns: 0 or more for the num of keys, -1 on error.
++ -------------------------------------------------------------------------*/
++int psp_config_get_num_keys(void);
++
++
++/*--------------------------------------------------------------------------
++ Get the number of instances that are present in the repository for the
++ given 'key'.
++
++ Returns: 0 or more for the num of instances, -1 on error.
++ -------------------------------------------------------------------------*/
++int psp_config_get_num_instances(char *key);
++
++
++/*--------------------------------------------------------------------------
++ Prints the config data for all instances associated with the specified
++ 'key'.
++ -------------------------------------------------------------------------*/
++void psp_config_print(char *key);
++
++void dump_device_cfg_pool(void);
++
++#endif /* __PSP_CONFIG_MGR_H__ */
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_parse.c linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.c
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_parse.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,362 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Parse API Source
++ ******************************************************************************
++ * FILE NAME: psp_config_parse.c
++ *
++ * DESCRIPTION: These APIs should be used only for scanvenging parameters which
++ * are stored in the following format.
++ *
++ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++//#include <stdio.h>
++#include <linux/stddef.h>
++
++/*--------------------------------------------------
++ * MACROS.
++ *-------------------------------------------------*/
++#define my_isdigit(c) (c >= '0' && c <= '9')
++#define my_isoct(c) (c >= '0' && c <= '7')
++#define my_xtod(c) ((c) <= '9' ? (c) - '0' : (c) - 'a' + 10)
++#define my_ifupper(c) (c >= 'A' && c <= 'F')
++#define XTOD(c) ((c) - 'A' + 10)
++#define my_ishex(c) ((c >= 'a' && c <='f') || (c >= 'A' && c<='F') || my_isdigit(c) )
++
++/*---------------------------------------------------
++ * Local Functions.
++ *--------------------------------------------------*/
++static int p_get_substr_from_str(char *p_in_str, char begin_delimiter,
++ char end_delimiter, int pair_flag,
++ char **p_out_str);
++static int p_get_u_int_from_str(char *p_in_str, char begin_delimiter,
++ char end_delimiter, unsigned long *out_val);
++
++/*---------------------------------------------------
++ * Return pointer to first instance of the char.
++ *--------------------------------------------------*/
++static char* psp_config_strchr(char *str, char chr)
++{
++ while(*str)
++ {
++ if(*str == chr)
++ break;
++ str++;
++ }
++
++ return((*str) ? str : NULL);
++}
++
++/*------------------------------------------------------------------------
++ * Convert the string upto delimiter to unsigned long.
++ *-----------------------------------------------------------------------*/
++unsigned long my_atoul(char *p, char end_delimiter, unsigned long *out_val)
++{
++ unsigned long n;
++ int c;
++
++ /* check the for null input */
++ if (!p)
++ return -1;
++
++ c = *p;
++
++ /* pass through the leading spaces */
++ if (!my_isdigit(c))
++ {
++ while ( c == ' ')
++ c = *++p;
++
++ }
++
++ if (c == '0')
++ {
++ if(*(p + 1) == 'x' || *(p+1) == 'X' )
++ {
++ /* string is in hex format */
++
++ p += 2;
++ c = *p;
++
++ if(my_ishex(c))
++ {
++ if(my_ifupper(c))
++ n = XTOD(c);
++ else
++ n = my_xtod(c);
++ }
++ else
++ return -1; /* invalid hex string format */
++
++ while ((c = *++p) && my_ishex(c))
++ {
++ n *= 16;
++ if(my_ifupper(c))
++ n += XTOD(c);
++ else
++ n += my_xtod(c);
++ }
++ }
++ else
++ {
++ /* string is in octal format */
++
++ if( my_isoct(c) )
++ n = c - '0';
++ else
++ return -1; /* invalid octal string format */
++
++ while ((c = *++p) && my_isoct(c))
++ {
++ n *= 8;
++ n += c - '0';
++ }
++ }
++
++ }
++ else
++ {
++ /* string is in decimal format */
++
++ if( my_isdigit(c) )
++ n = c - '0';
++ else
++ return -1; /* invalid decimal string format */
++
++ while ((c = *++p) && my_isdigit(c))
++ {
++ n *= 10;
++ n += c - '0';
++ }
++ }
++
++ /* move through the trailing spaces */
++ while(*p == ' ')
++ p++;
++
++ if(*p == end_delimiter)
++ {
++ *out_val = n;
++ return 0;
++ }
++
++ else
++ return -1; /* invalid string format */
++}
++
++/*---------------------------------------------------------------------------------
++ * Gets the substring de-limited by the 'begin_delimiter' and 'end_delimiter'.
++ * and returns the size of the substring.
++ *
++ * Parses the NULL terminated p_in_str for a character array delimited by
++ * begin_delimiter and end_delimiter, passes back the pointer to the character
++ * array in ' *p_out_str '. The passed pointer ' *p_out_str ' should point to
++ * the location next (byte) to the begin_delimiter. The function routine returns
++ * the number of characters excluding the begin_delimiter and end_delimiter,
++ * found in the array delimited by the said delimiters.
++ *
++ * If the pair_flag is set to 1, then, number of begin_delimiter and end_delimiter
++ * found in the parsing should match (equal) and this routine passes back the
++ * pointer to the character array, starting at a location next (byte) to the
++ * first begin_delimiter, inclusive of all intermediate matching delimiter
++ * characters found between outer delimiters. If the pair flag is set and if
++ * begin_delimiter and end_delimiter happens to be same, then error (-1) is
++ * returned.
++ *
++ * Return: 0 or more to indicate the size of the substring, -1 on error.
++ *-------------------------------------------------------------------------------*/
++int p_get_substr_from_str(char *p_in_str, char begin_delimiter,
++ char end_delimiter, int pair_flag,
++ char **p_out_str)
++{
++ int cnt,pos;
++
++ if(pair_flag && begin_delimiter == end_delimiter)
++ return -1;
++
++ if((p_in_str = psp_config_strchr(p_in_str, begin_delimiter)) == 0)
++ return -1; /* no start delimiter found */
++
++ p_in_str++;
++ *p_out_str = p_in_str;
++
++ for(pos = 0,cnt =1; cnt && p_in_str[pos] ; pos++)
++ {
++ if(p_in_str[pos] == end_delimiter)
++ {
++ if(pair_flag == 0)
++ return pos;
++
++ cnt--;
++ }
++ else if(p_in_str[pos] == begin_delimiter)
++ cnt++;
++ else
++ ; /* We do nothing */
++
++ }
++
++ if( cnt == 0)
++ return pos - 1;
++ else
++ return -1; /* no corresponding end delimiter found */
++}
++
++/*--------------------------------------------------------------------------
++ * Parses the NULL terminated p_in_str for unsigned long value delimited by
++ * begin_delimiter and end_delimiter, passes back the found in ' *out_val '.
++ * The function routine returns 0 on success and returns -1 on failure.
++ * The first instance of the de-limiter should be accounted for the parsing.
++ *
++ * The base for unsigned value would 10, octal and hex. The value passed back
++ * would be of the base 10. Spaces at the begining of the byte array are valid
++ * and should be ingnored in the calculation of the value. Space character in
++ * the middle of the byte array or any character other than the valid ones
++ * (based on base type) should return error. The octal value begins with '0',
++ * the hex value begins with "0x" or "0X", the base value can begin with
++ * '1' to '9'.
++ *
++ * Returns: 0 on success, -1 on failure.
++ *-------------------------------------------------------------------------*/
++int p_get_u_int_from_str(char *p_in_str, char begin_delimiter,
++ char end_delimiter, unsigned long *out_val)
++{
++ char *start;
++ unsigned long num;
++
++ num = p_get_substr_from_str(p_in_str, begin_delimiter, end_delimiter,
++ 0, &start);
++
++ if(num == (unsigned long)-1)
++ return -1;
++
++ return my_atoul(start,end_delimiter,out_val);
++}
++
++/*--------------------------------------------------------------------------
++ * Finds the first occurrence of the substring p_find_str in the string
++ * p_in_str.
++ *-------------------------------------------------------------------------*/
++char *my_strstr(char *p_in_str, const char *p_find_str)
++{
++ char *p = (char *)p_find_str;
++ char *ret = NULL;
++
++ while(*p_in_str)
++ {
++ if(!(*p))
++ return (ret);
++ else if(*p_in_str == *p)
++ {
++ if(!ret) ret = p_in_str;
++ p++;
++ p_in_str++;
++ }
++ else if(ret)
++ {
++ p = (char *)p_find_str;
++ p_in_str = ret + 1;
++ ret = NULL;
++ }
++ else
++ p_in_str++;
++ }
++
++ if(*p_in_str != *p) ret = NULL;
++
++ return (ret);
++
++}
++
++/*------------------------------------------------------------------------------
++ * Gets the value of the config param in the unsigned int format. The value is
++ * stored in the following format in the string.
++ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
++ *-----------------------------------------------------------------------------*/
++int psp_config_get_param_uint(char *p_in_str, const char *param, unsigned int *out_val)
++{
++ int ret_val = -1;
++ char *p_strstr;
++
++ if(!p_in_str || !param || !out_val)
++ {
++ ;
++ }
++ else if((p_strstr = my_strstr(p_in_str, param)) == NULL)
++ {
++ ;
++ }
++ else if(p_get_u_int_from_str(p_strstr, '=', ',', (unsigned long *)out_val) == 0)
++ {
++ ret_val = 0;
++ }
++ else if(p_get_u_int_from_str(p_strstr, '=', ']', (unsigned long*)out_val) == 0)
++ {
++ ret_val = 0;
++ }
++ else if(p_get_u_int_from_str(p_strstr, '=', ')', (unsigned long*)out_val) == 0)
++ {
++ ret_val = 0;
++ }
++ else
++ {
++ /* we failed */
++ }
++
++ return (ret_val);
++}
++
++/*------------------------------------------------------------------------------
++ * Gets the value of the config param in the Non NULL terminated format. The value
++ * is stored in the following format in the string.
++ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
++ *-----------------------------------------------------------------------------*/
++int psp_config_get_param_string(char *p_in_str, const char *param, char **out_val)
++{
++ int ret_val = -1;
++ char *p_strstr;
++
++ if(!p_in_str || !param || !(out_val))
++ ;
++ else if((p_strstr = my_strstr(p_in_str, param)) == NULL)
++ {
++ ;
++ }
++ else if((ret_val = p_get_substr_from_str(p_strstr, '[', ']', 1, out_val)) == -1)
++ {
++ ;
++ }
++ else
++ {
++ ; /* we got the value */
++ }
++
++ return (ret_val);
++}
++
++#ifdef PSP_CONFIG_MGR_DEBUG_TEST
++main()
++{
++ unsigned long num =999;
++ int ret = 0;
++ char *val1 = NULL;
++ char val[30];
++ char str1[] = "cpmac(id=[cpmac], k0=[a1=[a2=[test], a3=2], k1=100, k2=[k3=300, k4=200], k7=722)";
++
++ psp_config_get_param_uint(str1, "k7", &num);
++ printf("%u.\n", num);
++ ret = psp_config_get_param_string(str1, "a1", &val1);
++ if(ret >= 0) { printf("%d.\n", ret); strncpy(val, val1, ret); val[ret] = '\0';}
++
++ printf("val = \"%s\", and size = %d \n", val, ret);
++
++ if(val[ret]) ; else printf("jeee.\n");
++}
++#endif /* PSP_CONFIG_MGR_DEBUG_TEST */
++
++
++
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_parse.h linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.h
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_parse.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_parse.h 2005-07-10 03:22:40.526158000 +0200
+@@ -0,0 +1,32 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Parse API Header
++ ******************************************************************************
++ * FILE NAME: psp_config_parse.h
++ *
++ * DESCRIPTION: Parsing for params from string available in the NBU format.
++ * These APIs should be used only for scanvenging parameters which
++ * are stored in the following format.
++ *
++ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __PSP_CONFIG_PARSER_H__
++#define __PSP_CONFIG_PARSER_H__
++
++/*------------------------------------------------------------------
++ * These APIs should be used only for scanvenging parameters which
++ * are stored in the following format.
++ *
++ * str[] = "module(id=[module], k1=v1, k2=[k3=v3, k4=v4], k5=v5)"
++ *-----------------------------------------------------------------*/
++int psp_config_get_param_uint(char *p_in_str, const char *param,
++ unsigned int *out_val);
++int psp_config_get_param_string(char *p_in_str, const char *param,
++ char **out_val);
++
++#endif /* __PSP_CONFIG_PARSER_H__ */
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_util.c linux.dev/drivers/net/avalanche_cpmac/psp_config_util.c
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_util.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_util.c 2005-07-10 04:06:50.492302104 +0200
+@@ -0,0 +1,106 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Utilities API Source
++ ******************************************************************************
++ * FILE NAME: psp_config_util.c
++ *
++ * DESCRIPTION: These APIs provide the standard "C" string interfaces.
++ * Provided here to reduce dependencies on the standard libraries
++ * and for cases where psp_config would required to run before
++ * the whole system is loaded or outside the scope of the OS.
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++//#include <stdio.h>
++#include "psp_config_util.h"
++#include <linux/stddef.h>
++
++/*---------------------------------------------
++ * strlen.
++ *-------------------------------------------*/
++int psp_config_strlen(char *p)
++{
++ char *p_orig = p;
++ while(*p)
++ p++;
++ return(p - p_orig);
++}
++
++/*--------------------------------------------
++ * strcmp.
++ *-------------------------------------------*/
++int psp_config_strcmp(char *s1, char *s2)
++{
++ while(*s1 && *s2)
++ {
++ if(*s1 != *s2)
++ break;
++ s1++;
++ s2++;
++ }
++
++ return(*s1 - *s2);
++}
++
++/*--------------------------------------------
++ * strcpy.
++ *------------------------------------------*/
++char* psp_config_strcpy(char *dest, char *src)
++{
++ char *dest_orig = dest;
++
++ while(*src)
++ {
++ *dest++ = *src++;
++ }
++
++ *dest = '\0';
++
++ return(dest_orig);
++}
++
++/*----------------------------------------------
++ * psp_config_memcpy.
++ *--------------------------------------------*/
++void* psp_config_memcpy(void* dest, void* src, unsigned int n)
++{
++ void *dest_orig = dest;
++
++ while(n)
++ {
++ *(char *)dest++ = *(char *)src++;
++ n--;
++ }
++
++ return (dest_orig);
++}
++
++/*---------------------------------------------------
++ * Return pointer to first instance of the char.
++ *--------------------------------------------------*/
++char* psp_config_strchr(char *str, char chr)
++{
++ while(*str)
++ {
++ if(*str == chr)
++ break;
++ str++;
++ }
++
++ return((*str) ? str : NULL);
++}
++
++#ifdef PSP_CONFIG_MGR_DEBUG_TEST
++
++int main( )
++{
++ char s[] = "hello ";
++ printf("%d.\n", psp_config_strlen("hello\n"));
++ printf("%d.\n", psp_config_strcmp("hells", "hellq"));
++ printf("%s %s.\n", psp_config_strcpy(s + 6, "test1"), s);
++}
++
++#endif /* PSP_CONFIG_MGR_DEBUG_TEST */
+diff -urN linux.old/drivers/net/avalanche_cpmac/psp_config_util.h linux.dev/drivers/net/avalanche_cpmac/psp_config_util.h
+--- linux.old/drivers/net/avalanche_cpmac/psp_config_util.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/psp_config_util.h 2005-07-10 03:22:40.526158000 +0200
+@@ -0,0 +1,26 @@
++/******************************************************************************
++ * FILE PURPOSE: PSP Config Manager - Utilities API Header
++ ******************************************************************************
++ * FILE NAME: psp_config_util.h
++ *
++ * DESCRIPTION: These APIs provide the standard "C" string interfaces.
++ * Provided here to reduce dependencies on the standard libraries
++ * and for cases where psp_config would required to run before
++ * the whole system is loaded or outside the scope of the OS.
++ *
++ * REVISION HISTORY:
++ * 27 Nov 02 - PSP TII
++ *
++ * (C) Copyright 2002, Texas Instruments, Inc
++ *******************************************************************************/
++
++#ifndef __PSP_CONFIG_UTIL_H__
++#define __PSP_CONFIG_UTIL_H__
++
++extern int psp_config_strlen(char*);
++extern int psp_config_strcmp(char*, char*);
++extern char* psp_config_strcpy(char*, char*);
++extern void* psp_config_memcpy(void*, void*, unsigned int n);
++extern char* psp_config_strchr(char*, char);
++
++#endif /* __PSP_CONFIG_UTIL_H__ */
+diff -urN linux.old/drivers/net/avalanche_cpmac/readme.txt linux.dev/drivers/net/avalanche_cpmac/readme.txt
+--- linux.old/drivers/net/avalanche_cpmac/readme.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/net/avalanche_cpmac/readme.txt 2005-07-10 03:22:40.527158000 +0200
+@@ -0,0 +1,545 @@
++23 August 2004 CPMAC 1.7.8 (NSP Performance Team Release)
++
++CC Labels: REL_20040823_HALdallas_cpmac_01.07.08
++
++New features: Key "MacAddr" can now be used to set the Mac Address after Open.
++
++ unsigned char MacAddr[6];
++
++ // Set Mac Address to "00.B0.D0.10.80.C1"
++ MacAddr[0] = 0x00;
++ MacAddr[1] = 0xB0;
++ MacAddr[2] = 0xD0;
++ MacAddr[3] = 0x10;
++ MacAddr[4] = 0x80;
++ MacAddr[5] = 0xC1;
++
++ HalFunc->Control(HalDev, "MacAddr", hcSet, &MacAddr);
++
++Bug fixes: in Send(), Threshold is not checked if Tx Ints are re-enabled.
++
++Modules affected: hcpmac.c, hcpmac.h, cppi_cpmac.c
++
++22 June 2004 CPMAC 1.7.6 (NSP Performance Team Release)
++
++CC Labels: REL_20040622_HALdallas_cpmac_01.07.06
++
++New features: Key "TxIntDisable" used to disable Tx Interrupts. If it is set, then Tx Interrupts will be processed on Send() controlled by Tx ServiceMax Setting.
++
++ int On = 1;
++ HalFunc->Control(HalDev, "TxIntDisable", "Set", &On);
++
++Bug fixes: NTR
++
++10 June 2004 CPMAC 1.7.5 (external release)
++
++CC Labels: REL_20040610_HALdallas_cpmac_01.07.05
++
++New features: NTR
++
++Bug fixes: Fixed an issue with calculation for the multicast hash.
++
++27 May 2004 CPSAR 1.7.4, CPMAC 1.7.4 (external release)
++
++CC Labels: REL_20040527_HALdallas_cpsar_01.07.04
++ REL_20040527_HALdallas_cpmac_01.07.04
++
++New features: NTR
++
++Bug fixes: A flaw was fixed in the critical sectioning of the CPPI file, affecting both
++ the MAC and the SAR releases. This flaw was detected on Titan PSP 4.7 BFT2.
++
++05 May 2004 CPSAR 1.7.3, CPMAC 1.7.3 (external release)
++
++CC Labels: REL_20040505_HALdallas_cpsar_01.07.03
++ REL_20040505_HALdallas_cpmac_01.07.03
++
++New features: NTR
++
++Bug fixes: 1) Firmware has been updated to fix a problem with Host OAM mode operation.
++ 2) Cache macros have been fixed.
++
++Notes: This release contains all performance enhancements currently available for CPHAL 1.x.
++
++19 April 2004 CPSAR 1.7.2, CPMAC 1.7.2 (external release)
++
++CC Labels: REL_20040419_HALdallas_cpsar_01.07.02
++ REL_20040419_HALdallas_cpmac_01.07.02
++
++New features: NTR
++
++Bug fixes: Fixes merge problem in 1.7.1.
++
++Notes: This is a branch release which contains only a subset of the performance improvements.
++ The remaining performance improvements are stiill being qualified at this time.
++
++1 April 2004 CPSAR 1.7.1, CPMAC 1.7.1 (external release)
++
++NOTICE: DO NOT USE 1.7.1. It has a known problem (see 1.7.2 notes)
++
++CC Labels: REL_20040401_HALdallas_cpsar_01.07.01
++ REL_20040401_HALdallas_cpmac_01.07.01
++
++New features: Performance improvement in CPPI layer, affecting both CPSAR and CPMAC.
++
++Bug fixes: NTR
++
++17 Februrary 2004 CPSAR 1.7.0 (external release)
++
++CC Labels: REL_20040217_HALdallas_cpsar_01.07.00
++
++New features: Added support for "TxFlush" feature. This allows the upper
++ layer to flush all or part of a given Tx queue for a given
++ channel. This is to be used during call setup for a voice
++ connection.
++
++30 January 2004 CPMAC 1.7.0 (external release)
++
++CC Labels: REL_20040130_HALdallas_cpmac_01.07.00
++
++Bug fixes: CPMDIO - When in manual negotiate mode and linked, dropping link would move into NWAY state rather than manual state.
++ CPMDIO - Extraneous debug message corrected
++New features: CPMDIO - Support for AutoMdix usage added.
++
++25 September 2003 CPSAR 1.6.6 (external release)
++
++CC Labels: REL_20030925_HALdallas_cpsar_01.06.06
++
++Bug fixes: PDSP firmware has been updated to fix the OAM padding problem. It previously
++ wrote pad bytes into a reserved field of the OAM cell. There is a small
++ change to the CPSAR configuration code which corresponds to the PDSP spec
++ change.
++
++New features: NTR
++
++09 September 2003 CPMAC 1.6.6 (external release)
++
++CC Labels: REL_20030909_HALdallas_cpmac_01.06.06
++
++Bug fixes: CPMAC : When _CPMDIO_NOPHY is set, Cpmac COntrol is set to Full Duplex
++ Bridge loopback test does not show a problem using 1.6.5 if packet rate is
++ below 50,000 pbs. Now testing with a 100% send from Ixia.
++
++New features: NTR
++
++05 August 2003 CPHAL 1.6.5 (external release)
++
++CC Labels: REL_20030805_HALdallas_cpmac_01.06.05
++
++Bug fixes: NTR
++
++New features: CPMAC : Added support for CPMAC modules that do not have a Phy connected.
++ The CPMAC is informed of this by the MdioConnect option
++ _CPMDIO_NOPHY. This is the only driver change needed to
++ receive and transmit packets through the Marvel switch.
++ Note In this mode Link status will reported linked at 100/FD to
++ PhyNum 0xFFFFFFFF.
++
++ ALL: Cleaned up some Vlynq support logic.
++
++16 July 2003 CPSAR 1.6.3 (external release), no CPMAC release
++
++CC Labels: REL_20030716_HALdallas_cpsar_01.06.03
++
++Bug fixes: 1) Changed default value of CPCS_UU from 0x5aa5 to 0. The old default value caused
++ problems with Cisco routers.
++
++New features: NTR
++
++Known issues not addressed in this release: NTR.
++
++01 July 2003 CPHAL 1.6.2 (external release)
++
++CC Labels: REL_20030701_HALdallas_cpmac_01.06.02
++ REL_20030701_HALdallas_cpsar_01.06.02
++
++Bug fixes: 1) A previous firmware upgrade caused firmware OAM loopback cells to only work on every other
++ command. This has been fixed in the new firmware version (0.47).
++ 2) Problem with PTI values changing on transparent mode packets has been resolved.
++ 3) Previously, successful firmware OAM loopback cells waited 5 seconds before notifying the
++ OS of success, rather that notifying immediately. This has been resolved in firmware.
++ 4) PITS #148 (MAC and SAR), #149 (MAC) have been fixed.
++
++New features: 1) AAL5 HAL now capable of receiving unknown VCI/VPI cells on a single transparent channel.
++ See updated HAL document (AAL5 appendix) for implementation details.
++ 2) AAL5 HAL now allows OS to modify the OAM loopback timeout window. Previously, failed
++ OAM loopback attempts timed out after a nominal 5 seconds (based on the SAR frequency
++ provided by the OS). Now, the default is 5 seconds, but the OS may change the
++ value via halControl() to any integer number of milliseconds. See updated HAL document
++ (AAL5 appendix) for implementation details.
++ 3) MAC (cpmdio): added loopback to Istate. Used for debug.
++
++Known issues not addressed in this release: NTR.
++
++09 June 2003 CPSAR 1.6.1 (external release), CPMAC 1.6.1 (internal release - no functional change)
++
++Note: This is the same set of fixes being applied to 1.6.0 that were applied to 1.5.3. The only difference
++ between 1.6.1 and 1.5.4 is that 1.6.1 has the TurboDSL fix.
++
++CC Labels: REL_20030609_HALdallas_cpmac_01.06.01
++ REL_20030609_HALdallas_cpsar_01.06.01
++
++Bug fixes: 1) Bug in OamLoopbackConfig fixed.
++ 2) New firmware version (.43) to fix Westell issue of dropped downstream packets in
++ presence of OAM traffic when operating at or near line rate.
++
++New features: NTR.
++
++09 June 2003 CPSAR 1.5.4 (external release), CPMAC 1.5.4 (internal release - no functional change)
++
++Note: This is a branch release from 1.5.3. This does not contain anything from 1.6.0. The CPMAC is
++only being labeled to keep the release flow consistent.
++
++CC Labels: REL_20030609_HALdallas_cpmac_01.05.04
++ REL_20030609_HALdallas_cpsar_01.05.04
++
++Bug fixes: 1) Bug in OamLoopbackConfig fixed.
++ 2) New firmware version (.43) to fix Westell issue of dropped downstream packets in
++ presence of OAM traffic when operating at or near line rate.
++
++New features: NTR.
++
++30 May 2003 CPSAR 1.6.0 (external release), CPMAC 1.6.0 (internal release - no functional change)
++
++CC Labels: REL_20030530_HALdallas_cpmac_01.06.00
++ REL_20030530_HALdallas_cpsar_01.06.00
++
++Bug fixes: 1) TurboDSL issue has been fixed with a software workaround in TxInt. This workaround
++ has been verified under Adam2 ONLY at this point. Testing remains to be done on
++ Linux and VxWorks.
++
++New features: NTR.
++
++Known issues not addressed in this release: NTR.
++
++30 May 2003 CPSAR 1.5.3 (external release), CPMAC 1.5.3 (internal release - no functional change)
++
++CC Labels: REL_20030530_HALdallas_cpmac_01.05.03
++ REL_20030530_HALdallas_cpsar_01.05.03
++
++Bug fixes: NTR.
++
++New features: 1) AAL5 Send() has been modified to accept an ATM Header either in the first
++ fragment by itself, or in the first fragment directly in front of payload data.
++ The API() does not change.
++ 2) Documentation updates throughout, reflected in latest version of CPHAL user's
++ guide.
++ 3) AAL5 MaxFrags default value is now 46. This is based upon the default AAL5
++ RxBufSize of 1518 (MaxFrags = (65568/1518) + 2). IF THE OS CHOOSES A SMALLER
++ RxBufSize, IT MUST INCREASE THE VALUE OF MaxFrags ACCORDINGLY. This is done
++ via halControl(), prior to Open().
++
++Known issues not addressed in this release:
++ 1) The Linux SAR driver is seeing an issue in which it cannot
++ reliably send traffic simultaneously on both the high and
++ low priority queues of a single AAL5 channel. (TurboDSL)
++
++23 May 2003 CPHAL 1.5.2 (external release)
++
++CC Labels: REL_20030523_HALdallas_cpmac_01.05.02
++ REL_20030523_HALdallas_cpsar_01.05.02
++
++Bug fixes: 1) PITS #138: CPMAC flooding issue resolved.
++ 2) PITS #142: OS may now set "MaxFrags" via Control(). This controls the
++ maximum number of fragments expected by the CPHAL. The default value is 2 for
++ CPMAC and 1028 for AAL5. If the OS chooses a RxBufSize that will cause more
++ fragments than the defaults, the OS must set "MaxFrags" to a correct value
++ ((maximum packet length / RxBufSize) + 2).
++ 3) PITS #143: Fixed.
++ 4) Firmware OAM bug fixed. (new firmware release in this version)
++
++New features: NTR.
++
++Known issues not addressed in this release:
++ 1) The Linux SAR driver is seeing an issue in which it cannot
++ reliably send traffic simultaneously on both the high and
++ low priority queues of a single AAL5 channel. (TurboDSL)
++
++14 May 2003 CPHAL 1.5.1 (external release)
++
++CC Labels: REL_20030514_HALdallas_cpmac_01.05.01
++ REL_20030514_HALdallas_cpsar_01.05.01
++
++Bug fixes: 1) PITS 132 - (CPMAC) Frames < 60 bytes and split into
++ multi-fragments.
++ 2) BCIL MR PSP00000353 - (CPMAC) PhyDev not free'd on halClose()
++ 3) PITS 113 - OsSetup bug in ChannelSetup fixed.
++ 4) Fixed AAL5 to check return values of InitTcb/InitRcb.
++ 5) Fixed Shutdown to properly free resources in the case of a Close
++ mode 1 followed by Shutdown. Previously, buffer and descriptor
++ resources were left unfreed in this case.
++
++New features: 1) AAL5 Send() modified to be capable of accepting ATM header as first four
++ bytes of first fragment. This allows the OS to "override" the
++ default ATM header which is constructed from preconfigured channel
++ parameters.
++ 2) AAL5 Receive() modified to be capable of passing the received ATM header (4 bytes, no HEC)
++ in the first fragment (by itself). It also passes up the OS an indication
++ of what the received packet type was. For Host OAM and transparent mode
++ packets, the ATM header is passed in this manner, and for other types of packets
++ (AAL5, NULL AAL) no ATM header is passed currently.
++
++Known issues not addressed in this release:
++ 1) The Linux SAR driver is seeing an issue in which it cannot
++ reliably send traffic simultaneously on both the high and
++ low priority queues of a single AAL5 channel.
++
++30 April 2003 CPHAL 1.5.0 (external release)
++
++CC Labels: REL_20030430_HALdallas_cpmac_01.05.00
++ REL_20030430_HALdallas_cpsar_01.05.00
++
++Bug fixes: 1) Fixed AAL5 bug that rendered the low priority queue
++ unusable.
++ 2) Fixed a bug in AAL5's Oam Rate calculations.
++ 3) Fixed use of "DeviceCPID" key in AAL5's halControl().
++ 4) Fixed RxReturn logic in HAL. The HAL now can handle
++ failing MallocRxBuffer calls when multiple fragments
++ are being used.
++
++New features: 1) AAL5 Stats now available on a per queue basis.
++ 2) AAL5 adds two new keys to halControl() for "Set" actions:
++ RxVc_OamCh and RxVp_OamCh.
++ 3) Shutdown() has been modified for both AAL5 and CPMAC to
++ call Close() if the module is still in the Open state.
++ 4) CPMAC adds the following access keys to halControl():
++ hcPhyAccess,hcPhyNum,hcCpmacBase,hcSize,and hcCpmacSize.
++ 5) CPHAL no longer requests an extra 15 bytes on data buffer
++ mallocs.
++
++Known issues not addressed in this release:
++ 1) The Linux SAR driver is seeing an issue in which it cannot
++ reliably send traffic simultaneously on both the high and
++ low priority queues of a single AAL5 channel.
++
++21 April 2003 CPHAL 1.4.1 (external release)
++
++CC Labels: REL_20030421_HALdallas_cpmac_01.04.01
++ REL_20030421_HALdallas_cpsar_01.04.01
++
++Bug fixes: 1) Fixed OAM logic in SAR portion of CPHAL.
++
++New features: 1) OAM loopback counters exposed through halControl.
++ 2) Host OAM Send() can now use a single channel to send
++ OAM cells on unlimited number of VP's/VC's.
++ 3) CPHAL now requests "SarFreq" through osControl.
++ 4) CPHAL now calculates all OAM function rates based on
++ "SarFreq"; function OamRateConfig removed for API.
++ 5) New OAM function OamLoopbackConfig, used for configuring
++ loopback functions in firmware OAM mode.
++
++Known issues not addressed in this release: Bug fix 1) in release 1.4
++ (see below) does not work properly for multiple fragments.
++
++10 April 2003 CPHAL 1.4 (external release)
++
++CC Labels: REL_20030410_HALdallas_cpmac_01.04.00
++ REL_20030410_HALdallas_cpsar_01.04.00
++
++This release is for SAR and MAC.
++
++ Bug fixes: 1) Implemented logic in HAL to re-request buffer mallocs
++ in the case of MallocRxBuffer failing. The HAL now maintains
++ a NeedsBuffer queue of all RCB's that are without buffers.
++ On interrupts, or on Send(), the HAL checks to see if any
++ RCB's are on the queue, and if so, calls MallocRxBuffer
++ to attempt to get a new buffer and return the RCB to
++ circulation.
++ 2) SAR now properly returns all error codes from halOpen and
++ halChannelSetup.
++
++ New features: NTR
++
++ Known issues not addressed in this release: NTR
++
++08 April 2003 CPHAL 1.3.1 (internal release - SAR only)
++
++ CC Labels: REL_20030408_HALdallas_cpsar_01.03.01
++
++ This is a SAR only release. The current CPMAC release is still 1.3.
++
++ Bug fixes: 1) PDSP State RAM / Scratchpad RAM is now completely cleared after reset.
++ This resolves a stability issue.
++
++ New features: 1) OamMode is now a parameter in halControl(). Both "Set" and "Get"
++ actions are available. The value may be "0" (Host OAM), or "1"
++ (Firmware OAM).
++
++ Known issues not addressed in this release:
++ 1) Appropriate action for HAL in the case of MallocRxBuffer failing. We
++ are investigating whether the HAL should implement a needs buffer
++ queue.
++
++04 April 2003 CPHAL 1.3 (external release)
++
++ CC Labels: REL_20030404_HALdallas_cpmac_01.03.00
++ REL_20030404_HALdallas_cpsar_01.03.00
++ REL_20030404_HALdallas_cpaal5_01.03.00
++ REL_20030404_HALdallas_cpaal2_01.03.00
++
++ This release requires no changes for the ethernet end driver. The changes necessary
++ for the sar driver (firmware file name changes) have already been implemented.
++
++ Bug fixes: 1) RxReturn now returns an error if MallocRxBuffer fails. On RxReturn error, the driver should
++ call RxReturn again at a later time (when the malloc may succeed) in order for the CPHAL
++ to maintain a full complement of Rx buffers. We recommend holding off making this driver
++ change until we verify that this condition occurs.
++
++ New features: 1) Removed benign compiler warnings.
++ 2) PITS 122: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=122
++ 3) Cpsar label (above) now is applied to everything
++ beneath /cpsar.
++ 4) PITS 14: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=14
++ Transferred to MR PSP 00000089.
++ 5) PITS 120: http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=120
++
++ Known issues not addressed in this release:
++ 1) PITS 102 (as relating to OamMode configuration):
++ http://www.nbu.sc.ti.com/cgi-bin/pits/redisplay_archive?product=cphal_dev&report=102
++ Future release will make OamMode configurable
++ through halControl(), not on per channel basis.
++
++20 March 2003 CPHAL 1.2.1 (internal release)
++
++ CC Labels: REL_20030320_HALdallas_cpmac_01.02.01
++ REL_20030320_HALdallas_cpsar_01.02.01
++ REL_20030320_HALdallas_cpaal5_01.02.01
++ REL_20030320_HALdallas_cpaal2_01.02.01
++
++ Bug fixes: 1. Fixed modification of buffer pointer following
++ MallocRxBuffer in cppi.c.
++ 2. Removed extra firmware files from /cpsar.
++
++ New features: NTR.
++
++ Known issues not addressed in this release: NTR.
++
++07 March 2003 CPHAL 1.2 (external release)
++
++ CPMAC/CPSAR feature complete release. SAR added
++ several features including full OAM support and various
++ other features and bug fixes to address PITS 99-106, and
++ 114. CPMAC cleaned up details raised by India PSP
++ team.
++
++29 January 2003 CPHAL RC 3.01a (external release)
++
++ Corrects non-static functions to be static in cppi.c.
++
++09 Janurary 2003 CPHAL RC 3.01 (external release)
++
++ PITS 88: Fixed MDIO re-connection problem (hcpmac.c)
++ PITS 90: Corrected Rx Buffer Pointer modification (cppi.c)
++
++ Corrected error in cpremap.c
++
++20 December 2002 CPHAL RC 3 (external release)
++
++ Statistics support via halControl(). See Appendix A of guide.
++ Fixed errors in ChannelTeardown/ChannelSetup CPHAL logic.
++ Added multicast support as requested.
++ Several new OS string functions added to OS_FUNCTIONS.
++ "DebugLevel" configuration parameter changed to "Debug".
++ "Stats0" changed to "StatsDump" for CPMAC.
++
++13 December 2002 CPHAL RC 2.03 (internal release)
++
++ Performance improvements.
++ More debug statements implemented (esp AAL5).
++ Updated makefile with "make debug" option.
++ Hbridge performance: [debug library] 15774 tps (53% line rate)
++ [non-debug library] 13700 tps (46%)
++
++10 December 2002 CPHAL Release Candidate 2.02 (internal release)
++
++ Much of the configuration code internal to CPMAC and AAL5 has been made common.
++ [os]Receive API had been modified to remove OsReceiveInfo. This information is now
++ available as third member of the FRAGLIST structure, on a per buffer basis.
++ Successfully tested multi-fragment support on CPMAC, using 32 byte buffers.
++ Code is now Emerald compliant - all buffer descriptors now aligned to cache-line
++ boundaries.
++
++2 December 2002 CPHAL Release Candidate 2.01
++
++ Updates to comments in hcpmac.c, cpmdio.c, hcpmac.h
++ Nested comment in hcpmac.c in RC2 can cause compile errors.
++
++25 November 2002 CPHAL Release Candidate 2
++
++Project Items not completed for RC2
++#6 Ship as Library - Once under CC. Moved to RC3
++#8 Under Clearcase - Moved to RC3
++#25 Emerald compliant - Moved to RC3
++#26 Statistics support - Moved to RC3 (some support in RC2)
++#36 Debug scheme implemented - Moved to RC3 (some support in RC2)
++
++8 November 2002 CPHAL Release Candidate 1
++
++Notes:
++
++Project Items not completed for RC1
++
++#8 Under Clearcase - Clearcase server failure this week. Moved to RC2
++#6 Ship as Library - Once under CC. Moved to RC2
++#13 Verify Datatypes. Moved to RC2
++#14 Review APIs. Moved to RC2
++
++APIs under review for RC2
++
++halIsr()
++hslRxReturn()
++halSend()
++osSendComplete()
++osReceive()
++
++
++CPMAC Build Instructions
++
++Compile the file 'hcpmac.c'.
++
++
++AAL5 Build Instructions
++
++The AAL5 build is composed of the source files aal5sar.c and cpsar.c.
++Refer to the provided makefile for an example of compiling these files
++into a library.
++
++Example CPHAL Code
++
++CPMAC:
++
++Example CPMAC code is provided in the file hbridge.c.
++This program is provided simply as an example of using the CPHAL API.
++It is not intended to be compiled and executed in your environment.
++
++AAL5:
++
++Example AAL5 code is provided in the file loopback.c. This program
++is provided simply as an example of using the CPHAL API. It is not
++intended to be compiled and executed in your environment.
++
++
++Performance Baseline
++
++
++Cpmac
++
++RC1: hbridge.bin, running with IXIA cpahl_1.cfg.
++ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
++ MIPS core 4Kc.
++
++RC2: hbridge.bin, running with IXIA cpahl_1.cfg.
++ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
++ MIPS core 4Ke.
++ CPHAL now includes Emerald support, but this has been disabled by using 'cache -wt' to emulate 4Kc.
++
++RC3: hbridge.bin, running with IXIA cpahl_1.cfg.
++ This sends 64-byte packets from each Ixia port, with mac destination the other Ixia port.
++ MIPS core 4Ke.
++ Running as Emerald processor.
++
++Release Total Receive Rate Throughput Setting
++
++RC1 11300 38%
++RC2 9524 32%
++RC3 15190 51%
+diff -urN linux.old/drivers/net/Config.in linux.dev/drivers/net/Config.in
+--- linux.old/drivers/net/Config.in 2005-07-10 03:24:49.242590320 +0200
++++ linux.dev/drivers/net/Config.in 2005-07-10 03:22:40.527158000 +0200
+@@ -25,6 +25,24 @@
+ comment 'Ethernet (10 or 100Mbit)'
+ bool 'Ethernet (10 or 100Mbit)' CONFIG_NET_ETHERNET
+ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
++ if [ "$CONFIG_MIPS_TITAN" = "y" -o "$CONFIG_AR7" = "y" ]; then
++ tristate ' Texas Instruments Avalanche CPMAC support' CONFIG_MIPS_AVALANCHE_CPMAC
++ fi
++ if [ "$CONFIG_MIPS_AVALANCHE_CPMAC" != "n" ]; then
++ if [ "$CONFIG_AR7WRD" = "y" -o "$CONFIG_AR7VWI" = "y" -o "$CONFIG_AR7VW" = "y" ]; then
++ define_bool CONFIG_MIPS_CPMAC_INIT_BUF_MALLOC y
++ define_int CONFIG_MIPS_CPMAC_PORTS 1
++ if [ "$CONFIG_MIPS_AVALANCHE_MARVELL" = "y" ]; then
++ define_bool CONFIG_AVALANCHE_LOW_CPMAC n
++ define_bool CONFIG_AVALANCHE_HIGH_CPMAC y
++ else
++ define_bool CONFIG_AVALANCHE_CPMAC_AUTO y
++ define_bool CONFIG_AVALANCHE_LOW_CPMAC n
++ define_bool CONFIG_AVALANCHE_HIGH_CPMAC n
++ fi
++ fi
++ fi
++
+ if [ "$CONFIG_ARM" = "y" ]; then
+ dep_bool ' ARM EBSA110 AM79C961A support' CONFIG_ARM_AM79C961A $CONFIG_ARCH_EBSA110
+ tristate ' Cirrus Logic CS8900A support' CONFIG_ARM_CIRRUS
+diff -urN linux.old/drivers/net/Makefile linux.dev/drivers/net/Makefile
+--- linux.old/drivers/net/Makefile 2005-07-10 03:24:49.243590168 +0200
++++ linux.dev/drivers/net/Makefile 2005-07-10 03:22:40.528157000 +0200
+@@ -56,6 +56,16 @@
+ subdir-$(CONFIG_BONDING) += bonding
+
+ #
++# Texas Instruments AVALANCHE CPMAC driver
++#
++
++subdir-$(CONFIG_MIPS_AVALANCHE_CPMAC) += avalanche_cpmac
++#obj-$(CONFIG_MIPS_AVALANCHE_CPMAC) += avalanche_cpmac/avalanche_cpmac.o
++ifeq ($(CONFIG_MIPS_AVALANCHE_CPMAC),y)
++ obj-y += avalanche_cpmac/avalanche_cpmac.o
++endif
++
++#
+ # link order important here
+ #
+ obj-$(CONFIG_PLIP) += plip.o
--- /dev/null
+diff -urN linux.old/drivers/atm/Config.in linux.dev/drivers/atm/Config.in
+--- linux.old/drivers/atm/Config.in 2004-08-08 01:26:04.000000000 +0200
++++ linux.dev/drivers/atm/Config.in 2005-07-10 08:02:01.417115464 +0200
+@@ -99,4 +99,10 @@
+ bool 'Use S/UNI PHY driver' CONFIG_ATM_HE_USE_SUNI
+ fi
+ fi
++#
++# Texas Instruments SANGAM ADSL/ATM support
++#
++if [ "$CONFIG_AR7" = "y" ]; then
++ tristate 'Texas Instruments SANGAM ATM/ADSL support' CONFIG_MIPS_SANGAM_ATM
++fi
+ endmenu
+diff -urN linux.old/drivers/atm/Makefile linux.dev/drivers/atm/Makefile
+--- linux.old/drivers/atm/Makefile 2005-01-19 15:09:40.000000000 +0100
++++ linux.dev/drivers/atm/Makefile 2005-07-10 08:02:01.417115464 +0200
+@@ -14,6 +14,32 @@
+ obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
+ obj-$(CONFIG_ATM_IDT77252) += idt77252.o
+
++ifeq ($(CONFIG_AR7),y)
++
++subdir-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm
++
++EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
++#EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP
++
++ifeq ($(ANNEX),B)
++EXTRA_CFLAGS += -DANNEX_B -DB
++else
++ifeq ($(ANNEX),C)
++EXTRA_CFLAGS += -DANNEX_C -DC
++else
++EXTRA_CFLAGS += -DANNEX_A -DP
++endif
++endif
++
++list-multi := tiatm.o
++tiatm-objs := sangam_atm/tn7atm.o sangam_atm/tn7dsl.o sangam_atm/tn7sar.o \
++ sangam_atm/dsl_hal_api.o sangam_atm/dsl_hal_support.o sangam_atm/cpsar.o \
++ sangam_atm/aal5sar.o
++
++obj-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm/tiatm.o
++
++endif
++
+ ifeq ($(CONFIG_ATM_NICSTAR_USE_SUNI),y)
+ obj-$(CONFIG_ATM_NICSTAR) += suni.o
+ endif
+diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.c linux.dev/drivers/atm/sangam_atm/aal5sar.c
+--- linux.old/drivers/atm/sangam_atm/aal5sar.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/aal5sar.c 2005-07-10 08:02:01.420115008 +0200
+@@ -0,0 +1,2962 @@
++
++/**
++ *
++ * aal5sar.c
++ *
++ * TNETDxxxx Software Support\n
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * version
++ * 28Feb02 Greg 1.00 Original Version created.\n
++ * 06Mar02 Greg 1.01 Documentation (Doxygen-style) enhanced
++ * 06May02 Greg 1.02 AAL2 added
++ * 06Jun02 Greg 1.03 Multiple API and bug fixes from emulation
++ * 12Jul02 Greg 1.04 API Update
++ */
++
++/**
++@defgroup CPHAL_Functions CPHAL Functions
++
++These are the CPHAL Functions.
++*/
++
++/**
++@page CPHAL_Implementation_Details
++
++@section cphal_intro Introduction
++
++The CPHAL API described above is generally applicable to all modules. Any
++implementation differences will be described in the following module-specific
++appendix sections.
++
++Included for your reference is a diagram showing the internal architecture
++of the CPHAL:
++
++@image html SangamSoftware.jpg "HAL Architecture"
++@image latex SangamSoftware.jpg "HAL Architecture" height=2.8in
++
++*/
++
++/**
++@defgroup AAL5_Functions Additional Functions for AAL5 Implementation
++
++These functions are used only by the AAL5 module.
++*/
++
++/*
++@defgroup CPMAC_Functions Additional Functions for CPMAC Implementation
++
++No additional functions currently defined.
++*/
++
++/**
++@page VDMA_Implementation_Details
++
++@section vdma_intro Introduction
++
++The VDMA-VT module facilitates efficient transfer of data (especially voice)
++between two devices, as shown in the figure below.
++
++@image html vdma.jpg "VDMA System Block Diagram"
++@image latex vdma.jpg "VDMA System Block Diagram" height=1in
++
++The VDMA-VT module supports two modes of operation: mirror mode and credit mode.
++Mirror mode is intended for systems in which the remote device does not have a
++VDMA-based module. Credit mode is intended for highest performance when VDMA-based
++modules exist on both ends of an interface.
++
++For more detailed information on the operation of the VDMA module, please
++reference the VDMA Module Guide.
++
++@section vdma_channels VDMA Channels
++
++The VDMA-VT module is a single channel, single transmit queue device. Therefore,
++when using the CHANNEL_INFO structure, the correct value for @c Ch is always 0.
++Correspondingly, the correct value for the @c Ch parameter in @c ChannelTeardown() is
++always 0. Further, when calling @c Send(), the driver should always supply the value
++of 0 for both the @c Ch and @c Queue parameters.
++
++For the VDMA-VT, configuring the channel requires the configuration of either 2 FIFO
++elements (in credit mode) or 4 FIFO elements (in mirror mode). For credit mode, the
++driver must configure just the local Tx and Rx FIFOs. For mirror mode, the driver must
++configure the Tx and Rx FIFOs for both the remote and local ends of the interface.
++
++This channel configuration is accomplished through multiple calls to @c ChannelSetup().
++Each call configures a single FIFO, according to the parameters in the CHANNEL_INFO
++structure. The members of VDMA-VT's CHANNEL_INFO structure are defined below.
++
++
++- int RemFifoAddr; Address of remote FIFO (mirror mode only). Set to 0 for credit mode.
++- int FifoAddr; Address of the local FIFO. If 0, the CPHAL will allocate the FIFO.
++- int FifoSize; Size of the FIFO.
++- int PollInt; Polling interval for the FIFO.
++- int Endianness; Endianness of the FIFO. If 1, big endian. If 0, little endian.
++- int RemAddr; Used only in credit mode. This is the base address of the remote
++ remote VDMA-based device (VDMA-VT or AAL2)
++- int RemDevID; Used only in credit mode. Identifies the type of remote VDMA-based device.
++ 0=VDMAVT, 1=AAL2 Ch0, 2=AAL2 Ch1, 3=AAL2 Ch2, 4= AAL2 Ch3.
++
++For the VDMA-VT module, the driver must make all calls to @c ChannelSetup() prior to calling
++@c Open(). This is because several of the channel specific parameters may not be changed
++while the VDMA-VT module is operational.
++
++@section vdma_params VDMA Parameters
++
++Defined here are the set of parameters for the VDMA-VT module. Default settings for
++each parameter should be represented in the device configuration file (options.conf).
++During @c Init(), the CPHAL will reference the device configuration file and load all
++default settings. The @c Control() interface gives the driver an opportunity to
++modify any default settings before the module becomes operational during the @c Open()
++call.
++
++@param NoTxIndication If 1, the CPHAL will not call @c SendComplete(). 0 is default.
++@param NoRxIndication If 1, the CPHAL will not call @c Receive(). 0 is default.
++@param RemoteCPU If 1, the CPHAL will not directly manipulate data in FIFO's, leaving
++ that task for a remote CPU. 0 is default.
++@param RxIntEn If 1, enables Rx interrupts. 0 is default.
++@param TxIntEn If 1, enables Tx interrupts. 0 is default.
++@param Mirror If 1, enables mirror mode. 0 selects credit mode (default).
++@param RxIntCtl Valid only in mirror mode. If 1, interrupts will occur when the Rx FIFO
++ RdIndex is updated. If 0, interrupts occur when the Rx FIFO WrIndex
++ is updated.
++@param TxIntCtl Valid only in mirror mode. If 1, interrupts will occur when the Rx FIFO
++ RdIndex is updated. If 0, interrupts occur when the Rx FIFO WrIndex
++ is updated.
++@param RBigEn Remote big endian mode. If 1, remote is big endian.
++@param LBigEn Local big endian mode. If 1, local is big endian.
++
++@section vdma_polling Using VDMA-VT without interrupts
++
++If your system configuration does not utilize VDMA interrupts, the ability to process the
++Tx and Rx FIFOs is supported. To process the Tx FIFO, call @c CheckTx(). If the CPHAL is
++able to process any complete data transmissions, it will call @c SendComplete() as usual.
++To process the Rx FIFO, call @c CheckRx(). If the CPHAL has received any data, it will
++call @c Receive() to pass the driver the data. Please reference @ref VDMA_Functions for more
++information on these interfaces.
++
++@section vdma_details VDMA Implementation Details
++
++The following functions are not defined for use with VDMA: @c Status(), @c Tick(), @c StatsGet(),
++and @c StatsClear().
++
++*/
++
++/**
++@page AAL5_Implementation_Details
++
++@section aal5_ver Version
++
++@copydoc AAL5_Version
++
++@section aal5_intro Introduction
++
++The AAL5 implementation will support 16 channels for transmit and 16 channels for
++receive. Each of the transmit channels may have up to two transmit queues
++associated with it. If two queues are used, Queue 0 is the high priority queue,
++and Queue 1 is the low priority queue.
++
++@section aal5_params AAL5 Configuration Parameters
++
++AAL5 requires two device entries to be available in the configuration repository, named
++@p "aal5" and @p "sar". The @p aal5 device entry must contain @p base (base address)
++and @p int_line (interrupt number). The @p sar device entry must have both @p base
++(base address) and @p reset_bit (reset bit).
++
++@par Device Level Configuration Parameters
++
++The following parameters are device-level parameters, which apply across all
++channels. The value for these parameters may be modified by changing the value in the
++configuration repository.
++
++- "UniNni":
++AAL5 network setting. 0 = UNI (default), 1 = NNI.
++
++@par Channel Configuration Parameters
++
++All AAL5 channel parameters may also be configured through the @c ChannelSetup() interface.
++Following is the list of @p CHANNEL_INFO members that may be modified by the driver when
++calling @c ChannelSetup(). The driver may provide a value of 0xFFFFFFFF for any channel
++parameter to select a default value for the parameter. The driver should at a minimum
++configure @p Vci and @p Vpi. The usage of all parameters beginning with TxVc_,
++TxVp_, RxVc_, RxVp_ is described in greater detail in the SAR Firmware Spec.
++These parameters are mainly associated with QoS and OAM functionality.
++
++- "RxNumBuffers":
++The number of Rx buffer descriptors to allocate for Ch.
++- "RxBufSize":
++Size (in bytes) for each Rx buffer.
++- "RxBufferOffset":
++Number of bytes to offset rx data from start of buffer (must be less than buffer size).
++- "RxServiceMax":
++Maximum number of packets to service at one time.
++- "TxNumBuffers":
++The number of Tx buffer descriptors to allocate for Ch.
++- "TxNumQueues":
++Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue.
++- "TxServiceMax":
++Maximum number of packets to service at one time.
++- "CpcsUU":
++The 2-byte CPCS UU and CPI information.
++- "Gfc":
++Generic Flow Control. Used in ATM header of Tx packets.
++- "Clp":
++Cell Loss Priority. Used in ATM header of Tx packets.
++- "Pti":
++Payload Type Indication. Used in ATM header of Tx packets.
++- "DaMask":
++Specifies whether credit issuance is paused when Tx data not available.
++- "Priority":
++Priority bin this channel will be scheduled within.
++- "PktType":
++0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2.
++- "Vci":
++Virtual Channel Identifier.
++- "Vpi":
++Virtual Path Identifier.
++- "TxVc_AtmHeader":
++In firmware OAM mode, this
++is the ATM header to be appended to front of firmware generated VC OAM cells for
++this channel. Note: To generate host OAM cells, call @c Send() with
++the appropriate mode.
++- "TxVc_CellRate":
++Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR).
++- "TxVc_QosType":
++0=CBR,1=VBR,2=UBR,3=UBRmcr.
++- "TxVc_Mbs":
++Min Burst Size in cells.
++- "TxVc_Pcr":
++Peak Cell Rate for VBR in clock ticks between transmissions.
++- "TxVc_OamTc":
++TC Path to transmit OAM cells for TX connections (0,1).
++- "TxVc_VpOffset":
++Offset to the OAM VP state table for TX connections. Channels with the same
++VPI must have the same VpOffset value. Channels with different VPIs
++must have unique VpOffset values.
++- "RxVc_OamCh":
++Channel to which to terminate received OAM cells to be forwarded to the Host
++for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
++OAM mode.
++- "RxVc_OamToHost":
++Indicates whether to pass received unmatched OAM loopback cells to the host;
++0=do not pass, 1=pass.
++- "RxVc_AtmHeader":
++ATM Header placed on firmware gen'd OAM cells for this channel on a Rx
++connection (must be big endian with 0 PTI).
++- "RxVc_OamTc":
++TC Path to transmit OAM cells for RX connections (0,1).
++- "RxVc_VpOffset":
++Offset to the OAM VP state table for RX connections. Channels with the same
++VPI must have the same VpOffset value. Channels with different VPIs
++must have unique VpOffset values.
++- "TxVp_OamTc":
++TC Path to transmit OAM cells for TX VP connections (0,1).
++- "TxVp_AtmHeader":
++ATM Header placed on firmware gen'd VP OAM cells for this channel on a Tx VP
++connection (must be big endian with 0 VCI).
++- "RxVp_OamCh":
++Channel to which to terminate received OAM cells to be forwarded to the Host
++for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
++OAM mode.
++- "RxVp_OamToHost":
++Indicates whether to pass received unmatched OAM loopback cells to the host;
++0=do not pass, 1=pass.
++- "RxVp_AtmHeader":
++In firmware OAM mode, this
++is the ATM header to be appended to front of firmware generated VP OAM cells for
++this channel. Note: To generate host OAM cells, call @c Send() with
++the appropriate mode.
++- "RxVp_OamTc":
++TC Path to transmit OAM cells for RX VP connections (0,1).
++- "RxVp_OamVcList":
++This 32-bit field is one-hot encoded to indicate all the VC channels that are
++associated with this VP channel. A value of 21 will indicate that VC
++channels 0, 2, and 4 are associated with this VP channel.
++- "FwdUnkVc":
++Indicates whether or not to forward unknown VCI/VPI cells to the host. This
++parameter only takes effect if the channel's PktType is Transparent(3).
++1=forwarding enabled, 0=forwarding disabled.
++
++@section aal5_details API Implementation Details
++
++ATTENTION: Documentation given here supplements the documentation given in the general
++CPHAL API section. The following details are crucial to correct usage of the
++AAL5 CPHAL.
++
++@par Receive()
++The least significant byte of @p Mode contains the channel number. Bit 31
++indicates whether or not the ATM header is present in the first fragment of
++the packet. If bit 31 is set, the 4 byte ATM header (minus HEC) will be provided
++in the first fragment, with the payload beginning in the second fragment. Currently,
++this is the default behavior for host OAM and transparent mode packets.
++Bits 17-16 indicate the packet type that is being received.
++Mode Parameter Breakdown: <BR>
++- 31 ATM Header In First Fragment (1=true, 0=false) <BR>
++- 30-18 Unused. <BR>
++- 17-16 Pkt Type. <BR>
++ - 0=AAL5 <BR>
++ - 1=PTI Based Null AAL <BR>
++ - 2=OAM <BR>
++ - 3=Transparent <BR>
++- 15-08 Unused. <BR>
++- 07-00 Channel Number.
++
++@par Send()
++The most significant 16 bits of the first fragment 'len' is used as the Offset
++to be added to the packet. @c Send() will reserve this many bytes at the
++beginning of the transmit buffer prior to the first byte of valid data.
++For the @p Mode parameter, Bit 31 must be set if the user has sent a packet with
++the ATM Header (minus HEC) embedded in the first 4 bytes of the first fragment data buffer.
++The OS has the option of using a 4 byte first fragment containing only ATM header,
++or concatenating the ATM Header in front of the data payload.
++If Bit 31 is set, the ATM Header in the buffer is preserved and sent with
++each cell of the packet. Otherwise, Send() will build the ATM header based on the
++values of the Pti, Gfc, Clp, Vpi, and Vci parameters for the given channel.
++Bits 17-16 are defined as the packet type. Bits 15-08 may be used to specify the
++transmit queue to send the packet on. Only values 0 (high priority) and 1 (low
++priority) are accepted. Bits 07-00 should be used to indicate the channel number
++for the @c Send() operation. Valid channel numbers are 0-15.
++Mode Parameter Breakdown: <BR>
++- 31 ATM Header In Packet (1=true, 0=false) <BR>
++- 30-18 Unused. <BR>
++- 17-16 Pkt Type. <BR>
++ - 0=AAL5 <BR>
++ - 1=PTI Based Null AAL <BR>
++ - 2=OAM <BR>
++ - 3=Transparent <BR>
++- 15-08 Transmit Queue. <BR>
++- 07-00 Channel Number.
++
++@par ChannelSetup()
++The AAL5 @c ChannelSetup() always configures both the Tx and Rx side of the channel
++connection in the same call.
++
++@par ChannelTeardown()
++Regardless of the channel teardown direction selected, the AAL5 CPHAL will always
++teardown both the Tx and Rx side of the channel connection.
++
++@par TeardownComplete()
++The value for the @p Direction parameter should be ignored for the AAL5 implementation,
++since both directions (Tx and Rx) are always torndown in response to a @c ChannelTeardown()
++command.
++
++@par Control() (HAL version)
++Defined keys and actions. Unless otherwise stated, the data type
++for Value is pointer to unsigned integer. The list is broken into
++three groups, one group which can be used anytime, one group that should
++be used before halOpen(), and one group which can only be used after
++halOpen() (but before halClose()). For channelized parameters, replace
++'Ch' with the integer number of a channel (ex. "Gfc.4" can be used to set
++Gfc for channel 4).
++
++MAY USE ANYTIME AFTER INIT (after halInit() is called):
++
++- "Gfc.Ch". The OS may "Set" this value. Changing this value causes
++the Gfc in each Tx ATM header for this channel to take on the new Gfc value.
++
++- "Clp.Ch". The OS may "Set" this value. Changing this value causes
++the Clp in each Tx ATM header for this channel to take on the new Clp value.
++
++- "Pti.Ch". The OS may "Set" this value. Changing this value causes
++the Pti in each Tx ATM header for this channel to take on the new Pti value.
++
++- "CpcsUU.Ch". The OS may "Set" this value. Changing this value causes
++the CpcsUU in each Tx ATM header for this channel to take on the new CpcsUU value.
++
++- "OamMode". Specifies if host or firmware is performing OAM functions; 0 = Host OAM,
++1 = Firmware OAM. When set, all SAR channels will be configured for
++the selection, including AAL2 channels.
++
++- "OamLbTimeout". Specifies the firmware OAM loopback timeout, in milliseconds.
++
++- "DeviceCPID". The OS may "Set" this value. This is the OAM connection
++point identifier. The OS should provide a pointer to an array of 4 32-bit
++integers. Each word must be configured in big endian format.
++
++- "FwdUnkVc.Ch". Indicates whether or not to forward unknown VCI/VPI cells to the host.
++This parameter only takes effect if the channel's PktType is Transparent(3).
++1=forwarding enabled, 0=forwarding disabled.
++
++MAY USE ONLY BEFORE HAL IS OPEN (before halOpen() call):
++- "StrictPriority". The OS may "Set" this value. Setting to 1 causes
++a different interrupt processing routine to be used, which gives strict
++priority to channels with lower numbers (channel 0 has highest priority).
++The default handler gives equal priority to all channels.
++
++- "MaxFrags". The OS may "Set" or "Get" this value. This defines the maximum
++number of fragments that can be received by the AAL5 Rx port. The default
++value for AAL5 is 46. This provides enough space to receive a maximum
++length AAL5 packet (65,568 bytes) with the default buffer size of 1518 bytes, and
++any amount of RxBufferOffset. If the buffer size is configured to be smaller,
++the OS *MUST* modify this parameter according to the following formula:
++((System Max AAL5 packet length)/(RxBufSize)) + 2. (The extra two fragments in
++the formula allow for RxBufferOffset and one fragment for the ATM Header, used
++when receiving host OAM or transparent mode packets)
++
++MAY USE ONLY AFTER HAL IS 'OPEN' (after halOpen() call):
++- "Stats;Level;Ch;Queue". The OS may "Get" Stats groups with this key, where
++'Level' is an integer from 0-4, Ch is an integer from 0-15, and Queue is
++an integer from 0-1. Note that Ch is not required for Level 4 stats, and Queue
++is not required for Level 0, 3, and 4. The statistics functionality and return
++value is described in the appendix entitled "Configuration and Control".
++
++- "TxVc_CellRate.Ch". The OS may "Set" this value. Can be used to modify
++CellRate for a channel on the fly.
++
++- "TxVc_Mbs.Ch". The OS may "Set" this value. Can be used to modify
++Mbs for a channel on the fly.
++
++- "TxVc_Pcr.Ch". The OS may "Set" this value. Can be used to modify
++Pcr for a channel on the fly.
++
++- "PdspEnable". The OS may "Set" this value. Value 0 disables the PDSP.
++Value 1 enables to PDSP.
++
++- "DeviceCPID". The OS may "Set" this value. The Value should be an array
++of 4 32-bit integers that comprise the CPID.
++
++- "RxVc_RDICount.Ch". The OS may "Get" or "Set" this value. Get returns
++the current RDI count for the VC channel. Set clears the counter, and the Value
++is ignored.
++
++- "RxVp_RDICount.Ch". The OS may "Get" or "Set" this value. Get returns
++the current RDI count for the VP channel. Set clears the counter, and the Value
++is ignored.
++
++- "RxVc_AISseg.Ch". The OS may "Get" this value. This is an indication of
++AIS segment error for the VC channel.
++
++- "RxVp_AISseg.Ch". The OS may "Get" this value. This is an indication of
++AIS segment error for the VP channel.
++
++- "RxVc_AISetoe.Ch". The OS may "Get" this value. This is an indication of
++AIS end-to-end error for the VC channel.
++
++- "RxVp_AISetoe.Ch". The OS may "Get" this value. This is an indication of
++AIS end-to-end error for the VP channel.
++
++- "RxVc_OamCh.Ch". The OS may "Set" this value. Channel to which to terminate
++received OAM cells to be forwarded to the Host for either Host OAM mode, or when
++RxVc_OamToHost is enabled during Firmware OAM mode.
++
++- "RxVp_OamCh.Ch". The OS may "Set" this value. Channel to which to terminate
++received OAM cells to be forwarded to the Host for either Host OAM mode, or when
++RxVp_OamToHost is enabled during Firmware OAM mode.
++
++- "F4_LB_Counter". The OS may "Get" this value. This is a count of the number
++ of near-end F4 loopbacks performed by the PDSP in firmware OAM mode.
++
++- "F5_LB_Counter". The OS may "Get" this value. This is a count of the number
++ of near-end F5 loopbacks performed by the PDSP in firmware OAM mode.
++
++- "TxVc_AtmHeader.Ch". The OS may "Set" this value. In firmware OAM mode, this
++is the ATM header to be appended to front of firmware generated VC OAM cells for
++this channel. In host OAM mode, this is used as the ATM header to be appended
++to front of host generated VC OAM cells for this channel. It must be configured
++as big endian with PTI=0. Note: To generate host OAM cells, call @c Send() with
++the appropriate mode.
++
++- "TxVp_AtmHeader.Ch". The OS may "Set" this value. In firmware OAM mode, this
++is the ATM header to be appended to front of firmware generated VP OAM cells for
++this channel. In host OAM mode, this is used as the ATM header to be appended
++to front of host generated VP OAM cells for this channel. It must be configured
++as big endian with VCI=0. Note: To generate host OAM cells, call @c Send() with
++the appropriate mode.
++
++- "PdspEnable". The OS may "Set" this value. Controls whether or not the PDSP is
++allowed to fetch new instructions. The PDSP is enabled by the CPHAL during Open(),
++and disabled during Close(). 0 = disabled, 1 = enabled.
++
++@par Control() (OS version)
++Defined keys and actions:
++
++- "Firmware". The CPHAL will perform a "Get" action for the key "Firmware". A pointer
++to a pointer is passed in @p Value. The OS must modify the referenced pointer to point
++to the firmware.
++
++- "FirmwareSize". The CPHAL will perform a "Get" action for the key "FirmwareSize".
++The OS must place the firmware size in the memory pointed at by @p Value.
++
++- "OamLbResult". When a channel that is in firmware OAM mode is commanded to perform
++a loopback function, the result of the loopback generates an interrupt that is handled
++by the OS like any other interrupt. The CPHAL, upon servicing the interrupt, will call
++osControl with this key, and an action of "Set". The @p Value parameter will be a
++pointer to the integer result. 1 = pass, 0 = fail.
++
++- "SarFreq". The CPHAL will perform a "Get" action for this key. The OS should place
++the SAR frequency (in Hz) in the memory pointed at by @p Value.
++
++@section aal5_stats AAL5 Specific Statistics
++
++Statistics level '0' contains all AAL5 specific statistics. The following values will
++be obtained when requesting stats level 0:
++
++- "Crc Errors". Number of CRC errors reported by SAR hardware. Incremented for received
++packets that contain CRC errors.
++
++- "Len Errors". Number of length errors reported by SAR hardware. Incremented for received
++packets that are in excess of 1366 cells.
++
++- "Abort Errors". Number of abort errors reported by SAR hardware.
++
++- "Starv Errors". Number of buffer starvation errors reported by SAR hardware. Incremented
++when a part or all of a buffer cannot be received due to lack of RX buffer resources. The SAR
++drops all cells associated with the packet for each buffer starvation error that occurs.
++
++*/
++
++/* register files */
++#include "cp_sar_reg.h"
++
++#define _CPHAL_AAL5
++#define _CPHAL
++#define _CPPI_TEST /** @todo remove for release */
++#define __CPHAL_CPPI_OFFSET /* support use of offset */
++
++/* OS Data Structure definitions */
++
++typedef void OS_PRIVATE;
++typedef void OS_DEVICE;
++typedef void OS_SENDINFO;
++typedef void OS_RECEIVEINFO;
++typedef void OS_SETUP;
++
++/* CPHAL Data Structure definitions */
++
++typedef struct hal_device HAL_DEVICE;
++typedef struct hal_private HAL_PRIVATE;
++typedef struct hal_private HAL_RECEIVEINFO;
++
++/* include CPHAL header files here */
++#include "cpcommon_cpaal5.h"
++#include "cpswhal_cpaal5.h"
++#include "aal5sar.h"
++#include "cpcommon_cpaal5.c"
++
++#define CR_SERVICE (170-1)
++#define UTOPIA_PAUSE_REG (*(volatile bit32u *)0xa4000000)
++
++/*
++these masks are for the mode parameter used in halSend/OsReceive
++(may move these elsewhere)
++*/
++#define CH_MASK 0xff
++#define PRI_MASK 0x10000
++
++/* Rcb/Tcb Constants */
++#define CB_SOF_BIT (1<<31)
++#define CB_EOF_BIT (1<<30)
++#define CB_SOF_AND_EOF_BIT (CB_SOF_BIT|CB_EOF_BIT)
++#define CB_OWNERSHIP_BIT (1<<29)
++#define CB_EOQ_BIT (1<<28)
++#define CB_SIZE_MASK 0x0000ffff
++#define CB_OFFSET_MASK 0xffff0000
++#define RCB_ERRORS_MASK 0x03fe0000
++#define RX_ERROR_MASK 0x000f0000
++#define CRC_ERROR_MASK 0x00010000
++#define LENGTH_ERROR_MASK 0x00020000
++#define ABORT_ERROR_MASK 0x00040000
++#define STARV_ERROR_MASK 0x00080000
++#define TEARDOWN_VAL 0xfffffffc
++
++/* interrupt vector masks */
++#define TXH_PEND 0x01000000
++#define TXL_PEND 0x02000000
++#define RX_PEND 0x04000000
++#define STS_PEND 0x08000000
++#define AAL2_PEND 0x10000000
++#define INT_PENDING (TXH_PEND | TXL_PEND | RX_PEND | STS_PEND | AAL2_PEND)
++#define STS_PEND_INVEC 0x0001F000
++#define RX_PEND_INVEC 0x00000F00
++#define TXL_PEND_INVEC 0x000000F0
++#define TXH_PEND_INVEC 0x0000000F
++#define AIS_SEG_MASK 0x1 /* +01.02.00 */
++#define AIS_SEG_SHIFT 0 /* +01.02.00 */
++#define AIS_ETOE_MASK 0x20000 /* +01.02.00 */
++#define AIS_ETOE_SHIFT 17 /* +01.02.00 */
++#define RDI_CNT_MASK 0xffff0000 /* +01.02.00 */
++#define RDI_CNT_SHIFT 16 /* +01.02.00 */
++
++/*
++ * This function takes a vpi/vci pair and computes the 4 byte atm header
++ * (minus the HEC).
++ *
++ * @param vpi Virtual Path Identifier.
++ * @param vci Virtual Channel Identifier.
++ *
++ * @return A properly formatted ATM header, without the HEC.
++ */
++static int atmheader(int gfc, int vpi, int vci, int pti, int clp)
++ {
++ int itmp;
++
++ itmp=0;
++
++ /* UNI Mode uses the GFC field */
++ itmp |= ((gfc & 0xF) << 28);
++ itmp |= ((vpi & 0xFF) << 20);
++
++ /* if NNI Mode, no gfc and larger VPI */
++ /*itmp |= ((vpi & 0xFFF) << 20);*/
++
++ itmp|=((vci & 0xFFFF) << 4);
++ itmp|=((pti & 0x7) << 1);
++ itmp|=(clp & 0x1);
++ return(itmp);
++ }
++
++#include "cppi_cpaal5.c"
++
++/*
++ * Re-entrancy Issues
++ * In order to ensure successful re-entrancy certain sections of the
++ * CPHAL code will be bracketed as Critical.
++ * The OS will provide the function Os.CriticalSection(BOOL), which
++ * will be passed a TRUE to enter the Critical Section and FALSE to exit.
++ */
++
++/*
++ * @ingroup CPHAL_Functions
++ * Clears the statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0 OK, Non-zero not OK
++ */
++static int StatsClear(HAL_DEVICE *HalDev)
++ {
++ int i;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]StatsClear(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* clear stats */
++ for (i=0; i<NUM_AAL5_CHAN; i++)
++ {
++ HalDev->Stats.CrcErrors[i]=0;
++ HalDev->Stats.LenErrors[i]=0;
++ HalDev->Stats.DmaLenErrors[i]=0;
++ HalDev->Stats.AbortErrors[i]=0;
++ HalDev->Stats.StarvErrors[i]=0;
++ HalDev->Stats.TxMisQCnt[i][0]=0;
++ HalDev->Stats.TxMisQCnt[i][1]=0;
++ HalDev->Stats.RxMisQCnt[i]=0;
++ HalDev->Stats.RxEOQCnt[i]=0;
++ HalDev->Stats.TxEOQCnt[i][0]=0;
++ HalDev->Stats.TxEOQCnt[i][1]=0;
++ HalDev->Stats.RxPacketsServiced[i]=0;
++ HalDev->Stats.TxPacketsServiced[i][0]=0;
++ HalDev->Stats.TxPacketsServiced[i][1]=0;
++ HalDev->Stats.TxMaxServiced[i][0]=0;
++ HalDev->Stats.TxMaxServiced[i][1]=0;
++ }
++ HalDev->Stats.RxTotal=0;
++ HalDev->Stats.TxTotal=0;
++ HalDev->Stats.RxMaxServiced=0;
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * Returns statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0
++ */
++/*
++static STAT_INFO* StatsGet(HAL_DEVICE *HalDev)
++ {
++ STAT_INFO* MyStats = &HalDev->Stats;
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]StatsGet(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ dbgPrintf("HAL Stats:\n");
++ DispStat(HalDev, "Rx Total",MyStats->RxTotal);
++ DispStat(HalDev, "Tx Total",MyStats->TxTotal);
++ DispStat(HalDev, "Rx Peak",MyStats->RxMaxServiced);
++ DispStat(HalDev, "TxH Peak",MyStats->TxMaxServiced[0][0]);
++ DispStat(HalDev, "TxL Peak",MyStats->TxMaxServiced[0][1]);
++ DispChStat(HalDev, "CrcErr",&MyStats->CrcErrors[0],1);
++ DispChStat(HalDev, "LenErr",&MyStats->LenErrors[0],1);
++ DispChStat(HalDev, "DmaLenErr",&MyStats->DmaLenErrors[0],1);
++ DispChStat(HalDev, "AbortErr",&MyStats->AbortErrors[0],1);
++ DispChStat(HalDev, "StarvErr",&MyStats->StarvErrors[0],1);
++ DispChStat(HalDev, "TxH MisQ Cnt",&MyStats->TxMisQCnt[0][0],2);
++ DispChStat(HalDev, "TxL MisQ Cnt",&MyStats->TxMisQCnt[0][1],2);
++ DispChStat(HalDev, "Rx MisQ Cnt",&MyStats->RxMisQCnt[0],1);
++ DispChStat(HalDev, "Rx EOQ Cnt",&MyStats->RxEOQCnt[0],1);
++ DispChStat(HalDev, "TxH EOQ Cnt",&MyStats->TxEOQCnt[0][0],2);
++ DispChStat(HalDev, "TxL EOQ Cnt",&MyStats->TxEOQCnt[0][1],2);
++ DispChStat(HalDev, "Rx Pkts",&MyStats->RxPacketsServiced[0],1);
++ DispChStat(HalDev, "TxH Pkts",&MyStats->TxPacketsServiced[0][0],2);
++ DispChStat(HalDev, "TxL Pkts",&MyStats->TxPacketsServiced[0][1],2);
++
++ return (&HalDev->Stats);
++ }
++*/
++
++#ifdef __CPHAL_DEBUG
++void dbgChannelConfigDump(HAL_DEVICE *HalDev, int Ch)
++ {
++ CHANNEL_INFO *HalCh = &HalDev->ChData[Ch];
++ dbgPrintf(" [aal5 Inst %d, Ch %d] Config Dump:\n", HalDev->Inst, Ch);
++ dbgPrintf(" TxNumBuffers :%08d, TxNumQueues :%08d\n",
++ HalCh->TxNumBuffers, HalCh->TxNumQueues);
++ dbgPrintf(" RxNumBuffers :%08d, RxBufSize :%08d\n",
++ HalCh->RxNumBuffers, HalCh->RxBufSize);
++ dbgPrintf(" TxServiceMax :%08d, RxServiceMax:%08d\n",
++ HalCh->TxServiceMax, HalCh->RxServiceMax);
++ dbgPrintf(" RxBufferOffset:%08d, DaMask :%08d\n",
++ HalCh->RxBufferOffset, HalCh->DaMask);
++ dbgPrintf(" CpcsUU :%08d, Gfc :%08d\n",
++ HalCh->CpcsUU, HalCh->Gfc);
++ dbgPrintf(" Clp :%08d, Pti :%08d\n",
++ HalCh->Clp, HalCh->Pti);
++ dbgPrintf(" Priority :%08d, PktType :%08d\n",
++ HalCh->Priority, HalCh->PktType);
++ dbgPrintf(" Vci :%08d, Vpi :%08d\n",
++ HalCh->Vci, HalCh->Vpi);
++ dbgPrintf(" TxVc_CellRate :%08d, TxVc_QosType:%08d\n",
++ HalCh->TxVc_CellRate, HalCh->TxVc_QosType);
++ dbgPrintf(" TxVc_Mbs :%08d, TxVc_Pcr :%08d\n",
++ HalCh->TxVc_Mbs, HalCh->TxVc_Pcr);
++ dbgPrintf(" TxVc_AtmHeader:%08d\n",
++ HalCh->TxVc_AtmHeader);
++ osfuncSioFlush();
++ }
++#endif
++
++/*
++ * Retrieves channel parameters from configuration file. Any parameters
++ * which are not found are ignored, and the HAL default value will apply,
++ * unless a new value is given through the channel structure in the call
++ * to ChannelSetup.
++ */
++static int ChannelConfigGet(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ unsigned int Ret, Value, Ch = HalChn->Channel;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ void *ChInfo;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ChannelConfigGet(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalChn);
++ osfuncSioFlush();
++ }
++#endif
++
++ Ret=OsFunc->DeviceFindParmValue(HalDev->DeviceInfo, channel_names[Ch], &ChInfo);
++ if (Ret) return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_INFO_NOT_FOUND);
++
++ /* i don't care if a value is not found because they are optional */
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumBuffers", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxNumBuffers = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumQueues", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxNumQueues = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxServiceMax", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxServiceMax = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxNumBuffers", &Value);
++ if (!Ret) HalDev->ChData[Ch].RxNumBuffers = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufferOffset", &Value);
++ if (!Ret) HalDev->ChData[Ch].RxBufferOffset = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufSize", &Value);
++ if (!Ret) HalDev->ChData[Ch].RxBufSize = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxServiceMax", &Value);
++ if (!Ret) HalDev->ChData[Ch].RxServiceMax = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "CpcsUU", &Value);
++ if (!Ret) HalDev->ChData[Ch].CpcsUU = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Gfc", &Value);
++ if (!Ret) HalDev->ChData[Ch].Gfc = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Clp", &Value);
++ if (!Ret) HalDev->ChData[Ch].Clp = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Pti", &Value);
++ if (!Ret) HalDev->ChData[Ch].Pti = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "DaMask", &Value);
++ if (!Ret) HalDev->ChData[Ch].DaMask = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Priority", &Value);
++ if (!Ret) HalDev->ChData[Ch].Priority = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "PktType", &Value);
++ if (!Ret) HalDev->ChData[Ch].PktType = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vci", &Value);
++ if (!Ret) HalDev->ChData[Ch].Vci = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vpi", &Value);
++ if (!Ret) HalDev->ChData[Ch].Vpi = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_CellRate", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxVc_CellRate = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_QosType", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxVc_QosType = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Mbs", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxVc_Mbs = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Pcr", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxVc_Pcr = Value;
++
++ Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_AtmHeader", &Value);
++ if (!Ret) HalDev->ChData[Ch].TxVc_AtmHeader = Value;
++
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * Sets up channel parameters in the hardware, and initializes the CPPI
++ * TX and RX buffer descriptors and buffers.
++ */
++static int ChannelConfigApply(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int j, Ch = HalChn->Channel;
++ volatile bit32u *pTmp;
++ int Ret; /* +GSG 030410 */
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ChannelConfigApply(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalChn);
++ osfuncSioFlush();
++ }
++#endif
++
++ if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
++ }
++
++ HalDev->InRxInt[Ch]=FALSE;
++
++ /* Initialize Queue Data */
++ HalDev->RxActQueueHead[Ch]=0;
++ HalDev->RxActQueueCount[Ch]=0;
++ HalDev->TxActQueueHead[Ch][0]=0;
++ HalDev->TxActQueueHead[Ch][1]=0;
++ HalDev->TxActQueueCount[Ch][0]=0;
++ HalDev->TxActQueueCount[Ch][1]=0;
++ HalDev->RxActive[Ch] = FALSE;
++ HalDev->TxActive[Ch][0] = FALSE;
++ HalDev->TxActive[Ch][1] = FALSE;
++
++ /* Clear Rx State RAM */
++ pTmp = pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
++ for (j=0; j<NUM_RX_STATE_WORDS; j++)
++ *pTmp++ = 0;
++
++ /* Check that Rx DMA State RAM was cleared */
++ pTmp -= NUM_RX_STATE_WORDS;
++ for (j=0; j<NUM_RX_STATE_WORDS; j++)
++ {
++ if (*pTmp++ != 0)
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
++ }
++ }
++
++ /* Clear Tx State RAM */
++ pTmp = pTX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
++ for (j=0; j<NUM_TX_STATE_WORDS; j++)
++ *pTmp++ = 0;
++
++ /* Check that Tx DMA State RAM was cleared */
++ pTmp -= NUM_TX_STATE_WORDS;
++ for (j=0; j<NUM_TX_STATE_WORDS; j++)
++ {
++ if (*pTmp++ != 0)
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
++ }
++ }
++
++ /* Initialize Tx State RAM (Nothing to do) */
++
++ /* Initialize Rx State RAM */
++ /* Configure the Rx buffer offset */
++ pTmp=(pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
++ *pTmp |= (HalDev->ChData[Ch].RxBufferOffset & 0xFF);
++
++ /* Initialize buffer memory for the channel */
++ Ret = InitTcb(HalDev, Ch);
++ if (Ret) return (Ret);
++
++ Ret = InitRcb(HalDev, Ch);
++ if (Ret) return (Ret);
++
++ /* setup interrupt mask/enable for the channel */
++ SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch);
++
++ /* if using the low priority queue, set up mask for it */
++ if (HalDev->ChData[Ch].TxNumQueues == 2) /* +GSG 030421 */
++ SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch)<<16; /* +GSG 030421 */
++
++ SAR_RX_MASK_SET(HalDev->dev_base) = (1<<Ch);
++
++ /* call SAR layer to complete the channel setup - hardware configuration of ch */
++ Ret = HalDev->SarFunc->ChannelSetup(HalDev->SarDev, &HalDev->ChData[Ch]); /* ~GSG 030410 */
++ if (Ret) /* +GSG 030410 */
++ return (Ret); /* +GSG 030410 */
++
++ /* channel officially open for business */
++ HalDev->ChIsOpen[Ch][DIRECTION_TX] = TRUE;
++ HalDev->ChIsOpen[Ch][DIRECTION_RX] = TRUE;
++
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * Sets up HAL default channel configuration parameter values.
++ */
++static void ChannelConfigInit(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ChannelConfigInit(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalChn);
++ osfuncSioFlush();
++ }
++#endif
++
++ HalDev->ChData[Ch].Channel = Ch;
++ HalDev->ChData[Ch].TxNumBuffers = cfg_tx_num_bufs[Ch];
++ HalDev->ChData[Ch].RxNumBuffers = cfg_rx_num_bufs[Ch];
++ HalDev->ChData[Ch].RxBufSize = cfg_rx_buf_size[Ch];
++ HalDev->ChData[Ch].RxBufferOffset = cfg_rx_buf_offset[Ch];
++ HalDev->ChData[Ch].TxNumQueues = cfg_tx_num_queues[Ch];
++ HalDev->ChData[Ch].CpcsUU = cfg_cpcs_uu[Ch];
++ HalDev->ChData[Ch].DaMask = cfg_da_mask[Ch];
++ HalDev->ChData[Ch].Priority = cfg_priority[Ch];
++ HalDev->ChData[Ch].PktType = cfg_pkt_type[Ch];
++ HalDev->ChData[Ch].Vci = cfg_vci[Ch];
++ HalDev->ChData[Ch].Vpi = cfg_vpi[Ch];
++ HalDev->ChData[Ch].TxVc_CellRate = cfg_cell_rate[Ch];
++ HalDev->ChData[Ch].TxVc_QosType = cfg_qos_type[Ch];
++ HalDev->ChData[Ch].TxVc_Mbs = cfg_mbs[Ch];
++ HalDev->ChData[Ch].TxVc_Pcr = cfg_pcr[Ch];
++ HalDev->ChData[Ch].Gfc = cfg_gfc[Ch];
++ HalDev->ChData[Ch].Clp = cfg_clp[Ch];
++ HalDev->ChData[Ch].Pti = cfg_pti[Ch];
++ HalDev->ChData[Ch].RxServiceMax = cfg_rx_max_service[Ch];
++ HalDev->ChData[Ch].TxServiceMax = cfg_tx_max_service[Ch];
++ }
++
++/*
++ * Update per channel data in the HalDev based channel structure.
++ * If a certain channel parameter has been passed with the HAL_DEFAULT
++ * value (0xFFFFFFFF), then do not copy it.
++ */
++static void ChannelConfigUpdate(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
++ {
++ int Ch = HalChn->Channel;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ChannelConfigUpdate(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalChn);
++ osfuncSioFlush();
++ }
++#endif
++
++ HalDev->ChData[Ch].Channel = Ch;
++
++ /* ChannelUpdate is a macro defined in cpcommon.h. It requires
++ the presence of the variables named 'Ch' and 'HalChn'.*/
++ ChannelUpdate(DaMask);
++ ChannelUpdate(Priority);
++ ChannelUpdate(PktType);
++ ChannelUpdate(Vci);
++ ChannelUpdate(Vpi);
++ ChannelUpdate(CpcsUU);
++ ChannelUpdate(Gfc);
++ ChannelUpdate(Clp);
++ ChannelUpdate(Pti);
++ /* AAL5 Stuff */
++ ChannelUpdate(TxNumBuffers);
++ ChannelUpdate(RxNumBuffers);
++ ChannelUpdate(RxBufSize);
++ ChannelUpdate(RxBufferOffset);
++ ChannelUpdate(TxNumQueues);
++ ChannelUpdate(TxServiceMax);
++ ChannelUpdate(RxServiceMax);
++ /* PDSP STATE RAM */
++ ChannelUpdate(TxVc_CellRate);
++ ChannelUpdate(TxVc_QosType);
++ ChannelUpdate(TxVc_Mbs);
++ ChannelUpdate(TxVc_Pcr);
++ /* OAM */
++ ChannelUpdate(TxVc_AtmHeader);
++ ChannelUpdate(TxVc_OamTc);
++ ChannelUpdate(TxVc_VpOffset);
++ ChannelUpdate(RxVc_OamCh);
++ ChannelUpdate(RxVc_OamToHost);
++ ChannelUpdate(RxVc_AtmHeader);
++ ChannelUpdate(RxVc_VpOffset);
++ ChannelUpdate(RxVc_OamTc);
++ ChannelUpdate(TxVp_AtmHeader);
++ ChannelUpdate(TxVp_OamTc);
++ ChannelUpdate(RxVp_AtmHeader);
++ ChannelUpdate(RxVp_OamCh);
++ ChannelUpdate(RxVp_OamTc);
++ ChannelUpdate(RxVp_OamToHost);
++ ChannelUpdate(RxVp_OamVcList);
++ ChannelUpdate(FwdUnkVc);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function opens the specified channel. The caller must populate
++ * the @p HalCh structure. CPHAL default values may be requested for any or all
++ * members of the @p HalCh structure by supplying a value of 0xFFFFFFFF for the
++ * given member. The @p OsSetup parameter is a pointer to an OS defined
++ * data structure. If the CPHAL later calls @c MallocRxBuffer(), this pointer
++ * is returned in that call.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param HalCh Per channel information structure. Implementation specific.
++ * @param OsSetup Pointer to an OS-defined data structure.
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_NULL_CH_STRUCT "EC_VAL_NULL_CH_STRUCT"<BR>
++ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
++ * @ref EC_VAL_CH_ALREADY_OPEN "EC_VAL_CH_ALREADY_OPEN"<BR>
++ * @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
++ * @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
++ * @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
++ */
++static int halChannelSetup(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup)
++ {
++ int Ch, Ret;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halChannelSetup(HalDev:%08x, HalCh:%08x, OsSetup:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalCh, (bit32u)OsSetup);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state */
++ if (HalDev->State < enInitialized)
++ return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE);
++
++ /* We require the channel structure to be passed, even if it only contains
++ the channel number */
++ if (HalCh == NULL)
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_NULL_CH_STRUCT);
++ }
++
++ Ch = HalCh->Channel;
++
++ if ((Ch < 0) || (Ch > MAX_AAL5_CHAN))
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_CH);
++ }
++
++ /* if channel is already open, this call is invalid */
++ if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
++ {
++ return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
++ }
++
++ /* channel is closed, but might be setup. If so, reopen the hardware channel. */
++ if ((HalDev->ChIsSetup[Ch][DIRECTION_TX] == FALSE) && (HalDev->ChIsSetup[Ch][DIRECTION_RX] == FALSE))
++ {
++ /* Setup channel configuration */
++ /* Store OS_SETUP */
++ HalDev->ChData[Ch].OsSetup = OsSetup; /* ~GSG 030508 */
++
++ /* setup HAL default values for this channel first */
++ ChannelConfigInit(HalDev, HalCh);
++
++ /* retrieve options.conf channel parameters */
++ /* currently ignoring return value, making the choice that it's okay if
++ the user does not supply channel configuration in the data store */
++ ChannelConfigGet(HalDev, HalCh);
++
++ /* update HalDev with data given in HalCh */
++ ChannelConfigUpdate(HalDev, HalCh);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(8))
++ {
++ dbgChannelConfigDump(HalDev, Ch);
++ }
++#endif
++
++ /* HalDev->ChIsSetup[Ch][0] = TRUE; */
++ HalDev->ChIsSetup[Ch][DIRECTION_TX] = TRUE;
++ HalDev->ChIsSetup[Ch][DIRECTION_RX] = TRUE;
++
++ /* I don't initialize RcbStart or TcbStart here because their values may be
++ reused across several Setup/Teardown calls */
++ }
++
++ /* If the hardware has been opened (is out of reset), then configure the channel
++ in the hardware. NOTE: ChannelConfigApply calls the CPSAR ChannelSetup()! */
++ if (HalDev->State == enOpened)
++ {
++ Ret = ChannelConfigApply(HalDev, HalCh);
++ if (Ret) return (Ret);
++ }
++
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * This function configures the rate at which the OAM timer scheduler
++ * channels will be scheduled. The value of OamRate is the number of
++ * clock ticks between cell transmissions (if OAM function is sourcing
++ * cells), or the number of clock ticks between events or absence of events
++ * (if OAM function is sinking cells). The value of i indicates
++ * which OAM function to apply the rate to. A list is given below.
++ *
++ * @par Oam Function Values
++ * - 0 : Loopback source
++ * - 1 : F4 CC source
++ * - 2 : F5 CC source
++ * - 3 : F4 CC sink
++ * - 4 : F5 CC sink
++ * - 5 : F4 TX AIS source
++ * - 6 : F5 TX AIS source
++ * - 7 : F4 RX RDI source
++ * - 8 : F5 RX RDI source
++ * - 9 : F4 AIS monitor
++ * - 10 : F5 AIS monitor
++ *
++ * The following is information on how to calculate the OAM rate. There
++ * is only one OAM timer that is shared among all channels. Therefore, if
++ * you wanted an OAM source function (ex. F4 CC source) to generate 1 cell/sec
++ * across 8 channels, you would need to configure the OAM timer to schedule 8
++ * cells/sec. In addition, the credits are shared between segment and end-to-end
++ * type OAM cells, so if you were sending both types of cells, you would
++ * need to configure the OAM timer for 16 cells/sec. However, the clock
++ * rate must be specified in clock ticks between events. Using an example
++ * clock rate of 125 MHz, the rate in clock ticks can be calculated by
++ * dividing 125 Mhz by 16 cells/sec. The results is 7812500 ticks. Thus,
++ * every 7812500 clock cycles, an OAM cell will be generated for the F4 CC
++ * Source function.
++ */
++static void OamRateConfig(HAL_DEVICE *HalDev)
++ {
++ int i;
++ bit32u OamRate, Freq = HalDev->SarFrequency;
++
++ /* Configure OAM Timer State Block */
++ for (i=0; i<NUM_OAM_RATES; i++)
++ {
++ switch(i)
++ {
++ case 0: OamRate = ((Freq/1000)*HalDev->OamLbTimeout);
++ break;
++ case 1:
++ case 2:
++ case 5:
++ case 6:
++ case 7:
++ case 8: OamRate = (Freq/38);
++ break;
++ case 3:
++ case 4: OamRate = ((Freq*3) + (Freq/2))/38;
++ break;
++ case 9:
++ case 10: OamRate = ((Freq*2) + (Freq/2))/38;
++ break;
++ default: OamRate = (Freq*5);
++ break;
++ }
++
++ *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + (i*64) + 1) = OamRate;
++ }
++ }
++
++/**
++ * @ingroup AAL5_Functions
++ * This function is used to enable OAM functions (other than loopback) for a
++ * particular channel. The channel (embedded within OamConfig - see below) must
++ * have been configured for firmware OAM (not host OAM) for these configurations
++ * to take effect. More than one function may be enabled at one time.
++ * If more than one function is enabled, they must all be of the same level, all
++ * F4(VP) or all F5(VC).
++ *
++ * The usage of the OamConfig parameter is described through the table below. To
++ * initiate firmware OAM, set one or more bits in OamConfig corresponding to the
++ * various OAM functions. To disable firmware OAM functions, set bit 30 along
++ * with any other combination of bits to shutdown various OAM functions at once.
++ *
++ * Acronyms:
++ * e2e - end to end, seg - segment, CC - continuity check,
++ * AIS - Alarm Indication Signal
++ *
++ * @par Bit: Function: Description
++ * - 31: Reserved:
++ * - 30: Setup/Teardown: 0 - enable, 1 - disable (Note 1)
++ * - 29: F4 CC Source seg: 0 - no action, 1 - configure
++ * - 28: F4 CC Source e2e: 0 - no action, 1 - configure
++ * - 27: F4 AIS Source seg: 0 - no action, 1 - configure
++ * - 26: F4 AIS Source e2e: 0 - no action, 1 - configure
++ * - 25: F5 CC Source seg: 0 - no action, 1 - configure
++ * - 24: F5 CC Source e2e: 0 - no action, 1 - configure
++ * - 23: F5 AIS Source seg: 0 - no action, 1 - configure
++ * - 22: F5 AIS Source e2e: 0 - no action, 1 - configure
++ * - 21: F4 CC Sink seg: 0 - no action, 1 - configure
++ * - 20: F4 CC Sink e2e: 0 - no action, 1 - configure
++ * - 19: F5 CC Sink seg: 0 - no action, 1 - configure
++ * - 18: F5 CC Sink e2e: 0 - no action, 1 - configure
++ * - 17:8: Reserved:
++ * - 7:0: Channel: AAL5/AAL2 VC/VP channel (Note 2)
++ *
++ *
++ * Note 1: This bit must be clear to enable the specified OAM function.
++ * Note 2: This must specify the VC channel for F5 functions, and the VP
++ * channel for F4 functions.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param OamConfig A 32-bit integer field defined as follows:
++ */
++static void halOamFuncConfig(HAL_DEVICE *HalDev, unsigned int OamConfig)
++ {
++ /* GPR 0 */
++ SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
++ }
++
++/**
++ * @ingroup AAL5_Functions
++ * This function is used to enable OAM loopback functions for a particular
++ * channel. The channel (embedded within OamConfig - see below) must have been
++ * configured for firmware OAM (not host OAM) for these configurations to take
++ * effect. Only one loopback function can be enabled at a time.
++ *
++ * The LLID is inserted into to the OAM cell's LLID field, and it specifies the
++ * LLID of the connection point in the network where the generated loopback cell
++ * should be turned around. The LLID is composed of 4 32-bit words, and this
++ * function expects the caller to pass an array of 4 words in the LLID field.
++ * The CorrelationTag is a 32-bit word that the PDSP uses to correlate loopback
++ * commands with loopback responses. It should simply be changed for each
++ * call, and there is no restriction on the value used for CorrelationTag.
++ *
++ * The usage of the OamConfig parameter is described through the table below. To
++ * initiate firmware OAM, set one of the bits corresponding to the
++ * various loopback OAM functions. Note that only one loopback source may be
++ * commanded at a time.
++ *
++ * Acronyms:
++ * e2e - end to end, seg - segment, LB - loopback
++ *
++ * @par Bit: Function: Description
++ * - 31:16: Reserved:
++ * - 15: F4 LB Source seg: 0 - no action, 1 - configure (Note 1)
++ * - 14: F4 LB Source seg: 0 - no action, 1 - configure (Note 1)
++ * - 13: F4 LB Source e2e: 0 - no action, 1 - configure (Note 1)
++ * - 12: F4 LB Source e2e: 0 - no action, 1 - configure (Note 1)
++ * - 11:8: Reserved:
++ * - 7:0: Channel: AAL5/AAL2 VC/VP channel (Note 2)
++ *
++ *
++ * Note 1: Only one LB function may be enabled at one time. Once enabled,
++ * the PDSP will time out after 5 seconds. The host must wait until it
++ * has received the result of the current LB request before initiating
++ * a new request. <BR>
++ * Note 2: This must specify the VC channel for F5 functions, and the VP
++ * channel for F4 functions.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param OamConfig A 32-bit integer field defined as follows:
++ * @param LLID Loopback Location Identifier (passed as 4 word array).
++ * Must be configured in big endian format.
++ * @param CorrelationTag 32-bit tag correlates loopback commands with loopback
++ * responses. Must be configured in big endian format.
++ *
++ */
++static void halOamLoopbackConfig(HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag)
++ {
++ volatile bit32u *tmp;
++
++ /* test to see if this is a loopback command */
++ if (OamConfig & 0xf000)
++ {
++ /* write the OAM correlation tag (GPR 1) */
++ SAR_PDSP_OAM_CORR_REG(HalDev->dev_base) = CorrelationTag;
++
++ /* write the LLID */
++ tmp = pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base);
++
++ /* advance past the CPID */
++ tmp += 4;
++
++ *tmp++ = LLID[0];
++ *tmp++ = LLID[1];
++ *tmp++ = LLID[2];
++ *tmp = LLID[3];
++
++ /* GPR 0 */
++ SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
++ }
++ }
++
++/*
++ * This function allows the host software to access any register directly.
++ * Primarily used for debug.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param RegOffset Hexadecimal offset to desired register (from device base addr)
++ *
++ * @return Volatile pointer to desired register.
++ */
++static volatile bit32u* halRegAccess(HAL_DEVICE *HalDev, bit32u RegOffset)
++ {
++ /* compute the register address */
++ return ((volatile bit32u *)(HalDev->dev_base + RegOffset));
++ }
++
++#ifdef __CPHAL_DEBUG
++static void dbgConfigDump(HAL_DEVICE *HalDev)
++ {
++ dbgPrintf(" AAL5 Inst %d Config Dump:\n", HalDev->Inst);
++ dbgPrintf(" Base :%08x, offset:%08d\n",
++ HalDev->dev_base, HalDev->offset);
++ dbgPrintf(" Interrupt:%08d, debug :%08d\n",
++ HalDev->interrupt, HalDev->debug);
++ osfuncSioFlush();
++ }
++#endif
++
++/**
++ * @ingroup CPHAL_Functions
++ * Performs a variety of control functions on the CPHAL module. It is used to
++ * modify/read configuration parameters and to initiate internal functions.
++ * The @p Key indicates the function to perform or the parameter to access (note
++ * that these Keys are identical to those used in accessing the configuration data
++ * store). @p Action is applicable to parameters only, and indicates what the
++ * CPHAL should do with the parameter (i.e. "Set", "Get", etc..). The actions
++ * for each parameter are defined in the module specific documentation.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Key Key specifying the parameter to change or internal function to initiate. See module specific documentation for available keys.
++ * @param Action Specifies the action to take. See module specific documentation for available actions.
++ * @param Value Pointer to new value for given @p Key parameter ("Set"), or returned value of Key ("Get").
++ *
++ * @return EC_NO_ERRORS (ok).<BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
++ * @ref EC_VAL_ACTION_NOT_FOUND "EC_VAL_ACTION_NOT_FOUND"<BR>
++ */
++static int halControl(HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
++ {
++ int Level, Ch, KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Queue;
++ char *TmpKey = (char *)Key;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
++ Key, Action, (bit32u)Value);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state */
++ if (HalDev->State < enInitialized)
++ return (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_STATE);
++
++ if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ HalDev->debug = *(int *)Value;
++ /* also setup debug variable in CPSAR module */
++ rc = HalDev->SarFunc->Control(HalDev->SarDev, "Debug", "Set", Value);
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ HalDev->ChData[Ch].FwdUnkVc = *(int *)Value;
++
++ if ((HalDev->State == enOpened) && (HalDev->ChData[Ch].PktType == 3))
++ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
++ }
++ }
++
++ /* +GSG 030407 */
++ if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
++ }
++
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
++ }
++ }
++
++ /* +GSG 030307 */
++ if (HalDev->OsFunc->Strcmpi(Key, "Version") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ *(const char **)Value = pszVersion_CPAAL5;
++ }
++ }
++
++ /* +GSG 030529 */
++ if (HalDev->OsFunc->Strcmpi(Key, "TurboDslErrors") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ *(int *)Value = HalDev->TurboDslErrors;
++ }
++ }
++
++ /* +GSG 030416 */
++ if (HalDev->OsFunc->Strcmpi(Key, "F4_LB_Counter") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ *(int *)Value = SAR_PDSP_OAM_F4_LB_COUNT_REG(HalDev->dev_base);
++ }
++ }
++
++ /* +GSG 030416 */
++ if (HalDev->OsFunc->Strcmpi(Key, "F5_LB_Counter") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ *(int *)Value = SAR_PDSP_OAM_F5_LB_COUNT_REG(HalDev->dev_base);
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "Stats;") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ TmpKey += HalDev->OsFunc->Strlen("Stats;");
++ Level = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++ TmpKey++;
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++ TmpKey++;
++ Queue = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++ TmpKey++;
++ StatsGet(HalDev, (void **)Value, Level, Ch, Queue);
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "Gfc.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("Gfc.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].Gfc = *(int *)Value;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "Clp.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("Clp.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].Clp = *(int *)Value;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "Pti.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("Pti.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].Pti = *(int *)Value;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "CpcsUU.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("CpcsUU.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].CpcsUU = *(int *)Value;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "TxVc_CellRate.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("TxVc_CellRate.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].TxVc_CellRate = *(int *)Value;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVc_CellRate;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "TxVc_Mbs.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("TxVc_Mbs.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].TxVc_Mbs = *(int *)Value;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)= HalDev->ChData[Ch].TxVc_Mbs;
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "TxVc_AtmHeader.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("TxVc_AtmHeader.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].TxVc_AtmHeader = *(int *)Value;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+6)= HalDev->ChData[Ch].TxVc_AtmHeader;
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "TxVp_AtmHeader.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("TxVp_AtmHeader.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].TxVp_AtmHeader = *(int *)Value;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_TX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVp_AtmHeader;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #100 */
++ if (HalDev->OsFunc->Strstr(Key, "TxVc_Pcr.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("TxVc_Pcr.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].TxVc_Pcr = *(int *)Value;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+4)= HalDev->ChData[Ch].TxVc_Pcr;
++ }
++ }
++
++ /* +GSG 030428 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVc_OamCh.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVc_OamCh.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].RxVc_OamCh = (*(int *)Value) & 0xff;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)) |= HalDev->ChData[Ch].RxVc_OamCh;
++ }
++ }
++
++ /* +GSG 030428 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVp_OamCh.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVp_OamCh.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* first, store new value in our channel structure */
++ HalDev->ChData[Ch].RxVp_OamCh = (*(int *)Value) & 0xff;
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ *(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1) |= HalDev->ChData[Ch].RxVp_OamCh;
++ }
++ }
++
++ /* +GSG 030304 */
++ /* Fixes PITS #98 */
++ if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* this variable is controlled by the CPSAR module */
++ if (HalDev->State == enOpened)
++ {
++ rc=HalDev->SarFunc->Control(HalDev->SarDev, "PdspEnable", "Set", Value);
++ }
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "OamLbTimeout") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ HalDev->OamLbTimeout = *(int *)Value;
++ /* this variable is controlled by the CPSAR module */
++ if (HalDev->State == enOpened)
++ {
++ *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + 1) =
++ ((HalDev->SarFrequency/1000) * HalDev->OamLbTimeout);
++ }
++ }
++ }
++
++ /* +GSG 030306 (PITS #114) */
++ if (HalDev->OsFunc->Strstr(Key, "DeviceCPID") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ unsigned int* local = (unsigned int *)Value;
++ ActionFound=1;
++ /* first, store new value in our hal structure */
++ HalDev->DeviceCPID[0] = local[0];
++ HalDev->DeviceCPID[1] = local[1];
++ HalDev->DeviceCPID[2] = local[2];
++ HalDev->DeviceCPID[3] = local[3];
++
++ /* now, apply to PDSP state RAM */
++ if (HalDev->State == enOpened)
++ {
++ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 0) = HalDev->DeviceCPID[0];
++ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 1) = HalDev->DeviceCPID[1];
++ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 2) = HalDev->DeviceCPID[2];
++ *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 3) = HalDev->DeviceCPID[3];
++ }
++ }
++ }
++
++ /* +GSG 030304 */
++ /* Fixes PITS #99 */
++ if (HalDev->OsFunc->Strstr(Key, "StrictPriority") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* used in halOpen to decide which interrupt handler to use */
++ HalDev->StrictPriority = *(int *)Value;
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, hcMaxFrags) != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ if ((*(int *)Value) > 0)
++ HalDev->MaxFrags = *(int *)Value;
++ else
++ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_VALUE);
++ }
++
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ *(int *)Value = HalDev->MaxFrags;
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVc_RDICount.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
++ }
++ }
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* All sets write 0, this action is a clear only */
++ if (HalDev->State == enOpened)
++ {
++ (*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) &=~ RDI_CNT_MASK;
++ }
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVc_AISseg.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVc_AISseg.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
++ }
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVc_AISetoe.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVc_AISetoe.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
++ }
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVp_RDICount.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
++ }
++ }
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* All sets write 0, this action is a clear only */
++ if (HalDev->State == enOpened)
++ {
++ (*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) &=~ RDI_CNT_MASK;
++ }
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVp_AISseg.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVp_AISseg.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
++ }
++ }
++ }
++
++ /* +GSG 030306 */
++ /* Fixes PITS #103 */
++ if (HalDev->OsFunc->Strstr(Key, "RxVp_AISetoe.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("RxVp_AISetoe.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* PDSP's Rx VC State word 3 contains the value */
++ if (HalDev->State == enOpened)
++ {
++ *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
++ }
++ }
++ }
++
++ if (KeyFound == 0)
++ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND);
++
++ if (ActionFound == 0)
++ rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND);
++
++ return(rc);
++ }
++
++/*
++ * Sets up HAL default configuration parameter values.
++ */
++static void ConfigInit(HAL_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* configure some defaults with tnetx7300 values */
++ HalDev->dev_base = 0xa3000000;
++ HalDev->offset = 0;
++ HalDev->interrupt = 15;
++ HalDev->debug = 0;
++ HalDev->MaxFrags = 46;
++ HalDev->OamLbTimeout = 5000;
++ }
++
++/*
++ * Retrieve HAL configuration parameter values.
++ */
++static bit32u ConfigGet(HAL_DEVICE *HalDev)
++ {
++ bit32u Ret;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* get the configuration parameters common to all modules */
++ Ret = ConfigGetCommon(HalDev);
++ if (Ret) return (EC_AAL5|Ret);
++
++ /* get AAL5 specific configuration parameters here */
++ Ret = HalDev->OsFunc->Control(HalDev->OsDev, hcSarFrequency, pszGET, &HalDev->SarFrequency); /* GSG +030416*/
++ if (Ret) /* GSG +030416*/
++ HalDev->SarFrequency = 200000000; /* 200 Mhz default */ /* GSG +030416*/
++
++ return (EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function initializes the CPHAL module. It gathers all
++ * necessary global configuration info from the configuration file, and
++ * performs initialization and configuration of the device. Note that
++ * the device operation is not started until the OS calls @c Open().
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_BASE_ADDR_NOT_FOUND "EC_VAL_BASE_ADDR_NOT_FOUND"<BR>
++ * @ref EC_VAL_RESET_BIT_NOT_FOUND "EC_VAL_RESET_BIT_NOT_FOUND"<BR>
++ * @ref EC_VAL_INTERRUPT_NOT_FOUND "EC_VAL_INTERRUPT_NOT_FOUND"<BR>
++ * @ref EC_VAL_OFFSET_NOT_FOUND "EC_VAL_OFFSET_NOT_FOUND"<BR>
++ */
++static int halInit(HAL_DEVICE *HalDev)
++ {
++ int i;
++ bit32u error_code;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halInit(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state */
++ if (HalDev->State != enDevFound)
++ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_INVALID_STATE);
++
++ /* Configure HAL defaults */
++ ConfigInit(HalDev);
++
++ /* Retrieve HAL configuration parameters from data store */
++ error_code = ConfigGet(HalDev);
++ if (error_code) return (error_code);
++
++ /* Other items (OAM related) that need to be passed in somehow */
++ HalDev->DeviceCPID[0] = 0xffffffff;
++ HalDev->DeviceCPID[1] = 0xffffffff;
++ HalDev->DeviceCPID[2] = 0xffffffff;
++ HalDev->DeviceCPID[3] = 0xffffffff;
++ HalDev->LBSourceLLID[0] = 0xffffffff;
++ HalDev->LBSourceLLID[1] = 0xffffffff;
++ HalDev->LBSourceLLID[2] = 0xffffffff;
++ HalDev->LBSourceLLID[3] = 0xffffffff;
++
++ /* Initialize SAR layer*/
++ error_code = HalDev->SarFunc->Init(HalDev->SarDev);
++ if (error_code) return (error_code);
++
++ /* Initialize various HalDev members. This is probably overkill, since these
++ are initialized in ChannelSetup() and HalDev is cleared in InitModule(). */
++ for (i=0; i<NUM_AAL5_CHAN; i++)
++ {
++ HalDev->InRxInt[i]=FALSE;
++ HalDev->ChIsOpen[i][DIRECTION_TX] = FALSE;
++ HalDev->ChIsOpen[i][DIRECTION_RX] = FALSE;
++ HalDev->TcbStart[i][0] = 0;
++ HalDev->TcbStart[i][1] = 0;
++ HalDev->RcbStart[i] = 0;
++ }
++
++ /* initialize SAR stats */
++ StatsClear(HalDev);
++
++ /* init Stat pointers */
++
++ /* even though these statistics may be for multiple channels/queues, i need
++ only configure the pointer to the beginning of the array, and I can index
++ from there if necessary */
++ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
++ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
++ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
++ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
++
++ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
++ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
++ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
++ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
++ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
++ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
++ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
++ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
++ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
++ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
++ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
++
++ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
++ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
++ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
++ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
++ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
++ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
++ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
++ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
++ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
++ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
++ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
++ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
++ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
++ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
++
++ StatsTable4[0].StatPtr = &HalDev->dev_base;
++ StatsTable4[1].StatPtr = &HalDev->offset;
++ StatsTable4[2].StatPtr = &HalDev->interrupt;
++ StatsTable4[3].StatPtr = &HalDev->debug;
++ StatsTable4[4].StatPtr = &HalDev->Inst;
++
++ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
++ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
++ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
++ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
++ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
++ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
++ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
++ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
++ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
++ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
++ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
++ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
++ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
++ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
++ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
++ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
++ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
++ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
++ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
++ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
++
++ /* update device state */
++ HalDev->State = enInitialized;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(9))
++ dbgConfigDump(HalDev);
++#endif
++
++ return(EC_NO_ERRORS);
++ }
++
++/*
++ * Use this function to actually send after queuing multiple packets using
++ * Send(). This is a debug only function that should be removed - it was
++ * necessary to properly implement my loopback tests.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Queue Queue number to kick.
++ *
++ * @return 0 OK, Non-Zero Not OK
++ */
++static int halKick(HAL_DEVICE *HalDev, int Queue)
++ {
++ int Ch;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halKick(HalDev:%08x. Queue:%d)\n", (bit32u)HalDev, Queue);
++ osfuncSioFlush();
++ }
++#endif
++
++ for (Ch = 0; Ch < 16; Ch ++)
++ {
++ if ((!HalDev->TxActive[Ch][Queue]) && (HalDev->TxActQueueHead[Ch][Queue] != 0))
++ {
++ *(pTX_DMA_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+Queue)=
++ VirtToPhys(HalDev->TxActQueueHead[Ch][Queue]);
++ HalDev->TxActive[Ch][Queue]=TRUE;
++ }
++ }
++
++ return (EC_NO_ERRORS);
++ }
++
++/* +GSG 030305 For PITS #99
++ * Alternate interrupt handler that uses the INT_VECTOR in order to
++ * provide strict priority handling among channels, beginning with Ch 0.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param MoreWork (Output) When set to 1, indicates that there is more work to do.
++ * Caller should ensure that the value pointed at is set to 0
++ * prior to the call.
++ * @return 0 OK, non-zero error.
++ */
++static int DeviceIntAlt(HAL_DEVICE *HalDev, int *MoreWork)
++ {
++ int tmp, Ch, WorkFlag;
++ bit32u rc;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]DeviceIntAlt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state - important because a call prior to Open would
++ result in a lockup */
++ if (HalDev->State != enOpened)
++ return(EC_AAL5|EC_FUNC_DEVICE_INT_ALT|EC_VAL_INVALID_STATE);
++
++ if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
++ {
++ /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
++ HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
++
++ if (tmp&TXH_PEND)
++ {
++ /* decide which channel to service */
++ Ch = (SAR_INTR_VECTOR(HalDev->dev_base) & TXH_PEND_INVEC);
++
++ rc = TxInt(HalDev,Ch,0,&WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&TXL_PEND)
++ {
++ /* decide which channel to service */
++ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & TXL_PEND_INVEC) >> 4);
++
++ rc = TxInt(HalDev,Ch,1,&WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&RX_PEND)
++ {
++ /* decide which channel to service */
++ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & RX_PEND_INVEC) >> 8);
++
++ rc = RxInt(HalDev,Ch,&WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&STS_PEND)
++ {
++ /* GPR 2 code added for PITS 103 */
++ /* determine interrupt source */
++ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
++
++ /* only if this is GPR 2 interrupt do we take action */
++ if (Ch == 26)
++ {
++ /* pass loopback result back to OS */
++ HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
++ (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base));
++ }
++
++ /* clear the interrupt */
++ SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
++ }
++
++ if (tmp&AAL2_PEND)
++ {
++ /* no action defined */
++ }
++
++ SAR_INTR_VECTOR(HalDev->dev_base) = 0;
++ }
++
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * Called to service a module interrupt. This function determines
++ * what type of interrupt occurred and dispatches the correct handler.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param MoreWork (Output) When set to 1, indicates that there is more work to do.
++ * Caller should ensure that the value pointed at is set to 0
++ * prior to the call.
++ * @return 0 OK, non-zero error.
++ */
++static int DeviceInt(HAL_DEVICE *HalDev, int *MoreWork)
++ {
++ /*static int NextRxCh=0;
++ static int NextTxCh[2]={0,0};*/
++
++ int tmp, Ch, FirstCh, WorkFlag;
++ int NextTxLCh, NextTxHCh, NextRxCh;
++ bit32u rc;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]DeviceInt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state - important because a call prior to Open would
++ result in a lockup */
++ if (HalDev->State != enOpened)
++ return(EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_INVALID_STATE);
++
++ NextTxHCh = HalDev->NextTxCh[0];
++ NextTxLCh = HalDev->NextTxCh[1];
++ NextRxCh = HalDev->NextRxCh;
++
++ /* service interrupts while there is more work to do */
++ /*while (((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING) && (TotalPkts < 500))*/
++ if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
++ {
++ /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
++ HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
++
++ if (tmp&TXH_PEND)
++ {
++ /* decide which channel to service */
++ FirstCh = NextTxHCh;
++ while (1)
++ {
++ Ch = NextTxHCh++;
++ if (NextTxHCh == 16)
++ NextTxHCh = 0;
++ if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<Ch))
++ break;
++ if (FirstCh == NextTxHCh)
++ {
++ /* we checked every channel and still haven't found anything to do */
++ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXH_WORK_TO_DO);
++ }
++ }
++
++ rc = TxInt(HalDev,Ch,0,&WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&TXL_PEND)
++ {
++ /* decide which channel to service */
++ FirstCh = NextTxLCh;
++ while (1)
++ {
++ Ch = NextTxLCh++;
++ if (NextTxLCh == 16)
++ NextTxLCh = 0;
++ if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<(Ch+16)))
++ break;
++ if (FirstCh == NextTxLCh)
++ {
++ /* we checked every channel and still haven't found anything to do */
++ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXL_WORK_TO_DO);
++ }
++ }
++
++ rc = TxInt(HalDev,Ch,1,&WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&RX_PEND)
++ {
++ FirstCh = NextRxCh;
++ while (1)
++ {
++ Ch = NextRxCh++;
++ if (NextRxCh == 16)
++ NextRxCh = 0;
++ if (SAR_RX_MASKED_STATUS(HalDev->dev_base) & (1 << Ch))
++ break; /* found a channel to service */
++ if (FirstCh == NextRxCh)
++ {
++ /* we checked every channel and still haven't found anything to do */
++ return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_RX_WORK_TO_DO);
++ }
++ }
++
++ rc = RxInt(HalDev,Ch, &WorkFlag);
++ if (rc) return (rc);
++
++ if (WorkFlag == 1)
++ *MoreWork = 1;
++ }
++
++ if (tmp&STS_PEND)
++ {
++ /* +GSG 030305 */
++ /* GPR 2 code added for PITS 103 */
++ /* determine interrupt source */
++ Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
++
++ /* only if this is GPR 2 interrupt do we take action */
++ if (Ch == 26)
++ {
++ /* pass loopback result back to OS */
++ HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
++ (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base));
++ }
++
++ /* clear the interrupt */
++ SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
++ }
++
++ if (tmp&AAL2_PEND)
++ {
++ /* no action defined */
++ }
++
++ SAR_INTR_VECTOR(HalDev->dev_base) = 0;
++ }
++
++ HalDev->NextTxCh[0] = NextTxHCh;
++ HalDev->NextTxCh[1] = NextTxLCh;
++ HalDev->NextRxCh = NextRxCh;
++
++ /* This must be done by the upper layer */
++ /* SAR_EOI(HalDev->dev_base) = 0; */
++
++ return (EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function starts the operation of the CPHAL device. It takes the device
++ * out of reset, and calls @c IsrRegister(). This function should be called after
++ * calling the @c Init() function.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok).<BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
++ * @ref EC_VAL_FIRMWARE_TOO_LARGE "EC_VAL_FIRMWARE_TOO_LARGE"<BR>
++ * @ref EC_VAL_PDSP_LOAD_FAIL "EC_VAL_PDSP_LOAD_FAIL"<BR>
++ * @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
++ * @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
++ * @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
++ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
++ */
++static int halOpen(HAL_DEVICE *HalDev)
++ {
++ int i,Ret;
++ bit32 SarBase = HalDev->dev_base;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state */
++ if (HalDev->State < enInitialized)
++ return (EC_AAL5|EC_FUNC_OPEN|EC_VAL_INVALID_STATE);
++
++ /* Open the SAR (this brings the whole device out of reset */
++ Ret = HalDev->SarFunc->Open(HalDev->SarDev); /* ~GSG 030410 */
++ if (Ret) /* +GSG 030410 */
++ return (Ret); /* +GSG 030410 */
++
++ /* Change device state */
++ HalDev->State = enOpened;
++
++
++#ifdef __CPHAL_DEBUG
++ /* print out the version information */
++ if (DBG(7))
++ {
++ dbgPrintf("[aal5 halOpen()]Module ID(AAL5-CPSAR):%d, Version:%2d.%02d\n",
++ (SAR_ID_REG(SarBase)&0xffff0000)>>16,
++ (SAR_ID_REG(SarBase)&0xff00)>>8,
++ SAR_ID_REG(SarBase)&0xff);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* GREG 11/1/02: The State RAM clearing code was previously in cpsar.c,
++ directly after device reset. I moved it here because I believe it is
++ AAL5 specific code. Also the MAX_CHAN was set to 19 in cpsar.c, which
++ would have caused this code to clear too much memory! */
++
++ /* NOTE: State RAM must be cleared prior to initializing the PDSP!! */
++
++ /* GSG 030416: Removed all of this. All PDSP State RAM is cleared
++ in CPSAR Open(). On Close(), all channels are torndown, thus all
++ AAL5 channel state RAM is cleared. */
++
++ /* Clear Rx State RAM */
++ /*for (i=0; i<NUM_AAL5_CHAN; i++)
++ for (j=0; j<NUM_RX_STATE_WORDS; j++)
++ *(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0; */
++
++ /* Check that Rx DMA State RAM was cleared */
++ /*for (i=0; i<NUM_AAL5_CHAN; i++)
++ for (j=0; j<NUM_RX_STATE_WORDS; j++)
++ {
++ if (*(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
++ {
++ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
++ }
++ }*/
++
++ /* Clear Tx State RAM */
++ /*for (i=0; i<NUM_AAL5_CHAN; i++)
++ for (j=0; j<NUM_TX_STATE_WORDS; j++)
++ {
++ *(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0;
++ }*/
++
++ /* Check that Tx DMA State RAM was cleared */
++ /*for (i=0; i<NUM_AAL5_CHAN; i++)
++ for (j=0; j<NUM_TX_STATE_WORDS; j++)
++ {
++ if (*(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
++ {
++ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
++ }
++ }*/
++
++ /* GSG +030523 Malloc space for the Rx fraglist */
++ HalDev->fraglist = HalDev->OsFunc->Malloc(HalDev->MaxFrags * sizeof(FRAGLIST));
++
++ /* For any channels that have been pre-initialized, set them up now */
++ for (i=0; i<NUM_AAL5_CHAN; i++)
++ {
++ if ((HalDev->ChIsSetup[i][0]==TRUE) && (HalDev->ChIsOpen[i][0]==FALSE))
++ {
++ CHANNEL_INFO HalChn;
++ HalChn.Channel = i;
++ Ret = ChannelConfigApply(HalDev, &HalChn);
++ if (Ret) return (Ret);
++ }
++ }
++
++ /* OAM code would be a candidate to go into ConfigApply */
++
++ /* Configure OAM Timer State Block */
++ OamRateConfig(HalDev); /* +GSG 030416 */
++
++ /* Setup OAM Configuration Block */
++ for (i=0; i<8; i++) /* ~GSG 030603 4->8 */
++ {
++ if (i < 4)
++ *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->DeviceCPID[i];
++ else
++ *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->LBSourceLLID[i-4];
++ }
++
++ /* Setup OAM Padding Block */
++ for (i=0; i<12; i++)
++ {
++ *(pOAM_PADDING_BLOCK_WORD_0(SarBase) + i) = ((i==11)?0x6a6a0000:0x6a6a6a6a);
++ }
++
++ /* Enable Tx CPPI DMA */
++ TX_CPPI_CTL_REG(HalDev->dev_base) = 1;
++
++ /* Enable Rx CPPI DMA */
++ RX_CPPI_CTL_REG(HalDev->dev_base) = 1;
++
++ /* +GSG 030306 */
++ /* Fix for PITS 103 */
++ /* Enable Host Interrupt for GPR 2 (OAM LB result register) */
++ SAR_HOST_INT_EN_SET_REG(HalDev->dev_base) |= 0x04000000;
++
++ /* +GSG 030304 to fix PITS 99 (if block is new)*/
++ if (HalDev->StrictPriority == 1)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
++ (bit32u)HalDev->OsDev, (bit32u)DeviceIntAlt, HalDev->interrupt);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* "register" the interrupt handler */
++ HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceIntAlt, HalDev->interrupt);
++ }
++ else /* +GSG 030306 */
++ { /* +GSG 030306 */
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
++ (bit32u)HalDev->OsDev, (bit32u)DeviceInt, HalDev->interrupt);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* "register" the interrupt handler */
++ HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceInt, HalDev->interrupt);
++ } /* +GSG 030306 */
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * Called to retrigger the interrupt mechanism after packets have been
++ * processed. Call this function when the HalISR function indicates that
++ * there is no more work to do. Proper use of this function will guarantee
++ * that interrupts are never missed.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ */
++static int halPacketProcessEnd(HAL_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halPacketProcessEnd(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ SAR_EOI(HalDev->dev_base) = 0;
++ return (EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function probes for the instance of the CPHAL module. It will call
++ * the OS function @c DeviceFindInfo() to get the information required.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_DEVICE_NOT_FOUND "EC_VAL_DEVICE_NOT_FOUND"<BR>
++ */
++static int halProbe(HAL_DEVICE *HalDev)
++ {
++ int Ret;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify hardware state is "enConnected */
++ if (HalDev->State != enConnected)
++ return (EC_AAL5|EC_FUNC_PROBE|EC_VAL_INVALID_STATE);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("[aal5->os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
++ HalDev->Inst, "aal5", (bit32u)&HalDev->DeviceInfo);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Attempt to find the device information */
++ Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "aal5", &HalDev->DeviceInfo);
++ if (Ret)
++ return(EC_AAL5|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
++
++ /* Call Probe for supporting CPSAR layer */
++ Ret = HalDev->SarFunc->Probe(HalDev->SarDev);
++ if (Ret)
++ return(Ret);
++
++ /* Set device state to DevFound */
++ HalDev->State = enDevFound;
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function shuts down the CPHAL module completely. The caller must call
++ * Close() to put the device in reset prior shutting down. This call will free
++ * the HalDev and the HAL function pointer structure, effectively ending
++ * communications between the driver and the CPHAL. Further use of the module
++ * must be initiated by a call to xxxInitModule(), which starts the entire process
++ * over again.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * Any error code from halClose().<BR>
++ */
++static int halShutdown(HAL_DEVICE *HalDev)
++ {
++ int Ch, Queue; /*GSG+030514*/
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Verify proper device state */
++ if (HalDev->State == enOpened)
++ halClose(HalDev, 3); /*GSG+030429*/
++
++ /* Buffer/descriptor resources may still need to be freed if a Close
++ Mode 1 was performed prior to Shutdown - clean up here */ /*GSG+030514*/
++ for (Ch=0; Ch<NUM_AAL5_CHAN; Ch++)
++ {
++ if (HalDev->RcbStart[Ch] != 0)
++ FreeRx(HalDev,Ch);
++
++ for(Queue=0; Queue<MAX_QUEUE; Queue++)
++ {
++ if (HalDev->TcbStart[Ch][Queue] != 0)
++ FreeTx(HalDev,Ch,Queue);
++ }
++ }
++
++ /* shutdown the CPSAR layer */
++ HalDev->SarFunc->Shutdown(HalDev->SarDev);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(6))
++ {
++ dbgPrintf(" [aal5 halShutdown()]Free AAL5 function pointers\n");
++ osfuncSioFlush();
++ }
++ if (DBG(1)||DBG(3))
++ {
++ dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
++ osfuncSioFlush();
++ }
++#endif
++ /* free the HalFunc */
++ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(6))
++ {
++ dbgPrintf(" [aal5 halShutdown]Free HalDev\n");
++ osfuncSioFlush();
++ }
++ if (DBG(1)||DBG(3))
++ {
++ dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++ /* free the HAL device */
++ HalDev->OsFunc->FreeDev(HalDev);
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * Used to perform regular checks on the device. This function should be
++ * called at a regular interval specified by the @c Tick parameter.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return EC_NO_ERRORS (ok).<BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ */
++static int halTick(HAL_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[aal5]halTick(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ if (HalDev->State != enOpened)
++ return(EC_AAL5|EC_FUNC_TICK|EC_VAL_INVALID_STATE);
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ *
++ * This function will:
++ * -# allocate a HalDev that will be used by the OS for future communications with the device
++ * -# save OsDev for use when calling OS functions
++ * -# allocate and populate HalFunc with the addresses of CPHAL functions.
++ * -# check OsFuncSize to see if it meets the minimum requirement.
++ * -# return the size of the HAL_FUNCTIONS structure through the HalFuncSize pointer. The OS
++ * should check this value to ensure that the HAL meets its minimum requirement.
++ *
++ * Version checking between the OS and the CPHAL is done using the OsFuncSize and
++ * HalFuncSize. Future versions of the CPHAL may add new functions to either
++ * HAL_FUNCTIONS or OS_FUNCTIONS, but will never remove functionality. This enables
++ * both the HAL and OS to check the size of the function structure to ensure that
++ * the current OS and CPHAL are compatible.
++ *
++ * Note: This is the only function exported by a CPHAL module.
++ *
++ * Please refer to the section "@ref hal_init" for example code.
++ *
++ * @param HalDev Pointer to pointer to CPHAL module information. This will
++ * be used by the OS when communicating to this module via
++ * CPHAL. Allocated during the call.
++ * @param OsDev Pointer to OS device information. This will be saved by
++ * the CPHAL and returned to the OS when required.
++ * @param HalFunc Pointer to pointer to structure containing function pointers for all CPHAL
++ * interfaces. Allocated during the call.
++ * @param OsFunc Pointer to structure containing function pointers for all OS
++ * provided interfaces. Must be allocated by OS prior to call.
++ * @param OsFuncSize Size of OS_FUNCTIONS structure.
++ * @param HalFuncSize Pointer to the size of the HAL_FUNCTIONS structure.
++ * @param Inst The instance number of the module to initialize. (start at
++ * 0).
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_OS_VERSION_NOT_SUPPORTED "EC_VAL_OS_VERSION_NOT_SUPPORTED"<BR>
++ * @ref EC_VAL_MALLOC_DEV_FAILED "EC_VAL_MALLOC_DEV_FAILED"<BR>
++ * @ref EC_VAL_MALLOC_FAILED "EC_VAL_MALLOC_FAILED"<BR>
++ */
++int xxxInitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++
++int cpaal5InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst)
++ {
++ int rc, SarFuncSize;
++ HAL_DEVICE *HalPtr;
++ HAL_FUNCTIONS *HalFuncPtr;
++
++ /* NEW CODE */
++ if (OsFuncSize < sizeof(OS_FUNCTIONS))
++ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_OS_VERSION_NOT_SUPPORTED);
++
++ HalPtr = (HAL_DEVICE *) OsFunc->MallocDev(sizeof(HAL_DEVICE));
++ if (!HalPtr)
++ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
++
++ HalFuncPtr = (HAL_FUNCTIONS *) OsFunc->Malloc(sizeof(HAL_FUNCTIONS));
++ if (!HalFuncPtr)
++ return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
++
++ /* Initialize the size of hal functions */
++ *HalFuncSize = sizeof (HAL_FUNCTIONS);
++
++ /* clear the device structure */
++ OsFunc->Memset(HalPtr, 0, sizeof(HAL_DEVICE));
++
++ /* clear the function pointers */
++ OsFunc->Memset(HalFuncPtr, 0, sizeof(HAL_FUNCTIONS));
++
++ /* initialize the HAL_DEVICE structure */
++ HalPtr->OsDev = OsDev;
++ /*HalPtr->OsOpen = OsDev;*/
++ HalPtr->Inst = Inst;
++ HalPtr->OsFunc = OsFunc;
++
++ /* Supply pointers for the CPHAL API functions */
++ HalFuncPtr->RxReturn = halRxReturn;
++ HalFuncPtr->Init = halInit;
++ HalFuncPtr->Close = halClose;
++ HalFuncPtr->Send = halSend;
++ HalFuncPtr->ChannelSetup = halChannelSetup;
++ HalFuncPtr->ChannelTeardown = halChannelTeardown;
++ HalFuncPtr->Open = halOpen;
++ HalFuncPtr->Kick = halKick;
++ HalFuncPtr->RegAccess = halRegAccess;
++ HalFuncPtr->Probe = halProbe;
++ HalFuncPtr->Control = halControl;
++ HalFuncPtr->Tick = halTick;
++ HalFuncPtr->Shutdown = halShutdown;
++ HalFuncPtr->OamFuncConfig = halOamFuncConfig; /* +GSG 030306 */
++ HalFuncPtr->OamLoopbackConfig = halOamLoopbackConfig; /* ~GSG 030416 */
++
++ /* Temporary */
++ /*HalFuncPtr->StatsGetOld = StatsGet;*/
++ HalFuncPtr->PacketProcessEnd = halPacketProcessEnd;
++
++ /* Now, AAL5 must connect to the CPSAR layer */
++
++ /* Attach to SAR HAL Functions */
++ /*
++ cpsarInitModule(NULL, NULL, 0, NULL, &SarFuncSize, Inst);
++
++ if (SarFuncSize!=sizeof(CPSAR_FUNCTIONS))
++ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_CPSAR_VERSION_NOT_SUPPORTED);
++
++ HalPtr->SarFunc = (CPSAR_FUNCTIONS *) OsFunc->Malloc(SarFuncSize);
++ */
++
++ rc = cpsarInitModule(&HalPtr->SarDev, OsDev, &HalPtr->SarFunc, OsFunc, sizeof(OS_FUNCTIONS), &SarFuncSize, Inst);
++
++ /* pass back the error value from the CPSAR layer if necessary */
++ if (rc)
++ return(rc);
++
++ /*
++ if (!HalPtr->SarDev)
++ return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_NULL_CPSAR_DEV);
++ */
++
++ /* Initialize the hardware state */
++ HalPtr->State = enConnected;
++
++ /* keep a reference to HalFuncPtr so I can free it later */
++ HalPtr->HalFuncPtr = HalFuncPtr;
++
++ /* pass the HalPtr back to the caller */
++ *HalDev = HalPtr;
++ *HalFunc = HalFuncPtr;
++
++ return(EC_NO_ERRORS);
++ }
+diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.h linux.dev/drivers/atm/sangam_atm/aal5sar.h
+--- linux.old/drivers/atm/sangam_atm/aal5sar.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/aal5sar.h 2005-07-10 08:02:01.421114856 +0200
+@@ -0,0 +1,198 @@
++/**@file************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: aal5sar.h
++ *
++ * DESCRIPTION:
++ * This file contains data structure definitions for the AAL5 HAL SAR.
++ *
++ * HISTORY:
++ * 28Feb02 Greg 1.00 Original Version created.
++ * 06Mar02 Greg 1.01 Documented structures.
++ * 18Jul02 Greg 1.02 Major reorganization
++ *
++ *****************************************************************************/
++#ifndef _INC_AAL5SAR
++#define _INC_AAL5SAR
++
++/** \namespace AAL5_Version
++This documents version 01.06.06 of the AAL5 CPHAL.
++*/
++const char *pszVersion_CPAAL5="CPAAL5 01.06.06 "__DATE__" "__TIME__;
++
++#include "cpsar_cpaal5.h"
++
++#define NUM_AAL5_CHAN 16
++#define MAX_AAL5_CHAN 15
++#define MAX_QUEUE 2
++#define MAX_DIRECTION 2
++
++#define PKT_TYPE_AAL5 0 /* +GSG 030508 */
++#define PKT_TYPE_NULL 1 /* +GSG 030508 */
++#define PKT_TYPE_OAM 2 /* +GSG 030508 */
++#define PKT_TYPE_TRANS 3 /* +GSG 030508 */
++#define ATM_HEADER_SIZE 4 /* +GSG 030508 */
++
++/*
++ * HAL Default Parameter Values
++ */
++#define CFG_TX_NUM_BUFS {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
++#define CFG_RX_NUM_BUFS {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
++#define CFG_RX_BUF_SIZE {1518,1518,1518,1518,1518,1518,1518,1518, 1518,1518,1518,1518,1518,1518,1518,1518}
++#define CFG_RX_BUF_OFFSET {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_TX_NUM_QUEUES {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
++#define CFG_CPCS_UU {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_DA_MASK {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_PRIORITY {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_PKT_TYPE {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_VCI {100,101,102,103,104,105,106,107, 108,109,110,111,112,113,114,115}
++#define CFG_VPI {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_CELL_RATE {0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4, 0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4}
++#define CFG_QOS_TYPE {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_MBS {8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8}
++#define CFG_PCR {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
++#define CFG_GFC {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_CLP {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_PTI {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
++#define CFG_RX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
++#define CFG_TX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
++
++static int cfg_tx_num_bufs[NUM_AAL5_CHAN] = CFG_TX_NUM_BUFS;
++static int cfg_rx_num_bufs[NUM_AAL5_CHAN] = CFG_RX_NUM_BUFS;
++static int cfg_rx_buf_size[NUM_AAL5_CHAN] = CFG_RX_BUF_SIZE;
++static int cfg_rx_buf_offset[NUM_AAL5_CHAN] = CFG_RX_BUF_OFFSET;
++static int cfg_tx_num_queues[NUM_AAL5_CHAN] = CFG_TX_NUM_QUEUES;
++static bit32u cfg_cpcs_uu[NUM_AAL5_CHAN] = CFG_CPCS_UU;
++static int cfg_da_mask[NUM_AAL5_CHAN] = CFG_DA_MASK;
++static int cfg_priority[NUM_AAL5_CHAN] = CFG_PRIORITY;
++static int cfg_pkt_type[NUM_AAL5_CHAN] = CFG_PKT_TYPE;
++static int cfg_vci[NUM_AAL5_CHAN] = CFG_VCI;
++static int cfg_vpi[NUM_AAL5_CHAN] = CFG_VPI;
++static bit32u cfg_cell_rate[NUM_AAL5_CHAN] = CFG_CELL_RATE;
++static int cfg_qos_type[NUM_AAL5_CHAN] = CFG_QOS_TYPE;
++static int cfg_mbs[NUM_AAL5_CHAN] = CFG_MBS;
++static int cfg_pcr[NUM_AAL5_CHAN] = CFG_PCR;
++static int cfg_gfc[NUM_AAL5_CHAN] = CFG_GFC;
++static int cfg_clp[NUM_AAL5_CHAN] = CFG_CLP;
++static int cfg_pti[NUM_AAL5_CHAN] = CFG_PTI;
++static int cfg_rx_max_service[NUM_AAL5_CHAN]= CFG_RX_MAX_SERVICE;
++static int cfg_tx_max_service[NUM_AAL5_CHAN]= CFG_TX_MAX_SERVICE;
++static char *channel_names[] = CHANNEL_NAMES;
++
++/*
++ * The HAL_FUNCTIONS struct defines the function pointers for all HAL functions
++ * accessible to upper layer software. It is populated by calling
++ * halInitModules().
++ *
++ * Note that this list is still under definition.
++ */
++
++/*
++ * This is the data structure for a transmit buffer descriptor. The first
++ * four 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
++ * words. The other words are SAR/HAL implementation specific.
++ */
++typedef struct
++ {
++ bit32 HNext; /**< Hardware's pointer to next buffer descriptor */
++ bit32 BufPtr; /**< Pointer to the data buffer */
++ bit32 Off_BLen; /**< Contains buffer offset and buffer length */
++ bit32 mode; /**< SOP, EOP, Ownership, EOQ, Teardown Complete bits */
++ bit32 AtmHeader; /**< Atm Header to be used for each fragment */
++ bit32 Word5; /**< General control information for the packet */
++ bit32 Res6;
++ bit32 Res7;
++ void *Next;
++ void *OsInfo;
++#ifdef __CPHAL_DEBUG
++ bit32 DbgSop;
++ bit32 DbgData;
++ bit32 DbgFraglist;
++#endif
++ void *Eop;
++ }HAL_TCB;
++
++/*
++ * This is the data structure for a receive buffer descriptor. The first
++ * six 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
++ * words. The other words are HAL implementation specific.
++ */
++typedef volatile struct hal_private
++ {
++ bit32 HNext; /**< Hardware's pointer to next buffer descriptor */
++ bit32 BufPtr; /**< Pointer to the data buffer */
++ bit32 Off_BLen; /**< Contains buffer offset and buffer length */
++ bit32 mode; /**< SOP, EOP, Ownership, EOQ, Teardown, Q Starv, Length */
++ bit32 AtmHeader;
++ bit32 UuCpi;
++ bit32 Res6;
++ bit32 Res7;
++ void *DatPtr;
++ void *Next;
++ void *OsInfo;
++ void *Eop;
++ bit32 FragCount;
++ bit32 Ch;
++ HAL_DEVICE *HalDev;
++ }HAL_RCB;
++
++
++#define MAX_NEEDS 512 /*MJH+030409*/
++/*
++ * This is the data structure for a generic HAL device. It contains all device
++ * specific data for a single instance of that device. This includes Rx/Tx
++ * buffer queues, device base address, reset bit, and other information.
++ */
++typedef struct hal_device
++ {
++ HAL_RCB *RcbPool[NUM_AAL5_CHAN];
++ bit32u rxbufseq;
++ bit32 RxActQueueCount[NUM_AAL5_CHAN];
++ HAL_RCB *RxActQueueHead[NUM_AAL5_CHAN];
++ HAL_RCB *RxActQueueTail[NUM_AAL5_CHAN];
++ bit32 RxActive[NUM_AAL5_CHAN];
++ bit32 dev_base;
++ HAL_TCB *TcbPool[NUM_AAL5_CHAN][MAX_QUEUE];
++ bit32 offset;
++ bit32 TxActQueueCount[NUM_AAL5_CHAN][MAX_QUEUE];
++ HAL_TCB *TxActQueueHead[NUM_AAL5_CHAN][MAX_QUEUE];
++ HAL_TCB *TxActQueueTail[NUM_AAL5_CHAN][MAX_QUEUE];
++ bit32 TxActive[NUM_AAL5_CHAN][MAX_QUEUE];
++ bit32 TxTeardownPending[NUM_AAL5_CHAN];
++ bit32 RxTeardownPending[NUM_AAL5_CHAN];
++ bit32 ChIsOpen[NUM_AAL5_CHAN][MAX_DIRECTION];
++ bit32 ChIsSetup[NUM_AAL5_CHAN][MAX_DIRECTION];
++ bit32 interrupt;
++ bit32 debug;
++ OS_DEVICE *OsDev;
++ OS_FUNCTIONS *OsFunc;
++ CPSAR_FUNCTIONS *SarFunc;
++ CPSAR_DEVICE *SarDev;
++ /*void *OsOpen;*/
++ /*FRAGLIST fraglist[MAX_FRAG];*/
++ FRAGLIST *fraglist;
++ char *TcbStart[NUM_AAL5_CHAN][MAX_QUEUE];
++ char *RcbStart[NUM_AAL5_CHAN];
++ /*bit32 RcbSize[NUM_AAL5_CHAN];*/
++ bit32 InRxInt[NUM_AAL5_CHAN];
++ STAT_INFO Stats;
++ bit32 Inst;
++ bit32u DeviceCPID[4];
++ bit32u LBSourceLLID[4];
++ CHANNEL_INFO ChData[NUM_AAL5_CHAN];
++ DEVICE_STATE State;
++ char *DeviceInfo;
++ HAL_FUNCTIONS *HalFuncPtr;
++ int NextRxCh;
++ int NextTxCh[2];
++ int StrictPriority; /* +GSG 030304 */
++ bit32u NeedsCount; /*MJH+030409*/
++ HAL_RECEIVEINFO *Needs[MAX_NEEDS]; /*MJH+030409*/
++ bit32u SarFrequency; /* +GSG 030416 */
++ int MaxFrags;
++ bit32u TurboDslErrors;
++ bit32u OamLbTimeout;
++ }HALDEVICE;
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c
+--- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c 2005-07-10 08:02:01.422114704 +0200
+@@ -0,0 +1,728 @@
++#ifndef _INC_CPCOMMON_C
++#define _INC_CPCOMMON_C
++
++#ifdef _CPHAL_CPMAC
++#include "cpremap_cpmac.c"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "cpremap_cpaal5.c"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "cpremap_cpsar.c"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "cpremap_cpaal2.c"
++#endif
++
++/**
++@defgroup Common_Config_Params Common Configuration Parameters
++
++This section documents the configuration parameters that are valid across
++all CPHAL devices.
++@{
++*/
++/** This is the debug level. The field is bit defined, such that the user
++should set to 1 all the bits corresponding to desired debug outputs. The following
++are the meanings for each debug bit:
++- bit0 (LSB): CPHAL Function Trace
++- b1 : OS Function call trace
++- b2 : Critical section entry/exit
++- b3 : Memory allocation/destruction
++- b4 : Detailed information in Rx path
++- b5 : Detailed information in Tx path
++- b6 : Extended error information
++- b7 : General info
++*/
++static const char pszDebug[] = "debug";
++/** CPU Frequency. */
++/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
++/** Base address for the module. */
++static const char pszBase[] = "base";
++/** Reset bit for the module. */
++static const char pszResetBit[] = "reset_bit";
++/** Reset base address for the module. */
++static const char pszResetBase[] = "ResetBase";
++/** Interrupt line for the module. */
++static const char pszIntLine[] = "int_line";
++/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
++static const char pszOffset[] = "offset";
++/** The OS may "Get" this parameter, which is a pointer
++ to a character string that indicates the version of CPHAL. */
++static const char pszVer[] = "Version";
++/*@}*/
++
++/**
++@defgroup Common_Control_Params Common Keys for [os]Control()
++
++This section documents the keys used with the OS @c Control() interface that
++are required by CPHAL devices.
++
++@{
++*/
++/** Used to wait for an integer number of clock ticks, given as an integer
++ pointer in the @p Value parameter. No actions are defined. */
++static const char pszSleep[] = "Sleep";
++/** Requests the OS to flush it's IO buffers. No actions are defined. */
++static const char pszSioFlush[] = "SioFlush";
++/*@}*/
++
++static const char pszStateChange[] = "StateChange";
++static const char pszStatus[] = "Status";
++
++static const char pszGET[] = "Get";
++static const char pszSET[] = "Set";
++static const char pszCLEAR[] = "Clear";
++static const char pszNULL[] = "";
++static const char pszLocator[] = "Locator";
++static const char pszOff[] = "Off";
++static const char pszOn[] = "On";
++static const char hcMaxFrags[] = "MaxFrags";
++
++#ifdef _CPHAL_CPMAC
++
++/* New method for string constants */
++const char hcClear[] = "Clear";
++const char hcGet[] = "Get";
++const char hcSet[] = "Set";
++
++const char hcTick[] = "Tick";
++
++static const CONTROL_KEY KeyCommon[] =
++ {
++ {"" , enCommonStart},
++ {pszStatus , enStatus},
++ {pszOff , enOff},
++ {pszOn , enOn},
++ {pszDebug , enDebug},
++ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
++ {"" , enCommonEnd}
++ };
++#endif
++
++/**
++@defgroup Common_Statistics Statistics
++
++A broad array of module statistics is available. Statistics values are accessed
++through the @c Control() interface of the CPHAL. There are 5 different levels
++of statistics, each of which correspond to a unique set of data. Furthermore,
++certain statistics data is indexed by using a channel number and Tx queue number.
++The following is a brief description of each statistics level, along with the
++indexes used for the level:
++
++- Level 0: Hardware Statistics (index with channel)
++- Level 1: CPHAL Software Statistics (channel, queue)
++- Level 2: CPHAL Flags (channel, queue)
++- Level 3: CPHAL Channel Configuration (channel)
++- Level 4: CPHAL General Configuration (no index)
++
++The caller requests statistics information by providing a Key string to the
++@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
++The only valid Action parameter for statistics usage is "Get".
++
++Code Examples:
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# Get Level 2 stats for Channel 0, Queue 0
++HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
++
++# Get Level 4 stats
++HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
++@endcode
++
++The information returned in the Value parameter of @c Control() is an
++array of pointers to strings. The pointers are arranged in pairs.
++The first pointer is a pointer to a name string for a particular statistic.
++The next pointer is a pointer to a string containing the representation of
++the integer statistic value corresponding to the first pointer. This is followed
++by another pair of pointers, and so on, until a NULL pointer is encountered. The
++following is example code for processing the statistics data. Note that the OS
++is responsible for freeing the memory passed back through the Value parameter of
++@c Control().
++
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# output Statistics data
++PrintStats(StatsData);
++
++# the upper layer is responsible for freeing stats info
++free(&StatsPtr);
++
++...
++
++void PrintStats(unsigned int *StatsPtr)
++ {
++ while(*StatsPtr)
++ {
++ printf("%20s:", (char *)*StatsPtr);
++ StatsPtr++;
++ printf("%11s\n", (char *)*StatsPtr);
++ StatsPtr++;
++ }
++ MySioFlush();
++ }
++@endcode
++
++Within each statistics level, there are several statistics defined. The statistics that
++are common to every CPPI module are listed below. In addition, each module may define
++extra statistics in each level, which will be documented within the module-specific
++documentation appendices.
++
++- Level 0 Statistics
++ - All level 0 statistics are module-specific.
++- Level 1 Statistics (CPHAL Software Statistics)
++ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
++ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
++transmitting the previous last packet in the queue (per channel and queue).
++ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
++reception of the previous last packet in the queue (per channel).
++ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
++ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
++ - RxPacketsServiced: Number of received packets (per channel).
++ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
++ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
++ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
++ - RxTotal: Total number of received packets, all channels.
++ - TxTotal: Total number of transmitted packets, all channels and queues.
++- Level 2 Statistics (CPHAL Flags)
++ - RcbPool: Pointer to receive descriptor pool (per channel).
++ - RxActQueueCount: Number of buffers currently available for receive (per channel).
++ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
++ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
++ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
++ - RcbStart: Pointer to block of receive descriptors.
++ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
++ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
++ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
++ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
++ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
++ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
++ - TcbStart: Pointer to block of transmit descriptors.
++ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
++- Level 3 Statistics (CPHAL Channel Configuration)
++ - RxBufSize: Rx buffer size.
++ - RxBufferOffset: Rx buffer offset.
++ - RxNumBuffers: Number of Rx buffers.
++ - RxServiceMax: Maximum number of receive packets to service at a time.
++ - TxNumBuffers: Number of Tx buffer descriptors.
++ - TxNumQueues: Number of Tx queues to use.
++ - TxServiceMax: Maximum number of transmit packets to service at a time.
++- Level 4 Statistics (CPHAL General Configuration)
++ - Base Address: Base address of the module.
++ - Offset (VLYNQ): VLYNQ relative module offset.
++ - Interrupt Line: Interrupt number.
++ - Debug: Debug flag, 1 to enable debug.
++ - Inst: Instance number.
++*/
++
++/*
++ Data Type 0 = int display
++ Data Type 1 = hex display
++ Data Type 2 = channel structure, int display
++ Data Type 3 = queue index and int display
++ Data Type 4 = queue index and hex display
++*/
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
++static STATS_TABLE StatsTable0[] =
++ {
++#ifdef _CPHAL_AAL5
++ /* Name , Data Ptr, Data Type */
++ {"Crc Errors", 0, 0},
++ {"Len Errors", 0, 0},
++ {"Abort Errors", 0, 0},
++ {"Starv Errors", 0, 0}
++#endif
++#ifdef _CPHAL_CPMAC
++ {"Rx Good Frames", 0, 0}
++#endif
++ };
++
++static STATS_TABLE StatsTable1[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"DmaLenErrors", 0, 0},
++ {"TxMisQCnt", 0, 3},
++ {"RxMisQCnt", 0, 0},
++ {"TxEOQCnt", 0, 3},
++ {"RxEOQCnt", 0, 0},
++ {"RxPacketsServiced", 0, 0},
++ {"TxPacketsServiced", 0, 3},
++ {"RxMaxServiced", 0, 0},
++ {"TxMaxServiced", 0, 3},
++ {"RxTotal", 0, 0},
++ {"TxTotal", 0, 0},
++ };
++
++static STATS_TABLE StatsTable2[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RcbPool", 0, 1},
++ {"RxActQueueCount", 0, 0},
++ {"RxActQueueHead", 0, 1},
++ {"RxActQueueTail", 0, 1},
++ {"RxActive", 0, 0},
++ {"RcbStart", 0, 1},
++ {"RxTeardownPending", 0, 0},
++ {"TcbPool", 0, 4},
++ {"TxActQueueCount", 0, 3},
++ {"TxActQueueHead", 0, 4},
++ {"TxActQueueTail", 0, 4},
++ {"TxActive", 0, 3},
++ {"TcbStart", 0, 4},
++ {"TxTeardownPending", 0, 0}
++ };
++
++static STATS_TABLE StatsTable3[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RxBufSize", 0, 2},
++ {"RxBufferOffset", 0, 2},
++ {"RxNumBuffers", 0, 2},
++ {"RxServiceMax", 0, 2},
++ {"TxNumBuffers", 0, 2},
++ {"TxNumQueues", 0, 2},
++ {"TxServiceMax", 0, 2},
++#ifdef _CPHAL_AAL5
++ {"CpcsUU", 0, 2},
++ {"Gfc", 0, 2},
++ {"Clp", 0, 2},
++ {"Pti", 0, 2},
++ {"DaMask", 0, 2},
++ {"Priority", 0, 2},
++ {"PktType", 0, 2},
++ {"Vci", 0, 2},
++ {"Vpi", 0, 2},
++ {"CellRate", 0, 2},
++ {"QosType", 0, 2},
++ {"Mbs", 0, 2},
++ {"Pcr", 0, 2}
++#endif
++ };
++
++static STATS_TABLE StatsTable4[] =
++ {
++ {"Base Address", 0, 1},
++ {"Offset (VLYNQ)", 0, 0},
++ {"Interrupt Line", 0, 0},
++ {"Debug", 0, 0},
++ {"Instance", 0, 0},
++#ifdef _CPHAL_AAL5
++ {"UniNni", 0, 0}
++#endif
++ };
++
++static STATS_DB StatsDb[] =
++ {
++ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
++ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
++ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
++ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
++ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
++ };
++#endif /* +GSG 030307 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void resetWait(HAL_DEVICE *HalDev)
++ { /*+RC3.02*/
++ const int TickReset=64;
++ osfuncSleep((int*)&TickReset);
++ } /*+RC3.02*/
++#endif /* +RC 3.02 */
++
++/* I only define the reset base function for the modules
++ that can perform a reset. The AAL5 and AAL2 modules
++ do not perform a reset, that is done by the shared module
++ CPSAR */
++#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
++/*
++ * Determines the reset register address to be used for a particular device.
++ * It will search the current device entry for Locator information. If the
++ * device is a root device, there will be no Locator information, and the
++ * function will find and return the root reset register. If a Locator value
++ * is found, the function will search each VLYNQ device entry in the system
++ * looking for a matching Locator. Once it finds a VLYNQ device entry with
++ * a matching Locator, it will extract the "ResetBase" parameter from that
++ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param ResetBase Pointer to integer address of reset register.
++ *
++ * @return 0 OK, Non-zero not OK
++ */
++static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
++ {
++ char *DeviceInfo = HalDev->DeviceInfo;
++ char *MyLocator, *NextLocator;
++ int Inst=1;
++ bit32u error_code;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
++ if (error_code)
++ {
++ /* if no Locator value, device is on the root, so get the "reset" device */
++ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
++ if (error_code)
++ {
++ return(EC_VAL_DEVICE_NOT_FOUND);
++ }
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ /* we have a Locator value, so the device is remote */
++
++ /* Find a vlynq device with a matching locator value */
++ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
++ if (error_code)
++ {
++ /* no Locator value for this VLYNQ, so move on */
++ continue;
++ }
++ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
++ {
++ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ Inst++;
++ } /* while */
++ } /* else */
++
++ return (EC_NO_ERRORS);
++ }
++#endif
++
++#ifndef _CPHAL_AAL2 /* + RC 3.02 */
++static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
++ {
++ bit32u ParmValue;
++ bit32 error_code;
++ char *DeviceInfo = HalDev->DeviceInfo;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
++
++#ifndef _CPHAL_AAL5
++#ifndef _CPHAL_AAL2
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
++ if(error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
++ }
++ HalDev->ResetBit = ParmValue;
++
++ /* Get reset base address */
++ error_code = ResetBaseGet(HalDev, &ParmValue);
++ if (error_code)
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
++ HalDev->ResetBase = ParmValue;
++#endif
++#endif
++
++#ifndef _CPHAL_CPSAR
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
++ }
++ HalDev->interrupt = ParmValue;
++#endif
++
++ /* only look for the offset if there is a Locator field, which indicates that
++ the module is a VLYNQ module */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
++ if (!error_code)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
++ }
++ HalDev->offset = ParmValue;
++ }
++ else
++ HalDev->offset = 0;
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
++ if (!error_code) HalDev->debug = ParmValue;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
++ {
++ /* even though these statistics may be for multiple channels and
++ queues, i need only configure the pointer to the beginning
++ of the array, and I can index from there if necessary */
++
++#ifdef _CPHAL_AAL5
++ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
++ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
++ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
++ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
++
++ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
++ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
++ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
++ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
++ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
++ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
++ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
++ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
++ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
++ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
++ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
++#endif
++
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
++ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
++ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
++ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
++ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
++ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
++ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
++ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
++ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
++ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
++ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
++ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
++ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
++ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
++ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
++
++ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
++ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
++ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
++ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
++ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
++ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
++ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
++#ifdef _CPHAL_AAL5
++ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
++ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
++ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
++ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
++ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
++ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
++ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
++ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
++ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
++ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
++ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
++ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
++ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
++#endif
++#endif
++
++ StatsTable4[0].StatPtr = &HalDev->dev_base;
++ StatsTable4[1].StatPtr = &HalDev->offset;
++ StatsTable4[2].StatPtr = &HalDev->interrupt;
++ StatsTable4[3].StatPtr = &HalDev->debug;
++ StatsTable4[4].StatPtr = &HalDev->Inst;
++ }
++#endif /* +RC 3.02 */
++
++#ifndef _CPHAL_CPSAR /* +RC 3.02 */
++#ifndef _CPHAL_AAL2 /* +RC 3.02 */
++/*
++ * Returns statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0
++ */
++static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
++ {
++ int Size;
++ bit32u *AddrPtr;
++ char *DataPtr;
++ STATS_TABLE *StatsTable;
++ int i, NumberOfStats;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
++ (bit32u)HalDev, (bit32u)StatPtr);
++ osfuncSioFlush();
++ }
++#endif
++
++ StatsTable = StatsDb[Index].StatTable;
++ NumberOfStats = StatsDb[Index].NumberOfStats;
++
++ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
++ Size += (NumberOfStats*11);
++ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
++
++ AddrPtr = (bit32u *) *StatPtr;
++ DataPtr = (char *)AddrPtr;
++ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
++
++ for (i=0; i<NumberOfStats; i++)
++ {
++ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
++ *AddrPtr++ = (bit32u)DataPtr;
++ if (&StatsTable[i].StatPtr[Ch] != 0)
++ {
++ switch(StatsTable[i].DataType)
++ {
++ case 0:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 1:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 2:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
++ break;
++ case 3:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ case 4:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ default:
++ /* invalid data type, due to CPHAL programming error */
++ break;
++ }
++ }
++ else
++ {
++ /* invalid statistics pointer, probably was not initialized */
++ }
++ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
++ }
++
++ *AddrPtr = (bit32u) 0;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC
++static void gpioFunctional(int base, int bit)
++ { /*+RC3.02*/
++ bit32u GpioEnr = base + 0xC;
++ /* To make functional, set to zero */
++ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
++ } /*+RC3.02*/
++
++
++/*+RC3.02*/
++/* Common function, Checks to see if GPIO should be in functional mode */
++static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
++ { /*+RC3.02*/
++ int rc;
++ void *DeviceInfo;
++ char *pszMuxBits;
++ char pszMuxBit[20];
++ char *pszTmp;
++ char szMuxBit[20];
++ char *ptr;
++ int base;
++ int reset_bit;
++ int bit;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
++ if(rc) return;
++ /* gpio entry found, get GPIO register info and make functional */
++
++ /* temp copy until FinParmValue fixed */
++ ptr = &szMuxBit[0];
++ while ((*ptr++ = *pszTmp++));
++
++ pszMuxBits = &szMuxBit[0];
++
++ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
++ if(rc) return;
++
++ /* If GPIO still in reset, then exit */
++ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
++ return;
++ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
++ while (*pszMuxBits)
++ {
++ pszTmp = &pszMuxBit[0];
++ if(*pszMuxBits == ';') pszMuxBits++;
++ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
++ {
++ osfuncSioFlush();
++ /*If value not a number, skip */
++ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
++ pszMuxBits++;
++ else
++ *pszTmp++ = *pszMuxBits++;
++ }
++ *pszTmp = '\0';
++ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
++ gpioFunctional(base, bit);
++ resetWait(HalDev); /* not sure if this is needed */
++ }
++ } /*+RC3.02*/
++#endif /* CPMAC */
++
++#ifdef _CPHAL_AAL5
++const char hcSarFrequency[] = "SarFreq";
++#endif
++
++#endif /* _INC */
+diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h
+--- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h 2005-07-10 08:02:01.422114704 +0200
+@@ -0,0 +1,79 @@
++#ifndef _INC_CPCOMMON_H
++#define _INC_CPCOMMON_H
++
++#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
++#ifndef dbgPrintf
++#define dbgPrintf HalDev->OsFunc->Printf
++#endif
++
++#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
++
++#define DBG(level) (HalDev->debug & (1<<(level)))
++/*
++#define DBG0() DBG(0)
++#define DBG1() DBG(1)
++#define DBG2() DBG(2)
++#define DBG3() DBG(3)
++#define DBG4() DBG(4)
++#define DBG5() DBG(5)
++#define DBG6() DBG(6)
++#define DBG7() DBG(7)
++*/
++
++/*
++ * List of defined actions for use with Control().
++ */
++typedef enum
++ {
++ enGET=0, /**< Get the value associated with a key */
++ enSET, /**< Set the value associates with a key */
++ enCLEAR, /**<Clear the value */
++ enNULL /**< No data action, used to initiate a service or send a message */
++ }ACTION;
++
++/*
++ * Enumerated hardware states.
++ */
++typedef enum
++ {
++ enConnected=1, enDevFound, enInitialized, enOpened
++ }DEVICE_STATE;
++
++typedef enum
++ {
++ enCommonStart=0,
++ /* General */
++ enOff, enOn, enDebug,
++ /* Module General */
++ enCpuFreq,
++ enStatus,
++ enCommonEnd
++ }COMMON_KEY;
++
++typedef struct
++ {
++ const char *strKey;
++ int enKey;
++ }CONTROL_KEY;
++
++typedef struct
++ {
++ char *StatName;
++ unsigned int *StatPtr;
++ int DataType; /* 0: int, 1: hex int, 2:channel data */
++ }STATS_TABLE;
++
++typedef struct
++ {
++ int NumberOfStats;
++ STATS_TABLE *StatTable;
++ }STATS_DB;
++
++#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
++#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
++#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
++
++#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
++
++#endif
++
+diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c
+--- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c 2005-07-10 08:02:01.423114552 +0200
+@@ -0,0 +1,728 @@
++#ifndef _INC_CPCOMMON_C
++#define _INC_CPCOMMON_C
++
++#ifdef _CPHAL_CPMAC
++#include "cpremap_cpmac.c"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "cpremap_cpaal5.c"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "cpremap_cpsar.c"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "cpremap_cpaal2.c"
++#endif
++
++/**
++@defgroup Common_Config_Params Common Configuration Parameters
++
++This section documents the configuration parameters that are valid across
++all CPHAL devices.
++@{
++*/
++/** This is the debug level. The field is bit defined, such that the user
++should set to 1 all the bits corresponding to desired debug outputs. The following
++are the meanings for each debug bit:
++- bit0 (LSB): CPHAL Function Trace
++- b1 : OS Function call trace
++- b2 : Critical section entry/exit
++- b3 : Memory allocation/destruction
++- b4 : Detailed information in Rx path
++- b5 : Detailed information in Tx path
++- b6 : Extended error information
++- b7 : General info
++*/
++static const char pszDebug[] = "debug";
++/** CPU Frequency. */
++/*static const char pszCpuFreq[] = "CpuFreq";*/ /*MJH-030403*/
++/** Base address for the module. */
++static const char pszBase[] = "base";
++/** Reset bit for the module. */
++static const char pszResetBit[] = "reset_bit";
++/** Reset base address for the module. */
++static const char pszResetBase[] = "ResetBase";
++/** Interrupt line for the module. */
++static const char pszIntLine[] = "int_line";
++/** VLYNQ offset for the module. Disregard if not using VLYNQ. */
++static const char pszOffset[] = "offset";
++/** The OS may "Get" this parameter, which is a pointer
++ to a character string that indicates the version of CPHAL. */
++static const char pszVer[] = "Version";
++/*@}*/
++
++/**
++@defgroup Common_Control_Params Common Keys for [os]Control()
++
++This section documents the keys used with the OS @c Control() interface that
++are required by CPHAL devices.
++
++@{
++*/
++/** Used to wait for an integer number of clock ticks, given as an integer
++ pointer in the @p Value parameter. No actions are defined. */
++static const char pszSleep[] = "Sleep";
++/** Requests the OS to flush it's IO buffers. No actions are defined. */
++static const char pszSioFlush[] = "SioFlush";
++/*@}*/
++
++static const char pszStateChange[] = "StateChange";
++static const char pszStatus[] = "Status";
++
++static const char pszGET[] = "Get";
++static const char pszSET[] = "Set";
++static const char pszCLEAR[] = "Clear";
++static const char pszNULL[] = "";
++static const char pszLocator[] = "Locator";
++static const char pszOff[] = "Off";
++static const char pszOn[] = "On";
++static const char hcMaxFrags[] = "MaxFrags";
++
++#ifdef _CPHAL_CPMAC
++
++/* New method for string constants */
++const char hcClear[] = "Clear";
++const char hcGet[] = "Get";
++const char hcSet[] = "Set";
++
++const char hcTick[] = "Tick";
++
++static const CONTROL_KEY KeyCommon[] =
++ {
++ {"" , enCommonStart},
++ {pszStatus , enStatus},
++ {pszOff , enOff},
++ {pszOn , enOn},
++ {pszDebug , enDebug},
++ {hcCpuFrequency , enCpuFreq}, /*MJH~030403*/
++ {"" , enCommonEnd}
++ };
++#endif
++
++/**
++@defgroup Common_Statistics Statistics
++
++A broad array of module statistics is available. Statistics values are accessed
++through the @c Control() interface of the CPHAL. There are 5 different levels
++of statistics, each of which correspond to a unique set of data. Furthermore,
++certain statistics data is indexed by using a channel number and Tx queue number.
++The following is a brief description of each statistics level, along with the
++indexes used for the level:
++
++- Level 0: Hardware Statistics (index with channel)
++- Level 1: CPHAL Software Statistics (channel, queue)
++- Level 2: CPHAL Flags (channel, queue)
++- Level 3: CPHAL Channel Configuration (channel)
++- Level 4: CPHAL General Configuration (no index)
++
++The caller requests statistics information by providing a Key string to the
++@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
++The only valid Action parameter for statistics usage is "Get".
++
++Code Examples:
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# Get Level 2 stats for Channel 0, Queue 0
++HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
++
++# Get Level 4 stats
++HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
++@endcode
++
++The information returned in the Value parameter of @c Control() is an
++array of pointers to strings. The pointers are arranged in pairs.
++The first pointer is a pointer to a name string for a particular statistic.
++The next pointer is a pointer to a string containing the representation of
++the integer statistic value corresponding to the first pointer. This is followed
++by another pair of pointers, and so on, until a NULL pointer is encountered. The
++following is example code for processing the statistics data. Note that the OS
++is responsible for freeing the memory passed back through the Value parameter of
++@c Control().
++
++@code
++unsigned int *StatsData;
++
++# Get Level 0 stats for Channel 1
++HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
++
++# output Statistics data
++PrintStats(StatsData);
++
++# the upper layer is responsible for freeing stats info
++free(&StatsPtr);
++
++...
++
++void PrintStats(unsigned int *StatsPtr)
++ {
++ while(*StatsPtr)
++ {
++ printf("%20s:", (char *)*StatsPtr);
++ StatsPtr++;
++ printf("%11s\n", (char *)*StatsPtr);
++ StatsPtr++;
++ }
++ MySioFlush();
++ }
++@endcode
++
++Within each statistics level, there are several statistics defined. The statistics that
++are common to every CPPI module are listed below. In addition, each module may define
++extra statistics in each level, which will be documented within the module-specific
++documentation appendices.
++
++- Level 0 Statistics
++ - All level 0 statistics are module-specific.
++- Level 1 Statistics (CPHAL Software Statistics)
++ - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
++ - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
++transmitting the previous last packet in the queue (per channel and queue).
++ - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
++reception of the previous last packet in the queue (per channel).
++ - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
++ - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
++ - RxPacketsServiced: Number of received packets (per channel).
++ - TxPacketsServiced: Number of transmitted packets (per channel and queue).
++ - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
++ - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
++ - RxTotal: Total number of received packets, all channels.
++ - TxTotal: Total number of transmitted packets, all channels and queues.
++- Level 2 Statistics (CPHAL Flags)
++ - RcbPool: Pointer to receive descriptor pool (per channel).
++ - RxActQueueCount: Number of buffers currently available for receive (per channel).
++ - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
++ - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
++ - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
++ - RcbStart: Pointer to block of receive descriptors.
++ - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
++ - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
++ - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
++ - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
++ - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
++ - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
++ - TcbStart: Pointer to block of transmit descriptors.
++ - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
++- Level 3 Statistics (CPHAL Channel Configuration)
++ - RxBufSize: Rx buffer size.
++ - RxBufferOffset: Rx buffer offset.
++ - RxNumBuffers: Number of Rx buffers.
++ - RxServiceMax: Maximum number of receive packets to service at a time.
++ - TxNumBuffers: Number of Tx buffer descriptors.
++ - TxNumQueues: Number of Tx queues to use.
++ - TxServiceMax: Maximum number of transmit packets to service at a time.
++- Level 4 Statistics (CPHAL General Configuration)
++ - Base Address: Base address of the module.
++ - Offset (VLYNQ): VLYNQ relative module offset.
++ - Interrupt Line: Interrupt number.
++ - Debug: Debug flag, 1 to enable debug.
++ - Inst: Instance number.
++*/
++
++/*
++ Data Type 0 = int display
++ Data Type 1 = hex display
++ Data Type 2 = channel structure, int display
++ Data Type 3 = queue index and int display
++ Data Type 4 = queue index and hex display
++*/
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
++static STATS_TABLE StatsTable0[] =
++ {
++#ifdef _CPHAL_AAL5
++ /* Name , Data Ptr, Data Type */
++ {"Crc Errors", 0, 0},
++ {"Len Errors", 0, 0},
++ {"Abort Errors", 0, 0},
++ {"Starv Errors", 0, 0}
++#endif
++#ifdef _CPHAL_CPMAC
++ {"Rx Good Frames", 0, 0}
++#endif
++ };
++
++static STATS_TABLE StatsTable1[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"DmaLenErrors", 0, 0},
++ {"TxMisQCnt", 0, 3},
++ {"RxMisQCnt", 0, 0},
++ {"TxEOQCnt", 0, 3},
++ {"RxEOQCnt", 0, 0},
++ {"RxPacketsServiced", 0, 0},
++ {"TxPacketsServiced", 0, 3},
++ {"RxMaxServiced", 0, 0},
++ {"TxMaxServiced", 0, 3},
++ {"RxTotal", 0, 0},
++ {"TxTotal", 0, 0},
++ };
++
++static STATS_TABLE StatsTable2[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RcbPool", 0, 1},
++ {"RxActQueueCount", 0, 0},
++ {"RxActQueueHead", 0, 1},
++ {"RxActQueueTail", 0, 1},
++ {"RxActive", 0, 0},
++ {"RcbStart", 0, 1},
++ {"RxTeardownPending", 0, 0},
++ {"TcbPool", 0, 4},
++ {"TxActQueueCount", 0, 3},
++ {"TxActQueueHead", 0, 4},
++ {"TxActQueueTail", 0, 4},
++ {"TxActive", 0, 3},
++ {"TcbStart", 0, 4},
++ {"TxTeardownPending", 0, 0}
++ };
++
++static STATS_TABLE StatsTable3[] =
++ {
++ /* Name , Data Ptr, Data Type */
++ {"RxBufSize", 0, 2},
++ {"RxBufferOffset", 0, 2},
++ {"RxNumBuffers", 0, 2},
++ {"RxServiceMax", 0, 2},
++ {"TxNumBuffers", 0, 2},
++ {"TxNumQueues", 0, 2},
++ {"TxServiceMax", 0, 2},
++#ifdef _CPHAL_AAL5
++ {"CpcsUU", 0, 2},
++ {"Gfc", 0, 2},
++ {"Clp", 0, 2},
++ {"Pti", 0, 2},
++ {"DaMask", 0, 2},
++ {"Priority", 0, 2},
++ {"PktType", 0, 2},
++ {"Vci", 0, 2},
++ {"Vpi", 0, 2},
++ {"CellRate", 0, 2},
++ {"QosType", 0, 2},
++ {"Mbs", 0, 2},
++ {"Pcr", 0, 2}
++#endif
++ };
++
++static STATS_TABLE StatsTable4[] =
++ {
++ {"Base Address", 0, 1},
++ {"Offset (VLYNQ)", 0, 0},
++ {"Interrupt Line", 0, 0},
++ {"Debug", 0, 0},
++ {"Instance", 0, 0},
++#ifdef _CPHAL_AAL5
++ {"UniNni", 0, 0}
++#endif
++ };
++
++static STATS_DB StatsDb[] =
++ {
++ {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
++ {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
++ {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
++ {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
++ {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
++ };
++#endif /* +GSG 030307 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void resetWait(HAL_DEVICE *HalDev)
++ { /*+RC3.02*/
++ const int TickReset=64;
++ osfuncSleep((int*)&TickReset);
++ } /*+RC3.02*/
++#endif /* +RC 3.02 */
++
++/* I only define the reset base function for the modules
++ that can perform a reset. The AAL5 and AAL2 modules
++ do not perform a reset, that is done by the shared module
++ CPSAR */
++#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
++/*
++ * Determines the reset register address to be used for a particular device.
++ * It will search the current device entry for Locator information. If the
++ * device is a root device, there will be no Locator information, and the
++ * function will find and return the root reset register. If a Locator value
++ * is found, the function will search each VLYNQ device entry in the system
++ * looking for a matching Locator. Once it finds a VLYNQ device entry with
++ * a matching Locator, it will extract the "ResetBase" parameter from that
++ * VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param ResetBase Pointer to integer address of reset register.
++ *
++ * @return 0 OK, Non-zero not OK
++ */
++static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
++ {
++ char *DeviceInfo = HalDev->DeviceInfo;
++ char *MyLocator, *NextLocator;
++ int Inst=1;
++ bit32u error_code;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
++ if (error_code)
++ {
++ /* if no Locator value, device is on the root, so get the "reset" device */
++ error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
++ if (error_code)
++ {
++ return(EC_VAL_DEVICE_NOT_FOUND);
++ }
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ /* we have a Locator value, so the device is remote */
++
++ /* Find a vlynq device with a matching locator value */
++ while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
++ if (error_code)
++ {
++ /* no Locator value for this VLYNQ, so move on */
++ continue;
++ }
++ if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
++ {
++ /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
++ if (error_code)
++ {
++ return(EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
++
++ /* found base address for root device, so we're done */
++ return (EC_NO_ERRORS);
++ }
++ Inst++;
++ } /* while */
++ } /* else */
++
++ return (EC_NO_ERRORS);
++ }
++#endif
++
++#ifndef _CPHAL_AAL2 /* + RC 3.02 */
++static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
++ {
++ bit32u ParmValue;
++ bit32 error_code;
++ char *DeviceInfo = HalDev->DeviceInfo;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
++ }
++ HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
++
++#ifndef _CPHAL_AAL5
++#ifndef _CPHAL_AAL2
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
++ if(error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
++ }
++ HalDev->ResetBit = ParmValue;
++
++ /* Get reset base address */
++ error_code = ResetBaseGet(HalDev, &ParmValue);
++ if (error_code)
++ return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
++ HalDev->ResetBase = ParmValue;
++#endif
++#endif
++
++#ifndef _CPHAL_CPSAR
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
++ }
++ HalDev->interrupt = ParmValue;
++#endif
++
++ /* only look for the offset if there is a Locator field, which indicates that
++ the module is a VLYNQ module */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
++ if (!error_code)
++ {
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
++ if (error_code)
++ {
++ return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
++ }
++ HalDev->offset = ParmValue;
++ }
++ else
++ HalDev->offset = 0;
++
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
++ if (!error_code) HalDev->debug = ParmValue;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC /* +RC 3.02 */
++static void StatsInit(HAL_DEVICE *HalDev) /* +() RC3.02 */
++ {
++ /* even though these statistics may be for multiple channels and
++ queues, i need only configure the pointer to the beginning
++ of the array, and I can index from there if necessary */
++
++#ifdef _CPHAL_AAL5
++ StatsTable0[0].StatPtr = &HalDev->Stats.CrcErrors[0];
++ StatsTable0[1].StatPtr = &HalDev->Stats.LenErrors[0];
++ StatsTable0[2].StatPtr = &HalDev->Stats.AbortErrors[0];
++ StatsTable0[3].StatPtr = &HalDev->Stats.StarvErrors[0];
++
++ StatsTable1[0].StatPtr = &HalDev->Stats.DmaLenErrors[0];
++ StatsTable1[1].StatPtr = &HalDev->Stats.TxMisQCnt[0][0];
++ StatsTable1[2].StatPtr = &HalDev->Stats.RxMisQCnt[0];
++ StatsTable1[3].StatPtr = &HalDev->Stats.TxEOQCnt[0][0];
++ StatsTable1[4].StatPtr = &HalDev->Stats.RxEOQCnt[0];
++ StatsTable1[5].StatPtr = &HalDev->Stats.RxPacketsServiced[0];
++ StatsTable1[6].StatPtr = &HalDev->Stats.TxPacketsServiced[0][0];
++ StatsTable1[7].StatPtr = &HalDev->Stats.RxMaxServiced;
++ StatsTable1[8].StatPtr = &HalDev->Stats.TxMaxServiced[0][0];
++ StatsTable1[9].StatPtr = &HalDev->Stats.RxTotal;
++ StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
++#endif
++
++#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
++ StatsTable2[0].StatPtr = (bit32u *)&HalDev->RcbPool[0];
++ StatsTable2[1].StatPtr = &HalDev->RxActQueueCount[0];
++ StatsTable2[2].StatPtr = (bit32u *)&HalDev->RxActQueueHead[0];
++ StatsTable2[3].StatPtr = (bit32u *)&HalDev->RxActQueueTail[0];
++ StatsTable2[4].StatPtr = &HalDev->RxActive[0];
++ StatsTable2[5].StatPtr = (bit32u *)&HalDev->RcbStart[0];
++ StatsTable2[6].StatPtr = &HalDev->RxTeardownPending[0];
++ StatsTable2[7].StatPtr = (bit32u *)&HalDev->TcbPool[0][0];
++ StatsTable2[8].StatPtr = &HalDev->TxActQueueCount[0][0];
++ StatsTable2[9].StatPtr = (bit32u *)&HalDev->TxActQueueHead[0][0];
++ StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
++ StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
++ StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
++ StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
++
++ StatsTable3[0].StatPtr = &HalDev->ChData[0].RxBufSize;
++ StatsTable3[1].StatPtr = &HalDev->ChData[0].RxBufferOffset;
++ StatsTable3[2].StatPtr = &HalDev->ChData[0].RxNumBuffers;
++ StatsTable3[3].StatPtr = &HalDev->ChData[0].RxServiceMax;
++ StatsTable3[4].StatPtr = &HalDev->ChData[0].TxNumBuffers;
++ StatsTable3[5].StatPtr = &HalDev->ChData[0].TxNumQueues;
++ StatsTable3[6].StatPtr = &HalDev->ChData[0].TxServiceMax;
++#ifdef _CPHAL_AAL5
++ StatsTable3[7].StatPtr = &HalDev->ChData[0].CpcsUU;
++ StatsTable3[8].StatPtr = &HalDev->ChData[0].Gfc;
++ StatsTable3[9].StatPtr = &HalDev->ChData[0].Clp;
++ StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
++ StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
++ StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
++ StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
++ StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
++ StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
++ StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
++ StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
++ StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
++ StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
++#endif
++#endif
++
++ StatsTable4[0].StatPtr = &HalDev->dev_base;
++ StatsTable4[1].StatPtr = &HalDev->offset;
++ StatsTable4[2].StatPtr = &HalDev->interrupt;
++ StatsTable4[3].StatPtr = &HalDev->debug;
++ StatsTable4[4].StatPtr = &HalDev->Inst;
++ }
++#endif /* +RC 3.02 */
++
++#ifndef _CPHAL_CPSAR /* +RC 3.02 */
++#ifndef _CPHAL_AAL2 /* +RC 3.02 */
++/*
++ * Returns statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0
++ */
++static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
++ {
++ int Size;
++ bit32u *AddrPtr;
++ char *DataPtr;
++ STATS_TABLE *StatsTable;
++ int i, NumberOfStats;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
++ (bit32u)HalDev, (bit32u)StatPtr);
++ osfuncSioFlush();
++ }
++#endif
++
++ StatsTable = StatsDb[Index].StatTable;
++ NumberOfStats = StatsDb[Index].NumberOfStats;
++
++ Size = sizeof(bit32u)*((NumberOfStats*2)+1);
++ Size += (NumberOfStats*11);
++ *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
++
++ AddrPtr = (bit32u *) *StatPtr;
++ DataPtr = (char *)AddrPtr;
++ DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
++
++ for (i=0; i<NumberOfStats; i++)
++ {
++ *AddrPtr++ = (bit32u)StatsTable[i].StatName;
++ *AddrPtr++ = (bit32u)DataPtr;
++ if (&StatsTable[i].StatPtr[Ch] != 0)
++ {
++ switch(StatsTable[i].DataType)
++ {
++ case 0:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 1:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
++ break;
++ case 2:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
++ break;
++ case 3:
++ HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ case 4:
++ HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
++ break;
++ default:
++ /* invalid data type, due to CPHAL programming error */
++ break;
++ }
++ }
++ else
++ {
++ /* invalid statistics pointer, probably was not initialized */
++ }
++ DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
++ }
++
++ *AddrPtr = (bit32u) 0;
++
++ return (EC_NO_ERRORS);
++ }
++#endif /* +RC 3.02 */
++#endif /* +RC 3.02 */
++
++#ifdef _CPHAL_CPMAC
++static void gpioFunctional(int base, int bit)
++ { /*+RC3.02*/
++ bit32u GpioEnr = base + 0xC;
++ /* To make functional, set to zero */
++ *(volatile bit32u *)(GpioEnr) &= ~(1 << bit); /*+RC3.02*/
++ } /*+RC3.02*/
++
++
++/*+RC3.02*/
++/* Common function, Checks to see if GPIO should be in functional mode */
++static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
++ { /*+RC3.02*/
++ int rc;
++ void *DeviceInfo;
++ char *pszMuxBits;
++ char pszMuxBit[20];
++ char *pszTmp;
++ char szMuxBit[20];
++ char *ptr;
++ int base;
++ int reset_bit;
++ int bit;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
++ if(rc) return;
++ /* gpio entry found, get GPIO register info and make functional */
++
++ /* temp copy until FinParmValue fixed */
++ ptr = &szMuxBit[0];
++ while ((*ptr++ = *pszTmp++));
++
++ pszMuxBits = &szMuxBit[0];
++
++ rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
++ if(rc) return;
++
++ rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
++ if(rc) return;
++
++ /* If GPIO still in reset, then exit */
++ if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
++ return;
++ /* format for gpio_mux is gpio_mux = <int>;<int>;<int>...*/
++ while (*pszMuxBits)
++ {
++ pszTmp = &pszMuxBit[0];
++ if(*pszMuxBits == ';') pszMuxBits++;
++ while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
++ {
++ osfuncSioFlush();
++ /*If value not a number, skip */
++ if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
++ pszMuxBits++;
++ else
++ *pszTmp++ = *pszMuxBits++;
++ }
++ *pszTmp = '\0';
++ bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
++ gpioFunctional(base, bit);
++ resetWait(HalDev); /* not sure if this is needed */
++ }
++ } /*+RC3.02*/
++#endif /* CPMAC */
++
++#ifdef _CPHAL_AAL5
++const char hcSarFrequency[] = "SarFreq";
++#endif
++
++#endif /* _INC */
+diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h
+--- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h 2005-07-10 08:02:01.423114552 +0200
+@@ -0,0 +1,79 @@
++#ifndef _INC_CPCOMMON_H
++#define _INC_CPCOMMON_H
++
++#define VOLATILE32(addr) (*(volatile bit32u *)(addr))
++#ifndef dbgPrintf
++#define dbgPrintf HalDev->OsFunc->Printf
++#endif
++
++#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
++
++#define DBG(level) (HalDev->debug & (1<<(level)))
++/*
++#define DBG0() DBG(0)
++#define DBG1() DBG(1)
++#define DBG2() DBG(2)
++#define DBG3() DBG(3)
++#define DBG4() DBG(4)
++#define DBG5() DBG(5)
++#define DBG6() DBG(6)
++#define DBG7() DBG(7)
++*/
++
++/*
++ * List of defined actions for use with Control().
++ */
++typedef enum
++ {
++ enGET=0, /**< Get the value associated with a key */
++ enSET, /**< Set the value associates with a key */
++ enCLEAR, /**<Clear the value */
++ enNULL /**< No data action, used to initiate a service or send a message */
++ }ACTION;
++
++/*
++ * Enumerated hardware states.
++ */
++typedef enum
++ {
++ enConnected=1, enDevFound, enInitialized, enOpened
++ }DEVICE_STATE;
++
++typedef enum
++ {
++ enCommonStart=0,
++ /* General */
++ enOff, enOn, enDebug,
++ /* Module General */
++ enCpuFreq,
++ enStatus,
++ enCommonEnd
++ }COMMON_KEY;
++
++typedef struct
++ {
++ const char *strKey;
++ int enKey;
++ }CONTROL_KEY;
++
++typedef struct
++ {
++ char *StatName;
++ unsigned int *StatPtr;
++ int DataType; /* 0: int, 1: hex int, 2:channel data */
++ }STATS_TABLE;
++
++typedef struct
++ {
++ int NumberOfStats;
++ STATS_TABLE *StatTable;
++ }STATS_DB;
++
++#define osfuncSioFlush() HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
++#define osfuncSleep(Ticks) HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
++#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
++
++#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
++
++#endif
++
+diff -urN linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c
+--- linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c 2005-07-10 08:02:01.425114248 +0200
+@@ -0,0 +1,1483 @@
++/*************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cppi.c
++ *
++ * DESCRIPTION:
++ * This file contains shared code for all CPPI modules.
++ *
++ * HISTORY:
++ * 7Aug02 Greg RC1.00 Original Version created.
++ * 27Sep02 Mick RC1.01 Merged for use by CPMAC/CPSAR
++ * 16Oct02 Mick RC1.02 Performance Tweaks (see cppihist.txt)
++ * 12Nov02 Mick RC1.02 Updated to use cpmac_reg.h
++ * 09Jan03 Mick RC3.01 Removed modification to RxBuffer ptr
++ * 28Mar03 Mick 1.03 RxReturn now returns error if Malloc Fails
++ * 10Apr03 Mick 1.03.02 Added Needs Buffer Support
++ * 11Jun03 Mick 1.06.02 halSend() errors corrected
++ *
++ * @author Greg Guyotte
++ * @version 1.00
++ * @date 7-Aug-2002
++ *****************************************************************************/
++/* each CPPI module must modify this file, the rest of the
++ code in cppi.c should be totally shared *//* Each CPPI module MUST properly define all constants shown below */
++
++/* CPPI registers */
++
++/* the following defines are not CPPI specific, but still used by cppi.c */
++
++static void FreeRx(HAL_DEVICE *HalDev, int Ch)
++ {
++ HAL_RCB *rcb_ptr; /*+GSG 030303*/
++ int rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf; /*+GSG 030303*/
++ int Num = HalDev->ChData[Ch].RxNumBuffers, i; /*+GSG 030303*/
++
++ /* Free Rx data buffers attached to descriptors, if necessary */
++ if (HalDev->RcbStart[Ch] != 0) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ for(i=0;i<Num;i++) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ rcb_ptr = (HAL_RCB *)(HalDev->RcbStart[Ch] + (i*rcbSize)); /*+GSG 030303*/
++
++ /* free the data buffer */
++ if (rcb_ptr->DatPtr != 0)
++ {
++
++ HalDev->OsFunc->FreeRxBuffer((void *)rcb_ptr->OsInfo, (void *)rcb_ptr->DatPtr);
++ rcb_ptr->OsInfo=0; /*MJH+030522*/
++ rcb_ptr->DatPtr=0; /*MJH+030522*/
++ }
++ } /*+GSG 030303*/
++ } /*+GSG 030303*/
++
++ /* free up all desciptors at once */
++ HalDev->OsFunc->FreeDmaXfer(HalDev->RcbStart[Ch]);
++
++ /* mark buffers as freed */
++ HalDev->RcbStart[Ch] = 0;
++ }
++
++static void FreeTx(HAL_DEVICE *HalDev, int Ch, int Queue)
++ {
++
++/*+GSG 030303*/
++
++ /* free all descriptors at once */
++ HalDev->OsFunc->FreeDmaXfer(HalDev->TcbStart[Ch][Queue]);
++
++ HalDev->TcbStart[Ch][Queue] = 0;
++ }
++
++/* return of 0 means that this code executed, -1 means the interrupt was not
++ a teardown interrupt */
++static int RxTeardownInt(HAL_DEVICE *HalDev, int Ch)
++ {
++ bit32u base = HalDev->dev_base;
++
++ int i;
++ volatile bit32u *pTmp;
++
++ /* check to see if the interrupt is a teardown interrupt */
++ if (((*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) & TEARDOWN_VAL) == TEARDOWN_VAL)
++ {
++ /* finish channel teardown */
++
++ /* Free channel resources on a FULL teardown */
++ if (HalDev->RxTeardownPending[Ch] & FULL_TEARDOWN)
++ {
++ FreeRx(HalDev, Ch);
++ }
++
++ /* bug fix - clear Rx channel pointers on teardown */
++ HalDev->RcbPool[Ch] = 0;
++ HalDev->RxActQueueHead[Ch] = 0;
++ HalDev->RxActQueueCount[Ch] = 0;
++ HalDev->RxActive[Ch] = FALSE;
++
++ /* write completion pointer */
++ (*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) = TEARDOWN_VAL;
++
++ /* use direction bit as a teardown pending bit! May be able to
++ use only one teardown pending integer in HalDev */
++
++ HalDev->RxTeardownPending[Ch] &= ~RX_TEARDOWN;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
++
++ /* call OS Teardown Complete (if TX is also done) */
++ if ((HalDev->TxTeardownPending[Ch] & TX_TEARDOWN) == 0)
++ {
++ /* mark channel as closed */
++ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
++
++ /* disable channel interrupt */
++ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
++ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
++ SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
++
++ /* Clear PDSP Channel State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
++ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
++ *pTmp++ = 0;
++
++ if ((HalDev->RxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
++ {
++
++ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
++ }
++ /* clear all teardown pending information for this channel */
++ HalDev->RxTeardownPending[Ch] = 0;
++ HalDev->TxTeardownPending[Ch] = 0;
++ }
++
++ return (EC_NO_ERRORS);
++ }
++ return (-1);
++ }
++
++/* return of 0 means that this code executed, -1 means the interrupt was not
++ a teardown interrupt */
++static int TxTeardownInt(HAL_DEVICE *HalDev, int Ch, int Queue)
++ {
++ bit32u base = HalDev->dev_base;
++ HAL_TCB *Last, *Curr, *First; /*+GSG 030303*/
++
++ int i;
++ volatile bit32u *pTmp;
++
++ if (((*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) & TEARDOWN_VAL) == TEARDOWN_VAL)
++ {
++ /* return outstanding buffers to OS +RC3.02*/
++ Curr = HalDev->TxActQueueHead[Ch][Queue]; /*+GSG 030303*/
++ First = Curr; /*+GSG 030303*/
++ while (Curr) /*+GSG 030303*/
++ { /*+GSG 030303*/
++ /* Pop TCB(s) for packet from the stack */ /*+GSG 030303*/
++ Last = Curr->Eop; /*+GSG 030303*/
++ HalDev->TxActQueueHead[Ch][Queue] = Last->Next; /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* return to OS */ /*+GSG 030303*/
++ HalDev->OsFunc->SendComplete(Curr->OsInfo); /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* Push Tcb(s) back onto the stack */ /*+GSG 030303*/
++ Curr = Last->Next; /*+GSG 030303*/
++ Last->Next = HalDev->TcbPool[Ch][Queue]; /*+GSG 030303*/
++ HalDev->TcbPool[Ch][Queue] = First; /*+GSG 030303*/
++ /*+GSG 030303*/
++ /* set the first(SOP) pointer for the next packet */ /*+GSG 030303*/
++ First = Curr; /*+GSG 030303*/
++ } /*+GSG 030303*/
++
++ /* finish channel teardown */
++
++ /* save the OsInfo to pass to upper layer
++ THIS WAS CRASHING - because it's possible that I get the teardown
++ notification and the TcbHPool is null. In this case, the buffers
++ to free can be found in the TxHActiveQueue. If I need to get OsInfo
++ in the future, I can get it from one of those buffers.
++ OsInfo = HalDev->TcbHPool[Ch]->OsInfo; */
++
++ if (HalDev->TxTeardownPending[Ch] & FULL_TEARDOWN)
++ {
++ FreeTx(HalDev, Ch, Queue);
++ } /* if FULL teardown */
++
++ /* bug fix - clear Tx channel pointers on teardown */
++ HalDev->TcbPool[Ch][Queue] = 0;
++ HalDev->TxActQueueHead[Ch][Queue] = 0;
++ HalDev->TxActQueueCount[Ch][Queue] = 0;
++ HalDev->TxActive[Ch][Queue] = FALSE;
++
++ /* write completion pointer */
++ (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) = TEARDOWN_VAL;
++
++ /* no longer pending teardown */
++ HalDev->TxTeardownPending[Ch] &= ~TX_TEARDOWN;
++
++ HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
++
++ /* call OS Teardown Complete (if Rx is also done) */
++ if ((HalDev->RxTeardownPending[Ch] & RX_TEARDOWN) == 0)
++ {
++ /* mark channel as closed */
++ HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
++
++ /* disable channel interrupt */
++ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
++ SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
++ SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
++
++ /* Clear PDSP Channel State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
++ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
++ *pTmp++ = 0;
++
++ if ((HalDev->TxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
++ {
++
++ HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
++ }
++
++ /* clear all teardown pending information for this channel */
++ HalDev->RxTeardownPending[Ch] = 0;
++ HalDev->TxTeardownPending[Ch] = 0;
++ }
++
++ return (EC_NO_ERRORS);
++ }
++ return (-1);
++ }
++
++/* +GSG 030421 */
++static void AddToRxQueue(HAL_DEVICE *HalDev, HAL_RCB *FirstRcb, HAL_RCB *LastRcb, int FragCount, int Ch)
++ {
++ HAL_RCB *OldTailRcb;
++
++ if (HalDev->RxActQueueCount[Ch]==0)
++ {
++
++ HalDev->RxActQueueHead[Ch]=FirstRcb;
++ HalDev->RxActQueueTail[Ch]=LastRcb;
++ HalDev->RxActQueueCount[Ch]=FragCount;
++ if ((!HalDev->InRxInt[Ch])&&(!HalDev->RxActive[Ch]))
++ {
++ /* write Rx Queue Head Descriptor Pointer */
++ (*(pRX_DMA_STATE_WORD_1( HalDev->dev_base )+( Ch *64))) = VirtToPhys(FirstRcb) - HalDev->offset;
++ HalDev->RxActive[Ch]=TRUE;
++ }
++ }
++ else
++ {
++
++ OldTailRcb=HalDev->RxActQueueTail[Ch];
++ OldTailRcb->Next=(void *)FirstRcb;
++
++ /* Emerald fix 10/29 (Denis) */
++ *((bit32u *) VirtToVirtNoCache(&OldTailRcb->HNext))=VirtToPhys(FirstRcb) - HalDev->offset;
++
++ HalDev->RxActQueueTail[Ch]=LastRcb;
++ HalDev->RxActQueueCount[Ch]+=FragCount;
++ }
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function is called to indicate to the CPHAL that the upper layer
++ * software has finished processing the receive data (given to it by
++ * osReceive()). The CPHAL will then return the appropriate receive buffers
++ * and buffer descriptors to the available pool.
++ *
++ * @param HalReceiveInfo Start of receive buffer descriptor chain returned to
++ * CPHAL.
++ * @param StripFlag Flag indicating whether the upper layer software has
++ * retained ownership of the receive data buffers.
++ *<BR>
++ * 'FALSE' means that the CPHAL can reuse the receive data buffers.
++ *<BR>
++ * 'TRUE' : indicates the data buffers were retained by the OS
++ *<BR>
++ * NOTE: If StripFlag is TRUE, it is the responsibility of the upper layer software to free the buffers when they are no longer needed.
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_RCB_NEEDS_BUFFER "EC_VAL_RCB_NEEDS_BUFFER"<BR>
++ * @ref EC_VAL_RCB_DROPPED "EC_VAL_RCB_DROPPED"<BR>
++ */
++static int halRxReturn(HAL_RECEIVEINFO *HalReceiveInfo,
++ int StripFlag)
++ {
++ int Ch = HalReceiveInfo->Ch, i;
++ HAL_RCB *LastRcb, *TempRcb;
++ char *pBuf;
++ HAL_RCB *CurrHeadRcb = HalReceiveInfo, *LastGoodRcb=0; /* +GSG 030421 */
++ HAL_DEVICE *HalDev = HalReceiveInfo->HalDev;
++ int RcbSize = HalDev->ChData[Ch].RxBufSize;
++ int FragCount = HalReceiveInfo->FragCount;
++ int rc=0; /*MJH+030417*/
++ int GoodCount=0; /*GSG+030421*/
++
++ if (HalDev->State != enOpened)
++ return(EC_AAL5 |EC_FUNC_RXRETURN|EC_VAL_INVALID_STATE);
++
++ LastRcb=(HAL_RCB *)HalReceiveInfo->Eop;
++ LastRcb->HNext=0;
++ LastRcb->Next=0;
++
++ if (FragCount>1)
++ {
++ LastRcb->Off_BLen=RcbSize;
++ LastRcb->mode=CB_OWNERSHIP_BIT;
++ }
++
++ HalReceiveInfo->Off_BLen=RcbSize;
++ HalReceiveInfo->mode=CB_OWNERSHIP_BIT;
++
++ /* If OS has kept the buffers for this packet, attempt to alloc new buffers */
++ if (StripFlag)
++ {
++ TempRcb = HalReceiveInfo;
++ for (i=0; i<FragCount; i++)
++ {
++ if (TempRcb == 0)
++ {
++ dbgPrintf("Rx Return error while allocating new buffers\n");
++ dbgPrintf("Rcb = %08x, Rcb->Eop = %08x, FragCount = %d:%d\n",
++ (bit32u)HalReceiveInfo, (bit32u)HalReceiveInfo->Eop, FragCount,i);
++ osfuncSioFlush();
++
++ return(EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_CORRUPT_RCB_CHAIN);
++ }
++
++ /* size = ((RcbSize+15) & ~15) + 15;*/ /*-3.01b*/
++ /*size = RcbSize + 15;*/ /* -GSG 030421 */
++ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(RcbSize,0,
++ 0xF,HalDev->ChData[Ch].OsSetup,
++ (void *)TempRcb,
++ (void *)&TempRcb->OsInfo,
++ (void *) HalDev->OsDev);
++ if (!pBuf)
++ {
++ /* malloc failed, add this RCB to Needs Buffer List */
++ TempRcb->FragCount = 1; /*MJH+030417*/
++ (HAL_RCB *)TempRcb->Eop = TempRcb; /* GSG +030430 */
++
++ if(HalDev->NeedsCount < MAX_NEEDS) /* +MJH 030410 */
++ { /* +MJH 030410 */
++ HalDev->Needs[HalDev->NeedsCount] = (HAL_RECEIVEINFO *) TempRcb; /* +MJH 030410 */
++ HalDev->NeedsCount++; /* +MJH 030410 */
++ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_NEEDS_BUFFER); /* ~MJH 030417 */
++ } /* +MJH 030410 */
++ else /* +MJH 030410 */
++ rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_DROPPED); /* ~MJH 030417 */
++
++ /* requeue any previous RCB's that were ready to go before this one */
++ if (GoodCount > 0) /* +GSG 030421 */
++ { /* +GSG 030421 */
++ LastGoodRcb->HNext=0; /* +GSG 030430 */
++ LastGoodRcb->Next=0; /* +GSG 030430 */
++ osfuncDataCacheHitWriteback((void *)LastGoodRcb, 16); /* +GSG 030430 */
++
++ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
++ GoodCount = 0; /* +GSG 030421 */
++ } /* +GSG 030421 */
++
++ CurrHeadRcb = TempRcb->Next; /* +GSG 030421 */
++ }
++ else /* +GSG 030421 */
++ { /* +GSG 030421 */
++ /* malloc succeeded, requeue the RCB to the hardware */
++ TempRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
++ TempRcb->DatPtr=pBuf;
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWriteback((void *)TempRcb, 16);
++
++ /* i store the last good RCB in case the malloc fails for the
++ next fragment. This ensures that I can go ahead and return
++ a partial chain of RCB's to the hardware */
++ LastGoodRcb = TempRcb; /* +GSG 030421 */
++ GoodCount++; /* +GSG 030421 */
++ } /* +GSG 030421 */
++ TempRcb = TempRcb->Next;
++ } /* end of Frag loop */
++ /* if there any good RCB's to requeue, do so here */
++ if (GoodCount > 0) /* +GSG 030421 */
++ {
++ AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch); /* +GSG 030421 */
++ }
++ return(rc); /* ~GSG 030421 */
++ }
++ else
++ {
++ /* Not Stripping */
++ /* Emerald */
++ /* Write Back SOP and last RCB */
++ osfuncDataCacheHitWriteback((void *)HalReceiveInfo, 16);
++
++ if (FragCount > 1)
++ {
++ osfuncDataCacheHitWriteback((void *)LastRcb, 16);
++ }
++ /* if not stripping buffers, always add to queue */
++ AddToRxQueue(HalDev, HalReceiveInfo, LastRcb, FragCount, Ch); /*MJH~030520*/
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/* +MJH 030410
++ Trys to liberate an RCB until liberation fails.
++ Note: If liberation fails then RxReturn will re-add the RCB to the
++ Needs list.
++*/
++static void NeedsCheck(HAL_DEVICE *HalDev)
++{
++ HAL_RECEIVEINFO* HalRcb;
++ int rc;
++ HalDev->OsFunc->CriticalOn();
++ while(HalDev->NeedsCount)
++ {
++ HalDev->NeedsCount--;
++ HalRcb = HalDev->Needs[HalDev->NeedsCount];
++ rc = halRxReturn(HalRcb, 1);
++ /* short circuit if RxReturn starts to fail */
++ if (rc != 0)
++ break;
++ }
++ HalDev->OsFunc->CriticalOff();
++}
++
++/*
++ * This function allocates transmit buffer descriptors (internal CPHAL function).
++ * It creates a high priority transmit queue by default for a single Tx
++ * channel. If QoS is enabled for the given CPHAL device, this function
++ * will also allocate a low priority transmit queue.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel number.
++ *
++ * @return 0 OK, Non-Zero Not OK
++ */
++static int InitTcb(HAL_DEVICE *HalDev, int Ch)
++ {
++ int i, Num = HalDev->ChData[Ch].TxNumBuffers;
++ HAL_TCB *pTcb=0;
++ char *AllTcb;
++ int tcbSize, Queue;
++ int SizeMalloc;
++
++ tcbSize = (sizeof(HAL_TCB)+0xf)&~0xf;
++ SizeMalloc = (tcbSize*Num)+0xf;
++
++ for (Queue=0; Queue < HalDev->ChData[Ch].TxNumQueues; Queue++)
++ {
++ if (HalDev->TcbStart[Ch][Queue] == 0)
++ {
++
++ /* malloc all TCBs at once */
++ AllTcb = (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
++ if (!AllTcb)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_TCB_MALLOC_FAILED);
++ }
++
++ HalDev->OsFunc->Memset(AllTcb, 0, SizeMalloc);
++
++ /* keep this address for freeing later */
++ HalDev->TcbStart[Ch][Queue] = AllTcb;
++ }
++ else
++ {
++ /* if the memory has already been allocated, simply reuse it! */
++ AllTcb = HalDev->TcbStart[Ch][Queue];
++ }
++
++ /* align to cache line */
++ AllTcb = (char *)(((bit32u)AllTcb + 0xf) &~ 0xf); /*PITS #143 MJH~030522*/
++
++ /* default High priority transmit queue */
++ HalDev->TcbPool[Ch][Queue]=0;
++ for(i=0;i<Num;i++)
++ {
++ /*pTcb=(HAL_TCB *) OsFunc->MallocDmaXfer(sizeof(HAL_TCB),0,0xffffffff); */
++ pTcb= (HAL_TCB *)(AllTcb + (i*tcbSize));
++ pTcb->mode=0;
++ pTcb->BufPtr=0;
++ pTcb->Next=HalDev->TcbPool[Ch][Queue];
++ pTcb->Off_BLen=0;
++ HalDev->TcbPool[Ch][Queue]=pTcb;
++ }
++ /*HalDev->TcbEnd = pTcb;*/
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/*
++ * This function allocates receive buffer descriptors (internal CPHAL function).
++ * After allocation, the function 'queues' (gives to the hardware) the newly
++ * created receive buffers to enable packet reception.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel number.
++ *
++ * @return 0 OK, Non-Zero Not OK
++ */
++static int InitRcb(HAL_DEVICE *HalDev, int Ch)
++ {
++ int i, Num = HalDev->ChData[Ch].RxNumBuffers;
++ int Size = HalDev->ChData[Ch].RxBufSize;
++ HAL_RCB *pRcb;
++ char *pBuf;
++ char *AllRcb;
++ int rcbSize;
++ int DoMalloc = 0;
++ int SizeMalloc;
++ int MallocSize;
++
++ rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;
++ SizeMalloc = (rcbSize*Num)+0xf;
++
++ if (HalDev->RcbStart[Ch] == 0)
++ {
++ DoMalloc = 1;
++
++ /* malloc all RCBs at once */
++ AllRcb= (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
++ if (!AllRcb)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RCB_MALLOC_FAILED);
++ }
++
++ HalDev->OsFunc->Memset(AllRcb, 0, SizeMalloc);
++
++ /* keep this address for freeing later */
++ HalDev->RcbStart[Ch] = AllRcb;
++ }
++ else
++ {
++ /* if the memory has already been allocated, simply reuse it! */
++ AllRcb = HalDev->RcbStart[Ch];
++ }
++
++ /* align to cache line */
++ AllRcb = (char *)(((bit32u)AllRcb + 0xf)&~0xf); /*PITS #143 MJH~030522*/
++
++ HalDev->RcbPool[Ch]=0;
++ for(i=0;i<Num;i++)
++ {
++ pRcb = (HAL_RCB *)(AllRcb + (i*rcbSize));
++
++ if (DoMalloc == 1)
++ {
++
++ MallocSize = Size; /*~3.01 */
++ pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(MallocSize,0,0xF,HalDev->ChData[Ch].OsSetup, (void *)pRcb, (void *)&pRcb->OsInfo, (void *) HalDev->OsDev);
++ if(!pBuf)
++ {
++ return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RX_BUFFER_MALLOC_FAILED);
++ }
++ /* -RC3.01 pBuf = (char *)(((bit32u)pBuf+0xF) & ~0xF); */
++ pRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
++ pRcb->DatPtr=pBuf;
++ /*pRcb->BufSize=Size;*/
++ }
++ pRcb->mode=0;
++ pRcb->Ch=Ch;
++ pRcb->Next=(void *)HalDev->RcbPool[Ch];
++ pRcb->Off_BLen=0;
++ pRcb->HalDev = HalDev;
++ HalDev->RcbPool[Ch]=pRcb;
++ }
++
++ /* Give all of the Rx buffers to hardware */
++
++ while(HalDev->RcbPool[Ch])
++ {
++ pRcb=HalDev->RcbPool[Ch];
++ HalDev->RcbPool[Ch]=pRcb->Next;
++ pRcb->Eop=(void*)pRcb;
++ pRcb->FragCount=1;
++ halRxReturn((HAL_RECEIVEINFO *)pRcb, 0);
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function transmits the data in FragList using available transmit
++ * buffer descriptors. More information on the use of the Mode parameter
++ * is available in the module-specific appendices. Note: The OS should
++ * not call Send() for a channel that has been requested to be torndown.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param FragList Fragment List structure.
++ * @param FragCount Number of fragments in FragList.
++ * @param PacketSize Number of bytes to transmit.
++ * @param OsSendInfo OS Send Information structure. <BR>
++ * @param Mode 32-bit value with the following bit fields: <BR>
++ * 31-16: Mode (used for module specific data). <BR>
++ * 15-08: Queue (transmit queue to send on). <BR>
++ * 07-00: Channel (channel number to send on).
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_NOT_LINKED "EC_VAL_NOT_LINKED"<BR>
++ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
++ * @ref EC_VAL_OUT_OF_TCBS "EC_VAL_OUT_OF_TCBS"<BR>
++ * @ref EC_VAL_NO_TCBS "EC_VAL_NO_TCBS"<BR>
++ */
++static int halSend(HAL_DEVICE *HalDev,FRAGLIST *FragList,
++ int FragCount,int PacketSize, OS_SENDINFO *OsSendInfo,
++ bit32u Mode)
++ {
++ HAL_TCB *tcb_ptr, *head;
++ int i;
++ bit32u base = HalDev->dev_base;
++ int rc = EC_NO_ERRORS;
++ int Ch = Mode & 0xFF;
++ int Queue = (Mode>>8)&0xFF;
++
++ int WaitFlag = (Mode>>30)&1; /* This is for AAL5 testing only */ /* ~GSG 030508 */
++ int Offset = (FragList[0].len >> 16);
++ int PktType = (Mode>>16)&3; /* 0=AAL5, 1=Null AAL, 2=OAM, 3=Transparent */ /* +GSG 030508 */
++ int AtmHeaderInData = (Mode>>31)&1; /* +GSG 030508 */
++ int FragIndex = 0;
++
++ if (HalDev->State != enOpened)
++ return(EC_CPPI|EC_FUNC_SEND|EC_VAL_INVALID_STATE);
++
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0) /*MJH~030611*/ /*PITS 148*/
++ return(EC_AAL5 |EC_FUNC_SEND|EC_VAL_INVALID_CH); /*+GSG 030303*/
++
++ HalDev->OsFunc->CriticalOn();
++
++ tcb_ptr = head = HalDev->TcbPool[Ch][Queue];
++
++ if (tcb_ptr)
++ {
++
++ /* these two TCB words are only valid on SOP */
++ if (AtmHeaderInData == 1)
++ {
++ tcb_ptr->AtmHeader = 0; /* bug fix for transparent mode PTI problem */
++ /* Expect AtmHeader in the data */
++ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 24;
++ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 16;
++ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 8;
++ tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++);
++
++ /* decrement data buffer length accordingly */
++ FragList[FragIndex].len -= ATM_HEADER_SIZE;
++
++ /* if the first fragment was ATM Header only, go to next fragment for loop */
++ if (FragList[FragIndex].len == 0)
++ FragIndex++;
++
++ /* No CPCS_UU/CPI if not AAL5 */
++ tcb_ptr->Word5 = ((PktType & 0x3)<<16);
++ }
++ else
++ {
++ /* calculate AtmHeader from fields */
++ tcb_ptr->AtmHeader = atmheader(HalDev->ChData[Ch].Gfc, /* ~GSG 030306 */
++ HalDev->ChData[Ch].Vpi, HalDev->ChData[Ch].Vci,
++ HalDev->ChData[Ch].Pti, HalDev->ChData[Ch].Clp);
++
++ tcb_ptr->Word5 = HalDev->ChData[Ch].CpcsUU | ((HalDev->ChData[Ch].PktType &0x3)<<16);
++ }
++
++ for (i=FragIndex; i<FragCount; i++)
++
++ {
++ /* Setup Tx mode and size */
++ tcb_ptr->HNext = VirtToPhys((bit32 *)tcb_ptr->Next) - HalDev->offset;
++ tcb_ptr->Off_BLen = FragList[i].len;
++
++ if (i==0)
++ tcb_ptr->Off_BLen |= (Offset << 16);
++
++ tcb_ptr->mode = 0; /* MUST clear this for each frag !!! */
++ tcb_ptr->BufPtr = VirtToPhys((bit32 *)FragList[i].data) -
++ HalDev->offset;
++
++ /* first fragment */
++ if (i == 0)
++ {
++ tcb_ptr->mode |= CB_SOF_BIT;
++
++ }
++
++ tcb_ptr->mode |= (PacketSize | CB_OWNERSHIP_BIT);
++ tcb_ptr->OsInfo = OsSendInfo;
++
++ if (i == (FragCount - 1))
++ {
++ /* last fragment */
++ tcb_ptr->mode |= CB_EOF_BIT;
++
++ /* since this is the last fragment, set the TcbPool pointer before
++ nulling out the Next pointers */
++
++ HalDev->TcbPool[Ch][Queue] = tcb_ptr->Next;
++
++ tcb_ptr->Next = 0;
++ tcb_ptr->HNext = 0;
++
++ /* In the Tx Interrupt handler, we will need to know which TCB is EOP,
++ so we can save that information in the SOP */
++ head->Eop = tcb_ptr;
++
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
++
++ osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
++
++ }
++ else
++ {
++ /* Emerald fix 10/29 */
++ osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
++
++ osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
++
++ tcb_ptr = tcb_ptr->Next; /* what about the end of TCB list?? */
++
++ if (tcb_ptr == 0)
++ {
++ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_OUT_OF_TCBS;
++ goto ExitSend;
++ }
++ }
++ } /* for */
++
++ /* put it on the high priority queue */
++ if (HalDev->TxActQueueHead[Ch][Queue] == 0)
++ {
++ HalDev->TxActQueueHead[Ch][Queue]=head;
++ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
++/*+GSG 030303*//*+GSG 030303*/
++ if (!HalDev->TxActive[Ch][Queue])
++ {
++
++ if (!WaitFlag)
++ {
++
++ /* write CPPI TX HDP */
++ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue ))) = VirtToPhys(head) - HalDev->offset;
++ HalDev->TxActive[Ch][Queue]=TRUE;
++
++ }
++
++ }
++ }
++ else
++ {
++ HalDev->TxActQueueTail[Ch][Queue]->Next=head;
++ /* Emerald fix 10/29 */
++ *((bit32u *) VirtToVirtNoCache(&HalDev->TxActQueueTail[Ch][Queue]->HNext))=VirtToPhys(head) - HalDev->offset;
++ HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
++/*+GSG 030303*//*+GSG 030303*/
++ }
++ rc = EC_NO_ERRORS;
++ goto ExitSend;
++ } /* if (tcb_ptr) */
++ else
++ {
++ rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NO_TCBS;
++ goto ExitSend;
++ }
++ExitSend:
++
++ HalDev->OsFunc->CriticalOff();
++ return(rc);
++ }
++
++/*
++ * This function processes receive interrupts. It traverses the receive
++ * buffer queue, extracting the data and passing it to the upper layer software via
++ * osReceive(). It handles all error conditions and fragments without valid data by
++ * immediately returning the RCB's to the RCB pool.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel Number.
++ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
++ *
++ * @return 0 if OK, non-zero otherwise.
++ */
++static int RxInt(HAL_DEVICE *HalDev, int Ch, int *MoreWork)
++ {
++ HAL_RCB *CurrentRcb, *LastRcb=0, *SopRcb, *EofRcb, *EopRcb;
++ bit32u RxBufStatus,PacketsServiced, RxPktLen = 0, RxSopStatus,
++ FrmFrags, TotalFrags, CurrDmaLen, DmaLen, FrmLen;
++ int base = HalDev->dev_base, Ret;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++ int RxServiceMax = HalDev->ChData[Ch].RxServiceMax;
++ int FragIndex; /* +GSG 030508 */
++ int EarlyReturn = 0; /* +GSG 030521 */
++
++ bit32u PktType, ExpDmaSize, Cells;
++ int PassHeader=0;
++
++ int mode;
++
++ bit32u SopOffset;
++
++ if(HalDev->NeedsCount) /* +MJH 030410 */
++ NeedsCheck(HalDev); /* +MJH 030410 */
++
++ /* Handle case of teardown interrupt */
++ if (HalDev->RxTeardownPending[Ch] != 0)
++ {
++ Ret = RxTeardownInt(HalDev, Ch);
++ if (Ret == 0)
++ { /*+GSG 030303*/
++ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
++ return (EC_NO_ERRORS);
++ } /*+GSG 030303*/
++ }
++
++ CurrentRcb=HalDev->RxActQueueHead[Ch];
++
++ osfuncDataCacheHitInvalidate((void*)CurrentRcb, 16);
++
++ RxBufStatus=CurrentRcb->mode;
++
++ /* I think I need to do this to ensure that i read UuCpi properly,
++ which is on the second cache line of the Rcb */
++ osfuncDataCacheHitInvalidate((void*)((bit32u)CurrentRcb+16), 16);
++
++ PacketsServiced=0;
++ HalDev->InRxInt[Ch]=TRUE;
++
++ while((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)&&
++ (PacketsServiced<RxServiceMax)) /* ~GSG 030307 */
++ {
++
++ PacketsServiced++; /* ~GSG 030307 */
++ SopRcb=CurrentRcb;
++ RxSopStatus=RxBufStatus;
++
++ RxPktLen = RxSopStatus&CB_SIZE_MASK;
++ /* Not sure what MAC needs to do for next block */
++
++ PktType=((SopRcb->UuCpi & 0x00030000) >> 16); /* GSG ~030508 */
++ /* Calculate the expected DMA length */
++ if (RxPktLen != 0)
++ {
++ Cells=RxPktLen/48;
++ if ((RxPktLen%48) > 40)
++ Cells++;
++ if (PktType == PKT_TYPE_AAL5) /* ~GSG 030508 */
++ Cells++;
++ ExpDmaSize=Cells*48;
++ }
++ else
++ {
++ ExpDmaSize=0;
++ }
++
++ SopOffset=(SopRcb->Off_BLen&CB_OFFSET_MASK)>>16;
++
++ CurrDmaLen=0;
++ FrmFrags=0;
++ TotalFrags=0;
++ FragIndex=0;
++ FrmLen=0;
++ EofRcb=0;
++
++/* +GSG 030508 */
++ if ((PktType == PKT_TYPE_OAM) || (PktType == PKT_TYPE_TRANS)) /* +GSG 030508 */
++ { /* +GSG 030508 */
++ /* first frag is ATM Header */ /* +GSG 030508 */
++ PassHeader = 1; /* +GSG 030508 */
++ HalDev->fraglist[FragIndex].data = (void *)&SopRcb->AtmHeader; /* +GSG 030508 */
++ HalDev->fraglist[FragIndex].len = 4; /* +GSG 030508 */
++ HalDev->fraglist[FragIndex].OsInfo = SopRcb->OsInfo; /* +GSG 030701 */
++ FragIndex++; /* +GSG 030508 */
++ } /* +GSG 030508 */
++/* +GSG 030508 */
++
++ do
++ {
++
++ DmaLen=CurrentRcb->Off_BLen&CB_SIZE_MASK;
++
++ CurrDmaLen+=DmaLen;
++ FrmLen+=DmaLen;
++ TotalFrags++;
++ if (!EofRcb)
++ {
++ HalDev->fraglist[FragIndex].data=((char *)CurrentRcb->DatPtr); /* ~GSG 030508 */
++
++ HalDev->fraglist[FragIndex].data+=((FrmFrags==0)?SopOffset:0); /* ~GSG 030508 */
++
++ HalDev->fraglist[FragIndex].len=DmaLen; /* ~GSG 030508 */
++
++ /* GSG 12/9 */
++ HalDev->fraglist[FragIndex].OsInfo = CurrentRcb->OsInfo; /* ~GSG 030508 */
++
++ /* Upper layer must do the data invalidate */
++
++ FrmFrags++;
++ FragIndex++; /* ~GSG 030508 */
++ if (FrmLen>=RxPktLen)
++ EofRcb=CurrentRcb;
++ }
++ LastRcb=CurrentRcb;
++ CurrentRcb=LastRcb->Next;
++ if (CurrentRcb)
++ {
++ osfuncDataCacheHitInvalidate((void*)CurrentRcb,16);
++ /* RxBufStatus=CurrentRcb->mode; */ /*DRB~030522*/
++ }
++ }while(((LastRcb->mode&CB_EOF_BIT)==0)&&(CurrentRcb));
++
++ /* New location for interrupt acknowledge */
++ /* Write the completion pointer */
++ (*(pRX_CPPI_COMP_PTR( base )+( Ch *64))) = VirtToPhys(LastRcb) - HalDev->offset;
++
++ EopRcb=LastRcb;
++ HalDev->RxActQueueHead[Ch]=CurrentRcb;
++ HalDev->RxActQueueCount[Ch]-=TotalFrags;
++
++ if (LastRcb->mode&CB_EOQ_BIT)
++ {
++ if (CurrentRcb)
++ {
++
++ HalDev->Stats.RxMisQCnt[Ch]++;
++
++ (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64))) = LastRcb->HNext;
++ }
++ else
++ {
++
++ /* Rx EOQ */
++ HalDev->Stats.RxMisQCnt[Ch]++;
++
++ HalDev->RxActive[Ch]=FALSE;
++ }
++ }
++
++ EopRcb->Next=0;
++
++ /* setup SopRcb for the packet */
++ SopRcb->Eop=(void*)EopRcb;
++ SopRcb->FragCount=TotalFrags;
++
++ if ((ExpDmaSize!=CurrDmaLen)||(RxSopStatus&RX_ERROR_MASK))
++ {
++ /* check for Rx errors (only valid on SOP) */
++ if (RxSopStatus & RX_ERROR_MASK)
++ {
++ if (RxSopStatus & CRC_ERROR_MASK)
++ HalDev->Stats.CrcErrors[Ch]++;
++
++ if (RxSopStatus & LENGTH_ERROR_MASK)
++ HalDev->Stats.LenErrors[Ch]++;
++
++ if (RxSopStatus & ABORT_ERROR_MASK)
++ HalDev->Stats.AbortErrors[Ch]++;
++
++ if (RxSopStatus & STARV_ERROR_MASK)
++ HalDev->Stats.StarvErrors[Ch]++;
++ }
++ else
++ {
++ HalDev->Stats.DmaLenErrors[Ch]++; /* different type of length error */
++ }
++
++ EarlyReturn = 1;
++ }
++
++ /* do not pass up the packet if we're out of RCB's (or have an errored packet)*/
++ if ((CurrentRcb == 0) || (EarlyReturn == 1))
++ {
++ halRxReturn((HAL_RECEIVEINFO *)SopRcb,0);
++ }
++ else
++ {
++
++ if (EopRcb!=EofRcb)
++ {
++ HAL_RCB *FirstEmptyRcb;
++
++ FirstEmptyRcb = EofRcb->Next;
++ FirstEmptyRcb->Eop = (void*)EopRcb;
++ FirstEmptyRcb->FragCount = TotalFrags-FrmFrags;
++
++ halRxReturn((HAL_RECEIVEINFO *)FirstEmptyRcb,0);
++ SopRcb->Eop=(void*)EofRcb;
++ SopRcb->FragCount=FrmFrags;
++ EofRcb->Next=0; /* Optional */
++ }
++
++ mode = Ch | (PktType << 16) | (PassHeader << 31); /* ~GSG 030508 */
++
++ OsFunc->Receive(HalDev->OsDev,HalDev->fraglist,FragIndex,RxPktLen, /* ~GSG 030508 */
++ (HAL_RECEIVEINFO *)SopRcb,mode);
++ } /* else */
++
++ if (CurrentRcb) /*MJH+030522*/
++ {
++ RxBufStatus=CurrentRcb->mode;
++ }
++ } /* while */
++
++ if ((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)) /*~GSG 030307*/
++ {
++ *MoreWork = 1;
++ }
++ else
++ {
++ *MoreWork = 0;
++ }
++
++ if (PacketsServiced != 0)
++ {
++ /* REMOVED when removing InRxInt */
++ if ((!HalDev->RxActive[Ch]) && (HalDev->RxActQueueCount[Ch]))
++ {
++ (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64))) = VirtToPhys(HalDev->RxActQueueHead[Ch]);
++ HalDev->RxActive[Ch]=TRUE;
++ }
++ }
++
++ HalDev->InRxInt[Ch]=FALSE;
++
++ /* update stats */
++ HalDev->Stats.RxPacketsServiced[Ch] += PacketsServiced;
++ HalDev->Stats.RxTotal += PacketsServiced;
++ if (HalDev->Stats.RxMaxServiced < PacketsServiced)
++ HalDev->Stats.RxMaxServiced = PacketsServiced;
++
++ return (EC_NO_ERRORS);
++ }
++
++/*
++ * This function processes transmit interrupts. It traverses the
++ * transmit buffer queue, detecting sent data buffers and notifying the upper
++ * layer software via osSendComplete(). (for SAR, i originally had this split
++ * into two functions, one for each queue, but joined them on 8/8/02)
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Queue Queue number to service (always 0 for MAC, Choose 1 for SAR to service low priority queue)
++ * @param MoreWork Flag that indicates that there is more work to do when set to 1.
++ *
++ * @return 0 if OK, non-zero otherwise.
++ */
++static int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork)
++ {
++ HAL_TCB *CurrentTcb,*LastTcbProcessed,*FirstTcbProcessed;
++ int PacketsServiced;
++ bit32u TxFrameStatus;
++ int base = HalDev->dev_base, Ret;
++ int TxServiceMax = HalDev->ChData[Ch].TxServiceMax;
++ OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
++
++ int OtherQueue = Queue^1;
++
++/*+GSG 030303*//*+GSG 030303*/
++
++ /* Handle case of teardown interrupt. This must be checked at
++ the top of the function rather than the bottom, because
++ the normal data processing can wipe out the completion
++ pointer which is used to determine teardown complete. */
++ if (HalDev->TxTeardownPending[Ch] != 0)
++ {
++ Ret = TxTeardownInt(HalDev, Ch, Queue);
++ if (Ret == 0)
++ { /*+GSG 030303*/
++ *MoreWork = 0; /* bug fix 1/6 */ /*+GSG 030303*/
++ return (EC_NO_ERRORS);
++ } /*+GSG 030303*/
++ }
++
++ CurrentTcb = HalDev->TxActQueueHead[Ch][Queue];
++ FirstTcbProcessed=CurrentTcb;
++
++ if (CurrentTcb==0)
++ {
++ /* I saw this error a couple of times when multi-channels were added */
++ dbgPrintf("[cppi TxInt()]TxH int with no TCB in queue!\n");
++ dbgPrintf(" Ch=%d, CurrentTcb = 0x%08x\n", Ch, (bit32u)CurrentTcb);
++ dbgPrintf(" HalDev = 0x%08x\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ return(EC_CPPI|EC_FUNC_TXINT|EC_VAL_NULL_TCB);
++ }
++
++ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
++ TxFrameStatus=CurrentTcb->mode;
++ PacketsServiced=0;
++
++ /* should the ownership bit check be inside of the loop?? could make it a
++ while-do loop and take this check away */
++ if ((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ {
++ OsFunc->CriticalOn(); /* +GSG 030307 */
++ do
++ {
++ /* Pop TCB(s) for packet from the stack */
++ LastTcbProcessed=CurrentTcb->Eop;
++
++ /* new location for acknowledge */
++ /* Write the completion pointer */
++ (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue ))) = VirtToPhys(LastTcbProcessed);
++
++ HalDev->TxActQueueHead[Ch][Queue] = LastTcbProcessed->Next;
++
++/*+GSG 030303*//*+GSG 030303*/
++
++ osfuncDataCacheHitInvalidate((void *)LastTcbProcessed, 16);
++
++ if (LastTcbProcessed->mode&CB_EOQ_BIT)
++ {
++ if (LastTcbProcessed->Next)
++ {
++ /* Misqueued packet */
++
++ HalDev->Stats.TxMisQCnt[Ch][Queue]++;
++
++ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue ))) = LastTcbProcessed->HNext;
++ }
++ else
++ {
++ /* Tx End of Queue */
++
++ HalDev->Stats.TxEOQCnt[Ch][Queue]++;
++
++ HalDev->TxActive[Ch][Queue]=FALSE;
++ }
++ }
++
++ OsFunc->SendComplete(CurrentTcb->OsInfo);
++
++ /* Push Tcb(s) back onto the stack */
++ CurrentTcb = LastTcbProcessed->Next;
++
++ LastTcbProcessed->Next=HalDev->TcbPool[Ch][Queue];
++
++ HalDev->TcbPool[Ch][Queue]=FirstTcbProcessed;
++
++ PacketsServiced++;
++
++ TxFrameStatus=CB_OWNERSHIP_BIT;
++ /* set the first(SOP) pointer for the next packet */
++ FirstTcbProcessed = CurrentTcb;
++ if (CurrentTcb)
++ {
++ osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
++ TxFrameStatus=CurrentTcb->mode;
++ }
++
++ }while(((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ &&(PacketsServiced<TxServiceMax));
++
++ /* this fixes the SAR TurboDSL hardware bug (multiple queue failure) */
++ if (HalDev->TxActive[Ch][OtherQueue])
++ if (HalDev->TxActQueueHead[Ch][OtherQueue])
++ if ((*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue ))) == 0)
++ {
++ osfuncDataCacheHitInvalidate(HalDev->TxActQueueHead[Ch][OtherQueue],16);
++ if ((HalDev->TxActQueueHead[Ch][OtherQueue]->mode) & CB_OWNERSHIP_BIT)
++ {
++ HalDev->TurboDslErrors++;
++ (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue ))) =
++ VirtToPhys(HalDev->TxActQueueHead[Ch][OtherQueue]);
++ }
++ }
++
++ OsFunc->CriticalOff(); /* +GSG 030307 */
++ if (((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
++ &&(PacketsServiced==TxServiceMax))
++ {
++ *MoreWork = 1;
++ }
++ else
++ {
++ *MoreWork = 0;
++ }
++ }
++
++ /* update stats */
++ HalDev->Stats.TxPacketsServiced[Ch][Queue] += PacketsServiced;
++ HalDev->Stats.TxTotal += PacketsServiced;
++ if (HalDev->Stats.TxMaxServiced[Ch][Queue] < PacketsServiced)
++ HalDev->Stats.TxMaxServiced[Ch][Queue] = PacketsServiced;
++
++ return(EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function performs a teardown for the given channel. The value of the
++ * Mode parameter controls the operation of the function, as documented below.
++ *
++ * Note: If bit 3 of Mode is set, this call is blocking, and will not return
++ * until the teardown interrupt has occurred and been processed. While waiting
++ * for a blocking teardown to complete, ChannelTeardown() will signal the OS
++ * (via Control(.."Sleep"..)) to allow the OS to perform other tasks if
++ * necessary. If and only if bit 3 of Mode is clear, the CPHAL will call the
++ * OS TeardownComplete() function to indicate that the teardown has completed.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Ch Channel number.
++ * @param Mode Bit 0 (LSB): Perform Tx teardown (if set).<BR>
++ * Bit 1: Perform Rx teardown (if set). <BR>
++ * Bit 2: If set, perform full teardown (free buffers/descriptors).
++ * If clear, perform partial teardown (keep buffers). <BR>
++ * Bit 3 (MSB): If set, call is blocking.
++ * If clear, call is non-blocking.
++ *
++ * @return EC_NO_ERRORS (ok). <BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
++ * @ref EC_VAL_TX_TEARDOWN_ALREADY_PEND "EC_VAL_TX_TEARDOWN_ALREADY_PEND"<BR>
++ * @ref EC_VAL_RX_TEARDOWN_ALREADY_PEND "EC_VAL_RX_TEARDOWN_ALREADY_PEND"<BR>
++ * @ref EC_VAL_TX_CH_ALREADY_TORNDOWN "EC_VAL_TX_CH_ALREADY_TORNDOWN"<BR>
++ * @ref EC_VAL_RX_CH_ALREADY_TORNDOWN "EC_VAL_RX_CH_ALREADY_TORNDOWN"<BR>
++ * @ref EC_VAL_TX_TEARDOWN_TIMEOUT "EC_VAL_TX_TEARDOWN_TIMEOUT"<BR>
++ * @ref EC_VAL_RX_TEARDOWN_TIMEOUT "EC_VAL_RX_TEARDOWN_TIMEOUT"<BR>
++ * @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
++ */
++static int halChannelTeardown(HAL_DEVICE *HalDev, int Ch, bit32 Mode)
++ {
++ int DoTx, DoRx, Sleep=2048, timeout=0; /*MJH~030306*/
++ bit32u base = HalDev->dev_base;
++
++/* Set the module, used for error returns */
++
++ int Ret;
++
++ /* AAL5 only supports tearing down both sides at once (currently)*/
++ Mode = (Mode | TX_TEARDOWN | RX_TEARDOWN);
++
++ DoTx = (Mode & TX_TEARDOWN);
++ DoRx = (Mode & RX_TEARDOWN);
++
++ if (HalDev->State < enInitialized)
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_STATE);
++
++ if ((Ch < 0) || (Ch > MAX_AAL5_CHAN ))
++ {
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
++ }
++
++ /* set teardown pending bits before performing the teardown, because they
++ will be used in the int handler (this is done for AAL5) */
++ if (DoTx)
++ {
++ if (HalDev->TxTeardownPending[Ch] != 0)
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_ALREADY_PEND);
++
++ /* If a full teardown, this also means that the user must
++ setup all channels again to use them */
++ if (Mode & FULL_TEARDOWN)
++ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
++
++ if (HalDev->State < enOpened)
++ {
++ /* if the hardware has never been opened, the channel has never actually
++ been setup in the hardware, so I just need to reset the software flag
++ and leave */
++ HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)
++ {
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_CH_ALREADY_TORNDOWN);
++ }
++
++ /* set teardown flag */
++ HalDev->TxTeardownPending[Ch] = Mode;
++ }
++ }
++
++ if (DoRx)
++ {
++ if (HalDev->RxTeardownPending[Ch] != 0)
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_ALREADY_PEND);
++
++ if (Mode & FULL_TEARDOWN)
++ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
++
++ if (HalDev->State < enOpened)
++ {
++ HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
++ return (EC_NO_ERRORS);
++ }
++ else
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == 0)
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_CH_ALREADY_TORNDOWN);
++
++ HalDev->RxTeardownPending[Ch] = Mode;
++ }
++ }
++
++ /* Perform Tx Teardown Duties */
++ if ((DoTx) && (HalDev->State == enOpened))
++ {
++ /* Request TX channel teardown */
++ (TX_CPPI_TEARDOWN_REG( base )) = Ch;
++
++ /* wait until teardown has completed */
++ if (Mode & BLOCKING_TEARDOWN)
++ {
++ timeout = 0;
++ while (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
++ {
++ osfuncSleep(&Sleep);
++
++ timeout++;
++ if (timeout > 100000)
++ {
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_TIMEOUT);
++ }
++ }
++ }
++ } /* if DoTx */
++
++ /* Perform Rx Teardown Duties */
++ if ((DoRx) && (HalDev->State == enOpened))
++ {
++
++ /* call main teardown routine for Rx */
++ Ret = HalDev->SarFunc->ChannelTeardown(HalDev->SarDev, Ch, Mode);
++ if (Ret) return (Ret);
++
++ if (Mode & BLOCKING_TEARDOWN)
++ {
++ timeout = 0;
++ while (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
++ {
++ osfuncSleep(&Sleep);
++
++ timeout++;
++ if (timeout > 100000)
++ {
++ return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_TIMEOUT);
++ }
++ }
++ }
++ } /* if DoRx */
++
++ return (EC_NO_ERRORS);
++ }
++
++/**
++ * @ingroup CPHAL_Functions
++ * This function closes the CPHAL module. The module will be reset.
++ * The Mode parameter should be used to determine the actions taken by
++ * Close().
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ * @param Mode Indicates actions to take on close. The following integer
++ * values are valid: <BR>
++ * 1: Does not free buffer resources, init parameters remain
++ * intact. User can then call Open() without calling Init()
++ * to attempt to reset the device and bring it back to the
++ * last known state.<BR>
++ * 2: Frees the buffer resources, but keeps init parameters. This
++ * option is a more aggressive means of attempting a device reset.
++ * 3: Frees the buffer resources, and clears all init parameters. <BR>
++ * At this point, the caller would have to call to completely
++ * reinitialize the device (Init()) before being able to call
++ * Open(). Use this mode if you are shutting down the module
++ * and do not plan to restart.
++ *
++ * @return EC_NO_ERRORS (ok).<BR>
++ * Possible Error Codes:<BR>
++ * @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
++ * Any error code from halChannelTeardown().<BR>
++ */
++static int halClose(HAL_DEVICE *HalDev, bit32 Mode)
++ {
++ int Ch, Inst, Ret;
++ OS_DEVICE *TmpOsDev;
++ OS_FUNCTIONS *TmpOsFunc;
++ HAL_FUNCTIONS *TmpHalFunc;
++ char *TmpDeviceInfo;
++
++ CPSAR_FUNCTIONS *TmpSarFunc;
++ CPSAR_DEVICE *TmpSarDev;
++
++ /* Verify proper device state */
++ if (HalDev->State != enOpened)
++ return (EC_AAL5 | EC_FUNC_CLOSE|EC_VAL_INVALID_STATE);
++
++ /* Teardown all open channels */
++ for (Ch = 0; Ch <= MAX_AAL5_CHAN ; Ch++)
++ {
++ if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
++ {
++ if (Mode == 1)
++ {
++ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ else
++ {
++ Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ }
++
++ if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
++ {
++ if (Mode == 1)
++ {
++ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ else
++ {
++ Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
++ if (Ret) return (Ret);
++ }
++ }
++ }
++
++ /* free fraglist in HalDev */
++ HalDev->OsFunc->Free(HalDev->fraglist);
++ HalDev->fraglist = 0;
++
++ /* unregister the interrupt */
++ HalDev->OsFunc->IsrUnRegister(HalDev->OsDev, HalDev->interrupt);
++
++ /* Disable the Tx CPPI DMA */
++ TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
++
++ /* Disable the Rx CPPI DMA */
++ RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
++
++ /* Close the SAR hardware - puts the device in reset if this module is the
++ "last one out" */
++ HalDev->SarFunc->Close(HalDev->SarDev, Mode);
++
++ /* If mode is 3, than clear the HalDev and set next state to DevFound*/
++ if (Mode == 3)
++ {
++ /* I need to keep the HalDev parameters that were setup in InitModule */
++ TmpOsDev = HalDev->OsDev;
++ TmpOsFunc = HalDev->OsFunc;
++ TmpDeviceInfo = HalDev->DeviceInfo;
++
++ TmpSarFunc = HalDev->SarFunc;
++ TmpSarDev = HalDev->SarDev;
++
++ TmpHalFunc = HalDev->HalFuncPtr;
++ Inst = HalDev->Inst;
++
++ /* Clear HalDev */
++
++ HalDev->OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
++
++ /* Restore key parameters */
++ HalDev->OsDev = TmpOsDev;
++ HalDev->OsFunc = TmpOsFunc;
++ HalDev->DeviceInfo = TmpDeviceInfo;
++
++ HalDev->SarFunc = TmpSarFunc;
++ HalDev->SarDev = TmpSarDev;
++
++ HalDev->HalFuncPtr = TmpHalFunc;
++ HalDev->Inst = Inst;
++
++ HalDev->State = enDevFound;
++ }
++ else
++ {
++ HalDev->State = enInitialized;
++ }
++
++ return(EC_NO_ERRORS);
++ }
+diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c
+--- linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c 2005-07-10 08:02:01.425114248 +0200
+@@ -0,0 +1,27 @@
++#ifndef _INC_CPREMAP_C
++#define _INC_CPREMAP_C
++
++#ifdef __ADAM2
++static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
++ {
++ asm(" cache 17, (%0)" : : "r" (ptr));
++ }
++
++static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
++ {
++ asm(" cache 25, (%0)" : : "r" (ptr));
++ }
++
++#else
++ #define osfuncDataCacheHitInvalidate(MemPtr, Size) HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
++ #define osfuncDataCacheHitWriteback(MemPtr, Size) HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
++#endif
++
++/*
++#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache 17, (%0)" : : "r" (ptr))
++#define osfuncDataCacheHitWriteback(ptr, Size) asm(" cache 25, (%0)" : : "r" (ptr))
++*/
++
++
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c
+--- linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c 2005-07-10 08:02:01.426114096 +0200
+@@ -0,0 +1,27 @@
++#ifndef _INC_CPREMAP_C
++#define _INC_CPREMAP_C
++
++#ifdef __ADAM2
++static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
++ {
++ asm(" cache 17, (%0)" : : "r" (ptr));
++ }
++
++static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
++ {
++ asm(" cache 25, (%0)" : : "r" (ptr));
++ }
++
++#else
++ #define osfuncDataCacheHitInvalidate(MemPtr, Size) HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
++ #define osfuncDataCacheHitWriteback(MemPtr, Size) HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
++#endif
++
++/*
++#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache 17, (%0)" : : "r" (ptr))
++#define osfuncDataCacheHitWriteback(ptr, Size) asm(" cache 25, (%0)" : : "r" (ptr))
++*/
++
++
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/cpsar.c linux.dev/drivers/atm/sangam_atm/cpsar.c
+--- linux.old/drivers/atm/sangam_atm/cpsar.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpsar.c 2005-07-10 08:02:01.427113944 +0200
+@@ -0,0 +1,881 @@
++/**
++ * cpsar.c
++ *
++ * TNETDxxxx Software Support\n
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * This file contains the HAL for the CPSAR module. In the software
++ * architecture, the CPSAR module is used exclusively by the AAL5 and AAL2
++ * CPHAL modules. AAL5 and AAL2 may utilize the same CPSAR instance
++ * simulataneously.
++ *
++ * version
++ * 5Sep02 Greg 1.00 Original Version created.
++ */
++
++/* register files */
++#include "cp_sar_reg.h"
++
++#define _CPHAL_CPSAR
++#define _CPHAL
++
++#define WAIT_THRESH 200000
++#define IRAM_SIZE 1536
++#define MAX_INST 2
++
++/* OS Data Structure definition */
++
++typedef void OS_PRIVATE;
++typedef void OS_DEVICE;
++typedef void OS_SENDINFO;
++typedef void OS_RECEIVEINFO;
++typedef void OS_SETUP;
++
++/* CPHAL Data Structure definitions */
++
++typedef struct cpsar_device CPSAR_DEVICE;
++typedef struct cpsar_device HAL_DEVICE;
++typedef void HAL_RECEIVEINFO;
++
++#define MAX_QUEUE 2
++#define MAX_CHAN 19
++
++#include "cpcommon_cpsar.h"
++#include "cpswhal_cpsar.h"
++#include "cpsar.h"
++#include "cpcommon_cpsar.c"
++
++static CPSAR_DEVICE *CpsarDev[MAX_INST]= {0,0};
++
++/*
++ * Returns statistics information.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0
++ */
++static int StatsGet3(CPSAR_DEVICE *HalDev)
++ {
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]StatsGet3(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++ /*
++ dbgPrintf("CPSAR General Stats:\n");
++ DispHexStat(HalDev, "Base Address",HalDev->dev_base);
++ DispStat(HalDev, "Offset (VLYNQ)",HalDev->offset);
++ DispStat(HalDev, "Debug Level",HalDev->debug);
++ DispStat(HalDev, "Instance",HalDev->Inst);
++ DispHexStat(HalDev, "Reset Address",HalDev->ResetBase);
++ DispStat(HalDev, "Reset Bit",HalDev->ResetBit);
++ */
++ return (EC_NO_ERRORS);
++ }
++
++/* +GSG 030407 */
++static void SetOamMode(HAL_DEVICE *HalDev)
++ {
++ int Ch;
++ volatile bit32u *pTmp;
++ int OamMode = (1<<8);
++
++ /* any configuration of OamMode affects all VC's, including AAL2 */
++ for (Ch = 0; Ch < MAX_CHAN; Ch++)
++ {
++ if (Ch < 16)
++ pTmp = (pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
++ else
++ pTmp = (pPDSP_AAL2_RX_STATE_WORD_0(HalDev->dev_base) + ((Ch-16)*64));
++
++ if (HalDev->OamMode == 0)
++ {
++ *pTmp &=~ OamMode;
++ }
++ else
++ {
++ *pTmp |= OamMode;
++ }
++ }
++ }
++
++static int halControl(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
++ {
++ int KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Ch; /* +RC3.02*/
++ char *TmpKey = (char *)Key;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
++ Key, Action, (bit32u)Value);
++ osfuncSioFlush();
++ }
++#endif
++
++ if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
++ {
++ KeyFound=1; /* +RC3.02*/
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1; /* +RC3.02*/
++ HalDev->debug = *(int *)Value;
++ }
++ }
++
++ /* +GSG 030407 */
++ if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++ HalDev->OamMode = *(int *)Value;
++
++ /* only do this if we're open */
++ if (HalDev->OpenCount > 0)
++ SetOamMode(HalDev);
++ }
++
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ {
++ ActionFound=1;
++ *(int *)Value = HalDev->OamMode;
++ }
++ }
++
++ if (HalDev->OsFunc->Strcmpi(Key, "Stats3") == 0)
++ {
++ if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
++ StatsGet3(HalDev);
++ }
++
++ /* +RC3.02 (if statement) */
++ /* Fixes PITS #98 */
++ if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* Configure PDSP enable bit based on Value*/
++ if (*(int *)Value & 1)
++ {
++ /* enable PDSP */
++ PDSP_CTRL_REG(HalDev->dev_base) |= 0x2;
++ }
++ else
++ {
++ /* disable PDSP */
++ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x2;
++ }
++ }
++ }
++
++ if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
++ {
++ KeyFound=1;
++ if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
++ {
++ ActionFound=1;
++
++ /* extract channel number */
++ TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
++ Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
++
++ /* Configure forwarding of unknown VCI/VPI cells */
++ SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = (((*(int*)Value)<<31) | Ch);
++ }
++ }
++
++ if (KeyFound == 0) /* +RC3.02 */
++ rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND); /* +RC3.02 */
++
++ if (ActionFound == 0) /* +RC3.02 */
++ rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND); /* +RC3.02 */
++
++ return(rc); /* ~RC3.02 */
++ }
++
++/*
++ * This function opens the specified channel.
++ *
++ * @param HalDev CPHAL module instance. (set by cphalInitModule())
++ * @param Ch Channel number.
++ *
++ * @return 0 OK, Non-zero Not OK
++ */
++static int halChannelSetup(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh)
++ {
++ int i;
++ int Ch = HalCh->Channel;
++ int PdspChBlock = Ch;
++ int PdspBlockOffset = 0;
++ volatile bit32u *pTmp;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halChannelSetup(HalDev:%08x, HalCh:%08x)\n", (bit32u)HalDev,
++ (bit32u)HalCh);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Figure out the correct offset from the start of the PDSP
++ Scratchpad RAM (starting at 0x8050 in the SAR) */
++ if (Ch > 15)
++ {
++ /* this is an AAL2 channel, which are channels 16-18 */
++ PdspChBlock = Ch - 16;
++ /* Get the offset to the AAL2 portion of the block (in words) */
++ PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + (PdspChBlock*64);
++ /* Clear PDSP State RAM */
++ /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
++ for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
++ *pTmp++ = 0;*/
++ }
++ else
++ {
++ /* Get the offset to the AAL5 portion of the block (in words) */
++ PdspBlockOffset = (PdspChBlock*64);
++ /* Clear PDSP State RAM */
++ /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
++ for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
++ *pTmp++ = 0;*/
++ }
++
++ /* Configure PDSP State RAM */
++
++ /* Setup TX PDSP State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
++ *pTmp++ = HalCh->TxVc_CellRate; /* Set the cell rate in cells/sec */
++ *pTmp++ = HalCh->TxVc_QosType; /* Configure the QoS Type */
++ *pTmp++ = HalCh->TxVc_Mbs; /* Set minimum burst size */
++ *pTmp++ = 0; /* (skip a register) */
++ *pTmp++ = HalCh->TxVc_Pcr; /* set the peak cell rate */
++ *pTmp++ = 0; /* new addition 4.9.02 */
++ *pTmp++ = HalCh->TxVc_AtmHeader; /* give the ATM header */
++ *pTmp++ = (HalCh->TxVc_OamTc << 8)
++ |(HalCh->TxVc_VpOffset); /* Set the OAM TC Path and VP Offset */
++
++ /* Setup RX PDSP State RAM */
++ *pTmp++ = (HalCh->RxVc_OamCh)|
++ (HalDev->OamMode << 8) |
++ (HalCh->RxVc_OamToHost<<9); /* Set OAM Channel, Mode, and ToHost options */
++ *pTmp++ = HalCh->RxVc_AtmHeader; /* ATM hdr put on firmware generated OAM */
++ *pTmp++ = (HalCh->RxVc_VpOffset)| /* Set Rx OAM TC Path and VP Offset */
++ (HalCh->RxVc_OamTc<<8);
++
++ /* Setup TX VP PDSP State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+16); /*GSG~030703 12->16 */
++ *pTmp++ = HalCh->TxVp_AtmHeader;
++ *pTmp++ = (HalCh->TxVp_OamTc << 8);
++
++ /* Setup RX VP PDSP State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+20); /*GSG~030703 16->20 */
++ *pTmp++ = HalCh->RxVp_AtmHeader;
++ *pTmp++ = (HalCh->RxVp_OamCh)|
++ (HalCh->RxVp_OamTc<<8)|
++ (HalCh->RxVp_OamToHost<<9); /* Set OAM Channel, Mode, and ToHost options */
++ *pTmp++ = 0;
++ *pTmp++ = HalCh->RxVp_OamVcList;
++
++ /* Configure forwarding of unknown VCI/VPI cells */
++ if (HalCh->PktType == 3)
++ SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = ((HalCh->FwdUnkVc<<31)|Ch);
++
++ /* Configure Tx Channel Mapping Register (turn channel "ON") */
++ TX_CH_MAPPING_REG(HalDev->dev_base) = 0x80000000 |
++ (HalCh->DaMask << 30)
++ | (HalCh->Priority << 24) | Ch;
++
++ /* Setup Rx Channel in the LUT */
++ i=0;
++ while (!(RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) & 0x80000000))
++ {
++ if (i > WAIT_THRESH)
++ {
++ return(EC_CPSAR|EC_FUNC_CHSETUP|EC_VAL_LUT_NOT_READY);
++ }
++ else
++ i++;
++ }
++
++ /* RX LUT is ready */
++ RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) = (HalCh->PktType << 24) | Ch;
++ RX_LUT_CH_SETUP_REQ_VC_REG(HalDev->dev_base) = ((HalCh->Vpi << 20) |
++ (HalCh->Vci << 4));
++
++ return (EC_NO_ERRORS);
++ }
++
++static int halChannelTeardown(CPSAR_DEVICE *HalDev, int Ch, bit32 Mode)
++ {
++ int waitcnt = 0;
++ int PdspBlockOffset = 0, i;
++ volatile bit32u *pTmp;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halChannelTeardown(HalDev:%08x, Ch:%d, Mode:%d\n",
++ (bit32u)HalDev, Ch, Mode);
++ osfuncSioFlush();
++ }
++#endif
++
++ if ((Ch < 0) || (Ch > MAX_CHAN))
++ return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
++
++ /* Request RX channel teardown through LUT */
++ while ((RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) & 0x80000000) == 0)
++ {
++ waitcnt++;
++ if (waitcnt == WAIT_THRESH)
++ {
++ return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_LUT_NOT_READY);
++ }
++ }
++
++ RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) = (Ch & 0xffff);
++
++ /* for AAL2, clear channel PDSP RAM here. AAL5 does it when the teardown
++ has completed (which is asynchronous)*/
++ if (Ch > 15)
++ {
++ /* Get the offset to the AAL2 portion of the block (in words) */
++ PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + ((Ch-16)*64);
++ /* Clear PDSP State RAM */
++ pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
++ for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
++ *pTmp++ = 0;
++ }
++
++ return (EC_NO_ERRORS);
++ }
++
++int InitPdsp(CPSAR_DEVICE *HalDev)
++ {
++ bit32u NumOfEntries,i,IRamAddress,iTmp;
++ int *SarPdspFirmware; /* ~GSG 030403 */
++ int FirmwareSize, rc; /* ~GSG 030403 */
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]InitPdsp(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Get firmware */
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, "Firmware", "Get", &SarPdspFirmware); /* ~GSG 030403 */
++ if (rc) /* +GSG 030403 */
++ return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND); /* +GSG 030403 */
++
++ /* Get firmware size */
++ rc = HalDev->OsFunc->Control(HalDev->OsDev, "FirmwareSize", "Get", &FirmwareSize); /* ~GSG 030403 */
++ if (rc) /* +GSG 030403 */
++ return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND); /* +GSG 030403 */
++
++ IRamAddress = (bit32u) pPDSP_CTRL_REG(HalDev->dev_base);
++
++ NumOfEntries = (FirmwareSize)/4; /* ~GSG 030403 */
++ if (NumOfEntries > IRAM_SIZE)
++ {
++ /* Note: On Avalanche, they truncated the PDSP firmware and warned */
++ /* NumOfEntries = IRAM_SIZE; */
++ return(EC_CPSAR|EC_FUNC_INIT|EC_VAL_FIRMWARE_TOO_LARGE);
++ }
++ for(i=8;i<NumOfEntries;i++)
++ (*((bit32 *) (IRamAddress+(i*4))))=SarPdspFirmware[i]; /* ~GSG 030403 */
++
++ /* Check code */
++ for(i=8;i<NumOfEntries;i++)
++ {
++ iTmp=(*((bit32 *) (IRamAddress+(i*4))));
++ if (iTmp != SarPdspFirmware[i]) /* ~GSG 030403 */
++ {
++ return(EC_CPSAR|EC_FUNC_OPEN|EC_VAL_PDSP_LOAD_FAIL);
++ }
++ }
++
++ return(EC_NO_ERRORS);
++ }
++
++/*
++ * This function probes for the instance of the CPHAL module. It will call
++ * the OS function @c DeviceFindInfo() to get the information required.
++ *
++ * @param HalDev CPHAL module instance. (set by xxxInitModule())
++ *
++ * @return 0 OK, Otherwise error.
++ */
++static int halProbe(CPSAR_DEVICE *HalDev)
++ {
++ int Ret;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(1))
++ {
++ dbgPrintf("[os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
++ HalDev->Inst, "sar", (bit32u)&HalDev->DeviceInfo);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Attempt to find the device information */
++ Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "sar", &HalDev->DeviceInfo);
++ if (Ret)
++ return(EC_CPSAR|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
++
++ return(EC_NO_ERRORS);
++ }
++
++#ifdef __CPHAL_DEBUG
++static void dbgConfigDump(HAL_DEVICE *HalDev)
++ {
++ dbgPrintf(" [cpsar Inst %d] Config Dump:\n", HalDev->Inst);
++ dbgPrintf(" Base :%08x, offset :%08d\n",
++ HalDev->dev_base, HalDev->offset);
++ dbgPrintf(" ResetBit:%08d, ResetBase:%08x\n",
++ HalDev->ResetBit, HalDev->ResetBase);
++ dbgPrintf(" UniNni :%08d, debug :%08d\n",
++ HalDev->ResetBit, HalDev->debug);
++ osfuncSioFlush();
++ }
++#endif
++
++/*
++ * Sets up HAL default configuration parameter values.
++ */
++static void ConfigInit(CPSAR_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++ /* configure some defaults with tnetd7300 values */
++ HalDev->dev_base = 0xa3000000;
++ HalDev->offset = 0;
++ HalDev->UniNni = CFG_UNI_NNI;
++ HalDev->ResetBit = 9;
++ HalDev->debug = 0;
++ HalDev->ResetBase = 0xa8611600;
++ }
++
++/*
++ * Retrieve HAL configuration parameter values.
++ */
++static bit32u ConfigGet(HAL_DEVICE *HalDev)
++ {
++ bit32u ParmValue, error_code;
++ char *DeviceInfo = HalDev->DeviceInfo;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* get the configuration parameters common to all modules */
++ error_code = ConfigGetCommon(HalDev);
++ if (error_code) return (EC_CPSAR|error_code);
++
++ /* get SAR specific configuration parameters */
++ error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo,"UniNni",&ParmValue);
++ if (!error_code) HalDev->UniNni = ParmValue;
++
++ return (EC_NO_ERRORS);
++ }
++
++static int halInit(CPSAR_DEVICE *HalDev)
++ {
++ bit32u Ret;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halInit(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(7))
++ {
++ dbgPrintf("[cpsar halInit()]InitCount = %d\n", HalDev->InitCount);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Only run the init code for the first calling module per instance */
++ if (HalDev->InitCount > 1)
++ {
++ return (EC_NO_ERRORS);
++ }
++
++ /* Configure HAL defaults */
++ ConfigInit(HalDev);
++
++ /* Retrieve HAL configuration parameters from data store */
++ Ret = ConfigGet(HalDev);
++ if (Ret) return (Ret);
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(9))
++ dbgConfigDump(HalDev);
++#endif
++
++ return(EC_NO_ERRORS);
++ }
++
++static int halOpen(CPSAR_DEVICE *HalDev)
++ {
++ int Ret, Ticks=64;
++ int i; /*+GSG 030407*/
++ volatile int *pTmp; /*+GSG 030407*/
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(7))
++ {
++ dbgPrintf("[cpsar halOpen()]OpenCount = %d\n", HalDev->OpenCount);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Only run the open code for the first calling module per instance */
++ if (HalDev->OpenCount++ > 0)
++ {
++ return (EC_NO_ERRORS);
++ }
++
++ /* Take SAR out of reset */
++ if (((*(volatile bit32u *)(HalDev->ResetBase)) & (1<<HalDev->ResetBit)) != 0)
++ {
++ /** @todo Should I somehow call AAL5/AAL2 Close() here? All I've done
++ here is copy the Close code from each and paste it here. */
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(7))
++ {
++ dbgPrintf("[cpsar halOpen()]Module was already out of reset.\n");
++ dbgPrintf(" Closing module and resetting.\n");
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Disable the Tx CPPI DMA */
++ TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
++
++ /* Disable the Rx CPPI DMA */
++ RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
++
++ /* Disable the PDSP */
++ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
++
++ /* disable interrupt masks */
++ SAR_TX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
++ SAR_RX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
++
++#ifndef NO_RESET /* GSG+ 030428 */
++ /* clear reset bit */
++ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
++ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
++
++ /* set reset bit */
++ (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
++ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
++#endif /* GSG+ 030428 */
++ }
++ else
++ {
++ (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
++ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
++ }
++
++ /* Configure UNI/NNI */
++ RX_LUT_GLOBAL_CFG_REG(HalDev->dev_base) |= (HalDev->UniNni & 0x1);
++
++ /* Clear entire PDSP state RAM */ /*+GSG 030407*/
++ pTmp = (pTX_DMA_STATE_WORD_0(HalDev->dev_base)); /*+GSG 030407*/
++ for (i=0; i<PDSP_STATE_RAM_SIZE; i++) /*+GSG 030407*/
++ *pTmp++ = 0; /*+GSG 030407*/
++
++ /* Configure Oam Mode */ /*+GSG 030407*/
++ SetOamMode(HalDev); /*+GSG 030407*/
++
++ /* Initialize PDSP */
++ Ret=InitPdsp(HalDev);
++ if(Ret)
++ return(Ret);
++
++ /* Reset and Enable the PDSP */
++ PDSP_CTRL_REG(HalDev->dev_base) = 0x00080003;
++
++ return(EC_NO_ERRORS);
++ }
++
++static int halClose(CPSAR_DEVICE *HalDev, int Mode)
++ {
++ int Ticks = 64;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halClose(HalDev:%08x, Mode:%d)\n", (bit32u)HalDev, Mode);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* handle the error case if there is nothing open */
++ if (HalDev->OpenCount == 0)
++ {
++ return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_CLOSED);
++ }
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(7))
++ {
++ dbgPrintf("[cpsar halClose()]OpenCount = %d\n", HalDev->OpenCount);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Only run the close code for the last calling module per instance */
++ if (HalDev->OpenCount-- > 1)
++ {
++ return (EC_NO_ERRORS);
++ }
++
++ /* Disable the PDSP */
++ PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
++
++#ifndef NO_RESET /* GSG +030428 */
++ /* put device back into reset */
++ (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
++ HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
++#endif /* GSG +030428 */
++
++ return(EC_NO_ERRORS);
++ }
++
++static int halShutdown(CPSAR_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* handle the error case */
++ if (HalDev->InitCount == 0)
++ {
++ return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_SHUTDOWN);
++ }
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(7))
++ {
++ dbgPrintf("[cpsar halShutdown()]InitCount = %d\n", HalDev->InitCount);
++ osfuncSioFlush();
++ }
++#endif
++
++ /* Only run the shutdown code for the last calling module per instance */
++ if (HalDev->InitCount-- > 1)
++ {
++ return (EC_NO_ERRORS);
++ }
++
++ /* free the SAR functions */
++#ifdef __CPHAL_DEBUG
++ if (DBG(6))
++ {
++ dbgPrintf(" [cpsar halShutdown()]: Free CPSAR function pointers\n");
++ osfuncSioFlush();
++ }
++ if (DBG(1)||DBG(3))
++ {
++ dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
++ osfuncSioFlush();
++ }
++#endif
++ /* free the HalFunc */
++ HalDev->OsFunc->Free(HalDev->HalFuncPtr);
++
++ /* we have a static global, so I should clear it's value as well */
++ CpsarDev[HalDev->Inst] = 0;
++
++#ifdef __CPHAL_DEBUG
++ if (DBG(6))
++ {
++ dbgPrintf(" [cpsar halShutdown()]Free HalDev\n");
++ osfuncSioFlush();
++ }
++ if (DBG(1)||DBG(3))
++ {
++ dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++ /* free the CPSAR device */
++ HalDev->OsFunc->Free(HalDev);
++
++ return(EC_NO_ERRORS);
++ }
++
++static int halTick(CPSAR_DEVICE *HalDev)
++ {
++#ifdef __CPHAL_DEBUG
++ if (DBG(0))
++ {
++ dbgPrintf("[cpsar]halTick(HalDev:%08x)\n", (bit32u)HalDev);
++ osfuncSioFlush();
++ }
++#endif
++
++ return(EC_NO_ERRORS);
++ }
++
++/*
++ * The CPSAR version of InitModule() should be passed the OS_FUNCTIONS pointer,
++ * and will return the HalDev pointer.
++ *
++ * @param HalDev Pointer to CPSAR module information. This will
++ * be used by the OS when communicating to this module via
++ * CPSAR.
++ * @param OsDev Pointer to OS device information. This will be saved by
++ * the CPSAR and returned to the OS when required.
++ * @param HalFunc HAL_FUNCTIONS pointer.
++ * @param Size Pointer to the size of the HAL_FUNCTIONS structure. (If
++ * HalFunc is 0, the value will be set by CPSAR, otherwise
++ * ignored)
++ * @param Inst The instance number of the module to initialize. (start at
++ * 0).
++ *
++ * @return 0 OK, Nonzero - error.
++ */
++/*
++int cpsarInitModule(CPSAR_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ CPSAR_FUNCTIONS *HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int *Size,
++ int Inst)
++*/
++int cpsarInitModule(CPSAR_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ CPSAR_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst)
++ {
++ CPSAR_DEVICE *HalPtr;
++ CPSAR_FUNCTIONS *HalFuncPtr;
++
++ /*
++ if ( HalFunc == 0 )
++ {
++ *Size = sizeof(CPSAR_FUNCTIONS);
++ return(EC_NO_ERRORS);
++ }
++ */
++
++ if (CpsarDev[Inst] != 0)
++ {
++ /* this SAR module has been connected to before, so do not
++ allocate another CPSAR_DEVICE */
++ HalPtr = CpsarDev[Inst];
++
++ /* increase count of attached modules */
++ HalPtr->InitCount++;
++ }
++ else
++ {
++ /* allocate the CPSAR_DEVICE structure */
++ HalPtr = (CPSAR_DEVICE *) OsFunc->MallocDev(sizeof(CPSAR_DEVICE));
++ if(!HalPtr)
++ return(EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
++
++ HalFuncPtr = (CPSAR_FUNCTIONS *) OsFunc->Malloc(sizeof(CPSAR_FUNCTIONS));
++ if (!HalFuncPtr)
++ return (EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
++
++ /* Initialize the size of hal functions */
++ *HalFuncSize = sizeof (CPSAR_FUNCTIONS);
++
++ /* ensure the device structure is cleared */
++ OsFunc->Memset(HalPtr, 0, sizeof(CPSAR_DEVICE));
++
++ /* clear the function pointers */
++ OsFunc->Memset(HalFuncPtr, 0, sizeof(CPSAR_FUNCTIONS));
++
++ /* Supply pointers for the CPSAR API functions */
++ HalFuncPtr->ChannelSetup = halChannelSetup;
++ HalFuncPtr->ChannelTeardown = halChannelTeardown;
++ HalFuncPtr->Close = halClose;
++ HalFuncPtr->Control = halControl;
++ HalFuncPtr->Init = halInit;
++ HalFuncPtr->Open = halOpen;
++ HalFuncPtr->Probe = halProbe;
++ HalFuncPtr->Shutdown = halShutdown;
++ HalFuncPtr->Tick = halTick;
++
++ /* keep a reference to HalFuncPtr so I can free it later */
++ HalPtr->HalFuncPtr = HalFuncPtr;
++
++ /* store the CPSAR_DEVICE, so the CPSAR module will know whether
++ it is in use for the given instance */
++ CpsarDev[Inst] = HalPtr;
++
++ /* increase count of attached modules */
++ HalPtr->InitCount++;
++ }
++
++ /* @todo Does this need modification to deal with multiple callers/
++ drivers? If different callers will use different OsDev/OsFunc,
++ then the current code will not work.
++ */
++
++ /* initialize the CPSAR_DEVICE structure */
++ HalPtr->OsDev = OsDev;
++ /*HalPtr->OsOpen = OsDev;*/
++ HalPtr->Inst = Inst;
++ HalPtr->OsFunc = OsFunc;
++
++ /* pass the HalPtr back to the caller */
++ *HalDev = HalPtr;
++ *HalFunc = HalPtr->HalFuncPtr;
++
++ return (EC_NO_ERRORS);
++ }
+diff -urN linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h
+--- linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h 2005-07-10 08:02:01.427113944 +0200
+@@ -0,0 +1,103 @@
++/*******************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cpsar.h
++ *
++ * DESCRIPTION:
++ * This file contains data structure definitions for the CPSAR HAL.
++ *
++ * HISTORY:
++ * 6Sep02 Greg 1.00 Original Version created.
++ *
++ *****************************************************************************/
++#ifndef _INC_CPSAR
++#define _INC_CPSAR
++
++#define NUM_RX_STATE_WORDS 7
++#define NUM_TX_STATE_WORDS 9
++#define MAX_CHAN 19
++
++
++#ifndef _CPHAL_CPSAR
++typedef void CPSAR_DEVICE;
++#endif
++
++/*
++ * HAL Default Parameter Values
++ */
++#define CFG_UNI_NNI 0
++
++/**
++ * @ingroup shared_data
++ *
++ * List of defined keys for use with Control().
++ */
++typedef enum
++ {
++ /* SAR */
++ enGET_FIRMWARE, /**< Used by the SAR to request a pointer to firmware */
++ enGET_FIRMWARE_SIZE, /**< Used by the SAR to request the size of the firmware */
++ enEND=9999 /* Last entry */
++ }INFO_KEY;
++
++/*
++ * The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
++ int (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(CPSAR_DEVICE *HalDev, int Mode);
++ int (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*Init)(CPSAR_DEVICE *HalDev);
++ int (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(CPSAR_DEVICE *HalDev);
++ int (*Probe)(CPSAR_DEVICE *HalDev);
++ int (*Shutdown)(CPSAR_DEVICE *HalDev);
++ int (*Tick)(CPSAR_DEVICE *HalDev);
++ } CPSAR_FUNCTIONS;
++
++/*
++ * This is the data structure for a generic HAL device. It contains all device
++ * specific data for a single instance of that device. This includes Rx/Tx
++ * buffer queues, device base address, reset bit, and other information.
++ */
++typedef struct cpsar_device
++ {
++ bit32 dev_base;
++ bit32 offset;
++ bit32 TxTeardownPending[MAX_CHAN];
++ bit32 RxTeardownPending[MAX_CHAN];
++ bit32 ChIsOpen[MAX_CHAN];
++ bit32 ResetBit;
++ bit32 debug;
++ OS_DEVICE *OsDev;
++ OS_FUNCTIONS *OsFunc;
++ /*void *OsOpen;*/
++ bit32 UniNni;
++ bit32 Inst;
++ bit32u DeviceCPID[4];
++ bit32u LBSourceLLID[4];
++ bit32u OamRate[11];
++ CHANNEL_INFO ChData[MAX_CHAN];
++ int InitCount;
++ int OpenCount;
++ char *DeviceInfo;
++ bit32u ResetBase;
++ DEVICE_STATE State;
++ CPSAR_FUNCTIONS *HalFuncPtr;
++ int OamMode; /* +GSG 030407 */
++ }CPSARDEVICE;
++
++extern int cpsarInitModule(CPSAR_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ CPSAR_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/cpsar.h linux.dev/drivers/atm/sangam_atm/cpsar.h
+--- linux.old/drivers/atm/sangam_atm/cpsar.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpsar.h 2005-07-10 08:02:01.427113944 +0200
+@@ -0,0 +1,103 @@
++/*******************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cpsar.h
++ *
++ * DESCRIPTION:
++ * This file contains data structure definitions for the CPSAR HAL.
++ *
++ * HISTORY:
++ * 6Sep02 Greg 1.00 Original Version created.
++ *
++ *****************************************************************************/
++#ifndef _INC_CPSAR
++#define _INC_CPSAR
++
++#define NUM_RX_STATE_WORDS 7
++#define NUM_TX_STATE_WORDS 9
++#define MAX_CHAN 19
++
++
++#ifndef _CPHAL_CPSAR
++typedef void CPSAR_DEVICE;
++#endif
++
++/*
++ * HAL Default Parameter Values
++ */
++#define CFG_UNI_NNI 0
++
++/**
++ * @ingroup shared_data
++ *
++ * List of defined keys for use with Control().
++ */
++typedef enum
++ {
++ /* SAR */
++ enGET_FIRMWARE, /**< Used by the SAR to request a pointer to firmware */
++ enGET_FIRMWARE_SIZE, /**< Used by the SAR to request the size of the firmware */
++ enEND=9999 /* Last entry */
++ }INFO_KEY;
++
++/*
++ * The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
++ int (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(CPSAR_DEVICE *HalDev, int Mode);
++ int (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*Init)(CPSAR_DEVICE *HalDev);
++ int (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(CPSAR_DEVICE *HalDev);
++ int (*Probe)(CPSAR_DEVICE *HalDev);
++ int (*Shutdown)(CPSAR_DEVICE *HalDev);
++ int (*Tick)(CPSAR_DEVICE *HalDev);
++ } CPSAR_FUNCTIONS;
++
++/*
++ * This is the data structure for a generic HAL device. It contains all device
++ * specific data for a single instance of that device. This includes Rx/Tx
++ * buffer queues, device base address, reset bit, and other information.
++ */
++typedef struct cpsar_device
++ {
++ bit32 dev_base;
++ bit32 offset;
++ bit32 TxTeardownPending[MAX_CHAN];
++ bit32 RxTeardownPending[MAX_CHAN];
++ bit32 ChIsOpen[MAX_CHAN];
++ bit32 ResetBit;
++ bit32 debug;
++ OS_DEVICE *OsDev;
++ OS_FUNCTIONS *OsFunc;
++ /*void *OsOpen;*/
++ bit32 UniNni;
++ bit32 Inst;
++ bit32u DeviceCPID[4];
++ bit32u LBSourceLLID[4];
++ bit32u OamRate[11];
++ CHANNEL_INFO ChData[MAX_CHAN];
++ int InitCount;
++ int OpenCount;
++ char *DeviceInfo;
++ bit32u ResetBase;
++ DEVICE_STATE State;
++ CPSAR_FUNCTIONS *HalFuncPtr;
++ int OamMode; /* +GSG 030407 */
++ }CPSARDEVICE;
++
++extern int cpsarInitModule(CPSAR_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ CPSAR_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/cp_sar_reg.h linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h
+--- linux.old/drivers/atm/sangam_atm/cp_sar_reg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h 2005-07-10 08:02:01.428113792 +0200
+@@ -0,0 +1,217 @@
++/***************************************************************************
++ TNETD73xx Software Support
++ Copyright(c) 2000, Texas Instruments Incorporated. All Rights Reserved.
++
++ FILE: cp_sar_reg.h Register definitions for the SAR module
++
++ DESCRIPTION:
++ This include file contains register definitions for the
++ SAR module.
++
++ HISTORY:
++ 15 Jan 02 G. Guyotte Original version written
++ 03 Oct 02 G. Guyotte C++ style comments removed
++****************************************************************************/
++#ifndef _INC_SAR_REG
++#define _INC_SAR_REG
++
++/* Global Registers */
++#define pSAR_ID_REG(base) ((volatile bit32u *)(base+0x0000))
++#define SAR_ID_REG(base) (*pSAR_ID_REG(base))
++#define pSAR_STATUS_SET_REG(base) ((volatile bit32u *)(base+0x0008))
++#define SAR_STATUS_SET_REG(base) (*pSAR_STATUS_SET_REG(base))
++#define pSAR_STATUS_CLR_REG(base) ((volatile bit32u *)(base+0x000C))
++#define SAR_STATUS_CLR_REG(base) (*pSAR_STATUS_CLR_REG(base))
++#define pSAR_HOST_INT_EN_SET_REG(base) ((volatile bit32u *)(base+0x0010))
++#define SAR_HOST_INT_EN_SET_REG(base) (*pSAR_HOST_INT_EN_SET_REG(base))
++#define pSAR_HOST_INT_EN_CLR_REG(base) ((volatile bit32u *)(base+0x0014))
++#define SAR_HOST_INT_EN_CLR_REG(base) (*pSAR_HOST_INT_EN_CLR_REG(base))
++#define pSAR_PDSP_INT_EN_SET_REG(base) ((volatile bit32u *)(base+0x0018))
++#define SAR_PDSP_INT_EN_SET_REG(base) (*pSAR_PDSP_INT_EN_SET_REG(base))
++#define pSAR_PDSP_INT_EN_CLR_REG(base) ((volatile bit32u *)(base+0x001C))
++#define SAR_PDSP_INT_EN_CLR_REG(base) (*pSAR_PDSP_INT_EN_CLR_REG(base))
++
++/* PDSP OAM General Purpose Registers */
++#define pSAR_PDSP_HOST_OAM_CONFIG_REG(base) ((volatile bit32u *)(base+0x0020))
++#define SAR_PDSP_HOST_OAM_CONFIG_REG(base) (*pSAR_PDSP_HOST_OAM_CONFIG_REG(base))
++#define pSAR_PDSP_OAM_CORR_REG(base) ((volatile bit32u *)(base+0x0024))
++#define SAR_PDSP_OAM_CORR_REG(base) (*pSAR_PDSP_OAM_CORR_REG(base))
++#define pSAR_PDSP_OAM_LB_RESULT_REG(base) ((volatile bit32u *)(base+0x0028))
++#define SAR_PDSP_OAM_LB_RESULT_REG(base) (*pSAR_PDSP_OAM_LB_RESULT_REG(base))
++#define pSAR_PDSP_OAM_F5_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x002c)) /* +GSG 030416 */
++#define SAR_PDSP_OAM_F5_LB_COUNT_REG(base) (*pSAR_PDSP_OAM_F5_LB_COUNT_REG(base)) /* +GSG 030416 */
++#define pSAR_PDSP_OAM_F4_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x0030)) /* +GSG 030416 */
++#define SAR_PDSP_OAM_F4_LB_COUNT_REG(base) (*pSAR_PDSP_OAM_F4_LB_COUNT_REG(base)) /* +GSG 030416 */
++#define pSAR_PDSP_FWD_UNK_VC_REG(base) ((volatile bit32u *)(base+0x0034)) /* +GSG 030701 */
++#define SAR_PDSP_FWD_UNK_VC_REG(base) (*pSAR_PDSP_FWD_UNK_VC_REG(base)) /* +GSG 030701 */
++
++
++/* Rx Lookup Table Registers */
++#define pRX_LUT_GLOBAL_CFG_REG(base) ((volatile bit32u *)(base+0x0080))
++#define RX_LUT_GLOBAL_CFG_REG(base) (*pRX_LUT_GLOBAL_CFG_REG(base))
++#define pRX_LUT_CH_SETUP_REQ_REG(base) ((volatile bit32u *)(base+0x0090))
++#define RX_LUT_CH_SETUP_REQ_REG(base) (*pRX_LUT_CH_SETUP_REQ_REG(base))
++#define pRX_LUT_CH_SETUP_REQ_VC_REG(base) ((volatile bit32u *)(base+0x0094))
++#define RX_LUT_CH_SETUP_REQ_VC_REG(base) (*pRX_LUT_CH_SETUP_REQ_VC_REG(base))
++#define pRX_LUT_CH_TEARDOWN_REQ_REG(base) ((volatile bit32u *)(base+0x009C))
++#define RX_LUT_CH_TEARDOWN_REQ_REG(base) (*pRX_LUT_CH_TEARDOWN_REQ_REG(base))
++
++/* Tx Scheduler Registers */
++#define pTX_CH_MAPPING_REG(base) ((volatile bit32u *)(base+0x0170))
++#define TX_CH_MAPPING_REG(base) (*pTX_CH_MAPPING_REG(base))
++
++/* Tx CPPI DMA Controller Registers */
++#define pTX_CPPI_CTL_REG(base) ((volatile bit32u *)(base+0x0700))
++#define TX_CPPI_CTL_REG(base) (*pTX_CPPI_CTL_REG(base))
++#define pTX_CPPI_TEARDOWN_REG(base) ((volatile bit32u *)(base+0x0704))
++#define TX_CPPI_TEARDOWN_REG(base) (*pTX_CPPI_TEARDOWN_REG(base))
++
++/* EOI Interrupt Additions */
++#define pSAR_EOI(base) ((volatile bit32u *)(base+0x0708))
++#define SAR_EOI(base) (*pSAR_EOI(base))
++#define pSAR_INTR_VECTOR(base) ((volatile bit32u *)(base+0x070c))
++#define SAR_INTR_VECTOR(base) (*pSAR_INTR_VECTOR(base))
++#define pSAR_TX_MASKED_STATUS(base) ((volatile bit32u *)(base+0x0710))
++#define SAR_TX_MASKED_STATUS(base) (*pSAR_TX_MASKED_STATUS(base))
++#define pSAR_TX_RAW_STATUS(base) ((volatile bit32u *)(base+0x0714))
++#define SAR_TX_RAW_STATUS(base) (*pSAR_TX_RAW_STATUS(base))
++#define pSAR_TX_MASK_SET(base) ((volatile bit32u *)(base+0x0718))
++#define SAR_TX_MASK_SET(base) (*pSAR_TX_MASK_SET(base))
++#define pSAR_TX_MASK_CLR(base) ((volatile bit32u *)(base+0x071c))
++#define SAR_TX_MASK_CLR(base) (*pSAR_TX_MASK_CLR(base))
++
++/* Rx CPPI DMA Controller Registers */
++#define pRX_CPPI_CTL_REG(base) ((volatile bit32u *)(base+0x0780))
++#define RX_CPPI_CTL_REG(base) (*pRX_CPPI_CTL_REG(base))
++#define pSAR_RX_MASKED_STATUS(base) ((volatile bit32u *)(base+0x0790))
++#define SAR_RX_MASKED_STATUS(base) (*pSAR_RX_MASKED_STATUS(base))
++#define pSAR_RX_RAW_STATUS(base) ((volatile bit32u *)(base+0x0794))
++#define SAR_RX_RAW_STATUS(base) (*pSAR_RX_RAW_STATUS(base))
++#define pSAR_RX_MASK_SET(base) ((volatile bit32u *)(base+0x0798))
++#define SAR_RX_MASK_SET(base) (*pSAR_RX_MASK_SET(base))
++#define pSAR_RX_MASK_CLR(base) ((volatile bit32u *)(base+0x079c))
++#define SAR_RX_MASK_CLR(base) (*pSAR_RX_MASK_CLR(base))
++
++/* PDSP Control/Status Registers */
++#define pPDSP_CTRL_REG(base) ((volatile bit32u *)(base+0x4000))
++#define PDSP_CTRL_REG(base) (*pPDSP_CTRL_REG(base))
++
++/* PDSP Instruction RAM */
++#define pPDSP_IRAM(base) ((volatile bit32u *)(base+0x4020))
++#define PDSP_IRAM(base) (*pPDSP_IRAM(base))
++
++/*
++ * Channel 0 State/Scratchpad RAM Block
++ *
++ * The following registers (Tx DMA State, Rx DMA State, CPPI Completion PTR,
++ * and PDSP Data) have been given the correct address for channel 0. To
++ * reach the registers for channel X, add (X * 0x100) to the pointer address.
++ *
++ */
++
++#define PDSP_STATE_RAM_SIZE 1024
++
++/* Tx DMA State RAM */
++#define pTX_DMA_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8000))
++#define TX_DMA_STATE_WORD_0(base) (*pTX_DMA_STATE_WORD_0(base))
++#define pTX_DMA_STATE_WORD_1(base) ((volatile bit32u *)(base+0x8004))
++#define TX_DMA_STATE_WORD_1(base) (*pTX_DMA_STATE_WORD_1(base))
++#define pTX_DMA_STATE_WORD_2(base) ((volatile bit32u *)(base+0x8008))
++#define TX_DMA_STATE_WORD_2(base) (*pTX_DMA_STATE_WORD_2(base))
++#define pTX_DMA_STATE_WORD_3(base) ((volatile bit32u *)(base+0x800C))
++#define TX_DMA_STATE_WORD_3(base) (*pTX_DMA_STATE_WORD_3(base))
++#define pTX_DMA_STATE_WORD_4(base) ((volatile bit32u *)(base+0x8010))
++#define TX_DMA_STATE_WORD_4(base) (*pTX_DMA_STATE_WORD_4(base))
++#define pTX_DMA_STATE_WORD_5(base) ((volatile bit32u *)(base+0x8014))
++#define TX_DMA_STATE_WORD_5(base) (*pTX_DMA_STATE_WORD_5(base))
++#define pTX_DMA_STATE_WORD_6(base) ((volatile bit32u *)(base+0x8018))
++#define TX_DMA_STATE_WORD_6(base) (*pTX_DMA_STATE_WORD_6(base))
++#define pTX_DMA_STATE_WORD_7(base) ((volatile bit32u *)(base+0x801C))
++#define TX_DMA_STATE_WORD_7(base) (*pTX_DMA_STATE_WORD_7(base))
++#define pTX_DMA_STATE_WORD_8(base) ((volatile bit32u *)(base+0x8020))
++#define TX_DMA_STATE_WORD_8(base) (*pTX_DMA_STATE_WORD_8(base))
++
++/* Rx DMA State RAM */
++#define pRX_DMA_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8024))
++#define RX_DMA_STATE_WORD_0(base) (*pRX_DMA_STATE_WORD_0(base))
++#define pRX_DMA_STATE_WORD_1(base) ((volatile bit32u *)(base+0x8028))
++#define RX_DMA_STATE_WORD_1(base) (*pRX_DMA_STATE_WORD_1(base))
++#define pRX_DMA_STATE_WORD_2(base) ((volatile bit32u *)(base+0x802C))
++#define RX_DMA_STATE_WORD_2(base) (*pRX_DMA_STATE_WORD_2(base))
++#define pRX_DMA_STATE_WORD_3(base) ((volatile bit32u *)(base+0x8030))
++#define RX_DMA_STATE_WORD_3(base) (*pRX_DMA_STATE_WORD_3(base))
++#define pRX_DMA_STATE_WORD_4(base) ((volatile bit32u *)(base+0x8034))
++#define RX_DMA_STATE_WORD_4(base) (*pRX_DMA_STATE_WORD_4(base))
++#define pRX_DMA_STATE_WORD_5(base) ((volatile bit32u *)(base+0x8038))
++#define RX_DMA_STATE_WORD_5(base) (*pRX_DMA_STATE_WORD_5(base))
++#define pRX_DMA_STATE_WORD_6(base) ((volatile bit32u *)(base+0x803C))
++#define RX_DMA_STATE_WORD_6(base) (*pRX_DMA_STATE_WORD_6(base))
++
++/* Tx CPPI Completion Pointers */
++#define pTXH_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8040))
++#define TXH_CPPI_COMP_PTR(base) (*pTXH_CPPI_COMP_PTR(base))
++#define pTXL_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8044))
++#define TXL_CPPI_COMP_PTR(base) (*pTXL_CPPI_COMP_PTR(base))
++
++/* Rx CPPI Completion Pointer */
++#define pRX_CPPI_COMP_PTR(base) ((volatile bit32u *)(base+0x8048))
++#define RX_CPPI_COMP_PTR(base) (*pRX_CPPI_COMP_PTR(base))
++
++/* Tx PDSP Defines */
++#define NUM_PDSP_AAL5_STATE_WORDS 24
++#define NUM_PDSP_AAL2_STATE_WORDS 20
++
++/* PDSP State RAM Block 0 */
++#define pPDSP_BLOCK_0(base) ((volatile bit32u *)(base+0x8050))
++#define PDSP_BLOCK_0(base) (*pPDSP_BLOCK_0(base))
++
++/* AAL5 Tx PDSP State RAM */
++#define pPDSP_AAL5_TX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8050))
++#define PDSP_AAL5_TX_STATE_WORD_0(base) (*pPDSP_AAL5_TX_STATE_WORD_0(base))
++
++/* AAL5 Rx PDSP State RAM */
++#define pPDSP_AAL5_RX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8070))
++#define PDSP_AAL5_RX_STATE_WORD_0(base) (*pPDSP_AAL5_RX_STATE_WORD_0(base))
++
++/* AAL5 Tx VP PDSP State RAM */
++#define pPDSP_AAL5_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8090))
++#define PDSP_AAL5_TX_VP_STATE_WORD_0(base) (*pPDSP_AAL5_TX_VP_STATE_WORD_0(base))
++
++/* AAL5 Rx VP PDSP State RAM */
++#define pPDSP_AAL5_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80A0))
++#define PDSP_AAL5_RX_VP_STATE_WORD_0(base) (*pPDSP_AAL5_RX_VP_STATE_WORD_0(base))
++
++/* AAL2 Tx PDSP State RAM */
++#define pPDSP_AAL2_TX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80B0))
++#define PDSP_AAL2_TX_STATE_WORD_0(base) (*pPDSP_AAL2_TX_STATE_WORD_0(base))
++
++/* AAL2 Rx PDSP State RAM */
++#define pPDSP_AAL2_RX_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80D0))
++#define PDSP_AAL2_RX_STATE_WORD_0(base) (*pPDSP_AAL2_RX_STATE_WORD_0(base))
++
++/* AAL2 Tx VP PDSP State RAM */
++#define pPDSP_AAL2_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80E0))
++#define PDSP_AAL2_TX_VP_STATE_WORD_0(base) (*pPDSP_AAL2_TX_VP_STATE_WORD_0(base))
++
++/* AAL2 Rx VP PDSP State RAM */
++#define pPDSP_AAL2_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80F0))
++#define PDSP_AAL2_RX_VP_STATE_WORD_0(base) (*pPDSP_AAL2_RX_VP_STATE_WORD_0(base))
++
++/* PDSP OAM Configuration Block */
++#define pOAM_CONFIG_BLOCK_WORD_0(base) ((volatile bit32u *)(base+0x83C0))
++#define OAM_CONFIG_BLOCK_WORD_0(base) (*pOAM_CONFIG_BLOCK_WORD_0(base))
++
++/* PDSP OAM Padding Block */
++#define pOAM_PADDING_BLOCK_WORD_0(base) ((volatile bit32u *)(base+0x84C0))
++#define OAM_PADDING_BLOCK_WORD_0(base) (*pOAM_PADDING_BLOCK_WORD_0(base))
++
++#define NUM_OAM_RATES 11
++
++/* PDSP OAM Timer State RAM */
++#define pOAM_TIMER_STATE_WORD_0(base) ((volatile bit32u *)(base+0x85B0))
++#define OAM_TIMER_STATE_WORD_0(base) (*pOAM_TIMER_STATE_WORD_0(base))
++
++
++/* END OF FILE */
++
++#endif _INC_SAR_REG
+diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h
+--- linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h 2005-07-10 08:02:01.429113640 +0200
+@@ -0,0 +1,629 @@
++/************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cphal.h
++ *
++ * DESCRIPTION:
++ * User include file, contains data definitions shared between the CPHAL
++ * and the upper-layer software.
++ *
++ * HISTORY:
++ * Date Modifier Ver Notes
++ * 28Feb02 Greg 1.00 Original
++ * 06Mar02 Greg 1.01 Documentation enhanced
++ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
++ * 22Nov02 Mick RC2 Additions from Denis' input on Control
++ *
++ * author Greg Guyotte
++ * version 1.02
++ * date 18-Jul-2002
++ *****************************************************************************/
++#ifndef _INC_CPHAL_H
++#define _INC_CPHAL_H
++
++#ifdef _CPHAL_CPMAC
++#include "ec_errors_cpmac.h"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "ec_errors_cpaal5.h"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "ec_errors_cpsar.h"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "ec_errors_cpaal2.h"
++#endif
++
++#ifndef __ADAM2
++typedef char bit8;
++typedef short bit16;
++typedef int bit32;
++
++typedef unsigned char bit8u;
++typedef unsigned short bit16u;
++typedef unsigned int bit32u;
++
++/*
++typedef char INT8;
++typedef short INT16;
++typedef int INT32;
++typedef unsigned char UINT8;
++typedef unsigned short UINT16;
++typedef unsigned int UINT32;
++*/
++/*typedef unsigned int size_t;*/
++#endif
++
++#ifdef _CPHAL
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++
++#ifndef FALSE
++#define FALSE (1==2)
++#endif
++
++#ifndef NULL
++#define NULL 0
++#endif
++
++#endif
++
++#define VirtToPhys(a) (((int)a)&~0xe0000000)
++#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
++#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
++#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
++#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
++/*
++#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
++#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
++*/
++
++#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
++#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
++
++/* Channel Teardown Defines */
++#define RX_TEARDOWN 2
++#define TX_TEARDOWN 1
++#define BLOCKING_TEARDOWN 8
++#define FULL_TEARDOWN 4
++#define PARTIAL_TEARDOWN 0
++
++#define MAX_DIR 2
++#define DIRECTION_TX 0
++#define DIRECTION_RX 1
++#define TX_CH 0
++#define RX_CH 1
++#define HAL_ERROR_DEVICE_NOT_FOUND 1
++#define HAL_ERROR_FAILED_MALLOC 2
++#define HAL_ERROR_OSFUNC_SIZE 3
++#define HAL_DEFAULT 0xFFFFFFFF
++#define VALID(val) (val!=HAL_DEFAULT)
++
++/*
++ERROR REPORTING
++
++HAL Module Codes. Each HAL module reporting an error code
++should OR the error code with the respective Module error code
++from the list below.
++*/
++#define EC_AAL5 EC_HAL|EC_DEV_AAL5
++#define EC_AAL2 EC_HAL|EC_DEV_AAL2
++#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
++#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
++#define EC_VDMA EC_HAL|EC_DEV_VDMA
++#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
++#define EC_CPPI EC_HAL|EC_DEV_CPPI
++
++/*
++HAL Function Codes. Each HAL module reporting an error code
++should OR the error code with one of the function codes from
++the list below.
++*/
++#define EC_FUNC_HAL_INIT EC_FUNC(1)
++#define EC_FUNC_CHSETUP EC_FUNC(2)
++#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
++#define EC_FUNC_RXRETURN EC_FUNC(4)
++#define EC_FUNC_SEND EC_FUNC(5)
++#define EC_FUNC_RXINT EC_FUNC(6)
++#define EC_FUNC_TXINT EC_FUNC(7)
++#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
++#define EC_FUNC_OPTIONS EC_FUNC(9)
++#define EC_FUNC_PROBE EC_FUNC(10)
++#define EC_FUNC_OPEN EC_FUNC(11)
++#define EC_FUNC_CONTROL EC_FUNC(12)
++#define EC_FUNC_DEVICE_INT EC_FUNC(13)
++#define EC_FUNC_STATUS EC_FUNC(14)
++#define EC_FUNC_TICK EC_FUNC(15)
++#define EC_FUNC_CLOSE EC_FUNC(16)
++#define EC_FUNC_SHUTDOWN EC_FUNC(17)
++#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
++
++/*
++HAL Error Codes. The list below defines every type of error
++used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
++values in integer order to the bottom of the list.
++*/
++#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
++#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
++#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
++#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
++#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
++#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
++#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
++#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
++#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
++#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
++#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
++#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
++
++#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
++#define EC_VAL_INVALID_CH EC_ERR(0x0E)
++#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
++#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
++#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
++#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
++#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
++#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
++#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
++#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
++#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
++#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
++#define EC_VAL_INVALID_VC EC_ERR(0x19)
++#define EC_VAL_INVALID_LC EC_ERR(0x20)
++#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
++#define EC_VAL_INVALID_CID EC_ERR(0x22)
++#define EC_VAL_INVALID_UUI EC_ERR(0x23)
++#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
++#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
++
++#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
++#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
++#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
++#define EC_VAL_NO_TCBS EC_ERR(0x29)
++#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
++#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
++#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
++#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
++#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
++#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
++
++#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
++#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
++#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
++#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
++#define EC_VAL_INVALID_STATE EC_ERR(0x40)
++#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
++#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
++#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
++#define EC_VAL_NOT_LINKED EC_ERR(0x44)
++#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
++#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
++#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
++#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
++#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
++#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
++#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
++#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
++#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
++#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
++#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
++#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
++#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
++
++/**
++@defgroup shared_data Shared Data Structures
++
++The data structures documented here are shared by all modules.
++*/
++
++/**
++ * @ingroup shared_data
++ * This is the fragment list structure. Each fragment list entry contains a
++ * length and a data buffer.
++ */
++typedef struct
++ {
++ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
++ void *data; /**< Pointer to fragment data. */
++ void *OsInfo; /**< Pointer to OS defined data. */
++ }FRAGLIST;
++
++#if defined (_CPHAL_CPMAC)
++#define CB_PASSCRC_BIT (1<<26)
++
++/* CPMAC CPHAL STATUS */
++#define CPMAC_STATUS_LINK (1 << 0)
++#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
++#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
++
++/* ADAPTER CHECK Codes */
++
++#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
++#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
++#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
++#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
++
++#define _CPMDIO_DISABLE (1 << 0)
++#define _CPMDIO_HD (1 << 1)
++#define _CPMDIO_FD (1 << 2)
++#define _CPMDIO_10 (1 << 3)
++#define _CPMDIO_100 (1 << 4)
++#define _CPMDIO_NEG_OFF (1 << 5)
++#define _CPMDIO_LOOPBK (1 << 16)
++#define _CPMDIO_NOPHY (1 << 20)
++#endif
++
++/**
++ * @ingroup shared_data
++ * Channel specific configuration information. This structure should be
++ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
++ * configuration item that can be changed on a per channel basis should
++ * be represented here. Each module may define this structure with additional
++ * module-specific members.
++ */
++typedef struct
++ {
++ int Channel; /**< Channel number. */
++ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
++ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
++
++#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
++ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
++ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
++ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
++ int RxServiceMax; /**< Maximum number of packets to service at one time. */
++
++ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
++ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
++ int TxServiceMax; /**< Maximum number of packets to service at one time. */
++#endif
++
++#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
++ int Gfc; /**< Generic Flow Control. */
++ int Clp; /**< Cell Loss Priority. */
++ int Pti; /**< Payload Type Indication. */
++#endif
++
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
++ int Priority; /**< Priority bin this channel will be scheduled within. */
++ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
++ int Vci; /**< Virtual Channel Identifier. */
++ int Vpi; /**< Virtual Path Identifier. */
++ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
++
++ /* Tx VC State */
++ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
++ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
++ int TxVc_Mbs; /**< Min Burst Size in cells.*/
++ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
++
++ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
++ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
++ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Rx VC State */
++ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
++ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
++ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Tx VP State */
++ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
++ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
++ /* Rx VP State */
++ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
++ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
++ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
++#endif
++
++
++#ifdef _CPHAL_VDMAVT
++ bit32u RemFifoAddr; /* Mirror mode only. */
++ bit32u FifoAddr;
++ bit32 PollInt;
++ bit32 FifoSize;
++ int Ready;
++#endif
++
++ }CHANNEL_INFO;
++
++/*
++ * This structure contains each statistic value gathered by the CPHAL.
++ * Applications may access statistics data by using the @c StatsGet() routine.
++ */
++/* STATS */
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++typedef struct
++ {
++ bit32u CrcErrors[16];
++ bit32u LenErrors[16];
++ bit32u DmaLenErrors[16];
++ bit32u AbortErrors[16];
++ bit32u StarvErrors[16];
++ bit32u TxMisQCnt[16][2];
++ bit32u RxMisQCnt[16];
++ bit32u RxEOQCnt[16];
++ bit32u TxEOQCnt[16][2];
++ bit32u RxPacketsServiced[16];
++ bit32u TxPacketsServiced[16][2];
++ bit32u RxMaxServiced;
++ bit32u TxMaxServiced[16][2];
++ bit32u RxTotal;
++ bit32u TxTotal;
++ } STAT_INFO;
++#endif
++
++/*
++ * VDMA Channel specific configuration information
++ */
++#ifdef _CPHAL_AAL2
++typedef struct
++ {
++ int Ch; /**< Channel Number */
++ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
++ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
++ }VdmaChInfo;
++#endif
++
++#ifndef _CPHAL
++ typedef void HAL_DEVICE;
++ typedef void HAL_PRIVATE;
++ typedef void HAL_RCB;
++ typedef void HAL_RECEIVEINFO;
++#endif
++
++/**
++ * @ingroup shared_data
++ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to xxxInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
++ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
++ int (*Close) (HAL_DEVICE *HalDev, int Mode);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*Init) (HAL_DEVICE *HalDev);
++ int (*Open) (HAL_DEVICE *HalDev);
++ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
++ int (*Probe) (HAL_DEVICE *HalDev);
++ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
++ int (*Shutdown) (HAL_DEVICE *HalDev);
++ int (*Tick) (HAL_DEVICE *HalDev);
++
++#ifdef _CPHAL_AAL5
++ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
++ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
++ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
++#endif
++ } HAL_FUNCTIONS;
++
++/**
++ * @ingroup shared_data
++ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
++ * functions accessible to the CPHAL. The upper layer software is responsible
++ * for providing the correct OS-specific implementations for the following
++ * functions. It is populated by calling InitModule() (done by the CPHAL in
++ * xxxInitModule().
++ */
++typedef struct
++ {
++ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
++ void (*CriticalOn)(void);
++ void (*CriticalOff)(void);
++ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
++ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
++ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
++ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
++ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
++ void (*Free)(void *MemPtr);
++ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
++ void (*FreeDev)(void *MemPtr);
++ void (*FreeDmaXfer)(void *MemPtr);
++ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
++ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
++ void* (*Malloc)(bit32u size);
++ void* (*MallocDev)(bit32u Size);
++ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
++ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
++ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
++ void* (*Memset)(void *Dest, int C, bit32u N);
++ int (*Printf)(const char *Format, ...);
++ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
++ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
++ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
++ int (*Sprintf)(char *S, const char *Format, ...);
++ int (*Strcmpi)(const char *Str1, const char *Str2);
++ unsigned int (*Strlen)(const char *S);
++ char* (*Strstr)(const char *S1, const char *S2);
++ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
++ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
++ } OS_FUNCTIONS;
++
++/************** MODULE SPECIFIC STUFF BELOW **************/
++
++#ifdef _CPHAL_CPMAC
++
++/*
++int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
++*/
++
++int halCpmacInitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL5
++/*
++ * @ingroup shared_data
++ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++/*
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
++ bit32u Mode);
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ } AAL5_FUNCTIONS;
++*/
++
++int cpaal5InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL2
++/**
++ * @ingroup shared_data
++ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
++ int VdmaCh, int UUIDiscard);
++ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
++ int LC);
++ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
++ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
++ VdmaChInfo *VdmaCh);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
++ int RxMultiMode, int TxMultiMode, int SchedMode,
++ int TcCh);
++ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
++ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
++ } AAL2_FUNCTIONS;
++
++int cpaal2InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ AAL2_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_VDMAVT
++/**
++ * @ingroup shared_data
++ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to InitModule().
++ *
++ * Note that this list is still under definition.
++ */
++typedef struct
++ {
++ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
++ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt);
++ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt); */
++ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
++ bit32u RemDevID);
++ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
++ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
++ } VDMA_FUNCTIONS;
++
++int VdmaInitModule(HAL_DEVICE **VdmaVt,
++ OS_DEVICE *OsDev,
++ VDMA_FUNCTIONS **VdmaVtFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++/*
++extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
++ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
++ int *Size, int Inst);
++*/
++
++
++#ifdef _CPHAL_AAL5
++extern const char hcSarFrequency[];
++#endif
++
++#ifdef _CPHAL_CPMAC
++/* following will be common, once 'utl' added */
++extern const char hcClear[];
++extern const char hcGet[];
++extern const char hcSet[];
++extern const char hcTick[];
++
++extern const char hcCpuFrequency[];
++extern const char hcCpmacFrequency[];
++extern const char hcMdioBusFrequency[];
++extern const char hcMdioClockFrequency[];
++extern const char hcCpmacBase[];
++extern const char hcPhyNum[];
++extern const char hcSize[];
++extern const char hcCpmacSize[];
++extern const char hcPhyAccess[];
++#endif
++
++#endif /* end of _INC_ */
+diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h
+--- linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h 2005-07-10 08:02:01.430113488 +0200
+@@ -0,0 +1,629 @@
++/************************************************************************
++ * TNETDxxxx Software Support
++ * Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
++ *
++ * FILE: cphal.h
++ *
++ * DESCRIPTION:
++ * User include file, contains data definitions shared between the CPHAL
++ * and the upper-layer software.
++ *
++ * HISTORY:
++ * Date Modifier Ver Notes
++ * 28Feb02 Greg 1.00 Original
++ * 06Mar02 Greg 1.01 Documentation enhanced
++ * 18Jul02 Greg 1.02 Many updates (OAM additions, general reorg)
++ * 22Nov02 Mick RC2 Additions from Denis' input on Control
++ *
++ * author Greg Guyotte
++ * version 1.02
++ * date 18-Jul-2002
++ *****************************************************************************/
++#ifndef _INC_CPHAL_H
++#define _INC_CPHAL_H
++
++#ifdef _CPHAL_CPMAC
++#include "ec_errors_cpmac.h"
++#endif
++
++#ifdef _CPHAL_AAL5
++#include "ec_errors_cpaal5.h"
++#endif
++
++#ifdef _CPHAL_CPSAR
++#include "ec_errors_cpsar.h"
++#endif
++
++#ifdef _CPHAL_AAL2
++#include "ec_errors_cpaal2.h"
++#endif
++
++#ifndef __ADAM2
++typedef char bit8;
++typedef short bit16;
++typedef int bit32;
++
++typedef unsigned char bit8u;
++typedef unsigned short bit16u;
++typedef unsigned int bit32u;
++
++/*
++typedef char INT8;
++typedef short INT16;
++typedef int INT32;
++typedef unsigned char UINT8;
++typedef unsigned short UINT16;
++typedef unsigned int UINT32;
++*/
++/*typedef unsigned int size_t;*/
++#endif
++
++#ifdef _CPHAL
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++
++#ifndef FALSE
++#define FALSE (1==2)
++#endif
++
++#ifndef NULL
++#define NULL 0
++#endif
++
++#endif
++
++#define VirtToPhys(a) (((int)a)&~0xe0000000)
++#define VirtToVirtNoCache(a) ((void*)((VirtToPhys(a))|0xa0000000))
++#define VirtToVirtCache(a) ((void*)((VirtToPhys(a))|0x80000000))
++#define PhysToVirtNoCache(a) ((void*)(((int)a)|0xa0000000))
++#define PhysToVirtCache(a) ((void*)(((int)a)|0x80000000))
++/*
++#define DataCacheHitInvalidate(a) {__asm__(" cache 17, (%0)" : : "r" (a));}
++#define DataCacheHitWriteback(a) {__asm__(" cache 25, (%0)" : : "r" (a));}
++*/
++
++#define PARTIAL 1 /**< Used in @c Close() and @c ChannelTeardown() */
++#define FULL 2 /**< Used in @c Close() and @c ChannelTeardown() */
++
++/* Channel Teardown Defines */
++#define RX_TEARDOWN 2
++#define TX_TEARDOWN 1
++#define BLOCKING_TEARDOWN 8
++#define FULL_TEARDOWN 4
++#define PARTIAL_TEARDOWN 0
++
++#define MAX_DIR 2
++#define DIRECTION_TX 0
++#define DIRECTION_RX 1
++#define TX_CH 0
++#define RX_CH 1
++#define HAL_ERROR_DEVICE_NOT_FOUND 1
++#define HAL_ERROR_FAILED_MALLOC 2
++#define HAL_ERROR_OSFUNC_SIZE 3
++#define HAL_DEFAULT 0xFFFFFFFF
++#define VALID(val) (val!=HAL_DEFAULT)
++
++/*
++ERROR REPORTING
++
++HAL Module Codes. Each HAL module reporting an error code
++should OR the error code with the respective Module error code
++from the list below.
++*/
++#define EC_AAL5 EC_HAL|EC_DEV_AAL5
++#define EC_AAL2 EC_HAL|EC_DEV_AAL2
++#define EC_CPSAR EC_HAL|EC_DEV_CPSAR
++#define EC_CPMAC EC_HAL|EC_DEV_CPMAC
++#define EC_VDMA EC_HAL|EC_DEV_VDMA
++#define EC_VLYNQ EC_HAL|EC_DEV_VLYNQ
++#define EC_CPPI EC_HAL|EC_DEV_CPPI
++
++/*
++HAL Function Codes. Each HAL module reporting an error code
++should OR the error code with one of the function codes from
++the list below.
++*/
++#define EC_FUNC_HAL_INIT EC_FUNC(1)
++#define EC_FUNC_CHSETUP EC_FUNC(2)
++#define EC_FUNC_CHTEARDOWN EC_FUNC(3)
++#define EC_FUNC_RXRETURN EC_FUNC(4)
++#define EC_FUNC_SEND EC_FUNC(5)
++#define EC_FUNC_RXINT EC_FUNC(6)
++#define EC_FUNC_TXINT EC_FUNC(7)
++#define EC_FUNC_AAL2_VDMA EC_FUNC(8)
++#define EC_FUNC_OPTIONS EC_FUNC(9)
++#define EC_FUNC_PROBE EC_FUNC(10)
++#define EC_FUNC_OPEN EC_FUNC(11)
++#define EC_FUNC_CONTROL EC_FUNC(12)
++#define EC_FUNC_DEVICE_INT EC_FUNC(13)
++#define EC_FUNC_STATUS EC_FUNC(14)
++#define EC_FUNC_TICK EC_FUNC(15)
++#define EC_FUNC_CLOSE EC_FUNC(16)
++#define EC_FUNC_SHUTDOWN EC_FUNC(17)
++#define EC_FUNC_DEVICE_INT_ALT EC_FUNC(18) /* +GSG 030306 */
++
++/*
++HAL Error Codes. The list below defines every type of error
++used in all HAL modules. DO NOT CHANGE THESE VALUES! Add new
++values in integer order to the bottom of the list.
++*/
++#define EC_VAL_PDSP_LOAD_FAIL EC_ERR(0x01)|EC_CRITICAL
++#define EC_VAL_FIRMWARE_TOO_LARGE EC_ERR(0x02)|EC_CRITICAL
++#define EC_VAL_DEVICE_NOT_FOUND EC_ERR(0x03)|EC_CRITICAL
++#define EC_VAL_BASE_ADDR_NOT_FOUND EC_ERR(0x04)|EC_CRITICAL
++#define EC_VAL_RESET_BIT_NOT_FOUND EC_ERR(0x05)|EC_CRITICAL
++#define EC_VAL_CH_INFO_NOT_FOUND EC_ERR(0x06)
++#define EC_VAL_RX_STATE_RAM_NOT_CLEARED EC_ERR(0x07)|EC_CRITICAL
++#define EC_VAL_TX_STATE_RAM_NOT_CLEARED EC_ERR(0x08)|EC_CRITICAL
++#define EC_VAL_MALLOC_DEV_FAILED EC_ERR(0x09)
++#define EC_VAL_OS_VERSION_NOT_SUPPORTED EC_ERR(0x0A)|EC_CRITICAL
++#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED EC_ERR(0x0B)|EC_CRITICAL
++#define EC_VAL_NULL_CPSAR_DEV EC_ERR(0x0C)|EC_CRITICAL
++
++#define EC_VAL_LUT_NOT_READY EC_ERR(0x0D)
++#define EC_VAL_INVALID_CH EC_ERR(0x0E)
++#define EC_VAL_NULL_CH_STRUCT EC_ERR(0x0F)
++#define EC_VAL_RX_TEARDOWN_ALREADY_PEND EC_ERR(0x10)
++#define EC_VAL_TX_TEARDOWN_ALREADY_PEND EC_ERR(0x11)
++#define EC_VAL_RX_CH_ALREADY_TORNDOWN EC_ERR(0x12)
++#define EC_VAL_TX_CH_ALREADY_TORNDOWN EC_ERR(0x13)
++#define EC_VAL_TX_TEARDOWN_TIMEOUT EC_ERR(0x14)
++#define EC_VAL_RX_TEARDOWN_TIMEOUT EC_ERR(0x15)
++#define EC_VAL_CH_ALREADY_TORNDOWN EC_ERR(0x16)
++#define EC_VAL_VC_SETUP_NOT_READY EC_ERR(0x17)
++#define EC_VAL_VC_TEARDOWN_NOT_READY EC_ERR(0x18)
++#define EC_VAL_INVALID_VC EC_ERR(0x19)
++#define EC_VAL_INVALID_LC EC_ERR(0x20)
++#define EC_VAL_INVALID_VDMA_CH EC_ERR(0x21)
++#define EC_VAL_INVALID_CID EC_ERR(0x22)
++#define EC_VAL_INVALID_UUI EC_ERR(0x23)
++#define EC_VAL_INVALID_UUI_DISCARD EC_ERR(0x24)
++#define EC_VAL_CH_ALREADY_OPEN EC_ERR(0x25)
++
++#define EC_VAL_RCB_MALLOC_FAILED EC_ERR(0x26)
++#define EC_VAL_RX_BUFFER_MALLOC_FAILED EC_ERR(0x27)
++#define EC_VAL_OUT_OF_TCBS EC_ERR(0x28)
++#define EC_VAL_NO_TCBS EC_ERR(0x29)
++#define EC_VAL_NULL_RCB EC_ERR(0x30)|EC_CRITICAL
++#define EC_VAL_SOP_ERROR EC_ERR(0x31)|EC_CRITICAL
++#define EC_VAL_EOP_ERROR EC_ERR(0x32)|EC_CRITICAL
++#define EC_VAL_NULL_TCB EC_ERR(0x33)|EC_CRITICAL
++#define EC_VAL_CORRUPT_RCB_CHAIN EC_ERR(0x34)|EC_CRITICAL
++#define EC_VAL_TCB_MALLOC_FAILED EC_ERR(0x35)
++
++#define EC_VAL_DISABLE_POLLING_FAILED EC_ERR(0x36)
++#define EC_VAL_KEY_NOT_FOUND EC_ERR(0x37)
++#define EC_VAL_MALLOC_FAILED EC_ERR(0x38)
++#define EC_VAL_RESET_BASE_NOT_FOUND EC_ERR(0x39)|EC_CRITICAL
++#define EC_VAL_INVALID_STATE EC_ERR(0x40)
++#define EC_VAL_NO_TXH_WORK_TO_DO EC_ERR(0x41)
++#define EC_VAL_NO_TXL_WORK_TO_DO EC_ERR(0x42)
++#define EC_VAL_NO_RX_WORK_TO_DO EC_ERR(0x43)
++#define EC_VAL_NOT_LINKED EC_ERR(0x44)
++#define EC_VAL_INTERRUPT_NOT_FOUND EC_ERR(0x45)
++#define EC_VAL_OFFSET_NOT_FOUND EC_ERR(0x46)
++#define EC_VAL_MODULE_ALREADY_CLOSED EC_ERR(0x47)
++#define EC_VAL_MODULE_ALREADY_SHUTDOWN EC_ERR(0x48)
++#define EC_VAL_ACTION_NOT_FOUND EC_ERR(0x49)
++#define EC_VAL_RX_CH_ALREADY_SETUP EC_ERR(0x50)
++#define EC_VAL_TX_CH_ALREADY_SETUP EC_ERR(0x51)
++#define EC_VAL_RX_CH_ALREADY_OPEN EC_ERR(0x52)
++#define EC_VAL_TX_CH_ALREADY_OPEN EC_ERR(0x53)
++#define EC_VAL_CH_ALREADY_SETUP EC_ERR(0x54)
++#define EC_VAL_RCB_NEEDS_BUFFER EC_ERR(0x55) /* +GSG 030410 */
++#define EC_VAL_RCB_DROPPED EC_ERR(0x56) /* +GSG 030410 */
++#define EC_VAL_INVALID_VALUE EC_ERR(0x57)
++
++/**
++@defgroup shared_data Shared Data Structures
++
++The data structures documented here are shared by all modules.
++*/
++
++/**
++ * @ingroup shared_data
++ * This is the fragment list structure. Each fragment list entry contains a
++ * length and a data buffer.
++ */
++typedef struct
++ {
++ bit32u len; /**< Length of the fragment in bytes (lower 16 bits are valid). For SOP, upper 16 bits is the buffer offset. */
++ void *data; /**< Pointer to fragment data. */
++ void *OsInfo; /**< Pointer to OS defined data. */
++ }FRAGLIST;
++
++#if defined (_CPHAL_CPMAC)
++#define CB_PASSCRC_BIT (1<<26)
++
++/* CPMAC CPHAL STATUS */
++#define CPMAC_STATUS_LINK (1 << 0)
++#define CPMAC_STATUS_LINK_DUPLEX (1 << 1) /* 0 - HD, 1 - FD */
++#define CPMAC_STATUS_LINK_SPEED (1 << 2) /* 0 - 10, 1 - 100 */
++
++/* ADAPTER CHECK Codes */
++
++#define CPMAC_STATUS_ADAPTER_CHECK (1 << 7)
++#define CPMAC_STATUS_HOST_ERR_DIRECTION (1 << 8)
++#define CPMAC_STATUS_HOST_ERR_CODE (0xF << 9)
++#define CPMAC_STATUS_HOST_ERR_CH (0x7 << 13)
++
++#define _CPMDIO_DISABLE (1 << 0)
++#define _CPMDIO_HD (1 << 1)
++#define _CPMDIO_FD (1 << 2)
++#define _CPMDIO_10 (1 << 3)
++#define _CPMDIO_100 (1 << 4)
++#define _CPMDIO_NEG_OFF (1 << 5)
++#define _CPMDIO_LOOPBK (1 << 16)
++#define _CPMDIO_NOPHY (1 << 20)
++#endif
++
++/**
++ * @ingroup shared_data
++ * Channel specific configuration information. This structure should be
++ * populated by upper-layer software prior to calling @c ChannelSetup(). Any
++ * configuration item that can be changed on a per channel basis should
++ * be represented here. Each module may define this structure with additional
++ * module-specific members.
++ */
++typedef struct
++ {
++ int Channel; /**< Channel number. */
++ int Direction; /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
++ OS_SETUP *OsSetup; /**< OS defined information associated with this channel. */
++
++#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
++ int RxBufSize; /**< Size (in bytes) for each Rx buffer.*/
++ int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
++ int RxNumBuffers; /**< The number of Rx buffer descriptors to allocate for Ch. */
++ int RxServiceMax; /**< Maximum number of packets to service at one time. */
++
++ int TxNumBuffers; /**< The number of Tx buffer descriptors to allocate for Ch. */
++ int TxNumQueues; /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
++ int TxServiceMax; /**< Maximum number of packets to service at one time. */
++#endif
++
++#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int CpcsUU; /**< The 2-byte CPCS UU and CPI information. */
++ int Gfc; /**< Generic Flow Control. */
++ int Clp; /**< Cell Loss Priority. */
++ int Pti; /**< Payload Type Indication. */
++#endif
++
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++ int DaMask; /**< Specifies whether credit issuance is paused when Tx data not available. */
++ int Priority; /**< Priority bin this channel will be scheduled within. */
++ int PktType; /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
++ int Vci; /**< Virtual Channel Identifier. */
++ int Vpi; /**< Virtual Path Identifier. */
++ int FwdUnkVc; /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
++
++ /* Tx VC State */
++ int TxVc_CellRate; /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
++ int TxVc_QosType; /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
++ int TxVc_Mbs; /**< Min Burst Size in cells.*/
++ int TxVc_Pcr; /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
++
++ bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
++ int TxVc_OamTc; /**< TC Path to transmit OAM cells for TX connection (0,1). */
++ int TxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Rx VC State */
++ int RxVc_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
++ int RxVc_OamTc; /**< TC Path to transmit OAM cells for RX connection (0,1). */
++ int RxVc_VpOffset; /**< Offset to the OAM VP state table. */
++ /* Tx VP State */
++ int TxVp_OamTc; /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
++ bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
++ /* Rx VP State */
++ int RxVp_OamCh; /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
++ int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
++ bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
++ int RxVp_OamTc; /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
++ int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
++#endif
++
++
++#ifdef _CPHAL_VDMAVT
++ bit32u RemFifoAddr; /* Mirror mode only. */
++ bit32u FifoAddr;
++ bit32 PollInt;
++ bit32 FifoSize;
++ int Ready;
++#endif
++
++ }CHANNEL_INFO;
++
++/*
++ * This structure contains each statistic value gathered by the CPHAL.
++ * Applications may access statistics data by using the @c StatsGet() routine.
++ */
++/* STATS */
++#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
++typedef struct
++ {
++ bit32u CrcErrors[16];
++ bit32u LenErrors[16];
++ bit32u DmaLenErrors[16];
++ bit32u AbortErrors[16];
++ bit32u StarvErrors[16];
++ bit32u TxMisQCnt[16][2];
++ bit32u RxMisQCnt[16];
++ bit32u RxEOQCnt[16];
++ bit32u TxEOQCnt[16][2];
++ bit32u RxPacketsServiced[16];
++ bit32u TxPacketsServiced[16][2];
++ bit32u RxMaxServiced;
++ bit32u TxMaxServiced[16][2];
++ bit32u RxTotal;
++ bit32u TxTotal;
++ } STAT_INFO;
++#endif
++
++/*
++ * VDMA Channel specific configuration information
++ */
++#ifdef _CPHAL_AAL2
++typedef struct
++ {
++ int Ch; /**< Channel Number */
++ int RemoteEndian; /**< Endianness of remote VDMA-VT device */
++ int CpsSwap; /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device. When 1, in MS byte. */
++ }VdmaChInfo;
++#endif
++
++#ifndef _CPHAL
++ typedef void HAL_DEVICE;
++ typedef void HAL_PRIVATE;
++ typedef void HAL_RCB;
++ typedef void HAL_RECEIVEINFO;
++#endif
++
++/**
++ * @ingroup shared_data
++ * The HAL_FUNCTIONS struct defines the function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to xxxInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup) (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
++ int (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
++ int (*Close) (HAL_DEVICE *HalDev, int Mode);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*Init) (HAL_DEVICE *HalDev);
++ int (*Open) (HAL_DEVICE *HalDev);
++ int (*PacketProcessEnd) (HAL_DEVICE *HalDev);
++ int (*Probe) (HAL_DEVICE *HalDev);
++ int (*RxReturn) (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send) (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
++ int (*Shutdown) (HAL_DEVICE *HalDev);
++ int (*Tick) (HAL_DEVICE *HalDev);
++
++#ifdef _CPHAL_AAL5
++ int (*Kick) (HAL_DEVICE *HalDev, int Queue);
++ void (*OamFuncConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig);
++ void (*OamLoopbackConfig) (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ STAT_INFO* (*StatsGetOld)(HAL_DEVICE *HalDev);
++#endif
++ } HAL_FUNCTIONS;
++
++/**
++ * @ingroup shared_data
++ * The OS_FUNCTIONS struct defines the function pointers for all upper layer
++ * functions accessible to the CPHAL. The upper layer software is responsible
++ * for providing the correct OS-specific implementations for the following
++ * functions. It is populated by calling InitModule() (done by the CPHAL in
++ * xxxInitModule().
++ */
++typedef struct
++ {
++ int (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
++ void (*CriticalOn)(void);
++ void (*CriticalOff)(void);
++ void (*DataCacheHitInvalidate)(void *MemPtr, int Size);
++ void (*DataCacheHitWriteback)(void *MemPtr, int Size);
++ int (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
++ int (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
++ int (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
++ void (*Free)(void *MemPtr);
++ void (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
++ void (*FreeDev)(void *MemPtr);
++ void (*FreeDmaXfer)(void *MemPtr);
++ void (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
++ void (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
++ void* (*Malloc)(bit32u size);
++ void* (*MallocDev)(bit32u Size);
++ void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
++ void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
++ OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
++ OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
++ void* (*Memset)(void *Dest, int C, bit32u N);
++ int (*Printf)(const char *Format, ...);
++ int (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
++ bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
++ int (*SendComplete)(OS_SENDINFO *OsSendInfo);
++ int (*Sprintf)(char *S, const char *Format, ...);
++ int (*Strcmpi)(const char *Str1, const char *Str2);
++ unsigned int (*Strlen)(const char *S);
++ char* (*Strstr)(const char *S1, const char *S2);
++ unsigned long (*Strtoul)(const char *Str, char **Endptr, int Base);
++ void (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
++ } OS_FUNCTIONS;
++
++/************** MODULE SPECIFIC STUFF BELOW **************/
++
++#ifdef _CPHAL_CPMAC
++
++/*
++int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
++*/
++
++int halCpmacInitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL5
++/*
++ * @ingroup shared_data
++ * The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++/*
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++ int (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
++ int (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
++ bit32u Mode);
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Kick)(HAL_DEVICE *HalDev, int Queue);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ } AAL5_FUNCTIONS;
++*/
++
++int cpaal5InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ HAL_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_AAL2
++/**
++ * @ingroup shared_data
++ * The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to cphalInitModule().
++ */
++typedef struct
++ {
++ int (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
++ int (*Close)(HAL_DEVICE *HalDev, int Mode);
++ int (*Init)(HAL_DEVICE *HalDev);
++ int (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
++ int (*Open)(HAL_DEVICE *HalDev);
++ int (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
++ int (*Probe)(HAL_DEVICE *HalDev);
++
++ int (*StatsClear)(HAL_DEVICE *HalDev);
++ STAT_INFO* (*StatsGet)(HAL_DEVICE *HalDev);
++ int (*Status)(HAL_DEVICE *HalDev);
++ void (*Tick)(HAL_DEVICE *HalDev);
++ int (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
++ int VdmaCh, int UUIDiscard);
++ int (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
++ int LC);
++ int (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
++ int (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
++ VdmaChInfo *VdmaCh);
++ volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
++ int (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
++ int RxMultiMode, int TxMultiMode, int SchedMode,
++ int TcCh);
++ void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
++ int (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
++ } AAL2_FUNCTIONS;
++
++int cpaal2InitModule(HAL_DEVICE **HalDev,
++ OS_DEVICE *OsDev,
++ AAL2_FUNCTIONS **HalFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++#ifdef _CPHAL_VDMAVT
++/**
++ * @ingroup shared_data
++ * The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
++ * software. The upper layer software receives these pointers through the
++ * call to InitModule().
++ *
++ * Note that this list is still under definition.
++ */
++typedef struct
++ {
++ bit32 (*Init)( HAL_DEVICE *VdmaVtDev);
++ /* bit32 (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt);
++ bit32 (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
++ bit32u Addr, bit32u Size, bit32u PollInt); */
++ bit32 (*Tx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Rx)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
++ bit32u RemDevID);
++ bit32 (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Open)(HAL_DEVICE *VdmaVtDev);
++ bit32 (*Close)(HAL_DEVICE *VdmaVtDev);
++ int (*Control) (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
++ int (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
++ int (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
++ int (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
++ int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
++ } VDMA_FUNCTIONS;
++
++int VdmaInitModule(HAL_DEVICE **VdmaVt,
++ OS_DEVICE *OsDev,
++ VDMA_FUNCTIONS **VdmaVtFunc,
++ OS_FUNCTIONS *OsFunc,
++ int OsFuncSize,
++ int *HalFuncSize,
++ int Inst);
++#endif
++
++/*
++extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
++ int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
++ int *Size, int Inst);
++*/
++
++
++#ifdef _CPHAL_AAL5
++extern const char hcSarFrequency[];
++#endif
++
++#ifdef _CPHAL_CPMAC
++/* following will be common, once 'utl' added */
++extern const char hcClear[];
++extern const char hcGet[];
++extern const char hcSet[];
++extern const char hcTick[];
++
++extern const char hcCpuFrequency[];
++extern const char hcCpmacFrequency[];
++extern const char hcMdioBusFrequency[];
++extern const char hcMdioClockFrequency[];
++extern const char hcCpmacBase[];
++extern const char hcPhyNum[];
++extern const char hcSize[];
++extern const char hcCpmacSize[];
++extern const char hcPhyAccess[];
++#endif
++
++#endif /* end of _INC_ */
+diff -urN linux.old/drivers/atm/sangam_atm/dev_host_interface.h linux.dev/drivers/atm/sangam_atm/dev_host_interface.h
+--- linux.old/drivers/atm/sangam_atm/dev_host_interface.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dev_host_interface.h 2005-07-10 08:02:01.432113184 +0200
+@@ -0,0 +1,1162 @@
++#ifndef __DEV_HOST_INTERFACE_H__
++#define __DEV_HOST_INTERFACE_H__ 1
++
++/*******************************************************************************
++* FILE PURPOSE: Public header file for the Host-to-DSP interface
++********************************************************************************
++*
++* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
++*
++* (C) Copyright Texas Instruments Inc. 2002. All rights reserved.
++*
++* Property of Texas Instruments Incorporated
++*
++* Restricted Rights - Use, duplication, or disclosure is subject to
++* restrictions set forth in TI's program license agreement and
++* associated documentation
++*
++*
++* FILE NAME: dev_host_interface.h
++*
++* DESCRIPTION:
++* This header file defines the variables and parameters used between the
++* host processor and the DSP. This file is included in both the DSP
++* software and the host software.
++*
++* RULES FOR MODIFICATION AND USE OF THIS FILE:
++*
++* --The main pointer to the struct of pointers will always be at the same fixed
++* location (0x80000000).
++*
++* --Each pointer element in the struct of pointers (indicated by the main pointer)
++* will always point to a struct only.
++*
++* --Any new structures added to the host interface in subsequent versions must
++* each have a corresponding new pointer element added to the END of the struct
++* of pointers. Other than this, there will never be any moving or rearranging
++* of the pointer elements in the struct of pointers.
++*
++* --Any new elements added to existing structures will be added at the END of the
++* structure. Other than this, there will never be any moving or rearranging
++* of structure elements.
++*
++* --A new structure will never be added as a new element in an old structure.
++* New structures must be added separately with a new entry in the struct of
++* pointers, as noted above.
++*
++* --Also, the sizes of existing arrays within old structures will never be changed.
++*
++* --The modem code in the DSP will never reference the struct of pointers in order
++* to avoid aliasing issues in the DSP code. The modem code will only use the
++* specific structures directly.
++*
++* --The host processor never accesses the DSP side of the ATM-TC hardware directly.
++* The DSP interfaces directly to the ATM-TC hardware and relays information to
++* the host processor through the host interface.
++*
++* --The host processor can track the modem's transition through important states
++* by accessing the Modem State Bit Field in the host interface. Each bit in
++* the bit field represents an important state to track in the modem. As the
++* modem transitions through each important state, the corresponding bit will
++* change from a zero to a one. Each bit in the bit field will only be reset to
++* zero if the modem retrains. If new states need to be tracked and are added
++* in subsequent versions of the host interface, a corresponding bit will be
++* added at the END of the bit field to ensure backwards compatibility. The
++* Modem State Bit Field is reset if the modem retrains or falls out of Showtime.
++*
++* --An interrupt will be sent to the host processor when a change occurs in the
++* Modem State Bit Field. There is an interrupt masking register which can mask
++* specific interrupts corresponding to the bits of the Modem State Bit Field.
++* This allows the host to keep an interrupt from being generated for those
++* states that are masked.
++*
++* HISTORY:
++*
++* 11/20/02 J. Bergsagel Written from the previous host interface file
++* 11/27/02 J. Bergsagel Added comments for mailbox control struct and
++* fixed a couple items for overlay page stuff.
++* Also, added temporary elements for SWTC code.
++* 12/04/02 J. Bergsagel Added extra dummy byte to DEV_HOST_eocVarDef_t
++* for proper word alignment.
++* 12/12/02 J. Bergsagel Changed initial states in the modem state bit field
++* and added more instructions for adding more states.
++* 12/16/02 J. Bergsagel Changed name "hostVersion_p" to "hostIntfcVersion_p".
++* Removed dspAturState from DEV_HOST_modemStateBitField_t.
++* Reorganized several struct elements to clean up the
++* host interface.
++* 12/27/02 Sameer V Added missing channel 0 statistics for TC. Added
++* ocd error information.
++* 12/27/02 Sameer V Added overlayState to OlayDP_Parms to indicate whether
++* overlays are being executed in current state.
++* 01/06/03 J. Bergsagel Added maxAllowedMargin and minRequiredMargin to
++* DEV_HOST_msg_t.
++* Renamed TC chan 1 items to be chan 0 items to start out.
++* 01/17/03 Sameer V Moved delineationState to atmStats structure.
++* 01/21/03 Barnett Implemented Ax7 UNIT-MODULE modular software framework.
++* 01/22/03 J. Bergsagel Added warning comments for certain struct typedefs.
++* 01/23/03 C. Perez-N. Removed old AX5-only diags. command/response entries in the
++* HOST and DSP ennumerations, and added the AX7 new ones
++* Added pointer entries in the DEV_HOST_dspOamSharedInterface_t
++* structure pointing to the analog diags. input/output/options
++* structures.
++* 01/29/03 Sameer V Removed TC_IDLE in enum for delineation state. Hardware
++* only reports TC_HUNT, TC_PRESYNC and TC_SYNC.
++* 03/07/03 Sameer/Jonathan Put SWTC token around structs and elements only used by SWTC
++* 03/12/03 Mannering Add CO profile data structures
++* 03/18/03 J. Bergsagel Removed the obsolete DSP_CHECK_TC response message.
++* 03/24/03 J. Bergsagel Added DEV_HOST_hostInterruptMask_t for masking DSP interrupt sources
++* 03/28/03 C. Perez-N Changed the C-style comments and made them C++ sytle instead.
++* Replaced the occurrences of "SINT32 *" pointer declarations with
++* "PSINT32"
++* 03/28/03 Mannering Update CO profile data structures
++* 04/04/03 S. Yim Add host I/F hooks for switchable hybrid and RJ11
++* inner/outer pair selection
++* 04/11/03 J. Bergsagel Changed modem state bit field struct types to enums instead and used
++* a single integer variable for each "bitfield".
++* Changed bit field for host interrupt masks to an integer value also.
++* 04/14/03 J. Bergsagel Changed name of table pointer "meanSquareTblDstrm_p" to "marginTblDstrm_p".
++* 04/03/03 Umesh Iyer CMsg1 and RMsg1 use the same storage as CMSGPCB and RMSGPCB.
++* The string lengths for these have been adjusted to hold the longest
++* message in each case. The PCB messages from ADSL2 are longer.
++* 04/21/03 Sameeer V Added new host mailbox message for shutting down the DSLSS peripherals.
++* 04/23/03 J. Bergsagel Fixed comments for overlay mailbox messages and for losErrors.
++* 04/28/03 Mannering Added skip phase op flag to CO profile data structure
++* 05/05/03 Mannering Review Comments - Removed "#if CO_PROFILE" from around structure
++* definitions and define the number of profiles (DEV_HOST_LIST_ENTRIES)
++* 05/13/03 J. Bergsagel Added new elements to DEV_HOST_phyPerf_t for host control of hybrid.
++* 05/15/03 J. Bergsagel Added "farEndLosErrors" and "farEndRdiErrors" to DEV_HOST_modemStatsDef_t.
++* 05/16/03 Mannering Updated CO profile structure to support updated bit allocation and
++* interopability.
++* 05/20/03 Sameer V Added DSP message to inicate DYING GASP.
++* 05/22/03 J. Bergsagel Added a new struct typedef "DEV_HOST_hostInterruptSource_t".
++* Added "atucGhsRevisionNum" to "DEV_HOST_dspWrNegoParaDef_t".
++* Moved the following struct typedef's here to the public host interface:
++* DEV_HOST_dspBitSwapDef_t
++* DEV_HOST_atmDsBert_t
++* 05/28/03 A. Redfern Changed pointer type and location for margin reporting.
++* 05/28/03 Mannering Moved CO profile defines to dev_host_interface_pvt.h
++* 05/28/03 J. Bergsagel Moved subStateIndex and STM BERT controls into new struct "DEV_HOST_modemEnvPublic_t"
++* 05/29/03 J. Bergsagel Added elements to "DEV_HOST_modemEnvPublic_t" for host control of DSLSS LED's.
++* 06/10/03 Umesh Iyer Modified trainMode check to be compliant with the new host i/f mods.
++* 06/05/03 J. Bergsagel Added enum that will eventually replace the bitfield: DEV_HOST_diagAnlgOptionsVar_t.
++* Added new element "currentHybridNumUsed" in the DEV_HOST_phyPerf_t typedef
++* Added new host control flags for LPR signal detection on GPIO[0].
++* 06/06/03 A. Redfern Removed fine gain scale from the CO profile and added max downstream power cutback.
++* Changed "test1" in CO profile struct to "phyEcDelayAdjustment".
++* 06/26/03 J. Bergsagel Added genericStructure typedef and two pointer elements of this type in the big table.
++* 07/03/03 Jack Huang Renamed test2 to bSwapThresholdUpdate
++* 07/07/03 Mallesh Changed phySigTxPowerCutback_f flag to a variable phySigTxGainReductionAt0kft which indicates the
++* amount of gain reduction in linear scale.
++* 07/15/03 Sameer V Changed DEV_HOST_diagAnlgOptionsVar_t to be an enum instead of a bit field. Host code
++* does not support setting bit fields.
++* 07/22/03 Jack Huang Added bitswap control flag in host i/f for API calls
++* 08/06/03 Sameer V Added missingToneDs_p to the DEV_HOST_oamWrNegoParaDef_t to enable host to switch off
++* DS tones on specified bins
++* 08/21/03 Jack Huang Added pcbEnabled flag in the DEV_HOST_modemEnvPublic_t structure
++* Added g.hs buffer definitions to DEV_HOST_dspOamSharedInterface_t
++* Added DEV_HOST_consBufDef_t to the DEV_HOST_dspOamSharedInterface_t structure
++* 08/26/03 J. Bergsagel Fixed name of "missingToneDs_p" to be "missingToneDsAddr" instead (since it is
++* not really used as a pointer).
++* 09/11/03 Mallesh Added a flag "usPilotInT1413ModeInMedley" to determine the need to send Upstream Pilot
++* in medley in T1.413 mode.
++* 09/12/03 J. Bergsagel Changed "test3" to "phyBitaFastPathExcessFineGainBump" in CO profile struct.
++* Changed "test4" to "phyBitaSkipGapAdjustment" in CO profile struct.
++* 09/23/03 J. Bergsagel Changed "T1413vendorRevisionNumber" to "vendorRevisionNumber" in DEV_HOST_msg_t.
++* Added ADSL2 and ADSL2 diag. states to the modem state bit field.
++* 10/01/03 J. Bergsagel Changed define of "MULTI_MODE" to be 255 to indicate that all possible bits
++* in the 8-bit bit field are turned on for any current and future training modes.
++* 10/09/03 M. Turkboylari Added DSP_TRAINING_MSGS and adsl2DeltMsgs_p, which is a pointer to a pointer,
++* in order to pass the ADSL2 training and DELT messages to the host side. This is for ACT.
++* 10/20/03 Mallesh Added a GHS state enumerator for cleardown
++* 10/20/03 Xiaohui Li Add definition for READSL2_MODE and READSL2_DELT
++* 11/07/03 J. Bergsagel Removed all code for when SWTC==1, which therefore allows removal of include of
++* "env_def_defines.h". We shouldn't have any compile tokens used in this file.
++* (the SWTC token is always off in any Ax7 code).
++* 11/14/03 J. Bergsagel Also removed READSL2_ENABLE token (no more compile tokens to be used in this .h file).
++* 12/12/03 Sameer/Ram Added DEV_HOST_EOCAOC_INTERRUPT_MASK to enable host to disable response code for AOC/EOC
++* mailbox messages
++* 12/09/03 Jack Huang Changed G.hs txbuf size from 60 to 64 to fit the max segment size
++* 12/15/03 Mallesh Changed vendor ID type defenition from SINT16 to UINT16
++* 12/23/03 Sameer V Added ability to turn off constellation display reporting to host using oamFeature bit field.
++* 12/24/03 Sameer V Changed comment for Constellation Display Current Address to Host Write instead of DSP Write.
++* 12/26/03 Sameer/Ram Added DEV_HOST_GHSMSG_INTERRUPT_MASK to enable host to disable response code for GHS Messages
++* (C) Copyright Texas Instruments Inc. 2002. All rights reserved.
++*******************************************************************************/
++
++#include "dev_host_verdef.h"
++
++// ---------------------------------------------------------------------------------
++// Address of the pointer to the DEV_HOST_dspOamSharedInterface_s struct of pointers
++// This is where it all starts.
++// ---------------------------------------------------------------------------------
++#define DEV_HOST_DSP_OAM_POINTER_LOCATION 0x80000000
++
++// The define "MAX_NUM_UPBINS" is used in "DEV_HOST_diagAnlgInputVar_t" below.
++// This value can never be changed (for host intf. backwards compatibility)
++#define MAX_NUM_UPBINS 64
++
++// -----------------------------------------------
++// Begin common enumerations between DSP and host.
++// -----------------------------------------------
++
++// These Host-to-DSP commands are organized into two groups:
++// immediate state change commands and status affecting commands.
++// Do not add or remove commands except at the bottom since the DSP assumes this sequence.
++
++enum
++{
++ HOST_ACTREQ, // Send R-ACKREQ and monitor for C-ACKx
++ HOST_QUIET, // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
++ HOST_XMITBITSWAP, // Perform upstream bitswap - FOR INTERNAL USE ONLY
++ HOST_RCVBITSWAP, // Perform downstream bitswap - FOR INTERNAL USE ONLY
++ HOST_RTDLPKT, // Send a remote download packet - FOR INTERNAL USE ONLY
++ HOST_CHANGELED, // Read the LED settings and change accordingly
++ HOST_IDLE, // Sit quiet
++ HOST_REVERBTEST, // Generate REVERB for manufacturing test
++ HOST_CAGCTEST, // Set coarse receive gain for manufacturing test
++ HOST_DGASP, // send Dying Gasp messages through EOC channel
++ HOST_GHSREQ, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHS_SENDGALF, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSEXIT, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSMSG1, // G.hs - FOR INTERNAL USE ONLY
++ HOST_HYBRID, // Enable/Disable automatic hybrid switch
++ HOST_RJ11SELECT, // RJ11 inner/outer pair select
++ HOST_DIGITAL_MEM, // Digital Diags: run external memory tests
++ HOST_TXREVERB, // AFE Diags: TX path Reverb
++ HOST_TXMEDLEY, // AFE Diags: TX path Medley
++ HOST_RXNOISEPOWER, // AFE Diags: RX noise power
++ HOST_ECPOWER, // AFE Diags: RX eco power
++ HOST_ALL_ADIAG, // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
++ HOST_USER_ADIAG, // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
++ HOST_QUIT_ADIAG, // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
++ HOST_NO_CMD, // All others - G.hs - FOR INTERNAL USE ONLY
++ HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
++ HOST_SET_GENERIC, // Set generic CO profile
++ HOST_UNDO_GENERIC, // Set profile previous to Generic
++ HOST_GHS_CLEARDOWN // G.hs - FOR INTERNAL USE ONLY to start cleardown
++};
++
++// These DSP-to-Host responses are organized into two groups:
++// responses to commands and requests for OAM services.
++
++enum
++{
++ DSP_IDLE, // R_IDLE state entered
++ DSP_ACTMON, // R_ACTMON state entered
++ DSP_TRAIN, // R_TRAIN state entered
++ DSP_ACTIVE, // R_ACTIVE state entered
++ DSP_XMITBITSWAP, // Upstream bitswap complete - FOR INTERNAL USE ONLY
++ DSP_RCVBITSWAP, // Downstream bitswap complete - FOR INTERNAL USE ONLY
++ DSP_RTDL, // R_RTDL state entered - FOR INTERNAL USE ONLY
++ DSP_RRTDLPKT, // RTDL packet received - FOR INTERNAL USE ONLY
++ DSP_XRTDLPKT, // RTDL packet transmitted - FOR INTERNAL USE ONLY
++ DSP_ERROR, // Command rejected, wrong state for this command
++ DSP_REVERBTEST, // Manufacturing REVERB test mode entered
++ DSP_CAGCTEST, // Manufacturing receive gain test done
++ DSP_OVERLAY_START, // Notify host that page overlay has started - overlay number indicated by "tag"
++ DSP_OVERLAY_END, // Notify host that page overlay has ended - overlay number indicated by "tag"
++ DSP_CRATES1, // CRATES1 message is valid and should be copied to host memory now
++ DSP_SNR, // SNR calculations are ready and should be copied to host memory now
++ DSP_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
++ DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
++ DSP_ATM_TC_SYNC, // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
++ DSP_ATM_NO_TC_SYNC, // Indicates loss of sync on phy layer on either US or DS.
++ DSP_HYBRID, // DSP completed hybrid switch
++ DSP_RJ11SELECT, // DSP completed RJ11 inner/outer pair select
++ DSP_INVALID_CMD, // Manufacturing (Digital and AFE) diags: CMD received not recognized
++ DSP_TEST_PASSED, // Manufacturing diags: test passed
++ DSP_TEST_FAILED, // Manufacturing diags: test failed
++ DSP_TXREVERB, // Manufacturing AFE diags: Response to HOST_TXREVERB
++ DSP_TXMEDLEY, // Manufacturing AFE diags: Response to HOST_TXMEDLEY
++ DSP_RXNOISEPOWER, // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
++ DSP_ECPOWER, // Manufacturing AFE diags: Response to HOST_ECPOWER
++ DSP_ALL_ADIAG, // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
++ DSP_USER_ADIAG, // Manufacturing AFE diags: Response to HOST_USER_ADIAG
++ DSP_QUIT_ADIAG, // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
++ DSP_DGASP, // DSP Message to indicate dying gasp
++ DSP_EOC, // DSP Message to indicate that DSP sent an EOC message to CO
++ DSP_TRAINING_MSGS // DSP Message to indicate that host has to copy the training message specified in the tag field.
++};
++
++// Define different ADSL training modes.
++//Defintions as per new host interface.
++#define NO_MODE 0
++#define GDMT_MODE 2
++#define GLITE_MODE 4
++#define ADSL2_MODE 8
++#define ADSL2_DELT (ADSL2_MODE+1)
++#define ADSL2PLUS_MODE 16
++#define ADSL2PLUS_DELT (ADSL2PLUS_MODE+1)
++#define READSL2_MODE 32
++#define READSL2_DELT (READSL2_MODE+1)
++#define T1413_MODE 128
++#define MULTI_MODE 255 // all possible bits are set in the bit field
++
++// Define the reason for dropping the connection
++
++enum
++{
++ REASON_LOS = 0x01,
++ REASON_DYING_GASP = 0x02,
++ REASON_USCRCERR = 0x04,
++ REASON_MARGIN_DROP = 0x08
++};
++
++
++// ----------------------------------------------------
++// Begin modem state bit field definitions - DSP write.
++// ----------------------------------------------------
++
++// BitField1 for initial states and G.hs states.
++// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
++// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
++// that causes the proper values to be entered into the modem state bit fields.
++typedef enum
++{
++ ZERO_STATE1 = 0,
++ RTEST = 0x1,
++ RIDLE = 0x2,
++ RINIT = 0x4,
++ RRESET = 0x8,
++ GNSFLR = 0x10,
++ GTONE = 0x20,
++ GSILENT = 0x40,
++ GNEGO = 0x80,
++ GFAIL = 0x100,
++ GACKX = 0x200,
++ GQUIET2 = 0x400
++} DEV_HOST_stateBitField1_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
++
++// BitField2 for T1.413 states and for the rest of the modem states (so far)
++// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
++// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
++// that causes the proper values to be entered into the modem state bit fields.
++typedef enum
++{
++ ZERO_STATE2 = 0,
++ TNSFLR = 0x1,
++ TACTREQ = 0x2,
++ TACTMON = 0x4,
++ TFAIL = 0x8,
++ TACKX = 0x10,
++ TQUIET2 = 0x20,
++ RQUIET2 = 0x40,
++ RREVERB1 = 0x80,
++ RQUIET3 = 0x100,
++ RECT = 0x200,
++ RREVERB2 = 0x400,
++ RSEGUE1 = 0x800,
++ RREVERB3 = 0x1000,
++ RSEGUE2 = 0x2000,
++ RRATES1 = 0x4000,
++ RMSGS1 = 0x8000,
++ RMEDLEY = 0x10000,
++ RREVERB4 = 0x20000,
++ RSEGUE3 = 0x40000,
++ RMSGSRA = 0x80000,
++ RRATESRA = 0x100000,
++ RREVERBRA = 0x200000,
++ RSEGUERA = 0x400000,
++ RMSGS2 = 0x800000,
++ RRATES2 = 0x1000000,
++ RREVERB5 = 0x2000000,
++ RSEGUE4 = 0x4000000,
++ RBNG = 0x8000000,
++ RREVERB6 = 0x10000000,
++ RSHOWTIME = 0x20000000
++} DEV_HOST_stateBitField2_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
++
++// BitField3 for ADSL2 states
++// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
++// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
++// that causes the proper values to be entered into the modem state bit fields.
++typedef enum
++{
++ ZERO_STATE3 = 0,
++ G2QUIET1 = 0x1,
++ G2COMB1 = 0x2,
++ G2QUIET2 = 0x4,
++ G2COMB2 = 0x8,
++ G2ICOMB1 = 0x10,
++ G2LINEPROBE = 0x20,
++ G2QUIET3 = 0x40,
++ G2COMB3 = 0x80,
++ G2ICOMB2 = 0x100,
++ G2RMSGFMT = 0x200,
++ G2RMSGPCB = 0x400,
++ G2REVERB1 = 0x800,
++ G2QUIET4 = 0x1000,
++ G2REVERB2 = 0x2000,
++ G2QUIET5 = 0x4000,
++ G2REVERB3 = 0x8000,
++ G2ECT = 0x10000,
++ G2REVERB4 = 0x20000,
++ G2SEGUE1 = 0x40000,
++ G2REVERB5 = 0x80000,
++ G2SEGUE2 = 0x100000,
++ G2RMSG1 = 0x200000,
++ G2MEDLEY = 0x400000,
++ G2EXCHANGE = 0x800000,
++ G2RMSG2 = 0x1000000,
++ G2REVERB6 = 0x2000000,
++ G2SEGUE3 = 0x4000000,
++ G2RPARAMS = 0x8000000,
++ G2REVERB7 = 0x10000000,
++ G2SEGUE4 = 0x20000000
++} DEV_HOST_stateBitField3_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
++
++// BitField4 for ADSL2 diag. states
++// If more values need to be added, they will be added at the end (up to 32 total entries). However, if this causes
++// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
++// that causes the proper values to be entered into the modem state bit fields.
++typedef enum
++{
++ ZERO_STATE4 = 0,
++ GDSEGUE1 = 0x1,
++ GDREVERB5 = 0x2,
++ GDSEGUE2 = 0x4,
++ GDEXCHANGE = 0x8,
++ GDSEGUELD = 0x10,
++ GDRMSGLD = 0x20,
++ GDQUIET1LD = 0x40,
++ GDQUIET2LD = 0x80,
++ GDRACK1 = 0x100,
++ GDRNACK1 = 0x200,
++ GDQUIETLAST = 0x400
++} DEV_HOST_stateBitField4_t; // this enum should only have 32 bit entries in it. Add another enum if you need more.
++
++// This struct collects all of the bitfield types listed above for the modem state bit field(s)
++typedef struct
++{
++ DEV_HOST_stateBitField1_t bitField1; // this is the first modem state bit field (mostly init. and G.hs)
++ DEV_HOST_stateBitField2_t bitField2; // this is the second modem state bit field (T1.413 and G.dmt)
++ DEV_HOST_stateBitField3_t bitField3; // this is the third modem state bit field (ADSL2)
++ DEV_HOST_stateBitField4_t bitField4; // this is the fourth modem state bit field (ADSL2 diag.)
++} DEV_HOST_modemStateBitField_t;
++
++
++// -----------------------------------------------
++// Begin NegoPara message definitions - DSP write.
++// -----------------------------------------------
++
++typedef struct
++{
++ UINT8 trainMode; // Train mode selected. See training modes defined above.
++ UINT8 bDummy1; // dummy byte for explicit 32-bit alignment
++ UINT16 lineLength; // Contains loop length estimate. Accuracy w/i 500 ft. LSbit = 1 for straight loop, = 0 for bridge tap
++ UINT32 atucVendorId; // Pass the vendor id of the CO to the host
++ UINT8 cMsgs1[8]; // CMsgs1 and CMSGPCB
++ UINT16 adsl2DSRate; //
++ UINT8 cRates2; //
++ UINT8 rRates2; //
++ UINT8 rRates1[4][11]; //
++ UINT8 cMsgs2[4]; //
++ UINT8 cRates1[4][30]; //
++ UINT8 rMsgs2[4]; //
++ UINT16 adsl2USRate; //
++ UINT8 atucGhsRevisionNum; // Pass the G.hs Revision number of the CO to the host
++ UINT8 reserved1; //
++ PUINT8 *adsl2DeltMsgs_p; // This pointer to a pointer passes the address of the globalvar.pString, which is also
++ // a pointer list of pointers. It will be used to pass all the new ADSL2 DELT messages to
++ // host side. This is for ACT.
++} DEV_HOST_dspWrNegoParaDef_t;
++
++
++// ----------------------------------------------------
++// Begin OAM NegoPara message definitions - Host write.
++// ----------------------------------------------------
++
++// OAM Feature bit fields.
++//
++// Bit 0 - Enable auto retrain of modem
++// Bit 1 - Detect and report TC sync to host
++// Bit 2-31 - Reserved
++
++#define DEV_HOST_AUTORETRAIN_ON 0x00000001
++#define DEV_HOST_TC_SYNC_DETECT_ON 0x00000002
++
++#define DEV_HOST_AUTORETRAIN_MASK 0x00000001
++#define DEV_HOST_TC_SYNC_DETECT_MASK 0x00000002
++#define DEV_HOST_EOCAOC_INTERRUPT_MASK 0x00000004
++#define DEV_HOST_CONS_DISP_DISABLE_MASK 0x00000008
++#define DEV_HOST_GHSMSG_INTERRUPT_MASK 0x00000010
++
++typedef struct
++{
++ UINT8 stdMode; // Desired train mode. See training modes defined above.
++ UINT8 ghsSequence; // Selected G.hs session as shown in Appendix 1
++ UINT8 usPilotFlag; // Value of 1 indicates transmit an upstream pilot on bin 16
++ UINT8 bDummy1; // dummy byte for 32-bit alignment
++ UINT8 rMsgs1[38]; // RMSG-1(6) and RMSG_PCB (38)
++ UINT8 bDummy2[2]; // dummy bytes for 32-bit alignment
++ UINT32 oamFeature; // 32 bit wide bit field to set OAM-specific features.
++ SINT8 marginThreshold; // Threshold for margin reporting
++ UINT8 hostFixAgc; // flag to force datapump to bypass AGC training and use the following values
++ UINT8 hostFixEqualizer; // forced analog equalizer value used during AGC training when hostfix_agc is on
++ UINT8 hostFixPga1; // forced pga1 value used during AGC training when hostFixAgc is on
++ UINT8 hostFixPga2; // forced pga2 value used during AGC training when hostFixAgc is on
++ UINT8 hostFixPga3; // forced pga3 value used during AGC training when hostFixAgc is on
++ UINT8 marginMonitorShwtme; // margin monitoring flag (during showtime)
++ UINT8 marginMonitorTrning; // margin monitoring flag (during training)
++ UINT8 disableLosAlarm; // flag to disable training based on los
++ UINT8 usCrcRetrain; // flag to disable retrain due to excessive USCRC
++ UINT8 t1413VendorId[2]; // Vendor ID used for T1.413 trainings
++ UINT8 gdmtVendorId[8]; // Vendor ID used for G.dmt trainings (ITU VendorID)
++ UINT8 missingTones[64]; // 64 element array to define missing tones for TX_MEDLEY and TX REVERB tests
++ UINT32 missingToneDsAddr; // Address given to DSP for tones to be switched off in DS direction
++ UINT8 dsToneTurnoff_f; // This flag controls the DS tone turn off logic
++ UINT8 reserved1; // Dummy bytes
++ UINT8 reserved2; // Dummy bytes
++ UINT8 reserved3; // Dummy bytes
++} DEV_HOST_oamWrNegoParaDef_t;
++
++
++// ----------------------------------------
++// Begin Rate-adaptive message definitions.
++// ----------------------------------------
++
++// The four values below can never be changed (for host intf. backwards compatibility)
++#define DEV_HOST_RMSGSRA_LENGTH 10
++#define DEV_HOST_RRATESRA_LENGTH 1
++#define DEV_HOST_CRATESRA_LENGTH 120
++#define DEV_HOST_CMSGSRA_LENGTH 6
++
++typedef struct
++{
++ UINT8 rRatesRaString[DEV_HOST_RRATESRA_LENGTH+3];
++ UINT8 rMsgsRaString[DEV_HOST_RMSGSRA_LENGTH+2];
++ UINT8 cMsgsRaString[DEV_HOST_CMSGSRA_LENGTH+2];
++} DEV_HOST_raMsgsDef_t;
++
++
++// ----------------------------------------------
++// Begin superframe cnts definitions - DSP write.
++// ----------------------------------------------
++
++#define DEV_HOST_FRAMES_PER_SUPER 68
++#define DEV_HOST_SUPERFRAMECNTDSTRM 0
++#define DEV_HOST_SUPERFRAMECNTUSTRM 4
++
++// Although only the least significant 8 bits should be used as an
++// unsigned char for computing the bitswap superframe number, a
++// full 32 bit counter is provided here in order to have an
++// accurate indicator of the length of time that the modem has
++// been connected. This counter will overflow after 2.35 years
++// of connect time.
++
++typedef struct
++{
++ UINT32 wSuperFrameCntDstrm;
++ UINT32 wSuperFrameCntUstrm;
++} DEV_HOST_dspWrSuperFrameCntDef_t;
++
++
++// --------------------------------
++// Begin ATUR/ATUC msg definitions.
++// --------------------------------
++
++// Grouping used by the DSP to simplify parameter passing.
++// All of these are written by the DSP.
++
++typedef struct
++{
++ UINT16 vendorId; // TI's vendor ID = 0x0004; Amati's vendor ID = 0x0006
++ UINT8 versionNum; // T1.413 issue number
++ UINT8 rateAdapt; // 0 = fix rate (Default); 1= adaptive rate
++ UINT8 trellis; // 0 = disable trellis(default); 1 = enable trellis
++ UINT8 echoCancelling; // 0 = disable echo cancelling; 1 = enable echo cancelling(default)
++ UINT8 maxBits; // value range: 0-15; default = 15
++ UINT8 maxPsd; //
++ UINT8 actualPsd; //
++ UINT8 maxIntlvDepth; // 0, 1, 2, or 3 for 64, 128, 256, or 512 max depth
++ UINT8 framingMode; // 0 for asynchronous, 1 for synchronous full overhead
++ // 2 for reduced overhead, 3 for merged reduced overhead DSP write.
++ UINT8 maxFrameMode; // maximum framing mode desired. Nor 0 or 3.
++ SINT16 targetMargin; //
++ SINT16 maxAllowedMargin; //
++ SINT16 minRequiredMargin; //
++ SINT16 maxTotBits; //
++ UINT8 grossGain; //
++ UINT8 ntr; // Enable/disable NTR support
++ SINT16 loopAttn; // Loop Attenuation
++ UINT8 vendorRevisionNumber; // Reported Vendor Revision Number
++ UINT8 reserved1; // for 32-bit alignment
++ UINT8 reserved2; // for 32-bit alignment
++ UINT8 reserved3; // for 32-bit alignment
++} DEV_HOST_msg_t;
++
++
++// --------------------------------------
++// Begin bits and gains table definitions
++// --------------------------------------
++
++typedef struct
++{
++ PUINT8 aturBng_p; // pointer to ATU-R bits and gains table
++ PUINT8 atucBng_p; // pointer to ATU-C bits and gains table
++ PUINT8 bitAllocTblDstrm_p; // pointer to Downstream Bit Allocation table
++ PUINT8 bitAllocTblUstrm_p; // pointer to Upstream Bit Allocation table
++ PSINT8 marginTblDstrm_p; // pointer to Downstream Margin table
++} DEV_HOST_dspWrSharedTables_t;
++
++
++// ----------------------------------------
++// Begin datapump code overlay definitions.
++// ----------------------------------------
++
++#define DEV_HOST_PAGE_NUM 4 // number of overlay pages
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_olayDpDef_t struct
++typedef struct
++{
++ UINT32 overlayHostAddr; // source address in host memory
++ UINT32 overlayXferCount; // number of 32bit words to be transfered
++ UINT32 overlayDspAddr; // destination address in DSP's PMEM
++} DEV_HOST_olayDpPageDef_t;
++
++
++typedef struct
++{
++ UINT32 overlayStatus; // Status of current overlay to DSP PMEM
++ UINT32 overlayNumber; // DSP PMEM overlay page number
++ UINT32 overlayState; // Indicates whether current state is an overlay state
++ DEV_HOST_olayDpPageDef_t *olayDpPage_p[DEV_HOST_PAGE_NUM]; // Def's for the Pages
++} DEV_HOST_olayDpDef_t;
++
++
++// -------------------------
++// Begin ATM-TC definitions.
++// -------------------------
++
++// TC cell states.
++typedef enum
++{
++ TC_HUNT,
++ TC_PRESYNC,
++ TC_SYNC
++} DEV_HOST_cellDelinState_t;
++
++
++// --------------------------------------------
++// Begin datapump error/statistics definitions.
++// --------------------------------------------
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_modemStatsDef_t struct.
++typedef struct
++{
++ UINT32 crcErrors; // Num of CRC errored ADSL frames
++ UINT32 fecErrors; // Num of FEC errored (corrected) ADSL frames
++ UINT32 ocdErrors; // Out of Cell Delineation
++ UINT32 ncdError; // No Cell Delineation
++ UINT32 lcdErrors; // Loss of Cell Delineation (within the same connection)
++ UINT32 hecErrors; // Num of HEC errored ADSL frames
++} DEV_HOST_errorStats_t;
++
++
++typedef struct
++{
++ DEV_HOST_errorStats_t *usErrorStatsIntlv_p; // us error stats - interleave path
++ DEV_HOST_errorStats_t *dsErrorStatsIntlv_p; // ds error stats - interleave path
++ DEV_HOST_errorStats_t *usErrorStatsFast_p; // us error stats - fast path
++ DEV_HOST_errorStats_t *dsErrorStatsFast_p; // ds error stats - fast path
++ UINT32 losErrors; // Num of ADSL frames where loss-of-signal
++ UINT32 sefErrors; // Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames
++ UINT32 farEndLosErrors; // Number of reported LOS defects by the CO.
++ UINT32 farEndRdiErrors; // Number of reported RDI defects by the CO.
++} DEV_HOST_modemStatsDef_t;
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_atmStats_t struct.
++typedef struct
++{
++ UINT32 goodCount; // Upstream Good Cell Count
++ UINT32 idleCount; // Upstream Idle Cell Count
++} DEV_HOST_usAtmStats_t;
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_atmStats_t struct.
++typedef struct
++{
++ UINT32 goodCount; // Downstream Good Cell Count
++ UINT32 idleCount; // Downstream Idle Cell Count
++ UINT32 badHecCount; // Downstream Bad Hec Cell Count
++ UINT32 ovflwDropCount; // Downstream Overflow Dropped Cell Count
++ DEV_HOST_cellDelinState_t delineationState; // Indicates current delineation state
++} DEV_HOST_dsAtmStats_t;
++
++
++typedef struct
++{
++ DEV_HOST_usAtmStats_t *us0_p; // US ATM stats for TC channel 0
++ DEV_HOST_dsAtmStats_t *ds0_p; // DS ATM stats for TC channel 0
++ DEV_HOST_usAtmStats_t *us1_p; // US ATM stats for TC channel 1
++ DEV_HOST_dsAtmStats_t *ds1_p; // DS ATM stats for TC channel 1
++} DEV_HOST_atmStats_t;
++
++
++// ----------------------
++// Begin EOC definitions.
++// ----------------------
++
++// The two values below can never change (for backwards compatibility of host intf.)
++#define DEV_HOST_EOCREG4LENGTH 32
++#define DEV_HOST_EOCREG5LENGTH 32
++
++typedef struct
++{
++ UINT8 eocReg4[DEV_HOST_EOCREG4LENGTH]; // Host/Dsp Write, vendor specific EOC Register 4
++ UINT8 eocReg5[DEV_HOST_EOCREG5LENGTH]; // Host/Dsp Write, vendor specific EOC Register 5
++ UINT8 vendorId[8]; // Host write
++ UINT8 revNumber[4]; // Host, ATU-R Revision Number
++ UINT8 serialNumber[32]; // Host write
++ UINT8 eocReg4Length; // Host Write, valid length for EOC register 4
++ UINT8 eocReg5Length; // Host Write, valid length for EOC register 5
++ UINT8 dummy[2]; // dummy bytes for 32-bit alignment
++ UINT32 eocModemStatusReg; // Dsp Write, status bits to host
++ UINT8 lineAtten; // Dsp Write, line attenuation in 0.5 db step
++ SINT8 dsMargin; // DSP Write, measured DS margin
++ UINT8 aturConfig[30]; // Dsp Write, also used by EOC for ATUR Configuration
++} DEV_HOST_eocVarDef_t;
++
++typedef struct
++{
++ UINT16 endEocThresh; // Host Write, end of Clear EOC stream threshold
++ UINT16 dummy; // dummy value to fill gap
++ UINT32 dropEocCount; // Dsp Write, counter of dropped Clear EOC bytes
++ UINT16 eocRxLength; // Host/DSP write, number of valid Rx Clear EOC bytes
++ UINT16 eocTxLength; // Host/DSP write, number of valid Tx Clear EOC bytes
++ UINT8 eocRxBuf[64]; // Dsp Write, Buffer for receiving Rx Clear EOC bytes
++ UINT8 eocTxBuf[64]; // Host Write, Buffer for writing Tx Clear EOC bytes
++} DEV_HOST_clearEocVarDef_t;
++
++
++// -----------------------------------
++// Begin CO profile Definitions.
++// -----------------------------------
++
++/* struct size must be a word size */
++typedef struct
++{
++
++ SINT16 devCodecRxdf4Coeff[12] ; // (BOTH) IIR Coefficients
++ SINT16 devCodecTxdf2aCoeff[64] ; // (BOTH) FIR filter coefficients
++ SINT16 devCodecTxdf2bCoeff[64] ; // (BOTH) FIR filter coefficients
++ SINT16 devCodecTxdf1Coeff[12] ; // (BOTH) IIR filter coefficients
++ UINT16 devCodecTxDf2aDen; // (BOTH) denominator for IIR filter
++ UINT16 devCodecTxDf2bDen; // (BOTH) denominator for IIR filter
++ SINT16 ctrlMsmSpecGain[32]; // (BOTH)
++
++ SINT16 phyBitaRateNegIntNoTrellis ; // (BOTH) value to set
++ SINT16 phyBitaRateNegIntTrellis ; // (BOTH) value to set
++ SINT16 phyBitaRateNegFastNoTrellis ; // (BOTH) value to set
++ SINT16 phyBitaRateNegFastTrellis ; // (BOTH) value to set
++ SINT16 phyBitaRsFlag ; // (BOTH)
++ SINT16 phyBitaFirstSubChannel ; // (BOTH)
++ SINT16 phyBitaMaxFineGainBump; // max fine gain bump
++ SINT16 phyBitaFineGainReduction; // fine gain reduction
++ SINT16 phyBitaMaxDownstreamPowerCutback; // max downstream power cutback
++
++ SINT16 phySigTxGainReductionAt0kft; // upstream power reduction at 0 kft.
++
++ SINT16 phyAgcPgaTarget ; // (BOTH) compare value
++
++ UINT16 imsg413TxRate ; // (BOTH) Tx rate
++ SINT16 imsg413RsBytesAdjust ; // (BOTH) subtract value
++ UINT16 imsg413PstringMask ; // (POTS) Or'ed into pString[RMSGS1_INDEX][1]
++ SINT16 imsg413UsPilot ; // (BOTH)??
++ UINT16 imsg413SkipPhaseOp ; // (POTS)
++
++ UINT16 ctrlMsmSensitivity1 ; // (BOTH) value to set
++ UINT16 ctrlMsmTxPsdShape_f; // (BOTH) upstream spectral shaping flag
++
++ UINT16 ovhdAocUsBswapReq_f ; // (BOTH)value to set
++ UINT16 ovhdAocScanMse_f ; // (BOTH)value to set
++
++ SINT16 phyRevFullFirstBin ; //
++ SINT16 phyRevFullLastBin ; //
++ SINT16 phyRevFirstBin ; //
++ SINT16 phyRevLastBin ; //
++ SINT16 phyMedFirstBin ; //
++ SINT16 phyMedLastBin ; //
++ SINT16 phyMedOptionalLastBin; // Medley last bin - optional
++
++ SINT16 phyEcDelayAdjustment; // Echo delay adjustment
++ SINT16 bSwapThresholdUpdate; // bSwapThresholdUpdate
++ SINT16 phyBitaFastPathExcessFineGainBump; // Used in phy_bita.c
++ SINT16 phyBitaSkipGapAdjustment; // Used in phy_bita.c
++ SINT16 usPilotInT1413ModeInMedley; // To send Upstream Pilot in medley in T1.413 mode.
++
++ UINT32 profileVendorId ; // vendor id
++
++} DEV_HOST_coData_t ;
++
++typedef struct
++{
++ DEV_HOST_coData_t * hostProfileBase_p; // base address of profile list
++} DEV_HOST_profileBase_t ;
++
++
++
++// -----------------------------------
++// Begin DSP/Host Mailbox Definitions.
++// -----------------------------------
++
++// The 3 values below can never be decreased, only increased.
++// If you increase one of the values, you must add more to the
++// initializers in "dev_host_interface.c".
++#define DEV_HOST_HOSTQUEUE_LENGTH 8
++#define DEV_HOST_DSPQUEUE_LENGTH 8
++#define DEV_HOST_TEXTQUEUE_LENGTH 8
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_mailboxControl_t struct.
++typedef struct
++{
++ UINT8 cmd;
++ UINT8 tag;
++ UINT8 param1;
++ UINT8 param2;
++} DEV_HOST_dspHostMsg_t;
++
++// Never access a struct of this typedef directly. Always go through the DEV_HOST_mailboxControl_t struct.
++typedef struct
++{
++ UINT32 msgPart1;
++ UINT32 msgPart2;
++} DEV_HOST_textMsg_t;
++
++// The structure below has been ordered so that the Host need only write to
++// even byte locations to update the indices.
++
++// The Buffer pointers in the struct below each point to a different
++// struct array that has an array size of one of the matching Queue Length
++// values defined above (DEV_HOST_HOSTQUEUE_LENGTH, DEV_HOST_DSPQUEUE_LENGTH,
++// and DEV_HOST_TEXTQUEUE_LENGTH).
++
++typedef struct
++{
++ UINT8 hostInInx; // Host write, DSP must never write except for init
++ UINT8 bDummy0[3]; // dummy bytes for explicit 32-bit alignment
++ UINT8 hostOutInx; // DSP write, Host must never write
++ UINT8 bDummy1[3]; // dummy bytes for explicit 32-bit alignment
++ UINT8 dspOutInx; // Host write, DSP must never write except for init
++ UINT8 bDummy2[3]; // dummy bytes for explicit 32-bit alignment
++ UINT8 dspInInx; // DSP write, Host must never write
++ UINT8 bDummy3[3]; // dummy bytes for explicit 32-bit alignment
++ UINT8 textInInx; // DSP write, Host must never write
++ UINT8 bDummy4[3]; // dummy bytes for explicit 32-bit alignment
++ UINT8 textOutInx; // Host write, DSP must never write except for init
++ UINT8 bDummy5[3]; // dummy bytes for explicit 32-bit alignment
++ DEV_HOST_dspHostMsg_t *hostMsgBuf_p; // pointer to Host Mailbox Buffer (Host writes the buffer)
++ DEV_HOST_dspHostMsg_t *dspMsgBuf_p; // pointer to DSP Mailbox Buffer (DSP writes the buffer)
++ DEV_HOST_textMsg_t *textMsgBuf_p; // pointer to Text Mailbox Buffer (DSP writes the buffer)
++} DEV_HOST_mailboxControl_t;
++
++
++//-----------------------------------------
++// Physical layer performance parameter
++//-----------------------------------------
++typedef struct
++{
++ SINT32 hybridCost[5]; // Cost functions for hybrids (0: none, 1-4 hybrid options)
++ SINT32 usAvgGain; // upstream average gain in 20log10 (Q8)
++ SINT32 dsAvgGain; // downstream average gain in 20log10 (Q8)
++ UINT8 disableDspHybridSelect_f; // Allows host to disable the automatic hybrid selection by the DSP
++ UINT8 hostSelectHybridNum; // DSP will use this hybrid number only if DSP Select is disabled (values: 1-4)
++ UINT8 currentHybridNumUsed; // DSP indicates to the host the current hybrid number in use
++ UINT8 reserved1; // reserved for future use
++} DEV_HOST_phyPerf_t;
++
++
++/***********************************************************
++ * The 3 structures below are used only for analog
++ * diagnostic functions originally defined in diag.h
++ * Moved here by Carlos A. Perez under J. Bergsagel request
++ ***********************************************************/
++
++/****************************************************************************/
++/* Options for the Analog Diagnostic user input data structure */
++/* (MUST be word aligned) */
++/****************************************************************************/
++typedef enum
++{
++ ZERO_DIAG_OPT = 0, // dummy value for zero place-holder
++ NOISE_ONLY = 0x1, // diagnostic in noise only mode (on=1, off=0), disregard diagMode 0-4
++ EXTERNAL_CO = 0x2, // operates against external CO (external=1, internal=0)
++ DIAG_AGC = 0x4, // agc selects gains control (agc=1, manual=0)
++ CROSSTALK_TEQ = 0x8, // crosstalk selects teq (crosstalk=1, manual=0)
++ LEAKY_TEQ = 0x10, // use leaky teq (on=1, off=0)
++ AUX_AMPS = 0x20, // auxamps (on=1, off=0)
++ BW_SELECT = 0x40, // change rxhpf/txlpf fc (modify=1, default=0)
++ DIAG_HYB_SELECT = 0x80, // change hybrid (modify=1, default=0)
++ POWER_DOWN_CDC = 0x100, // power down codec (power down=1, no power down=0)
++ ISDN_OP_MODE = 0x200, // operation mode (pots=0, isdn=1)
++ BYPASS_RXAF2 = 0x400, // Bypass except RXAF2 (on=1, off = 0)
++ TX_TEST_CONT = 0x800, // Continuous tx test (on=1, off=0)
++ TX_SCALE_MTT = 0x1000 // Scale tx signal for Mtt test (on=1, off=0)
++} DEV_HOST_diagAnlgOptionsVar_t;
++
++/****************************************************************************/
++/* Analog Diagnostic user input data structure (MUST be word align) */
++/****************************************************************************/
++
++typedef struct
++{
++ DEV_HOST_diagAnlgOptionsVar_t diagOption; // Other diagnostic optional settings
++
++ UINT8 diagMode; // Performance diagnostic mode
++ UINT8 txMode; // transmit mode
++ UINT8 rxMode; // receive mode
++ UINT8 teqSp; // Select teq starting pt
++ UINT8 txDf1; // see dev_codec_filters.c and
++ UINT8 txDf2a; // dev_codec.h for filter coefficients
++ UINT8 txDf2b;
++ UINT8 rxDf4;
++
++ UINT16 codingGain256Log2; // 256*Log2(coding gain)
++ UINT16 noiseMargin256Log2; // 256*Log2(noise margin)
++
++ UINT16 rxPga1; // PGA1
++ UINT16 rxPga2; // PGA2
++ UINT16 rxPga3; // PGA3
++ UINT16 anlgEq; // AEQ settings (dB/MHz)
++
++ SINT8 pilotBin; // Select pilot subchannel
++ SINT8 txSwGain; // manual set for bridge tap loop
++ SINT8 tdw1Len; // TDW1 length - 0,2,4,8,16
++ SINT8 tdw2Len; // TDW2 length - 0,2,4,8,16
++
++ UINT8 teqEcMode; // TEQ/EC mode
++ UINT8 hybrid;
++ UINT8 txAttn; // Codec Tx attenuation
++ UINT8 txGain; // Codec Tx gain (Sangam only)
++
++ SINT16 txPda; //Codec Tx Digital gain/attn
++ UINT8 txTone[MAX_NUM_UPBINS]; // Turning tones on/off
++ // Still govern by lastbin
++ UINT16 rsvd; //for 32 bits alignment
++}DEV_HOST_diagAnlgInputVar_t;
++
++/****************************************************************************/
++/* Analog diagnostic output data structure */
++/****************************************************************************/
++typedef struct
++{
++ PSINT32 rxSnr_p[2]; // Pointer to estimated snr
++ PSINT32 rxSubChannelCapacity_p[2]; // Pointer to estimated subchan capacity
++ PSINT32 rxSignalPower_p[2]; // Pointer to estimated signal power
++ PSINT32 rxNoisePower_p[2]; // Pointer to estimated noise power
++ PSINT32 rxAvg_p; // Pointer to average of rcvd signal
++ SINT32 chanCapacity[2] ; // Channel total capacity
++ SINT32 dataRate[2]; // Modem data rate (SNR)
++ SINT32 avgNoiseFloor; // Average noise floor
++ SINT16 snrGap256Log2; // 256*Log2(snr gap)
++ SINT16 rxPga1; // PGA1
++ SINT16 rxPga2; // PGA2
++ SINT16 rxPga3; // PGA3
++ SINT16 anlgEq; // AEQ settings (dB/MHz)
++ SINT16 rsvd;
++}DEV_HOST_diagAnlgOutputVar_t;
++
++
++// Bit field structure that allows the host to mask off interrupt sources for possible DSP-to-Host interrupts.
++// Each bit represents a possible source of interrupts in the DSP code that might cause a DSP-to-Host
++// interrupt to occur.
++// This mask structure is not intended to show how interrupt sources in the DSP code correspond to the actual
++// DSP-to-Host interrupts. There could be multiple ways to cause an interrupt in the DSP code, but they all
++// eventually tie into one of the three possible DSP-to-Host interrupts.
++// The host should write a "1" to an individual bit when it wants to mask possible interrupts from that source.
++
++// enum that represents individual bits in maskBitField1
++typedef enum
++{
++ ZERO_MASK1 = 0, // dummy value for zero place-holder
++ DSP_MSG_BUF = 0x1, // mask interrupts due to DSP-to-Host message mailbox updates
++ STATE_BIT_FIELD = 0x2, // mask interrupts due to changes in the modem state bit fields
++ DSP_HEARTBEAT = 0x4 // mask interrupts for the DSP hearbeat
++} DEV_HOST_intMask1_t; // this enum should only have 32 values in it (maximum).
++
++// Add more "mask bit fields" at the end of this struct if you need more mask values
++typedef struct
++{
++ DEV_HOST_intMask1_t maskBitField1;
++} DEV_HOST_hostInterruptMask_t; // this struct should only have 32 bits in it.
++
++// Bit field structure that allows the host to determine the source(s) of DSP-to-Host interrupts in case
++// several of the interrupt sources get combined onto a single DSP-to-Host interrupt.
++// DSP will set each bit to a "1"as an interrupt occurs.
++// Host has the reponsibility to clear each bit to a "0" after it has determined the source(s) of interrupts.
++// Each source bit field in this struct will use the same enum typedef that matches the corresponding mask
++// bit field in "DEV_HOST_hostInterruptMask_t"
++typedef struct
++{
++ DEV_HOST_intMask1_t sourceBitField1;
++} DEV_HOST_hostInterruptSource_t;
++
++
++// --------------------------
++// Begin bitswap definitions.
++// --------------------------
++
++// bitSwapSCnt contains the superframe to perform bit swap
++// The entries must be ordered so that the first group only contains bit change commands
++// The other entries may contain power adjustment instructions and must be
++// written with something. NOP (0) is an available instruction.
++typedef struct
++{
++ PUINT8 fineGains_p; // pointer to bng string, needed to check fine gains for powerswap
++ UINT8 bitSwapNewIndices[6]; // Bin before bitSwapBin to process
++ UINT8 bitSwapCmd[6]; // Bitswap command for bitSwapBin
++ UINT8 bitSwapBin[6]; // bin to modify
++ UINT8 bitSwapSCnt; // Superframe count on which to perform bitswap
++ UINT8 bitSwapEnabled; // bitSwapEnabled
++} DEV_HOST_dspBitSwapDef_t;
++
++
++// ---------------------------
++// Begin ATM BERT definitions.
++// ---------------------------
++
++// Structure used for ATM Idle Cells based bit error rate computation.
++typedef struct
++{
++ UINT8 atmBertFlag; // Feature enable/disable flag (Host write)
++ UINT8 dummy1;
++ UINT8 dummy[2]; // Dummy bytes for 32-bit alignment
++ UINT32 bitCountLow; // Low part of 64-bit BERT bit count (DSP write)
++ UINT32 bitCountHigh; // High part of 64-bit BERT bit count (DSP write)
++ UINT32 bitErrorCountLow; // Low part of 64-bit BERT bit count (DSP write)
++ UINT32 bitErrorCountHigh;// High part of 64-bit BERT bit count (DSP write)
++} DEV_HOST_atmDsBert_t;
++
++
++// ------------------------------------
++// Misc. modem environment definitions.
++// ------------------------------------
++
++
++typedef struct
++{
++ SINT16 subStateIndex; // Index that signifies datapump substate. (DSP write)
++ UINT8 externalBert; // Turn on/off external BERT interface. 0 = OFF; 1 = ON. (Host write)
++ UINT8 usBertPattern; // BERT pattern for US TX data. 0 = 2^15-1; 1 = 2^23-1. (Host write)
++ UINT8 overrideDslLinkLed_f; // Overrides DSP operation of the DSL_LINK LED. (Host write)
++ // 0 = DSP is in control; 1 = Host is in control.
++ UINT8 dslLinkLedState_f; // DSL_LINK LED state when override flag has been set. (Host write)
++ // DSL_LINK LED will be updated with this value once per frame.
++ // LED is active-low: 0 = ON, 1 = OFF.
++ UINT8 overrideDslActLed_f; // Overrides DSP operation of the DSL_ACT LED. (Host write)
++ // 0 = DSP is in control; 1 = Host is in control.
++ UINT8 dslActLedState_f; // DSL_ACT LED state when override flag has been set. (Host write)
++ // DSL_ACT LED will be updated with this value once per frame.
++ // LED is active-low: 0 = ON, 1 = OFF.
++ UINT8 dGaspLprIndicator_f; // How LPR signal (GPIO[0]) is to be interpreted. (Host write)
++ // 0 = LPR is active-low; 1 = LPR is active-high.
++ UINT8 overrideDspLprGasp_f; // Overrides DSP detection of LPR signal to send out DGASP. (Host write)
++ // 0 = DSP detects LPR; 1 = Host detects LPR and sends "HOST_DGASP" to DSP.
++ UINT8 pcbEnabled; // DS power cut back
++ UINT8 maxAvgFineGainCtrl_f; // If maxAvgFineGainCtrl_f == 0, then the datapump controls the maximum average fine gain value.
++ // If maxAvgFineGainCtrl_f == 1, then the host controls the maximum average fine gain value.
++ UINT32 reasonForDrop; // This field will tell the host what might be the reason for a dropped connection.
++ SINT16 maxAverageFineGain; // When maxAvgFineGainCtrl_f == 1, the value in maxAverageFineGain is the maximum average fine gain level in 256log2 units.
++ UINT8 reserved1; // These are for 32-bit alignment.
++ UINT8 reserved2; // These are for 32-bit alignment.
++} DEV_HOST_modemEnvPublic_t;
++
++
++// -----------------------------
++// Generic structure definition.
++// -----------------------------
++
++typedef struct
++{
++ PSINT8 parameter1_p;
++ PSINT16 parameter2_p;
++ PSINT32 parameter3_p;
++ PUINT8 parameter4_p;
++ PUINT16 parameter5_p;
++ PUINT32 parameter6_p;
++} DEV_HOST_genericStructure_t;
++
++
++// ------------------------------
++// Begin G.hs buffer definitions.
++// ------------------------------
++
++typedef struct
++{
++ UINT8 txBuf[64]; // G.hs xmt buffer
++} DEV_HOST_ghsDspTxBufDef_t;
++
++
++typedef struct
++{
++ UINT8 rxBuf[80]; // G.hs rcv buffer
++} DEV_HOST_ghsDspRxBufDef_t;
++
++// -----------------------------------------
++// Begin Constellation Display definitions.
++// -----------------------------------------
++
++typedef struct
++{
++ UINT32 consDispStartAddr; // Host write
++ UINT32 consDispCurrentAddr; // Host write
++ UINT32 consDispBufLen; // Constellation Buffer Length
++ UINT32 consDispBin; // Host write, DS band only
++} DEV_HOST_consBufDef_t;
++
++typedef struct
++{
++ PSINT16 buffer1_p; //DSP write
++ PSINT16 buffer2_p; //DSP write
++} DEV_HOST_snrBuffer_t;
++
++// --------------------------------------------------------------------------------------
++// Typedef to be used for the DEV_HOST_dspOamSharedInterface_s struct of pointers
++// (this is used in dev_host_interface.c).
++// NOTE: This struct of pointers is NEVER to be referenced anywhere else in the DSP code.
++// IMPORTANT: Only pointers to other structs go into this struct !!
++// --------------------------------------------------------------------------------------
++typedef struct
++{
++ DEV_HOST_hostIntfcVersionDef_t *hostIntfcVersion_p;
++ DEV_HOST_dspVersionDef_t *datapumpVersion_p;
++ DEV_HOST_modemStateBitField_t *modemStateBitField_p;
++ DEV_HOST_dspWrNegoParaDef_t *dspWriteNegoParams_p;
++ DEV_HOST_oamWrNegoParaDef_t *oamWriteNegoParams_p;
++ DEV_HOST_raMsgsDef_t *raMsgs_p;
++ DEV_HOST_dspWrSuperFrameCntDef_t *dspWriteSuperFrameCnt_p;
++ DEV_HOST_msg_t *atucMsg_p;
++ DEV_HOST_msg_t *aturMsg_p;
++ DEV_HOST_dspWrSharedTables_t *dspWrSharedTables_p;
++ DEV_HOST_olayDpDef_t *olayDpParms_p;
++ DEV_HOST_eocVarDef_t *eocVar_p;
++ DEV_HOST_clearEocVarDef_t *clearEocVar_p;
++ DEV_HOST_modemStatsDef_t *modemStats_p;
++ DEV_HOST_atmStats_t *atmStats_p;
++ DEV_HOST_mailboxControl_t *dspHostMailboxControl_p;
++ DEV_HOST_phyPerf_t *phyPerf_p;
++ DEV_HOST_diagAnlgInputVar_t *analogInputVar_p;
++ DEV_HOST_diagAnlgOutputVar_t *analogOutputVar_p;
++ DEV_HOST_hostInterruptMask_t *hostInterruptMask_p;
++ DEV_HOST_profileBase_t *profileList_p;
++ DEV_HOST_hostInterruptSource_t *hostInterruptSource_p;
++ DEV_HOST_dspBitSwapDef_t *dspBitSwapDstrm_p;
++ DEV_HOST_dspBitSwapDef_t *dspBitSwapUstrm_p;
++ DEV_HOST_atmDsBert_t *atmDsBert_p;
++ DEV_HOST_modemEnvPublic_t *modemEnvPublic_p;
++ DEV_HOST_genericStructure_t *genericStructure1_p;
++ DEV_HOST_genericStructure_t *genericStructure2_p;
++ DEV_HOST_ghsDspTxBufDef_t *ghsDspTxBuf_p;
++ DEV_HOST_ghsDspRxBufDef_t *ghsDspRxBuf_p;
++ DEV_HOST_consBufDef_t *consDispVar_p;
++ DEV_HOST_snrBuffer_t *snrBuffer_p;
++} DEV_HOST_dspOamSharedInterface_t;
++
++
++// ---------------------------------------------------------------------------------
++// Typedef to be used for the pointer to the DEV_HOST_dspOamSharedInterface_s struct
++// of pointers (this is used in dev_host_interface.c).
++// ---------------------------------------------------------------------------------
++typedef DEV_HOST_dspOamSharedInterface_t *DEV_HOST_dspOamSharedInterfacePtr_t;
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/dev_host_verdef.h linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h
+--- linux.old/drivers/atm/sangam_atm/dev_host_verdef.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h 2005-07-10 08:02:01.432113184 +0200
+@@ -0,0 +1,102 @@
++#ifndef __DEV_HOST_VERDEF_H__
++#define __DEV_HOST_VERDEF_H__ 1
++
++//********************************************************************
++//*
++//* DMT-BASE ADSL MODEM PROGRAM
++//* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
++//* AMATI CONFIDENTIAL PROPRIETARY
++//*
++//* (c) Copyright April 1999, Texas Instruments Incorporated.
++//* All Rights Reserved.
++//*
++//* Property of Texas Instruments Incorporated and Amati Communications Corp.
++//*
++//* Restricted Rights - Use, duplication, or disclosure is subject to
++//* restrictions set forth in TI's and Amati program license agreement and
++//* associated documentation
++//*
++//*********************************************************************
++//*
++//* FILENAME: dev_host_verdef.h
++//*
++//* ABSTRACT: This file defines the version structure
++//*
++//* TARGET: Non specific.
++//*
++//* TOOLSET: Non specific.
++//*
++//* ACTIVATION:
++//*
++//* HISTORY: DATE AUTHOR DESCRIPTION
++//* 04/29/99 FLW Created
++//* 01/17/00 Barnett Mod's in support of merging NIC
++//* hardware rev 6/7 T1.413 codebases.
++//* 01/21/00 Wagner derfmake mods
++//* 05/11/00 Barnett hardware_rev is a 2 char string.
++//* 07/24/00 Barnett Rework as part of host interface redesign.
++//* 11/29/00 Hunt added chipset_id2
++//* 03/30/01 Barnett Prefixed all public elements with DSPDP_.
++//* This insures uniqueness of names that might
++//* match host names by coincidence.
++//* 03/30/01 Barnett Added DSPDP_Host_VersionDef to facilitate
++//* representing a version id for the host i/f
++//* separate from the firmware version id as
++//* a courtesy to the host.
++//* 07/23/01 JEB Changed name from verdef_u.h to dpsys_verdef.h
++//* 04/12/02 Barnett Make timestamp unsigned 32-bit field.
++//* Generalizes for all kinds of hosts.
++//* 11/15/02 JEB Changed name from dpsys_verdef.h to dev_host_verdef.h
++//* Updated structs according to coding guidelines
++//* 12/16/02 JEB Renamed some struct elements for new usage in Ax7
++//* 01/21/03 MCB Implemented Ax7 UNIT-MODULE modular software framework.
++//* 03/19/03 JEB Added back in "bugFix" elements into each struct type.
++//* Rearranged elements.
++//*
++//********************************************************************
++
++#include "env_def_typedefs.h"
++
++#define DSPDP_FLAVOR_NEWCODES 0xFF // Other values are valid old-style flavors
++
++// ------------------------------
++// ------------------------------
++// Begin DSP version definitions.
++// ------------------------------
++// ------------------------------
++
++typedef struct
++{
++ UINT32 timestamp; // Number of seconds since 01/01/1970
++ UINT8 major; // Major "00".00.00.00 revision nomenclature
++ UINT8 minor; // Minor 00."00".00.00 revision nomenclature
++ UINT8 bugFix; // Bug Fix 00.00."00".00 revision nomenclature
++ UINT8 buildNum; // Build Number 00.00.00."00" revision nomenclature
++ UINT8 netService; // Network service identifier
++ UINT8 chipsetGen; // chipset generation
++ UINT8 chipsetId; // chipset identifier
++ UINT8 chipsetId2; // second byte for "RV" chipset et al.
++ UINT8 hardwareRev1; // hardware revision, 1st char
++ UINT8 hardwareRev2; // hardware revision, 2nd char
++ UINT8 featureCode; // feature code
++ UINT8 dummy1; // dummy byte for explicit 32-bit alignment
++} DEV_HOST_dspVersionDef_t;
++
++// -------------------------------
++// -------------------------------
++// Begin host version definitions.
++// -------------------------------
++// -------------------------------
++
++typedef struct
++{
++ UINT8 major; // Major "00".00.00.00 revision nomenclature
++ UINT8 minor; // Minor 00."00".00.00 revision nomenclature
++ UINT8 bugFix; // Bug Fix 00.00."00".00 revision nomenclature
++ UINT8 buildNum; // Build Number 00.00.00."00" revision nomenclature
++ UINT8 netService; // Network service identifier
++ UINT8 dummy[3]; // dummy bytes for explicit 32-bit alignment
++} DEV_HOST_hostIntfcVersionDef_t;
++
++
++#endif // __DEV_HOST_VERDEF_H__
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.c linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_api.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c 2005-07-10 08:02:01.436112576 +0200
+@@ -0,0 +1,3339 @@
++/*******************************************************************************
++* FILE PURPOSE: DSL Driver API functions for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_hal_basicapi.c
++*
++* DESCRIPTION:
++* Contains basic DSL HAL APIs for Sangam
++*
++*
++* (C) Copyright 2001-02, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 06Feb03 0.00.00 RamP Original Version Created
++* 10Mar03 0.00.01 RamP Initial Revision for Modular Code Branch
++* 19Mar03 0.00.02 RamP Fixed DSL and DSP Version API Structures
++* 20Mar03 0.00.03 RamP Changed byteswap function names
++* 21Mar03 0.00.03 RamP/ZT Malloc for DSP f/w done in dslStartup
++* 25Mar03 0.00.04 RamP Removed statistics used only by SWTC
++* Created Checkpoint 3
++* 26Mar03 0.00.05 RamP Added Memory allocation for fwimage in
++* dslStartup function.
++* 07Apr03 0.00.06 RamP Implemented new error reporting scheme
++* Changed Commenting to C style only
++* 09Apr03 0.00.07 RamP Reorganized code to delete POST_SILICON
++* 10Apr03 0.00.08 RamP Removed ptidsl from loadFWImage function
++* moved size and fwimage initialization to
++* dslStartup function
++* 14Apr03 0.00.09 RamP Moved modemStateBitField processing to a
++* support function; deleted stateHistory
++* renamed the REG32 macro
++* 15Apr03 0.00.10 RamP Changed firmware allocate to shim_
++* osAllocateVMemory function
++* 15Apr03 0.00.11 RamP Changed host version number to 07.00.00.01
++* 16Apr03 0.00.12 RamP Modified return condition on dslShutdown
++* 16Apr03 0.00.13 RamP Changed host version number to 07.00.00.02
++* 21Apr03 0.01.00 RamP Cleaned up dslShutdown function
++* Added new function calls to allocate
++* (Alpha) /free overlay pages for different OS
++* Fixed typecasting for allocate/free fxns
++* Added Interrupt Acknowledge logic
++* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt into api
++* Added static global for intr source
++* 24Apr03 0.01.02 RamP Added processing for OVERLAY_END in
++* DSP message handlers, verified crc32
++* recovery for overlays
++* 28Apr03 0.01.03 RamP Removed global variable intrSource
++* Added parameter to handleInterrupt fxn
++* (Alpha Plus) to indicate interrupt source
++* Changed version number to 01.00.01.00
++* Fixed setTrainingMode function problem
++* 07May03 0.01.04 RamP Removed delineation state check in
++* message handling functions, added more
++* safety for setting lConnected in TC_SYNC
++* Changed version number to 01.00.01.01
++* 14May03 0.01.05 RamP Added 3 Switchable Hybrid APIs
++* Added additional statistics us/ds TxPower,
++* us margin,attenuation, us/ds bitallocation
++* moved versioning to dsl_hal_version.h
++* 14May03 0.01.06 RamP Fixed problem with CMsgs2 parsing
++* 20May03 0.01.07 RamP Added Inner/Outer pair API support. Added
++* dying gasp message.
++* 29May03 0.01.08 ZT/RamP Added memory optimizations for overlay pages
++* and coProfiles; added functions to free,
++* reload overlays and profiles
++* 04Jun03 0.01.09 RamP Added tick counters, fail states reporting
++* Made statistics fixes for higher data rates
++* Added Margin per tone to statistics
++* Added configuration checks for trellis/FEC
++* 06Jun03 0.01.10 RamP Added LED, STM Bert, dGasp LPR Config APIs
++* Modified interrupt acknowledge logic
++* Added current hybrid flag as statistic
++* 09Jun03 0.01.11 RamP Added function to send dying Gasp to Modem
++* fixed problem with reading OamNegoPara var
++* (Beta) fixed problem with reading current config
++* Added function to configure ATM Bert
++* fixed memory leak due to coProfiles
++* Added us/ds R/S FEC statistics
++* Added additional config capability for LED
++* fixed problem in free memory for CO profiles
++* 18Jul03 0.01.12 RamP Fixed problem with reading modemEnv structure
++* affects LED, DGaspLpr APIs
++* Sending Dying Gasp from shutdown function
++* 01Aug03 0.01.13 RamP Added preferred training mode to statistics
++* 13Aug03 0.01.14 MCB Set rev id for D3/R1.1 (ADSL2).
++* 21Aug03 0.01.15 RamP Added g.hs and aoc bitswap message gathering
++* Added new references to bits n gains table
++* Decoupled modem idle/retrain from pair select
++* Added line length and gross gain to statistics
++* 29Sep03 0.01.16 RamP Replaced advcfg function calls with support
++* module function switches
++* 01Oct03 0.01.17 RamP Added enum translation to set training mode
++* & to read statistics
++* 08Oct03 0.01.18 RamP Fixed problems with usTxPower statistic in
++* Annex B target, fixed problem with Trellis
++* 12Oct03 0.01.19 RamP Added API calls to gather ADSL2 Messages
++* 29Oct03 0.01.20 RamP Restored TC_SYNC detect logic
++* 30Oct03 0.01.21 RamP Removed Scaling factor for adsl2DSConRate
++* Setting Showtime state upon DSP_ACTIVE
++* 14Nov03 0.01.22 RamP Fixed scaling for usTxPower & dsTxPower
++* 14Nov03 0.01.23 RamP Added logic to gather CRates1/RRates1
++* by parsing DSP_CRATES1
++* 20Nov03 0.01.24 RamP Added generic & interface Read
++* and Write functions to read from
++* DSP - Host Interface
++* 24Nov03 0.01.25 RamP Modified interface Read/Write functions
++* to seperate element offsets from pointers
++* 19Dec03 0.01.26 RamP Modified pointer accessing problems with
++* block read functions
++* 26Dec03 0.01.27 RamP Made ghsIndex a local variable & added
++* check to avoid buffer overflow
++* 30Dec03 0.01.28 RamP Added generic mailbox command function
++*******************************************************************************/
++#include "dsl_hal_register.h"
++#include "dsl_hal_support.h"
++#include "dsl_hal_logtable.h"
++#include "dsl_hal_version.h"
++
++static unsigned int hybrid_selected;
++static unsigned int showtimeFlag = FALSE;
++
++#ifdef PRE_SILICON
++/*********************************************/
++/* Base Addresses */
++/*********************************************/
++#define DEV_MDMA_BASE 0x02000500
++
++/*********************************************/
++/* MC DMA Control Registers in DSL */
++/*********************************************/
++
++#define DEV_MDMA0_SRC_ADDR (DEV_MDMA_BASE + 0x00000000)
++#define DEV_MDMA0_DST_ADDR (DEV_MDMA_BASE + 0x00000004)
++#define DEV_MDMA0_CTL_ADDR (DEV_MDMA_BASE + 0x00000008)
++#define DEV_MDMA1_SRC_ADDR (DEV_MDMA_BASE + 0x00000040)
++#define DEV_MDMA1_DST_ADDR (DEV_MDMA_BASE + 0x00000044)
++#define DEV_MDMA1_CTL_ADDR (DEV_MDMA_BASE + 0x00000048)
++#define DEV_MDMA2_SRC_ADDR (DEV_MDMA_BASE + 0x00000080)
++#define DEV_MDMA2_DST_ADDR (DEV_MDMA_BASE + 0x00000084)
++#define DEV_MDMA2_CTL_ADDR (DEV_MDMA_BASE + 0x00000088)
++#define DEV_MDMA3_SRC_ADDR (DEV_MDMA_BASE + 0x000000C0)
++#define DEV_MDMA3_DST_ADDR (DEV_MDMA_BASE + 0x000000C4)
++#define DEV_MDMA3_CTL_ADDR (DEV_MDMA_BASE + 0x000000C8)
++
++#define DEV_MDMA0_SRC (*((volatile UINT32 *) DEV_MDMA0_SRC_ADDR))
++#define DEV_MDMA0_DST (*((volatile UINT32 *) DEV_MDMA0_DST_ADDR))
++#define DEV_MDMA0_CTL (*((volatile UINT32 *) DEV_MDMA0_CTL_ADDR))
++#define DEV_MDMA1_SRC (*((volatile UINT32 *) DEV_MDMA1_SRC_ADDR))
++#define DEV_MDMA1_DST (*((volatile UINT32 *) DEV_MDMA1_DST_ADDR))
++#define DEV_MDMA1_CTL (*((volatile UINT32 *) DEV_MDMA1_CTL_ADDR))
++#define DEV_MDMA2_SRC (*((volatile UINT32 *) DEV_MDMA2_SRC_ADDR))
++#define DEV_MDMA2_DST (*((volatile UINT32 *) DEV_MDMA2_DST_ADDR))
++#define DEV_MDMA2_CTL (*((volatile UINT32 *) DEV_MDMA2_CTL_ADDR))
++#define DEV_MDMA3_SRC (*((volatile UINT32 *) DEV_MDMA3_SRC_ADDR))
++#define DEV_MDMA3_DST (*((volatile UINT32 *) DEV_MDMA3_DST_ADDR))
++#define DEV_MDMA3_CTL (*((volatile UINT32 *) DEV_MDMA3_CTL_ADDR))
++
++/* MDMA control bits */
++
++#define DEV_MDMA_START 0x80000000
++#define DEV_MDMA_STOP 0x00000000
++#define DEV_MDMA_STATUS 0x40000000
++#define DEV_MDMA_DST_INC 0x00000000
++#define DEV_MDMA_DST_FIX 0x02000000
++#define DEV_MDMA_SRC_INC 0x00000000
++#define DEV_MDMA_SRC_FIX 0x00800000
++#define DEV_MDMA_BURST1 0x00000000
++#define DEV_MDMA_BURST2 0x00100000
++#define DEV_MDMA_BURST4 0x00200000
++
++#define DEV_MDMA_LEN_SHF 2
++#define DEV_MDMA_LEN_MASK 0x0000FFFF
++
++#define DMA0 0
++#define DMA1 1
++#define DMA2 2
++#define DMA3 3
++#endif
++#ifdef DMA
++SINT32 getDmaStatus(UINT32 mask)
++{
++ if(!(IFR & mask))
++ {
++ return DSLHAL_ERROR_NO_ERRORS;
++ }
++ else
++ {
++ ICR = mask ;
++ return 1 ;
++ }
++}
++
++void programMdma(UINT32 dma, UINT32 source, UINT32 destination, UINT32 length, UINT32 wait)
++{
++ volatile UINT32 statusMask ;
++
++ switch(dma)
++ {
++ case DMA0:
++ {
++ DEV_MDMA0_SRC = source ;
++ DEV_MDMA0_DST = destination ;
++ DEV_MDMA0_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
++ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
++ statusMask = 0x00000010 ;
++ }
++ break ;
++ case DMA1:
++ {
++ DEV_MDMA1_SRC = source ;
++ DEV_MDMA1_DST = destination ;
++ DEV_MDMA1_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
++ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
++ statusMask = 0x00000020 ;
++ }
++ break ;
++ case DMA2:
++ {
++ DEV_MDMA2_SRC = source ;
++ DEV_MDMA2_DST = destination ;
++ DEV_MDMA2_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
++ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
++ statusMask = 0x00000040 ;
++ }
++ break ;
++ case DMA3:
++ {
++ DEV_MDMA3_SRC = source ;
++ DEV_MDMA3_DST = destination ;
++ DEV_MDMA3_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
++ DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
++ statusMask = 0x00000080 ;
++ }
++ break ;
++
++ }
++
++ if(wait)
++ {
++ while(!(getDmaStatus(statusMask))) ;
++ }
++
++}
++#endif
++
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_dslStartup
++*
++*******************************************************************************************
++* DESCRIPTION: Entry point to initialize and load ax5 daughter board
++*
++* INPUT: PITIDSLHW_T *ppIHw
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_api_dslStartup(PITIDSLHW_T *ppIHw)
++{
++
++ ITIDSLHW_T *ptidsl;
++ int i;
++ int rc;
++ dprintf(4,"dslhal_api_dslStartup() NEW 1\n");
++
++ ptidsl=(ITIDSLHW_T *)shim_osAllocateMemory(sizeof(ITIDSLHW_T));
++ if(ptidsl==NULL)
++ {
++ dprintf(1, "unable to allocate memory for ptidsl\n");
++ return 1;
++ }
++ *ppIHw=ptidsl;
++ shim_osZeroMemory((char *) ptidsl, sizeof(ITIDSLHW_T));
++
++ /* Unreset the ADSL Subsystem */
++ rc=dslhal_support_unresetDslSubsystem();
++ if(rc)
++ {
++ dprintf(1, "unable to reset ADSL Subsystem \n");
++ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
++ return DSLHAL_ERROR_UNRESET_ADSLSS;
++ }
++ ptidsl->fwimage = shim_osAllocateVMemory(DSP_FIRMWARE_MALLOC_SIZE);
++ if(!ptidsl->fwimage)
++ {
++ dprintf(1,"Failed to Allocate Memory for DSP firmware binary \n");
++ return DSLHAL_ERROR_FIRMWARE_MALLOC;
++ }
++ /* read firmware file from flash */
++ rc=shim_osLoadFWImage(ptidsl->fwimage);
++ if(rc<0)
++ {
++ dprintf(1, "unable to get fw image\n");
++ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
++ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
++ return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
++ }
++ else
++ {
++ ptidsl->imagesize = rc;
++ }
++ /* Compute the CRC checksum on the image and validate the image */
++
++ /* Validate the image in the RAM */
++
++ /* load fw to DSP */
++
++ if(dslhal_support_hostDspCodeDownload(ptidsl))
++ {
++ dprintf(0,"dsp load error\n");
++ for(i=0; i<NUM_PAGES; i++)
++ {
++ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
++ {
++ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
++ ptidsl->olayDpPage[i].OverlayXferCount);
++ }
++ }
++ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
++ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
++ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
++ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
++ return DSLHAL_ERROR_CODE_DOWNLOAD;
++ }
++
++ /* set flag to indicated overlay pages are loaded */
++ ptidsl->bOverlayPageLoaded = 1;
++ /* set auto retrain to 1 to disble the overlay page reload */
++ ptidsl->bAutoRetrain = 1;
++
++ /* unreset Raptor */
++ /* change this to new function */
++ /* This function should basically bring DSP out of reset bit 23 of PRCR */
++ /* Function is ready but bypassed for Pre-Silicon */
++
++ rc=dslhal_support_unresetDsp();
++ if (rc)
++ {
++ dprintf(0,"unable to bring DSP out of Reset\n");
++ for(i=0; i<NUM_PAGES; i++)
++ {
++ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
++ {
++ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
++ ptidsl->olayDpPage[i].OverlayXferCount);
++ }
++ }
++ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
++ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
++ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
++ shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
++ return DSLHAL_ERROR_UNRESET_DSP;
++ }
++ shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
++ dprintf(4,"dslhal_api_dslStartup() done\n");
++
++ /* Add the code to initialize the host interface variables */
++ /* Add code to tickle the host interface */
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_dslShutdown
++ *
++ *******************************************************************************************
++ * DESCRIPTION: routine to shutdown ax5 modem and free the resource
++ *
++ * INPUT: tidsl_t *ptidsl
++ *
++ * RETURN: NULL
++ *
++ *
++ *****************************************************************************************/
++
++int dslhal_api_dslShutdown(tidsl_t *ptidsl)
++{
++ int rc= DSLHAL_ERROR_NO_ERRORS;
++ int i;
++
++ dprintf(5, "dslhal_api_dslShutdown\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DSLSS_SHUTDOWN, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1, " unable to reset DSP \n");
++ rc = DSLHAL_ERROR_RESET_DSP;
++ }
++ /* DSP need 50 ms to send out the message*/
++
++ shim_osClockWait(60 * 1000);
++
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0);
++
++ /* free memory allocated*/
++
++ for(i=0; i<NUM_PAGES; i++)
++ {
++ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
++ {
++ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
++ ptidsl->olayDpPage[i].OverlayXferCount);
++ }
++ }
++ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
++ if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
++ shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
++ shim_osFreeMemory((void *)ptidsl, sizeof(tidsl_t));
++ rc = dslhal_support_resetDsp();
++ if(rc)
++ {
++ dprintf(1, " unable to reset ADSL subsystem \n");
++ rc = DSLHAL_ERROR_RESET_DSP;
++ }
++ rc = dslhal_support_resetDslSubsystem();
++ if(rc)
++ {
++ dprintf(1, " unable to reset ADSL subsystem \n");
++ rc = DSLHAL_ERROR_RESET_ADSLSS;
++ }
++return rc;
++}
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_getDslHalVersion
++*
++*******************************************************************************************
++* DESCRIPTION: This routine supply DSL Driver version.
++*
++* INPUT: tidsl_t * ptidsl
++* void *pVer, DSP Driver Version Pointer
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++* Note: See verdef_u.h for version structure definition.
++*****************************************************************************************/
++
++void dslhal_api_getDslHalVersion(void *pVer)
++{
++ dslVer *pVersion;
++ pVersion = (dslVer *)pVer;
++ pVersion->major = (unsigned char) DSLHAL_VERSION_MAJOR;
++ pVersion->minor = (unsigned char) DSLHAL_VERSION_MINOR;
++ pVersion->bugfix = (unsigned char) DSLHAL_VERSION_BUGFIX;
++ pVersion->buildNum = (unsigned char) DSLHAL_VERSION_BUILDNUM;
++ pVersion->timeStamp = (unsigned char) DSLHAL_VERSION_TIMESTAMP;
++}
++
++/********************************************************************************************
++ * FUNCTION NAME: dslhal_api_pollTrainingStatus()
++ *
++ *********************************************************************************************
++ * DESCRIPTION: code to decode modem status and to start modem training
++ * Input: tidsl_t *ptidsl
++ *
++ * Return: modem status
++ * -1 failed
++ *
++ ********************************************************************************************/
++
++int dslhal_api_pollTrainingStatus(tidsl_t *ptidsl)
++{
++ int cmd;
++ int tag;
++ int parm1,parm2;
++ int rc;
++ unsigned int failState;
++ static unsigned int pollGhsIndex=0;
++
++ /*char *tmp;*/
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++#if SWTC
++ DEV_HOST_tcHostCommDef_t TCHostCommDef;
++#endif
++
++ dprintf(5,"dslhal_api_pollTrainingStatus\n");
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++#if SWTC
++ dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
++ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++#endif
++
++ rc = dslhal_support_processTrainingState(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Modem Training State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ rc = dslhal_support_processModemStateBitField(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Modem Training State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ /*
++ rc = dslhal_support_readDelineationState(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Delineation State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ */
++ while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
++ {
++ dprintf(4,"mailbox message: 0x%x\n", cmd);
++ /*
++ for(rc=0;rc<8;rc++)
++ {
++ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
++ }
++ */
++
++ if (cmd == DSP_IDLE)
++ {
++ dprintf(4,"DSP_IDLE\n");
++ ptidsl->lConnected=0;
++ hybrid_selected=888;
++ /* add code for reload overlay pages */
++ if(ptidsl->bAutoRetrain == 0)
++ {
++ while(ptidsl->bOverlayPageLoaded == 0)
++ {
++ shim_osClockWait(6400);
++ }
++ //dslhal_support_restoreTrainingInfo(ptidsl);
++ //ptidsl->bOverlayPageLoaded = 1;
++ }
++ /* command DSP to ACTREQ */
++ if(showtimeFlag == TRUE)
++ {
++ dslhal_api_resetTrainFailureLog(ptidsl);
++ dslhal_support_advancedIdleProcessing(ptidsl);
++ showtimeFlag = FALSE;
++ }
++ failState = (unsigned int)parm1;
++ if(failState!=0)
++ {
++ ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
++ ptidsl->AppData.trainFails++;
++ if(ptidsl->AppData.trainFails > 30)
++ ptidsl->AppData.trainFails=0;
++ }
++ for(pollGhsIndex=0;pollGhsIndex<10;pollGhsIndex++)
++ {
++ for(rc=0;rc<62;rc++)
++ ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex][rc]=0;
++ }
++ pollGhsIndex=0;
++ rc = dslhal_support_writeHostMailbox(ptidsl,HOST_ACTREQ, 0, 0, 0);
++ if (rc)
++ return DSLHAL_ERROR_MAILBOX_WRITE;
++ }
++
++ if(cmd == DSP_ATM_TC_SYNC)
++ {
++ dprintf(4,"\nTC_SYNC\n");
++ showtimeFlag = TRUE;
++ ptidsl->lConnected=1;
++ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
++ {
++ dslhal_support_clearTrainingInfo(ptidsl);
++ ptidsl->bOverlayPageLoaded = 0;
++ }
++ }
++ if(cmd == DSP_ACTIVE)
++ {
++ dprintf(4,"DSP_ACTIVE");
++ ptidsl->lConnected=0;
++ ptidsl->AppData.bState = RSTATE_SHOWTIME;
++ dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
++ dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
++ }
++ if(cmd == DSP_ATM_NO_TC_SYNC)
++ {
++ dprintf(4,"\nTC_NOSYNC\n");
++ ptidsl->lConnected=0;
++ }
++ if(cmd == DSP_DGASP)
++ {
++ dprintf(0,"\n GASP!!! \n");
++ }
++ if(cmd == DSP_OVERLAY_END)
++ {
++ dprintf(4,"Overlay Page Done %d \n",tag);
++ rc = dslhal_support_checkOverlayPage(ptidsl,tag);
++ if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
++ {
++ dprintf(0,"Overlay Page: %d CORRUPTED \n",tag);
++ return (0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
++ }
++ }
++ if(cmd == DSP_HYBRID)
++ {
++ dprintf(2,"Hybrid Metrics Available: %d\n",tag);
++ hybrid_selected = tag;
++ }
++ if(cmd == DSP_DGASP)
++ {
++ dprintf(0,"\n GASP!!! \n");
++ }
++ if(cmd == DSP_XMITBITSWAP)
++ {
++ dslhal_support_aocBitSwapProcessing(ptidsl,0);
++ }
++ if(cmd == DSP_RCVBITSWAP)
++ {
++ dslhal_support_aocBitSwapProcessing(ptidsl,1);
++ }
++ if(cmd == DSP_GHSMSG)
++ {
++ dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
++ dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
++ if(pollGhsIndex > 9)
++ pollGhsIndex=0;
++ rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex++][0], tag);
++ }
++ if(cmd == DSP_CRATES1)
++ {
++ dprintf(3,"DSP C-Rates1 Data Ready \n");
++ rc = dslhal_support_gatherRateMessages(ptidsl);
++ }
++ if(cmd == DSP_SNR)
++ {
++ dprintf(3,"DSP SNR Data Ready \n");
++ rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
++ }
++ if(cmd == DSP_EOC)
++ {
++ dprintf(3,"DSP_EOC message \n");
++ rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
++ }
++
++ if(cmd == DSP_TRAINING_MSGS)
++ {
++ dprintf(3,"DSP_TRAINING_MSGS \n");
++ rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
++ }
++ }
++ dprintf(6,"dslhal_api_pollTrainingStatus done\n");
++ return(ptidsl->AppData.bState);
++
++} /* end of dslhal_api_pollTrainingStatus() */
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
++*
++*********************************************************************************************
++* DESCRIPTION: Code to handle ax5 hardware interrupts
++*
++* Input: tidsl_t *ptidsl
++* int *pMsg, pointer to returned hardware messages. Each byte represent a messge
++* int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++int dslhal_api_handleTrainingInterrupt(tidsl_t *ptidsl, int intrSource)
++{
++ int cmd;
++ int tag;
++ int parm1,parm2;
++ unsigned int msg1;
++ unsigned int msg2;
++ int rc;
++ unsigned int failState;
++ static unsigned int interruptGhsIndex=0;
++ /*char *tmp;*/
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++#if SWTC
++ DEV_HOST_tcHostCommDef_t TCHostCommDef;
++#endif
++ dprintf(6,"dslhal_api_handleTrainingInterrupt\n");
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++#if SWTC
++ dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
++ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++#endif
++
++ if(intrSource & MASK_BITFIELD_INTERRUPTS)
++ {
++ dspOamSharedInterface.modemStateBitField_p =(DEV_HOST_modemStateBitField_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStateBitField_p);
++ rc = dslhal_support_processTrainingState(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Modem Training State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ rc = dslhal_support_processModemStateBitField(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Modem Training State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ }
++ if(intrSource & MASK_MAILBOX_INTERRUPTS)
++ {
++ /*
++ rc = dslhal_support_readDelineationState(ptidsl);
++ if(rc)
++ {
++ dprintf(0,"Error Reading Delineation State \n");
++ return DSLHAL_ERROR_MODEMSTATE;
++ }
++ */
++ while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
++ {
++ dprintf(4,"mailbox message: 0x%x\n", cmd);
++ /*
++ for(rc=0;rc<8;rc++)
++ {
++ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
++ }
++ */
++ if (cmd == DSP_IDLE)
++ {
++ dprintf(4,"DSP_IDLE\n");
++ ptidsl->lConnected=0;
++ hybrid_selected=888;
++ if(showtimeFlag == TRUE)
++ {
++ dslhal_api_resetTrainFailureLog(ptidsl);
++ dslhal_support_advancedIdleProcessing(ptidsl);
++ showtimeFlag = FALSE;
++ }
++ failState = (unsigned int)parm1;
++ if(failState!=0)
++ {
++ ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
++ ptidsl->AppData.trainFails++;
++ if(ptidsl->AppData.trainFails > 30)
++ ptidsl->AppData.trainFails=0;
++ }
++ for(interruptGhsIndex=0;interruptGhsIndex<10;interruptGhsIndex++)
++ {
++ for(rc=0;rc<62;rc++)
++ ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex][rc]=0;
++ }
++ interruptGhsIndex=0;
++
++ /* add code for reload overlay pages */
++ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 0)
++ {
++ dslhal_support_restoreTrainingInfo(ptidsl);
++ ptidsl->bOverlayPageLoaded = 1;
++ }
++ /* command DSP to ACTREQ */
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_ACTREQ, 0, 0, 0);
++ if (rc)
++ return DSLHAL_ERROR_MAILBOX_WRITE;
++ }
++ if(cmd == DSP_ATM_TC_SYNC)
++ {
++ dprintf(4,"\nTC_SYNC\n");
++ showtimeFlag = TRUE;
++ ptidsl->lConnected=1;
++ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
++ {
++ dslhal_support_clearTrainingInfo(ptidsl);
++ ptidsl->bOverlayPageLoaded = 0;
++ }
++ }
++ if(cmd == DSP_ACTIVE)
++ {
++ ptidsl->lConnected=0;
++ ptidsl->AppData.bState = RSTATE_SHOWTIME;
++ dprintf(4,"DSP_ACTIVE");
++ dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
++ dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
++ }
++ if(cmd == DSP_ATM_NO_TC_SYNC)
++ {
++ dprintf(4,"\nTC_NOSYNC\n");
++ ptidsl->lConnected=0;
++ /* add code for reload overlay pages */
++ }
++ if(cmd == DSP_OVERLAY_END)
++ {
++ dprintf(4,"Overlay Page Done %d \n",tag);
++ rc = dslhal_support_checkOverlayPage(ptidsl,tag);
++ if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
++ {
++ dprintf(4,"Overlay Page: %d CORRUPTED \n",tag);
++ return(0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
++ }
++ }
++ if(cmd == DSP_HYBRID)
++ {
++ dprintf(2,"Hybrid Metrics Available\n");
++ hybrid_selected = tag;
++ }
++ if(cmd == DSP_XMITBITSWAP)
++ {
++ rc = dslhal_support_aocBitSwapProcessing(ptidsl,0);
++ }
++ if(cmd == DSP_RCVBITSWAP)
++ {
++ rc = dslhal_support_aocBitSwapProcessing(ptidsl,1);
++ }
++ if(cmd == DSP_GHSMSG)
++ {
++ dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
++ dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
++ if(interruptGhsIndex > 9)
++ interruptGhsIndex=0;
++ rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex++][0], tag);
++ }
++ if(cmd == DSP_CRATES1)
++ {
++ dprintf(3,"DSP C-Rates1 Data Ready \n");
++ rc = dslhal_support_gatherRateMessages(ptidsl);
++ }
++ if(cmd == DSP_SNR)
++ {
++ dprintf(3,"DSP SNR Data Ready \n");
++ rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
++ }
++ if(cmd == DSP_EOC)
++ {
++ dprintf(3,"DSP_EOC message \n");
++ rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
++ }
++ if(cmd == DSP_TRAINING_MSGS)
++ {
++ dprintf(3,"DSP_TRAINING_MSGS \n");
++ rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
++ }
++ }
++
++ dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
++ dprintf(5,"Text Message Part1: 0x%x \t Text Message Part2: 0x%x \n",msg1,msg2);
++ }
++ dprintf(6,"dslhal_api_handleTrainingInterrupt done\n");
++ return(ptidsl->AppData.bState);
++} /* end of dslhal_api_handleTrainingInterrupt() */
++
++
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_dslRetrain(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends CMD_ACTREQ to the DSP to issue a retrain
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_dslRetrain(tidsl_t *ptidsl)
++{
++ int rc;
++
++ dprintf(5, "dslhal_cfg_dslRetrain \n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_cfg_dslRetrain failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendQuiet(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendQuiet(tidsl_t *ptidsl)
++{
++ int rc;
++
++ dprintf(5, "dslhal_api_sendQuiet\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_api_sendQuiet failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendIdle(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendIdle(tidsl_t *ptidsl)
++{
++ int rc;
++
++ dprintf(5, "dslhal_api_sendIdle\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_IDLE, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_api_sendIdle failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendDgasp(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendDgasp(tidsl_t *ptidsl)
++{
++ int rc;
++
++ dprintf(5, "dslhal_api_sendDgasp\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_api_sendDgasp failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Desired Training Mode {None/Multimode/G.dmt/lite
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
++* 2: T1.413, 3:G.dmt, 4: G.lite
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
++{
++ DEV_HOST_oamWrNegoParaDef_t NegoPara;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setTrainingMode()\n");
++ if(trainmode>255)
++ {
++ dprintf(3,"Invalid Value for Desired Training Mode (must be <255)\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ /* Enum Translation to maintain backwards compatibility for train modes */
++ if(trainmode == DSLTRAIN_MULTI_MODE)
++ trainmode = MULTI_MODE;
++ if(trainmode == DSLTRAIN_T1413_MODE)
++ trainmode = T1413_MODE;
++ if(trainmode == DSLTRAIN_GDMT_MODE)
++ trainmode = GDMT_MODE;
++
++ NegoPara.stdMode = trainmode;
++ dprintf(5,"Train Mode: 0x%x\n",trainmode);
++ rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++
++ dprintf(5," dslhal_api_setTrainingMode() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_getDspVersion
++*
++*******************************************************************************************
++* DESCRIPTION: This routine supply AX5 daugther card DSP version.
++*
++* INPUT: tidsl_t * ptidsl
++* void *pVer, DSP version struct is returned starting at this pointer
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++* Note: See verdef_u.h for version structure definition.
++*****************************************************************************************/
++int dslhal_api_getDspVersion(tidsl_t *ptidsl, void *pVer)
++{
++ /* DEV_HOST_dspVersionDef_t dspVersion; */
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5, "dslhal_api_getDspVersion\n");
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ if(!pVer)
++ return DSLHAL_ERROR_INVALID_PARAM;
++
++ *(unsigned int *) pVer = 0;
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,
++ pVer, sizeof(dspVer));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ pVer = (DEV_HOST_dspVersionDef_t *)(dslhal_support_byteSwap32((unsigned int)pVer));
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_gatherStatistics()
++*
++*********************************************************************************************
++* DESCRIPTION: Read statistical infromation from ax5 modem daugter card.
++* Input: tidsl_t *ptidsl
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++void dslhal_api_gatherStatistics(tidsl_t * ptidsl)
++{
++ int rc,optIdxU,optIdxD,i;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_dspWrNegoParaDef_t rateparms;
++ DEV_HOST_oamWrNegoParaDef_t configParms;
++ DEV_HOST_modemStatsDef_t StatisticsDef;
++ DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
++ DEV_HOST_atmStats_t atmStats;
++ DEV_HOST_usAtmStats_t usAtmStats0, usAtmStats1;
++ DEV_HOST_dsAtmStats_t dsAtmStats0,dsAtmStats1;
++ DEV_HOST_dspWrSuperFrameCntDef_t SuperFrameCnt;
++ DEV_HOST_msg_t atuc_msg, aturMsg;
++ DEV_HOST_eocVarDef_t eocVar;
++ DEV_HOST_dspWrSharedTables_t sharedTables;
++ DEV_HOST_phyPerf_t phyPerf;
++ unsigned char usBits[64],dsBits[256];
++ unsigned char dsPowerCutBack;
++ int usNumLoadedTones=0, dsNumLoadedTones=0;
++
++ dprintf(5, "dslhal_api_gatherStatistics\n");
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ if(!ptidsl->bStatisticsInitialized && ptidsl->lConnected == LINE_CONNECTED)
++ {
++ dslhal_api_initStatistics(ptidsl);
++ ptidsl->bStatisticsInitialized = TRUE;
++ }
++
++ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p,
++ &rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ if(!rc)
++ {
++ /* trained mode */
++ ptidsl->AppData.dsl_modulation = (unsigned int)rateparms.trainMode;
++ if(rateparms.trainMode == T1413_MODE)
++ ptidsl->AppData.dsl_modulation = DSLTRAIN_T1413_MODE;
++ if(rateparms.trainMode == GDMT_MODE)
++ ptidsl->AppData.dsl_modulation = DSLTRAIN_GDMT_MODE;
++ /* rate */
++ /* shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, 120); */
++ ptidsl->AppData.bCRates2 = rateparms.cRates2;
++ /* shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
++ ptidsl->AppData.bRRates2 = rateparms.rRates2;
++ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
++ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
++ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4);
++ ptidsl->AppData.atucVendorId = (unsigned int)rateparms.atucVendorId;
++ ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
++ ptidsl->AppData.atucRevisionNum = (unsigned int)rateparms.atucGhsRevisionNum;
++ ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
++ ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
++
++ if((rateparms.cRates2 & 0x0f) == 0x01)
++ optIdxU = 0;
++ else if((rateparms.cRates2 & 0x0f) == 0x02)
++ optIdxU = 1;
++ else if((rateparms.cRates2 & 0x0f) == 0x04)
++ optIdxU = 2;
++ else if((rateparms.cRates2 & 0x0f) == 0x08)
++ optIdxU = 3;
++ else
++ optIdxU = -1;
++
++ dprintf(5, "optIdxU=%d\n", optIdxU);
++
++ /* Obtain the US Rates using Opt# and CRates1 Table */
++ /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32 */
++ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
++ ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
++ else
++ ptidsl->AppData.USConRate = 32 * dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
++
++ ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate;
++
++ if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01)
++ optIdxD = 0;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)
++ optIdxD = 1;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04)
++ optIdxD = 2;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)
++ optIdxD = 3;
++ else
++ optIdxD = -1;
++ /* Obtain the DS Rates using Opt# and CRates1 Table */
++ /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32 */
++ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
++ ptidsl->AppData.DSConRate = (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
++ else
++ ptidsl->AppData.DSConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
++
++ dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
++ /* Determine which Path has Modem Trained with */
++ if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
++ ptidsl->AppData.TrainedPath = FAST_PATH;
++ else
++ ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
++
++ /* Set the mode in which the modem is trained */
++ ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
++ if(rateparms.trainMode == T1413_MODE)
++ ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
++ if(rateparms.trainMode == GDMT_MODE)
++ ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
++
++ if(ptidsl->AppData.TrainedPath == FAST_PATH)
++ ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
++ else
++ ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
++ ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
++ ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
++
++ if(ptidsl->AppData.TrainedPath == FAST_PATH)
++ ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
++ else
++ ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
++ ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
++ ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
++ }
++
++ dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ /* Populate the Error Structure Variables */
++
++ /* US Interleave Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ /* DS Interleave Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ /* US Fast Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ /* DS Fast Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++ if(!rc)
++ {
++ if(ptidsl->AppData.bState > 2)
++ {
++ /* Get CRC Errors Stats for both US and DS */
++ ptidsl->AppData.dsICRC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
++ ptidsl->AppData.dsFCRC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
++ ptidsl->AppData.usICRC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
++ ptidsl->AppData.usFCRC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
++ /* Get FEC Errors Stats for both US and DS */
++ ptidsl->AppData.dsIFEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
++ ptidsl->AppData.dsFFEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
++ ptidsl->AppData.usIFEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
++ ptidsl->AppData.usFFEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
++ /* Get NCD Errors Stats for both US and DS */
++ ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
++ ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
++ ptidsl->AppData.usINCD_error = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
++ ptidsl->AppData.usFNCD_error = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
++ /* Get LCD Errors Stats for both US and DS */
++ ptidsl->AppData.dsILCD_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
++ ptidsl->AppData.dsFLCD_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
++ ptidsl->AppData.usILCD_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
++ ptidsl->AppData.usFLCD_errors = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
++ /*Get HEC Errors Stats for both US and DS */
++ ptidsl->AppData.dsIHEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
++ ptidsl->AppData.dsFHEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
++ ptidsl->AppData.usIHEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
++ ptidsl->AppData.usFHEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
++
++ /* Get LOS and SEF error Stats */
++ ptidsl->AppData.LOS_errors = dslhal_support_byteSwap32(StatisticsDef.losErrors);
++ ptidsl->AppData.SEF_errors = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
++ ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
++ ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);
++
++ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ /* Populate the US/DS ATM Stats Variables */
++
++ /* US ATM Statistics */
++
++ /* Change the endianness of the Pointer */
++ atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
++
++ if (rc)
++ return;
++
++ atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
++
++ if (rc)
++ return;
++
++ /* DS ATM Statistics */
++
++ /* Change the endianness of the Pointer */
++ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
++
++ if (rc)
++ return;
++ atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
++
++ if (rc)
++ return;
++
++ /* Get ATM Stats for both US and DS for Channel 0*/
++ ptidsl->AppData.usAtm_count[0] = dslhal_support_byteSwap32(usAtmStats0.goodCount);
++ ptidsl->AppData.usIdle_count[0] = dslhal_support_byteSwap32(usAtmStats0.idleCount);
++#if SWTC
++ ptidsl->AppData.usPdu_count[0] = dslhal_support_byteSwap32(usAtmStats0.pduCount);
++#endif
++ ptidsl->AppData.dsGood_count[0] = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
++ ptidsl->AppData.dsIdle_count[0] = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
++#if SWTC
++ ptidsl->AppData.dsPdu_count[0] = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
++#endif
++ ptidsl->AppData.dsBadHec_count[0] = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
++ ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
++ /* Get ATM Stats for both US and DS for Channel 1*/
++ ptidsl->AppData.usAtm_count[1] = dslhal_support_byteSwap32(usAtmStats1.goodCount);
++ ptidsl->AppData.usIdle_count[1] = dslhal_support_byteSwap32(usAtmStats1.idleCount);
++#if SWTC
++ ptidsl->AppData.usPdu_count[1] = dslhal_support_byteSwap32(usAtmStats1.pduCount);
++#endif
++ ptidsl->AppData.dsGood_count[1] = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
++ ptidsl->AppData.dsIdle_count[1] = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
++#if SWTC
++ ptidsl->AppData.dsPdu_count[1] = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
++#endif
++ ptidsl->AppData.dsBadHec_count[1] = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
++ ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
++
++ /* Determine the US and DS Superframe Count */
++
++ dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ ptidsl->AppData.usSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
++ ptidsl->AppData.dsSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
++
++ /* Determine Frame Mode and Max Frame Mode */
++
++ dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ ptidsl->AppData.FrmMode = (unsigned int)atuc_msg.framingMode;
++ ptidsl->AppData.MaxFrmMode = (unsigned int)atuc_msg.maxFrameMode;
++
++ /* Determine Gross Gain */
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
++
++ /* Determine DS Line Attenuation & Margin */
++ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ ptidsl->AppData.dsLineAttn = (unsigned int)eocVar.lineAtten;
++ ptidsl->AppData.dsMargin = (unsigned int)eocVar.dsMargin;
++ }
++ }
++
++ /* Read in the Shared Tables structure */
++ dspOamSharedInterface.dspWrSharedTables_p = (DEV_HOST_dspWrSharedTables_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWrSharedTables_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWrSharedTables_p,&sharedTables, sizeof(DEV_HOST_dspWrSharedTables_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ /* Read the ATU-R Bits and Gains Table */
++ sharedTables.aturBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.aturBng_p);
++ rc = dslhal_support_blockRead((PVOID)sharedTables.aturBng_p,ptidsl->AppData.rBng,255*2*sizeof(unsigned char));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ /* Read the ATU-C Bits and Gains Table */
++ sharedTables.atucBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.atucBng_p);
++ if(ptidsl->netService == 2) /* for Annex_B */
++ {
++ rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,126*sizeof(unsigned char));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ for(i=0;i<US_BNG_LENGTH*2;i++)
++ usBits[i]=0;
++ for(i=1;i<US_BNG_LENGTH*2;i++)
++ {
++ usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
++ dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
++ }
++ for(i=1;i<US_BNG_LENGTH*2;i++)
++ {
++ if(usBits[i])
++ usNumLoadedTones++;
++ }
++ }
++ else
++ {
++ rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,62*sizeof(unsigned char));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ for(i=0;i<US_BNG_LENGTH;i++)
++ usBits[i]=0;
++ for(i=1;i<US_BNG_LENGTH;i++)
++ {
++ usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
++ dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
++ }
++ for(i=1;i<US_BNG_LENGTH;i++)
++ {
++ if(usBits[i])
++ usNumLoadedTones++;
++ }
++ }
++
++ /* Determine Number U/S of Loaded Tones */
++
++ /* U/S Power Computation */
++ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
++ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ ptidsl->AppData.currentHybridNum = phyPerf.currentHybridNumUsed;
++ phyPerf.usAvgGain = dslhal_support_byteSwap32(phyPerf.usAvgGain);
++ ptidsl->AppData.usTxPower = LOG43125 + phyPerf.usAvgGain + (256*US_NOMINAL_POWER)+log10[usNumLoadedTones-1];
++ dprintf(7,"Avg Gain: 0x%x usNumLoadedTones: 0x%x log: 0x%x\n",phyPerf.usAvgGain, usNumLoadedTones, log10[usNumLoadedTones-1]);
++
++ /* Determine Number D/S of Loaded Tones */
++ dsBits[0]=0;
++ for(i=0;i<DS_BNG_LENGTH;i++)
++ {
++ dsBits[i]=0;
++ /* ptidsl->AppData.rBng[i-1]=dslhal_support_byteSwap32((unsigned int)ptidsl->AppData.rBng[i-1]);*/
++ }
++ for(i=1;i<DS_BNG_LENGTH;i++)
++ {
++ dsBits[i]=((ptidsl->AppData.rBng[(i-1)*2])&0xf);
++ dprintf(5,"Bit #%d : 0x%x\n",i,dsBits[i]);
++ }
++ for(i=1;i<DS_BNG_LENGTH;i++)
++ {
++ if(dsBits[i])
++ dsNumLoadedTones++;
++ }
++ /* D/S Power Computation */
++ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
++ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ /* D/S Power Cutback */
++ dsPowerCutBack = (unsigned char)((((ptidsl->AppData.bCMsgs1[0]) >>6) &0x3)+(((ptidsl->AppData.bCMsgs1[1]) &0x1) <<2));
++ phyPerf.dsAvgGain = dslhal_support_byteSwap32(phyPerf.dsAvgGain);
++ ptidsl->AppData.dsTxPower = LOG43125 + phyPerf.dsAvgGain + (256*((2*(dsPowerCutBack-1))-52)) + log10[dsNumLoadedTones-1];
++ dprintf(7,"Avg Gain: %d dsNumLoadedTones: %d log: %d pcb: %d \n",phyPerf.dsAvgGain, dsNumLoadedTones, log10[dsNumLoadedTones-1], dsPowerCutBack);
++ /* ds bit allocation */
++ sharedTables.bitAllocTblDstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblDstrm_p);
++ rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblDstrm_p,ptidsl->AppData.BitAllocTblDstrm, 256*sizeof(unsigned char));
++ if(rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed \n");
++ return;
++ }
++
++ /* us bit allocation */
++ sharedTables.bitAllocTblUstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblUstrm_p);
++ rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblUstrm_p,ptidsl->AppData.BitAllocTblUstrm, 32*sizeof(unsigned char));
++ if(rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed \n");
++ return;
++ }
++ /* margin per tone */
++ sharedTables.marginTblDstrm_p = (signed char *)dslhal_support_byteSwap32((unsigned int)sharedTables.marginTblDstrm_p);
++ rc = dslhal_support_blockRead((PVOID)sharedTables.marginTblDstrm_p,ptidsl->AppData.marginTblDstrm, 256*sizeof(signed char));
++ if(rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed \n");
++ return;
++ }
++ /* Read Configured Options */
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p,
++ &configParms, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ else
++ {
++ /* r-Msg1 */
++ ptidsl->AppData.StdMode = (unsigned int)configParms.stdMode;
++ if(configParms.stdMode == T1413_MODE)
++ ptidsl->AppData.StdMode = DSLTRAIN_T1413_MODE;
++ if(configParms.stdMode == GDMT_MODE)
++ ptidsl->AppData.StdMode = DSLTRAIN_GDMT_MODE;
++ if(configParms.stdMode == MULTI_MODE)
++ ptidsl->AppData.StdMode = DSLTRAIN_MULTI_MODE;
++
++ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs1, (void *)configParms.rMsgs1, 6*sizeof(char));
++ if((ptidsl->AppData.bRMsgs1[2] & 0x02) == 0x02)
++ {
++ dprintf(7,"Trellis!\n");
++ ptidsl->configFlag |= CONFIG_FLAG_TRELLIS;
++ }
++ else
++ ptidsl->configFlag &= ~CONFIG_FLAG_TRELLIS;
++ if(ptidsl->AppData.bRMsgs1[2]&0x01)
++ ptidsl->configFlag |= CONFIG_FLAG_EC;
++ else
++ ptidsl->configFlag &= ~CONFIG_FLAG_EC;
++ }
++ return;
++}
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_initStatistics()
++*
++*********************************************************************************************
++* DESCRIPTION: init statistical information of ax5 modem daugter card.
++*
++* Input: tidsl_t *ptidsl
++*
++* Return: NULL
++*
++********************************************************************************************/
++void dslhal_api_initStatistics(tidsl_t * ptidsl)
++{
++ int rc;
++ /*TCHostCommDef TCHostCommParms; */
++ int optIdxU, optIdxD;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_dspWrNegoParaDef_t rateparms;
++ DEV_HOST_modemStatsDef_t StatisticsDef;
++ DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
++ DEV_HOST_atmStats_t atmStats;
++ DEV_HOST_usAtmStats_t usAtmStats0, usAtmStats1;
++ DEV_HOST_dsAtmStats_t dsAtmStats0,dsAtmStats1;
++ DEV_HOST_dspWrSuperFrameCntDef_t SuperFrameCnt;
++ DEV_HOST_msg_t atuc_msg, aturMsg;
++ DEV_HOST_eocVarDef_t eocVar;
++
++ dprintf(5, "dslhal_api_initStatistics\n");
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p,&rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ if(!rc)
++ {
++ /* shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, SIZE_OF_CRATES1_TABLE); */
++ ptidsl->AppData.bCRates2 = rateparms.cRates2;
++ /* shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
++ ptidsl->AppData.bRRates2 = rateparms.rRates2;
++ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
++ shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
++ shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4);
++
++ ptidsl->AppData.atucVendorId = dslhal_support_byteSwap32((unsigned int)rateparms.atucVendorId);
++ ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
++ ptidsl->AppData.atucRevisionNum = rateparms.atucGhsRevisionNum;
++ ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
++ ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
++
++ /* Get the UpStream Connection Rate */
++ /* Based on the Bit Pattern Get the Opt# */
++ if((rateparms.cRates2 & 0x0f) == 0x01)
++ optIdxU = 0;
++ else if((rateparms.cRates2 & 0x0f) == 0x02)
++ optIdxU = 1;
++ else if((rateparms.cRates2 & 0x0f) == 0x04)
++ optIdxU = 2;
++ else if((rateparms.cRates2 & 0x0f) == 0x08)
++ optIdxU = 3;
++ else
++ optIdxU = -1;
++ dprintf(5, "optIdxU=%d\n", optIdxU);
++ /* Obtain the US Rates using Opt# and CRates1 Table */
++ /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32 */
++ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
++ ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
++ else
++ ptidsl->AppData.USConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
++ ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate;
++
++ /* Get the DownStream Connection Rate */
++ /* Based on the Bit Pattern Get the Opt# */
++ if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01)
++ optIdxD = 0;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)
++ optIdxD = 1;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04)
++ optIdxD = 2;
++ else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)
++ optIdxD = 3;
++ else
++ optIdxD = -1;
++ /* Obtain the DS Rates using Opt# and CRates1 Table */
++ /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32 */
++ if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
++ ptidsl->AppData.DSConRate = (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
++ else
++ ptidsl->AppData.DSConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
++ dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
++ /* Determine which Path has Modem Trained with */
++ if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
++ ptidsl->AppData.TrainedPath = FAST_PATH;
++ else
++ ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
++
++ /* Set the mode in which the modem is trained */
++ ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
++ if(rateparms.trainMode == T1413_MODE)
++ ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
++ if(rateparms.trainMode == GDMT_MODE)
++ ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
++
++ if(ptidsl->AppData.TrainedPath == FAST_PATH)
++ ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
++ else
++ ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
++ ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
++ ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
++
++ if(ptidsl->AppData.TrainedPath == FAST_PATH)
++ ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
++ else
++ ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
++ ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
++ ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
++ }
++
++ /* get the Statistics itself */
++
++ dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ /* Populate the Error Structure Variables */
++
++ /* US Interleave Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ /* DS Interleave Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ /* US Fast Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++
++ /* DS Fast Path Error Statistics */
++
++ /* Change the endianness of the Pointer */
++ StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
++
++ rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
++
++ if (rc)
++ return;
++
++ if(ptidsl->AppData.bState > 2)
++ {
++ /* Get CRC Errors Stats for both US and DS */
++ ptidsl->AppData.dsICRC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
++ ptidsl->AppData.dsFCRC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
++ ptidsl->AppData.usICRC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
++ ptidsl->AppData.usFCRC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
++ /* Get FEC Errors Stats for both US and DS */
++ ptidsl->AppData.dsIFEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
++ ptidsl->AppData.dsFFEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
++ ptidsl->AppData.usIFEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
++ ptidsl->AppData.usFFEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
++ /* Get NCD Errors Stats for both US and DS */
++ ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
++ ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
++ ptidsl->AppData.usINCD_error = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
++ ptidsl->AppData.usFNCD_error = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
++ /* Get LCD Errors Stats for both US and DS */
++ ptidsl->AppData.dsILCD_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
++ ptidsl->AppData.dsFLCD_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
++ ptidsl->AppData.usILCD_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
++ ptidsl->AppData.usFLCD_errors = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
++ /*Get HEC Errors Stats for both US and DS */
++ ptidsl->AppData.dsIHEC_errors = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
++ ptidsl->AppData.dsFHEC_errors = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
++ ptidsl->AppData.usIHEC_errors = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
++ ptidsl->AppData.usFHEC_errors = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
++
++ /* Get LOS and SEF error Stats */
++ ptidsl->AppData.LOS_errors = dslhal_support_byteSwap32(StatisticsDef.losErrors);
++ ptidsl->AppData.SEF_errors = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
++ ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
++ ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);
++
++ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ /* Populate the US/DS ATM Stats Variables */
++
++ /* US ATM Statistics */
++
++ /* Change the endianness of the Pointer */
++ atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
++
++ if (rc)
++ return;
++
++ /* Change the endianness of the Pointer */
++ atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
++
++ if (rc)
++ return;
++
++
++ /* DS ATM Statistics */
++
++ /* Change the endianness of the Pointer */
++ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
++
++ if (rc)
++ return;
++
++ /* Change the endianness of the Pointer */
++ atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
++
++ if (rc)
++ return;
++ /* Get ATM Stats for both US and DS Channel 0*/
++ ptidsl->AppData.usAtm_count[0] = dslhal_support_byteSwap32(usAtmStats0.goodCount);
++ ptidsl->AppData.usIdle_count[0] = dslhal_support_byteSwap32(usAtmStats0.idleCount);
++#if SWTC
++ ptidsl->AppData.usPdu_count[0] = dslhal_support_byteSwap32(usAtmStats0.pduCount);
++#endif
++ ptidsl->AppData.dsGood_count[0] = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
++ ptidsl->AppData.dsIdle_count[0] = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
++#if SWTC
++ ptidsl->AppData.dsPdu_count[0] = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
++#endif
++ ptidsl->AppData.dsBadHec_count[0] = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
++ ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
++
++ /* Get ATM Stats for both US and DS Channel 1*/
++ ptidsl->AppData.usAtm_count[1] = dslhal_support_byteSwap32(usAtmStats1.goodCount);
++ ptidsl->AppData.usIdle_count[1] = dslhal_support_byteSwap32(usAtmStats1.idleCount);
++#if SWTC
++ ptidsl->AppData.usPdu_count[1] = dslhal_support_byteSwap32(usAtmStats1.pduCount);
++#endif
++ ptidsl->AppData.dsGood_count[1] = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
++ ptidsl->AppData.dsIdle_count[1] = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
++#if SWTC
++ ptidsl->AppData.dsPdu_count[1] = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
++#endif
++ ptidsl->AppData.dsBadHec_count[1] = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
++ ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
++
++
++ /* Determine the US and DS Superframe Count */
++
++ dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ ptidsl->AppData.usSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
++ ptidsl->AppData.dsSuperFrmCnt = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
++
++ /* Determine Frame Mode and Max Frame Mode */
++
++ dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ ptidsl->AppData.FrmMode = (unsigned int)atuc_msg.framingMode;
++ ptidsl->AppData.MaxFrmMode = (unsigned int)atuc_msg.maxFrameMode;
++
++ /* Determine Gross Gain */
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++ ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
++ /* Determine DS Line Attenuation & Margin */
++ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return;
++ }
++
++ ptidsl->AppData.dsLineAttn = (unsigned int)eocVar.lineAtten;
++ ptidsl->AppData.dsMargin = (unsigned int)eocVar.dsMargin;
++ }
++
++#if __HOST_FORINTERNALUSEONLY_R_H__
++ ptidsl->AppData.BER = dslhal_INTERNAL_computeAtmBitErrorRate(ptidsl);
++#endif
++ dprintf(5, "initstatistics done\n");
++ return;
++ }
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction enables/disables all the LOS alarms
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int set; //if set is TRUE: LOS Alarms are disabled else enabled
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ * NOTES: Currently not supported in any version other than MR4 Patch release..
++ *****************************************************************************************/
++unsigned int dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set)
++{
++ DEV_HOST_oamWrNegoParaDef_t NegoPara;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setTrainingMode()\n");
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(set)
++ {
++ NegoPara.disableLosAlarm = TRUE;
++ /* NegoPara.marginMonitorTrning = TRUE;
++ NegoPara.marginMonitorShwtme = TRUE;*/
++ }
++ else
++ {
++ NegoPara.disableLosAlarm = FALSE;
++ /* NegoPara.marginMonitorTrning = FALSE;
++ NegoPara.marginMonitorShwtme = FALSE;*/
++ }
++
++ rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ dprintf(5," dslhal_api_disableLosAlarm() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setMarginThreshold(tidsl_t *ptidsl,int threshold)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction does sets the Margin threshold
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * int threshold
++ *
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)
++{
++ DEV_HOST_oamWrNegoParaDef_t NegoPara;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++
++ dprintf(5," dslhal_ctrl_setThreshold()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++
++ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ NegoPara.marginThreshold = threshold;
++
++ rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++
++ if(rc)
++ return DSLHAL_ERROR_MARGIN_API_FAILURE;
++
++ dprintf(5," dslhal_api_setThreshold() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction does sets the Margin monitoring flag
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int trainflag
++ * unsigned int shwtflag
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl,unsigned int trainflag,unsigned int shwtflag)
++{
++ DEV_HOST_oamWrNegoParaDef_t NegoPara;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++
++ dprintf(5," dslhal_ctrl_setMonitorFlags()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++
++ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ if (trainflag)
++ {
++ NegoPara.marginMonitorTrning = TRUE;
++ }
++ else
++ {
++ NegoPara.marginMonitorTrning = FALSE;
++ }
++ if (shwtflag)
++ {
++ NegoPara.marginMonitorShwtme = TRUE;
++ }
++ else
++ {
++ NegoPara.marginMonitorShwtme = FALSE;
++ }
++
++ rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if(rc)
++ return DSLHAL_ERROR_MARGIN_API_FAILURE;
++ dprintf(5," dslhal_api_setMonitorFlags() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNum)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the eoc Serial Number
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *SerialNum : Input eoc Serial Number
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)
++{
++ DEV_HOST_eocVarDef_t eocVar;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setEocSerialNumber()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
++ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ shim_osMoveMemory(eocVar.serialNumber,SerialNumber,32);
++
++ rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
++ if(rc)
++ return DSLHAL_ERROR_EOCREG_API_FAILURE;
++ dprintf(5," dslhal_api_setEocSerialNumber() Done\n");
++
++ return DSLHAL_ERROR_NO_ERRORS;
++
++}
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the eoc Vendor ID
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *VendorID : Input eoc Vendor ID
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
++{
++ DEV_HOST_oamWrNegoParaDef_t NegoPara;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setEocVendorId()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++
++
++ rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ shim_osMoveMemory(NegoPara.gdmtVendorId,VendorID,8);
++ rc= dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if(rc)
++ return DSLHAL_ERROR_EOCREG_API_FAILURE;
++
++ dprintf(5," dslhal_api_setEocVendorId() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the eoc Revision Number
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *RevNum : Input eoc Revision Number
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNumber)
++{
++
++ DEV_HOST_eocVarDef_t eocVar;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ /*add for UR2 test */
++ UINT8 selfTestResults[2];
++ memset(selfTestResults,0x00,sizeof(selfTestResults));
++ /* add for UR2 test */
++ dprintf(5," dslhal_api_setEocRevisionNumber()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
++ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ shim_osMoveMemory(eocVar.revNumber,RevNumber,4);
++ /* add for UR2 test */
++ shim_osMoveMemory(eocVar.dummy,selfTestResults,2);
++ /* add for UR2 test */
++ rc=dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
++ if(rc)
++ return DSLHAL_ERROR_EOCREG_API_FAILURE;
++ dprintf(5," dslhal_api_setEocRevisionNumber Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the eoc ATUR Config Register
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *ATURConfig : Input eoc ATUR Config Register
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
++{
++
++ DEV_HOST_eocVarDef_t eocVar;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setAturConfig()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
++ &eocVar, sizeof(DEV_HOST_eocVarDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ shim_osMoveMemory(eocVar.aturConfig,ATURConfig,30);
++ rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t));
++ if(rc)
++ return DSLHAL_ERROR_EOCREG_API_FAILURE;
++ dprintf(5," dslhal_api_setAturConfig() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int flag; //if flag = TRUE set rateadapt flag else reset it
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
++{
++ DEV_HOST_msg_t aturMsg;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setRateAdaptFlag()\n");
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
++ &aturMsg, sizeof(DEV_HOST_msg_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ if(flag)
++ aturMsg.rateAdapt = TRUE;
++ else
++ aturMsg.rateAdapt = FALSE;
++
++ rc= dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ dprintf(5," dslhal_api_setRateAdaptFlag() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int flag; // if flag = TRUE, set trellis flag else reset
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
++{
++
++ DEV_HOST_msg_t aturMsg;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_oamWrNegoParaDef_t negoPara;
++ int rc;
++ dprintf(5," dslhal_api_setTrellisFlag()\n");
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++ rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++ rc += dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&negoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ if(flag)
++ {
++ aturMsg.trellis = TRUE;
++ negoPara.rMsgs1[2] |= 0x02;
++ }
++ else
++ {
++ aturMsg.trellis = FALSE;
++ negoPara.rMsgs1[2] &= 0xFD;
++ }
++ rc=0;
++ rc+=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
++ rc+= dslhal_support_blockWrite(&negoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++
++ dprintf(5," dslhal_api_setTrellisFlag() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int maxbits : should be a value between 0-15
++*
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
++{
++
++ DEV_HOST_msg_t aturMsg;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++
++ dprintf(5," dslhal_api_setMaxBitsPerCarrier()\n");
++ if(maxbits>15)
++ {
++ dprintf(3,"Maximum Number of Bits per carrier cannot exceed 15!\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
++ &aturMsg, sizeof(DEV_HOST_msg_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ aturMsg.maxBits = maxbits;
++
++ rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ dprintf(5," dslhal_api_setMaxBitsPerCarrier() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
++* size 64-512
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
++{
++ DEV_HOST_msg_t aturMsg;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ int rc;
++ dprintf(5," dslhal_api_setMaxInterleaverDepth()\n");
++ if(maxdepth>3)
++ {
++ dprintf(3,"Invalid Value for maximum interleave depth (must be <3)\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
++ &aturMsg, sizeof(DEV_HOST_msg_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ aturMsg.maxIntlvDepth = maxdepth;
++
++ rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ dprintf(5," dslhal_api_setMaxInterleaverDepth() Done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_acknowledgeInterrupt(tidsl_t * ptidsl)
++{
++ unsigned int interruptSources=0;
++ /* Clear out the DSLSS Interrupt Registers to acknowledge Interrupt */
++ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_MAILBOX_INTERRUPTS)
++ {
++ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_MAILBOX_INTERRUPTS;
++ dprintf(5,"Mailbox Interrupt \n");
++ }
++ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_BITFIELD_INTERRUPTS)
++ {
++ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_BITFIELD_INTERRUPTS;
++ dprintf(5,"Bitfield Interrupt \n");
++ }
++ if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_HEARTBEAT_INTERRUPTS)
++ {
++ DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_HEARTBEAT_INTERRUPTS;
++ dprintf(5,"HeartBeat Interrupt \n");
++ }
++ interruptSources = dslhal_support_parseInterruptSource(ptidsl);
++ if(interruptSources < 0)
++ return DSLHAL_ERROR_INTERRUPT_FAILURE;
++ else
++ return interruptSources;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_disableDspHybridSelect(tidsl_t * ptidsl,unsigned int disable)
++{
++ int rc;
++ DEV_HOST_phyPerf_t phyPerf;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
++ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(disable==1)
++ {
++ phyPerf.disableDspHybridSelect_f = TRUE;
++ // hybrid_selected = 888;
++ }
++ else
++ {
++ phyPerf.disableDspHybridSelect_f = FALSE;
++ // hybrid_selected = 888;
++ }
++ rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t));
++ if(rc)
++ return DSLHAL_ERROR_HYBRID_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_selectHybrid()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_selectHybrid(tidsl_t * ptidsl,unsigned int hybridNum)
++{
++ int rc;
++ DEV_HOST_phyPerf_t phyPerf;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(hybridNum<1||hybridNum>4)
++ {
++ dprintf(3,"Invalid Value for Hybrid Number \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
++ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ phyPerf.hostSelectHybridNum = hybridNum;
++ rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t));
++ if(rc)
++ return DSLHAL_ERROR_HYBRID_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_reportHybridMetrics()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_reportHybridMetrics(tidsl_t * ptidsl,int *metric)
++{
++ int rc,i;
++ DEV_HOST_phyPerf_t phyPerf;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(hybrid_selected>5)
++ {
++ dprintf(4,"Hybrid Metrics Not Yet Available \n");
++ }
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return (0-DSLHAL_ERROR_INVALID_PARAM);
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return (0-DSLHAL_ERROR_BLOCK_READ);
++ }
++
++ dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
++ &phyPerf, sizeof(DEV_HOST_phyPerf_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return (0-DSLHAL_ERROR_BLOCK_READ);
++ }
++ rc = sizeof(phyPerf.hybridCost);
++ for(i=0;i<(rc/4);i++)
++ {
++ metric[i] = dslhal_support_byteSwap32(phyPerf.hybridCost[i]);
++ }
++ return hybrid_selected;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction selects inner/outer pair on RJ11.
++ *
++ * INPUT: PITIDSLHW_T *ptidsl , unsigned int pairSelect
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
++{
++ int rc;
++
++ dprintf(5, "dslhal_api_sendQuiet\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_RJ11SELECT, (unsigned int)pairSelect, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_api_sendQuiet failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction resets the failed state log stored
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
++{
++
++ int rc;
++ dprintf(5, "dslhal_api_resetTrainFailureLog \n");
++ for(rc=0;rc<ptidsl->AppData.trainFails;rc++)
++ {
++ ptidsl->AppData.trainFailStates[rc]=0;
++ }
++ ptidsl->AppData.trainFails = 0;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureLed()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureLed(tidsl_t * ptidsl,unsigned int idLed, unsigned int onOff)
++{
++ int rc;
++ DEV_HOST_modemEnvPublic_t modemEnv;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(idLed>2 || onOff>2)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
++ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(idLed==ID_DSL_LINK_LED)
++ {
++ modemEnv.overrideDslLinkLed_f = TRUE;
++ if(onOff!=2)
++ modemEnv.dslLinkLedState_f = onOff;
++ }
++ if(idLed==ID_DSL_ACT_LED)
++ {
++ modemEnv.overrideDslLinkLed_f = TRUE;
++ if(onOff!=2)
++ modemEnv.dslLinkLedState_f = onOff;
++ }
++ if(idLed==ID_RESTORE_DEFAULT_LED)
++ {
++ modemEnv.overrideDslLinkLed_f = FALSE;
++ modemEnv.overrideDslActLed_f = FALSE;
++ }
++ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
++ if(rc)
++ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureExternBert()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureExternBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
++{
++ int rc;
++ DEV_HOST_modemEnvPublic_t modemEnv;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(configParm>1 || parmVal>1)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
++ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(configParm==0)
++ {
++ modemEnv.externalBert = parmVal;
++ }
++ if(configParm==1)
++ {
++ modemEnv.usBertPattern = parmVal;
++ }
++ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
++ if(rc)
++ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureAtmBert()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureAtmBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
++{
++ int rc;
++ DEV_HOST_atmDsBert_t atmDsBert;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(configParm>1 || parmVal>1)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.atmDsBert_p = (DEV_HOST_atmDsBert_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmDsBert_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmDsBert_p,
++ &atmDsBert, sizeof(DEV_HOST_atmDsBert_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(configParm==0)
++ {
++ atmDsBert.atmBertFlag = parmVal;
++ rc=dslhal_support_blockWrite(&atmDsBert,dspOamSharedInterface.atmDsBert_p,sizeof(DEV_HOST_atmDsBert_t));
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ }
++ if(configParm==1)
++ {
++ ptidsl->AppData.atmBertBitCountLow = atmDsBert.bitCountLow;
++ ptidsl->AppData.atmBertBitCountHigh = atmDsBert.bitCountHigh;
++ ptidsl->AppData.atmBertBitErrorCountLow = atmDsBert.bitErrorCountLow;
++ ptidsl->AppData.atmBertBitErrorCountHigh = atmDsBert.bitErrorCountHigh;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureDgaspLpr()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Configures dying gasp LPR signal
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureDgaspLpr(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
++{
++ int rc;
++ DEV_HOST_modemEnvPublic_t modemEnv;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ if(configParm>1 || parmVal>1)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ if(!ptidsl)
++ {
++ dprintf(3, "Error: PTIDSL pointer invalid\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
++ &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(configParm==0)
++ {
++ modemEnv.dGaspLprIndicator_f = parmVal;
++ }
++ if(configParm==1)
++ {
++ modemEnv.overrideDspLprGasp_f = parmVal;
++ }
++ rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t));
++ if(rc)
++ return DSLHAL_ERROR_MODEMENV_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_genericDspRead()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads from a Generic Location in the DSP Host Interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_genericDspRead(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2,
++ unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
++{
++ int rc=0;
++ unsigned int hostIfLoc,structLoc,elementLoc;
++ hostIfLoc = (unsigned int)ptidsl->pmainAddr;
++ if(numBytes<=0 || !localBuffer || !ptidsl)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ rc += dslhal_support_blockRead((PVOID)(hostIfLoc+sizeof(int)*offset1), &structLoc,sizeof(int));
++ structLoc = dslhal_support_byteSwap32(structLoc);
++ rc += dslhal_support_blockRead((PVOID)(structLoc+sizeof(int)*offset2), &elementLoc,sizeof(int));
++ elementLoc = dslhal_support_byteSwap32(elementLoc);
++ dprintf(3,"Host IF Location: 0x%x Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
++ rc += dslhal_support_blockRead((PVOID)(elementLoc+(offset3*4)), localBuffer,numBytes);
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_genericDspWrite()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Writes to a Generic Location in the DSP Host Interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_genericDspWrite(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2,
++ unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
++{
++
++ int rc=0;
++ unsigned int hostIfLoc,structLoc,elementLoc;
++ hostIfLoc = (unsigned int)ptidsl->pmainAddr;
++ if(numBytes<=0 || !localBuffer || !ptidsl)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ rc += dslhal_support_blockRead((PVOID)(hostIfLoc+(offset1*4)), &structLoc,4);
++ structLoc = dslhal_support_byteSwap32(structLoc);
++ rc += dslhal_support_blockRead((PVOID)(structLoc+(offset2*4)), &elementLoc,4);
++ elementLoc = dslhal_support_byteSwap32(elementLoc);
++ dprintf(3,"Host IF Location: 0x%x Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
++ rc += dslhal_support_blockWrite(localBuffer,(PVOID)(elementLoc+(offset3*4)),numBytes);
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_dspInterfaceRead()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads from a Generic Location in the DSP Host Interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_dspInterfaceRead(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets,
++ unsigned int *offsets, unsigned char *localBuffer, unsigned int numBytes)
++{
++ int rc=0, off=0;
++ unsigned int prevAddr,currAddr;
++ prevAddr = baseAddr;
++ if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ for(off=0;off<numOffsets-1;off++)
++ {
++ rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
++ currAddr = dslhal_support_byteSwap32(currAddr);
++ prevAddr = currAddr;
++ dprintf(5,"Curr Addr = 0x%x Current Level: %d \n",currAddr,off);
++ }
++ currAddr = currAddr + offsets[numOffsets-1]*4;
++ rc += dslhal_support_blockRead((PVOID)(currAddr),localBuffer,numBytes);
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Writes to a Generic Location in the DSP Host Interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_dspInterfaceWrite(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets,
++ unsigned int *offsets,unsigned char *localBuffer, unsigned int numBytes)
++{
++
++ int rc=0, off=0;
++ unsigned int prevAddr,currAddr;
++ prevAddr = baseAddr;
++ if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
++ {
++ dprintf(3,"Invalid input parameter \n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++ for(off=0;off<numOffsets-1;off++)
++ {
++ rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
++ currAddr = dslhal_support_byteSwap32(currAddr);
++ prevAddr = currAddr;
++ dprintf(5,"Curr Addr = 0x%x Current Level: %d \n",currAddr,off);
++ }
++ currAddr = currAddr + offsets[numOffsets-1]*4;
++ rc += dslhal_support_blockWrite(localBuffer,(PVOID)(currAddr),numBytes);
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the passed mailbox command to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int cmd
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++/* Function is commented out for now since, its not tested */
++ /*unsigned int dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
++{
++ int rc;
++
++ dprintf(5, "dslhal_api_sendMailboxCommand\n");
++ rc = dslhal_support_writeHostMailbox(ptidsl, cmd, 0, 0, 0);
++ if(rc)
++ {
++ dprintf(1,"dslhal_api_sendMailboxCommand failed\n");
++ return DSLHAL_ERROR_CTRL_API_FAILURE;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++} */
++
++
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.h linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h 2005-07-10 08:02:01.438112272 +0200
+@@ -0,0 +1,1721 @@
++#ifndef __DSL_HAL_API_H__
++#define __DSL_HAL_API_H__ 1
++/*******************************************************************************
++* FILE PURPOSE: DSL HAL to Application Interface for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_application_interface.h
++*
++* DESCRIPTION:
++* DSL-Application Interface Structures
++*
++*
++* By: Ramakrishnan Parasuraman
++*
++* (C) Copyright 2003, Texas Instruments, Inc.
++* History
++* Data Version By Notes
++* 06Feb03 0.00 RamP Initial Version Written
++* 07Apr03 0.01 RamP Commented out typedefs
++* 09Apr03 0.02 RamP Added deviceContext and extended
++* dspVer to include bugfixes
++* 14Apr03 0.03 RamP Added stateTransition to structure
++* 16Apr03 0.04 RamP Removed typedefs; changed dspVer
++* 22Apr03 0.05 RamP Moved acknowledgeInterrupt from
++* (alpha) support module into this
++* 24Apr03 0.06 RamP Moved the RSTATE enum from register
++*
++* 28Apr03 0.07 RamP Added additional parameter to the
++* (alpha +) handleInterrupt function for intrSrc
++* 14May03 0.08 RamP Added hybrid switching APIs
++* (alpha ++) Added statistics fields in AppData
++* Added netService identifier
++* 20May03 0.09 RamP Added Inner/Outer pair API support.
++* Added dying gasp message.
++* 29May03 0.10 RamP Added coProfile structure
++* 04Jun03 0.11 RamP Added margin per tone statistics,
++* Added timing counters, added train
++* failure functions,added config flags
++* 06Jun03 0.12 RamP Added LED, STM Bert, dGasp LPR
++* config API functions
++* 09Jun03 0.13 RamP Added ATM Bert function, CO stats
++* Moved stateTransition to ITIDSLHW
++* (Beta) Moved configFlag to ITIDSLHW,
++* Cleaned up fifoInfo structure
++* Added US/DS R/S FEC parameters
++* 21Aug03 0.14 RamP Added g.hs message buffer, us/ds
++* bits n gains table, negoMsgs struct
++* (act) bitswap stucts/indices, trainstate,
++* Added functions for advanced config
++* Added gross gain and line length
++* 29Sep03 0.15 RamP Added tokens for advanced config
++* module api functions
++* 12Oct03 0.16 RamP Added adsl2Msgs structure with worst
++* case size for variable length msgs
++* Added API function prototypes
++* 21Oct03 0.17 RamP Added typedef for current modem
++* user settings
++* 28Oct03 0.18 RamP Added function to config blackout
++* bitmap in the RMSGPCB message
++* 20Nov03 0.19 RamP Added functions for generic and
++* host interface read - write
++* 24Nov03 0.20 RamP Added enum for detailed state track
++* Added element for state bit fields
++* Addded rState for encoded main state
++* Added blackout valid flag
++* 26Dec03 0.21 RamP Added defines for oamFeature masks
++* 30Dec03 0.22 RamP Increased sizes for cMsgPcb,RMsgPcb
++* to incorporate DELT mode messages
++* 30Dec03 0.23 RamP Added generic mailbox command fxn
++*******************************************************************************/
++
++#ifdef INTERNAL_BUILD
++#include <dsl_hal_api_pvt.h>
++#endif
++
++#define NUM_PAGES 4
++#define OAMFEATURE_AUTORETRAIN_MASK 0x00000001
++#define OAMFEATURE_TC_SYNC_DETECT_MASK 0x00000002
++#define OAMFEATURE_EOCAOC_INTERRUPT_MASK 0x00000004
++#define OAMFEATURE_CONS_DISP_DISABLE_MASK 0x00000008
++#define OAMFEATURE_GHSMSG_INTERRUPT_MASK 0x00000010
++
++typedef struct tagTIOIDINFO
++{
++ unsigned int bState; /* addr->bDSPATURState */
++ unsigned int USConRate; /* US Conection Rates */
++ unsigned int DSConRate; /* DS Connection Rates */
++ unsigned int USPayload; /* ennic_tx_pullup*/
++ unsigned int DSPayload; /* ennic_indicate_receive_packet*/
++ unsigned int FrmMode; /* addr->atur_msg.framing_mode*/
++ unsigned int MaxFrmMode;
++ unsigned int TrainedPath; /* Status of the Modem in which trained (Fast or Interleaved Path) */
++ unsigned int TrainedMode; /* Status of the mode in which the modem is trained (G.dmt, T1.413, etc) */
++
++ /* Superframe Count */
++ unsigned int usSuperFrmCnt; /* Num of US Superframes */
++ unsigned int dsSuperFrmCnt; /* Num of DS Superframes */
++
++ /* LOS & SEF Stats */
++ unsigned int LOS_errors; /* Num of ADSL frames where loss-of-sync */
++ unsigned int SEF_errors; /* Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames */
++ unsigned int coLosErrors; /* CO LOS Defects */
++ unsigned int coRdiErrors; /* CO RDI defects */
++ /* CRC Stats */
++ unsigned int usICRC_errors; /* Num of Upstream CRC errored ADSL frames on Interleaved Path */
++ unsigned int usFCRC_errors; /* Num of Upstream CRC errored ADSL frames on Fast Path */
++ unsigned int dsICRC_errors; /* Num of Downstream CRC errored ADSL frames on Interleaved Path */
++ unsigned int dsFCRC_errors; /* Num of Downstream CRC errored ADSL frames on Fast Path */
++
++ /* FEC Stats */
++ unsigned int usIFEC_errors; /* Num of Upstream FEC errored (corrected) ADSL frames on Interleaved Path */
++ unsigned int usFFEC_errors; /* Num of Upstream FEC errored (corrected) ADSL frames on Fast Path */
++ unsigned int dsIFEC_errors; /* Num of Downstream FEC errored (corrected) ADSL frames on Interleaved Path */
++ unsigned int dsFFEC_errors; /* Num of Downstream FEC errored (corrected) ADSL frames on Fast Path */
++
++ /* NCD Stats */
++ unsigned int usINCD_error; /* UpStream No Cell Delineation on Interleaved Path */
++ unsigned int usFNCD_error; /* UpStream No Cell Delineation on Fast Path */
++ unsigned int dsINCD_error; /* Downstream No Cell Delineation on Interleaved Path */
++ unsigned int dsFNCD_error; /* Downstream No Cell Delineation on Fast Path */
++
++ /* LCD Stats */
++ unsigned int usILCD_errors; /* UpStream Loss of Cell Delineation (within the same connection) on Interleaved Path */
++ unsigned int usFLCD_errors; /* UpStream Loss of Cell Delineation (within the same connection) on Fast Path */
++ unsigned int dsILCD_errors; /* Downstream Loss of Cell Delineation (within the same connection) on Interleaved Path */
++ unsigned int dsFLCD_errors; /* Downstream Loss of Cell Delineation (within the same connection) on Fast Path */
++
++ /* HEC Stats */
++ unsigned int usIHEC_errors; /* Num of Upstream HEC errored ADSL frames on Interleaved Path */
++ unsigned int usFHEC_errors; /* Num of Upstream HEC errored ADSL frames on Fast Path */
++ unsigned int dsIHEC_errors; /* Num of Downstream HEC errored ADSL frames on Interleaved Path */
++ unsigned int dsFHEC_errors; /* Num of Downstream HEC errored ADSL frames on Fast Path */
++
++ /* Upstream ATM Stats */
++ unsigned int usAtm_count[2]; /* Upstream Good Cell Count */
++ unsigned int usIdle_count[2]; /* Upstream Idle Cell Count */
++ unsigned int usPdu_count[2]; /* UpStream PDU Count */
++
++ /* Downstream ATM Stats */
++ unsigned int dsGood_count[2]; /* Downstream Good Cell Count */
++ unsigned int dsIdle_count[2]; /* Downstream Idle Cell Count */
++ unsigned int dsBadHec_count[2]; /* Downstream Bad Hec Cell Count */
++ unsigned int dsOVFDrop_count[2]; /* Downstream Overflow Dropped Cell Count */
++ unsigned int dsPdu_count[2]; /* Downstream PDU Count */
++ /* (only looks for end of pdu on good atm cells received, */
++ /* not on Bad_Hec or Overflow cell) */
++
++ unsigned int dsLineAttn; /* DS Line Attenuation */
++ unsigned int dsMargin; /* Measured DS MArgin */
++
++ unsigned int usLineAttn;
++ unsigned int usMargin;
++
++ unsigned char bCMsgs1[6];
++ unsigned char bRMsgs1[6];
++ unsigned char bCRates2;
++ unsigned char bRRates2;
++ unsigned char bRRates1[4][11];
++ unsigned char bCMsgs2[4];
++ unsigned char bCRates1[4][30];
++ unsigned char bRMsgs2[4];
++
++ unsigned int USPeakCellRate;
++
++ unsigned int dsl_status;
++ unsigned int dsl_modulation;
++ unsigned char dsl_ghsRxBuf[10][64];
++ unsigned char dsl_GHS_msg_type[2];
++
++ int TxVCs[12];
++ int RxVCs[12];
++
++ unsigned int vci_vpi_val;
++
++ unsigned char BitAllocTblDstrm[256];
++ unsigned char BitAllocTblUstrm[32];
++ signed char marginTblDstrm[256];
++ unsigned char rBng[512];
++ unsigned char cBng[126];
++ int usTxPower;
++ int dsTxPower;
++ short rxSnrPerBin0[256];
++ short rxSnrPerBin1[256];
++ short rxSnrPerBin2[256];
++
++ unsigned int StdMode;
++ unsigned int atucVendorId;
++ unsigned char currentHybridNum;
++ unsigned char atucRevisionNum;
++ unsigned int trainFails;
++ unsigned int trainFailStates[30];
++ unsigned int idleTick;
++ unsigned int initTick;
++ unsigned int showtimeTick;
++ unsigned char dsFastParityBytesPerSymbol;
++ unsigned char dsIntlvParityBytesPerSymbol;
++ unsigned char dsSymbolsPerCodeWord;
++ unsigned int dsInterleaverDepth;
++ unsigned char usFastParityBytesPerSymbol;
++ unsigned char usIntlvParityBytesPerSymbol;
++ unsigned char usSymbolsPerCodeWord;
++ unsigned int usInterleaverDepth;
++ unsigned int atmBertBitCountLow;
++ unsigned int atmBertBitCountHigh;
++ unsigned int atmBertBitErrorCountLow;
++ unsigned int atmBertBitErrorCountHigh;
++ unsigned int lineLength;
++ unsigned int grossGain;
++ int rxNoisePower0[256];
++ int rxNoisePower1[256];
++}TIOIDINFO,*PTIOIDINFO;
++
++typedef struct{
++ unsigned char bCMsgs1[6];
++ unsigned char bCRates2;
++ unsigned char bRRates2;
++ unsigned char bRRates1[4][11];
++ unsigned char bCMsgs2[4];
++ unsigned char bCRates1[4][30];
++ unsigned char bCRatesRA[4][30];
++ unsigned char bRMsgs2[4];
++ unsigned char bRRatesRA[4];
++ unsigned char bRMsgsRA[12];
++ unsigned char bCMsgsRA[6];
++}negoMsgs;
++
++typedef struct{
++ unsigned char cMsgFmt[2];
++ unsigned char rMsgFmt[2];
++ unsigned char cMsgPcb[12];
++ unsigned char rMsgPcb[70];
++ unsigned char dummy1[2];
++ unsigned char cMsg1[40];
++ unsigned char rMsg1[4];
++ unsigned char cMsg2[8];
++ unsigned char rMsg2[64];
++ unsigned char cParams[264];
++ unsigned char rParams[2088];
++ unsigned short cMsgPcbLen;
++ unsigned short rMsgPcbLen;
++ unsigned short cMsg1Len;
++ unsigned short rMsg1Len;
++ unsigned short cMsg2Len;
++ unsigned short rMsg2Len;
++ unsigned short cParamsLen;
++ unsigned short rParamsLen;
++}adsl2Msgs;
++
++typedef struct{
++ unsigned char rMsg1Ld[16];
++ unsigned char rMsg2Ld[260];
++ unsigned char rMsg3Ld[260];
++ unsigned char rMsg4Ld[260];
++ unsigned char rMsg5Ld[260];
++ unsigned char rMsg6Ld[260];
++ unsigned char rMsg7Ld[260];
++ unsigned char rMsg8Ld[260];
++ unsigned char rMsg9Ld[260];
++ unsigned char cMsg1Ld[16];
++ unsigned char cMsg2Ld[260];
++ unsigned char cMsg3Ld[132];
++ unsigned char cMsg4Ld[68];
++ unsigned char cMsg5Ld[68];
++ unsigned short rMsg1LdLen;
++ unsigned short rMsgxLdLen;
++ unsigned short cMsg1LdLen;
++ unsigned short cMsg2LdLen;
++ unsigned short cMsg3LdLen;
++ unsigned short cMsg4LdLen;
++ unsigned short cMsg5LdLen;
++ unsigned short dummy8;
++}adsl2DeltMsgs;
++
++typedef struct{
++ unsigned char trellisFlag;
++ unsigned char rateAdaptFlag;
++ unsigned char marginMonitorTraining;
++ unsigned char marginMonitorShowtime;
++ signed char marginThreshold;
++ unsigned char disableLosFlag;
++ unsigned char aturConfig[30];
++ unsigned char eocVendorId[8];
++ unsigned char eocSerialNumber[32];
++ unsigned char eocRevisionNumber[4];
++}currentPhySettings;
++
++
++typedef struct
++{
++ unsigned int PmemStartWtAddr; /* source address in host memory */
++ unsigned int OverlayXferCount; /* number of 32bit words to be transfered */
++ unsigned int BinAddr; /* destination address in dsp's pmem */
++ unsigned int overlayHostAddr;
++ unsigned int olayPageCrc32;
++ unsigned int SecOffset;
++} OlayDP_Def;
++
++typedef struct
++{
++ unsigned int timeStamp; /* TimeStp revision */
++ unsigned char major; /* Major revision */
++ unsigned char minor; /* Minor revision */
++ unsigned char bugFix; /* BugFix revision */
++ unsigned char buildNum; /* BuildNum revision */
++ unsigned char reserved; /* for future use */
++}dspVer;
++
++typedef struct{
++ unsigned char major;
++ unsigned char minor;
++ unsigned char bugfix;
++ unsigned char buildNum;
++ unsigned int timeStamp;
++}dslVer;
++
++typedef struct{
++ unsigned char bitSwapCommand[6];
++ unsigned char bitSwapBinNum[6];
++ unsigned char bitSwapSFrmCnt;
++}dslBitSwapDef;
++
++typedef struct{
++ unsigned int aturState;
++ unsigned int subStateIndex;
++ unsigned int timeStamp;
++}trainStateInfo;
++
++typedef struct{
++ unsigned char ctrlBits;
++ unsigned char infoBits;
++}eocMessageDef;
++
++enum
++{
++ RSTATE_TEST,
++ RSTATE_IDLE,
++ RSTATE_INIT,
++ RSTATE_HS,
++ RSTATE_RTDL,
++ RSTATE_SHOWTIME,
++};
++
++typedef enum
++{
++ ATU_RZERO1 = 100,
++ ATU_RTEST = 101,
++ ATU_RIDLE = 102,
++ ATU_RINIT = 103,
++ ATU_RRESET = 104,
++ GDMT_NSFLR = 105,
++ GDMT_TONE = 106,
++ GDMT_SILENT = 107,
++ GDMT_NEGO = 108,
++ GDMT_FAIL = 109,
++ GDMT_ACKX = 110,
++ GDMT_QUIET2 = 111,
++ ATU_RZERO2 = 200,
++ T1413_NSFLR = 201,
++ T1413_ACTREQ = 202,
++ T1413_ACTMON = 203,
++ T1413_FAIL = 204,
++ T1413_ACKX = 205,
++ T1413_QUIET2 = 206,
++ ATU_RQUIET2 = 207,
++ ATU_RREVERB1 = 208,
++ ATU_RQUIET3 = 209,
++ ATU_RECT = 210,
++ ATU_RREVERB2 = 211,
++ ATU_RSEGUE1 = 212,
++ ATU_RREVERB3 = 213,
++ ATU_RSEGUE2 = 214,
++ ATU_RRATES1 = 215,
++ ATU_RMSGS1 = 216,
++ ATU_RMEDLEY = 217,
++ ATU_RREVERB4 = 218,
++ ATU_RSEGUE3 = 219,
++ ATU_RMSGSRA = 220,
++ ATU_RRATESRA = 221,
++ ATU_RREVERBRA = 222,
++ ATU_RSEGUERA = 223,
++ ATU_RMSGS2 = 224,
++ ATU_RRATES2 = 225,
++ ATU_RREVERB5 = 226,
++ ATU_RSEGUE4 = 227,
++ ATU_RBNG = 228,
++ ATU_RREVERB6 = 229,
++ ATU_RSHOWTIME = 230,
++ ATU_RZERO3 = 300,
++ ADSL2_QUIET1 = 301,
++ ADSL2_COMB1 = 302,
++ ADSL2_QUIET2 = 303,
++ ADSL2_COMB2 = 304,
++ ADSL2_ICOMB1 = 305,
++ ADSL2_LINEPROBE = 306,
++ ADSL2_QUIET3 = 307,
++ ADSL2_COMB3 = 308,
++ ADSL2_ICOMB2 = 309,
++ ADSL2_RMSGFMT = 310,
++ ADSL2_RMSGPCB = 311,
++ ADSL2_REVERB1 = 312,
++ ADSL2_QUIET4 = 313,
++ ADSL2_REVERB2 = 314,
++ ADSL2_QUIET5 = 315,
++ ADSL2_REVERB3 = 316,
++ ADSL2_ECT = 317,
++ ADSL2_REVERB4 = 318,
++ ADSL2_SEGUE1 = 319,
++ ADSL2_REVERB5 = 320,
++ ADSL2_SEGUE2 = 321,
++ ADSL2_RMSG1 = 322,
++ ADSL2_MEDLEY = 323,
++ ADSL2_EXCHANGE = 324,
++ ADSL2_RMSG2 = 325,
++ ADSL2_REVERB6 = 326,
++ ADSL2_SEGUE3 = 327,
++ ADSL2_RPARAMS = 328,
++ ADSL2_REVERB7 = 329,
++ ADSL2_SEGUE4 = 330,
++ ATU_RZERO4 = 400,
++ DELT_SEGUE1 = 401,
++ DELT_REVERB5 = 402,
++ DELT_SEGUE2 = 403,
++ DELT_EXCHANGE = 404,
++ DELT_SEGUELD = 405,
++ DELT_RMSGLD = 406,
++ DELT_QUIET1LD = 407,
++ DELT_QUIET2LD = 408,
++ DELT_RACK1 = 409,
++ DELT_RNACK1 = 410,
++ DELT_QUIETLAST = 411
++} modemStates_t;
++
++enum
++{
++ DSLTRAIN_NO_MODE,
++ DSLTRAIN_MULTI_MODE,
++ DSLTRAIN_T1413_MODE,
++ DSLTRAIN_GDMT_MODE,
++ DSLTRAIN_GLITE_MODE
++};
++
++enum
++{
++ ID_RESTORE_DEFAULT_LED,
++ ID_DSL_LINK_LED,
++ ID_DSL_ACT_LED
++};
++
++typedef struct _ITIDSLHW
++{
++ /* struct _TIDSL_IHwVtbl * pVtbl; */
++ unsigned char* fwimage;
++ void* pmainAddr;
++ void* pOsContext;
++ unsigned int ReferenceCount;
++ unsigned int netService;
++
++ int InitFlag;
++
++ int imagesize;
++
++ unsigned int lConnected;
++ unsigned int bStatisticsInitialized;
++ unsigned int rState;
++ unsigned int bShutdown;
++ unsigned int blackOutValid_f;
++ unsigned char blackOutBits[64];
++ unsigned int bAutoRetrain;
++ volatile unsigned int bOverlayPageLoaded;
++ unsigned int stateTransition;
++ unsigned int configFlag;
++ unsigned int dsBitSwapInx;
++ unsigned int usBitSwapInx;
++ unsigned int trainStateInx;
++ unsigned int usEocMsgInx;
++ unsigned int dsEocMsgInx;
++ unsigned int reasonForDrop;
++ TIOIDINFO AppData;
++ dspVer dspVer;
++
++ OlayDP_Def olayDpPage[NUM_PAGES];
++ OlayDP_Def coProfiles;
++ OlayDP_Def constDisplay;
++ dslBitSwapDef dsBitSwap[30];
++ dslBitSwapDef usBitSwap[30];
++ trainStateInfo trainHistory[120];
++ eocMessageDef usEocMsgBuf[30];
++ eocMessageDef dsEocMsgBuf[30];
++ adsl2Msgs adsl2TrainingMessages;
++ adsl2DeltMsgs adsl2DiagnosticMessages;
++ unsigned int modemStateBitField[4];
++#ifdef INTERNAL_BUILD
++ internalParameters internalVars;
++#endif
++} ITIDSLHW_T, *PITIDSLHW_T, tidsl_t;
++
++
++/**********************************************************************************
++* API proto type defines
++**********************************************************************************/
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_dslStartup
++*
++*******************************************************************************************
++* DESCRIPTION: Entry point to initialize and load ax5 daughter board
++*
++* INPUT: PITIDSLHW_T *ppIHw
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++* Notes: external function osAllocateMemory(), osZeroMemory(), osLoadFWImage() are required
++*****************************************************************************************/
++int dslhal_api_dslStartup
++(
++ PITIDSLHW_T *ppIHw
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_gatherStatistics
++*
++*********************************************************************************************
++* DESCRIPTION: Read statistical infromation from ax5 modem daugter card.
++* Input: tidsl_t *ptidsl
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++
++void dslhal_api_gatherStatistics
++(
++ tidsl_t * ptidsl
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_initStatistics
++*
++*********************************************************************************************
++* DESCRIPTION: init statistical infromation of ax5 modem daugter card.
++*
++* Input: tidsl_t *ptidsl
++*
++* Return: NULL
++*
++********************************************************************************************/
++
++void dslhal_api_initStatistics
++(
++ tidsl_t * ptidsl
++);
++
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_getDslDriverVersion
++*
++*******************************************************************************************
++* DESCRIPTION: This routine supply DSL Driver version.
++*
++* INPUT: tidsl_t * ptidsl
++* void *pVer, DSP Driver Version Pointer
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++* Note: See verdef_u.h for version structure definition.
++*****************************************************************************************/
++
++void dslhal_api_getDslHalVersion
++(
++ void *pVer
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_dslShutdown
++*
++*******************************************************************************************
++* DESCRIPTION: routine to shutdown ax5 modem and free the resource
++*
++* INPUT: tidsl_t *ptidsl
++*
++* RETURN: NULL
++*
++* Notes: external function osFreeMemory() is required.
++*****************************************************************************************/
++
++int dslhal_api_dslShutdown
++(
++ tidsl_t *ptidsl
++);
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_getDspVersion
++*
++*******************************************************************************************
++* DESCRIPTION: This routine supply AX5 daugther card DSP version.
++*
++* INPUT: tidsl_t * ptidsl
++* void *pVer, DSP version struct is returned starting at this pointer
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_api_getDspVersion
++(
++ tidsl_t *ptidsl,
++ void *pVer
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_digi_memTestA()
++*
++*********************************************************************************************
++* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
++* memory tests on the external and internal memories of DSP, Codec Interconnect
++* test and Interrupt Test.
++*
++* Input: Test selects the test to be performed based on the elements set of 9 element
++* array passed the the parameter.
++*
++* Return: Status of the Tests Failed
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_digi_memTestA
++(
++unsigned int* Test
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_digi_memTestB()
++*
++*********************************************************************************************
++* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
++* memory tests on the external and internal memories of DSP, Codec Interconnect
++* test and Interrupt Test.
++*
++* Input: Test selects the digital test to be performed.
++*
++* Return: Status of the Tests Failed
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_digi_memTestB
++(
++unsigned int Test,
++unsigned int *Status
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_tonesTestA()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Array is a 64 element unsigned integer type array. The element of this array
++* describe which tones are to be generated by selecting the element of
++* the array to be non zero.
++* Return: NULL
++*
++********************************************************************************************/
++
++void dslhal_diags_anlg_tonesTestA
++(
++unsigned int Test,
++unsigned int* Array
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_tonesTestB()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Array is a 64 element unsigned integer type array. The element of this array
++* describe which tones are to be generated by selecting the element of
++* the array to be non zero.
++* Return: NULL
++*
++********************************************************************************************/
++
++void dslhal_diags_anlg_tonesTestB
++(
++unsigned int Test,
++unsigned int Tones
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_rxNoiseTest()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Tones selects the .
++* Return: NULL
++*
++********************************************************************************************/
++
++void dslhal_diags_anlg_rxNoiseTest
++(int agcFlag,
++short pga1,
++short pga2,
++short pga3,
++short aeq
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_ecNoiseTest()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Tones selects the .
++* Return: NULL
++*
++********************************************************************************************/
++
++void dslhal_diags_anlg_ecNoiseTest
++(int agcFlag,
++short pga1,
++short pga2,
++short pga3,
++short aeq
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_pollTrainingStatus()
++*
++*********************************************************************************************
++* DESCRIPTION: code to decode modem status and to start modem training
++*
++* Input: tidsl_t *ptidsl
++*
++* Return: 0-? status mode training
++* -1 failed
++*
++********************************************************************************************/
++int dslhal_api_pollTrainingStatus
++(
++ tidsl_t *ptidsl
++);
++
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
++*
++*********************************************************************************************
++* DESCRIPTION: Code to handle ax5 hardware interrupts
++*
++* Input: tidsl_t *ptidsl
++* int *pMsg, pointer to returned hardware messages. Each byte represent a messge
++* int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++int dslhal_api_handleTrainingInterrupt
++(
++ tidsl_t *ptidsl,
++ int intrSource
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the EOC Serial Number
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *SerialNumber : Input EOC Serial Number
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocSerialNumber
++(
++tidsl_t *ptidsl,
++char *SerialNumber
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the EOC Serial Number
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *VendorID : EOC Vendor ID
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocVendorId
++(
++tidsl_t *ptidsl,
++char *VendorID
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the EOC Revision Number
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *RevNum : Input EOC Revision Number
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setEocRevisionNumber
++(
++tidsl_t *ptidsl,
++char *RevNumber
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction Sets the EOC ATUR Config Register
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * char *RevNum : Input EOC ATUR Config Register
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setAturConfig
++(
++tidsl_t *ptidsl,
++char *ATURConfig
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_disableLosAlarm(tidsl_t *ptidsl, unsigned int set)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction disables all the LOS alarms
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int set // if set == TRUE : Disable LOS alarms, else enable
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ * NOTES: Currently not supported in any version other than MR4 Patch release..
++ *****************************************************************************************/
++unsigned int dslhal_api_disableLosAlarm
++(
++tidsl_t *ptidsl,
++unsigned int
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendIdle(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendIdle
++(
++tidsl_t *ptidsl
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendQuiet(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendQuiet
++(
++tidsl_t *ptidsl
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendDgasp(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendDgasp
++(
++tidsl_t *ptidsl
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction does sets the Margin threshold
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * int threshold
++ *
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setMarginThreshold
++(
++tidsl_t *ptidsl,
++int threshold
++);
++
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction does sets the Margin monitoring flag
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int trainflag
++ * unsigned int shwtflag
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_setMarginMonitorFlags
++(
++tidsl_t *ptidsl,
++unsigned int trainflag,
++unsigned int shwtflag
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int flag //if flag = TRUE set flag else reset
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setRateAdaptFlag
++(
++tidsl_t *ptidsl,
++unsigned int flag
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setTrellisFlag(tidsl_t *ptidsl, unsigned int flag)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int flag //if flag = TRUE set flag else reset
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setTrellisFlag
++(
++tidsl_t *ptidsl,
++unsigned int flag
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int maxbits : should be a value between 0-15
++*
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setMaxBitsPerCarrier
++(
++tidsl_t *ptidsl,
++unsigned int maxbits
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
++* size 64-512
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++unsigned int dslhal_api_setMaxInterleaverDepth
++(
++tidsl_t *ptidsl,
++unsigned int maxdepth
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction Sets the desired training mode(none/T1.413/G.dmt/G.lite)
++*
++* INPUT: PITIDSLHW_T *ptidsl
++* unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
++* 2: T1.413, 3:G.dmt, 4: G.lite
++* RETURN: 0 SUCCESS
++* 1 FAILED
++*
++*****************************************************************************************/
++
++unsigned int dslhal_api_setTrainingMode
++(
++tidsl_t *ptidsl,
++unsigned int trainmode
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_dslRetrain(tidsl_t *ptidsl)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_dslRetrain
++(
++tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_acknowledgeInterrupt
++(tidsl_t * ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_disableDspHybridSelect
++(tidsl_t * ptidsl,
++ unsigned int disable
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_selectHybrid
++(tidsl_t * ptidsl,
++ unsigned int hybridNum
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_reportHybridMetrics()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_reportHybridMetrics
++(tidsl_t * ptidsl,
++ int *metric
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl, unsigned int pairSelect)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++
++unsigned int dslhal_api_selectInnerOuterPair
++(tidsl_t *ptidsl,
++unsigned int pairSelect
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl, unsigned int pairSelect)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++
++unsigned int dslhal_api_resetTrainFailureLog
++(tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_controlLed()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureLed
++(tidsl_t * ptidsl,
++unsigned int idLed,
++unsigned int onOff
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureExternBert()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureExternBert
++(tidsl_t * ptidsl,
++unsigned int configParm,
++unsigned int parmVal
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureAtmBert()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureAtmBert
++(tidsl_t * ptidsl,
++unsigned int configParm,
++unsigned int parmVal
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_configureDgaspLpr()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_configureDgaspLpr
++(tidsl_t * ptidsl,
++unsigned int configParm,
++unsigned int parmVal
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_onOffPcb()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_onOffPcb
++(tidsl_t * ptidsl,
++unsigned int onOff
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_onOffBitSwap()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Turns on / off the power cutback feature;
++* Input
++* usDs; 0 = us and 1 = ds;
++* onOff; 0 = OFF and 1 = ON
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_onOffBitSwap
++(tidsl_t * ptidsl,
++ unsigned int usDs,
++ unsigned int onOff
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_configDsTones()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Turns on / off specific tones in the downstream direction;
++* Input
++* pointer to the array specifying the tones to be turned on/off
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_configDsTones
++(tidsl_t * ptidsl,
++ unsigned int *dsTones
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_getAocBitSwapBuffer()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Fetches the Tx/Rx AOC bitswap Buffer;
++* Input
++* Transmit / Receive buffer to be fetched
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_getAocBitswapBuffer
++(tidsl_t * ptidsl,
++unsigned int usDs
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_readTrainingMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads all the training messages on demand;
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* void *msgStruct : Pointer to Message Structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_readTrainingMessages
++(tidsl_t * ptidsl,
++void *msgPtr
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_getTrainingState()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads all the training messages on demand;
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* void *msgStruct : Pointer to training state structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_getTrainingState
++(tidsl_t * ptidsl,
++void *statePtr
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_resetBitSwapMessageLog()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Clears the Aoc Bitswap Message Log
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* unsigned int usDs ; Upstream=0, Downstream=1
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_resetBitSwapMessageLog
++(tidsl_t * ptidsl,
++ unsigned int usDs
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_setConstellationBinNumber()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Specifies the bin number for which constellation data should be fetched
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* unsigned int binNum : constellation bin number whose data is required
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_setConstellationBinNumber
++(tidsl_t * ptidsl,
++ unsigned int binNum
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_resetTrainStateHistory()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Clears the Training State History Log
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_resetTrainStateHistory
++(tidsl_t * ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_getSnrPerBin()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Get SNR data per bin
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_getSnrPerBin
++(tidsl_t * ptidsl,
++ unsigned int snrBufferOpt
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_logEocMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Logs EOC messages sent by the Modem to the CO
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* unsigned int eocLowerBytes : Lower [1-5] bits of EOC Message
++* unsigned int eocUpperBytes : Upper [6-13] bits of EOC Message
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_logEocMessages
++(tidsl_t * ptidsl,
++ unsigned int usDs,
++ unsigned int eocLowerBytes,
++ unsigned int eocUpperBytes
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_getReasonForDrop()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads the reason for dropping DSL connection;
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_getReasonForDrop
++(tidsl_t * ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_ctrlMaxAvgFineGains()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Turns on / off the host control for Max Avg Fine Gains; 0 = OFF and 1 = ON
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_ctrlMaxAvgFineGains
++(tidsl_t * ptidsl,
++unsigned int onOff
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_setMaxAvgFineGain()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Set the Maximum Average Fine Gain Value
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_setMaxAvgFineGain
++(tidsl_t * ptidsl,
++ short fineGain
++);
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_readPhySettings()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads the advanced Phy layer settings on demand;
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++* void *cfgStruct : Pointer to Phy Config Structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_readPhySettings
++(tidsl_t * ptidsl,
++void *cfgPtr
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_advcfg_setBlackOutBits()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the Blackout Bits in the RMSGPCB message
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_advcfg_setBlackOutBits
++(tidsl_t * ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_genericDspRead()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads from a generic location in the host interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_genericDspRead
++(tidsl_t * ptidsl,
++ unsigned int offset1,
++ unsigned int offset2,
++ unsigned int offset3,
++ unsigned char* localBuffer,
++ unsigned int numBytes
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_genericDspWrite()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Writes to a generic location in the host interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_genericDspWrite
++(tidsl_t * ptidsl,
++ unsigned int offset1,
++ unsigned int offset2,
++ unsigned int offset3,
++ unsigned char* localBuffer,
++ unsigned int numBytes
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_dspInterfaceRead()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reads from a generic location in the host interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_dspInterfaceRead
++(tidsl_t * ptidsl,
++ unsigned int baseAddr,
++ unsigned int numOffsets,
++ unsigned int *offsets,
++ unsigned char* localBuffer,
++ unsigned int numBytes
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Writes to a generic location in the host interface
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_api_dspInterfaceWrite
++(tidsl_t * ptidsl,
++ unsigned int baseAddr,
++ unsigned int numOffsets,
++ unsigned int *offsets,
++ unsigned char* localBuffer,
++ unsigned int numBytes
++);
++
++/******************************************************************************************
++ * FUNCTION NAME: dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)
++ *
++ *******************************************************************************************
++ * DESCRIPTION: This fuction sends the passed mailbox command to the DSP
++ *
++ * INPUT: PITIDSLHW_T *ptidsl
++ * unsigned int cmd
++ *
++ * RETURN: 0 SUCCESS
++ * 1 FAILED
++ *
++ *****************************************************************************************/
++unsigned int dslhal_api_sendMailboxCommand
++(tidsl_t *ptidsl,
++unsigned int cmd
++);
++
++#ifdef INTERNAL_BUILD
++#include <dsl_hal_internal_api.h>
++#endif
++
++
++#endif /* pairs #ifndef __DSL_APPLICATION_INTERFACE_H__ */
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h 2005-07-10 08:02:01.439112120 +0200
+@@ -0,0 +1,259 @@
++unsigned int log10[]=
++{
++ 0,
++ 771,
++ 1221,
++ 1541,
++ 1789,
++ 1992,
++ 2163,
++ 2312,
++ 2443,
++ 2560,
++ 2666,
++ 2763,
++ 2852,
++ 2934,
++ 3011,
++ 3083,
++ 3150,
++ 3213,
++ 3274,
++ 3331,
++ 3385,
++ 3437,
++ 3486,
++ 3533,
++ 3579,
++ 3622,
++ 3664,
++ 3705,
++ 3744,
++ 3781,
++ 3818,
++ 3853,
++ 3887,
++ 3921,
++ 3953,
++ 3984,
++ 4015,
++ 4044,
++ 4073,
++ 4101,
++ 4129,
++ 4156,
++ 4182,
++ 4207,
++ 4232,
++ 4257,
++ 4281,
++ 4304,
++ 4327,
++ 4349,
++ 4371,
++ 4393,
++ 4414,
++ 4435,
++ 4455,
++ 4475,
++ 4495,
++ 4514,
++ 4533,
++ 4552,
++ 4570,
++ 4589,
++ 4606,
++ 4624,
++ 4641,
++ 4658,
++ 4675,
++ 4691,
++ 4707,
++ 4723,
++ 4739,
++ 4755,
++ 4770,
++ 4785,
++ 4800,
++ 4815,
++ 4829,
++ 4844,
++ 4858,
++ 4872,
++ 4886,
++ 4899,
++ 4913,
++ 4926,
++ 4939,
++ 4952,
++ 4965,
++ 4978,
++ 4990,
++ 5003,
++ 5015,
++ 5027,
++ 5039,
++ 5051,
++ 5063,
++ 5075,
++ 5086,
++ 5098,
++ 5109,
++ 5120,
++ 5131,
++ 5142,
++ 5153,
++ 5164,
++ 5174,
++ 5185,
++ 5195,
++ 5206,
++ 5216,
++ 5226,
++ 5236,
++ 5246,
++ 5256,
++ 5266,
++ 5275,
++ 5285,
++ 5295,
++ 5304,
++ 5313,
++ 5323,
++ 5332,
++ 5341,
++ 5350,
++ 5359,
++ 5368,
++ 5377,
++ 5386,
++ 5394,
++ 5403,
++ 5412,
++ 5420,
++ 5429,
++ 5437,
++ 5445,
++ 5454,
++ 5462,
++ 5470,
++ 5478,
++ 5486,
++ 5494,
++ 5502,
++ 5510,
++ 5518,
++ 5525,
++ 5533,
++ 5541,
++ 5548,
++ 5556,
++ 5563,
++ 5571,
++ 5578,
++ 5586,
++ 5593,
++ 5600,
++ 5607,
++ 5614,
++ 5622,
++ 5629,
++ 5636,
++ 5643,
++ 5649,
++ 5656,
++ 5663,
++ 5670,
++ 5677,
++ 5683,
++ 5690,
++ 5697,
++ 5703,
++ 5710,
++ 5716,
++ 5723,
++ 5729,
++ 5736,
++ 5742,
++ 5749,
++ 5755,
++ 5761,
++ 5767,
++ 5773,
++ 5780,
++ 5786,
++ 5792,
++ 5798,
++ 5804,
++ 5810,
++ 5816,
++ 5822,
++ 5828,
++ 5834,
++ 5839,
++ 5845,
++ 5851,
++ 5857,
++ 5862,
++ 5868,
++ 5874,
++ 5879,
++ 5885,
++ 5891,
++ 5896,
++ 5902,
++ 5907,
++ 5913,
++ 5918,
++ 5924,
++ 5929,
++ 5934,
++ 5940,
++ 5945,
++ 5950,
++ 5955,
++ 5961,
++ 5966,
++ 5971,
++ 5976,
++ 5981,
++ 5986,
++ 5992,
++ 5997,
++ 6002,
++ 6007,
++ 6012,
++ 6017,
++ 6022,
++ 6027,
++ 6031,
++ 6036,
++ 6041,
++ 6046,
++ 6051,
++ 6056,
++ 6060,
++ 6065,
++ 6070,
++ 6075,
++ 6079,
++ 6084,
++ 6089,
++ 6093,
++ 6098,
++ 6103,
++ 6107,
++ 6112,
++ 6116,
++ 6121,
++ 6125,
++ 6130,
++ 6134,
++ 6139,
++ 6143,
++ 6148,
++ 6152,
++ 6156,
++ 6161,
++ 6165
++ };
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_register.h linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_register.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h 2005-07-10 08:02:01.440111968 +0200
+@@ -0,0 +1,337 @@
++#ifndef ___DSL_REGISTER_DEFINES_H___
++#define ___DSL_REGISTER_DEFINES_H___ 1
++
++/*******************************************************************************
++* FILE PURPOSE: DSL HAL H/W Registers and Constant Declarations for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_hal_register.h
++*
++* DESCRIPTION:
++* Contains DSL HAL APIs for Adam2 OS functions
++*
++*
++* (C) Copyright 2001-02, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 06Feb03 0.00.00 RamP Created
++* 21Mar03 0.00.01 RamP Changed header files for Modular
++* build framework
++* 21Mar03 0.00.02 RamP Introduced malloc size for DSP f/w
++* 07Apr03 0.00.03 RamP Implemented new error reporting scheme
++* Changed Commenting to C style only
++* 12Apr03 0.00.04 RamP Added Interrupt Mask defines
++* 14Apr03 0.00.05 RamP Renamed macros for REG8, REG16 & REG32
++* 21Apr03 0.01.00 RamP Added Interrupt source/clear registers
++* Changed enum RSTATE_SHOWTIME to 5
++* 24Apr03 0.01.01 RamP Moved the RSTATE enum to api.h
++* Added olay recovery error condition
++* 14May03 0.01.02 RamP Added defines for power computation
++* Added error condition for hybrids
++* 04Jun03 0.01.03 RamP Added enum for config flags,
++* Cleaned up AR5 register defines
++* Added defines for higher data rate
++* 06Jun03 0.01.04 RamP Added error & interrupt defines
++* 09Jun03 0.01.05 RamP Modified enum for current config
++* Added additional C-Rates defines
++* 18Jul03 0.01.06 RamP Modified internal build flow
++* 21Aug03 0.01.07 RamP Added constellation buffer size
++* 08Oct03 0.01.08 RamP Added us/ds Bits n gains size
++* 12Oct03 0.01.08 RamP Added ADSL2 Message sizes, lengths
++* and offsets for various formats
++* 29Oct03 0.01.09 RamP Added ADSL2 Delt offsets & sizes
++* 24Nov03 0.01.10 RamP Added bit field number, scan vector
++* 26Dec03 0.01.11 RamP Removed the oamFeature masks to api.h
++*******************************************************************************/
++
++#include "env_def_typedefs.h"
++#ifdef INTERNAL_BUILD
++#include "dev_host_internalinterface.h"
++#endif
++#include "dev_host_interface.h"
++#include "dsl_hal_api.h"
++
++#define ADSLSS_BASE 0x01000000
++#define BBIF_BASE 0x02000000
++
++#define ADSLSSADR (BBIF_BASE+0x0000)
++#define ADSLSSADRMASK 0xff000000
++#define WAKEUP_DSP 0x00000001
++
++/* Ax7 Reset Control */
++
++#define RST_CNTRL_BASE 0x8611600
++#define RST_CNTRL_PRCR (RST_CNTRL_BASE + 0x00 )
++
++#define RST_CNTRL_PRCR_GPIO 0x00000040
++#define RST_CNTRL_PRCR_ADSLSS 0x00000080
++#define RST_CNTRL_PRCR_USB 0x00000100
++#define RST_CNTRL_PRCR_SAR 0x00000200
++#define RST_CNTRL_PRCR_DSP 0x00800000
++#define RST_CNTRL_PRCR_EMAC1 0x00200000 /* EMAC1 reset */
++
++#define RST_CNTRL_SWRCR (RST_CNTRL_BASE + 0x04 )
++#define RST_SWRCR_SWR0 0x00000001
++#define RST_SWRCR_SWR1 0x00000002
++
++#define RST_CNTRL_RSR (TNETD53XX_RST_CNTRL_BASE + 0x08 )
++#define RST_RSR_RSCAUSE 0x00000003 /* Software Reset Caused by writing to SWR1 bit */
++
++
++/* ******************************************************
++Interrupt sources on Ax7 interrupt controller.
++The reserved sources are noted.
++********************************************************* */
++
++#define INTR_CNTRL_SRC_SECOND 0
++#define INTR_CNTRL_SRC_EXTERNAL0 1
++#define INTR_CNTRL_SRC_EXTERNAL1 2
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_TIMER0 5
++#define INTR_CNTRL_SRC_TIMER1 6
++#define INTR_CNTRL_SRC_UART0 7
++#define INTR_CNTRL_SRC_UART1 8
++#define INTR_CNTRL_SRC_DMA0 9
++#define INTR_CNTRL_SRC_DMA1 10
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_SAR 15
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_EMAC0 19
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_VLYNQ0 21
++#define INTR_CNTRL_SRC_CODEC_WAKE 22
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_USB 24
++#define INTR_CNTRL_SRC_VLYNQ1 25
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_EMAC1 28
++#define INTR_CNTRL_SRC_I2C 29
++#define INTR_CNTRL_SRC_DMA2 30
++#define INTR_CNTRL_SRC_DMA3 31
++/* reserved sources ... */
++#define INTR_CNTRL_SRC_VDMA_RX 37
++#define INTR_CNTRL_SRC_VDMA_TX 38
++#define INTR_CNTRL_SRC_ADSLSS 39
++
++#ifndef K0BASE
++#define K0BASE 0x80000000
++#endif
++
++#ifndef K1BASE
++#define K1BASE 0xA0000000
++#endif
++
++#ifndef PHYS_ADDR
++#define PHYS_ADDR(X) ((X) & 0X1FFFFFFF)
++#endif
++
++#ifndef PHYS_TO_K0
++#define PHYS_TO_K0(X) (PHYS_ADDR(X)|K0BASE)
++#endif
++
++#ifndef PHYS_TO_K1
++#define PHYS_TO_K1(X) (PHYS_ADDR(X)|K1BASE)
++#endif
++
++#ifndef DSLHAL_REG8
++#define DSLHAL_REG8( addr ) (*(volatile unsigned short *) PHYS_TO_K1(addr))
++#endif
++
++#ifndef DSLHAL_REG16
++#define DSLHAL_REG16( addr ) (*(volatile unsigned short *)PHYS_TO_K1(addr))
++#endif
++
++#ifndef DSLHAL_REG32
++#define DSLHAL_REG32( addr ) (*(volatile unsigned int *)PHYS_TO_K1(addr))
++#endif
++
++#ifndef NULL
++#define NULL 0
++#endif
++
++#ifndef TRUE
++#define TRUE (1==1)
++#endif
++
++#ifndef FALSE
++#define FALSE (1==2)
++#endif
++
++/*******************************************************************************
++* Type Defines for Library
++********************************************************************************/
++typedef unsigned int size_t;
++
++#define TIDSL_HW_CREATED 0x00000001
++#define TIDSL_HW_OPENED 0x00000002
++#define TIDSL_HW_STARTED 0x00000004
++#define TIDSL_OS_INITIALIZED 0x00000008
++
++/* Data Pump CRATES Table Defines */
++#define SIZE_OF_CRATES1_TABLE 120
++#define CRATES1_BF_LS0 7
++#define CRATES1_BI_LS0 17
++#define CRATES1_BF_AS0 0
++#define CRATES1_BI_AS0 10
++#define CRATES1_BF_DSRS 20
++#define CRATES1_BI_DSRS 21
++#define CRATES1_BFI_DSS 22
++#define CRATES1_BFI_DSI 23
++#define CRATES1_BF_USRS 25
++#define CRATES1_BI_USRS 26
++#define CRATES1_BFI_USS 27
++#define CRATES1_BFI_USI 28
++
++#define FAST_PATH 0
++#define INTERLEAVED_PATH 1
++
++#define LINE_NOT_CONNECTED 0
++#define LINE_CONNECTED 1
++#define LINE_DISCONNECTED 2
++#define LINE_NOT_TO_CONNECT 3
++
++#define MAXSECTIONS 125
++
++/*****************************************************************************************
++ * Localstructure declarations
++ *
++ ****************************************************************************************/
++enum
++{
++ DSLHAL_ERROR_NO_ERRORS, /* 00 */
++ DSLHAL_ERROR_UNRESET_ADSLSS, /* 01 */
++ DSLHAL_ERROR_RESET_ADSLSS, /* 02 */
++ DSLHAL_ERROR_UNRESET_DSP, /* 03 */
++ DSLHAL_ERROR_RESET_DSP, /* 04 */
++ DSLHAL_ERROR_NO_FIRMWARE_IMAGE, /* 05 */
++ DSLHAL_ERROR_MALLOC, /* 06 */
++ DSLHAL_ERROR_FIRMWARE_MALLOC, /* 07 */
++ DSLHAL_ERROR_DIAG_MALLOC, /* 08 */
++ DSLHAL_ERROR_OVERLAY_MALLOC, /* 09 */
++ DSLHAL_ERROR_CODE_DOWNLOAD, /* 10 */
++ DSLHAL_ERROR_DIAGCODE_DOWNLOAD, /* 11 */
++ DSLHAL_ERROR_BLOCK_READ, /* 12 */
++ DSLHAL_ERROR_BLOCK_WRITE, /* 13 */
++ DSLHAL_ERROR_MAILBOX_READ, /* 14 */
++ DSLHAL_ERROR_MAILBOX_WRITE, /* 15 */
++ DSLHAL_ERROR_MAILBOX_NOMAIL, /* 16 */
++ DSLHAL_ERROR_MAILBOX_OVERFLOW, /* 17 */
++ DSLHAL_ERROR_INVALID_PARAM, /* 18 */
++ DSLHAL_ERROR_ADDRESS_TRANSLATE, /* 19 */
++ DSLHAL_ERROR_FIRMWARE_CRC, /* 20 */
++ DSLHAL_ERROR_FIRMWARE_OFFSET, /* 21 */
++ DSLHAL_ERROR_CONFIG_API_FAILURE, /* 22 */
++ DSLHAL_ERROR_EOCREG_API_FAILURE, /* 23 */
++ DSLHAL_ERROR_VERSION_API_FAILURE, /* 24 */
++ DSLHAL_ERROR_STATS_API_FAILURE, /* 25 */
++ DSLHAL_ERROR_MARGIN_API_FAILURE, /* 26 */
++ DSLHAL_ERROR_CTRL_API_FAILURE, /* 27 */
++ DSLHAL_ERROR_HYBRID_API_FAILURE, /* 28 */
++ DSLHAL_ERROR_MODEMENV_API_FAILURE, /* 29 */
++ DSLHAL_ERROR_INTERRUPT_FAILURE, /* 30 */
++ DSLHAL_ERROR_INTERNAL_API_FAILURE, /* 31 */
++ DSLHAL_ERROR_DIGIDIAG_FAILURE, /* 32 */
++ DSLHAL_ERROR_TONETEST_FAILURE, /* 33 */
++ DSLHAL_ERROR_NOISETEST_FAILURE, /* 34 */
++ DSLHAL_ERROR_MODEMSTATE, /* 35 */
++ DSLHAL_ERROR_OVERLAY_CORRUPTED /* 36 */
++};
++
++enum
++{
++ CONFIG_FLAG_NOFLAG, /* 00 */
++ CONFIG_FLAG_TRELLIS, /* 01 */
++ CONFIG_FLAG_EC, /* 02 */
++ CONFIG_FLAG_RS /* 03 */
++};
++
++#define USE_EMIF_REV 0
++#define USE_CVR_REV 1
++#define TNETD53XX_MAXLOOP 10000
++#define REVERB 0
++#define MEDLEY 1
++#define NONINTENSE 0
++#define slavespace0 0xa1000000
++
++#define MASK_MAILBOX_INTERRUPTS 0x00000001
++#define MASK_BITFIELD_INTERRUPTS 0x00000002
++#define MASK_HEARTBEAT_INTERRUPTS 0x00000004
++#define DSP_INTERRUPT_SOURCE_REGISTER 0x020007A0
++#define DSP_INTERRUPT_CLEAR_REGISTER 0x020007A4
++
++#define DIGITAL_DIAG_MEMSIZE 1048576
++#define CRC32_QUOTIENT 0x04c11db7
++#define DSP_FIRMWARE_MALLOC_SIZE 0x7ffff
++#define DSP_CONSTELLATION_BUFFER_SIZE 1024*4
++#define LOG43125 9303
++#define US_NOMINAL_POWER (-38)
++#define US_BNG_LENGTH 32
++#define DS_BNG_LENGTH 256
++#define NUMBER_OF_BITFIELDS 4
++#define BITFIELD_SCAN 0x80000000
++
++/* ADSL Message offsets from Host Interface Pointer */
++
++/* ADSL2 Messages Index and Length defines */
++
++#define CMSGFMT_INDEX 0
++#define CMSGPCB_INDEX 1
++#define RMSGFMT_INDEX 2
++#define RMSGPCB_INDEX 3
++#define RMSG1LD_INDEX 13
++#define RMSG2LD_INDEX 14
++#define RMSG3LD_INDEX 15
++#define RMSG4LD_INDEX 16
++#define RMSG5LD_INDEX 17
++#define RMSG6LD_INDEX 18
++#define RMSG7LD_INDEX 19
++#define RMSG8LD_INDEX 20
++#define RMSG9LD_INDEX 21
++#define CMSG1LD_INDEX 22
++#define CMSG2LD_INDEX 23
++#define CMSG3LD_INDEX 24
++#define CMSG4LD_INDEX 25
++#define CMSG5LD_INDEX 26
++#define CMSGPCB2_INDEX 28
++#define CMSGPCB2L_INDEX 29
++#define RMSGFMT2_INDEX 30
++#define RMSGPCB2L_INDEX 31
++#define CMSG1ADSL2_INDEX 32
++#define RMSG1ADSL2_INDEX 33
++#define CMSG2ADSL2_INDEX 34
++#define RMSG2ADSL2_INDEX 35
++#define CPARAMS_INDEX 36
++#define RPARAMS_INDEX 37
++
++/* ADSL2 Message Sizes */
++
++#define CMSGFMT_SIZE 2
++#define RMSGFMT_SIZE 2
++#define CMSGPCB_SIZE 2
++#define CMSGPCB2_SIZE 6 /* Annex A with Blackout */
++#define CMSGPCB2L_SIZE 10 /* Annex B with Blackout */
++#define RMSGPCB_SIZE 36
++#define RMSG1LD_SIZE 16
++#define RMSGxLD_SIZE 258
++#define CMSG1LD_SIZE 16
++#define CMSG2LD_SIZE 130
++#define CMSG3LD_SIZE 66
++#define CMSG4LD_SIZE 34
++#define CMSG5LD_SIZE 34
++#define CMSG1ADSL2_SIZE 24
++#define RMSG1ADSL2_SIZE 4
++#define CMSG2ADSL2_SIZE 4
++#define RMSG2ADSL2_SIZE 32
++#define CPARAMS_SIZE 136
++#define RPARAMS_SIZE 808
++
++/* ADSL2 Plus Message Sizes (if Different from ADSL2) */
++
++#define RMSGPCB_P_SIZE 68
++#define CMSG1ADSL2P_SIZE 40 /* With Blackout */
++#define CPARAMS_PA_SIZE 168
++#define RPARAMS_PA_SIZE 2088
++#define CPARAMS_PB_SIZE 296
++#define RPARAMS_PB_SIZE 2088
++
++#endif /* pairs #ifndef ___DSL_REGISTER_DEFINES_H___ */
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.c linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_support.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c 2005-07-10 08:02:01.443111512 +0200
+@@ -0,0 +1,2788 @@
++/*******************************************************************************
++* FILE PURPOSE: DSL Driver API functions for Sangam
++*********************************************************************************
++* FILE NAME: dsl_hal_support.c
++*
++* DESCRIPTION:
++* Contains DSL HAL APIs for Modem Control
++*
++*
++* (C) Copyright 2001-02, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 06Feb03 0.00.00 RamP Created
++* 21Mar03 0.00.01 RamP Inserted byteswap functions
++* 07Apr03 0.00.02 RamP Implemented new error reporting scheme
++* Changed Commenting to C style only
++* 12Apr03 0.00.03 RamP Added function to set Interrupt Bit
++* Masks for bitfield & Mailboxes
++* 14Apr03 0.00.04 RamP Added function to process modem state
++* bit fields; renamed REG32 macros
++* Changed interrupt bit field settings
++* 15Apr03 0.00.05 RamP Fixed exit condition on dslShutdown
++* 21Apr03 0.01.00 RamP Fixed dslShutdown function & changed
++* loop counter for overlay byteswaps
++* (Alpha) Added cache writeback for overlays
++* Added function acknowledgeInterrupt
++* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt into api
++* 24Apr03 0.01.02 RamP Added function to compare crc32 with
++* pre-computed value as a recovery
++* scheme for corrupt overlay pages
++* 28Apr03 0.01.03 RamP Fixed a parameter in crc32 fxn call
++* 05May03 0.01.04 RamP Fixed Message structure access in
++* writeHostMailbox function
++* 14May03 0.01.05 RamP Lookup to netService of dsp version
++* (alpha ++) to determine pots/isdn service
++* 21May03 0.01.06 RamP Added support for CO profiles
++* 29May03 0.01.07 RamP Added critical section tabs for block
++* read/write operations
++* Added functions to reload overlay pages
++* and CO Profiles
++* 04Jun03 0.01.08 RamP Added state transition timing counters
++* 06Jun03 0.01.09 RamP Added Interrupt source parsing function
++* Interrupt masking for heartbeat added
++* 09Jun03 0.01.10 RamP Modified modem state bit field processing
++* for structure changes in ITIDSLHW
++* fixed problem in free memory for CO prof
++* 18Jul03 0.01.11 RamP Optimized free memory for CO profiles &
++* overlay pages in the supporting APIs
++* 28Jul03 0.02.00 RamP Modified the process bitfield functn
++* for LED & Application State report
++* 21Aug03 0.03.00 RamP Added logic to allocate & communicate
++* memory for constellation buffer display
++* 29Sep03 0.03.01 RamP Added API switch calls to advcfg module
++* to abstract them from the API module
++* 12Oct03 0.03.02 RamP Added API to gather ADSL2 Messages
++* 14Oct03 0.03.03 RamP Added function to read CMsgsRA
++* 23Oct03 0.03.04 RamP Changed train history index to circular
++* buffer upon rollover
++* 29Oct03 0.03.05 RamP Added Adsl2 Delt Message Parsing
++* 12Nov03 0.03.06 RamP Fixed endianness issues with
++* Constellation Display
++* 14Nov03 0.03.07 RamP Added function to gather CRates1/RRates1
++* before they get overwritten by CRatesRA
++* 19Nov03 0.03.08 JohnP Revised dslhal_support_aocBitSwapProcessing to
++* prevent duplicate ATU-R bitswaps going to ACT
++* 24Nov03 0.03.09 RamP Implemented detailed State Tracking through
++* Modem State bit fields for ADSL/2
++* 12Dec03 0.03.10 RamP Tokenized advanced configuration code
++* 12Dec03 0.03.11 RamP Added state reset upon IDLE
++* 19Dec03 0.03.12 RamP Added static adsl2 byteswap function for
++* handling pointer to pointer cases
++* Changed adsl2 messages to correct pointer to
++* pointer dereferencing problems in some OS
++* 26Dec03 0.03.13 RamP Setting Current Address for Constellation
++* buffer in addition to start address
++* Added additional check to overlay page malloc
++*******************************************************************************/
++#include "dsl_hal_register.h"
++#include "dsl_hal_support.h"
++
++static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_unresetDslSubsystem
++*
++*******************************************************************************************
++* DESCRIPTION: This function unreset Dsl Subsystem
++*
++* INPUT: None
++*
++* RETURN: 0 if Pass; 1 if Fail
++*
++*****************************************************************************************/
++int dslhal_support_unresetDslSubsystem(void)
++{
++ dprintf(4," dslhal_support_unresetDslSubsystem()\n");
++ /* Put ADSLSS in to reset */
++ DSLHAL_REG32(0xa8611a10) = 0x1;
++ shim_osClockWait(64);
++ dprintf(5,"Selected APLL Reg \n");
++
++ DSLHAL_REG32(0xa8610a90) = 0x4;
++ shim_osClockWait(64);
++ dprintf(5,"Enable Analog PLL \n");
++
++ DSLHAL_REG32(0xa8610a90) = 0x77fe;
++ shim_osClockWait(64);
++ dprintf(5,"Set PLL for DSP\n");
++
++ /* DSLHAL_REG32(0xa8611600) = 0x007f1bdf;*/
++ DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_ADSLSS;
++ shim_osClockWait(64);
++ dprintf(5,"Brought ADSLSS out of Reset \n");
++
++ DSLHAL_REG32(0xa861090c) &= ~((1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)|(1<<25));
++ shim_osClockWait(64);
++ dprintf(5,"Configured GPIO 20-25 for McBSP \n");
++
++ /*DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_ADSLSS;*/
++
++
++ /* DSLHAL_REG32(0xa8611a04) = 0x00000001;
++ shim_osClockWait(64); */
++
++ dprintf(4," dslhal_support_unresetDslSubsystem done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_resetDslSubsystem
++*
++*******************************************************************************************
++* DESCRIPTION: This function unreset Dsl Subsystem
++*
++* INPUT: None
++*
++* RETURN: 0 if Pass; 1 if Fail
++*
++*****************************************************************************************/
++int dslhal_support_resetDslSubsystem(void)
++{
++ dprintf(4, "dslhal_support_resetDslSubsystem \n");
++ /* Put ADSLSS into reset */
++ DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_ADSLSS;
++ shim_osClockWait(64);
++ /* DSLHAL_REG32(0xa8611a04) = 0x00000000;
++ shim_osClockWait(64); */
++ dprintf(4, "dslhal_support_resetDslSubsystem Done \n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_unresetDsp()
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
++*
++* INPUT: None
++*
++* RETURN: 0 --successful.
++* 1 --failed
++*
++*****************************************************************************************/
++int dslhal_support_unresetDsp(void)
++{
++#ifdef PRE_SILICON
++ /* unsigned char value; */
++ int rc;
++
++ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_SRC_ADDR);
++ if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
++ {
++ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
++ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
++ }
++ dprintf(5,"MDMA SRC: %08x\n", rc);
++ DSLHAL_REG32(rc) = 0x80000001;
++ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_DST_ADDR);
++ if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
++ {
++ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
++ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
++ }
++ dprintf(5,"MDMA DST: %08x\n", rc);
++ DSLHAL_REG32(rc) = 0x02090001;
++ rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_CTL_ADDR);
++ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
++ {
++ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
++ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
++ }
++ dprintf(5,"MDMA CTL: %08x\n", rc);
++ DSLHAL_REG32(rc) = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
++ DEV_MDMA_BURST1 | (1 << DEV_MDMA_LEN_SHF));
++ /* statusMask = 0x00000010;*/
++#else
++ dprintf(4, "dslhal_support_unresetDsp()\n");
++
++ /* Bring the DSP core out of reset */
++ /* DSLHAL_REG32(0xa8611600) = 0x00ff1bdf; */
++ DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_DSP;
++ shim_osClockWait(64);
++ dprintf(5,"Brought DSP out of Reset \n");
++ dprintf(6,"Current Contents of PRCR: 0x%x\n",(unsigned int)DSLHAL_REG32(0xa8611600));
++ /* DSLHAL_REG32(0xa8611a0c) = 0x00000007;
++ shim_osClockWait(64); */
++#endif
++
++ dprintf(4, "dslhal_support_unresetDsp() done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_resetDsp()
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction takes ax5 daugter board into reset.
++*
++* INPUT: None
++*
++* RETURN: 0 --successful.
++* 1 --failed
++*
++*****************************************************************************************/
++int dslhal_support_resetDsp(void)
++{
++ dprintf(4, "dslhal_support_resetDsp \n");
++ /* Put ADSLSS into reset */
++ DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_DSP;
++ shim_osClockWait(64);
++ dprintf(4, "dslhal_support_resetDsp Done \n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_hostDspAddressTranslate()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Maps ax5 daugter card dsp memory address to avalanche memory space
++*
++* Input: unsigned int addr, dsp memory address.
++*
++* Return: >=0, unsigned int, mapped Avalanche address(VBUS address).
++* -1, mapping failed
++*
++*
++********************************************************************************************/
++/* static unsigned int bbifmap0,bbifmap1; */
++
++unsigned int dslhal_support_hostDspAddressTranslate( unsigned int addr )
++{
++ unsigned int addrMap;
++ /* This function should just be used to move the memory window of the ADSLSS */
++ dprintf(5, "dslhal_support_hostDspAddressTranslate()\n");
++
++ /* select vbus to xbus memory */
++ /* addrMap = addr & 0xff000000; */
++ addrMap = addr & ADSLSSADRMASK;
++
++ DSLHAL_REG32(ADSLSSADR) = addrMap;
++
++ dprintf(6, "dslhal_support_hostDspAddressTranslate() done\n");
++#ifdef PRE_SILICON
++ return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr))+ 0x00000100);
++ /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
++#else
++ return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr)));
++ /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
++#endif
++
++}
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_blockWrite
++*
++*******************************************************************************************
++* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card
++*
++* INPUT: void *buffer, data need to written
++* void *adde, memory address to be written
++* size_t count, number of bytes to be written
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_support_blockWrite(void *buffer, void *addr, size_t count)
++{
++ int rc, byteCnt=0;
++ unsigned char* ptr;
++ union
++ {
++ unsigned char *cptr;
++ short *sptr;
++ int *iptr;
++ } src;
++ union
++ {
++ int anint; /* DSP location */
++ unsigned char *cptr; /* to avoid casts */
++ } dst;
++ union
++ {
++ unsigned int anint;
++ unsigned char byte[4];
++ }data,dword,sword;
++
++ /* Enter Critical Section */
++ shim_osCriticalEnter();
++
++ dprintf(6, "dslhal_support_blockWrite\n");
++
++ dprintf(6,"addr=0x%X, length=0x%X, buffer=0x%X\n", (unsigned int) addr, (unsigned int) count, (unsigned int)buffer);
++
++ src.cptr = (unsigned char*) buffer; /* local buffer */
++ dst.cptr = addr; /* DSP memory location */
++
++ /*Maps address first*/
++ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
++ dprintf(5, "NewAddr: %08x\n", rc);
++ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
++ {
++ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
++ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
++ }
++
++ dst.cptr=(unsigned char *)rc;
++
++ /* check wether address is at 32bits boundary */
++
++ if ((dst.anint & 0x3) && count)
++ {
++ sword.anint = *(unsigned int*)((unsigned int)src.cptr & 0xfffffffc);
++ dword.anint = DSLHAL_REG32((unsigned int)dst.cptr & 0xfffffffc);
++ sword.anint = (unsigned int) dslhal_support_byteSwap32(sword.anint);
++ dword.anint = (unsigned int) dslhal_support_byteSwap32(dword.anint);
++ ptr = (unsigned char *)((unsigned int)dst.cptr & 0xfffffffc);
++
++ if((dst.anint & 3) ==3) /* last byte of a dword */
++ {
++ dword.byte[3] = sword.byte[3];
++ dst.anint++; /* bump the address by one */
++ byteCnt++;
++ count--;
++ }
++
++ if((dst.anint & 3) ==1) /* second byte */
++ {
++ if(count>3)
++ {
++ dword.byte[3] = sword.byte[3];
++ dst.anint++;
++ count--;
++ byteCnt++;
++ }
++ if(count>2)
++ {
++ dword.byte[2] = sword.byte[2];
++ dst.anint++;
++ count--;
++ byteCnt++;
++ }
++ if(count)
++ {
++ dword.byte[1] = sword.byte[1];
++ dst.anint++;
++ count--;
++ byteCnt++;
++ }
++ }
++
++ if((dst.anint & 3) && (count >1))
++ {
++ dword.byte[2] = sword.byte[2];
++ dword.byte[3] = sword.byte[3];
++ byteCnt+=2;
++ dst.anint += 2; /* bump the address by two */
++ count -= 2; /* decrement the byte count by two */
++ }
++
++ if((dst.anint & 3) && (count==1))
++ {
++ dword.byte[2] = sword.byte[2];
++ dst.anint++;
++ byteCnt++;
++ count--;
++ }
++ src.cptr = (char *)((unsigned int)src.cptr & 0xfffffffc); /* fix 032802 */
++ dword.anint = dslhal_support_byteSwap32(dword.anint);
++ DSLHAL_REG32((unsigned int)ptr) = dword.anint;
++ ptr = src.cptr;
++ for(rc=0;rc<count;rc++)
++ {
++ *ptr = *(ptr+byteCnt);
++ ptr++;
++ }
++ }
++
++ /* the dst pointer should now be on a 32-bit boundary */
++
++ while (count > 3)
++ {
++ DSLHAL_REG32((unsigned int)dst.cptr) = dslhal_support_byteSwap32(*src.iptr);
++ src.iptr++; /* bump the data pointer by four */
++ dst.anint += 4; /* bump the address by four */
++ count -= 4; /* decrement the byte count by four */
++ }
++
++ /* write remaining bytes */
++ if(count)
++ {
++ int i;
++
++ data.anint= DSLHAL_REG32((unsigned int)dst.cptr);
++ data.anint=dslhal_support_byteSwap32(data.anint);
++ for (i=0; i< count; i++)
++ {
++ data.byte[i]=*(src.cptr+i);
++ }
++ data.anint=dslhal_support_byteSwap32(data.anint);
++ DSLHAL_REG32((unsigned int)dst.cptr) = data.anint;
++ src.cptr +=count;
++ dst.anint +=count;
++ count=0;
++ }
++ dprintf(6, "dslhal_support_blockWrite done\n");
++ /* Exit Critical Section */
++ shim_osCriticalExit();
++ return DSLHAL_ERROR_NO_ERRORS;
++} /* end of dslhal_support_blockWrite() */
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_blockRead
++*
++*********************************************************************************************
++* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
++*
++* INPUT: void *addr, memory address to be read
++* void *buffer, dat buffer to be filled with from memmory
++* size_t count, number of bytes to be written
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_support_blockRead(void *addr, void *buffer, size_t count)
++{
++ int rc;
++ union
++ {
++ int anint; /* DSP location */
++ char *cptr; /* to avoid casts */
++ } src;
++ union
++ {
++ char byte[4];
++ int anint; /* DSP data */
++ } data;
++ union
++ {
++ char *cptr;
++ int *iptr;
++ } dst;
++
++ /* Enter Critical Section */
++ shim_osCriticalEnter();
++
++ dprintf(6,"dslhal_support_blockRead\n");
++
++
++ src.cptr = addr; /* DSP memory location */
++ dst.cptr = buffer; /* local buffer */
++
++ dprintf(6, "Read addr=0x%X, size=0x%X\n", (unsigned int)addr, count);
++
++
++ /*Maps address first*/
++ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
++ if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
++ {
++ dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
++ return DSLHAL_ERROR_ADDRESS_TRANSLATE;
++ }
++
++ src.cptr=(unsigned char *)rc;
++
++ /**********************************************
++ * if the source is NOT on a 32-bit boundary *
++ * then we read the full word *
++ * and ignore the first part of it *
++ **********************************************/
++
++ if ((src.anint & 3) && count)
++ {
++ unsigned int anword;
++
++ anword = DSLHAL_REG32((unsigned int)src.cptr & 0xfffffffc);
++ data.anint = dslhal_support_byteSwap32(anword);
++
++ /************************************
++ * there is no need for case 0 *
++ * notice that there are no breaks *
++ * each falls through to the next *
++ ************************************/
++
++ switch (src.anint & 3)
++ {
++ case 1:
++ /* use only byte[1-3] */
++ *(dst.cptr++) = data.byte[1];
++ src.anint++;
++ count--;
++ case 2:
++ /* use byte[2-3] */
++ if (count)
++ {
++ *(dst.cptr++) = data.byte[2];
++ src.anint++;
++ count--;
++ }
++ case 3:
++ /* use byte[3] */
++ if (count)
++ {
++ *(dst.cptr++) = data.byte[3];
++ src.anint++;
++ count--;
++ }
++ }
++ }
++
++ /* the src pointer should now be on a 32-bit boundary */
++ while (count > 3)
++ {
++ unsigned int anword;
++
++ anword=DSLHAL_REG32((unsigned int)src.cptr);
++
++ *dst.iptr = dslhal_support_byteSwap32(anword);
++ src.anint += 4; /* bump the address by four */
++ dst.iptr++; /* bump the data pointer by four */
++ count -= 4; /* decrement the byte count by four */
++ }
++
++ /*******************************
++ * if there's any count left *
++ * then we read the next word *
++ * and ignore the end of it *
++ *******************************/
++ if (count)
++ {
++ unsigned int anword;
++
++ anword= DSLHAL_REG32((unsigned int)src.cptr);
++ data.anint = dslhal_support_byteSwap32(anword);
++
++ /************************************
++ * there is no need for case 0 *
++ * notice that there are no breaks *
++ * each falls through to the next *
++ ************************************/
++ switch (count)
++ {
++ case 1:
++ /* use byte[0] */
++ *(dst.cptr++) = data.byte[0];
++ src.anint++;
++ count--;
++ break;
++ case 2:
++ /* use byte[0-1] */
++ *(dst.cptr++) = data.byte[0];
++ *(dst.cptr++) = data.byte[1];
++ src.anint +=2;
++ count -= 2;
++ break;
++ case 3:
++ /* use only byte[0-2] */
++ *(dst.cptr++) = data.byte[0];
++ *(dst.cptr++) = data.byte[1];
++ *(dst.cptr++) = data.byte[2];
++ src.anint +=3;
++ count -= 3;
++ break;
++ }
++ }
++ /* Exit Critical Section */
++ shim_osCriticalExit();
++
++ return DSLHAL_ERROR_NO_ERRORS;
++
++} /* end of dslhal_support_blockRead() */
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readDspMailbox
++*
++*********************************************************************************************
++* DESCRIPTION: Reads a message from the mailbox
++*
++* ARGUMENTS: int *pcmd Pointer to command read
++*
++* RETURNS: 0 if successful
++* 1 if no mail
++* NZ otherwise
++*
++*****************************************************************************************/
++
++int dslhal_support_readDspMailbox(tidsl_t *ptidsl, int *pcmd, int *ptag, int *pprm1, int *pprm2)
++{
++ int rc;
++ int cmd;
++ int tag;
++ int prm1;
++ int prm2;
++ unsigned char dspOutInx;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_mailboxControl_t mailboxControl;
++ DEV_HOST_dspHostMsg_t dspMailboxMsg[DEV_HOST_DSPQUEUE_LENGTH];
++
++ dprintf(6,"dslhal_support_readDspMailbox\n");
++
++ /* get the DSP main pointer */
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* Read in the command/response buffer */
++ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
++
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
++ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* Change the endianness of the Mailbox Pointer */
++ mailboxControl.dspMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.dspMsgBuf_p);
++
++ rc = dslhal_support_blockRead((PVOID)mailboxControl.dspMsgBuf_p,
++ &dspMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
++
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ /* Extract the command/response message index */
++ mailboxControl.hostInInx &= 7;
++ mailboxControl.hostOutInx &= 7;
++ mailboxControl.dspOutInx &= 7;
++ mailboxControl.dspInInx &= 7;
++
++
++ /* check for messages in the mailbox */
++
++ if (mailboxControl.dspOutInx == mailboxControl.dspInInx)
++ {
++ return DSLHAL_ERROR_MAILBOX_NOMAIL;
++ /* no messages to read */
++ }
++
++ /* use bDRESPOutInx as index to DRESPMsgBuf */
++
++ cmd = dspMailboxMsg[mailboxControl.dspOutInx].cmd;
++ tag = dspMailboxMsg[mailboxControl.dspOutInx].tag;
++ prm1= dspMailboxMsg[mailboxControl.dspOutInx].param1;
++ prm2= dspMailboxMsg[mailboxControl.dspOutInx].param2;
++
++ mailboxControl.dspOutInx++; /* increment count */
++ mailboxControl.dspOutInx &= 7; /* only two bits */
++
++ dspOutInx = mailboxControl.dspOutInx;
++
++ /* Read in the command response buffer again to take care of changes */
++ mailboxControl.dspOutInx = dspOutInx;
++ rc = dslhal_support_blockWrite(&mailboxControl.dspOutInx,
++ &dspOamSharedInterface.dspHostMailboxControl_p->dspOutInx, sizeof(BYTE));
++
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++
++ /* Is the input parameter address non-zero*/
++
++ if (pcmd)
++ {
++ *pcmd = cmd;
++ }
++ if (ptag)
++ {
++ *ptag = tag;
++ }
++ if (pprm1)
++ {
++ *pprm1 = prm1;
++ }
++ if (pprm2)
++ {
++ *pprm2 = prm2;
++ }
++
++ dprintf(6,"dslhal_support_readDspMailbox done\n");
++ dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);
++ dprintf(6,"dslhal_support_readDspMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
++ return DSLHAL_ERROR_NO_ERRORS;
++
++} /* end of dslhal_support_readDspMailbox() */
++
++/*******************************************************************************************
++* FUNCTION NAME: dslhal_support_writeHostMailbox
++*
++********************************************************************************************
++* DESCRIPTION: Send a message to a mailbox
++*
++* ARGUMENTS: int cmd command to write
++* int tag tag (currently unused)
++* int p1 parameter 1 (currently unused)
++* int p2 parameter 2 (currently unused)
++*
++* RETURNS: 0 if successful
++* NZ otherwise
++*
++*******************************************************************************************/
++
++int dslhal_support_writeHostMailbox(tidsl_t *ptidsl, int cmd, int tag, int p1, int p2)
++{
++ int rc;
++ int index;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_mailboxControl_t mailboxControl;
++ DEV_HOST_dspHostMsg_t hostMailboxMsg[DEV_HOST_HOSTQUEUE_LENGTH];
++ unsigned char hostInInx;
++
++ dprintf(6,"dslhal_support_writeHostMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
++
++ dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ /* Read in the command/response buffer */
++ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
++ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ /* Change the endianness of the Mailbox Control Pointer */
++ mailboxControl.hostMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.hostMsgBuf_p);
++ rc = dslhal_support_blockRead((PVOID)mailboxControl.hostMsgBuf_p,
++ &hostMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH));
++
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ /* Extract the command/response message index */
++ mailboxControl.hostInInx &= 7;
++ mailboxControl.hostOutInx &= 7;
++ mailboxControl.dspOutInx &= 7;
++ mailboxControl.dspInInx &= 7;
++
++ /* make sure there's room in the mailbox */
++
++ index = mailboxControl.hostInInx;
++ mailboxControl.hostInInx++;
++ mailboxControl.hostInInx &= 7;
++ hostInInx = mailboxControl.hostInInx;
++ if (mailboxControl.hostInInx == mailboxControl.hostOutInx)
++ {
++ /* mailbox is full */
++ return DSLHAL_ERROR_MAILBOX_OVERFLOW;
++ }
++
++ /* use bOCMDInInx as index to OCMDMsgBuf */
++ hostMailboxMsg[index].cmd = (BYTE) cmd;
++ hostMailboxMsg[index].tag = (BYTE) tag;
++ hostMailboxMsg[index].param1 = (BYTE) p1;
++ hostMailboxMsg[index].param2 = (BYTE) p2;
++ rc = dslhal_support_blockWrite(&hostMailboxMsg,
++ (PVOID)mailboxControl.hostMsgBuf_p,
++ sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH);
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockWrite failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ rc = dslhal_support_blockWrite(&mailboxControl,
++ &dspOamSharedInterface.dspHostMailboxControl_p,
++ sizeof(DEV_HOST_mailboxControl_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++ /* update the index */
++ mailboxControl.hostInInx = hostInInx;
++ rc = dslhal_support_blockWrite(&mailboxControl.hostInInx,
++ &dspOamSharedInterface.dspHostMailboxControl_p->hostInInx,
++ sizeof(BYTE));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++
++ dprintf(6,"dslhal_support_writeHostMailbox done\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++
++}
++/* end of dslhal_support_writeHostMailbox() */
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readTextMailbox
++*
++*********************************************************************************************
++* DESCRIPTION: Reads a message from the mailbox
++*
++* ARGUMENTS: int *pcmd Pointer to command read
++*
++* RETURNS: 0 if successful
++* 1 if no mail
++* NZ otherwise
++*
++*****************************************************************************************/
++
++int dslhal_support_readTextMailbox(tidsl_t *ptidsl, int *pmsg1, int *pmsg2)
++{
++ int rc;
++ unsigned int msg1;
++ unsigned int msg2;
++ unsigned char textOutInx;
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_mailboxControl_t mailboxControl;
++ DEV_HOST_textMsg_t textMailboxMsg[DEV_HOST_TEXTQUEUE_LENGTH];
++
++ dprintf(6,"dslhal_support_readTextMailbox\n");
++
++ /* get the DSP main pointer */
++
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
++
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* Read in the command/response buffer */
++ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
++
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p,
++ &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* Change the endianness of the Mailbox Pointer */
++ mailboxControl.textMsgBuf_p = (DEV_HOST_textMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.textMsgBuf_p);
++
++ rc = dslhal_support_blockRead((PVOID)mailboxControl.textMsgBuf_p,
++ &textMailboxMsg, (sizeof(DEV_HOST_textMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
++
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ /* Extract the command/response message index */
++
++ mailboxControl.textInInx &= 7;
++ mailboxControl.textOutInx &= 7;
++
++ /* check for messages in the mailbox */
++
++ if (mailboxControl.textOutInx == mailboxControl.textInInx)
++ {
++ return DSLHAL_ERROR_MAILBOX_NOMAIL;
++ /* no messages to read */
++ }
++
++ /* use bDRESPOutInx as index to DRESPMsgBuf */
++
++ msg1 = textMailboxMsg[mailboxControl.textOutInx].msgPart1;
++ msg2 = textMailboxMsg[mailboxControl.textOutInx].msgPart2;
++ msg1 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg1);
++ msg2 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg2);
++
++ mailboxControl.textOutInx++; /* increment count */
++ mailboxControl.textOutInx &= 7; /* only two bits */
++
++ textOutInx = mailboxControl.textOutInx;
++
++ /* Read in the command response buffer again to take care of changes */
++
++ mailboxControl.textOutInx = textOutInx;
++
++ rc = dslhal_support_blockWrite(&mailboxControl.textOutInx,
++ &dspOamSharedInterface.dspHostMailboxControl_p->textOutInx, sizeof(BYTE));
++
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++
++ /* Is the input parameter address non-zero*/
++
++ if (pmsg1)
++ {
++ *pmsg1 = msg1;
++ }
++ if (pmsg2)
++ {
++ *pmsg2 = msg2;
++ }
++
++ dprintf(6,"dslhal_support_readTextMailbox done\n");
++ dprintf(6,"msgPart1=%d, msgPart2=%d\n", msg1, msg2);
++ dprintf(6,"dslhal_support_readTextMailbox:Message Part1: 0x%x, tag=0x%x\n", msg1, msg2);
++ return DSLHAL_ERROR_NO_ERRORS;
++
++} /* end of dslhal_support_readTextMailbox() */
++
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_hostDspCodeDownload(tidsl_t * ptidsl)
++{
++
++ unsigned int index;
++ int rc = 0, i;
++ unsigned char *iptr; /* image pointer */
++ unsigned int numbytes,olayXfer,olayStore;
++ /* unsigned int holdSecPhyAddr=0,holdSecVirtAddr; */
++ unsigned int *olayStart;
++ size_t len; /* size of the file */
++ size_t expoffset; /* expected offset for next section header */
++ unsigned short checksum;
++ unsigned int crc32;
++ unsigned char * image;
++ char *tmp = (char *)DEV_HOST_DSP_OAM_POINTER_LOCATION;
++ DEV_HOST_dspVersionDef_t dspVersion;
++#if SWTC
++ DEV_HOST_tcHostCommDef_t TCHostCommDef;
++#endif
++ DEV_HOST_oamWrNegoParaDef_t OamWrNegoParaDef;
++ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface, *pdspOamSharedInterface;
++ DEV_HOST_olayDpDef_t olayDpParms;
++ DEV_HOST_profileBase_t profileList;
++#ifndef NO_ACT
++ DEV_HOST_consBufDef_t constDisp;
++#endif
++#if CO_PROFILES
++ DEV_HOST_coData_t coData;
++#endif
++ DEV_HOST_olayDpPageDef_t olayDpPageDef[NUM_PAGES];
++ union
++ {
++ char byte[4];
++ unsigned short hword[2];
++ unsigned int aword;
++ } data;
++
++ struct _header
++ {
++ char signature[6];
++ unsigned short sectcount;
++ unsigned int length;
++ } header;
++
++ struct _section
++ {
++ unsigned int addr;
++ unsigned int length;
++ unsigned int offset;
++ unsigned int page;
++ };/* section[MAXSECTIONS]; */
++
++ struct _section *sptr;
++ unsigned int secAddr, secLength, secOffset, secPage;
++
++
++ dprintf(5,"dslhal_support_hostDspCodeDownload\n");
++ image = ptidsl->fwimage;
++
++ if (!image)
++ {
++ dprintf(1,"no image file\n");
++ return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
++ }
++
++ iptr=image;
++
++ numbytes = sizeof(header);
++
++ shim_osMoveMemory((char *) &header, (char *)iptr, numbytes);
++ header.length = dslhal_support_byteSwap32(header.length);
++ header.sectcount = dslhal_support_byteSwap16(header.sectcount);
++#if 0
++ crc32 = dslhal_support_computeCrc32((unsigned char*)&crcTest[0],20);
++ dprintf(6,"CRC-32 for the crcTest: 0x%x",crc32);
++ dprintf(4,"header.length=%d, header.sectcount=0x%X\n", header.length, header.sectcount);
++#endif
++ /* point to the checksum */
++ /* compute the checksum on CRC32 here */
++ iptr = image + header.length-4;
++ numbytes = sizeof(data.aword);
++
++ dprintf(5,"tiload: check checksum\n");
++ shim_osMoveMemory((char *)&(data.byte), (char *)iptr, numbytes);
++
++ crc32 = dslhal_support_computeCrc32(image,ptidsl->imagesize);
++ dprintf(5,"CRC-32 for the Binary: 0x%x",crc32);
++ /* CRC currently not added to the DSP binary, so this code is commented out */
++ /*
++ data.aword = dslhal_support_byteSwap32(data.aword);
++ if (data.aword != crc32)
++ {
++ dprintf(1,"Checksum error\n");
++ }
++ */
++ /* Verify signature - Changed from "320C6x" to "TIDSL" for load 80 */
++
++ header.signature[5]='\0';
++ dprintf(5, "signature=%s\n", header.signature);
++
++ if (shim_osStringCmp(header.signature, "TIDSL"))
++ {
++ dprintf(1,"Signature not match\n");
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++
++ dprintf(5,"tiload: check sect count\n");
++ /* check section count */
++
++ if (header.sectcount > MAXSECTIONS)
++ {
++ dprintf(1,"Section # %d exceeds max %d\n", header.sectcount, MAXSECTIONS);
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++ else
++ {
++ dprintf(5,"found %d sections\n", header.sectcount);
++ }
++
++ /* Validation of Section offsets */
++
++ /* point to the first section */
++ len = header.length; /* file size in bytes */
++ expoffset = sizeof(struct _header) + header.sectcount * sizeof(struct _section);
++
++ dprintf(5,"tiload: check offset\n");
++ for (index=0; index<header.sectcount; index++) /* parse the sections one by one */
++ {
++ numbytes = sizeof(struct _header) + index * sizeof(struct _section); /* Compute Section Offset */
++ sptr = (struct _section *)(image + numbytes); /* Section Pointer to beginning of the section */
++
++ secAddr = dslhal_support_byteSwap32(sptr->addr);
++ secOffset = dslhal_support_byteSwap32(sptr->offset);
++ secLength = dslhal_support_byteSwap32(sptr->length);
++ secPage = dslhal_support_byteSwap32(sptr->page);
++
++ /* validate offset */
++ if ( secOffset== 0xffffffff)
++ {
++ /* special case: zero fill */
++ /* offset is valid, don't change expoffset */
++ }
++ else
++ {
++ if (secOffset > len-4)
++ {
++ dprintf(5,"Offset error\n");
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++
++ /* determine expected offset of NEXT section */
++ expoffset = secLength + secOffset;
++
++ /* all addresses must be on word boundaries */
++ if (secAddr & 3)
++ {
++
++ }
++ }
++ }
++
++ /* check final offset - should just be a checksum left */
++/* IMPORTANT 11/24/02 --> Got this error... but bypassed for Pf of Concept*/
++ /*
++ if (expoffset != len-4)
++ {
++ dprintf(5,"Final offset error\n");
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++ */
++
++ /* Actual Code loading to DSP Memory */
++
++ /* Initialize DSP Data Memory before code load*/
++ dprintf(5,"Zero Prefill DSP DMEM\n");
++ DSLHAL_REG32(ADSLSSADR)=0x80000000;
++ shim_osZeroMemory((char *)0xa1000000, 0x10000);
++ /* Load sections from the image */
++ for (index=0; index<header.sectcount; index++) /* Parse each section */
++ {
++ numbytes = sizeof(header) + index * sizeof(struct _section); /* Compute offset to next section */
++ sptr = (struct _section *)(image + numbytes); /* Point to next section */
++
++ secAddr = dslhal_support_byteSwap32(sptr->addr);
++ secOffset = dslhal_support_byteSwap32(sptr->offset);
++ secLength = dslhal_support_byteSwap32(sptr->length);
++ secPage = dslhal_support_byteSwap32(sptr->page);
++
++ data.aword = secAddr;
++ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
++
++ data.aword = secLength;
++ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
++
++ data.aword = secOffset;
++ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
++
++ data.aword = secPage;
++ checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
++
++
++ /* validate offset */
++ if (secOffset == 0xffffffff)
++ {
++ /* special case: zero fill */
++ /* offset is valid, don't change expoffset */
++ }
++ else
++ {
++ /* real offset */
++ if(secOffset > len-4)
++ {
++ dprintf(5,"section[%u] offset too big (%X/%X)\n", index,
++ secOffset, len-4);
++
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++
++ /* determine expected offset of NEXT section */
++ expoffset = secLength + secOffset;
++
++ }
++
++ }
++
++ /* check final offset - should just be a checksum left */
++ /*
++ if(expoffset != len-4)
++ {
++ dprintf(1,"sections don't span full file (%X/%X)\n",expoffset,len-2);
++ return DSLHAL_ERROR_FIRMWARE_OFFSET;
++ }
++ */
++ dprintf(5,"tiload: load binary\n");
++
++ for (index=0; index<header.sectcount; index++)
++ {
++ numbytes = sizeof(header) + index * sizeof(struct _section);
++ sptr = (struct _section *)(image + numbytes);
++
++ secAddr = dslhal_support_byteSwap32(sptr->addr);
++ secOffset = dslhal_support_byteSwap32(sptr->offset);
++ secLength = dslhal_support_byteSwap32(sptr->length);
++ secPage = dslhal_support_byteSwap32(sptr->page);
++ dprintf(5,"loading section %u\n", index);
++ dprintf(5,"section %u: addr: %X\n", index, secAddr);
++ dprintf(5,"section %u: length: %X\n", index, secLength);
++ dprintf(5,"section %u: offset: %X\n", index, secOffset);
++ dprintf(5,"section %u: page: %X\n", index, secPage);
++
++ /* point to the section's data */
++ if(secOffset != 0xffffffff)
++ {
++ /* Load this section of data */
++ iptr = image + secOffset;
++ dprintf(6, "iptr %8x\n", (unsigned int)iptr);
++ }
++
++ if(secPage)
++ {
++ dprintf(6,"OVERLAY PAGE #%d\n",secPage);
++ /* overlay page, don't write to dsp yet, save into host memory*/
++
++ dprintf(6,"Section Length: %d \n",secLength);
++ ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
++ if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
++ {
++ dprintf(1, "overlay page allocate error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++#ifdef PRE_SILICON
++ ptidsl->olayDpPage[secPage].overlayHostAddr = ((((ptidsl->olayDpPage[secPage].PmemStartWtAddr)-0x84000000)-0x10000000)+0x030b0000);
++#else
++ /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
++ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
++#endif
++ dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
++
++ ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
++ ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
++ ptidsl->olayDpPage[secPage].BinAddr = secAddr;
++ ptidsl->olayDpPage[secPage].SecOffset = secOffset;
++ shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
++ /* RamP Image ByteSwap test */
++ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
++
++ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
++ {
++ olayStore = *(unsigned int *)olayStart;
++ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
++ *(unsigned int*)olayStart = olayStore;
++ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
++ olayStart++;
++ olayStore=0;
++ }
++ /* RamP Image ByteSwap test */
++ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
++ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
++ ptidsl->olayDpPage[secPage].olayPageCrc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
++
++ shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
++ }
++ else
++ {
++ rc = secAddr&0xff000000;
++ if(rc && rc!=0x80000000)
++ {
++ dprintf(4,"Not DSP PMEM/DMEM\n");
++ /* don't write to dsp, save into host memory*/
++ dprintf(4,"Section Addr: %x Section Length: %d \n",secAddr,secLength);
++ ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
++ if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
++ {
++ dprintf(1, "memory allocate error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++ ptidsl->coProfiles.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
++ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
++ ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
++ ptidsl->coProfiles.OverlayXferCount = secLength;
++ ptidsl->coProfiles.BinAddr = secAddr;
++ ptidsl->coProfiles.SecOffset = secOffset;
++
++ shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);
++ /* RamP Image ByteSwap test */
++ olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
++
++ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
++ {
++ olayStore = *(unsigned int *)olayStart;
++ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
++ *(unsigned int*)olayStart = olayStore;
++ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
++ olayStart++;
++ olayStore=0;
++ }
++ shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
++ }
++ else
++ {
++ /* IMPORTANT: write image to DSP memory */
++ rc=dslhal_support_blockWrite((void *)iptr, (void *)secAddr, secLength);
++ if(rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ shim_osClockWait(0x50000);
++ /*
++ rc=dslhal_support_blockRead((void*)secAddr, (void*)tmpBuffer, secLength);
++ if(rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ for(i=0;i<secLength;i++)
++ {
++ if(*iptr
++ }*/
++ }
++ }
++ } /* end of write dsp image */
++
++ /***********************************************************************************
++ * Start to fillup various values to our hardware structure for late use
++ ************************************************************************************/
++
++ /* get main pointer for data */
++
++ rc = dslhal_support_blockRead(tmp, &pdspOamSharedInterface, sizeof(unsigned int));
++ dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
++ pdspOamSharedInterface= (DEV_HOST_dspOamSharedInterface_t *)dslhal_support_byteSwap32((unsigned int)pdspOamSharedInterface);
++ dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ if(!pdspOamSharedInterface)
++ {
++ dprintf(1,"Couldn't read main pointer\n");
++ return DSLHAL_ERROR_INVALID_PARAM;
++ }
++
++ ptidsl->pmainAddr=pdspOamSharedInterface;
++
++ /* read the OamSharedInterfaceStructure */
++
++ dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
++
++ /* get the pointer to DSP-OAM Shared Interface */
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
++
++ /* Change the Endianness of the profileList pointer */
++ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
++ /* Access the profileList Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ dprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr);
++ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
++ rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++
++ /* Communicate the Allocated Memory Address to DSP to do overlays */
++
++ /* Change the Endianness of the olayDpDef pointer */
++ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
++ /* Access the olayDpDef Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++
++ for(i=1;i<NUM_PAGES;i++)
++ {
++ /* Change the endianness of the olayDpPageDef Pointer */
++ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
++ /* Access the olayDpPageDef Structure */
++ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
++ rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++ }
++
++ /* Change the endianness of the Datapump Version Pointer */
++ dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
++
++ /* get DSPVersion itself */
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,&dspVersion, sizeof(DEV_HOST_dspVersionDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* table_dsp info */
++#if SWTC
++ dspOamSharedInterface.tcHostComm_p = (DEV_HOST_tcHostCommDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
++ rc = dslhal_support_blockRead(&pdspOamSharedInterface->tcHostComm_p,
++ &pTCHostCommDef, 4);
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ pTCHostCommDef=(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)pTCHostCommDef);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p,
++ &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++#endif
++ /* Select the Multimode Training */
++ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, &OamWrNegoParaDef, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++switch(dspVersion.netService)
++ {
++ case 1: OamWrNegoParaDef.stdMode = MULTI_MODE;
++ dprintf(5,"POTS Service \n");
++ ptidsl->netService = 1;
++ break;
++ case 2: OamWrNegoParaDef.stdMode = GDMT_MODE;
++ dprintf(5,"ISDN Service \n");
++ ptidsl->netService = 2;
++ break;
++ default: OamWrNegoParaDef.stdMode = T1413_MODE;
++ dprintf(5,"Default Service \n");
++ break;
++ }
++
++ ptidsl->AppData.StdMode = (unsigned int)OamWrNegoParaDef.stdMode;
++
++ OamWrNegoParaDef.oamFeature = dslhal_support_byteSwap32((OAMFEATURE_TC_SYNC_DETECT_MASK));
++ /* Set the flag to start retraining if the margin of the modem drops below
++ default margin during showtime */
++
++ OamWrNegoParaDef.marginMonitorShwtme = FALSE;
++ /* Set the flag to start retraining if the margin of the modem drops below default margin during training */
++
++ OamWrNegoParaDef.marginMonitorTrning = FALSE;
++ OamWrNegoParaDef.dsToneTurnoff_f = 0;
++ dslhal_support_blockWrite(&OamWrNegoParaDef,
++ (PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
++ rc=dslhal_support_setInterruptMask(ptidsl,0);
++ if(rc!=DSLHAL_ERROR_NO_ERRORS)
++ return rc;
++ /* Co Profile Test */
++#if CO_PROFILES
++ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
++ /* Access the profileList Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p);
++ rc = dslhal_support_blockRead((PVOID)profileList.hostProfileBase_p,&coData, sizeof(DEV_HOST_coData_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ dprintf(2,"Current Profile Vendor Id: %x \n",coData.phyAgcPgaTarget);
++ coData.phyAgcPgaTarget = 0xcaba;
++ rc = dslhal_support_blockWrite(&coData,(PVOID)profileList.hostProfileBase_p,sizeof(DEV_HOST_coData_t));
++ if(rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++#endif
++ /* End of CO Profile Test */
++
++#ifndef NO_ACT
++ /* Constellation Display Buffer Allocate */
++ ptidsl->constDisplay.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(DSP_CONSTELLATION_BUFFER_SIZE);
++ if(ptidsl->constDisplay.PmemStartWtAddr == NULL)
++ {
++ dprintf(1, "memory allocate error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++ shim_osZeroMemory((void*)ptidsl->constDisplay.PmemStartWtAddr,DSP_CONSTELLATION_BUFFER_SIZE);
++ ptidsl->constDisplay.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->constDisplay.PmemStartWtAddr);
++ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.overlayHostAddr);
++ ptidsl->constDisplay.OverlayXferCount = DSP_CONSTELLATION_BUFFER_SIZE;
++
++ /* Communicate the Allocated Buffer for DSP load Constellation Data */
++
++ /* Change the Endianness of the profileList pointer */
++ dspOamSharedInterface.consDispVar_p = (DEV_HOST_consBufDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.consDispVar_p);
++ /* Access the profileList Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.consDispVar_p,&constDisp, sizeof(DEV_HOST_consBufDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ dprintf(2,"Constellation Old Addr:%x New: %x \n",constDisp.consDispStartAddr,ptidsl->constDisplay.overlayHostAddr);
++ constDisp.consDispStartAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->constDisplay.overlayHostAddr);
++ constDisp.consDispCurrentAddr = constDisp.consDispStartAddr;
++ constDisp.consDispBufLen = (unsigned int)dslhal_support_byteSwap32(DSP_CONSTELLATION_BUFFER_SIZE);
++ rc = dslhal_support_blockWrite(&constDisp,(PVOID)dspOamSharedInterface.consDispVar_p,sizeof(DEV_HOST_consBufDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++#endif
++ dprintf(5,"dslhal_support_hostDspCodeDownload() completed.\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++
++} /* end of dslhal_support_hostDspCodeDownload() */
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readDelineationState()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_readDelineationState(tidsl_t * ptidsl)
++{
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_atmStats_t atmStats;
++ DEV_HOST_dsAtmStats_t dsAtmStats0;
++ unsigned int rc=0, delinState=0;
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
++
++ rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
++
++ if (rc)
++ return rc;
++ delinState = dslhal_support_byteSwap32(dsAtmStats0.delineationState);
++ if(delinState == TC_SYNC)
++ ptidsl->lConnected = 1;
++ else
++ ptidsl->lConnected = 0;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_processModemStateBitField()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_processModemStateBitField(tidsl_t * ptidsl)
++{
++ int rc, offset[2]={2,0};
++ int modemStateBitFields[NUMBER_OF_BITFIELDS],changedField=0;
++ rc = dslhal_api_dspInterfaceRead(ptidsl,(unsigned int)ptidsl->pmainAddr,2,(unsigned int *)&offset,
++ (unsigned char *)&modemStateBitFields,NUMBER_OF_BITFIELDS*sizeof(int));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ for(rc=0;rc<NUMBER_OF_BITFIELDS;rc++)
++ dprintf(4,"Bit Field %d: 0x%x \n",rc+1,dslhal_support_byteSwap32((unsigned int)modemStateBitFields[rc]));
++
++ for(rc=NUMBER_OF_BITFIELDS;rc>0;rc--)
++ {
++ if(ptidsl->modemStateBitField[rc-1]!=modemStateBitFields[rc-1])
++ {
++ changedField = rc;
++ break;
++ }
++ }
++ if(changedField)
++ {
++ for(rc=0;rc<32;rc++)
++ {
++ if(modemStateBitFields[changedField-1] & dslhal_support_byteSwap32((BITFIELD_SCAN >> rc)))
++ break;
++ }
++ dprintf(5,"Changed Field : %d Changed Bit : %d \n",changedField,(31-rc));
++ ptidsl->rState = ((changedField*100) + (31-rc));
++ dprintf(5,"Modem State : %d \n",ptidsl->rState);
++ shim_osMoveMemory((void *)ptidsl->modemStateBitField,(void *)modemStateBitFields, 4*NUMBER_OF_BITFIELDS);
++ }
++
++ switch(changedField)
++ {
++ case 1: if((ptidsl->rState >= ATU_RIDLE) && (ptidsl->AppData.bState < RSTATE_IDLE))
++ ptidsl->AppData.bState = RSTATE_IDLE;
++ if((ptidsl->rState >= GDMT_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
++ ptidsl->AppData.bState = RSTATE_INIT;
++ if((ptidsl->rState >= GDMT_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
++ ptidsl->AppData.bState = RSTATE_HS;
++ break;
++
++ case 2: if((ptidsl->rState >= T1413_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
++ ptidsl->AppData.bState = RSTATE_INIT;
++ if((ptidsl->rState >= T1413_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
++ ptidsl->AppData.bState = RSTATE_HS;
++ if((ptidsl->rState == ATU_RSHOWTIME) && (ptidsl->AppData.bState < RSTATE_SHOWTIME))
++ ptidsl->AppData.bState = RSTATE_SHOWTIME;
++ break;
++
++ case 3: if((ptidsl->rState >= ADSL2_COMB3) && (ptidsl->AppData.bState < RSTATE_INIT))
++ ptidsl->AppData.bState = RSTATE_INIT;
++ if((ptidsl->rState >= ADSL2_RPARAMS) && (ptidsl->AppData.bState < RSTATE_HS))
++ ptidsl->AppData.bState = RSTATE_HS;
++ break;
++
++ case 4: break;
++ default: break;
++ }
++
++ ptidsl->stateTransition = modemStateBitFields[1];
++ switch(ptidsl->AppData.bState)
++ {
++ case RSTATE_IDLE: ptidsl->AppData.idleTick=shim_osClockTick();
++ ptidsl->AppData.initTick=0;
++ ptidsl->AppData.showtimeTick=0;
++ break;
++ case RSTATE_HS: if(!ptidsl->AppData.initTick)
++ {
++ ptidsl->AppData.initTick=shim_osClockTick();
++ }
++ ptidsl->AppData.showtimeTick=0;
++ break;
++ case RSTATE_SHOWTIME: if(!ptidsl->AppData.showtimeTick)
++ ptidsl->AppData.showtimeTick=shim_osClockTick();
++ break;
++ default: break;
++ }
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_setInterruptMask()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_setInterruptMask(tidsl_t * ptidsl,unsigned int inputMask)
++{
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_hostInterruptMask_t interruptMask;
++ unsigned int rc=0;
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ dspOamSharedInterface.hostInterruptMask_p =(DEV_HOST_hostInterruptMask_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptMask_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptMask_p,
++ &interruptMask, sizeof(DEV_HOST_hostInterruptMask_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ if(inputMask & MASK_MAILBOX_INTERRUPTS)
++ {
++ dprintf(7,"Mailbox Interrupts Masked \n");
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS);
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ }
++ if(inputMask & MASK_BITFIELD_INTERRUPTS)
++ {
++ dprintf(7,"Bit field Interrupts Masked \n");
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS);
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ }
++ if(inputMask & MASK_HEARTBEAT_INTERRUPTS)
++ {
++ dprintf(7,"Bit field Interrupts Masked \n");
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS);
++ dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
++ }
++ dslhal_support_blockWrite(&interruptMask,
++ dspOamSharedInterface.hostInterruptMask_p, sizeof(DEV_HOST_hostInterruptMask_t));
++ dprintf(5,"dslhal_support_setInterruptMask() completed.\n");
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_parseInterruptSource()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Parses the Interrupt Source Bit Field
++*
++* Return: interrupt Code if successful
++* negative error code if failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl)
++{
++ DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
++ DEV_HOST_hostInterruptSource_t interruptSource;
++ unsigned int rc=0,intrCode=0;
++ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return (0-DSLHAL_ERROR_BLOCK_READ);
++ }
++ dspOamSharedInterface.hostInterruptSource_p =(DEV_HOST_hostInterruptSource_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptSource_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptSource_p,
++ &interruptSource, sizeof(DEV_HOST_hostInterruptSource_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return (0-DSLHAL_ERROR_BLOCK_READ);
++ }
++ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS))
++ {
++ dprintf(7,"Mailbox Interrupts Acknowledge \n");
++ intrCode |= 0x00000011;
++ }
++ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS))
++ {
++ dprintf(7,"Bit field Interrupt Acknowledge \n");
++ intrCode |= 0x00001002;
++ }
++ if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS))
++ {
++ dprintf(7,"HeartBeat Interrupt Acknowledge \n");
++ intrCode |= 0x00100004;
++ }
++
++ interruptSource.sourceBitField1 &=0x0;
++ rc=dslhal_support_blockWrite(&interruptSource,
++ dspOamSharedInterface.hostInterruptSource_p, sizeof(DEV_HOST_hostInterruptSource_t));
++ if(rc)
++ return (0-DSLHAL_ERROR_BLOCK_WRITE);
++ dprintf(5,"dslhal_support_parseInterruptSource() completed.\n");
++ return intrCode;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_byteSwap16()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* input 16 bit short, byte swap from little endian to big endian or vise versa
++*
++********************************************************************************************/
++
++unsigned short dslhal_support_byteSwap16(unsigned short in16Bits)
++{
++ unsigned short out16Bits;
++
++#ifdef EB
++ unsigned char *pchar;
++ unsigned char tmp;
++#endif
++
++ out16Bits = in16Bits;
++
++#ifdef EB
++ pchar = (unsigned char *)(&out16Bits);
++
++ tmp = *pchar;
++ *pchar = *(pchar + 1);
++ *(pchar + 1) = tmp;
++#endif
++
++ return out16Bits;
++
++} /* end of dslhal_support_byteSwap16() */
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_byteSwap32()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* input 32 bit int, byte swap from little endian to big endian or vise versa
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_byteSwap32(unsigned int in32Bits)
++{
++ int out32Bits;
++
++#ifdef EB
++ unsigned char tmp;
++ unsigned char *pchar;
++#endif
++
++ out32Bits = in32Bits;
++
++#ifdef EB
++ pchar = (unsigned char *)(&out32Bits);
++
++ tmp = *pchar;
++ *pchar = *(pchar + 3);
++ *(pchar + 3) = tmp;
++
++ tmp = *(pchar + 1);
++ *(pchar + 1) = *(pchar + 2);
++ *(pchar + 2) = tmp;
++#endif
++
++ return out32Bits;
++
++} /* end of dslhal_support_byteSwap32() */
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_computeCrc32()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data
++*
++* Return: 32 bit CRC of the input data
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_computeCrc32(unsigned char *data, int len)
++{
++ unsigned int result;
++ int i,j;
++ unsigned char octet;
++
++ if ((len < 4) || (data==NULL))
++ return(0xdeaddead);
++ result = *data++ << 24;
++ result |= *data++ << 16;
++ result |= *data++ << 8;
++ result |= *data++;
++ result = ~ result;
++
++ len -=4;
++
++ for (i=0; i<len; i++)
++ {
++ octet = *(data++);
++ for (j=0; j<8; j++)
++ {
++ if (result & 0x80000000)
++ {
++ result = (result << 1) ^ CRC32_QUOTIENT ^ (octet >> 7);
++ }
++ else
++ {
++ result = (result << 1) ^ (octet >> 7);
++ }
++ octet <<= 1;
++ }
++ }
++ return ~result; /* The complement of the remainder */
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_checkOverlayPage()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_checkOverlayPage(tidsl_t *ptidsl, unsigned int tag)
++{
++ unsigned int computedCrc;
++ if((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr == NULL)
++ {
++ dprintf(5,"Null Address for Page: %d\n",tag);
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++ computedCrc = dslhal_support_computeCrc32((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr, ptidsl->olayDpPage[tag].OverlayXferCount);
++ dprintf(6,"\n Pre-Computed CRC32 = 0x%x \t Current CRC32 = 0x%x \n",ptidsl->olayDpPage[tag].olayPageCrc32,computedCrc);
++ if(computedCrc != ptidsl->olayDpPage[tag].olayPageCrc32)
++ return DSLHAL_ERROR_OVERLAY_CORRUPTED;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_clearTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_clearTrainingInfo(tidsl_t *ptidsl)
++{
++ int i;
++
++ for(i=0; i<NUM_PAGES; i++)
++ {
++ if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
++ {
++ shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr,
++ ptidsl->olayDpPage[i].OverlayXferCount);
++ ptidsl->olayDpPage[i].PmemStartWtAddr =NULL;
++ }
++ }
++ if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
++ {
++ shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
++ ptidsl->coProfiles.PmemStartWtAddr = NULL;
++ }
++ return 0;
++}
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Reload overlay pages from flash or memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl)
++{
++
++ int rc = 0, i;
++ unsigned int olayXfer,olayStore;
++ unsigned int *olayStart;
++
++ unsigned int crc32;
++ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
++ DEV_HOST_olayDpDef_t olayDpParms;
++ DEV_HOST_olayDpPageDef_t olayDpPageDef[NUM_PAGES];
++ DEV_HOST_profileBase_t profileList;
++
++ unsigned int secLength, secOffset, secPage;
++
++ /* co profile */
++ secLength = ptidsl->coProfiles.OverlayXferCount;
++ secOffset = ptidsl->coProfiles.SecOffset;
++ ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
++ if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
++ {
++ dprintf(1, "memory allocate error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++ /* holdSecPhyAddr = virtual2Physical((unsigned int)holdSecVirtAddr); */
++ ptidsl->coProfiles.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
++ dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
++ ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
++
++ rc = shim_read_overlay_page((void *)ptidsl->coProfiles.PmemStartWtAddr, secOffset, secLength);
++ if(rc != secLength)
++ {
++ dprintf(1, "shim_read_overlay_page failed\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++
++ /*shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);*/
++ /* RamP Image ByteSwap test */
++ olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
++
++ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
++ {
++ olayStore = *(unsigned int *)olayStart;
++ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
++ *(unsigned int*)olayStart = olayStore;
++ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
++ olayStart++;
++ olayStore=0;
++ }
++ shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
++
++
++ for (secPage=1;secPage<NUM_PAGES; secPage++)
++ {
++
++ dprintf(6,"OVERLAY PAGE #%d\n",secPage);
++
++ secLength = ptidsl->olayDpPage[secPage].OverlayXferCount;
++
++ dprintf(4,"Section[%d] Length: %d \n",secPage, secLength);
++
++ secOffset = ptidsl->olayDpPage[secPage].SecOffset;
++ ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
++ if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
++ {
++ dprintf(1, "overlay page allocate error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++
++ rc = shim_read_overlay_page((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr,secOffset, secLength);
++ if(rc != secLength)
++ {
++ dprintf(1, "overlay page read error\n");
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++ }
++
++ /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
++ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
++ dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
++
++ ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
++ /*ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
++ ptidsl->olayDpPage[secPage].BinAddr = secAddr;
++ shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
++ */
++ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
++
++ for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
++ {
++ olayStore = *(unsigned int *)olayStart;
++ olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
++ *(unsigned int*)olayStart = olayStore;
++ dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
++ olayStart++;
++ olayStore=0;
++ }
++ /* RamP Image ByteSwap test */
++ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
++ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
++ crc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
++ if(crc32 != ptidsl->olayDpPage[secPage].olayPageCrc32)
++ return DSLHAL_ERROR_OVERLAY_MALLOC;
++
++ shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
++ }
++
++
++ dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
++
++ /* get the pointer to DSP-OAM Shared Interface */
++ rc = dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,
++ sizeof(DEV_HOST_dspOamSharedInterface_t));
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
++
++ /* Change the Endianness of the profileList pointer */
++ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
++ /* Access the profileList Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++ dprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr);
++ profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
++ rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++
++ /* Communicate the Allocated Memory Address to DSP to do overlays */
++
++ /* Change the Endianness of the olayDpDef pointer */
++ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
++ /* Access the olayDpDef Structure */
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++
++ for(i=1;i<NUM_PAGES;i++)
++ {
++ /* Change the endianness of the olayDpPageDef Pointer */
++ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
++ /* Access the olayDpPageDef Structure */
++ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
++ rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_WRITE;
++ }
++
++ ptidsl->bOverlayPageLoaded = 1;
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++ /* end of dslhal_support_reloadTrainingInfo() */
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++
++int dslhal_support_restoreTrainingInfo(tidsl_t *ptidsl)
++{
++ int rc;
++
++ rc=1;
++ while(rc != 0)
++ {
++ dslhal_support_clearTrainingInfo(ptidsl);
++ //shim_osCriticalEnter();
++ rc = dslhal_support_reloadTrainingInfo(ptidsl);
++ //shim_osCriticalExit();
++ shim_osClockWait(6400);
++ }
++ return 0;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Idle State Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl)
++{
++ int rc=0;
++ ptidsl->AppData.bState = RSTATE_IDLE;
++#ifndef NO_ACT
++ rc += dslhal_advcfg_resetBitSwapMessageLog(ptidsl,0);
++ rc += dslhal_advcfg_resetBitSwapMessageLog(ptidsl,1);
++ rc += dslhal_advcfg_resetTrainStateHistory(ptidsl);
++ rc += dslhal_advcfg_getReasonForDrop(ptidsl);
++#endif
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Idle State Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs)
++{
++ int rc=0;
++#ifndef NO_ACT
++ int i;
++ int differentCmd_f;
++ unsigned int dsSwapInx;
++
++ static UINT8 lastAturBitSwapCommands[6] = {0, 0, 0, 0, 0, 0};
++ static UINT8 lastAturBitSwapBinNum[6] = {0, 0, 0, 0, 0, 0};
++
++ if (usDs == 0)
++ {
++ dprintf(4," DSP_XMITBITSWAP\n");
++ rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,0);
++ ptidsl->usBitSwapInx++;
++ if (ptidsl->usBitSwapInx > 29)
++ ptidsl->usBitSwapInx=0;
++ }
++
++ if (usDs == 1)
++ {
++ dprintf(4," DSP_RCVBITSWAP\n");
++ rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,1);
++ differentCmd_f = FALSE;
++ dsSwapInx = ptidsl->dsBitSwapInx;
++ if (! rc)
++ {
++ for (i = 0; i < 6; i++)
++ {
++ if (lastAturBitSwapCommands[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand[i])
++ {
++ differentCmd_f = TRUE;
++ break;
++ }
++ }
++ if (! differentCmd_f)
++ {
++ for (i = 0; i < 6; i++)
++ {
++ if (lastAturBitSwapBinNum[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum[i])
++ {
++ differentCmd_f = TRUE;
++ break;
++ }
++ }
++ }
++ //CPE data pump seems to occasionally send us the same bit swap twice in a row with different sframe counter.
++ //Since these are never counted twice by the debug output of AC5, we should not count them twice either.
++ //So, we ignore the sframe_counter in determining whether the most recent bitswap is a duplicate.
++ if (differentCmd_f)
++ {
++ shim_osMoveMemory((void *)lastAturBitSwapCommands, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand, 6);
++ shim_osMoveMemory((void *)lastAturBitSwapBinNum, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum, 6);
++ ptidsl->dsBitSwapInx++;
++ if (ptidsl->dsBitSwapInx > 29)
++ ptidsl->dsBitSwapInx = 0;
++ }
++ }
++ }
++#endif
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherEocMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced EOC Buffering functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2)
++{
++ int rc=0;
++#ifndef NO_ACT
++ rc = dslhal_advcfg_logEocMessages(ptidsl,usDs, msgPart1, msgPart2);
++#endif
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Snr per bin buffering Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParam)
++{
++ int rc=0;
++#ifndef NO_ACT
++ rc = dslhal_advcfg_getSnrPerBin(ptidsl,snrParam);
++#endif
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_processTrainingState()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Training State Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl)
++{
++ int rc=0;
++#ifndef NO_ACT
++
++ if(ptidsl->trainStateInx<120)
++ {
++ rc = dslhal_advcfg_getTrainingState(ptidsl,(void *)&ptidsl->trainHistory[ptidsl->trainStateInx++]);
++ if(ptidsl->trainHistory[(ptidsl->trainStateInx-1)].subStateIndex ==
++ ptidsl->trainHistory[(ptidsl->trainStateInx-2)].subStateIndex)
++ ptidsl->trainStateInx--;
++ }
++ else
++ ptidsl->trainStateInx = 0;
++#endif
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Gathers ADSL2 Training Messages
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int tag, int param1, int param2)
++{
++ int rc=0;
++ unsigned int adsl2MsgLoc;
++ switch(tag)
++ {
++ case CMSGFMT_INDEX:
++ dprintf(5,"C-Msg-FMT rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSGFMT_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsgFmt,CMSGFMT_SIZE);
++ break;
++ case RMSGFMT_INDEX:
++ case RMSGFMT2_INDEX:
++ dprintf(5,"R-Msg-FMT rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSGFMT_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.rMsgFmt,RMSGFMT_SIZE);
++ break;
++ case CMSGPCB_INDEX:
++ dprintf(5,"C-Msg-PCB rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSGPCB_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB_SIZE);
++ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB_SIZE;
++ break;
++ case CMSGPCB2_INDEX:
++ dprintf(5,"C-Msg-PCB2 rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSGPCB2_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2_SIZE);
++ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2_SIZE;
++#ifndef NO_ACT
++ rc += dslhal_advcfg_setBlackOutBits(ptidsl);
++#endif
++ break;
++ case CMSGPCB2L_INDEX:
++ dprintf(5,"C-Msg-PCB2L rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSGPCB2L_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2L_SIZE);
++ ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2L_SIZE;
++ break;
++ case RMSGPCB_INDEX:
++ case RMSGPCB2L_INDEX:
++ dprintf(5,"R-Msg-PCB rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSGPCB_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB_SIZE);
++ ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB_SIZE;
++ break;
++
++ case CMSG1ADSL2_INDEX:
++ dprintf(5,"C-Msg1 rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG1ADSL2_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsg1,CMSG1ADSL2_SIZE);
++ ptidsl->adsl2TrainingMessages.cMsg1Len = CMSG1ADSL2_SIZE;
++ break;
++ case CMSG2ADSL2_INDEX:
++ dprintf(5,"C-Msg2 rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG2ADSL2_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cMsg2,CMSG2ADSL2_SIZE);
++ ptidsl->adsl2TrainingMessages.cMsg2Len = CMSG2ADSL2_SIZE;
++ break;
++ case RMSG1ADSL2_INDEX:
++ dprintf(5,"R-Msg1 rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG1ADSL2_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.rMsg1,RMSG1ADSL2_SIZE);
++ ptidsl->adsl2TrainingMessages.rMsg1Len = RMSG1ADSL2_SIZE;
++ break;
++ case RMSG2ADSL2_INDEX:
++ dprintf(5,"R-Msg2 rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG2ADSL2_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.rMsg2,RMSG2ADSL2_SIZE);
++ ptidsl->adsl2TrainingMessages.rMsg2Len = RMSG2ADSL2_SIZE;
++ break;
++ case CPARAMS_INDEX:
++ dprintf(5,"C-Params rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CPARAMS_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.cParams,CPARAMS_SIZE);
++ ptidsl->adsl2TrainingMessages.cParamsLen = CPARAMS_SIZE;
++ break;
++ case RPARAMS_INDEX:
++ dprintf(5,"R-Params rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RPARAMS_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2TrainingMessages.rParams,RPARAMS_SIZE);
++ ptidsl->adsl2TrainingMessages.rParamsLen = RPARAMS_SIZE;
++ break;
++ case RMSG1LD_INDEX:
++ dprintf(5,"R-Msg1 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG1LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg1Ld,RMSG1LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsg1LdLen = RMSG1LD_SIZE;
++ break;
++ case RMSG2LD_INDEX:
++ dprintf(5,"R-Msg2 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG2LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg2Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG3LD_INDEX:
++ dprintf(5,"R-Msg3 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG3LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg3Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG4LD_INDEX:
++ dprintf(5,"R-Msg4 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG4LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg4Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG5LD_INDEX:
++ dprintf(5,"R-Msg5 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG5LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg5Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG6LD_INDEX:
++ dprintf(5,"R-Msg6 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG6LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg6Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG7LD_INDEX:
++ dprintf(5,"R-Msg7 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG7LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg7Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG8LD_INDEX:
++ dprintf(5,"R-Msg8 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG8LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg8Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case RMSG9LD_INDEX:
++ dprintf(5,"R-Msg9 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, RMSG9LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.rMsg9Ld,RMSGxLD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
++ break;
++ case CMSG1LD_INDEX:
++ dprintf(5,"C-Msg1 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG1LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.cMsg1Ld,CMSG1LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.cMsg1LdLen = CMSG1LD_SIZE;
++ break;
++ case CMSG2LD_INDEX:
++ dprintf(5,"C-Msg2 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG2LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.cMsg2Ld,CMSG2LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.cMsg2LdLen = CMSG2LD_SIZE;
++ break;
++ case CMSG3LD_INDEX:
++ dprintf(5,"C-Msg3 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG3LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.cMsg3Ld,CMSG3LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.cMsg3LdLen = CMSG3LD_SIZE;
++ break;
++ case CMSG4LD_INDEX:
++ dprintf(5,"C-Msg4 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG4LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.cMsg4Ld,CMSG4LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.cMsg4LdLen = CMSG4LD_SIZE;
++ break;
++ case CMSG5LD_INDEX:
++ dprintf(5,"C-Msg5 LD rec'd\n");
++ adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
++ (ptidsl, CMSG5LD_INDEX);
++ rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
++ ptidsl->adsl2DiagnosticMessages.cMsg5Ld,CMSG5LD_SIZE);
++ ptidsl->adsl2DiagnosticMessages.cMsg5LdLen = CMSG5LD_SIZE;
++ break;
++ default:
++ dprintf(5,"Unknown ADSL2 Message rec'd\n");
++ break;
++ }
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_getAdsl2MessageLocation()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Gets the address to the ADSL2 Message being looked up
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset)
++{
++ int rc=0;
++
++ DEV_HOST_dspOamSharedInterface_t *pSharedInterface, sharedInterface;
++ DEV_HOST_dspWrNegoParaDef_t dspNegoPara;
++ int adsl2MsgString, adsl2MsgAddr;
++
++ pSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
++ rc += dslhal_support_blockRead(pSharedInterface, &sharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ sharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_adsl2ByteSwap32((unsigned int)sharedInterface.dspWriteNegoParams_p);
++ rc += dslhal_support_blockRead((PVOID)sharedInterface.dspWriteNegoParams_p,&dspNegoPara, sizeof(DEV_HOST_dspWrNegoParaDef_t));
++
++ if (rc)
++ {
++ dprintf(1,"dslhal_support_blockRead failed\n");
++ return DSLHAL_ERROR_BLOCK_READ;
++ }
++
++ adsl2MsgString = dslhal_support_adsl2ByteSwap32((unsigned int)dspNegoPara.adsl2DeltMsgs_p);
++ dprintf(5,"ADSL2 Message String Address: 0x%x\n",adsl2MsgString);
++ rc += dslhal_support_blockRead((PVOID)(adsl2MsgString +
++ ((sizeof(unsigned char *)*msgOffset))),
++ &adsl2MsgAddr, sizeof(int));
++ adsl2MsgAddr = dslhal_support_adsl2ByteSwap32((unsigned int)adsl2MsgAddr);
++ dprintf(5," Message Address: 0x%x\n",adsl2MsgAddr);
++
++ if(rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ else
++ return adsl2MsgAddr;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_getCMsgsRa()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Training Message functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg)
++{
++ int rc=0;
++ DEV_HOST_raMsgsDef_t raMsgParms;
++ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
++ rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++
++ dspOamSharedInterface.raMsgs_p = (DEV_HOST_raMsgsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.raMsgs_p);
++
++ rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.raMsgs_p,
++ &raMsgParms, sizeof(DEV_HOST_raMsgsDef_t));
++ shim_osMoveMemory((void *)cMsg,(void *)raMsgParms.cMsgsRaString,6);
++
++ if(rc)
++ return DSLHAL_ERROR_CONFIG_API_FAILURE;
++ else
++ return DSLHAL_ERROR_NO_ERRORS;
++}
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherRateMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Gathers Rate Training Messages
++* Input
++* tidsl_t *ptidsl : Pointer to application structure
++*
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherRateMessages(tidsl_t * ptidsl)
++{
++ int rc;
++ DEV_HOST_dspWrNegoParaDef_t negoParms;
++ DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
++
++ dprintf(1, "dslhal_support_gatherRateMessages\n");
++
++ rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
++ dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
++
++ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p, &negoParms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
++ if (rc)
++ return DSLHAL_ERROR_BLOCK_READ;
++ else
++ {
++ shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)negoParms.cRates1, 120);
++ shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)negoParms.rRates1, 44);
++ }
++return DSLHAL_ERROR_NO_ERRORS;
++}
++
++static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits)
++{
++ int out32Bits=0;
++
++#ifdef EB
++ out32Bits = (in32Bits << 24);
++ out32Bits |=((in32Bits & 0x0000ff00) << 8);
++ out32Bits |=((in32Bits & 0xff000000) >> 24);
++ out32Bits |=((in32Bits & 0x00ff0000) >> 8);
++#else
++ out32Bits = in32Bits;
++#endif
++
++ return out32Bits;
++
++} /* end of dslhal_support_byteSwap32() */
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.h linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_support.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h 2005-07-10 08:02:01.444111360 +0200
+@@ -0,0 +1,718 @@
++#ifndef DSL_HAL_SUPPORT_H__
++#define DSL_HAL_SUPPORT_H__ 1
++
++/*******************************************************************************
++* FILE PURPOSE: DSL Driver API functions for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_hal_functiondefines.c
++*
++* DESCRIPTION:
++* Contains basic DSL HAL API declarations for Sangam
++*
++*
++* (C) Copyright 2001-02, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 06Feb03 0.00.00 RamP Created
++* 21Mar03 0.00.01 RamP Removed byteswap functions
++* 21Mar03 0.00.02 RamP Added extern osFreeVMemory declaration
++* 10Apr03 0.00.03 RamP Changed declaration for loadFWImage &
++* loadDebugFWImage to remove ptidsl param
++* 12Apr03 0.00.04 RamP Added function to set Interrupt Bit
++* Masks for bitfield & Mailboxes
++* 14Apr03 0.00.05 RamP Added modem state bit field processing
++* 15Apr03 0.00.06 RamP Added function osAllocateVMemory
++* 21Apr03 0.01.00 RamP Added function osAllocateDmaMemory
++* Added function osFreeDmaMemory
++* (Alpha) Added macro virtual2Physical,
++* 22Apr03 0.01.01 RamP Moved acknowledgeInterrupt to api.h
++* 24Apr03 0.01.02 RamP Added checkOvelayPage function
++* 29May03 0.01.03 RamP Added critical enter/exit function decl
++* 06Jun03 0.01.04 RamP Added Interrupt source parsing function
++* 06Oct03 0.01.05 RamP Added function abstraction switches
++* 12Oct03 0.01.06 RamP Added ADSL2 Message function prototypes
++* 14Nov03 0.03.07 RamP Added function to gather Rate Messages
++*******************************************************************************/
++
++#include "dsl_hal_api.h"
++
++#define virtual2Physical(a) (((int)a)&~0xe0000000)
++/* External Function Prototype Declarations */
++
++extern unsigned int shim_osGetCpuFrequency(void);
++extern void shim_osClockWait(int val);
++extern unsigned int shim_osClockTick(void);
++
++extern int shim_osStringCmp(const char *s1, const char *s2);
++
++extern void dprintf( int uDbgLevel, char * szFmt, ...);
++
++extern int shim_osLoadFWImage(unsigned char *firmwareImage);
++extern int shim_osLoadDebugFWImage(unsigned char *debugFirmwareImage);
++extern unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength);
++extern void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes);
++extern void shim_osZeroMemory(char *dst, unsigned int numBytes);
++
++extern void *shim_osAllocateMemory(unsigned int size);
++extern void *shim_osAllocateVMemory(unsigned int size);
++extern void *shim_osAllocateDmaMemory(unsigned int size);
++
++extern void shim_osFreeMemory(void *ptr, unsigned int size);
++extern void shim_osFreeVMemory(void *ptr, unsigned int size);
++extern void shim_osFreeDmaMemory(void *ptr, unsigned int size);
++
++extern void shim_osWriteBackCache(void *pMem, unsigned int size);
++extern void shim_osCriticalEnter(void);
++extern void shim_osCriticalExit(void);
++
++
++/*******************************************************************************************
++* FUNCTION NAME: dslhal_support_writeHostMailbox
++*
++********************************************************************************************
++* DESCRIPTION: Send a message to a mailbox
++*
++* ARGUMENTS: int cmd command to write
++* int tag tag (currently unused)
++* int p1 parameter 1 (currently unused)
++* int p2 parameter 2 (currently unused)
++*
++* RETURNS: 0 if successful
++* NZ otherwise
++*
++*******************************************************************************************/
++
++int dslhal_support_writeHostMailbox
++(tidsl_t *ptidsl,
++ int cmd,
++ int tag,
++ int p1,
++ int p2);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readDspMailbox
++*
++*********************************************************************************************
++* DESCRIPTION: Reads a message from the mailbox
++*
++* ARGUMENTS: int *pcmd Pointer to command read
++*
++* RETURNS: 0 if successful
++* 1 if no mail
++* NZ otherwise
++*
++*****************************************************************************************/
++
++int dslhal_support_readDspMailbox
++(tidsl_t *ptidsl,
++ int *pcmd,
++ int *ptag,
++ int *pprm1,
++ int *pprm2);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readTextMailbox
++*
++*********************************************************************************************
++* DESCRIPTION: Reads a message from the mailbox
++*
++* ARGUMENTS: int *pcmd Pointer to command read
++*
++* RETURNS: 0 if successful
++* 1 if no mail
++* NZ otherwise
++*
++*****************************************************************************************/
++
++int dslhal_support_readTextMailbox
++(tidsl_t *ptidsl,
++ int *pmsg1,
++ int *pmsg2);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_blockRead
++*
++*********************************************************************************************
++* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
++*
++* INPUT: void *addr, memory address to be read
++* void *buffer, dat buffer to be filled with from memmory
++* size_t count, number of bytes to be written
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_support_blockRead
++(void *addr,
++ void *buffer,
++ size_t count);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_blockWrite
++*
++*******************************************************************************************
++* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card
++*
++* INPUT: void *buffer, data need to written
++* void *adde, memory address to be written
++* size_t count, number of bytes to be written
++*
++* RETURN: 0 --succeeded
++* 1 --Failed
++*
++*****************************************************************************************/
++
++int dslhal_support_blockWrite
++(void *buffer,
++ void *addr,
++ size_t count);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_hostDspAddressTranslate
++*
++*******************************************************************************************
++* DESCRIPTION: This function moves the address window to translate physical address
++*
++* INPUT: unsigned int addr : address that requires translation
++*
++* RETURN: Translated address or error condition
++*
++*
++*****************************************************************************************/
++
++unsigned int dslhal_support_hostDspAddressTranslate
++( unsigned int addr
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_unresetDslSubsystem
++*
++*******************************************************************************************
++* DESCRIPTION: This function unreset Dsl Subsystem
++*
++* INPUT: None
++*
++* RETURN: 0 if Pass; 1 if Fail
++*
++*****************************************************************************************/
++int dslhal_support_unresetDslSubsystem
++(void
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_unresetDsp()
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
++*
++* INPUT: None
++*
++* RETURN: 0 --successful.
++* 1 --failed
++*
++*****************************************************************************************/
++int dslhal_support_unresetDsp
++(void
++);
++
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_resetDslSubsystem
++*
++*******************************************************************************************
++* DESCRIPTION: This function unreset Dsl Subsystem
++*
++* INPUT: None
++*
++* RETURN: 0 if Pass; 1 if Fail
++*
++*****************************************************************************************/
++int dslhal_support_resetDslSubsystem
++(void
++);
++
++/******************************************************************************************
++* FUNCTION NAME: dslhal_support_resetDsp()
++*
++*******************************************************************************************
++* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
++*
++* INPUT: None
++*
++* RETURN: 0 --successful.
++* 1 --failed
++*
++*****************************************************************************************/
++int dslhal_support_resetDsp
++(void
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_hostDspCodeDownload
++(tidsl_t * ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_digi_assignMemTestSpace()
++*
++*********************************************************************************************
++* DESCRIPTION: Assigns Memory Space in SDRAM for External Memory Test
++* Input: tidsl_t *ptidsl
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_digi_assignMemTestSpace
++(tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_digi_readMemTestResult()
++*
++*********************************************************************************************
++* DESCRIPTION: Reads Results of External Memory Test
++* Input: tidsl_t *ptidsl
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_digi_readMemTestResult
++(tidsl_t *ptidsl,
++unsigned int testResult
++);
++
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_codeDownload()
++*
++*********************************************************************************************
++* DESCRIPTION: Brings DSLSS out of Reset, Downloads Diag Firmware,
++* brings DSP out of Reset
++* Input: tidsl_t *ptidsl
++*
++* Return: 0 success
++* 1 failed
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_codeDownload
++(tidsl_t *ptidsl,
++unsigned char* missingTones
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_setPgaParams()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Tones selects the .
++* Return: NULL
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_anlg_setPgaParams
++(tidsl_t *ptidsl,
++int agcFlag,
++short pga1,
++short pga2,
++short pga3,
++short aeq
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_getRxNoisePower()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Tones selects the .
++* Return: NULL
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_anlg_getRxNoisePower
++(tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_diags_anlg_setMissingTones()
++*
++*********************************************************************************************
++* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
++* tones and Medley's with missing tones. These signals are defined in ITU
++* G.992.1 ADSL Standards.
++*
++* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
++* Tones selects the .
++* Return: NULL
++*
++********************************************************************************************/
++
++unsigned int dslhal_diags_anlg_setMissingTones
++(tidsl_t *ptidsl,
++unsigned char* missingTones
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_readDelineationState()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_readDelineationState
++(tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_processModemStateBitField()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* download DSP image from host memory to dsp memory
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_processModemStateBitField
++(tidsl_t *ptidsl
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_setInterruptMask()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_setInterruptMask
++(tidsl_t * ptidsl,
++unsigned int inputMask
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_computeCrc32()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data
++*
++* Return: 32 bit CRC of the input data
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_computeCrc32
++(unsigned char *data,
++int len
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_checkOverlayPage()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_checkOverlayPage
++(tidsl_t *ptidsl,
++unsigned int tag
++);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_restoreTrainingInfo(tidsl_t * ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_clearTrainingInfo()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Computes the CRC-32 for the input data and compares it with reference
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++int dslhal_support_clearTrainingInfo(tidsl_t * ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_parseInterruptSource()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Sets the host interrupt bit masks
++*
++* Return: 0 success
++* 1 failed
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl);
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Idle State Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Bitswap buffer Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherEocMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced EOC Buffering functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Snr per bin buffering Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParm);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_processTrainingState()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Training State Processing Functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced EOC Buffering functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int msgTag, int param1, int param2);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_getAdsl2MsgLocation()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Gets the address to the ADSL2 Message being looked up
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_getCMsgsRa()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Calls Advanced Training Message functions
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_gatherRateMessages()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* Gathers Advanced Training Messages
++*
++* Return: Error Condition (if any)
++*
++*
++* NOTE:
++* DSP image is based on LITTLE endian
++*
++********************************************************************************************/
++unsigned int dslhal_support_gatherRateMessages(tidsl_t *ptidsl);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_byteSwap16()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* byteswap a short
++*
++* INPUT:
++* Return: NULL
++*
++********************************************************************************************/
++
++unsigned short dslhal_support_byteSwap16(unsigned short in16Bits);
++
++/********************************************************************************************
++* FUNCTION NAME: dslhal_support_byteSwap32()
++*
++*********************************************************************************************
++* DESCRIPTION:
++* byteswap a word
++*
++* INPUT:
++* Return: NULL
++*
++********************************************************************************************/
++
++unsigned int dslhal_support_byteSwap32(unsigned int in32Bits);
++
++#endif /* Pairs #ifndef DSL_HAL_FUNCTIONDEFINES_H__ */
+diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_version.h linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h
+--- linux.old/drivers/atm/sangam_atm/dsl_hal_version.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h 2005-07-10 08:02:01.444111360 +0200
+@@ -0,0 +1,94 @@
++#ifndef __SYSSW_VERSION_H__
++#define __SYSSW_VERSION_H__ 1
++
++/*******************************************************************************
++* FILE PURPOSE: DSL Driver API functions for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_hal_basicapi.c
++*
++* DESCRIPTION:
++* Contains basic DSL HAL APIs for Sangam
++*
++* (C) Copyright 2003-04, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 14May03 0.00.00 RamP Original Version Created
++* 14May03 0.00.01 RamP Initial Rev numbers inserted
++* 14May03 0.00.02 RamP Bumped version numbers for Dsl Hal
++* & dhalapp for alpha plus
++* 19May03 0.00.03 MCB Bumped dslhal version number
++* because of dependant changes
++* wrt. linux-nsp atm drivers.
++* 22May03 0.00.04 RamP Bumped dslhal & dhalapp buildnum
++* for inner/outer pair & DGASP code
++* 06Jun03 0.00.05 RamP Bumped up buildnum for LED, STM,
++* interrupt processing, statistics
++* and other pre-beta features
++* 09Jun03 0.00.06 JEB Fixed error in DHALAPP bugfix/buildnum
++* 09Jun03 0.00.07 RamP Bumped up buildnum for incremental
++* changes to apis, statistics, memory
++* fixes, parameter configurations
++* 11Jun03 0.00.08 RamP Bumped up buildnum for Co profile
++* free memory fix
++* 12Jun03 0.00.09 JEB Bumped version numbers for AR7 1.00 Beta
++* 02Jul03 0.00.10 ZT Bumped HAL version for overlay page
++* 18Jul03 0.00.11 RamP Bumped HAL version for analog diags
++* 22Jul03 0.00.12 JEB Bumped DHALAPP buildnum for analog diags
++* 31Jul03 0.00.13 RamP Bumped HAL version for engr. drop
++* 04Aug03 0.00.14 JEB Bumped HAL version buildnum for CHECKPOINT65 changes
++* Bumped LINUX version buildnum for CHECKPOINT65 changes
++* 06Aug03 0.00.15 MCB Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
++* 13Aug03 0.00.16 MCB Set rev id's for D3/R1.1 (ADSL2).
++* 21Aug03 0.00.17 JEB Bumped up build numbers for merge of code additions from D1
++* 26Sep03 0.00.18 JEB Set rev id's for another D3/R1 (ADSL2).
++* 14Oct03 0.00.19 JEB Bumped Linux minor number and reset bugfix number for release.
++* Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
++* 14Oct03 0.00.20 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
++* 21Oct03 0.00.21 JEB Bumped build number on DSLHAL for CHECKPOINT16.
++* 22Oct03 0.00.22 MCB Bumped all version numbers in support of D3R1 release.
++* 27Oct03 0.00.23 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
++* Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
++* 30Oct03 0.00.24 JEB Bumped bugfix number on LINUXATM Version for next release.
++* Bumped build numbers on DSLHAL and DHALAPP
++* 31Oct03 0.00.25 MCB Bumped all version numbers in support of D3R2 release.
++* 14Nov03 0.00.26 JEB Bumped build numbers on DSLHAL and DHALAPP
++* Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
++* 20Nov03 0.00.27 JEB Bumped build number on DSLHAL.
++* Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
++* 21Nov03 0.00.28 MCB Bumped all version numbers in support of D3R2 release.
++* 21Nov03 0.00.29 JEB Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
++* 16Dec03 0.00.30 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
++* 21Dec03 0.00.31 MCB Bumped all version numbers in support of D3R2 release.
++* 05Jan04 0.00.32 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
++* 15Jan04 0.00.33 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
++* 26Jan04 0.00.34 JEB Changed Linux ATM version number to be 04.02.03.00.
++* 27Jan04 0.00.35 MCB Bumped all version numbers in support of D3R2 release.
++*******************************************************************************/
++
++/* Dsl Hal API Version Numbers */
++#define DSLHAL_VERSION_MAJOR 03
++#define DSLHAL_VERSION_MINOR 00
++#define DSLHAL_VERSION_BUGFIX 06
++#define DSLHAL_VERSION_BUILDNUM 00
++#define DSLHAL_VERSION_TIMESTAMP 00
++
++/* dhalapp Adam2 Application Version Numbers */
++#define DHALAPP_VERSION_MAJOR 03
++#define DHALAPP_VERSION_MINOR 00
++#define DHALAPP_VERSION_BUGFIX 05
++#define DHALAPP_VERSION_BUILDNUM 00
++
++/* Linux ATM Driver Version Numbers */
++#define LINUXATM_VERSION_MAJOR 04
++#define LINUXATM_VERSION_MINOR 02
++#define LINUXATM_VERSION_BUGFIX 04
++#define LINUXATM_VERSION_BUILDNUM 00
++
++/* DSL Agent Version Numbers */
++#define DSLAGENT_VERSION_MAJOR 02
++#define DSLAGENT_VERSION_MINOR 00
++#define DSLAGENT_VERSION_BUGFIX 02
++#define DSLAGENT_VERSION_BUILDNUM 00
++
++#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
+diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h
+--- linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h 2005-07-10 08:02:01.445111208 +0200
+@@ -0,0 +1,118 @@
++/***************************************************************************
++ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
++
++ FILE: ec_errors.h
++
++ DESCRIPTION:
++ This file contains definitions and function declarations for
++ error code support.
++
++ HISTORY:
++ 14Dec00 MJH Added masking to EC_CLASS etc macros
++ 17Sep02 GSG Added HAL support (new class&devices)
++ 03Oct02 GSG Removed C++ style comments
++***************************************************************************/
++#ifndef _INC_EC_ERRORS
++#define _INC_EC_ERRORS
++
++/*
++ 31 - CRITICAL
++ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
++ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
++ 23-16 - DEVICE (ie. EMAC, IIC, etc)
++ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
++ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
++*/
++
++/*---------------------------------------------------------------------------
++ Useful defines for accessing fields within error code
++---------------------------------------------------------------------------*/
++#define CRITICAL_SHIFT 31
++#define CLASS_SHIFT 28
++#define INST_SHIFT 24
++#define DEVICE_SHIFT 16
++#define FUNCTION_SHIFT 8
++#define ERROR_CODE_SHIFT 0
++
++#define CRITICAL_MASK 1
++#define CLASS_MASK 0x07
++#define DEVICE_MASK 0xFF
++#define INST_MASK 0x0F
++#define FUNCTION_MASK 0xFF
++#define ERROR_CODE_MASK 0xFF
++
++#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
++#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
++#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
++#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
++#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
++
++/*---------------------------------------------------------------------------
++ Operation classes
++---------------------------------------------------------------------------*/
++#define EC_HAL EC_CLASS(0)
++#define EC_DIAG EC_CLASS(8)
++
++/*---------------------------------------------------------------------------
++ Device types
++---------------------------------------------------------------------------*/
++#define EC_DEV_EMAC EC_DEVICE(1)
++#define EC_DEV_IIC EC_DEVICE(2)
++#define EC_DEV_RESET EC_DEVICE(3)
++#define EC_DEV_ATMSAR EC_DEVICE(4)
++#define EC_DEV_MEM EC_DEVICE(5)
++#define EC_DEV_DES EC_DEVICE(6)
++#define EC_DEV_DMA EC_DEVICE(7)
++#define EC_DEV_DSP EC_DEVICE(8)
++#define EC_DEV_TMR EC_DEVICE(9)
++#define EC_DEV_WDT EC_DEVICE(10)
++#define EC_DEV_DCL EC_DEVICE(11)
++#define EC_DEV_BBIF EC_DEVICE(12)
++#define EC_DEV_PCI EC_DEVICE(13)
++#define EC_DEV_XBUS EC_DEVICE(14)
++#define EC_DEV_DSLIF EC_DEVICE(15)
++#define EC_DEV_USB EC_DEVICE(16)
++#define EC_DEV_CLKC EC_DEVICE(17)
++#define EC_DEV_RAPTOR EC_DEVICE(18)
++#define EC_DEV_DSPC EC_DEVICE(19)
++#define EC_DEV_INTC EC_DEVICE(20)
++#define EC_DEV_GPIO EC_DEVICE(21)
++#define EC_DEV_BIST EC_DEVICE(22)
++#define EC_DEV_HDLC EC_DEVICE(23)
++#define EC_DEV_UART EC_DEVICE(24)
++#define EC_DEV_VOIC EC_DEVICE(25)
++/* 9.17.02 (new HAL modules) */
++#define EC_DEV_CPSAR EC_DEVICE(0x1A)
++#define EC_DEV_AAL5 EC_DEVICE(0x1B)
++#define EC_DEV_AAL2 EC_DEVICE(0x1C)
++#define EC_DEV_CPMAC EC_DEVICE(0x1D)
++#define EC_DEV_VDMA EC_DEVICE(0x1E)
++#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
++#define EC_DEV_CPPI EC_DEVICE(0x20)
++#define EC_DEV_CPMDIO EC_DEVICE(0x21)
++
++/*---------------------------------------------------------------------------
++ Function types
++---------------------------------------------------------------------------*/
++#define EC_FUNC_READ_CONF EC_FUNC(1)
++#define EC_FUNC_INIT EC_FUNC(2)
++
++/*---------------------------------------------------------------------------
++ Error codes
++---------------------------------------------------------------------------*/
++#define EC_CRITICAL (1<<CRITICAL_SHIFT)
++#define EC_NO_ERRORS 0
++#define EC_VAL_NO_BASE EC_ERR(1)
++#define EC_VAL_NO_RESET_BIT EC_ERR(2)
++#define EC_VAL_NO_RESET EC_ERR(3)
++#define EC_VAL_BAD_BASE EC_ERR(4)
++#define EC_VAL_MALLOCFAILED EC_ERR(5)
++#define EC_VAL_NO_RESETBASE EC_ERR(6)
++#define EC_DEVICE_NOT_FOUND EC_ERR(7)
++
++/*---------------------------------------------------------------------------
++ Function declarations
++---------------------------------------------------------------------------*/
++extern void ec_log_error( unsigned int );
++
++#endif /* _INC_EC_ERRORS */
+diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h
+--- linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h 2005-07-10 08:02:01.445111208 +0200
+@@ -0,0 +1,118 @@
++/***************************************************************************
++ Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
++
++ FILE: ec_errors.h
++
++ DESCRIPTION:
++ This file contains definitions and function declarations for
++ error code support.
++
++ HISTORY:
++ 14Dec00 MJH Added masking to EC_CLASS etc macros
++ 17Sep02 GSG Added HAL support (new class&devices)
++ 03Oct02 GSG Removed C++ style comments
++***************************************************************************/
++#ifndef _INC_EC_ERRORS
++#define _INC_EC_ERRORS
++
++/*
++ 31 - CRITICAL
++ 30-28 - CLASS (ie. DIAG, KERNEL, FLASH, etc)
++ 27-24 - INSTANCE (ie. 1, 2, 3, etc )
++ 23-16 - DEVICE (ie. EMAC, IIC, etc)
++ 15-08 - FUNCTION (ie. RX, TX, INIT, etc)
++ 07-00 - ERROR CODE (ie. NO_BASE, FILE_NOT_FOUND, etc )
++*/
++
++/*---------------------------------------------------------------------------
++ Useful defines for accessing fields within error code
++---------------------------------------------------------------------------*/
++#define CRITICAL_SHIFT 31
++#define CLASS_SHIFT 28
++#define INST_SHIFT 24
++#define DEVICE_SHIFT 16
++#define FUNCTION_SHIFT 8
++#define ERROR_CODE_SHIFT 0
++
++#define CRITICAL_MASK 1
++#define CLASS_MASK 0x07
++#define DEVICE_MASK 0xFF
++#define INST_MASK 0x0F
++#define FUNCTION_MASK 0xFF
++#define ERROR_CODE_MASK 0xFF
++
++#define EC_CLASS(val) ((val&CLASS_MASK) << CLASS_SHIFT)
++#define EC_DEVICE(val) ((val&DEVICE_MASK) << DEVICE_SHIFT)
++#define EC_INST(val) ((val&INST_MASK) << INST_SHIFT)
++#define EC_FUNC(val) ((val&FUNCTION_MASK) << FUNCTION_SHIFT)
++#define EC_ERR(val) ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
++
++/*---------------------------------------------------------------------------
++ Operation classes
++---------------------------------------------------------------------------*/
++#define EC_HAL EC_CLASS(0)
++#define EC_DIAG EC_CLASS(8)
++
++/*---------------------------------------------------------------------------
++ Device types
++---------------------------------------------------------------------------*/
++#define EC_DEV_EMAC EC_DEVICE(1)
++#define EC_DEV_IIC EC_DEVICE(2)
++#define EC_DEV_RESET EC_DEVICE(3)
++#define EC_DEV_ATMSAR EC_DEVICE(4)
++#define EC_DEV_MEM EC_DEVICE(5)
++#define EC_DEV_DES EC_DEVICE(6)
++#define EC_DEV_DMA EC_DEVICE(7)
++#define EC_DEV_DSP EC_DEVICE(8)
++#define EC_DEV_TMR EC_DEVICE(9)
++#define EC_DEV_WDT EC_DEVICE(10)
++#define EC_DEV_DCL EC_DEVICE(11)
++#define EC_DEV_BBIF EC_DEVICE(12)
++#define EC_DEV_PCI EC_DEVICE(13)
++#define EC_DEV_XBUS EC_DEVICE(14)
++#define EC_DEV_DSLIF EC_DEVICE(15)
++#define EC_DEV_USB EC_DEVICE(16)
++#define EC_DEV_CLKC EC_DEVICE(17)
++#define EC_DEV_RAPTOR EC_DEVICE(18)
++#define EC_DEV_DSPC EC_DEVICE(19)
++#define EC_DEV_INTC EC_DEVICE(20)
++#define EC_DEV_GPIO EC_DEVICE(21)
++#define EC_DEV_BIST EC_DEVICE(22)
++#define EC_DEV_HDLC EC_DEVICE(23)
++#define EC_DEV_UART EC_DEVICE(24)
++#define EC_DEV_VOIC EC_DEVICE(25)
++/* 9.17.02 (new HAL modules) */
++#define EC_DEV_CPSAR EC_DEVICE(0x1A)
++#define EC_DEV_AAL5 EC_DEVICE(0x1B)
++#define EC_DEV_AAL2 EC_DEVICE(0x1C)
++#define EC_DEV_CPMAC EC_DEVICE(0x1D)
++#define EC_DEV_VDMA EC_DEVICE(0x1E)
++#define EC_DEV_VLYNQ EC_DEVICE(0x1F)
++#define EC_DEV_CPPI EC_DEVICE(0x20)
++#define EC_DEV_CPMDIO EC_DEVICE(0x21)
++
++/*---------------------------------------------------------------------------
++ Function types
++---------------------------------------------------------------------------*/
++#define EC_FUNC_READ_CONF EC_FUNC(1)
++#define EC_FUNC_INIT EC_FUNC(2)
++
++/*---------------------------------------------------------------------------
++ Error codes
++---------------------------------------------------------------------------*/
++#define EC_CRITICAL (1<<CRITICAL_SHIFT)
++#define EC_NO_ERRORS 0
++#define EC_VAL_NO_BASE EC_ERR(1)
++#define EC_VAL_NO_RESET_BIT EC_ERR(2)
++#define EC_VAL_NO_RESET EC_ERR(3)
++#define EC_VAL_BAD_BASE EC_ERR(4)
++#define EC_VAL_MALLOCFAILED EC_ERR(5)
++#define EC_VAL_NO_RESETBASE EC_ERR(6)
++#define EC_DEVICE_NOT_FOUND EC_ERR(7)
++
++/*---------------------------------------------------------------------------
++ Function declarations
++---------------------------------------------------------------------------*/
++extern void ec_log_error( unsigned int );
++
++#endif /* _INC_EC_ERRORS */
+diff -urN linux.old/drivers/atm/sangam_atm/env_def_defines.h linux.dev/drivers/atm/sangam_atm/env_def_defines.h
+--- linux.old/drivers/atm/sangam_atm/env_def_defines.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/env_def_defines.h 2005-07-10 08:02:01.446111056 +0200
+@@ -0,0 +1,926 @@
++#ifndef __ENV_DEF_DEFINES_H__
++#define __ENV_DEF_DEFINES_H__ 1
++
++//********************************************************************
++//* DMT-BASE ADSL MODEM PROGRAM
++//* TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
++//* AMATI CONFIDENTIAL PROPRIETARY
++//*
++//* (c) Copyright May 1999, Texas Instruments Incorporated.
++//* All Rights Reserved.
++//*
++//* Property of Texas Instruments Incorporated and Amati Communications Corp.
++//*
++//* Restricted Rights - Use, duplication, or disclosure is subject to
++//* restrictions set forth in TI's and Amati program license agreement and
++//* associated documentation
++//*
++//*********************************************************************
++//*
++//* FILENAME: dpsys_defines.h
++//*
++//* ABSTRACT: This file provides a mechanism for defining standard
++//* preprocessor flag sets for datapump.
++//*
++//* TARGET: Non specific.
++//*
++//* TOOLSET: Non specific.
++//*
++//* ACTIVATION:
++//*
++//* HISTORY: DATE AUTHOR DESCRIPTION
++//* 05/11/99 FLW Created
++//* 01/21/00 FLW derfmake changes
++//* 02/07/00 FLW/M.Seidl added _debug targets
++//* 02/23/00 FLW/M.Barnett merged in from G.lite branch
++//* 03/03/00 FLW/M.Barnett added TRELLIS token
++//* 05/11/00 Barnett Added ap036btp & ap037btp support.
++//* 02/07/00 M.Seidl added HW_TEQ, HW_DEC and DC_BIAS tokens
++//* 02/28/00 Derf/Seidl Mod's in support of suppressing compiler warnings for empty source files
++//* 02/28/00 M. Seidl added SWTC token
++//* 02/28/00 M. Seidl added ap0501tp and its _debug target
++//* 03/03/00 M. Seidl added MODPILOT token, ap0307tp_debug has SWDI and FDD enabled
++//* 03/08/00 Jack Huang Added HWRSDEC token
++//* 03/29/00 Derf/Seidl Mod's in support Soft-TC and derfmake
++//* 04/10/00 Jack Huang Added PCIMASTER token
++//* 04/11/00 Jack Huang Added STBFIX token
++//* 04/24/00 M. Seidl ap0500tp has OLAYDP turned on, ap0500tp_debug has OLAYDP turned off now
++//* 04/28/00 M.Seidl added KAPIL token for ap0501tp targets
++//* 06/02/00 P.Sexton Added OAM_EOC token
++//* 06/06/00 M. Seidl added au0501tp target
++//* 06/12/00 Michael Seidl activated h/w TEQ for KAPIL targets, disabled STBFIX for all targets
++//* 06/14/00 Derf added ap0308tp, alphabetized token lists
++//* 06/16/00 Jack Huang added au0501tp_debug target
++//* 06/22/00 M. Seidl Enabled code overlays through EMIF from external memory. Now there are 3
++//* different code overlay schemes that are differentiated by the following tokens:
++//* OLAYDP_PCI: uses PCI DMA in PCI Master Mode
++//* OLAYDP_HOST: Host downloads overlay code into DMEM upon request from DSP
++//* OLAYDP_EMIF: Host downloads overlay code into ext. mem at boot-time. DSP uses
++//* DMA channel 0 to load code into on-chip PMEM
++//* OLAYDP: turns overlays generally on or off
++//* 07/15/00 B.Srinivasan Cleaned up default tokens and tokens for au0501tp, au0501tp_debug,
++//* ap0501tp and ap0501tp_debug targets as well
++//* 07/19/00 B.Srinivasan Made changes w.r.t cleaning/fixing Rufus Interrupt related code
++//* (changed token TC_INTRPT_RUFUS to INTRPT_RUFUS
++//* 06/14/00 Derf added au0501cp
++//* 08/12/00 Yinong Ding Added DPLL_MODE token.
++//* 08/16/00 F. Mujica Moved DOUBLE_XMT_RATE, RX_HPF, and LEAKY_LMS tokens here.
++//* 09/05/00 M. Seidl Changed ap0501tp back to do overlay through PCI (OLAY_PCI = 1)
++//* 09/11/00 M. Seidl moved USB and OLAYDP_HOST definitions to be CHIPSET specific, not target specific
++//* 09/21/00 U.Dasgupta/ Added a token for separate transmit and receive buffers.
++//* F.Mujica (SEPARATE_TX_RX_BUFFERS).
++//* 10/02/00 U.Dasgupta/ Added DPLL and SEPARATE_TX_RX_BUFFER tokens for au0502 target.
++//* F.Mujica
++//* 10/02/00 M. Castellano Added new tokens for new Host/EMIF DSP code overlay.
++//* OLAYDP_2STEP: Host downloads overlay code into ext. mem upon DSP request. DSP
++//* DMA channel 0 to load code into on-chip PMEM. It is a somewhat hybrid version
++//* of OLAYDP_HOST and OLAYDP_EMIF. The test target is ap0502tp.
++//* 10/25/00 Balaji Added tokens for arv500tp target
++//* 10/31/00 U. Iyer Added TEQ_AVG token and set it one for Ax5
++//* 11/02/00 Barnett Added OAM_EOC=0 in defaults at bottom of file.
++//* 11/21/00 M. Seidl turned OLAYDP and AOC off for ap0307tp to make binary compatible w. whql'ed driver
++//* 11/28/00 Paul Hunt added FASTRETRAIN token for fast retrain specific code
++//* 11/28/00 Paul Hunt added PILOTDATA token to control channel estimation and transmission
++//* of data on the upstream pilot tone for ITU standard code loads
++//* 12/20/00 Jack Huang added EIGHTBITSRAM toekn for the targets that use 8-bit SRAM for
++//* interleaver/deinterleaver
++//* 01/11/01 U.Dasgupta Added mp targets and cleaned up GHS/PILOTDATA variables
++//* 01/23/01 U.Dasgupta Cleaned up code within GLITE tokens
++//* 01/23/00 Barnett Added in full EOC support for AP3/Ax5. Got rid of UTC. No longer needed.
++//* 02/08/01 Barnett Added DDC token.
++//* 03/09/01 Nirmal Warke Added in TOKEN definition for line diagnostics (LINE_DIAG): IMP DEPENDENCIES -
++//* TEQ_AVG must be off when LINE_DIAG is on (since they share a union buffer at the same time)
++//* 03/13/01 M. Seidl Recovered ap0500tp target. Added GHS token as PMEM saving option
++//* 03/14/01 Barnett Added ap0500mb target support. Look-and-feel is similar to ap0500tp.
++//* Added seperate-but-equal def's wrt. ISDN Annex B, Annex C, and PROP.
++//* 03/14/01 J. Bergsagel Added EXTERNBERT token.
++//* 03/15/01 Barnett/Balaji Merged AR5(H) -> 03.00.00 datapump.
++//* 03/16/01 Nirmal Warke Added in TOKEN definition for crosstalk performance mods (CROSSTALK): IMP DEPENDENCIES -
++//* TEQ_AVG must be off and LEAKY_LMS must be on when CROSSTALK is on
++//* 03/21/01 Barnett Added support for ar0500lp, ar0500mp, ar0500dp, arv500lp, arv500mp, and arv500dp.
++//* 03/26/01 M. Seidl enabled 64pt IFFT for ap0500mb (Raptor+AD11, FDM)
++//* 03/28/01 J. Bergsagel Removed EXTERNBERT token (now use host intf. var. instead)
++//* 04/03/01 J. Bergsagel Removed condition of DSPDP_CHIPSET_GEN==5 for default defines
++//* Removed LEAKY_LMS token (assumed always 1)
++//* Removed OLAYDP_HOST token (assumed always 0)
++//* Removed RX_HPF token (assumed always 1)
++//* Removed TRIBRID token (not used any more)
++//* Removed FDD token (assumed always 1)
++//* Removed HW_DEC token (assumed always 1)
++//* Removed HW_TEQ token (assumed always 1)
++//* Removed HWRSDEC token (assumed always 1)
++//* Removed ILEC_AD11_ALCATEL337 token (assumed always 0)
++//* Removed ILEC_AD11_HDSLNOISEFIX token (assumed always 0)
++//* Removed ILEC_AD11_MODULATEPILOT token (assumed always 0)
++//* Removed ILEC_AD11_NEWINTERPOLATE token (assumed always 0)
++//* Removed ILEC_AD11_USTXHPF token (assumed always 0)
++//* Removed SWDI token (assumed always 1)
++//* Removed TD_AGC token (assumed always 1)
++//* Removed DSPDP_LEGACY_TARGET token (assumed always 0)
++//* Removed AD11_20, AD11_20NL and AD11_20_NEWPREC token (always 1)
++//* Removed AI token (assumed always 1)
++//* Removed ATUC token (assumed always 0)
++//* Removed EU token (assumed always 0)
++//* Removed EVM2 token (assumed always 0)
++//* Removed INTRPT_RUFUS token (assumed always 0)
++//* Removed MODPILOT token (assumed always 0)
++//* Removed SL and SL_EVM tokens (assumed always 0)
++//* Removed STBIFX token (assumed always 0)
++//* Removed STD token (assumed always 1)
++//* Removed SWDI_LOOPBACK token (assumed always 0)
++//* Removed TID token (assumed always 0)
++//* Removed TII token (assumed always 1)
++//* Removed TIPCI token (assumed always 1)
++//* Removed UDI token (assumed always 1)
++//* Removed DC_BIAS token (assumed always 1)
++//* 04/05/01 Barnett Added DSPDP_ prefix to tokens that originate
++//* in the public interface.
++//* 05/07/01 Jack Huang Removed DOUBLE_XMT_RATE token.
++//* 05/16/01 Barnett Added back in EXTERNBERT token in support
++//* of saving PMEM.
++//* 06/05/01 Jack Huang Fixed the rules for ar0500mp_debug target
++//* 04/23/01 M. Halleck Merge Astro Wu's DDC enhancements
++//* 06/05/01 M. Capps Changed DSP_DEBUG to ENHANCED_SERIAL_DEBUG
++//* 07/03/01 M. Capps Replaced ESD token with !DDC, added DEV_DEBUG
++//* 06/26/01 J. Bergsagel Removed all the old ap03... stuff
++//* Removed OLAYDP_HOST token (again)
++//* Removed CROSSTALK token (assumed always 1)
++//* Removed TEQ_AVG token (assumed always 0)
++//* Removed DE token (assumed always 1)
++//* Removed PVAT token and au0501cp target
++//* Removed FASTRETRAIN token (assumed always 0)
++//* 07/05/01 J. Bergsagel Changed PCIMASTER token to TC_ATM_PCIMASTER
++//* 07/20/01 Umesh Iyer Added ATMBERT token. ATMBERT is conditional on SWTC definition. if SWTC is 0
++//* ATMBERT should be 0. Else it can be 0/1. Default 0.
++//* 07/23/01 J. Bergsagel Changed name from defines_u.h to dpsys_defines.h
++//* 07/24/01 Barnett Added support for build of $(TARGET)_diag mfgr'ing targets.
++//* 08/02/01 Michael Seidl renamed KAPIL token to !AD1X
++//* 08/02/01 Michael Seidl renamed GHS token to PMEMSAVE_GHS
++//* 08/03/01 S.Yim Added MFGR_DIAG token for afe diagnostic
++//* Added AFEDEV token for afe device driver
++//* Added DSPBIOSII token for dsp bios
++//* 09/21/01 Sameer Enable EXTERNBERT. Disable ATMBERT.
++//* 10/01/01 U.Dasgupta Turned off SMART_MARGIN for ap0500mb because of FECs/CRCs;
++//* 10/09/01 Barnett Added support for ar0500db.
++//* 10/12/01 Barnett Disable EXTERNBERT.
++//* 10/15/01 Barnett Turn off SMART_MARGIN.
++//* 11/07/01 Barnett Def'ed ISDN_DEBUG for all targets to avoid compiler warnings.
++//* Assumed defaul value is zero.
++//* 11/13/01 Barnett Reworked ar0500db_debug to build JTAG-bootable load.
++//* The equivalent production target should only be flash-bootable.
++//* 01/11/02 Yim Added TOKEN JTAG to build JTAG load ar0500db_diag.
++//* 01/23/02 U Iyer Added DEBUG_LOG token. Default value 0
++//* 01/31/02 Barnett Added support for ar0700mp target.
++//* 02/04/02 S.Yim Added TOKEN JTAG to build JTAG load ar0500mp_diag
++//* 02/11/02 U Iyer Added MARGIN_DELTA_RETRAIN token. Default value 1
++//* 05/15/02 Sameer V Enabled EXTERNBERT token for AR5 and AU5 platforms. EXTERNBERT is
++//* not supported on AR5H.
++//* 02/14/02 Barnett Don't ref the SWTC feature token if mfgr'ing diag target.
++//* 02/19/02 Yim Added support to build au0502db_diag target.
++//* 03/08/02 Nirmal Warke Added feature token HYBRID_SWITCH
++//* 03/15/02 U G Jani Turned ON Bitswap support for AU5I (au0502db) targets.
++//* 04/08/02 U G Jani Enabled NLNOISEADJSNR token for AU5I targets.
++//* 06/24/02 Seungmok Oh Added PERTONE_EQ token support for those targets:
++//* (ar0500mp_debug, au0502mp_debug, ar0500mp, au0502mp)
++//* 06/26/02 Mallesh Added DS_PWR_CUTBACK token. Default value 1.
++//* 06/27/02 Mallesh Changed default value of DS_PWR_CUTBACK token to 0.
++//* 06/29/02 U.Dasgupta Token cleanup: Removed ISDN_DEBUG token
++//* 04/29/02 Mannering Remove EIGHTBITSRAM, Combined DOUBLEBUFFER with
++//* BITSWAP, added FPGA token
++//* 05/03/02 Mannering cleanup token changed by the new routine names
++//* 05/06/02 Mannering Add tokens OUTBAND and INBAND for codec commands
++//* If both OUTBAND and INBAND are 0 codec register are
++//* memory mapped.
++//* 05/29/2002 S.Yim Removed AD1X, AFEDEV
++//* 08/31/2002 Paul Hunt Added PERTONE_EQ and HYBRID_SWITCH for ar0700mp
++//* 09/12/2002 Paul Hunt Added support for ar0700db target.
++//* 08/07/2002 U.Dasgupta Turned off MARGIN_DELTA_RETRAIN feature for ISDN platforms
++//* 11/14/2002 Paul Hunt Merged AX5 MR6 PC modifications into AR7 codebase, specifically
++//* turned off MARGIN_DELTA_RETRAIN feature for ar0700db target
++//* 08/26/2002 N. Warke Added DUAL_TEQ token. Active only for Ax7 target
++//* 09/26/2002 Mannering Add token CODEC_EMU for codec emulator board
++//* 10/15/2002 Iyer/Molla Added DMT_BIS token for DELT support
++//* 10/21/2002 A. Redfern Added PHY_EC_ENABLE and PHY_PATH_ENABLE tokens
++//* 10/23/2002 A. Redfern Removed LINE_DIAG token
++//* 10/28/2002 J. Bergsagel Cleaned up old targets and cleaned up the token list
++//* 10/30/2002 A. Redfern Added PHY_TDW_ENABLE
++//* 11/01/2002 A. Redfern Removed SMART_MARGIN token
++//* 11/01/2002 Mustafa Turned on SPECTRAL_SHAPING features for Lucent AnyMedia O.69 Interop.
++//* 11/15/2002 Yim/Mannering Added CODEC_EMU token for analog emulation board specifics
++//* 11/15/2002 Iyer/Molla Added DEBUG_DELT and MEM_STR token to support DELT debug
++//* 12/27/2002 Sameer V Added ATM_TC_HW token for Sangam.
++//* 01/06/2003 J. Bergsagel Added default values for NLNOISEADJSNR, ARTT and DS_PWR_CUTBACK
++//* 01/07/2003 S.Yim Modified ar0700db_diag target to turn on ISDN token
++//* 01/22/2003 J. Bergsagel Added back in defines for the debug targets.
++//* 01/21/2003 MCB Implemented Ax7 UNIT-MODULE modular software framework.
++//* 01/31/2003 J. Bergsagel Made debug targets to be for the FPGA platform; non-debug for Sangam.
++//* Turned off DUAL_TEQ, PHY_EC_ENABLE and PHY_PATH_ENABLE by default
++//* for the Sangam (non-debug) targets.
++//* Turned off OLAYDP token by default.
++//* Turned off SWTC and turned on ATM_TC_HW by default for Sangam targets.
++//* 01/29/2003 Sameer V Added ATMBERT_HW token for Sangam.
++//* 02/04/2003 D. Mannering Added CO_PROFILE token
++//* 02/19/2003 Sameer V Added back EXTERNBERT token for ar0700mp_dp and ar0700db_dp targets.
++//* Disabled EXTERNBERT for debug target since it is not supported on the
++//* FPGA platform.
++//* 02/21/2003 A. Redfern Turned off OAM_EOC, AOC and BITSWAP (until memory issues are resolved).
++//* Turned on DUAL_TEQ, PHY_PATH_ENABLE and PHY_EC_ENABLE.
++//* 02/21/2003 D. Mannering Added DEBUG_DUMP.
++//* 03/06/2003 J. Bergsagel Cleaned up tokens for each target and switched diag targets
++//* over to the Sangam platform (instead of the FPGA platform).
++//* 03/07/2003 J. Bergsagel Cleaned up TC and BERT tokens
++//* 03/11/2003 J. Bergsagel Turned on AOC and BITSWAP for Sangam POTS and ISDN targets.
++//* 03/20/2003 Mallesh Added SHALF token.
++//* 03/24/2003 F. Mujica Enable hybrid selection
++//* 03/26/2003 A. Redfern Removed PMEMSAVE_GHS (always = 1).
++//* 04/08/2003 F. Mujica Renamed HYBRID_SWITCH token to PHY_HYB_ENABLE
++//* 04/08/2003 J. Bergsagel Turned off PHY_HYB_ENABLE for _debug targets (FPGA board builds)
++//* 04/09/2003 J. Bergsagel Turned on OLAYDP only for ar0700mp and ar0700db.
++//* Turned on AOC, BITSWAP, and OAM_EOC for ar0700mp and ar0700db.
++//* 04/09/2003 J. Bergsagel Corrected name "PHY_HYB_SELECT" to "PHY_HYB_ENABLE"
++//* 04/15/2003 A. Redfern Turned on ECI_PULSECOM_INTEROP because phase optimization was enabled.
++//* 05/05/2003 D. Mannering Review Comments - turn on AOC, EXTERNBERT, SHALF, for ar0700mp; amd
++//* turn on AOC for ar0700db
++//* 05/11/2003 Prashant S Added DMT_BIS token for AR7 Soft DI work
++//* 05/13/2003 J. Bergsagel Turned on IMPROVED_STAT_SUPPORT_06_03_00 by default for necessary statistics
++//* 05/15/2003 J. Bergsagel Turned off CO_PROFILE for diag targets.
++//* 05/27/2003 U.Dasgupta Added NLNOISEADJSNR_EC token for ISDN - to take care of non-linear noise
++//* (from ISDN splitter) compensation.
++//* 06/02/2003 Z. Yang Added PHY_NDIAG_ENABLE token.
++//* 06/02/2003 Z. Yang Added COMB_LINEDIAG_ENABLE token.
++//* 06/05/2003 P. Hunt Turned on ATUC_CLEARDOWN_CHANGE token for all targets.
++//* 06/05/2003 Mallesh Turned on CENTILLIUM_VENDORID_AND_TXRATE_CHNG to enable logging the vendor ID
++//* for centillium and litespan
++//* 06/05/2003 U.Dasgupta Turned on SHALF token for ISDN.
++//* 06/06/2003 U.Dasgupta Turned on G.hs nonstandard field token for ar0700db target.
++//* 06/12/2003 J. Bergsagel Changed *_debug targets to be for JTAG=1 instead of FPGA targets
++//* IMPORTANT: For non-JTAG cases, "JTAG" should be undefined.
++//* Therefore, "JTAG" should not have a default case at the bottom (JTAG 0)
++//* 06/18/2003 A. Redfern Turned on spectral shaping token for all targets.
++//* 06/23/2003 J. Bergsagel Turned off GHS_NON_STD_FIELD token for ar0700db until bugs are fixed.
++//* 06/23/2003 U G Jani Undid the above change since the bug is fixed.
++//* 06/27/2003 Mallesh Removed all the interop tokens which are no longer required.
++//* 08/20/2003 J. Bergsagel Added default value for OVHD_PMDTEST_PARA and put default section
++//* tokens in alphabetical order.
++//* 10/09/2003 Hanyu Liu Defined token ADSL2_1BIT_TONE to support Rx one bit constellation.
++//* 10/12/2003 Hanyu Liu Defined token ADSL2_BSWP for bitswap.
++//* 10/20/2003 Xiaohui Li Added READSL2_ENABLE token.
++//* 12/01/2003 Seungmok Oh Added TXDF2B_PROFILING token, which is active only for POTS target.
++//* 12/09/2003 Jack Huang Turned on GHS_NON_STD_FIELD support for AR7 POTS targets
++//* 12/16/2003 Mustafa T. Added the necessary definitions for diag target.
++//*****************************************************************************************************
++//*
++//* The default flag settings are:
++//*
++//* -dATUC=1 -dSTD=0 -dISDN=0 -dTIPCI=0 -dTID=0 -dTII=0 -dAI=0
++//* -dEVM2=0 -dEU=0 -dSL=0 -dSL_EVM=1 -dGLITE=0
++//*
++//* and are set after all the per-suffix options have had a chance to
++//* set them. Each flag is only set if it has not previously been set, so
++//* per-suffix settings can override defaults, and command-line defines can
++//* override per-suffix settings.
++//*
++//*****************************************************************************
++
++
++//* ===========================================================================
++//* Suffix codes
++//* The command-line can include -dOBJSFX_xxx to get a flag set
++//* instead of explicitly setting each flag on each CC/ASM command-line.
++//* and the object suffix will control the settings of "feature" constants.
++//* ===========================================================================
++//
++//* ===========================================================================
++// Flag settings for new suffixes (in alphabetical order of suffix)
++// Each suffix has to specify only those flags which differ from the
++// default settings.
++//* ===========================================================================
++// NOTE: Try to keep feature flags in alphabetical order to ease maintenance.
++//* ===========================================================================
++//*
++
++#define CHIPSET_ID_UNKN '?'
++#define CHIPSET_ID_AH 'H'
++#define CHIPSET_ID_AP 'P'
++#define CHIPSET_ID_AR 'R'
++#define CHIPSET_ID_ARV 'R'
++#define CHIPSET_ID_AT 'T'
++#define CHIPSET_ID_AU 'U'
++
++#define CHIPSET_ID2_GENERIC '0'
++#define CHIPSET_ID2_ARV 'R'
++
++ #define DSPDP_IMAGE_ID_STANDARD(code) ( \
++ STANDARD_is_MULTIMODE(code) ? "M" : \
++ STANDARD_is_GDMT(code) ? "D" : \
++ STANDARD_is_GLITE(code) ? "L" : \
++ STANDARD_is_T1413(code) ? "T" : "_")
++
++ #define DSPDP_IMAGE_ID_SERVICE(code) ( \
++ SERVICE_is_POTS(code) ? "P" : \
++ SERVICE_is_ISDN_ANNEXB(code) ? "B" : \
++ SERVICE_is_ISDN_ANNEXC(code) ? "C" : \
++ SERVICE_is_ISDN_PROP(code) ? "I" : "")
++
++// Bit-codes for feature byte in new version.
++//
++// 0000 0000
++// |||| ||||
++// |||| |||+ -- POTS
++// |||| ||+---- ISDN_ANNEXB
++// |||| |+----- ISDN_ANNEXC
++// |||| +------ ISDN_PROP
++// |||+--------
++// ||+--------- GHS
++// |+---------- GLITE
++// +----------- T1413
++//
++//
++#define FEATURE_BIT_T1413 0x80
++#define FEATURE_BIT_GLITE 0x40
++#define FEATURE_BIT_GHS 0x20
++#define FEATURE_BIT_ISDN_PROP 0x08
++#define FEATURE_BIT_ISDN_ANNEXC 0x04
++#define FEATURE_BIT_ISDN_ANNEXB 0x02
++#define FEATURE_BIT_POTS 0x01
++
++#define STANDARD_BITS_MASK (FEATURE_BIT_T1413 | FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
++#define STANDARD_BITS_T1413 FEATURE_BIT_T1413
++#define STANDARD_BITS_GHS FEATURE_BIT_GHS
++#define STANDARD_BITS_GLITE (FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
++#define STANDARD_BITS_GDMT (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)
++#define STANDARD_BITS_MULTIMODE (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)
++
++#define SERVICE_BIT_ISDN_ANNEXB FEATURE_BIT_ISDN_ANNEXB
++#define SERVICE_BIT_ISDN_ANNEXC FEATURE_BIT_ISDN_ANNEXC
++#define SERVICE_BIT_ISDN_PROP FEATURE_BIT_ISDN_PROP
++#define SERVICE_BIT_POTS FEATURE_BIT_POTS
++
++//
++// Debug new-style suffixes
++//
++//
++
++#if defined(OBJSFX_ar0700db_debugobj)
++#ifndef OBJSFX_ar0700dbobj
++#define OBJSFX_ar0700dbobj 1
++#endif
++// Here, in alphabetic order, are the feature tokens that
++// distinguish this suffix from its non-_debug partner:
++// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
++
++#ifndef JTAG
++#define JTAG 1
++#endif
++
++#elif defined(OBJSFX_ar0700mp_debugobj)
++#ifndef OBJSFX_ar0700mpobj
++#define OBJSFX_ar0700mpobj 1
++#endif
++// Here, in alphabetic order, are the feature tokens that
++// distinguish this suffix from its non-_debug partner:
++// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
++
++#ifndef ADSL2_BSWP
++#define ADSL2_BSWP 1
++#endif
++#ifndef AOC
++#define AOC 1
++#endif
++#ifndef BITSWAP
++#define BITSWAP 1
++#endif
++#ifndef DEBUG_ADSL2
++#define DEBUG_ADSL2 0
++#endif
++#ifndef DEBUG_LOG
++#define DEBUG_LOG 0
++#endif
++#ifndef GHS_NON_STD_FIELD
++#define GHS_NON_STD_FIELD 1
++#endif
++#ifndef JTAG
++#define JTAG 1
++#endif
++#endif // end of the series of "#elif defined" for debug targets
++
++
++//
++// Standard new-style suffixes for operational and mfgr'ing diag.
++//
++
++#if defined(OBJSFX_ar0700dbobj)
++#define CHIPSET_AR07 1
++#define PLATFORM_AR0700 1
++#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
++#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
++#define DSPDP_CHIPSET_GEN 7
++#define DSPDP_HARDWARE_REV1 '0'
++#define DSPDP_HARDWARE_REV2 '0'
++#define DSPDP_FEATURE_CODE (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
++#ifndef AOC
++#define AOC 1
++#endif
++// ATM_TC_HW and SWTC are mutually exclusive
++#ifndef ATM_TC_HW
++#define ATM_TC_HW 1
++#endif
++#ifndef SWTC
++#define SWTC 0
++#endif
++#ifndef BITSWAP
++#define BITSWAP 1
++#endif
++#ifndef EXTERNBERT
++#define EXTERNBERT 0
++#endif
++#ifndef GHS_NON_STD_FIELD
++#define GHS_NON_STD_FIELD 1
++#endif
++#ifndef MARGIN_DELTA_RETRAIN
++#define MARGIN_DELTA_RETRAIN 0
++#endif
++#ifndef NLNOISEADJSNR_EC
++#define NLNOISEADJSNR_EC 1
++#endif
++#ifndef OLAYDP
++#define OLAYDP 1
++#endif
++#ifndef SHALF
++#define SHALF 1
++#endif
++
++
++#elif defined(OBJSFX_ar0700db_diagobj)
++#define CHIPSET_AR07 1
++#define PLATFORM_AR0700 1
++#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
++#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
++#define DSPDP_CHIPSET_GEN 7
++#define DSPDP_HARDWARE_REV1 '0'
++#define DSPDP_HARDWARE_REV2 '0'
++#define DSPDP_FEATURE_CODE (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
++#ifndef AOC
++#define AOC 0
++#endif
++// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
++#ifndef ATM_TC_HW
++#define ATM_TC_HW 0
++#endif
++#ifndef SWTC
++#define SWTC 0
++#endif
++#ifndef BITSWAP
++#define BITSWAP 0
++#endif
++#ifndef CO_PROFILE
++#define CO_PROFILE 0
++#endif
++#ifndef MARGIN_DELTA_RETRAIN
++#define MARGIN_DELTA_RETRAIN 0
++#endif
++#ifndef MFGR_DIAG
++#define MFGR_DIAG 1
++#endif
++#ifndef OAM_EOC
++#define OAM_EOC 0
++#endif
++#ifndef OLAYDP
++#define OLAYDP 0
++#endif
++#ifndef SNR_UPDATE
++#define SNR_UPDATE 0
++#endif
++
++#elif defined(OBJSFX_ar0700mpobj)
++#define CHIPSET_AR07 1
++#define PLATFORM_AR0700 1
++#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
++#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
++#define DSPDP_CHIPSET_GEN 7
++#define DSPDP_HARDWARE_REV1 '0'
++#define DSPDP_HARDWARE_REV2 '0'
++#define DSPDP_FEATURE_CODE (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
++#ifndef AOC
++#define AOC 1
++#endif
++// ATM_TC_HW and SWTC are mutually exclusive
++#ifndef ADSL2_1BIT_TONE
++#define ADSL2_1BIT_TONE 0
++#endif
++#ifndef ADSL2_BSWP
++#define ADSL2_BSWP 1
++#endif
++#ifndef ATM_TC_HW
++#define ATM_TC_HW 1
++#endif
++#ifndef SWTC
++#define SWTC 0
++#endif
++#ifndef BITSWAP
++#define BITSWAP 1
++#endif
++#ifndef EXTERNBERT
++#define EXTERNBERT 0
++#endif
++#ifndef OLAYDP
++#define OLAYDP 1
++#endif
++#ifndef DMT_BIS
++#define DMT_BIS 1
++#endif
++#ifndef SHALF
++#define SHALF 1
++#endif
++#ifndef MEM_STR
++#define MEM_STR 0
++#endif
++#ifndef DS_LOOP_BACK
++#define DS_LOOP_BACK 0
++#endif
++#ifndef LOOP_BACK_DEBUG
++#define LOOP_BACK_DEBUG 0
++#endif
++#ifndef US_LOOP_BACK
++#define US_LOOP_BACK 0
++#endif
++#ifndef OVHD_PMDTEST_PARA
++#define OVHD_PMDTEST_PARA 0
++#endif
++#ifndef DS_RX_CODEWORD
++#define DS_RX_CODEWORD 1
++#endif
++#ifndef READSL2_ENABLE
++#define READSL2_ENABLE 1
++#endif
++#ifndef GHS_NON_STD_FIELD
++#define GHS_NON_STD_FIELD 1
++#endif
++
++#elif defined(OBJSFX_ar0700mp_diagobj)
++#define CHIPSET_AR07 1
++#define PLATFORM_AR0700 1
++#define DSPDP_CHIPSET_ID CHIPSET_ID_AR
++#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
++#define DSPDP_CHIPSET_GEN 7
++#define DSPDP_HARDWARE_REV1 '0'
++#define DSPDP_HARDWARE_REV2 '0'
++#define DSPDP_FEATURE_CODE (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
++#ifndef ADSL2_BSWP
++#define ADSL2_BSWP 0
++#endif
++#ifndef AOC
++#define AOC 0
++#endif
++// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
++#ifndef ATM_TC_HW
++#define ATM_TC_HW 0
++#endif
++#ifndef SWTC
++#define SWTC 0
++#endif
++#ifndef BITSWAP
++#define BITSWAP 0
++#endif
++#ifndef CO_PROFILE
++#define CO_PROFILE 0
++#endif
++#ifndef DMT_BIS
++#define DMT_BIS 0
++#endif
++#ifndef MARGIN_DELTA_RETRAIN
++#define MARGIN_DELTA_RETRAIN 0
++#endif
++#ifndef MFGR_DIAG
++#define MFGR_DIAG 1
++#endif
++#ifndef OAM_EOC
++#define OAM_EOC 0
++#endif
++#ifndef OLAYDP
++#define OLAYDP 0
++#endif
++#ifndef SNR_UPDATE
++#define SNR_UPDATE 0
++#endif
++#ifndef US_CRC_RETRAIN
++#define US_CRC_RETRAIN 0
++#endif
++#ifndef ADSL2_BSWP
++#define ADSL2_BSWP 0
++#endif
++#ifndef DMT_BIS
++#define DMT_BIS 0
++#endif
++#ifndef DS_RX_CODEWORD
++#define DS_RX_CODEWORD 0
++#endif
++
++#else
++#define DSPDP_CHIPSET_ID CHIPSET_ID_UNKN
++#define DSPDP_CHIPSET_ID2 CHIPSET_ID2_GENERIC
++#define DSPDP_CHIPSET_GEN 0
++#define DSPDP_HARDWARE_REV1 '0'
++#define DSPDP_HARDWARE_REV2 '0'
++#define DSPDP_FEATURE_CODE 0
++#endif
++
++// For use in checking the code in drivers -- indented to avoid .h->.ah
++ #define STANDARD_is_T1413(code) (!(((code) & STANDARD_BITS_MASK) ^ STANDARD_BITS_T1413))
++ #define STANDARD_is_GLITE(code) (!(((code) & STANDARD_BITS_MASK) ^ STANDARD_BITS_GLITE))
++ #define STANDARD_is_GHS(code) (((code) & STANDARD_BITS_MASK) & STANDARD_BITS_GHS)
++ #define STANDARD_is_GDMT(code) (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
++ #define STANDARD_is_MULTIMODE(code) (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
++ #define SERVICE_is_POTS(code) ((code) & SERVICE_BIT_POTS)
++ #define SERVICE_is_ISDN_ANNEXB(code) ((code) & SERVICE_BIT_ISDN_ANNEXB)
++ #define SERVICE_is_ISDN_ANNEXC(code) ((code) & SERVICE_BIT_ISDN_ANNEXC)
++ #define SERVICE_is_ISDN_PROP(code) ((code) & SERVICE_BIT_ISDN_PROP)
++
++#define STANDARD_T1413 (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ STANDARD_BITS_T1413))
++#define STANDARD_GLITE (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ STANDARD_BITS_GLITE))
++#define STANDARD_GHS ((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) & STANDARD_BITS_GHS)
++#define STANDARD_GDMT (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
++#define STANDARD_MULTIMODE (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
++
++#define SERVICE_POTS (DSPDP_FEATURE_CODE & SERVICE_BIT_POTS)
++#define SERVICE_ISDN_ANNEXB (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXB)
++#define SERVICE_ISDN_ANNEXC (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXC)
++#define SERVICE_ISDN_PROP (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_PROP)
++#define SERVICE_ISDN (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_ANNEXC | SERVICE_ISDN_PROP)
++
++
++//
++// Backwards compatibility with old tokens
++//
++
++#if (SERVICE_POTS)
++#ifndef ISDN
++#define ISDN 0
++#endif
++#endif
++
++#if (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_PROP)
++#ifndef ISDN
++#define ISDN 1
++#endif
++#endif
++
++
++//
++//* ===========================================================================
++// More Default settings
++//* ===========================================================================
++//
++
++//
++// BEGIN Could automatically generate showdefs code
++//
++#ifndef AOC
++#define AOC 1
++#endif
++#ifndef ARTT
++#define ARTT 0
++#endif
++#ifndef ATMBERT
++#define ATMBERT 0
++#endif
++// ATM_TC_HW and SWTC are mutually exclusive
++#ifndef ATM_TC_HW
++#define ATM_TC_HW 1
++#endif
++#if ATM_TC_HW
++#ifndef ATMBERT_HW
++#define ATMBERT_HW 1
++#endif
++#ifndef SWTC
++#define SWTC 0
++#endif
++#else // else case for #if ATM_TC_HW
++#ifndef ATMBERT_HW
++#define ATMBERT_HW 0
++#endif
++#ifndef SWTC
++#define SWTC 1
++#endif
++#endif // end of #if ATM_TC_HW
++#ifndef ATM_TC_PATH1_ON
++#define ATM_TC_PATH1_ON 0
++#endif
++#ifndef BITSWAP
++#define BITSWAP 1
++#endif
++#ifndef COMB_LINEDIAG_ENABLE
++#define COMB_LINEDIAG_ENABLE 0
++#endif
++#ifndef CODEC_EMU
++#define CODEC_EMU 0
++#endif
++#ifndef CO_PROFILE
++#define CO_PROFILE 1
++#endif
++#ifndef DDC
++#define DDC 0
++#endif
++#ifndef DEBUG_ADSL2
++#define DEBUG_ADSL2 0
++#endif
++#ifndef DEBUG_DUMP
++#define DEBUG_DUMP 0
++#endif
++#ifndef DEBUG_LOG
++#define DEBUG_LOG 0
++#endif
++#ifndef DEV_DEBUG
++#define DEV_DEBUG 0
++#endif
++#ifndef DS_LOOP_BACK
++#define DS_LOOP_BACK 0
++#endif
++#ifndef DS_RX_CODEWORD
++#define DS_RX_CODEWORD 1
++#endif
++#ifndef LOOP_BACK_DEBUG
++#define LOOP_BACK_DEBUG 0
++#endif
++#ifndef US_LOOP_BACK
++#define US_LOOP_BACK 0
++#endif
++#ifndef DPLL_MODE
++#define DPLL_MODE 0
++#endif
++#ifndef DSPBIOSII
++#define DSPBIOSII 0
++#endif
++#ifndef DMT_BIS
++#define DMT_BIS 1
++#endif
++#ifndef ADSL2_1BIT_TONE
++#define ADSL2_1BIT_TONE 0
++#endif
++#ifndef ADSL2_BSWP
++#define ADSL2_BSWP 1
++#endif
++#ifndef MEM_STR
++#define MEM_STR 0
++#endif
++#ifndef DS_PWR_CUTBACK
++#define DS_PWR_CUTBACK 0
++#endif
++#ifndef DUAL_TEQ
++#define DUAL_TEQ 1
++#endif
++#ifndef EXTERNBERT
++#define EXTERNBERT 0
++#endif
++#ifndef FPGA
++#define FPGA 0
++#endif
++#ifndef INBAND
++#define INBAND 0
++#endif
++#ifndef ISDN
++#define ISDN 0
++#endif
++#ifndef ISDN_DEBUG
++#define ISDN_DEBUG 0
++#endif
++#ifndef LINE_DIAG
++#define LINE_DIAG 1
++#endif
++#ifndef LOOP_BACK_DEBUG
++#define LOOP_BACK_DEBUG 0
++#endif
++#ifndef MANUFACTURING_TESTS
++#define MANUFACTURING_TESTS 0
++#endif
++#ifndef MARGIN_DELTA_RETRAIN
++#define MARGIN_DELTA_RETRAIN 1
++#endif
++#ifndef MEM_STR
++#define MEM_STR 0
++#endif
++#ifndef MFGR_DIAG
++#define MFGR_DIAG 0
++#endif
++#ifndef NLNOISEADJSNR
++#define NLNOISEADJSNR 0
++#endif
++#ifndef NLNOISEADJSNR_EC
++#define NLNOISEADJSNR_EC 0
++#endif
++#ifndef NTR_MODE
++#define NTR_MODE 0
++#endif
++#ifndef OAM_EOC
++#define OAM_EOC 1
++#endif
++#ifndef OLAYDP
++#define OLAYDP 0
++#endif
++#ifndef OLAYDP_EMIF
++#define OLAYDP_EMIF 0
++#endif
++#ifndef OLAYDP_2STEP
++#define OLAYDP_2STEP 0
++#endif
++#ifndef OLAYDP_PCI
++#define OLAYDP_PCI 0
++#endif
++#ifndef OUTBAND
++#define OUTBAND 0
++#endif
++#ifndef OVHD_PMDTEST_PARA
++#define OVHD_PMDTEST_PARA 0
++#endif
++#ifndef PERTONE_EQ
++#define PERTONE_EQ 0
++#endif
++#ifndef PHY_EC_ENABLE
++#define PHY_EC_ENABLE 1
++#endif
++#ifndef PHY_HYB_ENABLE
++#define PHY_HYB_ENABLE 1
++#endif
++#ifndef PHY_NDIAG_ENABLE
++#define PHY_NDIAG_ENABLE 0
++#endif
++#ifndef PHY_PATH_ENABLE
++#define PHY_PATH_ENABLE 1
++#endif
++#ifndef PHY_TDW_ENABLE
++#define PHY_TDW_ENABLE 0
++#endif
++#ifndef TC_ATM_PCIMASTER
++#define TC_ATM_PCIMASTER 0
++#endif
++#ifndef SEPARATE_TX_RX_BUFFERS
++#define SEPARATE_TX_RX_BUFFERS 0
++#endif
++#ifndef SHALF
++#define SHALF 0
++#endif
++#ifndef SPECTRAL_SHAPING
++#define SPECTRAL_SHAPING 1
++#endif
++#ifndef SNR_UPDATE
++#define SNR_UPDATE 1
++#endif
++#ifndef TC_DEBUG
++#define TC_DEBUG 0
++#endif
++#ifndef TC_LOOPBACK
++#define TC_LOOPBACK 0
++#endif
++#ifndef TESTMODE
++#define TESTMODE 0
++#endif
++#ifndef TRELLIS
++#define TRELLIS 1
++#endif
++#ifndef TXDF2B_PROFILING
++#if (SERVICE_POTS & (!MFGR_DIAG) & (CO_PROFILE))
++#define TXDF2B_PROFILING 1
++#else
++#define TXDF2B_PROFILING 0
++#endif
++#endif
++#ifndef US_CRC_RETRAIN
++#define US_CRC_RETRAIN 1
++#endif
++#ifndef US_LOOP_BACK
++#define US_LOOP_BACK 0
++#endif
++#ifndef USB
++#define USB 0
++#endif
++#ifndef READSL2_ENABLE
++#define READSL2_ENABLE 1
++#endif
++
++// Interop tokens
++#ifndef GHS_NON_STD_FIELD
++#define GHS_NON_STD_FIELD 0
++#endif
++#ifndef LUCENT_ANYMEDIA_ENIATT_INTEROP
++#define LUCENT_ANYMEDIA_ENIATT_INTEROP 0
++#endif
++
++
++//
++// END Could automatically generate showdefs code
++//
++#if DSPDP_FEATURE_CODE
++#else
++// Unrecognized_suffix____check_spelling
++#endif
++//
++// LNK_CMD is set when running CPP to generate lnk_cpe.cmd file
++// -- the linker is not happy when it sees C code show up in the
++// result!
++//
++#ifndef LNK_CMD
++extern int compile_happy; // Keep the compiler from complaining about an empty file
++#endif
++
++#endif
++
+diff -urN linux.old/drivers/atm/sangam_atm/env_def_typedefs.h linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h
+--- linux.old/drivers/atm/sangam_atm/env_def_typedefs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h 2005-07-10 08:02:01.447110904 +0200
+@@ -0,0 +1,228 @@
++#ifndef __ENV_DEF_TYPEDEFS_H__
++#define __ENV_DEF_TYPEDEFS_H__ 1
++
++/*******************************************************************************
++* FILE PURPOSE: Define data types for C and TMS320C6x C compilers
++********************************************************************************
++*
++* FILE NAME: dpsys_typedefs.h
++*
++* DESCRIPTION:
++* This file contains the main typedefs that we need.
++*
++* HISTORY:
++*
++* 03/11/97 Bob Lee Created
++* 03/13/97 Chishtie
++* 03/14/97 Bob Lee Format change to meet "Engineering Model
++* - System Architucture Specification"
++* Rev AP3. Jan. 29, 1997
++* 07/21/00 Barnett Moved many common typedefs from
++* host i/f header file to here.
++* 03/30/01 Barnett Mod's per driver team feedback.
++* Some tokens cannot be def'ed
++* if _WINDEF_ is def'ed.
++* 04/05/01 Barnett Added DSPDP_ prefix to tokens that originate
++* in the public interface.
++* 06/01/01 J. Bergsagel Modified to add standard typedefs
++* 07/25/01 J. Bergsagel Changed name from typedefs.h to dpsys_typedefs.h
++* 07/30/01 J. Bergsagel Moved typedefs that were conflicting with Windows
++* driver software to the "#ifndef _WINDEF_" section.
++* 08/09/01 S. Yim Moved FALSE/TRUE definitions from ctl_interface_u.h
++* (conflict with BIOS/std.h)
++* 09/03/01 S. Yim Do not include typedef char and float if _STD defined
++* (conflict with BIOS/std.h)
++* 01/21/03 MCB Implemented Ax7 UNIT-MODULE modular software framework.
++* 03/20/03 Mallesh Defined size of basic variables
++* 03/27/03 F. Mujica Added SINT40 and UINT40 definitions.
++*
++* (C) Copyright Texas Instruments Inc. 1997-2001. All rights reserved.
++*******************************************************************************/
++
++// Common type definitions
++
++// Basic constants needed everywhere
++#ifndef STD_
++#define FALSE 0
++#define TRUE 1
++#endif
++
++// Read-Write Data Types
++typedef signed char SINT8; // Signed 8-bit integer (7-bit magnitude)
++typedef unsigned char UINT8; // Unsigned 8-bit integer
++typedef signed short SINT16; // Signed 16-bit integer (15-bit magnitude)
++typedef unsigned short UINT16; // Unsigned 16-bit integer
++typedef signed int SINT32; // Signed 32-bit integer (31-bit magnitude)
++typedef unsigned int UINT32; // Unsigned 32-bit integer
++typedef long signed int SINT40; // Long signed 40-bit integer
++typedef long unsigned int UINT40; // Long unsigned 40-bit integer
++
++// All pointers are 32 bits long
++typedef SINT8 *PSINT8; // Pointer to SINT8
++typedef UINT8 *PUINT8; // Pointer to UINT8
++typedef SINT16 *PSINT16; // Pointer to SINT16
++typedef UINT16 *PUINT16; // Pointer to UINT16
++typedef SINT32 *PSINT32; // Pointer to SINT32
++typedef UINT32 *PUINT32; // Pointer to UINT32
++
++#define SIZEOF_SINT8 1
++#define SIZEOF_UINT8 1
++#define SIZEOF_SINT16 2
++#define SIZEOF_UINT16 2
++#define SIZEOF_SINT32 4
++#define SIZEOF_UINT32 4
++#define SIZEOF_SINT40 8
++#define SIZEOF_UINT40 8
++
++// Size of Read-Write Data Types - in bytes
++#define SIZEOF_char 1
++#define SIZEOF_Int8 1
++#define SIZEOF_UChar 1
++#define SIZEOF_UInt8 1
++#define SIZEOF_Float 4
++#define SIZEOF_Double 8
++#define SIZEOF_byte 1
++
++// Read-Only Data Types - should be only used for ROM code
++typedef const char CharRom; // 8 bit signed character
++typedef const signed char Int8Rom; // 8 bit signed integer
++typedef const unsigned char UCharRom; // 8 bit unsigned character
++typedef const unsigned char UInt8Rom; // 8 bit unsigned integer
++typedef const float FloatRom; // IEEE 32-bit
++typedef const double DoubleRom; // IEEE 64-bit
++
++#ifndef _WINDEF_
++
++// Read-Write Data Types
++typedef signed char Int8; // 8 bit signed integer
++typedef unsigned char UChar; // 8 bit unsigned character
++typedef unsigned char UInt8; // 8 bit unsigned integer
++#ifndef STD_
++typedef char Char; // 8 bit signed character
++typedef float Float; // IEEE 32-bit
++#endif
++typedef double Double; // IEEE 64-bit
++typedef signed char byte; // 8 bit signed integer
++
++
++// These typedefs collide with those in Win2k DDK inc\WINDEF.H
++
++// common type definition
++typedef unsigned char BYTE; // 8-bit
++typedef signed short SHORT; // 16-bit signed
++typedef unsigned short WORD; // 16-bit
++typedef unsigned int DWORD; // 32-bit, TI DSP has 40 bit longs
++
++// All pointers are 32 bits long
++typedef BYTE *PBYTE; // pointer to 8 bit data
++typedef unsigned char *PCHAR; // pointer to 8 bit data
++typedef SHORT *PSHORT; // pointer to 16 bit data
++typedef WORD *PWORD; // pointer to 16 bit data
++typedef DWORD *PDWORD; // pointer to 32 bit data
++
++#endif // #ifndef _WINDEF_
++
++
++#define SIZEOF_BYTE 1
++#define SIZEOF_SHORT 2
++#define SIZEOF_WORD 2
++#define SIZEOF_DWORD 4
++#define SIZEOF_PCHAR 4
++#define SIZEOF_PWORD 4
++#define SIZEOF_PDWORD 4
++
++// Size of Read-Only Data Types - in bytes
++#define SIZEOF_CharRom 1
++#define SIZEOF_Int8Rom 1
++#define SIZEOF_UCharRom 1
++#define SIZEOF_UInt8Rom 1
++#define SIZEOF_FloatRom 4
++#define SIZEOF_DoubleRom 8
++
++#define SIZEOF_complex_byte (2*SIZEOF_byte)
++#define SIZEOF_PTR_complex_byte 4
++typedef struct {
++ byte re;
++ byte im;
++} complex_byte, *PTR_complex_byte;
++
++#define SIZEOF_complex_short 4
++#define SIZEOF_PTR_complex_short 4
++typedef struct {
++ short re;
++ short im;
++} complex_short, *PTR_complex_short;
++
++#define SIZEOF_complex_int 8
++#define SIZEOF_PTR_complex_int 4
++typedef struct {
++ int re;
++ int im;
++} complex_int, *PTR_complex_int;
++
++typedef struct {
++ int high;
++ unsigned int low;
++} int64;
++
++typedef struct {
++ int64 real;
++ int64 imag;
++} complex_int64;
++
++#define SIZEOF_PVOID 4
++typedef void *PVOID; // pointer to void
++
++//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
++
++#if defined(_TMS320C6X) // TMS320C6xx type definitions
++
++// Read-Write Data Types
++typedef short Int16; // 16 bit signed integer
++typedef unsigned short UInt16; // 16 bit unsigned integer
++typedef int Int32; // 32 bit signed integer
++typedef unsigned int UInt32; // 32 bit unsigned signed integer
++typedef long Long40; // 40 bit signed integer
++typedef unsigned long ULong40; // 40 bit unsigned signed integer
++
++// Size of Read-Write Data Types - in bytes
++#define SIZEOF_Int16 2
++#define SIZEOF_UInt16 2
++#define SIZEOF_Int32 4
++#define SIZEOF_UInt32 4
++#define SIZEOF_Long40 5
++#define SIZEOF_ULong40 5
++
++// Read-Only Data Types - should be only used for ROM code
++typedef const short Int16Rom; // 16 bit signed integer
++typedef const unsigned short UInt16Rom; // 16 bit unsigned integer
++typedef const int Int32Rom; // 32 bit signed integer
++typedef const unsigned int UInt32Rom; // 32 bit unsigned signed integer
++typedef const long Long40Rom; // 40 bit signed integer
++typedef const unsigned long ULong40Rom; // 40 bit unsigned signed integer
++
++// Size of Read-Only Data Types - in bytes
++#define SIZEOF_Int16Rom 2
++#define SIZEOF_UInt16Rom 2
++#define SIZEOF_Int32Rom 4
++#define SIZEOF_UInt32Rom 4
++#define SIZEOF_Long40Rom 5
++#define SIZEOF_ULong40Rom 5
++
++#else // 32 bits PC Host type definitions
++
++// Read-Write Data Types
++typedef short Int16; // 16 bit signed integer
++typedef unsigned short UInt16; // 16 bit unsigned integer
++typedef int Int32; // 32 bit signed integer
++typedef unsigned int UInt32; // 32 bit unsigned integer
++
++// Read-Only Data Types - should be only used for ROM code
++typedef const short Int16Rom; // 16 bit signed integer
++typedef const unsigned short UInt16Rom; // 16 bit unsigned integer
++typedef const int Int32Rom; // 32 bit signed integer
++typedef const unsigned int UInt32Rom; // 32 bit unsigned integer
++
++#endif
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/Makefile linux.dev/drivers/atm/sangam_atm/Makefile
+--- linux.old/drivers/atm/sangam_atm/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/Makefile 2005-07-10 08:02:01.448110752 +0200
+@@ -0,0 +1,35 @@
++# File: drivers/net/avalanche_cpmac/Makefile
++#
++# Makefile for the Linux network (CPMAC) device drivers.
++#
++
++
++O_TARGET := tiatm.o
++obj-$(CONFIG_MIPS_SANGAM_ATM) += tiatm.o
++list-multi := tiatm.o
++
++tiatm-objs := tn7atm.o tn7dsl.o tn7sar.o dsl_hal_api.o dsl_hal_support.o cpsar.o aal5sar.o
++
++EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
++
++ifeq ($(ANNEX),B)
++EXTRA_CFLAGS += -DANNEX_B -DB
++else
++ifeq ($(ANNEX),C)
++EXTRA_CFLAGS += -DANNEX_C -DC
++else
++EXTRA_CFLAGS += -DANNEX_A -DP
++endif
++endif
++
++
++include $(TOPDIR)/Rules.make
++
++tiatm.o: $(tiatm-objs)
++ $(LD) -r -o $@ $(tiatm-objs)
++
++#avalanche_cpmac.o: $(avalanche_cpmac-objs)
++# $(LD) -r -o $@ $(avalanche_cpmac-objs)
++
++clean:
++ rm -f core *.o *.a *.s
+diff -urN linux.old/drivers/atm/sangam_atm/queue.h linux.dev/drivers/atm/sangam_atm/queue.h
+--- linux.old/drivers/atm/sangam_atm/queue.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/queue.h 2005-07-10 08:02:01.448110752 +0200
+@@ -0,0 +1,167 @@
++
++#if !defined( __QUEUE_H__ )
++#define __QUEUE_H__
++
++typedef spinlock_t OS_SPIN_LOCK;
++#define osFreeSpinLock(pLock) while(0)
++void osAcquireSpinLock(OS_SPIN_LOCK *pLock);
++void osReleaseSpinLock(OS_SPIN_LOCK *pLock);
++void osAllocateSpinLock(OS_SPIN_LOCK *pLock);
++
++//#define osAcquireSpinLock(pLock) spin_lock(pLock)
++//#define osReleaseSpinLock(pLock) spin_unlock(pLock)
++//#define osAllocateSpinLock(pLock) spin_lock_init(pLock)
++
++
++typedef struct _TI_LIST_ENTRY {
++ struct _TI_LIST_ENTRY *Flink;
++ struct _TI_LIST_ENTRY *Blink;
++} TI_LIST_ENTRY, *PTI_LIST_ENTRY, TQE, *PTQE;
++
++typedef struct _TIATM_LIST_ENTRY
++{
++ TI_LIST_ENTRY Link;
++} TIATM_LIST_ENTRY, *PTIATM_LIST_ENTRY;
++
++//-------------------------------------------------------------------------
++// QueueInitList -- Macro which will initialize a queue to NULL.
++//-------------------------------------------------------------------------
++#define QueueInitList(_L) (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY)0;
++
++//-------------------------------------------------------------------------
++// QueueEmpty -- Macro which checks to see if a queue is empty.
++//-------------------------------------------------------------------------
++#define QueueEmpty(_L) (QueueGetHead((_L)) == (PTIATM_LIST_ENTRY)0)
++
++//-------------------------------------------------------------------------
++// QueueGetHead -- Macro which returns the head of the queue, but does not
++// remove the head from the queue.
++//-------------------------------------------------------------------------
++#define QueueGetHead(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Flink))
++
++#define QueueGetNext(Elem) ((PTIATM_LIST_ENTRY)((Elem)->Link.Flink))
++
++//-------------------------------------------------------------------------
++// QueuePushHead -- Macro which puts an element at the head of the queue.
++//-------------------------------------------------------------------------
++#define QueuePushHead(_L,_E) \
++ if (!((_E)->Link.Flink = (_L)->Link.Flink)) \
++ { \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
++ } \
++(_L)->Link.Flink = (PTI_LIST_ENTRY)(_E);
++
++//-------------------------------------------------------------------------
++// QueueRemoveHead -- Macro which removes the head of the head of queue.
++//-------------------------------------------------------------------------
++#define QueueRemoveHead(_L) \
++{ \
++ PTIATM_LIST_ENTRY ListElem; \
++ if (ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink) \
++ { \
++ if(!((_L)->Link.Flink = ListElem->Link.Flink)) \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
++ } \
++}
++
++//-------------------------------------------------------------------------
++// QueuePutTail -- Macro which puts an element at the tail (end) of the queue.
++//-------------------------------------------------------------------------
++#define QueuePutTail(_L,_E) \
++{ \
++ if ((_L)->Link.Blink) \
++ { \
++ ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
++ } \
++ else \
++ { \
++ (_L)->Link.Flink = \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
++ } \
++ (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
++}
++
++//-------------------------------------------------------------------------
++// QueuePutTailWithLock -- Macro which puts an element at the tail (end) of
++// the queue, using spin lock.
++//-------------------------------------------------------------------------
++#define QueuePutTailWithLock(_L,_E, pLock) \
++{ \
++ osAcquireSpinLock(pLock); \
++ if ((_L)->Link.Blink) \
++ { \
++ ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
++ } \
++ else \
++ { \
++ (_L)->Link.Flink = \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
++ } \
++ (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
++ osReleaseSpinLock(pLock); \
++}
++
++//-------------------------------------------------------------------------
++// QueueGetTail -- Macro which returns the tail of the queue, but does not
++// remove the tail from the queue.
++//-------------------------------------------------------------------------
++#define QueueGetTail(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Blink))
++
++//-------------------------------------------------------------------------
++// QueuePopHead -- Macro which will pop the head off of a queue (list), and
++// return it (this differs only from queueremovehead only in
++// the 1st line)
++//-------------------------------------------------------------------------
++#define QueuePopHead(_L) \
++(PTIATM_LIST_ENTRY) (_L)->Link.Flink; QueueRemoveHead(_L);
++
++#define QueueRemoveTail(_L) \
++{ \
++ PTIATM_LIST_ENTRY ListElem; \
++ ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
++ if(ListElem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
++ { \
++ (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
++ } \
++ else \
++ { \
++ while(ListElem->Link.Flink != (PTI_LIST_ENTRY)(_L)->Link.Blink) \
++ { \
++ ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
++ } \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY) ListElem; \
++ ListElem->Link.Flink = (PTI_LIST_ENTRY)0; \
++ } \
++}
++
++#define QueueRemoveItem(_L, Elem) \
++{ \
++ PTIATM_LIST_ENTRY ListElem; \
++ ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
++ if(ListElem == Elem) \
++ { \
++ QueueRemoveHead(_L); \
++ } \
++ else \
++ { \
++ while(ListElem) \
++ { \
++ if(Elem == (PTIATM_LIST_ENTRY)ListElem->Link.Flink) \
++ { \
++ ListElem->Link.Flink = ((PTIATM_LIST_ENTRY)Elem)->Link.Flink; \
++ if(Elem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
++ (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
++ break; \
++ } \
++ ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
++ }\
++ } \
++ ((PTIATM_LIST_ENTRY)Elem)->Link.Flink = (PTI_LIST_ENTRY) 0; \
++}
++
++#define QueuePopTail(_L) \
++((PTIATM_LIST_ENTRY)((_L)->Link.Blink)); QueueRemoveTail(_L);
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/release.txt linux.dev/drivers/atm/sangam_atm/release.txt
+--- linux.old/drivers/atm/sangam_atm/release.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/release.txt 2005-07-10 08:02:01.449110600 +0200
+@@ -0,0 +1,118 @@
++This is release notes for AR7 Linux ATM driver.
++
++version 04.02.04.00
++-------------------
++
++1. Corrected the conditional logic from logical AND to logical OR in the case
++ of check for DSL line down condition. This is to fix PPPoA crashing
++ problem when DSL line is unplugged.
++
++version 04.02.03.00
++-------------------
++1. Changed overlay page to static allocation.
++2. Added flag to stop TX during channel closing.
++3. Changed DMA memory allocation back to "GFP_ATOMIC" flag.
++
++version 04.02.02.00
++-------------------
++1. Changed DMA memory allocation from "GFP_ATOMIC" to "GFP_KERNEL" flag.
++2. Added "DoMask" setting for VBR channel setup.
++
++version 04.02.01.01
++-------------------
++1. Modified priority check scheme per SPTC request.
++
++Version 04.02.01.00
++-------------------
++1. Add check to skb->priority to place packets to either normal or priority queue.
++2. Add spin lock to increment and decrement of queued buffer number.
++
++Version 04.02.00.00
++-------------------
++Features:
++1. Add MBS and CDVT QoS support for ATM driver.
++2. Add "stop/start queue" for ToS application.
++3. Add Showtime margin retrain based on EOC message.
++4. Add EOC vendor ID customalization logic for Annex B.
++5. Supports D3 datapump.
++
++Version 04.01.00.00
++-------------------
++Re-release of 04.00.07.00 for D1.1 datapump.
++
++Version 04.00.07.00
++-------------------
++Features:
++1. Add marging retrain capability by setting following Adam2 Env.
++ setenv enable_margin_retrain 1
++ setenv margin_threshold xx, xx is in half db, i.e., 10 means 5db.
++
++Bugfixs:
++1. New PDSP firmware that fix the F5 OAM cell loopback probelm in Cisco DSLAM.
++
++Version 04.00.06.00
++-------------------
++1. ATM interrupt pacing is defauted to 2 interrupts/s.
++2. Rx Service MAX changed ftom 16 to 8.
++
++Version 04.00.05.00
++-------------------
++Features:
++1. Add Adam2 env to disable the TurboDSL by entering "setenv TurboDSL 0".
++2. Add ability to set interrupt pacing for ATM driver.
++
++Bugfixs:
++1. Fixed the RFC2684 and CLIP problems for Cisco router.
++2. Fixed LED blinking problem when DSL cable is unplugged.
++3. Fixed problem that "selected mode" is not updated.
++
++Version 04.00.04.00
++-------------------
++Features:
++1. Added feature so OAM F5 ping will not require a corresponding PVC channel to
++ be setup.
++2. Added timeout value for F5 OAM ping. The new command are "exxxpyyycdzzzt" for
++ end-to-end and "sxxxpyyycdzzzt" for segment. "zzz" is timeout value in milli-second.
++3. Added proc entry "avsar_pvc_table" to record received VPIs and VCIs. The format is
++ vpi,vci
++ seperated by new line. To search for PVCs, an application can do the following.
++ i) Send a (or several) F5 OAM cell on a VPI/VPI pairs with command
++ echo exxxpyyycd2t > /proc/sys/dev/dslmod
++ ii) Wait >2ms or poll proc entry /proc/avalanche/avsar_oam_ping until the result
++ indicates a failure. (It will be failed all the time with 2ms timeout.)
++ iii) Repeat above two steps for new VPI/VCI pairs.
++ iv) Check proc entry /proc/avalanche/avsar_pvc_table any time for PVCs that responded.
++
++Version 04.00.03.00
++-------------------
++Bug Fixs:
++1. Fixed bug that caused crash when phone cable is unplugged.
++2. Fixed LED operation for "flexible LEDs".
++
++Features:
++1. Added the proc entry "avsar_oam_ping" to signal oam ping result.
++ 0 - failed; 1 - success; 2 - in progress.
++2. Added oam ping timeout env variable. The timeout can be specified by
++ adding Adam2 env "oam_lb_timeout". The value is in millisecond.
++
++Version 04.00.02.00
++-------------------
++1. The driver uses hardware queue for Turbo DSL.
++2. Added new modem statistics listed below:
++ US and DS TX powers, atuc Vendor ID and revision, training mode selected,
++ Hybrid Selected, and etc.
++
++Version 04.00.01.00
++-------------------
++
++1. This driver release contains all the features that exists in AR5 Linux ATM
++ 3.1 driver.
++
++2. F4 OAM generation is added.
++
++3. Software queuing is used for TURBO DSL.
++
++4. Porting guide "is created. Please look into that document for detailed
++ information.
++
++
+diff -urN linux.old/drivers/atm/sangam_atm/syssw_version.h linux.dev/drivers/atm/sangam_atm/syssw_version.h
+--- linux.old/drivers/atm/sangam_atm/syssw_version.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/syssw_version.h 2005-07-10 08:02:01.449110600 +0200
+@@ -0,0 +1,94 @@
++#ifndef __SYSSW_VERSION_H__
++#define __SYSSW_VERSION_H__ 1
++
++/*******************************************************************************
++* FILE PURPOSE: DSL Driver API functions for Sangam
++*
++********************************************************************************
++* FILE NAME: dsl_hal_basicapi.c
++*
++* DESCRIPTION:
++* Contains basic DSL HAL APIs for Sangam
++*
++* (C) Copyright 2003-04, Texas Instruments, Inc.
++* History
++* Date Version Notes
++* 14May03 0.00.00 RamP Original Version Created
++* 14May03 0.00.01 RamP Initial Rev numbers inserted
++* 14May03 0.00.02 RamP Bumped version numbers for Dsl Hal
++* & dhalapp for alpha plus
++* 19May03 0.00.03 MCB Bumped dslhal version number
++* because of dependant changes
++* wrt. linux-nsp atm drivers.
++* 22May03 0.00.04 RamP Bumped dslhal & dhalapp buildnum
++* for inner/outer pair & DGASP code
++* 06Jun03 0.00.05 RamP Bumped up buildnum for LED, STM,
++* interrupt processing, statistics
++* and other pre-beta features
++* 09Jun03 0.00.06 JEB Fixed error in DHALAPP bugfix/buildnum
++* 09Jun03 0.00.07 RamP Bumped up buildnum for incremental
++* changes to apis, statistics, memory
++* fixes, parameter configurations
++* 11Jun03 0.00.08 RamP Bumped up buildnum for Co profile
++* free memory fix
++* 12Jun03 0.00.09 JEB Bumped version numbers for AR7 1.00 Beta
++* 02Jul03 0.00.10 ZT Bumped HAL version for overlay page
++* 18Jul03 0.00.11 RamP Bumped HAL version for analog diags
++* 22Jul03 0.00.12 JEB Bumped DHALAPP buildnum for analog diags
++* 31Jul03 0.00.13 RamP Bumped HAL version for engr. drop
++* 04Aug03 0.00.14 JEB Bumped HAL version buildnum for CHECKPOINT65 changes
++* Bumped LINUX version buildnum for CHECKPOINT65 changes
++* 06Aug03 0.00.15 MCB Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
++* 13Aug03 0.00.16 MCB Set rev id's for D3/R1.1 (ADSL2).
++* 21Aug03 0.00.17 JEB Bumped up build numbers for merge of code additions from D1
++* 26Sep03 0.00.18 JEB Set rev id's for another D3/R1 (ADSL2).
++* 14Oct03 0.00.19 JEB Bumped Linux minor number and reset bugfix number for release.
++* Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
++* 14Oct03 0.00.20 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
++* 21Oct03 0.00.21 JEB Bumped build number on DSLHAL for CHECKPOINT16.
++* 22Oct03 0.00.22 MCB Bumped all version numbers in support of D3R1 release.
++* 27Oct03 0.00.23 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
++* Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
++* 30Oct03 0.00.24 JEB Bumped bugfix number on LINUXATM Version for next release.
++* Bumped build numbers on DSLHAL and DHALAPP
++* 31Oct03 0.00.25 MCB Bumped all version numbers in support of D3R2 release.
++* 14Nov03 0.00.26 JEB Bumped build numbers on DSLHAL and DHALAPP
++* Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
++* 20Nov03 0.00.27 JEB Bumped build number on DSLHAL.
++* Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
++* 21Nov03 0.00.28 MCB Bumped all version numbers in support of D3R2 release.
++* 21Nov03 0.00.29 JEB Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
++* 16Dec03 0.00.30 JEB Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
++* 21Dec03 0.00.31 MCB Bumped all version numbers in support of D3R2 release.
++* 05Jan04 0.00.32 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
++* 15Jan04 0.00.33 JEB Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
++* 26Jan04 0.00.34 JEB Changed Linux ATM version number to be 04.02.03.00.
++* 27Jan04 0.00.35 MCB Bumped all version numbers in support of D3R2 release.
++*******************************************************************************/
++
++/* Dsl Hal API Version Numbers */
++#define DSLHAL_VERSION_MAJOR 03
++#define DSLHAL_VERSION_MINOR 00
++#define DSLHAL_VERSION_BUGFIX 06
++#define DSLHAL_VERSION_BUILDNUM 00
++#define DSLHAL_VERSION_TIMESTAMP 00
++
++/* dhalapp Adam2 Application Version Numbers */
++#define DHALAPP_VERSION_MAJOR 03
++#define DHALAPP_VERSION_MINOR 00
++#define DHALAPP_VERSION_BUGFIX 05
++#define DHALAPP_VERSION_BUILDNUM 00
++
++/* Linux ATM Driver Version Numbers */
++#define LINUXATM_VERSION_MAJOR 04
++#define LINUXATM_VERSION_MINOR 02
++#define LINUXATM_VERSION_BUGFIX 04
++#define LINUXATM_VERSION_BUILDNUM 00
++
++/* DSL Agent Version Numbers */
++#define DSLAGENT_VERSION_MAJOR 02
++#define DSLAGENT_VERSION_MINOR 00
++#define DSLAGENT_VERSION_BUGFIX 02
++#define DSLAGENT_VERSION_BUILDNUM 00
++
++#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
+diff -urN linux.old/drivers/atm/sangam_atm/tn7api.h linux.dev/drivers/atm/sangam_atm/tn7api.h
+--- linux.old/drivers/atm/sangam_atm/tn7api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tn7api.h 2005-07-10 08:02:01.450110448 +0200
+@@ -0,0 +1,54 @@
++/*
++ * Tnetd73xx ATM driver.
++ * by Zhicheng Tang, ztang@ti.com
++ * 2000 (c) Texas Instruments Inc.
++ *
++ *
++*/
++
++#ifndef __SAPI_H
++#define __SAPI_H
++
++/* tn7atm.c */
++void xdump(unsigned char *buff, int len, int debugLev);
++int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data);
++void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size);
++void tn7atm_free_rx_skb(void *skb);
++void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num);
++int tn7atm_send_complete(void *osSendInfo);
++int tn7atm_device_connect_status(void *priv, int state);
++int tn7atm_lut_find(short vpi, int vci);
++
++/* tn7dsl.h */
++void tn7dsl_exit(void);
++int tn7dsl_init(void *priv);
++int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++int tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++int tn7dsl_handle_interrupt(void);
++void dprintf( int uDbgLevel, char * szFmt, ...);
++void tn7dsl_dslmod_sysctl_register(void);
++void tn7dsl_dslmod_sysctl_unregister(void);
++int tn7dsl_get_dslhal_version(char *pVer);
++int tn7dsl_get_dsp_version(char *pVer);
++
++int os_atoi(const char *pStr);
++int os_atoh(const char *pStr);
++unsigned long os_atoul(const char *pStr);
++
++/* tn7sar.c */
++int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos);
++int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv);
++int tn7sar_register_interrupt_handle(void *os_dev, void *hal_isr, int *interrupt_num);
++void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv);
++int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan);
++int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv);
++int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority);
++void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer);
++int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count);
++int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout);
++int tn7sar_get_stats(void *priv1);
++int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls);
++int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.c linux.dev/drivers/atm/sangam_atm/tn7atm.c
+--- linux.old/drivers/atm/sangam_atm/tn7atm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tn7atm.c 2005-07-10 19:35:40.033466344 +0200
+@@ -0,0 +1,1212 @@
++/*
++ * tn7.c
++ * Linux atm module implementation.
++ * Zhicheng Tang 01/08/2003
++ * 2003 (c) Texas Instruments Inc.
++ *
++ *
++*/
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/atmdev.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/smp_lock.h>
++#include <asm/io.h>
++#include <asm/mips-boards/prom.h>
++#include <linux/proc_fs.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include "tn7atm.h"
++#include "tn7api.h"
++#include "syssw_version.h"
++
++#ifdef CONFIG_LED_MODULE
++#include <asm/ar7/ledapp.h>
++#endif
++
++#ifdef MODULE
++MODULE_DESCRIPTION ("Tnetd73xx ATM Device Driver");
++MODULE_AUTHOR ("Zhicheng Tang");
++#endif
++
++/* Version Information */
++//static char atm_version[] ="1.0.0.1";
++
++
++#define TRUE 1
++#define FALSE 0
++
++#define STOP_EMPTY_BUFF 2
++#define START_EMPTY_BUFF 3
++/* externs */
++
++/*end of externs */
++
++#define tn7atm_kfree_skb(x) dev_kfree_skb(x)
++
++/* prototypes */
++int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci);
++
++void tn7atm_close (struct atm_vcc *vcc);
++
++static int tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg);
++
++int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb);
++
++static int tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags);
++
++static int tn7atm_detect(void);
++static int tn7atm_init(struct atm_dev* dev);
++//static int tn7atm_reset(void);
++static int tn7atm_irq_request(struct atm_dev* dev);
++static int tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++static void tn7atm_exit(void);
++static int tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data);
++static int tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof,void *data);
++//static void tn7atm_free_packet(void *vcc1, void *priv, void *skb1);
++static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1);
++
++#include "turbodsl.c"
++
++/* ATM device operations */
++
++struct atm_dev *mydev;
++
++static const struct atmdev_ops tn7atm_ops = {
++ open: tn7atm_open,
++ close: tn7atm_close,
++ ioctl: tn7atm_ioctl,
++ getsockopt: NULL,
++ setsockopt: NULL,
++ send: tn7atm_send,
++ sg_send: NULL,
++ phy_put: NULL,
++ phy_get: NULL,
++ change_qos: tn7atm_change_qos,
++};
++
++
++int __guDbgLevel = 1;
++
++
++void xdump(unsigned char *buff, int len, int debugLev)
++{
++#ifdef DEBUG_BUILD
++ int i, j;
++ if( __guDbgLevel < debugLev)
++ return;
++
++ j=0;
++ for(i=0;i<len;i++)
++ {
++ printk("%02x ", buff[i]);
++ j++;
++ if(j==8)
++ {
++ j=0;
++ printk("\n");
++ }
++ }
++ printk("\n");
++#endif
++}
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_walk_vccs(struct atm_dev *dev, short *vcc, int *vci)
++ *
++ * Description: retrieve VPI/VCI for connection
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++static int
++tn7atm_walk_vccs(struct atm_vcc *vcc, short *vpi, int *vci)
++{
++ struct atm_vcc* walk;
++
++ // printk(tn7 "tn7atm_walk_vccs\n");
++ /* find a free VPI */
++ if (*vpi == ATM_VPI_ANY) {
++
++ for (*vpi = 0, walk = vcc->dev->vccs; walk; walk = walk->next) {
++
++ if ((walk->vci == *vci) && (walk->vpi == *vpi)) {
++ (*vpi)++;
++ walk = vcc->dev->vccs;
++ }
++ }
++ }
++
++ /* find a free VCI */
++ if (*vci == ATM_VCI_ANY) {
++
++ for (*vci = ATM_NOT_RSV_VCI, walk = vcc->dev->vccs; walk; walk = walk->next) {
++
++ if ((walk->vpi = *vpi) && (walk->vci == *vci)) {
++ *vci = walk->vci + 1;
++ walk = vcc->dev->vccs;
++ }
++ }
++ }
++
++ return 0;
++}
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_sar_irq(void)
++ *
++ * Description: tnetd73xx SAR interrupt.
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++static void
++tn7atm_sar_irq(int irq , void *voiddev , struct pt_regs *regs)
++{
++ struct atm_dev *atmdev;
++ Tn7AtmPrivate *priv;
++
++ dprintf(6, "tn7atm_sar_irq\n");
++ atmdev = (struct atm_dev *) voiddev;
++ priv = (Tn7AtmPrivate *)atmdev->dev_data;
++
++ tn7sar_handle_interrupt(atmdev, priv);
++
++ dprintf(6, "Leaving tn7atm_sar_irq\n");
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_dsl_irq(void)
++ *
++ * Description: tnetd73xx DSL interrupt.
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++static void
++tn7atm_dsl_irq(int irq , void *voiddev , struct pt_regs *regs)
++{
++ struct atm_dev *atmdev;
++ Tn7AtmPrivate *priv;
++
++ dprintf(4, "tn7atm_dsl_irq\n");
++ atmdev = (struct atm_dev *) voiddev;
++ priv = (Tn7AtmPrivate *)atmdev->dev_data;
++
++ tn7dsl_handle_interrupt();
++
++ dprintf(4, "Leaving tn7atm_dsl_irq\n");
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_Inittxcomp(struct tn7* tn7)
++ *
++ * Description: Initialize Interrupt handler
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
++static int __init
++tn7atm_irq_request (struct atm_dev *dev)
++{
++ Tn7AtmPrivate *priv;
++ char *ptr;
++ int ipace=2;
++
++ dprintf(4, "tn7atm_irq_request()\n");
++ priv = (Tn7AtmPrivate *) dev->dev_data;
++
++ /* Register SAR interrupt */
++ priv->sar_irq = LNXINTNUM(ATM_SAR_INT); /* Interrupt line # */
++ if (request_irq(priv->sar_irq, tn7atm_sar_irq, SA_INTERRUPT, "SAR ", dev))
++ printk ("Could not register tn7atm_sar_irq\n");
++
++ /* interrupt pacing */
++ ptr= prom_getenv("sar_ipacemax");
++ if(ptr)
++ {
++ ipace=os_atoi(ptr);
++ }
++ avalanche_request_pacing(priv->sar_irq, ATM_SAR_INT_PACING_BLOCK_NUM, ipace);
++
++ /* Reigster Receive interrupt A */
++ priv->dsl_irq = LNXINTNUM(ATM_DSL_INT); /* Interrupt line # */
++ if (request_irq(priv->dsl_irq, tn7atm_dsl_irq, SA_INTERRUPT, "DSL ", dev))
++ printk ("Could not register tn7atm_dsl_irq\n");
++
++ return 0;
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_lut_find(struct atm_vcc *vcc)
++ *
++ * Description: find an TX DMA channel
++ * that matches a vpi/vci pair
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
++int
++tn7atm_lut_find(short vpi, int vci)
++{
++ int i;
++ Tn7AtmPrivate *priv;
++
++ priv = (Tn7AtmPrivate *)mydev->dev_data;
++
++ if(vci==0) // find first vpi channel
++ {
++ for(i=0; i< MAX_DMA_CHAN; i++)
++ {
++ if((priv->lut[i].vpi == vpi))
++ return i;
++ }
++ }
++
++ dprintf(4, "vpi=%d, vci=%d\n", vpi, vci);
++ for(i=0; i< MAX_DMA_CHAN; i++)
++ {
++ if((priv->lut[i].vpi == vpi) && (priv->lut[i].vci == vci))
++ return i;
++ }
++
++
++
++ return ATM_NO_DMA_CHAN;
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_lut_clear(struct atm_vcc *vcc,int chan)
++ *
++ * Description: find an TX DMA channel
++ * that matches a vpi/vci pair
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
++static int
++tn7atm_lut_clear(struct atm_vcc *vcc, int chan)
++{
++ Tn7AtmPrivate *priv;
++
++ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
++
++ memset(&priv->lut[chan], 0, sizeof(priv->lut[chan]));
++
++ return 0;
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_walk_lut(void)
++ *
++ * Description: find an available TX DMA channel
++ * and initialize LUT
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
++static int
++tn7atm_walk_lut(Tn7AtmPrivate *priv)
++{
++ int i;
++
++ for(i=0; i< MAX_DMA_CHAN; i++){
++ if(!priv->lut[i].inuse)
++ {
++ return i; /* return available dma channel number */
++ }
++ }
++ return ATM_NO_DMA_CHAN; /* no tx dma channels available */
++}
++
++static int
++tn7atm_set_lut(Tn7AtmPrivate *priv, struct atm_vcc *vcc, int chan)
++{
++
++ if(!priv->lut[chan].inuse)
++ {
++ priv->lut[chan].vpi = (int)vcc->vpi;
++ priv->lut[chan].vci = vcc->vci;
++ priv->lut[chan].chanid = chan;
++ priv->lut[chan].inuse = 1; /* claim the channel */
++ priv->lut[chan].vcc = (void *)vcc;
++ priv->lut[chan].bClosing = 0;
++ priv->lut[chan].ready = 0;
++ priv->lut[chan].tx_total_bufs = TX_BUFFER_NUM;
++ priv->lut[chan].tx_used_bufs[0] = 0;
++ priv->lut[chan].tx_used_bufs[1] = 0;
++ return 0;
++ }
++ return -1; /* no tx dma channels available */
++}
++
++#if 0
++static void tn7atm_free_packet(void *pVc, void *pDev, void *pPacket)
++ {
++ Tn7AtmPrivate *priv;
++ struct atm_vcc *vcc;
++ struct sk_buff *skb;
++
++ vcc = (struct atm_vcc *)pVc;
++ priv = (Tn7AtmPrivate *)pDev;
++ skb = (struct sk_buff *) pPacket;
++
++ if(vcc->pop)
++ vcc->pop(vcc, skb);
++ else
++ tn7atm_kfree_skb(skb);
++ }
++#endif
++
++static void str2eaddr(char *pMac, char *pStr)
++{
++ char tmp[3];
++ int i;
++
++ for(i=0;i<6;i++)
++ {
++ tmp[0]=pStr[i*3];
++ tmp[1]=pStr[i*3+1];
++ tmp[2]=0;
++ pMac[i]=os_atoh(tmp);
++ }
++}
++
++static int __init
++tn7atm_get_ESI(struct atm_dev *dev)
++{
++ int i;
++ char esi_addr[ESI_LEN]={0x00,0x00,0x11,0x22,0x33,0x44};
++ char *esiaddr_str = NULL;
++
++ esiaddr_str = prom_getenv("macc");
++
++ if (!esiaddr_str) {
++ //printk("macc address not set in adam2 environment space\n");
++ //printk("Using default macc address = 00:01:02:03:04:05\n");
++ esiaddr_str = "00:00:02:03:04:05";
++ }
++ str2eaddr(esi_addr, esiaddr_str);
++
++ for(i=0; i < ESI_LEN; i++)
++ dev->esi[i] = esi_addr[i];
++
++ return 0;
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_open(struct atm_vcc *vcc, short vpi, int vci)
++ *
++ * Description: Device operation: open
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
++//static int
++int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci)
++{
++ Tn7AtmPrivate *priv;
++ int dmachan;
++ int rc;
++ int traffic_type;
++ int pcr = 0x20000;
++ int scr = 0x20000;
++ int mbs = 0x20000;
++ int cdvt = 10000;
++
++ dprintf(1, "tn7atm_open()\n");
++
++ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
++ if(priv==NULL)
++ {
++ printk("null priv\n");
++ return -1;
++ }
++
++ MOD_INC_USE_COUNT;
++
++ /* find a free VPI/VCI */
++ tn7atm_walk_vccs(vcc, &vpi, &vci);
++
++ vcc->vpi = vpi;
++ vcc->vci = vci;
++
++ if (vci == ATM_VCI_UNSPEC || vpi == ATM_VCI_UNSPEC)
++ {
++ MOD_DEC_USE_COUNT;
++ return -EBUSY;
++ }
++
++ /* check to see whether PVC is opened or not */
++ if((dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci)) != ATM_NO_DMA_CHAN)
++ {
++ MOD_DEC_USE_COUNT;
++ printk("PVC already opened. dmachan = %d\n", dmachan);
++ return -EBUSY;
++ }
++ /*check for available channel */
++ if((dmachan = tn7atm_walk_lut(priv)) == ATM_NO_DMA_CHAN)
++ {
++ printk("No TX DMA channels available\n");
++ return -EBUSY;
++ }
++
++ set_bit(ATM_VF_ADDR, &vcc->flags); /* claim address */
++
++ vcc->itf = vcc->dev->number; /* interface number */
++
++ switch(vcc->qos.txtp.traffic_class)
++ {
++ case ATM_CBR: /* Constant Bit Rate */
++ traffic_type = 0;
++ pcr = vcc->qos.txtp.pcr;
++ scr = vcc->qos.txtp.pcr;
++ cdvt = vcc->qos.txtp.max_cdv;
++ printk("cdvt=%d\n", cdvt);
++ break;
++ case ATM_UBR: /* Unspecified Bit Rate */
++ traffic_type = 2;
++ break;
++ case ATM_VBR: /* Variable Bit Rate */
++ traffic_type = 1;
++ pcr = vcc->qos.txtp.pcr;
++ scr = vcc->qos.txtp.scr;
++ if(vcc->qos.txtp.max_pcr >= 0)
++ mbs = vcc->qos.txtp.max_pcr;
++ cdvt = vcc->qos.txtp.max_cdv;
++ printk("cdvt=%d\n", cdvt);
++ printk("mbs=%d\n", mbs);
++ break;
++ default:
++ traffic_type = 2;
++ }
++
++ dprintf(4, "vpi=%d, vci=%d, pcr=%d, dmachan=%d, qos=%d\n", vpi,vci,pcr,dmachan,traffic_type);
++ /* Activate SAR channel */
++ rc = tn7sar_activate_vc(priv, vpi, vci, pcr, scr, mbs, cdvt, dmachan, traffic_type);
++ if(rc < 0)
++ {
++
++ MOD_DEC_USE_COUNT;
++ return -EBUSY;
++ }
++
++ /* insure that the the vcc struct points to the correct entry
++ in the lookup table */
++
++ tn7atm_set_lut(priv,vcc, dmachan);
++ vcc->dev_data = (void *)&priv->lut[dmachan];
++ set_bit(ATM_VF_READY, &vcc->flags);
++
++ mdelay(100);
++ priv->lut[dmachan].ready = 1;
++ dprintf (1, "Leave tn7atm_open\n");
++ return 0;
++}
++
++
++//static void
++void tn7atm_close (struct atm_vcc *vcc)
++{
++ Tn7AtmPrivate *priv;
++ int dmachan;
++
++ priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
++ dprintf(4, "closing %d.%d.%d.%d\n", vcc->itf, vcc->vpi, vcc->vci, vcc->qos.aal);
++
++ clear_bit(ATM_VF_READY, &vcc->flags); /* ATM_VF_READY: channel is ready to transfer data */
++
++ dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
++ printk("closing channel: %d\n", dmachan);
++ if(dmachan == ATM_NO_DMA_CHAN)
++ {
++ printk("Closing channel not found.\n");
++ return;
++ }
++ priv->lut[dmachan].bClosing = 1;
++ priv->lut[dmachan].ready = 0;
++ if(tn7sar_deactivate_vc(priv,dmachan)) /* tear down channel */
++ {
++ printk("failed to close channel %d.\n", dmachan);
++ }
++
++ clear_bit(ATM_VF_READY, &vcc->flags); /* ATM_VF_READY: channel is ready to transfer data */
++ tn7atm_lut_clear(vcc, dmachan);
++
++ MOD_DEC_USE_COUNT;
++
++ dprintf (1, "Leave tn7atm_close\n");
++}
++
++#define ATM_TXSTOP 0x800c61f4
++static int
++tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg)
++{
++ Tn7AtmPrivate *priv;
++ priv = (Tn7AtmPrivate *) dev->dev_data;
++
++ //printk("tn7atm_ioctl\n");
++ //printk("arg = %x\n", *(int *)arg);
++ //printk("cmd =%x\n", cmd);
++ switch(cmd)
++ {
++
++ case ATM_TXSTOP: /*temp fix for SAR tear down problem */
++// printk("ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
++// printk("arg = %d\n", *(int*)arg);
++ priv->xmitStop = *(int *)arg;
++ //printk("Executing ATM_SETLOOP for tn7 \n");
++ //printk("Stop variable = :%d: \n",priv->xmitStop);
++ return 0;
++
++ //case SAR_DSL_RESET_SOFTBOOT:
++ // return tn7atm_dsl_clean_reboot();
++ case 0:
++ return 0;
++ }
++
++ return -ENOSYS;
++
++}
++
++static int
++tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags)
++{
++ dprintf (1, "Enter tn7atm_change_qos\n");
++ dprintf (1, "Leave tn7atm_change_qos\n");
++ return 0;
++}
++
++
++int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
++{
++
++ Tn7AtmPrivate *priv;
++ int bret;
++ int chan;
++
++ dprintf(4, "tn7atm_send()\n");
++
++ priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
++
++ //if(skb->len < 64)
++ //xdump((unsigned char *)skb->data, skb->len, 1);
++ //else
++ //xdump((unsigned char *)skb->data, 64, 1);
++ /* check for dsl line connection */
++
++ /* add vcc field in skb for clip inATMARP fix */
++ ATM_SKB(skb)->vcc = vcc;
++ /* Ron change 2.3 -> 2.4 ??*/
++ //if(priv->lConnected != 1 || priv->xmitStop == 1)
++ if(priv->lConnected != 1 && priv->xmitStop == 1)
++ {
++ dprintf(4,"dsl line down\n");
++ if(vcc->pop)
++ vcc->pop(vcc, skb);
++ else
++ tn7atm_kfree_skb(skb);
++ return 1;
++ }
++
++ /* check whether PVC is closing */
++ chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
++ /* set br2684 dev pointer */
++ priv->lut[chan].net_device = skb->dev;
++ if(chan == ATM_NO_DMA_CHAN || priv->lut[chan].bClosing == 1)
++ {
++ dprintf(4, "can find sar channel\n");
++ if(vcc->pop)
++ vcc->pop(vcc, skb);
++ else
++ tn7atm_kfree_skb(skb);
++ return 1;
++ }
++
++ bret=tn7atm_queue_packet_to_sar(vcc, skb);
++
++ return bret;
++}
++
++
++static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1)
++{
++ struct atm_vcc *vcc;
++ struct sk_buff *skb;
++ int priority = 1;
++ Tn7AtmPrivate *priv;
++ int dmachan;
++
++ vcc = (struct atm_vcc *)vcc1;
++ skb = (struct sk_buff *)skb1;
++
++ priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
++
++ dprintf(4, "vcc->vci=%d\n", vcc->vci);
++ dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
++ if(dmachan == ATM_NO_DMA_CHAN)
++ {
++ dprintf(4, "can find sar channel\n");
++ if(vcc->pop)
++ vcc->pop(vcc, skb);
++ else
++ tn7atm_kfree_skb(skb);
++ return 1;
++ }
++
++ // turbo dsl TCP ack check
++ if(priv->bTurboDsl)
++ priority = turbodsl_check_priority_type(skb->data);
++
++ //skb priority check
++ if(priority != 0)
++ {
++ if((skb->cb[47])>>1)
++ priority=1;
++ else
++ priority = 0;
++ }
++
++ /* add queue info here */
++ skb->cb[47] = (char)priority;
++ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
++ priv->lut[dmachan].tx_used_bufs[priority]++;
++ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
++
++ if(tn7sar_send_packet(priv,dmachan, skb, skb->data, skb->len, priority) != 0)
++ {
++ dprintf(1, "failed to send packet\n");
++ if(vcc->pop)
++ vcc->pop(vcc, skb);
++ else
++ tn7atm_kfree_skb(skb);
++
++ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
++ priv->lut[dmachan].tx_used_bufs[priority]--;
++ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
++ return 1;
++ }
++
++ /* check for whether tx queue is full or not */
++ //printk("bufs used = %d\n", priv->lut[dmachan].tx_used_bufs[1]);
++ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
++ if(priv->lut[dmachan].tx_used_bufs[1] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF) ||
++ priv->lut[dmachan].tx_used_bufs[0] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF))
++ {
++ //printk("net queue stoped\n");
++ netif_stop_queue(priv->lut[dmachan].net_device);
++ priv->lut[dmachan].netqueue_stop = 1;
++ }
++ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
++
++ return 0;
++}
++
++/* functions needed by SAR HAL */
++
++int tn7atm_send_complete(void *osSendInfo)
++{
++ Tn7AtmPrivate *priv;
++ //struct atm_dev *dev;
++ struct sk_buff *skb;
++ struct atm_vcc *vcc;
++ int chan;
++
++ dprintf(4, "tn7atm_send_complete()\n");
++
++
++ skb = (struct sk_buff *)osSendInfo;
++ //dev = (struct atm_dev *) (skb->dev);
++ priv = (Tn7AtmPrivate *)mydev->dev_data;
++ vcc =ATM_SKB(skb)->vcc;
++ if(vcc)
++ {
++ dprintf(4, "vcc->vci=%d\n",vcc->vci );
++ chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
++ if(chan==ATM_NO_DMA_CHAN)
++ return 1;
++
++ /*decreament packet queued number */
++ spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
++ priv->lut[chan].tx_used_bufs[(int)skb->cb[47]] --;
++ if(priv->lut[chan].tx_used_bufs[1] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF &&
++ priv->lut[chan].tx_used_bufs[0] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF)
++ {
++ if(priv->lut[chan].netqueue_stop)
++ {
++ //printk("net queue restarted\n");
++ netif_wake_queue(priv->lut[chan].net_device);
++ priv->lut[chan].netqueue_stop = 0;
++ }
++ }
++ spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
++
++ if(vcc->pop)
++ {
++ dprintf(5, "free packet\n");
++ vcc->pop(vcc, skb);
++ }
++
++
++ }
++
++
++
++ /* Update Stats: There may be a better place to do this, but this is a start */
++ priv->stats.tx_packets++;
++#ifdef CONFIG_LED_MODULE
++ led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);
++#endif
++
++ /* track number of buffer used */
++
++ dprintf(4, "tn7atm_send_complete() done\n");
++
++ return 0;
++}
++
++void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size)
++{
++ struct sk_buff *skb;
++ dprintf(4, "tn7atm_allocate_rx_skb size=%d\n", size);
++ size = ((size+3)&0xfffffffc);
++ skb = dev_alloc_skb(size);
++ if(skb==NULL)
++ {
++ //printk("rx allocate skb failed\n");
++ return NULL;
++ }
++ *os_receive_info = (void *)skb;
++ return (skb->data);
++}
++
++void tn7atm_free_rx_skb(void *skb)
++{
++ dprintf(4, "tn7atm_free_rx_skb\n");
++ tn7atm_kfree_skb((struct sk_buff *)skb);
++}
++
++
++int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data)
++{
++ Tn7AtmPrivate *priv;
++ struct atm_dev *dev;
++ struct sk_buff *skb;
++ struct atm_vcc *vcc;
++
++
++ dprintf(4, "tn7atm_receive()\n");
++ dev = (struct atm_dev *)os_dev;
++
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++
++ if(priv->lConnected != 1 || priv->lut[ch].ready == 0)
++ {
++ //printk("channel not ready\n");
++ return 1;
++ }
++
++ vcc = (struct atm_vcc *)priv->lut[ch].vcc;
++ if(vcc == NULL)
++ {
++ printk("vcc=Null");
++ return 1;
++ }
++
++
++ /* assume no fragment packet for now */
++ skb = (struct sk_buff *)os_receive_info;
++
++ if(skb==NULL)
++ {
++ dprintf(1, "received empty skb.\n");
++ return 1;
++ }
++ /* see skbuff->cb definition in include/linux/skbuff.h */
++ ATM_SKB(skb)->vcc = vcc;
++
++ skb->len = packet_size;
++ dprintf(3, "skb:[0x%p]:0x%x pdu_len: 0x%04x\n",skb,skb->len,packet_size);
++ dprintf(3, "data location: 0x%x, 0x%x\n", (unsigned int)skb->data, (unsigned int)data);
++
++ /*skb_trim(skb,skb->len); */ /* skb size is incorrect for large packets > 1428 bytes ?? */
++ __skb_trim(skb,skb->len); /* change to correct > 1500 ping when firewall is on */
++
++ dprintf(3, "pushing the skb...\n");
++ skb->stamp = vcc->timestamp = xtime;
++
++ xdump((unsigned char *)skb->data, skb->len, 5);
++
++ if(atm_charge(vcc, skb->truesize) == 0)
++ {
++ dprintf(1,"Receive buffers saturated for %d.%d.%d - PDU dropped\n", vcc->itf, vcc->vci, vcc->vpi);
++ return 1;
++ }
++
++ /*pass it up to kernel networking layer and update stats*/
++ vcc->push(vcc,skb);
++
++ /* Update receive packet stats */
++ priv->stats.rx_packets++;
++ atomic_inc(&vcc->stats->rx);
++
++#ifdef CONFIG_LED_MODULE
++ led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);
++#endif
++ dprintf(3, "(a) Receiving:vpi/vci[%d/%d] chan_id: %d skb len:0x%x skb truesize:0x%x\n",
++ vcc->vpi,vcc->vci,ch,skb->len, skb->truesize);
++
++ return 0;
++}
++
++static int
++tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ int limit = count - 80;
++ int i;
++
++ struct atm_dev *dev;
++ Tn7AtmPrivate *priv;
++
++ dev = (struct atm_dev *)data;
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++
++ if(len<=limit)
++ len += sprintf(buf+len,"Chan Inuse ChanID VPI VCI \n");
++ if(len<=limit)
++ len += sprintf(buf+len,"------------------------------------------------------------------\n");
++
++ for(i=0; i < MAX_DMA_CHAN; i++)
++ {
++ if(len<=limit)
++ {
++ len += sprintf(buf+len,
++ " %02d %05d %05d %05d %05d \n",
++ i,priv->lut[i].inuse,priv->lut[i].chanid,
++ priv->lut[i].vpi,priv->lut[i].vci);
++ }
++ }
++
++ return len;
++}
++
++static int
++tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ int limit = count - 80;
++ struct atm_dev *dev;
++ Tn7AtmPrivate *priv;
++
++ dev = (struct atm_dev *)data;
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++
++ if(len<=limit)
++ len += sprintf(buf+len, "\nPrivate Data Structure(%s):\n",priv->name);
++ if(len<=limit)
++ len += sprintf(buf+len, "----------------------------------------\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "priv: 0x%p\n",priv);
++ if(len<=limit)
++ len += sprintf(buf+len, "next: 0x%p",priv->next);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tdev: 0x%p\n",priv->dev);
++
++ if(len<=limit)
++ len += sprintf(buf+len, "tx_irq: %02d",priv->sar_irq);
++ if(len<=limit)
++ len += sprintf(buf+len, "rx_irq: %02d",priv->dsl_irq);
++
++
++ return len;
++}
++
++void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num)
++{
++ struct atm_dev *dev;
++ Tn7AtmPrivate *priv;
++
++ dprintf(4, "tn7atm_sarhal_isr_register()\n");
++
++ dev = (struct atm_dev *)os_dev;
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++ priv->halIsr = (void *)hal_isr;
++ priv->int_num = interrupt_num;
++}
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_exit(void)
++ *
++ * Description: Avalanche SAR exit function
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++
++static void
++tn7atm_exit (void)
++{
++
++ struct atm_dev *dev;
++
++ Tn7AtmPrivate *priv;
++
++ dprintf(4, "tn7atm_exit()\n");
++
++ dev=mydev;
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++ priv->lConnected = 0;
++ tn7dsl_exit();
++
++ tn7sar_exit(dev, priv);
++
++ /* freeup irq's */
++ free_irq(priv->dsl_irq,priv->dev);
++ free_irq(priv->sar_irq,priv->dev);
++
++ kfree (dev->dev_data);
++
++ // atm_dev_deregister (dev);
++ shutdown_atm_dev(dev);
++
++ /* remove proc entries */
++ remove_proc_entry("tiatm/avsar_ver",NULL);
++ remove_proc_entry("tiatm/avsar_modem_stats",NULL);
++ remove_proc_entry("tiatm/avsar_modem_training",NULL);
++ remove_proc_entry("tiatm/avsar_channels",NULL);
++ remove_proc_entry("tiatm/avsar_private",NULL);
++ remove_proc_entry("tiatm/avsar_sarhal_stats",NULL);
++ remove_proc_entry("tiatm/avsar_oam_ping",NULL);
++ remove_proc_entry("tiatm/avsar_pvc_table",NULL);
++ remove_proc_entry("tiatm",NULL);
++ tn7dsl_dslmod_sysctl_unregister();
++
++ printk ("Module Removed\n");
++
++}
++
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_registration(struct tn7* tn7)
++ *
++ * Description: ATM driver registration
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++
++static int __init
++tn7atm_register (Tn7AtmPrivate * priv)
++{
++ /* allocate memory for the device */
++
++ dprintf(4,"device %s being registered\n", priv->name);
++
++ mydev = atm_dev_register (priv->proc_name, &tn7atm_ops, -1, NULL);
++
++ if (mydev == NULL)
++ {
++ printk ("atm_dev_register returning NULL\n");
++ return ATM_REG_FAILED;
++ }
++
++ printk ("registered device %s\n", priv->name);
++
++ mydev->dev_data = priv; /* setup device data in atm_dev struct */
++ priv->dev = mydev; /* setup atm_device in avalanche sar struct */
++
++ mydev->ci_range.vpi_bits = ATM_CI_MAX; /* atm supports 11 bits */
++ mydev->ci_range.vci_bits = 16; /* atm VCI max = 16 bits */
++
++
++ return ATM_REG_OK;
++}
++
++static int
++tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ char dslVer[8];
++ char dspVer[10];
++ char *pSarVer;
++ Tn7AtmPrivate *priv;
++ int i;
++ unsigned int pdspV1, pdspV2;
++
++ priv = mydev->dev_data;
++
++ len += sprintf(buf+len, "ATM Driver version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
++ LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
++
++ tn7dsl_get_dslhal_version(dslVer);
++
++ len += sprintf(buf+len, "DSL HAL version: [%d.%02d.%02d.%02d]\n", dslVer[0], dslVer[1], dslVer[2],
++ dslVer[3]);
++ tn7dsl_get_dsp_version(dspVer);
++
++ len += sprintf(buf+len, "DSP Datapump version: [%d.%02d.%02d.%02d] ", dspVer[4], dspVer[5], dspVer[6],
++ dspVer[7]);
++ if(dspVer[8]==2) // annex B
++ len += sprintf(buf+len, "Annex B\n");
++ else if(dspVer[8]==3) //annex c
++ len += sprintf(buf+len, "Annex c\n");
++ else
++ len += sprintf(buf+len, "Annex A\n");
++
++ tn7sar_get_sar_version(priv, &pSarVer);
++
++ len += sprintf(buf+len, "SAR HAL version: [");
++ for(i=0;i<8;i++)
++ {
++ len += sprintf(buf+len, "%c", pSarVer[i+7]);
++ }
++ len += sprintf(buf+len, "]\n");
++
++ tn7sar_get_sar_firmware_version(&pdspV1, &pdspV2);
++ len += sprintf(buf+len, "PDSP Firmware version:[%01x.%02x]\n",
++ pdspV1,pdspV2);
++
++ return len;
++}
++
++/*
++static struct net_device_stats
++*tn7atm_get_stats(struct atm_dev *dev)
++{
++ Tn7AtmPrivate *priv;
++ //unsigned long flags;
++
++ //spin_lock_irqsave(&priv->stats_lock,flags);
++ priv= (Tn7AtmPrivate *)dev->dev_data;
++ //spin_unlock_irqrestore(&priv->stats_lock,flags);
++
++ return &priv->stats;
++
++}
++*/
++/* Device detection */
++
++static int __init
++tn7atm_detect (void)
++{
++ Tn7AtmPrivate *priv;
++ //static struct proc_dir_entry *proc_dir;
++
++ dprintf(4, "tn7atm_detect().\n");
++ /* Device allocated as a global static structure at top of code "mydev" */
++
++ /* Alloc priv struct */
++ priv=kmalloc(sizeof(Tn7AtmPrivate),GFP_KERNEL);
++ if(!priv)
++ {
++ printk("unable to kmalloc priv structure. Killing autoprobe.\n");
++ return -ENODEV;
++ }
++ memset(priv, 0, sizeof(Tn7AtmPrivate));
++#ifdef COMMON_NSP
++ priv->name = "TI Avalanche SAR";
++ priv->proc_name = "avsar";
++#else
++ priv->name = "TI tnetd73xx ATM Driver";
++ priv->proc_name = "tn7";
++#endif
++
++ if ((tn7atm_register (priv)) == ATM_REG_FAILED)
++ return -ENODEV;
++
++ tn7atm_init(mydev);
++
++ /* Set up proc entry for atm stats */
++ proc_mkdir("tiatm", NULL);
++ create_proc_read_entry("tiatm/avsar_modem_stats",0,NULL,tn7dsl_proc_stats,NULL);
++ create_proc_read_entry("tiatm/avsar_modem_training",0,NULL,tn7dsl_proc_modem,NULL);
++ create_proc_read_entry("tiatm/avsar_ver",0,NULL,tn7atm_proc_version,NULL);
++ create_proc_read_entry("tiatm/avsar_channels",0,NULL,tn7atm_proc_channels,mydev);
++ create_proc_read_entry("tiatm/avsar_private",0,NULL,tn7atm_proc_private,mydev);
++ create_proc_read_entry("tiatm/avsar_sarhal_stats",0,NULL,tn7sar_proc_sar_stat,mydev);
++ create_proc_read_entry("tiatm/avsar_oam_ping",0,NULL,tn7sar_proc_oam_ping,mydev);
++ create_proc_read_entry("tiatm/avsar_pvc_table",0,NULL,tn7sar_proc_pvc_table,mydev);
++
++ tn7dsl_dslmod_sysctl_register();
++
++ printk("Texas Instruments ATM driver: version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
++ LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
++ return 0;
++}
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_probe(void)
++ *
++ * Description: Avalanche SAR driver probe (see net/atm/pvc.c)
++ * this is utilized when the SAR driver is built
++ * into the kernel and needs to be configured.
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++int __init tn7atm_probe(void)
++{
++ tn7atm_detect();
++ return -ENODEV;
++}
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int tn7atm_init(struct atm_dev *dev)
++ *
++ * Description: Device Initialization
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++static int __init
++tn7atm_init(struct atm_dev *dev)
++{
++ Tn7AtmPrivate *priv;
++ char *ptr;
++
++ dprintf(4, "tn7atm_init()\n");
++
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++
++ if(tn7sar_init(dev, priv) != 0)
++ {
++ printk("Failed to init SAR.\n");
++ return -ENODEV;
++ }
++
++ if(tn7dsl_init(priv) < 0)
++ {
++ printk("Failed to init DSL.\n");
++ return -ENODEV;
++ }
++
++ if(tn7atm_get_ESI(dev) < 0) /* set ESI */
++ return -ENODEV;
++
++ if(tn7atm_irq_request(dev) < 0)
++ return -EBUSY;
++
++ priv->bTurboDsl = 1;
++ // read config for turbo dsl
++ ptr = prom_getenv("TurboDSL");
++ if(ptr)
++ {
++ priv->bTurboDsl = os_atoi(ptr);
++ }
++
++ return 0;
++}
++
++int tn7atm_device_connect_status(void *priv, int state)
++{
++ Tn7AtmPrivate *priv1;
++
++ dprintf(5, "tn7atm_device_connect_status()\n");
++ priv1 = (Tn7AtmPrivate *)priv;
++
++ priv1->lConnected = state;
++ dprintf(5, "priv1->lConnected=%d\n", priv1->lConnected);
++ return 0;
++}
++
++
++#ifdef MODULE
++module_init (tn7atm_detect);
++module_exit (tn7atm_exit);
++#endif /* MODULE */
+diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.h linux.dev/drivers/atm/sangam_atm/tn7atm.h
+--- linux.old/drivers/atm/sangam_atm/tn7atm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tn7atm.h 2005-07-10 08:02:01.452110144 +0200
+@@ -0,0 +1,115 @@
++/*
++ * Tnetd73xx ATM driver.
++ * by Zhicheng Tang, ztang@ti.com
++ * 2000 (c) Texas Instruments Inc.
++ *
++ *
++*/
++
++#ifndef __TN7ATM_H
++#define __TN7ATM_H
++
++//#include "mips_support.h"
++#include <linux/list.h>
++
++#define ATM_REG_OK 1
++#define ATM_REG_FAILED 0
++
++#define TX_SERVICE_MAX 32
++#define RX_SERVICE_MAX 20
++#define TX_BUFFER_NUM 64
++#define RX_BUFFER_NUM 28
++#define TX_QUEUE_NUM 2
++#define RX_BUFFER_SIZE 1582
++
++#define TX_DMA_CHAN 16 /* number of tx dma channels available */
++#define MAX_DMA_CHAN 16
++#define ATM_NO_DMA_CHAN MAX_DMA_CHAN + 1 /* no tx dma channels available */
++#define ATM_SAR_INT 15
++#define ATM_SAR_INT_PACING_BLOCK_NUM 2
++#define ATM_DSL_INT 39
++
++#define CONFIG_ATM_TN7ATM_DEBUG 0 /* Debug level (0=no mtn7s 5=verbose) */
++
++#define TN7ATM_DEV(d) ((struct tn7atm*)((d)->dev_data))
++
++
++/* Avalanche SAR state information */
++
++typedef enum tn7atm_state
++{
++ TN7ATM_STATE_REGISTER /* device registered */
++}tn7atm_state;
++
++typedef struct _sar_stat
++{
++ unsigned int txErrors;
++ unsigned int rxErrors;
++ unsigned int rxPktCnt;
++ unsigned int txPktCnt;
++ unsigned int rxBytes;
++ unsigned int txBytes;
++}sar_stat_t;
++
++/* Host based look up table to xref Channel Id's, VPI/VCI, LC, CID, packet type */
++typedef struct _tn7atm_tx_lut
++{
++ int inuse; /* is DMA channel available (1=y) */
++ int chanid; /* DMA channel ID (0-0x1f) This corresponds to the Channel ID
++ that is used in the connection config reg (TN7ATM_CONN_CONFIG) */
++ int vpi; /* Virtual path identifier */
++ int vci; /* Virtual channel identifier */
++ void *vcc;
++ int bClosing;
++ int ready;
++ void *net_device;
++ int tx_total_bufs;
++ int tx_used_bufs[2];
++ int netqueue_stop;
++}tn7atm_lut_t;
++
++/* per device data */
++
++typedef struct _tn7atm_private
++{
++ struct _tn7atm_private *next; /* next device */
++ struct atm_dev *dev; /* ATM device */
++ struct net_device_stats stats; /* Used to report Tx/Rx frames from ifconfig */
++ tn7atm_lut_t lut[MAX_DMA_CHAN]; /* Tx DMA look up table (LUT) */
++ int dsl_irq; /* ATM SAR TransmitA interrupt number */
++ int sar_irq; /* ATM SAR ReceiveA interrupt number */
++ char* name; /* device name */
++ char* proc_name; /* board name under /proc/atm */
++ unsigned int available_cell_rate; /* cell rate */
++ unsigned int connection_cell_rate; /* cell rate */
++ int lConnected;
++
++ /* Tnetd73xx CPHAL */
++ void *pSarHalDev;
++ void *pSarHalFunc;
++ void *pSarOsFunc;
++ void *halIsr;
++ int int_num;
++
++ /* turbo dsl */
++ int bTurboDsl;
++
++ /* spin lock for netifqueue */
++ spinlock_t netifqueueLock;
++ int netifqueueLockFlag;
++ int xmitStop; /* temp fix for SAR problem */
++}tn7atm_private_t, Tn7AtmPrivate;
++
++
++
++/* ATM adaptation layer id */
++typedef enum tn7atm_aal {
++ TN7ATM_AAL0 = 0,
++ TN7ATM_AAL2 = 2,
++ TN7ATM_AAL5 = 5,
++} tn7atm_aal_t;
++
++
++
++
++#endif
+diff -urN linux.old/drivers/atm/sangam_atm/tn7dsl.c linux.dev/drivers/atm/sangam_atm/tn7dsl.c
+--- linux.old/drivers/atm/sangam_atm/tn7dsl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tn7dsl.c 2005-07-10 08:27:39.683263464 +0200
+@@ -0,0 +1,1778 @@
++/*
++ * $Id$
++ *
++ * Avalanche SAR driver
++ *
++ * Zhicheng Tang, ztang@ti.com
++ * 2000 (c) Texas Instruments Inc.
++ *
++ *
++*/
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/atmdev.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/smp_lock.h>
++#include <asm/io.h>
++#include <asm/mips-boards/prom.h>
++#include <linux/proc_fs.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <linux/sysctl.h>
++#include <linux/timer.h>
++#include <linux/vmalloc.h>
++
++#include "tn7atm.h"
++#include "tn7api.h"
++#include "dsl_hal_api.h"
++
++#ifdef CONFIG_LED_MODULE
++#include <asm/ar7/ledapp.h>
++#define MOD_ADSL 1
++#define DEF_ADSL_IDLE 1
++#define DEF_ADSL_TRAINING 2
++#define DEF_ADSL_SYNC 3
++#define DEF_ADSL_ACTIVITY 4
++
++#define LED_NUM_1 3
++#define LED_NUM_2 4
++
++led_reg_t ledreg[2];
++
++static int led_on;
++#endif
++
++extern int __guDbgLevel;
++extern sar_stat_t sarStat;
++static int dslInSync = 0;
++static int bMarginThConfig;
++static int bMarginRetrainEnable;
++static char EOCVendorID[8]= {0xb5, 0x00, 0x54, 0x53, 0x54, 0x43, 0x00, 0x00};
++
++#define TC_SYNC 1
++#define SYNC_TIME_DELAY 500000
++
++
++#define DEV_DSLMOD 1
++#define MAX_STR_SIZE 256
++#define DSL_MOD_SIZE 256
++
++#define TRUE 1
++#define FALSE 0
++
++
++enum
++{
++ NO_MODE,
++ MULTI_MODE,
++ T1413_MODE,
++ GDMT_MODE,
++ GLITE_MODE
++};
++
++
++
++/* a structure to store all information we need
++ for our thread */
++typedef struct kthread_struct
++{
++ /* private data */
++
++ /* Linux task structure of thread */
++ struct task_struct *thread;
++ /* Task queue need to launch thread */
++ struct tq_struct tq;
++ /* function to be started as thread */
++ void (*function) (struct kthread_struct *kthread);
++ /* semaphore needed on start and creation of thread. */
++ struct semaphore startstop_sem;
++
++ /* public data */
++
++ /* queue thread is waiting on. Gets initialized by
++ init_kthread, can be used by thread itself.
++ */
++ wait_queue_head_t queue;
++ /* flag to tell thread whether to die or not.
++ When the thread receives a signal, it must check
++ the value of terminate and call exit_kthread and terminate
++ if set.
++ */
++ int terminate;
++ /* additional data to pass to kernel thread */
++ void *arg;
++} kthread_t;
++
++#ifndef ADIAG
++#define DSP_FIRMWARE_PATH "/lib/modules/ar0700xx.bin"
++#else
++#define DSP_FIRMWARE_PATH "/var/tmp/ar0700xx_diag.bin"
++#endif
++
++/* externs */
++extern struct atm_dev *mydev;
++extern unsigned int oamFarLBCount[4];
++extern int dslhal_support_restoreTrainingInfo(PITIDSLHW_T pIhw);
++/* gloabal functions */
++
++/* end of global functions */
++
++/* module wide declars */
++static PITIDSLHW_T pIhw;
++static char mod_req[16]={'\t'};
++static volatile int bshutdown;
++static char info[MAX_STR_SIZE];
++static DECLARE_MUTEX_LOCKED(adsl_sem_overlay); /* Used for DSL Polling enable */
++kthread_t overlay_thread;
++/* end of module wide declars */
++
++/* Internal Functions */
++static void tn7dsl_chng_modulation(void* data);
++static void tn7dsl_set_modulation(void* data);
++static int tn7dsl_reload_overlay(void);
++static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp);
++static void tn7dsl_register_dslss_led(void);
++void tn7dsl_dslmod_sysctl_register(void);
++void tn7dsl_dslmod_sysctl_unregister(void);
++/* end of internal functions */
++
++
++
++
++
++/* prototypes */
++
++/* start new kthread (called by creator) */
++void start_kthread(void (*func)(kthread_t *), kthread_t *kthread);
++
++/* stop a running thread (called by "killer") */
++void stop_kthread(kthread_t *kthread);
++
++/* setup thread environment (called by new thread) */
++void init_kthread(kthread_t *kthread, char *name);
++
++/* cleanup thread environment (called by thread upon receiving termination signal) */
++void exit_kthread(kthread_t *kthread);
++
++
++
++/* private functions */
++static void kthread_launcher(void *data)
++{
++ kthread_t *kthread = data;
++ kernel_thread((int (*)(void *))kthread->function, (void *)kthread, 0);
++
++}
++
++/* public functions */
++
++/* create a new kernel thread. Called by the creator. */
++void start_kthread(void (*func)(kthread_t *), kthread_t *kthread)
++{
++ /* initialize the semaphore:
++ we start with the semaphore locked. The new kernel
++ thread will setup its stuff and unlock it. This
++ control flow (the one that creates the thread) blocks
++ in the down operation below until the thread has reached
++ the up() operation.
++ */
++ //init_MUTEX_LOCKED(&kthread->startstop_sem);
++
++ /* store the function to be executed in the data passed to
++ the launcher */
++ kthread->function=func;
++
++ /* create the new thread my running a task through keventd */
++
++ /* initialize the task queue structure */
++ kthread->tq.sync = 0;
++ INIT_LIST_HEAD(&kthread->tq.list);
++ kthread->tq.routine = kthread_launcher;
++ kthread->tq.data = kthread;
++
++ /* and schedule it for execution */
++ schedule_task(&kthread->tq);
++
++ /* wait till it has reached the setup_thread routine */
++ //down(&kthread->startstop_sem);
++
++}
++
++/* stop a kernel thread. Called by the removing instance */
++void stop_kthread(kthread_t *kthread)
++{
++ if (kthread->thread == NULL)
++ {
++ printk("stop_kthread: killing non existing thread!\n");
++ return;
++ }
++
++ /* this function needs to be protected with the big
++ kernel lock (lock_kernel()). The lock must be
++ grabbed before changing the terminate
++ flag and released after the down() call. */
++ lock_kernel();
++
++ /* initialize the semaphore. We lock it here, the
++ leave_thread call of the thread to be terminated
++ will unlock it. As soon as we see the semaphore
++ unlocked, we know that the thread has exited.
++ */
++ //init_MUTEX_LOCKED(&kthread->startstop_sem);
++
++ /* We need to do a memory barrier here to be sure that
++ the flags are visible on all CPUs.
++ */
++ mb();
++
++ /* set flag to request thread termination */
++ kthread->terminate = 1;
++
++ /* We need to do a memory barrier here to be sure that
++ the flags are visible on all CPUs.
++ */
++ mb();
++ kill_proc(kthread->thread->pid, SIGKILL, 1);
++
++ /* block till thread terminated */
++ //down(&kthread->startstop_sem);
++
++ /* release the big kernel lock */
++ unlock_kernel();
++
++ /* now we are sure the thread is in zombie state. We
++ notify keventd to clean the process up.
++ */
++ kill_proc(2, SIGCHLD, 1);
++
++}
++
++/* initialize new created thread. Called by the new thread. */
++void init_kthread(kthread_t *kthread, char *name)
++{
++ /* lock the kernel. A new kernel thread starts without
++ the big kernel lock, regardless of the lock state
++ of the creator (the lock level is *not* inheritated)
++ */
++ lock_kernel();
++
++ /* fill in thread structure */
++ kthread->thread = current;
++
++ /* set signal mask to what we want to respond */
++ siginitsetinv(¤t->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM));
++
++ /* initialise wait queue */
++ init_waitqueue_head(&kthread->queue);
++
++ /* initialise termination flag */
++ kthread->terminate = 0;
++
++ /* set name of this process (max 15 chars + 0 !) */
++ sprintf(current->comm, name);
++
++ /* let others run */
++ unlock_kernel();
++
++ /* tell the creator that we are ready and let him continue */
++ //up(&kthread->startstop_sem);
++
++}
++
++/* cleanup of thread. Called by the exiting thread. */
++void exit_kthread(kthread_t *kthread)
++{
++ /* we are terminating */
++
++ /* lock the kernel, the exit will unlock it */
++ lock_kernel();
++ kthread->thread = NULL;
++ mb();
++
++ /* notify the stop_kthread() routine that we are terminating. */
++ //up(&kthread->startstop_sem);
++ /* the kernel_thread that called clone() does a do_exit here. */
++
++ /* there is no race here between execution of the "killer" and real termination
++ of the thread (race window between up and do_exit), since both the
++ thread and the "killer" function are running with the kernel lock held.
++ The kernel lock will be freed after the thread exited, so the code
++ is really not executed anymore as soon as the unload functions gets
++ the kernel lock back.
++ The init process may not have made the cleanup of the process here,
++ but the cleanup can be done safely with the module unloaded.
++ */
++
++}
++
++
++
++int os_atoi(const char *pStr)
++{
++ int retVal = -1;
++
++ if(*pStr=='-')
++ retVal = -simple_strtoul(pStr+1, (char **)NULL, 10);
++ else
++ retVal = simple_strtoul(pStr, (char **)NULL, 10);
++ return retVal ;
++}
++
++
++int os_atoh(const char *pStr)
++{
++ int retVal = -1;
++
++ if(*pStr=='-')
++ retVal = -simple_strtoul(pStr+1, (char **)NULL, 16);
++ else
++ retVal = simple_strtoul(pStr, (char **)NULL, 16);
++ return retVal ;
++}
++
++unsigned long os_atoul(const char *pStr)
++{
++ unsigned long retVal = -1;
++
++ retVal = simple_strtoul(pStr, (char **)NULL, 10);
++ return retVal ;
++}
++
++void dprintf( int uDbgLevel, char * szFmt, ...)
++{
++#ifdef DEBUG_BUILD
++ static char buff[256];
++ va_list ap;
++
++ if( __guDbgLevel < uDbgLevel)
++ return;
++
++ va_start( ap, szFmt);
++ vsprintf((char *)buff, szFmt, ap);
++ va_end(ap);
++ printk("%s", buff);
++#endif
++}
++
++/*int strcmp(const char *s1, const char *s2)
++{
++
++ int i=0;
++
++ while(s1[i] !=0)
++ {
++ if(s2[i]==0)
++ return -1;
++ if(s1[i] != s2[i])
++ return 1;
++ i++;
++ }
++ if(s2[i] != 0)
++ return 1;
++ return 0;
++}
++*/
++
++int shim_osLoadFWImage(char *ptr)
++{
++ unsigned int bytesRead;
++ mm_segment_t oldfs;
++ static struct file *filp;
++ unsigned int imageLength=0x4ffff;
++
++
++ dprintf(4, "tn7dsl_read_dsp()\n");
++
++ dprintf(4,"open file %s\n", DSP_FIRMWARE_PATH);
++
++ filp=filp_open(DSP_FIRMWARE_PATH
++ ,00,O_RDONLY);
++
++ if(filp ==NULL)
++ {
++ printk("Failed: Could not open DSP binary file\n");
++ return -1;
++ }
++
++ if (filp->f_op->read==NULL)
++ return -1; /* File(system) doesn't allow reads */
++
++ /* Now read bytes from postion "StartPos" */
++ filp->f_pos = 0;
++ oldfs = get_fs();
++ set_fs(KERNEL_DS);
++ bytesRead = filp->f_op->read(filp,ptr,imageLength,&filp->f_pos);
++
++ dprintf(4,"file length = %d\n", bytesRead);
++
++ set_fs(oldfs);
++
++ /* Close the file */
++ fput(filp);
++
++ return bytesRead;
++}
++
++unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength)
++{
++ unsigned int bytesRead;
++ mm_segment_t oldfs;
++ struct file *filp;
++
++ dprintf(4,"shim_read_overlay_page\n");
++ //dprintf(4,"sec offset=%d, sec length =%d\n", secOffset, secLength);
++
++ filp=filp_open(DSP_FIRMWARE_PATH,00,O_RDONLY);
++ if(filp ==NULL)
++ {
++ printk("Failed: Could not open DSP binary file\n");
++ return -1;
++ }
++
++ if (filp->f_op->read==NULL)
++ return -1; /* File(system) doesn't allow reads */
++
++ /* Now read bytes from postion "StartPos" */
++
++ if(filp->f_op->llseek)
++ filp->f_op->llseek(filp,secOffset, 0);
++ oldfs = get_fs();
++ set_fs(KERNEL_DS);
++ filp->f_pos = secOffset;
++ bytesRead = filp->f_op->read(filp,ptr,secLength,&filp->f_pos);
++
++ set_fs(oldfs);
++ /* Close the file */
++ fput(filp);
++ return bytesRead;
++}
++
++int shim_osLoadDebugFWImage(char *ptr)
++{
++ return 0;
++}
++int shim_osStringCmp(const char *s1, const char *s2)
++{
++ return strcmp(s1, s2);
++}
++
++void *shim_osAllocateMemory(unsigned int size)
++{
++ return ((void *)kmalloc(size, GFP_KERNEL));
++}
++
++void *shim_osAllocateDmaMemory(unsigned int size)
++{
++ /*
++ int order;
++
++ order=1;
++ size=size/4096;
++ while(size >= 1)
++ {
++ order++;
++ size=size/2;
++ }
++
++ return ( (void *)__get_free_pages(GFP_ATOMIC, order));
++ */
++ //return ((void *)kmalloc(size, GFP_ATOMIC));
++ //return ((void *)kmalloc(size, GFP_KERNEL));
++ void *ptr;
++
++ ptr = kmalloc(size, GFP_ATOMIC);
++ if(ptr==NULL)
++ {
++ printk("failed atomic\n");
++ ptr = kmalloc(size, GFP_KERNEL);
++ if(ptr==NULL)
++ {
++ printk("failed kernel\n");
++ ptr = kmalloc(size, GFP_KERNEL|GFP_DMA);
++ }
++ }
++ printk("size=%d\n", size);
++ return ptr;
++
++}
++
++
++void shim_osFreeMemory(void *ptr, unsigned int size)
++{
++
++ kfree(ptr);
++}
++
++void shim_osFreeDmaMemory(void *ptr, unsigned int size)
++{
++/*
++ int order;
++
++ order=1;
++ size=size/4096;
++ while(size >=1)
++ {
++ order++;
++ size=size/2;
++ }
++ free_pages(ptr, order);
++*/
++ kfree(ptr);
++}
++
++void *shim_osAllocateVMemory(unsigned int size)
++{
++
++ return ((void *)vmalloc(size));
++}
++
++void shim_osFreeVMemory(void *ptr, unsigned int size)
++{
++ vfree(ptr);
++}
++
++void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes)
++{
++ memcpy(dst, src, numBytes);
++}
++
++void shim_osZeroMemory(char *dst, unsigned int numBytes)
++{
++ memset(dst, 0, numBytes);
++}
++
++void shim_osWriteBackCache(void *addr, unsigned int size)
++{
++ unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
++
++ for (i=0;i<Size;i+=16,addr+=16)
++ {
++ __asm__(" .set mips3 ");
++ __asm__(" cache 25, (%0)" : : "r" (addr));
++ __asm__(" .set mips0 ");
++ }
++}
++
++void shim_osInvalidateCache(void *addr, unsigned int size)
++{
++ unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
++
++ for (i=0;i<Size;i+=16,addr+=16)
++ {
++ __asm__(" .set mips3 ");
++ __asm__("cache 17, (%0)" : : "r" (addr));
++ __asm__(" .set mips0 ");
++ }
++}
++
++void shim_osClockWait(int val)
++{
++ unsigned int chkvalue;
++ chkvalue=val/64;
++
++ if(chkvalue > 1000)
++ {
++ mdelay(chkvalue/1000);
++ return;
++ }
++ else
++ udelay(val/64);
++} /* end of cwait() */
++
++unsigned int shim_osClockTick(int val)
++{
++ return jiffies;
++}
++
++int flags;
++spinlock_t shimLock;
++
++void shim_osCriticalEnter(void)
++{
++ spin_lock_irqsave(&shimLock, flags);
++
++}
++
++
++void shim_osCriticalExit(void)
++{
++ spin_unlock_irqrestore(&shimLock, flags);
++}
++
++
++int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,
++ int *eof, void *data)
++{
++
++ int len = 0;
++ int limit = count - 80;
++ int F4count, F5count;
++
++
++ /* Read Ax5 Stats */
++ dslhal_api_gatherStatistics(pIhw);
++
++ if(len<=limit)
++ len += sprintf(buf+len, "\nAR7 DSL Modem Statistics:\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "--------------------------------\n");
++ /* us and ds Connection Rates */
++ if(len<=limit)
++ len += sprintf(buf+len, "[DSL Modem Stats]\n");
++
++
++ if(len<=limit)
++ {
++ if(pIhw->lConnected != 1)
++ {
++ pIhw->AppData.USConRate = 0;
++ pIhw->AppData.DSConRate = 0;
++ }
++ len += sprintf(buf+len, "\tUS Connection Rate:\t%u\tDS Connection Rate:\t%u\n",
++ (unsigned int)pIhw->AppData.USConRate,
++ (unsigned int)pIhw->AppData.DSConRate );
++ }
++ if(len<=limit)
++ len += sprintf(buf+len, "\tDS Line Attenuation:\t%u\tDS Margin:\t\t%u\n",
++ (unsigned int)pIhw->AppData.dsLineAttn/2,
++ (unsigned int)pIhw->AppData.dsMargin/2 );
++ if(len<=limit)
++ len += sprintf(buf+len, "\tUS Line Attenuation:\t%u\tUS Margin:\t\t%u\n",
++ (unsigned int)pIhw->AppData.usLineAttn,
++ (unsigned int)pIhw->AppData.usMargin );
++ if(len<=limit)
++ len += sprintf(buf+len, "\tUS Payload :\t\t%u\tDS Payload:\t\t%u\n",
++ ((unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1])*48,
++ ((unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1])*48);
++ /* Superframe Count */
++ if(len<=limit)
++ len += sprintf(buf+len, "\tUS Superframe Cnt :\t%u\tDS Superframe Cnt:\t%u\n",
++ (unsigned int)pIhw->AppData.usSuperFrmCnt,
++ (unsigned int)pIhw->AppData.dsSuperFrmCnt );
++
++ /* US and DS power */
++ if(len<=limit)
++ len += sprintf(buf+len, "\tUS Transmit Power :\t%u\tDS Transmit Power:\t%u\n",
++ (unsigned int)pIhw->AppData.usTxPower/256,
++ (unsigned int)pIhw->AppData.dsTxPower/256 );
++ /* DSL Stats Errors*/
++ if(len<=limit)
++ len += sprintf(buf+len, "\tLOS errors:\t\t%u\tSEF errors:\t\t%u\n",
++ (unsigned int)pIhw->AppData.LOS_errors,
++ (unsigned int)pIhw->AppData.SEF_errors );
++ if(len<=limit)
++ len += sprintf(buf+len, "\tFrame mode:\t\t%u\tMax Frame mode:\t\t%u\n",
++ (unsigned int)pIhw->AppData.FrmMode,
++ (unsigned int)pIhw->AppData.MaxFrmMode );
++ if(len<=limit)
++ len += sprintf(buf+len, "\tTrained Path:\t\t%u\tUS Peak Cell Rate:\t%u\n",
++ (unsigned int)pIhw->AppData.TrainedPath,
++ (unsigned int)pIhw->AppData.USConRate*1000/8/53 );
++ if(len<=limit)
++ len += sprintf(buf+len, "\tTrained Mode:\t\t%u\tSelected Mode:\t\t%u\n",
++ (unsigned int)pIhw->AppData.TrainedMode, (unsigned int)pIhw->AppData.StdMode );
++
++ if(len<=limit)
++ len += sprintf(buf+len, "\tATUC Vendor ID:\t%u\tATUC Revision:\t\t%u\n",
++ (unsigned int)pIhw->AppData.atucVendorId, pIhw->AppData.atucRevisionNum);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tHybrid Selected:\t%u\n",
++ (unsigned int)pIhw->AppData.currentHybridNum);
++
++ /* Upstream Interleaved Errors */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Upstream (TX) Interleave path]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
++ (unsigned int)pIhw->AppData.usICRC_errors,
++ (unsigned int)pIhw->AppData.usIFEC_errors,
++ (unsigned int)pIhw->AppData.usINCD_error);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
++ (unsigned int)pIhw->AppData.usILCD_errors,
++ (unsigned int)pIhw->AppData.usIHEC_errors);
++ /* Downstream Interleaved Errors */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Downstream (RX) Interleave path]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
++ (unsigned int)pIhw->AppData.dsICRC_errors,
++ (unsigned int)pIhw->AppData.dsIFEC_errors,
++ (unsigned int)pIhw->AppData.dsINCD_error);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
++ (unsigned int)pIhw->AppData.dsILCD_errors,
++ (unsigned int)pIhw->AppData.dsIHEC_errors);
++ /* Upstream Fast Errors */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Upstream (TX) Fast path]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
++ (unsigned int)pIhw->AppData.usFCRC_errors,
++ (unsigned int)pIhw->AppData.usFFEC_errors,
++ (unsigned int)pIhw->AppData.usFNCD_error);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
++ (unsigned int)pIhw->AppData.usFLCD_errors,
++ (unsigned int)pIhw->AppData.usFHEC_errors);
++ /* Downstream Fast Errors */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Downstream (RX) Fast path]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
++ (unsigned int)pIhw->AppData.dsFCRC_errors,
++ (unsigned int)pIhw->AppData.dsFFEC_errors,
++ (unsigned int)pIhw->AppData.dsFNCD_error);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
++ (unsigned int)pIhw->AppData.dsFLCD_errors,
++ (unsigned int)pIhw->AppData.dsFHEC_errors);
++ /* ATM stats upstream */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n[ATM Stats]");
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Upstream/TX]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\n",
++ (unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1],
++ (unsigned int)pIhw->AppData.usIdle_count[0] + (unsigned int)pIhw->AppData.usIdle_count[1]);
++ /* ATM stats downstream */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n\t[Downstream/RX)]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\tBad Hec Cell Cnt:\t%u\n",
++ (unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1],
++ (unsigned int)pIhw->AppData.dsIdle_count[0] + (unsigned int)pIhw->AppData.dsIdle_count[1],
++ (unsigned int)pIhw->AppData.dsBadHec_count[0] + (unsigned int)pIhw->AppData.dsBadHec_count[1]);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tOverflow Dropped Cell Cnt:\t%u\n",
++ (unsigned int)pIhw->AppData.dsOVFDrop_count[0] + (unsigned int)pIhw->AppData.dsOVFDrop_count[1]);
++ tn7sar_get_stats(pIhw->pOsContext);
++ if(len<=limit)
++ len += sprintf(buf+len, "\n[SAR AAL5 Stats]\n");
++ if(len<=limit)
++ len += sprintf(buf+len, "\tTx PDU's:\t%u\n\tRx PDU's:\t%u\n",
++ sarStat.txPktCnt,
++ sarStat.rxPktCnt);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tTx Total Bytes:\t%u\n\tRx Total Bytes:\t%u\n",
++ sarStat.txBytes,
++ sarStat.rxBytes);
++ if(len<=limit)
++ len += sprintf(buf+len, "\tTx Total Error Counts:\t%u\n\tRx Total Error Counts:\t%u\n\n",
++ sarStat.txErrors,
++ sarStat.rxErrors);
++
++ /* oam loopback info */
++ if(len<=limit)
++ len += sprintf(buf+len, "\n[OAM Stats]\n");
++
++ tn7sar_get_near_end_loopback_count(&F4count, &F5count);
++
++ if(len<=limit)
++ {
++ len += sprintf(buf+len, "\tNear End F5 Loop Back Count:\t%u\n\tNear End F4 Loop Back Count:\t%u\n\tFar End F5 Loop Back Count:\t%u\n\tFar End F4 Loop Back Count:\t%u\n",
++ F5count,
++ F4count,
++ oamFarLBCount[0] + oamFarLBCount[2],
++ oamFarLBCount[1] + oamFarLBCount[3]);
++ }
++ return len;
++}
++
++int
++tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,
++ int *eof, void *data)
++{
++
++ int len = 0;
++ int limit = count - 80;
++
++ char *state;
++ int tag;
++
++ tag= dslhal_api_pollTrainingStatus(pIhw);
++ tag = pIhw->AppData.bState;
++
++ switch(tag){
++ case 0: state = "ACTREQ"; break;
++ case 1: state = "QUIET1"; break;
++ case 2: state = "IDLE"; break;
++ case 3: state = "INIT"; break;
++ case 4: state = "RTDL"; break;
++ case 5: state = "SHOWTIME"; break;
++ default: state = "unknown"; break;
++ }
++
++ if(pIhw->lConnected == 1)
++ state = "SHOWTIME";
++ if(len<=limit)
++ len += sprintf(buf+len,"%s\n",state);
++
++ return len;
++}
++
++
++
++int tn7dsl_handle_interrupt(void)
++{
++ int intsrc;
++ unsigned char cMsgRa[6];
++ short margin;
++
++ dprintf(4, "tn7dsl_handle_dsl_interrupt()\n");
++ if(pIhw)
++ {
++ intsrc=dslhal_api_acknowledgeInterrupt(pIhw);
++ dslhal_api_handleTrainingInterrupt(pIhw, intsrc);
++
++ if(pIhw->lConnected == TC_SYNC)
++ {
++
++ if(dslInSync == 0)
++ {
++ printk("DSL in Sync\n");
++ tn7atm_device_connect_status(pIhw->pOsContext, 1);
++ dslhal_api_initStatistics(pIhw);
++ dslhal_api_gatherStatistics(pIhw);
++#ifdef CONFIG_LED_MODULE
++ led_operation(MOD_ADSL, DEF_ADSL_SYNC);
++ led_on = DEF_ADSL_SYNC;
++#endif
++ /* add auto margin retrain */
++ if(pIhw->AppData.TrainedMode < 5)
++ {
++ if(bMarginRetrainEnable && bMarginThConfig == 0)
++ {
++ dslhal_support_getCMsgsRa(pIhw, cMsgRa);
++ margin = *(unsigned short *)&cMsgRa[4];
++ margin = (margin >> 6) & 0x3f;
++ if(margin & 0x20) // highest bit is 1
++ {
++ margin = -(margin & 0x1f);
++ }
++
++ //printk("margin = %d, cmsg-ra = %02x %02x %02x %02x %02x %02x\n", margin, cMsgRa[0],cMsgRa[1],cMsgRa[2],cMsgRa[3],cMsgRa[4],cMsgRa[5]);
++ dslhal_api_setMarginThreshold(pIhw, margin*2); /* DSL margin is in 0.5db */
++ }
++ }
++
++ }
++ dslInSync = 1;
++ }
++ else
++ {
++ if(dslInSync == 1)
++ {
++ dslInSync = 0;
++ tn7atm_device_connect_status(pIhw->pOsContext, 0);
++ up(&adsl_sem_overlay);
++ printk("DSL out of syn\n");
++ }
++#ifdef CONFIG_LED_MODULE
++ if(pIhw->AppData.bState < RSTATE_INIT)
++ {
++ if(led_on != DEF_ADSL_IDLE)
++ {
++ led_operation(MOD_ADSL, DEF_ADSL_IDLE);
++ led_on = DEF_ADSL_IDLE;
++ }
++ }
++ else
++ {
++ if(led_on != DEF_ADSL_TRAINING)
++ {
++ led_operation(MOD_ADSL, DEF_ADSL_TRAINING);
++ led_on = DEF_ADSL_TRAINING;
++ }
++
++ }
++
++#endif
++
++ }
++ }
++ return 0;
++}
++
++
++int tn7dsl_get_dslhal_version(char *pVer)
++{
++ dslVer ver;
++
++ dslhal_api_getDslHalVersion(&ver);
++
++ memcpy(pVer,&ver,8);
++ return 0;
++}
++
++int tn7dsl_get_dsp_version(char *pVer)
++{
++ dspVer ver;
++ dslhal_api_getDspVersion(pIhw, &ver);
++ memcpy(pVer, &ver, 9);
++ return 0;
++}
++
++
++static int
++tn7dsl_get_modulation(void)
++{
++ char *ptr = NULL;
++
++ dprintf(4, "tn7dsl_get_modulation\n");
++ //printk("tn7dsl_get_modulation\n");
++ ptr = prom_getenv("modulation");
++
++ if (!ptr) {
++ //printk("modulation is not set in adam2 env\n");
++ //printk("Using multimode\n");
++ return 0;
++ }
++ printk("dsl modulation = %s\n", ptr);
++
++ tn7dsl_set_modulation(ptr);
++
++ return 0;
++}
++
++
++static int tn7dsl_set_dsl(void)
++{
++
++ char *ptr = NULL;
++ int value;
++ int i, offset[2]={4,11},oamFeature=0;
++ char tmp[4];
++ char dspVer[10];
++
++ // OAM Feature Configuration
++ dslhal_api_dspInterfaceRead(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
++ oamFeature |= dslhal_support_byteSwap32(0x0000000C);
++ dslhal_api_dspInterfaceWrite(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
++
++ // modulation
++ ptr = prom_getenv("modulation");
++ if (ptr)
++ {
++ printk("dsl modulation = %s\n", ptr);
++ tn7dsl_set_modulation(ptr);
++ }
++
++ // margin retrain
++ ptr = NULL;
++ ptr = prom_getenv("enable_margin_retrain");
++ if(ptr)
++ {
++ value = os_atoi(ptr);
++ if(value == 1)
++ {
++ dslhal_api_setMarginMonitorFlags(pIhw, 0, 1);
++ bMarginRetrainEnable = 1;
++ printk("enable showtime margin monitor.\n");
++ ptr = NULL;
++ ptr = prom_getenv("margin_threshold");
++ if(ptr)
++ {
++ value = os_atoi(ptr);
++ printk("Set margin threshold to %d x 0.5 db\n",value);
++ if(value >= 0)
++ {
++ dslhal_api_setMarginThreshold(pIhw, value);
++ bMarginThConfig=1;
++ }
++ }
++ }
++ }
++
++ // rate adapt
++ ptr = NULL;
++ ptr = prom_getenv("enable_rate_adapt");
++ if(ptr)
++ {
++ dslhal_api_setRateAdaptFlag(pIhw, os_atoi(ptr));
++ }
++
++ // trellis
++ ptr = NULL;
++ ptr = prom_getenv("enable_trellis");
++ if(ptr)
++ {
++ dslhal_api_setTrellisFlag(pIhw, os_atoi(ptr));
++ }
++
++ // maximum bits per carrier
++ ptr = NULL;
++ ptr = prom_getenv("maximum_bits_per_carrier");
++ if(ptr)
++ {
++ dslhal_api_setMaxBitsPerCarrier(pIhw, os_atoi(ptr));
++ }
++
++ // maximum interleave depth
++ ptr = NULL;
++ ptr = prom_getenv("maximum_interleave_depth");
++ if(ptr)
++ {
++ dslhal_api_setMaxInterleaverDepth(pIhw, os_atoi(ptr));
++ }
++
++ // inner and outer pairs
++ ptr = NULL;
++ ptr = prom_getenv("pair_selection");
++ if(ptr)
++ {
++ dslhal_api_selectInnerOuterPair(pIhw, os_atoi(ptr));
++ }
++
++ ptr = NULL;
++ ptr = prom_getenv("dgas_polarity");
++ if(ptr)
++ {
++ dslhal_api_configureDgaspLpr(pIhw, 1, 1);
++ dslhal_api_configureDgaspLpr(pIhw, 0, os_atoi(ptr));
++ }
++
++ ptr = NULL;
++ ptr = prom_getenv("los_alarm");
++ if(ptr)
++ {
++ dslhal_api_disableLosAlarm(pIhw, os_atoi(ptr));
++ }
++
++ ptr = NULL;
++ ptr = prom_getenv("eoc_vendor_id");
++ if(ptr)
++ {
++ for(i=0;i<8;i++)
++ {
++ tmp[0]=ptr[i*2];
++ tmp[1]=ptr[i*2+1];
++ tmp[2]=0;
++ EOCVendorID[i] = os_atoh(tmp);
++ //printk("tmp=%s--", tmp);
++ //printk("ID[%d]=0x%02x ", i, (unsigned char)EOCVendorID[i]);
++ }
++ tn7dsl_get_dsp_version(dspVer);
++ //printk("Annex =%d\n", dspVer[8]);
++ if(dspVer[8]==2) // annex b
++ {
++ //printk("EOCVendorID=%02x %02x %02x %02x %02x %02x %02x %02x\n", EOCVendorID[0], EOCVendorID[1], EOCVendorID[2], EOCVendorID[3],
++ // EOCVendorID[4], EOCVendorID[5], EOCVendorID[6], EOCVendorID[7]);
++ dslhal_api_setEocVendorId(pIhw, EOCVendorID);
++ }
++
++ }
++
++ return 0;
++}
++
++
++
++
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: static void tn7dsl_init(void)
++ *
++ * Description: This function initializes
++ * Ar7 DSL interface
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++
++int tn7dsl_init(void *priv)
++{
++
++ printk("Initializing DSL interface\n");
++
++
++ /* start dsl */
++ if(dslhal_api_dslStartup(&pIhw) !=0 )
++ {
++ printk("DSL start failed.\n");
++ return -1;
++ }
++
++ // set dsl into overlay page reload mode
++ pIhw->bAutoRetrain = 1;
++
++ // set default training properties
++ tn7dsl_set_dsl();
++
++ pIhw->pOsContext = priv;
++
++ //start_kthread(tn7dsl_reload_overlay, &overlay_thread);
++
++ /*register dslss LED with led module */
++#ifdef CONFIG_LED_MODULE
++ tn7dsl_register_dslss_led();
++#endif
++
++
++ return 0; /* What do we return here? */
++}
++
++/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++ *
++ * Function: int avsar_exit(void)
++ *
++ * Description: Avalanche SAR exit function
++ *
++ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
++
++void tn7dsl_exit (void)
++{
++
++ bshutdown = 1;
++#ifdef CONFIG_LED_MODULE
++#ifdef DEREGISTER_LED
++ //down(&adsl_sem_overlay);
++ deregister_led_drv(LED_NUM_1);
++ deregister_led_drv(LED_NUM_2);
++#else
++ led_operation(MOD_ADSL,DEF_ADSL_IDLE);
++#endif
++#endif
++ stop_kthread(&overlay_thread);
++ dslhal_api_dslShutdown(pIhw);
++
++}
++
++
++static int tn7dsl_process_oam_string(int *type, int *pvpi, int *pvci, int *pdelay)
++{
++ int i=1;
++ int j=0;
++ int vci, vpi;
++ char tmp[16];
++ int chan;
++ int tt;
++
++ while(j<8)
++ {
++ tmp[j] = mod_req[i];
++ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
++ if(tmp[j] == 0x50 || tmp[j] == 0x70)
++ break;
++ j++;
++ i++;
++ }
++
++ tmp[j] = 0;
++ vpi = os_atoi(tmp);
++
++ i++;
++ j=0;
++ while(j<8)
++ {
++ tmp[j] = mod_req[i];
++ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
++ if(tmp[j] == 0x43 || tmp[j] == 0x63)
++ break;
++
++ j++;
++ i++;
++ }
++
++ vci = os_atoi(tmp);
++
++ if(vci==0) // f4 oam
++ *type = 1;
++ else
++ *type = 0;
++
++
++ tt=5000;
++ i++;
++ j=0;
++ tmp[j] = mod_req[i];
++ if(tmp[j]==0x44 || tmp[j]==0x64)
++ {
++ i++;
++ while(j<8)
++ {
++ tmp[j] = mod_req[i];
++
++ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
++ if(tmp[j] == 0x54 || tmp[j] == 0x74)
++ break;
++
++ j++;
++ i++;
++ }
++ tt = os_atoi(tmp);
++ }
++
++ chan = tn7atm_lut_find(vpi, vci);
++
++ *pvci=vci;
++ *pvpi=vpi;
++ *pdelay =tt;
++ dprintf(2, "oam chan=%d, type =%d\n", chan, *type);
++
++ return chan;
++}
++
++static void tn7dsl_dump_memory(void)
++{
++ unsigned int *pUi;
++ int i=1;
++ int j=0;
++ int addr, len;
++ char tmp[16];
++
++
++ while(j<8)
++ {
++ tmp[j] = mod_req[i];
++ j++;
++ i++;
++ }
++
++ tmp[j] = 0;
++
++ addr = os_atoh(tmp);
++
++ printk("start dump address =0x%x\n", addr);
++ pUi = (unsigned int *)addr;
++ i++;
++ j=0;
++ while(j<8)
++ {
++ tmp[j] = mod_req[i];
++ //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]);
++ if(tmp[j] == 0x43 || tmp[j] == 0x63)
++ break;
++
++ j++;
++ i++;
++ }
++
++ len = os_atoi(tmp);
++ j=0;
++ for(i=0; i<len; i++)
++ {
++ if(j==0)
++ printk("0x%08x: ", (unsigned int)pUi);
++ printk("%08x ", *pUi);
++ pUi++;
++ j++;
++ if(j==4)
++ {
++ printk("\n");
++ j=0;
++ }
++ }
++
++}
++
++
++
++static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp,
++ void *buffer, size_t *lenp)
++{
++ char *ptr;
++ int ret, len = 0;
++ int chan;
++ int type;
++ int vpi,vci,timeout;
++
++ if (!*lenp || (filp->f_pos && !write)) {
++ *lenp = 0;
++ return 0;
++ }
++ /* DSL MODULATION is changed */
++ if(write)
++ {
++ ret = proc_dostring(ctl, write, filp, buffer, lenp);
++
++ switch (ctl->ctl_name)
++ {
++ case DEV_DSLMOD:
++ ptr = strpbrk(info, " \t");
++ strcpy(mod_req, info);
++
++ /* parse the string to determine the action */
++ if(mod_req[0] == 0x45 || mod_req[0] == 0x65 ) // 'e', or 'E' f5 end to end
++ {
++ chan = tn7dsl_process_oam_string(&type, &vpi, &vci, &timeout);
++ tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci, timeout);
++ }
++ else if(mod_req[0] == 0x53 || mod_req[0] == 0x73 ) // 's', or 'S' f5 seg to seg
++ {
++ chan=tn7dsl_process_oam_string(&type, &vpi, &vci,&timeout);
++ type = type | (1<<1);
++ tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci,timeout);
++ }
++ //debug only. Dump memory
++ else if(mod_req[0] == 0x44 || mod_req[0] == 0x64 ) // 'd' or 'D'
++ tn7dsl_dump_memory();
++ else
++ tn7dsl_chng_modulation(info);
++ break;
++ }
++ }
++ else
++ {
++ len += sprintf(info+len, mod_req);
++ ret = proc_dostring(ctl, write, filp, buffer, lenp);
++ }
++ return ret;
++}
++
++
++ctl_table dslmod_table[] = {
++ {DEV_DSLMOD, "dslmod", info, DSL_MOD_SIZE, 0644, NULL, &dslmod_sysctl},
++ {0}
++ };
++
++/* Make sure that /proc/sys/dev is there */
++ctl_table dslmod_root_table[] = {
++#ifdef CONFIG_PROC_FS
++ {CTL_DEV, "dev", NULL, 0, 0555, dslmod_table},
++#endif /* CONFIG_PROC_FS */
++ {0}
++ };
++
++static struct ctl_table_header *dslmod_sysctl_header;
++
++void tn7dsl_dslmod_sysctl_register(void)
++{
++ static int initialized;
++
++ if (initialized == 1)
++ return;
++
++ dslmod_sysctl_header = register_sysctl_table(dslmod_root_table, 1);
++ dslmod_root_table->child->de->owner = THIS_MODULE;
++
++ /* set the defaults */
++ info[0] = 0;
++
++ initialized = 1;
++}
++
++void tn7dsl_dslmod_sysctl_unregister(void)
++{
++ unregister_sysctl_table(dslmod_sysctl_header);
++}
++
++static void
++tn7dsl_set_modulation(void* data)
++{
++ dprintf(4,"tn7dsl_set_modulation\n");
++
++ if(!strcmp(data, "T1413"))
++ {
++ printk("retraining in T1413 mode\n");
++ dslhal_api_setTrainingMode(pIhw, T1413_MODE);
++ return;
++ }
++ if(!strcmp(data, "GDMT"))
++ {
++ dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
++ return;
++ }
++ if(!strcmp(data, "GLITE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
++ return;
++ }
++ if(!strcmp(data, "MMODE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
++ return;
++ }
++ if(!strcmp(data, "NMODE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, NO_MODE);
++ return;
++ }
++
++ return;
++}
++
++
++/* Codes added for compiling tiadiag.o for Analog Diagnostic tests */
++#ifdef ADIAG
++
++enum
++{
++ HOST_ACTREQ, // Send R-ACKREQ and monitor for C-ACKx
++ HOST_QUIET, // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
++ HOST_XMITBITSWAP, // Perform upstream bitswap - FOR INTERNAL USE ONLY
++ HOST_RCVBITSWAP, // Perform downstream bitswap - FOR INTERNAL USE ONLY
++ HOST_RTDLPKT, // Send a remote download packet - FOR INTERNAL USE ONLY
++ HOST_CHANGELED, // Read the LED settings and change accordingly
++ HOST_IDLE, // Sit quiet
++ HOST_REVERBTEST, // Generate REVERB for manufacturing test
++ HOST_CAGCTEST, // Set coarse receive gain for manufacturing test
++ HOST_DGASP, // send Dying Gasp messages through EOC channel
++ HOST_GHSREQ, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHS_SENDGALF, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSEXIT, // G.hs - FOR INTERNAL USE ONLY
++ HOST_GHSMSG1, // G.hs - FOR INTERNAL USE ONLY
++ HOST_HYBRID, // Enable/Disable automatic hybrid switch
++ HOST_RJ11SELECT, // RJ11 inner/outer pair select
++ HOST_DIGITAL_MEM, // Digital Diags: run external memory tests
++ HOST_TXREVERB, // AFE Diags: TX path Reverb
++ HOST_TXMEDLEY, // AFE Diags: TX path Medley
++ HOST_RXNOISEPOWER, // AFE Diags: RX noise power
++ HOST_ECPOWER, // AFE Diags: RX eco power
++ HOST_ALL_ADIAG, // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
++ HOST_USER_ADIAG, // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
++ HOST_QUIT_ADIAG, // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
++ HOST_NO_CMD, // All others - G.hs - FOR INTERNAL USE ONLY
++ HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
++ HOST_SET_GENERIC, // Set generic CO profile
++ HOST_UNDO_GENERIC // Set profile previous to Generic
++};
++
++enum
++{
++ DSP_IDLE, // R_IDLE state entered
++ DSP_ACTMON, // R_ACTMON state entered
++ DSP_TRAIN, // R_TRAIN state entered
++ DSP_ACTIVE, // R_ACTIVE state entered
++ DSP_XMITBITSWAP, // Upstream bitswap complete - FOR INTERNAL USE ONLY
++ DSP_RCVBITSWAP, // Downstream bitswap complete - FOR INTERNAL USE ONLY
++ DSP_RTDL, // R_RTDL state entered - FOR INTERNAL USE ONLY
++ DSP_RRTDLPKT, // RTDL packet received - FOR INTERNAL USE ONLY
++ DSP_XRTDLPKT, // RTDL packet transmitted - FOR INTERNAL USE ONLY
++ DSP_ERROR, // Command rejected, wrong state for this command
++ DSP_REVERBTEST, // Manufacturing REVERB test mode entered
++ DSP_CAGCTEST, // Manufacturing receive gain test done
++ DSP_OVERLAY_START, // Notify host that page overlay has started - overlay number indicated by "tag"
++ DSP_OVERLAY_END, // Notify host that page overlay has ended - overlay number indicated by "tag"
++ DSP_CRATES1, // CRATES1 message is valid and should be copied to host memory now
++ DSP_SNR, // SNR calculations are ready and should be copied to host memory now
++ DSP_GHSMSG, // G.hs - FOR INTERNAL USE ONLY
++ DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
++ DSP_ATM_TC_SYNC, // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
++ DSP_ATM_NO_TC_SYNC, // Indicates loss of sync on phy layer on either US or DS.
++ DSP_HYBRID, // DSP completed hybrid switch
++ DSP_RJ11SELECT, // DSP completed RJ11 inner/outer pair select
++ DSP_INVALID_CMD, // Manufacturing (Digital and AFE) diags: CMD received not recognized
++ DSP_TEST_PASSED, // Manufacturing diags: test passed
++ DSP_TEST_FAILED, // Manufacturing diags: test failed
++ DSP_TXREVERB, // Manufacturing AFE diags: Response to HOST_TXREVERB
++ DSP_TXMEDLEY, // Manufacturing AFE diags: Response to HOST_TXMEDLEY
++ DSP_RXNOISEPOWER, // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
++ DSP_ECPOWER, // Manufacturing AFE diags: Response to HOST_ECPOWER
++ DSP_ALL_ADIAG, // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
++ DSP_USER_ADIAG, // Manufacturing AFE diags: Response to HOST_USER_ADIAG
++ DSP_QUIT_ADIAG, // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
++ DSP_DGASP // DSP Message to indicate dying gasp
++};
++
++static unsigned char analogNoTonesTestArray[64]=
++ {
++ 0,0,0,0,0,0,0,0, // Tones 01-08
++ 0,0,0,0,0,0,0,0, // Tones 09-16
++ 0,0,0,0,0,0,0,0, // Tones 17-24
++ 0,0,0,0,0,0,0,0, // Tones 25-32
++ 0,0,0,0,0,0,0,0, // Tones 33-40
++ 0,0,0,0,0,0,0,0, // Tones 41-48
++ 0,0,0,0,0,0,0,0, // Tones 49-56
++ 0,0,0,0,0,0,0,0 // Tones 57-64
++ };
++
++static unsigned char analogAllTonesTestArray[64]=
++ {
++ 1,1,1,1,1,1,1,1, // Tones 01-08
++ 1,1,1,1,1,1,1,1, // Tones 09-16
++ 1,1,1,1,1,1,1,1, // Tones 17-24
++ 1,1,1,1,1,1,1,1, // Tones 25-32
++ 1,1,1,1,1,1,1,1, // Tones 33-40
++ 1,1,1,1,1,1,1,1, // Tones 41-48
++ 1,1,1,1,1,1,1,1, // Tones 49-56
++ 1,1,1,1,1,1,1,1 // Tones 57-64
++ };
++
++static unsigned char analogEvenTonesTestArray[64]=
++ {
++ 0,1,0,1,0,1,0,1, // Tones 01-08
++ 0,1,0,1,0,1,0,1, // Tones 09-16
++ 0,1,0,1,0,1,0,1, // Tones 17-24
++ 0,1,0,1,0,1,0,1, // Tones 25-32
++ 0,1,0,1,0,1,0,1, // Tones 33-40
++ 0,1,0,1,0,1,0,1, // Tones 41-48
++ 0,1,0,1,0,1,0,1, // Tones 49-56
++ 0,1,0,1,0,1,0,1 // Tones 57-64
++ };
++
++static unsigned char analogOddTonesTestArray[64]=
++ {
++ 1,0,1,0,1,0,1,0, // Tones 01-08
++ 1,0,1,0,1,0,1,0, // Tones 09-16
++ 1,0,1,0,1,0,1,0, // Tones 17-24
++ 1,0,1,0,1,0,1,0, // Tones 25-32
++ 1,0,1,0,1,0,1,0, // Tones 33-40
++ 1,0,1,0,1,0,1,0, // Tones 41-48
++ 1,0,1,0,1,0,1,0, // Tones 49-56
++ 1,0,1,0,1,0,1,0 // Tones 57-64
++ };
++
++int shim_osGetCpuFrequency(void)
++{
++ return 150;
++}
++
++static void tn7dsl_adiag(int Test, unsigned char *missingTones)
++{
++ int rc,cmd, tag;
++
++ rc = dslhal_diags_anlg_setMissingTones(pIhw,missingTones);
++ if(rc)
++ {
++ printk(" failed to set Missing town\n");
++ return;
++ }
++
++/*********** Start the actual test **********************/
++
++ if(Test==0)
++ {
++ printk("TX REVERB Test\n");
++ rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXREVERB, 0, 0, 0);
++ if (rc)
++ {
++ printk("HOST_TXREVERB failed\n");
++ return;
++ }
++
++ }
++ if(Test==1)
++ {
++ dprintf(0,"TX MEDLEY Test\n");
++ rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXMEDLEY, 0, 0, 0);
++ if (rc)
++ return;
++ }
++ dprintf(4,"dslhal_diags_anlg_testA() done\n");
++ return;
++}
++
++
++static void tn7dsl_diagnostic_test(char *data)
++{
++ if(!strcmp(data, "ADIAGRALL"))
++ {
++ printk("TX Reverb All tone\n");
++ tn7dsl_adiag(0,analogAllTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGRNONE"))
++ {
++ printk("TX Reverb No tone\n");
++ tn7dsl_adiag(0,analogNoTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGREVEN"))
++ {
++ printk("TX Reverb Even tone\n");
++ tn7dsl_adiag(0,analogEvenTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGRODD"))
++ {
++ printk("TX Reverb Odd tone\n");
++ tn7dsl_adiag(0,analogOddTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGMALL"))
++ {
++ printk("TX Mdelay All tone\n");
++ tn7dsl_adiag(1,analogAllTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGMNONE"))
++ {
++ printk("TX Mdelay No tone\n");
++ tn7dsl_adiag(1,analogNoTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGMEVEN"))
++ {
++ printk("TX Mdelay Even tone\n");
++ tn7dsl_adiag(1,analogEvenTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGMODD"))
++ {
++ printk("TX Mdelay Odd tone\n");
++ tn7dsl_adiag(1,analogOddTonesTestArray);
++ return;
++ }
++ if(!strcmp(data, "ADIAGQUIET"))
++ {
++ dslhal_api_sendIdle(pIhw);
++ return;
++ }
++ if(!strncmp(data, "ADIAGRN", 7))
++ {
++ char tones[64], tmp[4];
++ int nth, i;
++
++ tmp[0]=data[7];
++ tmp[1]=data[8];
++ tmp[2]=data[9];
++
++ nth = os_atoi(tmp);
++
++ for(i=0;i<64;i++)
++ {
++ if(((i+1)% nth)==0)
++ {
++ tones[i]=0;
++ }
++ else
++ {
++ tones[i]=1;
++ }
++ }
++ printk("TX Reverb with %dth tones missing.\n", nth);
++ tn7dsl_adiag(0,tones);
++ return;
++ }
++ if(!strncmp(data, "ADIAGMN", 7))
++ {
++ char tones[64], tmp[4];
++ int nth, i;
++
++ tmp[0]=data[7];
++ tmp[1]=data[8];
++ tmp[2]=data[9];
++ nth = os_atoi(tmp);
++
++ for(i=0;i<64;i++)
++ {
++ if(((i+1)% nth)==0)
++ {
++ tones[i]=0;
++ }
++ else
++ {
++ tones[i]=1;
++ }
++ }
++ printk("TX Mdelay with %dth tones missing.\n", nth);
++ tn7dsl_adiag(1,tones);
++ return;
++ }
++
++
++}
++
++#endif
++
++static void
++tn7dsl_chng_modulation(void* data)
++{
++ //printk("DSL Modem Retraining\n");
++
++ if(!strcmp(data, "T1413"))
++ {
++ printk("retraining in T1413 mode\n");
++ dslhal_api_setTrainingMode(pIhw, T1413_MODE);
++ dslhal_api_sendQuiet(pIhw);
++ return;
++ }
++ if(!strcmp(data, "GDMT"))
++ {
++ dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
++ dslhal_api_sendQuiet(pIhw);
++ return;
++ }
++ if(!strcmp(data, "GLITE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
++ dslhal_api_sendQuiet(pIhw);
++ return;
++ }
++ if(!strcmp(data, "MMODE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
++ dslhal_api_sendQuiet(pIhw);
++ return;
++ }
++ if(!strcmp(data, "NMODE"))
++ {
++ dslhal_api_setTrainingMode(pIhw, NO_MODE);
++ dslhal_api_sendQuiet(pIhw);
++ return;
++ }
++
++#ifdef ADIAG
++ tn7dsl_diagnostic_test(data);
++#endif
++
++
++ return;
++}
++
++#ifdef CONFIG_LED_MODULE
++static void tn7dsl_led_on(unsigned long parm)
++{
++ dslhal_api_configureLed(pIhw,parm, 0);
++}
++
++
++static void tn7dsl_led_off(unsigned long parm)
++{
++ dslhal_api_configureLed(pIhw,parm, 1);
++}
++
++static void tn7dsl_led_init(unsigned long parm)
++{
++ dslhal_api_configureLed(pIhw,parm, 2);
++}
++#endif
++
++static void tn7dsl_register_dslss_led(void)
++{
++#ifdef CONFIG_LED_MODULE
++
++ // register led0 with led module
++ ledreg[0].param = 0;
++ ledreg[0].init = (void *)tn7dsl_led_init;
++ ledreg[0].onfunc = (void *)tn7dsl_led_on;
++ ledreg[0].offfunc = (void *)tn7dsl_led_off;
++ register_led_drv(LED_NUM_1, &ledreg[0]);
++
++ // register led1 output with led module
++ ledreg[1].param = 1;
++ ledreg[1].init = (void *)tn7dsl_led_init;
++ ledreg[1].onfunc = (void *)tn7dsl_led_on;
++ ledreg[1].offfunc = (void *)tn7dsl_led_off;
++ register_led_drv(LED_NUM_2, &ledreg[1]);
++#endif
++}
++
++static int tn7dsl_reload_overlay(void)
++{
++ int overlayFlag;
++ spinlock_t overlayLock;
++
++ init_kthread(&overlay_thread, "adsl");
++ down(&adsl_sem_overlay);
++ while(1)
++ {
++ mdelay(500);
++ if(pIhw->lConnected == 0)
++ {
++ spin_lock_irqsave(&overlayLock, overlayFlag);
++ dslhal_support_restoreTrainingInfo(pIhw);
++ spin_unlock_irqrestore(&overlayLock, overlayFlag);
++ }
++ down(&adsl_sem_overlay);
++ }
++ return 0;
++}
++
++
++
++
+diff -urN linux.old/drivers/atm/sangam_atm/tn7sar.c linux.dev/drivers/atm/sangam_atm/tn7sar.c
+--- linux.old/drivers/atm/sangam_atm/tn7sar.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tn7sar.c 2005-07-10 08:02:01.454109840 +0200
+@@ -0,0 +1,1376 @@
++/******************************************************************************
++ * FILE PURPOSE: OS files for CPSAR
++ ******************************************************************************
++ * FILE NAME: tn7sar.c
++ *
++ * DESCRIPTION: This file contains source for required os files for CPSAR
++ *
++ * (C) Copyright 2002, Texas Instruments Inc
++ *
++ *
++ * Revision History:
++ * 0/11/02 Zhicheng Tang, created.
++ *
++ *******************************************************************************/
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/atmdev.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/smp_lock.h>
++#include <asm/io.h>
++#include <asm/mips-boards/prom.h>
++#include <linux/proc_fs.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++
++
++#define _CPHAL_AAL5
++#define _CPHAL_SAR
++#define _CPHAL_HAL
++typedef void OS_PRIVATE;
++typedef void OS_DEVICE;
++typedef void OS_SENDINFO;
++typedef void OS_RECEIVEINFO;
++typedef void OS_SETUP;
++
++#include "cpswhal_cpsar.h"
++#include "tn7atm.h"
++#include "tn7api.h"
++
++
++/* PDSP Firmware files */
++#include "tnetd7300_sar_firm.h"
++
++
++enum
++{
++ PACKET_TYPE_AAL5,
++ PACKET_TYPE_NULL,
++ PACKET_TYPE_OAM,
++ PACKET_TYPE_TRANS,
++ PACKET_TYPE_AAL2
++}PACKET_TYPE;
++
++enum
++{
++ OAM_PING_FAILED,
++ OAM_PING_SUCCESS,
++ OAM_PING_PENDING,
++ OAM_PING_NOT_STARTED
++}OAM_PING;
++
++/* PDSP OAM General Purpose Registers (@todo: These need to be used in the HAL!) */
++
++#define SAR_PDSP_HOST_OAM_CONFIG_REG_ADDR 0xa3000020
++#define SAR_PDSP_OAM_CORR_REG_ADDR 0xa3000024
++#define SAR_PDSP_OAM_LB_RESULT_REG_ADDR 0xa3000028
++#define SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR 0xa300002c
++#define SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR 0xa3000030
++
++#define SAR_FREQUNCY 50000000
++
++#define AAL5_PARM "id=aal5, base = 0x03000000, offset = 0, int_line=15, ch0=[RxBufSize=1522; RxNumBuffers = 32; RxServiceMax = 50; TxServiceMax=50; TxNumBuffers=32; CpcsUU=0x5aa5; TxVc_CellRate=0x3000; TxVc_AtmHeader=0x00000640]"
++#define SAR_PARM "id=sar,base = 0x03000000, reset_bit = 9, offset = 0; UniNni = 0, PdspEnable = 1"
++#define RESET_PARM "id=ResetControl, base=0xA8611600"
++#define CH0_PARM "RxBufSize=1522, RxNumBuffers = 32, RxServiceMax = 50, TxServiceMax=50, TxNumBuffers=32, CpcsUU=0x5aa5, TxVc_CellRate=0x3000, TxVc_AtmHeader=0x00000640"
++
++#define MAX_PVC_TABLE_ENTRY 16
++
++sar_stat_t sarStat;
++
++typedef struct _channel_parm
++{
++ unsigned int RxBufSize;
++ unsigned int RxNumBuffers;
++ unsigned int RxServiceMax;
++ unsigned int TxServiceMax;
++ unsigned int TxNumBuffers;
++ unsigned int CpcsUU;
++ unsigned int TxVc_CellRate;
++ unsigned int TxVc_AtmHeader;
++}channel_parm_t;
++
++typedef struct _aal5_parm
++{
++ unsigned int base;
++ unsigned int offset;
++ unsigned int int_line;
++ channel_parm_t chan[8];
++}aal5_parm_t;
++
++
++typedef struct _sar_parm
++{
++ unsigned int base;
++ unsigned int reset_bit;
++ unsigned int offset;
++ unsigned int UniNni;
++}sar_parm_t;
++
++typedef struct _pvc_table
++{
++ int bInUse;
++ int vpi;
++ int vci;
++}pvc_table;
++
++static aal5_parm_t aal5Parm;
++static sar_parm_t sarParm;
++static char *pAal5, *pSar, *pReset;
++static int oam_type;
++static unsigned int oamPingStatus;
++static int oamAtmHdr;
++static int oamLbTimeout;
++static char parm_data[1024];
++static char aal5Data[1024];
++static char sarData[1024];
++static char resetData[256];
++static pvc_table pvc_result[MAX_PVC_TABLE_ENTRY];
++
++/* external function */
++extern int __guDbgLevel;
++
++/* gloabal function */
++unsigned int oamFarLBCount[4];
++/* end of gloabal function */
++
++/* internal APIs */
++static int tn7sar_atm_header(int vpi, int vci);
++static void tn7sar_record_pvc(int atmheader);
++
++/*end of internal APIs */
++spinlock_t sar_lock;
++
++/* HAL OS support functions */
++
++
++unsigned long tn7sar_strtoul(const char *str, char **endptr, int base)
++{
++ unsigned long ret;
++
++ ret= simple_strtoul(str, endptr, base);
++ return ret;
++}
++
++static void *tn7sar_malloc(unsigned int size)
++{
++ return(kmalloc(size, GFP_KERNEL));
++}
++
++static unsigned long lockflags;
++static void tn7sar_critical_on(void)
++{
++ spin_lock_irqsave(&sar_lock,lockflags);
++}
++
++static void tn7sar_critical_off(void)
++{
++ spin_unlock_irqrestore(&sar_lock,lockflags);
++}
++
++static void tn7sar_data_invalidate(void *pmem, int size)
++{
++ unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
++
++ for (i=0;i<Size;i+=16,pmem+=16)
++ {
++ __asm__(" .set mips3 ");
++ __asm__("cache 17, (%0)" : : "r" (pmem));
++ __asm__(" .set mips0 ");
++ }
++
++}
++
++static void tn7sar_data_writeback(void *pmem, int size)
++{
++ unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
++
++ for (i=0;i<Size;i+=16,pmem+=16)
++ {
++ __asm__(" .set mips3 ");
++ __asm__(" cache 25, (%0)" : : "r" (pmem));
++ __asm__(" .set mips0 ");
++ }
++}
++
++
++static int
++tn7sar_find_device(int unit, const char *find_name, void *device_info)
++{
++ int ret_val = 0;
++ char **ptr;
++
++ ptr = (char **)device_info;
++ dprintf(3,"tn7sar_find_device\n");
++ if(strcmp(find_name, "aal5")==0)
++ {
++ //dprintf(4,"pAal5=%s\n", pAal5);
++ *ptr = pAal5;
++ }
++ else if(strcmp(find_name, "sar")==0)
++ {
++ dprintf(3, "pSar=%s\n", pSar);
++ *ptr = pSar;
++ }
++ else if(strcmp(find_name, "reset")==0)
++ {
++ dprintf(3, "pReset=%s\n", pReset);
++ *ptr = pReset;
++ }
++
++ device_info = NULL;
++
++ return(ret_val);
++}
++
++static int
++tn7sar_get_device_parm_uint(void *dev_info, const char *param, unsigned int *value)
++{
++ char *dev_str;
++ char *pMatch;
++ int i=0, j=0;
++ char val_str[64];
++ unsigned int val;
++ int base = 10;
++
++ dprintf(6, "tn7sar_get_device_parm_uint()\n");
++
++ dev_str = (char *)dev_info;
++ dprintf(3, "parm=%s\n", param);
++ pMatch = strstr(dev_str, param);
++ //dprintf(4, "pMatch=%s\n", pMatch);
++ if(pMatch)
++ {
++ //get "=" position
++ while(pMatch[i] != 0x3d)
++ {
++ i++;
++ }
++ i++;
++ // get rid of spaces
++ while(pMatch[i]==0x20)
++ {
++ i++;
++ }
++ //get rid of 0x
++ if(pMatch[i]==0x30)
++ {
++ if(pMatch[i+1] == 0x58 || pMatch[i+1] == 0x78)
++ {
++ i+=2;
++ base = 16;
++ }
++ }
++
++ // get next delineator
++ while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
++ {
++ val_str[j]=pMatch[i];
++ j++;
++ i++;
++ }
++ val_str[j]=0;
++ //dprintf(4, "val_str=\n%s\n", val_str);
++ //xdump(val_str, strlen(val_str) + 1, 4);
++ val = simple_strtoul(val_str, (char **)NULL, base);
++ dprintf(4, "val =%d\n", val);
++ *value = val;
++ return 0;
++ }
++
++
++ dprintf(3, "match not found.\n");
++ if(strcmp(dev_str, "debug")==0)
++ {
++ dprintf(6,"debug..\n");
++ *value = 6;
++ return 0;
++ }
++ return (1);
++}
++
++static int tn7sar_get_device_parm_value(void *dev_info, const char *param, void *value)
++{
++ char *dev_str;
++ char *pMatch;
++ int i=0, j=0;
++ char *pVal;
++
++
++ dprintf(3, "tn7sar_get_device_parm_value().\n");
++
++ pVal = (char *) parm_data;
++ dev_str = (char *)dev_info;
++ dprintf(3, "dev_info: \n%s\n", dev_str);
++ dprintf(3, "param=%s\n", param);
++ if(strcmp(param, "Ch0")==0)
++ {
++ *(char **)value = CH0_PARM;
++ dprintf(3, "value =%s\n", *(char **)value);
++ return 0;
++ }
++
++ pMatch = strstr(dev_str, param);
++ if(pMatch)
++ {
++ //get "=" position
++ while(pMatch[i] != 0x3d)
++ {
++ i++;
++ }
++ i++;
++ // get rid of spaces
++ while(pMatch[i]==0x20)
++ {
++ i++;
++ }
++
++ if(pMatch[i] != 0x5b) //"["
++ {
++ // get next delineator
++ while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
++ {
++ pVal[j] = pMatch[i];
++ j++;
++ i++;
++ }
++ pVal[j]=0;
++
++ *(char **)value = pVal;
++ return 0;
++ }
++ else
++ {
++ i++; //skip "["
++ while(pMatch[i] != 0x5d)
++ {
++ if(pMatch[i] == 0x3b) //";"
++ pVal[j] = 0x2c;
++ else
++ pVal[j] = pMatch[i];
++ j++;
++ i++;
++ }
++ pVal[j] = 0;
++ *(char **)value = pVal;
++ return 0;
++ }
++
++ }
++
++ return (1);
++}
++
++static void tn7sar_free(void *pmem)
++{
++ kfree(pmem);
++}
++
++static void
++tn7sar_free_buffer(OS_RECEIVEINFO *os_receive_info, void *pmem)
++{
++ tn7atm_free_rx_skb(os_receive_info);
++}
++
++static void tn7sar_free_dev(void *pmem)
++{
++ kfree(pmem);
++}
++
++static void tn7sar_free_dma_xfer(void *pmem)
++{
++ kfree(pmem);
++}
++
++
++static int
++tn7sar_control(void *dev_info, const char *key, const char *action, void *value)
++{
++ int ret_val = -1;
++
++ if (strcmp(key, "Firmware") == 0)
++ {
++ if (strcmp(action, "Get") == 0)
++ {
++ *(int **)value = &SarPdspFirmware[0];
++ }
++ ret_val=0;
++ }
++
++ if (strcmp(key, "FirmwareSize") == 0)
++ {
++ if (strcmp(action, "Get") == 0)
++ {
++ *(int *)value = sizeof(SarPdspFirmware);
++ }
++ ret_val=0;
++ }
++
++ if (strcmp(key, "OamLbResult") == 0)
++ {
++ dprintf(2, "get looback source call back\n");
++ if (strcmp(action, "Set") == 0)
++ {
++ dprintf(2, "oam result = %d\n", *(unsigned int *)value);
++ oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + *(unsigned int *)value;
++ if(oamPingStatus == OAM_PING_PENDING)
++ {
++ oamPingStatus = *(unsigned int *)value;
++ if(oamPingStatus == OAM_PING_SUCCESS)
++ {
++ /* record pvc */
++ tn7sar_record_pvc(oamAtmHdr);
++ }
++ }
++
++ }
++ ret_val=0;
++ }
++
++ if (strcmp(key, "SarFreq") == 0)
++ {
++ if (strcmp(action, "Get") == 0)
++ {
++ *(int *)value = SAR_FREQUNCY;
++ }
++ ret_val=0;
++ }
++ return(ret_val);
++}
++
++
++static void
++tn7sar_sarhal_isr_register(OS_DEVICE *os_dev, int(*hal_isr)(HAL_DEVICE *, int *), int interrupt_num)
++{
++ tn7atm_sarhal_isr_register(os_dev, hal_isr, interrupt_num);
++}
++
++static void
++tn7sar_isr_unregister(OS_DEVICE *os_dev, int interrupt_num)
++{
++ /* TODO */
++}
++
++
++static void *
++tn7sar_malloc_rxbuffer(unsigned int size, void *mem_base, unsigned int mem_range, HAL_DEVICE *hal_dev,
++ HAL_RECEIVEINFO *hal_info, OS_RECEIVEINFO **os_receive_info, OS_DEVICE *os_dev)
++{
++ return tn7atm_allocate_rx_skb(os_dev, os_receive_info, size);
++}
++
++static void *
++tn7sar_malloc_dev(unsigned int size)
++{
++ return(kmalloc(size, GFP_KERNEL));
++}
++
++static void *
++tn7sar_malloc_dma_xfer(unsigned int size, void *mem_base, unsigned int mem_range)
++{
++ dprintf(4, "tn7sar_malloc_dma_xfer, size =%d\n", size);
++
++ return (kmalloc(size, GFP_DMA |GFP_KERNEL));
++
++}
++
++static void *
++tn7sar_memset(void *dst, int set_char, size_t count)
++{
++ return (memset(dst, set_char, count));
++}
++
++static int tn7sar_printf(const char *format, ...)
++{
++ /* TODO: add debug levels */
++ static char buff[256];
++ va_list ap;
++
++ va_start( ap, format);
++ vsprintf((char *)buff, format, ap);
++ va_end(ap);
++
++ printk("SAR HAL: %s\n", buff);
++ return(0);
++}
++
++static void tn7sar_record_pvc(int atmheader)
++{
++ int vci,vpi;
++ int i;
++
++ vci = 0xffff & (atmheader >> 4);
++ vpi = 0xff & (atmheader >> 20);
++ for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
++ {
++ if(pvc_result[i].bInUse)
++ {
++ if(pvc_result[i].vpi == vpi && pvc_result[i].vci == vci)
++ {
++ return;
++ }
++ }
++ }
++ for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
++ {
++ if(pvc_result[i].bInUse == 0)
++ {
++ pvc_result[i].bInUse = 1;
++ pvc_result[i].vpi = vpi;
++ pvc_result[i].vci = vci;
++ return;
++ }
++ }
++ return;
++}
++
++static void tn7sar_clear_pvc_table(void)
++{
++ int i;
++
++ for(i=0;i<MAX_PVC_TABLE_ENTRY; i++)
++ {
++ pvc_result[i].bInUse = 0;
++ pvc_result[i].vpi = 0;
++ pvc_result[i].vci = 0;
++ }
++}
++
++int tn7sar_process_unmatched_oam(FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size, unsigned int mode)
++{
++
++ FRAGLIST *local_list;
++ int i;
++ unsigned int atmHdr;
++
++ local_list = frag_list;
++
++ for(i=0;i<(int)frag_count;i++)
++ {
++ tn7sar_data_invalidate(local_list->data, (int)local_list->len);
++ local_list ++;
++ }
++ local_list = frag_list;
++ if((mode>>31)) /*vci, vpi is attached */
++ {
++ atmHdr = *(unsigned int *)frag_list->data;
++ tn7sar_record_pvc(atmHdr);
++ if(atmHdr & 0x8) //oam cell
++ {
++ atmHdr &= 0xfffffff0;
++ if(atmHdr == oamAtmHdr)
++ {
++ if(oamPingStatus == OAM_PING_PENDING)
++ {
++ oamPingStatus = OAM_PING_SUCCESS;
++ oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + 1;
++ }
++ return 0;
++ }
++ }
++ }
++
++ return 0;
++}
++
++
++static int
++tn7sar_receive(OS_DEVICE *os_dev,FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size,
++ HAL_RECEIVEINFO *hal_receive_info, unsigned int mode)
++{
++ int ch;
++ struct atm_dev *dev;
++ Tn7AtmPrivate *priv;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ int bRet;
++
++
++ dprintf(4, "tn7sar_receive\n");
++
++ dev = (struct atm_dev *)os_dev;
++ priv= (Tn7AtmPrivate *)dev->dev_data;
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++
++ /* Mode contains channel info */
++ ch = (mode & 0xFF);
++
++ if(ch == 15)
++ {
++ tn7sar_process_unmatched_oam(frag_list, frag_count, packet_size, mode);
++ pHalFunc->RxReturn(hal_receive_info, 0);
++ return 0;
++ }
++
++ if(frag_count > 1 || frag_list->len == 0)
++ {
++ printk("Packet fragment count > 1, not handdle.\n");
++ return 1;
++ }
++
++ tn7sar_data_invalidate(frag_list->data, (int)frag_list->len);
++ bRet=tn7atm_receive(os_dev, ch, packet_size, frag_list->OsInfo, frag_list->data);
++
++ if(bRet==0)
++ {
++ sarStat.rxPktCnt++;
++ sarStat.rxBytes += packet_size;
++ pHalFunc->RxReturn(hal_receive_info, 1);
++ }
++ else
++ {
++ pHalFunc->RxReturn(hal_receive_info, 0);
++ }
++
++ return bRet;
++}
++
++static int
++tn7sar_send_complete(OS_SENDINFO *osSendInfo)
++{
++ return (tn7atm_send_complete(osSendInfo));
++}
++
++void
++tn7sar_teardown_complete(OS_DEVICE *OsDev, int ch, int Dir)
++{
++ return;
++}
++
++
++/*
++unsigned int tn7sar_virt(unsigned int address)
++{
++ return phys_to_virt(address);
++}
++*/
++
++int tn7sar_init_module(OS_FUNCTIONS *os_funcs)
++{
++ dprintf(4, "tn7sar_init_module\n");
++ if( os_funcs == 0 )
++ {
++ return(-1);
++ }
++ os_funcs->Control = tn7sar_control;
++ os_funcs->CriticalOn = tn7sar_critical_on;
++ os_funcs->CriticalOff = tn7sar_critical_off;
++ os_funcs->DataCacheHitInvalidate = tn7sar_data_invalidate;
++ os_funcs->DataCacheHitWriteback = tn7sar_data_writeback;
++ os_funcs->DeviceFindInfo = tn7sar_find_device;
++ os_funcs->DeviceFindParmUint = tn7sar_get_device_parm_uint;
++ os_funcs->DeviceFindParmValue = tn7sar_get_device_parm_value;
++ os_funcs->Free = tn7sar_free;
++ os_funcs->FreeRxBuffer = tn7sar_free_buffer;
++ os_funcs->FreeDev = tn7sar_free_dev;
++ os_funcs->FreeDmaXfer = tn7sar_free_dma_xfer;
++ os_funcs->IsrRegister = tn7sar_sarhal_isr_register;
++ os_funcs->IsrUnRegister = tn7sar_isr_unregister;
++ os_funcs->Malloc = tn7sar_malloc;
++ os_funcs->MallocRxBuffer = tn7sar_malloc_rxbuffer;
++ os_funcs->MallocDev = tn7sar_malloc_dev;
++ os_funcs->MallocDmaXfer = tn7sar_malloc_dma_xfer;
++ os_funcs->Memset = tn7sar_memset;
++ os_funcs->Printf = tn7sar_printf;
++ os_funcs->Receive = tn7sar_receive;
++ os_funcs->SendComplete = tn7sar_send_complete;
++ os_funcs->Strcmpi = strcmp;
++ os_funcs->Sprintf = sprintf;
++ os_funcs->Strlen = strlen;
++ os_funcs->Strstr = strstr;
++ os_funcs->Strtoul = tn7sar_strtoul;
++ os_funcs->TeardownComplete = tn7sar_teardown_complete;
++
++ return(0);
++}
++
++
++static void tn7sar_init_dev_parm(void)
++{
++ int i;
++
++
++ /* aal5 */
++ //strcpy(aal5Parm.id, "aal5");
++ aal5Parm.base = 0x03000000;
++ aal5Parm.offset = 0;
++ aal5Parm.int_line=15;
++ aal5Parm.chan[0].RxBufSize=1600;
++ aal5Parm.chan[0].RxNumBuffers = 32;
++ aal5Parm.chan[0].RxServiceMax = 50;
++ aal5Parm.chan[0].TxServiceMax=50;
++ aal5Parm.chan[0].TxNumBuffers=32;
++ aal5Parm.chan[0].CpcsUU=0x5aa5;
++ aal5Parm.chan[0].TxVc_CellRate=0x3000;
++ aal5Parm.chan[0].TxVc_AtmHeader=0x00000640;
++ for(i=1;i<8;i++)
++ {
++ memcpy(&aal5Parm.chan[i], &aal5Parm.chan[0], sizeof(aal5Parm.chan[0]));
++ }
++
++
++ /* sar */
++ //strcpy(sarParm.id, "sar");
++ sarParm.base = 0x03000000;
++ sarParm.reset_bit = 9;
++ sarParm.offset = 0;
++ sarParm.UniNni = 0;
++
++ pAal5 = aal5Data;
++ pSar = sarData;
++ pReset = resetData;
++ strcpy(pAal5, AAL5_PARM);
++ strcpy(pSar, SAR_PARM);
++ strcpy(pReset, RESET_PARM);
++
++}
++
++
++int tn7sar_get_stats(void *priv1)
++{
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ Tn7AtmPrivate *priv;
++ int i, j;
++ unsigned int *pSarStat, *pStateBase;
++ char statString[64];
++ int len;
++
++ dprintf(2, "tn7sar_get_stats\n");
++
++ priv = (Tn7AtmPrivate *)priv1;
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ //memset(&sarStat, 0, sizeof(sarStat));
++ sarStat.txErrors = 0;
++ sarStat.rxErrors = 0;
++ for(i=0;i<MAX_DMA_CHAN;i++)
++ {
++ if(priv->lut[i].inuse)
++ {
++ for(j=0;j<1;j++)
++ {
++ len=sprintf(statString, "Stats;0;%d", priv->lut[i].chanid);
++ statString[len]=0;
++ dprintf(2, "statString=%s\n",statString);
++ pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
++ pStateBase = pSarStat;
++ while(pSarStat)
++ {
++ if((char *)*pSarStat == NULL)
++ break;
++ dprintf(2, "%s\n", (char *) *pSarStat);
++ pSarStat++;
++ dprintf(2, "%s\n", (char *) *pSarStat);
++ sarStat.rxErrors += os_atoul((char *) *pSarStat);
++ pSarStat++;
++ }
++
++ kfree(pStateBase);
++ }
++ }
++ }
++ return 0;
++}
++
++int tn7sar_setup_oam_channel(Tn7AtmPrivate *priv)
++{
++
++ CHANNEL_INFO chInfo;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ int chan=15;
++ dprintf(4, "tn7sar_setup_oam_channel\n");
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ memset(&chInfo, 0xff, sizeof(chInfo));
++
++ /* channel specific */
++ chInfo.Channel = 15; /* hardcoded for last channel */
++ chInfo.Direction = 0;
++ chInfo.Vci = 30; /* just need below 32 */
++ chInfo.Vpi = 0;
++ chInfo.TxVc_QosType = 2;
++
++ /*default */
++ chInfo.PktType = PACKET_TYPE_TRANS;
++ chInfo.TxServiceMax = 2;
++ chInfo.RxServiceMax = 2;
++ chInfo.TxNumQueues = 1;
++ chInfo.TxNumBuffers = 4;
++ chInfo.RxNumBuffers = 4;
++ chInfo.RxBufSize = 256;
++ chInfo.RxVc_OamToHost = 0;
++ chInfo.RxVp_OamToHost = 0;
++ chInfo.FwdUnkVc = 1; //enable forwarding of unknown vc
++ chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
++ chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
++ chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
++ chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
++
++ dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
++
++ if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
++ {
++ printk("failed to setup channel =%d.\n", chan);
++ return -1;
++ }
++
++ // claiming the channel
++ priv->lut[chan].vpi = 0;
++ priv->lut[chan].vci = 30;
++ priv->lut[chan].chanid = chan;
++ priv->lut[chan].inuse = 1;
++ return 0;
++}
++
++int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv)
++{
++ int retCode;
++ int hal_funcs_size;
++
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ OS_FUNCTIONS *pOsFunc;
++ int oamMod;
++ char *pLbTimeout;
++ int lbTimeout;
++
++
++ dprintf(4, "tn7sar_init\n");
++
++ pOsFunc = (OS_FUNCTIONS *)kmalloc(sizeof(OS_FUNCTIONS), GFP_KERNEL);
++
++
++ priv->pSarOsFunc = ( void *)pOsFunc;
++
++ /* init boot parms */
++ tn7sar_init_dev_parm();
++
++ /* init sar os call back functions */
++ retCode = tn7sar_init_module(pOsFunc);
++ if (retCode != 0) /* error */
++ {
++ printk("Failed to init SAR OS Functions\n");
++ return (1);
++ }
++
++ /* Init sar hal */
++ retCode = cpaal5InitModule(&pHalDev, (OS_DEVICE*) dev, &pHalFunc,
++ pOsFunc, sizeof(OS_FUNCTIONS), &hal_funcs_size, 0);
++ if (retCode != 0) /* error */
++ {
++ printk("Failed to init SAR HAL\n");
++ return (1);
++ }
++
++ /* sanity check */
++ if (pHalDev == NULL || pHalFunc == NULL || hal_funcs_size != sizeof(HAL_FUNCTIONS) )
++ {
++ printk("Invalid SAR hal and/or functions.\n");
++ return (1);
++ }
++
++ /* remeber HAL pointers */
++ priv->pSarHalDev = (void *)pHalDev;
++ priv->pSarHalFunc = (void *)pHalFunc;
++
++ /* Probe for the Device to get hardware info from driver */
++ retCode = pHalFunc->Probe(pHalDev);
++ if (retCode !=0)
++ {
++ printk("SAR hal probing error.\n");
++ return (1);
++ }
++
++ /* init sar hal */
++ retCode = pHalFunc->Init(pHalDev);
++ if (retCode != 0) /* error */
++ {
++
++ printk("pHalFunc->Init failed. err code =%d\n", retCode);
++ return (1);
++ }
++
++ /* open hal module */
++ retCode = pHalFunc->Open(pHalDev);
++ if (retCode != 0) /* error */
++ {
++ printk("pHalFunc->open failed, err code: %d\n",retCode );
++ return (1);
++ }
++
++ /* init sar for firmware oam */
++ oamMod= 1;
++ pHalFunc->Control(pHalDev,"OamMode", "Set", &oamMod);
++
++ /* read in oam lb timeout value */
++ pLbTimeout = prom_getenv("oam_lb_timeout");
++ if(pLbTimeout)
++ {
++ lbTimeout =tn7sar_strtoul(pLbTimeout, NULL, 10);
++ oamLbTimeout = lbTimeout;
++ pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &lbTimeout);
++ }
++ else
++ {
++ oamLbTimeout = 5000;
++ }
++
++ oamFarLBCount[0]=0;
++ oamFarLBCount[1]=0;
++ oamFarLBCount[2]=0;
++ oamFarLBCount[3]=0;
++
++ memset(&sarStat, 0 , sizeof(sarStat));
++
++ /* setup channel 15 for oam operation */
++ tn7sar_setup_oam_channel(priv);
++ dprintf(4, "tn7sar_init done");
++ return 0;
++}
++
++static int
++tn7sar_atm_header(int vpi, int vci)
++{
++ union
++ {
++ unsigned char byte[4];
++ unsigned int dword;
++ }atm_h;
++ int itmp = 0;
++
++ //vci
++ itmp = vci &0xf;
++ atm_h.byte[0] = 0;
++ atm_h.byte[0] |= (itmp << 4);
++ atm_h.byte[1] = ((vci & 0xff0) >> 4);
++ atm_h.byte[2] = 0;
++ atm_h.byte[2] |= ((vci & 0xf000) >>12);;
++ atm_h.byte[2] |= ((vpi & 0xf) << 4);
++ atm_h.byte[3] = 0;
++ atm_h.byte[3] = ((vpi & 0xff0) >> 4);
++ return atm_h.dword;
++}
++
++int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos)
++{
++ CHANNEL_INFO chInfo;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++
++ dprintf(4, "tn7sar_activate_vc\n");
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ memset(&chInfo, 0xff, sizeof(chInfo));
++
++ /* channel specific */
++ chInfo.Channel = chan;
++ chInfo.Direction = 0;
++ chInfo.Vci = vci;
++ chInfo.Vpi = vpi;
++ chInfo.TxVc_QosType = qos;
++ chInfo.Priority = qos;
++
++ if(chInfo.TxVc_QosType == 1) /* if the connection is VBR than set the DaMask value to tell the schedular to accumalte the credit */
++ {
++ chInfo.DaMask = 1;
++ }
++ chInfo.TxVc_Mbs = mbs; /* use pcr as MBS */
++ pcr = SAR_FREQUNCY/pcr;
++ scr = SAR_FREQUNCY/scr;
++ chInfo.TxVc_CellRate = scr;
++ chInfo.TxVc_Pcr = pcr;
++
++ /*default */
++ chInfo.PktType = PACKET_TYPE_AAL5;
++ chInfo.TxServiceMax = TX_SERVICE_MAX;
++ chInfo.RxServiceMax = RX_SERVICE_MAX;
++ chInfo.TxNumQueues = TX_QUEUE_NUM;
++ chInfo.TxNumBuffers = TX_BUFFER_NUM;
++ chInfo.RxNumBuffers = RX_BUFFER_NUM;
++ chInfo.RxBufSize = RX_BUFFER_SIZE;
++ chInfo.RxVc_OamToHost = 0;
++ chInfo.RxVp_OamToHost = 0;
++ chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
++ chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
++ chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
++ chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
++ chInfo.CpcsUU = 0;
++
++ dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
++
++ if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
++ {
++ printk("failed to setup channel =%d.\n", chan);
++ return -1;
++ }
++
++
++ return 0;
++}
++
++int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority)
++{
++ FRAGLIST fragList;
++ unsigned int mode;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++
++ dprintf(4, "tn7sar_send_packet\n");
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ fragList.len = len;
++ fragList.data = (void *)data;
++
++ xdump((char *)fragList.data , fragList.len, 6);
++
++ /*mode bit
++ 31-19 unused
++ 18 oam cell, 1 = true, 0=false
++ 17-16 oam type, 0=F4 seg, 1=F4 End, 2=F5 seg, 3=F5 end
++ 15-08 transimit queue, current, 0=priority queue, 1=normal queue
++ 07-00 channel number
++ */
++ mode = 0;
++ mode |= (0xff & chan);
++ mode |= ((0xff & priority) << 8);
++
++ dprintf(4, "mode = %d\n", mode);
++
++ tn7sar_data_writeback(fragList.data, len);
++ if(pHalFunc->Send(pHalDev, &fragList, 1, len, new_skb, mode) != 0)
++ {
++ dprintf(1, "SAR hal failed to send packet.\n");
++ return 1;
++ }
++ //tn7sar_get_stats(priv);
++ sarStat.txPktCnt++;
++ sarStat.txBytes +=len;
++ return 0;
++}
++
++
++
++int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv)
++{
++ int more;
++ int rc;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ int (*halIsr)(HAL_DEVICE *halDev, int *work);
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++ halIsr = priv->halIsr;
++
++ rc = halIsr(pHalDev, &more);
++
++ pHalFunc->PacketProcessEnd(pHalDev);
++
++ return rc;
++}
++
++
++int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan)
++{
++ unsigned int mode;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++
++ dprintf(4, "tn7sar_deactivate_vc\n");
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ mode = 0xf; //tear down everything, wait for return;
++
++ pHalFunc->ChannelTeardown(pHalDev, chan, mode);
++ return 0;
++}
++
++void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv)
++{
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++
++ dprintf(4, "tn7sar_exit()\n");
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ tn7sar_deactivate_vc(priv, 15); // de-activate oam channel
++
++ pHalFunc->Close(pHalDev, 2);
++ pHalFunc->Shutdown(pHalDev);
++
++ kfree(priv->pSarOsFunc);
++
++}
++
++void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer)
++{
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++
++ dprintf(4, "tn7sar_get_sar_version()\n");
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++ pHalFunc->Control(pHalDev, "Version", "Get", pVer);
++}
++
++
++int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count)
++{
++ unsigned int f4c, f5c;
++
++ f4c = *(volatile unsigned int *)SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR;
++ f5c = *(volatile unsigned int *)SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR;
++ *pF4count = f4c;
++ *pF5count = f5c;
++
++ return 0;
++}
++
++
++int tn7sar_unmatched_oam_generation(void *privContext, int vpi, int vci, int type)
++{
++
++ unsigned int regv = 0;
++ int chan=15;
++ static unsigned int tag;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ Tn7AtmPrivate *priv;
++ unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
++
++ dprintf(4, "tn7sar_unknow_oam_generation()\n");
++
++ priv = (Tn7AtmPrivate *)privContext;
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ if(vci==0)
++ {
++ oamPingStatus = OAM_PING_FAILED;
++ return 0;
++ }
++ /* calculate atm header */
++ oamAtmHdr = tn7sar_atm_header(vpi,vci);
++
++ /* config the atm header */
++ pHalFunc->Control(pHalDev,"TxVc_AtmHeader.15", "Set", &oamAtmHdr);
++
++ /*record oam type */
++ oam_type = type;
++
++ regv = (0xff & chan);
++
++ switch(type)
++ {
++ case 0:
++ regv |= (1<<12); //f5 end
++ dprintf(2, "f5 loop back\n");
++ break;
++ case 1:
++ regv |= (1<<13); // f4 end
++ break;
++ case 2:
++ regv |= (1<<14); //f5 seg
++ break;
++ case 3:
++ regv |= (1<<15); //f4 seg
++ break;
++ default:
++ break;
++ }
++ oamPingStatus = OAM_PING_PENDING;
++ pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
++ tag++;
++ return 0;
++
++}
++
++int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout)
++{
++ unsigned int regv = 0;
++ static unsigned int tag;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ Tn7AtmPrivate *priv;
++ unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
++
++ dprintf(2, "tn7sar_oam_generation()\n");
++
++ priv = (Tn7AtmPrivate *)privContext;
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ if(timeout >= 5000)
++ {
++ if(timeout == 6000)
++ {
++ tn7sar_clear_pvc_table();
++ return 0;
++ }
++ timeout = oamLbTimeout;
++ }
++
++
++ pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &timeout);
++
++ if(chan == ATM_NO_DMA_CHAN)
++ {
++ tn7sar_unmatched_oam_generation(priv, vpi, vci, type);
++ return 0;
++ }
++
++ /* calculate atm header */
++ oamAtmHdr = tn7sar_atm_header(vpi,vci);
++
++ oam_type = type;
++
++ regv = (0xff & chan);
++ switch(type)
++ {
++ case 0:
++ regv |= (1<<12); //f5 end
++ dprintf(2, "f5 loop back\n");
++ break;
++ case 1:
++ regv |= (1<<13); // f4 end
++ break;
++ case 2:
++ regv |= (1<<14); //f5 seg
++ break;
++ case 3:
++ regv |= (1<<15); //f4 seg
++ break;
++ default:
++ break;
++ }
++ oamPingStatus = OAM_PING_PENDING;
++ pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
++ tag++;
++
++ return 0;
++}
++
++int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++
++ len += sprintf(buf+len, "%d\n", oamPingStatus);
++
++ return len;
++}
++
++int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ int i;
++
++ for(i=0;i<16;i++)
++ {
++ if(pvc_result[i].bInUse)
++ {
++ len += sprintf(buf+len, "%d,%d\n", pvc_result[i].vpi,pvc_result[i].vci);
++ }
++ else
++ {
++ len += sprintf(buf+len, "0,0\n");
++ }
++ }
++ return len;
++}
++
++
++
++int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data)
++{
++ int len = 0;
++ int limit = count - 80;
++ struct atm_dev *dev;
++ Tn7AtmPrivate *priv;
++ int i, j, k;
++ int stat_len;
++ char statString[32];
++ unsigned int *pStateBase, *pSarStat;
++ HAL_FUNCTIONS *pHalFunc;
++ HAL_DEVICE *pHalDev;
++ int dBytes;
++
++ dev = (struct atm_dev *)data;
++ priv = (Tn7AtmPrivate *)dev->dev_data;
++
++ pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
++ pHalDev = (HAL_DEVICE *)priv->pSarHalDev;
++
++ len += sprintf(buf+len, "SAR HAL Statistics\n");
++ for(i=0;i<MAX_DMA_CHAN;i++)
++ {
++ if(priv->lut[i].inuse)
++ {
++ if(len<=limit)
++ len += sprintf(buf+len, "\nChannel %d:\n",priv->lut[i].chanid);
++ k=0;
++ for(j=0;j<4;j++)
++ {
++ stat_len =sprintf(statString, "Stats;%d;%d", j,priv->lut[i].chanid);
++ statString[stat_len]=0;
++ pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
++ pStateBase = pSarStat;
++ while(pSarStat)
++ {
++ if((char *)*pSarStat == NULL)
++ break;
++ if(len<=limit)
++ {
++ dBytes = sprintf(buf+len, "%s: ",(char *) *pSarStat);
++ len += dBytes;
++ k += dBytes;
++ }
++ pSarStat++;
++ if(len<=limit)
++ {
++ dBytes = sprintf(buf+len, "%s; ",(char *) *pSarStat);
++ len += dBytes;
++ k += dBytes;
++ }
++ pSarStat++;
++
++ if(k > 60)
++ {
++ k=0;
++ if(len<=limit)
++ len += sprintf(buf+len, "\n");
++ }
++ }
++
++ kfree(pStateBase);
++ }
++ }
++ }
++
++ return len;
++}
++
++void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls)
++{
++
++ *pdsp_version_ms = (SarPdspFirmware[9]>>20) & 0xF;
++ *pdsp_version_ls = (SarPdspFirmware[9]>>12) & 0xFF;
++ return;
++}
+diff -urN linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h
+--- linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h 2005-07-10 08:02:01.456109536 +0200
+@@ -0,0 +1,988 @@
++//SarPdspFirmware Revision: 49
++
++static int SarPdspFirmware[] = {
++ 0xb0a8d1f1,
++ 0x000003d8,
++ 0x00000000,
++ 0x00000004,
++ 0x00000000,
++ 0x00000000,
++ 0x00000000,
++ 0x00000000,
++ 0x21000900,
++ 0x24049080,
++ 0x24000080,
++ 0x240000c0,
++ 0x10e0e0e1,
++ 0x10e0e0e2,
++ 0x10e0e0e3,
++ 0x10e0e0e4,
++ 0x10e0e0e5,
++ 0x10e0e0e6,
++ 0x10e0e0e7,
++ 0x10e0e0e8,
++ 0x10e0e0e9,
++ 0x10e0e0ea,
++ 0x10e0e0eb,
++ 0x10e0e0ec,
++ 0x10e0e0ed,
++ 0x10e0e0ee,
++ 0x10e0e0ef,
++ 0x10e0e0f0,
++ 0x10e0e0f1,
++ 0x10e0e0f2,
++ 0x10e0e0f3,
++ 0x10e0e0f4,
++ 0x10e0e0f5,
++ 0x10e0e0f6,
++ 0x10e0e0f7,
++ 0x10e0e0f8,
++ 0x10e0e0f9,
++ 0x10e0e0fa,
++ 0x10e0e0fb,
++ 0x10e0e0fc,
++ 0x10e0e0fd,
++ 0x10e0e0fe,
++ 0x10e0e0ff,
++ 0x81042680,
++ 0x810c2680,
++ 0x81042680,
++ 0x2483c080,
++ 0x81180b80,
++ 0x2484c080,
++ 0x811a0b80,
++ 0x2485c080,
++ 0x811c0b80,
++ 0x240100dd,
++ 0xa07d06fd,
++ 0x240400dd,
++ 0xa07d04fd,
++ 0x24c000dd,
++ 0x2400169d,
++ 0xa07d5cfd,
++ 0x511f9d03,
++ 0x01019d9d,
++ 0x7f0000fd,
++ 0xd11eff05,
++ 0x97c06890,
++ 0x1d00e5e5,
++ 0x2301229e,
++ 0x81bc2890,
++ 0x24000000,
++ 0xc917ff02,
++ 0x81000100,
++ 0x01010000,
++ 0xc918ff02,
++ 0x81000100,
++ 0x01010000,
++ 0xc919ff02,
++ 0x81000100,
++ 0xd110e70a,
++ 0xd11cff09,
++ 0x1d00e5e5,
++ 0xd100e704,
++ 0xd114ff06,
++ 0x2301179e,
++ 0x79000004,
++ 0xd70ffffd,
++ 0x91382486,
++ 0x2301059e,
++ 0xc903ff07,
++ 0xa06047e0,
++ 0xb10043e6,
++ 0xc910e602,
++ 0x81000106,
++ 0x24006025,
++ 0x2300d39e,
++ 0xd11dff09,
++ 0x1f00e5e5,
++ 0xc901e705,
++ 0xd111ff06,
++ 0x91382586,
++ 0x2301059e,
++ 0x79000003,
++ 0xd715fffc,
++ 0x2301179e,
++ 0xc910e706,
++ 0x110f2760,
++ 0x240000c6,
++ 0x24000086,
++ 0x13106006,
++ 0x7b00005a,
++ 0x11079f80,
++ 0x51008010,
++ 0xc912ff0f,
++ 0xd100ff04,
++ 0xd101ff05,
++ 0xa06046e0,
++ 0x79000004,
++ 0xa06044e0,
++ 0x79000002,
++ 0xa06045e0,
++ 0xb10043e6,
++ 0x61150602,
++ 0x2101c500,
++ 0xc910e602,
++ 0xa1001006,
++ 0x24000025,
++ 0x2300d39e,
++ 0xd11fff05,
++ 0x97c06a90,
++ 0x1f00e5e5,
++ 0x2301229e,
++ 0x81bc2a90,
++ 0xd11cff09,
++ 0x1d00e5e5,
++ 0xc900e705,
++ 0xd10fff06,
++ 0x91382486,
++ 0x2301059e,
++ 0x79000003,
++ 0xd714fffc,
++ 0x2301179e,
++ 0xc907ff07,
++ 0xa0604be0,
++ 0xb10043e6,
++ 0xc910e602,
++ 0x81000106,
++ 0x24006025,
++ 0x2300d39e,
++ 0xd111e70a,
++ 0xd11dff09,
++ 0x1f00e5e5,
++ 0xd101e704,
++ 0xd115ff06,
++ 0x2301179e,
++ 0x79000004,
++ 0xd711fffd,
++ 0x91382586,
++ 0x2301059e,
++ 0xc911e706,
++ 0x0b042760,
++ 0x240000c6,
++ 0x24000086,
++ 0x13106006,
++ 0x7b000024,
++ 0x11709f80,
++ 0x5100800e,
++ 0xc913ff0d,
++ 0xd104ff04,
++ 0xd105ff05,
++ 0xa0604ae0,
++ 0x79000004,
++ 0xa06048e0,
++ 0x79000002,
++ 0xa06049e0,
++ 0xb10043e6,
++ 0xc910e602,
++ 0xa1001106,
++ 0x24000025,
++ 0x2300d39e,
++ 0xc90bff02,
++ 0x7900000b,
++ 0xc90aff02,
++ 0x79000012,
++ 0xcf08ff89,
++ 0xb10002e0,
++ 0xcf18e087,
++ 0x790000b6,
++ 0x24000080,
++ 0x24fb00c0,
++ 0xa06003e0,
++ 0x7f000082,
++ 0xb10024e6,
++ 0xb10025e0,
++ 0xa06628e6,
++ 0xa06029e0,
++ 0x248000c6,
++ 0xa06624e6,
++ 0x671006f0,
++ 0x81082186,
++ 0x7f0000ee,
++ 0xb10027e6,
++ 0x61100604,
++ 0xa0662be6,
++ 0x810c2186,
++ 0x79000006,
++ 0xd70cffea,
++ 0xa0662be6,
++ 0x1f1be6e6,
++ 0x81382686,
++ 0x813c2680,
++ 0x248000c6,
++ 0xa06627e6,
++ 0x7f0000e3,
++ 0x110f0600,
++ 0x81100b00,
++ 0x01502545,
++ 0x90457888,
++ 0x5103091c,
++ 0x6901092a,
++ 0xc910e603,
++ 0xd108e90d,
++ 0x79000027,
++ 0x01582545,
++ 0x9045788a,
++ 0xd108e904,
++ 0x1f08e9e9,
++ 0x01552545,
++ 0x80451829,
++ 0x50eaeb20,
++ 0x0101ebeb,
++ 0x015c2545,
++ 0x8045388b,
++ 0x7900001c,
++ 0x015c2545,
++ 0x9045788b,
++ 0x6900eb05,
++ 0x1d08e9e9,
++ 0x01552545,
++ 0x80451829,
++ 0x79000004,
++ 0x0501ebeb,
++ 0x015c2545,
++ 0x8045388b,
++ 0x10ecece8,
++ 0x79000010,
++ 0x24000000,
++ 0x5110000e,
++ 0x690f6903,
++ 0x24000069,
++ 0x79000002,
++ 0x01016969,
++ 0x01010000,
++ 0x81100b69,
++ 0x01542545,
++ 0x90451809,
++ 0x6f0209f7,
++ 0xa1001069,
++ 0x81100b06,
++ 0x01572545,
++ 0x80451869,
++ 0xa06841e8,
++ 0xa1414006,
++ 0x209e0000,
++ 0x81100b06,
++ 0xd11fe603,
++ 0x9164388d,
++ 0x8108248d,
++ 0xd100e507,
++ 0x97406490,
++ 0x9108248d,
++ 0x813c2480,
++ 0x2302b4de,
++ 0x1d00e7e7,
++ 0x79000006,
++ 0x97406590,
++ 0x9108258d,
++ 0x813c2580,
++ 0x1d01e7e7,
++ 0x2302b9de,
++ 0x8164388d,
++ 0x209e0000,
++ 0x81040105,
++ 0x91002286,
++ 0x97086290,
++ 0x81042280,
++ 0xd100e504,
++ 0x2302b4de,
++ 0x1f00e7e7,
++ 0x209e0000,
++ 0x2302b9de,
++ 0x1f01e7e7,
++ 0x209e0000,
++ 0xd109ff00,
++ 0xa0702cf0,
++ 0x79000001,
++ 0xd109ff00,
++ 0xb1002de6,
++ 0xd11ee609,
++ 0xb1000de0,
++ 0xc91fe044,
++ 0x24c338c6,
++ 0x10000006,
++ 0x81382686,
++ 0x87406690,
++ 0x813c2680,
++ 0x7900003e,
++ 0x110f0600,
++ 0x81100b00,
++ 0x24000045,
++ 0x24000025,
++ 0x61100603,
++ 0x24006045,
++ 0x24006025,
++ 0x01704545,
++ 0x90451888,
++ 0x0b034600,
++ 0x11070000,
++ 0x69040004,
++ 0xc916ff2c,
++ 0x01019e9e,
++ 0x7900002f,
++ 0xc90cff04,
++ 0x6f0200fd,
++ 0xd308e8a1,
++ 0x7f0000fb,
++ 0x69020008,
++ 0xd308e89e,
++ 0xb1002fe6,
++ 0x91b82880,
++ 0xc91ce002,
++ 0x1f1ce6e6,
++ 0x10080806,
++ 0x79000015,
++ 0xb1002fe6,
++ 0x69030003,
++ 0x13c06666,
++ 0x79000011,
++ 0x91807809,
++ 0xc910ea09,
++ 0x81082689,
++ 0x01018a8a,
++ 0xc91ee60a,
++ 0x1d10eaea,
++ 0x240557c0,
++ 0x60c08a07,
++ 0x1f1de6e6,
++ 0x79000005,
++ 0x2400018a,
++ 0x1f10eaea,
++ 0x1f1fe6e6,
++ 0xd71ee6f8,
++ 0x51000002,
++ 0x11c76666,
++ 0x81382686,
++ 0x87406690,
++ 0x91082689,
++ 0x813c2680,
++ 0xb1002ee6,
++ 0xd103e609,
++ 0x81807809,
++ 0xc908e807,
++ 0x21039400,
++ 0x81002386,
++ 0x87086390,
++ 0x81042380,
++ 0xc908e802,
++ 0x21039400,
++ 0x209e0000,
++ 0xb10008ef,
++ 0x110f0f00,
++ 0x81100b00,
++ 0x24000025,
++ 0x61100f02,
++ 0x24005025,
++ 0x01952545,
++ 0x9045382e,
++ 0xc91def03,
++ 0x24000900,
++ 0x2301c09e,
++ 0xc91cef03,
++ 0x24001900,
++ 0x2301c09e,
++ 0xc91bef03,
++ 0x24000a00,
++ 0x2301c09e,
++ 0xc91aef03,
++ 0x24001a00,
++ 0x2301c09e,
++ 0x8045382e,
++ 0x01a82545,
++ 0x9045388e,
++ 0xc915ef03,
++ 0x24000000,
++ 0x2301c09e,
++ 0xc914ef03,
++ 0x24001000,
++ 0x2301c09e,
++ 0x8045388e,
++ 0x61100f02,
++ 0x24006025,
++ 0x016d2545,
++ 0x9045382e,
++ 0xc919ef03,
++ 0x24000900,
++ 0x2301c09e,
++ 0xc918ef03,
++ 0x24001900,
++ 0x2301c09e,
++ 0xc917ef03,
++ 0x24000a00,
++ 0x2301c09e,
++ 0xc916ef03,
++ 0x24001a00,
++ 0x2301c09e,
++ 0x8045382e,
++ 0x017c2545,
++ 0x9045388e,
++ 0xc913ef03,
++ 0x24000000,
++ 0x2301c09e,
++ 0xc912ef03,
++ 0x24001000,
++ 0x2301c09e,
++ 0x8045388e,
++ 0xd11eef19,
++ 0x11f02f00,
++ 0x51000017,
++ 0x24001520,
++ 0x81140b20,
++ 0x81b01a0f,
++ 0x1f02e7e7,
++ 0x24c000c0,
++ 0x24001580,
++ 0xa0605ce0,
++ 0xc90fef04,
++ 0x1d04e7e7,
++ 0x1d05e7e7,
++ 0x7900000c,
++ 0xc90eef04,
++ 0x1d04e7e7,
++ 0x1f05e7e7,
++ 0x79000008,
++ 0xc90def04,
++ 0x1f04e7e7,
++ 0x1d05e7e7,
++ 0x79000004,
++ 0xc90cef03,
++ 0x1f04e7e7,
++ 0x1f05e7e7,
++ 0x2100b900,
++ 0xd11eef03,
++ 0x1e00eeee,
++ 0x209e0000,
++ 0x1c00eeee,
++ 0x209e0000,
++ 0x110f0606,
++ 0x81140b06,
++ 0x13100606,
++ 0x91b01a83,
++ 0x24000025,
++ 0x61100304,
++ 0x24005025,
++ 0xc905e702,
++ 0x24006025,
++ 0x110f0300,
++ 0x81100b00,
++ 0x81120b00,
++ 0x51150611,
++ 0x61100302,
++ 0x24005025,
++ 0x1d01e5e5,
++ 0x51160639,
++ 0x511a0650,
++ 0x511c0657,
++ 0x5118065e,
++ 0x511e0685,
++ 0x61100302,
++ 0x24006025,
++ 0x1f01e5e5,
++ 0x51170634,
++ 0x511b064b,
++ 0x511d0652,
++ 0x51190658,
++ 0x511f067f,
++ 0xc903e708,
++ 0x1d03e7e7,
++ 0x24000060,
++ 0xa1000a60,
++ 0x244000c0,
++ 0x24001580,
++ 0xa0605ce0,
++ 0x21007d00,
++ 0xcf02e7fc,
++ 0x1d02e7e7,
++ 0x1f03e7e7,
++ 0xc904e703,
++ 0x1f08e3e3,
++ 0x79000002,
++ 0x1d08e3e3,
++ 0xc905e705,
++ 0x01682545,
++ 0x9045588d,
++ 0x2302879e,
++ 0x79000004,
++ 0x01902545,
++ 0x9045588d,
++ 0x2302819e,
++ 0x24001872,
++ 0x24000152,
++ 0xb10009e0,
++ 0x108080d3,
++ 0x10c0c092,
++ 0x2400102c,
++ 0x2302c8de,
++ 0x91021c97,
++ 0x91001cd8,
++ 0x91061c98,
++ 0x91041cd9,
++ 0x910a1c99,
++ 0x91081cda,
++ 0x910e1c9a,
++ 0x910c1cdb,
++ 0x91261d9b,
++ 0x91287d9c,
++ 0x23028dde,
++ 0x1f02e7e7,
++ 0x1d03e7e7,
++ 0x7d000070,
++ 0x01902545,
++ 0x9045798d,
++ 0x79000003,
++ 0x01682545,
++ 0x9045788d,
++ 0x0b09eee0,
++ 0x24001472,
++ 0xd108e303,
++ 0xc900e00b,
++ 0x79000002,
++ 0xc910e009,
++ 0xd101e503,
++ 0x2302819e,
++ 0x79000002,
++ 0x2302879e,
++ 0x91013d12,
++ 0x9504bd93,
++ 0x23028dde,
++ 0x7d00005d,
++ 0xd108ee03,
++ 0x1d10e7e7,
++ 0x7900009a,
++ 0x1d11e7e7,
++ 0x79000098,
++ 0x01902545,
++ 0x9045798d,
++ 0x79000003,
++ 0x01682545,
++ 0x9045788d,
++ 0x0b0aeee0,
++ 0x24001072,
++ 0x7f0000e8,
++ 0x01a02545,
++ 0x9045b98d,
++ 0x79000003,
++ 0x01742545,
++ 0x9045b88d,
++ 0x0b01efe0,
++ 0x24001172,
++ 0x7f0000e0,
++ 0x2302d1de,
++ 0x79000002,
++ 0x2302d6de,
++ 0x000c2545,
++ 0x9045198f,
++ 0xd100ef07,
++ 0x1d02efef,
++ 0xc901ef0c,
++ 0xc905ef0b,
++ 0x1d01efef,
++ 0x1d05efef,
++ 0x79000008,
++ 0xd102ef04,
++ 0x1f02efef,
++ 0x8045198f,
++ 0x79000078,
++ 0xd101ef04,
++ 0x1f01efef,
++ 0x1f05efef,
++ 0x8045198f,
++ 0x69180673,
++ 0x01ac2545,
++ 0x2302dbde,
++ 0xd100ef03,
++ 0x23036c9e,
++ 0x7900006e,
++ 0xc800e40b,
++ 0x110f0020,
++ 0x81100b20,
++ 0x100c0c45,
++ 0x61100002,
++ 0x01604545,
++ 0x9045188f,
++ 0xd101ef04,
++ 0x1f01efef,
++ 0x1f07efef,
++ 0x8045188f,
++ 0x01010000,
++ 0x6f1300f4,
++ 0x79000060,
++ 0x2302d1de,
++ 0x79000002,
++ 0x2302d6de,
++ 0x000c2545,
++ 0x9045198f,
++ 0xc903ef05,
++ 0x1d03efef,
++ 0x1f04efef,
++ 0x8045198f,
++ 0x79000056,
++ 0xc904ef55,
++ 0x1d04efef,
++ 0xc901ef04,
++ 0xc906ef03,
++ 0x1d01efef,
++ 0x1d06efef,
++ 0x8045198f,
++ 0x691e064e,
++ 0x01ac2545,
++ 0x2302dbde,
++ 0xc800e40c,
++ 0x110f0020,
++ 0x81100b20,
++ 0x100c0c45,
++ 0x61100002,
++ 0x01604545,
++ 0x9045188f,
++ 0xc901ef05,
++ 0xc908ef04,
++ 0x1d01efef,
++ 0x1d07efef,
++ 0x8045188f,
++ 0x01010000,
++ 0x6f1300f3,
++ 0x7900003d,
++ 0x10ededf0,
++ 0xc908e303,
++ 0x13401010,
++ 0x209e0000,
++ 0x13301010,
++ 0x209e0000,
++ 0x10ededf0,
++ 0xc908e303,
++ 0x130a1010,
++ 0x209e0000,
++ 0x13081010,
++ 0x209e0000,
++ 0x24000266,
++ 0x2400c800,
++ 0x24000020,
++ 0xd108ee17,
++ 0x01012020,
++ 0xc91cff09,
++ 0x6e0020fe,
++ 0xc910e702,
++ 0x20de0000,
++ 0x1f10e7e7,
++ 0x110f0600,
++ 0x11f02727,
++ 0x12002727,
++ 0x20de0000,
++ 0x1d10e7e7,
++ 0x2302b4de,
++ 0x511d0605,
++ 0x511c0602,
++ 0x7900001e,
++ 0x01a62545,
++ 0x79000002,
++ 0x01722545,
++ 0x90451880,
++ 0x01018080,
++ 0x80451880,
++ 0x79000017,
++ 0x01012020,
++ 0xc91dff09,
++ 0x6e0020fe,
++ 0xc911e702,
++ 0x20de0000,
++ 0x1f11e7e7,
++ 0x09040600,
++ 0x110f2727,
++ 0x12002727,
++ 0x20de0000,
++ 0x1d11e7e7,
++ 0x2302b9de,
++ 0x7f0000ea,
++ 0x81b82786,
++ 0x240000d1,
++ 0x87c06790,
++ 0x81bc2780,
++ 0x20de0000,
++ 0x81b82986,
++ 0x87c06990,
++ 0x81bc2980,
++ 0x20de0000,
++ 0x91b43a88,
++ 0x2301029e,
++ 0x51150608,
++ 0xc908e305,
++ 0x51120303,
++ 0x01010303,
++ 0x79000002,
++ 0x24000003,
++ 0x01012323,
++ 0x81b01a83,
++ 0x21007d00,
++ 0x902cfc88,
++ 0x10c8c893,
++ 0x108888d4,
++ 0x10c9c994,
++ 0x108989d5,
++ 0x10caca95,
++ 0x108a8ad6,
++ 0x10cbcb96,
++ 0x108b8bd7,
++ 0xd108e303,
++ 0x2400a80c,
++ 0x20de0000,
++ 0x2400aa0c,
++ 0x20de0000,
++ 0xd108e303,
++ 0x24007c0c,
++ 0x20de0000,
++ 0x24007e0c,
++ 0x20de0000,
++ 0x24000000,
++ 0x90453904,
++ 0xd108e303,
++ 0x24007c0c,
++ 0x20de0000,
++ 0x24007e0c,
++ 0x20de0000,
++ 0xb1002fe6,
++ 0x91b82880,
++ 0xc91ce002,
++ 0x209e0000,
++ 0xb1002ee6,
++ 0x69187279,
++ 0xd110f230,
++ 0xc903e769,
++ 0xc90be604,
++ 0xc904e767,
++ 0xd105e766,
++ 0x7900000c,
++ 0xc90ae604,
++ 0xd104e763,
++ 0xd105e762,
++ 0x79000008,
++ 0xc907e604,
++ 0xc904e75f,
++ 0xc905e75e,
++ 0x79000004,
++ 0xc906e65c,
++ 0xd104e75b,
++ 0xc905e75a,
++ 0x91003c80,
++ 0x6897c058,
++ 0x68d88057,
++ 0x91043c80,
++ 0x6898c055,
++ 0x68d98054,
++ 0x91083c80,
++ 0x6899c052,
++ 0x68da8051,
++ 0x910c3c80,
++ 0x689ac04f,
++ 0x68db804e,
++ 0xb10009e0,
++ 0x6892c04c,
++ 0x68d3804b,
++ 0x24000160,
++ 0xa1000a60,
++ 0x244000c0,
++ 0x24001580,
++ 0xa0605ce0,
++ 0x1d03e7e7,
++ 0x109393c8,
++ 0x10d4d488,
++ 0x109494c9,
++ 0x10d5d589,
++ 0x109595ca,
++ 0x10d6d68a,
++ 0x109696cb,
++ 0x10d7d78b,
++ 0x8110fc88,
++ 0x209e0000,
++ 0x91003c80,
++ 0x6893c00c,
++ 0x68d4800b,
++ 0x91043c80,
++ 0x6894c009,
++ 0x68d58008,
++ 0x91083c80,
++ 0x6895c006,
++ 0x68d68005,
++ 0x910c3c80,
++ 0x6896c003,
++ 0x68d78002,
++ 0x79000010,
++ 0x24ffff80,
++ 0x24ffffc0,
++ 0x68809306,
++ 0x68e0f405,
++ 0x68e0f504,
++ 0x68e0f603,
++ 0x6880d702,
++ 0x79000008,
++ 0x24000080,
++ 0x240000c0,
++ 0x68809323,
++ 0x68e0f422,
++ 0x68e0f521,
++ 0x68e0f620,
++ 0x6880d71f,
++ 0x1d10f2f2,
++ 0x2400002c,
++ 0x2302c8de,
++ 0x24000f80,
++ 0x240000c0,
++ 0x0101c0c0,
++ 0xd100e504,
++ 0xc91cff06,
++ 0x6e80c0fd,
++ 0x21016d00,
++ 0xc91dff03,
++ 0x6e80c0fa,
++ 0x21016d00,
++ 0xd104e606,
++ 0xc909e608,
++ 0xb1000ce0,
++ 0x0101e0e0,
++ 0xa0600ce0,
++ 0x79000004,
++ 0xb1000be0,
++ 0x0101e0e0,
++ 0xa0600be0,
++ 0xb1002fe6,
++ 0xd100e504,
++ 0x2302b4de,
++ 0x24000022,
++ 0x209e0000,
++ 0x2302b9de,
++ 0x24000042,
++ 0x209e0000,
++ 0xd104e609,
++ 0x01782545,
++ 0x9045180e,
++ 0x110f0e00,
++ 0x81100b00,
++ 0x2400a445,
++ 0x51002502,
++ 0x01504545,
++ 0x90451888,
++ 0xc909e87d,
++ 0xb1002fe6,
++ 0x1f1fe6e6,
++ 0x10080806,
++ 0x21015f00,
++ 0x6914721b,
++ 0x01782545,
++ 0x2303bade,
++ 0x900c188f,
++ 0x1d02efef,
++ 0xc901ef05,
++ 0xc905ef04,
++ 0x1d01efef,
++ 0x1d05efef,
++ 0x800c188f,
++ 0xc909e66e,
++ 0x2303d0de,
++ 0xc800e40c,
++ 0x110f0020,
++ 0x81100b20,
++ 0x100c0c45,
++ 0x61100002,
++ 0x01604545,
++ 0x9045188f,
++ 0xc901ef05,
++ 0xc907ef04,
++ 0x1d01efef,
++ 0x1d07efef,
++ 0x8045188f,
++ 0x01010000,
++ 0x6f1300f3,
++ 0x7900005e,
++ 0x6910725d,
++ 0x01782545,
++ 0x2303bade,
++ 0x900c188f,
++ 0x1f03efef,
++ 0xd101ef03,
++ 0x1f01efef,
++ 0x1f06efef,
++ 0x800c188f,
++ 0xc909e654,
++ 0x2303d0de,
++ 0xc800e40b,
++ 0x110f0020,
++ 0x81100b20,
++ 0x100c0c45,
++ 0x61100002,
++ 0x01604545,
++ 0x9045188f,
++ 0xd101ef04,
++ 0x1f01efef,
++ 0x1f08efef,
++ 0x8045188f,
++ 0x01010000,
++ 0x6f1300f4,
++ 0x79000045,
++ 0x01782545,
++ 0x9045788e,
++ 0x1d02efef,
++ 0x1d12efef,
++ 0xc905ef04,
++ 0x1d05efef,
++ 0x1d01efef,
++ 0x7900000c,
++ 0xc915ef04,
++ 0x1d15efef,
++ 0x1d11efef,
++ 0x79000008,
++ 0xc907ef04,
++ 0x1d07efef,
++ 0x1d01efef,
++ 0x79000004,
++ 0xc917ef03,
++ 0x1d17efef,
++ 0x1d11efef,
++ 0x017c2545,
++ 0x8045388f,
++ 0x110f0e00,
++ 0x81100b00,
++ 0x2400a845,
++ 0x51002502,
++ 0x01504545,
++ 0x9045388f,
++ 0x1d02efef,
++ 0x1d12efef,
++ 0xc905ef04,
++ 0x1d05efef,
++ 0x1d01efef,
++ 0x79000004,
++ 0xc915ef03,
++ 0x1d15efef,
++ 0x1d11efef,
++ 0x8045388f,
++ 0x7900001f,
++ 0xc909e60d,
++ 0x9045180e,
++ 0x110f0e00,
++ 0x81100b00,
++ 0xc90ae603,
++ 0x2400a80c,
++ 0x79000003,
++ 0xc90be617,
++ 0x2400aa0c,
++ 0x51002503,
++ 0x01500c0c,
++ 0x24005025,
++ 0x20de0000,
++ 0xc904e611,
++ 0xc906e603,
++ 0x24007c0c,
++ 0x79000003,
++ 0xc907e60d,
++ 0x24007e0c,
++ 0x51002502,
++ 0x01600c0c,
++ 0x20de0000,
++ 0x01ac2545,
++ 0x24000000,
++ 0x90453804,
++ 0xd10be603,
++ 0x24007c0c,
++ 0x20de0000,
++ 0x24007e0c,
++ 0x20de0000,
++ 0x209e0000};
+diff -urN linux.old/drivers/atm/sangam_atm/turbodsl.c linux.dev/drivers/atm/sangam_atm/turbodsl.c
+--- linux.old/drivers/atm/sangam_atm/turbodsl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/drivers/atm/sangam_atm/turbodsl.c 2005-07-10 08:02:01.456109536 +0200
+@@ -0,0 +1,223 @@
++
++
++/*
++ *
++ * Turbo DSL Implementaion
++ *
++ * Zhicheng Tang ztang@ti.com
++ *
++ * 2002 (c) Texas Instruments Inc.
++ *
++*/
++
++/* defines and variables */
++#define RFC2684_BRIDGED_HDR_SIZE 10
++unsigned char LLC_BRIDGED_HEADER_2684[RFC2684_BRIDGED_HDR_SIZE] =
++ {0xAA, 0xAA, 0x03, 0x00, 0x80, 0xC2, 0x00, 0x07, 0x00, 0x00};
++
++#define RFC2684_ROUTED_HDR_SIZE 6
++unsigned char LLC_ROUTED_HEADER_2684[6] ={0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
++
++unsigned long PPP_LLC_HEADER = 0xCF03FEFE;
++
++/* struct definition */
++enum
++{
++ AAL5_ENCAP_PPP_LLC,
++ AAL5_ENCAP_PPP_VCMUX,
++ AAL5_ENCAP_RFC2684_LLC_BRIDGED,
++ AAL5_ENCAP_RFC2684_LLC_ROUTED
++};
++
++/* Etherent header */
++typedef struct _turbodsl_ether_header
++{
++ unsigned char dst_mac_addr[6];
++ unsigned char src_mac_addr[6];
++ unsigned short ether_type;
++} turbodsl_ether_header_t;
++
++
++/* Ip header define */
++typedef struct _turbodsl_ip_header
++{
++
++ unsigned short vit;
++ unsigned short total_length;
++ unsigned short ip_id;
++ unsigned char flag; /* bit 0 = 0, bit1 = don't fragment, bit2=more frag */
++ unsigned char fragment_offset; /* offset include remaining 5 bits above, which make it 13 bits */
++ unsigned char time_to_live;
++ unsigned char protocol;
++ unsigned short checksum;
++ unsigned int src_ip;
++ unsigned int dst_ip;
++} turbodsl_ip_header_t;
++
++/* Arp packet define */
++typedef struct _turbodsl_arp_header
++{
++ unsigned short hardware_type;
++ unsigned short protocol_type;
++ unsigned char h_len;
++ unsigned char p_len;
++ unsigned short operation ;
++ unsigned char snd_hw_address[6];
++ unsigned char snd_pt_address[4];
++ unsigned char dst_hw_address[6];
++ unsigned char dst_pt_address[4];
++} turbodsl_arp_header_t;
++
++#define FIN_FLAG 1
++#define SYN_FLAG 1<<1
++#define RST_FLAG 1<<2
++#define PSH_FLAG 1<<3
++#define ACK_FLAG 1<<4
++#define URG_FLAG 1<<5
++
++typedef struct _turbodsl_tcp_header
++{
++ unsigned short src_port;
++ unsigned short dst_port;
++ unsigned int seq_num;
++ unsigned int ack_num;
++ unsigned char offset; /* only bits 4-7 are for offset */
++ unsigned char flags; /* bits: 0-FIN, 1-SYN, 2-RST, 3-PSH, 4-ACK, 5-URG */
++ unsigned short windows;
++ unsigned short checksum;
++ unsigned short urgent_ptr;
++} turbodsl_tcp_header_t;
++
++
++
++/***************************************************************************
++ * Function: turbodsl_memory_compare
++ * Descripation: Memory compare
++ ****************************************************************************/
++int turbodsl_memory_compare(unsigned char *pIn, unsigned char *pOut, unsigned int len)
++ {
++ int i;
++
++ for(i=0;i<(int)len; i++)
++ {
++ if(pIn[i] != pOut[i])
++ return 0;
++ }
++ return 1;
++ }
++
++/***************************************************************************
++ * Function: turbodsl_check_aal5_encap_type
++ * Descripation: Determine AAL5 Encapsulation type
++ * Input:
++ * unsigned char *pData, AAL5 Packet buffer pointer
++ ****************************************************************************/
++int turbodsl_check_aal5_encap_type(unsigned char *pData)
++ {
++
++ if(turbodsl_memory_compare(pData, LLC_BRIDGED_HEADER_2684, 6))
++ return AAL5_ENCAP_RFC2684_LLC_BRIDGED;
++ if(turbodsl_memory_compare(pData, LLC_ROUTED_HEADER_2684, 6))
++ return AAL5_ENCAP_RFC2684_LLC_ROUTED;
++ if(turbodsl_memory_compare(pData, (unsigned char *)&PPP_LLC_HEADER, sizeof(PPP_LLC_HEADER)))
++ return AAL5_ENCAP_PPP_LLC;
++
++ return AAL5_ENCAP_PPP_VCMUX;
++ }
++
++/***************************************************************************
++ * Function: turbodsl_check_priority_type
++ * Descripation: Determine AAL5 Encapsulation type
++ * Input:
++ * unsigned char *pData, AAL5 Packet buffer pointer.
++ * short vpi, VPI.
++ * int vci, VCI
++ ****************************************************************************/
++int turbodsl_check_priority_type(unsigned char *pData)
++ {
++ int encap;
++ unsigned char *pP;
++ unsigned short etherType;
++ turbodsl_ip_header_t *pIp;
++ turbodsl_tcp_header_t *pTcp;
++ unsigned short ip_length;
++
++ dprintf(2, "turbodsl_check_priority_type ==>\n");
++
++ encap = turbodsl_check_aal5_encap_type(pData);
++ pP = pData;
++
++ switch(encap)
++ {
++ case AAL5_ENCAP_RFC2684_LLC_BRIDGED:
++ pP += RFC2684_BRIDGED_HDR_SIZE; //skip off aal5 encap
++ pP += 12; //skip of mac address
++ etherType = *(unsigned short *)pP;
++ if(etherType != 0x6488 && etherType != 0x0008)
++ {
++ //Not an IP packet
++ return 1;
++ }
++
++ pP +=2; //skip ether type
++ if(etherType == 0x6488)
++ {
++ pP += 6;
++ }
++ break;
++ case AAL5_ENCAP_RFC2684_LLC_ROUTED:
++ pP += RFC2684_ROUTED_HDR_SIZE; //skip of encap
++ pP += 2; //skip ether type
++ break;
++ case AAL5_ENCAP_PPP_LLC:
++ pP += sizeof(PPP_LLC_HEADER);
++ if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
++ pP += 2;
++ break;
++ case AAL5_ENCAP_PPP_VCMUX:
++ if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
++ pP += 2;
++ break;
++ default:
++ return 1;
++ }
++
++ pIp = (turbodsl_ip_header_t *)pP;
++ if(pIp->vit != 0x0045)
++ {
++ //Not a IP packet
++ return 1;
++ }
++
++ if(pIp->protocol != 0x06)
++ {
++ //not tcp packet
++ return 1;
++ }
++
++ pTcp = (turbodsl_tcp_header_t *)(pP + sizeof(turbodsl_ip_header_t));
++
++ ip_length = (pIp->total_length>>8) + (pIp->total_length<<8);
++
++ if((pTcp->flags & ACK_FLAG) && ip_length <=40)
++ return 0;
++
++ return 1;
++ }
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff -urN linux.old/include/linux/atmdev.h linux.dev/include/linux/atmdev.h
+--- linux.old/include/linux/atmdev.h 2004-08-08 01:26:06.000000000 +0200
++++ linux.dev/include/linux/atmdev.h 2005-07-10 08:02:01.476106496 +0200
+@@ -30,6 +30,9 @@
+ #define ATM_DS3_PCR (8000*12)
+ /* DS3: 12 cells in a 125 usec time slot */
+
++#define ATM_PDU_OVHD 0 /* number of bytes to charge against buffer
++ quota per PDU */
++
+ #define ATM_SD(s) ((s)->sk->protinfo.af_atm)
+
+
+@@ -94,7 +97,8 @@
+ /* set backend handler */
+ #define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
+ /* use backend to make new if */
+-
++#define ATM_STOPTX _IOW('a',ATMIOC_SPECIAL+4,struct atmif_sioc)
++ /* Stop Tx on Sangam DSL */
+ /*
+ * These are backend handkers that can be set via the ATM_SETBACKEND call
+ * above. In the future we may support dynamic loading of these - for now,
+@@ -199,7 +203,9 @@
+ "SESSION", "HASSAP", "BOUND", "CLOSE"
+
+
+-#ifdef __KERNEL__
++#ifndef __KERNEL__
++#undef __AAL_STAT_ITEMS
++#else
+
+ #include <linux/sched.h> /* wait_queue_head_t */
+ #include <linux/time.h> /* struct timeval */
+@@ -277,6 +283,7 @@
+
+ struct atm_vcc {
+ atm_vcc_flags_t flags; /* VCC flags (ATM_VF_*) */
++ unsigned char family; /* address family; 0 if unused */
+ short vpi; /* VPI and VCI (types must be equal */
+ /* with sockaddr) */
+ int vci;
+@@ -285,20 +292,31 @@
+ struct atm_dev *dev; /* device back pointer */
+ struct atm_qos qos; /* QOS */
+ struct atm_sap sap; /* SAP */
++ atomic_t tx_inuse,rx_inuse; /* buffer space in use */
+ void (*push)(struct atm_vcc *vcc,struct sk_buff *skb);
+ void (*pop)(struct atm_vcc *vcc,struct sk_buff *skb); /* optional */
++ struct sk_buff *(*alloc_tx)(struct atm_vcc *vcc,unsigned int size);
++ /* TX allocation routine - can be */
++ /* modified by protocol or by driver.*/
++ /* NOTE: this interface will change */
+ int (*push_oam)(struct atm_vcc *vcc,void *cell);
+ int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);
+ void *dev_data; /* per-device data */
+ void *proto_data; /* per-protocol data */
++ struct timeval timestamp; /* AAL timestamps */
++ struct sk_buff_head recvq; /* receive queue */
+ struct k_atm_aal_stats *stats; /* pointer to AAL stats group */
+ wait_queue_head_t sleep; /* if socket is busy */
+ struct sock *sk; /* socket backpointer */
++ struct atm_vcc *prev,*next;
+ /* SVC part --- may move later ------------------------------------- */
+ short itf; /* interface number */
+ struct sockaddr_atmsvc local;
+ struct sockaddr_atmsvc remote;
+ void (*callback)(struct atm_vcc *vcc);
++ struct sk_buff_head listenq;
++ int backlog_quota; /* number of connection requests we */
++ /* can still accept */
+ int reply; /* also used by ATMTCP */
+ /* Multipoint part ------------------------------------------------- */
+ struct atm_vcc *session; /* session VCC descriptor */
+@@ -324,6 +342,8 @@
+ /* (NULL) */
+ const char *type; /* device type name */
+ int number; /* device index */
++ struct atm_vcc *vccs; /* VCC table (or NULL) */
++ struct atm_vcc *last; /* last VCC (or undefined) */
+ void *dev_data; /* per-device data */
+ void *phy_data; /* private PHY date */
+ atm_dev_flags_t flags; /* device flags (ATM_DF_*) */
+@@ -333,13 +353,15 @@
+ struct k_atm_dev_stats stats; /* statistics */
+ char signal; /* signal status (ATM_PHY_SIG_*) */
+ int link_rate; /* link rate (default: OC3) */
+- atomic_t refcnt; /* reference count */
+- spinlock_t lock; /* protect internal members */
++ atomic_t refcnt; /* reference count */
++ spinlock_t lock; /* protect internal members */
+ #ifdef CONFIG_PROC_FS
+ struct proc_dir_entry *proc_entry; /* proc entry */
+ char *proc_name; /* proc entry name */
+ #endif
+- struct list_head dev_list; /* linkage */
++ struct atm_dev *prev,*next; /* linkage */
++ struct list_head dev_list; /* linkage */
++
+ };
+
+
+@@ -375,6 +397,8 @@
+ void (*feedback)(struct atm_vcc *vcc,struct sk_buff *skb,
+ unsigned long start,unsigned long dest,int len);
+ int (*change_qos)(struct atm_vcc *vcc,struct atm_qos *qos,int flags);
++ void (*free_rx_skb)(struct atm_vcc *vcc, struct sk_buff *skb);
++ /* @@@ temporary hack */
+ int (*proc_read)(struct atm_dev *dev,loff_t *pos,char *page);
+ struct module *owner;
+ };
+@@ -389,6 +413,7 @@
+
+ struct atm_skb_data {
+ struct atm_vcc *vcc; /* ATM VCC */
++ int iovcnt; /* 0 for "normal" operation */
+ unsigned long atm_options; /* ATM layer options */
+ };
+
+@@ -399,11 +424,10 @@
+
+ struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
+ int number,atm_dev_flags_t *flags); /* number == -1: pick first available */
+-struct atm_dev *atm_dev_lookup(int number);
++struct atm_dev *atm_find_dev(int number);
+ void atm_dev_deregister(struct atm_dev *dev);
+ void shutdown_atm_dev(struct atm_dev *dev);
+-void vcc_insert_socket(struct sock *sk);
+-void vcc_remove_socket(struct sock *sk);
++void bind_vcc(struct atm_vcc *vcc,struct atm_dev *dev);
+
+
+ /*
+@@ -411,54 +435,52 @@
+ *
+ */
+
+-static inline int atm_guess_pdu2truesize(int size)
++static __inline__ int atm_guess_pdu2truesize(int pdu_size)
+ {
+- return (SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info));
++ return ((pdu_size+15) & ~15) + sizeof(struct sk_buff);
+ }
+
+
+-static inline void atm_force_charge(struct atm_vcc *vcc,int truesize)
++static __inline__ void atm_force_charge(struct atm_vcc *vcc,int truesize)
+ {
+- atomic_add(truesize, &vcc->sk->rmem_alloc);
++ atomic_add(truesize+ATM_PDU_OVHD,&vcc->rx_inuse);
+ }
+
+
+-static inline void atm_return(struct atm_vcc *vcc,int truesize)
++static __inline__ void atm_return(struct atm_vcc *vcc,int truesize)
+ {
+- atomic_sub(truesize, &vcc->sk->rmem_alloc);
++ atomic_sub(truesize+ATM_PDU_OVHD,&vcc->rx_inuse);
+ }
+
+
+-static inline int atm_may_send(struct atm_vcc *vcc,unsigned int size)
++static __inline__ int atm_may_send(struct atm_vcc *vcc,unsigned int size)
+ {
+- return (size + atomic_read(&vcc->sk->wmem_alloc)) < vcc->sk->sndbuf;
++ return size+atomic_read(&vcc->tx_inuse)+ATM_PDU_OVHD < vcc->sk->sndbuf;
+ }
+
+
++int atm_charge(struct atm_vcc *vcc,int truesize);
++struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
++ int gfp_flags);
++int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci);
++int atm_pcr_goal(struct atm_trafprm *tp);
++
++void atm_async_release_vcc(struct atm_vcc *vcc,int reply);
++
+ static inline void atm_dev_hold(struct atm_dev *dev)
+ {
+- atomic_inc(&dev->refcnt);
++ atomic_inc(&dev->refcnt);
+ }
+
+-
+ static inline void atm_dev_put(struct atm_dev *dev)
+ {
+- atomic_dec(&dev->refcnt);
++ atomic_dec(&dev->refcnt);
+
+- if ((atomic_read(&dev->refcnt) == 1) &&
+- test_bit(ATM_DF_CLOSE,&dev->flags))
+- shutdown_atm_dev(dev);
++ if ((atomic_read(&dev->refcnt) == 1) &&
++ test_bit(ATM_DF_CLOSE,&dev->flags))
++ shutdown_atm_dev(dev);
+ }
+
+-
+-int atm_charge(struct atm_vcc *vcc,int truesize);
+-struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size,
+- int gfp_flags);
+-int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci);
+-int atm_pcr_goal(struct atm_trafprm *tp);
+-
+-void vcc_release_async(struct atm_vcc *vcc, int reply);
+-
+ #endif /* __KERNEL__ */
+
+ #endif
+diff -urN linux.old/include/linux/atm.h linux.dev/include/linux/atm.h
+--- linux.old/include/linux/atm.h 2001-11-22 20:48:41.000000000 +0100
++++ linux.dev/include/linux/atm.h 2005-07-10 08:02:01.476106496 +0200
+@@ -135,9 +135,12 @@
+ unsigned char traffic_class; /* traffic class (ATM_UBR, ...) */
+ int max_pcr; /* maximum PCR in cells per second */
+ int pcr; /* desired PCR in cells per second */
++ int scr; /* desired SCR in cells per second */
+ int min_pcr; /* minimum PCR in cells per second */
+ int max_cdv; /* maximum CDV in microseconds */
+ int max_sdu; /* maximum SDU in bytes */
++ /* Ron remove for old tiatm driver 1.00.09 */
++ //int mbs; /* Maximum Burst size */
+ /* extra params for ABR */
+ unsigned int icr; /* Initial Cell Rate (24-bit) */
+ unsigned int tbe; /* Transient Buffer Exposure (24-bit) */