Compare commits

...

69 Commits

Author SHA1 Message Date
Shaun Ruffell
ae8a02168b build_tools/make_version: Strip off the leading 'v' in the version string.
Quote: "It's a change. People hate change"

Make the version string say something like 2.6.2 instead of v2.6.2.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 9b0d19c054)
2013-03-08 11:39:53 -06:00
Shaun Ruffell
2a5638deef build_tools/make_version: If making from a tag show only the tag in the version.
Also, if there is no other version information use the directory name. Downloads
from gitweb will include the sha information in the build and otherwise a user
could locate the source directory via the embedded version information. I
believe this is better than an empty string.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 37371f19e9)
2013-03-07 16:20:00 -06:00
Tzafrir Cohen
fcaec330e5 Redefine the removed __dev* for now
The __dev* directives and functions were removed in 3.8, as they
are no-ops. We still have use of them for older versions, thus
we should define them (as noops) if they don't exist.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
2013-03-04 11:07:35 -06:00
Shaun Ruffell
41639330a5 wctdm24xxp: Eliminate chance for channel to be stuck in RED alarm.
There was a code patch where it was possible to get stuck in RED ALARM on a
channel when debouncing the battery states. The state transitions would look
like this:

BATTERY_PRESENT -> BATTERY_DEBOUNCING_LOST -> BATTERY_DEBOUNCING_LOST_ALARM --
(send alarm up to asterisk) --> BATTERY_LOST -> BATTERY_DEBOUNCING_PRESENT ->
BATTERY_DEBOUNCING_PRESENT_ALARM -> BATTERY_DEBOUNCING_LOST -> BATTERY_PRESENT

In the above sequence there was never any transition from
BATTERY_DEBOUNCING_PRESENT_ALARM to BATTERY_PRESENT so the alarm to Asterisk was
never cleared and the channel stayed stuck.

Now when you loose battery when in the BATTERY_DEBOUNCING_PRESENT_ALARM go all
the way back to the BATTERY_LOST state instead of the BATTERY_DEBOUNCING_LOST
state so that all the events are properly sent up.

This fixes a regression introduced in 2.6.0 with commit (r10169 "wctdm24xxp: Use
interval for debouncing FXO battery." 874b76bd22).

Internal-Issue-ID: DAHDI-1019
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 8bf0434896)
2013-01-25 13:12:59 -06:00
Shaun Ruffell
e3931e5d5f wctdm24xxp: Use framecount and not jiffies when looking for battery present.
The logic to check for battery lost and battery present were using different
time bases. One was using jiffies and the other was using framecount. Since
framecount is always in milliseconds, let's use that to stay consistent.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit a6be603590)
2013-01-25 13:12:50 -06:00
Shaun Ruffell
33b4edf463 wcb4xxp: Allocate memory in hfc_decode_st_state() with GFP_ATOMIC.
hfc_decode_st_state() will be called from interrupt context when the debug flag
is set to 32. Therefore, must use GFP_ATOMIC when allocating memory.

Only affects the wcb4xxp driver when called with particular debug flags set.

Internal-Issue-ID: DAHLIN-314
Reported-by: Gerald Schnabel
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 85e6cdde83)
2013-01-25 13:10:52 -06:00
Shaun Ruffell
46cfdca5d5 wct4xxp: t4_serial_setup() was called more often than necessary.
The driver iterates through all the spans on a given device during assignment,
checking for unassigned spans, but it was erroneously testing the span on which
assigned was called.

This just removes some unexpected behavior and provides a slight performance
increase on load and does not impact the functionality of the driver as far as
I'm aware.

Reported-by: Doug Bailey <dbailey@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
(cherry picked from commit 9de213b104)
2013-01-25 13:10:10 -06:00
Shaun Ruffell
42be50ca28 wct4xxp: EC channel calculation in TONEDETECT assumes TE820.
Since r10290 "wct4xxp: Add support for TE820 and VPMOCT256." [1],
the TONEDETECT ioctl was not calculating the VPM channel correctly
on non TE820 cards. This fixes a regression first introduced in
2.6.0.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10290

Internal-Issue-ID: DAHLIN-302
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10733 a0bf4364-ded3-4de4-8d8a-66a801d63aff
(cherry picked from commit abad4b4479)
2013-01-25 13:09:49 -06:00
Shaun Ruffell
f6511b1040 wctdm24xxp: Only two polarity reversals are needed to validate RING on FXO ports.
This fixes a regression introduced in commit r10186 "wctdm24xxp: Use time
interval for debouncing FXO ring detect." [1] which was first released in
DAHDI-Linux 2.6.0. This only affects users with analog trunks whose providers do
not present 4 polarity reversals on the ring signals. The reporter of this issue
is based in South Africa.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10168

In prior versions, the ring detector did not check for polarity reversals, only
the presence of ringing voltage unless fwringdetect or neonmwi_monitor mode was
set, and even when one of those modes were set, the driver only needed two
reversals to validate a ring. This commit allows the driver to always stay in
fwringdetect mode but restores the requirement for only two reversals.

Also included in this commit is a change to ensure that ringing is not reported
when debouncing lost battery which can happen when voltage is swinging through
0.

Reported-and-Tested-by: Jaco Kroon <jaco@uls.co.za>
Internal-Issue-ID: DAHLIN-298
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10719 a0bf4364-ded3-4de4-8d8a-66a801d63aff
(cherry picked from commit 84e70cdac5)
2013-01-25 13:09:32 -06:00
Shaun Ruffell
179a48862d xpp: Do not typedef bool on RHEL 5.2 or later.
Without digging into the specifics, it looks like Red Hat Linux 5.9
removed the hex_asc definition that was previously used to determine
if the bool definition was backported.

We can simply use the RHEL_RELEASE_CODE now since we do not support any
releases before the 5 series now.

Reported-By: Vladimir Mikhelson
Internal-Issue-ID: DAHLIN-312
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-By: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit da0aa6f231)

Conflicts:
	drivers/dahdi/xpp/xdefs.h
2013-01-25 13:08:52 -06:00
Tzafrir Cohen
f9632cdeb3 gitignore: Add README.html to git ignore list
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
(cherry picked from commit a8dfd61e53)
2013-01-25 13:07:15 -06:00
Tzafrir Cohen
161698087d Add .gitignore file
Allows 'git status' command to better show untracked files which one may be
interested in.

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Acked-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
(cherry picked from commit d889fb39d3)
2013-01-25 13:06:39 -06:00
Tzafrir Cohen
6262abb53c xpp: pre/post_unregister: not for the EC
Don't run the pre- and post-unregister hooks on a non-phone XPD
(practically: the echo canceller). This fixes a panic with manual
'dahdi_registertion off' as it is now called for the whole device
(regression of 2.6.x).

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10735

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10736 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-11-15 15:15:48 +00:00
Shaun Ruffell
7ad722e684 dahdi: pci-aspm.h was included in 2.6.26 not 2.6.25.
When compiling against kernels 2.6.25, you could get the following error.

  error: linux/pci-aspm.h: No such file or directory

This fixes a build regression introduced in r10556 "dahdi: Add
dahdi_pci_disable_link_state for kernel < 2.6.25." [1]

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10556

Reported-by: Jean-Philippe Lord
Internal-Issue-ID: DAHLIN-299
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10705

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10708 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-08-16 21:39:01 +00:00
Shaun Ruffell
3a3684a38e wcte12xp: Fix stack corruption when checking T1 RBS states.
This fixes an (embarrassing) error in t1_check_sigbits in the previous commit
where I was writing pass the end of an array on the stack.

Now instead of using an array on the stack, of which all elements were not used,
the pending commands are now stored on a list. I also removed the automatic free
of commands from __t1_getresults and now the function that allocated the command
now frees them.

I believe this will be less error-prone going forward.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10700

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10707 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-08-16 21:38:57 +00:00
Shaun Ruffell
8db0c61fd8 wcte12xp: Fix pulse digit detection when set for FXO signalling modes.
The frequency that the RBS registers were polled was too slow to catch the pulse
dialing digits. The result was that often times dahdi would generate WINK events
instead of PULSEDIGIT events.

This speeds up the rate at which the registers are checked from 100ms to 33ms
and also makes the process of checking the registers quicker by queing up all
the reads at once.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10699

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10706 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-08-16 21:38:52 +00:00
Shaun Ruffell
319d51ae5d wcte12xp: Allow default_linemode to be set to j1.
To enable J1 mode previously one would configure the card in T1 mode and then
set the j1mode module parameter. Now "modprobe wcte12xp default_linemode=j1"
will work like the other linemodes globally for all cards manged by this driver.
J1 can also be set on a card-by-card basis in sysfs.

Also move pr_fmt to top of file so pr_xxx macros print the module name as
intended.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10696

Conflicts:
	drivers/dahdi/wcte12xp/base.c

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10698 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-06-23 04:36:12 +00:00
Shaun Ruffell
83090b71cf wcte12xp: Destroy the cache if the linemode is not recognized.
Fixes the following errors when running:
  # modprobe wcte12xp default_linemode=blah; modprobe wcte12xp default_linemode=blah

'blah' is an unknown span type.kmem_cache_create: duplicate cache wcte12xp

Call Trace:
 [<ffffffff800394cf>] kmem_cache_create+0x572/0x5ac
 [<ffffffff800a926e>] __link_module+0x0/0x18
 [<ffffffff80064624>] __down_read+0x12/0x92
 [<ffffffff8002224d>] __up_read+0x19/0x7f
 [<ffffffff8818b01f>] :wcte12xp:te12xp_init+0x1f/0xde
 [<ffffffff800a9e37>] sys_init_module+0xbd/0x206
 [<ffffffff8005d28d>] tracesys+0xd5/0xe0

