[svn-commits] sruffell: branch sruffell/zaptel-1.4-transcoder r4256 - /team/sruffell/zaptel...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon May 12 14:09:05 CDT 2008
Author: sruffell
Date: Mon May 12 14:09:03 2008
New Revision: 4256
URL: http://svn.digium.com/view/zaptel?view=rev&rev=4256
Log:
Added an early trace option for debugging.
Modified:
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/Kbuild
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.c
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.h
team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h
Modified: team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/Kbuild
URL: http://svn.digium.com/view/zaptel/team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/Kbuild?view=diff&rev=4256&r1=4255&r2=4256
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/Kbuild (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/Kbuild Mon May 12 14:09:03 2008
@@ -8,7 +8,8 @@
EXTRA_CFLAGS+=-DHOTPLUG_FIRMWARE
endif
-wctc4xxp-objs := base.o wcdte_net.o
+wctc4xxp-objs := base.o
+wctc4xxp-objs += wcdte_net.o
ifneq ($(HOTPLUG_FIRMWARE),yes)
wctc4xxp-objs += $(FIRM_DIR)/zaptel-fw-tc400m.o
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=4256&r1=4255&r2=4256
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/base.c Mon May 12 14:09:03 2008
@@ -475,15 +475,6 @@
return c;
}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-/*! Used to allocate commands to submit to the dte. */
-kmem_cache_t *cmd_cache;
-#else
-/*! Used to allocate commands to submit to the dte. */
-struct kmem_cache *cmd_cache;
-#endif
-
-
static inline void __wcdte_setctl(struct wcdte *wc, unsigned int addr, unsigned int val)
{
outl(val, wc->iobase + addr);
@@ -524,38 +515,6 @@
spin_unlock_irqrestore(&wc->reglock, flags);
}
-static void initialize_cmd(struct dte_cmd *cmd, unsigned long cmd_flags)
-{
- memset(cmd, 0, sizeof(*cmd));
- INIT_LIST_HEAD(&cmd->node);
- init_completion(&cmd->complete);
- cmd->flags = cmd_flags;
-}
-
-static inline struct dte_cmd *
-__alloc_cmd(unsigned alloc_flags, unsigned long cmd_flags)
-{
- struct dte_cmd *cmd;
-
- cmd = kmem_cache_alloc(cmd_cache, alloc_flags);
- if (likely(cmd)) {
- initialize_cmd(cmd, cmd_flags);
- }
- return cmd;
-}
-static inline struct dte_cmd *
-alloc_cmd(void)
-{
- return __alloc_cmd(GFP_KERNEL, 0);
-}
-
-static inline void
-free_cmd(struct dte_cmd *cmd)
-{
- kmem_cache_free(cmd_cache, cmd);
- return;
-}
-
static void
wcdte_cleanup_descriptor_ring(struct dte_descriptor_ring *dr)
{
@@ -622,54 +581,7 @@
static void wcdte_capture_packet(struct wcdte *wc, const struct dte_cmd *cmd)
{
-
-#if 0
- struct dte_cmd *new;
- unsigned long flags;
- unsigned long alloc_flags;
-
- if (0 == debug_packets) {
- /* We're not capturing packets */
- return;
- }
-
- alloc_flags = (in_interrupt()) ? GFP_ATOMIC : GFP_KERNEL;
- if (!(new = __alloc_cmd(alloc_flags, 0))) {
- DTE_DEBUG(DTE_DEBUG_GENERAL, "Cannot capture packet.\n");
- return;
- }
- memcpy(new->cmd, cmd->cmd, sizeof(cmd->cmd));
- spin_lock_irqsave(&wc->captured_list_lock, flags);
- if (++wc->captured_list_length > debug_packets) {
- /* Remove the oldest item from the captured list to limit the
- * amount of memory consumed by packet capture.
- */
- struct dte_cmd *old;
- old = list_entry(wc->captured_packets.next, struct dte_cmd, node);
- list_del(&old->node);
- free_cmd(old);
- --wc->captured_list_length;
- }
- list_add_tail(&new->node, &wc->captured_packets);
- spin_unlock_irqrestore(&wc->captured_list_lock, flags);
-#else
-
wcdte_net_capture_cmd(wc, cmd);
-#endif
-}
-
-static void wcdte_cleanup_captured_packets(struct wcdte *wc)
-{
- unsigned long flags;
- struct dte_cmd *cmd;
- struct dte_cmd *temp;
- spin_lock_irqsave(&wc->captured_list_lock, flags);
- list_for_each_entry_safe(cmd, temp, &wc->captured_packets, node) {
- list_del(&cmd->node);
- free_cmd(cmd);
- }
- WARN_ON(!list_empty(&wc->cmd_list));
- spin_unlock_irqrestore(&wc->captured_list_lock, flags);
}
/**
@@ -693,6 +605,9 @@
if (cmd->cmdlen < MIN_PACKET_LEN) {
memset(&cmd->cmd[cmd->cmdlen],0,MIN_PACKET_LEN-cmd->cmdlen);
cmd->cmdlen = MIN_PACKET_LEN;
+ } else if (cmd->cmdlen > SFRAME_SIZE) {
+ DTE_PRINTK(WARNING, "Packet of size %d passed to dte_transmit_cmd.\n", cmd->cmdlen);
+ cmd->cmdlen = SFRAME_SIZE;
}
wcdte_capture_packet(wc, cmd);
if (unlikely((res=dte_submit(wc->txd, cmd)))) {
@@ -1152,8 +1067,8 @@
* transcode.
*/
ret = wait_event_interruptible_timeout(cpvt->waitq,
- (!list_empty(&cpvt->rx_queue)), HZ/326);
- if (-ERESTARTSYS == ret) {
+ (!list_empty(&cpvt->rx_queue)), HZ/32);
+ if (-ERESTARTSYS == ret) {
/* Signal interrupted the wait */
return -EINTR;
} else if (ret) {
@@ -1407,8 +1322,8 @@
/* Just for debugging purposes. */
rlen = (cmd->cmd[39] | (cmd->cmd[38] << 8)) - 20;
- DTE_DEBUG(DTE_DEBUG_RTP_RX, "Adding RTP packet of length %d to channel: %p\n",
- rlen, ztc);
+ DTE_DEBUG(DTE_DEBUG_RTP_RX,
+ "Adding RTP packet of length %d to channel: %p\n", rlen, ztc);
spin_lock_irqsave(&cpvt->lock, flags);
list_add_tail(&cmd->node, &cpvt->rx_queue);
spin_unlock_irqrestore(&cpvt->lock, flags);
@@ -2514,10 +2429,8 @@
init_MUTEX(&wc->chansem);
spin_lock_init(&wc->reglock);
spin_lock_init(&wc->cmd_list_lock);
- spin_lock_init(&wc->captured_list_lock);
INIT_LIST_HEAD(&wc->cmd_list);
INIT_LIST_HEAD(&wc->lost_cmd_list);
- INIT_LIST_HEAD(&wc->captured_packets);
DTE_PRINTK(INFO, "Attached to device at %s.\n", pci_name(wc->pdev));
@@ -2587,7 +2500,7 @@
min_numchannels = min(g723_numchannels, g729_numchannels);
-#if 0 /* Still working on G.723 with new interface. Limit to G.729 for now. */
+#if 1 /* Still working on G.723 with new interface. Limit to G.729 for now. */
if (!mode || strlen(mode) < 4) {
sprintf(wc->complexname, "G.729a / G.723.1");
complexfmts = ZT_FORMAT_G729A | ZT_FORMAT_G723_1;
@@ -2617,6 +2530,12 @@
if ((res = initialize_decoders(wc, complexfmts))) {
goto error_exit_swinit;
}
+
+ if (DTE_DEBUG_NETWORK_IF & debug) {
+ if ((res = wcdte_net_register(wc))) {
+ goto error_exit_swinit;
+ }
+ }
/* ------------------------------------------------------------------
* Load the firmware and start the DTE.
@@ -2673,9 +2592,6 @@
wcdte_debugfs_create_board_entry(wc);
zt_transcoder_register(wc->uencode);
zt_transcoder_register(wc->udecode);
- if (DTE_DEBUG_NETWORK_IF & debug) {
- wcdte_net_register(wc);
- }
LEAVING();
return 0;
@@ -2686,6 +2602,7 @@
pci_set_drvdata(pdev, NULL);
release_region(wc->iobase, 0xff);
error_exit_swinit:
+ if (wc->netdev) wcdte_net_unregister(wc);
if (wc->encoders) kfree(wc->encoders);
if (wc->decoders) kfree(wc->decoders);
if (wc->uencode) zt_transcoder_free(wc->uencode);
@@ -2734,8 +2651,6 @@
wcdte_net_unregister(wc);
- wcdte_cleanup_captured_packets(wc);
-
wcdte_debugfs_remove_board_entry(wc);
if (debug) {
@@ -2819,6 +2734,14 @@
resume: NULL,
id_table: wcdte_pci_tbl,
};
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+/*! Used to allocate commands to submit to the dte. */
+kmem_cache_t *cmd_cache;
+#else
+/*! Used to allocate commands to submit to the dte. */
+struct kmem_cache *cmd_cache;
+#endif
int __init ztdte_init(void)
{
Modified: team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.c
URL: http://svn.digium.com/view/zaptel/team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.c?view=diff&rev=4256&r1=4255&r2=4256
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.c (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.c Mon May 12 14:09:03 2008
@@ -27,13 +27,31 @@
*
*/
+#include "wctc4xxp.h"
+
+#ifdef CONFIG_WCDTE_NETWORK_IF
+
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/etherdevice.h>
-
-#include "wctc4xxp.h"
-
-extern int debug;
+#include <linux/delay.h>
+
+
+#define HERE() printk(KERN_DEBUG "HERE: %s:%d\n", __FILE__, __LINE__)
+
+static struct sk_buff *
+wcdte_cmd_to_skb(struct net_device *netdev, const struct dte_cmd *cmd)
+{
+ struct sk_buff *skb;
+ skb = alloc_skb(cmd->cmdlen, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+ if (skb) {
+ skb->dev = netdev;
+ skb_put(skb, cmd->cmdlen);
+ memcpy(skb->data, cmd->cmd, cmd->cmdlen);
+ skb->protocol = eth_type_trans(skb,netdev);
+ }
+ return skb;
+}
static void wcdte_net_set_multi(struct net_device *netdev)
{
@@ -41,25 +59,19 @@
DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
}
-static int wcdte_net_open(struct net_device *netdev)
-{
- struct wcdte *wc = netdev->priv;
- DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
-#if 0
- if (!try_module_get(THIS_MODULE)) {
- return -EBUSY;
- }
-#endif
- return 0;
-}
-
-static int wcdte_net_stop(struct net_device *netdev)
-{
- struct wcdte *wc = netdev->priv;
- DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
-#if 0
- module_put(THIS_MODULE);
-#endif
+static int wcdte_net_up(struct net_device *netdev)
+{
+ struct wcdte *wc = netdev->priv;
+ DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
+ netif_poll_enable(netdev);
+ return 0;
+}
+
+static int wcdte_net_down(struct net_device *netdev)
+{
+ struct wcdte *wc = netdev->priv;
+ DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
+ netif_poll_disable(netdev);
return 0;
}
@@ -68,6 +80,40 @@
struct wcdte *wc = netdev->priv;
DTE_DEBUG(DTE_DEBUG_GENERAL, "%s\n", __FUNCTION__);
return 0;
+}
+
+static int wcdte_poll(struct net_device *netdev, int *budget)
+{
+ int res;
+ struct sk_buff *skb;
+ struct wcdte *wc = netdev->priv;
+ int count = 0;
+ int quota = min(netdev->quota, *budget);
+
+ while ((skb = skb_dequeue(&wc->captured_packets)) && (count++ < quota)) {
+ if ((res = netif_receive_skb(skb))) {
+ if (NET_RX_DROP == res ) {
+ DTE_DEBUG(DTE_DEBUG_GENERAL,
+ "Kernel dropped packet.\n");
+ } else {
+ DTE_DEBUG(DTE_DEBUG_GENERAL,
+ "ret = %d\n", res);
+ }
+ }
+ }
+
+ *budget -= count;
+ netdev->quota -= count;
+
+ if (skb) {
+ /* We still have socket buffers ready. */
+ return -1;
+ } else {
+ /* There were not any more buffers in the queue, so we're
+ * done. */
+ netif_rx_complete(netdev);
+ return 0;
+ }
}
int wcdte_net_register(struct wcdte *wc)
@@ -81,17 +127,44 @@
netdev->priv = wc;
netdev->set_multicast_list = &wcdte_net_set_multi;
- netdev->open = &wcdte_net_open;
- netdev->stop = &wcdte_net_stop;
+ netdev->open = &wcdte_net_up;
+ netdev->stop = &wcdte_net_down;
netdev->hard_start_xmit = &wcdte_hard_start_xmit;
+ netdev->poll = &wcdte_poll;
+ netdev->weight = 64;
+ set_bit(__LINK_STATE_START, &netdev->state);
wc->netdev = netdev;
+
+ skb_queue_head_init(&wc->captured_packets);
DTE_PRINTK(DEBUG, "Creating network device %s for debug.\n", wc->board_name);
if ((res = register_netdev(netdev))) {
goto error_sw;
}
+ netif_poll_disable(netdev);
+
+ if (debug & DTE_DEBUG_NETWORK_EARLY) {
+ unsigned int seconds = 15;
+ DTE_PRINTK(INFO,
+ "Waiting %d seconds for adapter to be placed in " \
+ "promiscuous mode for early trace.\n", seconds);
+ while (!netdev->promiscuity) {
+ if (signal_pending(current)) {
+ DTE_PRINTK(INFO,
+ "Aborting wait due to signal.\n");
+ break;
+ }
+ msleep(1000);
+ if (!(seconds--)) {
+ DTE_PRINTK(INFO,
+ "Aborting wait due to timeout.\n");
+ break;
+ }
+ }
+ }
+
return 0;
error_sw:
@@ -101,36 +174,46 @@
void wcdte_net_unregister(struct wcdte *wc)
{
+ struct sk_buff *skb;
if (!wc->netdev) {
return;
}
unregister_netdev(wc->netdev);
+
+ while ((skb = skb_dequeue(&wc->captured_packets))) {
+ kfree_skb(skb);
+ }
+
free_netdev(wc->netdev);
wc->netdev = NULL;
}
/* Called when either a dte_cmd is being transmitted or received by the driver
- * and should be sent up to any processed (i.e. tcpdump) that are monitoring
+ * and should be sent up to any processes (i.e. tcpdump) that are monitoring
* the traffic.
*/
void wcdte_net_capture_cmd(struct wcdte *wc, const struct dte_cmd *cmd)
{
struct sk_buff *skb;
- if (NULL == wc->netdev) {
- return;
- }
-
- skb = netdev_alloc_skb(wc->netdev, cmd->cmdlen);
- if (skb) {
- skb->dev = wc->netdev;
- skb_put(skb, cmd->cmdlen);
- memcpy(skb->data, cmd->cmd, cmd->cmdlen);
- skb->protocol = eth_type_trans(skb,wc->netdev);
- netif_rx(skb);
- }
-
+ if (!wc->netdev) {
+ return;
+ }
+
+ if (!wc->netdev->promiscuity) {
+ return;
+ }
+
+ if (!(skb = wcdte_cmd_to_skb(wc->netdev, cmd))) {
+ return;
+ }
+
+ skb_queue_tail(&wc->captured_packets, skb);
+ netif_rx_schedule(wc->netdev);
return;
}
+
+
+#endif /* CONFIG_WCDTE_NETWORK_IF */
Modified: team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.h
URL: http://svn.digium.com/view/zaptel/team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.h?view=diff&rev=4256&r1=4255&r2=4256
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.h (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wcdte_net.h Mon May 12 14:09:03 2008
@@ -4,8 +4,14 @@
struct wcdte;
struct dte_cmd;
+#ifdef CONFIG_WCDTE_NETWORK_IF
extern int wcdte_net_register(struct wcdte *wc);
extern void wcdte_net_unregister(struct wcdte *wc);
extern void wcdte_net_capture_cmd(struct wcdte *wc, const struct dte_cmd *cmd);
+#else
+static inline int wcdte_net_register(struct wcdte *wc) { return 0; }
+#define wcdte_net_unregister(__x) do {;} while(0)
+#define wcdte_net_capture_cmd(__x, __b) do {;} while(0)
+#endif
#endif
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=4256&r1=4255&r2=4256
==============================================================================
--- team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h (original)
+++ team/sruffell/zaptel-1.4-transcoder/kernel/wctc4xxp/wctc4xxp.h Mon May 12 14:09:03 2008
@@ -27,6 +27,7 @@
#ifndef __WCTC4XXP_H__
#define __WCTC4XXP_H__
+#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
@@ -46,6 +47,7 @@
#define DTE_DEBUG_RTP_RX (1 << 3) /* 8 */
#define DTE_DEBUG_RX_TIMEOUT (1 << 4) /* 16 */
#define DTE_DEBUG_NETWORK_IF (1 << 5) /* 32 */
+#define DTE_DEBUG_NETWORK_EARLY (1 << 6) /* 64 */
#define DTE_DEBUG(_dbgmask, _fmt, _args...) \
if ((debug & _dbgmask) == (_dbgmask)) { \
@@ -53,6 +55,8 @@
} \
#define SFRAME_SIZE 1518
+
+extern int debug;
struct dte_cmd {
/*! number of bytes in cmd */
@@ -65,6 +69,48 @@
/* cmd must be the last field. */
u8 cmd[SFRAME_SIZE];
};
+
+static inline void initialize_cmd(struct dte_cmd *cmd, unsigned long cmd_flags)
+{
+ memset(cmd, 0, sizeof(*cmd));
+ INIT_LIST_HEAD(&cmd->node);
+ init_completion(&cmd->complete);
+ cmd->flags = cmd_flags;
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+/*! Used to allocate commands to submit to the dte. */
+extern kmem_cache_t *cmd_cache;
+#else
+/*! Used to allocate commands to submit to the dte. */
+extern struct kmem_cache *cmd_cache;
+#endif
+
+
+static inline struct dte_cmd *
+__alloc_cmd(unsigned alloc_flags, unsigned long cmd_flags)
+{
+ struct dte_cmd *cmd;
+
+ cmd = kmem_cache_alloc(cmd_cache, alloc_flags);
+ if (likely(cmd)) {
+ initialize_cmd(cmd, cmd_flags);
+ }
+ return cmd;
+}
+
+static inline struct dte_cmd *
+alloc_cmd(void)
+{
+ return __alloc_cmd(GFP_KERNEL, 0);
+}
+
+static inline void
+free_cmd(struct dte_cmd *cmd)
+{
+ kmem_cache_free(cmd_cache, cmd);
+ return;
+}
struct channel_pvt;
struct dte_descriptor_ring;
@@ -115,17 +161,8 @@
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_file;
#endif
- /* \todo In order to add this to the list of cards checked by the watchdog
- * timer. */
- struct list_head watchdog_node;
- /* Used for debugging */
- spinlock_t captured_list_lock;
- struct list_head captured_packets;
- /* Number of packets on captured_packets for this device. */
- unsigned int captured_list_length;
-
- /* \todo either this or the capture list... */
+ struct sk_buff_head captured_packets;
struct net_device *netdev;
};
@@ -144,4 +181,6 @@
__res; \
})
+#define CONFIG_WCDTE_NETWORK_IF
+
#endif /* __WCTC4XXP_H__ */
More information about the svn-commits
mailing list