[svn-commits] tzafrir: linux/trunk r9704 - /linux/trunk/drivers/dahdi/xpp/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Jan 30 08:11:58 CST 2011


Author: tzafrir
Date: Sun Jan 30 08:11:49 2011
New Revision: 9704

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9704
Log:
xpp: prepare for phonedev refactor

* Allow having XPDs that represent a device that is not a span.
* Refactor all span related data from 'struct xpd' to 'struct phonedev'
* Refactor span related methods into 'phonedev->phoneops'
* Refactor phone related initialization into phonedev_init()/phonedev_cleanup()

Signed-off-by: Oron Peled <oron at actcom.co.il>
Acked-by: Tzafrir Cohen <tzafrir.cohen at xorcom.com>

Modified:
    linux/trunk/drivers/dahdi/xpp/card_bri.c
    linux/trunk/drivers/dahdi/xpp/card_fxo.c
    linux/trunk/drivers/dahdi/xpp/card_fxs.c
    linux/trunk/drivers/dahdi/xpp/card_global.c
    linux/trunk/drivers/dahdi/xpp/card_pri.c
    linux/trunk/drivers/dahdi/xpp/xbus-core.c
    linux/trunk/drivers/dahdi/xpp/xbus-pcm.c
    linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c
    linux/trunk/drivers/dahdi/xpp/xdefs.h
    linux/trunk/drivers/dahdi/xpp/xpd.h
    linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c
    linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h
    linux/trunk/drivers/dahdi/xpp/xproto.c
    linux/trunk/drivers/dahdi/xpp/xproto.h

Modified: linux/trunk/drivers/dahdi/xpp/card_bri.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/xpp/card_bri.c?view=diff&rev=9704&r1=9703&r2=9704
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_bri.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_bri.c Sun Jan 30 08:11:49 2011
@@ -147,7 +147,7 @@
 #endif
 #define	BRI_BCHAN_SIGCAP	(DAHDI_SIG_CLEAR | DAHDI_SIG_DACS)
 
-#define	IS_NT(xpd)		((xpd)->direction == TO_PHONE)
+#define	IS_NT(xpd)		(PHONEDEV(xpd).direction == TO_PHONE)
 #define	BRI_PORT(xpd)		((xpd)->addr.subunit)
 
 /* shift in PCM highway */
@@ -732,7 +732,7 @@
 	if(atomic_read(&priv->hdlc_pending) == 0)
 		return 0;
 #endif
-	if(!SPAN_REGISTERED(xpd) || !(xpd->span.flags & DAHDI_FLAG_RUNNING))
+	if(!SPAN_REGISTERED(xpd) || !(PHONEDEV(xpd).span.flags & DAHDI_FLAG_RUNNING))
 		return 0;
 	dchan = XPD_CHAN(xpd, 2);
 	len = ARRAY_SIZE(priv->dchan_tbuf);
@@ -748,7 +748,7 @@
 	}
 	if(!test_bit(HFC_L1_ACTIVATED, &priv->l1_flags) && !test_bit(HFC_L1_ACTIVATING, &priv->l1_flags)) {
 		XPD_DBG(SIGNAL, xpd, "Want to transmit: Kick D-Channel transmiter\n");
-		if(xpd->direction == TO_PSTN)
+		if(! IS_NT(xpd))
 			te_activation(xpd, 1);
 		else
 			nt_activation(xpd, 1);
@@ -825,7 +825,7 @@
 	xpd = xpd_alloc(xbus, unit, subunit, subtype, subunits, sizeof(struct BRI_priv_data), proto_table, channels);
 	if(!xpd)
 		return NULL;
-	xpd->direction = (to_phone) ? TO_PHONE : TO_PSTN;
+	PHONEDEV(xpd).direction = (to_phone) ? TO_PHONE : TO_PSTN;
 	xpd->type_name = (to_phone) ? "BRI_NT" : "BRI_TE";
 	if(bri_proc_create(xbus, xpd) < 0)
 		goto err;
@@ -898,10 +898,10 @@
 		/* Nothing to do yet */
 		return 0;
 	}
-	xpd->span.spantype = "BRI";
-	xpd->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS;
-	xpd->span.deflaw = DAHDI_LAW_ALAW;
-	BIT_SET(xpd->digital_signalling, 2);	/* D-Channel */
+	PHONEDEV(xpd).span.spantype = "BRI";
+	PHONEDEV(xpd).span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS;
+	PHONEDEV(xpd).span.deflaw = DAHDI_LAW_ALAW;
+	BIT_SET(PHONEDEV(xpd).digital_signalling, 2);	/* D-Channel */
 	for_each_line(xpd, i) {
 		struct dahdi_chan	*cur_chan = XPD_CHAN(xpd, i);
 
@@ -932,8 +932,8 @@
 			cur_chan->sigcap = BRI_BCHAN_SIGCAP;
 		}
 	}
-	CALL_XMETHOD(card_pcm_recompute, xbus, xpd, 0);
-	xpd->span.ops = &BRI_span_ops;
+	PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);
+	PHONEDEV(xpd).span.ops = &BRI_span_ops;
 	return 0;
 }
 
@@ -1151,10 +1151,10 @@
 	priv = xpd->priv;
 	if(pos == 2) {
 		LINE_DBG(SIGNAL, xpd, pos, "OFFHOOK the whole span\n");
-		BIT_SET(xpd->offhook_state, 0);
-		BIT_SET(xpd->offhook_state, 1);
-		BIT_SET(xpd->offhook_state, 2);
-		CALL_XMETHOD(card_pcm_recompute, xpd->xbus, xpd, 0);
+		BIT_SET(PHONEDEV(xpd).offhook_state, 0);
+		BIT_SET(PHONEDEV(xpd).offhook_state, 1);
+		BIT_SET(PHONEDEV(xpd).offhook_state, 2);
+		PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);
 	}
 	return 0;
 }
@@ -1173,10 +1173,10 @@
 #endif
 	if(pos == 2) {
 		LINE_DBG(SIGNAL, xpd, pos, "ONHOOK the whole span\n");
-		BIT_CLR(xpd->offhook_state, 0);
-		BIT_CLR(xpd->offhook_state, 1);
-		BIT_CLR(xpd->offhook_state, 2);
-		CALL_XMETHOD(card_pcm_recompute, xpd->xbus, xpd, 0);
+		BIT_CLR(PHONEDEV(xpd).offhook_state, 0);
+		BIT_CLR(PHONEDEV(xpd).offhook_state, 1);
+		BIT_CLR(PHONEDEV(xpd).offhook_state, 2);
+		PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);
 	}
 	return 0;
 }
