[svn-commits] tzafrir: linux/trunk r6046 - in /linux/trunk/drivers/dahdi/xpp: ./ firmwares/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Mar 1 07:56:27 CST 2009


Author: tzafrir
Date: Sun Mar  1 07:56:23 2009
New Revision: 6046

URL: http://svn.digium.com/svn-view/dahdi?view=rev&rev=6046
Log:
New XPP code: xpp rev 6795:
  * Fix cases where the command_queue overflowed during initialization.
    - Also add a 'command_queue_length' parameter to xpp.ko
  * More migrations to sysfs:
    - Add a 'transport' attribute to our astribank devices which
      points to the usb device we use. E.g:
       /sys/bus/astribanks/devices/xbus-00/transport is symlinked to
       ../../../../../../devices/pci0000:00/0000:00:10.4/usb5/5-4
    - Move /proc/xpp/XBUS-??/XPD-??/span to
      /sys/bus/xpds/devices/??:?:?/span
    - Migrate from /proc/xpp/sync to:
      /sys/bus/astribanks/drivers/xppdrv/sync
    - New 'offhook' attribute in:
      /sys/bus/xpds/devices/??:?:?/offhook
  * PRI: change the "timing" priority to match the convention used by
         other PRI cards -- I.e: lower numbers (not 0) have higher
	 priority.
  * FXO: 
    - Power denial: create two module parameters instead of hard-coded
      constants (power_denial_safezone, power_denial_minlen).
      For sites that get non-standard power-denial signals from central
      office on offhook.
    - Don't hangup on power-denial, just notify Dahdi and wait for
    - Fix caller-id detection for the case central office sends it before
      first ring without any indication before.
      Asterisk's desicion.
  * USB_FW.hex:
    - Fixes cases where firmware loading would fail.

Modified:
    linux/trunk/drivers/dahdi/xpp/.version
    linux/trunk/drivers/dahdi/xpp/Changelog_xpp
    linux/trunk/drivers/dahdi/xpp/card_fxo.c
    linux/trunk/drivers/dahdi/xpp/card_global.c
    linux/trunk/drivers/dahdi/xpp/card_global.h
    linux/trunk/drivers/dahdi/xpp/firmwares/USB_FW.hex
    linux/trunk/drivers/dahdi/xpp/init_card_3_30
    linux/trunk/drivers/dahdi/xpp/xbus-core.c
    linux/trunk/drivers/dahdi/xpp/xbus-core.h
    linux/trunk/drivers/dahdi/xpp/xbus-pcm.c
    linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c
    linux/trunk/drivers/dahdi/xpp/xframe_queue.c
    linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c
    linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h
    linux/trunk/drivers/dahdi/xpp/xproto.h

Modified: linux/trunk/drivers/dahdi/xpp/.version
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/.version?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/.version (original)
+++ linux/trunk/drivers/dahdi/xpp/.version Sun Mar  1 07:56:23 2009
@@ -1,1 +1,1 @@
-trunk-r6630
+trunk-r6795

Modified: linux/trunk/drivers/dahdi/xpp/Changelog_xpp
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/Changelog_xpp?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/Changelog_xpp (original)
+++ linux/trunk/drivers/dahdi/xpp/Changelog_xpp Sun Mar  1 07:56:23 2009
@@ -1,2 +1,31 @@
+Sun Mar  1 2009 Oron Peled <oron at actcom.co.il> - xpp.r6795
+  * Fix cases where the command_queue overflowed during initialization.
+    - Also add a 'command_queue_length' parameter to xpp.ko
+  * More migrations to sysfs:
+    - Add a 'transport' attribute to our astribank devices which
+      points to the usb device we use. E.g:
+       /sys/bus/astribanks/devices/xbus-00/transport is symlinked to
+       ../../../../../../devices/pci0000:00/0000:00:10.4/usb5/5-4
+    - Move /proc/xpp/XBUS-??/XPD-??/span to
+      /sys/bus/xpds/devices/??:?:?/span
+    - Migrate from /proc/xpp/sync to:
+      /sys/bus/astribanks/drivers/xppdrv/sync
+    - New 'offhook' attribute in:
+      /sys/bus/xpds/devices/??:?:?/offhook
+  * PRI: change the "timing" priority to match the convention used by
+         other PRI cards -- I.e: lower numbers (not 0) have higher
+	 priority.
+  * FXO: 
+    - Power denial: create two module parameters instead of hard-coded
+      constants (power_denial_safezone, power_denial_minlen).
+      For sites that get non-standard power-denial signals from central
+      office on offhook.
+    - Don't hangup on power-denial, just notify Dahdi and wait for
+    - Fix caller-id detection for the case central office sends it before
+      first ring without any indication before.
+      Asterisk's desicion.
+  * USB_FW.hex:
+    - Fixes cases where firmware loading would fail.
+
 Thu, Aug 14 2008 Oron Peled <oron at actcom.co.il> - xpp.r6056
   * First DAHDI-linux release.

Modified: linux/trunk/drivers/dahdi/xpp/card_fxo.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/card_fxo.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_fxo.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_fxo.c Sun Mar  1 07:56:23 2009
@@ -194,6 +194,7 @@
 
 	priv->nobattery_debounce[pos] = 0;
 	priv->power_denial_delay[pos] = 0;
+	power_change(xpd, pos, POWER_UNKNOWN);
 }
 
 static const int	led_register_mask[] = { 	BIT(7),	BIT(6),	BIT(5) };
@@ -357,7 +358,6 @@
 	if(to_offhook) {
 		priv->power_denial_safezone[pos] = power_denial_safezone;
 	} else {
-		power_change(xpd, pos, POWER_UNKNOWN);
 		priv->power_denial_length[pos] = 0;
 		priv->power_denial_safezone[pos] = 0;
 	}
