mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-05 17:50:38 +02:00
343c185b7d
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@16547 3c298f89-4303-0410-b956-a3cf2f4a3e73
7284 lines
250 KiB
Diff
7284 lines
250 KiB
Diff
From b778a60aba67d29857fc7016c8c2f2d87a23de1f Mon Sep 17 00:00:00 2001
|
|
From: Kurt Mahan <kmahan@freescale.com>
|
|
Date: Sun, 9 Mar 2008 22:14:05 -0600
|
|
Subject: [PATCH] Add DMA and FEC.
|
|
|
|
LTIBName: m547x-8x-fec-dma
|
|
Signed-off-by: Kurt Mahan <kmahan@freescale.com>
|
|
---
|
|
arch/m68k/Kconfig | 9 +
|
|
arch/m68k/coldfire/Makefile | 2 +
|
|
arch/m68k/coldfire/dma.c | 537 +++++++++
|
|
drivers/Makefile | 2 +
|
|
drivers/dma/MCD_dma.h | 408 +++++++
|
|
drivers/dma/MCD_dmaApi.c | 968 +++++++++++++++++
|
|
drivers/dma/MCD_progCheck.h | 33 +
|
|
drivers/dma/MCD_tasks.c | 2452 ++++++++++++++++++++++++++++++++++++++++++
|
|
drivers/dma/MCD_tasksInit.c | 284 +++++
|
|
drivers/dma/MCD_tasksInit.h | 73 ++
|
|
drivers/dma/Makefile | 2 +
|
|
drivers/net/Kconfig | 2 +
|
|
drivers/net/Makefile | 2 +
|
|
drivers/net/fec/Kconfig | 25 +
|
|
drivers/net/fec/Makefile | 7 +
|
|
drivers/net/fec/fec.c | 1375 +++++++++++++++++++++++
|
|
drivers/net/fec/fec.h | 162 +++
|
|
drivers/net/fec/ks8721.c | 125 +++
|
|
drivers/net/fec/ks8721.h | 21 +
|
|
include/asm-m68k/MCD_dma.h | 408 +++++++
|
|
include/asm-m68k/coldfire.h | 1 +
|
|
include/asm-m68k/dma.h | 106 ++-
|
|
include/asm-m68k/m5485dma.h | 97 ++
|
|
include/asm-m68k/m5485sram.h | 12 +
|
|
24 files changed, 7112 insertions(+), 1 deletions(-)
|
|
create mode 100644 arch/m68k/coldfire/dma.c
|
|
create mode 100644 drivers/dma/MCD_dma.h
|
|
create mode 100644 drivers/dma/MCD_dmaApi.c
|
|
create mode 100644 drivers/dma/MCD_progCheck.h
|
|
create mode 100644 drivers/dma/MCD_tasks.c
|
|
create mode 100644 drivers/dma/MCD_tasksInit.c
|
|
create mode 100644 drivers/dma/MCD_tasksInit.h
|
|
create mode 100644 drivers/net/fec/Kconfig
|
|
create mode 100644 drivers/net/fec/Makefile
|
|
create mode 100755 drivers/net/fec/fec.c
|
|
create mode 100755 drivers/net/fec/fec.h
|
|
create mode 100644 drivers/net/fec/ks8721.c
|
|
create mode 100644 drivers/net/fec/ks8721.h
|
|
create mode 100644 include/asm-m68k/MCD_dma.h
|
|
create mode 100644 include/asm-m68k/m5485dma.h
|
|
create mode 100644 include/asm-m68k/m5485sram.h
|
|
|
|
--- a/arch/m68k/Kconfig
|
|
+++ b/arch/m68k/Kconfig
|
|
@@ -141,6 +141,15 @@ config CFV4E
|
|
select MMU_CFV4E if MMU
|
|
default y
|
|
|
|
+config MCD_DMA
|
|
+ bool "ColdFire MCD DMA support"
|
|
+ depends on CFV4E
|
|
+ default y
|
|
+ help
|
|
+ This enables support for the ColdFire 547x/548x family
|
|
+ multichannel DMA support. Many drivers need it.
|
|
+ If you want it, say Y
|
|
+
|
|
config AMIGA
|
|
bool "Amiga support"
|
|
depends on !MMU_SUN3
|
|
--- a/arch/m68k/coldfire/Makefile
|
|
+++ b/arch/m68k/coldfire/Makefile
|
|
@@ -10,3 +10,5 @@ endif
|
|
|
|
obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o
|
|
obj-$(CONFIG_M54455) += mcf5445x-devices.o
|
|
+
|
|
+obj-$(CONFIG_MCD_DMA) += dma.o
|
|
--- /dev/null
|
|
+++ b/arch/m68k/coldfire/dma.c
|
|
@@ -0,0 +1,537 @@
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/sched.h>
|
|
+#include <linux/mm.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <asm/io.h>
|
|
+#include <asm/irq.h>
|
|
+#include <asm/dma.h>
|
|
+#include <asm/coldfire.h>
|
|
+#include <asm/m5485sram.h>
|
|
+#include <asm/mcfsim.h>
|
|
+
|
|
+
|
|
+
|
|
+void dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs);
|
|
+
|
|
+/*
|
|
+ * This global keeps track of which initiators have been
|
|
+ * used of the available assignments. Initiators 0-15 are
|
|
+ * hardwired. Initiators 16-31 are multiplexed and controlled
|
|
+ * via the Initiatior Mux Control Registe (IMCR). The
|
|
+ * assigned requestor is stored with the associated initiator
|
|
+ * number.
|
|
+ */
|
|
+static int used_reqs[32] = {
|
|
+ DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0,
|
|
+ DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1,
|
|
+ DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX,
|
|
+ DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX,
|
|
+ 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This global keeps track of which channels have been assigned
|
|
+ * to tasks. This methology assumes that no single initiator
|
|
+ * will be tied to more than one task/channel
|
|
+ */
|
|
+static char used_channel[16] = {
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1,
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1
|
|
+};
|
|
+
|
|
+unsigned int connected_channel[16] = {
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0
|
|
+};
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Attempt to enable the provided Initiator in the Initiator
|
|
+ * Mux Control Register
|
|
+ *
|
|
+ * Parameters:
|
|
+ * initiator Initiator identifier
|
|
+ *
|
|
+ * Return Value:
|
|
+ * 1 if unable to make the assignment
|
|
+ * 0 successful
|
|
+ */
|
|
+int
|
|
+dma_set_initiator(int initiator)
|
|
+{
|
|
+ switch (initiator) { /*
|
|
+ * These initiators are always active
|
|
+ */
|
|
+ case DMA_ALWAYS:
|
|
+ case DMA_DSPI_RX:
|
|
+ case DMA_DSPI_TX:
|
|
+ case DMA_DREQ0:
|
|
+ case DMA_PSC0_RX:
|
|
+ case DMA_PSC0_TX:
|
|
+ case DMA_USBEP0:
|
|
+ case DMA_USBEP1:
|
|
+ case DMA_USBEP2:
|
|
+ case DMA_USBEP3:
|
|
+ case DMA_PCI_TX:
|
|
+ case DMA_PCI_RX:
|
|
+ case DMA_PSC1_RX:
|
|
+ case DMA_PSC1_TX:
|
|
+ case DMA_I2C_RX:
|
|
+ case DMA_I2C_TX:
|
|
+ break;
|
|
+
|
|
+ case DMA_FEC0_RX:
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3))
|
|
+ | MCF_DMA_IMCR_SRC16_FEC0RX;
|
|
+ used_reqs[16] = DMA_FEC0_RX;
|
|
+ break;
|
|
+
|
|
+ case DMA_FEC0_TX:
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3))
|
|
+ | MCF_DMA_IMCR_SRC17_FEC0TX;
|
|
+ used_reqs[17] = DMA_FEC0_TX;
|
|
+ break;
|
|
+
|
|
+ case DMA_FEC1_RX:
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3))
|
|
+ | MCF_DMA_IMCR_SRC20_FEC1RX;
|
|
+ used_reqs[20] = DMA_FEC1_RX;
|
|
+ break;
|
|
+
|
|
+ case DMA_FEC1_TX:
|
|
+ if (used_reqs[21] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
|
|
+ | MCF_DMA_IMCR_SRC21_FEC1TX;
|
|
+ used_reqs[21] = DMA_FEC1_TX;
|
|
+ } else if (used_reqs[25] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
|
|
+ | MCF_DMA_IMCR_SRC25_FEC1TX;
|
|
+ used_reqs[25] = DMA_FEC1_TX;
|
|
+ } else if (used_reqs[31] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
|
|
+ | MCF_DMA_IMCR_SRC31_FEC1TX;
|
|
+ used_reqs[31] = DMA_FEC1_TX;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_DREQ1:
|
|
+ if (used_reqs[29] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
|
|
+ | MCF_DMA_IMCR_SRC29_DREQ1;
|
|
+ used_reqs[29] = DMA_DREQ1;
|
|
+ } else if (used_reqs[21] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
|
|
+ | MCF_DMA_IMCR_SRC21_DREQ1;
|
|
+ used_reqs[21] = DMA_DREQ1;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM0:
|
|
+ if (used_reqs[24] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3))
|
|
+ | MCF_DMA_IMCR_SRC24_CTM0;
|
|
+ used_reqs[24] = DMA_CTM0;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM1:
|
|
+ if (used_reqs[25] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
|
|
+ | MCF_DMA_IMCR_SRC25_CTM1;
|
|
+ used_reqs[25] = DMA_CTM1;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM2:
|
|
+ if (used_reqs[26] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
|
|
+ | MCF_DMA_IMCR_SRC26_CTM2;
|
|
+ used_reqs[26] = DMA_CTM2;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM3:
|
|
+ if (used_reqs[27] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
|
|
+ | MCF_DMA_IMCR_SRC27_CTM3;
|
|
+ used_reqs[27] = DMA_CTM3;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM4:
|
|
+ if (used_reqs[28] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
|
|
+ | MCF_DMA_IMCR_SRC28_CTM4;
|
|
+ used_reqs[28] = DMA_CTM4;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM5:
|
|
+ if (used_reqs[29] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
|
|
+ | MCF_DMA_IMCR_SRC29_CTM5;
|
|
+ used_reqs[29] = DMA_CTM5;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM6:
|
|
+ if (used_reqs[30] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
|
|
+ | MCF_DMA_IMCR_SRC30_CTM6;
|
|
+ used_reqs[30] = DMA_CTM6;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_CTM7:
|
|
+ if (used_reqs[31] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
|
|
+ | MCF_DMA_IMCR_SRC31_CTM7;
|
|
+ used_reqs[31] = DMA_CTM7;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_USBEP4:
|
|
+ if (used_reqs[26] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
|
|
+ | MCF_DMA_IMCR_SRC26_USBEP4;
|
|
+ used_reqs[26] = DMA_USBEP4;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_USBEP5:
|
|
+ if (used_reqs[27] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
|
|
+ | MCF_DMA_IMCR_SRC27_USBEP5;
|
|
+ used_reqs[27] = DMA_USBEP5;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_USBEP6:
|
|
+ if (used_reqs[28] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
|
|
+ | MCF_DMA_IMCR_SRC28_USBEP6;
|
|
+ used_reqs[28] = DMA_USBEP6;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_PSC2_RX:
|
|
+ if (used_reqs[28] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
|
|
+ | MCF_DMA_IMCR_SRC28_PSC2RX;
|
|
+ used_reqs[28] = DMA_PSC2_RX;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_PSC2_TX:
|
|
+ if (used_reqs[29] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
|
|
+ | MCF_DMA_IMCR_SRC29_PSC2TX;
|
|
+ used_reqs[29] = DMA_PSC2_TX;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_PSC3_RX:
|
|
+ if (used_reqs[30] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
|
|
+ | MCF_DMA_IMCR_SRC30_PSC3RX;
|
|
+ used_reqs[30] = DMA_PSC3_RX;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ case DMA_PSC3_TX:
|
|
+ if (used_reqs[31] == 0) {
|
|
+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
|
|
+ | MCF_DMA_IMCR_SRC31_PSC3TX;
|
|
+ used_reqs[31] = DMA_PSC3_TX;
|
|
+ } else /* No empty slots */
|
|
+ return 1;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return 1;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Return the initiator number for the given requestor
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ *
|
|
+ * Return Value:
|
|
+ * The initiator number (0-31) if initiator has been assigned
|
|
+ * 0 (always initiator) otherwise
|
|
+ */
|
|
+unsigned int
|
|
+dma_get_initiator(int requestor)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ for (i = 0; i < sizeof (used_reqs); ++i) {
|
|
+ if (used_reqs[i] == requestor)
|
|
+ return i;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Remove the given initiator from the active list
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ */
|
|
+void
|
|
+dma_remove_initiator(int requestor)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ for (i = 0; i < sizeof (used_reqs); ++i) {
|
|
+ if (used_reqs[i] == requestor) {
|
|
+ used_reqs[i] = -1;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Attempt to find an available channel for FEC and mark is as used
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ *
|
|
+ * Return Value:
|
|
+ * First available channel (from 0 to 5) or -1 if they are all occupied
|
|
+ */
|
|
+int
|
|
+dma_set_channel_fec(int requestor)
|
|
+{
|
|
+ u32 i, t;
|
|
+
|
|
+#ifdef CONFIG_FEC_548x_ENABLE_FEC2
|
|
+ t = 4;
|
|
+#else
|
|
+ t = 2;
|
|
+#endif
|
|
+
|
|
+
|
|
+
|
|
+ for (i = 0; i < t ; ++i)
|
|
+ if (used_channel[i] == -1) {
|
|
+ used_channel[i] = requestor;
|
|
+ return i;
|
|
+ }
|
|
+ /* All channels taken */
|
|
+ return -1;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Attempt to find an available channel and mark is as used
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ *
|
|
+ * Return Value:
|
|
+ * First available channel (from 6 to 15) or -1 if they are all occupied
|
|
+ */
|
|
+int
|
|
+dma_set_channel(int requestor)
|
|
+{
|
|
+ u32 i;
|
|
+#ifdef CONFIG_NET_FEC2
|
|
+ i = 4;
|
|
+#else
|
|
+ i = 2;
|
|
+#endif
|
|
+
|
|
+ for (; i < 16; ++i)
|
|
+ if (used_channel[i] == -1) {
|
|
+ used_channel[i] = requestor;
|
|
+ return i;
|
|
+ }
|
|
+
|
|
+ /* All channels taken */
|
|
+ return -1;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Return the channel being initiated by the given requestor
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ */
|
|
+int
|
|
+dma_get_channel(int requestor)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ for (i = 0; i < sizeof (used_channel); ++i) {
|
|
+ if (used_channel[i] == requestor)
|
|
+ return i;
|
|
+ }
|
|
+ return -1;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Connects a channel with reference on your data
|
|
+ *
|
|
+ * Parameters:
|
|
+ * channel channel number
|
|
+ * reference addres of your data
|
|
+ */
|
|
+int
|
|
+dma_connect(int channel, int address)
|
|
+{
|
|
+ if ((channel < 16) && (channel >= 0))
|
|
+ connected_channel[channel] = address;
|
|
+ else
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Disconnects a channel with reference on your data
|
|
+ *
|
|
+ * Parameters:
|
|
+ * channel channel number
|
|
+*/
|
|
+int
|
|
+dma_disconnect(int channel)
|
|
+{
|
|
+ if ((channel < 16) && (channel >= 0))
|
|
+ connected_channel[channel] = 0;
|
|
+ else
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Remove the channel being initiated by the given requestor from
|
|
+ * the active list
|
|
+ *
|
|
+ * Parameters:
|
|
+ * requestor Initiator/Requestor identifier
|
|
+ */
|
|
+void
|
|
+dma_remove_channel(int requestor)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ for (i = 0; i < sizeof (used_channel); ++i) {
|
|
+ if (used_channel[i] == requestor) {
|
|
+ used_channel[i] = -1;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * This is the catch-all interrupt handler for the mult-channel DMA
|
|
+ */
|
|
+volatile u8 dma_iflag[16];
|
|
+u32 tx = 0;
|
|
+
|
|
+void
|
|
+dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
|
|
+{
|
|
+ u32 i, interrupts/*, mask, temp*/;
|
|
+
|
|
+ /*
|
|
+ * Determine which interrupt(s) triggered by AND'ing the
|
|
+ * pending interrupts with those that aren't masked.
|
|
+ */
|
|
+/* mask = MCF_DMA_DIMR;
|
|
+ MCF_DMA_DIMR = 0xffffffff;
|
|
+*/
|
|
+ interrupts = MCF_DMA_DIPR;
|
|
+ MCF_DMA_DIPR |= interrupts;
|
|
+// temp = interrupts;
|
|
+
|
|
+ //MCF_DMA_DIPR = interrupts;
|
|
+ for (i = 0; i < 16; ++i, interrupts >>= 1)
|
|
+ if (interrupts & 0x1)
|
|
+ if (connected_channel[i] != 0)
|
|
+ ((void (*)(void)) (connected_channel[i])) ();
|
|
+
|
|
+/* MCF_DMA_DIPR |= temp;
|
|
+ MCF_DMA_DIMR = mask;*/
|
|
+}
|
|
+
|
|
+void
|
|
+dma_remove_channel_by_number(int channel)
|
|
+{
|
|
+ if (channel < sizeof (used_channel) && channel >= 0)
|
|
+ used_channel[channel] = -1;
|
|
+}
|
|
+
|
|
+int __devinit
|
|
+dma_init()
|
|
+{
|
|
+ int result;
|
|
+ char *dma_version_str;
|
|
+
|
|
+ MCD_getVersion(&dma_version_str);
|
|
+ printk("Initialize %s\n", dma_version_str);
|
|
+
|
|
+ if (request_irq
|
|
+ (64 + ISC_DMA,
|
|
+ dma_interrupt_handler,
|
|
+ IRQF_DISABLED,
|
|
+ "MCD-DMA",
|
|
+ NULL)) {
|
|
+ printk("Cannot allocate the DMA IRQ(48)\n");
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ MCF_DMA_DIMR = 0;
|
|
+ MCF_DMA_DIPR = 0xFFFFFFFF;
|
|
+
|
|
+ MCF_ICR(ISC_DMA) = ILP_DMA;
|
|
+#if 0
|
|
+// JKM
|
|
+ enable_irq( 64 + ISC_DMA );
|
|
+#endif
|
|
+
|
|
+ result =
|
|
+ MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
|
|
+ (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
|
|
+ if (result != MCD_OK) {
|
|
+ printk("Cannot perform DMA initialization\n");
|
|
+ free_irq(64 + ISC_DMA, NULL);
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+device_initcall(dma_init);
|
|
+
|
|
--- a/drivers/Makefile
|
|
+++ b/drivers/Makefile
|
|
@@ -93,3 +93,5 @@ obj-$(CONFIG_PPC_PS3) += ps3/
|
|
obj-$(CONFIG_OF) += of/
|
|
obj-$(CONFIG_SSB) += ssb/
|
|
obj-$(CONFIG_VIRTIO) += virtio/
|
|
+
|
|
+obj-$(CONFIG_MCD_DMA) += dma/
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_dma.h
|
|
@@ -0,0 +1,408 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+
|
|
+/*
|
|
+ * File: MCD_dma.h
|
|
+ * Purpose: Main header file for multi-channel DMA API.
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ * Modifications:
|
|
+ */
|
|
+#ifndef _MCD_API_H
|
|
+#define _MCD_API_H
|
|
+
|
|
+#include <asm/types.h>
|
|
+
|
|
+/*
|
|
+ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
|
|
+ */
|
|
+#undef MCD_INCLUDE_EU
|
|
+
|
|
+/*
|
|
+ * Number of DMA channels
|
|
+ */
|
|
+#define NCHANNELS 16
|
|
+
|
|
+/*
|
|
+ * Total number of variants
|
|
+ */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+#define NUMOFVARIANTS 6
|
|
+#else
|
|
+#define NUMOFVARIANTS 4
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Define sizes of the various tables
|
|
+ */
|
|
+#define TASK_TABLE_SIZE (NCHANNELS*32)
|
|
+#define VAR_TAB_SIZE (128)
|
|
+#define CONTEXT_SAVE_SIZE (128)
|
|
+#define FUNCDESC_TAB_SIZE (256)
|
|
+
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+#define FUNCDESC_TAB_NUM 16
|
|
+#else
|
|
+#define FUNCDESC_TAB_NUM 1
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef DEFINESONLY
|
|
+
|
|
+/*
|
|
+ * Portability typedefs
|
|
+ */
|
|
+ /*
|
|
+#ifndef s32
|
|
+typedef int s32;
|
|
+#endif
|
|
+#ifndef u32
|
|
+typedef unsigned int u32;
|
|
+#endif
|
|
+#ifndef s16
|
|
+typedef short s16;
|
|
+#endif
|
|
+#ifndef u16
|
|
+typedef unsigned short u16;
|
|
+#endif
|
|
+#ifndef s8
|
|
+typedef char s8;
|
|
+#endif
|
|
+#ifndef u8
|
|
+typedef unsigned char u8;
|
|
+#endif
|
|
+*/
|
|
+/*
|
|
+ * These structures represent the internal registers of the
|
|
+ * multi-channel DMA
|
|
+ */
|
|
+struct dmaRegs_s {
|
|
+ u32 taskbar; /* task table base address register */
|
|
+ u32 currPtr;
|
|
+ u32 endPtr;
|
|
+ u32 varTablePtr;
|
|
+ u16 dma_rsvd0;
|
|
+ u16 ptdControl; /* ptd control */
|
|
+ u32 intPending; /* interrupt pending register */
|
|
+ u32 intMask; /* interrupt mask register */
|
|
+ u16 taskControl[16]; /* task control registers */
|
|
+ u8 priority[32]; /* priority registers */
|
|
+ u32 initiatorMux; /* initiator mux control */
|
|
+ u32 taskSize0; /* task size control register 0. */
|
|
+ u32 taskSize1; /* task size control register 1. */
|
|
+ u32 dma_rsvd1; /* reserved */
|
|
+ u32 dma_rsvd2; /* reserved */
|
|
+ u32 debugComp1; /* debug comparator 1 */
|
|
+ u32 debugComp2; /* debug comparator 2 */
|
|
+ u32 debugControl; /* debug control */
|
|
+ u32 debugStatus; /* debug status */
|
|
+ u32 ptdDebug; /* priority task decode debug */
|
|
+ u32 dma_rsvd3[31]; /* reserved */
|
|
+};
|
|
+typedef volatile struct dmaRegs_s dmaRegs;
|
|
+
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * PTD contrl reg bits
|
|
+ */
|
|
+#define PTD_CTL_TSK_PRI 0x8000
|
|
+#define PTD_CTL_COMM_PREFETCH 0x0001
|
|
+
|
|
+/*
|
|
+ * Task Control reg bits and field masks
|
|
+ */
|
|
+#define TASK_CTL_EN 0x8000
|
|
+#define TASK_CTL_VALID 0x4000
|
|
+#define TASK_CTL_ALWAYS 0x2000
|
|
+#define TASK_CTL_INIT_MASK 0x1f00
|
|
+#define TASK_CTL_ASTRT 0x0080
|
|
+#define TASK_CTL_HIPRITSKEN 0x0040
|
|
+#define TASK_CTL_HLDINITNUM 0x0020
|
|
+#define TASK_CTL_ASTSKNUM_MASK 0x000f
|
|
+
|
|
+/*
|
|
+ * Priority reg bits and field masks
|
|
+ */
|
|
+#define PRIORITY_HLD 0x80
|
|
+#define PRIORITY_PRI_MASK 0x07
|
|
+
|
|
+/*
|
|
+ * Debug Control reg bits and field masks
|
|
+ */
|
|
+#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000
|
|
+#define DBG_CTL_AUTO_ARM 0x00008000
|
|
+#define DBG_CTL_BREAK 0x00004000
|
|
+#define DBG_CTL_COMP1_TYP_MASK 0x00003800
|
|
+#define DBG_CTL_COMP2_TYP_MASK 0x00000070
|
|
+#define DBG_CTL_EXT_BREAK 0x00000004
|
|
+#define DBG_CTL_INT_BREAK 0x00000002
|
|
+
|
|
+/*
|
|
+ * PTD Debug reg selector addresses
|
|
+ * This reg must be written with a value to show the contents of
|
|
+ * one of the desired internal register.
|
|
+ */
|
|
+#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */
|
|
+#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and
|
|
+ have initiators asserted */
|
|
+
|
|
+
|
|
+/*
|
|
+ * General return values
|
|
+ */
|
|
+#define MCD_OK 0
|
|
+#define MCD_ERROR -1
|
|
+#define MCD_TABLE_UNALIGNED -2
|
|
+#define MCD_CHANNEL_INVALID -3
|
|
+
|
|
+/*
|
|
+ * MCD_initDma input flags
|
|
+ */
|
|
+#define MCD_RELOC_TASKS 0x00000001
|
|
+#define MCD_NO_RELOC_TASKS 0x00000000
|
|
+#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */
|
|
+
|
|
+/*
|
|
+ * MCD_dmaStatus Status Values for each channel
|
|
+ */
|
|
+#define MCD_NO_DMA 1 /* No DMA has been requested since reset */
|
|
+#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */
|
|
+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
|
|
+#define MCD_PAUSED 4 /* DMA active but it is currently paused */
|
|
+#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */
|
|
+#define MCD_DONE 6 /* the most recent DMA has completed. */
|
|
+
|
|
+
|
|
+/*
|
|
+ * MCD_startDma parameter defines
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Constants for the funcDesc parameter
|
|
+ */
|
|
+/* Byte swapping: */
|
|
+#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */
|
|
+#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */
|
|
+#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of
|
|
+ each 32-bit data value being DMAed.*/
|
|
+#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each
|
|
+ 16-bit half of each 32-bit data value DMAed */
|
|
+#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */
|
|
+#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */
|
|
+/* CRCing: */
|
|
+#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */
|
|
+#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */
|
|
+#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */
|
|
+#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/
|
|
+#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */
|
|
+
|
|
+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
|
|
+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
|
|
+
|
|
+/*
|
|
+ * Constants for the flags parameter
|
|
+ */
|
|
+#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */
|
|
+#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */
|
|
+#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */
|
|
+#define MCD_TT_FLAGS_MASK 0x000000ff
|
|
+#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
|
|
+
|
|
+#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */
|
|
+#define MCD_CHAIN_DMA /* TBD */
|
|
+#define MCD_EU_DMA /* TBD */
|
|
+#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */
|
|
+#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */
|
|
+
|
|
+
|
|
+/* these flags are valid for MCD_startDma and the chained buffer descriptors */
|
|
+#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */
|
|
+#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
|
|
+#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */
|
|
+#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring
|
|
+ last byte of data in buffer */
|
|
+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
|
|
+ prior to performing the DMA. */
|
|
+
|
|
+/* Defines for the FEC buffer descriptor control/status word*/
|
|
+#define MCD_FEC_BUF_READY 0x8000
|
|
+#define MCD_FEC_WRAP 0x2000
|
|
+#define MCD_FEC_INTERRUPT 0x1000
|
|
+#define MCD_FEC_END_FRAME 0x0800
|
|
+
|
|
+
|
|
+/*
|
|
+ * Defines for general intuitiveness
|
|
+ */
|
|
+
|
|
+#define MCD_TRUE 1
|
|
+#define MCD_FALSE 0
|
|
+
|
|
+/*
|
|
+ * Three different cases for destination and source.
|
|
+ */
|
|
+#define MINUS1 -1
|
|
+#define ZERO 0
|
|
+#define PLUS1 1
|
|
+
|
|
+#ifndef DEFINESONLY
|
|
+
|
|
+/* Task Table Entry struct*/
|
|
+typedef struct {
|
|
+ u32 TDTstart; /* task descriptor table start */
|
|
+ u32 TDTend; /* task descriptor table end */
|
|
+ u32 varTab; /* variable table start */
|
|
+ u32 FDTandFlags; /* function descriptor table start and flags */
|
|
+ volatile u32 descAddrAndStatus;
|
|
+ volatile u32 modifiedVarTab;
|
|
+ u32 contextSaveSpace; /* context save space start */
|
|
+ u32 literalBases;
|
|
+} TaskTableEntry;
|
|
+
|
|
+
|
|
+/* Chained buffer descriptor */
|
|
+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
|
|
+struct MCD_bufDesc_struct {
|
|
+ u32 flags; /* flags describing the DMA */
|
|
+ u32 csumResult; /* checksum from checksumming performed since last checksum reset */
|
|
+ s8 *srcAddr; /* the address to move data from */
|
|
+ s8 *destAddr; /* the address to move data to */
|
|
+ s8 *lastDestAddr; /* the last address written to */
|
|
+ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */
|
|
+ MCD_bufDesc *next; /* next buffer descriptor in chain */
|
|
+ u32 info; /* private information about this descriptor; DMA does not affect it */
|
|
+};
|
|
+
|
|
+/* Progress Query struct */
|
|
+typedef volatile struct MCD_XferProg_struct {
|
|
+ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */
|
|
+ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */
|
|
+ u32 dmaSize; /* the amount of data transferred for the current buffer */
|
|
+ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
|
|
+} MCD_XferProg;
|
|
+
|
|
+
|
|
+/* FEC buffer descriptor */
|
|
+typedef volatile struct MCD_bufDescFec_struct {
|
|
+ u16 statCtrl;
|
|
+ u16 length;
|
|
+ u32 dataPointer;
|
|
+} MCD_bufDescFec;
|
|
+
|
|
+
|
|
+/*************************************************************************/
|
|
+/*
|
|
+ * API function Prototypes - see MCD_dmaApi.c for further notes
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * MCD_startDma starts a particular kind of DMA .
|
|
+ */
|
|
+int MCD_startDma (
|
|
+ int channel, /* the channel on which to run the DMA */
|
|
+ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */
|
|
+ s16 srcIncr, /* the amount to increment the source address per transfer */
|
|
+ s8 *destAddr, /* the address to move data to */
|
|
+ s16 destIncr, /* the amount to increment the destination address per transfer */
|
|
+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */
|
|
+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */
|
|
+ u32 initiator, /* what device initiates the DMA */
|
|
+ int priority, /* priority of the DMA */
|
|
+ u32 flags, /* flags describing the DMA */
|
|
+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */
|
|
+);
|
|
+
|
|
+/*
|
|
+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA
|
|
+ * registers, relocating and creating the appropriate task structures, and
|
|
+ * setting up some global settings
|
|
+ */
|
|
+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
|
|
+
|
|
+/*
|
|
+ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
|
|
+ */
|
|
+int MCD_dmaStatus (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_XferProgrQuery() returns progress of DMA on requested channel
|
|
+ */
|
|
+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
|
|
+
|
|
+/*
|
|
+ * MCD_killDma() halts the DMA on the requested channel, without any
|
|
+ * intention of resuming the DMA.
|
|
+ */
|
|
+int MCD_killDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_continDma() continues a DMA which as stopped due to encountering an
|
|
+ * unready buffer descriptor.
|
|
+ */
|
|
+int MCD_continDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
|
|
+ * running on that channel).
|
|
+ */
|
|
+int MCD_pauseDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
|
|
+ * running on that channel).
|
|
+ */
|
|
+int MCD_resumeDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
|
|
+ */
|
|
+int MCD_csumQuery (int channel, u32 *csum);
|
|
+
|
|
+/*
|
|
+ * MCD_getCodeSize provides the packed size required by the microcoded task
|
|
+ * and structures.
|
|
+ */
|
|
+int MCD_getCodeSize(void);
|
|
+
|
|
+/*
|
|
+ * MCD_getVersion provides a pointer to a version string and returns a
|
|
+ * version number.
|
|
+ */
|
|
+int MCD_getVersion(char **longVersion);
|
|
+
|
|
+/* macro for setting a location in the variable table */
|
|
+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
|
|
+ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
|
|
+ so I'm avoiding surrounding it with "do {} while(0)" */
|
|
+
|
|
+#endif /* DEFINESONLY */
|
|
+
|
|
+#endif /* _MCD_API_H */
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_dmaApi.c
|
|
@@ -0,0 +1,968 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+
|
|
+/*
|
|
+ * File: MCD_dmaApi.c
|
|
+ * Purpose: Main C file for multi-channel DMA API.
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ *
|
|
+ * Modifications:
|
|
+ *
|
|
+ *
|
|
+ */
|
|
+#include <asm/types.h>
|
|
+#include <asm/MCD_dma.h>
|
|
+#include <asm/virtconvert.h>
|
|
+#include "MCD_tasksInit.h"
|
|
+#include "MCD_progCheck.h"
|
|
+
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * This is an API-internal pointer to the DMA's registers
|
|
+ */
|
|
+dmaRegs *MCD_dmaBar;
|
|
+
|
|
+/*
|
|
+ * These are the real and model task tables as generated by the
|
|
+ * build process
|
|
+ */
|
|
+extern TaskTableEntry MCD_realTaskTableSrc[NCHANNELS];
|
|
+extern TaskTableEntry MCD_modelTaskTableSrc[NUMOFVARIANTS];
|
|
+
|
|
+/*
|
|
+ * However, this (usually) gets relocated to on-chip SRAM, at which
|
|
+ * point we access them as these tables
|
|
+ */
|
|
+volatile TaskTableEntry *MCD_taskTable;
|
|
+TaskTableEntry *MCD_modelTaskTable;
|
|
+
|
|
+
|
|
+/*
|
|
+ * MCD_chStatus[] is an array of status indicators for remembering
|
|
+ * whether a DMA has ever been attempted on each channel, pausing
|
|
+ * status, etc.
|
|
+ */
|
|
+static int MCD_chStatus[NCHANNELS] =
|
|
+{
|
|
+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
|
|
+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
|
|
+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
|
|
+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Prototypes for local functions
|
|
+ */
|
|
+static void MCD_memcpy (int *dest, int *src, u32 size);
|
|
+static void MCD_resmActions (int channel);
|
|
+
|
|
+/*
|
|
+ * Buffer descriptors used for storage of progress info for single Dmas
|
|
+ * Also used as storage for the DMA for CRCs for single DMAs
|
|
+ * Otherwise, the DMA does not parse these buffer descriptors
|
|
+ */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+extern MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
|
|
+#else
|
|
+MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
|
|
+#endif
|
|
+MCD_bufDesc *MCD_relocBuffDesc;
|
|
+
|
|
+
|
|
+/*
|
|
+ * Defines for the debug control register's functions
|
|
+ */
|
|
+#define DBG_CTL_COMP1_TASK (0x00002000) /* have comparator 1 look for a task # */
|
|
+#define DBG_CTL_ENABLE (DBG_CTL_AUTO_ARM | \
|
|
+ DBG_CTL_BREAK | \
|
|
+ DBG_CTL_INT_BREAK | \
|
|
+ DBG_CTL_COMP1_TASK)
|
|
+#define DBG_CTL_DISABLE (DBG_CTL_AUTO_ARM | \
|
|
+ DBG_CTL_INT_BREAK | \
|
|
+ DBG_CTL_COMP1_TASK)
|
|
+#define DBG_KILL_ALL_STAT (0xFFFFFFFF)
|
|
+
|
|
+/*
|
|
+ * Offset to context save area where progress info is stored
|
|
+ */
|
|
+#define CSAVE_OFFSET 10
|
|
+
|
|
+/*
|
|
+ * Defines for Byte Swapping
|
|
+ */
|
|
+#define MCD_BYTE_SWAP_KILLER 0xFFF8888F
|
|
+#define MCD_NO_BYTE_SWAP_ATALL 0x00040000
|
|
+
|
|
+/*
|
|
+ * Execution Unit Identifiers
|
|
+ */
|
|
+#define MAC 0 /* legacy - not used */
|
|
+#define LUAC 1 /* legacy - not used */
|
|
+#define CRC 2 /* legacy - not used */
|
|
+#define LURC 3 /* Logic Unit with CRC */
|
|
+
|
|
+/*
|
|
+ * Task Identifiers
|
|
+ */
|
|
+#define TASK_CHAINNOEU 0
|
|
+#define TASK_SINGLENOEU 1
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+#define TASK_CHAINEU 2
|
|
+#define TASK_SINGLEEU 3
|
|
+#define TASK_FECRX 4
|
|
+#define TASK_FECTX 5
|
|
+#else
|
|
+#define TASK_CHAINEU 0
|
|
+#define TASK_SINGLEEU 1
|
|
+#define TASK_FECRX 2
|
|
+#define TASK_FECTX 3
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Structure to remember which variant is on which channel
|
|
+ * TBD- need this?
|
|
+ */
|
|
+typedef struct MCD_remVariants_struct MCD_remVariant;
|
|
+struct MCD_remVariants_struct
|
|
+{
|
|
+ int remDestRsdIncr[NCHANNELS]; /* -1,0,1 */
|
|
+ int remSrcRsdIncr[NCHANNELS]; /* -1,0,1 */
|
|
+ s16 remDestIncr[NCHANNELS]; /* DestIncr */
|
|
+ s16 remSrcIncr[NCHANNELS]; /* srcIncr */
|
|
+ u32 remXferSize[NCHANNELS]; /* xferSize */
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Structure to remember the startDma parameters for each channel
|
|
+ */
|
|
+MCD_remVariant MCD_remVariants;
|
|
+/********************************************************************/
|
|
+/*
|
|
+ * Function: MCD_initDma
|
|
+ * Purpose: Initializes the DMA API by setting up a pointer to the DMA
|
|
+ * registers, relocating and creating the appropriate task
|
|
+ * structures, and setting up some global settings
|
|
+ * Arguments:
|
|
+ * dmaBarAddr - pointer to the multichannel DMA registers
|
|
+ * taskTableDest - location to move DMA task code and structs to
|
|
+ * flags - operational parameters
|
|
+ * Return Value:
|
|
+ * MCD_TABLE_UNALIGNED if taskTableDest is not 512-byte aligned
|
|
+ * MCD_OK otherwise
|
|
+ */
|
|
+extern u32 MCD_funcDescTab0[];
|
|
+
|
|
+int MCD_initDma (dmaRegs *dmaBarAddr, void *taskTableDest, u32 flags)
|
|
+{
|
|
+ int i;
|
|
+ TaskTableEntry *entryPtr;
|
|
+
|
|
+ /* setup the local pointer to register set */
|
|
+ MCD_dmaBar = dmaBarAddr;
|
|
+
|
|
+ /* do we need to move/create a task table */
|
|
+ if ((flags & MCD_RELOC_TASKS) != 0)
|
|
+ {
|
|
+ int fixedSize;
|
|
+ u32 *fixedPtr;
|
|
+ /*int *tablePtr = taskTableDest;TBD*/
|
|
+ int varTabsOffset, funcDescTabsOffset, contextSavesOffset;
|
|
+ int taskDescTabsOffset;
|
|
+ int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize;
|
|
+ int taskDescTabSize;
|
|
+
|
|
+ int i;
|
|
+
|
|
+ /* check if physical address is aligned on 512 byte boundary */
|
|
+ if (((u32)taskTableDest & 0x000001ff) != 0)
|
|
+ return(MCD_TABLE_UNALIGNED);
|
|
+
|
|
+ MCD_taskTable = taskTableDest; /* set up local pointer to task Table */
|
|
+
|
|
+ /*
|
|
+ * Create a task table:
|
|
+ * - compute aligned base offsets for variable tables and
|
|
+ * function descriptor tables, then
|
|
+ * - loop through the task table and setup the pointers
|
|
+ * - copy over model task table with the the actual task descriptor
|
|
+ * tables
|
|
+ */
|
|
+
|
|
+ taskTableSize = NCHANNELS * sizeof(TaskTableEntry);
|
|
+ /* align variable tables to size */
|
|
+ varTabsOffset = taskTableSize + (u32)taskTableDest;
|
|
+ if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0)
|
|
+ varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE);
|
|
+ /* align function descriptor tables */
|
|
+ varTabsSize = NCHANNELS * VAR_TAB_SIZE;
|
|
+ funcDescTabsOffset = varTabsOffset + varTabsSize;
|
|
+
|
|
+ if ((funcDescTabsOffset & (FUNCDESC_TAB_SIZE - 1)) != 0)
|
|
+ funcDescTabsOffset = (funcDescTabsOffset + FUNCDESC_TAB_SIZE) &
|
|
+ (~FUNCDESC_TAB_SIZE);
|
|
+
|
|
+ funcDescTabsSize = FUNCDESC_TAB_NUM * FUNCDESC_TAB_SIZE;
|
|
+ contextSavesOffset = funcDescTabsOffset + funcDescTabsSize;
|
|
+ contextSavesSize = (NCHANNELS * CONTEXT_SAVE_SIZE);
|
|
+ fixedSize = taskTableSize + varTabsSize + funcDescTabsSize +
|
|
+ contextSavesSize;
|
|
+
|
|
+ /* zero the thing out */
|
|
+ fixedPtr = (u32 *)taskTableDest;
|
|
+ for (i = 0;i<(fixedSize/4);i++)
|
|
+ fixedPtr[i] = 0;
|
|
+
|
|
+ entryPtr = (TaskTableEntry*)MCD_taskTable;
|
|
+ /* set up fixed pointers */
|
|
+ for (i = 0; i < NCHANNELS; i++)
|
|
+ {
|
|
+ entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */
|
|
+ entryPtr[i].FDTandFlags = (u32)funcDescTabsOffset | MCD_TT_FLAGS_DEF;
|
|
+ entryPtr[i].contextSaveSpace = (u32)contextSavesOffset;
|
|
+ varTabsOffset += VAR_TAB_SIZE;
|
|
+#ifdef MCD_INCLUDE_EU /* if not there is only one, just point to the same one */
|
|
+ funcDescTabsOffset += FUNCDESC_TAB_SIZE;
|
|
+#endif
|
|
+ contextSavesOffset += CONTEXT_SAVE_SIZE;
|
|
+ }
|
|
+ /* copy over the function descriptor table */
|
|
+ for ( i = 0; i < FUNCDESC_TAB_NUM; i++)
|
|
+ {
|
|
+ MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK),
|
|
+ (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE);
|
|
+ }
|
|
+
|
|
+ /* copy model task table to where the context saves stuff leaves off*/
|
|
+ MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset;
|
|
+
|
|
+ MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc,
|
|
+ NUMOFVARIANTS * sizeof(TaskTableEntry));
|
|
+
|
|
+ entryPtr = MCD_modelTaskTable; /* point to local version of
|
|
+ model task table */
|
|
+ taskDescTabsOffset = (u32)MCD_modelTaskTable +
|
|
+ (NUMOFVARIANTS * sizeof(TaskTableEntry));
|
|
+
|
|
+ /* copy actual task code and update TDT ptrs in local model task table */
|
|
+ for (i = 0; i < NUMOFVARIANTS; i++)
|
|
+ {
|
|
+ taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4;
|
|
+ MCD_memcpy ((void*)taskDescTabsOffset, (void*)entryPtr[i].TDTstart, taskDescTabSize);
|
|
+ entryPtr[i].TDTstart = (u32)taskDescTabsOffset;
|
|
+ taskDescTabsOffset += taskDescTabSize;
|
|
+ entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4;
|
|
+ }
|
|
+#ifdef MCD_INCLUDE_EU /* Tack single DMA BDs onto end of code so API controls
|
|
+ where they are since DMA might write to them */
|
|
+ MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4);
|
|
+#else /* DMA does not touch them so they can be wherever and we don't need to
|
|
+ waste SRAM on them */
|
|
+ MCD_relocBuffDesc = MCD_singleBufDescs;
|
|
+#endif
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ /* point the would-be relocated task tables and the
|
|
+ buffer descriptors to the ones the linker generated */
|
|
+
|
|
+ if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0)
|
|
+ return(MCD_TABLE_UNALIGNED);
|
|
+
|
|
+ /* need to add code to make sure that every thing else is aligned properly TBD*/
|
|
+ /* this is problematic if we init more than once or after running tasks,
|
|
+ need to add variable to see if we have aleady init'd */
|
|
+ entryPtr = MCD_realTaskTableSrc;
|
|
+ for (i = 0; i < NCHANNELS; i++)
|
|
+ {
|
|
+ if (((entryPtr[i].varTab & (VAR_TAB_SIZE - 1)) != 0) ||
|
|
+ ((entryPtr[i].FDTandFlags & (FUNCDESC_TAB_SIZE - 1)) != 0))
|
|
+ return(MCD_TABLE_UNALIGNED);
|
|
+ }
|
|
+
|
|
+ MCD_taskTable = MCD_realTaskTableSrc;
|
|
+ MCD_modelTaskTable = MCD_modelTaskTableSrc;
|
|
+ MCD_relocBuffDesc = MCD_singleBufDescs;
|
|
+ }
|
|
+
|
|
+
|
|
+ /* Make all channels as totally inactive, and remember them as such: */
|
|
+
|
|
+ MCD_dmaBar->taskbar = (u32) MCD_taskTable;
|
|
+ for (i = 0; i < NCHANNELS; i++)
|
|
+ {
|
|
+ MCD_dmaBar->taskControl[i] = 0x0;
|
|
+ MCD_chStatus[i] = MCD_NO_DMA;
|
|
+ }
|
|
+
|
|
+ /* Set up pausing mechanism to inactive state: */
|
|
+ MCD_dmaBar->debugComp1 = 0; /* no particular values yet for either comparator registers */
|
|
+ MCD_dmaBar->debugComp2 = 0;
|
|
+ MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
|
|
+ MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT;
|
|
+
|
|
+ /* enable or disable commbus prefetch, really need an ifdef or
|
|
+ something to keep from trying to set this in the 8220 */
|
|
+ if ((flags & MCD_COMM_PREFETCH_EN) != 0)
|
|
+ MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH;
|
|
+ else
|
|
+ MCD_dmaBar->ptdControl |= PTD_CTL_COMM_PREFETCH;
|
|
+
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/*********************** End of MCD_initDma() ***********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_dmaStatus
|
|
+ * Purpose: Returns the status of the DMA on the requested channel
|
|
+ * Arguments: channel - channel number
|
|
+ * Returns: Predefined status indicators
|
|
+ */
|
|
+int MCD_dmaStatus (int channel)
|
|
+{
|
|
+ u16 tcrValue;
|
|
+
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ tcrValue = MCD_dmaBar->taskControl[channel];
|
|
+ if ((tcrValue & TASK_CTL_EN) == 0)
|
|
+ { /* nothing running */
|
|
+ /* if last reported with task enabled */
|
|
+ if ( MCD_chStatus[channel] == MCD_RUNNING
|
|
+ || MCD_chStatus[channel] == MCD_IDLE)
|
|
+ MCD_chStatus[channel] = MCD_DONE;
|
|
+ }
|
|
+ else /* something is running */
|
|
+ {
|
|
+ /* There are three possibilities: paused, running or idle. */
|
|
+ if ( MCD_chStatus[channel] == MCD_RUNNING
|
|
+ || MCD_chStatus[channel] == MCD_IDLE)
|
|
+ {
|
|
+ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT;
|
|
+ /* This register is selected to know which initiator is
|
|
+ actually asserted. */
|
|
+ if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 )
|
|
+ MCD_chStatus[channel] = MCD_RUNNING;
|
|
+ else
|
|
+ MCD_chStatus[channel] = MCD_IDLE;
|
|
+ /* do not change the status if it is already paused. */
|
|
+ }
|
|
+ }
|
|
+ return MCD_chStatus[channel];
|
|
+}
|
|
+/******************** End of MCD_dmaStatus() ************************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_startDma
|
|
+ * Ppurpose: Starts a particular kind of DMA
|
|
+ * Arguments: see below
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ */
|
|
+
|
|
+int MCD_startDma (
|
|
+ int channel, /* the channel on which to run the DMA */
|
|
+ s8 *srcAddr, /* the address to move data from, or physical buffer-descriptor address */
|
|
+ s16 srcIncr, /* the amount to increment the source address per transfer */
|
|
+ s8 *destAddr, /* the address to move data to */
|
|
+ s16 destIncr, /* the amount to increment the destination address per transfer */
|
|
+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */
|
|
+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */
|
|
+ u32 initiator, /* what device initiates the DMA */
|
|
+ int priority, /* priority of the DMA */
|
|
+ u32 flags, /* flags describing the DMA */
|
|
+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */
|
|
+#ifdef MCD_NEED_ADDR_TRANS
|
|
+ s8 *srcAddrVirt /* virtual buffer descriptor address TBD*/
|
|
+#endif
|
|
+)
|
|
+{
|
|
+ int srcRsdIncr, destRsdIncr;
|
|
+ int *cSave;
|
|
+ short xferSizeIncr;
|
|
+ int tcrCount = 0;
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ u32 *realFuncArray;
|
|
+#endif
|
|
+
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ /* tbd - need to determine the proper response to a bad funcDesc when not
|
|
+ including EU functions, for now, assign a benign funcDesc, but maybe
|
|
+ should return an error */
|
|
+#ifndef MCD_INCLUDE_EU
|
|
+ funcDesc = MCD_FUNC_NOEU1;
|
|
+#endif
|
|
+
|
|
+#ifdef MCD_DEBUG
|
|
+printf("startDma:Setting up params\n");
|
|
+#endif
|
|
+ /* Set us up for task-wise priority. We don't technically need to do this on every start, but
|
|
+ since the register involved is in the same longword as other registers that users are in control
|
|
+ of, setting it more than once is probably preferable. That since the documentation doesn't seem
|
|
+ to be completely consistent about the nature of the PTD control register. */
|
|
+ MCD_dmaBar->ptdControl |= (u16) 0x8000;
|
|
+#if 1 /* Not sure what we need to keep here rtm TBD */
|
|
+ /* Calculate additional parameters to the regular DMA calls. */
|
|
+ srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0);
|
|
+ destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0);
|
|
+
|
|
+ xferSizeIncr = (xferSize & 0xffff) | 0x20000000;
|
|
+
|
|
+ /* Remember for each channel which variant is running. */
|
|
+ MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr;
|
|
+ MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr;
|
|
+ MCD_remVariants.remDestIncr[channel] = destIncr;
|
|
+ MCD_remVariants.remSrcIncr[channel] = srcIncr;
|
|
+ MCD_remVariants.remXferSize[channel] = xferSize;
|
|
+#endif
|
|
+
|
|
+ cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) + CSAVE_OFFSET + CURRBD;
|
|
+
|
|
+#ifdef MCD_INCLUDE_EU /* may move this to EU specific calls */
|
|
+ realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00);
|
|
+ /* Modify the LURC's normal and byte-residue-loop functions according to parameter. */
|
|
+ realFuncArray[(LURC*16)] = xferSize == 4 ?
|
|
+ funcDesc : xferSize == 2 ?
|
|
+ funcDesc & 0xfffff00f : funcDesc & 0xffff000f;
|
|
+ realFuncArray[(LURC*16+1)] = (funcDesc & MCD_BYTE_SWAP_KILLER) | MCD_NO_BYTE_SWAP_ATALL;
|
|
+#endif
|
|
+ /* Write the initiator field in the TCR, and also set the initiator-hold
|
|
+ bit. Note that,due to a hardware quirk, this could collide with an
|
|
+ MDE access to the initiator-register file, so we have to verify that the write
|
|
+ reads back correctly. */
|
|
+
|
|
+ MCD_dmaBar->taskControl[channel] =
|
|
+ (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
|
|
+
|
|
+ while(((MCD_dmaBar->taskControl[channel] & 0x1fff) !=
|
|
+ ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) &&
|
|
+ (tcrCount < 1000))
|
|
+ {
|
|
+ tcrCount++;
|
|
+ /*MCD_dmaBar->ptd_tcr[channel] = (initiator << 8) | 0x0020;*/
|
|
+ MCD_dmaBar->taskControl[channel] =
|
|
+ (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
|
|
+ }
|
|
+
|
|
+ MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK;
|
|
+ /* should be albe to handle this stuff with only one write to ts reg - tbd */
|
|
+ if (channel < 8 && channel >= 0)
|
|
+ {
|
|
+ MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4);
|
|
+ MCD_dmaBar->taskSize0 |= (xferSize & 3) << (((7 - channel)*4) + 2);
|
|
+ MCD_dmaBar->taskSize0 |= (xferSize & 3) << ((7 - channel)*4);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ MCD_dmaBar->taskSize1 &= ~(0xf << (15-channel)*4);
|
|
+ MCD_dmaBar->taskSize1 |= (xferSize & 3) << (((15 - channel)*4) + 2);
|
|
+ MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4);
|
|
+ }
|
|
+
|
|
+ /* setup task table flags/options which mostly control the line buffers */
|
|
+ MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK;
|
|
+ MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags);
|
|
+
|
|
+ if (flags & MCD_FECTX_DMA)
|
|
+ {
|
|
+ /* TDTStart and TDTEnd */
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECTX].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECTX].TDTend;
|
|
+ MCD_startDmaENetXmit(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
|
|
+ }
|
|
+ else if (flags & MCD_FECRX_DMA)
|
|
+ {
|
|
+ /* TDTStart and TDTEnd */
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECRX].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECRX].TDTend;
|
|
+ MCD_startDmaENetRcv(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
|
|
+ }
|
|
+ else if(flags & MCD_SINGLE_DMA)
|
|
+ {
|
|
+ /* this buffer descriptor is used for storing off initial parameters for later
|
|
+ progress query calculation and for the DMA to write the resulting checksum
|
|
+ The DMA does not use this to determine how to operate, that info is passed
|
|
+ with the init routine*/
|
|
+ MCD_relocBuffDesc[channel].srcAddr = srcAddr;
|
|
+ MCD_relocBuffDesc[channel].destAddr = destAddr;
|
|
+ MCD_relocBuffDesc[channel].lastDestAddr = destAddr; /* definitely not its final value */
|
|
+ MCD_relocBuffDesc[channel].dmaSize = dmaSize;
|
|
+ MCD_relocBuffDesc[channel].flags = 0; /* not used */
|
|
+ MCD_relocBuffDesc[channel].csumResult = 0; /* not used */
|
|
+ MCD_relocBuffDesc[channel].next = 0; /* not used */
|
|
+
|
|
+ /* Initialize the progress-querying stuff to show no progress:*/
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] = (int)srcAddr;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] = (int)destAddr;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] =
|
|
+ (u32) &(MCD_relocBuffDesc[channel]);
|
|
+ /* tbd - need to keep the user from trying to call the EU routine
|
|
+ when MCD_INCLUDE_EU is not defined */
|
|
+ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
|
|
+ {
|
|
+ /* TDTStart and TDTEnd */
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend;
|
|
+ MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
|
|
+ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
|
|
+ MCD_taskTable, channel);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ /* TDTStart and TDTEnd */
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend;
|
|
+ MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
|
|
+ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
|
|
+ MCD_taskTable, channel);
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ { /* chained DMAS */
|
|
+ /* Initialize the progress-querying stuff to show no progress:*/
|
|
+#if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
|
|
+ = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->srcAddr;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
|
|
+ = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->destAddr;
|
|
+#else /* if using address translation, need the virtual addr of the first buffdesc */
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
|
|
+ = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
|
|
+ = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr;
|
|
+#endif
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
|
|
+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = (u32) srcAddr;
|
|
+
|
|
+ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
|
|
+ {
|
|
+ /*TDTStart and TDTEnd*/
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend;
|
|
+ MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize,
|
|
+ xferSizeIncr, cSave, MCD_taskTable, channel);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ /*TDTStart and TDTEnd*/
|
|
+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart;
|
|
+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend;
|
|
+ MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize,
|
|
+ xferSizeIncr, cSave, MCD_taskTable, channel);
|
|
+ }
|
|
+ }
|
|
+ MCD_chStatus[channel] = MCD_IDLE;
|
|
+ return(MCD_OK);
|
|
+}
|
|
+
|
|
+/************************ End of MCD_startDma() *********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_XferProgrQuery
|
|
+ * Purpose: Returns progress of DMA on requested channel
|
|
+ * Arguments: channel - channel to retrieve progress for
|
|
+ * progRep - pointer to user supplied MCD_XferProg struct
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ *
|
|
+ * Notes:
|
|
+ * MCD_XferProgrQuery() upon completing or after aborting a DMA, or
|
|
+ * while the DMA is in progress, this function returns the first
|
|
+ * DMA-destination address not (or not yet) used in the DMA. When
|
|
+ * encountering a non-ready buffer descriptor, the information for
|
|
+ * the last completed descriptor is returned.
|
|
+ *
|
|
+ * MCD_XferProgQuery() has to avoid the possibility of getting
|
|
+ * partially-updated information in the event that we should happen
|
|
+ * to query DMA progress just as the DMA is updating it. It does that
|
|
+ * by taking advantage of the fact context is not saved frequently for
|
|
+ * the most part. We therefore read it at least twice until we get the
|
|
+ * same information twice in a row.
|
|
+ *
|
|
+ * Because a small, but not insignificant, amount of time is required
|
|
+ * to write out the progress-query information, especially upon
|
|
+ * completion of the DMA, it would be wise to guarantee some time lag
|
|
+ * between successive readings of the progress-query information.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * How many iterations of the loop below to execute to stabilize values
|
|
+ */
|
|
+#define STABTIME 0
|
|
+
|
|
+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep)
|
|
+{
|
|
+ MCD_XferProg prevRep;
|
|
+ int again; /* true if we are to try again to get consistent results */
|
|
+ int i; /* used as a time-waste counter */
|
|
+ int destDiffBytes; /* Total number of bytes that we think actually got xfered. */
|
|
+ int numIterations; /* number of iterations */
|
|
+ int bytesNotXfered; /* bytes that did not get xfered. */
|
|
+ s8 *LWAlignedInitDestAddr, *LWAlignedCurrDestAddr;
|
|
+ int subModVal, addModVal; /* Mode values to added and subtracted from the
|
|
+ final destAddr */
|
|
+
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ /* Read a trial value for the progress-reporting values*/
|
|
+ prevRep.lastSrcAddr =
|
|
+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
|
|
+ prevRep.lastDestAddr =
|
|
+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
|
|
+ prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
|
|
+ prevRep.currBufDesc =
|
|
+ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
|
|
+ /* Repeatedly reread those values until they match previous values: */
|
|
+ do {
|
|
+ /* Waste a little bit of time to ensure stability: */
|
|
+ for (i = 0; i < STABTIME; i++)
|
|
+ i += i >> 2; /* make sure this loop does something so that it doesn't get optimized out */
|
|
+ /* Check them again: */
|
|
+ progRep->lastSrcAddr =
|
|
+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
|
|
+ progRep->lastDestAddr =
|
|
+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
|
|
+ progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
|
|
+ progRep->currBufDesc =
|
|
+ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
|
|
+ /* See if they match: */
|
|
+ if ( prevRep.lastSrcAddr != progRep->lastSrcAddr
|
|
+ || prevRep.lastDestAddr != progRep->lastDestAddr
|
|
+ || prevRep.dmaSize != progRep->dmaSize
|
|
+ || prevRep.currBufDesc != progRep->currBufDesc)
|
|
+ {
|
|
+ /* If they don't match, remember previous values and try again:*/
|
|
+ prevRep.lastSrcAddr = progRep->lastSrcAddr;
|
|
+ prevRep.lastDestAddr = progRep->lastDestAddr;
|
|
+ prevRep.dmaSize = progRep->dmaSize;
|
|
+ prevRep.currBufDesc = progRep->currBufDesc;
|
|
+ again = MCD_TRUE;
|
|
+ }
|
|
+ else
|
|
+ again = MCD_FALSE;
|
|
+ } while (again == MCD_TRUE);
|
|
+
|
|
+
|
|
+ /* Update the dCount, srcAddr and destAddr */
|
|
+ /* To calculate dmaCount, we consider destination address. C
|
|
+ overs M1,P1,Z for destination */
|
|
+ switch(MCD_remVariants.remDestRsdIncr[channel]) {
|
|
+ case MINUS1:
|
|
+ subModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
|
|
+ addModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
|
|
+ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal;
|
|
+ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal;
|
|
+ destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr;
|
|
+ bytesNotXfered = (destDiffBytes/MCD_remVariants.remDestIncr[channel]) *
|
|
+ ( MCD_remVariants.remDestIncr[channel]
|
|
+ + MCD_remVariants.remXferSize[channel]);
|
|
+ progRep->dmaSize = destDiffBytes - bytesNotXfered + addModVal - subModVal;
|
|
+ break;
|
|
+ case ZERO:
|
|
+ progRep->lastDestAddr = progRep->currBufDesc->destAddr;
|
|
+ break;
|
|
+ case PLUS1:
|
|
+ /* This value has to be subtracted from the final calculated dCount. */
|
|
+ subModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
|
|
+ /* These bytes are already in lastDestAddr. */
|
|
+ addModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
|
|
+ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal;
|
|
+ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal;
|
|
+ destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr);
|
|
+ numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel];
|
|
+ bytesNotXfered = numIterations *
|
|
+ ( MCD_remVariants.remDestIncr[channel]
|
|
+ - MCD_remVariants.remXferSize[channel]);
|
|
+ progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal;
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* This covers M1,P1,Z for source */
|
|
+ switch(MCD_remVariants.remSrcRsdIncr[channel]) {
|
|
+ case MINUS1:
|
|
+ progRep->lastSrcAddr =
|
|
+ progRep->currBufDesc->srcAddr +
|
|
+ ( MCD_remVariants.remSrcIncr[channel] *
|
|
+ (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
|
|
+ break;
|
|
+ case ZERO:
|
|
+ progRep->lastSrcAddr = progRep->currBufDesc->srcAddr;
|
|
+ break;
|
|
+ case PLUS1:
|
|
+ progRep->lastSrcAddr =
|
|
+ progRep->currBufDesc->srcAddr +
|
|
+ ( MCD_remVariants.remSrcIncr[channel] *
|
|
+ (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
|
|
+ break;
|
|
+ default: break;
|
|
+ }
|
|
+
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/******************* End of MCD_XferProgrQuery() ********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* MCD_resmActions() does the majority of the actions of a DMA resume.
|
|
+ * It is called from MCD_killDma() and MCD_resumeDma(). It has to be
|
|
+ * a separate function because the kill function has to negate the task
|
|
+ * enable before resuming it, but the resume function has to do nothing
|
|
+ * if there is no DMA on that channel (i.e., if the enable bit is 0).
|
|
+ */
|
|
+static void MCD_resmActions (int channel)
|
|
+{
|
|
+ MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
|
|
+ MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;
|
|
+ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; /* This register is selected to know
|
|
+ which initiator is actually asserted. */
|
|
+ if((MCD_dmaBar->ptdDebug >> channel ) & 0x1)
|
|
+ MCD_chStatus[channel] = MCD_RUNNING;
|
|
+ else
|
|
+ MCD_chStatus[channel] = MCD_IDLE;
|
|
+}
|
|
+/********************* End of MCD_resmActions() *********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_killDma
|
|
+ * Purpose: Halt the DMA on the requested channel, without any
|
|
+ * intention of resuming the DMA.
|
|
+ * Arguments: channel - requested channel
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ *
|
|
+ * Notes:
|
|
+ * A DMA may be killed from any state, including paused state, and it
|
|
+ * always goes to the MCD_HALTED state even if it is killed while in
|
|
+ * the MCD_NO_DMA or MCD_IDLE states.
|
|
+ */
|
|
+int MCD_killDma (int channel)
|
|
+{
|
|
+ /* MCD_XferProg progRep; */
|
|
+
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ MCD_dmaBar->taskControl[channel] = 0x0;
|
|
+ MCD_resumeDma (channel);
|
|
+ /*
|
|
+ * This must be after the write to the TCR so that the task doesn't
|
|
+ * start up again momentarily, and before the status assignment so
|
|
+ * as to override whatever MCD_resumeDma() may do to the channel
|
|
+ * status.
|
|
+ */
|
|
+ MCD_chStatus[channel] = MCD_HALTED;
|
|
+
|
|
+ /*
|
|
+ * Update the current buffer descriptor's lastDestAddr field
|
|
+ *
|
|
+ * MCD_XferProgrQuery (channel, &progRep);
|
|
+ * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
|
|
+ */
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/************************ End of MCD_killDma() **********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_continDma
|
|
+ * Purpose: Continue a DMA which as stopped due to encountering an
|
|
+ * unready buffer descriptor.
|
|
+ * Arguments: channel - channel to continue the DMA on
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ *
|
|
+ * Notes:
|
|
+ * This routine does not check to see if there is a task which can
|
|
+ * be continued. Also this routine should not be used with single DMAs.
|
|
+ */
|
|
+int MCD_continDma (int channel)
|
|
+{
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ MCD_dmaBar->taskControl[channel] |= TASK_CTL_EN;
|
|
+ MCD_chStatus[channel] = MCD_RUNNING;
|
|
+
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/********************** End of MCD_continDma() **********************/
|
|
+
|
|
+/*********************************************************************
|
|
+ * MCD_pauseDma() and MCD_resumeDma() below use the DMA's debug unit
|
|
+ * to freeze a task and resume it. We freeze a task by breakpointing
|
|
+ * on the stated task. That is, not any specific place in the task,
|
|
+ * but any time that task executes. In particular, when that task
|
|
+ * executes, we want to freeze that task and only that task.
|
|
+ *
|
|
+ * The bits of the debug control register influence interrupts vs.
|
|
+ * breakpoints as follows:
|
|
+ * - Bits 14 and 0 enable or disable debug functions. If enabled, you
|
|
+ * will get the interrupt but you may or may not get a breakpoint.
|
|
+ * - Bits 2 and 1 decide whether you also get a breakpoint in addition
|
|
+ * to an interrupt.
|
|
+ *
|
|
+ * The debug unit can do these actions in response to either internally
|
|
+ * detected breakpoint conditions from the comparators, or in response
|
|
+ * to the external breakpoint pin, or both.
|
|
+ * - Bits 14 and 1 perform the above-described functions for
|
|
+ * internally-generated conditions, i.e., the debug comparators.
|
|
+ * - Bits 0 and 2 perform the above-described functions for external
|
|
+ * conditions, i.e., the breakpoint external pin.
|
|
+ *
|
|
+ * Note that, although you "always" get the interrupt when you turn
|
|
+ * the debug functions, the interrupt can nevertheless, if desired, be
|
|
+ * masked by the corresponding bit in the PTD's IMR. Note also that
|
|
+ * this means that bits 14 and 0 must enable debug functions before
|
|
+ * bits 1 and 2, respectively, have any effect.
|
|
+ *
|
|
+ * NOTE: It's extremely important to not pause more than one DMA channel
|
|
+ * at a time.
|
|
+ ********************************************************************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_pauseDma
|
|
+ * Purpose: Pauses the DMA on a given channel (if any DMA is running
|
|
+ * on that channel).
|
|
+ * Arguments: channel
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ */
|
|
+int MCD_pauseDma (int channel)
|
|
+{
|
|
+ /* MCD_XferProg progRep; */
|
|
+
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
|
|
+ {
|
|
+ MCD_dmaBar->debugComp1 = channel;
|
|
+ MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16));
|
|
+ MCD_chStatus[channel] = MCD_PAUSED;
|
|
+
|
|
+ /*
|
|
+ * Update the current buffer descriptor's lastDestAddr field
|
|
+ *
|
|
+ * MCD_XferProgrQuery (channel, &progRep);
|
|
+ * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
|
|
+ */
|
|
+ }
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/************************* End of MCD_pauseDma() ********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_resumeDma
|
|
+ * Purpose: Resumes the DMA on a given channel (if any DMA is
|
|
+ * running on that channel).
|
|
+ * Arguments: channel - channel on which to resume DMA
|
|
+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
|
|
+ */
|
|
+int MCD_resumeDma (int channel)
|
|
+{
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
|
|
+ MCD_resmActions (channel);
|
|
+
|
|
+ return(MCD_OK);
|
|
+}
|
|
+/************************ End of MCD_resumeDma() ********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_csumQuery
|
|
+ * Purpose: Provide the checksum after performing a non-chained DMA
|
|
+ * Arguments: channel - channel to report on
|
|
+ * csum - pointer to where to write the checksum/CRC
|
|
+ * Returns: MCD_ERROR if the channel is invalid, else MCD_OK
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ */
|
|
+int MCD_csumQuery (int channel, u32 *csum)
|
|
+{
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ if((channel < 0) || (channel >= NCHANNELS))
|
|
+ return(MCD_CHANNEL_INVALID);
|
|
+
|
|
+ *csum = MCD_relocBuffDesc[channel].csumResult;
|
|
+ return(MCD_OK);
|
|
+#else
|
|
+ return(MCD_ERROR);
|
|
+#endif
|
|
+}
|
|
+/*********************** End of MCD_resumeDma() *********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_getCodeSize
|
|
+ * Purpose: Provide the size requirements of the microcoded tasks
|
|
+ * Returns: Size in bytes
|
|
+ */
|
|
+int MCD_getCodeSize(void)
|
|
+{
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ return(0x2b5c);
|
|
+#else
|
|
+ return(0x173c);
|
|
+#endif
|
|
+}
|
|
+/********************** End of MCD_getCodeSize() ********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Function: MCD_getVersion
|
|
+ * Purpose: Provide the version string and number
|
|
+ * Arguments: longVersion - user supplied pointer to a pointer to a char
|
|
+ * which points to the version string
|
|
+ * Returns: Version number and version string (by reference)
|
|
+ */
|
|
+char MCD_versionString[] = "Multi-channel DMA API Alpha v0.3 (2004-04-26)";
|
|
+#define MCD_REV_MAJOR 0x00
|
|
+#define MCD_REV_MINOR 0x03
|
|
+
|
|
+int MCD_getVersion(char **longVersion)
|
|
+{
|
|
+ *longVersion = MCD_versionString;
|
|
+ return((MCD_REV_MAJOR << 8) | MCD_REV_MINOR);
|
|
+}
|
|
+/********************** End of MCD_getVersion() *********************/
|
|
+
|
|
+/********************************************************************/
|
|
+/* Private version of memcpy()
|
|
+ * Note that everything this is used for is longword-aligned.
|
|
+ */
|
|
+static void MCD_memcpy (int *dest, int *src, u32 size)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ for (i = 0; i < size; i += sizeof(int), dest++, src++)
|
|
+ *dest = *src;
|
|
+}
|
|
+/********************************************************************/
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_progCheck.h
|
|
@@ -0,0 +1,33 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+ /* This file is autogenerated. Do not change */
|
|
+#define CURRBD 4
|
|
+#define DCOUNT 6
|
|
+#define DESTPTR 5
|
|
+#define SRCPTR 7
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_tasks.c
|
|
@@ -0,0 +1,2452 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+/*
|
|
+ * File: MCD_tasks.c
|
|
+ * Purpose: Contains task code and structures for Multi-channel DMA
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ *
|
|
+ * Modifications:
|
|
+ *
|
|
+ *
|
|
+ */
|
|
+
|
|
+#include <asm/MCD_dma.h>
|
|
+
|
|
+u32 MCD_varTab0[];
|
|
+u32 MCD_varTab1[];
|
|
+u32 MCD_varTab2[];
|
|
+u32 MCD_varTab3[];
|
|
+u32 MCD_varTab4[];
|
|
+u32 MCD_varTab5[];
|
|
+u32 MCD_varTab6[];
|
|
+u32 MCD_varTab7[];
|
|
+u32 MCD_varTab8[];
|
|
+u32 MCD_varTab9[];
|
|
+u32 MCD_varTab10[];
|
|
+u32 MCD_varTab11[];
|
|
+u32 MCD_varTab12[];
|
|
+u32 MCD_varTab13[];
|
|
+u32 MCD_varTab14[];
|
|
+u32 MCD_varTab15[];
|
|
+
|
|
+u32 MCD_funcDescTab0[];
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+u32 MCD_funcDescTab1[];
|
|
+u32 MCD_funcDescTab2[];
|
|
+u32 MCD_funcDescTab3[];
|
|
+u32 MCD_funcDescTab4[];
|
|
+u32 MCD_funcDescTab5[];
|
|
+u32 MCD_funcDescTab6[];
|
|
+u32 MCD_funcDescTab7[];
|
|
+u32 MCD_funcDescTab8[];
|
|
+u32 MCD_funcDescTab9[];
|
|
+u32 MCD_funcDescTab10[];
|
|
+u32 MCD_funcDescTab11[];
|
|
+u32 MCD_funcDescTab12[];
|
|
+u32 MCD_funcDescTab13[];
|
|
+u32 MCD_funcDescTab14[];
|
|
+u32 MCD_funcDescTab15[];
|
|
+#endif
|
|
+
|
|
+u32 MCD_contextSave0[];
|
|
+u32 MCD_contextSave1[];
|
|
+u32 MCD_contextSave2[];
|
|
+u32 MCD_contextSave3[];
|
|
+u32 MCD_contextSave4[];
|
|
+u32 MCD_contextSave5[];
|
|
+u32 MCD_contextSave6[];
|
|
+u32 MCD_contextSave7[];
|
|
+u32 MCD_contextSave8[];
|
|
+u32 MCD_contextSave9[];
|
|
+u32 MCD_contextSave10[];
|
|
+u32 MCD_contextSave11[];
|
|
+u32 MCD_contextSave12[];
|
|
+u32 MCD_contextSave13[];
|
|
+u32 MCD_contextSave14[];
|
|
+u32 MCD_contextSave15[];
|
|
+
|
|
+u32 MCD_realTaskTableSrc[] =
|
|
+{
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab0, /* Task 0 Variable Table */
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave0, /* Task 0 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab1, /* Task 1 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab1, /* Task 1 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave1, /* Task 1 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab2, /* Task 2 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab2, /* Task 2 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave2, /* Task 2 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab3, /* Task 3 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab3, /* Task 3 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave3, /* Task 3 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab4, /* Task 4 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab4, /* Task 4 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave4, /* Task 4 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab5, /* Task 5 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab5, /* Task 5 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave5, /* Task 5 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab6, /* Task 6 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab6, /* Task 6 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave6, /* Task 6 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab7, /* Task 7 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab7, /* Task 7 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave7, /* Task 7 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab8, /* Task 8 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab8, /* Task 8 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave8, /* Task 8 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab9, /* Task 9 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab9, /* Task 9 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave9, /* Task 9 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab10, /* Task 10 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab10, /* Task 10 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave10, /* Task 10 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab11, /* Task 11 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab11, /* Task 11 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave11, /* Task 11 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab12, /* Task 12 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab12, /* Task 12 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave12, /* Task 12 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab13, /* Task 13 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab13, /* Task 13 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave13, /* Task 13 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab14, /* Task 14 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab14, /* Task 14 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave14, /* Task 14 context save space */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_varTab15, /* Task 15 Variable Table */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_funcDescTab15, /* Task 15 Function Descriptor Table & Flags */
|
|
+#else
|
|
+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */
|
|
+#endif
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_contextSave15, /* Task 15 context save space */
|
|
+ 0x00000000,
|
|
+};
|
|
+
|
|
+
|
|
+u32 MCD_varTab0[] =
|
|
+{ /* Task 0 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+
|
|
+u32 MCD_varTab1[] =
|
|
+{ /* Task 1 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab2[]=
|
|
+{ /* Task 2 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab3[]=
|
|
+{ /* Task 3 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab4[]=
|
|
+{ /* Task 4 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab5[]=
|
|
+{ /* Task 5 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab6[]=
|
|
+{ /* Task 6 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab7[]=
|
|
+{ /* Task 7 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab8[]=
|
|
+{ /* Task 8 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab9[]=
|
|
+{ /* Task 9 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab10[]=
|
|
+{ /* Task 10 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab11[]=
|
|
+{ /* Task 11 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab12[]=
|
|
+{ /* Task 12 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab13[]=
|
|
+{ /* Task 13 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab14[]=
|
|
+{ /* Task 14 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_varTab15[]=
|
|
+{ /* Task 15 Variable Table */
|
|
+ 0x00000000, /* var[0] */
|
|
+ 0x00000000, /* var[1] */
|
|
+ 0x00000000, /* var[2] */
|
|
+ 0x00000000, /* var[3] */
|
|
+ 0x00000000, /* var[4] */
|
|
+ 0x00000000, /* var[5] */
|
|
+ 0x00000000, /* var[6] */
|
|
+ 0x00000000, /* var[7] */
|
|
+ 0x00000000, /* var[8] */
|
|
+ 0x00000000, /* var[9] */
|
|
+ 0x00000000, /* var[10] */
|
|
+ 0x00000000, /* var[11] */
|
|
+ 0x00000000, /* var[12] */
|
|
+ 0x00000000, /* var[13] */
|
|
+ 0x00000000, /* var[14] */
|
|
+ 0x00000000, /* var[15] */
|
|
+ 0x00000000, /* var[16] */
|
|
+ 0x00000000, /* var[17] */
|
|
+ 0x00000000, /* var[18] */
|
|
+ 0x00000000, /* var[19] */
|
|
+ 0x00000000, /* var[20] */
|
|
+ 0x00000000, /* var[21] */
|
|
+ 0x00000000, /* var[22] */
|
|
+ 0x00000000, /* var[23] */
|
|
+ 0xe0000000, /* inc[0] */
|
|
+ 0x20000000, /* inc[1] */
|
|
+ 0x2000ffff, /* inc[2] */
|
|
+ 0x00000000, /* inc[3] */
|
|
+ 0x00000000, /* inc[4] */
|
|
+ 0x00000000, /* inc[5] */
|
|
+ 0x00000000, /* inc[6] */
|
|
+ 0x00000000, /* inc[7] */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab0[]=
|
|
+{ /* Task 0 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+u32 MCD_funcDescTab1[]=
|
|
+{ /* Task 1 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab2[]=
|
|
+{ /* Task 2 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab3[]=
|
|
+{ /* Task 3 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab4[]=
|
|
+{ /* Task 4 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab5[]=
|
|
+{ /* Task 5 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab6[]=
|
|
+{ /* Task 6 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab7[]=
|
|
+{ /* Task 7 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab8[]=
|
|
+{ /* Task 8 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab9[]=
|
|
+{ /* Task 9 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab10[]=
|
|
+{ /* Task 10 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab11[]=
|
|
+{ /* Task 11 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab12[]=
|
|
+{ /* Task 12 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab13[]=
|
|
+{ /* Task 13 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab14[]=
|
|
+{ /* Task 14 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+
|
|
+u32 MCD_funcDescTab15[]=
|
|
+{ /* Task 15 Function Descriptor Table */
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0xa0045670, /* mainFunc(), EU# 3 */
|
|
+ 0xa0000000, /* rsduFunc(), EU# 3 */
|
|
+ 0xa0000000, /* crcAccumVal(), EU# 3 */
|
|
+ 0x20000000, /* setCrcAccum(), EU# 3 */
|
|
+ 0x21800000, /* and(), EU# 3 */
|
|
+ 0x21e00000, /* or(), EU# 3 */
|
|
+ 0x20400000, /* add(), EU# 3 */
|
|
+ 0x20500000, /* sub(), EU# 3 */
|
|
+ 0x205a0000, /* andNot(), EU# 3 */
|
|
+ 0x202fa000, /* andReadyBit(), EU# 3 */
|
|
+ 0x202f9000, /* andNotReadyBit(), EU# 3 */
|
|
+ 0x202ea000, /* andWrapBit(), EU# 3 */
|
|
+ 0x202da000, /* andEndFrameBit(), EU# 3 */
|
|
+ 0x202e2000, /* andInterruptBit(), EU# 3 */
|
|
+ 0x202f2000, /* andLoopBit(), EU# 3 */
|
|
+ 0x2020a000, /* andCrcRestartBit(), EU# 3 */
|
|
+};
|
|
+#endif /*MCD_INCLUDE_EU*/
|
|
+
|
|
+u32 MCD_contextSave0[128]; /* Task 0 context save space */
|
|
+u32 MCD_contextSave1[128]; /* Task 1 context save space */
|
|
+u32 MCD_contextSave2[128]; /* Task 2 context save space */
|
|
+u32 MCD_contextSave3[128]; /* Task 3 context save space */
|
|
+u32 MCD_contextSave4[128]; /* Task 4 context save space */
|
|
+u32 MCD_contextSave5[128]; /* Task 5 context save space */
|
|
+u32 MCD_contextSave6[128]; /* Task 6 context save space */
|
|
+u32 MCD_contextSave7[128]; /* Task 7 context save space */
|
|
+u32 MCD_contextSave8[128]; /* Task 8 context save space */
|
|
+u32 MCD_contextSave9[128]; /* Task 9 context save space */
|
|
+u32 MCD_contextSave10[128]; /* Task 10 context save space */
|
|
+u32 MCD_contextSave11[128]; /* Task 11 context save space */
|
|
+u32 MCD_contextSave12[128]; /* Task 12 context save space */
|
|
+u32 MCD_contextSave13[128]; /* Task 13 context save space */
|
|
+u32 MCD_contextSave14[128]; /* Task 14 context save space */
|
|
+u32 MCD_contextSave15[128]; /* Task 15 context save space */
|
|
+
|
|
+/* Task Descriptor Tables - the guts */
|
|
+u32 MCD_ChainNoEu_TDT[];
|
|
+u32 MCD_SingleNoEu_TDT[];
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+u32 MCD_ChainEu_TDT[];
|
|
+u32 MCD_SingleEu_TDT[];
|
|
+#endif
|
|
+u32 MCD_ENetRcv_TDT[];
|
|
+u32 MCD_ENetXmit_TDT[];
|
|
+
|
|
+u32 MCD_modelTaskTableSrc[]=
|
|
+{
|
|
+ (u32)MCD_ChainNoEu_TDT,
|
|
+ (u32)&((u8*)MCD_ChainNoEu_TDT)[0x00000178],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_SingleNoEu_TDT,
|
|
+ (u32)&((u8*)MCD_SingleNoEu_TDT)[0x000000d4],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+ (u32)MCD_ChainEu_TDT,
|
|
+ (u32)&((u8*)MCD_ChainEu_TDT)[0x00000180],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_SingleEu_TDT,
|
|
+ (u32)&((u8*)MCD_SingleEu_TDT)[0x000000dc],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+#endif
|
|
+ (u32)MCD_ENetRcv_TDT,
|
|
+ (u32)&((u8*)MCD_ENetRcv_TDT)[0x0000009C],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ (u32)MCD_ENetXmit_TDT,
|
|
+ (u32)&((u8*)MCD_ENetXmit_TDT)[0x000000d0],
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+ 0x00000000,
|
|
+};
|
|
+
|
|
+u32 MCD_ChainNoEu_TDT[]=
|
|
+{
|
|
+ 0x80004000, /* 0000(:370): LCDEXT: idx0 = 0x00000000; ; */
|
|
+ 0x8118801b, /* 0004(:370): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0xb8ca0018, /* 0008(:371): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10004b10, /* 000C(:372): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x7000000c, /* 0010(:373): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x024cf89f, /* 0014(:373): DRD2B1: var9 = EU3(); EU3(idx2) */
|
|
+ 0x60000009, /* 0018(:374): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf89f, /* 001C(:374): DRD2B1: idx0 = EU3(); EU3(idx2) */
|
|
+ 0x000001f8, /* 0020(:0): NOP */
|
|
+ 0x98180524, /* 0024(:378): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
|
|
+ 0x8118801b, /* 0028(:380): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0xf8ca001a, /* 002C(:381): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
|
|
+ 0xb8ca601b, /* 0030(:382): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
|
|
+ 0x10004310, /* 0034(:384): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x00001718, /* 0038(:385): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xb8ca001d, /* 003C(:387): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10001f10, /* 0040(:388): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000007, /* 0044(:389): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
|
|
+ 0x020cf893, /* 0048(:389): DRD2B1: var8 = EU3(); EU3(idx2,var19) */
|
|
+ 0x98ca001c, /* 004C(:391): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
|
|
+ 0x00000710, /* 0050(:392): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x98ca8018, /* 0054(:393): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
|
|
+ 0x10002b10, /* 0058(:394): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c828, /* 005C(:395): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0060(:0): NOP */
|
|
+ 0xc14ae018, /* 0064(:399): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
|
|
+ 0xc004a51d, /* 0068(:399): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
|
|
+ 0x811a601b, /* 006C(:400): LCD: idx4 = var2; ; idx4 += inc3 */
|
|
+ 0xc28a21c2, /* 0070(:403): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x881be009, /* 0074(:403): LCD: idx7 = var16; ; idx7 += inc1 */
|
|
+ 0x03fed7b8, /* 0078(:406): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
|
|
+ 0xda9b001b, /* 007C(:408): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 0080(:408): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x1000cb20, /* 0084(:409): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0088(:410): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 008C(:410): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb28, /* 0090(:411): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0094(:412): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 0098(:412): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb30, /* 009C(:413): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00A0(:414): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00A4(:414): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb38, /* 00A8(:415): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c728, /* 00AC(:416): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 00B0(:0): NOP */
|
|
+ 0xc14ae018, /* 00B4(:420): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
|
|
+ 0xc004a5dd, /* 00B8(:420): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
|
|
+ 0x811a601b, /* 00BC(:421): LCD: idx4 = var2; ; idx4 += inc3 */
|
|
+ 0xda9b001b, /* 00C0(:424): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00C4(:424): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x0000d3a0, /* 00C8(:425): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc28a21c2, /* 00CC(:427): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x881be009, /* 00D0(:427): LCD: idx7 = var16; ; idx7 += inc1 */
|
|
+ 0x0bfed7b8, /* 00D4(:430): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
|
|
+ 0xda9b001b, /* 00D8(:432): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00DC(:432): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x1000cb20, /* 00E0(:433): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00E4(:434): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00E8(:434): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb28, /* 00EC(:435): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00F0(:436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00F4(:436): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb30, /* 00F8(:437): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00FC(:438): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 0100(:438): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb38, /* 0104(:439): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c728, /* 0108(:440): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 010C(:0): NOP */
|
|
+ 0x8118801b, /* 0110(:444): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0x8a19001b, /* 0114(:446): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
|
|
+ 0x6000000e, /* 0118(:447): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
|
|
+ 0x088cf49f, /* 011C(:447): DRD2B1: idx2 = EU3(); EU3(var18) */
|
|
+ 0xd9190536, /* 0120(:448): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
|
|
+ 0x98ca0018, /* 0124(:448): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
|
|
+ 0x6000000a, /* 0128(:450): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
|
|
+ 0x0cccfcdf, /* 012C(:450): DRD2B1: *idx3 = EU3(); EU3(*idx3) */
|
|
+ 0x000001f8, /* 0130(:0): NOP */
|
|
+ 0xa14a001e, /* 0134(:453): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
|
|
+ 0x10000b08, /* 0138(:454): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x10002c90, /* 013C(:455): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0xb8ca0018, /* 0140(:456): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10004b10, /* 0144(:457): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000009, /* 0148(:458): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x080cf89f, /* 014C(:458): DRD2B1: idx0 = EU3(); EU3(idx2) */
|
|
+ 0x6000000c, /* 0150(:459): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
|
|
+ 0x024cf89f, /* 0154(:459): DRD2B1: var9 = EU3(); EU3(idx2) */
|
|
+ 0x000001f8, /* 0158(:0): NOP */
|
|
+ 0x8a18801b, /* 015C(:465): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
|
|
+ 0x7000000d, /* 0160(:466): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x084cf2df, /* 0164(:466): DRD2B1: idx1 = EU3(); EU3(var11) */
|
|
+ 0xd899053f, /* 0168(:467): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
|
|
+ 0x8019801b, /* 016C(:467): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
|
|
+ 0x040001f8, /* 0170(:468): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0174(:0): NOP */
|
|
+ 0x000001f8, /* 0178(:0): NOP */
|
|
+};
|
|
+u32 MCD_SingleNoEu_TDT[]=
|
|
+{
|
|
+ 0x8318001b, /* 0000(:646): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
|
|
+ 0x7000000c, /* 0004(:647): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x080cf81f, /* 0008(:647): DRD2B1: idx0 = EU3(); EU3(idx0) */
|
|
+ 0x8318801b, /* 000C(:648): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
|
|
+ 0x6000000d, /* 0010(:649): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
|
|
+ 0x084cf85f, /* 0014(:649): DRD2B1: idx1 = EU3(); EU3(idx1) */
|
|
+ 0x000001f8, /* 0018(:0): NOP */
|
|
+ 0x8498001b, /* 001C(:653): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
|
|
+ 0x7000000c, /* 0020(:654): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x020cf81f, /* 0024(:654): DRD2B1: var8 = EU3(); EU3(idx0) */
|
|
+ 0x6000000d, /* 0028(:655): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
|
|
+ 0x028cf81f, /* 002C(:655): DRD2B1: var10 = EU3(); EU3(idx0) */
|
|
+ 0xc404601b, /* 0030(:658): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
|
|
+ 0xc00423dc, /* 0034(:658): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
|
|
+ 0x809a601b, /* 0038(:659): LCD: idx4 = var1; ; idx4 += inc3 */
|
|
+ 0xc207a182, /* 003C(:662): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x869be009, /* 0040(:662): LCD: idx7 = var13; ; idx7 += inc1 */
|
|
+ 0x03fed7b8, /* 0044(:665): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
|
|
+ 0xda9b001b, /* 0048(:667): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 004C(:667): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x70000006, /* 0050(:669): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 0054(:669): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb28, /* 0058(:670): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 005C(:671): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 0060(:671): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb30, /* 0064(:672): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0068(:673): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 006C(:673): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x0000cb38, /* 0070(:674): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0074(:0): NOP */
|
|
+ 0xc404601b, /* 0078(:678): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
|
|
+ 0xc004245c, /* 007C(:678): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
|
|
+ 0x809a601b, /* 0080(:679): LCD: idx4 = var1; ; idx4 += inc3 */
|
|
+ 0xda9b001b, /* 0084(:682): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 0088(:682): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x0000d3a0, /* 008C(:683): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc207a182, /* 0090(:685): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x869be009, /* 0094(:685): LCD: idx7 = var13; ; idx7 += inc1 */
|
|
+ 0x0bfed7b8, /* 0098(:688): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
|
|
+ 0xda9b001b, /* 009C(:690): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00A0(:690): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x70000006, /* 00A4(:692): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00A8(:692): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb28, /* 00AC(:693): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00B0(:694): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00B4(:694): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb30, /* 00B8(:695): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00BC(:696): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00C0(:696): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x0000cb38, /* 00C4(:697): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 00C8(:0): NOP */
|
|
+ 0xc51803ed, /* 00CC(:701): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
|
|
+ 0x8018801b, /* 00D0(:701): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
|
|
+ 0x040001f8, /* 00D4(:702): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+};
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+u32 MCD_ChainEu_TDT[]=
|
|
+{
|
|
+ 0x80004000, /* 0000(:928): LCDEXT: idx0 = 0x00000000; ; */
|
|
+ 0x8118801b, /* 0004(:928): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0xb8ca0018, /* 0008(:929): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10004b10, /* 000C(:930): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x7000000c, /* 0010(:931): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x024cf89f, /* 0014(:931): DRD2B1: var9 = EU3(); EU3(idx2) */
|
|
+ 0x60000009, /* 0018(:932): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf89f, /* 001C(:932): DRD2B1: idx0 = EU3(); EU3(idx2) */
|
|
+ 0x000001f8, /* 0020(:0): NOP */
|
|
+ 0x98180524, /* 0024(:936): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
|
|
+ 0x8118801b, /* 0028(:938): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0xf8ca001a, /* 002C(:939): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
|
|
+ 0xb8ca601b, /* 0030(:940): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
|
|
+ 0x10004310, /* 0034(:942): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x00001718, /* 0038(:943): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xb8ca001d, /* 003C(:945): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10001f10, /* 0040(:946): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000007, /* 0044(:947): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
|
|
+ 0x020cf893, /* 0048(:947): DRD2B1: var8 = EU3(); EU3(idx2,var19) */
|
|
+ 0x98ca001c, /* 004C(:949): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
|
|
+ 0x00000710, /* 0050(:950): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x98ca8018, /* 0054(:951): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
|
|
+ 0x10002b10, /* 0058(:952): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c828, /* 005C(:953): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0060(:0): NOP */
|
|
+ 0xc14ae018, /* 0064(:957): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
|
|
+ 0xc004a51d, /* 0068(:957): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
|
|
+ 0x811a601b, /* 006C(:958): LCD: idx4 = var2; ; idx4 += inc3 */
|
|
+ 0xc28a21c2, /* 0070(:961): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x881be009, /* 0074(:961): LCD: idx7 = var16; ; idx7 += inc1 */
|
|
+ 0x63fe0000, /* 0078(:964): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
|
|
+ 0x0d4cfddf, /* 007C(:964): DRD2B1: *idx5 = EU3(); EU3(*idx7) */
|
|
+ 0xda9b001b, /* 0080(:966): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 0084(:966): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x1000cb20, /* 0088(:967): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 008C(:968): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 0090(:968): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb28, /* 0094(:969): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0098(:970): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 009C(:970): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb30, /* 00A0(:971): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00A4(:972): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00A8(:972): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb38, /* 00AC(:973): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c728, /* 00B0(:974): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 00B4(:0): NOP */
|
|
+ 0xc14ae018, /* 00B8(:978): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
|
|
+ 0xc004a5dd, /* 00BC(:978): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
|
|
+ 0x811a601b, /* 00C0(:979): LCD: idx4 = var2; ; idx4 += inc3 */
|
|
+ 0xda9b001b, /* 00C4(:982): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00C8(:982): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x0000d3a0, /* 00CC(:983): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc28a21c2, /* 00D0(:985): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x881be009, /* 00D4(:985): LCD: idx7 = var16; ; idx7 += inc1 */
|
|
+ 0x6bfe0000, /* 00D8(:988): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
|
|
+ 0x0d4cfddf, /* 00DC(:988): DRD2B1: *idx5 = EU3(); EU3(*idx7) */
|
|
+ 0xda9b001b, /* 00E0(:990): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00E4(:990): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x1000cb20, /* 00E8(:991): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00EC(:992): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00F0(:992): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb28, /* 00F4(:993): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00F8(:994): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 00FC(:994): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb30, /* 0100(:995): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0104(:996): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf896, /* 0108(:996): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */
|
|
+ 0x1000cb38, /* 010C(:997): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x0000c728, /* 0110(:998): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0114(:0): NOP */
|
|
+ 0x8118801b, /* 0118(:1002): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
|
|
+ 0x8a19001b, /* 011C(:1004): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
|
|
+ 0x6000000e, /* 0120(:1005): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
|
|
+ 0x088cf49f, /* 0124(:1005): DRD2B1: idx2 = EU3(); EU3(var18) */
|
|
+ 0xd9190536, /* 0128(:1006): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
|
|
+ 0x98ca0018, /* 012C(:1006): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
|
|
+ 0x6000000a, /* 0130(:1008): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
|
|
+ 0x0cccfcdf, /* 0134(:1008): DRD2B1: *idx3 = EU3(); EU3(*idx3) */
|
|
+ 0x000001f8, /* 0138(:0): NOP */
|
|
+ 0xa14a001e, /* 013C(:1011): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
|
|
+ 0x10000b08, /* 0140(:1012): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x10002c90, /* 0144(:1013): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0xb8ca0018, /* 0148(:1014): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
|
|
+ 0x10004b10, /* 014C(:1015): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000009, /* 0150(:1016): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x080cf89f, /* 0154(:1016): DRD2B1: idx0 = EU3(); EU3(idx2) */
|
|
+ 0x6000000c, /* 0158(:1017): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
|
|
+ 0x024cf89f, /* 015C(:1017): DRD2B1: var9 = EU3(); EU3(idx2) */
|
|
+ 0x000001f8, /* 0160(:0): NOP */
|
|
+ 0x8a18801b, /* 0164(:1023): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
|
|
+ 0x7000000d, /* 0168(:1024): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x084cf2df, /* 016C(:1024): DRD2B1: idx1 = EU3(); EU3(var11) */
|
|
+ 0xd899053f, /* 0170(:1025): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
|
|
+ 0x8019801b, /* 0174(:1025): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
|
|
+ 0x040001f8, /* 0178(:1026): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 017C(:0): NOP */
|
|
+ 0x000001f8, /* 0180(:0): NOP */
|
|
+};
|
|
+u32 MCD_SingleEu_TDT[]=
|
|
+{
|
|
+ 0x8318001b, /* 0000(:1204): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
|
|
+ 0x7000000c, /* 0004(:1205): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x080cf81f, /* 0008(:1205): DRD2B1: idx0 = EU3(); EU3(idx0) */
|
|
+ 0x8318801b, /* 000C(:1206): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
|
|
+ 0x6000000d, /* 0010(:1207): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
|
|
+ 0x084cf85f, /* 0014(:1207): DRD2B1: idx1 = EU3(); EU3(idx1) */
|
|
+ 0x000001f8, /* 0018(:0): NOP */
|
|
+ 0x8498001b, /* 001C(:1211): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
|
|
+ 0x7000000c, /* 0020(:1212): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x020cf81f, /* 0024(:1212): DRD2B1: var8 = EU3(); EU3(idx0) */
|
|
+ 0x6000000d, /* 0028(:1213): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
|
|
+ 0x028cf81f, /* 002C(:1213): DRD2B1: var10 = EU3(); EU3(idx0) */
|
|
+ 0xc404601b, /* 0030(:1216): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
|
|
+ 0xc00423dc, /* 0034(:1216): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
|
|
+ 0x809a601b, /* 0038(:1217): LCD: idx4 = var1; ; idx4 += inc3 */
|
|
+ 0xc207a182, /* 003C(:1220): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x869be009, /* 0040(:1220): LCD: idx7 = var13; ; idx7 += inc1 */
|
|
+ 0x63fe0000, /* 0044(:1223): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
|
|
+ 0x0d4cfddf, /* 0048(:1223): DRD2B1: *idx5 = EU3(); EU3(*idx7) */
|
|
+ 0xda9b001b, /* 004C(:1225): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 0050(:1225): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x70000006, /* 0054(:1227): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 0058(:1227): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb28, /* 005C(:1228): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 0060(:1229): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 0064(:1229): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb30, /* 0068(:1230): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 006C(:1231): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 0070(:1231): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x0000cb38, /* 0074(:1232): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 0078(:0): NOP */
|
|
+ 0xc404601b, /* 007C(:1236): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
|
|
+ 0xc004245c, /* 0080(:1236): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
|
|
+ 0x809a601b, /* 0084(:1237): LCD: idx4 = var1; ; idx4 += inc3 */
|
|
+ 0xda9b001b, /* 0088(:1240): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 008C(:1240): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x0000d3a0, /* 0090(:1241): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc207a182, /* 0094(:1243): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
|
|
+ 0x869be009, /* 0098(:1243): LCD: idx7 = var13; ; idx7 += inc1 */
|
|
+ 0x6bfe0000, /* 009C(:1246): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
|
|
+ 0x0d4cfddf, /* 00A0(:1246): DRD2B1: *idx5 = EU3(); EU3(*idx7) */
|
|
+ 0xda9b001b, /* 00A4(:1248): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
|
|
+ 0x9b9be01b, /* 00A8(:1248): LCD: idx7 = idx7; ; idx7 += inc3 */
|
|
+ 0x70000006, /* 00AC(:1250): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00B0(:1250): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb28, /* 00B4(:1251): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00B8(:1252): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00BC(:1252): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x1000cb30, /* 00C0(:1253): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x70000006, /* 00C4(:1254): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x088cf890, /* 00C8(:1254): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */
|
|
+ 0x0000cb38, /* 00CC(:1255): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 00D0(:0): NOP */
|
|
+ 0xc51803ed, /* 00D4(:1259): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
|
|
+ 0x8018801b, /* 00D8(:1259): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
|
|
+ 0x040001f8, /* 00DC(:1260): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+};
|
|
+#endif
|
|
+u32 MCD_ENetRcv_TDT[]=
|
|
+{
|
|
+ 0x80004000, /* 0000(:1334): LCDEXT: idx0 = 0x00000000; ; */
|
|
+ 0x82188000, /* 0004(:1334): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
|
|
+ 0x10000788, /* 0008(:1335): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000009, /* 000C(:1336): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf05f, /* 0010(:1336): DRD2B1: idx0 = EU3(); EU3(var1) */
|
|
+ 0x98180249, /* 0014(:1339): LCD: idx0 = idx0; idx0 != var9; idx0 += inc1 */
|
|
+ 0x82448004, /* 0018(:1341): LCD: idx1 = var4 + var9 + 4; idx1 once var0; idx1 += inc0 */
|
|
+ 0x7000000d, /* 001C(:1342): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x014cf05f, /* 0020(:1342): DRD2B1: var5 = EU3(); EU3(var1) */
|
|
+ 0x7000000b, /* 0024(:1343): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x020cf05f, /* 0028(:1343): DRD2B1: var8 = EU3(); EU3(var1) */
|
|
+ 0x70000004, /* 002C(:1344): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x018cf04a, /* 0030(:1344): DRD2B1: var6 = EU3(); EU3(var1,var10) */
|
|
+ 0x70000004, /* 0034(:1345): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x004cf04b, /* 0038(:1345): DRD2B1: var1 = EU3(); EU3(var1,var11) */
|
|
+ 0x00000b88, /* 003C(:1348): DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc4838190, /* 0040(:1351): LCDEXT: idx1 = var9, idx2 = var7; idx1 < var6; idx1 += inc2, idx2 += inc0 */
|
|
+ 0x8119e012, /* 0044(:1351): LCD: idx3 = var2; ; idx3 += inc2 */
|
|
+ 0x03e0cf90, /* 0048(:1354): DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */
|
|
+ 0x81188000, /* 004C(:1357): LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */
|
|
+ 0x000ac788, /* 0050(:1358): DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */
|
|
+ 0xc4838000, /* 0054(:1360): LCDEXT: idx1 = var9, idx2 = var7; idx1 once var0; idx1 += inc0, idx2 += inc0 */
|
|
+ 0x8219e000, /* 0058(:1360): LCD: idx3 = var4; ; idx3 += inc0 */
|
|
+ 0x70000004, /* 005C(:1368): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x084cfc8c, /* 0060(:1368): DRD2B1: idx1 = EU3(); EU3(*idx2,var12) */
|
|
+ 0x60000005, /* 0064(:1371): DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
|
|
+ 0x0cccf841, /* 0068(:1371): DRD2B1: *idx3 = EU3(); EU3(idx1,var1) */
|
|
+ 0x82468000, /* 006C(:1377): LCD: idx1 = var4 + var13; idx1 once var0; idx1 += inc0 */
|
|
+ 0xc419025b, /* 0070(:1379): LCDEXT: idx2 = var8; idx2 > var9; idx2 += inc3 */
|
|
+ 0x80198000, /* 0074(:1379): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
|
|
+ 0x00008400, /* 0078(:1380): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x00001308, /* 007C(:1381): DRD1A: var4 = idx1; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x82188000, /* 0080(:1384): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
|
|
+ 0x10000788, /* 0084(:1385): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000009, /* 0088(:1386): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf05f, /* 008C(:1386): DRD2B1: idx0 = EU3(); EU3(var1) */
|
|
+ 0xc2988249, /* 0090(:1389): LCDEXT: idx1 = var5; idx1 != var9; idx1 += inc1 */
|
|
+ 0x80190000, /* 0094(:1389): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
|
|
+ 0x040001f8, /* 0098(:1390): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 009C(:0): NOP */
|
|
+};
|
|
+u32 MCD_ENetXmit_TDT[]=
|
|
+{
|
|
+ 0x80004000, /* 0000(:1465): LCDEXT: idx0 = 0x00000000; ; */
|
|
+ 0x81988000, /* 0004(:1465): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
|
|
+ 0x10000788, /* 0008(:1466): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000009, /* 000C(:1467): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf05f, /* 0010(:1467): DRD2B1: idx0 = EU3(); EU3(var1) */
|
|
+ 0x98180309, /* 0014(:1470): LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */
|
|
+ 0x80004003, /* 0018(:1472): LCDEXT: idx1 = 0x00000003; ; */
|
|
+ 0x81c60004, /* 001C(:1472): LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */
|
|
+ 0x7000000d, /* 0020(:1473): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x014cf05f, /* 0024(:1473): DRD2B1: var5 = EU3(); EU3(var1) */
|
|
+ 0x7000000b, /* 0028(:1474): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x028cf05f, /* 002C(:1474): DRD2B1: var10 = EU3(); EU3(var1) */
|
|
+ 0x7000000c, /* 0030(:1475): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x018cf05f, /* 0034(:1475): DRD2B1: var6 = EU3(); EU3(var1) */
|
|
+ 0x70000004, /* 0038(:1476): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
|
|
+ 0x01ccf04d, /* 003C(:1476): DRD2B1: var7 = EU3(); EU3(var1,var13) */
|
|
+ 0x10000b90, /* 0040(:1477): DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000004, /* 0044(:1478): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */
|
|
+ 0x020cf0a1, /* 0048(:1478): DRD2B1: var8 = EU3(); EU3(var2,idx1) */
|
|
+ 0xc3188312, /* 004C(:1481): LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */
|
|
+ 0x83c70000, /* 0050(:1481): LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */
|
|
+ 0x00001f10, /* 0054(:1482): DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0xc583a3c3, /* 0058(:1484): LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */
|
|
+ 0x81042325, /* 005C(:1484): LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */
|
|
+ 0x03e0c798, /* 0060(:1489): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */
|
|
+ 0xd8990000, /* 0064(:1492): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
|
|
+ 0x9999e000, /* 0068(:1492): LCD: idx3 = idx3; ; idx3 += inc0 */
|
|
+ 0x000acf98, /* 006C(:1493): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
|
|
+ 0xd8992306, /* 0070(:1495): LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */
|
|
+ 0x9999e03f, /* 0074(:1495): LCD: idx3 = idx3; ; idx3 += inc7 */
|
|
+ 0x03eac798, /* 0078(:1498): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */
|
|
+ 0xd8990000, /* 007C(:1501): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
|
|
+ 0x9999e000, /* 0080(:1501): LCD: idx3 = idx3; ; idx3 += inc0 */
|
|
+ 0x000acf98, /* 0084(:1502): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
|
|
+ 0xd8990000, /* 0088(:1504): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
|
|
+ 0x99832302, /* 008C(:1504): LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */
|
|
+ 0x0beac798, /* 0090(:1507): DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */
|
|
+ 0x81988000, /* 0094(:1509): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
|
|
+ 0x6000000a, /* 0098(:1510): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
|
|
+ 0x0c4cfc5f, /* 009C(:1510): DRD2B1: *idx1 = EU3(); EU3(*idx1) */
|
|
+ 0x81c80000, /* 00A0(:1512): LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */
|
|
+ 0xc5190312, /* 00A4(:1514): LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */
|
|
+ 0x80198000, /* 00A8(:1514): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
|
|
+ 0x00008400, /* 00AC(:1515): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x00000f08, /* 00B0(:1516): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
|
|
+ 0x81988000, /* 00B4(:1519): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
|
|
+ 0x10000788, /* 00B8(:1520): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
|
|
+ 0x60000009, /* 00BC(:1521): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
|
|
+ 0x080cf05f, /* 00C0(:1521): DRD2B1: idx0 = EU3(); EU3(var1) */
|
|
+ 0xc2988309, /* 00C4(:1524): LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */
|
|
+ 0x80190000, /* 00C8(:1524): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
|
|
+ 0x040001f8, /* 00CC(:1525): DRD1A: FN=0 INT init=0 WS=0 RS=0 */
|
|
+ 0x000001f8, /* 00D0(:0): NOP */
|
|
+};
|
|
+
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_tasksInit.c
|
|
@@ -0,0 +1,284 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+/*
|
|
+ * Do not edit!
|
|
+ */
|
|
+ /*
|
|
+ * File: MCD_tasksInit.c
|
|
+ * Purpose: Function for initialize variable tables of different
|
|
+ * types of tasks.
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ *
|
|
+ * Modifications:
|
|
+ *
|
|
+ *
|
|
+ */
|
|
+
|
|
+#include <asm/MCD_dma.h>
|
|
+
|
|
+extern dmaRegs *MCD_dmaBar;
|
|
+
|
|
+/*
|
|
+ * Task 0
|
|
+ */
|
|
+
|
|
+void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */
|
|
+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */
|
|
+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */
|
|
+ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */
|
|
+ MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */
|
|
+ MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */
|
|
+ MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */
|
|
+ MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */
|
|
+ MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */
|
|
+
|
|
+ /* Set the task's Enable bit in its Task Control Register */
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+
|
|
+
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 1
|
|
+ */
|
|
+
|
|
+void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */
|
|
+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */
|
|
+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */
|
|
+ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */
|
|
+
|
|
+
|
|
+ /* enable the task */
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 2
|
|
+ */
|
|
+
|
|
+void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */
|
|
+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */
|
|
+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */
|
|
+ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */
|
|
+ MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */
|
|
+ MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */
|
|
+ MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */
|
|
+ MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */
|
|
+ MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */
|
|
+
|
|
+ /*enable the task*/
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 3
|
|
+ */
|
|
+
|
|
+void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */
|
|
+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */
|
|
+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */
|
|
+ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */
|
|
+
|
|
+ /*enable the task*/
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 4
|
|
+ */
|
|
+
|
|
+void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)currBD); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)rcvFifoPtr); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x0000ffff); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x30000000); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x0fffffff); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000008); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000); /* inc[3] */
|
|
+ /*enable the task*/
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 5
|
|
+ */
|
|
+
|
|
+void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel)
|
|
+{
|
|
+
|
|
+ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr); /* var[11] */
|
|
+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
|
|
+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
|
|
+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
|
|
+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */
|
|
+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */
|
|
+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff); /* var[13] */
|
|
+ MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff); /* var[14] */
|
|
+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */
|
|
+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008); /* var[16] */
|
|
+ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */
|
|
+ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */
|
|
+ MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000); /* inc[2] */
|
|
+ MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc); /* inc[3] */
|
|
+ MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004); /* inc[4] */
|
|
+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */
|
|
+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff); /* inc[6] */
|
|
+ MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001); /* inc[7] */
|
|
+
|
|
+ /*enable the task*/
|
|
+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
|
|
+
|
|
+}
|
|
--- /dev/null
|
|
+++ b/drivers/dma/MCD_tasksInit.h
|
|
@@ -0,0 +1,73 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+#ifndef MCD_TSK_INIT_H
|
|
+#define MCD_TSK_INIT_H 1
|
|
+
|
|
+/*
|
|
+ * Do not edit!
|
|
+ */
|
|
+
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 0
|
|
+ */
|
|
+void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 1
|
|
+ */
|
|
+void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 2
|
|
+ */
|
|
+void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 3
|
|
+ */
|
|
+void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 4
|
|
+ */
|
|
+void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+
|
|
+/*
|
|
+ * Task 5
|
|
+ */
|
|
+void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel);
|
|
+
|
|
+#endif /* MCD_TSK_INIT_H */
|
|
--- a/drivers/dma/Makefile
|
|
+++ b/drivers/dma/Makefile
|
|
@@ -4,3 +4,5 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
|
|
ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o
|
|
obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
|
|
obj-$(CONFIG_FSL_DMA) += fsldma.o
|
|
+obj-$(CONFIG_MCD_DMA) += mcddma.o
|
|
+mcddma-objs := MCD_dmaApi.o MCD_tasks.o MCD_tasksInit.o
|
|
--- a/drivers/net/Kconfig
|
|
+++ b/drivers/net/Kconfig
|
|
@@ -351,6 +351,8 @@ config MACB
|
|
|
|
source "drivers/net/arm/Kconfig"
|
|
|
|
+source "drivers/net/fec/Kconfig"
|
|
+
|
|
config AX88796
|
|
tristate "ASIX AX88796 NE2000 clone support"
|
|
depends on ARM || MIPS || SUPERH
|
|
--- a/drivers/net/Makefile
|
|
+++ b/drivers/net/Makefile
|
|
@@ -226,6 +226,8 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o
|
|
|
|
obj-$(CONFIG_MACB) += macb.o
|
|
|
|
+obj-$(CONFIG_FEC_548x) += fec/
|
|
+
|
|
obj-$(CONFIG_ARM) += arm/
|
|
obj-$(CONFIG_DEV_APPLETALK) += appletalk/
|
|
obj-$(CONFIG_TR) += tokenring/
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/Kconfig
|
|
@@ -0,0 +1,25 @@
|
|
+config FEC_548x
|
|
+ tristate "MCF547x/MCF548x Fast Ethernet Controller support"
|
|
+ depends on M547X_8X
|
|
+ help
|
|
+ The MCF547x and MCF548x have a built-in Fast Ethernet Controller.
|
|
+ Saying Y here will include support for this device in the kernel.
|
|
+
|
|
+ To compile this driver as a module, choose M here: the module
|
|
+ will be called fecm.
|
|
+
|
|
+config FEC_548x_AUTO_NEGOTIATION
|
|
+ bool "Enable Auto-Negotiation"
|
|
+ depends on FEC_548x
|
|
+ help
|
|
+ This option enables the FEC to automatically detect the
|
|
+ half/full duplex mode and the network speed at initialization
|
|
+ If you want this, say Y.
|
|
+
|
|
+config FEC_548x_ENABLE_FEC2
|
|
+ bool "Enable the second FEC"
|
|
+ depends on FEC_548x
|
|
+ help
|
|
+ This enables the second FEC on the 547x/548x. If you want to use
|
|
+ it, say Y.
|
|
+
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/Makefile
|
|
@@ -0,0 +1,7 @@
|
|
+#
|
|
+# Makefile for the FEC ethernet driver
|
|
+#
|
|
+
|
|
+obj-$(CONFIG_FEC_548x) += fecm.o
|
|
+
|
|
+fecm-objs := fec.o ks8721.o
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/fec.c
|
|
@@ -0,0 +1,1375 @@
|
|
+/*
|
|
+ * Performance and stability improvements: (C) Copyright 2008,
|
|
+ * Daniel Krueger, SYSTEC electronic GmbH
|
|
+ *
|
|
+ * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming
|
|
+ * soon -- Kurt Mahan
|
|
+ *
|
|
+ */
|
|
+#include <linux/module.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/ptrace.h>
|
|
+#include <linux/errno.h>
|
|
+#include <linux/ioport.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/pci.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/netdevice.h>
|
|
+#include <linux/etherdevice.h>
|
|
+#include <linux/skbuff.h>
|
|
+#include <linux/spinlock.h>
|
|
+#include <linux/workqueue.h>
|
|
+#include <linux/bitops.h>
|
|
+
|
|
+#include <asm/coldfire.h>
|
|
+#include <asm/mcfsim.h>
|
|
+
|
|
+#include <asm/dma.h>
|
|
+#include <asm/MCD_dma.h>
|
|
+#include <asm/m5485sram.h>
|
|
+#include <asm/virtconvert.h>
|
|
+#include <asm/irq.h>
|
|
+
|
|
+#include "fec.h"
|
|
+#include "ks8721.h"
|
|
+
|
|
+#ifdef CONFIG_FEC_548x_ENABLE_FEC2
|
|
+#define FEC_MAX_PORTS 2
|
|
+#define FEC_2
|
|
+#else
|
|
+#define FEC_MAX_PORTS 1
|
|
+#undef FEC_2
|
|
+#endif
|
|
+
|
|
+#define VERSION "0.13"
|
|
+MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION);
|
|
+
|
|
+// Private structure
|
|
+struct fec_priv {
|
|
+ struct net_device *netdev; /* owning net device */
|
|
+ void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; //Array of transmission buffers
|
|
+ MCD_bufDescFec *fecpriv_txdesc; // Array of transmission descriptors
|
|
+ volatile unsigned int fecpriv_current_tx; // Inex of the transmission descriptor that is used by DMA
|
|
+ volatile unsigned int fecpriv_next_tx; // Inex of the transmission descriptor that can be used for new data
|
|
+ unsigned int fecpriv_current_rx; // Index of the reception descriptor that is used by DMA
|
|
+ MCD_bufDescFec *fecpriv_rxdesc; // Array of reception descriptors
|
|
+// unsigned char *fecpriv_rxbuf; // Address of reception buffers
|
|
+ struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; // Array of reception skb structure pointers
|
|
+ unsigned int fecpriv_initiator_rx; // Reception DMA initiator
|
|
+ unsigned int fecpriv_initiator_tx; // Transmission DMA initiator
|
|
+ int fecpriv_fec_rx_channel; // DMA reception channel
|
|
+ int fecpriv_fec_tx_channel; // DMA transmission channel
|
|
+ int fecpriv_rx_requestor; // DMA reception requestor
|
|
+ int fecpriv_tx_requestor; // DMA transmission requestor
|
|
+ void *fecpriv_interrupt_fec_rx_handler; // DMA reception handler
|
|
+ void *fecpriv_interrupt_fec_tx_handler; // DMA transmission handler
|
|
+ unsigned char *fecpriv_mac_addr; // Private copy of FEC address
|
|
+ struct net_device_stats fecpriv_stat; // Pointer to the statistical information
|
|
+ spinlock_t fecpriv_lock;
|
|
+ int fecpriv_rxflag;
|
|
+ struct tasklet_struct fecpriv_tasklet_reinit;
|
|
+ int index;
|
|
+};
|
|
+
|
|
+struct net_device *fec_dev[FEC_MAX_PORTS];
|
|
+
|
|
+// FEC functions
|
|
+int __init fec_init(void);
|
|
+struct net_device_stats *fec_get_stat(struct net_device *dev);
|
|
+
|
|
+int fec_open(struct net_device *dev);
|
|
+int fec_close(struct net_device *nd);
|
|
+int fec_tx(struct sk_buff *skb, struct net_device *dev);
|
|
+void fec_set_multicast_list(struct net_device *nd);
|
|
+int fec_set_mac_address(struct net_device *dev, void *p);
|
|
+void fec_tx_timeout(struct net_device *dev);
|
|
+void fec_interrupt_fec_tx_handler(struct net_device *dev);
|
|
+void fec_interrupt_fec_rx_handler(struct net_device *dev);
|
|
+irqreturn_t fec_interrupt_handler(int irq, void *dev_id);
|
|
+void fec_interrupt_fec_tx_handler_fec0(void);
|
|
+void fec_interrupt_fec_rx_handler_fec0(void);
|
|
+void fec_interrupt_fec_reinit(unsigned long data);
|
|
+
|
|
+unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 }; // Default address of FEC0
|
|
+
|
|
+#ifdef FEC_2
|
|
+unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; // Default address of FEC1
|
|
+#endif
|
|
+
|
|
+#ifndef MODULE
|
|
+int fec_str_to_mac( char *str_mac, unsigned char* addr);
|
|
+int __init fec_mac_setup0 (char *s);
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifdef FEC_2
|
|
+void fec_interrupt_fec_tx_handler_fec1(void);
|
|
+void fec_interrupt_fec_rx_handler_fec1(void);
|
|
+
|
|
+#ifndef MODULE
|
|
+int __init fec_mac_setup1 (char *s);
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data);
|
|
+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data);
|
|
+
|
|
+module_init(fec_init);
|
|
+/* module_exit(fec_cleanup); */
|
|
+__setup("mac0=", fec_mac_setup0);
|
|
+
|
|
+#ifdef FEC_2
|
|
+__setup("mac1=", fec_mac_setup1);
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Initialize a FEC device
|
|
+ */
|
|
+int fec_enet_init(struct net_device *dev)
|
|
+{
|
|
+ static int index = 0;
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ int i;
|
|
+
|
|
+ fp->index = index;
|
|
+ fp->netdev = dev;
|
|
+ fec_dev[ index ] = dev;
|
|
+printk(KERN_INFO "FEI: index=%d\n", index);
|
|
+
|
|
+ if (index == 0) {
|
|
+ /* disable fec0 */
|
|
+ FEC_ECR(FEC_BASE_ADDR_FEC0) = FEC_ECR_DISABLE;
|
|
+
|
|
+ /* setup the interrupt handler */
|
|
+ dev->irq = 64 + ISC_FEC0;
|
|
+
|
|
+ if (request_irq(dev->irq, fec_interrupt_handler,
|
|
+ IRQF_DISABLED, "ColdFire FEC 0", dev)) {
|
|
+ dev->irq = 0;
|
|
+ printk("Cannot allocate FEC0 IRQ\n");
|
|
+ } else {
|
|
+ /* interrupt priority and level */
|
|
+ MCF_ICR(ISC_FEC0) = ILP_FEC0;
|
|
+ }
|
|
+
|
|
+ /* fec base address */
|
|
+ dev->base_addr = FEC_BASE_ADDR_FEC0;
|
|
+
|
|
+ /* requestor numbers */
|
|
+ fp->fecpriv_rx_requestor = DMA_FEC0_RX;
|
|
+ fp->fecpriv_tx_requestor = DMA_FEC0_TX;
|
|
+
|
|
+ /* fec0 handlers */
|
|
+ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec0;
|
|
+ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec0;
|
|
+
|
|
+ /* tx descriptors */
|
|
+ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC0;
|
|
+
|
|
+ /* rx descriptors */
|
|
+ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0;
|
|
+
|
|
+printk(KERN_INFO "FEI: txdesc=0x%p rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc);
|
|
+
|
|
+ /* mac addr */
|
|
+ fp->fecpriv_mac_addr = fec_mac_addr_fec0;
|
|
+ }
|
|
+ else {
|
|
+ /* disable fec1 */
|
|
+ FEC_ECR(FEC_BASE_ADDR_FEC1) = FEC_ECR_DISABLE;
|
|
+#ifdef FEC_2
|
|
+ /* setup the interrupt handler */
|
|
+ dev->irq = 64 + ISC_FEC1;
|
|
+
|
|
+ if (request_irq(dev->irq, fec_interrupt_handler,
|
|
+ IRQF_DISABLED, "ColdFire FEC 1", dev)) {
|
|
+ dev->irq = 0;
|
|
+ printk("Cannot allocate FEC1 IRQ\n");
|
|
+ } else {
|
|
+ /* interrupt priority and level */
|
|
+ MCF_ICR(ISC_FEC1) = ILP_FEC1;
|
|
+ }
|
|
+
|
|
+ /* fec base address */
|
|
+ dev->base_addr = FEC_BASE_ADDR_FEC1;
|
|
+
|
|
+ /* requestor numbers */
|
|
+ fp->fecpriv_rx_requestor = DMA_FEC1_RX;
|
|
+ fp->fecpriv_tx_requestor = DMA_FEC1_TX;
|
|
+
|
|
+ /* fec1 handlers */
|
|
+ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec1;
|
|
+ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec1;
|
|
+
|
|
+ /* tx descriptors */
|
|
+ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC1;
|
|
+
|
|
+ /* rx descriptors */
|
|
+ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1;
|
|
+
|
|
+ /* mac addr */
|
|
+ fp->fecpriv_mac_addr = fec_mac_addr_fec1;
|
|
+#endif
|
|
+ }
|
|
+
|
|
+printk(KERN_INFO "FEI: index=%d base_addr=0x%lx\n", index, dev->base_addr);
|
|
+
|
|
+ /* clear MIB */
|
|
+ memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN);
|
|
+
|
|
+ /* clear the statistics structure */
|
|
+ memset((void *) &(fp->fecpriv_stat), 0,
|
|
+ sizeof(struct net_device_stats));
|
|
+
|
|
+ /* grab the FEC initiators */
|
|
+ dma_set_initiator(fp->fecpriv_tx_requestor);
|
|
+ fp->fecpriv_initiator_tx = dma_get_initiator(fp->fecpriv_tx_requestor);
|
|
+ dma_set_initiator(fp->fecpriv_rx_requestor);
|
|
+ fp->fecpriv_initiator_rx = dma_get_initiator(fp->fecpriv_rx_requestor);
|
|
+
|
|
+ /* reset the DMA channels */
|
|
+ fp->fecpriv_fec_rx_channel = -1;
|
|
+ fp->fecpriv_fec_tx_channel = -1;
|
|
+
|
|
+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
|
|
+ fp->askb_rx[i] = NULL;
|
|
+
|
|
+ /* initialize the pointers to the socket buffers */
|
|
+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
|
|
+ fp->fecpriv_txbuf[i] = NULL;
|
|
+
|
|
+ ether_setup(dev);
|
|
+
|
|
+ dev->open = fec_open;
|
|
+ dev->stop = fec_close;
|
|
+ dev->hard_start_xmit = fec_tx;
|
|
+ dev->get_stats = fec_get_stat;
|
|
+ dev->set_multicast_list = fec_set_multicast_list;
|
|
+ dev->set_mac_address = fec_set_mac_address;
|
|
+ dev->tx_timeout = fec_tx_timeout;
|
|
+ dev->watchdog_timeo = FEC_TX_TIMEOUT * HZ;
|
|
+
|
|
+ memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
|
|
+
|
|
+ spin_lock_init(&fp->fecpriv_lock);
|
|
+
|
|
+ // Initialize FEC/I2C/IRQ Pin Assignment Register
|
|
+ FEC_GPIO_PAR_FECI2CIRQ &= 0xF;
|
|
+ FEC_GPIO_PAR_FECI2CIRQ |= FEC_FECI2CIRQ;
|
|
+
|
|
+ index++;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Module Initialization
|
|
+ */
|
|
+int __init fec_init(void)
|
|
+{
|
|
+ struct net_device *dev;
|
|
+ int i;
|
|
+ int err;
|
|
+ DECLARE_MAC_BUF(mac);
|
|
+
|
|
+ printk(KERN_INFO "FEC ENET (DMA) Version .00\n");
|
|
+
|
|
+
|
|
+ for (i = 0; i < FEC_MAX_PORTS; i++) {
|
|
+ dev = alloc_etherdev(sizeof(struct fec_priv));
|
|
+ if (!dev)
|
|
+ return -ENOMEM;
|
|
+ err = fec_enet_init(dev);
|
|
+ if (err) {
|
|
+ free_netdev(dev);
|
|
+ continue;
|
|
+ }
|
|
+ if (register_netdev(dev) != 0) {
|
|
+ free_netdev(dev);
|
|
+ return -EIO;
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "%s: ethernet %s\n",
|
|
+ dev->name, print_mac(mac, dev->dev_addr));
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Stop a device
|
|
+ */
|
|
+void fec_stop(struct net_device *dev)
|
|
+{
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+ dma_remove_initiator(fp->fecpriv_initiator_tx);
|
|
+ dma_remove_initiator(fp->fecpriv_initiator_rx);
|
|
+
|
|
+ if (dev->irq)
|
|
+ free_irq(dev->irq, dev);
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_open
|
|
+*
|
|
+* DESCRIPTION: This function performs the initialization of
|
|
+* of FEC and corresponding KS8721 transiver
|
|
+*
|
|
+* RETURNS: If no error occurs, this function returns zero.
|
|
+*************************************************************************/
|
|
+
|
|
+int fec_open(struct net_device *dev)
|
|
+{
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+ int fduplex;
|
|
+ int i;
|
|
+ int channel;
|
|
+ int error_code = -EBUSY;
|
|
+
|
|
+printk(KERN_INFO "FECOPEN: index=%d\n", fp->index);
|
|
+
|
|
+ //Receive the DMA channels
|
|
+ channel = dma_set_channel_fec(fp->fecpriv_rx_requestor);
|
|
+
|
|
+ if (channel == -1)
|
|
+ {
|
|
+ printk("Dma channel cannot be reserved\n");
|
|
+ goto ERRORS;
|
|
+ }
|
|
+
|
|
+ fp->fecpriv_fec_rx_channel = channel;
|
|
+
|
|
+ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_rx_handler);
|
|
+
|
|
+ channel = dma_set_channel_fec(fp->fecpriv_tx_requestor);
|
|
+
|
|
+ if (channel == -1)
|
|
+ {
|
|
+ printk("Dma channel cannot be reserved\n");
|
|
+ goto ERRORS;
|
|
+ }
|
|
+printk(KERN_INFO "FECOPEN2\n");
|
|
+
|
|
+ fp->fecpriv_fec_tx_channel = channel;
|
|
+
|
|
+ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler);
|
|
+
|
|
+ // init tasklet for controller reinitialization
|
|
+ tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev);
|
|
+printk(KERN_INFO "FECOPEN3\n");
|
|
+
|
|
+ // Reset FIFOs
|
|
+ FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL;
|
|
+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
|
|
+
|
|
+ // Reset and disable FEC
|
|
+ FEC_ECR(base_addr) = FEC_ECR_RESET;
|
|
+
|
|
+ // Wait
|
|
+ udelay(10);
|
|
+
|
|
+ // Clear all events
|
|
+ FEC_EIR(base_addr) = FEC_EIR_CLEAR;
|
|
+
|
|
+ // Reset FIFO status
|
|
+ FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK;
|
|
+ FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK;
|
|
+
|
|
+#if 0
|
|
+/* JKM -- move into HW init */
|
|
+ // Copy the default address to the device structure
|
|
+ memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
|
|
+#endif
|
|
+
|
|
+ // Set the default address
|
|
+ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
|
|
+ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
|
|
+
|
|
+ // Reset the group address descriptor
|
|
+ FEC_GALR(base_addr) = 0x00000000;
|
|
+ FEC_GAUR(base_addr) = 0x00000000;
|
|
+
|
|
+ // Reset the individual address descriptor
|
|
+ FEC_IALR(base_addr) = 0x00000000;
|
|
+ FEC_IAUR(base_addr) = 0x00000000;
|
|
+
|
|
+ // Set the receive control register
|
|
+ FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII;
|
|
+
|
|
+ // Set the receive FIFO control register
|
|
+// FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK;
|
|
+ FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR
|
|
+ | (FEC_FECRFCR_MSK // disable all but ...
|
|
+ & ~FEC_FECRFCR_FAE // enable frame accept error
|
|
+ & ~FEC_FECRFCR_RXW // enable receive wait condition
|
|
+// & ~FEC_FECRFCR_UF // enable FIFO underflow
|
|
+ );
|
|
+
|
|
+ //Set the receive FIFO alarm register
|
|
+ FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM;
|
|
+
|
|
+ // Set the transmit FIFO control register
|
|
+// FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK;
|
|
+ FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR
|
|
+ | (FEC_FECTFCR_MSK // disable all but ...
|
|
+ & ~FEC_FECTFCR_FAE // enable frame accept error
|
|
+// & ~FEC_FECTFCR_TXW // enable transmit wait condition
|
|
+// & ~FEC_FECTFCR_UF // enable FIFO underflow
|
|
+ & ~FEC_FECTFCR_OF); // enable FIFO overflow
|
|
+
|
|
+ //Set the transmit FIFO alarm register
|
|
+ FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM;
|
|
+
|
|
+ // Set the Tx FIFO watermark
|
|
+ FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK;
|
|
+
|
|
+ // Enable the transmitter to append the CRC
|
|
+ FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC;
|
|
+
|
|
+ // Enable the ethernet interrupts
|
|
+// FEC_EIMR(base_addr) = FEC_EIMR_MASK;
|
|
+ FEC_EIMR(base_addr) = FEC_EIMR_DISABLE
|
|
+ | FEC_EIR_LC
|
|
+ | FEC_EIR_RL
|
|
+ | FEC_EIR_HBERR
|
|
+ | FEC_EIR_XFUN
|
|
+ | FEC_EIR_XFERR
|
|
+ | FEC_EIR_RFERR
|
|
+ ;
|
|
+printk(KERN_INFO "FECOPEN4\n");
|
|
+
|
|
+#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION
|
|
+ if ((error_code = init_transceiver(base_addr, &fduplex)) != 0)
|
|
+ {
|
|
+ printk("Initialization of the transceiver is failed\n");
|
|
+ goto ERRORS;
|
|
+ }
|
|
+#else
|
|
+ fduplex = 1;
|
|
+#endif
|
|
+printk(KERN_INFO "FECOPEN5\n");
|
|
+
|
|
+ if (fduplex)
|
|
+ // Enable the full duplex mode
|
|
+ FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC;
|
|
+ else
|
|
+ // Disable reception of frames while transmitting
|
|
+ FEC_RCR(base_addr) |= FEC_RCR_DRT;
|
|
+
|
|
+ // Enable MIB
|
|
+ FEC_MIBC(base_addr) = FEC_MIBC_ENABLE;
|
|
+
|
|
+ // Enable FEC
|
|
+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
|
|
+
|
|
+ // Initialize transmission descriptors and start DMA for the transmission
|
|
+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
|
|
+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
|
|
+printk(KERN_INFO "FECOPEN6\n");
|
|
+
|
|
+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
|
|
+
|
|
+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
|
|
+
|
|
+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
|
|
+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
|
|
+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
|
|
+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
|
|
+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
|
|
+
|
|
+ // Initialize reception descriptors and start DMA for the reception
|
|
+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
|
|
+ {
|
|
+ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA);
|
|
+ if (!fp->askb_rx[i])
|
|
+ {
|
|
+ fp->fecpriv_rxdesc[i].dataPointer = 0;
|
|
+ fp->fecpriv_rxdesc[i].statCtrl = 0;
|
|
+ fp->fecpriv_rxdesc[i].length = 0;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ skb_reserve(fp->askb_rx[i], 16);
|
|
+ fp->askb_rx[i]->dev = dev;
|
|
+ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
|
|
+ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
|
|
+ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
|
|
+ }
|
|
+ }
|
|
+printk(KERN_INFO "FECOPEN7\n");
|
|
+
|
|
+ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
|
|
+ fp->fecpriv_current_rx = 0;
|
|
+
|
|
+ // flush entire data cache before restarting the DMA
|
|
+#if 0
|
|
+/* JKM -- currently running with cache turned off */
|
|
+ DcacheFlushInvalidate();
|
|
+#endif
|
|
+
|
|
+ MCD_startDma(fp->fecpriv_fec_rx_channel, (char *) fp->fecpriv_rxdesc, 0,
|
|
+ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
|
|
+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
|
|
+ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
|
|
+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
|
|
+
|
|
+ netif_start_queue(dev);
|
|
+
|
|
+// MOD_INC_USE_COUNT;
|
|
+printk(KERN_INFO "FECOPEN: finished\n");
|
|
+
|
|
+ return 0;
|
|
+
|
|
+ERRORS:
|
|
+
|
|
+ // Remove the channels and return with the error code
|
|
+ if (fp->fecpriv_fec_rx_channel != -1)
|
|
+ {
|
|
+ dma_disconnect(fp->fecpriv_fec_rx_channel);
|
|
+ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
|
|
+ fp->fecpriv_fec_rx_channel = -1;
|
|
+ }
|
|
+
|
|
+ if (fp->fecpriv_fec_tx_channel != -1)
|
|
+ {
|
|
+ dma_disconnect(fp->fecpriv_fec_tx_channel);
|
|
+ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
|
|
+ fp->fecpriv_fec_tx_channel = -1;
|
|
+ }
|
|
+
|
|
+ return error_code;
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_close
|
|
+*
|
|
+* DESCRIPTION: This function performs the graceful stop of the
|
|
+* transmission and disables FEC
|
|
+*
|
|
+* RETURNS: This function always returns zero.
|
|
+*************************************************************************/
|
|
+int fec_close(struct net_device *dev)
|
|
+{
|
|
+ //Receive the pointer to the private structure
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+ // Receive the base address
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+
|
|
+ unsigned long time;
|
|
+
|
|
+ int i;
|
|
+
|
|
+ netif_stop_queue(dev);
|
|
+
|
|
+ // Perform the graceful stop
|
|
+ FEC_TCR(base_addr) |= FEC_TCR_GTS;
|
|
+
|
|
+ time = jiffies;
|
|
+
|
|
+ // Wait for the graceful stop
|
|
+ while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ)
|
|
+ schedule();
|
|
+
|
|
+ // Disable FEC
|
|
+ FEC_ECR(base_addr) = FEC_ECR_DISABLE;
|
|
+
|
|
+ // Reset the DMA channels
|
|
+ spin_lock_irq(&fp->fecpriv_lock);
|
|
+ MCD_killDma(fp->fecpriv_fec_tx_channel);
|
|
+ spin_unlock_irq(&fp->fecpriv_lock);
|
|
+ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
|
|
+ dma_disconnect(fp->fecpriv_fec_tx_channel);
|
|
+ fp->fecpriv_fec_tx_channel = -1;
|
|
+
|
|
+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
|
|
+ if (fp->fecpriv_txbuf[i])
|
|
+ {
|
|
+ kfree(fp->fecpriv_txbuf[i]);
|
|
+ fp->fecpriv_txbuf[i] = NULL;
|
|
+ }
|
|
+
|
|
+ spin_lock_irq(&fp->fecpriv_lock);
|
|
+ MCD_killDma(fp->fecpriv_fec_rx_channel);
|
|
+ spin_unlock_irq(&fp->fecpriv_lock);
|
|
+
|
|
+ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
|
|
+ dma_disconnect(fp->fecpriv_fec_rx_channel);
|
|
+ fp->fecpriv_fec_rx_channel = -1;
|
|
+
|
|
+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
|
|
+ {
|
|
+ if (fp->askb_rx[i])
|
|
+ {
|
|
+ kfree_skb(fp->askb_rx[i]);
|
|
+ fp->askb_rx[i] = NULL;
|
|
+ }
|
|
+ }
|
|
+// MOD_DEC_USE_COUNT;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* +NAME: fec_get_stat
|
|
+*
|
|
+* RETURNS: This function returns the statistical information.
|
|
+*************************************************************************/
|
|
+struct net_device_stats * fec_get_stat(struct net_device *dev)
|
|
+{
|
|
+
|
|
+ //Receive the pointer to the private structure
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+ // Receive the base address
|
|
+ unsigned long base_addr = dev->base_addr;
|
|
+
|
|
+ // Receive the statistical information
|
|
+ fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr);
|
|
+ fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr);
|
|
+ fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr);
|
|
+ fp->fecpriv_stat.tx_bytes = FECSTAT_RMON_T_OCTETS(base_addr);
|
|
+
|
|
+ fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr);
|
|
+ fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr);
|
|
+
|
|
+ fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + FECSTAT_RMON_R_OVERSIZE(base_addr) + FECSTAT_RMON_R_FRAG(base_addr) + FECSTAT_RMON_R_JAB(base_addr);
|
|
+ fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr);
|
|
+ fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr);
|
|
+ fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr);
|
|
+
|
|
+ fp->fecpriv_stat.tx_carrier_errors = FECSTAT_IEEE_T_CSERR(base_addr);
|
|
+ fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr);
|
|
+ fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr);
|
|
+
|
|
+ // I hope that one frame doesn't have more than one error
|
|
+ fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + fp->fecpriv_stat.rx_crc_errors + fp->fecpriv_stat.rx_frame_errors + fp->fecpriv_stat.rx_over_errors + fp->fecpriv_stat.rx_dropped;
|
|
+ fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + fp->fecpriv_stat.tx_fifo_errors + fp->fecpriv_stat.tx_window_errors + fp->fecpriv_stat.tx_aborted_errors + fp->fecpriv_stat.tx_heartbeat_errors + fp->fecpriv_stat.tx_dropped;
|
|
+
|
|
+ return &fp->fecpriv_stat;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_set_multicast_list
|
|
+*
|
|
+* DESCRIPTION: This function sets the frame filtering parameters
|
|
+*************************************************************************/
|
|
+void fec_set_multicast_list(struct net_device *dev)
|
|
+{
|
|
+ // Pointer to the address list
|
|
+ struct dev_mc_list *dmi;
|
|
+
|
|
+ unsigned int crc, data;
|
|
+ int i, j, k;
|
|
+
|
|
+ // Receive the base address
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+
|
|
+ if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI)
|
|
+ {
|
|
+ // Allow all incoming frames
|
|
+ FEC_GALR(base_addr) = 0xFFFFFFFF;
|
|
+ FEC_GAUR(base_addr) = 0xFFFFFFFF;
|
|
+ return;
|
|
+ }
|
|
+ // Reset the group address register
|
|
+ FEC_GALR(base_addr) = 0x00000000;
|
|
+ FEC_GAUR(base_addr) = 0x00000000;
|
|
+
|
|
+ // Process all addresses
|
|
+ for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next)
|
|
+ {
|
|
+ // Processing must be only for the group addresses
|
|
+ if (!(dmi->dmi_addr[0] & 1))
|
|
+ continue;
|
|
+
|
|
+ // Calculate crc value for the current address
|
|
+ crc = 0xFFFFFFFF;
|
|
+ for (j = 0; j < dmi->dmi_addrlen; j++)
|
|
+ {
|
|
+
|
|
+ for (k = 0, data = dmi->dmi_addr[j]; k < 8; k++, data >>= 1)
|
|
+ {
|
|
+ if ((crc ^ data) & 1)
|
|
+ crc = (crc >> 1) ^ FEC_CRCPOL;
|
|
+ else
|
|
+ crc >>= 1;
|
|
+
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ // Add this value
|
|
+ crc >>= 26;
|
|
+ crc &= 0x3F;
|
|
+ if (crc > 31)
|
|
+ FEC_GAUR(base_addr) |= 0x1 << (crc - 32);
|
|
+ else
|
|
+ FEC_GALR(base_addr) |= 0x1 << crc;
|
|
+
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_set_mac_address
|
|
+*
|
|
+* DESCRIPTION: This function sets the MAC address
|
|
+*************************************************************************/
|
|
+int fec_set_mac_address(struct net_device *dev, void *p)
|
|
+{
|
|
+ //Receive the pointer to the private structure
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+ // Receive the base address
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+
|
|
+ struct sockaddr *addr = p;
|
|
+
|
|
+ if (netif_running(dev))
|
|
+ return -EBUSY;
|
|
+
|
|
+ // Copy a new address to the device structure
|
|
+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
|
+
|
|
+ // Copy a new address to the private structure
|
|
+ memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6);
|
|
+
|
|
+ // Set the address to the registers
|
|
+ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
|
|
+ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_tx
|
|
+*
|
|
+* DESCRIPTION: This function starts transmission of the frame using DMA
|
|
+*
|
|
+* RETURNS: This function always returns zero.
|
|
+*************************************************************************/
|
|
+int fec_tx(struct sk_buff *skb, struct net_device *dev)
|
|
+{
|
|
+
|
|
+ //Receive the pointer to the private structure
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+ void *data, *data_aligned;
|
|
+ int offset;
|
|
+
|
|
+printk(KERN_INFO "fec_tx\n");
|
|
+ data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
|
|
+
|
|
+ if (!data)
|
|
+ {
|
|
+ fp->fecpriv_stat.tx_dropped++;
|
|
+ dev_kfree_skb(skb);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - (unsigned long)virt_to_phys(data);
|
|
+ data_aligned = (void*)((unsigned long)data + offset);
|
|
+ memcpy(data_aligned, skb->data, skb->len);
|
|
+
|
|
+ // flush data cache before initializing the descriptor and starting DMA
|
|
+#if 0
|
|
+/* JKM -- currently running with cache turned off */
|
|
+ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len);
|
|
+#endif
|
|
+
|
|
+ spin_lock_irq(&fp->fecpriv_lock);
|
|
+
|
|
+ // Initialize the descriptor
|
|
+ fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data;
|
|
+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned);
|
|
+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len;
|
|
+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].statCtrl |= (MCD_FEC_END_FRAME | MCD_FEC_BUF_READY);
|
|
+ fp->fecpriv_next_tx = (fp->fecpriv_next_tx + 1) & FEC_TX_INDEX_MASK;
|
|
+
|
|
+ if (fp->fecpriv_txbuf[fp->fecpriv_current_tx] && fp->fecpriv_current_tx == fp->fecpriv_next_tx)
|
|
+ netif_stop_queue(dev);
|
|
+
|
|
+ spin_unlock_irq(&fp->fecpriv_lock);
|
|
+
|
|
+ // Tell the DMA to continue the transmission
|
|
+ MCD_continDma(fp->fecpriv_fec_tx_channel);
|
|
+
|
|
+ dev_kfree_skb(skb);
|
|
+
|
|
+ dev->trans_start = jiffies;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_tx_timeout
|
|
+*
|
|
+* DESCRIPTION: If the interrupt processing of received frames was lost
|
|
+* and DMA stopped the reception, this function clears
|
|
+* the transmission descriptors and starts DMA
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_tx_timeout(struct net_device *dev)
|
|
+{
|
|
+ int i;
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+
|
|
+printk(KERN_INFO "fec_tx_timeout\n");
|
|
+ spin_lock_irq(&fp->fecpriv_lock);
|
|
+ MCD_killDma(fp->fecpriv_fec_tx_channel);
|
|
+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
|
|
+ {
|
|
+ if (fp->fecpriv_txbuf[i])
|
|
+ {
|
|
+
|
|
+ kfree(fp->fecpriv_txbuf[i]);
|
|
+ fp->fecpriv_txbuf[i] = NULL;
|
|
+
|
|
+ }
|
|
+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
|
|
+ }
|
|
+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
|
|
+
|
|
+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
|
|
+
|
|
+ // Reset FIFOs
|
|
+ FEC_FECFRST(base_addr) |= FEC_SW_RST;
|
|
+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
|
|
+
|
|
+ // Reset and disable FEC
|
|
+// FEC_ECR(base_addr) = FEC_ECR_RESET;
|
|
+
|
|
+ // Enable FEC
|
|
+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
|
|
+
|
|
+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
|
|
+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
|
|
+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
|
|
+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
|
|
+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
|
|
+
|
|
+ spin_unlock_irq(&fp->fecpriv_lock);
|
|
+
|
|
+ netif_wake_queue(dev);
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_read_mii
|
|
+*
|
|
+* DESCRIPTION: This function reads the value from the MII register
|
|
+*
|
|
+* RETURNS: If no error occurs, this function returns zero.
|
|
+*************************************************************************/
|
|
+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data)
|
|
+{
|
|
+ unsigned long time;
|
|
+
|
|
+ // Clear the MII interrupt bit
|
|
+ FEC_EIR(base_addr) = FEC_EIR_MII;
|
|
+
|
|
+ // Write to the MII management frame register
|
|
+ FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18);
|
|
+
|
|
+ time = jiffies;
|
|
+
|
|
+ // Wait for the reading
|
|
+ while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
|
|
+ {
|
|
+ if (jiffies - time > FEC_MII_TIMEOUT * HZ)
|
|
+ return -ETIME;
|
|
+ schedule();
|
|
+ }
|
|
+
|
|
+ // Clear the MII interrupt bit
|
|
+ FEC_EIR(base_addr) = FEC_EIR_MII;
|
|
+
|
|
+ *data = FEC_MMFR(base_addr) & 0x0000FFFF;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_write_mii
|
|
+*
|
|
+* DESCRIPTION: This function writes the value to the MII register
|
|
+*
|
|
+* RETURNS: If no error occurs, this function returns zero.
|
|
+*************************************************************************/
|
|
+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data)
|
|
+{
|
|
+ unsigned long time;
|
|
+
|
|
+ // Clear the MII interrupt bit
|
|
+ FEC_EIR(base_addr) = FEC_EIR_MII;
|
|
+
|
|
+ // Write to the MII management frame register
|
|
+ FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data;
|
|
+
|
|
+ time = jiffies;
|
|
+
|
|
+ // Wait for the writing
|
|
+
|
|
+ while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
|
|
+ {
|
|
+ if (jiffies - time > FEC_MII_TIMEOUT * HZ)
|
|
+ return -ETIME;
|
|
+
|
|
+ schedule();
|
|
+ }
|
|
+
|
|
+ // Clear the MII interrupt bit
|
|
+ FEC_EIR(base_addr) = FEC_EIR_MII;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_tx_handler
|
|
+*
|
|
+* DESCRIPTION: This function is called when the data
|
|
+* transmission from the buffer to the FEC is completed.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_tx_handler(struct net_device *dev)
|
|
+{
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+
|
|
+printk(KERN_INFO "fectxint\n");
|
|
+ //Release the socket buffer
|
|
+ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
|
|
+ {
|
|
+ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
|
|
+ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
|
|
+ }
|
|
+ fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK;
|
|
+
|
|
+ if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE)
|
|
+ for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK)
|
|
+ {
|
|
+ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
|
|
+ {
|
|
+ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
|
|
+ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (netif_queue_stopped(dev))
|
|
+ netif_wake_queue(dev);
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_rx_handler
|
|
+*
|
|
+* DESCRIPTION: This function is called when the data
|
|
+* reception from the FEC to the reception buffer is completed.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_rx_handler(struct net_device *dev)
|
|
+{
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ struct sk_buff *skb;
|
|
+
|
|
+printk(KERN_INFO "fecrxint\n");
|
|
+ fp->fecpriv_rxflag = 1;
|
|
+/*
|
|
+ // Some buffers can be missed
|
|
+ if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME))
|
|
+ {
|
|
+ // Find a valid index
|
|
+ for(i = 0; i < FEC_RX_BUF_NUMBER && !(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME); i++, fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK);
|
|
+
|
|
+ if(i == FEC_RX_BUF_NUMBER)
|
|
+ {
|
|
+ // There are no data to process
|
|
+ // Tell the DMA to continue the reception
|
|
+ MCD_continDma(fp->fecpriv_fec_rx_channel);
|
|
+
|
|
+ fp->fecpriv_rxflag = 0;
|
|
+
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+*/
|
|
+ for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK)
|
|
+ {
|
|
+ if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) &&
|
|
+ (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) // --tym--
|
|
+ {
|
|
+ skb = fp->askb_rx[fp->fecpriv_current_rx];
|
|
+ if (!skb)
|
|
+ {
|
|
+ fp->fecpriv_stat.rx_dropped++;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ // flush data cache before initializing the descriptor and starting DMA
|
|
+// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len);
|
|
+
|
|
+ skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4);
|
|
+// skb->dev = dev;
|
|
+ skb->protocol = eth_type_trans(skb, dev);
|
|
+ netif_rx(skb);
|
|
+ }
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME;
|
|
+ // allocate new skbuff
|
|
+ fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA);
|
|
+ if (!fp->askb_rx[fp->fecpriv_current_rx])
|
|
+ {
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0;
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0;
|
|
+ fp->fecpriv_stat.rx_dropped++;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16);
|
|
+ fp->askb_rx[fp->fecpriv_current_rx]->dev = dev;
|
|
+
|
|
+ // flush data cache before initializing the descriptor and starting DMA
|
|
+#if 0
|
|
+/* JKM -- currently running with cache turned off */
|
|
+ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
|
|
+#endif
|
|
+
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail);
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE;
|
|
+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY;
|
|
+
|
|
+ // flush data cache before initializing the descriptor and starting DMA
|
|
+// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ // Tell the DMA to continue the reception
|
|
+ MCD_continDma(fp->fecpriv_fec_rx_channel);
|
|
+
|
|
+ fp->fecpriv_rxflag = 0;
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_handler
|
|
+*
|
|
+* DESCRIPTION: This function is called when some special errors occur
|
|
+*
|
|
+*************************************************************************/
|
|
+irqreturn_t fec_interrupt_handler(int irq, void *dev_id)
|
|
+{
|
|
+
|
|
+ struct net_device *dev = (struct net_device *)dev_id;
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+ unsigned long events;
|
|
+
|
|
+printk(KERN_INFO "fecerrint\n");
|
|
+ // Read and clear the events
|
|
+ events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
|
|
+
|
|
+ if (events & FEC_EIR_HBERR)
|
|
+ {
|
|
+ fp->fecpriv_stat.tx_heartbeat_errors++;
|
|
+ FEC_EIR(base_addr) = FEC_EIR_HBERR;
|
|
+ }
|
|
+
|
|
+ // receive/transmit FIFO error
|
|
+ if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0))
|
|
+ {
|
|
+ // kill DMA receive channel
|
|
+ MCD_killDma (fp->fecpriv_fec_rx_channel);
|
|
+ // kill running transmission by DMA
|
|
+ MCD_killDma (fp->fecpriv_fec_tx_channel);
|
|
+
|
|
+ // Reset FIFOs
|
|
+ FEC_FECFRST(base_addr) |= FEC_SW_RST;
|
|
+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
|
|
+
|
|
+ // reset receive FIFO status register
|
|
+ FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE
|
|
+ | FEC_FECRFSR_RXW
|
|
+ | FEC_FECRFSR_UF;
|
|
+
|
|
+ // reset transmit FIFO status register
|
|
+ FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE
|
|
+ | FEC_FECTFSR_TXW
|
|
+ | FEC_FECTFSR_UF
|
|
+ | FEC_FECTFSR_OF;
|
|
+
|
|
+ // reset RFERR and XFERR event
|
|
+ FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR;
|
|
+
|
|
+ // stop queue
|
|
+ netif_stop_queue(dev);
|
|
+
|
|
+ // execute reinitialization as tasklet
|
|
+ tasklet_schedule(&fp->fecpriv_tasklet_reinit);
|
|
+
|
|
+ fp->fecpriv_stat.rx_dropped++;
|
|
+
|
|
+ }
|
|
+
|
|
+ // transmit FIFO underrun
|
|
+ if ((events & FEC_EIR_XFUN) != 0)
|
|
+ {
|
|
+ // reset XFUN event
|
|
+ FEC_EIR(base_addr) = FEC_EIR_XFUN;
|
|
+ fp->fecpriv_stat.tx_aborted_errors++;
|
|
+ }
|
|
+
|
|
+ // late collision
|
|
+ if ((events & FEC_EIR_LC) != 0)
|
|
+ {
|
|
+ // reset LC event
|
|
+ FEC_EIR(base_addr) = FEC_EIR_LC;
|
|
+ fp->fecpriv_stat.tx_aborted_errors++;
|
|
+ }
|
|
+
|
|
+ // collision retry limit
|
|
+ if ((events & FEC_EIR_RL) != 0)
|
|
+ {
|
|
+ // reset RL event
|
|
+ FEC_EIR(base_addr) = FEC_EIR_RL;
|
|
+ fp->fecpriv_stat.tx_aborted_errors++;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_reinit
|
|
+*
|
|
+* DESCRIPTION: This function is called from interrupt handler
|
|
+* when controller must be reinitialized.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_reinit(unsigned long data)
|
|
+{
|
|
+ int i;
|
|
+ struct net_device *dev = (struct net_device*)data;
|
|
+ struct fec_priv *fp = netdev_priv(dev);
|
|
+ unsigned long base_addr = (unsigned long) dev->base_addr;
|
|
+
|
|
+printk(KERN_INFO "fecreinit\n");
|
|
+ // Initialize reception descriptors and start DMA for the reception
|
|
+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
|
|
+ {
|
|
+ if (!fp->askb_rx[i])
|
|
+ {
|
|
+ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA);
|
|
+ if (!fp->askb_rx[i])
|
|
+ {
|
|
+ fp->fecpriv_rxdesc[i].dataPointer = 0;
|
|
+ fp->fecpriv_rxdesc[i].statCtrl = 0;
|
|
+ fp->fecpriv_rxdesc[i].length = 0;
|
|
+ continue;
|
|
+ }
|
|
+ fp->askb_rx[i]->dev = dev;
|
|
+ skb_reserve(fp->askb_rx[i], 16);
|
|
+ }
|
|
+ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
|
|
+ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
|
|
+ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
|
|
+ }
|
|
+
|
|
+ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
|
|
+ fp->fecpriv_current_rx = 0;
|
|
+
|
|
+ // restart frame transmission
|
|
+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
|
|
+ {
|
|
+ if (fp->fecpriv_txbuf[i])
|
|
+ {
|
|
+
|
|
+ kfree(fp->fecpriv_txbuf[i]);
|
|
+ fp->fecpriv_txbuf[i] = NULL;
|
|
+ fp->fecpriv_stat.tx_dropped++;
|
|
+ }
|
|
+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
|
|
+ }
|
|
+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
|
|
+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
|
|
+
|
|
+ // flush entire data cache before restarting the DMA
|
|
+#if 0
|
|
+/* JKM -- currently running with cache turned off */
|
|
+ DcacheFlushInvalidate();
|
|
+#endif
|
|
+
|
|
+ // restart DMA from beginning
|
|
+ MCD_startDma(fp->fecpriv_fec_rx_channel,
|
|
+ (char *) fp->fecpriv_rxdesc, 0,
|
|
+ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
|
|
+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
|
|
+ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
|
|
+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
|
|
+
|
|
+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
|
|
+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
|
|
+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
|
|
+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
|
|
+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
|
|
+
|
|
+ // Enable FEC
|
|
+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
|
|
+
|
|
+ netif_wake_queue(dev);
|
|
+
|
|
+}
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_tx_handler_fec0
|
|
+*
|
|
+* DESCRIPTION: This is the DMA interrupt handler using for FEC0
|
|
+* transmission.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_tx_handler_fec0(void)
|
|
+{
|
|
+ fec_interrupt_fec_tx_handler(fec_dev[0]);
|
|
+}
|
|
+
|
|
+#ifdef FEC_2
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_tx_handler_fec1
|
|
+*
|
|
+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
|
|
+* transmission.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_tx_handler_fec1(void)
|
|
+{
|
|
+ fec_interrupt_fec_tx_handler(fec_dev[1]);
|
|
+}
|
|
+#endif
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_rx_handler_fec0
|
|
+*
|
|
+* DESCRIPTION: This is the DMA interrupt handler using for the FEC0
|
|
+* reception.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_rx_handler_fec0(void)
|
|
+{
|
|
+ fec_interrupt_fec_rx_handler(fec_dev[0]);
|
|
+}
|
|
+
|
|
+#ifdef FEC_2
|
|
+/************************************************************************
|
|
+* NAME: fec_interrupt_rx_handler_fec1
|
|
+*
|
|
+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
|
|
+* reception.
|
|
+*
|
|
+*************************************************************************/
|
|
+void fec_interrupt_fec_rx_handler_fec1(void)
|
|
+{
|
|
+ fec_interrupt_fec_rx_handler(fec_dev[1]);
|
|
+}
|
|
+
|
|
+#endif
|
|
+#ifndef MODULE
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_mac_setup0
|
|
+*
|
|
+* DESCRIPTION: This function sets the MAC address of FEC0 from command line
|
|
+*
|
|
+*************************************************************************/
|
|
+int __init fec_mac_setup0(char *s)
|
|
+{
|
|
+ if(!s || !*s)
|
|
+ return 1;
|
|
+
|
|
+ if(fec_str_to_mac(s, fec_mac_addr_fec0))
|
|
+ printk("The MAC address of FEC0 cannot be set from command line");
|
|
+ return 1;
|
|
+
|
|
+}
|
|
+
|
|
+#ifdef FEC_2
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_mac_setup1
|
|
+*
|
|
+* DESCRIPTION: This function sets the MAC address of FEC1 from command line
|
|
+*
|
|
+*************************************************************************/
|
|
+int __init fec_mac_setup1(char *s)
|
|
+{
|
|
+ if(!s || !*s)
|
|
+ return 1;
|
|
+
|
|
+
|
|
+ if(fec_str_to_mac(s, fec_mac_addr_fec1))
|
|
+ printk("The MAC address of FEC1 cannot be set from command line");
|
|
+ return 1;
|
|
+
|
|
+}
|
|
+#endif
|
|
+
|
|
+/************************************************************************
|
|
+* NAME: fec_str_to_mac
|
|
+*
|
|
+* DESCRIPTION: This function interprets the character string into MAC addr
|
|
+*
|
|
+*************************************************************************/
|
|
+int fec_str_to_mac( char *str_mac, unsigned char* addr)
|
|
+{
|
|
+ unsigned long val;
|
|
+ char c;
|
|
+ unsigned long octet[6], *octetptr = octet;
|
|
+ int i;
|
|
+again:
|
|
+
|
|
+ val = 0;
|
|
+ while ((c = *str_mac) != '\0')
|
|
+ {
|
|
+ if ((c>='0')&&(c<='9'))
|
|
+ {
|
|
+ val = (val * 16) + (c - '0');
|
|
+ str_mac++;
|
|
+ continue;
|
|
+ }
|
|
+ else
|
|
+ if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F')))
|
|
+ {
|
|
+ val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A'));
|
|
+ str_mac++;
|
|
+ continue;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ if (*str_mac == ':')
|
|
+ {
|
|
+ *octetptr++ = val, str_mac++;
|
|
+ if (octetptr >= octet + 6)
|
|
+ return 1;
|
|
+ goto again;
|
|
+ }
|
|
+
|
|
+ //Check for trailing characters.
|
|
+ if (*str_mac && !(*str_mac==' '))
|
|
+ return 1;
|
|
+ *octetptr++ = val;
|
|
+
|
|
+ if ((octetptr - octet)==6)
|
|
+ {
|
|
+ for(i=0;i<=6;i++)
|
|
+ addr[i]=octet[i];
|
|
+ }
|
|
+ else
|
|
+ return 1;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+}
|
|
+#endif
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/fec.h
|
|
@@ -0,0 +1,162 @@
|
|
+
|
|
+#define FEC_BASE_ADDR_FEC0 ((unsigned int)MCF_MBAR + 0x9000)
|
|
+#define FEC_BASE_ADDR_FEC1 ((unsigned int)MCF_MBAR + 0x9800)
|
|
+
|
|
+//#define FEC_INTC_IMRH_INT_MASK38 (0x00000040)
|
|
+//#define FEC_INTC_IMRH_INT_MASK39 (0x00000080)
|
|
+//#define FEC_INTC_ICR_FEC0 (0x30)
|
|
+//#define FEC_INTC_ICR_FEC1 (0x31)
|
|
+#define FEC_FECI2CIRQ (0xFFC0)
|
|
+#define FEC_GPIO_PAR_FECI2CIRQ *(volatile unsigned short*)((unsigned int)MCF_MBAR + 0xA44)
|
|
+//#define FEC_INTC_ICRn(x) (*(volatile unsigned char *)(void*)((unsigned int) MCF_MBAR + 0x000740+((x)*0x001)))
|
|
+//#define FEC_INTC_IMRH *(volatile unsigned int*)((unsigned int)MCF_MBAR + 0x000708)
|
|
+
|
|
+#define FEC_ECR_DISABLE (0x00000000)
|
|
+
|
|
+#define FEC_ECR(x) *(volatile unsigned int *)(x + 0x024)
|
|
+#define FEC_EIR(x) *(volatile unsigned int*)(x + 0x004)
|
|
+#define FEC_PALR(x) *(volatile unsigned int*)(x + 0x0E4)
|
|
+#define FEC_PAUR(x) *(volatile unsigned int*)(x + 0x0E8)
|
|
+#define FEC_IALR(x) *(volatile unsigned int*)(x + 0x11C)
|
|
+#define FEC_IAUR(x) *(volatile unsigned int*)(x + 0x118)
|
|
+#define FEC_GALR(x) *(volatile unsigned int*)(x + 0x124)
|
|
+#define FEC_GAUR(x) *(volatile unsigned int*)(x + 0x120)
|
|
+#define FEC_RCR(x) *(volatile unsigned int*)(x + 0x084)
|
|
+#define FEC_FECRFCR(x) *(volatile unsigned int*)(x + 0x18C)
|
|
+#define FEC_FECRFAR(x) *(volatile unsigned int*)(x + 0x198)
|
|
+#define FEC_FECTFCR(x) *(volatile unsigned int*)(x + 0x1AC)
|
|
+#define FEC_FECTFAR(x) *(volatile unsigned int*)(x + 0x1B8)
|
|
+#define FEC_FECTFWR(x) *(volatile unsigned int*)(x + 0x144)
|
|
+#define FEC_CTCWR(x) *(volatile unsigned int*)(x + 0x1C8)
|
|
+#define FEC_EIMR(x) *(volatile unsigned int*)(x + 0x008)
|
|
+#define FEC_TCR(x) *(volatile unsigned int*)(x + 0x0C4)
|
|
+#define FEC_MIBC(x) *(volatile unsigned int*)(x + 0x064)
|
|
+#define FEC_MSCR(x) *(volatile unsigned int*)(x + 0x044)
|
|
+#define FEC_FECTFDR(x) *(volatile unsigned int*)(x + 0x1A4)
|
|
+#define FEC_FECRFDR(x) *(volatile unsigned int*)(x + 0x184)
|
|
+#define FEC_FECTFSR(x) *(volatile unsigned int*)(x + 0x1A8)
|
|
+#define FEC_FECRFSR(x) *(volatile unsigned int*)(x + 0x188)
|
|
+#define FECSTAT_RMON_R_PACKETS(x) *(volatile unsigned int*)(x + 0x284)
|
|
+#define FECSTAT_RMON_T_PACKETS(x) *(volatile unsigned int*)(x + 0x204)
|
|
+#define FECSTAT_RMON_R_OCTETS(x) *(volatile unsigned int*)(x + 0x2C4)
|
|
+#define FECSTAT_RMON_T_OCTETS(x) *(volatile unsigned int*)(x + 0x244)
|
|
+#define FECSTAT_RMON_R_UNDERSIZE(x) *(volatile unsigned int*)(x + 0x294)
|
|
+#define FECSTAT_RMON_R_OVERSIZE(x) *(volatile unsigned int*)(x + 0x298)
|
|
+#define FECSTAT_RMON_R_FRAG(x) *(volatile unsigned int*)(x + 0x29C)
|
|
+#define FECSTAT_RMON_R_JAB(x) *(volatile unsigned int*)(x + 0x2A0)
|
|
+#define FECSTAT_RMON_R_MC_PKT(x) *(volatile unsigned int*)(x + 0x28C)
|
|
+#define FECSTAT_RMON_T_COL(x) *(volatile unsigned int*)(x + 0x224)
|
|
+#define FECSTAT_IEEE_R_ALIGN(x) *(volatile unsigned int*)(x + 0x2D4)
|
|
+#define FECSTAT_IEEE_R_CRC(x) *(volatile unsigned int*)(x + 0x2D0)
|
|
+#define FECSTAT_IEEE_R_MACERR(x) *(volatile unsigned int*)(x + 0x2D8)
|
|
+#define FECSTAT_IEEE_T_CSERR(x) *(volatile unsigned int*)(x + 0x268)
|
|
+#define FECSTAT_IEEE_T_MACERR(x) *(volatile unsigned int*)(x + 0x264)
|
|
+#define FECSTAT_IEEE_T_LCOL(x) *(volatile unsigned int*)(x + 0x25C)
|
|
+#define FECSTAT_IEEE_R_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x2E0)
|
|
+#define FECSTAT_IEEE_T_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x274)
|
|
+#define FECSTAT_IEEE_R_DROP(x) *(volatile unsigned int*)(x + 0x2C8)
|
|
+#define FECSTAT_IEEE_T_DROP(x) *(volatile unsigned int*)(x + 0x248)
|
|
+#define FECSTAT_IEEE_R_FRAME_OK(x) *(volatile unsigned int*)(x + 0x2CC)
|
|
+#define FECSTAT_IEEE_T_FRAME_OK(x) *(volatile unsigned int*)(x + 0x24C)
|
|
+#define FEC_MMFR(x) *(volatile unsigned int*)(x + 0x040)
|
|
+#define FEC_FECFRST(x) *(volatile unsigned int*)(x + 0x1C4)
|
|
+
|
|
+#define FEC_MAX_FRM_SIZE (1518)
|
|
+#define FEC_MAXBUF_SIZE (1520)
|
|
+
|
|
+// Register values
|
|
+#define FEC_ECR_RESET (0x00000001)
|
|
+#define FEC_EIR_CLEAR (0xFFFFFFFF)
|
|
+#define FEC_EIR_RL (0x00100000)
|
|
+#define FEC_EIR_HBERR (0x80000000)
|
|
+#define FEC_EIR_BABR (0x40000000) // babbling receive error
|
|
+#define FEC_EIR_BABT (0x20000000) // babbling transmit error
|
|
+#define FEC_EIR_TXF (0x08000000) // transmit frame interrupt
|
|
+#define FEC_EIR_MII (0x00800000) // MII interrupt
|
|
+#define FEC_EIR_LC (0x00200000) // late collision
|
|
+#define FEC_EIR_XFUN (0x00080000) // transmit FIFO underrun
|
|
+#define FEC_EIR_XFERR (0x00040000) // transmit FIFO error
|
|
+#define FEC_EIR_RFERR (0x00020000) // receive FIFO error
|
|
+#define FEC_RCR_MAX_FRM_SIZE (FEC_MAX_FRM_SIZE << 16)
|
|
+#define FEC_RCR_MII (0x00000004)
|
|
+#define FEC_FECRFCR_FAE (0x00400000) // frame accept error
|
|
+#define FEC_FECRFCR_RXW (0x00200000) // receive wait condition
|
|
+#define FEC_FECRFCR_UF (0x00100000) // receive FIFO underflow
|
|
+#define FEC_FECRFCR_FRM (0x08000000)
|
|
+#define FEC_FECRFCR_GR (0x7 << 24)
|
|
+
|
|
+#define FEC_EIMR_DISABLE (0x00000000)
|
|
+
|
|
+#define FEC_FECRFAR_ALARM (0x300)
|
|
+#define FEC_FECTFCR_FRM (0x08000000)
|
|
+#define FEC_FECTFCR_GR (0x7 << 24)
|
|
+#define FEC_FECTFCR_FAE (0x00400000) // frame accept error
|
|
+#define FEC_FECTFCR_TXW (0x00040000) // transmit wait condition
|
|
+#define FEC_FECTFCR_UF (0x00100000) // transmit FIFO underflow
|
|
+#define FEC_FECTFCR_OF (0x00080000) // transmit FIFO overflow
|
|
+
|
|
+#define FEC_FECTFAR_ALARM (0x100)
|
|
+#define FEC_FECTFWR_XWMRK (0x00000000)
|
|
+
|
|
+#define FEC_FECTFSR_MSK (0xC0B00000)
|
|
+#define FEC_FECTFSR_TXW (0x40000000) // transmit wait condition
|
|
+#define FEC_FECTFSR_FAE (0x00800000) // frame accept error
|
|
+#define FEC_FECTFSR_UF (0x00200000) // transmit FIFO underflow
|
|
+#define FEC_FECTFSR_OF (0x00100000) // transmit FIFO overflow
|
|
+
|
|
+#define FEC_FECRFSR_MSK (0x80F00000)
|
|
+#define FEC_FECRFSR_FAE (0x00800000) // frame accept error
|
|
+#define FEC_FECRFSR_RXW (0x00400000) // receive wait condition
|
|
+#define FEC_FECRFSR_UF (0x00200000) // receive FIFO underflow
|
|
+
|
|
+#define FEC_CTCWR_TFCW_CRC (0x03000000)
|
|
+#define FEC_TCR_FDEN (0x00000004)
|
|
+#define FEC_TCR_HBC (0x00000002)
|
|
+#define FEC_RCR_DRT (0x00000002)
|
|
+#define FEC_EIMR_MASK (FEC_EIR_RL | FEC_EIR_HBERR)
|
|
+#define FEC_ECR_ETHEREN (0x00000002)
|
|
+#define FEC_FECTFCR_MSK (0x00FC0000)
|
|
+#define FEC_FECRFCR_MSK (0x00F80000)
|
|
+#define FEC_EIR_GRA (0x10000000)
|
|
+#define FEC_TCR_GTS (0x00000001)
|
|
+#define FEC_MIBC_ENABLE (0x00000000)
|
|
+#define FEC_MIB_LEN (228)
|
|
+#define FEC_PHY_ADDR (0x01)
|
|
+
|
|
+#define FEC_RX_DMA_PRI (6)
|
|
+#define FEC_TX_DMA_PRI (6)
|
|
+
|
|
+#define FEC_TX_BUF_NUMBER (8)
|
|
+#define FEC_RX_BUF_NUMBER (64)
|
|
+
|
|
+#define FEC_TX_INDEX_MASK (0x7)
|
|
+#define FEC_RX_INDEX_MASK (0x3f)
|
|
+
|
|
+#define FEC_RX_DESC_FEC0 SYS_SRAM_FEC_START
|
|
+#define FEC_TX_DESC_FEC0 FEC_RX_DESC_FEC0 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
|
|
+
|
|
+#define FEC_RX_DESC_FEC1 SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE/2
|
|
+#define FEC_TX_DESC_FEC1 FEC_RX_DESC_FEC1 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
|
|
+
|
|
+#define FEC_EIR_MII (0x00800000)
|
|
+#define FEC_MMFR_READ (0x60020000)
|
|
+#define FEC_MMFR_WRITE (0x50020000)
|
|
+
|
|
+#define FEC_FLAGS_RX (0x00000001)
|
|
+
|
|
+#define FEC_CRCPOL (0xEDB88320)
|
|
+
|
|
+#define FEC_MII_TIMEOUT (2)
|
|
+#define FEC_GR_TIMEOUT (1)
|
|
+#define FEC_TX_TIMEOUT (1)
|
|
+#define FEC_RX_TIMEOUT (1)
|
|
+
|
|
+#define FEC_SW_RST 0x2000000
|
|
+#define FEC_RST_CTL 0x1000000
|
|
+
|
|
+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
|
|
+ unsigned int *data);
|
|
+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
|
|
+ unsigned int data);
|
|
+
|
|
+#define init_transceiver ks8721_init_transceiver
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/ks8721.c
|
|
@@ -0,0 +1,125 @@
|
|
+#include <linux/module.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/ptrace.h>
|
|
+#include <linux/errno.h>
|
|
+#include <linux/ioport.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/pci.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/netdevice.h>
|
|
+#include <linux/etherdevice.h>
|
|
+#include <linux/skbuff.h>
|
|
+#include <linux/spinlock.h>
|
|
+#include <linux/workqueue.h>
|
|
+#include <linux/bitops.h>
|
|
+
|
|
+#if 0
|
|
+#include <linux/config.h>
|
|
+#include <linux/sched.h>
|
|
+#include <linux/errno.h>
|
|
+#include <asm/coldfire.h>
|
|
+#endif
|
|
+#include <asm/coldfire.h>
|
|
+#include <asm/mcfsim.h>
|
|
+
|
|
+#include "fec.h"
|
|
+#include "ks8721.h"
|
|
+
|
|
+#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION
|
|
+#define KS8721_AUTO_NEGOTIATION_ENABLE
|
|
+#endif
|
|
+
|
|
+/************************************************************************
|
|
+* +NAME: ks8721_init_transceiver
|
|
+*
|
|
+* DESCRIPTION: This function initializes the transceiver
|
|
+*
|
|
+* RETURNS: If no error occurs, this function returns zero.
|
|
+* Otherwise, it returns 1
|
|
+*************************************************************************/
|
|
+
|
|
+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex)
|
|
+{
|
|
+
|
|
+ int data;
|
|
+ unsigned long time;
|
|
+ int flag = 1;
|
|
+
|
|
+ int result;
|
|
+
|
|
+ // Set the frequency of MII
|
|
+ FEC_MSCR(base_addr) = FEC_MII_SPEED;
|
|
+
|
|
+ // Reset
|
|
+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_RESET)))
|
|
+ return result;
|
|
+
|
|
+ // Read back
|
|
+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, &data)) != 0)
|
|
+ return result;
|
|
+
|
|
+ // If reset bit is set, return
|
|
+ if (data & KS8721_CTRL_RESET)
|
|
+ return -ETIME;
|
|
+
|
|
+#ifdef KS8721_AUTO_NEGOTIATION_ENABLE
|
|
+
|
|
+ // Disable the auto-negotiation
|
|
+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, 0)) != 0)
|
|
+ return result;
|
|
+
|
|
+ // Set the auto-negotiation advertisement register
|
|
+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_ANADV, KS8721_ANADV_ADV_ALL)) != 0)
|
|
+ return result;
|
|
+
|
|
+ // Enable the auto-negotiation
|
|
+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_AN_ENABLE)) != 0)
|
|
+ return result;
|
|
+
|
|
+ // Read PHY status register
|
|
+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
|
|
+ return result;
|
|
+ // Set the current time
|
|
+ time = jiffies;
|
|
+
|
|
+ // Wait for the auto-negotiation completion
|
|
+ while (!(data & KS8721_STAT_ANCOMPLETE))
|
|
+ {
|
|
+
|
|
+ if (jiffies - time > KS8721_TIMEOUT * HZ)
|
|
+ {
|
|
+ flag = 0;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ schedule();
|
|
+
|
|
+ // Read PHY status register
|
|
+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ if (flag)
|
|
+ {
|
|
+ // Set the duplex flag
|
|
+ if (data & KS8721_STAT_FDUPLEX)
|
|
+ *fduplex = 1;
|
|
+ else
|
|
+ *fduplex = 0;
|
|
+
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+#endif
|
|
+
|
|
+ // Set the default mode (Full duplex, 100 Mbps)
|
|
+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_DEFAULT_MODE)) != 0)
|
|
+ return result;
|
|
+ *fduplex = KS8721_CTRL_DEFAULT_MODE & 0x100;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+}
|
|
--- /dev/null
|
|
+++ b/drivers/net/fec/ks8721.h
|
|
@@ -0,0 +1,21 @@
|
|
+
|
|
+#define FEC_MII_SPEED (((unsigned int)(MCF_BUSCLK / 5000000)) << 1)
|
|
+
|
|
+// Numbers of the transceiver registers
|
|
+#define KS8721_CTRL 0x00
|
|
+#define KS8721_ANADV 0x04
|
|
+#define KS8721_STAT 0x01
|
|
+
|
|
+// Register values
|
|
+#define KS8721_CTRL_RESET 0x8000
|
|
+#define KS8721_ANADV_ADV_ALL 0x01E1
|
|
+#define KS8721_CTRL_AN_ENABLE 0x1280
|
|
+#define KS8721_CTRL_DEFAULT_MODE 0x2100
|
|
+#define KS8721_STAT_ANCOMPLETE 0x0020
|
|
+#define KS8721_STAT_LINK 0x0004
|
|
+#define KS8721_STAT_FDUPLEX 0x5000
|
|
+
|
|
+// Timeout for the auto-negotiation mode
|
|
+#define KS8721_TIMEOUT 5
|
|
+
|
|
+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex);
|
|
--- /dev/null
|
|
+++ b/include/asm-m68k/MCD_dma.h
|
|
@@ -0,0 +1,408 @@
|
|
+/*********************************************************************
|
|
+ *
|
|
+ * Copyright (C) 2004 Motorola, Inc.
|
|
+ * MOTOROLA, INC. All Rights Reserved.
|
|
+ * You are hereby granted a copyright license to use
|
|
+ * the SOFTWARE so long as this entire notice is
|
|
+ * retained without alteration in any modified and/or redistributed
|
|
+ * versions, and that such modified versions are clearly identified
|
|
+ * as such. No licenses are granted by implication, estoppel or
|
|
+ * otherwise under any patents or trademarks of Motorola, Inc. This
|
|
+ * software is provided on an "AS IS" basis and without warranty.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, MOTOROLA
|
|
+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
|
|
+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
|
|
+ * ACCOMPANYING WRITTEN MATERIALS.
|
|
+ *
|
|
+ * To the maximum extent permitted by applicable law, IN NO EVENT
|
|
+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
|
|
+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
|
|
+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
|
|
+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
+ *
|
|
+ * Motorola assumes no responsibility for the maintenance and support
|
|
+ * of this software
|
|
+ ********************************************************************/
|
|
+
|
|
+/*
|
|
+ * File: MCD_dma.h
|
|
+ * Purpose: Main header file for multi-channel DMA API.
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ * Modifications:
|
|
+ */
|
|
+#ifndef _MCD_API_H
|
|
+#define _MCD_API_H
|
|
+
|
|
+#include <asm/types.h>
|
|
+
|
|
+/*
|
|
+ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
|
|
+ */
|
|
+#undef MCD_INCLUDE_EU
|
|
+
|
|
+/*
|
|
+ * Number of DMA channels
|
|
+ */
|
|
+#define NCHANNELS 16
|
|
+
|
|
+/*
|
|
+ * Total number of variants
|
|
+ */
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+#define NUMOFVARIANTS 6
|
|
+#else
|
|
+#define NUMOFVARIANTS 4
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Define sizes of the various tables
|
|
+ */
|
|
+#define TASK_TABLE_SIZE (NCHANNELS*32)
|
|
+#define VAR_TAB_SIZE (128)
|
|
+#define CONTEXT_SAVE_SIZE (128)
|
|
+#define FUNCDESC_TAB_SIZE (256)
|
|
+
|
|
+#ifdef MCD_INCLUDE_EU
|
|
+#define FUNCDESC_TAB_NUM 16
|
|
+#else
|
|
+#define FUNCDESC_TAB_NUM 1
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef DEFINESONLY
|
|
+
|
|
+/*
|
|
+ * Portability typedefs
|
|
+ */
|
|
+ /*
|
|
+#ifndef s32
|
|
+typedef int s32;
|
|
+#endif
|
|
+#ifndef u32
|
|
+typedef unsigned int u32;
|
|
+#endif
|
|
+#ifndef s16
|
|
+typedef short s16;
|
|
+#endif
|
|
+#ifndef u16
|
|
+typedef unsigned short u16;
|
|
+#endif
|
|
+#ifndef s8
|
|
+typedef char s8;
|
|
+#endif
|
|
+#ifndef u8
|
|
+typedef unsigned char u8;
|
|
+#endif
|
|
+*/
|
|
+/*
|
|
+ * These structures represent the internal registers of the
|
|
+ * multi-channel DMA
|
|
+ */
|
|
+struct dmaRegs_s {
|
|
+ u32 taskbar; /* task table base address register */
|
|
+ u32 currPtr;
|
|
+ u32 endPtr;
|
|
+ u32 varTablePtr;
|
|
+ u16 dma_rsvd0;
|
|
+ u16 ptdControl; /* ptd control */
|
|
+ u32 intPending; /* interrupt pending register */
|
|
+ u32 intMask; /* interrupt mask register */
|
|
+ u16 taskControl[16]; /* task control registers */
|
|
+ u8 priority[32]; /* priority registers */
|
|
+ u32 initiatorMux; /* initiator mux control */
|
|
+ u32 taskSize0; /* task size control register 0. */
|
|
+ u32 taskSize1; /* task size control register 1. */
|
|
+ u32 dma_rsvd1; /* reserved */
|
|
+ u32 dma_rsvd2; /* reserved */
|
|
+ u32 debugComp1; /* debug comparator 1 */
|
|
+ u32 debugComp2; /* debug comparator 2 */
|
|
+ u32 debugControl; /* debug control */
|
|
+ u32 debugStatus; /* debug status */
|
|
+ u32 ptdDebug; /* priority task decode debug */
|
|
+ u32 dma_rsvd3[31]; /* reserved */
|
|
+};
|
|
+typedef volatile struct dmaRegs_s dmaRegs;
|
|
+
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * PTD contrl reg bits
|
|
+ */
|
|
+#define PTD_CTL_TSK_PRI 0x8000
|
|
+#define PTD_CTL_COMM_PREFETCH 0x0001
|
|
+
|
|
+/*
|
|
+ * Task Control reg bits and field masks
|
|
+ */
|
|
+#define TASK_CTL_EN 0x8000
|
|
+#define TASK_CTL_VALID 0x4000
|
|
+#define TASK_CTL_ALWAYS 0x2000
|
|
+#define TASK_CTL_INIT_MASK 0x1f00
|
|
+#define TASK_CTL_ASTRT 0x0080
|
|
+#define TASK_CTL_HIPRITSKEN 0x0040
|
|
+#define TASK_CTL_HLDINITNUM 0x0020
|
|
+#define TASK_CTL_ASTSKNUM_MASK 0x000f
|
|
+
|
|
+/*
|
|
+ * Priority reg bits and field masks
|
|
+ */
|
|
+#define PRIORITY_HLD 0x80
|
|
+#define PRIORITY_PRI_MASK 0x07
|
|
+
|
|
+/*
|
|
+ * Debug Control reg bits and field masks
|
|
+ */
|
|
+#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000
|
|
+#define DBG_CTL_AUTO_ARM 0x00008000
|
|
+#define DBG_CTL_BREAK 0x00004000
|
|
+#define DBG_CTL_COMP1_TYP_MASK 0x00003800
|
|
+#define DBG_CTL_COMP2_TYP_MASK 0x00000070
|
|
+#define DBG_CTL_EXT_BREAK 0x00000004
|
|
+#define DBG_CTL_INT_BREAK 0x00000002
|
|
+
|
|
+/*
|
|
+ * PTD Debug reg selector addresses
|
|
+ * This reg must be written with a value to show the contents of
|
|
+ * one of the desired internal register.
|
|
+ */
|
|
+#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */
|
|
+#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and
|
|
+ have initiators asserted */
|
|
+
|
|
+
|
|
+/*
|
|
+ * General return values
|
|
+ */
|
|
+#define MCD_OK 0
|
|
+#define MCD_ERROR -1
|
|
+#define MCD_TABLE_UNALIGNED -2
|
|
+#define MCD_CHANNEL_INVALID -3
|
|
+
|
|
+/*
|
|
+ * MCD_initDma input flags
|
|
+ */
|
|
+#define MCD_RELOC_TASKS 0x00000001
|
|
+#define MCD_NO_RELOC_TASKS 0x00000000
|
|
+#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */
|
|
+
|
|
+/*
|
|
+ * MCD_dmaStatus Status Values for each channel
|
|
+ */
|
|
+#define MCD_NO_DMA 1 /* No DMA has been requested since reset */
|
|
+#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */
|
|
+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
|
|
+#define MCD_PAUSED 4 /* DMA active but it is currently paused */
|
|
+#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */
|
|
+#define MCD_DONE 6 /* the most recent DMA has completed. */
|
|
+
|
|
+
|
|
+/*
|
|
+ * MCD_startDma parameter defines
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Constants for the funcDesc parameter
|
|
+ */
|
|
+/* Byte swapping: */
|
|
+#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */
|
|
+#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */
|
|
+#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of
|
|
+ each 32-bit data value being DMAed.*/
|
|
+#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each
|
|
+ 16-bit half of each 32-bit data value DMAed */
|
|
+#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */
|
|
+#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */
|
|
+/* CRCing: */
|
|
+#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */
|
|
+#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */
|
|
+#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */
|
|
+#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/
|
|
+#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */
|
|
+
|
|
+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
|
|
+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
|
|
+
|
|
+/*
|
|
+ * Constants for the flags parameter
|
|
+ */
|
|
+#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */
|
|
+#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */
|
|
+#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */
|
|
+#define MCD_TT_FLAGS_MASK 0x000000ff
|
|
+#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
|
|
+
|
|
+#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */
|
|
+#define MCD_CHAIN_DMA /* TBD */
|
|
+#define MCD_EU_DMA /* TBD */
|
|
+#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */
|
|
+#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */
|
|
+
|
|
+
|
|
+/* these flags are valid for MCD_startDma and the chained buffer descriptors */
|
|
+#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */
|
|
+#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
|
|
+#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */
|
|
+#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring
|
|
+ last byte of data in buffer */
|
|
+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
|
|
+ prior to performing the DMA. */
|
|
+
|
|
+/* Defines for the FEC buffer descriptor control/status word*/
|
|
+#define MCD_FEC_BUF_READY 0x8000
|
|
+#define MCD_FEC_WRAP 0x2000
|
|
+#define MCD_FEC_INTERRUPT 0x1000
|
|
+#define MCD_FEC_END_FRAME 0x0800
|
|
+
|
|
+
|
|
+/*
|
|
+ * Defines for general intuitiveness
|
|
+ */
|
|
+
|
|
+#define MCD_TRUE 1
|
|
+#define MCD_FALSE 0
|
|
+
|
|
+/*
|
|
+ * Three different cases for destination and source.
|
|
+ */
|
|
+#define MINUS1 -1
|
|
+#define ZERO 0
|
|
+#define PLUS1 1
|
|
+
|
|
+#ifndef DEFINESONLY
|
|
+
|
|
+/* Task Table Entry struct*/
|
|
+typedef struct {
|
|
+ u32 TDTstart; /* task descriptor table start */
|
|
+ u32 TDTend; /* task descriptor table end */
|
|
+ u32 varTab; /* variable table start */
|
|
+ u32 FDTandFlags; /* function descriptor table start and flags */
|
|
+ volatile u32 descAddrAndStatus;
|
|
+ volatile u32 modifiedVarTab;
|
|
+ u32 contextSaveSpace; /* context save space start */
|
|
+ u32 literalBases;
|
|
+} TaskTableEntry;
|
|
+
|
|
+
|
|
+/* Chained buffer descriptor */
|
|
+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
|
|
+struct MCD_bufDesc_struct {
|
|
+ u32 flags; /* flags describing the DMA */
|
|
+ u32 csumResult; /* checksum from checksumming performed since last checksum reset */
|
|
+ s8 *srcAddr; /* the address to move data from */
|
|
+ s8 *destAddr; /* the address to move data to */
|
|
+ s8 *lastDestAddr; /* the last address written to */
|
|
+ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */
|
|
+ MCD_bufDesc *next; /* next buffer descriptor in chain */
|
|
+ u32 info; /* private information about this descriptor; DMA does not affect it */
|
|
+};
|
|
+
|
|
+/* Progress Query struct */
|
|
+typedef volatile struct MCD_XferProg_struct {
|
|
+ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */
|
|
+ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */
|
|
+ u32 dmaSize; /* the amount of data transferred for the current buffer */
|
|
+ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
|
|
+} MCD_XferProg;
|
|
+
|
|
+
|
|
+/* FEC buffer descriptor */
|
|
+typedef volatile struct MCD_bufDescFec_struct {
|
|
+ u16 statCtrl;
|
|
+ u16 length;
|
|
+ u32 dataPointer;
|
|
+} MCD_bufDescFec;
|
|
+
|
|
+
|
|
+/*************************************************************************/
|
|
+/*
|
|
+ * API function Prototypes - see MCD_dmaApi.c for further notes
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * MCD_startDma starts a particular kind of DMA .
|
|
+ */
|
|
+int MCD_startDma (
|
|
+ int channel, /* the channel on which to run the DMA */
|
|
+ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */
|
|
+ s16 srcIncr, /* the amount to increment the source address per transfer */
|
|
+ s8 *destAddr, /* the address to move data to */
|
|
+ s16 destIncr, /* the amount to increment the destination address per transfer */
|
|
+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */
|
|
+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */
|
|
+ u32 initiator, /* what device initiates the DMA */
|
|
+ int priority, /* priority of the DMA */
|
|
+ u32 flags, /* flags describing the DMA */
|
|
+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */
|
|
+);
|
|
+
|
|
+/*
|
|
+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA
|
|
+ * registers, relocating and creating the appropriate task structures, and
|
|
+ * setting up some global settings
|
|
+ */
|
|
+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
|
|
+
|
|
+/*
|
|
+ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
|
|
+ */
|
|
+int MCD_dmaStatus (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_XferProgrQuery() returns progress of DMA on requested channel
|
|
+ */
|
|
+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
|
|
+
|
|
+/*
|
|
+ * MCD_killDma() halts the DMA on the requested channel, without any
|
|
+ * intention of resuming the DMA.
|
|
+ */
|
|
+int MCD_killDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_continDma() continues a DMA which as stopped due to encountering an
|
|
+ * unready buffer descriptor.
|
|
+ */
|
|
+int MCD_continDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
|
|
+ * running on that channel).
|
|
+ */
|
|
+int MCD_pauseDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
|
|
+ * running on that channel).
|
|
+ */
|
|
+int MCD_resumeDma (int channel);
|
|
+
|
|
+/*
|
|
+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
|
|
+ */
|
|
+int MCD_csumQuery (int channel, u32 *csum);
|
|
+
|
|
+/*
|
|
+ * MCD_getCodeSize provides the packed size required by the microcoded task
|
|
+ * and structures.
|
|
+ */
|
|
+int MCD_getCodeSize(void);
|
|
+
|
|
+/*
|
|
+ * MCD_getVersion provides a pointer to a version string and returns a
|
|
+ * version number.
|
|
+ */
|
|
+int MCD_getVersion(char **longVersion);
|
|
+
|
|
+/* macro for setting a location in the variable table */
|
|
+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
|
|
+ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
|
|
+ so I'm avoiding surrounding it with "do {} while(0)" */
|
|
+
|
|
+#endif /* DEFINESONLY */
|
|
+
|
|
+#endif /* _MCD_API_H */
|
|
--- a/include/asm-m68k/coldfire.h
|
|
+++ b/include/asm-m68k/coldfire.h
|
|
@@ -7,6 +7,7 @@
|
|
#define MCF_SRAM 0x80000000
|
|
#elif defined(CONFIG_M547X_8X)
|
|
#define MCF_MBAR 0xE0000000
|
|
+#define MCF_MMUBAR 0xE1000000
|
|
#define MCF_RAMBAR0 0xE3000000
|
|
#define MCF_RAMBAR1 0xE3001000
|
|
#endif
|
|
--- a/include/asm-m68k/dma.h
|
|
+++ b/include/asm-m68k/dma.h
|
|
@@ -1,16 +1,120 @@
|
|
#ifndef _M68K_DMA_H
|
|
#define _M68K_DMA_H 1
|
|
|
|
-
|
|
/* it's useless on the m68k, but unfortunately needed by the new
|
|
bootmem allocator (but this should do it for this) */
|
|
#define MAX_DMA_ADDRESS PAGE_OFFSET
|
|
|
|
+#ifndef CONFIG_COLDFIRE
|
|
#define MAX_DMA_CHANNELS 8
|
|
|
|
extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */
|
|
extern void free_dma(unsigned int dmanr); /* release it again */
|
|
|
|
+#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
|
|
+
|
|
+/************************************************
|
|
+ * Multichannel DMA definitions *
|
|
+ ************************************************/
|
|
+#ifdef CONFIG_MCD_DMA
|
|
+#include <asm/MCD_dma.h>
|
|
+#include <asm/m5485dma.h>
|
|
+
|
|
+struct scatterlist;
|
|
+
|
|
+#define MAX_DMA_CHANNELS NCHANNELS
|
|
+/*
|
|
+ * identifiers for each initiator/requestor
|
|
+ */
|
|
+#define DMA_ALWAYS (0)
|
|
+#define DMA_DSPI_RX (1)
|
|
+#define DMA_DSPI_TX (2)
|
|
+#define DMA_DREQ0 (3)
|
|
+#define DMA_PSC0_RX (4)
|
|
+#define DMA_PSC0_TX (5)
|
|
+#define DMA_USBEP0 (6)
|
|
+#define DMA_USBEP1 (7)
|
|
+#define DMA_USBEP2 (8)
|
|
+#define DMA_USBEP3 (9)
|
|
+#define DMA_PCI_TX (10)
|
|
+#define DMA_PCI_RX (11)
|
|
+#define DMA_PSC1_RX (12)
|
|
+#define DMA_PSC1_TX (13)
|
|
+#define DMA_I2C_RX (14)
|
|
+#define DMA_I2C_TX (15)
|
|
+#define DMA_FEC0_RX (16)
|
|
+#define DMA_FEC0_TX (17)
|
|
+#define DMA_FEC1_RX (18)
|
|
+#define DMA_FEC1_TX (19)
|
|
+#define DMA_DREQ1 (20)
|
|
+#define DMA_CTM0 (21)
|
|
+#define DMA_CTM1 (22)
|
|
+#define DMA_CTM2 (23)
|
|
+#define DMA_CTM3 (24)
|
|
+#define DMA_CTM4 (25)
|
|
+#define DMA_CTM5 (26)
|
|
+#define DMA_CTM6 (27)
|
|
+#define DMA_CTM7 (28)
|
|
+#define DMA_USBEP4 (29)
|
|
+#define DMA_USBEP5 (30)
|
|
+#define DMA_USBEP6 (31)
|
|
+#define DMA_PSC2_RX (32)
|
|
+#define DMA_PSC2_TX (33)
|
|
+#define DMA_PSC3_RX (34)
|
|
+#define DMA_PSC3_TX (35)
|
|
+#define DMA_FEC_RX(x) ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX)
|
|
+#define DMA_FEC_TX(x) ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX)
|
|
+
|
|
+int dma_set_initiator(int);
|
|
+unsigned int dma_get_initiator(int);
|
|
+void dma_remove_initiator(int);
|
|
+int dma_set_channel(int);
|
|
+int dma_get_channel(int);
|
|
+void dma_remove_channel(int);
|
|
+int dma_set_channel_fec(int requestor);
|
|
+int dma_connect(int channel, int address);
|
|
+int dma_disconnect(int channel);
|
|
+void dma_remove_channel_by_number(int channel);
|
|
+int dma_init(void);
|
|
+
|
|
+#endif /* CONFIG_MCD_DMA */
|
|
+
|
|
+extern spinlock_t dma_spin_lock;
|
|
+
|
|
+static __inline__ unsigned long claim_dma_lock(void)
|
|
+{
|
|
+ unsigned long flags;
|
|
+ spin_lock_irqsave(&dma_spin_lock, flags);
|
|
+ return flags;
|
|
+}
|
|
+
|
|
+static __inline__ void release_dma_lock(unsigned long flags)
|
|
+{
|
|
+ spin_unlock_irqrestore(&dma_spin_lock, flags);
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Linux standard DMA stuff
|
|
+ */
|
|
+#if 0
|
|
+int request_dma(unsigned int channel, const char * device_id);
|
|
+void free_dma(unsigned int channel);
|
|
+void enable_dma(unsigned int channel);
|
|
+void disable_dma(unsigned int channel);
|
|
+int dma_channel_active(unsigned int channel);
|
|
+void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg);
|
|
+void set_dma_page(unsigned int channel, char pagenr);
|
|
+void set_dma_addr(unsigned int channel, unsigned long physaddr);
|
|
+void set_dma_count(unsigned int channel, unsigned long count);
|
|
+void set_dma_mode(unsigned int channel, unsigned int mode);
|
|
+void set_dma_speed(unsigned int channel, int cycle_ns);
|
|
+int get_dma_residue(unsigned int channel);
|
|
+#endif
|
|
+#define clear_dma_ff(channel)
|
|
+
|
|
+#endif /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
|
|
+
|
|
#ifdef CONFIG_PCI
|
|
extern int isa_dma_bridge_buggy;
|
|
#else
|
|
--- /dev/null
|
|
+++ b/include/asm-m68k/m5485dma.h
|
|
@@ -0,0 +1,97 @@
|
|
+/*
|
|
+ * m5485dma.h -- ColdFire 547x/548x DMA controller support.
|
|
+ */
|
|
+#ifndef __MCF548X_DMA_H__
|
|
+#define __MCF548X_DMA_H__
|
|
+
|
|
+
|
|
+/* Register read/write macros */
|
|
+#define MCF_DMA_DIPR (*(volatile u32*)(void*)(MCF_MBAR+0x008014))
|
|
+#define MCF_DMA_DIMR (*(volatile u32*)(void*)(MCF_MBAR+0x008018))
|
|
+#define MCF_DMA_IMCR (*(volatile u32*)(void*)(MCF_MBAR+0x00805C))
|
|
+
|
|
+/* Bit definitions and macros for MCF_DMA_DIPR */
|
|
+#define MCF_DMA_DIPR_TASK0 (0x00000001)
|
|
+#define MCF_DMA_DIPR_TASK1 (0x00000002)
|
|
+#define MCF_DMA_DIPR_TASK2 (0x00000004)
|
|
+#define MCF_DMA_DIPR_TASK3 (0x00000008)
|
|
+#define MCF_DMA_DIPR_TASK4 (0x00000010)
|
|
+#define MCF_DMA_DIPR_TASK5 (0x00000020)
|
|
+#define MCF_DMA_DIPR_TASK6 (0x00000040)
|
|
+#define MCF_DMA_DIPR_TASK7 (0x00000080)
|
|
+#define MCF_DMA_DIPR_TASK8 (0x00000100)
|
|
+#define MCF_DMA_DIPR_TASK9 (0x00000200)
|
|
+#define MCF_DMA_DIPR_TASK10 (0x00000400)
|
|
+#define MCF_DMA_DIPR_TASK11 (0x00000800)
|
|
+#define MCF_DMA_DIPR_TASK12 (0x00001000)
|
|
+#define MCF_DMA_DIPR_TASK13 (0x00002000)
|
|
+#define MCF_DMA_DIPR_TASK14 (0x00004000)
|
|
+#define MCF_DMA_DIPR_TASK15 (0x00008000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DMA_DIMR */
|
|
+#define MCF_DMA_DIMR_TASK0 (0x00000001)
|
|
+#define MCF_DMA_DIMR_TASK1 (0x00000002)
|
|
+#define MCF_DMA_DIMR_TASK2 (0x00000004)
|
|
+#define MCF_DMA_DIMR_TASK3 (0x00000008)
|
|
+#define MCF_DMA_DIMR_TASK4 (0x00000010)
|
|
+#define MCF_DMA_DIMR_TASK5 (0x00000020)
|
|
+#define MCF_DMA_DIMR_TASK6 (0x00000040)
|
|
+#define MCF_DMA_DIMR_TASK7 (0x00000080)
|
|
+#define MCF_DMA_DIMR_TASK8 (0x00000100)
|
|
+#define MCF_DMA_DIMR_TASK9 (0x00000200)
|
|
+#define MCF_DMA_DIMR_TASK10 (0x00000400)
|
|
+#define MCF_DMA_DIMR_TASK11 (0x00000800)
|
|
+#define MCF_DMA_DIMR_TASK12 (0x00001000)
|
|
+#define MCF_DMA_DIMR_TASK13 (0x00002000)
|
|
+#define MCF_DMA_DIMR_TASK14 (0x00004000)
|
|
+#define MCF_DMA_DIMR_TASK15 (0x00008000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DMA_IMCR */
|
|
+#define MCF_DMA_IMCR_SRC16(x) (((x)&0x00000003)<<0)
|
|
+#define MCF_DMA_IMCR_SRC17(x) (((x)&0x00000003)<<2)
|
|
+#define MCF_DMA_IMCR_SRC18(x) (((x)&0x00000003)<<4)
|
|
+#define MCF_DMA_IMCR_SRC19(x) (((x)&0x00000003)<<6)
|
|
+#define MCF_DMA_IMCR_SRC20(x) (((x)&0x00000003)<<8)
|
|
+#define MCF_DMA_IMCR_SRC21(x) (((x)&0x00000003)<<10)
|
|
+#define MCF_DMA_IMCR_SRC22(x) (((x)&0x00000003)<<12)
|
|
+#define MCF_DMA_IMCR_SRC23(x) (((x)&0x00000003)<<14)
|
|
+#define MCF_DMA_IMCR_SRC24(x) (((x)&0x00000003)<<16)
|
|
+#define MCF_DMA_IMCR_SRC25(x) (((x)&0x00000003)<<18)
|
|
+#define MCF_DMA_IMCR_SRC26(x) (((x)&0x00000003)<<20)
|
|
+#define MCF_DMA_IMCR_SRC27(x) (((x)&0x00000003)<<22)
|
|
+#define MCF_DMA_IMCR_SRC28(x) (((x)&0x00000003)<<24)
|
|
+#define MCF_DMA_IMCR_SRC29(x) (((x)&0x00000003)<<26)
|
|
+#define MCF_DMA_IMCR_SRC30(x) (((x)&0x00000003)<<28)
|
|
+#define MCF_DMA_IMCR_SRC31(x) (((x)&0x00000003)<<30)
|
|
+#define MCF_DMA_IMCR_SRC16_FEC0RX (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC17_FEC0TX (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC18_FEC0RX (0x00000020)
|
|
+#define MCF_DMA_IMCR_SRC19_FEC0TX (0x00000080)
|
|
+#define MCF_DMA_IMCR_SRC20_FEC1RX (0x00000100)
|
|
+#define MCF_DMA_IMCR_SRC21_DREQ1 (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC21_FEC1TX (0x00000400)
|
|
+#define MCF_DMA_IMCR_SRC22_FEC0RX (0x00001000)
|
|
+#define MCF_DMA_IMCR_SRC23_FEC0TX (0x00004000)
|
|
+#define MCF_DMA_IMCR_SRC24_CTM0 (0x00010000)
|
|
+#define MCF_DMA_IMCR_SRC24_FEC1RX (0x00020000)
|
|
+#define MCF_DMA_IMCR_SRC25_CTM1 (0x00040000)
|
|
+#define MCF_DMA_IMCR_SRC25_FEC1TX (0x00080000)
|
|
+#define MCF_DMA_IMCR_SRC26_USBEP4 (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC26_CTM2 (0x00200000)
|
|
+#define MCF_DMA_IMCR_SRC27_USBEP5 (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC27_CTM3 (0x00800000)
|
|
+#define MCF_DMA_IMCR_SRC28_USBEP6 (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC28_CTM4 (0x01000000)
|
|
+#define MCF_DMA_IMCR_SRC28_DREQ1 (0x02000000)
|
|
+#define MCF_DMA_IMCR_SRC28_PSC2RX (0x03000000)
|
|
+#define MCF_DMA_IMCR_SRC29_DREQ1 (0x04000000)
|
|
+#define MCF_DMA_IMCR_SRC29_CTM5 (0x08000000)
|
|
+#define MCF_DMA_IMCR_SRC29_PSC2TX (0x0C000000)
|
|
+#define MCF_DMA_IMCR_SRC30_FEC1RX (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC30_CTM6 (0x10000000)
|
|
+#define MCF_DMA_IMCR_SRC30_PSC3RX (0x30000000)
|
|
+#define MCF_DMA_IMCR_SRC31_FEC1TX (0x00000000)
|
|
+#define MCF_DMA_IMCR_SRC31_CTM7 (0x80000000)
|
|
+#define MCF_DMA_IMCR_SRC31_PSC3TX (0xC0000000)
|
|
+
|
|
+#endif /* __MCF548X_DMA_H__ */
|
|
--- /dev/null
|
|
+++ b/include/asm-m68k/m5485sram.h
|
|
@@ -0,0 +1,12 @@
|
|
+#ifndef SYS_SRAM_H
|
|
+#define SYS_SRAM_H
|
|
+
|
|
+
|
|
+#define SYS_SRAM_DMA_START MCF_MBAR + 0x10000
|
|
+#define SYS_SRAM_DMA_SIZE 8192
|
|
+#define SYS_SRAM_FEC_START SYS_SRAM_DMA_START + SYS_SRAM_DMA_SIZE
|
|
+#define SYS_SRAM_FEC_SIZE 2048
|
|
+#define SYS_SRAM_SEC_START SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE
|
|
+#define SYS_SRAM_SEC_SIZE 1280
|
|
+
|
|
+#endif /* SYS_SRAM_H */
|