Compare commits
16 Commits
v2.6.1-rc2
...
branched-2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79e20be476 | ||
|
|
396f1a76b1 | ||
|
|
ca95a19f41 | ||
|
|
41c3c2e879 | ||
|
|
c98b3a689e | ||
|
|
9deb9b2a4f | ||
|
|
0a92282cfe | ||
|
|
3c800538f7 | ||
|
|
6384cb034a | ||
|
|
0ecf2c67c8 | ||
|
|
89ea0430df | ||
|
|
05bac84ce8 | ||
|
|
5b675ab400 | ||
|
|
69774cd457 | ||
|
|
9dde3cff9c | ||
|
|
e15edb0d7a |
374
ChangeLog
374
ChangeLog
@@ -1,374 +0,0 @@
|
||||
2012-03-28 Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* Released 2.6.0-rc1
|
||||
|
||||
2012-03-22 18:36 +0000 [r10591-10594] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/wct4xxp/base.c: 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
|
||||
|
||||
* drivers/dahdi/wct4xxp/base.c: 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
|
||||
|
||||
* drivers/dahdi/dahdi_dynamic_eth.c: 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
|
||||
|
||||
* drivers/dahdi/dahdi_dynamic_eth.c: 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
|
||||
|
||||
2012-03-21 20:35 +0000 [r10575-10576] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/card_fxs.c: 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
|
||||
|
||||
* drivers/dahdi/xpp/card_fxs.c: 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
|
||||
|
||||
2012-03-21 19:36 +0000 [r10564-10572] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/dahdi-sysfs.c: 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
|
||||
|
||||
* include/dahdi/kernel.h, drivers/dahdi/dahdi_dynamic.c:
|
||||
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
|
||||
|
||||
* drivers/dahdi/dahdi_dynamic_eth.c: 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
|
||||
|
||||
* include/dahdi/kernel.h: 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
|
||||
|
||||
* drivers/dahdi/dahdi-base.c, drivers/dahdi/dahdi-sysfs.c: 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
|
||||
|
||||
* drivers/dahdi/voicebus/voicebus.h, drivers/dahdi/wcte12xp/base.c,
|
||||
drivers/dahdi/wctdm24xxp/base.c: 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
|
||||
|
||||
* drivers/dahdi/wct4xxp/base.c: 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
|
||||
|
||||
* drivers/dahdi/wct4xxp/base.c: 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
|
||||
|
||||
* drivers/dahdi/dahdi-base.c, include/dahdi/kernel.h: 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
|
||||
|
||||
2012-03-20 11:20 +0000 [r10553] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/firmwares/USB_RECOV.hex,
|
||||
drivers/dahdi/xpp/firmwares/USB_FW.hex,
|
||||
drivers/dahdi/xpp/firmwares/FPGA_1161.201.hex: 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
|
||||
|
||||
2012-03-18 19:00 +0000 [r10537-10538] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/firmwares/Makefile,
|
||||
drivers/dahdi/xpp/firmwares/FPGA_1161.201.hex (added),
|
||||
drivers/dahdi/xpp/firmwares/USB_FW.201.hex (added): 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
|
||||
|
||||
* drivers/dahdi/xpp/firmwares/USB_FW.hex: 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
|
||||
|
||||
2012-03-16 16:11 +0000 [r10524-10526] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/dahdi_dummy.c: 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
|
||||
|
||||
* drivers/dahdi/xpp/xproto.c: 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
|
||||
|
||||
* drivers/dahdi/xpp/xpd.h: 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
|
||||
|
||||
2012-03-15 17:36 +0000 [r10489-10490] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/card_fxs.c: 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
|
||||
|
||||
* drivers/dahdi/xpp/card_global.c, drivers/dahdi/xpp/card_global.h:
|
||||
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
|
||||
|
||||
2012-03-15 15:03 +0000 [r10481] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/wctdm24xxp/base.c: 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
|
||||
|
||||
2012-02-07 22:19 +0000 [r10457] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/firmwares/USB_RECOV.hex (added),
|
||||
drivers/dahdi/xpp/firmwares/Makefile: 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
|
||||
|
||||
2012-01-25 20:51 +0000 [r10445] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* drivers/dahdi/xpp/firmwares/FPGA_FXS.hex,
|
||||
drivers/dahdi/xpp/firmwares/FPGA_1141.hex,
|
||||
drivers/dahdi/xpp/firmwares/FPGA_1151.hex: 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
|
||||
|
||||
2012-01-17 14:50 +0000 [r10442] Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||
|
||||
* README, drivers/dahdi/Kbuild: 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
|
||||
|
||||
2012-01-10 22:09 +0000 [r10415-10419] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/xpp/xbus-core.c: 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
|
||||
|
||||
* drivers/dahdi/xpp/xpp_dahdi.c, drivers/dahdi/xpp/xbus-core.c:
|
||||
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
|
||||
|
||||
* drivers/dahdi/xpp/xpp_dahdi.c: 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
|
||||
|
||||
* drivers/dahdi/wct4xxp/vpm450m.c: 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
|
||||
|
||||
* drivers/dahdi/wctdm24xxp/base.c: 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
|
||||
|
||||
2012-01-04 22:19 +0000 [r10406] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* / (added): Creating branch for 2.6.
|
||||
|
||||
@@ -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);
|
||||
@@ -2464,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);
|
||||
}
|
||||
@@ -4422,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(®istration_mutex);
|
||||
dahdi_dynamic_ops = ops;
|
||||
mutex_unlock(®istration_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(dahdi_set_dynamic_ops);
|
||||
|
||||
static int (*dahdi_hpec_ioctl)(unsigned int cmd, unsigned long data);
|
||||
|
||||
@@ -4648,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;
|
||||
@@ -5146,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(®istration_mutex);
|
||||
if (!dahdi_dynamic_ops) {
|
||||
mutex_unlock(®istration_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(®istration_mutex);
|
||||
return -ENOSYS;
|
||||
}
|
||||
mutex_unlock(®istration_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)
|
||||
{
|
||||
@@ -5180,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) {
|
||||
@@ -9957,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) {
|
||||
@@ -9965,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;
|
||||
@@ -9982,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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
@@ -767,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);
|
||||
}
|
||||
}
|
||||
@@ -823,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;
|
||||
@@ -837,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");
|
||||
}
|
||||
|
||||
@@ -154,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));
|
||||
@@ -315,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)
|
||||
@@ -442,12 +443,12 @@ 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;
|
||||
}
|
||||
|
||||
@@ -458,9 +459,11 @@ static void __exit ztdeth_exit(void)
|
||||
#else
|
||||
cancel_work_sync(&dahdi_dynamic_eth_flush_work);
|
||||
#endif
|
||||
dev_remove_pack(&ztdeth_ptype);
|
||||
unregister_netdevice_notifier(&ztdeth_nblock);
|
||||
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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 $@
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1073,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)
|
||||
{
|
||||
@@ -1220,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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -834,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;
|
||||
|
||||
@@ -842,6 +842,7 @@ static int xpp_watchdog(struct dahdi_span *span, int cause)
|
||||
DBG(GENERAL, "\n");
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(xpp_watchdog);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1280,8 +1280,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));
|
||||
|
||||
Reference in New Issue
Block a user