[svn-commits] sruffell: linux/trunk r9087 - /linux/trunk/drivers/dahdi/wctdm24xxp/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Aug 3 19:18:53 CDT 2010


Author: sruffell
Date: Tue Aug  3 19:18:49 2010
New Revision: 9087

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9087
Log:
wctdm24xxp: 'struct dahdi_span' is already embedded in the 'struct wctdm_span'.

We cannot also embed it in struct b400m_span structure and expect container_of
to work.  This fixes a regression introduced in r8984.

Modified:
    linux/trunk/drivers/dahdi/wctdm24xxp/base.c
    linux/trunk/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
    linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.c
    linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.h

Modified: linux/trunk/drivers/dahdi/wctdm24xxp/base.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wctdm24xxp/base.c?view=diff&rev=9087&r1=9086&r2=9087
==============================================================================
--- linux/trunk/drivers/dahdi/wctdm24xxp/base.c (original)
+++ linux/trunk/drivers/dahdi/wctdm24xxp/base.c Tue Aug  3 19:18:49 2010
@@ -4966,6 +4966,7 @@
 				return -EIO;
 			}
 			b4 = wc->mods[i].bri;
+			b400m_set_dahdi_span(b4, i & 0x03, wc->spans[curspan]);
 
 			++curspan;
 			curchan += 3;

Modified: linux/trunk/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wctdm24xxp/wctdm24xxp.h?view=diff&rev=9087&r1=9086&r2=9087
==============================================================================
--- linux/trunk/drivers/dahdi/wctdm24xxp/wctdm24xxp.h (original)
+++ linux/trunk/drivers/dahdi/wctdm24xxp/wctdm24xxp.h Tue Aug  3 19:18:49 2010
@@ -156,6 +156,7 @@
 	int timing_priority;
 	int spanno;
 	struct wctdm *wc;