@@ -1186,7 +1186,8 @@
  */
 static int bri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
 {
-	xpd_t		*xpd = container_of(span, struct xpd, span);
+	struct phonedev	*phonedev = container_of(span, struct phonedev, span);
+	xpd_t		*xpd = container_of(phonedev, struct xpd, phonedev);
 	const char	*framingstr = "";
 	const char	*codingstr = "";
 	const char	*crcstr = "";
@@ -1242,7 +1243,8 @@
  */
 static int bri_startup(struct dahdi_span *span)
 {
-	xpd_t			*xpd = container_of(span, struct xpd, span);
+	struct phonedev	*phonedev = container_of(span, struct phonedev, span);
+	xpd_t		*xpd = container_of(phonedev, struct xpd, phonedev);
 	struct BRI_priv_data	*priv;
 	struct dahdi_chan	*dchan;
 
@@ -1255,7 +1257,7 @@
 	}
 	XPD_DBG(GENERAL, xpd, "STARTUP\n");
 	// Turn on all channels
-	CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 1);
+	PHONE_METHOD(xpd, XPD_STATE)(xpd->xbus, xpd, 1);
 	if(SPAN_REGISTERED(xpd)) {
 		dchan = XPD_CHAN(xpd, 2);
 		span->flags |= DAHDI_FLAG_RUNNING;
@@ -1278,7 +1280,8 @@
  */
 static int bri_shutdown(struct dahdi_span *span)
 {
-	xpd_t			*xpd = container_of(span, struct xpd, span);
+	struct phonedev	*phonedev = container_of(span, struct phonedev, span);
+	xpd_t		*xpd = container_of(phonedev, struct xpd, phonedev);
 	struct BRI_priv_data	*priv;
 
 	BUG_ON(!xpd);
@@ -1290,7 +1293,7 @@
 	}
 	XPD_DBG(GENERAL, xpd, "SHUTDOWN\n");
 	// Turn off all channels
-	CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 0);
+	PHONE_METHOD(xpd, XPD_STATE)(xpd->xbus, xpd, 0);
 	return 0;
 }
 
@@ -1314,7 +1317,7 @@
 	 * We calculate all subunits, so use the main lock
 	 * as a mutex for the whole operation.
 	 */