@@ -664,7 +664,7 @@
 			continue;
 		}
 		if(priv->power_denial_safezone[i] > 0) {
-			if(--priv->power_denial_safezone[i]) {
+			if(--priv->power_denial_safezone[i] == 0) {
 				/*
 				 * Poll current, previous answers are meaningless
 				 */
@@ -912,8 +912,7 @@
 			if(milliseconds > BAT_DEBOUNCE) {
 				LINE_DBG(SIGNAL, xpd, portno, "BATTERY OFF voltage=%d\n", volts);
 				priv->battery[portno] = BATTERY_OFF;
-				if(SPAN_REGISTERED(xpd))
-					dahdi_report_battery(xpd, portno);
+				dahdi_report_battery(xpd, portno);
 				/* What's the polarity ? */
 				priv->polarity[portno] = POL_UNKNOWN;
 				priv->polarity_debounce[portno] = 0;
@@ -931,8 +930,7 @@
 		if(priv->battery[portno] != BATTERY_ON) {
 			LINE_DBG(SIGNAL, xpd, portno, "BATTERY ON voltage=%d\n", volts);
 			priv->battery[portno] = BATTERY_ON;
-			if(SPAN_REGISTERED(xpd))
-				dahdi_report_battery(xpd, portno);
+			dahdi_report_battery(xpd, portno);
 		}
 	}
 #if 0

Modified: linux/trunk/drivers/dahdi/xpp/card_global.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/card_global.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_global.c (original)
+++ linux/trunk/drivers/dahdi/xpp/card_global.c Sun Mar  1 07:56:23 2009
@@ -484,6 +484,12 @@
 		dump_reg_cmd("REG_REQ", 1, xbus, xpd->addr.unit, reg_cmd->portnum, reg_cmd);
 		dump_packet("REG_REQ", pack, 1);
 	}
+	if(!xframe->usec_towait) {	/* default processing time of SPI */
+		if(subreg)
+			xframe->usec_towait = 2000;
+		else
+			xframe->usec_towait = 1000;
+	}
 	ret = send_cmd_frame(xbus, xframe);
 	return ret;
 }
@@ -693,34 +699,24 @@
 
 HANDLER_DEF(GLOBAL, ERROR_CODE)
 {
-	byte			errorcode;
 	char			tmp_name[TMP_NAME_LEN];
 	static long		rate_limit;
-	const char		*msg;
-	const static char	*fw_messages[] = {
-					[1] = "Packet too short",
-					[2] = "Len field is too small",
-					[3] = "Premature packet end",
-					[4] = "Invalid op code",
-					[5] = "Invalid packet len",
-					[6] = "SPI fifo full",
-				};
+	byte			category_code;
+	byte			errorbits;
 
 	BUG_ON(!xbus);
 	if((rate_limit++ % 5003) > 200)
 		return 0;
-	errorcode = RPACKET_FIELD(pack, GLOBAL, ERROR_CODE, errorcode);
-	msg = (errorcode < ARRAY_SIZE(fw_messages))
-		? fw_messages[errorcode]
-		: "UNKNOWN CODE";
+	category_code = RPACKET_FIELD(pack, GLOBAL, ERROR_CODE, category_code);
+	errorbits = RPACKET_FIELD(pack, GLOBAL, ERROR_CODE, errorbits);
 	if(!xpd) {
 		snprintf(tmp_name, TMP_NAME_LEN, "%s(%1d%1d)", xbus->busname,
 			XPACKET_ADDR_UNIT(pack), XPACKET_ADDR_SUBUNIT(pack));
 	} else {
 		snprintf(tmp_name, TMP_NAME_LEN, "%s/%s", xbus->busname, xpd->xpdname);
 	}
-	NOTICE("%s: FIRMWARE: %s CODE = 0x%X (%s) (rate_limit=%ld)\n",
-			tmp_name, cmd->name, errorcode, msg, rate_limit);
+	NOTICE("%s: FIRMWARE %s: category=%d errorbits=0x%02X (rate_limit=%ld)\n",
+			tmp_name, cmd->name, category_code, errorbits, rate_limit);
 	dump_packet("FIRMWARE: ", pack, 1);
 	/*
 	 * FIXME: Should implement an error recovery plan

Modified: linux/trunk/drivers/dahdi/xpp/card_global.h
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/card_global.h?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/card_global.h (original)
+++ linux/trunk/drivers/dahdi/xpp/card_global.h Sun Mar  1 07:56:23 2009
@@ -91,7 +91,8 @@
 	byte		mask;
 	);
 DEF_RPACKET_DATA(GLOBAL, ERROR_CODE,
-	byte		errorcode;
+	byte		category_code;
+	byte		errorbits;
 	byte		bad_packet[0];
 	);
 

Modified: linux/trunk/drivers/dahdi/xpp/firmwares/USB_FW.hex
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/firmwares/USB_FW.hex?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/firmwares/USB_FW.hex (original)
+++ linux/trunk/drivers/dahdi/xpp/firmwares/USB_FW.hex Sun Mar  1 07:56:23 2009
@@ -1,10 +1,10 @@
 # 
-# $Id: USB_FW.hex 6245 2008-10-19 16:16:50Z dima $ 
+# $Id: USB_FW.hex 6770 2009-02-22 15:20:03Z dima $ 
 # 
 :03004300020E00AA
 :03005300020E009A
-:100E0000020E3000020EBB00020EA500020E4800CA
-:080E1000020C7000020C33001B
+:100E0000020D2F00020D8C00020D7600020D47002E
+:080E1000020BC000020B83007D
 :100700001201000200000040E4E451110000010267
 :1007100003010A0600020000004001000902370040
 :10072000020100C0000904000002FFFFFF040705EA
@@ -23,199 +23,160 @@
 :1007F000650072000A0346005000470041001203E2
 :100800004D006E0067002000500072006F00630012
 :020810000000E6
-:1006CE00AC0790E678E020E6F9E51E702390E67818
-:1006DE00E04480F0EC25E090E679F08D19AF03A9A7
-:1006EE0007751A018A1B891CE4F51D751E01D3229C
-:0206FE00C32215
-:100CA600AC0790E678E020E6F9E51E702590E67838
-:100CB600E04480F0EC25E0440190E679F08D19AF30
-:100CC60003A907751A018A1B891CE4F51D751E0305
-:040CD600D322C32240
-:100E6000120CA6E51E24FA6009146006240770F32C
-:070E7000D322E4F51ED3229A
-:100E77001206CEE51E24FA6009146006240770F3F3
-:070E8700D322E4F51ED32283
-:080F2D00E4F51ED2E9D2AF2267
-:03004B0002081296
-:10081200C0E0C083C082C0D075D000C000C001C09B
-:1008220002C003C006C00790E678E030E206751EFB
-:10083200060208F090E678E020E10CE51E64026012
-:1008420006751E070208F0E51E24FE605F1460367E
-:1008520024FE70030208E424FC70030208ED24085D
-:1008620060030208F0AB1AAA1BA91CAF1D051D8F5D
-:10087200827583001205BE90E679F0E51D65197058
-:100882006D751E05806890E679E0AB1AAA1BA91C5B
-:10089200AE1D8E827583001205EB751E02E519648A
-:1008A20001704B90E678E04420F08042E51924FE86
-:1008B200B51D0790E678E04420F0E51914B51D0A4D
-:1008C20090E678E04440F0751E0090E679E0AB1ABD
-:1008D200AA1BA91CAE1D8E827583001205EB051D95
-:1008E200800C90E678E04440F08000751E00539141
-:1008F200DFD007D006D003D002D001D000D0D0D0B4
-:0609020082D083D0E03238
-:020F47000000A8
-:100DDB0041100100411014004110000042100200AC
-:010DEB000007
-:100DBB00E490E670F075B5E653B5EE43B28053B2EE
-:100DCB00FCC2B3C2B5C2B67F32FE120ED1D2B6226E
-:100E8E00538EF75389FB5389F74389015389FDE448
-:070E9E00F58AF58CD2A922B0
-:100AFF0078187C107D017BFF7A0F79477E007F028B
-:100B0F0012059890E678E0541824F0601E240870BF
-:100B1F003AE4901018F07A107B187D017F50120E76
-:100B2F00777A107B047D107F50801D901018741FF2
-:100B3F00F0A374EFF07A107B187D027F51120E77BD
-:0B0B4F007A107B047D107F51120E60B5
-:010B5A002278
-:100CDA007F03120D68EF2402FFE43EFEE525C3946C
-:100CEA0008501F740C2525F582E43410F583E0FDC5
-:100CFA008F828E8375F002E52512061FEDF0052519
-:020D0A0080DA8D
-:010D0C0022C4
-:100BF000901001EFF0E50B240AFDE4350AFC90109B
-:100C000007E02FFBA3E0FF0DED8C8370010C14F5C2
-:100C100082EBF08D828C83EFF0EFFFAD03ED90104F
-:100C200002CFF0A3EFF0D209120D0D90E680E05450
-:020C3000F7F0DB
-:010C3200229F
-:1009940090E600E054E74410F090E60174C0F09053
-:1009A400E6107420F000000090E611F000000090C2
-:1009B400E6047480F0000000740FF0000000E4F01E
-:1009C40000000090E6187410F0000000E490E619AE
-:1009D400F000000090E61A7408F0000000E490E6CD
-:1009E4001BF000000090E6497482F0000000F00063
-:1009F400000090E6247402F0000000E490E625F084
-:100A040000000090E6957480F0000000F000000003
-:040A140043AF0122C9
-:100ED1007C007D1812060DEF1FAC0670011E4C70D0
-:020EE100F622F7
-:0A0B5B008E278F288B298A2A892B08
-:100B6500E4F52CF52DC3E52D9528E52C9527503377
-:100B7500AB29AA2AA92B852D82852C831205BEFFB8
-:100B8500E4FEC2B2EF1392B7EFC313FFD2B20EBEAB
-:100B950008F0C2B220B002C322052DE52D70C605AE
-:040BA5002C80C2D30B
-:010BA9002229
-:100E180090E60174C0F0C2B67F327E00120ED1D2C5
-:080E2800B67F327E00020ED1FC
-:10062B00901014E0FF901000F0901002E0FCA3E09B
-:10063B0054F064607003EC641160030206CC300864
-:10064B0022EFB52702D322208104E5276008208002
-:10065B0007E527B40102C322E4F510901014E52737
-:10066B00F0803B30810C208009E4F510901014F0E1
-:10067B00802C30800D20810AE4F51090101404F0CA
-:10068B00801CE510B40117200014E4F51090101431
-:10069B00E060047F0080027F01901014EFF0901057
-:1006AB0014E0FF901000E06F600FA3E0D3940040C4
-:1006BB0008120E187F01120BF0901014E024FF9219
-:0306CB00B5D32282
-:10007000E4901018F0F525F526C207E5AA5484602F
+:020DFE000000F3
+:100CF7004110010041101400411000004210020091
+:010D070000EB
+:100CD700E490E670F075B5E653B5EE43B28053B2D3
+:100CE700FCC2B3C2B5C2B67F32FE120DA2D2B62283
+:100D5F00538EF75389FB5389F74389015389FDE478
+:070D6F00F58AF58CD2A922E0
+:100A9E0078187C107D017BFF7A0D79FE7E007F0237
+:100AAE0012059890E678E0541824F0601E24087021
+:100ABE003AE4901018F07C107D187B017F50120ADA
+:100ACE00387C107D047B107F50801D901018741F91
+:100ADE00F0A374EFF07C107D187B027F51120A3860
+:0B0AEE007C107D047B107F5112060974
+:010AF90022DA
+:100BF6007F03120C84EF2402FFE43EFEE517C39444
+:100C060008501F740C2517F582E43410F583E0FDB7
+:100C16008F828E8375F002E5171205FDEDF005173C
+:020C260080DA72
+:010C280022A9
+:100B4000901001EFF0E50B240AFDE4350AFC90104B
+:100B500007E02FFBA3E0FF0DED8C8370010C14F573
+:100B600082EBF08D828C83EFF0EFFFAD03ED901000
+:100B700002CFF0A3EFF0D207120C2990E680E054E8
+:020B8000F7F08C
+:010B82002250
+:1009410090E600E054E74410F090E60174C0F090A6
+:10095100E6107420F000000090E611F00000009015
+:10096100E6047480F0000000740FF0000000E4F071
+:1009710000000090E6187410F0000000E490E61901
+:10098100F000000090E61A7408F0000000E490E620
+:100991001BF000000090E6497482F0000000F000B6
+:1009A100000090E6247402F0000000E490E625F0D7
+:1009B10000000090E6957480F0000000F000000057
+:0409C10043AF01221D
+:100DA2007C007D181205EBEF1FAC0670011E4C7023
+:020DB200F62227
+:0A06AE008E198F1A8B1B8A1C891D00
+:1006B800E4F51EF51FC3E51F951AE51E951950337D
+:1006C800AB1BAA1CA91D851F82851E831205BEFFB0
+:1006D800E4FEC2B2EF1392B7EFC313FFD2B20EBE5D
+:1006E80008F0C2B220B002C322051FE51F70C6057C
+:0406F8001E80C2D3CB
+:0106FC0022DB
+:100D170090E60174C0F0C2B67F327E00120DA2D2F7
+:080D2700B67F327E00020DA22E
+:10081200901014E0FF901000F0901002E0FCA3E0B2
+:1008220054F064607003EC641160030208B3300694
+:1008320022EFB51902D322208104E5196008208035
+:1008420007E519B40102C322E4F510901014E5196A
+:10085200F0803B30810C208009E4F510901014F0F8
+:10086200802C30800D20810AE4F51090101404F0E1
+:10087200801CE510B40117200014E4F51090101448
+:10088200E060047F0080027F01901014EFF090106E
+:1008920014E0FF901000E06F600FA3E0D3940040DB
+:1008A20008120D177F01120B40901014E024FF92E2
+:0308B200B5D32299
+:10007000E4901018F0F517F518C205E5AA5484604D
 :100080000302029F90F400E024FE70030201452465
 :10009000FA700302016924F8700302019624F070DB
 :1000A0000302019A24F070030201A924F0700302F4
 :1000B00001B424C8700302025D2477600302027257
-:1000C00075250075260490FC007401F090F401E0A1
+:1000C00075170075180490FC007401F090F401E0BD
 :1000D00090FC01F090F402E090FC02F090F401E05A
-:1000E000700AA3E0700630B003120E1820B003307F
+:1000E000700AA3E0700630B003120D1720B0033081
 :1000F000B44A90E694E0FE90E695E07C002400FF90
 :10010000EC3ECF24FCCF34FFFE7B017AF47904125D
-:100110000B5B501F90FC0330B4137408F07FE87E33
-:1001200003120ED190E6017403F002027E7404F013
+:1001100006AE501F90FC0330B4137408F07FE87EE5
+:1001200003120DA290E6017403F002027E7404F043
 :1001300002027E90FC037402F002027E90FC0374C3
-:1001400001F002027E75250075260490FC00740201
+:1001400001F002027E75170075180490FC0074021D
 :10015000F0E4A3F0A3F030B407A37410F002027E21
-:1001600090FC037420F002027E7525007526119024
+:1001600090FC037420F002027E7517007518119040
 :10017000FC007408F0E4FF74042FF582E43410F5F9
 :1001800083E0FE74012FF582E434FCF583EEF00F7A
-:10019000BF10E402027E7F028014D208E4F5271229
-:1001A000062B120E18E4FF8005120E187F01120BA9
-:1001B000F002027E75250075260490F400E090FCA4
+:10019000BF10E402027E7F028014D206E4F5191239
+:1001A0000812120D17E4FF8005120D177F01120BC4
+:1001B0004002027E75170075180490F400E090FC70
 :1001C00000F090F401E090FC01F0E4A3F0A3F090C3
 :1001D000F401E014B40A00400302027E9001EA75C3
 :1001E000F003A4C58325F0C5837302020802021040
 :1001F00002027E02021802022002027E020226028F
 :10020000024502027E02024B90F402E0F5108047A4
 :1002100090FC02E510F08066D200A200E433803743
-:10022000A200E4338031E4F510D20890F402E0F546
-:100230002712062B5007E4F525F526804190FC0295
+:10022000A200E4338031E4F510D20690F402E0F548
+:10023000191208125007E4F517F518804190FC02D6
 :1002400074FFF08039901014E0800CA280E4332514
-:10025000E0FFA281E4334F90FC02F08021E4F52519
-:10026000F52690FC007478F0E4A3F0A3F000000001
-:10027000800C75250075260190FC0074AAF0E52617
-:1002800045256012E52590E69CF0000000E52690EB
+:10025000E0FFA281E4334F90FC02F08021E4F51727
+:10026000F51890FC007478F0E4A3F0A3F00000000F
+:10027000800C75170075180190FC0074AAF0E51841
+:1002800045176012E51790E69CF0000000E5189015
 :0F029000E69DF000000090E6957480F0000000FD
 :01029F00223C
-:020F4500D322B5
-:080F350090E6BAE0F52FD3228B
-:100EE30090E740E52FF0E490E68AF090E68B04F07B
-:020EF300D32208
-:080F3D0090E6BAE0F52ED32284
-:100EF50090E740E52EF0E490E68AF090E68B04F06A
-:020F0500D322F5
-:100D930090E6B9E0242F600D04701990E604E0FF9B
-:100DA300430780800890E604E0FF53077F000000BC
-:070DB300EFF08002D322C320
-:010DBA002216
-:100E3000C0E0C083C082D2025391EF90E65D74019E
-:080E4000F0D082D083D0E03233
-:100EA500C0E0C083C0825391EF90E65D7404F0D03A
-:060EB50082D083D0E03280
-:100EBB00C0E0C083C0825391EF90E65D7402F0D026
-:060ECB0082D083D0E0326A
-:100C7000C0E0C083C08285110C85120D850D828570
-:100C80000C83A37402F085080E85090F850F8285F9
-:100C90000E83A37407F05391EF90E65D7410F0D0CB
-:060CA00082D083D0E03297
-:100E4800C0E0C083C082D2045391EF90E65D74087D
-:080E5800F0D082D083D0E0321B
-:100C3300C0E0C083C08290E680E030E72085080CE6
-:100C430085090D850D82850C83A37402F085110E31
-:100C530085120F850F82850E83A37407F05391EFDE
-:0D0C630090E65D7420F0D082D083D0E032A6
-:0A0F230000010202030304040505A7
-:0E0DEC00011000C10042101500004110170058
-:03000B00020A8C5A
-:100A8C00C0E0C0F0C083C082C0D075D000C000C030
-:100A9C0001C002C003C004C005C006C007901015F9
-:100AAC00E07002A3E07021C208F52712062B90100B
-:100ABC0015E4F0A37482F0A3E0FF24FF9287C287B1
-:100ACC00EF6401F0C200800E901016E024FFF0904D
-:100ADC001015E034FFF0D28CD007D006D005D0042E
-:100AEC00D003D002D001D000D0D0D082D083D0F0AF
-:030AFC00D0E03215
-:100A1800C204C201D203C202120DBB120E8E120909
-:100A280094120F2D120AFF750A07750B007513072C
-:100A380075141275080775091C75110775127085EC
-:100A4800110E85120F7515077516B4D2E843D82014
-:100A580090E668E04409F090E65CE0443DF0D2AFEF
-:100A6800D28C120CDA7F01120BF0538EF8C20412EA
-:100A780000703002051202A0C2023004F2C2041251
-:040A88000D3C80EBB6
-:0B0F180090E50DE030E402C322D3227C
+:0206FD00D32206
+:080E180090E6BAE0F522D322B6
+:100DB40090E740E522F0E490E68AF090E68B04F0B8
+:020DC400D32238
+:080E200090E6BAE0F521D322AF
+:100DC60090E740E521F0E490E68AF090E68B04F0A7
+:020DD600D32226
+:100CAF0090E6B9E0242F600D04701990E604E0FF80
+:100CBF00430780800890E604E0FF53077F000000A1
+:070CCF00EFF08002D322C305
+:010CD60022FB
+:100D2F00C0E0C083C082D2025391EF90E65D7401A0
+:080D3F00F0D082D083D0E03235
+:100D7600C0E0C083C0825391EF90E65D7404F0D06A
+:060D860082D083D0E032B0
+:100D8C00C0E0C083C0825391EF90E65D7402F0D056
+:060D9C0082D083D0E0329A
+:100BC000C0E0C083C08285110C85120D850D828521
+:100BD0000C83A37402F085080E85090F850F8285AA
+:100BE0000E83A37407F05391EF90E65D7410F0D07C
+:060BF00082D083D0E03248
+:100D4700C0E0C083C082D2045391EF90E65D74087F
+:080D5700F0D082D083D0E0321D
+:100B8300C0E0C083C08290E680E030E72085080C97
+:100B930085090D850D82850C83A37402F085110EE2
+:100BA30085120F850F82850E83A37407F05391EF8F
+:0D0BB30090E65D7420F0D082D083D0E03257
+:0A0DF40000010202030304040505D8
+:0E0D0800011000C1004210150000411017003C
+:1009C500C204C201D203C202120CD7120D5F120972
+:1009D50041120A9E750A07750B00751307751412E7
+:1009E50075080775091C75110775127085110E8537
+:1009F500120F7515077516B4D2E843D82090E6682E
+:100A0500E04409F090E65CE0443DF0120BF67F010E
+:100A1500120B40D2AF538EF8C204C2AF120070D28F
+:100A2500AF3002051202A0C2023004EEC204120C5D
+:030A35005880E7FF
+:0B0DE90090E50DE030E402C322D322AD
 :1002A00090E6B9E070030203651470030203DA24D8
 :1002B000FE700302045524FB700302035F147003F5
 :1002C00002035914700302034D14700302035324F4
-:1002D0000560030204B4120F4540030204C090E617
+:1002D0000560030204B41206FD40030204C090E668
 :1002E000BBE024FE602714603E24FD6011146027EB
-:1002F00024067056E50A90E6B3F0E50B8042120F33
-:10030000185044E51390E6B3F0E5148033E50C9003
+:1002F00024067056E50A90E6B3F0E50B8042120D35
+:10030000E95044E51390E6B3F0E5148033E50C9032
 :10031000E6B3F0E50D802985110E85120FE50E90EC
-:10032000E6B3F0E50F801990E6BAE0FF120D68AA77
+:10032000E6B3F0E50F801990E6BAE0FF120C84AA5C
 :1003300006A9077B01EA494B600DEE90E6B3F0EFAA
-:1003400090E6B4F00204C00204AF0204AF120EF54E
-:100350000204C0120F3D0204C0120F350204C01285
-:100360000EE30204C090E6B8E0247F601514601923
+:1003400090E6B4F00204C00204AF0204AF120DC67E
+:100350000204C0120E200204C0120E180204C012C1
+:100360000DB40204C090E6B8E0247F601514601953
 :1003700024027063A201E43325E0FFA203E4334FBB
 :100380008041E490E740F0803F90E6BCE0547EFF7F
 :100390007E00E0D394807C0040047D0180027D00DB
-:1003A000EC4EFEED4F2423F582740F3EF583E4936B
+:1003A000EC4EFEED4F24F4F582740D3EF583E4939C
 :1003B000FF3395E0FEEF24A1FFEE34E68F82F58354
 :1003C000E0540190E740F0E4A3F090E68AF090E674
 :1003D0008B7402F00204C00204AF90E6B8E024FE81
 :1003E0006016240260030204C090E6BAE0B401057E
 :1003F000C2010204C00204AF90E6BAE0705590E674
 :10040000BCE0547EFF7E00E0D394807C0040047DFD
-:100410000180027D00EC4EFEED4F2423F582740F27
+:100410000180027D00EC4EFEED4F24F4F582740D58
 :100420003EF583E493FF3395E0FEEF24A1FFEE3425
 :10043000E68F82F583E054FEF090E6BCE054801332
 :100440001313541FFFE0540F2F90E683F0E0442075
@@ -223,33 +184,53 @@
 :100460004E90E6BAE0B40104D201805490E6BAE0BE
 :100470006402604C803990E6BCE0547EFF7E00E070
 :10048000D394807C0040047D0180027D00EC4EFE10
-:10049000ED4F2423F582740F3EF583E493FF3395EB
+:10049000ED4F24F4F582740D3EF583E493FF33951C
 :1004A000E0FEEF24A1FFEE34E68F82F583800D900D
-:1004B000E6A08008120D93500790E6A0E04401F0FA
+:1004B000E6A08008120CAF500790E6A0E04401F0DF
 :0704C00090E6A0E04480F08B
 :0104C7002212
-:03003300020DFBC0
-:040DFB0053D8EF32A8
-:100D3C0090E682E030E004E020E60B90E682E030C2
-:100D4C00E119E030E71590E680E04401F07F147E75
-:0C0D5C0000120BAA90E680E054FEF0228A
-:100D0D0030090990E680E0440AF0800790E680E023
-:100D1D004408F07FDC7E05120BAA90E65D74FFF0AF
-:0F0D2D0090E65FF05391EF90E680E054F7F022EC
-:020D6800A907D9
-:100D6A00AE15AF168F828E83A3E064037017AD01B0
-:100D7A0019ED7001228F828E83E07C002FFDEC3EFC
-:080D8A00FEAF0580DFE4FEFF6F
-:010D9200223E
-:100BAA008E288F2990E600E054187012E529240156
-:100BBA00FFE43528C313F528EF13F529801590E6CD
-:100BCA0000E05418FFBF100BE52925E0F529E528B8
-:100BDA0033F528E5291529AE28700215284E600537
-:060BEA00120F0780EE224D
-:100F07007400F58690FDA57C05A3E582458370F9FD
-:010F170022B7
-:03000000020908EA
-:0C090800787FE4F6D8FD75812F02094FBE
+:03003300020E2892
+:040E280053D8EF327A
+:100C580090E682E030E004E020E60B90E682E030A7
+:100C6800E119E030E71590E680E04401F07F147E5A
+:0C0C780000120AFA90E680E054FEF02220
+:100C290030070990E680E0440AF0800790E680E00A
+:100C39004408F07FDC7E05120AFA90E65D74FFF045
+:0F0C490090E65FF05391EF90E680E054F7F022D1
+:060609008C178D18AE07EE
+:10060F00EB70037F012290E678E020E6F990E67820
+:10061F007480F0EE25E0440190E679F090E678E002
+:10062F0030E0F990E678E020E26BE030E167BB0163
+:10063F000790E678E04420F090E679E0F5191BEB9F
+:10064F00603090E678E030E0F990E678E020E2451F
+:10065F00BB010790E678E04420F090E679E0FF05D3
+:10066F0018E518AC177002051714F5828C83EFF09C
+:10067F0080CC90E678E030E0F990E678E020E21563
+:10068F0090E678E04440F090E679E085188285178F
+:0E069F0083F07F012290E678E04440F07F0077
+:0106AD00222A
+:100A380090E678E020E6F990E6787480F0EF25E01B
+:100A480090E679F090E678E030E0F990E678E020FA
+:100A5800E23AE030E136EBD3940040260DEDAE04E7
+:100A680070010C14F5828E83E090E679F01B90E615
+:100A780078E030E0F990E678E020E210E020E1D676
+:100A8800800A90E678E04440F07F012290E678E022
+:050A98004440F07F0066
+:010A9D002236
+:020C8400A907BE
+:100C8600AE15AF168F828E83A3E064037017AD0195
+:100C960019ED7001228F828E83E07C002FFDEC3EE1
+:080CA600FEAF0580DFE4FEFF54
+:010CAE002223
+:100AFA008E1A8F1B90E600E054187012E51B240131
+:100B0A00FFE4351AC313F51AEF13F51B801590E6A7
+:100B1A0000E05418FFBF100BE51B25E0F51BE51A92
+:100B2A0033F51AE51B151BAE1A7002151A4E60052D
+:060B3A00120DD880EE222E
+:100DD8007400F58690FDA57C05A3E582458370F92E
+:010DE80022E8
+:030000000208B53E
+:0C08B500787FE4F6D8FD7581220208FC73
 :1004C800E709F608DFFA8046E709F208DFFA803E16
 :1004D80088828C83E709F0A3DFFA8032E309F60803
 :1004E800DFFA8078E309F208DFFA807088828C836B
@@ -269,20 +250,17 @@
 :1005BE00BB010CE58229F582E5833AF583E02250F2
 :1005CE0006E92582F8E622BBFE06E92582F8E2223C
 :0D05DE00E58229F582E5833AF583E4932256
-:1005EB00F8BB010DE58229F582E5833AF583E8F046
-:1005FB00225006E92582C8F622BBFE05E92582C8F2
-:02060B00F222D9
-:10060D00EF8DF0A4A8F0CF8CF0A428CE8DF0A42E01
-:02061D00FE22BB
-:0C061F00A42582F582E5F03583F58322E6
-:10091400020A18E493A3F8E493A34003F68001F2D7
-:1009240008DFF48029E493A3F85407240CC8C333E4
-:10093400C4540F4420C8834004F456800146F6DFB3
-:10094400E4800B0102040810204080900DDBE47E5B
-:10095400019360BCA3FF543F30E509541FFEE493A8
-:10096400A360010ECF54C025E060A840B8E493A36F
-:10097400FAE493A3F8E493A3C8C582C8CAC583CA9A
-:10098400F0A3C8C582C8CAC583CADFE9DEE780BE52
-:010DFA0000F8
+:1005EB00EF8DF0A4A8F0CF8CF0A428CE8DF0A42E24
+:0205FB00FE22DE
+:0C05FD00A42582F582E5F03583F5832209
+:1008C1000209C5E493A3F8E493A34003F68001F27F
+:1008D10008DFF48029E493A3F85407240CC8C33338
+:1008E100C4540F4420C8834004F456800146F6DF07
+:1008F100E4800B0102040810204080900CF7E47E94
+:10090100019360BCA3FF543F30E509541FFEE493FB
+:10091100A360010ECF54C025E060A840B8E493A3C2
+:10092100FAE493A3F8E493A3C8C582C8CAC583CAED
+:10093100F0A3C8C582C8CAC583CADFE9DEE780BEA5
+:010D160000DC
 :00000001FF
 

Modified: linux/trunk/drivers/dahdi/xpp/init_card_3_30
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/init_card_3_30?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/init_card_3_30 (original)
+++ linux/trunk/drivers/dahdi/xpp/init_card_3_30 Sun Mar  1 07:56:23 2009
@@ -398,8 +398,10 @@
 							#            in the last slot of PCM frame
 							#            V_PCM_DR, C4IO  is 16.384MHz(128 time slots) 
 
-	BRI::gen "$portnum	WD	4C	03";	# GPIOGPIO function (not PWM) on GPIO0 and GPIO1 pins
-	BRI::gen "$portnum	WD	4A	03";	# Output enable for GPIO0 and GPIO1 pins
+	BRI::gen "$portnum	WD	4C	07";	# GPIOGPIO function (not PWM) on GPIO0, GPIO1 and GPIO2 pins
+	BRI::gen "$portnum	WD	4A	07";	# Output enable for GPIO0, GPIO1 and GPIO2 pins
+	BRI::gen "$portnum	WD	48	01";	# GPIO output data bits
+
 }
 
 my @port_type = (

Modified: linux/trunk/drivers/dahdi/xpp/xbus-core.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xbus-core.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xbus-core.c (original)
+++ linux/trunk/drivers/dahdi/xpp/xbus-core.c Sun Mar  1 07:56:23 2009
@@ -61,6 +61,7 @@
 
 /* Command line parameters */
 extern int debug;
+static DEF_PARM(uint, command_queue_length, 800, 0444, "Maximal command queue length");
 static DEF_PARM(uint, poll_timeout, 1000, 0644, "Timeout (in jiffies) waiting for units to reply");
 static DEF_PARM_BOOL(rx_tasklet, 0, 0644, "Use receive tasklets");
 
@@ -503,11 +504,20 @@
 {
 	xframe_t	*frm;
 	int		ret = 0;
+	int		packno;
 
 	xbus->command_tick_counter++;
-	frm = xframe_dequeue(&xbus->command_queue);
-	if(frm) {
+	xbus->usec_nosend -= 1000;	/* That's our budget */
+	for(packno = 0; packno < 3; packno++) {
+		if(xbus->usec_nosend > 0)
+			break;
+		frm = xframe_dequeue(&xbus->command_queue);
+		if(!frm) {
+			wake_up(&xbus->command_queue_empty);
+			break;
+		}
 		BUG_ON(frm->xframe_magic != XFRAME_MAGIC);
+		xbus->usec_nosend += frm->usec_towait;
 		ret = really_send_cmd_frame(xbus, frm);
 		if(ret < 0) {
 			XBUS_ERR(xbus,
@@ -515,8 +525,9 @@
 				ret);
 			xbus_setstate(xbus, XBUS_STATE_FAIL);
 		}
-	} else
-		wake_up(&xbus->command_queue_empty);
+	}
+	if(xbus->usec_nosend < 0)
+		xbus->usec_nosend = 0;
 	return ret;
 }
 
@@ -1190,19 +1201,12 @@
 
 void xbus_deactivate(xbus_t *xbus, bool is_disconnected)
 {
-	int	i;
-
 	BUG_ON(!xbus);
 	XBUS_INFO(xbus, "[%s] Deactivating\n", xbus->label);
 	if(!xbus_setstate(xbus, XBUS_STATE_DEACTIVATING))
 		return;
 	xbus_request_sync(xbus, SYNC_MODE_NONE);	/* no more ticks */
-	for(i = 0; i < MAX_XPDS; i++) {
-		xpd_t *xpd = xpd_of(xbus, i);
-		if(xpd) {
-			xpd_unreg_request(xpd);
-		}
-	}
+	xbus_request_removal(xbus);
 	XBUS_DBG(DEVICES, xbus, "[%s] Waiting for queues\n", xbus->label);
 	xbus_command_queue_clean(xbus);
 	xbus_command_queue_waitempty(xbus);
@@ -1388,7 +1392,7 @@
 		goto nobus;
 	}
 #endif
-	xframe_queue_init(&xbus->command_queue, 10, 200, "command_queue", xbus);
+	xframe_queue_init(&xbus->command_queue, 10, command_queue_length, "command_queue", xbus);
 	xframe_queue_init(&xbus->receive_queue, 10, 50, "receive_queue", xbus);
 	xframe_queue_init(&xbus->send_pool, 10, 100, "send_pool", xbus);
 	xframe_queue_init(&xbus->receive_pool, 10, 50, "receive_pool", xbus);
@@ -1479,6 +1483,7 @@
 	len += sprintf(page + len, "self_ticking: %d (last_tick at %ld)\n",
 			xbus->self_ticking, xbus->ticker.last_sample.tv.tv_sec);
 	len += sprintf(page + len, "command_tick: %d\n", xbus->command_tick_counter);
+	len += sprintf(page + len, "usec_nosend: %d\n", xbus->usec_nosend);
 	len += sprintf(page + len, "xbus: pcm_rx_counter = %d, frag = %d\n",
 		atomic_read(&xbus->pcm_rx_counter), xbus->xbus_frag_count);
 	len += sprintf(page + len, "max_rx_process = %2ld.%ld ms\n",

Modified: linux/trunk/drivers/dahdi/xpp/xbus-core.h
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xbus-core.h?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xbus-core.h (original)
+++ linux/trunk/drivers/dahdi/xpp/xbus-core.h Sun Mar  1 07:56:23 2009
@@ -171,6 +171,7 @@
 	struct xpd		*xpds[MAX_XPDS];
 
 	int			command_tick_counter;
+	int			usec_nosend;		/* Firmware flow control */
 	struct xframe_queue	command_queue;
 	wait_queue_head_t	command_queue_empty;
 
@@ -261,6 +262,7 @@
 	size_t			frame_maxlen;
 	byte			*packets;	/* max XFRAME_DATASIZE */
 	byte			*first_free;
+	int			usec_towait;	/* prevent overflowing AB */
 	void			*priv;
 };
 

Modified: linux/trunk/drivers/dahdi/xpp/xbus-pcm.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xbus-pcm.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xbus-pcm.c (original)
+++ linux/trunk/drivers/dahdi/xpp/xbus-pcm.c Sun Mar  1 07:56:23 2009
@@ -177,7 +177,7 @@
 
 	spin_lock_irqsave(&driftinfo->lock, flags);
 	cycled = xpp_ticker_step(&xbus->ticker, tv);
-	if(ref_ticker && syncer && xbus->sync_mode == SYNC_MODE_PLL) {
+	if(ref_ticker && ref_ticker != &xbus->ticker && syncer && xbus->sync_mode == SYNC_MODE_PLL) {
 		int	new_delta_tick = ticker->count - ref_ticker->count;
 		int	lost_ticks = new_delta_tick - driftinfo->delta_tick;
 
@@ -342,6 +342,7 @@
 		XBUS_DBG(SYNC, xbus, "del_timer\n");
 		del_timer(&xbus->command_timer);
 	}
+	xbus->self_ticking = ! on;
 }
 
 /*
@@ -363,21 +364,18 @@
 	case SYNC_MODE_AB:
 		xbus->sync_mode = mode;
 		xbus_set_command_timer(xbus, 0);
-		xbus->self_ticking = 1;
 		xpp_set_syncer(xbus, 1);
 		global_ticker = xbus;
 		break;
 	case SYNC_MODE_PLL:
 		xbus->sync_mode = mode;
 		xbus_set_command_timer(xbus, 0);
-		xbus->self_ticking = 1;
 		xpp_set_syncer(xbus, 0);
 		global_ticker = xbus;
 		break;
 	case SYNC_MODE_NONE:		/* lost sync source */
 		xbus->sync_mode = mode;
 		xbus_set_command_timer(xbus, 1);
-		xbus->self_ticking = 0;
 		xpp_set_syncer(xbus, 0);
 		break;
 	case SYNC_MODE_QUERY:		/* ignore           */
@@ -395,7 +393,6 @@
 	XBUS_DBG(SYNC, xbus, "sent request (mode=%d)\n", mode);
 	CALL_PROTO(GLOBAL, SYNC_SOURCE, xbus, NULL, mode, 0);
 	if(mode == SYNC_MODE_NONE) {
-		xbus->self_ticking = 0;
 		xbus_set_command_timer(xbus, 1);
 	}
 }
@@ -528,6 +525,12 @@
 	 * This global locking protects:
 	 *   - The ref_ticker so it won't be used while we change it.
 	 *   - The xbus_drift_clear() from corrupting driftinfo data.
+	 * It's important to set ref_ticker now:
+	 *   - We cannot make the new xbus a syncer yet (until we get
+	 *     a reply from AB). Maybe it's still not self_ticking, so
+	 *     we must keep the timer for the command_queue to function.
+	 *   - However, we must not send drift commands to it, because
+	 *     they'll revert it to PLL instead of AB.
 	 */
 	spin_lock_irqsave(&ref_ticker_lock, flags);
 	if(syncer)
@@ -564,7 +567,7 @@
 {
 	int	i;
 	int	j;
-	uint	timing_priority = 0;
+	uint	timing_priority = INT_MAX;
 	xpd_t	*best_xpd = NULL;
 	xbus_t	*the_xbus = NULL;
 
@@ -580,7 +583,7 @@
 
 				if(!xpd || !xpd->card_present)
 					continue;
-				if(xpd->timing_priority > timing_priority) {
+				if(xpd->timing_priority > 0 && xpd->timing_priority < timing_priority) {
 					timing_priority = xpd->timing_priority;
 					best_xpd = xpd;
 				}
@@ -595,6 +598,7 @@
 	} else {
 		DBG(SYNC, "%s: No more syncers\n", msg);
 		xpp_set_syncer(NULL, 0);
+		the_xbus = NULL;
 	}
 	if(the_xbus != syncer)
 		update_sync_master(the_xbus, force_dahdi_sync);

Modified: linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c (original)
+++ linux/trunk/drivers/dahdi/xpp/xbus-sysfs.c Sun Mar  1 07:56:23 2009
@@ -612,6 +612,26 @@
 	return len;
 }
 
+static DEVICE_ATTR_READER(offhook_show, dev, buf)
+{
+	xpd_t		*xpd;
+	int		len = 0;
+	int		i;
+
+	BUG_ON(!dev);
+	xpd = dev_to_xpd(dev);
+	if(!xpd)
+		return -ENODEV;
+	for_each_line(xpd, i) {
+		len += sprintf(buf + len, "%d ", IS_OFFHOOK(xpd, i));
+	}
+	if(len) {
+		len--;	/* backout last space */
+		len += sprintf(buf + len, "\n");
+	}
+	return len;
+}
+
 static int xpd_match(struct device *dev, struct device_driver *driver)
 {
 	struct xpd_driver	*xpd_driver;
@@ -634,6 +654,7 @@
 	__ATTR(blink,		S_IRUGO | S_IWUSR, blink_show, blink_store),
 	__ATTR(span,		S_IRUGO | S_IWUSR, span_show, span_store),
         __ATTR_RO(type),
+        __ATTR_RO(offhook),
         __ATTR_NULL,
 };
 

Modified: linux/trunk/drivers/dahdi/xpp/xframe_queue.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xframe_queue.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xframe_queue.c (original)
+++ linux/trunk/drivers/dahdi/xpp/xframe_queue.c Sun Mar  1 07:56:23 2009
@@ -23,6 +23,26 @@
 	q->worst_count = 0;
 	//q->overflows = 0;	/* Never clear overflows */
 	q->worst_lag_usec = 0L;
+}
+
+static void __xframe_dump_queue(struct xframe_queue *q)
+{
+	xframe_t	*xframe;
+	int		i = 0;
+	char		prefix[30];
+	struct timeval	now;
+
+	do_gettimeofday(&now);
+	printk(KERN_DEBUG "%s: dump queue '%s' (first packet in each frame)\n",
+		THIS_MODULE->name,
+		q->name);
+	list_for_each_entry_reverse(xframe, &q->head, frame_list) {
+		xpacket_t	*pack = (xpacket_t *)&xframe->packets[0];
+		long		usec = usec_diff(&now, &xframe->tv_queued);
+		snprintf(prefix, ARRAY_SIZE(prefix), "  %3d> %5ld.%03ld msec",
+			i++, usec / 1000, usec % 1000);
+		dump_packet(prefix, pack, 1);
+	}
 }
 
 static bool __xframe_enqueue(struct xframe_queue *q, xframe_t *xframe)
