laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/dahdi-linux/+/34012 )
Change subject: trunkdev: Implement DAHDI_MAINT_{LOCAL,NETWORKPAYLOAD}LOOP ......................................................................
trunkdev: Implement DAHDI_MAINT_{LOCAL,NETWORKPAYLOAD}LOOP
Using those maintenance modes we can test the local (DAHDI channel) and remote (trunkdev) sides indepdendent from each other.
Change-Id: I12cf9647fb6def38865aaac8ad6bbb58ebf7b5fd --- M drivers/dahdi/trunkdev/trunkdev.c 1 file changed, 64 insertions(+), 8 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/dahdi-linux refs/changes/12/34012/1
diff --git a/drivers/dahdi/trunkdev/trunkdev.c b/drivers/dahdi/trunkdev/trunkdev.c index 339b9d0..f185c53 100644 --- a/drivers/dahdi/trunkdev/trunkdev.c +++ b/drivers/dahdi/trunkdev/trunkdev.c @@ -161,6 +161,35 @@ return 0; }
+static const char *maint2str(int cmd) +{ + switch (cmd) { + case DAHDI_MAINT_NONE: return "NONE"; + case DAHDI_MAINT_LOCALLOOP: return "LOCALLOOP"; + case DAHDI_MAINT_NETWORKPAYLOADLOOP: return "NETWORKPAYLOADLOOP"; + default: return "UNKNOWN"; + } +} + +static int td_d_maint(struct dahdi_span *span, int cmd) +{ + struct dahdi_trunkdev *td = container_of(span, struct dahdi_trunkdev, dahdi.span); + + switch (cmd) { + case DAHDI_MAINT_NONE: + case DAHDI_MAINT_LOCALLOOP: + case DAHDI_MAINT_NETWORKPAYLOADLOOP: + /* we don't need to do anything, as span->maintstat is set by the core, + * just acknowledge those supported modes here */ + dev_info(&td->dahdi.dev->dev, "Setting maintenance mode to: %s\n", maint2str(cmd)); + break; + default: + return -ENOSYS; + } + return 0; +} + + /* called in hard_irq context with chan_lock held */ static void td_d_sync_tick(struct dahdi_span *span, int is_master) { @@ -178,14 +207,29 @@ uint8_t frame[32]; int rc;
- /* Trunk -> DAHDI direction */ - rc = frame_fifo_out(&td->from_trunk, frame); - if (rc >= 0) - _span_demux_one_frame(td, frame); + switch (span->maintstat) { + case DAHDI_MAINT_NONE: + /* Trunk -> DAHDI direction */ + rc = frame_fifo_out(&td->from_trunk, frame); + if (rc >= 0) + _span_demux_one_frame(td, frame);
- /* Trunk <- DAHDI direction */ - _span_mux_one_frame(td, frame); - frame_fifo_in(&td->to_trunk, frame); + /* Trunk <- DAHDI direction */ + _span_mux_one_frame(td, frame); + frame_fifo_in(&td->to_trunk, frame); + break; + case DAHDI_MAINT_LOCALLOOP: + /* Loop frame from DAHDI back to itself */ + _span_mux_one_frame(td, frame); + _span_demux_one_frame(td, frame); + break; + case DAHDI_MAINT_NETWORKPAYLOADLOOP: + /* Loop frame from trunkdev back to itself */ + rc = frame_fifo_out(&td->from_trunk, frame); + if (rc >= 0) + frame_fifo_in(&td->to_trunk, frame); + break; + } } /* wake up any processes doing blocking read or waiting in poll */ wake_up_interruptible(&td->waitq); @@ -197,7 +241,7 @@ .chanconfig = td_d_chanconfig, .startup = td_d_startup, .shutdown = td_d_shutdown, - //.maint = td_d_maint, + .maint = td_d_maint, .sync_tick = td_d_sync_tick, };