summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-03-01 13:56:23 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-03-01 13:56:23 +0000
commit7e6e55bbdcd0224bf07de8dd47e4f7a92e7d097f (patch)
tree34c04ea112c9587bbad7e0593119c09a53c43466
parentac9297570200f1f21dff01043baabdba90516722 (diff)
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. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@6046 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rw-r--r--drivers/dahdi/xpp/.version2
-rw-r--r--drivers/dahdi/xpp/Changelog_xpp29
-rw-r--r--drivers/dahdi/xpp/card_fxo.c10
-rw-r--r--drivers/dahdi/xpp/card_global.c28
-rw-r--r--drivers/dahdi/xpp/card_global.h3
-rw-r--r--drivers/dahdi/xpp/firmwares/USB_FW.hex378
-rwxr-xr-xdrivers/dahdi/xpp/init_card_3_306
-rw-r--r--drivers/dahdi/xpp/xbus-core.c31
-rw-r--r--drivers/dahdi/xpp/xbus-core.h2
-rw-r--r--drivers/dahdi/xpp/xbus-pcm.c18
-rw-r--r--drivers/dahdi/xpp/xbus-sysfs.c21
-rw-r--r--drivers/dahdi/xpp/xframe_queue.c21
-rw-r--r--drivers/dahdi/xpp/xpp_dahdi.c55
-rw-r--r--drivers/dahdi/xpp/xpp_dahdi.h2
-rw-r--r--drivers/dahdi/xpp/xproto.h5
15 files changed, 343 insertions, 268 deletions
diff --git a/drivers/dahdi/xpp/.version b/drivers/dahdi/xpp/.version
index a9bbf42..215cbef 100644
--- a/drivers/dahdi/xpp/.version
+++ b/drivers/dahdi/xpp/.version
@@ -1 +1 @@
-trunk-r6630
+trunk-r6795
diff --git a/drivers/dahdi/xpp/Changelog_xpp b/drivers/dahdi/xpp/Changelog_xpp
index 47b1be8..5408651 100644
--- a/drivers/dahdi/xpp/Changelog_xpp
+++ b/drivers/dahdi/xpp/Changelog_xpp
@@ -1,2 +1,31 @@
+Sun Mar 1 2009 Oron Peled <oron@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@actcom.co.il> - xpp.r6056
* First DAHDI-linux release.
diff --git a/drivers/dahdi/xpp/card_fxo.c b/drivers/dahdi/xpp/card_fxo.c
index 61ea204..93b5f5b 100644
--- a/drivers/dahdi/xpp/card_fxo.c
+++ b/drivers/dahdi/xpp/card_fxo.c
@@ -194,6 +194,7 @@ static void reset_battery_readings(xpd_t *xpd, lineno_t pos)
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 @@ static int do_sethook(xpd_t *xpd, int pos, bool to_offhook)
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 @@ static void handle_fxo_power_denial(xpd_t *xpd)
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 @@ static void update_battery_voltage(xpd_t *xpd, byte data_low, xportno_t portno)
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 @@ static void update_battery_voltage(xpd_t *xpd, byte data_low, xportno_t portno)
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
diff --git a/drivers/dahdi/xpp/card_global.c b/drivers/dahdi/xpp/card_global.c
index 438a800..cd43d4c 100644
--- a/drivers/dahdi/xpp/card_global.c
+++ b/drivers/dahdi/xpp/card_global.c
@@ -484,6 +484,12 @@ int xpp_register_request(xbus_t *xbus, xpd_t *xpd, xportno_t portno,
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, SYNC_REPLY)
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
diff --git a/drivers/dahdi/xpp/card_global.h b/drivers/dahdi/xpp/card_global.h
index c6a9a9b..7c2c9e7 100644
--- a/drivers/dahdi/xpp/card_global.h
+++ b/drivers/dahdi/xpp/card_global.h
@@ -91,7 +91,8 @@ DEF_RPACKET_DATA(GLOBAL, RESET_SYNC_COUNTERS,
byte mask;
);
DEF_RPACKET_DATA(GLOBAL, ERROR_CODE,
- byte errorcode;
+ byte category_code;
+ byte errorbits;
byte bad_packet[0];
);
diff --git a/drivers/dahdi/xpp/firmwares/USB_FW.hex b/drivers/dahdi/xpp/firmwares/USB_FW.hex
index aaa784e..a7093b4 100644
--- a/drivers/dahdi/xpp/firmwares/USB_FW.hex
+++ b/drivers/dahdi/xpp/firmwares/USB_FW.hex
@@ -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
 \ No newline at end of file
