diff options
Diffstat (limited to 'drivers/dahdi')
-rw-r--r-- | drivers/dahdi/xpp/.version | 2 | ||||
-rw-r--r-- | drivers/dahdi/xpp/Changelog_xpp | 29 | ||||
-rw-r--r-- | drivers/dahdi/xpp/card_fxo.c | 10 | ||||
-rw-r--r-- | drivers/dahdi/xpp/card_global.c | 28 | ||||
-rw-r--r-- | drivers/dahdi/xpp/card_global.h | 3 | ||||
-rw-r--r-- | drivers/dahdi/xpp/firmwares/USB_FW.hex | 378 | ||||
-rwxr-xr-x | drivers/dahdi/xpp/init_card_3_30 | 6 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-core.c | 31 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-core.h | 2 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-pcm.c | 18 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-sysfs.c | 21 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xframe_queue.c | 21 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xpp_dahdi.c | 55 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xpp_dahdi.h | 2 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xproto.h | 5 |
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 |