@@ -44,6 +64,7 @@
 				q->overflows,
 				q->worst_lag_usec / 1000,
 				q->worst_lag_usec % 1000);
+		__xframe_dump_queue(q);
 		ret = 0;
 		goto out;
 	}

Modified: linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c (original)
+++ linux/trunk/drivers/dahdi/xpp/xpp_dahdi.c Sun Mar  1 07:56:23 2009
@@ -558,28 +558,45 @@
 	return NULL;
 }
 
-void xpd_unreg_request(xpd_t *xpd)
+/*
+ * Try our best to make asterisk close all channels related to
+ * this Astribank:
+ *   - Set span state to DAHDI_ALARM_NOTOPEN in all relevant spans.
+ *   - Notify dahdi afterwards about spans (so it can see all changes at once).
+ *   - Also send DAHDI_EVENT_REMOVED on all channels.
+ */
+void xbus_request_removal(xbus_t *xbus)
 {
 	unsigned long	flags;
-
-	BUG_ON(!xpd);
-
-	XPD_DBG(DEVICES, xpd, "\n");
-	spin_lock_irqsave(&xpd->lock, flags);
-	xpd->card_present = 0;
-	xpd_setstate(xpd, XPD_STATE_NOHW);
-	if(SPAN_REGISTERED(xpd)) {
-		int i;
-
-		update_xpd_status(xpd, DAHDI_ALARM_NOTOPEN);
-		/* TODO: Should this be done before releasing the spinlock? */
-		XPD_DBG(DEVICES, xpd, "Queuing DAHDI_EVENT_REMOVED on all channels to ask user to close them\n");
-		for (i=0; i<xpd->span.channels; i++) {
-			dahdi_qevent_lock(XPD_CHAN(xpd, i),DAHDI_EVENT_REMOVED);
+	int		i;
+
+	for(i = 0; i < MAX_XPDS; i++) {
+		xpd_t *xpd = xpd_of(xbus, i);
+		if(xpd) {
+			XPD_DBG(DEVICES, xpd, "\n");
+			spin_lock_irqsave(&xpd->lock, flags);
+			xpd->card_present = 0;
+			xpd_setstate(xpd, XPD_STATE_NOHW);
+			xpd->span.alarms = DAHDI_ALARM_NOTOPEN;
+			spin_unlock_irqrestore(&xpd->lock, flags);
 		}
 	}
-	spin_unlock_irqrestore(&xpd->lock, flags);
-	xpd_device_unregister(xpd);
+	/* Now notify dahdi */
+	for(i = 0; i < MAX_XPDS; i++) {
+		xpd_t *xpd = xpd_of(xbus, i);
+		if(xpd) {
+			if(SPAN_REGISTERED(xpd)) {
+				int i;
+
+				dahdi_alarm_notify(&xpd->span);
+				XPD_DBG(DEVICES, xpd, "Queuing DAHDI_EVENT_REMOVED on all channels to ask user to release them\n");
+				for (i=0; i<xpd->span.channels; i++) {
+					dahdi_qevent_lock(XPD_CHAN(xpd, i),DAHDI_EVENT_REMOVED);
+				}
+			}
+			xpd_device_unregister(xpd);
+		}
+	}
 }
 
 /*
@@ -615,9 +632,9 @@
 	}
 	if(span->alarms == alarm_flag)
 		return;
+	XPD_DBG(GENERAL, xpd, "Update XPD alarms: %s -> %02X\n", xpd->span.name, alarm_flag);
 	span->alarms = alarm_flag;
 	dahdi_alarm_notify(span);
-	XPD_DBG(GENERAL, xpd, "Update XPD alarms: %s -> %02X\n", xpd->span.name, alarm_flag);
 }
 
 /*
@@ -1189,7 +1206,7 @@
 EXPORT_SYMBOL(put_xpd);
 EXPORT_SYMBOL(xpd_alloc);
 EXPORT_SYMBOL(xpd_free);
-EXPORT_SYMBOL(xpd_unreg_request);
+EXPORT_SYMBOL(xbus_request_removal);
 EXPORT_SYMBOL(update_xpd_status);
 EXPORT_SYMBOL(oht_pcm);
 EXPORT_SYMBOL(mark_offhook);

Modified: linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h
URL: http://svn.digium.com/svn-view/dahdi/linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h?view=diff&rev=6046&r1=6045&r2=6046
==============================================================================
--- linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h (original)
+++ linux/trunk/drivers/dahdi/xpp/xpp_dahdi.h Sun Mar  1 07:56:23 2009
@@ -27,7 +27,7 @@
 
 int dahdi_register_xpd(xpd_t *xpd);

[... 30 lines stripped ...]



More information about the svn-commits mailing list