-	spin_lock_irqsave(&main_xpd->lock_recompute_pcm, flags);
+	spin_lock_irqsave(&PHONEDEV(main_xpd).lock_recompute_pcm, flags);
 	line_count = 0;
 	pcm_mask = 0;
 	for(i = 0; i < MAX_SUBUNIT; i++) {
@@ -1322,7 +1325,7 @@
 
 		if(sub_xpd) {
 			xpp_line_t	lines =
-				sub_xpd->offhook_state & ~sub_xpd->digital_signalling;
+				PHONEDEV(sub_xpd).offhook_state & ~(PHONEDEV(sub_xpd).digital_signalling);
 
 			if(lines) {
 				pcm_mask |= PCM_SHIFT(lines, i);
@@ -1349,7 +1352,7 @@
 		? RPACKET_HEADERSIZE + sizeof(xpp_line_t) + line_count * DAHDI_CHUNKSIZE
 		: 0L;
 	update_wanted_pcm_mask(main_xpd, pcm_mask, pcm_len);
-	spin_unlock_irqrestore(&main_xpd->lock_recompute_pcm, flags);
+	spin_unlock_irqrestore(&PHONEDEV(main_xpd).lock_recompute_pcm, flags);
 }
 
 static void BRI_card_pcm_fromspan(xbus_t *xbus, xpd_t *xpd, xpacket_t *pack)
@@ -1373,7 +1376,7 @@
 		if(!tmp_xpd || !tmp_xpd->card_present)
 			continue;
 		spin_lock_irqsave(&tmp_xpd->lock, flags);
-		wanted_lines = tmp_xpd->wanted_pcm_mask;
+		wanted_lines = PHONEDEV(tmp_xpd).wanted_pcm_mask;
 		for_each_line(tmp_xpd, i) {
 			struct dahdi_chan	*chan = XPD_CHAN(tmp_xpd, i);
 
@@ -1452,7 +1455,7 @@
 	XPD_DBG(GENERAL, xpd, "%s\n", (on)?"ON":"OFF");
 	if(on) {
 		if(!test_bit(HFC_L1_ACTIVATED, &priv->l1_flags)) {
-			if(xpd->direction == TO_PSTN)
+			if( ! IS_NT(xpd))
 				te_activation(xpd, 1);
 			else
 				nt_activation(xpd, 1);
@@ -1645,7 +1648,7 @@
 		ret = rx_dchan(xpd, info);
 		if (ret < 0) {
 			priv->dchan_rx_drops++;
-			if(atomic_read(&xpd->open_counter) > 0)
+			if(atomic_read(&PHONEDEV(xpd).open_counter) > 0)
 				XPD_NOTICE(xpd, "Multibyte Drop: errno=%d\n", ret);
 		} 
 		goto end;
@@ -1666,6 +1669,29 @@
 	spin_unlock_irqrestore(&xpd->lock, flags);
 	return 0;
 }
+
+static const struct xops	bri_xops = {
+	.card_new	= BRI_card_new,
+	.card_init	= BRI_card_init,
+	.card_remove	= BRI_card_remove,
+	.card_tick	= BRI_card_tick,
+	.card_register_reply	= BRI_card_register_reply,
+};
+
+static const struct phoneops	bri_phoneops = {
+	.card_dahdi_preregistration	= BRI_card_dahdi_preregistration,
+	.card_dahdi_postregistration	= BRI_card_dahdi_postregistration,
+	.card_hooksig	= BRI_card_hooksig,
+	.card_pcm_recompute	= BRI_card_pcm_recompute,
+	.card_pcm_fromspan	= BRI_card_pcm_fromspan,
+	.card_pcm_tospan	= BRI_card_pcm_tospan,
+	.card_timing_priority	= generic_timing_priority,
+	.card_ioctl	= BRI_card_ioctl,
+	.card_open	= BRI_card_open,
+	.card_close	= BRI_card_close,
+
+	.XPD_STATE	= XPROTO_CALLER(BRI, XPD_STATE),
+};
 
 static xproto_table_t PROTO_TABLE(BRI) = {
 	.owner = THIS_MODULE,
@@ -1675,25 +1701,8 @@
 	.name = "BRI",	/* protocol name */
 	.ports_per_subunit = 1,
 	.type = XPD_TYPE_BRI,
-	.xops = {
-		.card_new	= BRI_card_new,
-		.card_init	= BRI_card_init,
-		.card_remove	= BRI_card_remove,
-		.card_dahdi_preregistration	= BRI_card_dahdi_preregistration,
-		.card_dahdi_postregistration	= BRI_card_dahdi_postregistration,
-		.card_hooksig	= BRI_card_hooksig,
-		.card_tick	= BRI_card_tick,
-		.card_pcm_recompute	= BRI_card_pcm_recompute,
-		.card_pcm_fromspan	= BRI_card_pcm_fromspan,
-		.card_pcm_tospan	= BRI_card_pcm_tospan,
-		.card_timing_priority	= generic_timing_priority,
-		.card_ioctl	= BRI_card_ioctl,
-		.card_open	= BRI_card_open,
-		.card_close	= BRI_card_close,
-		.card_register_reply	= BRI_card_register_reply,
-
-		.XPD_STATE	= XPROTO_CALLER(BRI, XPD_STATE),
-	},
+	.xops = &bri_xops,
+	.phoneops = &bri_phoneops,
 	.packet_is_valid = bri_packet_is_valid,
 	.packet_dump = bri_packet_dump,
 };

Modified: linux/trunk/drivers/dahdi/xpp/card_fxo.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/xpp/card_fxo.c?view=diff&rev=9704&r1=9703&r2=9704
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_fxo.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_fxo.c Sun Jan 30 08:11:49 2011
@@ -215,7 +215,7 @@
 	xbus = xpd->xbus;
 	priv = xpd->priv;
 	which = which % NUM_LEDS;
-	if(IS_SET(xpd->digital_outputs, chan) || IS_SET(xpd->digital_inputs, chan))
+	if(IS_SET(PHONEDEV(xpd).digital_outputs, chan) || IS_SET(PHONEDEV(xpd).digital_inputs, chan))
 		goto out;
 	if(chan == PORT_BROADCAST) {
 		priv->ledstate[which] = (on) ? ~0 : 0;
@@ -251,7 +251,7 @@
 	timer_count = xpd->timer_count;
 	for(color = 0; color < ARRAY_SIZE(colors); color++) {
 		for_each_line(xpd, i) {
-			if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i))
+			if(IS_SET(PHONEDEV(xpd).digital_outputs, i) || IS_SET(PHONEDEV(xpd).digital_inputs, i))
 				continue;
 			if((xpd->blink_mode & BIT(i)) || IS_BLINKING(priv, i, color)) {		// Blinking
 				int	mod_value = LED_COUNTER(priv, i, color);
@@ -302,16 +302,16 @@
 	 * due to voltage fluctuations.
 	 */
 	reset_battery_readings(xpd, pos);
-	if(on && !xpd->ringing[pos]) {
+	if(on && !PHONEDEV(xpd).ringing[pos]) {
 		LINE_DBG(SIGNAL, xpd, pos, "START\n");
-		xpd->ringing[pos] = 1;
+		PHONEDEV(xpd).ringing[pos] = 1;
 		priv->cidtimer[pos] = xpd->timer_count;
 		MARK_BLINK(priv, pos, LED_GREEN, LED_BLINK_RING);
 		if(update_dahdi)
 			update_dahdi_ring(xpd, pos, on);
-	} else if(!on && xpd->ringing[pos]) {
+	} else if(!on && PHONEDEV(xpd).ringing[pos]) {
 		LINE_DBG(SIGNAL, xpd, pos, "STOP\n");
-		xpd->ringing[pos] = 0;
+		PHONEDEV(xpd).ringing[pos] = 0;
 		priv->cidtimer[pos] = xpd->timer_count;
 		if(IS_BLINKING(priv, pos, LED_GREEN))
 			MARK_BLINK(priv, pos, LED_GREEN, 0);
@@ -329,7 +329,7 @@
 	byte			value;
 
 	BUG_ON(!xpd);
-	BUG_ON(xpd->direction == TO_PHONE);		// We can SETHOOK state only on PSTN
+	BUG_ON(PHONEDEV(xpd).direction == TO_PHONE);		// We can SETHOOK state only on PSTN
 	xbus = xpd->xbus;
 	priv = xpd->priv;
 	BUG_ON(!priv);
@@ -443,7 +443,7 @@
 	xpd = xpd_alloc(xbus, unit, subunit, subtype, subunits, sizeof(struct FXO_priv_data), proto_table, channels);
 	if(!xpd)
 		return NULL;
-	xpd->direction = TO_PSTN;
+	PHONEDEV(xpd).direction = TO_PSTN;
 	xpd->type_name = "FXO";
 	if(fxo_proc_create(xbus, xpd) < 0)
 		goto err;
@@ -482,7 +482,7 @@
 		do_led(xpd, i, LED_GREEN, 0);
 		msleep(50);
 	}
-	CALL_XMETHOD(card_pcm_recompute, xbus, xpd, 0);
+	PHONE_METHOD(xpd, card_pcm_recompute)(xbus, xpd, 0);
 	return 0;
 }
 
@@ -511,6 +511,7 @@
 	BUG_ON(!priv);
 	timer_count = xpd->timer_count;
 	XPD_DBG(GENERAL, xpd, "%s\n", (on)?"ON":"OFF");
+ 	PHONEDEV(xpd).span.spantype = "FXO";
 	for_each_line(xpd, i) {
 		struct dahdi_chan	*cur_chan = XPD_CHAN(xpd, i);
 
@@ -562,7 +563,7 @@
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	LINE_DBG(SIGNAL, xpd, pos, "%s\n", txsig2str(txsig));
-	BUG_ON(xpd->direction != TO_PSTN);
+	BUG_ON(PHONEDEV(xpd).direction != TO_PSTN);
 	/* XXX Enable hooksig for FXO XXX */
 	switch(txsig) {
 		case DAHDI_TXSIG_START:
@@ -661,7 +662,7 @@
 		return;		/* Ignore power denials */
 	priv = xpd->priv;
 	for_each_line(xpd, i) {
-		if(xpd->ringing[i] || !IS_OFFHOOK(xpd, i)) {
+		if(PHONEDEV(xpd).ringing[i] || !IS_OFFHOOK(xpd, i)) {
 			priv->power_denial_delay[i] = 0;
 			continue;
 		}
@@ -726,7 +727,7 @@
 	timer_count = xpd->timer_count;
 	for_each_line(xpd, portno) {
 		/* Skip offhook and ringing ports */
-		if(IS_OFFHOOK(xpd, portno) || xpd->ringing[portno])
+		if(IS_OFFHOOK(xpd, portno) || PHONEDEV(xpd).ringing[portno])
 			continue;
 		if(IS_SET(priv->cidfound, portno)) {
 			if(timer_count > priv->cidtimer[portno] + 4000) {
@@ -900,7 +901,7 @@
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	priv->battery_voltage[portno] = volts;
-	if(xpd->ringing[portno])
+	if(PHONEDEV(xpd).ringing[portno])
 		goto ignore_reading;	/* ring voltage create false alarms */
 	if(abs(volts) < battery_threshold) {
 		/*
@@ -1017,7 +1018,7 @@
 	 * During ringing, current is not stable.
 	 * During onhook there should not be current anyway.
 	 */
-	if(xpd->ringing[portno] || !IS_OFFHOOK(xpd, portno))
+	if(PHONEDEV(xpd).ringing[portno] || !IS_OFFHOOK(xpd, portno))
 		goto ignore_it;
 	/*
 	 * Power denial with no battery voltage is meaningless
@@ -1110,6 +1111,27 @@
 	return 0;
 }
 
+static const struct xops	fxo_xops = {
+	.card_new	= FXO_card_new,
+	.card_init	= FXO_card_init,
+	.card_remove	= FXO_card_remove,
+	.card_tick	= FXO_card_tick,
+	.card_register_reply	= FXO_card_register_reply,
+};
+
+static const struct phoneops	fxo_phoneops = {
+	.card_dahdi_preregistration	= FXO_card_dahdi_preregistration,
+	.card_dahdi_postregistration	= FXO_card_dahdi_postregistration,
+	.card_hooksig	= FXO_card_hooksig,
+	.card_pcm_recompute	= generic_card_pcm_recompute,
+	.card_pcm_fromspan	= generic_card_pcm_fromspan,
+	.card_pcm_tospan	= generic_card_pcm_tospan,
+	.card_timing_priority	= generic_timing_priority,
+	.card_ioctl	= FXO_card_ioctl,
+	.card_open	= FXO_card_open,
+
+	.XPD_STATE	= XPROTO_CALLER(FXO, XPD_STATE),
+};
 
 static xproto_table_t PROTO_TABLE(FXO) = {
 	.owner = THIS_MODULE,
@@ -1120,24 +1142,8 @@
 	.name = "FXO",	/* protocol name */
 	.ports_per_subunit = 8,
 	.type = XPD_TYPE_FXO,
-	.xops = {
-		.card_new	= FXO_card_new,
-		.card_init	= FXO_card_init,
-		.card_remove	= FXO_card_remove,
-		.card_dahdi_preregistration	= FXO_card_dahdi_preregistration,
-		.card_dahdi_postregistration	= FXO_card_dahdi_postregistration,
-		.card_hooksig	= FXO_card_hooksig,
-		.card_tick	= FXO_card_tick,
-		.card_pcm_recompute	= generic_card_pcm_recompute,
-		.card_pcm_fromspan	= generic_card_pcm_fromspan,
-		.card_pcm_tospan	= generic_card_pcm_tospan,
-		.card_timing_priority	= generic_timing_priority,
-		.card_ioctl	= FXO_card_ioctl,
-		.card_open	= FXO_card_open,
-		.card_register_reply	= FXO_card_register_reply,
-
-		.XPD_STATE	= XPROTO_CALLER(FXO, XPD_STATE),
-	},
+	.xops = &fxo_xops,
+	.phoneops = &fxo_phoneops,
 	.packet_is_valid = fxo_packet_is_valid,
 	.packet_dump = fxo_packet_dump,
 };
@@ -1174,20 +1180,20 @@
 	BUG_ON(!priv);
 	len += sprintf(page + len, "\t%-17s: ", "Channel");
 	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+		if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 			len += sprintf(page + len, "%4d ", i % 10);
 	}
 	len += sprintf(page + len, "\nLeds:");
 	len += sprintf(page + len, "\n\t%-17s: ", "state");
 	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+		if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 			len += sprintf(page + len, "  %d%d ",
 				IS_SET(priv->ledstate[LED_GREEN], i),
 				IS_SET(priv->ledstate[LED_RED], i));
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "blinking");
 	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+		if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 			len += sprintf(page + len, "  %d%d ",
 				IS_BLINKING(priv,i,LED_GREEN),
 				IS_BLINKING(priv,i,LED_RED));

Modified: linux/trunk/drivers/dahdi/xpp/card_fxs.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/xpp/card_fxs.c?view=diff&rev=9704&r1=9703&r2=9704
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_fxs.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_fxs.c Sun Jan 30 08:11:49 2011
@@ -236,7 +236,7 @@
 	xbus = xpd->xbus;
 	priv = xpd->priv;
 	which = which % NUM_LEDS;
-	if(IS_SET(xpd->digital_outputs, chan) || IS_SET(xpd->digital_inputs, chan))
+	if(IS_SET(PHONEDEV(xpd).digital_outputs, chan) || IS_SET(PHONEDEV(xpd).digital_inputs, chan))
 		goto out;
 	if(chan == PORT_BROADCAST) {
 		priv->ledstate[which] = (on) ? ~0 : 0;
@@ -271,7 +271,7 @@
 	timer_count = xpd->timer_count;
 	for(color = 0; color < ARRAY_SIZE(colors); color++) {
 		for_each_line(xpd, i) {
-			if(IS_SET(xpd->digital_outputs | xpd->digital_inputs, i))
+			if(IS_SET(PHONEDEV(xpd).digital_outputs | PHONEDEV(xpd).digital_inputs, i))
 				continue;
 			if((xpd->blink_mode & BIT(i)) || IS_BLINKING(priv, i, color)) {		// Blinking
 				int	mod_value = LED_COUNTER(priv, i, color);
@@ -406,10 +406,10 @@
 		return NULL;
 	if(unit == 0) {
 		XBUS_DBG(GENERAL, xbus, "First XPD detected. Initialize digital outputs/inputs\n");
-		xpd->digital_outputs = BITMASK(LINES_DIGI_OUT) << regular_channels;
-		xpd->digital_inputs = BITMASK(LINES_DIGI_INP) << (regular_channels + LINES_DIGI_OUT);
-	}
-	xpd->direction = TO_PHONE;
+		PHONEDEV(xpd).digital_outputs = BITMASK(LINES_DIGI_OUT) << regular_channels;
+		PHONEDEV(xpd).digital_inputs = BITMASK(LINES_DIGI_INP) << (regular_channels + LINES_DIGI_OUT);
+	}
+	PHONEDEV(xpd).direction = TO_PHONE;
 	xpd->type_name = "FXS";
 	if(fxs_proc_create(xbus, xpd) < 0)
 		goto err;
@@ -455,14 +455,14 @@
 		msleep(50);
 	}
 	restore_leds(xpd);
-	CALL_XMETHOD(card_pcm_recompute, xbus, xpd, 0);
+	PHONE_METHOD(xpd, card_pcm_recompute)(xbus, xpd, 0);
 	/*
 	 * We should query our offhook state long enough time after we
 	 * set the linefeed_control()
 	 * So we do this after the LEDs
 	 */
 	for_each_line(xpd, i) {
-		if(IS_SET(xpd->digital_outputs | xpd->digital_inputs, i))
+		if(IS_SET(PHONEDEV(xpd).digital_outputs | PHONEDEV(xpd).digital_inputs, i))
 			continue;
 		SLIC_DIRECT_REQUEST(xbus, xpd, i, SLIC_READ, REG_LOOPCLOSURE, 0);
 	}
@@ -496,15 +496,15 @@
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	XPD_DBG(GENERAL, xpd, "%s\n", (on)?"on":"off");
-	xpd->span.spantype = "FXS";
+	PHONEDEV(xpd).span.spantype = "FXS";
 	for_each_line(xpd, i) {
 		struct dahdi_chan	*cur_chan = XPD_CHAN(xpd, i);
 
 		XPD_DBG(GENERAL, xpd, "setting FXS channel %d\n", i);
-		if(IS_SET(xpd->digital_outputs, i)) {
+		if(IS_SET(PHONEDEV(xpd).digital_outputs, i)) {
 			snprintf(cur_chan->name, MAX_CHANNAME, "XPP_OUT/%02d/%1d%1d/%d",
 				xbus->num, xpd->addr.unit, xpd->addr.subunit, i);
-		} else if(IS_SET(xpd->digital_inputs, i)) {
+		} else if(IS_SET(PHONEDEV(xpd).digital_inputs, i)) {
 			snprintf(cur_chan->name, MAX_CHANNAME, "XPP_IN/%02d/%1d%1d/%d",
 				xbus->num, xpd->addr.unit, xpd->addr.subunit, i);
 		} else {
@@ -556,10 +556,10 @@
 {
 	LINE_DBG(SIGNAL, xpd, pos, "%s\n", (muteit) ? "MUTE" : "UNMUTE");
 	if(muteit)
-		BIT_SET(xpd->mute_dtmf, pos);
+		BIT_SET(PHONEDEV(xpd).mute_dtmf, pos);
 	else
-		BIT_CLR(xpd->mute_dtmf, pos);
-	CALL_XMETHOD(card_pcm_recompute, xpd->xbus, xpd, 0);	/* already spinlocked */
+		BIT_CLR(PHONEDEV(xpd).mute_dtmf, pos);
+	PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);	/* already spinlocked */
 }
 
 static int set_vm_led_mode(xbus_t *xbus, xpd_t *xpd, int pos,
@@ -607,10 +607,10 @@
 	unsigned int		msgs;
 
 	BUG_ON(!xpd);
-	if (IS_SET(xpd->digital_outputs | xpd->digital_inputs, pos))
+	if (IS_SET(PHONEDEV(xpd).digital_outputs | PHONEDEV(xpd).digital_inputs, pos))
 		return;
 	priv = xpd->priv;
-	msgs = xpd->msg_waiting[pos];
+	msgs = PHONEDEV(xpd).msg_waiting[pos];
 	LINE_DBG(SIGNAL, xpd, pos, "%s\n", (msgs) ? "ON" : "OFF");
 	set_vm_led_mode(xbus, xpd, pos, msgs);
 	do_chan_power(xbus, xpd, pos, msgs > 0);
@@ -671,8 +671,8 @@
 
 	LINE_DBG(SIGNAL, xpd, pos, "%s\n", txsig2str(txsig));
 	priv = xpd->priv;
-	BUG_ON(xpd->direction != TO_PHONE);
-	if (IS_SET(xpd->digital_inputs, pos)) {
+	BUG_ON(PHONEDEV(xpd).direction != TO_PHONE);
+	if (IS_SET(PHONEDEV(xpd).digital_inputs, pos)) {
 		LINE_DBG(SIGNAL, xpd, pos, "Ignoring signal sent to digital input line\n");
 		return 0;
 	}
@@ -681,14 +681,14 @@
 	switch(txsig) {
 		case DAHDI_TXSIG_ONHOOK:
 			spin_lock_irqsave(&xpd->lock, flags);
-			xpd->ringing[pos] = 0;
+			PHONEDEV(xpd).ringing[pos] = 0;
 			oht_pcm(xpd, pos, 0);
 			vmwi_search(xpd, pos, 0);
 			BIT_CLR(priv->want_dtmf_events, pos);
 			BIT_CLR(priv->want_dtmf_mute, pos);
 			__do_mute_dtmf(xpd, pos, 0);
 			spin_unlock_irqrestore(&xpd->lock, flags);
-			if(IS_SET(xpd->digital_outputs, pos)) {
+			if(IS_SET(PHONEDEV(xpd).digital_outputs, pos)) {
 				LINE_DBG(SIGNAL, xpd, pos, "%s -> digital output OFF\n", txsig2str(txsig));
 				ret = relay_out(xpd, pos, 0);
 				return ret;
@@ -721,16 +721,16 @@
 			ret = linefeed_control(xbus, xpd, pos, txhook);
 			break;
 		case DAHDI_TXSIG_OFFHOOK:
-			if(IS_SET(xpd->digital_outputs, pos)) {
+			if(IS_SET(PHONEDEV(xpd).digital_outputs, pos)) {
 				LINE_NOTICE(xpd, pos, "%s -> Is digital output. Ignored\n", txsig2str(txsig));
 				return -EINVAL;
 			}
 			txhook = priv->lasttxhook[pos];
-			if(xpd->ringing[pos]) {
+			if(PHONEDEV(xpd).ringing[pos]) {
 				oht_pcm(xpd, pos, 1);
 				txhook = FXS_LINE_OHTRANS;
 			}
-			xpd->ringing[pos] = 0;
+			PHONEDEV(xpd).ringing[pos] = 0;
 			if(chan) {
 				switch(chan->sig) {
 					case DAHDI_SIG_EM:
@@ -744,10 +744,10 @@
 			ret = linefeed_control(xbus, xpd, pos, txhook);
 			break;
 		case DAHDI_TXSIG_START:
-			xpd->ringing[pos] = 1;
+			PHONEDEV(xpd).ringing[pos] = 1;
 			oht_pcm(xpd, pos, 0);
 			vmwi_search(xpd, pos, 0);
-			if(IS_SET(xpd->digital_outputs, pos)) {
+			if(IS_SET(PHONEDEV(xpd).digital_outputs, pos)) {
 				LINE_DBG(SIGNAL, xpd, pos, "%s -> digital output ON\n", txsig2str(txsig));
 				ret = relay_out(xpd, pos, 1);
 				return ret;
@@ -755,7 +755,7 @@
 			ret = send_ring(xpd, pos, 1);			// RING on
 			break;
 		case DAHDI_TXSIG_KEWL:
-			if(IS_SET(xpd->digital_outputs, pos)) {
+			if(IS_SET(PHONEDEV(xpd).digital_outputs, pos)) {
 				LINE_DBG(SIGNAL, xpd, pos, "%s -> Is digital output. Ignored\n", txsig2str(txsig));
 				return -EINVAL;
 			}
@@ -807,7 +807,7 @@
 		;	/* Disable VMWI */
 	}
 	priv->vmwisetting[pos] = vmwisetting;
-	set_vm_led_mode(xpd->xbus, xpd, pos, xpd->msg_waiting[pos]);
+	set_vm_led_mode(xpd->xbus, xpd, pos, PHONEDEV(xpd).msg_waiting[pos]);
 	return 0;
 }
 
@@ -829,7 +829,7 @@
 	BUG_ON(!xbus);
 	if(!XBUS_IS(xbus, READY))
 		return -ENODEV;
-	if (pos < 0 || pos >= xpd->channels) {
+	if (pos < 0 || pos >= PHONEDEV(xpd).channels) {
 		XPD_NOTICE(xpd, "Bad channel number %d in %s(), cmd=%u\n",
 			pos, __FUNCTION__, cmd);
 		return -EINVAL;
@@ -840,15 +840,15 @@
 			if (get_user(val, (int __user *)arg))
 				return -EFAULT;
 			LINE_DBG(SIGNAL, xpd, pos, "DAHDI_ONHOOKTRANSFER (%d millis)\n", val);
-			if (IS_SET(xpd->digital_inputs | xpd->digital_outputs, pos))
+			if (IS_SET(PHONEDEV(xpd).digital_inputs | PHONEDEV(xpd).digital_outputs, pos))
 				return 0;	/* Nothing to do */
 			oht_pcm(xpd, pos, 1);	/* Get ready of VMWI FSK tones */
 			if(priv->lasttxhook[pos] == FXS_LINE_POL_ACTIVE) {
 				priv->ohttimer[pos] = val;
 				priv->idletxhookstate[pos] = FXS_LINE_POL_OHTRANS;
 				vmwi_search(xpd, pos, 1);
-				CALL_XMETHOD(card_pcm_recompute, xbus, xpd, priv->search_fsk_pattern);
-				LINE_DBG(SIGNAL, xpd, pos, "Start OHT_TIMER. wanted_pcm_mask=0x%X\n", xpd->wanted_pcm_mask);
+				PHONE_METHOD(xpd, card_pcm_recompute)(xbus, xpd, priv->search_fsk_pattern);
+				LINE_DBG(SIGNAL, xpd, pos, "Start OHT_TIMER. wanted_pcm_mask=0x%X\n", PHONEDEV(xpd).wanted_pcm_mask);
 			}
 			if (VMWI_NEON(priv, pos) && !IS_OFFHOOK(xpd, pos))
 				start_stop_vm_led(xbus, xpd, pos);
@@ -935,9 +935,9 @@
 				return 0;
 			}
 			/* Digital inputs/outputs don't have VM leds */
-			if (IS_SET(xpd->digital_inputs | xpd->digital_outputs, pos))
+			if (IS_SET(PHONEDEV(xpd).digital_inputs | PHONEDEV(xpd).digital_outputs, pos))
 				return 0;
-			xpd->msg_waiting[pos] = val;
+			PHONEDEV(xpd).msg_waiting[pos] = val;
 			LINE_DBG(SIGNAL, xpd, pos, "DAHDI_VMWI: %s\n",
 					(val) ? "yes" : "no");
 			return 0;
@@ -1065,11 +1065,11 @@
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	ignore_mask =
-		xpd->offhook_state |
-		~xpd->oht_pcm_pass |
-		~priv->search_fsk_pattern |
-		xpd->digital_inputs |
-		xpd->digital_outputs;
+		PHONEDEV(xpd).offhook_state |
+		~(PHONEDEV(xpd).oht_pcm_pass) |
+		~(priv->search_fsk_pattern) |
+		PHONEDEV(xpd).digital_inputs |
+		PHONEDEV(xpd).digital_outputs;
 	for_each_line(xpd, i) {
 		struct dahdi_chan	*chan = XPD_CHAN(xpd, i);
 		byte		*writechunk = chan->writechunk;
@@ -1097,11 +1097,11 @@
 			oht_pcm(xpd, i, 0);
 			if(unlikely(mem_equal(writechunk, FSK_ON_PATTERN, DAHDI_CHUNKSIZE))) {
 				LINE_DBG(SIGNAL, xpd, i, "MSG WAITING ON\n");
-				xpd->msg_waiting[i] = 1;
+				PHONEDEV(xpd).msg_waiting[i] = 1;
 				start_stop_vm_led(xbus, xpd, i);
 			} else if(unlikely(mem_equal(writechunk, FSK_OFF_PATTERN, DAHDI_CHUNKSIZE))) {
 				LINE_DBG(SIGNAL, xpd, i, "MSG WAITING OFF\n");
-				xpd->msg_waiting[i] = 0;
+				PHONEDEV(xpd).msg_waiting[i] = 0;
 				start_stop_vm_led(xbus, xpd, i);
 			} else {
 				int	j;
@@ -1179,15 +1179,15 @@
 	int			i;
 
 	BUG_ON(!xpd);
-	BUG_ON(xpd->direction != TO_PHONE);
+	BUG_ON(PHONEDEV(xpd).direction != TO_PHONE);
 	xbus = xpd->xbus;
 	priv = xpd->priv;
 	XPD_DBG(SIGNAL, xpd, "offhook=0x%X change_mask=0x%X\n", offhook, change_mask);
 	for_each_line(xpd, i) {
-		if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i))
+		if(IS_SET(PHONEDEV(xpd).digital_outputs, i) || IS_SET(PHONEDEV(xpd).digital_inputs, i))
 			continue;
 		if(IS_SET(change_mask, i)) {
-			xpd->ringing[i] = 0;		/* No more ringing... */
+			PHONEDEV(xpd).ringing[i] = 0;		/* No more ringing... */
 #ifdef	WITH_METERING
 			metering_gen(xpd, i, 0);	/* Stop metering... */
 #endif
@@ -1222,7 +1222,7 @@
 	unsigned long		flags;
 
 	BUG_ON(!xpd);
-	BUG_ON(xpd->direction != TO_PHONE);
+	BUG_ON(PHONEDEV(xpd).direction != TO_PHONE);
 	XPD_DBG(SIGNAL, xpd, "(PHONE) sig_toggles=0x%04X sig_status=0x%04X\n", sig_toggles, sig_status);
 #if 0
 	Is this needed?
@@ -1250,10 +1250,10 @@
 		int		newchanno;
 
 		if(IS_SET(lines, channo)) {
-			newchanno = xpd->channels - LINES_DIGI_INP + i;
+			newchanno = PHONEDEV(xpd).channels - LINES_DIGI_INP + i;
 			BIT_CLR(lines, channo);
 			BIT_SET(lines, newchanno);
-			xpd->ringing[newchanno] = 0;			// Stop ringing. No leds for digital inputs.
+			PHONEDEV(xpd).ringing[newchanno] = 0;			// Stop ringing. No leds for digital inputs.
 			if(offhook && !IS_OFFHOOK(xpd, newchanno)) {		// OFFHOOK
 				LINE_DBG(SIGNAL, xpd, newchanno, "OFFHOOK\n");
 				hookstate_changed(xpd, newchanno, 1);
@@ -1394,6 +1394,29 @@
 	return 0;
 }
 
+static const struct xops	fxs_xops = {
+	.card_new	= FXS_card_new,
+	.card_init	= FXS_card_init,
+	.card_remove	= FXS_card_remove,
+	.card_tick	= FXS_card_tick,
+	.card_register_reply	= FXS_card_register_reply,
+};
+
+static const struct phoneops	fxs_phoneops = {
+	.card_dahdi_preregistration	= FXS_card_dahdi_preregistration,
+	.card_dahdi_postregistration	= FXS_card_dahdi_postregistration,
+	.card_hooksig	= FXS_card_hooksig,
+	.card_pcm_recompute	= generic_card_pcm_recompute,
+	.card_pcm_fromspan	= generic_card_pcm_fromspan,
+	.card_pcm_tospan	= generic_card_pcm_tospan,
+	.card_timing_priority	= generic_timing_priority,
+	.card_open	= FXS_card_open,
+	.card_close	= FXS_card_close,
+	.card_ioctl	= FXS_card_ioctl,
+
+	.XPD_STATE	= XPROTO_CALLER(FXS, XPD_STATE),
+};
+
 static xproto_table_t PROTO_TABLE(FXS) = {
 	.owner = THIS_MODULE,
 	.entries = {
@@ -1403,25 +1426,8 @@
 	.name = "FXS",	/* protocol name */
 	.ports_per_subunit = 8,
 	.type = XPD_TYPE_FXS,
-	.xops = {
-		.card_new	= FXS_card_new,
-		.card_init	= FXS_card_init,
-		.card_remove	= FXS_card_remove,
-		.card_dahdi_preregistration	= FXS_card_dahdi_preregistration,
-		.card_dahdi_postregistration	= FXS_card_dahdi_postregistration,
-		.card_hooksig	= FXS_card_hooksig,
-		.card_tick	= FXS_card_tick,
-		.card_pcm_recompute	= generic_card_pcm_recompute,
-		.card_pcm_fromspan	= generic_card_pcm_fromspan,
-		.card_pcm_tospan	= generic_card_pcm_tospan,
-		.card_timing_priority	= generic_timing_priority,
-		.card_open	= FXS_card_open,
-		.card_close	= FXS_card_close,
-		.card_ioctl	= FXS_card_ioctl,
-		.card_register_reply	= FXS_card_register_reply,
-
-		.XPD_STATE	= XPROTO_CALLER(FXS, XPD_STATE),
-	},
+	.xops = &fxs_xops,
+	.phoneops = &fxs_phoneops,
 	.packet_is_valid = fxs_packet_is_valid,
 	.packet_dump = fxs_packet_dump,
 };
@@ -1466,9 +1472,9 @@
 	for_each_line(xpd, i) {
 		char	pref;
 
-		if(IS_SET(xpd->digital_outputs, i))
+		if(IS_SET(PHONEDEV(xpd).digital_outputs, i))
 			pref = 'O';
-		else if(IS_SET(xpd->digital_inputs, i))
+		else if(IS_SET(PHONEDEV(xpd).digital_inputs, i))
 			pref = 'I';
 		else
 			pref = ' ';
@@ -1485,17 +1491,17 @@
 		len += sprintf(page + len, "LED #%d", led);
 		len += sprintf(page + len, "\n\t%-17s: ", "ledstate");
 		for_each_line(xpd, i) {
-			if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+			if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 				len += sprintf(page + len, "%d ", IS_SET(priv->ledstate[led], i));
 		}
 		len += sprintf(page + len, "\n\t%-17s: ", "ledcontrol");
 		for_each_line(xpd, i) {
-			if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+			if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 				len += sprintf(page + len, "%d ", IS_SET(priv->ledcontrol[led], i));
 		}
 		len += sprintf(page + len, "\n\t%-17s: ", "led_counter");
 		for_each_line(xpd, i) {
-			if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
+			if(!IS_SET(PHONEDEV(xpd).digital_outputs, i) && !IS_SET(PHONEDEV(xpd).digital_inputs, i))
 				len += sprintf(page + len, "%d ", LED_COUNTER(priv,i,led));
 		}
 		len += sprintf(page + len, "\n");

Modified: linux/trunk/drivers/dahdi/xpp/card_global.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/xpp/card_global.c?view=diff&rev=9704&r1=9703&r2=9704
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_global.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_global.c Sun Jan 30 08:11:49 2011
@@ -820,7 +820,7 @@
 				xpd->subunits, i);
 			continue;
 		}
-		direction_mask |= (su->direction == TO_PHONE) ? BIT(i) : 0;
+		direction_mask |= (PHONEDEV(su).direction == TO_PHONE) ? BIT(i) : 0;
 	}
 	snprintf(busstr, MAX_ENV_STR, "XBUS_NAME=%s", xbus->busname);
 	snprintf(busnumstr, MAX_ENV_STR, "XBUS_NUMBER=%d", xbus->num);

Modified: linux/trunk/drivers/dahdi/xpp/card_pri.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/xpp/card_pri.c?view=diff&rev=9704&r1=9703&r2=9704
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_pri.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_pri.c Sun Jan 30 08:11:49 2011
@@ -563,10 +563,10 @@
 
 	BUG_ON(!xpd);
 	priv = xpd->priv;
-	spin_lock_irqsave(&xpd->lock_recompute_pcm, flags);
+	spin_lock_irqsave(&PHONEDEV(xpd).lock_recompute_pcm, flags);
 	//XPD_DBG(SIGNAL, xpd, "pcm_mask=0x%X\n", pcm_mask);
 	/* Add/remove all the trivial cases */
-	pcm_mask |= xpd->offhook_state;
+	pcm_mask |= PHONEDEV(xpd).offhook_state;
 	for_each_line(xpd, i)
 		if (IS_SET(pcm_mask, i))
 			line_count++;
@@ -590,7 +590,7 @@
 			line_count * DAHDI_CHUNKSIZE
 		: 0L;
 	update_wanted_pcm_mask(xpd, pcm_mask, pcm_len);
-	spin_unlock_irqrestore(&xpd->lock_recompute_pcm, flags);
+	spin_unlock_irqrestore(&PHONEDEV(xpd).lock_recompute_pcm, flags);
 }
 
 /*
@@ -610,7 +610,7 @@
 	priv = xpd->priv;
 	if(SPAN_REGISTERED(xpd)) {
 		XPD_NOTICE(xpd, "Registered as span %d. Cannot do setup pri protocol (%s)\n",
-			xpd->span.spanno, __FUNCTION__);
+			PHONEDEV(xpd).span.spanno, __FUNCTION__);
 		return -EBUSY;
 	}
 	if(priv->pri_protocol != PRI_PROTO_0) {
@@ -650,16 +650,16 @@
 	}
 	priv->pri_protocol = set_proto;
 	priv->is_cas = -1;
-	xpd->channels = pri_num_channels(set_proto);
-	xpd->offhook_state = BITMASK(xpd->channels);
-	CALL_XMETHOD(card_pcm_recompute, xpd->xbus, xpd, 0);
+	PHONEDEV(xpd).channels = pri_num_channels(set_proto);
+	PHONEDEV(xpd).offhook_state = BITMASK(PHONEDEV(xpd).channels);
+	PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);
 	priv->deflaw = deflaw;
 	priv->dchan_num = dchan_num;
 	priv->local_loopback = 0;
 	xpd->type_name = type_name(priv->pri_protocol);
 	XPD_DBG(GENERAL, xpd, "%s, channels=%d, dchan_num=%d, deflaw=%d\n",
 			pri_protocol_name(set_proto),
-			xpd->channels,
+			PHONEDEV(xpd).channels,
 			priv->dchan_num,
 			priv->deflaw
 			);
@@ -692,18 +692,18 @@
 		if(priv->clock_source && priv->alarms == 0) {
 			if(best_spanno)
 				XPD_ERR(xpd, "Duplicate XPD's with clock_source=1\n");
-			best_spanno = subxpd->span.spanno;
+			best_spanno = PHONEDEV(subxpd).span.spanno;
 		}
 	}
 	for(i = 0; i < MAX_SLAVES; i++) {
 		subxpd = xpd_byaddr(xpd->xbus, xpd->addr.unit, i);
 		if(!subxpd)
 			continue;
-		if(subxpd->span.syncsrc == best_spanno)
+		if(PHONEDEV(subxpd).span.syncsrc == best_spanno)
 			XPD_DBG(SYNC, xpd, "Setting SyncSource to span %d\n", best_spanno);
 		else
 			XPD_DBG(SYNC, xpd, "Slaving to span %d\n", best_spanno);
-		subxpd->span.syncsrc = best_spanno;
+		PHONEDEV(subxpd).span.syncsrc = best_spanno;
 	}
 }
 
@@ -734,10 +734,10 @@
 		priv = subxpd->priv;
 		if(priv->alarms != 0)
 			continue;
-		if(subxpd->timing_priority > 0 && subxpd->timing_priority < best_subunit_prio) {
+		if(PHONEDEV(subxpd).timing_priority > 0 && PHONEDEV(subxpd).timing_priority < best_subunit_prio) {
 			best_xpd = subxpd;
 			best_subunit = i;
-			best_subunit_prio = subxpd->timing_priority;
+			best_subunit_prio = PHONEDEV(subxpd).timing_priority;
 		}
 	}
 	/* Now set it */
@@ -779,7 +779,7 @@
 	BUG_ON(!xpd);
 	priv = xpd->priv;
 	BUG_ON(!priv);
-	is_master_mode = xpd->timing_priority == 0;
+	is_master_mode = PHONEDEV(xpd).timing_priority == 0;
 	localloop = priv->local_loopback;
 	lim0 |= (localloop) ? REG_LIM0_LL : 0;
 	if(is_master_mode)
@@ -819,7 +819,7 @@
 	priv = xpd->priv;
 	if(SPAN_REGISTERED(xpd)) {
 		XPD_NOTICE(xpd, "Registered as span %d. Cannot do %s\n",
-			xpd->span.spanno, __FUNCTION__);
+			PHONEDEV(xpd).span.spanno, __FUNCTION__);
 		return -EBUSY;
 	}
 	priv->local_loopback = localloop;
@@ -869,7 +869,7 @@
 		else
 			BIT_SET(new_rbslines, i);
 	}
-	new_rbslines &= BITMASK(xpd->channels);
+	new_rbslines &= BITMASK(PHONEDEV(xpd).channels);
 	modified_lines = priv->rbslines ^ new_rbslines;
 	XPD_DBG(DEVICES, xpd, "RBSLINES-%d(%s): 0x%X\n",
 		channo, pri_protocol_name(priv->pri_protocol), new_rbslines);
@@ -1037,7 +1037,7 @@
 		force_cas = 1;
 		set_mode_cas(xpd, 1);
 	}
-	CALL_XMETHOD(card_pcm_recompute, xpd->xbus, xpd, 0);
+	PHONE_METHOD(xpd, card_pcm_recompute)(xpd->xbus, xpd, 0);
 	/*
 	 * E1's can enable CRC checking
 	 * CRC4 is legal only for E1, and it is checked by pri_linecompat()
@@ -1092,15 +1092,16 @@
 
 static int pri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
 {
-	xpd_t			*xpd = container_of(span, struct xpd, span);
+	struct phonedev	*phonedev = container_of(span, struct phonedev, span);
+	xpd_t		*xpd = container_of(phonedev, struct xpd, phonedev);
 	struct PRI_priv_data	*priv;
 	int			ret;
 
 	BUG_ON(!xpd);
 	priv = xpd->priv;
-	if(lc->span != xpd->span.spanno) {
+	if(lc->span != PHONEDEV(xpd).span.spanno) {
 		XPD_ERR(xpd, "I am span %d but got spanconfig for span %d\n",
-			xpd->span.spanno, lc->span);
+			PHONEDEV(xpd).span.spanno, lc->span);
 		return -EINVAL;
 	}
 	/*
@@ -1112,7 +1113,7 @@
 	ret = pri_lineconfig(xpd, lc->lineconfig);
 	if(!ret) {
 		span->lineconfig = lc->lineconfig;
-		xpd->timing_priority = lc->sync;
+		PHONEDEV(xpd).timing_priority = lc->sync;
 		set_master_mode("spanconfig", xpd);
 		elect_syncer("PRI-master_mode");
 	}
@@ -1126,7 +1127,8 @@
  */
 static int pri_chanconfig(struct dahdi_chan *chan, int sigtype)
 {
-	xpd_t			*xpd = container_of(chan->span, struct xpd, span);
+	struct phonedev	*phonedev = container_of(chan->span, struct phonedev, span);
+	xpd_t		*xpd = container_of(phonedev, struct xpd, phonedev);
 	struct PRI_priv_data	*priv;
 
 	BUG_ON(!xpd);
@@ -1158,7 +1160,7 @@
 		if(priv->pri_protocol != PRI_PROTO_E1 && priv->is_cas != 1)
 			set_mode_cas(xpd, 1);
 	}
-	if(xpd->span.flags & DAHDI_FLAG_RUNNING) {
+	if(PHONEDEV(xpd).span.flags & DAHDI_FLAG_RUNNING) {
 		XPD_DBG(DEVICES, xpd, "Span is RUNNING. Updating rbslines.\n");
 		set_rbslines(xpd, chan->channo);
 	}
@@ -1227,9 +1229,9 @@
 		goto err;
 	}
 	xpd->type_name = type_name(priv->pri_protocol);
-	xpd->direction = TO_PSTN;
+	PHONEDEV(xpd).direction = TO_PSTN;
 	XPD_DBG(DEVICES, xpd, "%s\n", xpd->type_name);
-	xpd->timing_priority = 1;		/* High priority SLAVE */
+	PHONEDEV(xpd).timing_priority = 1;		/* High priority SLAVE */
 	set_master_mode(__FUNCTION__, xpd);
 	for(ret = 0; ret < NUM_LEDS; ret++) {
 		DO_LED(xpd, ret, PRI_LED_ON);
@@ -1308,15 +1310,15 @@
 	XPD_DBG(GENERAL, xpd, "%s (proto=%s, channels=%d, deflaw=%d)\n",
 		(on)?"on":"off",
 		pri_protocol_name(priv->pri_protocol),
-		xpd->channels,
+		PHONEDEV(xpd).channels,
 		priv->deflaw);
 	if(!on) {
 		/* Nothing to do yet */
 		return 0;
 	}
-	xpd->span.spantype = pri_protocol_name(priv->pri_protocol);
-	xpd->span.linecompat = pri_linecompat(priv->pri_protocol);
-	xpd->span.deflaw = priv->deflaw;
+	PHONEDEV(xpd).span.spantype = pri_protocol_name(priv->pri_protocol);
+	PHONEDEV(xpd).span.linecompat = pri_linecompat(priv->pri_protocol);
+	PHONEDEV(xpd).span.deflaw = priv->deflaw;
 	for_each_line(xpd, i) {
 		struct dahdi_chan	*cur_chan = XPD_CHAN(xpd, i);
 		bool		is_dchan = i == PRI_DCHAN_IDX(priv);
@@ -1333,8 +1335,8 @@
 			cur_chan->flags &= ~DAHDI_FLAG_HDLC;
 		}
 	}
-	xpd->offhook_state = xpd->wanted_pcm_mask;
-	xpd->span.ops = &PRI_span_ops;
+	PHONEDEV(xpd).offhook_state = PHONEDEV(xpd).wanted_pcm_mask;
+	PHONEDEV(xpd).span.ops = &PRI_span_ops;
 	return 0;
 }
 
@@ -1372,7 +1374,7 @@
 	} else {
 		int	d = PRI_DCHAN_IDX(priv);
 
-		if(SPAN_REGISTERED(xpd) && d >= 0 && d < xpd->channels) {
+		if(SPAN_REGISTERED(xpd) && d >= 0 && d < PHONEDEV(xpd).channels) {
 			byte	*pcm;
 
 			pcm = (byte *)XPD_CHAN(xpd, d)->readchunk;
@@ -1406,7 +1408,7 @@
 	BUG_ON(!xpd);
 	priv = xpd->priv;
 	BUG_ON(!priv);
-	if(xpd->timing_priority == 0) {
+	if(PHONEDEV(xpd).timing_priority == 0) {
 		which_led = TOP_RED_LED;
 		other_led = BOTTOM_GREEN_LED;
 	} else {

[... 1185 lines stripped ...]



More information about the svn-commits mailing list