[svn-commits] sruffell: branch sruffell/zaptel-1.4-transcoder r4318 - /team/sruffell/zaptel...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Thu May 22 12:01:16 CDT 2008
Author: sruffell
Date: Thu May 22 12:01:15 2008
New Revision: 4318
URL: http://svn.digium.com/view/zaptel?view=rev&rev=4318
Log:
Primarily....
- Release the io region if firmware isn't availble from user space.
- Do not compile in the network interface by default.
Modified:
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h
Modified: team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c
URL: http://svn.digium.com/view/zaptel/team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c?view=diff&rev=4318&r1=4317&r2=4318
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c Thu May 22 12:01:15 2008
@@ -93,7 +93,7 @@
#define G729_SAMPLES 160 /* G.729 */
#define G723_SAMPLES 240 /* G.723.1 */
-#define G729_BYTES 20 /* G.729 */
+#define G729_BYTES 20 /* G.729 */
#define G723_6K_BYTES 24 /* G.723.1 at 6.3kb/s */
#define G723_5K_BYTES 20 /* G.723.1 at 5.3kb/s */
#define G723_SID_BYTES 4 /* G.723.1 SID frame */
@@ -543,8 +543,7 @@
dr->desc, dr->desc_dma);
}
-static void
-wcdte_cleanup_command_list(struct wcdte *wc)
+static void wcdte_cleanup_command_list(struct wcdte *wc)
{
unsigned long flags;
struct dte_cmd *cmd;
@@ -560,6 +559,7 @@
free_cmd(cmd);
}
WARN_ON(!list_empty(&wc->cmd_list));
+ WARN_ON(!list_empty(&wc->lost_cmd_list));
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
}
@@ -696,49 +696,19 @@
static int __zt_send_cmd(struct wcdte *wc, struct dte_cmd *cmd)
{
int ret = 0;
- u16 command;
- unsigned int retries = 0;
- const unsigned int MAX_RETRIES = 1;
-
- command = (cmd->cmd[0x18] << 8) | cmd->cmd[0x19];
-
- wc->last_command_sent = command;
- wc->last_seqno = cmd->cmd[16];
-
- /* \todo I put the retry code in here, before determining that packets
- * were sitting in the tx queue. I haven't yet seen a case where the
- * retry actually allows a packet to complete. Might be a candidate
- * for removal in order to simplify this function. */
- while (retries++ < MAX_RETRIES) {
- dte_transmit_cmd(wc, cmd);
-#if 0 /* This is debug code when investigating the source of the timeouts... */
- if (wait_for_completion_killable(&cmd->complete)) {
- DTE_DEBUG(DTE_DEBUG_GENERAL,
- "Failed to complete transmit.\n");
-
- /* Save this command on the lost list in order to be
- * cleaned up later. */
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
- list_add_tail(&cmd->node, &wc->lost_cmd_list);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
- return -EINTR;
- }
-#else
- /* wait_for_completion(&cmd->complete); */
-#endif
- /* \todo why is this command treated differently? */
- if (0x0000 == command) {
- ret = wcdte_waitfor_dte(wc, RCV_CSMENCAPS_ACK, 2);
- } else {
- ret = wcdte_waitfor_dte(wc, RCV_CSMENCAPS, 0);
- }
- if (unlikely(-EIO == ret)) {
- continue;
- }
- break;
- }
- free_cmd(cmd);
-
+ struct csm_encaps_hdr *cmd_hdr = (struct csm_encaps_hdr*)(&cmd->cmd[14]);
+
+ wc->last_command_sent = be16_to_cpu(cmd_hdr->function);
+ wc->last_seqno = cmd_hdr->seq_num;
+
+ dte_transmit_cmd(wc, cmd);
+
+ /* \todo why is this command treated differently? */
+ if (0x0000 == cmd_hdr->function) {
+ ret = wcdte_waitfor_dte(wc, RCV_CSMENCAPS_ACK, 2);
+ } else {
+ ret = wcdte_waitfor_dte(wc, RCV_CSMENCAPS, 0);
+ }
return ret;
}
@@ -1411,20 +1381,6 @@
}
}
-#if DEFERRED_PROCESSING == WORKQUEUE
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-static void dte_wque_run(struct work_struct *work)
-{
- struct wcdte *wc = container_of(work, struct wcdte, dte_work);
-#else
-static void dte_wque_run(void *work_data)
-{
- struct wcdte *wc = work_data;
-#endif
- service_dte(wc);
-}
-#endif
-
ZAP_IRQ_HANDLER(wcdte_interrupt)
{
struct wcdte *wc = dev_id;
@@ -1450,11 +1406,7 @@
if (ints & RX_COMPLETE_INTERRUPT) {
reg |= RX_COMPLETE_INTERRUPT;
}
-# if DEFERRED_PROCESSING == WORKQUEUE
- queue_work(wc->dte_wq, &wc->dte_work);
-# else
service_dte(wc);
-# endif
wcdte_setctl(wc, 0x0028, reg);
} else {
if ((ints & 0x00008000) && debug)
@@ -1468,11 +1420,6 @@
if ((ints & 0x00000080) && debug) {
DTE_PRINTK(INFO, "Receive Desciptor Unavailable INT\n");
-# if DEFERRED_PROCESSING == WORKQUEUE
- queue_work(wc->dte_wq, &wc->dte_work);
-# else
- service_dte(wc);
-# endif
}
if ((ints & 0x00000020) && debug)
@@ -1876,43 +1823,6 @@
return 0;
}
-#if 0
-static int
-call_create_channel(struct wcdte *wc, int seq_num, int timeslot)
-{
- int res = 0;
- struct dte_cmd *cmd;
- u8 _cmd[] = CMD_MSG_CREATE_CHANNEL(seq_num, timeslot);
-
- if (!(cmd = alloc_cmd(wc))) {
- return -ENOMEM;
- }
- BUG_ON(sizeof(_cmd) > SFRAME_SIZE);
- memcpy(cmd->cmd, _cmd, sizeof(_cmd));
- cmd->cmdlen = sizeof(_cmd);
- dte_transmit_cmd(wc, cmd);
- /* todo wait for the command to complete */
- return res;
-}
-
-static int
-call_query_channel(struct wcdte *wc, int seq_num, int timeslot)
-{
- struct dte_cmd *cmd;
- u8 _cmd[] = CMD_MSG_QUERY_CHANNEL(seq_num, timeslot);
- if (!(cmd = alloc_cmd(wc))) {
- return -ENOMEM;
- }
- BUG_ON(sizeof(_cmd) > SFRAME_SIZE);
- memcpy(cmd->cmd, _cmd, sizeof(_cmd));
- cmd->cmdlen = sizeof(_cmd);
- dte_transmit_cmd(wc, cmd);
- /* \todo wait for the command to complete */
- return 0;
-}
-
-#endif
-
static int
wcdte_create_channel_pair(struct wcdte *wc, struct channel_pvt *cpvt,
u8 simple, u8 complicated)
@@ -2430,7 +2340,8 @@
ifaces[x] = wc;
memset(wc, 0, sizeof(*wc));
- snprintf(wc->board_name, sizeof(wc->board_name), "tc400b%d", x);
+ snprintf(wc->board_name, sizeof(wc->board_name)-1, "%s%d",
+ d->short_name, x);
wc->iobase = pci_resource_start(pdev, 0);
wc->pdev = pdev;
wc->pos = x;
@@ -2483,21 +2394,10 @@
goto error_exit_swinit;
}
-# if DEFERRED_PROCESSING == WORKQUEUE
- /* Initialize the work queue */
- wc->dte_wq = create_singlethread_workqueue(board_name);
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
- INIT_WORK(&wc->dte_work, dte_wque_run);
-# else
- INIT_WORK(&wc->dte_work, dte_wque_run, wc);
-# endif
-# endif
-
-
#if defined(HOTPLUG_FIRMWARE)
if ((res = request_firmware(&firmware, tc400m_firmware, &wc->pdev->dev)) ||
!firmware) {
- DTE_PRINTK(ERR, "Firmware %s not available from userspace.\n", tc400m_firmware);
+ DTE_PRINTK(ERR, "Firmware %s not available from userspace. (%d)\n", tc400m_firmware, res);
goto error_exit_swinit;
}
#else
@@ -2605,6 +2505,7 @@
zt_transcoder_register(wc->uencode);
zt_transcoder_register(wc->udecode);
LEAVING();
+
return 0;
error_exit_hwinit:
@@ -2612,21 +2513,25 @@
wcdte_cleanup_command_list(wc);
free_irq(pdev->irq, wc);
pci_set_drvdata(pdev, NULL);
- release_region(wc->iobase, 0xff);
error_exit_swinit:
- if (wc->netdev) wcdte_net_unregister(wc);
+ wcdte_net_unregister(wc);
if (wc->encoders) kfree(wc->encoders);
if (wc->decoders) kfree(wc->decoders);
if (wc->uencode) zt_transcoder_free(wc->uencode);
if (wc->udecode) zt_transcoder_free(wc->udecode);
if (wc->txd) {
- if (wc->txd->desc) wcdte_cleanup_descriptor_ring(wc->txd);
+ if (wc->txd->desc) {
+ wcdte_cleanup_descriptor_ring(wc->txd);
+ }
kfree(wc->txd);
}
if (wc->rxd) {
- if (wc->rxd && wc->rxd->desc) wcdte_cleanup_descriptor_ring(wc->rxd);
+ if (wc->rxd && wc->rxd->desc) {
+ wcdte_cleanup_descriptor_ring(wc->rxd);
+ }
kfree(wc->rxd);
}
+ release_region(wc->iobase, 0xff);
kfree(wc);
LEAVING();
return res;
@@ -2696,11 +2601,6 @@
/* There isn't anything that would run in the workqueue that will wait
* on an interrupt. */
-#if DEFERRED_PROCESSING == WORKQUEUE
- /* Kill workqueue */
- destroy_workqueue(wc->dte_wq);
-#endif
-
zt_transcoder_unregister(wc->udecode);
zt_transcoder_unregister(wc->uencode);
@@ -2758,11 +2658,18 @@
int __init ztdte_init(void)
{
int res;
+# ifndef CONFIG_WCDTE_NETWORK_IF
+ if (debug & (DTE_DEBUG_NETWORK_IF|DTE_DEBUG_NETWORK_EARLY)) {
+ printk(KERN_WARNING "%s: The Network interface was not compiled into the driver.\n", THIS_MODULE->name);
+ debug &= ~(DTE_DEBUG_NETWORK_IF|DTE_DEBUG_NETWORK_EARLY);
+ }
+# endif
+
# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
- cmd_cache = kmem_cache_create("tc400b", sizeof(struct dte_cmd), 0,
+ cmd_cache = kmem_cache_create(THIS_MODULE->name, sizeof(struct dte_cmd), 0,
SLAB_HWCACHE_ALIGN, NULL, NULL);
# else
- cmd_cache = kmem_cache_create("tc400b", sizeof(struct dte_cmd), 0,
+ cmd_cache = kmem_cache_create(THIS_MODULE->name, sizeof(struct dte_cmd), 0,
SLAB_HWCACHE_ALIGN, NULL);
# endif
@@ -2783,8 +2690,6 @@
kmem_cache_destroy(cmd_cache);
}
-module_param(debug_packets, int, S_IRUGO);
-MODULE_PARM_DESC(debug_packets, "The maximum number of packets to save.");
module_param(debug, int, S_IRUGO | S_IWUSR);
module_param(debug_des, int, S_IRUGO | S_IWUSR);
module_param(debug_des_cnt, int, S_IRUGO | S_IWUSR);
Modified: team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h
URL: http://svn.digium.com/view/zaptel/team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h?view=diff&rev=4318&r1=4317&r2=4318
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h Thu May 22 12:01:15 2008
@@ -37,7 +37,13 @@
#include <linux/netdevice.h>
#include <linux/completion.h>
-#define CONFIG_WCDTE_NETWORK_IF
+/* COMPILE TIME OPTIONS =================================================== */
+
+/* If CONFIG_WCDTE_NETWORK_IF is defined the driver will create a standard
+ * network interface for debugging. */
+
+#undef CONFIG_WCDTE_NETWORK_IF
+
#define WARN() WARN_ON(1)
#define DTE_PRINTK(_lvl, _fmt, _args...) \
@@ -56,7 +62,17 @@
printk(KERN_DEBUG "%s: " _fmt, (wc)->board_name, ## _args); \
} \
-#define SFRAME_SIZE 1518
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#define WARN_ON_ONCE(__condition) do { \
+ static int __once = 1; \
+ if (unlikely(__condition)) { \
+ if (__once) { \
+ __once = 0; \
+ WARN_ON(0); \
+ } \
+ } \
+} while(0)
+#endif
extern int debug;
@@ -70,6 +86,7 @@
unsigned long flags;
struct completion complete;
/* cmd must be the last field. */
+#define SFRAME_SIZE 1518
u8 cmd[SFRAME_SIZE];
};
@@ -89,7 +106,6 @@
extern struct kmem_cache *cmd_cache;
#endif
-
static inline struct dte_cmd *
__alloc_cmd(unsigned alloc_flags, unsigned long cmd_flags)
{
@@ -120,9 +136,7 @@
struct wcdte {
char board_name[40];
- struct pci_dev *pdev;
const char *variety;
- unsigned int intmask;
int pos;
int cards;
spinlock_t reglock;
@@ -137,6 +151,7 @@
spinlock_t cmd_list_lock;
struct list_head cmd_list;
+
/* This is a list to hold those commands which were flagged to not
* auto delete, but which we stopped waiting for because of a signal.
* Use the cmd_list_lock to protect this list. */
@@ -157,16 +172,12 @@
* physical interface to the transcoding engine.
*
*/
- unsigned long iobase;
+ struct pci_dev *pdev;
+ unsigned int intmask;
+ unsigned long iobase;
struct dte_descriptor_ring *txd;
struct dte_descriptor_ring *rxd;
-#if DEFERRED_PROCESSING == WORKQUEUE
- struct workqueue_struct *dte_wq;
- struct work_struct dte_work;
-#endif
- struct work_struct reset_work;
-
struct zt_transcoder *uencode;
struct zt_transcoder *udecode;
struct channel_pvt *encoders;
@@ -176,13 +187,13 @@
struct dentry *debugfs_file;
#endif
+#ifdef CONFIG_WCDTE_NETWORK_IF
/*
* This section contains the members necessary for exporting the
* network interface to the host system. This is only used for
* debugging purposes.
*
*/
-#ifdef CONFIG_WCDTE_NETWORK_IF
struct sk_buff_head captured_packets;
struct net_device *netdev;
struct net_device_stats net_stats;
@@ -194,6 +205,7 @@
};
static inline int wcdte_reset_pending(struct wcdte *wc) {
+
return test_bit(DTEF_RESET_PENDING, &wc->flags);
}
@@ -206,7 +218,7 @@
int __res; \
u8 _cmd[] = command; \
struct dte_cmd *cmd; \
- if (!(cmd=__alloc_cmd(GFP_KERNEL, NO_AUTO_FREE_CMD))) \
+ if (!(cmd=__alloc_cmd(GFP_KERNEL, 0))) \
return -ENOMEM; \
BUG_ON(sizeof(_cmd) > SFRAME_SIZE); \
memcpy(cmd->cmd, _cmd, sizeof(_cmd)); \
More information about the svn-commits
mailing list