+	struct b400m_span *bspan;
 };
 
 struct wctdm_chan {

Modified: linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.c?view=diff&rev=9087&r1=9086&r2=9087
==============================================================================
--- linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.c (original)
+++ linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.c Tue Aug  3 19:18:49 2010
@@ -550,7 +550,7 @@
 	int fifos[B400M_CHANNELS_PER_SPAN];			/* B1, B2, D <--> host fifo numbers */
 
 	/* HDLC controller fields */
-	struct dahdi_span span;			/* The actual dahdi_span */
+	struct wctdm_span *wspan;  /* pointer to the actual dahdi_span */
 	struct dahdi_chan *sigchan;		/* pointer to the signalling channel for this span */
 	int sigactive;				/* nonzero means we're in the middle of sending an HDLC frame */
 	atomic_t hdlc_pending;			/* hdlc_hard_xmit() increments, hdlc_tx_frame() decrements */
@@ -602,6 +602,13 @@
 
 static void hfc_start_st(struct b400m_span *s);
 static void hfc_stop_st(struct b400m_span *s);
+
+void b400m_set_dahdi_span(struct b400m *b4, int spanno,
+			  struct wctdm_span *wspan)
+{
+	b4->spans[spanno].wspan = wspan;
+	wspan->bspan = &b4->spans[spanno];
+}
 
 static inline void flush_hw(void)
 {
@@ -1439,11 +1446,11 @@
 				hfc_timer_expire(s, j);
 		}
 
-		if (s->newalarm != s->span.alarms &&
+		if (s->wspan && s->newalarm != s->wspan->span.alarms &&
 		    time_after_eq(b4->ticks, s->alarmtimer)) {
-			s->span.alarms = s->newalarm;
+			s->wspan->span.alarms = s->newalarm;
 			if ((!s->newalarm && bri_teignorered) || (!bri_teignorered))
-				dahdi_alarm_notify(&s->span);
+				dahdi_alarm_notify(&s->wspan->span);
 
 			if (DBG_ALARM) {
 				dev_info(&b4->wc->vb.pdev->dev, "span %d: alarm " \
@@ -1603,9 +1610,9 @@
 	b400m_setreg_ra(b4, R_SU_SEL, s->port, A_SU_WR_STA, V_SU_LD_STA);
 	flush_hw();			/* make sure write hit hardware */
 
-	s->span.alarms = DAHDI_ALARM_RED;
+	s->wspan->span.alarms = DAHDI_ALARM_RED;
 	s->newalarm = DAHDI_ALARM_RED;
-	dahdi_alarm_notify(&s->span);
+	dahdi_alarm_notify(&s->wspan->span);
 
 	/* set up the clock control register.  Must be done before we activate
 	 * the interface. */
@@ -2051,9 +2058,14 @@
 	 */
 }
 
+static inline struct b400m_span *bspan_from_dspan(struct dahdi_span *span)
+{
+	return container_of(span, struct wctdm_span, span)->bspan;
+}
+
 static int xhfc_startup(struct dahdi_span *span)
 {
-	struct b400m_span *bspan = container_of(span, struct b400m_span, span);
+	struct b400m_span *bspan = bspan_from_dspan(span);
 	struct b400m *b4 = bspan->parent;
 	if (!b4->running)
 		hfc_enable_interrupts(bspan->parent);
@@ -2170,7 +2182,7 @@
 	int te_mode, term;
 	int pos;
 
-	bspan = container_of(span, struct b400m_span, span);
+	bspan = bspan_from_dspan(span);
 	b4 = bspan->parent;
 	wc = b4->wc;
 
@@ -2211,6 +2223,7 @@
 
 	wc->spans[pos]->timing_priority = lc->sync;
 
+	bspan->wspan = container_of(span, struct wctdm_span, span);
 	xhfc_reset_span(bspan);
 
 	/* call startup() manually here, because DAHDI won't call the startup
@@ -2239,11 +2252,11 @@
 int b400m_chanconfig(struct dahdi_chan *chan, int sigtype)
 {
 	int alreadyrunning;
-	struct b400m_span *bspan = container_of(chan->span, struct b400m_span, span);
+	struct b400m_span *bspan = bspan_from_dspan(chan->span);
 	struct b400m *b4 = bspan->parent;
 	int res;
 
-	alreadyrunning = bspan->span.flags & DAHDI_FLAG_RUNNING;
+	alreadyrunning = bspan->wspan->span.flags & DAHDI_FLAG_RUNNING;
 
 	if (DBG_FOPS) {
 		b4_info(b4, "%s channel %d (%s) sigtype %08x\n",
@@ -2286,7 +2299,7 @@
 	int res;
 	int i;
 
-	bspan = container_of(span, struct b400m_span, span);
+	bspan = bspan_from_dspan(span);
 	b4 = bspan->parent;
 #ifdef HARDHDLC_RX
 	return 0;
@@ -2510,7 +2523,7 @@
 	int span;
 
 	dspan = chan->span;
-	bspan = container_of(dspan, struct b400m_span, span);
+	bspan = bspan_from_dspan(dspan);
 	b4 = bspan->parent;
 	wc = b4->wc;
 	span = bspan->port;
@@ -2710,8 +2723,8 @@
 				wc->spans[i]->timing_priority = 0;
 		}
 
-		for (i = 0; i < 4; i++)
-			b4->spans[i].span.flags &= ~DAHDI_FLAG_RUNNING;
+		for (i = 0; i < ARRAY_SIZE(b4->spans); i++)
+			b4->spans[i].wspan->span.flags &= ~DAHDI_FLAG_RUNNING;
 
 		wctdm_change_card_sync_src(b4->wc, 0, 0);
 

Modified: linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.h
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.h?view=diff&rev=9087&r1=9086&r2=9087
==============================================================================
--- linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.h (original)
+++ linux/trunk/drivers/dahdi/wctdm24xxp/xhfc.h Tue Aug  3 19:18:49 2010
@@ -42,6 +42,8 @@
 int b400m_dchan(struct dahdi_span *span);
 int b400m_chanconfig(struct dahdi_chan *chan, int sigtype);
 void b400m_post_init(struct b400m *b4);
+void b400m_set_dahdi_span(struct b400m *b4, int spanno,
+			  struct wctdm_span *wspan);
 void b400m_module_init(void);
 void b400m_module_cleanup(void);
 




More information about the svn-commits mailing list