[svn-commits] kpfleming: branch mogorman/zaptel-1.2-transcoder
r2003 - /team/mogorman/zapte...
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Mon Jan 29 13:51:25 MST 2007
Author: kpfleming
Date: Mon Jan 29 14:51:24 2007
New Revision: 2003
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2003
Log:
various cleanups
don't use cmdq during processor booting, since it is unnecessary (reduces size of cmdq array by 80%)
Modified:
team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c
Modified: team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c
URL: http://svn.digium.com/view/zaptel/team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c?view=diff&rev=2003&r1=2002&r2=2003
==============================================================================
--- team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c (original)
+++ team/mogorman/zaptel-1.2-transcoder/wctc4xxp/base.c Mon Jan 29 14:51:24 2007
@@ -40,23 +40,15 @@
#include <asm/semaphore.h>
#include <linux/jiffies.h>
#include <linux/workqueue.h>
-#ifdef CONFIG_DEVFS_FS
-#include <linux/devfs_fs_kernel.h>
-#endif
+#include <linux/moduleparam.h>
+#include <linux/firmware.h>
+
#ifdef STANDALONE_ZAPATA
#include "zaptel.h"
#else
#include <linux/zaptel.h>
#endif
-#include <linux/moduleparam.h>
-#if defined(LINUX26)
-#include <linux/firmware.h>
-#else
-ostruct firmware {
- size_t size;
- u8 *data;
-};
-#endif
+
#if defined(HOTPLUG_FIRMWARE)
static const char *tc400m_firmware = "tc400m-firmware.bin";
#else
@@ -97,15 +89,10 @@
#define MAX_COMMANDS (NUM_CHANNELS + ACK_SPACE)
#define MAX_RCV_COMMANDS 16
-/* 1432 for boot, 274 for 30ms ulaw, 194 for 20ms ulaw */
-#define BOOT_CMD_LEN 1500
+/* 274 for 30ms ulaw, 194 for 20ms ulaw */
#define OTHER_CMD_LEN 300
-#if BOOT_CMD_LEN > OTHER_CMD_LEN
-#define MAX_COMMAND_LEN BOOT_CMD_LEN
-#else
#define MAX_COMMAND_LEN OTHER_CMD_LEN
-#endif
#define ERING_SIZE (NUM_CHANNELS / 2) /* Maximum ring size */
@@ -265,22 +252,19 @@
({ \
int ret = 0; \
do { \
- if (ret == 2) \
- { \
+ if (ret == 2) { \
wc->ztsnd_rtx++; \
if (hex == 0x0010) \
wc->ztsnd_0010_rtx++; \
} \
down(&wc->cmdqsem); \
wc->last_command_sent = hex; \
- if ( (((wc->cmdq_wndx + 1) % MAX_COMMANDS) == wc->cmdq_rndx) && debug ) \
- module_printk("cmdq is full\n"); \
- else { \
+ if ((((wc->cmdq_wndx + 1) % MAX_COMMANDS) == wc->cmdq_rndx)) {\
+ debug_printk(1, "cmdq is full\n"); \
+ } else { \
u8 fifo[OTHER_CMD_LEN] = command; \
- u32 i; \
wc->cmdq[wc->cmdq_wndx].cmdlen = length; \
- for (i = 0; i < length; i++) \
- wc->cmdq[wc->cmdq_wndx].cmd[i] = fifo[i]; \
+ memcpy(wc->cmdq[wc->cmdq_wndx].cmd, fifo, length); \
wc->cmdq_wndx = (wc->cmdq_wndx + 1) % MAX_COMMANDS; \
} \
__transmit_demand(wc); \
@@ -381,23 +365,18 @@
static struct dte_state *decoders;
static int debug = 0;
static char *mode;
-int debug_packets = 0;
-int debug_cmd_packets = 0;
+u32 debug_packets = 0;
+u32 debug_cmd_packets = 0;
static int create_channel(struct wcdte *wc, int simple, int complicated, int part1_id, int part2_id, unsigned int *dte_chan1, unsigned int *dte_chan2);
static int destroy_channel(struct wcdte *wc, unsigned int chan1, unsigned int chan2);
static void dte_init_state(struct dte_state *state_ptr, int encoder, unsigned int channel, struct wcdte *wc)
{
+ memset(state_ptr, 0, sizeof(*state_ptr));
+
state_ptr->encoder = encoder;
state_ptr->wc = wc;
- state_ptr->timestamp = 0;
- state_ptr->seqno = 0;
-
- state_ptr->packets_sent = 0;
- state_ptr->packets_received = 0;
- state_ptr->last_dte_seqno = 0;
- state_ptr->dte_seqno_rcv = 0;
state_ptr->chan_in_num = 999;
state_ptr->chan_out_num = 999;
@@ -410,7 +389,6 @@
state_ptr->timeslot_out_num = channel * 2;
}
}
-
static inline unsigned int zapfmt_to_dtefmt(unsigned int fmt)
{
@@ -447,6 +425,18 @@
spin_unlock_irqrestore(&wc->reglock, flags);
}
+static inline unsigned int getctl(struct wcdte *wc, unsigned int addr)
+{
+ unsigned long flags;
+ unsigned int val;
+
+ spin_lock_irqsave(&wc->reglock, flags);
+ val = __getctl(wc, addr);
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
+ return val;
+}
+
static inline void reinit_descriptor(struct wcdte *wc, int tx, int dbl, char *s)
{
unsigned int o2;
@@ -460,39 +450,13 @@
setctl(wc, 0x0008, 0x00000000);
}
-static inline unsigned int getctl(struct wcdte *wc, unsigned int addr)
-{
- unsigned long flags;
- unsigned int val;
-
- spin_lock_irqsave(&wc->reglock, flags);
- val = __getctl(wc, addr);
- spin_unlock_irqrestore(&wc->reglock, flags);
-
- return val;
-}
-
-static inline int __transmit_demand(struct wcdte *wc)
+static inline void __transmit_one(struct wcdte *wc, u8 *data, u32 length)
{
volatile u8 *writechunk;
- int o2, i, j;
- unsigned int reg, xmt_length;
-
- reg = getctl(wc, 0x0028) & 0x00700000;
-
- /* Already transmitting, no need to demand another */
- if (!((reg == 0) || (reg = 6)))
- return 1;
-
- /* Nothing to transmit */
- if (wc->cmdq_rndx == wc->cmdq_wndx)
- return 1;
-
- /* Nothing to transmit */
- if (!wc->cmdq[wc->cmdq_rndx].cmdlen)
- return 1;
-
- writechunk = (volatile u8 *)(wc->writechunk);
+ u32 o2;
+ u32 xmt_length;
+
+ writechunk = (volatile u8 *) (wc->writechunk);
writechunk += wc->tdbl * SFRAME_SIZE;
@@ -504,35 +468,61 @@
*/
do {} while ((le32_to_cpu(wc->descripchunk[o2]) & 0x80000000));
- xmt_length = max(wc->cmdq[wc->cmdq_rndx].cmdlen, 64U);
+ xmt_length = max(length, 64U);
wc->descripchunk[o2 + 1] = cpu_to_le32((le32_to_cpu(wc->descripchunk[o2 + 1]) & 0xFBFFF800) | xmt_length);
- for (i = 0; i < wc->cmdq[wc->cmdq_rndx].cmdlen; i++)
- writechunk[i] = wc->cmdq[wc->cmdq_rndx].cmd[i];
- for (j = i; j < xmt_length; j++)
- writechunk[j] = 0;
-
- if (debug_packets) {
- module_printk("TX: ");
- for (i = 0; i < debug_packets; i++)
- printk("%02X ", writechunk[i]);
- printk("\n");
- }
-
- if (debug_cmd_packets && (writechunk[12] == 0x88) && (writechunk[13] == 0x9B)) {
- module_printk("wcdte debug: TX: ");
- for (i = 0; i < debug_cmd_packets; i++)
- printk("%02X ", writechunk[i]);
- printk("\n");
- }
-
- wc->cmdq[wc->cmdq_rndx].cmdlen = 0;
+ memcpy((u8 *) writechunk, data, length);
+ if (length < xmt_length)
+ memset((u8 *) writechunk + length, 0, xmt_length - length);
wc->descripchunk[o2] = cpu_to_le32(0x80000000);
setctl(wc, 0x0008, 0x00000000); /* Transmit Poll Demand */
wc->tdbl = (wc->tdbl + 1) % ERING_SIZE;
+}
+
+static inline int __transmit_demand(struct wcdte *wc)
+{
+ int i;
+ unsigned int reg;
+ struct cmdq *cmdq;
+
+ reg = getctl(wc, 0x0028) & 0x00700000;
+
+ /* Already transmitting, no need to demand another */
+ if (!((reg == 0) || (reg = 6)))
+ return 1;
+
+ /* Nothing to transmit */
+ if (wc->cmdq_rndx == wc->cmdq_wndx)
+ return 1;
+
+ cmdq = &wc->cmdq[wc->cmdq_rndx];
+
+ /* Nothing to transmit */
+ if (!cmdq->cmdlen)
+ return 1;
+
+ __transmit_one(wc, cmdq->cmd, cmdq->cmdlen);
+
+ if (debug_packets) {
+ debug_printk(1, "TX: ");
+ for (i = 0; i < min(debug_packets, cmdq->cmdlen); i++)
+ printk("%02X ", cmdq->cmd[i]);
+ printk("\n");
+ }
+
+ if (debug_cmd_packets &&
+ (cmdq->cmd[12] == 0x88) &&
+ (cmdq->cmd[13] == 0x9B)) {
+ debug_printk(1, "TX: ");
+ for (i = 0; i < min(debug_cmd_packets, cmdq->cmdlen); i++)
+ printk("%02X ", cmdq->cmd[i]);
+ printk("\n");
+ }
+
+ cmdq->cmdlen = 0;
wc->cmdq_rndx = (wc->cmdq_rndx + 1) % MAX_COMMANDS;
@@ -1178,7 +1168,7 @@
static int boot_processor(struct wcdte *wc, const struct firmware *firmware)
{
- int i, j, byteloc, last_byteloc, length, delay_count;
+ int byteloc, last_byteloc, length, delay_count;
unsigned int reg, ret;
#if !defined(USE_TEST_HW)
@@ -1218,39 +1208,17 @@
debug_printk(1, "LINK STATUS: reg(0xfc) = %X\n", reg);
}
- /* TODO: what is this for? we don't refer to the read value anywhere */
- reg = getctl(wc, 0x00A0);
-
- byteloc = 17;
- j = 0;
-
- do {
- last_byteloc = byteloc;
-
- length = (firmware->data[byteloc] << 8) |firmware->data[byteloc+1];
+ for (ret = 0, last_byteloc = byteloc = 17; byteloc < (firmware->size - 20); last_byteloc = byteloc) {
+ length = (firmware->data[byteloc] << 8) | firmware->data[byteloc];
byteloc += 2;
-
- down(&wc->cmdqsem);
- if (((wc->cmdq_wndx + 1) % MAX_COMMANDS) == wc->cmdq_rndx) {
- debug_printk(1, "wcdte error: cmdq is full.\n");
- } else {
- wc->cmdq[wc->cmdq_wndx].cmdlen = length;
- for (i = 0; i < length; i++)
- wc->cmdq[wc->cmdq_wndx].cmd[i] = firmware->data[byteloc++];
- wc->cmdq_wndx = (wc->cmdq_wndx + 1) % MAX_COMMANDS;
- }
-
- __transmit_demand(wc);
- up(&wc->cmdqsem);
-
+ __transmit_one(wc, firmware->data + byteloc, length);
+ byteloc += length;
ret = waitfor_csmencaps(wc, RCV_CSMENCAPS_ACK, 1);
if (ret == 1)
return 1;
- else if (ret == 2) /* Retransmit if dte processor times out */
+ else if (ret == 2) /* Retransmit if processor times out */
byteloc = last_byteloc;
- j++;
-
- } while (byteloc < firmware->size-20);
+ }
wc->timeout = 10 * HZ;
if (waitfor_csmencaps(wc, RCV_CSMENCAPS, 1))
@@ -1258,6 +1226,7 @@
/* Turn on booted LED */
setctl(wc, 0x00A0, 0x04080000);
+
debug_printk(1, "Successfully booted DTE processor.\n");
return 0;
More information about the svn-commits
mailing list