diff --git a/drivers/dahdi/xpp/init_card_3_30 b/drivers/dahdi/xpp/init_card_3_30
index 3355f7b..9e72089 100755
--- a/drivers/dahdi/xpp/init_card_3_30
+++ b/drivers/dahdi/xpp/init_card_3_30
@@ -398,8 +398,10 @@ sub init_xhfc($) {
# 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 = (
diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c
index 6be6f0e..b4716a4 100644
--- a/drivers/dahdi/xpp/xbus-core.c
+++ b/drivers/dahdi/xpp/xbus-core.c
@@ -61,6 +61,7 @@ static int proc_xbus_command_write(struct file *file, const char __user *buffer,
/* 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 @@ int xbus_command_queue_tick(xbus_t *xbus)
{
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 @@ int xbus_command_queue_tick(xbus_t *xbus)
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 @@ int xbus_connect(xbus_t *xbus)
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 @@ xbus_t *xbus_new(struct xbus_ops *ops, ushort max_send_size, struct device *tran
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 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
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",
diff --git a/drivers/dahdi/xpp/xbus-core.h b/drivers/dahdi/xpp/xbus-core.h
index 8cfb48c..a24d76b 100644
--- a/drivers/dahdi/xpp/xbus-core.h
+++ b/drivers/dahdi/xpp/xbus-core.h
@@ -171,6 +171,7 @@ struct xbus {
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 @@ struct xframe {
size_t frame_maxlen;
byte *packets; /* max XFRAME_DATASIZE */
byte *first_free;
+ int usec_towait; /* prevent overflowing AB */
void *priv;
};
diff --git a/drivers/dahdi/xpp/xbus-pcm.c b/drivers/dahdi/xpp/xbus-pcm.c
index ef1d5e3..2d98dc5 100644
--- a/drivers/dahdi/xpp/xbus-pcm.c
+++ b/drivers/dahdi/xpp/xbus-pcm.c
@@ -177,7 +177,7 @@ static void xpp_drift_step(xbus_t *xbus, const struct timeval *tv)
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 @@ void xbus_set_command_timer(xbus_t *xbus, bool on)
XBUS_DBG(SYNC, xbus, "del_timer\n");
del_timer(&xbus->command_timer);
}
+ xbus->self_ticking = ! on;
}
/*
@@ -363,21 +364,18 @@ void got_new_syncer(xbus_t *xbus, enum sync_mode mode, int drift)
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 @@ void xbus_request_sync(xbus_t *xbus, enum sync_mode mode)
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 @@ static void update_sync_master(xbus_t *new_syncer, bool force_dahdi)
* 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 @@ void elect_syncer(const char *msg)
{
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 @@ void elect_syncer(const char *msg)
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 @@ void elect_syncer(const char *msg)
} 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);
diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c
index 1094a19..67c4c28 100644
--- a/drivers/dahdi/xpp/xbus-sysfs.c
+++ b/drivers/dahdi/xpp/xbus-sysfs.c
@@ -612,6 +612,26 @@ static DEVICE_ATTR_READER(type_show, dev, buf)
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 @@ static struct device_attribute xpd_dev_attrs[] = {
__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,
};
diff --git a/drivers/dahdi/xpp/xframe_queue.c b/drivers/dahdi/xpp/xframe_queue.c
index 915c5af..d3c3e48 100644
--- a/drivers/dahdi/xpp/xframe_queue.c
+++ b/drivers/dahdi/xpp/xframe_queue.c
@@ -25,6 +25,26 @@ void xframe_queue_clearstats(struct xframe_queue *q)
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)
{
int ret = 1;
@@ -44,6 +64,7 @@ static bool __xframe_enqueue(struct xframe_queue *q, xframe_t *xframe)
q->overflows,
q->worst_lag_usec / 1000,
q->worst_lag_usec % 1000);
+ __xframe_dump_queue(q);
ret = 0;
goto out;
}
diff --git a/drivers/dahdi/xpp/xpp_dahdi.c b/drivers/dahdi/xpp/xpp_dahdi.c
index b1ec98c..e7b024a 100644
--- a/drivers/dahdi/xpp/xpp_dahdi.c
+++ b/drivers/dahdi/xpp/xpp_dahdi.c
@@ -558,28 +558,45 @@ err:
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;
+ int i;
- 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);
+ 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);
+ }
+ }
+ /* 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);
}
}
- spin_unlock_irqrestore(&xpd->lock, flags);
- xpd_device_unregister(xpd);
}
/*
@@ -615,9 +632,9 @@ void update_xpd_status(xpd_t *xpd, int alarm_flag)
}
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(get_xpd);
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);
diff --git a/drivers/dahdi/xpp/xpp_dahdi.h b/drivers/dahdi/xpp/xpp_dahdi.h
index 8bf471b..ad87b86 100644
--- a/drivers/dahdi/xpp/xpp_dahdi.h
+++ b/drivers/dahdi/xpp/xpp_dahdi.h
@@ -27,7 +27,7 @@
int dahdi_register_xpd(xpd_t *xpd);
int dahdi_unregister_xpd(xpd_t *xpd);
-void xpd_unreg_request(xpd_t *xpd);
+void xbus_request_removal(xbus_t *xbus);
int create_xpd(xbus_t *xbus, const xproto_table_t *proto_table,
int unit, int subunit, byte type, byte subtype, int subunits, byte port_dir);
void xpd_post_init(xpd_t *xpd);
diff --git a/drivers/dahdi/xpp/xproto.h b/drivers/dahdi/xpp/xproto.h
index 92eca4f..899791f 100644
--- a/drivers/dahdi/xpp/xproto.h
+++ b/drivers/dahdi/xpp/xproto.h
@@ -149,13 +149,14 @@ bool valid_xpd_addr(const struct xpd_addr *addr);
\
if(XBUS_IS(xbus, DISCONNECTED)) \
return -ENODEV; \
- frm = ALLOC_SEND_XFRAME(xbus); \
- if(!frm) \
+ (frm) = ALLOC_SEND_XFRAME(xbus); \
+ if(!(frm)) \
return -ENOMEM; \
(p) = xframe_next_packet(frm, pack_len); \
if(!(p)) \
return -ENOMEM; \
XPACKET_INIT(p, card, op, to, 0, 0); \
+ (frm)->usec_towait = 0; \
} while(0)
#endif