Reported-by: James Brown <jbrown@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10695

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10697 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-06-23 04:36:08 +00:00
Oron Peled
c0eebd73bb xpp: usermode_helper() bugfix for kernels >= 3.3.0
* UMH_WAIT_PROC semantics (and value) was changed from enum to
  a bitmask (via #define)
* This constant was missing from kernels older than 2.6.23

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10694 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-06-21 17:53:33 +00:00
Doug Bailey
9aa57f62f1 Assign NULL values to pointers to insure that future kfree calls do not cause errors.
From: Doug Bailey <dbailey@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10678

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10679 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-27 20:12:09 +00:00
Shaun Ruffell
79e20be476 xpp: Fix compilation when CONFIG_DAHDI_WATCHDOG is defined.
Looks like a hold over from when dahdi_span_ops was first implemented in r8985
"dahdi: Move the callbacks in dahdi_span into its own structure" [1].

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=8985
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10658

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10660 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-11 20:19:29 +00:00
Mike Sinkovsky
396f1a76b1 dahdi: Fix compilation when CONFIG_DAHDI_WATCHDOG is defined.
From: Mike Sinkovsky <msink@trikom.ru>

Internal-Issue-ID: DAHLIN-288
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10655

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10657 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-11 17:45:45 +00:00
Tzafrir Cohen
ca95a19f41 FPGA_1161.201.hex rev 10545: fix reset of XR1000
Previous commit (r10651) included an incorrect version. Including full message
from that commit for the description.

rev. 10502 of the FPGA firmware for the new E-Main rev. 4 fixes a potential
issue when used on Xorcom XR1000 systems: an issue with the power supply may
cause the unit to reset.

Note that there is no issue with previous models, with a normal setup of an
Astribank, or other XRx000 systems.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10652

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10654 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-11 09:16:06 +00:00
Tzafrir Cohen
41c3c2e879 FPGA_1161.201.hex rev 10532: fix reset of XR1000
rev. 10502 of the FPGA firmware for the new E-Main rev. 4 fixes a potential
issue when used on Xorcom XR1000 systems: an issue with the power supply may
cause the unit to reset.

Note that there is no issue with previous models, with a normal setup of an
Astribank, or other XRx000 systems.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10649

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10651 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-10 22:00:52 +00:00
Shaun Ruffell
c98b3a689e wcte12xp, wctdm24xxp, wct4xxp: Print warning about potential GPL violation w/HOTPLUG_FIRMWARE=no.
Print a warning message that it may be a GPL violation to redistribute these
binaries if the firmware for the VPMOCT032/64/128/256 is compiled in.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10646

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10648 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-05 20:34:50 +00:00
Shaun Ruffell
9deb9b2a4f wcb4xxp: Remove asm/system.h include.
Not needed anymore and will break compilation on Kernel versions >= 3.4 since
commit 0195c00244dc2e [1]

[1] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=0195c00244dc2e

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10641

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10645 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-05 16:22:41 +00:00
Shaun Ruffell
0a92282cfe dahdi_dummy: Include timer.h instead of time.h
It appears that some kernel configurations do not include timer.h in any of
the include files that are included by dahdi_dummy. The timer_structs are
defined in timer.h and not time.h, so this change is correct even though I
never could find a configuation myself that actually failed to compile.

This has negligible impact since dahdi_dummy is not compiled by default.

Internal-Issue-ID: DAHLIN-185
Reported-by: Steve Murphy
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10640

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10644 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-05 16:22:37 +00:00
Shaun Ruffell
3c800538f7 dahdi: Fix compilation when CONFIG_DAHDI_NET is defined.
'irq' field was removed from dahdi_span in r10276 "dahdi: Remove
dahdi_span.irq and move dahdi_span.irqmisses into dahdi_device." [1]
which was first released in dahdi-linux 2.6.0.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10276

Reported-by: Pavel Selivanov
Internal-Issue-ID: DAHLIN-278
Patches: hdlc.patch by Pavel Selivanov (license #5420)
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10634

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10637 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 22:02:31 +00:00
Shaun Ruffell
6384cb034a dahdi: Fix compilation when CONFIG_DAHDI_ECHOCAN_PROCESS_TX is defined.
'ec_state' was renamed to 'dahdi_echocan_state' in r6529 [1] but support for
CONFIG_DAHDI_ECHOCAN_PROCESS_TX was first committed in r9442 [2]. So it
appears that I never compiled tested this exact commit when it went in for the
2.5.0 release.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=6529
[2] http://svnview.digium.com/svn/dahdi?view=revision&revision=9442

Reported-by: Pavel Selivanov
Internal-Issue-ID: DAHLIN-279
Patches: ec.patch uploaded by Pavel Selivanov (License #5420)
[ edited the patch slightly for minor formatting ]
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10633

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10636 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 22:02:26 +00:00
Shaun Ruffell
0ecf2c67c8 dahdi_dynamic_loc: Change and check the dyn->pvt pointer under lock.
Fixes a crash on unload if the sync_tick callback was running at the same time
the dynamic local span was destroyed. It was possible for
dahdi_dynamic_local_transmit to dereference a pointer that may have already
been freed.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10627

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10632 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 20:10:20 +00:00
Shaun Ruffell
89ea0430df dahdi_dynamic_eth: Make ztdeth_exit() symetrical with ztdeth_init() and fix race on unload.
Minor change to follow generally recommended practice. Prevents new packets
from being queued up for devices when they are about to be cleaned up. Also
clean up any skbs that may still be on the queue after unloading.

Also closes anoter potential kernel oops on module unload. It was possible to
delete the private structure while the master span process was running. The
result was an attempt to page memory from interrupt context.

Make sure that the pvt function is set and cleared under the zlock. Also do
not assume that the pvt pointer is valid in ztdeth_transmit.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10626

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10631 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 20:10:16 +00:00
Shaun Ruffell
05bac84ce8 dahdi_dynamic: Close race on unload if red alarm timer was running when unloaded.
I saw a kernel oops that was the result of the timer running after the
dahdi_dynamic module was unloaded. Now we wait for the timer to complete, and
then delete it again in case it reactivated itself.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10625

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10630 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 20:10:12 +00:00
Shaun Ruffell
5b675ab400 dahdi_dynamic: Remove calls to __module_get().
The board drivers are the ones calling the unregister function, and
therefore we do not need to worry about them unloading while calling the
destroy callback.

When destroying spans with the ioctl, replace __module_get() with
try_module_get. This avoids hitting a BUG in module_get on kernel versions <
2.6.29.

ALSO move the call to try_module_get out of the dahdi_dynamic_release function
and into destroy. This way if the destroy callback isn't called because the
dynamic driver is unloading the dynamic device can be left on the list to be
cleaned up by the dahdi_dynamic_unregister_driver function().

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10624

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10629 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 20:10:08 +00:00
Shaun Ruffell
69774cd457 dahdi_dynamic: Do not call into dahdi_dynamic without holding reference.
Instead of registering a function pointer, register a dahdi_dynamic_ops
structure that contains the owner as well as the ioctl callback. This way
dahdi.ko can bump up the reference count on dahdi_dynamic.ko before calling
the ioctl callback.

Also, use the registration mutex to guard against the module being unloaded
between the time the structure pointer was checked, and the module reference
is taken.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10623

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10628 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-03 20:10:03 +00:00
Shaun Ruffell
9dde3cff9c wctdm24xxp, wcte12xp: Allow VPMOCT032 firmware to be compiled into driver.
Enables the driver to update firmware on systems that do not have the firmware
loader configured / enabled (Linux config option CONFIG_FW_LOADER). Compiling
the firmware into the driver increase the memory footprint by around ~440K.

Internal-Issue-ID: DAHDI-963
Reported-and-Tested-by: Guenther Kelleter
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10618

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10620 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-04-02 14:05:17 +00:00
Shaun Ruffell
e15edb0d7a wctdm24xxp: Remove forward declaration of inline for GCC 3.4.4
GCC 3.4.4 does not allow forward declaration of inline functions.

Internal-Issue-ID: DAHLIN-286
Reported-by: Guenther Kelleter
Patches: wctdm24xxp-inline.patch uploaded by Guenther Kelleter (License #6372)
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10613

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10614 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-29 15:28:43 +00:00
Shaun Ruffell
848d5ae115 wct4xxp: Trivial formatting changes around request_irq.
Quiet some checkpatch warnings introduced by the last patch. I kept this
separate since it may have obscured the real change made in the previous
commit if combined.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10590

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10594 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-22 18:36:14 +00:00
Shaun Ruffell
fa86c13c3b wct4xxp: Disable all interrupts explicitly in interrupt handler.
The driver makes the assumption that interrupts are disabled but this cannot
be guaranteed. We'll explicity disable interrupts on the local processor while
the interrupt handler is running.

This eliminates the "IRQF_DISABLED is not guaranteed on shared IRQs" warning
when loading the driver.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10589

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10593 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-22 18:36:10 +00:00
Shaun Ruffell
bad3860f24 dahdi_dynamic_eth: Fix compilation on kernels < 2.6.22.
Resolves the follwing build error:
  drivers/dahdi/dahdi_dynamic_eth.c: In function ‘ztdeth_exit’:
  drivers/dahdi/dahdi_dynamic_eth.c:448: error: implicit declaration of function ‘cancel_work_sync’

RHEL kernel versions 2.6.18-238 (5.6) and greater had cancel_work_sync()
backported which is what I did my original smoke test on.

Reported-by: Oron Peled <oron.peled@xorcom.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10588

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10592 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-22 18:36:06 +00:00
Shaun Ruffell
5fcf13fdef dahdi_dynamic_eth: Prevent crash is packet arrives before span is fully configured.
It was possible after a dynamic ethernet span was created for a packet to come
in before the dahdi_span was fully initialized. The result would be a NULL
pointer dereference. Now just discard any packets that might come in during
this time window.

Internal-Issue-ID: DAHLIN-280
Reported-by: Pavel Selivanov
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10587

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10591 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-22 18:36:01 +00:00
Oron Peled
7c99a670b5 xpp: FXS: added a 'lower_ringing_noise' parameter
* Adds a new parameter, 'lower_ringing_noise', to module xpd_fxs.

* Makes the "power-down" behaviour that was added
  in upstream svn r10478, switchable in runtime.

* By default (false), makes the vbat_h behave like it did
  before the power-down change.
  - I.e: vbat_h is held throughout the ringing period (during
    both ring-up/ring-down)
  - So this patch revert part of r10478

* When switched to true, activate the "power-down" behaviour.
  - I.e: vbat_h follows the ring-up/ring-down.
  - This behaviour lowers the noise caused by group ringing of
    FXS channels in the same unit, but causes problems with CallerID.

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10574

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10576 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 20:35:33 +00:00
Oron Peled
91a94133f1 xpp: FXS: atomic vbat_h power handling
* In do_chan_power() make vbat_h changes atomic.
* As a result we can ignore duplicate requests.
  This will allow cleaner logic in the next commit.
* Added proper debug messages.

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10573

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10575 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 20:34:05 +00:00
Oron Peled
4f487f8d7d remove a duplicate dev_set_name()
Remove duplicate definition from dahdi-sysfs.c

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10447

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10572 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:36:32 +00:00
Shaun Ruffell
77437503a8 dahdi_dynamic: Since dynamic devices are 'parentless' we must name them.
This in conjunction with r10449 "A parent-less device should not crash dahdi",
this allows dahdi_dynamic spans to work post the dahdi_devices changes in
2.6.0.

The full address of the device is not used since kernels prior to 2.6.31 limit
the length of a devicename to 20 characters.  The full address of the device
can be pulled out of the "hardware_id" and "type" fields of the span.

This patch is just to get things working again. dahdi_dynamic devices *may*
still have issues if the auto_assign_spans module parameter is 0.

Internal-Issue-ID: DAHLIN-280
Reported-by: Pavel Selivanov
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10563

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10571 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:12:10 +00:00
Shaun Ruffell
8297239209 dahdi_dynamic_eth: Move tx packet flushing to process context.
The masterspan can be, and often is, called with interrupts disabled but
dev_queue_xmit() needs to be called with interrupts enabled. This potentially
fixes a deadlock.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10562

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10570 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:12:08 +00:00
Shaun Ruffell
28d13b909c dahdi: Update dev_set_name / dev_name for RHEL 5.6+.
This is needed because dev_name() is mapped to kobject_name() in a backport,
but the kobject name isn't set until after device_add().  The result would be
parentless devices would fail since dahdi would not think a name was set for
these devices.

For these systems, we'll set both the bus_id string and the underlying
kobject_name.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10561

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10569 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:12:06 +00:00
Oron Peled
52b56c9848 A parent-less device should not crash dahdi
* A parent-less device should not crash dahdi:
  - Access span->parent->dev instead of span->parent-dev.parent
    in soem cases.
  - Access span->parent->dev via new inline span_device()
  - Use span_device() in all dahdi_dev_{dbg,info}()

* Allow low-level drivers to set their device name.
  - Drivers that don't use this feature get the default name
    based on the parent device name
  - Parent-less devices which don't set their name, fails
    to register with -EINVAL

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10449

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10568 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:12:02 +00:00
Shaun Ruffell
eff796fd8f wcte12xp, wctdm24xxp: Add compile-time option to disable ASPM for PCIe devices.
Certain BIOSes appear to enable ASPM even though it is not fully supported by
the platform. Also, since the PCIe links for TDM cards are always in use it
does not make sense to allow them to transition to the disabled state.

Just turn off power management on the PCIe links completely. For more
information see http://lwn.net/Articles/449448/.

Internal-Issue-ID: DAHLIN-283
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10557

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10567 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:11:57 +00:00
Shaun Ruffell
00ef2bfa13 wct4xxp: Add compile-time option to disable ASPM for PCIe devices.
Certain BIOSes appear to enable ASPM even though it is not fully supported by
the platform. Also, since the PCIe links for TDM cards are always in use it
does not make sense to allow them to transition to the disabled state.

Just turn off power management on the PCIe links completely. For more
information see http://lwn.net/Articles/449448/.

Internal-Issue-ID: DAHLIN-283
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10558

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10566 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:11:53 +00:00
Shaun Ruffell
a2bfd1d4c2 wct4xxp: __t4_frame_in and __t4_framer_out slowdowns.
This is a partial revert of r10234 "wct4xxp: __t4_framer_in and
__t4_framer_out speedups."

There were some platform + firmware version combinations that would fail to
properly configure the framer with the aforementioned speedups. The originally
reported sympton was that interrupts would fail to start and while
troubleshooting I also saw cases where one of the spans would stay in alarm
after starting. By adding in additional reads to the version register, the
overall process of writing / reading from the framer control registers is
slowed down which increases reliability.

This change does *not* affect the main path of TDM data which is DMAed
directly into buffers in host memory and are not read / written to / from
framer registers directly.

Reported-and-Tested-by: Vahan Yerkanian <vahan@arminco.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10559

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10565 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:11:49 +00:00
Shaun Ruffell
6009f56f8b dahdi: Add dahdi_pci_disable_link_state for kernel < 2.6.25.
Will allow the ASPM (Active State Power Management) state to be disabled on
PCIe devices before kernel version 2.6.25.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10556

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10564 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-21 19:11:44 +00:00
Tzafrir Cohen
7a497cee43 xpp: firmwares: useless 0x1A at EOF
Remove a mostly harmless 0x1A (^Z) at the end of the file. If you
add a NL after it, it breaks the firmware loading.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10550

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10553 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-20 11:20:36 +00:00
Tzafrir Cohen
853b69a106 xpp: firmwares to support E-Main 4
USB firmware (USB_FW.201.hex 10402) and FPGA firmware
(FPGA_1161.201.hex 10480) with support of the new E-Main 4 Astribank
mainboard.

(This was accidentally labeled as 'E-Main 3' in some previous commit
messages)

Also includes Makefile fixes from r10536.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10535

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10538 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-18 19:00:04 +00:00
Tzafrir Cohen
adfcd9d864 xpp: USB_FW rev 10401: minor 6FXS/2FXO caps issue
Fixes an issues with the 6FXS/2FXO module: if an extra FXS or FXO module
is added to a system with such a module, an excessive number of port
licenses was accidentally required (as if the 6FXS/2FXO module required
8FXS/8FXO licenses).

Internal-Issue-ID: #1371
Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10534

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10537 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-18 18:57:51 +00:00
Shaun Ruffell
2b2054f28b dahdi_dummy: Fix compilation since dahdi-linux 2.6.0.
Even though dahdi_dummy is no longer built by default, the adoption of
dahdi_devices in 2.6 broke the ability to compile. This was not intended as
there are some packagers who still patch the Kbuild file to enable
dahdi_dummy.

Internal-Issue-ID: DAHLIN-274
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10486

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10526 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-16 16:11:29 +00:00
Shaun Ruffell
6e1058eae0 xpp: '%d' -> '%lu' when displaying module_refcount on kernel versions >= 3.3
Upstream commit bd77c047 "module: struct module_ref should contains long
fields" changed the return of module_refcount from int to unsigned long. This
change eliminates a warning from the string format specifier.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10485

Conflicts:

	drivers/dahdi/xpp/xproto.c

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10525 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-16 16:11:25 +00:00
Shaun Ruffell
8067ae3269 xpp: Use 'bool' type for boolean module parameters on kernel versions >= 2.6.31.
Eliminates warnings that are a result of upstream commit 72db395ffa
"module_param: check that bool parameters really are bool."

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10484

Conflicts:

	drivers/dahdi/xpp/xpd.h

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10524 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-16 16:11:20 +00:00
Oron Peled
54b9983407 xpp: FXS: better power-down to lower noise
* Now every linefeed control command which is not RING'ing
  powers-down the SLIC. This reduce audible noise when
  several channels are ringing.

* Simplify code by removing redundant calls to do_chan_power()
  before linefeed_control()

* Manage vbat_h state so we skip do_chan_power() calls when
  there isn't a state change

* Export vbat_h state to /proc/.../fxs_info

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10478

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10490 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-15 17:36:48 +00:00
Oron Peled
b4989839bc xpp: reset Astribank SPI busses
* A driver reload should reset Astribank hardware
* This patch send an SPI reset after we get AB_DESCRIPTION reply from Astribank

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10474

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10489 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-15 17:35:57 +00:00
Shaun Ruffell
3876f253a6 wctdm24xxp: Shorten RINGOFF debounce interval from 512ms to 128ms.
In commit r10168 "wctdm24xxp: Use time interval for debouncing FXO ring
detect" [1], I inadvertently changed the debounce interval of the RINGOFF
event from 128ms to 512ms. The result was a potential failure to detect CID,
depending on line conditions, since Asterisk would bump the rx gains on the
channel in the middle of the CID spill as opposed to before the CID spill.

This fixes a regression first introduced in DAHDI-Linux 2.6.0.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10168

Internal-Issue-ID: DAHDI-951
Reported-and-Tested-by: Jack Wilson <ljwilson@digitalav.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10473

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10481 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-03-15 15:03:27 +00:00
Tzafrir Cohen
005aa723ef USB_RECOV.hex: recovering from xpp hardware issues
USB_RECOV.hex, rev. 9760. It may be used to recover from certain
issues of the USB controller of the Astribank (when an Astribank
is not detected as such) by Support staff.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10455

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10457 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-02-07 22:19:39 +00:00
Tzafrir Cohen
808b2dd408 Astribank I firmwares rev. 7107
A slightly newer firmware (Xorcom rev. 7107) for older (non Astribank
II) Astribank modules. Was accidentally left uncommited. Includes minor
bug fixes.

No change for any relatively recent (Astribank II) Astribank.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10443

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10445 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-25 20:51:21 +00:00
Tzafrir Cohen
081977bc94 Build OSLEC EC if in the tree
Build the OSLEC echo canceller (drivers/staging/echo and
dahdi_echocan_oslec) if the code of oslec is present in the tree.

Also closing another issue regarding documentation of building OSLEC,
as it is now even clearer than before.

Patch has been used in the Debian package for quite some time.

Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

(closes issue DAHLIN-110)
Reported by: biohumanoid (Pavel Selivanov)
Patches:
     oslec_auto.diff uploaded by tzafrir (license 5035)

(closes issue DAHLIN-261)

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10440

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10442 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-17 14:50:01 +00:00
Oron Peled
f06c8d50cf xpp: handle failures during dahdi_register_device()
* If dahdi_register_device() failed, not all resources were freed.
  When dahdi_unregister_device() was called later (during driver
  removal) a panic was caused.

* Add proper error handling for possible failures in
  xbus_register_dahdi_device():
  - new xbus_free_ddev() safely free an xbus->ddev
  - This is called from all failures points.
  - It is also called from xbus_unregister_dahdi_device()

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-By: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10410

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10419 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-10 22:09:34 +00:00
Oron Peled
17a2ce9421 xpp: Don't deactivate XPDs on unregistration
* A bug was introduced during migration to dahdi_device code:
    http://svnview.digium.com/svn/dahdi?view=rev&rev=10273
* Marking XPDs as non-functional (card_present=0, XPD_STATE_NOHW)
  was moved from xbus_request_removal() into xpd_dahdi_preunregister()
* As a result, unregistering an Astribank, made it non-functional
  so trying to re-register it later caused errors (e.g: "Cannot open"
  error message from xpp_open())
* This fix move XPD deactivation into the proper location (during
  xbus_deactivate()

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-By: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10409

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10418 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-10 22:09:29 +00:00
Oron Peled
5ed0271397 xpp: bugfix: fix bad refcount
Code path called in error condition contained an superflous put_xpd() call

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-By: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10408

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10417 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-10 22:09:25 +00:00
Shaun Ruffell
48b3cb8777 wct4xxp: VPM module creates noise on alternate channels on E1 spans.
The VPMOCT128 module was using the VPMOCT256 timeslots assigments which would
mean that channels that should be marked alaw were being set in ulaw. This
only affected E1 spans since by default all spans are configured for ulaw by
default.

This fixes a regression introduced in r10290 [1] "wct4xxp: Add support for
TE820 and VPMOCT256", first released in 2.6.0, that only affects E1 spans on a
quad and dual-span card when used with the hardware echocanceler.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10290

Internal-Issue-ID: DAHDI-945, DAHLIN-275
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10414

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10416 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-10 22:05:47 +00:00
Shaun Ruffell
d726b04767 wctdm24xxp: FXS on-hook transmission timer incorrect.
The DAHDI_ONHOOKTRANSFER ioctl was incorrectly setting the ohttimer to 0. The
result was that an FXS port was leaving the on-hook transfer state before
finishing the transmission.

This was discovered while looking at why ./fxstest dtmfcid  was not able to
pass the DTMF callerid digits to an attached FXO port properly.

Fixes a regression introduced in r10167 "wctdm24xxp: Use interval for checking
FXS on hook transfer timer." [1], first released in 2.6.0.

[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10167

Signed-off-by: Shaun Ruffell <sruffell@digium.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10413

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10415 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-10 22:05:43 +00:00
Shaun Ruffell
e5ed586e31 Creating branch for 2.6.
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10406 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2012-01-04 22:19:55 +00:00
40 changed files with 24930 additions and 2697 deletions

41
.gitignore vendored Normal file
View File

@@ -0,0 +1,41 @@
# Files that are generated as part of the build process which we do not want git
# to track.
*.[oa]
*.mod
*.mod.[oc]
*.ko
*.cmd
*.order
*.tar.gz
tags
cscope.*
*.symvers
*.markers
.*.o.d
README.html
modules.order
Module.markers
build_tools/checkpatch.pl
drivers/dahdi/xpp/*.verified
drivers/dahdi/.tmp_versions/
drivers/dahdi/Module.symvers
drivers/dahdi/makefw
drivers/dahdi/radfw.h
drivers/dahdi/tor2fw.h
drivers/dahdi/xpp/init_fxo_modes
drivers/dahdi/xpp/print_fxo_modes
drivers/dahdi/xpp/xpp_version.h
include/dahdi/version.h
drivers/dahdi/vpmadt032_loader/vpmadt032_loader.h
drivers/dahdi/vpmadt032_loader/vpmadt032_x86_32.o_shipped
drivers/dahdi/vpmadt032_loader/vpmadt032_x86_64.o_shipped
drivers/dahdi/firmware/dahdi-fw-hx8.bin
drivers/dahdi/firmware/dahdi-fw-oct6114-064.bin
drivers/dahdi/firmware/dahdi-fw-oct6114-128.bin
drivers/dahdi/firmware/dahdi-fw-oct6114-256.bin
drivers/dahdi/firmware/dahdi-fw-tc400m.bin
drivers/dahdi/firmware/dahdi-fw-te820.bin
drivers/dahdi/firmware/dahdi-fw-vpmoct032.bin
drivers/dahdi/firmware/make_firmware_object

View File

@@ -67,13 +67,7 @@ GENERATED_DOCS:=README.html
ifneq ($(wildcard .version),)
DAHDIVERSION:=$(shell cat .version)
else
ifneq ($(wildcard .svn),)
DAHDIVERSION:=$(shell build_tools/make_version . dahdi/linux)
else
ifneq ($(wildcard .git),)
DAHDIVERSION:=$(shell build_tools/make_version . dahdi/linux)
endif
endif
endif
all: modules

11
README
View File

@@ -212,13 +212,10 @@ under driver/staging/echo . In fact, dahdi_echocan_oslec assumes that
this is where the oslec code lies. If it is elsewhere you'll need to fix
the #include line.
Thus for the moment, the simplest way to build OSLEC with dahdi is:
1. Copy the directory `drivers/staging/echo` from a recent kernel tree
(at least 2.6.28-rc1) to the a subdirectory with the same name in the
dahdi-linux tree.
2. Edit drivers/dahdi/Kbuild and uncomment the two lines related to OSLEC.
Thus for the moment, the simplest way to build OSLEC with dahdi is to
copy the directory `drivers/staging/echo` from a recent kernel tree (at
least 2.6.28-rc1) to the a subdirectory with the same name in the
dahdi-linux tree.
After doing that, you'll see the following when building (running
'make')

View File

@@ -59,7 +59,7 @@ elif [ -d ${1}/.git ]; then
MODIFIED=""
SVN_REV=`git log --pretty=full -1 | grep -F "git-svn-id:" | sed -e "s/.*\@\([^\s]*\)\s.*/\1/g"`
if [ -z "$SVN_REV" ]; then
VERSION=`git describe --long --always --tags --dirty=M 2> /dev/null`
VERSION=`git describe --tags --dirty=M 2> /dev/null | sed -e "s/^v//"`
if [ $? -ne 0 ]; then
if [ "`git ls-files -m | wc -l`" != "0" ]; then
MODIFIED="M"
@@ -115,4 +115,8 @@ elif [ -d ${1}/.git ]; then
echo SVN-${RESULT##-}-r${SVN_REV}${MODIFIED}
fi
else
# Use the directory information in the absence of any other version
# information
pwd -P
fi

View File

@@ -33,14 +33,13 @@ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_ECHOCAN_MG2) += dahdi_echocan_mg2.o
obj-m += $(DAHDI_MODULES_EXTRA)
# Only enable this if you think you know what you're doing. This is not
# supported yet:
#obj-m += dahdi_echocan_oslec.o
#
# A quick and dirty way to build OSLEC, if you happened to place it
# yourself in the dahdi source tree. This is experimental. See README
# regarding OSLEC.
#obj-m += ../staging/echo/
# If you want to build OSLEC, include the code in the standard location:
# drivers/staging/echo . The DAHDI OSLEC echo canceller will be built as
# well:
ifneq (,$(wildcard $(src)/../staging/echo/echo.c))
obj-m += dahdi_echocan_oslec.o
obj-m += ../staging/echo/
endif
CFLAGS_MODULE += -I$(DAHDI_INCLUDE) -I$(src)

View File

@@ -122,7 +122,6 @@ EXPORT_SYMBOL(dahdi_qevent_nolock);
EXPORT_SYMBOL(dahdi_qevent_lock);
EXPORT_SYMBOL(dahdi_hooksig);
EXPORT_SYMBOL(dahdi_alarm_notify);
EXPORT_SYMBOL(dahdi_set_dynamic_ioctl);
EXPORT_SYMBOL(dahdi_hdlc_abort);
EXPORT_SYMBOL(dahdi_hdlc_finish);
EXPORT_SYMBOL(dahdi_hdlc_getbuf);
@@ -358,6 +357,11 @@ static DEFINE_SPINLOCK(zone_lock);
/* The first zone on the list is the default zone. */
static LIST_HEAD(tone_zones);
static inline struct device *span_device(struct dahdi_span *span)
{
return &span->parent->dev;
}
/* Protects the span_list and pseudo_chans lists from concurrent access in
* process context. The spin_lock is needed to synchronize with the interrupt
* handler. */
@@ -2459,12 +2463,11 @@ static ssize_t dahdi_chan_write(struct file *file, const char __user *usrbuf,
if ((chan->ec_state) &&
(ECHO_MODE_ACTIVE == chan->ec_state->status.mode) &&
(chan->ec_state->ops->echocan_process_tx)) {
struct ec_state *const ec_state = chan->ec_state;
struct dahdi_echocan_state *const ec = chan->ec_state;
for (x = 0; x < chan->writen[res]; ++x) {
short tx;
tx = DAHDI_XLAW(chan->writebuf[res][x], chan);
ec_state->ops->echocan_process_tx(ec_state,
&tx, 1);
ec->ops->echocan_process_tx(ec, &tx, 1);
chan->writebuf[res][x] = DAHDI_LIN2X((int) tx,
chan);
}
@@ -4417,12 +4420,14 @@ static int dahdi_common_ioctl(struct file *file, unsigned int cmd,
return 0;
}
static int (*dahdi_dynamic_ioctl)(unsigned int cmd, unsigned long data);
void dahdi_set_dynamic_ioctl(int (*func)(unsigned int cmd, unsigned long data))
static const struct dahdi_dynamic_ops *dahdi_dynamic_ops;
void dahdi_set_dynamic_ops(const struct dahdi_dynamic_ops *ops)
{
dahdi_dynamic_ioctl = func;
mutex_lock(&registration_mutex);
dahdi_dynamic_ops = ops;
mutex_unlock(&registration_mutex);
}
EXPORT_SYMBOL(dahdi_set_dynamic_ops);
static int (*dahdi_hpec_ioctl)(unsigned int cmd, unsigned long data);
@@ -4643,7 +4648,6 @@ static int dahdi_ioctl_chanconfig(struct file *file, unsigned long data)
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 23)
SET_MODULE_OWNER(chan->hdlcnetdev->netdev);
#endif
chan->hdlcnetdev->netdev->irq = chan->span->irq;
chan->hdlcnetdev->netdev->tx_queue_len = 50;
#ifdef HAVE_NET_DEVICE_OPS
chan->hdlcnetdev->netdev->netdev_ops = &dahdi_netdev_ops;
@@ -5141,6 +5145,33 @@ static int dahdi_ioctl_maint(unsigned long data)
return 0;
}
static int dahdi_ioctl_dynamic(unsigned int cmd, unsigned long data)
{
bool tried_load = false;
int res;
retry_check:
mutex_lock(&registration_mutex);
if (!dahdi_dynamic_ops) {
mutex_unlock(&registration_mutex);
if (tried_load)
return -ENOSYS;
request_module("dahdi_dynamic");
tried_load = true;
goto retry_check;
}
if (!try_module_get(dahdi_dynamic_ops->owner)) {
mutex_unlock(&registration_mutex);
return -ENOSYS;
}
mutex_unlock(&registration_mutex);
res = dahdi_dynamic_ops->ioctl(cmd, data);
module_put(dahdi_dynamic_ops->owner);
return res;
}
static int
dahdi_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long data)
{
@@ -5175,14 +5206,7 @@ dahdi_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long data)
return dahdi_ioctl_maint(data);
case DAHDI_DYNAMIC_CREATE:
case DAHDI_DYNAMIC_DESTROY:
if (dahdi_dynamic_ioctl) {
return dahdi_dynamic_ioctl(cmd, data);
} else {
request_module("dahdi_dynamic");
if (dahdi_dynamic_ioctl)
return dahdi_dynamic_ioctl(cmd, data);
}
return -ENOSYS;
return dahdi_ioctl_dynamic(cmd, data);
case DAHDI_EC_LICENSE_CHALLENGE:
case DAHDI_EC_LICENSE_RESPONSE:
if (dahdi_hpec_ioctl) {
@@ -6649,7 +6673,7 @@ static void
set_spanno_and_basechan(struct dahdi_span *span, u32 spanno, u32 basechan)
{
int i;
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"set: spanno=%d, basechan=%d (span->channels=%d)\n",
spanno, basechan, span->channels);
span->spanno = spanno;
@@ -6673,7 +6697,7 @@ static int _assign_spanno_and_basechan(struct dahdi_span *span)
unsigned int spanno = 1;
unsigned int basechan = 1;
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"assign: channels=%d\n", span->channels);
list_for_each_entry(pos, &span_list, spans_node) {
@@ -6693,7 +6717,7 @@ static int _assign_spanno_and_basechan(struct dahdi_span *span)
basechan = pos->chans[0]->channo + pos->channels;
}
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"good: spanno=%d, basechan=%d (span->channels=%d)\n",
spanno, basechan, span->channels);
set_spanno_and_basechan(span, spanno, basechan);
@@ -6743,20 +6767,20 @@ _check_spanno_and_basechan(struct dahdi_span *span, u32 spanno, u32 basechan)
struct dahdi_span *pos;
unsigned int next_channo;
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"check: spanno=%d, basechan=%d (span->channels=%d)\n",
spanno, basechan, span->channels);
list_for_each_entry(pos, &span_list, spans_node) {
next_channo = _get_next_channo(pos);
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"pos: spanno=%d channels=%d (next_channo=%d)\n",
pos->spanno, pos->channels, next_channo);
if (pos->spanno <= spanno) {
if (basechan < next_channo + pos->channels) {
/* Requested basechan breaks channel sorting */
dev_notice(span->parent->dev.parent,
dev_notice(span_device(span),
"[%d] basechan (%d) is too low for wanted span %d\n",
local_spanno(span), basechan, spanno);
return -EINVAL;
@@ -6771,13 +6795,13 @@ _check_spanno_and_basechan(struct dahdi_span *span, u32 spanno, u32 basechan)
break;
/* Cannot fit the span into the requested location. Abort. */
dev_notice(span->parent->dev.parent,
dev_notice(span_device(span),
"cannot fit span %d (basechan=%d) into requested location\n",
spanno, basechan);
return -EINVAL;
}
dahdi_dev_dbg(ASSIGN, span->parent->dev.parent,
dahdi_dev_dbg(ASSIGN, span_device(span),
"good: spanno=%d, basechan=%d (span->channels=%d)\n",
spanno, basechan, span->channels);
set_spanno_and_basechan(span, spanno, basechan);
@@ -6876,7 +6900,7 @@ static int _dahdi_assign_span(struct dahdi_span *span, unsigned int spanno,
return -EFAULT;
if (test_bit(DAHDI_FLAGBIT_REGISTERED, &span->flags)) {
dev_notice(span->parent->dev.parent,
dev_notice(span_device(span),
"local span %d is already assigned span %d "
"with base channel %d\n", local_spanno(span), span->spanno,
span->chans[0]->channo);
@@ -6887,7 +6911,7 @@ static int _dahdi_assign_span(struct dahdi_span *span, unsigned int spanno,
span->ops->disable_hw_preechocan) {
if ((NULL == span->ops->enable_hw_preechocan) ||
(NULL == span->ops->disable_hw_preechocan)) {
dev_notice(span->parent->dev.parent,
dev_notice(span_device(span),
"span with inconsistent enable/disable hw_preechocan");
return -EFAULT;
}
@@ -7091,7 +7115,7 @@ static int _dahdi_unassign_span(struct dahdi_span *span)
unsigned long flags;
if (!test_bit(DAHDI_FLAGBIT_REGISTERED, &span->flags)) {
dev_info(span->parent->dev.parent,
dev_info(span_device(span),
"local span %d is already unassigned\n",
local_spanno(span));
return -EINVAL;
@@ -9952,7 +9976,7 @@ static void watchdog_check(unsigned long ignored)
static int wdcheck=0;
struct dahdi_span *s;
spin_lock_irqsave(&span_list_lock, flags);
spin_lock_irqsave(&chan_lock, flags);
list_for_each_entry(s, &span_list, spans_node) {
if (s->flags & DAHDI_FLAG_RUNNING) {
if (s->watchcounter == DAHDI_WATCHDOG_INIT) {
@@ -9960,9 +9984,9 @@ static void watchdog_check(unsigned long ignored)
if ((s->watchstate == DAHDI_WATCHSTATE_OK) ||
(s->watchstate == DAHDI_WATCHSTATE_UNKNOWN)) {
s->watchstate = DAHDI_WATCHSTATE_RECOVERING;
if (s->watchdog) {
if (s->ops->watchdog) {
module_printk(KERN_NOTICE, "Kicking span %s\n", s->name);
s->watchdog(spans[x], DAHDI_WATCHDOG_NOINTS);
s->ops->watchdog(s, DAHDI_WATCHDOG_NOINTS);
} else {
module_printk(KERN_NOTICE, "Span %s is dead with no revival\n", s->name);
s->watchstate = DAHDI_WATCHSTATE_FAILED;
@@ -9977,7 +10001,7 @@ static void watchdog_check(unsigned long ignored)
s->watchcounter = DAHDI_WATCHDOG_INIT;
}
}
spin_unlock_irqrestore(&span_list_lock, flags);
spin_unlock_irqrestore(&chan_lock, flags);
if (!wdcheck) {
module_printk(KERN_NOTICE, "watchdog on duty!\n");
wdcheck=1;
@@ -10045,6 +10069,24 @@ failed_driver_init:
return res;
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25)
#ifdef CONFIG_PCI
void dahdi_pci_disable_link_state(struct pci_dev *pdev, int state)
{
u16 reg16;
int pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
state &= (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
PCIE_LINK_STATE_CLKPM);
if (!pos)
return;
pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
reg16 &= ~(state);
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
}
EXPORT_SYMBOL(dahdi_pci_disable_link_state);
#endif /* CONFIG_PCI */
#endif /* 2.6.25 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static inline void flush_find_master_work(void)
{

View File

@@ -152,12 +152,6 @@ static int span_hotplug(struct device *dev, char **envp, int envnum,
return err; \
} while (0)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
#define dev_name(dev) ((dev)->bus_id)
#define dev_set_name(dev, format, ...) \
snprintf((dev)->bus_id, BUS_ID_SIZE, format, ## __VA_ARGS__);
#endif
static int span_uevent(struct device *dev, char **envp, int num_envp,
char *buffer, int buffer_size)
{
@@ -796,10 +790,17 @@ int dahdi_sysfs_add_device(struct dahdi_device *ddev, struct device *parent)
{
int ret;
struct device *const dev = &ddev->dev;
const char *dn;
dev->parent = parent;
dev->bus = &dahdi_device_bus;
dev_set_name(dev, "%s:%s", parent->bus->name, dev_name(parent));
dn = dev_name(dev);
if (!dn || !*dn) {
/* Invent default name based on parent */
if (!parent)
return -EINVAL;
dev_set_name(dev, "%s:%s", parent->bus->name, dev_name(parent));
}
ret = device_add(dev);
return ret;
}

View File

@@ -53,7 +53,7 @@
#if defined(USE_HIGHRESTIMER)
#include <linux/hrtimer.h>
#else
#include <linux/time.h>
#include <linux/timer.h>
#endif
#include <dahdi/kernel.h>
@@ -75,6 +75,7 @@ static inline void hrtimer_set_expires(struct hrtimer *timer, ktime_t time)
#endif
struct dahdi_dummy {
struct dahdi_device *ddev;
struct dahdi_span span;
struct dahdi_chan _chan;
struct dahdi_chan *chan;
@@ -205,37 +206,44 @@ static const struct dahdi_span_ops dummy_ops = {
static int dahdi_dummy_initialize(struct dahdi_dummy *ztd)
{
int res = 0;
/* DAHDI stuff */
ztd->ddev = dahdi_create_device();
if (!ztd->ddev)
return -ENOMEM;
dev_set_name(&ztd->ddev->dev, "dahdi_dummy");
ztd->chan = &ztd->_chan;
sprintf(ztd->span.name, "DAHDI_DUMMY/1");
snprintf(ztd->span.desc, sizeof(ztd->span.desc) - 1, "%s (source: " CLOCK_SRC ") %d", ztd->span.name, 1);
sprintf(ztd->chan->name, "DAHDI_DUMMY/%d/%d", 1, 0);
strlcpy(ztd->span.devicetype, "DAHDI Dummy Timing",
sizeof(ztd->span.devicetype));
ztd->ddev->devicetype = "DAHDI Dummy Timing";
ztd->chan->chanpos = 1;
ztd->span.chans = &ztd->chan;
ztd->span.channels = 0; /* no channels on our span */
ztd->span.deflaw = DAHDI_LAW_MULAW;
ztd->chan->pvt = ztd;
ztd->span.ops = &dummy_ops;
if (dahdi_register(&ztd->span, 0)) {
return -1;
}
return 0;
list_add_tail(&ztd->span.device_node, &ztd->ddev->spans);
res = dahdi_register_device(ztd->ddev, NULL);
return res;
}
int init_module(void)
{
int res;
ztd = kzalloc(sizeof(*ztd), GFP_KERNEL);
if (ztd == NULL) {
printk(KERN_ERR "dahdi_dummy: Unable to allocate memory\n");
return -ENOMEM;
}
if (dahdi_dummy_initialize(ztd)) {
printk(KERN_ERR "dahdi_dummy: Unable to intialize DAHDI driver\n");
res = dahdi_dummy_initialize(ztd);
if (res) {
printk(KERN_ERR
"dahdi_dummy: Unable to intialize DAHDI driver (%d)\n",
res);
kfree(ztd);
return -ENODEV;
return res;
}
#if defined(USE_HIGHRESTIMER)
@@ -273,7 +281,8 @@ void cleanup_module(void)
atomic_set(&shutdown, 1);
del_timer_sync(&timer);
#endif
dahdi_unregister(&ztd->span);
dahdi_unregister_device(ztd->ddev);
dahdi_free_device(ztd->ddev);
kfree(ztd);
if (debug)
printk(KERN_DEBUG "dahdi_dummy: cleanup() finished\n");

View File

@@ -385,16 +385,6 @@ static void dahdi_dynamic_release(struct kref *kref)
WARN_ON(test_bit(DAHDI_FLAGBIT_REGISTERED, &d->span.flags));
if (d->pvt) {
if (d->driver && d->driver->destroy) {
__module_get(d->driver->owner);
d->driver->destroy(d);
module_put(d->driver->owner);
} else {
WARN_ON(1);
}
}
kfree(d->msgbuf);
for (x = 0; x < d->span.channels; x++)
@@ -470,6 +460,24 @@ static int _destroy_dynamic(struct dahdi_dynamic_span *dds)
return -EBUSY;
}
if (d->pvt) {
if (d->driver && d->driver->destroy) {
if (!try_module_get(d->driver->owner)) {
/* The driver for this device is in the
* process of unloading. Leave this dynamic on
* the list so it's cleaned up when the driver
* unregisters. */
dynamic_put(d);
return -ENXIO;
}
d->driver->destroy(d);
module_put(d->driver->owner);
} else {
WARN_ON(1);
}
d->pvt = NULL;
}
dahdi_unregister_device(d->ddev);
spin_lock_irqsave(&dspan_lock, flags);
@@ -605,9 +613,10 @@ static int _create_dynamic(struct dahdi_dynamic_span *dds)
strlcpy(d->dname, dds->driver, sizeof(d->dname));
strlcpy(d->addr, dds->addr, sizeof(d->addr));
d->timing = dds->timing;
sprintf(d->span.name, "DYN/%s/%s", dds->driver, dds->addr);
sprintf(d->span.desc, "Dynamic '%s' span at '%s'",
dds->driver, dds->addr);
snprintf(d->span.name, sizeof(d->span.name), "DYN/%s/%s",
dds->driver, dds->addr);
snprintf(d->span.desc, sizeof(d->span.desc),
"Dynamic '%s' span at '%s'", dds->driver, dds->addr);
d->span.deflaw = DAHDI_LAW_MULAW;
d->span.flags |= DAHDI_FLAG_RBS;
d->span.chans = d->chans;
@@ -658,6 +667,9 @@ static int _create_dynamic(struct dahdi_dynamic_span *dds)
return res;
}
d->ddev->devicetype = d->span.name;
d->ddev->hardware_id = d->span.name;
dev_set_name(&d->ddev->dev, "dynamic:%s:%d", dds->driver, dtd->id++);
list_add_tail(&d->span.device_node, &d->ddev->spans);
/* Whee! We're created. Now register the span */
if (dahdi_register_device(d->ddev, d->dev)) {
@@ -763,19 +775,17 @@ void dahdi_dynamic_unregister_driver(struct dahdi_dynamic_driver *dri)
list_for_each_entry_safe(d, n, &dspan_list, list) {
if (d->driver == dri) {
if (d->pvt) {
if (d->driver && d->driver->destroy) {
__module_get(d->driver->owner);
if (d->driver && d->driver->destroy)
d->driver->destroy(d);
module_put(d->driver->owner);
} else {
else
WARN_ON(1);
}
}
dahdi_unregister_device(d->ddev);
spin_lock_irqsave(&dspan_lock, flags);
list_del_rcu(&d->list);
spin_unlock_irqrestore(&dspan_lock, flags);
synchronize_rcu();
d->driver = NULL;
dynamic_put(d);
}
}
@@ -819,10 +829,13 @@ static void check_for_red_alarm(unsigned long ignored)
mod_timer(&alarmcheck, jiffies + 1 * HZ);
}
static const struct dahdi_dynamic_ops dahdi_dynamic_ops = {
.owner = THIS_MODULE,
.ioctl = dahdi_dynamic_ioctl,
};
static int dahdi_dynamic_init(void)
{
dahdi_set_dynamic_ioctl(dahdi_dynamic_ioctl);
/* Start process to check for RED ALARM */
init_timer(&alarmcheck);
alarmcheck.expires = 0;
@@ -833,19 +846,25 @@ static int dahdi_dynamic_init(void)
#ifdef ENABLE_TASKLETS
tasklet_init(&dahdi_dynamic_tlet, dahdi_dynamic_tasklet, 0);
#endif
dahdi_set_dynamic_ops(&dahdi_dynamic_ops);
printk(KERN_INFO "DAHDI Dynamic Span support LOADED\n");
return 0;
}
static void dahdi_dynamic_cleanup(void)
{
dahdi_set_dynamic_ops(NULL);
#ifdef ENABLE_TASKLETS
if (taskletpending) {
tasklet_disable(&dahdi_dynamic_tlet);
tasklet_kill(&dahdi_dynamic_tlet);
}
#endif
dahdi_set_dynamic_ioctl(NULL);
del_timer_sync(&alarmcheck);
/* Must call again in case it was running before and rescheduled
* itself. */
del_timer(&alarmcheck);
printk(KERN_INFO "DAHDI Dynamic Span support unloaded\n");
}

View File

@@ -71,6 +71,8 @@ static struct dahdi_span *ztdeth_getspan(unsigned char *addr, unsigned short sub
if (z)
span = z->span;
spin_unlock_irqrestore(&zlock, flags);
if (!span || !test_bit(DAHDI_FLAGBIT_REGISTERED, &span->flags))
return NULL;
return span;
}
@@ -152,7 +154,7 @@ static void ztdeth_transmit(struct dahdi_dynamic *dyn, u8 *msg, size_t msglen)
spin_lock_irqsave(&zlock, flags);
z = dyn->pvt;
if (z->dev) {
if (z && z->dev) {
/* Copy fields to local variables to remove spinlock ASAP */
dev = z->dev;
memcpy(addr, z->addr, sizeof(z->addr));
@@ -191,15 +193,44 @@ static void ztdeth_transmit(struct dahdi_dynamic *dyn, u8 *msg, size_t msglen)
spin_unlock_irqrestore(&zlock, flags);
}
static int ztdeth_flush(void)
/**
* dahdi_dynamic_flush_work_fn - Flush all pending transactions.
*
* This function is run in a work queue since we can't guarantee interrupts
* will be enabled when we're called, and dev_queue_xmit() requires that
* interrupts be enabled.
*
*/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
static void dahdi_dynamic_flush_work_fn(void *data)
#else
static void dahdi_dynamic_flush_work_fn(struct work_struct *work)
#endif
{
struct sk_buff *skb;
/* Handle all transmissions now */
while ((skb = skb_dequeue(&skbs))) {
dev_queue_xmit(skb);
}
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
static DECLARE_WORK(dahdi_dynamic_eth_flush_work,
dahdi_dynamic_flush_work_fn, NULL);
#else
static DECLARE_WORK(dahdi_dynamic_eth_flush_work,
dahdi_dynamic_flush_work_fn);
#endif
/**
* ztdeth_flush - Flush all pending transactions.
*
* This function is called in interrupt context while processing the master
* span.
*/
static int ztdeth_flush(void)
{
schedule_work(&dahdi_dynamic_eth_flush_work);
return 0;
}
@@ -284,11 +315,12 @@ static void ztdeth_destroy(struct dahdi_dynamic *dyn)
prev = cur;
cur = cur->next;
}
spin_unlock_irqrestore(&zlock, flags);
if (cur == z) { /* Successfully removed */
dyn->pvt = NULL;
printk(KERN_INFO "TDMoE: Removed interface for %s\n", z->span->name);
kfree(z);
}
spin_unlock_irqrestore(&zlock, flags);
}
static int ztdeth_create(struct dahdi_dynamic *dyn, const char *addr)
@@ -411,20 +443,27 @@ static struct notifier_block ztdeth_nblock = {
static int __init ztdeth_init(void)
{
skb_queue_head_init(&skbs);
dev_add_pack(&ztdeth_ptype);
register_netdevice_notifier(&ztdeth_nblock);
dahdi_dynamic_register_driver(&ztd_eth);
skb_queue_head_init(&skbs);
return 0;
}
static void __exit ztdeth_exit(void)
{
dev_remove_pack(&ztdeth_ptype);
unregister_netdevice_notifier(&ztdeth_nblock);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
flush_scheduled_work();
#else
cancel_work_sync(&dahdi_dynamic_eth_flush_work);
#endif
dahdi_dynamic_unregister_driver(&ztd_eth);
unregister_netdevice_notifier(&ztdeth_nblock);
dev_remove_pack(&ztdeth_ptype);
skb_queue_purge(&skbs);
}
MODULE_DESCRIPTION("DAHDI Dynamic TDMoE Support");

View File

@@ -78,10 +78,11 @@ static LIST_HEAD(dynamic_local_list);
static void
dahdi_dynamic_local_transmit(struct dahdi_dynamic *dyn, u8 *msg, size_t msglen)
{
struct dahdi_dynamic_local *const d = dyn->pvt;
struct dahdi_dynamic_local *d;
unsigned long flags;
spin_lock_irqsave(&local_lock, flags);
d = dyn->pvt;
if (d && d->peer && d->peer->span) {
if (test_bit(DAHDI_FLAGBIT_REGISTERED, &d->peer->span->flags))
dahdi_dynamic_receive(d->peer->span, msg, msglen);
@@ -130,11 +131,12 @@ static int digit2int(char d)
static void dahdi_dynamic_local_destroy(struct dahdi_dynamic *dyn)
{
struct dahdi_dynamic_local *d = dyn->pvt;
struct dahdi_dynamic_local *d;
unsigned long flags;
struct dahdi_dynamic_local *cur;
spin_lock_irqsave(&local_lock, flags);
d = dyn->pvt;
list_for_each_entry(cur, &dynamic_local_list, node) {
if (cur->peer == d)
cur->peer = NULL;

View File

@@ -58,6 +58,7 @@ OBJECT_FILES:=$(OBJECT_FILES:FIRMWARE-OCT6114-128=dahdi-fw-oct6114-128.o)
OBJECT_FILES:=$(OBJECT_FILES:FIRMWARE-OCT6114-256=dahdi-fw-oct6114-256.o)
OBJECT_FILES:=$(OBJECT_FILES:FIRMWARE-TC400M=dahdi-fw-tc400m.o)
OBJECT_FILES:=$(OBJECT_FILES:FIRMWARE-HX8=dahdi-fw-hx8.o)
OBJECT_FILES:=$(OBJECT_FILES:FIRMWARE-VPMOCT032=dahdi-fw-vpmoct032.o)
# Force usage of wget, for now
DOWNLOAD=wget
@@ -220,3 +221,8 @@ dahdi-fw-oct6114-256.o: dahdi-fw-oct6114-256-$(OCT6114_256_VERSION).tar.gz dahdi
dahdi-fw-tc400m.o: dahdi-fw-tc400m-$(TC400M_VERSION).tar.gz dahdi-fw-tc400m.bin make_firmware_object
@echo Making firmware object file for dahdi-fw-tc400m.bin
./make_firmware_object dahdi-fw-tc400m.bin $@
# Build object file of a VPMOCT032 firmware image for linking
dahdi-fw-vpmoct032.o: dahdi-fw-vpmoct032-$(VPMOCT032_VERSION).tar.gz dahdi-fw-vpmoct032.bin make_firmware_object
@echo Making firmware object file for dahdi-fw-vpmoct032.bin
./make_firmware_object dahdi-fw-vpmoct032.bin $@

View File

@@ -2,4 +2,17 @@ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_VOICEBUS) += dahdi_voicebus.o
dahdi_voicebus-objs := voicebus.o GpakCust.o GpakApi.o voicebus_net.o vpmoct.o
EXTRA_CFLAGS := -I$(src)/.. -Wno-undef
FIRM_DIR := ../firmware
ifneq ($(HOTPLUG_FIRMWARE),yes)
dahdi_voicebus-objs += $(FIRM_DIR)/dahdi-fw-vpmoct032.o
$(warning WARNING: You are compiling firmware into voicebus.ko which is not available under the terms of the GPL. It may be a violation of the GPL to distribute the resulting image since it combines both GPL and non-GPL work. You should consult a lawyer of your own before distributing such an image.)
else
EXTRA_CFLAGS+=-DHOTPLUG_FIRMWARE
endif
EXTRA_CFLAGS += -I$(src)/.. -Wno-undef
$(obj)/$(FIRM_DIR)/dahdi-fw-vpmoct032.o: $(obj)/voicebus.o
$(MAKE) -C $(obj)/$(FIRM_DIR) dahdi-fw-vpmoct032.o

View File

@@ -57,6 +57,15 @@
* (and not tasklet). */
#define CONFIG_VOICEBUS_INTERRUPT
/*
* Enable the following definition in order to disable Active-State Power
* Management on the PCIe bridge for PCIe cards. This has been known to work
* around issues where the BIOS enables it on the cards even though the
* platform does not support it.
*
*/
#undef CONFIG_VOICEBUS_DISABLE_ASPM
/* Define this to use a FIFO for the software echocan reference.
* (experimental) */
#undef CONFIG_VOICEBUS_ECREFERENCE

View File

@@ -443,6 +443,47 @@ static void vpmoct_set_defaults(struct vpmoct *vpm)
vpmoct_write_dword(vpm, 0x30, 0);
}
static const char *const FIRMWARE_NAME = "dahdi-fw-vpmoct032.bin";
#if defined(HOTPLUG_FIRMWARE)
static int
vpmoct_request_firmware(const struct firmware **fw, struct device *dev)
{
return request_firmware(fw, FIRMWARE_NAME, dev);
}
static void vpmoct_release_firmware(const struct firmware *fw)
{
release_firmware(fw);
}
#else
static int
vpmoct_request_firmware(const struct firmware **fw_p, struct device *dev)
{
struct firmware *fw;
extern void _binary_dahdi_fw_vpmoct032_bin_size;
extern u8 _binary_dahdi_fw_vpmoct032_bin_start[];
*fw_p = fw = kzalloc(sizeof(*fw), GFP_KERNEL);
if (!fw)
return -ENOMEM;
fw->data = _binary_dahdi_fw_vpmoct032_bin_start;
/* Yes... this is weird. objcopy gives us a symbol containing
the size of the firmware, not a pointer a variable containing the
size. The only way we can get the value of the symbol is to take
its address, so we define it as a pointer and then cast that value
to the proper type. */
fw->size = (size_t) &_binary_dahdi_fw_vpmoct032_bin_size;
return 0;
}
static void vpmoct_release_firmware(const struct firmware *fw)
{
kfree(fw);
}
#endif
/**
* vpmoct_load_flash - Check the current flash version and possibly load.
* @vpm: The VPMOCT032 module to check / load.
@@ -463,10 +504,9 @@ static void vpmoct_load_flash(struct work_struct *data)
const struct firmware *fw;
const struct vpmoct_header *header;
char serial[VPMOCT_SERIAL_SIZE+1];
const char *const FIRMWARE_NAME = "dahdi-fw-vpmoct032.bin";
int i;
res = request_firmware(&fw, FIRMWARE_NAME, vpm->dev);
res = vpmoct_request_firmware(&fw, vpm->dev);
if (res) {
dev_warn(vpm->dev,
"vpmoct: Failed to load firmware from userspace! %d\n",
@@ -505,7 +545,7 @@ static void vpmoct_load_flash(struct work_struct *data)
FIRMWARE_NAME);
/* Just use the old version of the fimware. */
release_firmware(fw);
vpmoct_release_firmware(fw);
vpmoct_set_defaults(vpm);
vpmoct_load_complete(work, true);
return;
@@ -514,7 +554,7 @@ static void vpmoct_load_flash(struct work_struct *data)
if (vpm->minor == header->minor &&
vpm->major == header->major) {
/* Proper version is running */
release_firmware(fw);
vpmoct_release_firmware(fw);
vpmoct_set_defaults(vpm);
vpmoct_load_complete(work, true);
return;
@@ -548,14 +588,14 @@ static void vpmoct_load_flash(struct work_struct *data)
if (vpmoct_check_firmware_crc(vpm, fw->size-VPMOCT_FIRM_HEADER_LEN*2,
header->major, header->minor))
goto error;
release_firmware(fw);
vpmoct_release_firmware(fw);
vpmoct_set_defaults(vpm);
vpmoct_load_complete(work, true);
return;
error:
dev_info(vpm->dev, "Unable to load firmware\n");
release_firmware(fw);
vpmoct_release_firmware(fw);
/* TODO: Should we disable module if the firmware doesn't load? */
vpmoct_load_complete(work, false);
return;

View File

@@ -35,7 +35,6 @@
#include <linux/spinlock.h>
#include <linux/device.h> /* dev_err() */
#include <linux/interrupt.h>
#include <asm/system.h> /* cli(), *_flags */
#include <asm/uaccess.h> /* copy_*_user */
#include <linux/workqueue.h> /* work_struct */
#include <linux/timer.h> /* timer_struct */
@@ -1250,7 +1249,8 @@ static char *hfc_decode_st_state(struct b4xxp *b4, int port, unsigned char state
"?", "?", "?", "?", "?", "?", "?", "?" }
};
if (!(str = kmalloc(256, GFP_KERNEL))) {
str = kmalloc(256, GFP_ATOMIC);
if (!str) {
dev_warn(&b4->pdev->dev, "could not allocate mem for ST state decode string!\n");
return NULL;
}

View File

@@ -18,6 +18,7 @@ wct4xxp-objs := base.o vpm450m.o $(shell $(src)/../oct612x/octasic-helper object
ifneq ($(HOTPLUG_FIRMWARE),yes)
wct4xxp-objs += $(FIRM_DIR)/dahdi-fw-oct6114-064.o $(FIRM_DIR)/dahdi-fw-oct6114-128.o $(FIRM_DIR)/dahdi-fw-oct6114-256.o
$(warning WARNING: You are compiling firmware into wct4xxp.ko which is not available under the terms of the GPL. It may be a violation of the GPL to distribute the resulting image since it combines both GPL and non-GPL work. You should consult a lawyer of your own before distributing such an image.)
endif
$(obj)/$(FIRM_DIR)/dahdi-fw-oct6114-064.o: $(obj)/base.o

View File

@@ -173,6 +173,15 @@ static inline int t4_queue_work(struct workqueue_struct *wq, struct work_struct
/* #define CONFIG_FORCE_EXTENDED_RESET */
/* #define CONFIG_NOEXTENDED_RESET */
/*
* Uncomment the following definition in order to disable Active-State Power
* Management on the PCIe bridge for PCIe cards. This has been known to work
* around issues where the BIOS enables it on the cards even though the
* platform does not support it.
*
*/
/* #define CONFIG_WCT4XXP_DISABLE_ASPM */
#if defined(CONFIG_FORCE_EXTENDED_RESET) && defined(CONFIG_NOEXTENDED_RESET)
#error "You cannot define both CONFIG_FORCE_EXTENDED_RESET and " \
"CONFIG_NOEXTENDED_RESET."
@@ -378,6 +387,11 @@ struct t4 {
struct spi_state st;
};
static inline bool is_pcie(const struct t4 *wc)
{
return (wc->devtype->flags & FLAG_EXPRESS) > 0;
}
static inline bool has_e1_span(const struct t4 *wc)
{
return (wc->t1e1) != 0;
@@ -670,11 +684,12 @@ static unsigned int __t4_framer_in(const struct t4 *wc, int unit,
val = ((unit & 0x3) << 8) | (addr & 0xff) | haddr;
writel(val, wc_laddr);
/* readl(wc_version); */
readl(wc_version);
writel(val | WC_LFRMR_CS | WC_LREAD, wc_laddr);
readl(wc_version);
ret = readb(wc_ldata);
writel(val, wc_laddr);
readl(wc_version);
return ret;
}
@@ -700,11 +715,13 @@ static void __t4_framer_out(const struct t4 *wc, int unit, const u8 addr,
val = ((unit & 0x3) << 8) | (addr & 0xff) | haddr;
writel(val, wc_laddr);
readl(wc_version);
writel(value, wc_ldata);
readl(wc_version);
writel(val | WC_LFRMR_CS | WC_LWRITE, wc_laddr);
/* readl(wc_version); */
readl(wc_version);
writel(val, wc_laddr);
readl(wc_version);
}
static void t4_framer_out(struct t4 *wc, int unit,
@@ -1222,9 +1239,11 @@ static int t4_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long dat
else
clear_bit(chan->chanpos - 1, &ts->dtmfmutemask);
channel = (chan->chanpos) << 3;
if (!has_e1_span(wc))
channel += (4 << 3);
channel = has_e1_span(wc) ? chan->chanpos : chan->chanpos + 4;
if (is_octal(wc))
channel = channel << 3;
else
channel = channel << 2;
channel |= chan->span->offset;
vpm450m_setdtmf(wc->vpm, channel, j & DAHDI_TONEDETECT_ON,
j & DAHDI_TONEDETECT_MUTE);
@@ -2020,7 +2039,7 @@ static void t4_span_assigned(struct dahdi_span *span)
/* We use this to make sure all the spans are assigned before
* running the serial setup. */
list_for_each_entry(pos, &wc->ddev->spans, device_node) {
if (!test_bit(DAHDI_FLAGBIT_REGISTERED, &span->flags))
if (!test_bit(DAHDI_FLAGBIT_REGISTERED, &pos->flags))
++unassigned_spans;
}
@@ -2076,6 +2095,8 @@ static int t4_alloc_channels(struct t4 *wc, struct t4_span *ts,
for (i = 0; i < ARRAY_SIZE(ts->chans); ++i) {
kfree(ts->chans[i]);
kfree(ts->ec[i]);
ts->chans[i] = NULL;
ts->ec[i] = NULL;
}
ts->linemode = linemode;
@@ -3767,7 +3788,7 @@ static inline void t4_framer_interrupt(struct t4 *wc, int span)
}
#ifdef SUPPORT_GEN1
DAHDI_IRQ_HANDLER(t4_interrupt)
static irqreturn_t _t4_interrupt(int irq, void *dev_id)
{
struct t4 *wc = dev_id;
unsigned long flags;
@@ -3835,6 +3856,16 @@ DAHDI_IRQ_HANDLER(t4_interrupt)
return IRQ_RETVAL(1);
}
DAHDI_IRQ_HANDLER(t4_interrupt)
{
irqreturn_t ret;
unsigned long flags;
local_irq_save(flags);
ret = _t4_interrupt(irq, dev_id);
local_irq_restore(flags);
return ret;
}
#endif
static int t4_allocate_buffers(struct t4 *wc, int numbufs,
@@ -3952,7 +3983,7 @@ static void t4_isr_bh(unsigned long data)
#endif
}
DAHDI_IRQ_HANDLER(t4_interrupt_gen2)
static irqreturn_t _t4_interrupt_gen2(int irq, void *dev_id)
{
struct t4 *wc = dev_id;
unsigned int status;
@@ -4148,6 +4179,16 @@ out:
return IRQ_RETVAL(1);
}
DAHDI_IRQ_HANDLER(t4_interrupt_gen2)
{
irqreturn_t ret;
unsigned long flags;
local_irq_save(flags);
ret = _t4_interrupt_gen2(irq, dev_id);
local_irq_restore(flags);
return ret;
}
#ifdef SUPPORT_GEN1
static int t4_reset_dma(struct t4 *wc)
{
@@ -5072,6 +5113,13 @@ t4_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
spin_lock_init(&wc->reglock);
wc->devtype = (const struct devtype *)(ent->driver_data);
#ifdef CONFIG_WCT4XXP_DISABLE_ASPM
if (is_pcie(wc)) {
pci_disable_link_state(pdev->bus->self, PCIE_LINK_STATE_L0S |
PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
};
#endif
if (is_octal(wc))
wc->numspans = 8;
else if (wc->devtype->flags & FLAG_2PORT)
@@ -5188,22 +5236,23 @@ t4_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
#ifdef SUPPORT_GEN1
if (request_irq(pdev->irq, (wc->devtype->flags & FLAG_2NDGEN) ?
t4_interrupt_gen2 : t4_interrupt,
DAHDI_IRQ_SHARED_DISABLED,
DAHDI_IRQ_SHARED,
(wc->numspans == 8) ? "wct8xxp" :
(wc->numspans == 2) ? "wct2xxp" :
"wct4xxp",
wc))
wc)) {
#else
if (!(wc->tspans[0]->spanflags & FLAG_2NDGEN)) {
dev_notice(&wc->dev->dev, "This driver does not "
"support 1st gen modules\n");
free_wc(wc);
return -ENODEV;
}
if (request_irq(pdev->irq, t4_interrupt_gen2, DAHDI_IRQ_SHARED_DISABLED, "t4xxp", wc))
if (!(wc->tspans[0]->spanflags & FLAG_2NDGEN)) {
dev_notice(&wc->dev->dev, "This driver does not "
"support 1st gen modules\n");
free_wc(wc);
return -ENODEV;
}
if (request_irq(pdev->irq, t4_interrupt_gen2,
DAHDI_IRQ_SHARED, "t4xxp", wc)) {
#endif
{
dev_notice(&wc->dev->dev, "t4xxp: Unable to request IRQ %d\n",
dev_notice(&wc->dev->dev, "Unable to request IRQ %d\n",
pdev->irq);
free_wc(wc);
return -EIO;

View File

@@ -422,6 +422,7 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f
tOCT6100_GET_INSTANCE_SIZE InstanceSize;
tOCT6100_CHANNEL_OPEN *ChannelOpen;
UINT32 ulResult;
const unsigned int mask = (8 == numspans) ? 0x7 : 0x3;
unsigned int sout_stream, rout_stream;
struct vpm450m *vpm450m;
int x,y,law;
@@ -527,7 +528,7 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f
* therefore, the lower 2 bits tell us which span this
* timeslot/channel
*/
if (isalaw[x & 0x07])
if (isalaw[x & mask])
law = cOCT6100_PCM_A_LAW;
else
law = cOCT6100_PCM_U_LAW;

View File

@@ -191,6 +191,11 @@ static const struct wctdm_desc wcaex410 = { "Wildcard AEX410", FLAG_EXPRESS, 4 }
static const struct wctdm_desc wcha80000 = { "HA8-0000", 0, 8 };
static const struct wctdm_desc wchb80000 = { "HB8-0000", FLAG_EXPRESS, 8 };
static inline bool is_pcie(const struct wctdm *wc)
{
return (wc->desc->flags & FLAG_EXPRESS) > 0;
}
/**
* Returns true if the card is one of the Hybrid Digital Analog Cards.
*/
@@ -1068,9 +1073,22 @@ wctdm_isr_getreg(struct wctdm *wc, struct wctdm_module *const mod, u8 address)
list_add(&cmd->node, &mod->pending_cmds);
}
/* Must be called with wc.reglock held and local interrupts disabled */
static inline void
wctdm_setreg_intr(struct wctdm *wc, struct wctdm_module *mod,
int addr, int val);
wctdm_setreg_intr(struct wctdm *wc, struct wctdm_module *mod, int addr, int val)
{
struct wctdm_cmd *cmd;
cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
if (unlikely(!cmd))
return;
cmd->complete = NULL;
cmd->cmd = CMD_WR(addr, val);
list_add_tail(&cmd->node, &mod->pending_cmds);
}
static void cmd_checkisr(struct wctdm *wc, struct wctdm_module *const mod)
{
@@ -1215,22 +1233,6 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *sframe)
spin_unlock(&wc->reglock);
}
/* Must be called with wc.reglock held and local interrupts disabled */
static inline void
wctdm_setreg_intr(struct wctdm *wc, struct wctdm_module *mod, int addr, int val)
{
struct wctdm_cmd *cmd;
cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
if (unlikely(!cmd))
return;
cmd->complete = NULL;
cmd->cmd = CMD_WR(addr, val);
list_add_tail(&cmd->node, &mod->pending_cmds);
}
int wctdm_setreg(struct wctdm *wc, struct wctdm_module *mod, int addr, int val)
{
struct wctdm_cmd *cmd;
@@ -1831,19 +1833,22 @@ static void wctdm_qrvdri_check_hook(struct wctdm *wc, int card)
static inline bool is_fxo_ringing(const struct fxo *const fxo)
{
return ((fxo->hook_ring_shadow & 0x60) &&
(fxo->battery_state == BATTERY_PRESENT));
((fxo->battery_state == BATTERY_PRESENT) ||
(fxo->battery_state == BATTERY_DEBOUNCING_LOST)));
}
static inline bool is_fxo_ringing_positive(const struct fxo *const fxo)
{
return (((fxo->hook_ring_shadow & 0x60) == 0x20) &&
(fxo->battery_state == BATTERY_PRESENT));
((fxo->battery_state == BATTERY_PRESENT) ||
(fxo->battery_state == BATTERY_DEBOUNCING_LOST)));
}
static inline bool is_fxo_ringing_negative(const struct fxo *const fxo)
{
return (((fxo->hook_ring_shadow & 0x60) == 0x40) &&
(fxo->battery_state == BATTERY_PRESENT));
((fxo->battery_state == BATTERY_PRESENT) ||
(fxo->battery_state == BATTERY_DEBOUNCING_LOST)));
}
static inline void set_ring(struct fxo *fxo, enum ring_detector_state new)
@@ -1854,19 +1859,21 @@ static inline void set_ring(struct fxo *fxo, enum ring_detector_state new)
static void wctdm_fxo_ring_detect(struct wctdm *wc, struct wctdm_module *mod)
{
struct fxo *const fxo = &mod->mod.fxo;
static const unsigned int POLARITY_CHANGES_NEEDED = 2;
/* Look for ring status bits (Ring Detect Signal Negative and Ring
* Detect Signal Positive) to transition back and forth some number of
* times to indicate that a ring is occurring. Provide some number of
* samples to allow for the transitions to occur before giving up.
* NOTE: neon mwi voltages will trigger one of these bits to go active
* but not to have transitions between the two bits (i.e. no negative
* to positive or positive to negative traversals) */
* Detect Signal Positive) to transition back and forth
* POLARITY_CHANGES_NEEDED times to indicate that a ring is occurring.
* Provide some number of samples to allow for the transitions to occur
* before giving up. NOTE: neon mwi voltages will trigger one of these
* bits to go active but not to have transitions between the two bits
* (i.e. no negative to positive or positive to negative traversals) */
switch (fxo->ring_state) {
case DEBOUNCING_RINGING_POSITIVE:
if (is_fxo_ringing_negative(fxo)) {
if (++fxo->ring_polarity_change_count > 4) {
if (++fxo->ring_polarity_change_count >
POLARITY_CHANGES_NEEDED) {
mod_hooksig(wc, mod, DAHDI_RXSIG_RING);
set_ring(fxo, RINGING);
if (debug) {
@@ -1884,7 +1891,8 @@ static void wctdm_fxo_ring_detect(struct wctdm *wc, struct wctdm_module *mod)
break;
case DEBOUNCING_RINGING_NEGATIVE:
if (is_fxo_ringing_positive(fxo)) {
if (++fxo->ring_polarity_change_count > 4) {
if (++fxo->ring_polarity_change_count >
POLARITY_CHANGES_NEEDED) {
mod_hooksig(wc, mod, DAHDI_RXSIG_RING);
set_ring(fxo, RINGING);
if (debug) {
@@ -1904,7 +1912,7 @@ static void wctdm_fxo_ring_detect(struct wctdm *wc, struct wctdm_module *mod)
if (!is_fxo_ringing(fxo)) {
set_ring(fxo, DEBOUNCING_RINGOFF);
fxo->ringdebounce_timer =
wc->framecount + ringdebounce / 2;
wc->framecount + ringdebounce / 8;
}
break;
case DEBOUNCING_RINGOFF:
@@ -1954,13 +1962,13 @@ wctdm_check_battery_lost(struct wctdm *wc, struct wctdm_module *const mod)
*/
switch (fxo->battery_state) {
case BATTERY_DEBOUNCING_PRESENT:
case BATTERY_DEBOUNCING_PRESENT_ALARM: /* intentional drop through */
/* we were going to BATTERY_PRESENT, but
* battery was lost again. */
fxo->battery_state = BATTERY_LOST;
break;
case BATTERY_UNKNOWN:
mod_hooksig(wc, mod, DAHDI_RXSIG_ONHOOK);
case BATTERY_DEBOUNCING_PRESENT_ALARM: /* intentional drop through */
case BATTERY_PRESENT:
fxo->battery_state = BATTERY_DEBOUNCING_LOST;
fxo->battdebounce_timer = wc->framecount + battdebounce;
@@ -2015,7 +2023,7 @@ wctdm_check_battery_present(struct wctdm *wc, struct wctdm_module *const mod)
switch (fxo->battery_state) {
case BATTERY_DEBOUNCING_PRESENT:
if (time_after(jiffies, fxo->battdebounce_timer)) {
if (time_after(wc->framecount, fxo->battdebounce_timer)) {
if (debug) {
dev_info(&wc->vb.pdev->dev,
"BATTERY on %d/%d (%s)!\n",
@@ -2040,12 +2048,12 @@ wctdm_check_battery_present(struct wctdm *wc, struct wctdm_module *const mod)
* of its time period has already passed while
* debouncing occurred */
fxo->battery_state = BATTERY_DEBOUNCING_PRESENT_ALARM;
fxo->battdebounce_timer = jiffies +
msecs_to_jiffies(battalarm - battdebounce);
fxo->battdebounce_timer = wc->framecount +
battalarm - battdebounce;
}
break;
case BATTERY_DEBOUNCING_PRESENT_ALARM:
if (time_after(jiffies, fxo->battdebounce_timer)) {
if (time_after(wc->framecount, fxo->battdebounce_timer)) {
fxo->battery_state = BATTERY_PRESENT;
dahdi_alarm_channel(get_dahdi_chan(wc, mod),
DAHDI_ALARM_NONE);
@@ -2054,6 +2062,7 @@ wctdm_check_battery_present(struct wctdm *wc, struct wctdm_module *const mod)
case BATTERY_PRESENT:
break;
case BATTERY_DEBOUNCING_LOST:
case BATTERY_DEBOUNCING_LOST_ALARM:
/* we were going to BATTERY_LOST, but battery appeared again,
* so clear the debounce timer */
fxo->battery_state = BATTERY_PRESENT;
@@ -2061,10 +2070,8 @@ wctdm_check_battery_present(struct wctdm *wc, struct wctdm_module *const mod)
case BATTERY_UNKNOWN:
mod_hooksig(wc, mod, DAHDI_RXSIG_OFFHOOK);
case BATTERY_LOST: /* intentional drop through */
case BATTERY_DEBOUNCING_LOST_ALARM:
fxo->battery_state = BATTERY_DEBOUNCING_PRESENT;
fxo->battdebounce_timer = jiffies +
msecs_to_jiffies(battdebounce);
fxo->battdebounce_timer = wc->framecount + battdebounce;
break;
}
}
@@ -3727,14 +3734,15 @@ static int wctdm_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long
if (((fxs->lasttxhook & SLIC_LF_SETMASK) == SLIC_LF_ACTIVE_FWD) ||
((fxs->lasttxhook & SLIC_LF_SETMASK) == SLIC_LF_ACTIVE_REV)) {
int res;
x = set_lasttxhook_interruptible(wc, fxs,
res = set_lasttxhook_interruptible(wc, fxs,
(POLARITY_XOR(fxs) ?
SLIC_LF_OHTRAN_REV : SLIC_LF_OHTRAN_FWD),
&mod->sethook);
if (debug & DEBUG_CARD) {
if (x) {
if (res) {
dev_info(&wc->vb.pdev->dev,
"Channel %d TIMEOUT: "
"OnHookTransfer start\n",
@@ -5678,6 +5686,13 @@ __wctdm_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
wc->vb.pdev = pdev;
wc->vb.debug = &debug;
#ifdef CONFIG_VOICEBUS_DISABLE_ASPM
if (is_pcie(wc)) {
pci_disable_link_state(pdev->bus->self, PCIE_LINK_STATE_L0S |
PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
};
#endif
if (is_hx8(wc)) {
wc->vb.ops = &hx8_voicebus_operations;
ret = voicebus_boot_init(&wc->vb, wc->board_name);

View File

@@ -27,6 +27,8 @@
* this program for more details.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/module.h>
@@ -55,18 +57,14 @@
#error VOICEBUS_SFRAME_SIZE != SFRAME_SIZE
#endif
#ifndef pr_fmt
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#endif
static int debug;
static int j1mode = 0;
static int j1mode = -1;
static int alarmdebounce = 2500; /* LOF/LFA def to 2.5s AT&T TR54016*/
static int losalarmdebounce = 2500; /* LOS def to 2.5s AT&T TR54016*/
static int aisalarmdebounce = 2500; /* AIS(blue) def to 2.5s AT&T TR54016*/
static int yelalarmdebounce = 500; /* RAI(yellow) def to 0.5s AT&T devguide */
static int t1e1override = -1; /* deprecated */
static char *default_linemode = "auto"; /* 'auto', 'e1', or 't1' */
static char *default_linemode = "auto"; /* 'auto', 'e1', 't1', or 'j1' */
static int latency = VOICEBUS_DEFAULT_LATENCY;
static unsigned int max_latency = VOICEBUS_DEFAULT_MAXLATENCY;
static int vpmsupport = 1;
@@ -99,6 +97,11 @@ static const struct t1_desc te120p = {"Wildcard TE120P"};
static const struct t1_desc te122 = {"Wildcard TE122"};
static const struct t1_desc te121 = {"Wildcard TE121"};
static inline bool is_pcie(const struct t1 *t1)
{
return (0 == strcmp(t1->variety, te121.name));
}
/* names of HWEC modules */
static const char *vpmadt032_name = "VPMADT032";
static const char *vpmoct_name = "VPMOCT032";
@@ -640,21 +643,21 @@ static inline int t1_setreg(struct t1 *wc, int addr, int val)
return 0;
}
static int t1_getreg(struct t1 *wc, int addr)
static void __t1_getreg(struct t1 *wc, int addr, struct command *cmd)
{
struct command *cmd = NULL;
unsigned long ret;
unsigned long flags;
might_sleep();
cmd = get_free_cmd(wc);
if (!cmd)
return -ENOMEM;
cmd->address = addr;
cmd->data = 0x00;
cmd->flags = __CMD_RD;
submit_cmd(wc, cmd);
}
static int __t1_getresult(struct t1 *wc, struct command *cmd)
{
int ret;
unsigned long flags;
might_sleep();
ret = wait_for_completion_interruptible_timeout(&cmd->complete, HZ*10);
if (unlikely(!ret)) {
spin_lock_irqsave(&wc->reglock, flags);
@@ -685,10 +688,22 @@ static int t1_getreg(struct t1 *wc, int addr)
}
}
ret = cmd->data;
free_cmd(wc, cmd);
return ret;
}
static int t1_getreg(struct t1 *wc, int addr)
{
int res;
struct command *cmd = NULL;
cmd = get_free_cmd(wc);
if (!cmd)
return -ENOMEM;
__t1_getreg(wc, addr, cmd);
res = __t1_getresult(wc, cmd);
free_cmd(wc, cmd);
return res;
}
static void t1_setleds(struct t1 *wc, int leds)
{
struct command *cmd;
@@ -878,7 +893,8 @@ static void t1_configure_t1(struct t1 *wc, int lineconfig, int txlevel)
fmr1 = 0x9e; /* FMR1: Mode 0, T1 mode, CRC on for ESF, 2.048 Mhz system data rate, no XAIS */
fmr2 = 0x20; /* FMR2: no payload loopback, don't auto yellow alarm */
if (j1mode)
if (!strcasecmp("j1", wc->span.spantype))
fmr4 = 0x1c;
else
fmr4 = 0x0c; /* FMR4: Lose sync on 2 out of 5 framing bits, auto resync */
@@ -918,7 +934,7 @@ static void t1_configure_t1(struct t1 *wc, int lineconfig, int txlevel)
t1_setreg(wc, 0x38, 0x0a); /* PCD: LOS after 176 consecutive "zeros" */
t1_setreg(wc, 0x39, 0x15); /* PCR: 22 "ones" clear LOS */
if (j1mode)
if (!strcasecmp("j1", wc->span.spantype))
t1_setreg(wc, 0x24, 0x80); /* J1 overide */
/* Generate pulse mask for T1 */
@@ -1179,15 +1195,47 @@ static int t1xxp_rbsbits(struct dahdi_chan *chan, int bits)
return 0;
}
static inline void t1_check_sigbits(struct t1 *wc)
static void t1_check_sigbits(struct t1 *wc)
{
struct command_container {
struct command *cmd;
struct list_head node;
unsigned int index;
};
struct command_container *cont;
LIST_HEAD(commands);
int a,i,rxs;
if (!(test_bit(DAHDI_FLAGBIT_RUNNING, &wc->span.flags)))
return;
if (dahdi_is_e1_span(&wc->span)) {
/* Send out all the commands first. */
for (i = 0; i < 15; i++) {
a = t1_getreg(wc, 0x71 + i);
if (!(wc->span.chans[i+16]->sig & DAHDI_SIG_CLEAR) ||
!(wc->span.chans[i]->sig & DAHDI_SIG_CLEAR)) {
cont = kzalloc(sizeof(*cont), GFP_KERNEL);
if (!cont) {
WARN_ON_ONCE(1);
goto done;
}
cont->cmd = get_free_cmd(wc);
if (!cont->cmd) {
WARN_ON_ONCE(1);
goto done;
}
cont->index = i;
list_add_tail(&cont->node, &commands);
__t1_getreg(wc, 0x71 + i, cont->cmd);
}
}
/* Now check the results */
list_for_each_entry_reverse(cont, &commands, node) {
i = cont->index;
a = __t1_getresult(wc, cont->cmd);
free_cmd(wc, cont->cmd);
cont->cmd = NULL;
if (a > -1) {
/* Get high channel in low bits */
rxs = (a & 0xf);
@@ -1205,8 +1253,29 @@ static inline void t1_check_sigbits(struct t1 *wc)
}
}
} else if (wc->span.lineconfig & DAHDI_CONFIG_D4) {
for (i = 0; i < 24; i+=4) {
a = t1_getreg(wc, 0x70 + (i>>2));
/* First we'll send out the commands */
for (i = 0; i < 24; i += 4) {
cont = kzalloc(sizeof(*cont), GFP_KERNEL);
if (!cont) {
WARN_ON_ONCE(1);
goto done;
}
cont->cmd = get_free_cmd(wc);
if (!cont->cmd) {
WARN_ON_ONCE(1);
goto done;
}
cont->index = i;
list_add_tail(&cont->node, &commands);
__t1_getreg(wc, 0x70 + (i>>2), cont->cmd);
}
/* Now we'll check the results */
list_for_each_entry_reverse(cont, &commands, node) {
i = cont->index;
a = __t1_getresult(wc, cont->cmd);
free_cmd(wc, cont->cmd);
cont->cmd = NULL;
if (a > -1) {
/* Get high channel in low bits */
rxs = (a & 0x3) << 2;
@@ -1236,8 +1305,28 @@ static inline void t1_check_sigbits(struct t1 *wc)
}
}
} else {
for (i = 0; i < 24; i+=2) {
a = t1_getreg(wc, 0x70 + (i>>1));
/* First send out the commands. */
for (i = 0; i < 24; i += 2) {
cont = kzalloc(sizeof(*cont), GFP_KERNEL);
if (!cont) {
WARN_ON_ONCE(1);
goto done;
}
cont->cmd = get_free_cmd(wc);
if (!cont->cmd) {
WARN_ON_ONCE(1);
goto done;
}
cont->index = i;
list_add_tail(&cont->node, &commands);
__t1_getreg(wc, 0x70 + (i>>1), cont->cmd);
}
list_for_each_entry_reverse(cont, &commands, node) {
i = cont->index;
a = __t1_getresult(wc, cont->cmd);
free_cmd(wc, cont->cmd);
cont->cmd = NULL;
if (a > -1) {
/* Get high channel in low bits */
rxs = (a & 0xf);
@@ -1255,6 +1344,21 @@ static inline void t1_check_sigbits(struct t1 *wc)
}
}
}
done:
while (!list_empty(&commands)) {
cont = container_of(commands.next,
struct command_container, node);
if (unlikely(cont->cmd)) {
/* We do not care about the result, let's just wait for
* the rest of the system to finish with it. */
__t1_getresult(wc, cont->cmd);
free_cmd(wc, cont->cmd);
cont->cmd = NULL;
}
list_del(&cont->node);
kfree(cont);
}
return;
}
struct maint_work_struct {
@@ -1841,18 +1945,32 @@ static int t1_software_init(struct t1 *wc, enum linemode type)
memset(chans, 0, sizeof(chans));
memset(ec, 0, sizeof(ec));
if (type == E1) {
switch (type) {
case E1:
wc->span.channels = 31;
wc->span.spantype = "E1";
wc->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_HDB3 |
DAHDI_CONFIG_CCS | DAHDI_CONFIG_CRC4;
wc->span.deflaw = DAHDI_LAW_ALAW;
} else {
break;
case T1:
wc->span.channels = 24;
wc->span.spantype = "T1";
wc->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_B8ZS |
DAHDI_CONFIG_D4 | DAHDI_CONFIG_ESF;
wc->span.deflaw = DAHDI_LAW_MULAW;
break;
case J1:
wc->span.channels = 24;
wc->span.spantype = "J1";
wc->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_B8ZS |
DAHDI_CONFIG_D4 | DAHDI_CONFIG_ESF;
wc->span.deflaw = DAHDI_LAW_MULAW;
break;
default:
spin_unlock_irqrestore(&wc->reglock, flags);
res = -EINVAL;
goto error_exit;
}
spin_unlock_irqrestore(&wc->reglock, flags);
@@ -1861,7 +1979,7 @@ static int t1_software_init(struct t1 *wc, enum linemode type)
return -ENOMEM;
t1_info(wc, "Setting up global serial parameters for %s\n",
(dahdi_is_e1_span(&wc->span) ? "E1" : "T1"));
wc->span.spantype);
t4_serial_setup(wc);
set_bit(DAHDI_FLAGBIT_RBS, &wc->span.flags);
@@ -1917,12 +2035,19 @@ static int t1xxp_set_linemode(struct dahdi_span *span, const char *linemode)
if (!strcasecmp(linemode, "t1")) {
dev_info(&wc->vb.pdev->dev,
"Changing from E1 to T1 line mode.\n");
"Changing from %s to T1 line mode.\n",
wc->span.spantype);
res = t1_software_init(wc, T1);
} else if (!strcasecmp(linemode, "e1")) {
dev_info(&wc->vb.pdev->dev,
"Changing from T1 to E1 line mode.\n");
"Changing from %s to E1 line mode.\n",
wc->span.spantype);
res = t1_software_init(wc, E1);
} else if (!strcasecmp(linemode, "j1")) {
dev_info(&wc->vb.pdev->dev,
"Changing from %s to E1 line mode.\n",
wc->span.spantype);
res = t1_software_init(wc, J1);
} else {
dev_err(&wc->vb.pdev->dev,
"'%s' is an unknown linemode.\n", linemode);
@@ -1962,14 +2087,15 @@ static int t1_hardware_post_init(struct t1 *wc, enum linemode *type)
int x;
/* T1 or E1 */
if (-1 != t1e1override) {
pr_info("t1e1override is deprecated. Please use 'default_linemode'.\n");
*type = (t1e1override) ? E1 : T1;
if ((-1 != t1e1override) || (-1 != j1mode)) {
*type = (t1e1override) ? E1 : (j1mode) ? J1 : T1;
} else {
if (!strcasecmp(default_linemode, "e1")) {
*type = E1;
} else if (!strcasecmp(default_linemode, "t1")) {
*type = T1;
} else if (!strcasecmp(default_linemode, "j1")) {
*type = J1;
} else {
u8 pins;
res = t1_getpins(wc, &pins);
@@ -1978,7 +2104,8 @@ static int t1_hardware_post_init(struct t1 *wc, enum linemode *type)
*type = (pins & 0x01) ? T1 : E1;
}
}
debug_printk(wc, 1, "linemode: %s\n", (*type == T1) ? "T1" : "E1");
debug_printk(wc, 1, "linemode: %s\n", (*type == T1) ? "T1" :
(J1 == *type) ? "J1" : "E1");
/* what version of the FALC are we using? */
reg = t1_setreg(wc, 0x4a, 0xaa);
@@ -2009,19 +2136,41 @@ static int t1_hardware_post_init(struct t1 *wc, enum linemode *type)
return 0;
}
static inline void t1_check_alarms(struct t1 *wc)
static void t1_check_alarms(struct t1 *wc)
{
unsigned char c,d;
int alarms;
int x,j;
unsigned char fmr4; /* must read this always */
struct command *cmds[3];
if (!(test_bit(DAHDI_FLAGBIT_RUNNING, &wc->span.flags)))
return;
c = t1_getreg(wc, 0x4c);
fmr4 = t1_getreg(wc, 0x20); /* must read this even if we don't use it */
d = t1_getreg(wc, 0x4d);
for (x = 0; x < ARRAY_SIZE(cmds); ++x) {
cmds[x] = get_free_cmd(wc);
if (!cmds[x]) {
WARN_ON(1);
for (x = 0; x < ARRAY_SIZE(cmds); ++x)
free_cmd(wc, cmds[x]);
return;
}
}
/* Since this is voicebus, if we issue all the reads initially and then
* check the results we can save ourselves some time. Otherwise, each
* read will take a minimum of 3ms to go through the complete pipeline.
*/
__t1_getreg(wc, 0x4c, cmds[0]);
__t1_getreg(wc, 0x20, cmds[1]); /* must read this even if not used */
__t1_getreg(wc, 0x4d, cmds[2]);
d = __t1_getresult(wc, cmds[2]);
fmr4 = __t1_getresult(wc, cmds[1]);
c = __t1_getresult(wc, cmds[0]);
for (x=0; x < ARRAY_SIZE(cmds); ++x)
free_cmd(wc, cmds[x]);
/* Assume no alarms */
alarms = 0;
@@ -2437,11 +2586,11 @@ static void timer_work_func(struct work_struct *work)
{
struct t1 *wc = container_of(work, struct t1, timer_work);
#endif
if (test_bit(INITIALIZED, &wc->bit_flags))
mod_timer(&wc->timer, jiffies + HZ/30);
t1_do_counters(wc);
t1_check_alarms(wc);
t1_check_sigbits(wc);
if (test_bit(INITIALIZED, &wc->bit_flags))
mod_timer(&wc->timer, jiffies + HZ/10);
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
@@ -2749,6 +2898,13 @@ static int __devinit te12xp_init_one(struct pci_dev *pdev, const struct pci_devi
}
#endif /* CONFIG_VOICEBUS_ECREFERENCE */
#ifdef CONFIG_VOICEBUS_DISABLE_ASPM
if (is_pcie(wc)) {
pci_disable_link_state(pdev->bus->self, PCIE_LINK_STATE_L0S |
PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
};
#endif
snprintf(wc->name, sizeof(wc->name)-1, "wcte12xp%d", index);
pci_set_drvdata(pdev, wc);
wc->vb.ops = &voicebus_operations;
@@ -2920,14 +3076,20 @@ static int __init te12xp_init(void)
if (!cmd_cache)
return -ENOMEM;
if (-1 != t1e1override) {
pr_info("'t1e1override' is deprecated. "
"Please use 'default_linemode' instead\n");
if ((-1 != t1e1override) || (-1 != j1mode)) {
pr_info("'t1e1override' and 'j1mode' are deprecated. "
"Please use 'default_linemode' instead.\n");
/* If someone is setting j1mode, then, t1e1override most likely
* needs to be forced to t1 mode */
if (j1mode > 0)
t1e1override = 0;
} else if (strcasecmp(default_linemode, "auto") &&
strcasecmp(default_linemode, "t1") &&
strcasecmp(default_linemode, "j1") &&
strcasecmp(default_linemode, "e1")) {
pr_err("'%s' is an unknown span type.", default_linemode);
pr_err("'%s' is an unknown span type.\n", default_linemode);
default_linemode = "auto";
kmem_cache_destroy(cmd_cache);
return -EINVAL;
}
res = dahdi_pci_module(&te12xp_driver);

View File

@@ -77,6 +77,7 @@
enum linemode {
T1 = 1,
E1,
J1,
};
struct command {

View File

@@ -42,6 +42,8 @@ static DEF_PARM(uint, poll_digital_inputs, 1000, 0644, "Poll Digital Inputs");
static DEF_PARM_BOOL(vmwi_ioctl, 1, 0644, "Asterisk support VMWI notification via ioctl");
static DEF_PARM_BOOL(ring_trapez, 0, 0664, "Use trapezoid ring type");
static DEF_PARM_BOOL(lower_ringing_noise, 0, 0664,
"Lower ringing noise (may loose CallerID)");
/* Signaling is opposite (fxo signalling for fxs card) */
#if 1
@@ -135,6 +137,7 @@ struct FXS_priv_data {
xpp_line_t want_dtmf_mute; /* what dahdi want */
xpp_line_t prev_key_down; /* DTMF down sets the bit */
xpp_line_t neon_blinking;
xpp_line_t vbat_h; /* High voltage */
struct timeval prev_key_time[CHANNELS_PERXPD];
int led_counter[NUM_LEDS][CHANNELS_PERXPD];
int ohttimer[CHANNELS_PERXPD];
@@ -157,24 +160,48 @@ struct FXS_priv_data {
#define LED_BLINK_RING (1000/8) /* in ticks */
/*---------------- FXS: Static functions ----------------------------------*/
static int linefeed_control(xbus_t *xbus, xpd_t *xpd, lineno_t chan, enum fxs_state value)
{
struct FXS_priv_data *priv;
priv = xpd->priv;
LINE_DBG(SIGNAL, xpd, chan, "value=0x%02X\n", value);
priv->lasttxhook[chan] = value;
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, 0x40, value);
}
static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on)
{
int value = (on) ? REG_BATTERY_BATSL : 0x00;
struct FXS_priv_data *priv;
unsigned long *p;
int was;
BUG_ON(!xbus);
BUG_ON(!xpd);
priv = xpd->priv;
p = (unsigned long *)&priv->vbat_h;
if (on)
was = test_and_set_bit(chan, p) != 0;
else
was = test_and_clear_bit(chan, p) != 0;
if (was == on) {
LINE_DBG(SIGNAL, xpd, chan,
"%s (same, ignored)\n", (on) ? "up" : "down");
return 0;
}
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on) ? "up" : "down");
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY, value);
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY,
(on) ? REG_BATTERY_BATSL : 0x00);
}
static int linefeed_control(xbus_t *xbus, xpd_t *xpd, lineno_t chan, enum fxs_state value)
{
struct FXS_priv_data *priv;
bool want_vbat_h;
priv = xpd->priv;
/*
* Should we drop vbat_h only during actuall ring?
* - It would lower the noise caused to other channels by
* group ringing
* - But it may also stop CallerID from passing through the SLIC
*/
want_vbat_h = value == FXS_LINE_RING;
if (lower_ringing_noise || want_vbat_h)
do_chan_power(xbus, xpd, chan, want_vbat_h);
LINE_DBG(SIGNAL, xpd, chan, "value=0x%02X\n", value);
priv->lasttxhook[chan] = value;
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, 0x40, value);
}
static void vmwi_search(xpd_t *xpd, lineno_t pos, bool on)
@@ -691,7 +718,7 @@ static int send_ring(xpd_t *xpd, lineno_t chan, bool on)
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on)?"on":"off");
priv = xpd->priv;
set_vm_led_mode(xbus, xpd, chan, 0);
do_chan_power(xbus, xpd, chan, on); // Power up (for ring)
do_chan_power(xbus, xpd, chan, on); /* Power up (for ring) */
ret = linefeed_control(xbus, xpd, chan, value);
if(on) {
MARK_BLINK(priv, chan, LED_GREEN, LED_BLINK_RING);
@@ -1550,6 +1577,11 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in
IS_SET(priv->search_fsk_pattern, i)
);
}
len += sprintf(page + len, "\n%-12s", "vbat_h:");
for_each_line(xpd, i) {
len += sprintf(page + len, "%4d",
test_bit(i, (unsigned long *)&priv->vbat_h));
}
len += sprintf(page + len, "\n");
for(led = 0; led < NUM_LEDS; led++) {
len += sprintf(page + len, "LED #%d", led);

View File

@@ -22,6 +22,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kmod.h>
#include "xdefs.h"
#include "xpd.h"
#include "xpp_dahdi.h"
@@ -422,19 +423,37 @@ int xpp_register_request(xbus_t *xbus, xpd_t *xpd, xportno_t portno,
return 0;
}
/* 0x23 */ HOSTCMD(GLOBAL, RESET_SYNC_COUNTERS)
/*
* Wrapper for different types of xbus reset
*/
static int send_xbus_reset(xbus_t *xbus, uint8_t reset_mask)
{
xframe_t *xframe;
xpacket_t *pack;
BUG_ON(!xbus);
//XBUS_DBG(SYNC, xbus, "\n");
XFRAME_NEW_CMD(xframe, pack, xbus, GLOBAL, RESET_SYNC_COUNTERS, 0);
RPACKET_FIELD(pack, GLOBAL, RESET_SYNC_COUNTERS, mask) = 0x10;
XFRAME_NEW_CMD(xframe, pack, xbus, GLOBAL, XBUS_RESET, 0);
RPACKET_FIELD(pack, GLOBAL, XBUS_RESET, mask) = reset_mask;
send_cmd_frame(xbus, xframe);
return 0;
}
/* 0x23 */ HOSTCMD(GLOBAL, RESET_SPI)
{
XBUS_DBG(DEVICES, xbus, "Sending SPI reset\n");
/* toggle reset line */
send_xbus_reset(xbus, 0x04);
send_xbus_reset(xbus, 0x00);
return 0;
}
/* 0x23 */ HOSTCMD(GLOBAL, RESET_SYNC_COUNTERS)
{
//XBUS_DBG(SYNC, xbus, "\n");
return send_xbus_reset(xbus, 0x10);
}
/*---------------- GLOBAL: Astribank Reply Handlers -----------------------*/
HANDLER_DEF(GLOBAL, NULL_REPLY)
@@ -526,6 +545,7 @@ HANDLER_DEF(GLOBAL, AB_DESCRIPTION) /* 0x08 */
list_add_tail(&card_desc->card_list, &worker->card_list);
spin_unlock_irqrestore(&worker->worker_lock, flags);
}
CALL_PROTO(GLOBAL, RESET_SPI, xbus, NULL);
if (!xbus_process_worker(xbus)) {
ret = -ENODEV;
goto out;
@@ -636,6 +656,15 @@ static void global_packet_dump(const char *msg, xpacket_t *pack)
#define MAX_PATH_STR 128
#ifndef UMH_WAIT_PROC
/*
* - UMH_WAIT_PROC was introduced as enum in 2.6.23
* with a value of 1
* - It was changed to a macro (and it's value was modified) in 3.3.0
*/
#define UMH_WAIT_PROC 1
#endif
int run_initialize_registers(xpd_t *xpd)
{
int ret;
@@ -718,7 +747,7 @@ int run_initialize_registers(xpd_t *xpd)
}
XPD_DBG(DEVICES, xpd, "running '%s' for type=%d revision=%d\n",
init_card, xpd->type, xbus->revision);
ret = call_usermodehelper(init_card, argv, envp, 1);
ret = call_usermodehelper(init_card, argv, envp, UMH_WAIT_PROC);
/*
* Carefully report results
*/

View File

@@ -38,7 +38,7 @@ enum global_opcodes {
XPROTO_NAME(GLOBAL, SYNC_REPLY) = 0x1A,
/**/
XPROTO_NAME(GLOBAL, ERROR_CODE) = 0x22,
XPROTO_NAME(GLOBAL, RESET_SYNC_COUNTERS) = 0x23,
XPROTO_NAME(GLOBAL, XBUS_RESET) = 0x23,
XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE,
};
@@ -87,7 +87,7 @@ DEF_RPACKET_DATA(GLOBAL, SYNC_REPLY,
DEF_RPACKET_DATA(GLOBAL, REGISTER_REPLY,
reg_cmd_t regcmd;
);
DEF_RPACKET_DATA(GLOBAL, RESET_SYNC_COUNTERS,
DEF_RPACKET_DATA(GLOBAL, XBUS_RESET,
byte mask;
);
DEF_RPACKET_DATA(GLOBAL, ERROR_CODE,
@@ -98,6 +98,7 @@ DEF_RPACKET_DATA(GLOBAL, ERROR_CODE,
/* 0x07 */ DECLARE_CMD(GLOBAL, AB_REQUEST);
/* 0x19 */ DECLARE_CMD(GLOBAL, SYNC_SOURCE, enum sync_mode mode, int drift);
/* 0x23 */ DECLARE_CMD(GLOBAL, RESET_SPI);
/* 0x23 */ DECLARE_CMD(GLOBAL, RESET_SYNC_COUNTERS);
int xpp_register_request(xbus_t *xbus, xpd_t *xpd, xportno_t portno,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,12 @@
# Install firmwares and initialization scripts for the Astribank
# drivers
FPGA_FW = FPGA_FXS.hex FPGA_1141.hex FPGA_1151.hex FPGA_1161.hex
USB_FW = USB_FW.hex USB_FW.201.hex USB_RECOV.hex
FPGA_FW = FPGA_FXS.hex FPGA_1141.hex FPGA_1151.hex FPGA_1161.hex \
FPGA_1161.201.hex
PIC_FW = PIC_TYPE_1.hex PIC_TYPE_2.hex PIC_TYPE_3.hex PIC_TYPE_4.hex
OCT_FW = $(wildcard OCT6104E-256D.ima)
FIRMWARES = USB_FW.hex $(FPGA_FW) $(PIC_FW) $(OCT_FW)
FIRMWARES = $(USB_FW) $(FPGA_FW) $(PIC_FW) $(OCT_FW)
PROTO_VER = 30
SCRIPTS_BASE = $(patsubst %,init_card_%_$(PROTO_VER),1 2 3 4 5)
SCRIPTS = $(SCRIPTS_BASE:%=../%)

View File

@@ -0,0 +1,578 @@
#
# $Id: USB_FW.201.hex 10402 2012-02-15 15:34:50Z dima $
#
:03004300021F0099
:03005300021F0089
:101F0000021E3100021E8E00021E7800021E4900D1
:081F1000021C2000021BA900C5
:101000001201000200000040AAAAAAAAAAAA01028C
:1010100003010A0600020000004001000902370037
:10102000020100C0000904000002FFFFFF040705E1
:101030000202000200070586020002000904010006
:1010400002FFFFFF050705040200020007058802F2
:10105000000200001201000200000040E4E451110F
:101060000000010203010A06000200000040010026
:1010700009023700020100C0320904000002FFFF2C
:10108000FF04070502024000000705860240000039
:101090000904010002FFFFFF0507050402400000EC
:1010A0000705880240000006040016001400120024
:1010B0000A00260004030904160358006F0072009A
:1010C00063006F006D0020004C00540044001403C6
:1010D00041007300740072006900620061006E00DC
:1010E0006B001203530065007200690061006C0020
:1010F0004E006F000A0346005000470041002603DF
:101100004D0061006E00610067006D0065006E00BB
:101110007400500072006F0063006500730073007C
:061120006F0072000000E8
:050FF6000300000000F3
:100F3C0041E0370041E0B60042E0B1000041E0384A
:100F4C0000021BE0850218E07943E0B30000004D7D
:0F0F5C00E03931303339354D202020202020005E
:101D71008B538A548955E5581558AE57700215573B
:101D81004E6014AB530555E555AA54700205541421
:081D9100F9ED12077780DF2253
:101BE6008B538A548955E55A155AAE5970021559C0
:101BF6004E6026AB560558E558AA5770020557148D
:101C0600F9120731FFAB530555E555AA5470020585
:0A1C16005414F9EF12077780CD2275
:101DC100D2B7E490E670F0F5B575B5E653B5E743E3
:101DD100B28853B2FCC2B3D2B1C2B2C2B67F32FE34
:061DE100121E07D2B6221B
:101E6100538EF75389FB5389F74389015389FDE465
:071E7100F58AF58CD2A922CD
:1018B2008C448D45AA06A9077556018A5789587521
:1018C2005900755A1C7B017AE0794C121BE690E0B4
:1018D20064E0FCA3E0FDA3E0FEA3E064D1FFEE64BC
:1018E2008DFEED644CFDEC6449FC90E064120853FB
:1018F2007EE07F4C7D1C7C001213707EE07F4C7B6F
:101902001C7A00AD45AC441214247D1C7C00AF450A
:10191200AE441211F57D1C7C00AF45AE44021C564C
:08183F008E448F458C468D4755
:10184700C20712001290E15BEFF0BF5004D207808D
:1018570057E490E15CF0A3F090E15CE0FEA3E0FFC9
:10186700C39410EE648094805030E5472FF582E5ED
:10187700463EF583E0FF90E15CE0FCA3E02545F5FB
:1018870082E5443CF583E0B5071090E15DE004F0A4
:1018970070C690E15CE004F080BE90E15CE070040B
:0A18A700A3E064107002D207A2074C
:0118B1002214
:020E12008F410E
:100E14001200128F42E4F546F547AD47AC46121472
:100E2400DA74692547F582E434E0F583E543F00597
:100E340047E54770020546C39408E54664809480FC
:100E440040D8E541600490E069F090E069E0B4C006
:100E540008754400754508800675441D754536754A
:100E64004600754708C3E5479410E54664809480BE
:100E740050231214D674692547F582E434E0F583CF
:100E8400E543F00547E547700205460545E545702D
:100E9400D4054480D07543FF75441D7545197546C6
:100EA40000754710C3E547942CE546648094805050
:100EB40033E542B4510E7B007A007943AD45AC442E
:100EC400FF1214E274692547F582E434E0F583E502
:100ED40043F00547E547700205460545E54570C4FE
:100EE400054480C075441D75453EE4F543F546F55B
:100EF40047C3E5479406E54664809480502FE54255
:100F0400B4510A90E069E0B4C2031214D6744625C1
:100F140047F582E434E0F583E543F00547E547709F
:100F24000205460545E54570C8054480C490E0695E
:070F3400E0B4C20374C0F039
:010F3B002293
:0A1988008E448F458B468A4789483C
:101992007E00E5452DF54DEE3544F54C1200128FD3
:1019A20049E5496451600BC3E5459410E544940050
:1019B200503585444A85454BC3E54B954DE54A95DF
:1019C2004C5024AB46AA47A948AD4BAC4AAF49128A
:1019D2001740054BE54B7002054A74012548F5484E
:0719E200E43547F54780D111
:0119E90022DB
:0617C7008B418A428943B8
:1017CD00D2067556017557E0755869755900755AE9
:1017DD00107B017AE07995121BE6E5432410F9E4BC
:1017ED003542854156F5578958755900755A0C7B08
:1017FD00017AE079A5121BE67EE07F957CE07D1AEB
:10180D001218B27EE07F1AE543241CF9E43542FC40
:10181D00AD0112183F5016AB41E5432410F9E435E4
:10182D0042FA7D1C7F197E1D1219888002C206A204
:01183D0006A4
:01183E002287
:101126007F03121D46EF2402FFE43EA90775410125
:10113600F542894390E06AE0FFE50C2408F582E475
:10114600350BF583EFF090E06BE0FFE50C2409F535
:1011560082E4350BF583EFF090E06CE0FFE50C24BC
:101166000AF582E4350BF583EFF090E06DE0FFE5DC
:101176000C240BF582E4350BF583EFF090E06EE07E
:10118600FFE50C240CF582E4350BF583EFF090E0D7
:101196006FE0FFE50C240DF582E4350BF583EFF0E7
:1011A6007F087E00E4FDEDC39408502874692FF58E
:1011B60082E434E0F583E0FCAB41AA42A94375F032
:1011C60002EDA4F58285F083EC1207890D0FBF00AE
:1011D600010E80D2E5192404F582E43518F583E082
:0E11E60030E0047F0180027F0090E037EFF0E0
:0111F40022D8
:101B250090E06CE02FFFE50C240AF582E4350BF517
:101B350083EFF0E50C240BF582E4350BF583E0FE2D
:101B4500E50C240AF582E4350BF583E0FDEDFF9005
:101B5500E0B1EEF0A3EFF0D206121CBD90E680E0F6
:041B650054F7F0221F
:1016200090E600E054E74410F090E60174C0F090BA
:10163000E6107420F000000090E611F00000009029
:10164000E6047480F0000000740FF0000000E4F085
:1016500000000090E6187410F0000000E490E61915
:10166000F000000090E61A7408F0000000E490E634
:101670001BF000000090E6497482F0000000F000CA
:10168000000090E6247402F0000000E490E625F0EB
:1016900000000090E6957480F0000000F00000006B
:1016A00043AF017B017AE07914755700755806E461
:0416B000FD021D71A9
:061E0100D2837F0A7E007F
:101E07007C007D181207ABEF1FAC0670011E4C70EB
:021E1700F622B1
:0A1A43008E418F428B438A4489458F
:101A4D00E4F546F547C3E5479542E54695415036E1
:101A5D00AB43AA44A94585478285468312074AFFB1
:101A6D00E4FBFAC2B2EF1392B1EFC313FFD2B20B84
:101A7D00BB00010AEB64084A70E9C2B20547E547AD
:071A8D0070C3054680BFD3C2
:011A9400222F
:101E190090E60174C0F0C2B67FC27E01121E07D2DD
:081E2900B67F327E00021E07A5
:101EA400D287121E01C287121E03C2837F0A7E00DC
:031EB400021E0704
:021B6900AB07C8
:101B6B00E4F9FAEBC413131354011392877F027E2B
:101B7B0000121E07D2837F057E00121E07E925E0A7
:101B8B00FFA2B3E4334FF97F057E00121E07EB254E
:0D1B9B00E0FBC283121E030ABA08C8AF01A6
:011BA800221A
:061A95008B558A568957AB
:101A9B00A2AFE433F55D121EA4E4F55CE55CC395DF
:101AAB005B5027AB55AA56A957855C8275830012EC
:101ABB00074AFF121B69AB58AA59A95A855C827554
:101ACB008300EF120789055C80D2120036E55D2496
:031ADB00FF92AFC8
:011ADE0022E5
:0B003600C287121E03121E01D2872297
:101DE70075418F8F42755800755900755A4B755B51
:0A1DF700027B007A007941021A9580
:101C8C0078417C007D007BFF7A0F79F67E007F0522
:101C9C0012070B30B415755800755900755A4175FB
:101CAC005B057B007A007941121A95E5435401FFDC
:011CBC002205
:100B4E007541007542007543007545017546E075A7
:100B5E0047007548017549E0754A08E4F551FFF5FF
:100B6E00527B017AE07900F557755808FD121D7118
:100B7E00AB45AA46A9477401120777E4F550E55034
:100B8E00C454F0AB45AA46A94790000112078985C7
:100B9E004858854959854A5A755B08121A95AB48CB
:100BAE00AA49A94A90000212074AFE5403FFEE54C6
:100BBE0070F55124E0602924F0604B24F0605D2430
:100BCE00F0606F24406003020C5675410185184297
:100BDE00851943EF24FE600624FE703B801C801FA7
:100BEE00E5192401FDE43518A905754101F5428981
:100BFE0043EF24FC60092402700A7552028052757C
:100C0E005206804D8011E5192402FDE43518A90520
:100C1E00754101F54289437552088035E519240363
:100C2E00FDE43518A905754101F542894375520455
:100C3E00801FE5192405FDE43518A905754101F558
:100C4E00428943755298800975410075420075437B
:100C5E0000E542454345416022AB41AA42A94312F9
:100C6E000731FED395524006AD52AE0580008E443C
:100C7E00120731C39544120777800CE55170047E3C
:100C8E000180027E008E44744B2550F8A644055018
:100C9E00E550C394055003020B8CAB45AA46A947F9
:100CAE007488120777AB45E5472401F9E43546FA17
:100CBE0075560075570075584B755900755A0512C3
:100CCE001BE6854858854959854A5A755B08AB45D8
:070CDE00AA46A947021A957E
:1019EA008F4190E0B1E0FEA3E054F064607003EE32
:1019FA00641160037F012290E037E070037F0F22B9
:101A0A00E5417003308108E541B401062080037F77
:101A1A00102290E0B6E0B541037F0122E4F511D22D
:101A2A0006121CBDAF4190E0B6EFF024FF92B590CC
:091A3A00E680E054F7F07F002281
:04000E0090FC04F06E
:1000120090E678E0541824F06008240870087F50B5
:0800220080067F518002E4FF1B
:01002A0022B3
:0C14D600AD45AC447B007A007943AF4286
:0C14E2008F488C498D4A8B4B8A4C894DF9
:1014EE00E4F54EF54F755003FDF551F552A2AF33AD
:1014FE00F553E54824AF600D047012754E00754F1C
:10150E00017D018008754E00754F02E4FDE54860CF
:10151E0051E54F454E604BE54990E0B3F0E54AA3E7
:10152E00F074B32DF582E434E0AD82FCAB4FAF48DE
:10153E001219227551008F527F0A7E00121ADFE5B2
:10154E0052455160107CE07D687B01AF4812157BDF
:10155E007551008F5290E068E0AB4BAA4CA94D122A
:0C156E000777E55324FF92AFAE51AF5257
:01157A00224E
:0C1740008F4E8C4F8D508B518A52895374
:10174C00E4F554F555755603FDF557F558A2AF332E
:10175C00F559E54E24AF600D0470127554007555A3
:10176C00027D018008755400755503E4FDE54E605B
:10177C003FE55545546039E54F90E0B3F0E550A393
:10178C00F0AB51AA52A95312073190E0B5F0C2B791
:10179C0074B32DF582E434E0AD82FCAB55AF4E1240
:1017AC0019227557008F587F0A7E00121ADFD2B7A4
:0A17BC00E55924FF92AFAE57AF5875
:0117C6002200
:10005600E4F531F532F535F53CF53DF53EF53FE590
:10006600AA5484600302063A90E694E0FE90E69570
:10007600E0FBEEF53CEBF53DC39405E53C94004012
:100086000790F404E0FD80027DFFED12085F00CECC
:100096000102C30503080703580903D80B011E0E06
:1000A60000E40F019411025E130541250401310499
:1000B6005732046A3404B23504C93604E63703E518
:1000C6004503F647000005BA75310075320790FC06
:1000D600047481F0A37414F0E4A3F00205DD7F0F2D
:1000E600121DE775310075320690FC047480F0E449
:1000F600A3F0753505F511FE74002535F9EE34F4D7
:10010600FA7B011217C7400690FC05740EF0E4FF57
:10011600120E127F8F0202BD7F0E121DE77531008F
:10012600753205748E12000E8F3F7B007A0079407F
:10013600E4FDFC1214E2E53F64516019E53F6450AA
:10014600601375310075320690FC047480F0A37458
:100156000BF00205DD90E0B7E0FF120E12740025E9
:1001660032F974FC3531FA7B01C0038B567557E0C2
:10017600755869755900755A2CD003121BE6742CF4
:100186002532F532E43531F5317F8E0202BD753107
:100196000075320790FC047491F090E678E090FCCC
:1001A60005F030B3047F0280027F0030B4047E0184
:1001B60080027E00EE4F90FC06F074002532F97442
:1001C600FC3531FA7B01755700755812E4FD121D96
:1001D6007174002532F974FC3531FA7B01C0038B4A
:1001E600567557E0755839755900755A06D0031279
:1001F6001BE674062532F532E43531F531FE74001E
:100206002532F974FC3EFA7B01C0038B567557E024
:10021600755814755900755A06D003121BE67406F4
:100226002532F532E43531F531FE74002532F974A4
:10023600FC3EFA7B01C0038B567557E07558467530
:100246005900755A06D003121BE674062532F5329C
:10025600E43531F5310205DD7F13121DE7753100F6
:1002660075321D749312000E8F3F75381D75390057
:10027600753600753705D3E5399418E538941D5061
:1002860034E53FB4510E7B007A007940AD39AC3885
:10029600FF1214E274002537F58274FC3536F583B7
:1002A600E540F00539E539700205380537E5377060
:1002B600C5053680C17F93121DE70205DD75310045
:1002C60075320690FC047480F0E4A3F090F405E027
:1002D60090E038F0E0147071121E1930B31B755699
:1002E600017557F4755806755900755A067B017ADB
:1002F600E07914121BE60205DD90FC057401F0029C
:1003060003D075310075320690FC047480F0E4A3C6
:10031600F0753507AF35FEC3E53D9FF534E53C9EE8
:10032600F53390E038E014702074002FF974F43E31
:10033600FA7B01AF34AE33121A435004E40204C20E
:1003460090FC05740CF00205DD90FC057403F002C8
:1003560005DD75310075320690FC047480F0E4A367
:10036600F090E038E014705CE4FFFE20B411C2B2F5
:10037600D2B1D2B20FBF00010EEF640A4E70EC305C
:10038600B43A90E6017403F07F647E00121E079073
:10039600E0B7E0FF120E127EE07F697CE07DB812C6
:1003A60018B27EE07FB8AD1CAC1B12183F50051288
:1003B6000B4E801690FC05740EF0800E90FC0574B2
:1003C6000DF0800690FC057403F0E490E038F0022E
:1003D60005DDE4F531F5327F02121B250205DDE469
:1003E600FF120E12121126E4FF1219EAE4FF800230
:1003F6007F01121B25121E190205DD7531007532AB
:100406000690FC047480F0E4A3F090F405E0F53E59
:10041600E4F511E53E64016004E53E703290E0B11A
:10042600E0FEA3E054F064607003EE6411600280A5
:100436007290E037E070028058E5116401600AE5C9
:1004460011700C121C8CEF6006853E110205DD80D2
:100456005275310075320690FC0474B2F0A3E511B2
:10046600F00205DD75310075320690FC047480F0EB
:10047600E4A3F090F405E0F53EFF1219EAEF24F14B
:10048600600F1460152410701AE4F531F532020578
:10049600DD90FC05740FF00205DD90FC057410F08C
:1004A6000205DD90FC057401F00205DD753100756D
:1004B600320690FC0474B5F090E0B6E090FC05F0CE
:1004C6000205DD75310075320690FC0474B6F0A2A3
:1004D60080E43325E0FFA281E4334FA3F00205DD7B
:1004E600853C31853D3290FC0474B7F0753505C303
:1004F600E53D9535F534E53C9400F5337400253536
:10050600F582E434F4F583E0648870030205DDAF18
:10051600357E0074002FF9EE34F4FA7B01C003C077
:100526000174002FF9EE34FC8B58F559895A85343D
:100536005BD001D003121A950205DD7531007532C4
:100546000590FC0474A5F01200128F3F7B007A0020
:100556007940E4FDFC1214E290E036E0FF0532E556
:1005660032AC3170020531142400F58274FC3CF57E
:1005760083EFF090E0B7E0FF0532E532AC31700270
:100586000531142400F58274FC3CF583EFF0053246
:10059600E532AE3170020531142400F58274FC3E5A
:1005A600F583E540F090E6017403F07F647E001267
:1005B6001E07802375310075320690FC047480F0A6
:1005C600C3E53D9405E53C94005006A37407F0800E
:1005D6000690FC057406F090F404E0B48004A3E0F1
:1005E600701290F404E06405600FE06407600AE0AE
:1005F60064096005E490E038F0E5324531602CE5A9
:1006060032FD90FC00F0E531FFA3F090F402E0909B
:10061600FC02F090F403E090FC03F090E69CEFF00F
:1006260000000090E69DEDF000000090E6957480D5
:04063600F0000000D0
:01063A00229D
:02004100D322C8
:0800030090E6BAE0F51DD322DE
:101ECA0090E740E51DF0E490E68AF090E68B04F096
:021EDA00D32211
:08002B0090E6BAE0F51AD322B9
:101EDC0090E740E51AF0E490E68AF090E68B04F087
:021EEC00D322FF
:101D990090E6B9E0242F600D04701990E604E0FF85
:101DA900430780800890E604E0FF53077F000000A6
:071DB900EFF08002D322C30A
:011DC0002200
:101E3100C0E0C083C082D2015391EF90E65D74018E
:081E4100F0D082D083D0E03222
:101E7800C0E0C083C0825391EF90E65D7404F0D057
:061E880082D083D0E0329D
:101E8E00C0E0C083C0825391EF90E65D7402F0D043
:061E9E0082D083D0E03287
:101C2000C0E0C083C08285120D85130E850E8285AB
:101C30000D83A37402F085090F850A108510828533
:101C40000F83A37407F05391EF90E65D7410F0D00A
:061C500082D083D0E032D7
:101E4900C0E0C083C082D2035391EF90E65D74086D
:081E5900F0D082D083D0E0320A
:101BA900C0E0C083C08290E680E030E72085090D5F
:101BB900850A0E850E82850D83A37402F085120FA6
:101BC900851310851082850F83A37407F05391EF55
:0D1BD90090E65D7420F0D082D083D0E03221
:101EB700000102020303040405050300000000C03B
:031EC700C2000056
:060F6B0001110001080065
:03000B000212BC22
:1012BC00C0E0C0F0C083C082C0D075D000C000C0F8
:0D12CC0001C002C003C004C005C006C00779
:1012D90078217C007D007BFF7A1E79C17E007F0525
:1012E90012070B90E0B6E0F526C204752700E50861
:1012F900600415088056750805E5117004C204805C
:1013090043A280308101B3500B3081047F008030CB
:101319007F01802C30B415755800755900755A2114
:10132900755B057B007A007921121A95E523540132
:10133900F527701090E0B6E060047F0080027F011D
:0C1349008F26D204300405AF261219EAEA
:10135500D007D006D005D004D003D002D001D000EC
:0B136500D0D0D082D083D0F0D0E03296
:100CE50078567CE17D017BFF7A1E79C67E007F0404
:100CF50012070BC203C200D202C201121DC1121E8D
:100D050061121620750B10750C00751410751512EF
:100D1500750910750A1C75121075137085120F85EB
:100D250013107516107517B412001290E154EFF0F8
:100D35007B017AE17955E4FDFC1214E290E155E07E
:100D4500FF90E036F0E490E0B7F0EF64C26059EF51
:100D550064C06054E490E15AF090E15AE0FFC39416
:100D650004504A74562FF582E434E1F583E0FF60C0
:100D75003C120E127EE07F697CE07DB81218B27ECF
:100D8500E07FB8AD1CAC1B12183F501490E15AE03F
:100D95002456F582E434E1F583E090E0B7F0800D68
:100DA50090E15AE004F080B1E4FF120E1212112610
:100DB500D2E843D82090E668E04409F090E65CE08C
:100DC500443DF012001290E154EFF07B017AE17995
:100DD50055E4FDFC1214E290E155E064C26007E4BD
:100DE50090E0B6F0C2B57F01121B25D2AFD28C536D
:100DF5008EF8C203C2AF120056D2AF3001051209F8
:0D0E050026C2013003EEC203121D1A80E761
:0B00460090E50DE030E402C322D3225D
:1009260090E6B9E070030209EB147003020A602432
:10093600FE7003020ADB24FB70030209E514700350
:100946000209DF1470030209D31470030209D924C3
:10095600056003020B3A1200414003020B4690E683
:10096600BBE024FE602714603E24FD60111460275E
:1009760024067056E50B90E6B3F0E50C80421200B3
:10098600465044E51490E6B3F0E5158033E50D9046
:10099600E6B3F0E50E802985120F851310E50F905A
:1009A600E6B3F0E510801990E6BAE0FF121D46AAFC
:1009B60006A9077B01EA494B600DEE90E6B3F0EF1E
:1009C60090E6B4F0020B46020B35020B35121EDC24
:1009D600020B4612002B020B46120003020B4612B4
:1009E6001ECA020B4690E6B8E0247F601514601913
:1009F60024027063A200E43325E0FFA202E4334F31
:100A06008041E490E740F0803F90E6BCE0547EFFF2
:100A16007E00E0D394807C0040047D0180027D004E
:100A2600EC4EFEED4F24B7F582741E3EF583E4933B
:100A3600FF3395E0FEEF24A1FFEE34E68F82F583C7
:100A4600E0540190E740F0E4A3F090E68AF090E6E7
:100A56008B7402F0020B46020B3590E6B8E024FEDA
:100A6600601624026003020B4690E6BAE0B4010564
:100A7600C200020B46020B3590E6BAE0705590E6CE
:100A8600BCE0547EFF7E00E0D394807C0040047D71
:100A96000180027D00EC4EFEED4F24B7F582741EF8
:100AA6003EF583E493FF3395E0FEEF24A1FFEE3499
:100AB600E68F82F583E054FEF090E6BCE0548013A6
:100AC6001313541FFFE0540F2F90E683F0E04420E9
:100AD600F0806D805A90E6B8E024FE60192402701A
:100AE6004E90E6BAE0B40104D200805490E6BAE033
:100AF6006402604C803990E6BCE0547EFF7E00E0E4
:100B0600D394807C0040047D0180027D00EC4EFE83
:100B1600ED4F24B7F582741E3EF583E493FF3395BB
:100B2600E0FEEF24A1FFEE34E68F82F583800D9080
:100B3600E6A08008121D99500790E6A0E04401F057
:070B460090E6A0E04480F0FE
:010B4D002285
:03003300020FFBBE
:040FFB0053D8EF32A6
:100F71006080E0D4292E43C9A2D87C013D3654A11A
:100F8100ECF0061362A705F3C0C7738C98932BD9B5
:100F9100BC4C82CA1E9B573CFDD4E01667426F18B9
:100FA1008A17E512BE4EC4D6DA9EDE49A0FBF58E45
:100FB100BB2FEE7AA968799115B2073F94C21089C7
:100FC1000B225F21807F5D9A5A903227353ECCE714
:100FD100BFF79703FF1930B348A5B5D1D75E922A61
:100FE100AC56AAC64FB838D296A47DB676FC6BE251
:040FF1009C7404F1F7
:081370008C468D47AB07AA066D
:10137800E4F548F549C3E5499547E5466480F8E54D
:1013880048648098400302141FE54925E0FFE548BA
:1013980033FE74D42FF58274E03EF583E0FF7E00BF
:1013A800AC46AD471207BD8C4A8D4BE54925E0FF99
:1013B800E54833FE74D52FF58274E03EF583E0FFEF
:1013C8007E00AC46AD471207BD8C4C8D4DE54B6594
:1013D8004D7004E54A654C6030EB254BF582EA35E3
:1013E8004AF583E0F9EB254DF582EA354CF583E0C3
:1013F800FFEB254BF582EA354AF583EFF0EB254DF7
:10140800F582EA354CF583E9F00549E549600302C0
:0B141800137D054802137D7E007F015C
:0114230022A6
:0C1424008E468F478C488D498A4A8B4BBE
:10143000E54745466006E54945487004E4FEFF225D
:10144000E4F54CF54DC3E54D954BE54A6480F8E570
:101450004C648098507BE4F54EF54FE549254DF5F9
:1014600082E548354CF583E4F0C3E54F954BE54AFA
:101470006480F8E54E6480985049E54F254D24D4AA
:10148000F582E434E0F583E0FFE547254FF582E59A
:1014900046354EF583E0FEEF8EF0A4FFE549254D7D
:1014A000F582E548354CF583E02FFFE549254DF5FC
:1014B00082E548354CF583EFF0054FE54F70AA05FE
:1014C0004E80A6054DE54D6003021445054C0214FF
:0514D000457E007F01D4
:0114D50022F4
:101CEC00120731FF90000312074A12077790000386
:101CFC00EF12078990000212074AFF9000011207A9
:0E1D0C004A900002120789900001EF02078939
:0811F5008E468F478C488D499E
:1011FD00E4F54AF54BE549AE487802CEA2E713CEA9
:10120D0013D8F8FFC3E54B9FEE6480F8E54A648080
:10121D009840030212B7E54BAE4A7802C333CE3382
:10122D00CED8F92547FFEE3546FAA9077B018B4C41
:10123D00F54D894E74D5254BF582E434E0F583E008
:10124D00541FFFE48F52F551F550F54F121CECABC6
:10125D004CAA4DA94E120819C374209552F9F812D3
:10126D000806C004C005C006C007A94E120819A97A
:10127D0052A8011207F3D003D002D001D000EF4BDA
:10128D00FFEE4AFEED49FDEC48FCAB4CAA4DA94ED4
:10129D00120839AB4CAA4DA94E121CEC054BE54B6F
:0E12AD006003021202054A0212027E007F0157
:0112BB002210
:101C5600D3ED9410EC64809480402AED1D70011C35
:101C6600142FF582EE3CF583E0FB547F24D4F582F5
:101C7600E434E0F583E0F9540F2FF582E43EF58372
:051C8600E06BF080CBD3
:011C8B002236
:101D1A0090E682E030E004E020E60B90E682E030D4
:101D2A00E119E030E71590E680E04401F07F147E87
:0C1D3A0000121ADF90E680E054FEF02258
:101CBD0030060990E680E0440AF0800790E680E067
:101CCD004408F07FDC7E05121ADF90E65D74FFF0AC
:0F1CDD0090E65FF05391EF90E680E054F7F0222D
:101ADF008E5A8F5B90E600E054187012E55B24017C
:101AEF00FFE4355AC313F55AEF13F55B801590E6F3
:101AFF0000E05418FFBF100BE55B25E0F55BE55ADE
:101B0F0033F55AE55B155BAE5A7002155A4E6005F8
:061B1F00121EEE80EE2212
:06157B008C548D55AE07F3
:10158100EB70037F012290E678E020E6F990E6789F
:101591007480F0EE25E0440190E679F090E678E081
:1015A10030E0F990E678E020E26BE030E167BB01E2
:1015B1000790E678E04420F090E679E0F5561BEBE1
:1015C100603090E678E030E0F990E678E020E2459E
:1015D100BB010790E678E04420F090E679E0FF0552
:1015E10055E555AC547002055414F5828C83EFF027
:1015F10080CC90E678E030E0F990E678E020E215E2
:1016010090E678E04440F090E679E0855582855493
:0E16110083F07F012290E678E04440F07F00F5
:01161F0022A8
:1019220090E678E020E6F990E6787480F0EF25E022
:1019320090E679F090E678E030E0F990E678E02001
:10194200E23AE030E136EBD3940040260DEDAE04EE
:1019520070010C14F5828E83E090E679F01B90E61C
:1019620078E030E0F990E678E020E210E020E1D67D
:10197200800A90E678E04440F07F012290E678E029
:051982004440F07F006D
:01198700223D
:021D4600A907EB
:101D4800AE16AF178F828E83A3E064037017AD01C0
:101D580019ED7001228F828E83E07C002FFDEC3E0E
:081D6800FEAF0580DFE4FEFF81
:011D70002250
:101EEE007400F58690FDA57C05A3E582458370F907
:011EFE0022C1
:030000000216B431
:0C16B400787FE4F6D8FD75815D0216FB1E
:10063B00E709F608DFFA8046E709F208DFFA803EA1
:10064B0088828C83E709F0A3DFFA8032E309F6088E
:10065B00DFFA8078E309F208DFFA807088828C83F6
:10066B00E309F0A3DFFA806489828A83E0A3F608AA
:10067B00DFFA805889828A83E0A3F208DFFA804C84
:10068B0080D280FA80C680D4806980F2803380105B
:10069B0080A680EA809A80A880DA80E280CA8033C4
:1006AB0089828A83ECFAE493A3C8C582C8CCC5833C
:1006BB00CCF0A3C8C582C8CCC583CCDFE9DEE7800C
:1006CB000D89828A83E493A3F608DFF9ECFAA9F08B
:1006DB00EDFB2289828A83ECFAE0A3C8C582C8CCE1
:1006EB00C583CCF0A3C8C582C8CCC583CCDFEADEFA
:1006FB00E880DB89828A83E493A3F208DFF980CC5C
:10070B0088F0EF60010E4E60C388F0ED2402B40454
:10071B000050B9F582EB2402B4040050AF232345FB
:06072B00822390068B738F
:10073100BB010689828A83E0225002E722BBFE02C6
:09074100E32289828A83E49322F9
:10074A00BB010CE58229F582E5833AF583E0225064
:10075A0006E92582F8E622BBFE06E92582F8E222AE
:0D076A00E58229F582E5833AF583E49322C8
:10077700BB010689828A83F0225002F722BBFE0161
:02078700F3225B
:10078900F8BB010DE58229F582E5833AF583E8F0A6
:10079900225006E92582C8F622BBFE05E92582C852
:0207A900F2223A
:1007AB00EF8DF0A4A8F0CF8CF0A428CE8DF0A42E62
:0207BB00FE221C
:1007BD00C2D5EC30E709B2D5E4C39DFDE49CFCEE57
:1007CD0030E715B2D5E4C39FFFE49EFE120885C342
:1007DD00E49DFDE49CFC800312088530D507C3E43D
:0607ED009FFFE49EFE22C6
:1007F300E8600FECC313FCED13FDEE13FEEF13FFE4
:03080300D8F12207
:10080600E8600FEFC333FFEE33FEED33FDEC33FC50
:03081600D8F122F4
:10081900BB010789828A830208E65005E9F80208C4
:10082900DABBFE05E9F80208F289828A830208FE2A
:10083900BB010789828A830208535005E9F8020936
:0A0849000EBBFE05E9F802091A22B1
:0C085300ECF0A3EDF0A3EEF0A3EFF02218
:10085F00D083D082F8E4937012740193700DA3A328
:10086F0093F8740193F5828883E47374029368603C
:06087F00EFA3A3A380DF3C
:1016C000020CE5E493A3F8E493A34003F68001F24F
:1016D00008DFF48029E493A3F85407240CC8C3332B
:1016E000C4540F4420C8834004F456800146F6DFFA
:1016F000E4800B0102040810204080900F3CE47E3F
:10170000019360BCA3FF543F30E509541FFEE493EE
:10171000A360010ECF54C025E060A840B8E493A3B5
:10172000FAE493A3F8E493A3C8C582C8CAC583CAE0
:10173000F0A3C8C582C8CAC583CADFE9DEE780BE98
:010FF50000FB
:10088500BC000BBE0029EF8DF084FFADF022E4CC57
:10089500F875F008EF2FFFEE33FEEC33FCEE9DEC20
:1008A500984005FCEE9DFE0FD5F0E9E4CEFD22ED66
:1008B500F8F5F0EE8420D21CFEADF075F008EF2FB0
:1008C500FFED33FD4007985006D5F0F222C398FDA1
:0508D5000FD5F0EA223E
:0C08DA00E6FC08E6FD08E6FE08E6FF224A
:0C08E600E0FCA3E0FDA3E0FEA3E0FF2285
:0C08F200E2FC08E2FD08E2FE08E2FF2242
:1008FE00E493FC740193FD740293FE740393FF2240
:0C090E00ECF608EDF608EEF608EFF62215
:0C091A00ECF208EDF208EEF208EFF22219
:00000001FF

View File

@@ -1,10 +1,10 @@
#
# $Id: USB_FW.hex 10085 2011-11-13 14:33:46Z dima $
# $Id: USB_FW.hex 10401 2012-02-15 15:30:24Z dima $
#
:03004300021E009A
:03005300021E008A
:101E0000021E3000021E8D00021E7700021E4800D6
:081E1000021C1B00021BA400D0
:03004300021F0099
:03005300021F0089
:101F0000021E3400021E9100021E7B00021E4C00C5
:081F1000021C1F00021BA800C7
:101000001201000200000040AAAAAAAAAAAA01028C
:1010100003010A0600020000004001000902370037
:10102000020100C0000904000002FFFFFF040705E1
@@ -24,197 +24,199 @@
:101100004D0061006E00610067006D0065006E00BB
:101110007400500072006F0063006500730073007C
:061120006F0072000000E8
:050FF7000300000000F2
:1011ED0041E0370041E0BB0042E0B6000041E0388D
:1011FD0000021BE08A0218E07E43E0B800000052B6
:10120D00E039393733343A393936344D50202020CE
:04121D00202020006D
:101D96008B508A518952E5551555AE54700215542B
:101DA6004E6014AB500552E552AA5170020551140B
:081DB600F9ED12077180DF2234
:101BE1008B508A518952E5571557AE5670021556DA
:101BF1004E6026AB530555E555AA547002055414A1
:101C0100F912072BFFAB500552E552AA517002059C
:0A1C11005114F9EF12077180CD2283
:101D6C00C2B5C2B7E490E670F075B5E653B5EE4374
:101D7C00B28053B2F4A2B53390E0BBF0C2B3C2B69A
:0A1D8C007F327E00121DECD2B62259
:101E6000538EF75389FB5389F74389015389FDE466
:071E7000F58AF58CD2A922CE
:1017B3008C428D43AA06A9077553018A548955752E
:1017C300560075571C7B017AE07951121BE190E0BA
:1017D30051E0B4C20374C0F090E069E0FCA3E0FD03
:1017E300A3E0FEA3E064D1FFEE648DFEED644CFD47
:1017F300EC6449FC90E06912084D7EE07F517D1C4A
:101803007C001213607EE07F517B1C7A00AD43ACF9
:10181300421214147D1C7C00AF43AE421211267D8C
:0A1823001C7C00AF43AE42021C51D2
:0818A5008E428F438C448D45F7
:1018AD00C20712001290E160EFF0BF5004D2078022
:1018BD0057E490E161F0A3F090E161E0FEA3E0FF59
:1018CD00C39410EE648094805030E5452FF582E589
:1018DD00443EF583E0FF90E161E0FCA3E02543F594
:1018ED0082E5423CF583E0B5071090E162E004F03B
:1018FD0070C690E161E004F080BE90E161E070049B
:0A190D00A3E064107002D207A207E5
:0119170022AD
:020DE4008F3F3F
:100DE6001200128F40E4F544F545AD45AC441214AB
:100DF600CA746E2545F582E434E0F583E541F005D5
:100E060045E54570020544C39408E5446480948032
:100E160040D8E53F600490E06EF090E06EE0B4C02C
:100E260008754200754308800675421D7543367580
:100E36004400754508C3E5459410E54464809480F4
:100E460050231214C6746E2545F582E434E0F5830A
:100E5600E541F00545E545700205440543E5437067
:100E6600D4054280D07541FF75421D7543197544FE
:100E760000754510C3E545942CE544648094805084
:100E860033E540B4510E7B007A007941AD43AC4264
:100E9600FF1214D2746E2545F582E434E0F583E53D
:100EA60041F00545E545700205440543E54370C438
:100EB600054280C075421D75433EE4F541F544F593
:100EC60045C3E5459406E54464809480502FE5408B
:100ED600B4510A90E06EE0B4C2031214C6744B25F6
:100EE60045F582E434E0F583E541F00545E54570D6
:100EF6000205440543E54370C8054280C490E06E90
:070F0600E0B4C20374C0F067
:010F0D0022C1
:0A197E008E428F438B448A45894650
:101988007E00E5432DF54BEE3542F54A1200128FE5
:1019980047E5476451600BC3E5439410E542940062
:1019A8005035854248854349C3E549954BE54895F7
:1019B8004A5024AB44AA45A946AD49AC48AF4712A2
:1019C80017300549E5497002054874012546F54672
:0719D800E43545F54580D11F
:0119DF0022E5
:06182D008B3F8A40894157
:10183300D2067553017554E075556E75560075578C
:10184300107B017AE0799A121BE1E5412410F9E457
:101853003540853F53F554895575560075570C7BB4
:10186300017AE079AA121BE17EE07F9A7CE07D1A7F
:101873001217B37EE07F1AE541241CF9E43540FCDE
:10188300AD011218A55016AB3FE5412410F9E4351C
:1018930040FA7D1C7F197E1D12197E8002C206A2AA
:0118A300063E
:0118A4002221
:100F0E007F03121D41EF2402FFE43EA907753F0146
:100F1E00F540894190E06FE0FFE50C2408F582E48E
:100F2E00350BF583EFF090E070E0FFE50C2409F54A
:100F3E0082E4350BF583EFF090E071E0FFE50C24D1
:100F4E000AF582E4350BF583EFF090E072E0FFE5F1
:100F5E000C240BF582E4350BF583EFF090E073E093
:100F6E00FFE50C240CF582E4350BF583EFF090E0F1
:100F7E0074E0FFE50C240DF582E4350BF583EFF0FC
:100F8E007F087E00E4FDEDC394085028746E2FF5A3
:100F9E0082E434E0F583E0FCAB3FAA40A94175F052
:100FAE0002EDA4F58285F083EC1207830D0FBF00CE
:100FBE00010E80D2E5192404F582E43518F583E09C
:0E0FCE0030E0047F0180027F0090E037EFF0FA
:010FDC0022F2
:101B200090E071E02FFFE50C240AF582E4350BF517
:101B300083EFF0E50C240BF582E4350BF583E0FE32
:101B4000E50C240AF582E4350BF583E0FDEDFF900A
:101B5000E0B6EEF0A3EFF0D206121CB890E680E0FB
:041B600054F7F02224
:1016100090E600E054E74410F090E60174C0F090CA
:10162000E6107420F000000090E611F00000009039
:10163000E6047480F0000000740FF0000000E4F095
:1016400000000090E6187410F0000000E490E61925
:10165000F000000090E61A7408F0000000E490E644
:101660001BF000000090E6497482F0000000F000DA
:10167000000090E6247402F0000000E490E625F0FB
:1016800000000090E6957480F0000000F00000007B
:1016900043AF017B017AE07914755400755506E477
:0416A000FD021D9694
:061DE600D2877F0A7E0097
:101DEC007C007D181207A5EF1FAC0670011E4C700D
:021DFC00F622CD
:0A1A39008E3F8F408B418A428943A3
:101A4300E4F544F545C3E5459540E544953F503BF2
:101A5300AB41AA42A943854582854483120744FFCB
:101A6300E4FBFAC2B2EF1392B7EFC313FFD2B20B88
:101A7300BB00010AEB64084A70E9C2B220B002C39A
:0C1A8300220545E54570BE054480BAD33D
:011A8F002234
:101E180090E60174C0F0C2B67F967E00121DECD227
:081E2800B67F327E00021DECC2
:101EA300D2B1121DE6C2B1121DE8C2877F0A7E00BD
:031EB300021DEC21
:021B6400AB07CD
:101B6600E4F9FAEBC413131354011392B17F027E06
:101B760000121DECD2877F057E00121DECE925E0E0
:101B8600FFA283E4334FF97F057E00121DECEB259F
:0D1B9600E0FBC287121DE80ABA08C8AF01C3
:011BA300221F
:061A90008B538A548955B6
:101A9600A2AFE433F55B121EA3E4F55AE55AC395EB
:101AA600595027AB53AA54A955855A8275830012FB
:101AB6000744FF121B64AB56AA57A958855A82756C
:101AC6008300EF120783055A80D2120036E55B24A5
:031AD600FF92AFCD
:011AD90022EA
:0B003600C2B1121DE8121DE6D2B1227B
:100FDD00753F8F8F40755600755700755849755977
:0A0FED00027B007A00793F021A909F
:101C8700783F7C007D007BFF7A0F79F77E007F0528
:101C970012070530B41575560075570075583F750E
:101CA70059057B007A00793F121A90E5415401FFEC
:011CB700220A
:051EF1000300000000E9
:1011F50041E0370041E0B70042E0B2000041E0388D
:1012050000021BE0860218E07A43E0B40000004EBD
:10121500E03931303339354D502020202020200051
:101D9A008B518A528953E5561556AE557002155520
:101DAA004E6014AB510553E553AA52700205521402
:081DBA00F9ED12077180DF2230
:101BE5008B518A528953E5581558AE5770021557CF
:101BF5004E6026AB540556E556AA55700205551498
:101C0500F912072BFFAB510553E553AA5270020594
:0A1C15005214F9EF12077180CD227E
:101D7000C2B5C2B7E490E670F075B5E653B5EE4370
:101D8000B28053B2F4A2B53390E0B7F0C2B3C2B69A
:0A1D90007F327E00121E0AD2B62236
:101E6400538EF75389FB5389F74389015389FDE462
:071E7400F58AF58CD2A922CA
:1017B7008C428D43AA06A9077554018A5589567527
:1017C700570075581C7B017AE0794D121BE590E0B4
:1017D7004DE0B4C20374C0F090E065E0FCA3E0FD07
:1017E700A3E0FEA3E064D1FFEE648DFEED644CFD43
:1017F700EC6449FC90E06512084D7EE07F4D7D1C4E
:101807007C001213647EE07F4D7B1C7A00AD43ACF5
:10181700421214187D1C7C00AF43AE42120F367D76
:0A1827001C7C00AF43AE42021C55CA
:0818A9008E428F438C448D45F3
:1018B100C20712001290E15CEFF0BF5004D2078022
:1018C10057E490E15DF0A3F090E15DE0FEA3E0FF5D
:1018D100C39410EE648094805030E5452FF582E585
:1018E100443EF583E0FF90E15DE0FCA3E02543F594
:1018F10082E5423CF583E0B5071090E15EE004F03B
:1019010070C690E15DE004F080BE90E15DE070049E
:0A191100A3E064107002D207A207E1
:01191B0022A9
:020E0C008F3F16
:100E0E001200128F40E4F544F545AD45AC44121482
:100E1E00CE746A2545F582E434E0F583E541F005AC
:100E2E0045E54570020544C39408E544648094800A
:100E3E0040D8E53F600490E06AF090E06AE0B4C00C
:100E4E0008754200754308800675421D7543367558
:100E5E004400754508C3E5459410E54464809480CC
:100E6E0050231214CA746A2545F582E434E0F583E2
:100E7E00E541F00545E545700205440543E543703F
:100E8E00D4054280D07541FF75421D7543197544D6
:100E9E0000754510C3E545942CE54464809480505C
:100EAE0033E540B4510E7B007A007941AD43AC423C
:100EBE00FF1214D6746A2545F582E434E0F583E515
:100ECE0041F00545E545700205440543E54370C410
:100EDE00054280C075421D75433EE4F541F544F56B
:100EEE0045C3E5459406E54464809480502FE54063
:100EFE00B4510A90E06AE0B4C2031214CA744725D2
:100F0E0045F582E434E0F583E541F00545E54570AD
:100F1E000205440543E54370C8054280C490E06A6B
:070F2E00E0B4C20374C0F03F
:010F35002299
:0A1982008E428F438B448A4589464C
:10198C007E00E5432DF54BEE3542F54A1200128FE1
:10199C0047E5476451600BC3E5439410E54294005E
:1019AC005035854248854349C3E549954BE54895F3
:1019BC004A5024AB44AA45A946AD49AC48AF47129E
:1019CC0017340549E5497002054874012546F5466A
:0719DC00E43545F54580D11B
:0119E30022E1
:061831008B3F8A40894153
:10183700D2067554017555E075566A755700755887
:10184700107B017AE07996121BE5E5412410F9E453
:101857003540853F54F555895675570075580C7BAB
:10186700017AE079A6121BE57EE07F967CE07D1A7F
:101877001217B77EE07F1AE541241CF9E43540FCD6
:10188700AD011218A95016AB3FE5412410F9E43514
:1018970040FA7D1C7F197E1D1219828002C206A2A2
:0118A700063A
:0118A800221D
:101126007F03121D45EF2402FFE43EA907753F0128
:10113600F540894190E06BE0FFE50C2408F582E478
:10114600350BF583EFF090E06CE0FFE50C2409F534
:1011560082E4350BF583EFF090E06DE0FFE50C24BB
:101166000AF582E4350BF583EFF090E06EE0FFE5DB
:101176000C240BF582E4350BF583EFF090E06FE07D
:10118600FFE50C240CF582E4350BF583EFF090E0D7
:1011960070E0FFE50C240DF582E4350BF583EFF0E6
:1011A6007F087E00E4FDEDC394085028746A2FF58D
:1011B60082E434E0F583E0FCAB3FAA40A94175F038
:1011C60002EDA4F58285F083EC1207830D0FBF00B4
:1011D600010E80D2E5192404F582E43518F583E082
:0E11E60030E0047F0180027F0090E037EFF0E0
:0111F40022D8
:101B240090E06DE02FFFE50C240AF582E4350BF517
:101B340083EFF0E50C240BF582E4350BF583E0FE2E
:101B4400E50C240AF582E4350BF583E0FDEDFF9006
:101B5400E0B2EEF0A3EFF0D206121CBC90E680E0F7
:041B640054F7F02220
:1016140090E600E054E74410F090E60174C0F090C6
:10162400E6107420F000000090E611F00000009035
:10163400E6047480F0000000740FF0000000E4F091
:1016440000000090E6187410F0000000E490E61921
:10165400F000000090E61A7408F0000000E490E640
:101664001BF000000090E6497482F0000000F000D6
:10167400000090E6247402F0000000E490E625F0F7
:1016840000000090E6957480F0000000F000000077
:1016940043AF017B017AE07914755500755606E471
:0416A400FD021D9A8C
:061E0400D2877F0A7E0078
:101E0A007C007D181207A5EF1FAC0670011E4C70EE
:021E1A00F622AE
:0A1A3D008E3F8F408B418A4289439F
:101A4700E4F544F545C3E5459540E544953F503BEE
:101A5700AB41AA42A943854582854483120744FFC7
:101A6700E4FBFAC2B2EF1392B7EFC313FFD2B20B84
:101A7700BB00010AEB64084A70E9C2B220B002C396
:0C1A8700220545E54570BE054480BAD339
:011A93002230
:101E1C0090E60174C0F0C2B67F967E00121E0AD204
:081E2C00B67F327E00021E0A9F
:101EA700D2B1121E04C2B1121E06C2877F0A7E007B
:031EB700021E0AFE
:021B6800AB07C9
:101B6A00E4F9FAEBC413131354011392B17F027E02
:101B7A0000121E0AD2877F057E00121E0AE925E09E
:101B8A00FFA283E4334FF97F057E00121E0AEB257C
:0D1B9A00E0FBC287121E060ABA08C8AF01A0
:011BA700221B
:061A94008B538A548955B2
:101A9A00A2AFE433F55B121EA7E4F55AE55AC395E3
:101AAA00595027AB53AA54A955855A8275830012F7
:101ABA000744FF121B68AB56AA57A958855A827564
:101ACA008300EF120783055A80D2120036E55B24A1
:031ADA00FF92AFC9
:011ADD0022E6
:0B003600C2B1121E06121E04D2B1223D
:101DEA00753F8F8F4075560075570075584975595C
:0A1DFA00027B007A00793F021A9480
:101C8B00783F7C007D007BFF7A1E79F17E007F051B
:101C9B0012070530B41575560075570075583F750A
:101CAB0059057B007A00793F121A94E5415401FFE4
:011CBB002206
:100B4800753F007540007541007543017544E075B7
:100B580045007546017547E0754808E4FFF54F7B89
:100B6800017AE07900F554755508FD121D96AB43DE
:100B7800AA44A9457401120771E4F54EE54EC45420
:100B8800F0AB43AA44A94590000112078385465655
:100B9800854757854858755908121A90AB46AA4791
:100BA800A948900002120744FF530770EF24E06041
:100BB8001B24F0602A24F0603C24F0604E2440702E
:100BC80060753F018518408519418024E519240185
:100BD800FDE43518A905753F01F54089418011E507
:100BE800192402FDE43518A905753F01F54089412E
:100BF800754F088035E5192403FDE43518A90575F6
:100C08003F01F5408941754F04801FE5192405FD12
:100C1800E43518A905753F01F5408941754F98805D
:100C280009753F00754000754100E5404541453F65
:100C38006022AB3FAA40A94112072BFED3954F4033
:100C480006AD4FAE0580008E4212072BC3954212A7
:100C58000771800BEF70047E0180027E008E427463
:100C680049254EF8A642054EE54EC39405500302A9
:100C78000B84AB43AA44A9457488120771AB43E5BA
:100C8800452401F9E43544FA755300755400755547
:100C980049755600755705121BE185465685475715
:0F0CA800854858755908AB43AA44A945021A90CC
:1019E0008F3F90E0B6E0FEA3E054F064607003EE39
:1019F000641160037F012290E037E070037F0F22C3
:101A0000E53F7003308108E53FB401062080037F85
:101A1000102290E0BBE0B53F037F0122E4F511D234
:101A200006121CB8AF3F90E0BBEFF024FF92B590D8
:091A3000E680E054F7F07F00228B
:100B580045007546017547E0754808E4F54FFFF50F
:100B6800507B017AE07900F555755608FD121D9AFB
:100B7800AB43AA44A9457401120771E4F54EE54E4A
:100B8800C454F0AB43AA44A94590000112078385D9
:100B98004656854757854858755908121A94AB46E2
:100BA800AA47A948900002120744FE5403FFEE54D6
:100BB80070F54F24E0602924F0604B24F0605D2438
:100BC800F0606F24406003020C50753F01851840A7
:100BD800851941EF24FE600624FE703B801C801FAF
:100BE800E5192401FDE43518A905753F01F540898B
:100BF80041EF24FC60092402700A75500280527586
:100C08005006804D8011E5192402FDE43518A90528
:100C1800753F01F54089417550088035E519240371
:100C2800FDE43518A905753F01F540894175500463
:100C3800801FE5192405FDE43518A905753F01F560
:100C48004089417550988009753F0075400075418D
:100C580000E5404541453F6022AB3FAA40A941120B
:100C6800072BFED395504006AD50AE0580008E424E
:100C780012072BC39542120771800CE54F70047E52
:100C88000180027E008E427449254EF8A642054E28
:100C9800E54EC394055003020B86AB43AA44A9450D
:100CA8007488120771AB43E5452401F9E43544FA29
:100CB80075540075550075564975570075580512D5
:100CC8001BE5854656854757854858755908AB43EF
:070CD800AA44A945021A9489
:1019E4008F3F90E0B2E0FEA3E054F064607003EE39
:1019F400641160037F012290E037E070037F0F22BF
:101A0400E53F7003308108E53FB401062080037F81
:101A1400102290E0B7E0B53F037F0122E4F511D234
:101A240006121CBCAF3F90E0B7EFF024FF92B590D4
:091A3400E680E054F7F07F002287
:04000E0090FC04F06E
:1000120090E678E0541824F06008240870087F50B5
:0800220080067F518002E4FF1B
:01002A0022B3
:0C14C600AD43AC427B007A007941AF409E
:0C14D2008F468C478D488B498A4A894B15
:1014DE00E4F54CF54D754E03FDF54FF550A2AF33C7
:1014EE00F551E54624AF600D047012754C00754D34
:1014FE00017D018008754C00754D02E4FDE54660E6
:10150E0051E54D454C604BE54790E0B8F0E548A3FA
:10151E00F074B82DF582E434E0AD82FCAB4DAF46ED
:10152E00121918754F008F507F0A7E00121ADAE5D5
:10153E0050454F60107CE07D6D7B01AF4612156B00
:10154E00754F008F5090E06DE0AB49AA4AA94B123F
:0C155E000771E55124FF92AFAE4FAF5073
:01156A00225E
:0C1730008F4C8C4D8D4E8B4F8A50895190
:10173C00E4F552F553755403FDF555F556A2AF3348
:10174C00F557E54C24AF600D0470127552007553BB
:10175C00027D018008755200755303E4FDE54C6071
:10176C003BE55345526035E54D90E0B8F0E54EA3AE
:10177C00F0AB4FAA50A95112072B90E0BAF074B8F5
:10178C002DF582E434E0AD82FCAB53AF4C1219184A
:10179C007555008F567F0A7E00121ADAE55724FF22
:0617AC0092AFAE55AF56EE
:0117B2002214
:0C14CA00AD43AC427B007A007941AF409A
:0C14D6008F468C478D488B498A4A894B11
:1014E200E4F54CF54D754E03FDF54FF550A2AF33C3
:1014F200F551E54624AF600D047012754C00754D30
:10150200017D018008754C00754D02E4FDE54660E1
:1015120051E54D454C604BE54790E0B4F0E548A3FA
:10152200F074B42DF582E434E0AD82FCAB4DAF46ED
:1015320012191C754F008F507F0A7E00121ADEE5C9
:1015420050454F60107CE07D697B01AF4612156FFC
:10155200754F008F5090E069E0AB49AA4AA94B123F
:0C1562000771E55124FF92AFAE4FAF506F
:01156E00225A
:0C1734008F4C8C4D8D4E8B4F8A5089518C
:10174000E4F552F553755403FDF555F556A2AF3344
:10175000F557E54C24AF600D0470127552007553B7
:10176000027D018008755200755303E4FDE54C606D
:101770003BE55345526035E54D90E0B4F0E54EA3AE
:10178000F0AB4FAA50A95112072B90E0B6F074B4F9
:101790002DF582E434E0AD82FCAB53AF4C12191C42
:1017A0007555008F567F0A7E00121ADEE55724FF1A
:0617B00092AFAE55AF56EA
:0117B6002210
:10005600E4F531F532F535F53AF53BF53CF53DE598
:10006600AA5484600302063490E694E0FE90E69576
:10007600E0FBEEF53AEBF53BC39405E53A94004018
@@ -224,67 +226,67 @@
:1000B6004732045A3404A23504B93604D63703D578
:1000C6004503E647000005B475310075320790FC1C
:1000D600047481F0A37414F0E4A3F00205D77F0F33
:1000E600120FDD75310075320690FC047480F0E461
:1000E600121DEA75310075320690FC047480F0E446
:1000F600A3F0753505F511FE74002535F9EE34F4D7
:10010600FA7B0112182D400690FC05740EF0E4FFF0
:10011600120DE47F8F0202B37F0E120FDD753100E0
:10010600FA7B01121831400690FC05740EF0E4FFEC
:10011600120E0C7F8F0202B37F0E121DEA7531009C
:10012600753205748E12000E8F3D7B007A00793E83
:10013600E4FDFC1214D2E53D64516019E53D6450BE
:10013600E4FDFC1214D6E53D64516019E53D6450BA
:10014600601375310075320690FC047480F0A37458
:100156000BF00205D790E0BCE0FF120DE474002519
:1001660032F974FC3531FA7B01C0038B537554E0C8
:1001760075556E75560075572CD003121BE1742CFD
:100156000BF00205D790E0B8E0FF120E0C740025F4
:1001660032F974FC3531FA7B01C0038B547555E0C6
:1001760075566A75570075582CD003121BE5742CFA
:100186002532F532E43531F5317F8E0202B3753111
:100196000075320790FC047491F090E678E090FCCC
:1001A60005F030B4047F0180027F0090FC06EFF07A
:1001B60074002532F974FC3531FA7B0175540075EB
:1001C6005512E4FD121D9674002532F974FC353182
:1001D600FA7B01C0038B537554E07555397556008B
:1001E600755706D003121BE174062532F532E43545
:1001B60074002532F974FC3531FA7B0175550075EA
:1001C6005612E4FD121D9A74002532F974FC35317D
:1001D600FA7B01C0038B547555E075563975570087
:1001E600755806D003121BE574062532F532E43540
:1001F60031F531FE74002532F974FC3EFA7B01C0FC
:10020600038B537554E0755514755600755706D013
:1002160003121BE174062532F532E43531F531FE61
:1002260074002532F974FC3EFA7B01C0038B5375CA
:1002360054E075554B755600755706D003121BE1F1
:10020600038B547555E0755614755700755806D00E
:1002160003121BE574062532F532E43531F531FE5D
:1002260074002532F974FC3EFA7B01C0038B5475C9
:1002360055E0755647755700755806D003121BE5ED
:1002460074062532F532E43531F5310205D77F13D0
:10025600120FDD75310075321D749312000E8F3D3D
:10025600121DEA75310075321D749312000E8F3D22
:1002660075381D753900753600753705D3E539942F
:1002760018E538941D5034E53DB4510E7B007A00E4
:10028600793EAD39AC38FF1214D274002537F582A9
:10028600793EAD39AC38FF1214D674002537F582A5
:1002960074FC3536F583E53EF00539E5397002051F
:1002A600380537E53770C5053680C17F93120FDDF7
:1002A600380537E53770C5053680C17F93121DEADC
:1002B6000205D775310075320690FC047480F0E4AF
:1002C600A3F090F405E090E038F0E014702A30B026
:1002D6001E121E187553017554F475550675560091
:1002E6007557067B017AE07914121BE10205D79057
:1002D6001E121E1C7554017555F475560675570089
:1002E6007558067B017AE07914121BE50205D79052
:1002F600FC057401F00203C08056753100753206A4
:1003060090FC047480F0E4A3F0753507AF35FEC3A6
:10031600E53B9FF534E53A9EF53390E038E01470FE
:100326002F20B00330B42074002FF974F43EFA7B0A
:1003360001AF34AE33121A395004E40204B290FC11
:1003360001AF34AE33121A3D5004E40204B290FC0D
:1003460005740CF00205D790FC057402F00205D77F
:1003560090FC057403F00205D775310075320690DE
:10036600FC047480F0E4A3F090E038E014704530AB
:10037600B43A90E6017403F07F647E00121DEC909F
:10038600E0BCE0FF120DE47EE07F6E7CE07DBD12F6
:1003960017B37EE07FBDAD1CAC1B1218A55005122D
:10037600B43A90E6017403F07F647E00121E0A9080
:10038600E0B8E0FF120E0C7EE07F6A7CE07DB912D9
:1003960017B77EE07FB9AD1CAC1B1218A950051229
:1003A6000B48801690FC05740EF0800E90FC0574C8
:1003B6000DF0800690FC057403F0E490E038F0023E
:1003C60005D7E4F531F5327F02121B200205D7E48A
:1003D600FF120DE4120F0EE4FF1219E0E4FF800293
:1003E6007F01121B20121E180205D77531007532C7
:1003C60005D7E4F531F5327F02121B240205D7E486
:1003D600FF120E0C121126E4FF1219E4E4FF80024C
:1003E6007F01121B24121E1C0205D77531007532BF
:1003F6000690FC047480F0E4A3F090F405E0F53C6C
:10040600E4F511E53C64016004E53C703290E0B629
:10040600E4F511E53C64016004E53C703290E0B22D
:10041600E0FEA3E054F064607003EE6411600280B5
:100426007290E037E070028058E5116401600AE5D9
:1004360011700C121C87EF6006853C110205D780EF
:1004360011700C121C8BEF6006853C110205D780EB
:100446005275310075320690FC0474B2F0A3E511C2
:10045600F00205D775310075320690FC047480F001
:10046600E4A3F090F405E0F53CFF1219E0EF24F167
:10046600E4A3F090F405E0F53CFF1219E4EF24F163
:10047600600F1460152410701AE4F531F532020588
:10048600D790FC05740FF00205D790FC057410F0A8
:100496000205D790FC057401F00205D77531007589
:1004A600320690FC0474B5F090E0BBE090FC05F0D9
:1004A600320690FC0474B5F090E0B7E090FC05F0DD
:1004B6000205D775310075320690FC0474B6F0A2B9
:1004C60080E43325E0FFA281E4334FA3F00205D791
:1004D600853A31853B3290FC0474B7F0753505C317
@@ -292,11 +294,11 @@
:1004F600F582E434F4F583E0648870030205D7AF2F
:10050600357E0074002FF9EE34F4FA7B01C003C087
:100516000174002FF9EE34FC8B56F5578958853453
:1005260059D001D003121A900205D77531007532E1
:1005260059D001D003121A940205D77531007532DD
:100536000590FC0474A5F01200128F3D7B007A0032
:10054600793EE4FDFC1214D290E036E0FF0532E578
:10054600793EE4FDFC1214D690E036E0FF0532E574
:1005560032AC3170020531142400F58274FC3CF58E
:1005660083EFF090E0BCE0FF0532E532AC3170027B
:1005660083EFF090E0B8E0FF0532E532AC3170027F
:100576000531142400F58274FC3CF583EFF0053256
:10058600E532AE3170020531142400F58274FC3E6A
:10059600F583E53EF00532E532AE317002053114E1
@@ -312,66 +314,66 @@
:0106340022A3
:02004100D322C8
:0800030090E6BAE0F51DD322DE
:101EC90090E740E51DF0E490E68AF090E68B04F097
:021ED900D32212
:101ECD0090E740E51DF0E490E68AF090E68B04F093
:021EDD00D3220E
:08002B0090E6BAE0F51AD322B9
:101EDB0090E740E51AF0E490E68AF090E68B04F088
:021EEB00D32200
:101DBE0090E6B9E0242F600D04701990E604E0FF60
:101DCE00430780800890E604E0FF53077F00000081
:071DDE00EFF08002D322C3E5
:011DE50022DB
:101E3000C0E0C083C082D2015391EF90E65D74018F
:081E4000F0D082D083D0E03223
:101E7700C0E0C083C0825391EF90E65D7404F0D058
:061E870082D083D0E0329E
:101E8D00C0E0C083C0825391EF90E65D7402F0D044
:061E9D0082D083D0E03288
:101C1B00C0E0C083C08285120D85130E850E8285B0
:101C2B000D83A37402F085090F850A108510828538
:101C3B000F83A37407F05391EF90E65D7410F0D00F
:061C4B0082D083D0E032DC
:101E4800C0E0C083C082D2035391EF90E65D74086E
:081E5800F0D082D083D0E0320B
:101BA400C0E0C083C08290E680E030E72085090D64
:101BB400850A0E850E82850D83A37402F085120FAB
:101BC400851310851082850F83A37407F05391EF5A
:0D1BD40090E65D7420F0D082D083D0E03226
:101EB600000102020303040405050300000000C03C
:031EC600C2000057
:06122100011100010800AC
:03000B000212AC32
:1012AC00C0E0C0F0C083C082C0D075D000C000C008
:0D12BC0001C002C003C004C005C006C00789
:1012C90078217C007D007BFF7A1E79C07E007F0536
:1012D90012070590E0BBE0F526C204752700E50872
:1012E900600415088056750805E5117004C204806C
:1012F90043A280308101B3500B3081047F008030DC
:101309007F01802C30B4157556007557007558212A
:101319007559057B007A007921121A90E523540149
:10132900F527701090E0BBE060047F0080027F0128
:0C1339008F26D204300405AF261219E004
:10134500D007D006D005D004D003D002D001D000FC
:0B135500D0D0D082D083D0F0D0E032A6
:100CB700785B7CE17D017BFF7A1E79C57E007F042E
:100CC700120705C203C200D202C201121D6C121E16
:100CD70060121610750B10750C007514107515122F
:100CE700750910750A1C75121075137085120F851A
:100CF70013107516107517B412001290E159EFF022
:100D07007B017AE1795AE4FDFC1214D290E15AE0B2
:100D1700FF90E036F0E490E0BCF0EF64C26059EF7A
:100D270064C06054E490E15FF090E15FE0FFC3943A
:100D370004504A745B2FF582E434E1F583E0FF60E9
:100D47003C120DE47EE07F6E7CE07DBD1217B37E22
:100D5700E07FBDAD1CAC1B1218A5501490E15FE0FD
:100D6700245BF582E434E1F583E090E0BCF0800D8C
:100D770090E15FE004F080B1E4FF120DE4120F0E82
:100D8700D2E843D82090E668E04409F090E65CE0BA
:100D9700443DF012001290E159EFF07B017AE179BE
:100DA7005AE4FDFC1214D290E15AE064C26007E4F1
:100DB70090E0BBF0C2B57F01121B20D2AFD28C539B
:100DC7008EF8C203C2AF120056D2AF300105120926
:0D0DD70020C2013003EEC203121D1580E79B
:101EDF0090E740E51AF0E490E68AF090E68B04F084
:021EEF00D322FC
:101DC20090E6B9E0242F600D04701990E604E0FF5C
:101DD200430780800890E604E0FF53077F0000007D
:071DE200EFF08002D322C3E1
:011DE90022D7
:101E3400C0E0C083C082D2015391EF90E65D74018B
:081E4400F0D082D083D0E0321F
:101E7B00C0E0C083C0825391EF90E65D7404F0D054
:061E8B0082D083D0E0329A
:101E9100C0E0C083C0825391EF90E65D7402F0D040
:061EA10082D083D0E03284
:101C1F00C0E0C083C08285120D85130E850E8285AC
:101C2F000D83A37402F085090F850A108510828534
:101C3F000F83A37407F05391EF90E65D7410F0D00B
:061C4F0082D083D0E032D8
:101E4C00C0E0C083C082D2035391EF90E65D74086A
:081E5C00F0D082D083D0E03207
:101BA800C0E0C083C08290E680E030E72085090D60
:101BB800850A0E850E82850D83A37402F085120FA7
:101BC800851310851082850F83A37407F05391EF56
:0D1BD80090E65D7420F0D082D083D0E03222
:101EBA00000102020303040405050300000000C038
:031ECA00C2000053
:06122500011100010800A8
:03000B000212B02E
:1012B000C0E0C0F0C083C082C0D075D000C000C004
:0D12C00001C002C003C004C005C006C00785
:1012CD0078217C007D007BFF7A1E79C47E007F052E
:1012DD0012070590E0B7E0F526C204752700E50872
:1012ED00600415088056750805E5117004C2048068
:1012FD0043A280308101B3500B3081047F008030D8
:10130D007F01802C30B41575560075570075582126
:10131D007559057B007A007921121A94E523540141
:10132D00F527701090E0B7E060047F0080027F0128
:0C133D008F26D204300405AF261219E4FC
:10134900D007D006D005D004D003D002D001D000F8
:0B135900D0D0D082D083D0F0D0E032A2
:100CDF0078577CE17D017BFF7A1E79C97E007F0406
:100CEF00120705C203C200D202C201121D70121EEA
:100CFF0064121614750B10750C00751410751512FF
:100D0F00750910750A1C75121075137085120F85F1
:100D1F0013107516107517B412001290E155EFF0FD
:100D2F007B017AE17956E4FDFC1214D690E156E08E
:100D3F00FF90E036F0E490E0B8F0EF64C26059EF56
:100D4F0064C06054E490E15BF090E15BE0FFC3941A
:100D5F0004504A74572FF582E434E1F583E0FF60C5
:100D6F003C120E0C7EE07F6A7CE07DB91217B77ED5
:100D7F00E07FB9AD1CAC1B1218A9501490E15BE0D9
:100D8F002457F582E434E1F583E090E0B8F0800D6C
:100D9F0090E15BE004F080B1E4FF120E0C1211261B
:100DAF00D2E843D82090E668E04409F090E65CE092
:100DBF00443DF012001290E155EFF07B017AE1799A
:100DCF0056E4FDFC1214D690E156E064C26007E4CD
:100DDF0090E0B7F0C2B57F01121B24D2AFD28C5373
:100DEF008EF8C203C2AF120056D2AF3001051209FE
:0D0DFF0020C2013003EEC203121D1980E76F
:0B00460090E50DE030E402C322D3225D
:1009200090E6B9E070030209E5147003020A5A2444
:10093000FE7003020AD524FB70030209DF14700362
@@ -381,22 +383,22 @@
:1009700024067056E50B90E6B3F0E50C80421200B9
:10098000465044E51490E6B3F0E5158033E50D904C
:10099000E6B3F0E50E802985120F851310E50F9060
:1009A000E6B3F0E510801990E6BAE0FF121D41AA07
:1009A000E6B3F0E510801990E6BAE0FF121D45AA03
:1009B00006A9077B01EA494B600DEE90E6B3F0EF24
:1009C00090E6B4F0020B40020B2F020B2F121EDB3D
:1009C00090E6B4F0020B40020B2F020B2F121EDF39
:1009D000020B4012002B020B40120003020B4012CC
:1009E0001EC9020B4090E6B8E0247F601514601920
:1009E0001ECD020B4090E6B8E0247F60151460191C
:1009F00024027063A200E43325E0FFA202E4334F37
:100A00008041E490E740F0803F90E6BCE0547EFFF8
:100A10007E00E0D394807C0040047D0180027D0054
:100A2000EC4EFEED4F24B6F582741E3EF583E49342
:100A2000EC4EFEED4F24BAF582741E3EF583E4933E
:100A3000FF3395E0FEEF24A1FFEE34E68F82F583CD
:100A4000E0540190E740F0E4A3F090E68AF090E6ED
:100A50008B7402F0020B40020B2F90E6B8E024FEEC
:100A6000601624026003020B4090E6BAE0B4010570
:100A7000C200020B40020B2F90E6BAE0705590E6E0
:100A8000BCE0547EFF7E00E0D394807C0040047D77
:100A90000180027D00EC4EFEED4F24B6F582741EFF
:100A90000180027D00EC4EFEED4F24BAF582741EFB
:100AA0003EF583E493FF3395E0FEEF24A1FFEE349F
:100AB000E68F82F583E054FEF090E6BCE0548013AC
:100AC0001313541FFFE0540F2F90E683F0E04420EF
@@ -404,110 +406,110 @@
:100AE0004E90E6BAE0B40104D200805490E6BAE039
:100AF0006402604C803990E6BCE0547EFF7E00E0EA
:100B0000D394807C0040047D0180027D00EC4EFE89
:100B1000ED4F24B6F582741E3EF583E493FF3395C2
:100B1000ED4F24BAF582741E3EF583E493FF3395BE
:100B2000E0FEEF24A1FFEE34E68F82F583800D9086
:100B3000E6A08008121DBE500790E6A0E04401F038
:100B3000E6A08008121DC2500790E6A0E04401F034
:070B400090E6A0E04480F004
:010B4700228B
:03003300020FFCBD
:040FFC0053D8EF32A5
:101227006080E0D9292E43C9A2D87C013D3654A15C
:10123700ECF0061362A705F3C0C7738C98932BD9FC
:10124700BC4C82CA1E9B573CFDD4E01667426F1800
:101257008A17E512BE4EC4D6DA9EDE49A0FBF58E8C
:10126700BB2FEE7AA968799115B2073F94C210890E
:101277000B225F21807F5D9A5A903227353ECCE75B
:10128700BFF79703FF1930B348A5B5D1D75E922AA8
:10129700AC56AAC64FB838D296A47DB676FC6BE298
:0412A7009C7404F13E
:081360008C448D45AB07AA0681
:10136800E4F546F547C3E5479545E5446480F8E567
:1013780046648098400302140FE54725E0FFE546E0
:1013880033FE74D92FF58274E03EF583E0FF7E00CA
:10139800AC44AD451207B78C488D49E54725E0FFB9
:1013A800E54633FE74DA2FF58274E03EF583E0FFFC
:1013B8007E00AC44AD451207B78C4A8D4BE54965B4
:1013C8004B7004E548654A6030EB2549F582EA35FB
:1013D80048F583E0F9EB254BF582EA354AF583E0D9
:1013E800FFEB2549F582EA3548F583EFF0EB254B0D
:1013F800F582EA354AF583E9F00547E547600302D7
:0B140800136D054602136D7E007F018E
:0114130022B6
:0C1414008E448F458C468D478A488B49DA
:10142000E54545446006E54745467004E4FEFF2275
:10143000E4F54AF54BC3E54B9549E5486480F8E58A
:101440004A648098507BE4F54CF54DE547254BF513
:1014500082E546354AF583E4F0C3E54D9549E54814
:101460006480F8E54C6480985049E54D254B24D9BB
:10147000F582E434E0F583E0FFE545254DF582E5AE
:1014800044354CF583E0FEEF8EF0A4FFE547254B95
:10149000F582E546354AF583E02FFFE547254BF514
:1014A00082E546354AF583EFF0054DE54D70AA0516
:1014B0004C80A6054BE54B6003021435054A021427
:0514C000357E007F01F4
:0114C5002204
:101CE70012072BFF9000031207441207719000039D
:101CF700EF120783900002120744FF9000011207BA
:0E1D070044900002120783900001EF02078350
:081126008E448F458C468D4775
:10112E00E4F548F549E547AE467802CEA2E713CE80
:10113E0013D8F8FFC3E5499FEE6480F8E548648054
:10114E009840030211E8E549AE487802C333CE3326
:10115E00CED8F92545FFEE3544FAA9077B018B4A17
:10116E00F54B894C74DA2549F582E434E0F583E0D9
:10117E00541FFFE48F50F54FF54EF54D121CE7ABA3
:10118E004AAA4BA94C120813C374209550F9F812B1
:10119E000800C004C005C006C007A94C120813A958
:1011AE0050A8011207EDD003D002D001D000EF4BB2
:1011BE00FFEE4AFEED49FDEC48FCAB4AAA4BA94CAA
:1011CE00120833AB4AAA4BA94C121CE70549E54954
:0E11DE00600302113305480211337E007F01C9
:0111EC0022E0
:101C5100D3ED9410EC64809480402AED1D70011C3A
:101C6100142FF582EE3CF583E0FB547F24D9F582F5
:101C7100E434E0F583E0F9540F2FF582E43EF58377
:051C8100E06BF080CBD8
:011C8600223B
:101D150090E682E030E004E020E60B90E682E030D9
:101D2500E119E030E71590E680E04401F07F147E8C
:0C1D350000121ADA90E680E054FEF02262
:101CB80030060990E680E0440AF0800790E680E06C
:101CC8004408F07FDC7E05121ADA90E65D74FFF0B6
:0F1CD80090E65FF05391EF90E680E054F7F02232
:101ADA008E588F5990E600E054187012E559240187
:101AEA00FFE43558C313F558EF13F559801590E6FE
:101AFA0000E05418FFBF100BE55925E0F559E558E9
:101B0A0033F558E5591559AE58700215584E600507
:061B1A00121EED80EE2218
:06156B008C528D53AE0707
:10157100EB70037F012290E678E020E6F990E678AF
:101581007480F0EE25E0440190E679F090E678E091
:1015910030E0F990E678E020E26BE030E167BB01F2
:1015A1000790E678E04420F090E679E0F5541BEBF3
:1015B100603090E678E030E0F990E678E020E245AE
:1015C100BB010790E678E04420F090E679E0FF0562
:1015D10053E553AC527002055214F5828C83EFF03F
:1015E10080CC90E678E030E0F990E678E020E215F2
:1015F10090E678E04440F090E679E08553828552A8
:0E16010083F07F012290E678E04440F07F0005
:01160F0022B8
:1019180090E678E020E6F990E6787480F0EF25E02C
:1019280090E679F090E678E030E0F990E678E0200B
:10193800E23AE030E136EBD3940040260DEDAE04F8
:1019480070010C14F5828E83E090E679F01B90E626
:1019580078E030E0F990E678E020E210E020E1D687
:10196800800A90E678E04440F07F012290E678E033
:051978004440F07F0077
:01197D002247
:021D4100A907F0
:101D4300AE16AF178F828E83A3E064037017AD01C5
:101D530019ED7001228F828E83E07C002FFDEC3E13
:081D6300FEAF0580DFE4FEFF86
:011D6B002255
:101EED007400F58690FDA57C05A3E582458370F908
:011EFD0022C2
:030000000216A441
:0C16A400787FE4F6D8FD75815B0216EB40
:03003300021EF6B4
:041EF60053D8EF329C
:10122B006080E0D5292E43C9A2D87C013D3654A15C
:10123B00ECF0061362A705F3C0C7738C98932BD9F8
:10124B00BC4C82CA1E9B573CFDD4E01667426F18FC
:10125B008A17E512BE4EC4D6DA9EDE49A0FBF58E88
:10126B00BB2FEE7AA968799115B2073F94C210890A
:10127B000B225F21807F5D9A5A903227353ECCE757
:10128B00BFF79703FF1930B348A5B5D1D75E922AA4
:10129B00AC56AAC64FB838D296A47DB676FC6BE294
:0412AB009C7404F13A
:081364008C448D45AB07AA067D
:10136C00E4F546F547C3E5479545E5446480F8E563
:10137C00466480984003021413E54725E0FFE546D8
:10138C0033FE74D52FF58274E03EF583E0FF7E00CA
:10139C00AC44AD451207B78C488D49E54725E0FFB5
:1013AC00E54633FE74D62FF58274E03EF583E0FFFC
:1013BC007E00AC44AD451207B78C4A8D4BE54965B0
:1013CC004B7004E548654A6030EB2549F582EA35F7
:1013DC0048F583E0F9EB254BF582EA354AF583E0D5
:1013EC00FFEB2549F582EA3548F583EFF0EB254B09
:1013FC00F582EA354AF583E9F00547E547600302D3
:0B140C00137105460213717E007F0182
:0114170022B2
:0C1418008E448F458C468D478A488B49D6
:10142400E54545446006E54745467004E4FEFF2271
:10143400E4F54AF54BC3E54B9549E5486480F8E586
:101444004A648098507BE4F54CF54DE547254BF50F
:1014540082E546354AF583E4F0C3E54D9549E54810
:101464006480F8E54C6480985049E54D254B24D5BB
:10147400F582E434E0F583E0FFE545254DF582E5AA
:1014840044354CF583E0FEEF8EF0A4FFE547254B91
:10149400F582E546354AF583E02FFFE547254BF510
:1014A40082E546354AF583EFF0054DE54D70AA0512
:1014B4004C80A6054BE54B6003021439054A02141F
:0514C400397E007F01EC
:0114C9002200
:101CEB0012072BFF90000312074412077190000399
:101CFB00EF120783900002120744FF9000011207B6
:0E1D0B0044900002120783900001EF0207834C
:080F36008E448F458C468D4767
:100F3E00E4F548F549E547AE467802CEA2E713CE72
:100F4E0013D8F8FFC3E5499FEE6480F8E548648046
:100F5E00984003020FF8E549AE487802C333CE330A
:100F6E00CED8F92545FFEE3544FAA9077B018B4A09
:100F7E00F54B894C74D62549F582E434E0F583E0CF
:100F8E00541FFFE48F50F54FF54EF54D121CEBAB91
:100F9E004AAA4BA94C120813C374209550F9F812A3
:100FAE000800C004C005C006C007A94C120813A94A
:100FBE0050A8011207EDD003D002D001D000EF4BA4
:100FCE00FFEE4AFEED49FDEC48FCAB4AAA4BA94C9C
:100FDE00120833AB4AAA4BA94C121CEB0549E54942
:0E0FEE006003020F430548020F437E007F019F
:010FFC0022D2
:101C5500D3ED9410EC64809480402AED1D70011C36
:101C6500142FF582EE3CF583E0FB547F24D5F582F5
:101C7500E434E0F583E0F9540F2FF582E43EF58373
:051C8500E06BF080CBD4
:011C8A002237
:101D190090E682E030E004E020E60B90E682E030D5
:101D2900E119E030E71590E680E04401F07F147E88
:0C1D390000121ADE90E680E054FEF0225A
:101CBC0030060990E680E0440AF0800790E680E068
:101CCC004408F07FDC7E05121ADE90E65D74FFF0AE
:0F1CDC0090E65FF05391EF90E680E054F7F0222E
:101ADE008E588F5990E600E054187012E559240183
:101AEE00FFE43558C313F558EF13F559801590E6FA
:101AFE0000E05418FFBF100BE55925E0F559E558E5
:101B0E0033F558E5591559AE58700215584E600503
:061B1E00121F1880EE22E8
:06156F008C528D53AE0703
:10157500EB70037F012290E678E020E6F990E678AB
:101585007480F0EE25E0440190E679F090E678E08D
:1015950030E0F990E678E020E26BE030E167BB01EE
:1015A5000790E678E04420F090E679E0F5541BEBEF
:1015B500603090E678E030E0F990E678E020E245AA
:1015C500BB010790E678E04420F090E679E0FF055E
:1015D50053E553AC527002055214F5828C83EFF03B
:1015E50080CC90E678E030E0F990E678E020E215EE
:1015F50090E678E04440F090E679E08553828552A4
:0E16050083F07F012290E678E04440F07F0001
:0116130022B4
:10191C0090E678E020E6F990E6787480F0EF25E028
:10192C0090E679F090E678E030E0F990E678E02007
:10193C00E23AE030E136EBD3940040260DEDAE04F4
:10194C0070010C14F5828E83E090E679F01B90E622
:10195C0078E030E0F990E678E020E210E020E1D683
:10196C00800A90E678E04440F07F012290E678E02F
:05197C004440F07F0073
:011981002243
:021D4500A907EC
:101D4700AE16AF178F828E83A3E064037017AD01C1
:101D570019ED7001228F828E83E07C002FFDEC3E0F
:081D6700FEAF0580DFE4FEFF82
:011D6F002251
:101F18007400F58690FDA57C05A3E582458370F9DC
:011F28002296
:030000000216A83D
:0C16A800787FE4F6D8FD75815B0216EF38
:10063500E709F608DFFA8046E709F208DFFA803EA7
:1006450088828C83E709F0A3DFFA8032E309F60894
:10065500DFFA8078E309F208DFFA807088828C83FC
@@ -552,15 +554,15 @@
:10085900D083D082F8E4937012740193700DA3A32E
:1008690093F8740193F5828883E473740293686042
:06087900EFA3A3A380DF42
:1016B000020CB7E493A3F8E493A34003F68001F28D
:1016C00008DFF48029E493A3F85407240CC8C3333B
:1016D000C4540F4420C8834004F456800146F6DF0A
:1016E000E4800B01020408102040809011EDE47E9C
:1016F000019360BCA3FF543F30E509541FFEE493FF
:10170000A360010ECF54C025E060A840B8E493A3C5
:10171000FAE493A3F8E493A3C8C582C8CAC583CAF0
:10172000F0A3C8C582C8CAC583CADFE9DEE780BEA8
:0112AB000042
:1016B400020CDFE493A3F8E493A34003F68001F261
:1016C40008DFF48029E493A3F85407240CC8C33337
:1016D400C4540F4420C8834004F456800146F6DF06
:1016E400E4800B01020408102040809011F5E47E90
:1016F400019360BCA3FF543F30E509541FFEE493FB
:10170400A360010ECF54C025E060A840B8E493A3C1
:10171400FAE493A3F8E493A3C8C582C8CAC583CAEC
:10172400F0A3C8C582C8CAC583CADFE9DEE780BEA4
:0112AF00003E
:10087F00BC000BBE0029EF8DF084FFADF022E4CC5D
:10088F00F875F008EF2FFFEE33FEEC33FCEE9DEC26
:10089F00984005FCEE9DFE0FD5F0E9E4CEFD22ED6C
@@ -574,4 +576,3 @@
:0C090800ECF608EDF608EEF608EFF6221B
:0C091400ECF208EDF208EEF208EFF2221F
:00000001FF


View File

@@ -0,0 +1,421 @@
#
# $Id: USB_RECOV.hex 9760 2011-09-05 12:33:27Z dima $
#
:03004300021600A2
:0300530002160092
:10160000021580000215C6000215B00002159800F0
:081610000213F20002137B003B
:100A00001201000200000040AAAAAAAAAAAA010292
:100A100003010A060002000000400100090237003D
:100A2000020100C0000904000002FFFFFF040705E7
:100A3000020200020007058602000200090401000C
:100A400002FFFFFF050705040200020007058802F8
:100A5000000200001201000200000040E4E4511115
:100A60000000010203010A0600020000004001002C
:100A700009023700020100C0320904000002FFFF32
:100A8000FF0407050202400000070586024000003F
:100A90000904010002FFFFFF0507050402400000F2
:100AA000070588024000000604001600140012002A
:100AB0000A00260004030904160358006F007200A0
:100AC00063006F006D0020004C00540044001403CC
:100AD00041007300740072006900620061006E00E2
:100AE0006B001203530065007200690061006C0026
:100AF0004E006F000A0346005000470041002603E5
:100B00004D0061006E00610067006D0065006E00C1
:100B10007400500072006F00630065007300730082
:060B20006F0072000000EE
:08164300584F52434F4D2000A7
:100E650041E0B20042E0AD0000021BE0810218E063
:100E75007543E0AF0000004CE036393734364D207D
:060E8500202020202000C7
:101517008B2A8A2B892CE52F152FAE2E7002152EBC
:101527004E6014AB2A052CE52CAA2B7002052B1450
:08153700F9ED12019280DF22A0
:1013B8008B328A338934E5391539AE3870021538DD
:1013C8004E6026AB350537E537AA36700205361468
:1013D800F912014CFFAB320534E534AA337002052B
:0A13E8003314F9EF12019280CD22B8
:1011FD008C2A8D2BAA06A9077535018A3689377574
:10120D00380075391C7B017AE079481213B890E0EB
:10121D0060E0FCA3E0FDA3E0FEA3E064D1FFEE647B
:10122D008DFEED644CFDEC6449FC90E06012026EA5
:10123D007EE07F487D1C7C00120CFF7EE07F487BAA
:10124D001C7A00AD2BAC2A120DB37D1C7C00AF2B8C
:10125D00AE2A120C387D1C7C00AF2BAE2A0214284E
:08099F008E2A8F2B8C2C8D2D6C
:1009A700C204121567BF5004D204803BE4F52EF54C
:1009B7002FE52D252FF582E52C352EF583E0FFE574
:1009C7002B252FF582E52A352EF583E0B5070E0591
:1009D7002FE52F7002052E6410452E70D4E52F6485
:0909E70010452E7002D204A20496
:0109F00022E4
:020875008F32C0
:100877001215678F33E4F537F538AD38AC37120FFB
:100887001474652538F582E434E0F583E534F00522
:1008970038E53870020537C39408E53764809480DB
:1008A70040D8E532600490E065F090E065E0B4C0C0
:1008B70008753500753608800675351D7536367529
:1008C7003700753808C3E5389410E537648094809D
:1008D7005023120F1074652538F582E434E0F58350
:1008E700E534F00538E538700205370536E536702A
:1008F700D4053580D07534FF75351D7536197537B4
:1009070000753810C3E538942CE53764809480501F
:1009170033E533B4510E7B007A007934AD36AC350C
:10092700FF120F1C74652538F582E434E0F583E582
:1009370034F00538E538700205370536E53670C4FA
:10094700053580C075351D75363EE4F534F537F548
:1009570038C3E5389406E53764809480502FE53333
:10096700B4510A90E065E0B4C203120F1074422537
:1009770038F582E434E0F583E534F00538E538707E
:100987000205370536E53670C8053580C490E06541
:07099700E0B4C20374C0F0DC
:01099E002236
:0A12D3008E2A8F2B8B2C8A2D892E7A
:1012DD007E00E52B2DF533EE352AF5321215678F8D
:1012ED002FE52F6451600BC3E52B9410E52A940074
:1012FD005035852A30852B31C3E5319533E5309551
:10130D00325024AB2CAA2DA92EAD31AC30AF2F12FB
:10131D00117A0531E531700205307401252EF52E57
:07132D00E4352DF52D80D100
:011334002296
:020B26008F320C
:100B28007F031214ECEF2402FFE43EA9077533019A
:100B3800F534893578367C007D007BFF7A16794359
:100B48007E007F08120126E532600464017054E5D6
:100B58000C2408F582E4350BF58374B4F0E50C2415
:100B680009F582E4350BF5837404F0E50C240AF5E5
:100B780082E4350BF5837413F0E50C240BF582E45D
:100B8800350BF5837486F0E50C240CF582E4350BFF
:100B9800F583E4F0E50C240DF582E4350BF583E4E8
:100BA800F0806C90E066E0FFE50C2408F582E435FF
:100BB8000BF583EFF090E067E0FFE50C2409F58280
:100BC800E4350BF583EFF090E068E0FFE50C240ACC
:100BD800F582E4350BF583EFF090E069E0FFE50C72
:100BE800240BF582E4350BF583EFF090E06AE0FF23
:100BF800E50C240CF582E4350BF583EFF090E06BFF
:100C0800E0FFE50C240DF582E4350BF583EFF0E405
:100C1800FF74362FF8E6FEAB33AA34A93575F00217
:0F0C2800EFA4F58285F083EE1201A40FBF08E25E
:010C3700229A
:10145E00E4F532E50C240BF582E4350BF583E0FE62
:10146E00E50C240AF582E4350BF583E0FDEDFF90E3
:10147E00E0ADEEF0A3EFF0D20412000390E680E0B0
:03148E0054F7F020
:011491002238
:10105A0090E600E054E74410F090E60174C0F09086
:10106A00E6107420F000000090E611F000000090F5
:10107A00E6047480F0000000740FF0000000E4F051
:10108A0000000090E6187410F0000000E490E619E1
:10109A00F000000090E61A7408F0000000E490E600
:1010AA001BF000000090E6497482F0000000F00096
:1010BA00000090E6247402F0000000E490E625F0B7
:1010CA0000000090E6957480F0000000F000000037
:1010DA0043AF017B017AE07914752E00752F06E47F
:0410EA00FD021517D7
:1015DC007C007D181201C6EF1FAC0670011E4C700A
:0215EC00F622E5
:1015670090E678E0541824F06008240870087F504B
:0815770080067F518002E4FFB1
:01157F002249
:0C0F1000AD36AC357B007A007934AF338D
:0C0F1C008F398C3A8D3B8B3C8A3D893E1E
:100F2800E4F53FF540754103FDF542F543A2AF33C3
:100F3800F544E53924AF600D047012753F00754023
:100F4800017D018008753F00754002E4FDE53960C8
:100F580051E540453F604BE53A90E0AFF0E53BA3F3
:100F6800F074AF2DF582E434E0AD82FCAB40AF39CC
:100F780012126D7542008F437F0A7E00121335E509
:100F880043454260107CE07D647B01AF39120FB5A8
:100F98007542008F4390E064E0AB3CAA3DA93E1245
:0C0FA8000192E54424FF92AFAE42AF433B
:010FB400221A
:0C117A008F348C358D368B378A388939DC
:10118600E4F53AF53B753C03FDF53DF53EA2AF337C
:10119600F53FE53424AF600D047012753A00753BD7
:1011A600027D018008753A00753B03E4FDE5346075
:1011B6003BE53B453A6035E53590E0AFF0E536A3D3
:1011C600F0AB37AA38A93912014C90E0B1F074AFF0
:1011D6002DF582E434E0AD82FCAB3BAF3412126DE8
:1011E600753D008F3E7F0A7E00121335E53F24FFD2
:0611F60092AFAE3DAF3EDA
:0111FC0022D0
:10054300E4F52AF52BF52CF52DF52EF52FF530E5F1
:10055300AA5484600302071190E694E0FE90E695A6
:10056300E0FBEEF52DEBF52EC39405E52D9400404D
:100573000790F404E0FD80027DFFED24F570030293
:10058300062524E6700302064F24E0700302062CBE
:1005930024FE7003020649243960030206B3752A58
:1005A30000752B0590FC04748EF01215678F30E5EF
:1005B3003064516019E53064506013752A00752B5F
:1005C3000690FC047480F0A3740BF00206D6121597
:1005D300678F307B007A007931E4FDFC120F1CAF8A
:1005E300311208757400252BF974FC352AFA7B0146
:1005F300C0038B357536E075376575380075392C52
:10060300D0031213B87400252BF58274FC352AF538
:1006130083E531F0742C252BF52BE4352AF52A02DA
:1006230006D6E4F52AF52B801D1215678F307B0063
:100633007A007931E4FDFC120F1CAF311208757F8B
:10064300C0120B26800012145E0206D6752A0075AE
:100653002B0590FC0474A5F01215678F307B007A8C
:10066300007931E4FDFC120F1C052BE52BAE2A703B
:1006730002052A142400F58274FC3EF583E508F094
:10068300052BE52BAE2A7002052A142400F582748B
:10069300FC3EF583E515F0052BE52BAE2A7002052C
:1006A3002A142400F58274FC3EF583E531F080239F
:1006B300752A00752B0690FC047480F0C3E52E9414
:1006C30005E52D94005006A37407F0800690FC0501
:1006D3007406F0E52B452A602CE52BFD90FC00F019
:1006E300E52AFFA3F090F402E090FC02F090F403FB
:1006F300E090FC03F090E69CEFF000000090E69D94
:0E070300EDF000000090E6957480F00000001C
:0107110022C5
:02004100D322C8
:0800460090E6BAE0F51DD3229B
:1015EE0090E740E51DF0E490E68AF090E68B04F07B
:0215FE00D322F6
:08163B0090E6BAE0F51AD32293
:1016180090E740E51AF0E490E68AF090E68B04F053
:02162800D322CB
:10153F0090E6B9E0242F600D04701990E604E0FFE7
:10154F00430780800890E604E0FF53077F00000008
:07155F00EFF08002D322C36C
:011566002262
:10158000C0E0C083C082D2015391EF90E65D740148
:08159000F0D082D083D0E032DC
:1015B000C0E0C083C0825391EF90E65D7404F0D028
:0615C00082D083D0E0326E
:1015C600C0E0C083C0825391EF90E65D7402F0D014
:0615D60082D083D0E03258
:1013F200C0E0C083C08285110D85120E850E8285E4
:101402000D83A37402F085090F850A108510828569
:101412000F83A37407F05391EF90E65D7410F0D040
:0614220082D083D0E0320D
:10159800C0E0C083C082D2035391EF90E65D740827
:0815A800F0D082D083D0E032C4
:10137B00C0E0C083C08290E680E030E72085090D95
:10138B00850A0E850E82850D83A37402F085110FDD
:10139B00851210851082850F83A37407F05391EF8C
:0D13AB0090E65D7420F0D082D083D0E03257
:0E09F10000010202030304040505C0C2000059
:1007120078237C007D007BFF7A0979FB7E007F04D1
:10072200120126C203C200D202C20112105A750B74
:100732000A750C0075130A75141275090A750A1CDC
:1007420075110A75127085110F85121075160A75CA
:1007520017B41215678F217B007A007922E4FDFC21
:10076200120F1C852208E4F515F52774232527F8B6
:10077200E6FF605C1208757EE07F657CE07DB31267
:1007820011FD7EE07FB3AD1CAC1B12099F50387483
:10079200232527F8E6F515652260277B007A007984
:1007A200157D01E4FFFE1212D37B007A007922E468
:1007B200FDFCAF21120F1CE52265156013751501B2
:1007C200800E7515FF80090527E527C39404409B19
:1007D200E5157059FB7A0079227D01FCAF21120FD9
:1007E2001CE522752900F5287B007A0079227D021A
:1007F2007C00AF21120F1CE5224229E52964E47036
:1008020004E52864E470267515C0FB7A0079157D2D
:1008120001FFFE1212D37B007A007922E4FDFCAFC5
:1008220021120F1CE52265156003751501AF151223
:100832000B26D2E843D82090E668E04409F090E61F
:100842005CE0443DF0E51564C06005E515B4C20303
:1008520012145ED2AF538EF8C203C2AF120543D256
:10086200AF30010512031BC2013003EEC2031214A2
:03087200C080E75C
:0B00360090E50DE030E402C322D3226D
:10031B0090E6B9E070030203E01470030204552465
:10032B00FE70030204D024FB70030203DA14700383
:10033B000203D41470030203C81470030203CE2407
:10034B0005600302052F120041400302053B90E6B6
:10035B00BBE024FE602714603E24FD60111460276F
:10036B0024067056E50B90E6B3F0E50C80421200C4
:10037B00365044E51390E6B3F0E5148033E50D9069
:10038B00E6B3F0E50E802985110F851210E50F906D
:10039B00E6B3F0E510801990E6BAE0FF1214ECAA70
:1003AB0006A9077B01EA494B600DEE90E6B3F0EF2F
:1003BB0090E6B4F002053B02052A02052A12161834
:1003CB0002053B12163B02053B12004602053B128F
:1003DB0015EE02053B90E6B8E0247F60151460191A
:1003EB0024027063A200E43325E0FFA202E4334F42
:1003FB008041E490E740F0803F90E6BCE0547EFF04
:10040B007E00E0D394807C0040047D0180027D005F
:10041B00EC4EFEED4F24F1F58274093EF583E49327
:10042B00FF3395E0FEEF24A1FFEE34E68F82F583D8
:10043B00E0540190E740F0E4A3F090E68AF090E6F8
:10044B008B7402F002053B02052A90E6B8E024FE0D
:10045B0060162402600302053B90E6BAE0B4010586
:10046B00C20002053B02052A90E6BAE0705590E601
:10047B00BCE0547EFF7E00E0D394807C0040047D82
:10048B000180027D00EC4EFEED4F24F1F5827409E4
:10049B003EF583E493FF3395E0FEEF24A1FFEE34AA
:1004AB00E68F82F583E054FEF090E6BCE0548013B7
:1004BB001313541FFFE0540F2F90E683F0E04420FA
:1004CB00F0806D805A90E6B8E024FE60192402702B
:1004DB004E90E6BAE0B40104D200805490E6BAE044
:1004EB006402604C803990E6BCE0547EFF7E00E0F5
:1004FB00D394807C0040047D0180027D00EC4EFE95
:10050B00ED4F24F1F58274093EF583E493FF3395A7
:10051B00E0FEEF24A1FFEE34E68F82F583800D9091
:10052B00E6A0800812153F500790E6A0E04401F0CA
:07053B0090E6A0E04480F00F
:010542002296
:0300330002004E7A
:04004E0053D8EF3262
:100E8B006080E0CF292E43C9A2D87C013D3654A106
:100E9B00ECF0061362A705F3C0C7738C98932BD99C
:100EAB00BC4C82CA1E9B573CFDD4E01667426F18A0
:100EBB008A17E512BE4EC4D6DA9EDE49A0FBF58E2C
:100ECB00BB2FEE7AA968799115B2073F94C21089AE
:100EDB000B225F21807F5D9A5A903227353ECCE7FB
:100EEB00BFF79703FF1930B348A5B5D1D75E922A48
:100EFB00AC56AAC64FB838D296A47DB676FC6BE238
:040F0B009C7404F1DD
:080CFF008C2C8D2DAB07AA0619
:100D0700E4F52EF52FC3E52F952DE52C6480F8E546
:100D17002E6480984003020DAEE52F25E0FFE52EF7
:100D270033FE74CF2FF58274E03EF583E0FF7E003B
:100D3700AC2CAD2D1201D88C308D31E52F25E0FF7D
:100D4700E52E33FE74D02FF58274E03EF583E0FF85
:100D57007E00AC2CAD2D1201D88C328D33E5316578
:100D6700337004E53065326030EB2531F582EA35C2
:100D770030F583E0F9EB2533F582EA3532F583E088
:100D8700FFEB2531F582EA3530F583EFF0EB2533BC
:100D9700F582EA3532F583E9F0052FE52F60030286
:0B0DA7000D0C052E020D0C7E007F01DC
:010DB200221E
:0C0DB3008E2C8F2D8C2E8D2F8A308B31D2
:100DBF00E52D452C6006E52F452E7004E4FEFF223D
:100DCF00E4F532F533C3E5339531E5306480F8E56A
:100DDF0032648098507BE4F534F535E52F2533F5F3
:100DEF0082E52E3532F583E4F0C3E5359531E530F4
:100DFF006480F8E5346480985049E535253324CF75
:100E0F00F582E434E0F583E0FFE52D2535F582E545
:100E1F002C3534F583E0FEEF8EF0A4FFE52F25335C
:100E2F00F582E52E3532F583E02FFFE52F2533F5DB
:100E3F0082E52E3532F583EFF00535E53570AA05DD
:100E4F003480A60533E5336003020DD40532020D5D
:050E5F00D47E007F01BC
:010E6400226B
:1014920012014CFF900003120165120192900003A9
:1014A200EF1201A4900002120165FF9000011201E7
:0E14B200659000021201A4900001EF0201A457
:080C38008E2C8F2D8C2E8D2FC8
:100C4000E4F530F531E52FAE2E7802CEA2E713CED3
:100C500013D8F8FFC3E5319FEE6480F8E530648077
:100C6000984003020CFAE531AE307802C333CE333C
:100C7000CED8F9252DFFEE352CFAA9077B018B3252
:100C8000F533893474D02531F582E434E0F583E01E
:100C9000541FFFE48F38F537F536F535121492AB53
:100CA00032AA33A934120234C374209538F9F812E9
:100CB0000221C004C005C006C007A934120234A92D
:100CC00038A80112020ED003D002D001D000EF4BA1
:100CD000FFEE4AFEED49FDEC48FCAB32AA33A934E5
:100CE000120254AB32AA33A9341214920531E53101
:0E0CF0006003020C450530020C457E007F01BA
:010CFE0022D3
:10142800D3ED9410EC64809480402AED1D70011C6B
:10143800142FF582EE3CF583E0FB547F24CFF58230
:10144800E434E0F583E0F9540F2FF582E43EF583A8
:05145800E06BF080CB09
:01145D00226C
:1014C00090E682E030E004E020E60B90E682E03037
:1014D000E119E030E71590E680E04401F07F147EEA
:0C14E0000012133590E680E054FEF0226C
:1000030030040990E680E0440AF0800790E680E03F
:100013004408F07FDC7E0512133590E65D74FFF033
:0F00230090E65FF05391EF90E680E054F7F02203
:101335008E458F4690E600E054187012E54624016C
:10134500FFE43545C313F545EF13F546801590E6E3
:1013550000E05418FFBF100BE54625E0F546E545CE
:1013650033F545E5461546AE45700215454E600513
:0613750012162A80EE2290
:060FB5008C458D46AE07DD
:100FBB00EB70037F012290E678E020E6F990E6786B
:100FCB007480F0EE25E0440190E679F090E678E04D
:100FDB0030E0F990E678E020E26BE030E167BB01AE
:100FEB000790E678E04420F090E679E0F5471BEBBC
:100FFB00603090E678E030E0F990E678E020E2456A
:10100B00BB010790E678E04420F090E679E0FF051D
:10101B0046E546AC457002054514F5828C83EFF02E
:10102B0080CC90E678E030E0F990E678E020E215AD
:10103B0090E678E04440F090E679E085468285457D
:0E104B0083F07F012290E678E04440F07F00C1
:011059002274
:10126D0090E678E020E6F990E6787480F0EF25E0DE
:10127D0090E679F090E678E030E0F990E678E020BD
:10128D00E23AE030E136EBD3940040260DEDAE04AA
:10129D0070010C14F5828E83E090E679F01B90E6D8
:1012AD0078E030E0F990E678E020E210E020E1D639
:1012BD00800A90E678E04440F07F012290E678E0E5
:0512CD004440F07F0029
:0112D20022F9
:0214EC00A9074E
:1014EE00AE16AF178F828E83A3E064037017AD0123
:1014FE0019ED7001228F828E83E07C002FFDEC3E71
:08150E00FEAF0580DFE4FEFFE3
:0115160022B2
:10162A007400F58690FDA57C05A3E582458370F9D3
:01163A00228D
:030000000210EEFD
:0C10EE00787FE4F6D8FD758147021135CB
:10005600E709F608DFFA8046E709F208DFFA803E8C
:1000660088828C83E709F0A3DFFA8032E309F60879
:10007600DFFA8078E309F208DFFA807088828C83E1
:10008600E309F0A3DFFA806489828A83E0A3F60895
:10009600DFFA805889828A83E0A3F208DFFA804C6F
:1000A60080D280FA80C680D4806980F28033801046
:1000B60080A680EA809A80A880DA80E280CA8033AF
:1000C60089828A83ECFAE493A3C8C582C8CCC58327
:1000D600CCF0A3C8C582C8CCC583CCDFE9DEE780F7
:1000E6000D89828A83E493A3F608DFF9ECFAA9F076
:1000F600EDFB2289828A83ECFAE0A3C8C582C8CCCC
:10010600C583CCF0A3C8C582C8CCC583CCDFEADEE4
:10011600E880DB89828A83E493A3F208DFF980CC46
:1001260088F0EF60010E4E60C388F0ED2402B4043F
:100136000050B9F582EB2402B4040050AF232345E6
:0601460082239000A67365
:10014C00BB010689828A83E0225002E722BBFE02B1
:09015C00E32289828A83E49322E4
:10016500BB010CE58229F582E5833AF583E022504F
:1001750006E92582F8E622BBFE06E92582F8E22299
:0D018500E58229F582E5833AF583E49322B3
:10019200BB010689828A83F0225002F722BBFE014C
:0201A200F32246
:1001A400F8BB010DE58229F582E5833AF583E8F091
:1001B400225006E92582C8F622BBFE05E92582C83D
:0201C400F22225
:1001C600EF8DF0A4A8F0CF8CF0A428CE8DF0A42E4D
:0201D600FE2207
:1001D800C2D5EC30E709B2D5E4C39DFDE49CFCEE42
:1001E80030E715B2D5E4C39FFFE49EFE12027AC33E
:1001F800E49DFDE49CFC800312027A30D507C3E439
:060208009FFFE49EFE22B0
:10020E00E8600FECC313FCED13FDEE13FEEF13FFCE
:03021E00D8F122F2
:10022100E8600FEFC333FFEE33FEED33FDEC33FC3B
:03023100D8F122DF
:10023400BB010789828A830202DB5005E9F80202C6
:10024400CFBBFE05E9F80202E789828A830202F342
:10025400BB010789828A8302026E5005E9F8020312
:0A02640003BBFE05E9F802030F22B8
:0C026E00ECF0A3EDF0A3EEF0A3EFF02203
:1010FA00020712E493A3F8E493A34003F68001F2F3
:10110A0008DFF48029E493A3F85407240CC8C333F6
:10111A00C4540F4420C8834004F456800146F6DFC5
:10112A00E4800B0102040810204080900E65E47EE2
:10113A00019360BCA3FF543F30E509541FFEE493BA
:10114A00A360010ECF54C025E060A840B8E493A381
:10115A00FAE493A3F8E493A3C8C582C8CAC583CAAC
:10116A00F0A3C8C582C8CAC583CADFE9DEE780BE64
:010F0F0000E1
:10027A00BC000BBE0029EF8DF084FFADF022E4CC68
:10028A00F875F008EF2FFFEE33FEEC33FCEE9DEC31
:10029A00984005FCEE9DFE0FD5F0E9E4CEFD22ED77
:1002AA00F8F5F0EE8420D21CFEADF075F008EF2FC1
:1002BA00FFED33FD4007985006D5F0F222C398FDB2
:0502CA000FD5F0EA224F
:0C02CF00E6FC08E6FD08E6FE08E6FF225B
:0C02DB00E0FCA3E0FDA3E0FEA3E0FF2296
:0C02E700E2FC08E2FD08E2FE08E2FF2253
:1002F300E493FC740193FD740293FE740393FF2251
:0C030300ECF608EDF608EEF608EFF62226
:0C030F00ECF208EDF208EEF208EFF2222A
:00000001FF

View File

@@ -811,6 +811,29 @@ static int xbus_echocancel(xbus_t *xbus, int on)
return 0;
}
static void xbus_deactivate_xpds(xbus_t *xbus)
{
unsigned long flags;
int unit;
int subunit;
xpd_t *xpd;
for (unit = 0; unit < MAX_UNIT; unit++) {
xpd = xpd_byaddr(xbus, unit, 0);
if (!xpd)
continue;
for (subunit = 0; subunit < MAX_SUBUNIT; subunit++) {
xpd = xpd_byaddr(xbus, unit, subunit);
if (!xpd)
continue;
spin_lock_irqsave(&xpd->lock, flags);
xpd->card_present = 0;
xpd_setstate(xpd, XPD_STATE_NOHW);
spin_unlock_irqrestore(&xpd->lock, flags);
}
}
}
static int xbus_initialize(xbus_t *xbus)
{
int unit;
@@ -877,18 +900,37 @@ int xbus_is_registered(xbus_t *xbus)
return xbus->ddev && xbus->ddev->dev.parent;
}
static void xbus_free_ddev(xbus_t *xbus)
{
if (!xbus->ddev)
return;
if (xbus->ddev->devicetype)
kfree(xbus->ddev->devicetype);
xbus->ddev->devicetype = NULL;
xbus->ddev->location = NULL;
xbus->ddev->hardware_id = NULL;
dahdi_free_device(xbus->ddev);
xbus->ddev = NULL;
}
int xbus_register_dahdi_device(xbus_t *xbus)
{
int i;
int offset = 0;
int i;
int offset = 0;
int ret;
XBUS_DBG(DEVICES, xbus, "Entering %s\n", __func__);
if (xbus_is_registered(xbus)) {
XBUS_ERR(xbus, "Already registered to DAHDI\n");
WARN_ON(1);
return -EINVAL;
ret = -EINVAL;
goto err;
}
xbus->ddev = dahdi_create_device();
if (!xbus->ddev) {
ret = -ENOMEM;
goto err;
}
/*
* This actually describe the dahdi_spaninfo version 3
* A bunch of unrelated data exported via a modified ioctl()
@@ -903,8 +945,10 @@ int xbus_register_dahdi_device(xbus_t *xbus)
* OK, let's add to the kernel more useless info.
*/
xbus->ddev->devicetype = kasprintf(GFP_KERNEL, "Astribank2");
if (!xbus->ddev->devicetype)
return -ENOMEM;
if (!xbus->ddev->devicetype) {
ret = -ENOMEM;
goto err;
}
/*
* location is the only usefull new data item.
@@ -929,7 +973,8 @@ int xbus_register_dahdi_device(xbus_t *xbus)
}
if (dahdi_register_device(xbus->ddev, &xbus->astribank)) {
XBUS_ERR(xbus, "Failed to dahdi_register_device()\n");
return -ENODEV;
ret = -ENODEV;
goto err;
}
for (i = 0; i < MAX_XPDS; i++) {
xpd_t *xpd = xpd_of(xbus, i);
@@ -939,6 +984,9 @@ int xbus_register_dahdi_device(xbus_t *xbus)
}
}
return 0;
err:
xbus_free_ddev(xbus);
return ret;
}
void xbus_unregister_dahdi_device(xbus_t *xbus)
@@ -953,12 +1001,7 @@ void xbus_unregister_dahdi_device(xbus_t *xbus)
if (xbus->ddev) {
dahdi_unregister_device(xbus->ddev);
XBUS_NOTICE(xbus, "%s: finished dahdi_unregister_device()\n", __func__);
kfree(xbus->ddev->devicetype);
xbus->ddev->devicetype = NULL;
xbus->ddev->location = NULL;
xbus->ddev->hardware_id = NULL;
dahdi_free_device(xbus->ddev);
xbus->ddev = NULL;
xbus_free_ddev(xbus);
}
for(i = 0; i < MAX_XPDS; i++) {
xpd_t *xpd = xpd_of(xbus, i);
@@ -1303,6 +1346,7 @@ void xbus_deactivate(xbus_t *xbus)
xbus_request_sync(xbus, SYNC_MODE_NONE); /* no more ticks */
elect_syncer("deactivate");
xbus_echocancel(xbus, 0);
xbus_deactivate_xpds(xbus);
XBUS_DBG(DEVICES, xbus, "[%s] Waiting for queues\n", xbus->label);
xbus_command_queue_clean(xbus);
xbus_command_queue_waitempty(xbus);

View File

@@ -144,12 +144,14 @@ typedef unsigned char byte;
#define SET_PROC_DIRENTRY_OWNER(p) do { } while(0);
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
/* Also don't define this for later RHEL >= 5.2 . hex_asc is from the
* same linux-2.6-net-infrastructure-updates-to-mac80211-iwl4965.patch
* as is the bool typedef. */
#if LINUX_VERSION_CODE != KERNEL_VERSION(2,6,18) || ! defined(hex_asc)
typedef int bool;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
/* Also don't define this for later RHEL >= 5.2. */
#if defined(RHEL_RELEASE_CODE) && defined(RHEL_RELEASE_VERSION)
#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5, 3)
typedef int bool;
#endif
#else
typedef int bool;
#endif
#endif
#else

View File

@@ -49,6 +49,7 @@ typedef unsigned gfp_t; /* Added in 2.6.14 */
#endif
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)
/*
* FIXME: Kludge for 2.6.19
* bool is now defined as a proper boolean type (gcc _Bool)
@@ -58,6 +59,12 @@ typedef unsigned gfp_t; /* Added in 2.6.14 */
int name = init; \
module_param(name, bool, perm); \
MODULE_PARM_DESC(name, desc " [default " #init "]")
#else
#define DEF_PARM_BOOL(name, init, perm, desc) \
bool name = init; \
module_param(name, bool, perm); \
MODULE_PARM_DESC(name, desc " [default " #init "]")
#endif
#define DEF_PARM(type,name,init,perm,desc) \
type name = init; \

View File

@@ -697,7 +697,6 @@ int xpp_open(struct dahdi_chan *chan)
pos = chan->chanpos - 1;
if(!xpd->card_present) {
LINE_NOTICE(xpd, pos, "Cannot open -- device not ready\n");
put_xpd(__FUNCTION__, xpd);
return -ENODEV;
}
spin_lock_irqsave(&xbus->lock, flags);
@@ -835,7 +834,7 @@ int xpp_maint(struct dahdi_span *span, int cmd)
* If the watchdog detects no received data, it will call the
* watchdog routine
*/
static int xpp_watchdog(struct dahdi_span *span, int cause)
int xpp_watchdog(struct dahdi_span *span, int cause)
{
static int rate_limit = 0;
@@ -843,6 +842,7 @@ static int xpp_watchdog(struct dahdi_span *span, int cause)
DBG(GENERAL, "\n");
return 0;
}
EXPORT_SYMBOL(xpp_watchdog);
#endif
/*
@@ -1083,14 +1083,9 @@ int xpd_dahdi_postregister(xpd_t *xpd)
*/
void xpd_dahdi_preunregister(xpd_t *xpd)
{
unsigned long flags;
if (!xpd)
if (!xpd || !IS_PHONEDEV(xpd))
return;
XPD_DBG(DEVICES, xpd, "\n");
spin_lock_irqsave(&xpd->lock, flags);
xpd->card_present = 0;
xpd_setstate(xpd, XPD_STATE_NOHW);
spin_unlock_irqrestore(&xpd->lock, flags);
update_xpd_status(xpd, DAHDI_ALARM_NOTOPEN);
if(xpd->card_present)
CALL_PHONE_METHOD(card_dahdi_preregistration, xpd, 0);
@@ -1108,7 +1103,7 @@ void xpd_dahdi_preunregister(xpd_t *xpd)
void xpd_dahdi_postunregister(xpd_t *xpd)
{
if (!xpd)
if (!xpd || !IS_PHONEDEV(xpd))
return;
atomic_dec(&PHONEDEV(xpd).dahdi_registered);
atomic_dec(&num_registered_spans);

View File

@@ -47,6 +47,7 @@ int xpp_close(struct dahdi_chan *chan);
int xpp_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long arg);
int xpp_hooksig(struct dahdi_chan *chan, enum dahdi_txsig txsig);
int xpp_maint(struct dahdi_span *span, int cmd);
int xpp_watchdog(struct dahdi_span *span, int cause);
void xpp_span_assigned(struct dahdi_span *span);
void report_bad_ioctl(const char *msg, xpd_t *xpd, int pos, unsigned int cmd);
int total_registered_spans(void);

View File

@@ -75,6 +75,12 @@ static const xproto_table_t *xproto_table(xpd_type_t cardtype)
return xprotocol_tables[cardtype];
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
#define MODULE_REFCOUNT_FORMAT "%s refcount was %d\n"
#else
#define MODULE_REFCOUNT_FORMAT "%s refcount was %lu\n"
#endif
const xproto_table_t *xproto_get(xpd_type_t cardtype)
{
const xproto_table_t *xtable;
@@ -94,7 +100,8 @@ const xproto_table_t *xproto_get(xpd_type_t cardtype)
if(xtable) {
BUG_ON(!xtable->owner);
#ifdef CONFIG_MODULE_UNLOAD
DBG(GENERAL, "%s refcount was %d\n", xtable->name, module_refcount(xtable->owner));
DBG(GENERAL, MODULE_REFCOUNT_FORMAT, xtable->name,
module_refcount(xtable->owner));
#endif
if(!try_module_get(xtable->owner)) {
ERR("%s: try_module_get for %s failed.\n", __FUNCTION__, xtable->name);
@@ -108,7 +115,8 @@ void xproto_put(const xproto_table_t *xtable)
{
BUG_ON(!xtable);
#ifdef CONFIG_MODULE_UNLOAD
DBG(GENERAL, "%s refcount was %d\n", xtable->name, module_refcount(xtable->owner));
DBG(GENERAL, MODULE_REFCOUNT_FORMAT, xtable->name,
module_refcount(xtable->owner));
BUG_ON(module_refcount(xtable->owner) <= 0);
#endif
module_put(xtable->owner);

View File

@@ -72,6 +72,12 @@
#define DAHDI_IRQ_HANDLER(a) static irqreturn_t a(int irq, void *dev_id, struct pt_regs *regs)
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
#ifdef CONFIG_PCI
#include <linux/pci-aspm.h>
#endif
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
#define HAVE_NET_DEVICE_OPS
#endif
@@ -93,16 +99,33 @@
#endif
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
# ifdef RHEL_RELEASE_VERSION
# if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(5, 6)
#define dev_name(dev) ((dev)->bus_id)
#define dev_set_name(dev, format, ...) \
snprintf((dev)->bus_id, BUS_ID_SIZE, format, ## __VA_ARGS__)
# else
#define dev_set_name(dev, format, ...) \
do { \
kobject_set_name(&(dev)->kobj, format, ## __VA_ARGS__); \
snprintf((dev)->bus_id, BUS_ID_SIZE, \
kobject_name(&(dev)->kobj)); \
} while (0)
# endif
# else
#define dev_name(dev) ((dev)->bus_id)
# endif
#define dev_set_name(dev, format, ...) \
snprintf((dev)->bus_id, BUS_ID_SIZE, format, ## __VA_ARGS__);
snprintf((dev)->bus_id, BUS_ID_SIZE, format, ## __VA_ARGS__)
# endif
#endif
/* __dev* were removed in 3.8. They still have effect in 2.6.18. */
#ifndef __devinit
# define __devinit
# define __devinitdata
# define __devexit
# define __devexit_p(x) x
#endif
/*! Default chunk size for conferences and such -- static right now, might make
@@ -1101,6 +1124,9 @@ struct dahdi_dynamic_driver {
struct list_head list;
struct module *owner;
/*! Numberic id of next device created by this driver. */
unsigned int id;
};
/*! \brief Receive a dynamic span message */
@@ -1262,8 +1288,13 @@ extern u_char __dahdi_lin2mu[16384];
extern u_char __dahdi_lin2a[16384];
#endif
struct dahdi_dynamic_ops {
struct module *owner;
int (*ioctl)(unsigned int cmd, unsigned long data);
};
/*! \brief Used by dynamic DAHDI -- don't use directly */
void dahdi_set_dynamic_ioctl(int (*func)(unsigned int cmd, unsigned long data));
void dahdi_set_dynamic_ops(const struct dahdi_dynamic_ops *ops);
/*! \brief Used by DAHDI HPEC module -- don't use directly */
void dahdi_set_hpec_ioctl(int (*func)(unsigned int cmd, unsigned long data));
@@ -1382,6 +1413,16 @@ static inline short dahdi_txtone_nextsample(struct dahdi_chan *ss)
#define fatal_signal_pending(p) \
(signal_pending((p)) && sigismember(&(p)->pending.signal, SIGKILL))
#ifdef CONFIG_PCI
#ifndef PCIE_LINK_STATE_L0S
#define PCIE_LINK_STATE_L0S 1
#define PCIE_LINK_STATE_L1 2
#define PCIE_LINK_STATE_CLKPM 4
#endif
#define pci_disable_link_state dahdi_pci_disable_link_state
void dahdi_pci_disable_link_state(struct pci_dev *pdev, int state);
#endif /* CONFIG_PCI */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
#ifndef __packed
@@ -1409,60 +1450,6 @@ static inline int strcasecmp(const char *s1, const char *s2)
return c1 - c2;
}
#endif /* clamp_val */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
static inline void list_replace(struct list_head *old, struct list_head *new)
{
new->next = old->next;
new->next->prev = new;
new->prev = old->prev;
new->prev->next = new;
}
#ifndef WARN_ON_ONCE
#define WARN_ON_ONCE(__condition) do { \
static int __once = 1; \
if (unlikely(__condition)) { \
if (__once) { \
__once = 0; \
WARN_ON(0); \
} \
} \
} while (0)
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 17)
#ifndef POLLRDHUP
#define POLLRDHUP 0
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
#define kzalloc(a, b) kcalloc(1, a, b)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
#define synchronize_rcu() synchronize_kernel()
#define kasprintf dahdi_kasprintf
char *dahdi_kasprintf(gfp_t gfp, const char *fmt, ...);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
#if !defined(HAVE_WAIT_FOR_COMPLETION_TIMEOUT)
static inline unsigned long
wait_for_completion_interruptible_timeout(struct completion *x,
unsigned long timeout)
{
/* There is a race condition here. If x->done is reset to 0
* before the call to wait_for_completion after this thread wakes.
*/
timeout = wait_event_interruptible_timeout(x->wait, x->done, timeout);
if (timeout)
wait_for_completion(x);
return timeout;
}
#endif
typedef u32 __bitwise pm_message_t;
#endif /* 2.6.11 */
#endif /* 2.6.12 */
#endif /* 2.6.14 */
#endif /* 2.6.17 */
#endif /* 2.6.18 */
#endif /* 2.6.22 */
#endif /* 2.6.25 */
#endif /* 2.6.26 */