mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1341 commits) virtio_net: remove forgotten assignment be2net: fix tx completion polling sis190: fix cable detect via link status poll net: fix protocol sk_buff field bridge: Fix build error when IGMP_SNOOPING is not enabled bnx2x: Tx barriers and locks scm: Only support SCM_RIGHTS on unix domain sockets. vhost-net: restart tx poll on sk_sndbuf full vhost: fix get_user_pages_fast error handling vhost: initialize log eventfd context pointer vhost: logging thinko fix wireless: convert to use netdev_for_each_mc_addr ethtool: do not set some flags, if others failed ipoib: returned back addrlen check for mc addresses netlink: Adding inode field to /proc/net/netlink axnet_cs: add new id bridge: Make IGMP snooping depend upon BRIDGE. bridge: Add multicast count/interval sysfs entries bridge: Add hash elasticity/max sysfs entries bridge: Add multicast_snooping sysfs toggle ... Trivial conflicts in Documentation/feature-removal-schedule.txt
This commit is contained in:
commit
6d6b89bd2e
@ -144,7 +144,7 @@ usage should require reading the full document.
|
||||
this though and the recommendation to allow only a single
|
||||
interface in STA mode at first!
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_if_init_conf
|
||||
!Finclude/net/mac80211.h ieee80211_vif
|
||||
</chapter>
|
||||
|
||||
<chapter id="rx-tx">
|
||||
@ -234,7 +234,6 @@ usage should require reading the full document.
|
||||
<title>Multiple queues and QoS support</title>
|
||||
<para>TBD</para>
|
||||
!Finclude/net/mac80211.h ieee80211_tx_queue_params
|
||||
!Finclude/net/mac80211.h ieee80211_tx_queue_stats
|
||||
</chapter>
|
||||
|
||||
<chapter id="AP">
|
||||
|
@ -84,27 +84,6 @@ Who: Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: CONFIG_WIRELESS_OLD_REGULATORY - old static regulatory information
|
||||
When: March 2010 / desktop catchup
|
||||
|
||||
Why: The old regulatory infrastructure has been replaced with a new one
|
||||
which does not require statically defined regulatory domains. We do
|
||||
not want to keep static regulatory domains in the kernel due to the
|
||||
the dynamic nature of regulatory law and localization. We kept around
|
||||
the old static definitions for the regulatory domains of:
|
||||
|
||||
* US
|
||||
* JP
|
||||
* EU
|
||||
|
||||
and used by default the US when CONFIG_WIRELESS_OLD_REGULATORY was
|
||||
set. We will remove this option once the standard Linux desktop catches
|
||||
up with the new userspace APIs we have implemented.
|
||||
|
||||
Who: Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: dev->power.power_state
|
||||
When: July 2007
|
||||
Why: Broken design for runtime control over driver power states, confusing
|
||||
@ -561,3 +540,13 @@ Why: The corgi touchscreen is now deprecated in favour of the generic
|
||||
ads7846 driver now. Provided that the original driver is not generic
|
||||
and is difficult to maintain, it will be removed later.
|
||||
Who: Eric Miao <eric.y.miao@gmail.com>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: capifs
|
||||
When: February 2011
|
||||
Files: drivers/isdn/capi/capifs.*
|
||||
Why: udev fully replaces this special file system that only contains CAPI
|
||||
NCCI TTY device nodes. User space (pppdcapiplugin) works without
|
||||
noticing the difference.
|
||||
Who: Jan Kiszka <jan.kiszka@web.de>
|
||||
|
@ -149,10 +149,11 @@ char *(*procinfo)(struct capi_ctr *ctrlr)
|
||||
pointer to a callback function returning the entry for the device in
|
||||
the CAPI controller info table, /proc/capi/controller
|
||||
|
||||
read_proc_t *ctr_read_proc
|
||||
pointer to the read_proc callback function for the device's proc file
|
||||
system entry, /proc/capi/controllers/<n>; will be called with a
|
||||
pointer to the device's capi_ctr structure as the last (data) argument
|
||||
const struct file_operations *proc_fops
|
||||
pointers to callback functions for the device's proc file
|
||||
system entry, /proc/capi/controllers/<n>; pointer to the device's
|
||||
capi_ctr structure is available from struct proc_dir_entry::data
|
||||
which is available from struct inode.
|
||||
|
||||
Note: Callback functions except send_message() are never called in interrupt
|
||||
context.
|
||||
|
@ -292,10 +292,10 @@ GigaSet 307x Device Driver
|
||||
to /etc/modprobe.d/gigaset, /etc/modprobe.conf.local or a similar file.
|
||||
|
||||
Problem:
|
||||
Your isdn script aborts with a message about isdnlog.
|
||||
The isdnlog program emits error messages or just doesn't work.
|
||||
Solution:
|
||||
Try deactivating (or commenting out) isdnlog. This driver does not
|
||||
support it.
|
||||
Isdnlog supports only the HiSax driver. Do not attempt to use it with
|
||||
other drivers such as Gigaset.
|
||||
|
||||
Problem:
|
||||
You have two or more DECT data adapters (M101/M105) and only the
|
||||
@ -321,8 +321,8 @@ GigaSet 307x Device Driver
|
||||
writing an appropriate value to /sys/module/gigaset/parameters/debug, e.g.
|
||||
echo 0 > /sys/module/gigaset/parameters/debug
|
||||
switches off debugging output completely,
|
||||
echo 0x10a020 > /sys/module/gigaset/parameters/debug
|
||||
enables the standard set of debugging output messages. These values are
|
||||
echo 0x302020 > /sys/module/gigaset/parameters/debug
|
||||
enables a reasonable set of debugging output messages. These values are
|
||||
bit patterns where every bit controls a certain type of debugging output.
|
||||
See the constants DEBUG_* in the source file gigaset.h for details.
|
||||
|
||||
|
@ -54,6 +54,7 @@ parameter is applicable:
|
||||
IMA Integrity measurement architecture is enabled.
|
||||
IOSCHED More than one I/O scheduler is enabled.
|
||||
IP_PNP IP DHCP, BOOTP, or RARP is enabled.
|
||||
IPV6 IPv6 support is enabled.
|
||||
ISAPNP ISA PnP code is enabled.
|
||||
ISDN Appropriate ISDN support is enabled.
|
||||
JOY Appropriate joystick support is enabled.
|
||||
@ -356,6 +357,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Change the amount of debugging information output
|
||||
when initialising the APIC and IO-APIC components.
|
||||
|
||||
autoconf= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
|
||||
show_lapic= [APIC,X86] Advanced Programmable Interrupt Controller
|
||||
Limit apic dumping. The parameter defines the maximal
|
||||
number of local apics being dumped. Also it is possible
|
||||
@ -638,6 +642,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
See drivers/char/README.epca and
|
||||
Documentation/serial/digiepca.txt.
|
||||
|
||||
disable= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
|
||||
disable_ipv6= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
|
||||
disable_mtrr_cleanup [X86]
|
||||
The kernel tries to adjust MTRR layout from continuous
|
||||
to discrete, to make X server driver able to add WB
|
||||
|
@ -58,8 +58,10 @@ DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
|
||||
size (application payload size) in bytes, see RFC 4340, section 14.
|
||||
|
||||
DCCP_SOCKOPT_AVAILABLE_CCIDS is also read-only and returns the list of CCIDs
|
||||
supported by the endpoint (see include/linux/dccp.h for symbolic constants).
|
||||
The caller needs to provide a sufficiently large (> 2) array of type uint8_t.
|
||||
supported by the endpoint. The option value is an array of type uint8_t whose
|
||||
size is passed as option length. The minimum array size is 4 elements, the
|
||||
value returned in the optlen argument always reflects the true number of
|
||||
built-in CCIDs.
|
||||
|
||||
DCCP_SOCKOPT_CCID is write-only and sets both the TX and RX CCIDs at the same
|
||||
time, combining the operation of the next two socket options. This option is
|
||||
|
@ -487,6 +487,30 @@ tcp_dma_copybreak - INTEGER
|
||||
and CONFIG_NET_DMA is enabled.
|
||||
Default: 4096
|
||||
|
||||
tcp_thin_linear_timeouts - BOOLEAN
|
||||
Enable dynamic triggering of linear timeouts for thin streams.
|
||||
If set, a check is performed upon retransmission by timeout to
|
||||
determine if the stream is thin (less than 4 packets in flight).
|
||||
As long as the stream is found to be thin, up to 6 linear
|
||||
timeouts may be performed before exponential backoff mode is
|
||||
initiated. This improves retransmission latency for
|
||||
non-aggressive thin streams, often found to be time-dependent.
|
||||
For more information on thin streams, see
|
||||
Documentation/networking/tcp-thin.txt
|
||||
Default: 0
|
||||
|
||||
tcp_thin_dupack - BOOLEAN
|
||||
Enable dynamic triggering of retransmissions after one dupACK
|
||||
for thin streams. If set, a check is performed upon reception
|
||||
of a dupACK to determine if the stream is thin (less than 4
|
||||
packets in flight). As long as the stream is found to be thin,
|
||||
data is retransmitted on the first received dupACK. This
|
||||
improves retransmission latency for non-aggressive thin
|
||||
streams, often found to be time-dependent.
|
||||
For more information on thin streams, see
|
||||
Documentation/networking/tcp-thin.txt
|
||||
Default: 0
|
||||
|
||||
UDP variables:
|
||||
|
||||
udp_mem - vector of 3 INTEGERs: min, pressure, max
|
||||
@ -692,6 +716,25 @@ proxy_arp - BOOLEAN
|
||||
conf/{all,interface}/proxy_arp is set to TRUE,
|
||||
it will be disabled otherwise
|
||||
|
||||
proxy_arp_pvlan - BOOLEAN
|
||||
Private VLAN proxy arp.
|
||||
Basically allow proxy arp replies back to the same interface
|
||||
(from which the ARP request/solicitation was received).
|
||||
|
||||
This is done to support (ethernet) switch features, like RFC
|
||||
3069, where the individual ports are NOT allowed to
|
||||
communicate with each other, but they are allowed to talk to
|
||||
the upstream router. As described in RFC 3069, it is possible
|
||||
to allow these hosts to communicate through the upstream
|
||||
router by proxy_arp'ing. Don't need to be used together with
|
||||
proxy_arp.
|
||||
|
||||
This technology is known by different names:
|
||||
In RFC 3069 it is called VLAN Aggregation.
|
||||
Cisco and Allied Telesyn call it Private VLAN.
|
||||
Hewlett-Packard call it Source-Port filtering or port-isolation.
|
||||
Ericsson call it MAC-Forced Forwarding (RFC Draft).
|
||||
|
||||
shared_media - BOOLEAN
|
||||
Send(router) or accept(host) RFC1620 shared media redirects.
|
||||
Overrides ip_secure_redirects.
|
||||
@ -833,9 +876,18 @@ arp_notify - BOOLEAN
|
||||
or hardware address changes.
|
||||
|
||||
arp_accept - BOOLEAN
|
||||
Define behavior when gratuitous arp replies are received:
|
||||
0 - drop gratuitous arp frames
|
||||
1 - accept gratuitous arp frames
|
||||
Define behavior for gratuitous ARP frames who's IP is not
|
||||
already present in the ARP table:
|
||||
0 - don't create new entries in the ARP table
|
||||
1 - create new entries in the ARP table
|
||||
|
||||
Both replies and requests type gratuitous arp will trigger the
|
||||
ARP table to be updated, if this setting is on.
|
||||
|
||||
If the ARP table already contains the IP address of the
|
||||
gratuitous arp frame, the arp table will be updated regardless
|
||||
if this setting is on or off.
|
||||
|
||||
|
||||
app_solicit - INTEGER
|
||||
The maximum number of probes to send to the user space ARP daemon
|
||||
|
90
Documentation/networking/ixgbevf.txt
Executable file
90
Documentation/networking/ixgbevf.txt
Executable file
@ -0,0 +1,90 @@
|
||||
Linux* Base Driver for Intel(R) Network Connection
|
||||
==================================================
|
||||
|
||||
November 24, 2009
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
- In This Release
|
||||
- Identifying Your Adapter
|
||||
- Known Issues/Troubleshooting
|
||||
- Support
|
||||
|
||||
In This Release
|
||||
===============
|
||||
|
||||
This file describes the ixgbevf Linux* Base Driver for Intel Network
|
||||
Connection.
|
||||
|
||||
The ixgbevf driver supports 82599-based virtual function devices that can only
|
||||
be activated on kernels with CONFIG_PCI_IOV enabled.
|
||||
|
||||
The ixgbevf driver supports virtual functions generated by the ixgbe driver
|
||||
with a max_vfs value of 1 or greater.
|
||||
|
||||
The guest OS loading the ixgbevf driver must support MSI-X interrupts.
|
||||
|
||||
VLANs: There is a limit of a total of 32 shared VLANs to 1 or more VFs.
|
||||
|
||||
Identifying Your Adapter
|
||||
========================
|
||||
|
||||
For more information on how to identify your adapter, go to the Adapter &
|
||||
Driver ID Guide at:
|
||||
|
||||
http://support.intel.com/support/network/sb/CS-008441.htm
|
||||
|
||||
Known Issues/Troubleshooting
|
||||
============================
|
||||
|
||||
Unloading Physical Function (PF) Driver Causes System Reboots When VM is
|
||||
Running and VF is Loaded on the VM
|
||||
------------------------------------------------------------------------
|
||||
Do not unload the PF driver (ixgbe) while VFs are assigned to guests.
|
||||
|
||||
Support
|
||||
=======
|
||||
|
||||
For general information, go to the Intel support website at:
|
||||
|
||||
http://support.intel.com
|
||||
|
||||
or the Intel Wired Networking project hosted by Sourceforge at:
|
||||
|
||||
http://sourceforge.net/projects/e1000
|
||||
|
||||
If an issue is identified with the released source code on the supported
|
||||
kernel with a supported adapter, email the specific information related
|
||||
to the issue to e1000-devel@lists.sf.net
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
Intel 10 Gigabit Linux driver.
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
version 2, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
The full GNU General Public License is included in this distribution in
|
||||
the file called "COPYING".
|
||||
|
||||
Trademarks
|
||||
==========
|
||||
|
||||
Intel, Itanium, and Pentium are trademarks or registered trademarks of
|
||||
Intel Corporation or its subsidiaries in the United States and other
|
||||
countries.
|
||||
|
||||
* Other names and brands may be claimed as the property of others.
|
@ -2,7 +2,7 @@
|
||||
+ ABSTRACT
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
This file documents the CONFIG_PACKET_MMAP option available with the PACKET
|
||||
This file documents the mmap() facility available with the PACKET
|
||||
socket interface on 2.4 and 2.6 kernels. This type of sockets is used for
|
||||
capture network traffic with utilities like tcpdump or any other that needs
|
||||
raw access to network interface.
|
||||
@ -44,7 +44,7 @@ enabled. For transmission, check the MTU (Maximum Transmission Unit) used and
|
||||
supported by devices of your network.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
+ How to use CONFIG_PACKET_MMAP to improve capture process
|
||||
+ How to use mmap() to improve capture process
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
From the user standpoint, you should use the higher level libpcap library, which
|
||||
@ -64,7 +64,7 @@ the low level details or want to improve libpcap by including PACKET_MMAP
|
||||
support.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
+ How to use CONFIG_PACKET_MMAP directly to improve capture process
|
||||
+ How to use mmap() directly to improve capture process
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
From the system calls stand point, the use of PACKET_MMAP involves
|
||||
@ -105,7 +105,7 @@ also the mapping of the circular buffer in the user process and
|
||||
the use of this buffer.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
+ How to use CONFIG_PACKET_MMAP directly to improve transmission process
|
||||
+ How to use mmap() directly to improve transmission process
|
||||
--------------------------------------------------------------------------------
|
||||
Transmission process is similar to capture as shown below.
|
||||
|
||||
|
@ -188,3 +188,27 @@ Then in some part of your code after your wiphy has been registered:
|
||||
&mydriver_jp_regdom.reg_rules[i],
|
||||
sizeof(struct ieee80211_reg_rule));
|
||||
regulatory_struct_hint(rd);
|
||||
|
||||
Statically compiled regulatory database
|
||||
---------------------------------------
|
||||
|
||||
In most situations the userland solution using CRDA as described
|
||||
above is the preferred solution. However in some cases a set of
|
||||
rules built into the kernel itself may be desirable. To account
|
||||
for this situation, a configuration option has been provided
|
||||
(i.e. CONFIG_CFG80211_INTERNAL_REGDB). With this option enabled,
|
||||
the wireless database information contained in net/wireless/db.txt is
|
||||
used to generate a data structure encoded in net/wireless/regdb.c.
|
||||
That option also enables code in net/wireless/reg.c which queries
|
||||
the data in regdb.c as an alternative to using CRDA.
|
||||
|
||||
The file net/wireless/db.txt should be kept up-to-date with the db.txt
|
||||
file available in the git repository here:
|
||||
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-regdb.git
|
||||
|
||||
Again, most users in most situations should be using the CRDA package
|
||||
provided with their distribution, and in most other situations users
|
||||
should be building and using CRDA on their own rather than using
|
||||
this option. If you are not absolutely sure that you should be using
|
||||
CONFIG_CFG80211_INTERNAL_REGDB then _DO_NOT_USE_IT_.
|
||||
|
47
Documentation/networking/tcp-thin.txt
Normal file
47
Documentation/networking/tcp-thin.txt
Normal file
@ -0,0 +1,47 @@
|
||||
Thin-streams and TCP
|
||||
====================
|
||||
A wide range of Internet-based services that use reliable transport
|
||||
protocols display what we call thin-stream properties. This means
|
||||
that the application sends data with such a low rate that the
|
||||
retransmission mechanisms of the transport protocol are not fully
|
||||
effective. In time-dependent scenarios (like online games, control
|
||||
systems, stock trading etc.) where the user experience depends
|
||||
on the data delivery latency, packet loss can be devastating for
|
||||
the service quality. Extreme latencies are caused by TCP's
|
||||
dependency on the arrival of new data from the application to trigger
|
||||
retransmissions effectively through fast retransmit instead of
|
||||
waiting for long timeouts.
|
||||
|
||||
After analysing a large number of time-dependent interactive
|
||||
applications, we have seen that they often produce thin streams
|
||||
and also stay with this traffic pattern throughout its entire
|
||||
lifespan. The combination of time-dependency and the fact that the
|
||||
streams provoke high latencies when using TCP is unfortunate.
|
||||
|
||||
In order to reduce application-layer latency when packets are lost,
|
||||
a set of mechanisms has been made, which address these latency issues
|
||||
for thin streams. In short, if the kernel detects a thin stream,
|
||||
the retransmission mechanisms are modified in the following manner:
|
||||
|
||||
1) If the stream is thin, fast retransmit on the first dupACK.
|
||||
2) If the stream is thin, do not apply exponential backoff.
|
||||
|
||||
These enhancements are applied only if the stream is detected as
|
||||
thin. This is accomplished by defining a threshold for the number
|
||||
of packets in flight. If there are less than 4 packets in flight,
|
||||
fast retransmissions can not be triggered, and the stream is prone
|
||||
to experience high retransmission latencies.
|
||||
|
||||
Since these mechanisms are targeted at time-dependent applications,
|
||||
they must be specifically activated by the application using the
|
||||
TCP_THIN_LINEAR_TIMEOUTS and TCP_THIN_DUPACK IOCTLS or the
|
||||
tcp_thin_linear_timeouts and tcp_thin_dupack sysctls. Both
|
||||
modifications are turned off by default.
|
||||
|
||||
References
|
||||
==========
|
||||
More information on the modifications, as well as a wide range of
|
||||
experimental data can be found here:
|
||||
"Improving latency for interactive, thin-stream applications over
|
||||
reliable transport"
|
||||
http://simula.no/research/nd/publications/Simula.nd.477/simula_pdf_file
|
53
Documentation/powerpc/dts-bindings/fsl/can.txt
Normal file
53
Documentation/powerpc/dts-bindings/fsl/can.txt
Normal file
@ -0,0 +1,53 @@
|
||||
CAN Device Tree Bindings
|
||||
------------------------
|
||||
|
||||
(c) 2006-2009 Secret Lab Technologies Ltd
|
||||
Grant Likely <grant.likely@secretlab.ca>
|
||||
|
||||
fsl,mpc5200-mscan nodes
|
||||
-----------------------
|
||||
In addition to the required compatible-, reg- and interrupt-properties, you can
|
||||
also specify which clock source shall be used for the controller:
|
||||
|
||||
- fsl,mscan-clock-source : a string describing the clock source. Valid values
|
||||
are: "ip" for ip bus clock
|
||||
"ref" for reference clock (XTAL)
|
||||
"ref" is default in case this property is not
|
||||
present.
|
||||
|
||||
fsl,mpc5121-mscan nodes
|
||||
-----------------------
|
||||
In addition to the required compatible-, reg- and interrupt-properties, you can
|
||||
also specify which clock source and divider shall be used for the controller:
|
||||
|
||||
- fsl,mscan-clock-source : a string describing the clock source. Valid values
|
||||
are: "ip" for ip bus clock
|
||||
"ref" for reference clock
|
||||
"sys" for system clock
|
||||
If this property is not present, an optimal CAN
|
||||
clock source and frequency based on the system
|
||||
clock will be selected. If this is not possible,
|
||||
the reference clock will be used.
|
||||
|
||||
- fsl,mscan-clock-divider: for the reference and system clock, an additional
|
||||
clock divider can be specified. By default, a
|
||||
value of 1 is used.
|
||||
|
||||
Note that the MPC5121 Rev. 1 processor is not supported.
|
||||
|
||||
Examples:
|
||||
can@1300 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <12 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
reg = <0x1300 0x80>;
|
||||
};
|
||||
|
||||
can@1380 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <13 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
reg = <0x1380 0x80>;
|
||||
fsl,mscan-clock-source = "ref";
|
||||
fsl,mscan-clock-divider = <3>;
|
||||
};
|
@ -195,11 +195,4 @@ External interrupts:
|
||||
|
||||
fsl,mpc5200-mscan nodes
|
||||
-----------------------
|
||||
In addition to the required compatible-, reg- and interrupt-properites, you can
|
||||
also specify which clock source shall be used for the controller:
|
||||
|
||||
- fsl,mscan-clock-source- a string describing the clock source. Valid values
|
||||
are: "ip" for ip bus clock
|
||||
"ref" for reference clock (XTAL)
|
||||
"ref" is default in case this property is not
|
||||
present.
|
||||
See file can.txt in this directory.
|
||||
|
30
MAINTAINERS
30
MAINTAINERS
@ -2391,6 +2391,12 @@ F: Documentation/isdn/README.gigaset
|
||||
F: drivers/isdn/gigaset/
|
||||
F: include/linux/gigaset_dev.h
|
||||
|
||||
GRETH 10/100/1G Ethernet MAC device driver
|
||||
M: Kristoffer Glembo <kristoffer@gaisler.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/greth*
|
||||
|
||||
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
||||
M: Frank Seidel <frank@f-seidel.de>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
@ -3528,9 +3534,9 @@ F: drivers/net/mv643xx_eth.*
|
||||
F: include/linux/mv643xx.h
|
||||
|
||||
MARVELL MWL8K WIRELESS DRIVER
|
||||
M: Lennert Buytenhek <buytenh@marvell.com>
|
||||
M: Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/mwl8k.c
|
||||
|
||||
MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER
|
||||
@ -4480,6 +4486,13 @@ S: Supported
|
||||
F: Documentation/networking/LICENSE.qla3xxx
|
||||
F: drivers/net/qla3xxx.*
|
||||
|
||||
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
||||
M: Amit Kumar Salecha <amit.salecha@qlogic.com>
|
||||
M: linux-driver@qlogic.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/qlcnic/
|
||||
|
||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||
M: Ron Mercer <ron.mercer@qlogic.com>
|
||||
M: linux-driver@qlogic.com
|
||||
@ -4874,6 +4887,8 @@ F: drivers/scsi/be2iscsi/
|
||||
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
||||
M: Sathya Perla <sathyap@serverengines.com>
|
||||
M: Subbu Seetharaman <subbus@serverengines.com>
|
||||
M: Sarveshwar Bandi <sarveshwarb@serverengines.com>
|
||||
M: Ajit Khaparde <ajitk@serverengines.com>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.serverengines.com
|
||||
S: Supported
|
||||
@ -5842,6 +5857,15 @@ S: Maintained
|
||||
F: Documentation/filesystems/vfat.txt
|
||||
F: fs/fat/
|
||||
|
||||
VIRTIO HOST (VHOST)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
L: virtualization@lists.osdl.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/vhost/
|
||||
F: include/linux/vhost.h
|
||||
|
||||
VIA RHINE NETWORK DRIVER
|
||||
M: Roger Luethi <rl@hellgate.ch>
|
||||
S: Maintained
|
||||
@ -6000,7 +6024,7 @@ S: Maintained
|
||||
F: drivers/input/misc/wistron_btns.c
|
||||
|
||||
WL1251 WIRELESS DRIVER
|
||||
M: Kalle Valo <kalle.valo@nokia.com>
|
||||
M: Kalle Valo <kalle.valo@iki.fi>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
|
@ -47,6 +47,7 @@ config KVM_INTEL
|
||||
Provides support for KVM on Itanium 2 processors equipped with the VT
|
||||
extensions.
|
||||
|
||||
source drivers/vhost/Kconfig
|
||||
source drivers/virtio/Kconfig
|
||||
|
||||
endif # VIRTUALIZATION
|
||||
|
@ -535,6 +535,7 @@ enet0: ucc@2000 {
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "clk12";
|
||||
pio-handle = <&pio1>;
|
||||
tbi-handle = <&tbi1>;
|
||||
phy-handle = <&qe_phy0>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
@ -579,7 +580,7 @@ qe_phy7: ethernet-phy@06 {
|
||||
reg = <0x6>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
||||
tbi-phy@11 {
|
||||
tbi1: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
@ -590,7 +591,7 @@ mdio@3520 {
|
||||
reg = <0x3520 0x18>;
|
||||
compatible = "fsl,ucc-mdio";
|
||||
|
||||
tbi0: tbi-phy@15 {
|
||||
tbi6: tbi-phy@15 {
|
||||
reg = <0x15>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
@ -600,7 +601,7 @@ mdio@3720 {
|
||||
#size-cells = <0>;
|
||||
reg = <0x3720 0x38>;
|
||||
compatible = "fsl,ucc-mdio";
|
||||
tbi1: tbi-phy@17 {
|
||||
tbi8: tbi-phy@17 {
|
||||
reg = <0x17>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
@ -617,10 +618,22 @@ enet2: ucc@2200 {
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "clk12";
|
||||
pio-handle = <&pio3>;
|
||||
tbi-handle = <&tbi3>;
|
||||
phy-handle = <&qe_phy2>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
|
||||
mdio@2320 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2320 0x18>;
|
||||
compatible = "fsl,ucc-mdio";
|
||||
tbi3: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
enet1: ucc@3000 {
|
||||
device_type = "network";
|
||||
compatible = "ucc_geth";
|
||||
@ -632,10 +645,22 @@ enet1: ucc@3000 {
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "clk17";
|
||||
pio-handle = <&pio2>;
|
||||
tbi-handle = <&tbi2>;
|
||||
phy-handle = <&qe_phy1>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
|
||||
mdio@3120 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x3120 0x18>;
|
||||
compatible = "fsl,ucc-mdio";
|
||||
tbi2: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
enet3: ucc@3200 {
|
||||
device_type = "network";
|
||||
compatible = "ucc_geth";
|
||||
@ -647,10 +672,22 @@ enet3: ucc@3200 {
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "clk17";
|
||||
pio-handle = <&pio4>;
|
||||
tbi-handle = <&tbi4>;
|
||||
phy-handle = <&qe_phy3>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
|
||||
mdio@3320 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x3320 0x18>;
|
||||
compatible = "fsl,ucc-mdio";
|
||||
tbi4: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
enet5: ucc@3400 {
|
||||
device_type = "network";
|
||||
compatible = "ucc_geth";
|
||||
@ -661,7 +698,7 @@ enet5: ucc@3400 {
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "none";
|
||||
tbi-handle = <&tbi0>;
|
||||
tbi-handle = <&tbi6>;
|
||||
phy-handle = <&qe_phy5>;
|
||||
phy-connection-type = "sgmii";
|
||||
};
|
||||
@ -676,7 +713,7 @@ enet7: ucc@3600 {
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
rx-clock-name = "none";
|
||||
tx-clock-name = "none";
|
||||
tbi-handle = <&tbi1>;
|
||||
tbi-handle = <&tbi8>;
|
||||
phy-handle = <&qe_phy7>;
|
||||
phy-connection-type = "sgmii";
|
||||
};
|
||||
|
@ -1004,7 +1004,6 @@ CONFIG_TIGON3=y
|
||||
CONFIG_SPIDER_NET=m
|
||||
CONFIG_GELIC_NET=m
|
||||
CONFIG_GELIC_WIRELESS=y
|
||||
# CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE is not set
|
||||
# CONFIG_QLA3XXX is not set
|
||||
# CONFIG_ATL1 is not set
|
||||
# CONFIG_ATL1E is not set
|
||||
|
@ -593,7 +593,6 @@ CONFIG_MII=m
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_GELIC_NET=y
|
||||
CONFIG_GELIC_WIRELESS=y
|
||||
# CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
|
||||
#
|
||||
|
@ -75,6 +75,7 @@ config KVM_E500
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
source drivers/vhost/Kconfig
|
||||
source drivers/virtio/Kconfig
|
||||
|
||||
endif # VIRTUALIZATION
|
||||
|
@ -237,6 +237,8 @@ static void __init mpc85xx_mds_setup_arch(void)
|
||||
} else if (machine_is(mpc8569_mds)) {
|
||||
#define BCSR7_UCC12_GETHnRST (0x1 << 2)
|
||||
#define BCSR8_UEM_MARVELL_RST (0x1 << 1)
|
||||
#define BCSR_UCC_RGMII (0x1 << 6)
|
||||
#define BCSR_UCC_RTBI (0x1 << 5)
|
||||
/*
|
||||
* U-Boot mangles interrupt polarity for Marvell PHYs,
|
||||
* so reset built-in and UEM Marvell PHYs, this puts
|
||||
@ -247,6 +249,28 @@ static void __init mpc85xx_mds_setup_arch(void)
|
||||
|
||||
setbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST);
|
||||
clrbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST);
|
||||
|
||||
for (np = NULL; (np = of_find_compatible_node(np,
|
||||
"network",
|
||||
"ucc_geth")) != NULL;) {
|
||||
const unsigned int *prop;
|
||||
int ucc_num;
|
||||
|
||||
prop = of_get_property(np, "cell-index", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
ucc_num = *prop - 1;
|
||||
|
||||
prop = of_get_property(np, "phy-connection-type", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
if (strcmp("rtbi", (const char *)prop) == 0)
|
||||
clrsetbits_8(&bcsr_regs[7 + ucc_num],
|
||||
BCSR_UCC_RGMII, BCSR_UCC_RTBI);
|
||||
}
|
||||
|
||||
}
|
||||
iounmap(bcsr_regs);
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ config KVM
|
||||
|
||||
# OK, it's a little counter-intuitive to do this, but it puts it neatly under
|
||||
# the virtualization menu.
|
||||
source drivers/vhost/Kconfig
|
||||
source drivers/virtio/Kconfig
|
||||
|
||||
endif # VIRTUALIZATION
|
||||
|
@ -43,7 +43,6 @@
|
||||
#include <linux/security.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/netfilter_ipv4/ip_tables.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
|
@ -65,6 +65,7 @@ config KVM_AMD
|
||||
|
||||
# OK, it's a little counter-intuitive to do this, but it puts it neatly under
|
||||
# the virtualization menu.
|
||||
source drivers/vhost/Kconfig
|
||||
source drivers/lguest/Kconfig
|
||||
source drivers/virtio/Kconfig
|
||||
|
||||
|
@ -560,7 +560,7 @@ static void iss_net_set_multicast_list(struct net_device *dev)
|
||||
#if 0
|
||||
if (dev->flags & IFF_PROMISC)
|
||||
return;
|
||||
else if (dev->mc_count)
|
||||
else if (!netdev_mc_empty(dev))
|
||||
dev->flags |= IFF_ALLMULTI;
|
||||
else
|
||||
dev->flags &= ~IFF_ALLMULTI;
|
||||
|
@ -106,6 +106,7 @@ obj-$(CONFIG_HID) += hid/
|
||||
obj-$(CONFIG_PPC_PS3) += ps3/
|
||||
obj-$(CONFIG_OF) += of/
|
||||
obj-$(CONFIG_SSB) += ssb/
|
||||
obj-$(CONFIG_VHOST_NET) += vhost/
|
||||
obj-$(CONFIG_VIRTIO) += virtio/
|
||||
obj-$(CONFIG_VLYNQ) += vlynq/
|
||||
obj-$(CONFIG_STAGING) += staging/
|
||||
|
@ -2064,12 +2064,10 @@ fore200e_get_esi(struct fore200e* fore200e)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %pM\n",
|
||||
fore200e->name,
|
||||
(prom->hw_revision & 0xFF) + '@', /* probably meaningless with SBA boards */
|
||||
prom->serial_number & 0xFFFF,
|
||||
prom->mac_addr[ 2 ], prom->mac_addr[ 3 ], prom->mac_addr[ 4 ],
|
||||
prom->mac_addr[ 5 ], prom->mac_addr[ 6 ], prom->mac_addr[ 7 ]);
|
||||
prom->serial_number & 0xFFFF, &prom->mac_addr[2]);
|
||||
|
||||
for (i = 0; i < ESI_LEN; i++) {
|
||||
fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ];
|
||||
@ -2845,13 +2843,12 @@ fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page)
|
||||
" interrupt line:\t\t%s\n"
|
||||
" physical base address:\t0x%p\n"
|
||||
" virtual base address:\t0x%p\n"
|
||||
" factory address (ESI):\t%02x:%02x:%02x:%02x:%02x:%02x\n"
|
||||
" factory address (ESI):\t%pM\n"
|
||||
" board serial number:\t\t%d\n\n",
|
||||
fore200e_irq_itoa(fore200e->irq),
|
||||
(void*)fore200e->phys_base,
|
||||
fore200e->virt_base,
|
||||
fore200e->esi[0], fore200e->esi[1], fore200e->esi[2],
|
||||
fore200e->esi[3], fore200e->esi[4], fore200e->esi[5],
|
||||
fore200e->esi,
|
||||
fore200e->esi[4] * 256 + fore200e->esi[5]);
|
||||
|
||||
return len;
|
||||
|
@ -3557,10 +3557,7 @@ init_card(struct atm_dev *dev)
|
||||
if (tmp) {
|
||||
memcpy(card->atmdev->esi, tmp->dev_addr, 6);
|
||||
|
||||
printk("%s: ESI %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
card->name, card->atmdev->esi[0], card->atmdev->esi[1],
|
||||
card->atmdev->esi[2], card->atmdev->esi[3],
|
||||
card->atmdev->esi[4], card->atmdev->esi[5]);
|
||||
printk("%s: ESI %pM\n", card->name, card->atmdev->esi);
|
||||
}
|
||||
/*
|
||||
* XXX: </hack>
|
||||
|
@ -998,9 +998,7 @@ static int __devinit eeprom_validate(struct lanai_dev *lanai)
|
||||
(unsigned int) e[EEPROM_MAC_REV + i]);
|
||||
return -EIO;
|
||||
}
|
||||
DPRINTK("eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
e[EEPROM_MAC + 0], e[EEPROM_MAC + 1], e[EEPROM_MAC + 2],
|
||||
e[EEPROM_MAC + 3], e[EEPROM_MAC + 4], e[EEPROM_MAC + 5]);
|
||||
DPRINTK("eeprom: MAC address = %pM\n", &e[EEPROM_MAC]);
|
||||
/* Verify serial number */
|
||||
lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL);
|
||||
v = eeprom_be4(lanai, EEPROM_SERIAL_REV);
|
||||
@ -2483,14 +2481,8 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
|
||||
return sprintf(page, "revision: board=%d, pci_if=%d\n",
|
||||
lanai->board_rev, (int) lanai->pci->revision);
|
||||
if (left-- == 0)
|
||||
return sprintf(page, "EEPROM ESI: "
|
||||
"%02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
lanai->eeprom[EEPROM_MAC + 0],
|
||||
lanai->eeprom[EEPROM_MAC + 1],
|
||||
lanai->eeprom[EEPROM_MAC + 2],
|
||||
lanai->eeprom[EEPROM_MAC + 3],
|
||||
lanai->eeprom[EEPROM_MAC + 4],
|
||||
lanai->eeprom[EEPROM_MAC + 5]);
|
||||
return sprintf(page, "EEPROM ESI: %pM\n",
|
||||
&lanai->eeprom[EEPROM_MAC]);
|
||||
if (left-- == 0)
|
||||
return sprintf(page, "status: SOOL=%d, LOCD=%d, LED=%d, "
|
||||
"GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0,
|
||||
|
@ -807,9 +807,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
|
||||
}
|
||||
}
|
||||
|
||||
printk("nicstar%d: MAC address %02X:%02X:%02X:%02X:%02X:%02X\n", i,
|
||||
card->atmdev->esi[0], card->atmdev->esi[1], card->atmdev->esi[2],
|
||||
card->atmdev->esi[3], card->atmdev->esi[4], card->atmdev->esi[5]);
|
||||
printk("nicstar%d: MAC address %pM\n", i, card->atmdev->esi);
|
||||
|
||||
card->atmdev->dev_data = card;
|
||||
card->atmdev->ci_range.vpi_bits = card->vpibits;
|
||||
|
@ -143,6 +143,8 @@ static int ath3k_probe(struct usb_interface *intf,
|
||||
usb_set_intfdata(intf, data);
|
||||
if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) {
|
||||
usb_set_intfdata(intf, NULL);
|
||||
kfree(data->fw_data);
|
||||
kfree(data);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
static struct usb_device_id bcm203x_table[] = {
|
||||
static const struct usb_device_id bcm203x_table[] = {
|
||||
/* Broadcom Blutonium (BCM2033) */
|
||||
{ USB_DEVICE(0x0a5c, 0x2033) },
|
||||
|
||||
|
@ -703,7 +703,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_USB;
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
SET_HCIDEV_DEV(hdev, &intf->dev);
|
||||
|
||||
|
@ -736,7 +736,7 @@ static int bluecard_open(bluecard_info_t *info)
|
||||
|
||||
info->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
|
@ -469,7 +469,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdev->type = HCI_USB;
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
|
||||
data->hdev = hdev;
|
||||
|
@ -582,7 +582,7 @@ static int bt3c_open(bt3c_info_t *info)
|
||||
|
||||
info->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
|
@ -26,7 +26,8 @@
|
||||
#include "btmrvl_drv.h"
|
||||
|
||||
struct btmrvl_debugfs_data {
|
||||
struct dentry *root_dir, *config_dir, *status_dir;
|
||||
struct dentry *config_dir;
|
||||
struct dentry *status_dir;
|
||||
|
||||
/* config */
|
||||
struct dentry *psmode;
|
||||
@ -363,6 +364,9 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
|
||||
struct btmrvl_private *priv = hdev->driver_data;
|
||||
struct btmrvl_debugfs_data *dbg;
|
||||
|
||||
if (!hdev->debugfs)
|
||||
return;
|
||||
|
||||
dbg = kzalloc(sizeof(*dbg), GFP_KERNEL);
|
||||
priv->debugfs_data = dbg;
|
||||
|
||||
@ -371,9 +375,7 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
|
||||
return;
|
||||
}
|
||||
|
||||
dbg->root_dir = debugfs_create_dir("btmrvl", NULL);
|
||||
|
||||
dbg->config_dir = debugfs_create_dir("config", dbg->root_dir);
|
||||
dbg->config_dir = debugfs_create_dir("config", hdev->debugfs);
|
||||
|
||||
dbg->psmode = debugfs_create_file("psmode", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_psmode_fops);
|
||||
@ -388,7 +390,7 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
|
||||
dbg->hscfgcmd = debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_hscfgcmd_fops);
|
||||
|
||||
dbg->status_dir = debugfs_create_dir("status", dbg->root_dir);
|
||||
dbg->status_dir = debugfs_create_dir("status", hdev->debugfs);
|
||||
dbg->curpsmode = debugfs_create_file("curpsmode", 0444,
|
||||
dbg->status_dir,
|
||||
hdev->driver_data,
|
||||
@ -425,7 +427,5 @@ void btmrvl_debugfs_remove(struct hci_dev *hdev)
|
||||
debugfs_remove(dbg->txdnldready);
|
||||
debugfs_remove(dbg->status_dir);
|
||||
|
||||
debugfs_remove(dbg->root_dir);
|
||||
|
||||
kfree(dbg);
|
||||
}
|
||||
|
@ -563,7 +563,7 @@ struct btmrvl_private *btmrvl_add_card(void *card)
|
||||
|
||||
priv->btmrvl_dev.tx_dnld_rdy = true;
|
||||
|
||||
hdev->type = HCI_SDIO;
|
||||
hdev->bus = HCI_SDIO;
|
||||
hdev->open = btmrvl_open;
|
||||
hdev->close = btmrvl_close;
|
||||
hdev->flush = btmrvl_flush;
|
||||
|
@ -976,7 +976,7 @@ static struct sdio_driver bt_mrvl_sdio = {
|
||||
.remove = btmrvl_sdio_remove,
|
||||
};
|
||||
|
||||
static int btmrvl_sdio_init_module(void)
|
||||
static int __init btmrvl_sdio_init_module(void)
|
||||
{
|
||||
if (sdio_register_driver(&bt_mrvl_sdio) != 0) {
|
||||
BT_ERR("SDIO Driver Registration Failed");
|
||||
@ -989,7 +989,7 @@ static int btmrvl_sdio_init_module(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void btmrvl_sdio_exit_module(void)
|
||||
static void __exit btmrvl_sdio_exit_module(void)
|
||||
{
|
||||
/* Set the flag as user is removing this module. */
|
||||
user_rmmod = 1;
|
||||
|
@ -326,7 +326,7 @@ static int btsdio_probe(struct sdio_func *func,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdev->type = HCI_SDIO;
|
||||
hdev->bus = HCI_SDIO;
|
||||
hdev->driver_data = data;
|
||||
|
||||
data->hdev = hdev;
|
||||
|
@ -500,7 +500,7 @@ static int btuart_open(btuart_info_t *info)
|
||||
|
||||
info->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
|
@ -939,7 +939,7 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdev->type = HCI_USB;
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
|
||||
data->hdev = hdev;
|
||||
|
@ -485,7 +485,7 @@ static int dtl1_open(dtl1_info_t *info)
|
||||
|
||||
info->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
|
@ -383,7 +383,7 @@ static int hci_uart_register_dev(struct hci_uart *hu)
|
||||
|
||||
hu->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_UART;
|
||||
hdev->bus = HCI_UART;
|
||||
hdev->driver_data = hu;
|
||||
|
||||
hdev->open = hci_uart_open;
|
||||
|
@ -236,7 +236,7 @@ static int vhci_open(struct inode *inode, struct file *file)
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_VIRTUAL;
|
||||
hdev->bus = HCI_VIRTUAL;
|
||||
hdev->driver_data = data;
|
||||
|
||||
hdev->open = vhci_open_dev;
|
||||
|
@ -380,7 +380,6 @@ static ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,
|
||||
struct ibft_nic *nic = entry->nic;
|
||||
void *ibft_loc = entry->header;
|
||||
char *str = buf;
|
||||
char *mac;
|
||||
__be32 val;
|
||||
|
||||
if (!nic)
|
||||
@ -419,10 +418,7 @@ static ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,
|
||||
str += sprintf(str, "%d\n", nic->vlan);
|
||||
break;
|
||||
case ibft_eth_mac:
|
||||
mac = nic->mac;
|
||||
str += sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
(u8)mac[0], (u8)mac[1], (u8)mac[2],
|
||||
(u8)mac[3], (u8)mac[4], (u8)mac[5]);
|
||||
str += sprintf(str, "%pM\n", nic->mac);
|
||||
break;
|
||||
case ibft_eth_hostname:
|
||||
str += sprintf_string(str, nic->hostname_len,
|
||||
|
@ -1371,15 +1371,8 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
|
||||
tim.mac_addr = req->dst_mac;
|
||||
tim.vlan_tag = ntohs(req->vlan_tag);
|
||||
if (tdev->ctl(tdev, GET_IFF_FROM_MAC, &tim) < 0 || !tim.dev) {
|
||||
printk(KERN_ERR
|
||||
"%s bad dst mac %02x %02x %02x %02x %02x %02x\n",
|
||||
__func__,
|
||||
req->dst_mac[0],
|
||||
req->dst_mac[1],
|
||||
req->dst_mac[2],
|
||||
req->dst_mac[3],
|
||||
req->dst_mac[4],
|
||||
req->dst_mac[5]);
|
||||
printk(KERN_ERR "%s bad dst mac %pM\n",
|
||||
__func__, req->dst_mac);
|
||||
goto reject;
|
||||
}
|
||||
|
||||
|
@ -810,6 +810,20 @@ static int nes_netdev_set_mac_address(struct net_device *netdev, void *p)
|
||||
}
|
||||
|
||||
|
||||
static void set_allmulti(struct nes_device *nesdev, u32 nic_active_bit)
|
||||
{
|
||||
u32 nic_active;
|
||||
|
||||
nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
|
||||
nic_active |= nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
|
||||
nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
|
||||
nic_active &= ~nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
|
||||
}
|
||||
|
||||
#define get_addr(addrs, index) ((addrs) + (index) * ETH_ALEN)
|
||||
|
||||
/**
|
||||
* nes_netdev_set_multicast_list
|
||||
*/
|
||||
@ -818,7 +832,6 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
struct nes_vnic *nesvnic = netdev_priv(netdev);
|
||||
struct nes_device *nesdev = nesvnic->nesdev;
|
||||
struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
|
||||
struct dev_mc_list *multicast_addr;
|
||||
u32 nic_active_bit;
|
||||
u32 nic_active;
|
||||
u32 perfect_filter_register_address;
|
||||
@ -831,6 +844,7 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
nics_per_function, 4);
|
||||
u8 max_pft_entries_avaiable = NES_PFT_SIZE - pft_entries_preallocated;
|
||||
unsigned long flags;
|
||||
int mc_count = netdev_mc_count(netdev);
|
||||
|
||||
spin_lock_irqsave(&nesadapter->resource_lock, flags);
|
||||
nic_active_bit = 1 << nesvnic->nic_index;
|
||||
@ -845,12 +859,7 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
mc_all_on = 1;
|
||||
} else if ((netdev->flags & IFF_ALLMULTI) ||
|
||||
(nesvnic->nic_index > 3)) {
|
||||
nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
|
||||
nic_active |= nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL, nic_active);
|
||||
nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL);
|
||||
nic_active &= ~nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
|
||||
set_allmulti(nesdev, nic_active_bit);
|
||||
mc_all_on = 1;
|
||||
} else {
|
||||
nic_active = nes_read_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL);
|
||||
@ -862,19 +871,30 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
}
|
||||
|
||||
nes_debug(NES_DBG_NIC_RX, "Number of MC entries = %d, Promiscous = %d, All Multicast = %d.\n",
|
||||
netdev->mc_count, !!(netdev->flags & IFF_PROMISC),
|
||||
mc_count, !!(netdev->flags & IFF_PROMISC),
|
||||
!!(netdev->flags & IFF_ALLMULTI));
|
||||
if (!mc_all_on) {
|
||||
multicast_addr = netdev->mc_list;
|
||||
char *addrs;
|
||||
int i;
|
||||
struct dev_mc_list *mcaddr;
|
||||
|
||||
addrs = kmalloc(ETH_ALEN * mc_count, GFP_ATOMIC);
|
||||
if (!addrs) {
|
||||
set_allmulti(nesdev, nic_active_bit);
|
||||
goto unlock;
|
||||
}
|
||||
i = 0;
|
||||
netdev_for_each_mc_addr(mcaddr, netdev)
|
||||
memcpy(get_addr(addrs, i++),
|
||||
mcaddr->dmi_addr, ETH_ALEN);
|
||||
|
||||
perfect_filter_register_address = NES_IDX_PERFECT_FILTER_LOW +
|
||||
pft_entries_preallocated * 0x8;
|
||||
for (mc_index = 0; mc_index < max_pft_entries_avaiable;
|
||||
mc_index++) {
|
||||
while (multicast_addr && nesvnic->mcrq_mcast_filter &&
|
||||
for (i = 0, mc_index = 0; mc_index < max_pft_entries_avaiable;
|
||||
mc_index++) {
|
||||
while (i < mc_count && nesvnic->mcrq_mcast_filter &&
|
||||
((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic,
|
||||
multicast_addr->dmi_addr)) == 0)) {
|
||||
multicast_addr = multicast_addr->next;
|
||||
}
|
||||
get_addr(addrs, i++))) == 0));
|
||||
if (mc_nic_index < 0)
|
||||
mc_nic_index = nesvnic->nic_index;
|
||||
while (nesadapter->pft_mcast_map[mc_index] < 16 &&
|
||||
@ -890,17 +910,19 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
}
|
||||
if (mc_index >= max_pft_entries_avaiable)
|
||||
break;
|
||||
if (multicast_addr) {
|
||||
if (i < mc_count) {
|
||||
char *addr = get_addr(addrs, i++);
|
||||
|
||||
nes_debug(NES_DBG_NIC_RX, "Assigning MC Address %pM to register 0x%04X nic_idx=%d\n",
|
||||
multicast_addr->dmi_addr,
|
||||
addr,
|
||||
perfect_filter_register_address+(mc_index * 8),
|
||||
mc_nic_index);
|
||||
macaddr_high = ((u16)multicast_addr->dmi_addr[0]) << 8;
|
||||
macaddr_high += (u16)multicast_addr->dmi_addr[1];
|
||||
macaddr_low = ((u32)multicast_addr->dmi_addr[2]) << 24;
|
||||
macaddr_low += ((u32)multicast_addr->dmi_addr[3]) << 16;
|
||||
macaddr_low += ((u32)multicast_addr->dmi_addr[4]) << 8;
|
||||
macaddr_low += (u32)multicast_addr->dmi_addr[5];
|
||||
macaddr_high = ((u16) addr[0]) << 8;
|
||||
macaddr_high += (u16) addr[1];
|
||||
macaddr_low = ((u32) addr[2]) << 24;
|
||||
macaddr_low += ((u32) addr[3]) << 16;
|
||||
macaddr_low += ((u32) addr[4]) << 8;
|
||||
macaddr_low += (u32) addr[5];
|
||||
nes_write_indexed(nesdev,
|
||||
perfect_filter_register_address+(mc_index * 8),
|
||||
macaddr_low);
|
||||
@ -908,7 +930,6 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
perfect_filter_register_address+4+(mc_index * 8),
|
||||
(u32)macaddr_high | NES_MAC_ADDR_VALID |
|
||||
((((u32)(1<<mc_nic_index)) << 16)));
|
||||
multicast_addr = multicast_addr->next;
|
||||
nesadapter->pft_mcast_map[mc_index] =
|
||||
nesvnic->nic_index;
|
||||
} else {
|
||||
@ -920,21 +941,13 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
|
||||
nesadapter->pft_mcast_map[mc_index] = 255;
|
||||
}
|
||||
}
|
||||
kfree(addrs);
|
||||
/* PFT is not large enough */
|
||||
if (multicast_addr && multicast_addr->next) {
|
||||
nic_active = nes_read_indexed(nesdev,
|
||||
NES_IDX_NIC_MULTICAST_ALL);
|
||||
nic_active |= nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL,
|
||||
nic_active);
|
||||
nic_active = nes_read_indexed(nesdev,
|
||||
NES_IDX_NIC_UNICAST_ALL);
|
||||
nic_active &= ~nic_active_bit;
|
||||
nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL,
|
||||
nic_active);
|
||||
}
|
||||
if (i < mc_count)
|
||||
set_allmulti(nesdev, nic_active_bit);
|
||||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&nesadapter->resource_lock, flags);
|
||||
}
|
||||
|
||||
|
@ -1374,7 +1374,7 @@ static void ipoib_cm_skb_reap(struct work_struct *work)
|
||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
else if (skb->protocol == htons(ETH_P_IPV6))
|
||||
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, priv->dev);
|
||||
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
|
||||
#endif
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
|
@ -811,7 +811,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
|
||||
clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
|
||||
|
||||
/* Mark all of the entries that are found or don't exist */
|
||||
for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
|
||||
netdev_for_each_mc_addr(mclist, dev) {
|
||||
union ib_gid mgid;
|
||||
|
||||
if (!ipoib_mcast_addr_is_valid(mclist->dmi_addr,
|
||||
|
@ -7,15 +7,14 @@ menuconfig ISDN
|
||||
depends on NET
|
||||
depends on !S390
|
||||
---help---
|
||||
ISDN ("Integrated Services Digital Networks", called RNIS in France)
|
||||
is a special type of fully digital telephone service; it's mostly
|
||||
used to connect to your Internet service provider (with SLIP or
|
||||
PPP). The main advantage is that the speed is higher than ordinary
|
||||
modem/telephone connections, and that you can have voice
|
||||
conversations while downloading stuff. It only works if your
|
||||
computer is equipped with an ISDN card and both you and your service
|
||||
provider purchased an ISDN line from the phone company. For
|
||||
details, read <http://www.alumni.caltech.edu/~dank/isdn/> on the WWW.
|
||||
ISDN ("Integrated Services Digital Network", called RNIS in France)
|
||||
is a fully digital telephone service that can be used for voice and
|
||||
data connections. If your computer is equipped with an ISDN
|
||||
adapter you can use it to connect to your Internet service provider
|
||||
(with SLIP or PPP) faster than via a conventional telephone modem
|
||||
(though still much slower than with DSL) or to make and accept
|
||||
voice calls (eg. turning your PC into a software answering machine
|
||||
or PABX).
|
||||
|
||||
Select this option if you want your kernel to support ISDN.
|
||||
|
||||
@ -39,17 +38,22 @@ menuconfig ISDN_I4L
|
||||
It is still available, though, for use with adapters that are not
|
||||
supported by the new CAPI subsystem yet.
|
||||
|
||||
source "drivers/isdn/mISDN/Kconfig"
|
||||
|
||||
source "drivers/isdn/i4l/Kconfig"
|
||||
|
||||
menuconfig ISDN_CAPI
|
||||
tristate "CAPI 2.0 subsystem"
|
||||
help
|
||||
This provides the CAPI (Common ISDN Application Programming
|
||||
Interface, a standard making it easy for programs to access ISDN
|
||||
hardware, see <http://www.capi.org/>. This is needed for AVM's set
|
||||
of active ISDN controllers like B1, T1, M1.
|
||||
This provides CAPI (the Common ISDN Application Programming
|
||||
Interface) Version 2.0, a standard making it easy for programs to
|
||||
access ISDN hardware in a device independent way. (For details see
|
||||
<http://www.capi.org/>.) CAPI supports making and accepting voice
|
||||
and data connections, controlling call options and protocols,
|
||||
as well as ISDN supplementary services like call forwarding or
|
||||
three-party conferences (if supported by the specific hardware
|
||||
driver).
|
||||
|
||||
Select this option and the appropriate hardware driver below if
|
||||
you have an ISDN adapter supported by the CAPI subsystem.
|
||||
|
||||
if ISDN_CAPI
|
||||
|
||||
@ -61,4 +65,13 @@ endif # ISDN_CAPI
|
||||
|
||||
source "drivers/isdn/gigaset/Kconfig"
|
||||
|
||||
source "drivers/isdn/hysdn/Kconfig"
|
||||
|
||||
source "drivers/isdn/mISDN/Kconfig"
|
||||
|
||||
config ISDN_HDLC
|
||||
tristate
|
||||
select CRC_CCITT
|
||||
select BITREVERSE
|
||||
|
||||
endif # ISDN
|
||||
|
@ -17,8 +17,7 @@ config CAPI_TRACE
|
||||
If unsure, say Y.
|
||||
|
||||
config ISDN_CAPI_MIDDLEWARE
|
||||
bool "CAPI2.0 Middleware support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
bool "CAPI2.0 Middleware support"
|
||||
help
|
||||
This option will enhance the capabilities of the /dev/capi20
|
||||
interface. It will provide a means of moving a data connection,
|
||||
@ -35,18 +34,19 @@ config ISDN_CAPI_CAPI20
|
||||
Y/M here.
|
||||
|
||||
config ISDN_CAPI_CAPIFS_BOOL
|
||||
bool "CAPI2.0 filesystem support"
|
||||
bool "CAPI2.0 filesystem support (DEPRECATED)"
|
||||
depends on ISDN_CAPI_MIDDLEWARE && ISDN_CAPI_CAPI20
|
||||
help
|
||||
This option provides a special file system, similar to /dev/pts with
|
||||
device nodes for the special ttys established by using the
|
||||
middleware extension above.
|
||||
You no longer need this, udev fully replaces it. This feature is
|
||||
scheduled for removal.
|
||||
|
||||
config ISDN_CAPI_CAPIFS
|
||||
tristate
|
||||
depends on ISDN_CAPI_CAPIFS_BOOL
|
||||
default ISDN_CAPI_CAPI20
|
||||
help
|
||||
This option provides a special file system, similar to /dev/pts with
|
||||
device nodes for the special ttys established by using the
|
||||
middleware extension above. If you want to use pppd with
|
||||
pppdcapiplugin to dial up to your ISP, say Y here.
|
||||
|
||||
config ISDN_CAPI_CAPIDRV
|
||||
tristate "CAPI2.0 capidrv interface support"
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -24,6 +24,7 @@
|
||||
#include <linux/isdn.h>
|
||||
#include <linux/isdnif.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/capi.h>
|
||||
#include <linux/kernelcapi.h>
|
||||
#include <linux/ctype.h>
|
||||
@ -34,7 +35,6 @@
|
||||
#include <linux/isdn/capicmd.h>
|
||||
#include "capidrv.h"
|
||||
|
||||
static char *revision = "$Revision: 1.1.2.2 $";
|
||||
static int debugmode = 0;
|
||||
|
||||
MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux");
|
||||
@ -2210,96 +2210,73 @@ static int capidrv_delcontr(u16 contr)
|
||||
}
|
||||
|
||||
|
||||
static void lower_callback(unsigned int cmd, u32 contr, void *data)
|
||||
static int
|
||||
lower_callback(struct notifier_block *nb, unsigned long val, void *v)
|
||||
{
|
||||
capi_profile profile;
|
||||
u32 contr = (long)v;
|
||||
|
||||
switch (cmd) {
|
||||
case KCI_CONTRUP:
|
||||
switch (val) {
|
||||
case CAPICTR_UP:
|
||||
printk(KERN_INFO "capidrv: controller %hu up\n", contr);
|
||||
(void) capidrv_addcontr(contr, (capi_profile *) data);
|
||||
if (capi20_get_profile(contr, &profile) == CAPI_NOERROR)
|
||||
(void) capidrv_addcontr(contr, &profile);
|
||||
break;
|
||||
case KCI_CONTRDOWN:
|
||||
case CAPICTR_DOWN:
|
||||
printk(KERN_INFO "capidrv: controller %hu down\n", contr);
|
||||
(void) capidrv_delcontr(contr);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* /proc/capi/capidrv:
|
||||
* nrecvctlpkt nrecvdatapkt nsendctlpkt nsenddatapkt
|
||||
*/
|
||||
static int proc_capidrv_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
static int capidrv_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
len += sprintf(page+len, "%lu %lu %lu %lu\n",
|
||||
seq_printf(m, "%lu %lu %lu %lu\n",
|
||||
global.ap.nrecvctlpkt,
|
||||
global.ap.nrecvdatapkt,
|
||||
global.ap.nsentctlpkt,
|
||||
global.ap.nsentdatapkt);
|
||||
if (off+count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len-off) ? count : len-off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct procfsentries {
|
||||
char *name;
|
||||
mode_t mode;
|
||||
int (*read_proc)(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data);
|
||||
struct proc_dir_entry *procent;
|
||||
} procfsentries[] = {
|
||||
/* { "capi", S_IFDIR, 0 }, */
|
||||
{ "capi/capidrv", 0 , proc_capidrv_read_proc },
|
||||
static int capidrv_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, capidrv_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations capidrv_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = capidrv_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static void __init proc_init(void)
|
||||
{
|
||||
int nelem = ARRAY_SIZE(procfsentries);
|
||||
int i;
|
||||
|
||||
for (i=0; i < nelem; i++) {
|
||||
struct procfsentries *p = procfsentries + i;
|
||||
p->procent = create_proc_entry(p->name, p->mode, NULL);
|
||||
if (p->procent) p->procent->read_proc = p->read_proc;
|
||||
}
|
||||
proc_create("capi/capidrv", 0, NULL, &capidrv_proc_fops);
|
||||
}
|
||||
|
||||
static void __exit proc_exit(void)
|
||||
{
|
||||
int nelem = ARRAY_SIZE(procfsentries);
|
||||
int i;
|
||||
|
||||
for (i=nelem-1; i >= 0; i--) {
|
||||
struct procfsentries *p = procfsentries + i;
|
||||
if (p->procent) {
|
||||
remove_proc_entry(p->name, NULL);
|
||||
p->procent = NULL;
|
||||
}
|
||||
}
|
||||
remove_proc_entry("capi/capidrv", NULL);
|
||||
}
|
||||
|
||||
static struct notifier_block capictr_nb = {
|
||||
.notifier_call = lower_callback,
|
||||
};
|
||||
|
||||
static int __init capidrv_init(void)
|
||||
{
|
||||
capi_profile profile;
|
||||
char rev[32];
|
||||
char *p;
|
||||
u32 ncontr, contr;
|
||||
u16 errcode;
|
||||
|
||||
if ((p = strchr(revision, ':')) != NULL && p[1]) {
|
||||
strncpy(rev, p + 2, sizeof(rev));
|
||||
rev[sizeof(rev)-1] = 0;
|
||||
if ((p = strchr(rev, '$')) != NULL && p > rev)
|
||||
*(p-1) = 0;
|
||||
} else
|
||||
strcpy(rev, "1.0");
|
||||
|
||||
global.ap.rparam.level3cnt = -2; /* number of bchannels twice */
|
||||
global.ap.rparam.datablkcnt = 16;
|
||||
global.ap.rparam.datablklen = 2048;
|
||||
@ -2310,7 +2287,7 @@ static int __init capidrv_init(void)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
capi20_set_callback(&global.ap, lower_callback);
|
||||
register_capictr_notifier(&capictr_nb);
|
||||
|
||||
errcode = capi20_get_profile(0, &profile);
|
||||
if (errcode != CAPI_NOERROR) {
|
||||
@ -2327,29 +2304,15 @@ static int __init capidrv_init(void)
|
||||
}
|
||||
proc_init();
|
||||
|
||||
printk(KERN_NOTICE "capidrv: Rev %s: loaded\n", rev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit capidrv_exit(void)
|
||||
{
|
||||
char rev[32];
|
||||
char *p;
|
||||
|
||||
if ((p = strchr(revision, ':')) != NULL) {
|
||||
strncpy(rev, p + 1, sizeof(rev));
|
||||
rev[sizeof(rev)-1] = 0;
|
||||
if ((p = strchr(rev, '$')) != NULL)
|
||||
*p = 0;
|
||||
} else {
|
||||
strcpy(rev, " ??? ");
|
||||
}
|
||||
|
||||
unregister_capictr_notifier(&capictr_nb);
|
||||
capi20_release(&global.ap);
|
||||
|
||||
proc_exit();
|
||||
|
||||
printk(KERN_NOTICE "capidrv: Rev%s: unloaded\n", rev);
|
||||
}
|
||||
|
||||
module_init(capidrv_init);
|
||||
|
@ -25,14 +25,10 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
static char *revision = "$Revision: 1.1.2.3 $";
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
#define CAPIFS_SUPER_MAGIC (('C'<<8)|'N')
|
||||
|
||||
static struct vfsmount *capifs_mnt;
|
||||
static struct dentry *capifs_root;
|
||||
static int capifs_mnt_count;
|
||||
|
||||
static struct {
|
||||
int setuid;
|
||||
@ -118,7 +114,7 @@ capifs_fill_super(struct super_block *s, void *data, int silent)
|
||||
inode->i_fop = &simple_dir_operations;
|
||||
inode->i_nlink = 2;
|
||||
|
||||
capifs_root = s->s_root = d_alloc_root(inode);
|
||||
s->s_root = d_alloc_root(inode);
|
||||
if (s->s_root)
|
||||
return 0;
|
||||
|
||||
@ -141,82 +137,98 @@ static struct file_system_type capifs_fs_type = {
|
||||
.kill_sb = kill_anon_super,
|
||||
};
|
||||
|
||||
static struct dentry *get_node(int num)
|
||||
{
|
||||
char s[10];
|
||||
struct dentry *root = capifs_root;
|
||||
mutex_lock(&root->d_inode->i_mutex);
|
||||
return lookup_one_len(s, root, sprintf(s, "%d", num));
|
||||
}
|
||||
|
||||
void capifs_new_ncci(unsigned int number, dev_t device)
|
||||
static struct dentry *new_ncci(unsigned int number, dev_t device)
|
||||
{
|
||||
struct super_block *s = capifs_mnt->mnt_sb;
|
||||
struct dentry *root = s->s_root;
|
||||
struct dentry *dentry;
|
||||
struct inode *inode = new_inode(capifs_mnt->mnt_sb);
|
||||
if (!inode)
|
||||
return;
|
||||
inode->i_ino = number+2;
|
||||
struct inode *inode;
|
||||
char name[10];
|
||||
int namelen;
|
||||
|
||||
dentry = get_node(number);
|
||||
mutex_lock(&root->d_inode->i_mutex);
|
||||
|
||||
namelen = sprintf(name, "%d", number);
|
||||
dentry = lookup_one_len(name, root, namelen);
|
||||
if (IS_ERR(dentry)) {
|
||||
dentry = NULL;
|
||||
goto unlock_out;
|
||||
}
|
||||
|
||||
if (dentry->d_inode) {
|
||||
dput(dentry);
|
||||
dentry = NULL;
|
||||
goto unlock_out;
|
||||
}
|
||||
|
||||
inode = new_inode(s);
|
||||
if (!inode) {
|
||||
dput(dentry);
|
||||
dentry = NULL;
|
||||
goto unlock_out;
|
||||
}
|
||||
|
||||
/* config contents is protected by root's i_mutex */
|
||||
inode->i_uid = config.setuid ? config.uid : current_fsuid();
|
||||
inode->i_gid = config.setgid ? config.gid : current_fsgid();
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
|
||||
inode->i_ino = number + 2;
|
||||
init_special_inode(inode, S_IFCHR|config.mode, device);
|
||||
//inode->i_op = &capifs_file_inode_operations;
|
||||
|
||||
if (!IS_ERR(dentry) && !dentry->d_inode)
|
||||
d_instantiate(dentry, inode);
|
||||
mutex_unlock(&capifs_root->d_inode->i_mutex);
|
||||
d_instantiate(dentry, inode);
|
||||
dget(dentry);
|
||||
|
||||
unlock_out:
|
||||
mutex_unlock(&root->d_inode->i_mutex);
|
||||
|
||||
return dentry;
|
||||
}
|
||||
|
||||
void capifs_free_ncci(unsigned int number)
|
||||
struct dentry *capifs_new_ncci(unsigned int number, dev_t device)
|
||||
{
|
||||
struct dentry *dentry = get_node(number);
|
||||
struct dentry *dentry;
|
||||
|
||||
if (!IS_ERR(dentry)) {
|
||||
struct inode *inode = dentry->d_inode;
|
||||
if (inode) {
|
||||
inode->i_nlink--;
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
if (simple_pin_fs(&capifs_fs_type, &capifs_mnt, &capifs_mnt_count) < 0)
|
||||
return NULL;
|
||||
|
||||
dentry = new_ncci(number, device);
|
||||
if (!dentry)
|
||||
simple_release_fs(&capifs_mnt, &capifs_mnt_count);
|
||||
|
||||
return dentry;
|
||||
}
|
||||
|
||||
void capifs_free_ncci(struct dentry *dentry)
|
||||
{
|
||||
struct dentry *root = capifs_mnt->mnt_sb->s_root;
|
||||
struct inode *inode;
|
||||
|
||||
if (!dentry)
|
||||
return;
|
||||
|
||||
mutex_lock(&root->d_inode->i_mutex);
|
||||
|
||||
inode = dentry->d_inode;
|
||||
if (inode) {
|
||||
drop_nlink(inode);
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
mutex_unlock(&capifs_root->d_inode->i_mutex);
|
||||
dput(dentry);
|
||||
|
||||
mutex_unlock(&root->d_inode->i_mutex);
|
||||
|
||||
simple_release_fs(&capifs_mnt, &capifs_mnt_count);
|
||||
}
|
||||
|
||||
static int __init capifs_init(void)
|
||||
{
|
||||
char rev[32];
|
||||
char *p;
|
||||
int err;
|
||||
|
||||
if ((p = strchr(revision, ':')) != NULL && p[1]) {
|
||||
strlcpy(rev, p + 2, sizeof(rev));
|
||||
if ((p = strchr(rev, '$')) != NULL && p > rev)
|
||||
*(p-1) = 0;
|
||||
} else
|
||||
strcpy(rev, "1.0");
|
||||
|
||||
err = register_filesystem(&capifs_fs_type);
|
||||
if (!err) {
|
||||
capifs_mnt = kern_mount(&capifs_fs_type);
|
||||
if (IS_ERR(capifs_mnt)) {
|
||||
err = PTR_ERR(capifs_mnt);
|
||||
unregister_filesystem(&capifs_fs_type);
|
||||
}
|
||||
}
|
||||
if (!err)
|
||||
printk(KERN_NOTICE "capifs: Rev %s\n", rev);
|
||||
return err;
|
||||
return register_filesystem(&capifs_fs_type);
|
||||
}
|
||||
|
||||
static void __exit capifs_exit(void)
|
||||
{
|
||||
unregister_filesystem(&capifs_fs_type);
|
||||
mntput(capifs_mnt);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(capifs_new_ncci);
|
||||
|
@ -7,5 +7,22 @@
|
||||
*
|
||||
*/
|
||||
|
||||
void capifs_new_ncci(unsigned int num, dev_t device);
|
||||
void capifs_free_ncci(unsigned int num);
|
||||
#include <linux/dcache.h>
|
||||
|
||||
#if defined(CONFIG_ISDN_CAPI_CAPIFS) || defined(CONFIG_ISDN_CAPI_CAPIFS_MODULE)
|
||||
|
||||
struct dentry *capifs_new_ncci(unsigned int num, dev_t device);
|
||||
void capifs_free_ncci(struct dentry *dentry);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct dentry *capifs_new_ncci(unsigned int num, dev_t device)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void capifs_free_ncci(struct dentry *dentry)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -24,16 +24,19 @@ printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
|
||||
#endif
|
||||
|
||||
enum {
|
||||
CARD_DETECTED = 1,
|
||||
CARD_LOADING = 2,
|
||||
CARD_RUNNING = 3,
|
||||
CAPI_CTR_DETACHED = 0,
|
||||
CAPI_CTR_DETECTED = 1,
|
||||
CAPI_CTR_LOADING = 2,
|
||||
CAPI_CTR_RUNNING = 3,
|
||||
};
|
||||
|
||||
extern struct list_head capi_drivers;
|
||||
extern rwlock_t capi_drivers_list_lock;
|
||||
extern struct mutex capi_drivers_lock;
|
||||
|
||||
extern struct capi_ctr *capi_controller[CAPI_MAXCONTR];
|
||||
extern struct mutex capi_controller_lock;
|
||||
|
||||
extern struct capi20_appl *capi_applications[CAPI_MAXAPPL];
|
||||
extern struct capi_ctr *capi_cards[CAPI_MAXCONTR];
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
|
@ -15,13 +15,12 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
static char *
|
||||
cardstate2str(unsigned short cardstate)
|
||||
static char *state2str(unsigned short state)
|
||||
{
|
||||
switch (cardstate) {
|
||||
case CARD_DETECTED: return "detected";
|
||||
case CARD_LOADING: return "loading";
|
||||
case CARD_RUNNING: return "running";
|
||||
switch (state) {
|
||||
case CAPI_CTR_DETECTED: return "detected";
|
||||
case CAPI_CTR_LOADING: return "loading";
|
||||
case CAPI_CTR_RUNNING: return "running";
|
||||
default: return "???";
|
||||
}
|
||||
}
|
||||
@ -36,9 +35,12 @@ cardstate2str(unsigned short cardstate)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
static void *controller_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(capi_controller_lock)
|
||||
{
|
||||
mutex_lock(&capi_controller_lock);
|
||||
|
||||
if (*pos < CAPI_MAXCONTR)
|
||||
return &capi_cards[*pos];
|
||||
return &capi_controller[*pos];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -47,13 +49,15 @@ static void *controller_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
++*pos;
|
||||
if (*pos < CAPI_MAXCONTR)
|
||||
return &capi_cards[*pos];
|
||||
return &capi_controller[*pos];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void controller_stop(struct seq_file *seq, void *v)
|
||||
__releases(capi_controller_lock)
|
||||
{
|
||||
mutex_unlock(&capi_controller_lock);
|
||||
}
|
||||
|
||||
static int controller_show(struct seq_file *seq, void *v)
|
||||
@ -65,7 +69,7 @@ static int controller_show(struct seq_file *seq, void *v)
|
||||
|
||||
seq_printf(seq, "%d %-10s %-8s %-16s %s\n",
|
||||
ctr->cnr, ctr->driver_name,
|
||||
cardstate2str(ctr->cardstate),
|
||||
state2str(ctr->state),
|
||||
ctr->name,
|
||||
ctr->procinfo ? ctr->procinfo(ctr) : "");
|
||||
|
||||
@ -135,9 +139,11 @@ static const struct file_operations proc_contrstats_ops = {
|
||||
// applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
static void *
|
||||
applications_start(struct seq_file *seq, loff_t *pos)
|
||||
static void *applications_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(capi_controller_lock)
|
||||
{
|
||||
mutex_lock(&capi_controller_lock);
|
||||
|
||||
if (*pos < CAPI_MAXAPPL)
|
||||
return &capi_applications[*pos];
|
||||
|
||||
@ -154,9 +160,10 @@ applications_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
applications_stop(struct seq_file *seq, void *v)
|
||||
static void applications_stop(struct seq_file *seq, void *v)
|
||||
__releases(capi_controller_lock)
|
||||
{
|
||||
mutex_unlock(&capi_controller_lock);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -239,9 +246,9 @@ static const struct file_operations proc_applstats_ops = {
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
static void *capi_driver_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(&capi_drivers_list_lock)
|
||||
__acquires(&capi_drivers_lock)
|
||||
{
|
||||
read_lock(&capi_drivers_list_lock);
|
||||
mutex_lock(&capi_drivers_lock);
|
||||
return seq_list_start(&capi_drivers, *pos);
|
||||
}
|
||||
|
||||
@ -251,9 +258,9 @@ static void *capi_driver_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
}
|
||||
|
||||
static void capi_driver_stop(struct seq_file *seq, void *v)
|
||||
__releases(&capi_drivers_list_lock)
|
||||
__releases(&capi_drivers_lock)
|
||||
{
|
||||
read_unlock(&capi_drivers_list_lock);
|
||||
mutex_unlock(&capi_drivers_lock);
|
||||
}
|
||||
|
||||
static int capi_driver_show(struct seq_file *seq, void *v)
|
||||
|
@ -40,6 +40,8 @@ static inline int muststuff(unsigned char c)
|
||||
* Append received bytes to the command response buffer and forward them
|
||||
* line by line to the response handler. Exit whenever a mode/state change
|
||||
* might have occurred.
|
||||
* Note: Received lines may be terminated by CR, LF, or CR LF, which will be
|
||||
* removed before passing the line to the response handler.
|
||||
* Return value:
|
||||
* number of processed bytes
|
||||
*/
|
||||
@ -65,14 +67,14 @@ static unsigned cmd_loop(unsigned numbytes, struct inbuf_t *inbuf)
|
||||
/* --v-- fall through --v-- */
|
||||
case '\r':
|
||||
/* end of message line, pass to response handler */
|
||||
gig_dbg(DEBUG_TRANSCMD, "%s: End of Message (%d Bytes)",
|
||||
__func__, cbytes);
|
||||
if (cbytes >= MAX_RESP_SIZE) {
|
||||
dev_warn(cs->dev, "response too large (%d)\n",
|
||||
cbytes);
|
||||
cbytes = MAX_RESP_SIZE;
|
||||
}
|
||||
cs->cbytes = cbytes;
|
||||
gigaset_dbg_buffer(DEBUG_TRANSCMD, "received response",
|
||||
cbytes, cs->respdata);
|
||||
gigaset_handle_modem_response(cs);
|
||||
cbytes = 0;
|
||||
|
||||
|
@ -347,12 +347,7 @@ static inline void error_hangup(struct bc_state *bcs)
|
||||
{
|
||||
struct cardstate *cs = bcs->cs;
|
||||
|
||||
gig_dbg(DEBUG_ANY, "%s: scheduling HUP for channel %d",
|
||||
__func__, bcs->channel);
|
||||
|
||||
if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL))
|
||||
dev_err(cs->dev, "event queue full\n");
|
||||
|
||||
gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL);
|
||||
gigaset_schedule_event(cs);
|
||||
}
|
||||
|
||||
@ -1706,8 +1701,7 @@ static void complete_cb(struct cardstate *cs)
|
||||
|
||||
/* unqueue completed buffer */
|
||||
cs->cmdbytes -= cs->curlen;
|
||||
gig_dbg(DEBUG_TRANSCMD|DEBUG_LOCKCMD,
|
||||
"write_command: sent %u bytes, %u left",
|
||||
gig_dbg(DEBUG_OUTPUT, "write_command: sent %u bytes, %u left",
|
||||
cs->curlen, cs->cmdbytes);
|
||||
if (cb->next != NULL) {
|
||||
cs->cmdbuf = cb->next;
|
||||
@ -1881,13 +1875,13 @@ static int start_cbsend(struct cardstate *cs)
|
||||
|
||||
/* check if suspend requested */
|
||||
if (ucs->basstate & BS_SUSPEND) {
|
||||
gig_dbg(DEBUG_TRANSCMD|DEBUG_LOCKCMD, "suspending");
|
||||
gig_dbg(DEBUG_OUTPUT, "suspending");
|
||||
return -EHOSTUNREACH;
|
||||
}
|
||||
|
||||
/* check if AT channel is open */
|
||||
if (!(ucs->basstate & BS_ATOPEN)) {
|
||||
gig_dbg(DEBUG_TRANSCMD|DEBUG_LOCKCMD, "AT channel not open");
|
||||
gig_dbg(DEBUG_OUTPUT, "AT channel not open");
|
||||
rc = req_submit(cs->bcs, HD_OPEN_ATCHANNEL, 0, BAS_TIMEOUT);
|
||||
if (rc < 0) {
|
||||
/* flush command queue */
|
||||
@ -2251,7 +2245,7 @@ static int gigaset_probe(struct usb_interface *interface,
|
||||
int i, j;
|
||||
int rc;
|
||||
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_INIT,
|
||||
"%s: Check if device matches .. (Vendor: 0x%x, Product: 0x%x)",
|
||||
__func__, le16_to_cpu(udev->descriptor.idVendor),
|
||||
le16_to_cpu(udev->descriptor.idProduct));
|
||||
@ -2259,7 +2253,7 @@ static int gigaset_probe(struct usb_interface *interface,
|
||||
/* set required alternate setting */
|
||||
hostif = interface->cur_altsetting;
|
||||
if (hostif->desc.bAlternateSetting != 3) {
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_INIT,
|
||||
"%s: wrong alternate setting %d - trying to switch",
|
||||
__func__, hostif->desc.bAlternateSetting);
|
||||
if (usb_set_interface(udev, hostif->desc.bInterfaceNumber, 3)
|
||||
|
@ -13,6 +13,8 @@
|
||||
|
||||
#include "gigaset.h"
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/isdn/capilli.h>
|
||||
#include <linux/isdn/capicmd.h>
|
||||
#include <linux/isdn/capiutil.h>
|
||||
@ -168,20 +170,6 @@ static inline void ignore_cstruct_param(struct cardstate *cs, _cstruct param,
|
||||
msgname, paramname);
|
||||
}
|
||||
|
||||
/*
|
||||
* check for legal hex digit
|
||||
*/
|
||||
static inline int ishexdigit(char c)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
return 1;
|
||||
if (c >= 'A' && c <= 'F')
|
||||
return 1;
|
||||
if (c >= 'a' && c <= 'f')
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* convert hex to binary
|
||||
*/
|
||||
@ -202,7 +190,7 @@ static int encode_ie(char *in, u8 *out, int maxlen)
|
||||
{
|
||||
int l = 0;
|
||||
while (*in) {
|
||||
if (!ishexdigit(in[0]) || !ishexdigit(in[1]) || l >= maxlen)
|
||||
if (!isxdigit(in[0]) || !isxdigit(in[1]) || l >= maxlen)
|
||||
return -1;
|
||||
out[++l] = (hex2bin(in[0]) << 4) + hex2bin(in[1]);
|
||||
in += 2;
|
||||
@ -1425,9 +1413,10 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
|
||||
|
||||
/* queue & schedule EV_DIAL event */
|
||||
if (!gigaset_add_event(cs, &bcs->at_state, EV_DIAL, commands,
|
||||
bcs->at_state.seq_index, NULL))
|
||||
goto oom;
|
||||
gig_dbg(DEBUG_CMD, "scheduling DIAL");
|
||||
bcs->at_state.seq_index, NULL)) {
|
||||
info = CAPI_MSGOSRESOURCEERR;
|
||||
goto error;
|
||||
}
|
||||
gigaset_schedule_event(cs);
|
||||
ap->connected = APCONN_SETUP;
|
||||
send_conf(iif, ap, skb, CapiSuccess);
|
||||
@ -1541,7 +1530,6 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
|
||||
if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state,
|
||||
EV_ACCEPT, NULL, 0, NULL))
|
||||
return;
|
||||
gig_dbg(DEBUG_CMD, "scheduling ACCEPT");
|
||||
gigaset_schedule_event(cs);
|
||||
return;
|
||||
|
||||
@ -1582,7 +1570,6 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
|
||||
if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state,
|
||||
EV_HUP, NULL, 0, NULL))
|
||||
return;
|
||||
gig_dbg(DEBUG_CMD, "scheduling HUP");
|
||||
gigaset_schedule_event(cs);
|
||||
return;
|
||||
}
|
||||
@ -1665,11 +1652,9 @@ static void do_connect_b3_resp(struct gigaset_capi_ctr *iif,
|
||||
/* trigger hangup, causing eventual DISCONNECT_IND */
|
||||
if (!gigaset_add_event(cs, &bcs->at_state,
|
||||
EV_HUP, NULL, 0, NULL)) {
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
gig_dbg(DEBUG_CMD, "scheduling HUP");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
/* emit DISCONNECT_B3_IND */
|
||||
@ -1768,11 +1753,9 @@ static void do_disconnect_req(struct gigaset_capi_ctr *iif,
|
||||
|
||||
/* trigger hangup, causing eventual DISCONNECT_IND */
|
||||
if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) {
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR);
|
||||
return;
|
||||
}
|
||||
gig_dbg(DEBUG_CMD, "scheduling HUP");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
/* emit reply */
|
||||
@ -1815,11 +1798,9 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif,
|
||||
/* trigger hangup, causing eventual DISCONNECT_B3_IND */
|
||||
if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state,
|
||||
EV_HUP, NULL, 0, NULL)) {
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR);
|
||||
return;
|
||||
}
|
||||
gig_dbg(DEBUG_CMD, "scheduling HUP");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
/* NCPI parameter: not applicable for B3 Transparent */
|
||||
@ -2106,35 +2087,22 @@ static char *gigaset_procinfo(struct capi_ctr *ctr)
|
||||
return ctr->name; /* ToDo: more? */
|
||||
}
|
||||
|
||||
/**
|
||||
* gigaset_ctr_read_proc() - build controller proc file entry
|
||||
* @page: buffer of PAGE_SIZE bytes for receiving the entry.
|
||||
* @start: unused.
|
||||
* @off: unused.
|
||||
* @count: unused.
|
||||
* @eof: unused.
|
||||
* @ctr: controller descriptor structure.
|
||||
*
|
||||
* Return value: length of generated entry
|
||||
*/
|
||||
static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctr)
|
||||
static int gigaset_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctr = m->private;
|
||||
struct cardstate *cs = ctr->driverdata;
|
||||
char *s;
|
||||
int i;
|
||||
int len = 0;
|
||||
len += sprintf(page+len, "%-16s %s\n", "name", ctr->name);
|
||||
len += sprintf(page+len, "%-16s %s %s\n", "dev",
|
||||
|
||||
seq_printf(m, "%-16s %s\n", "name", ctr->name);
|
||||
seq_printf(m, "%-16s %s %s\n", "dev",
|
||||
dev_driver_string(cs->dev), dev_name(cs->dev));
|
||||
len += sprintf(page+len, "%-16s %d\n", "id", cs->myid);
|
||||
seq_printf(m, "%-16s %d\n", "id", cs->myid);
|
||||
if (cs->gotfwver)
|
||||
len += sprintf(page+len, "%-16s %d.%d.%d.%d\n", "firmware",
|
||||
seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware",
|
||||
cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]);
|
||||
len += sprintf(page+len, "%-16s %d\n", "channels",
|
||||
cs->channels);
|
||||
len += sprintf(page+len, "%-16s %s\n", "onechannel",
|
||||
cs->onechannel ? "yes" : "no");
|
||||
seq_printf(m, "%-16s %d\n", "channels", cs->channels);
|
||||
seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no");
|
||||
|
||||
switch (cs->mode) {
|
||||
case M_UNKNOWN:
|
||||
@ -2152,7 +2120,7 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
|
||||
default:
|
||||
s = "??";
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "mode", s);
|
||||
seq_printf(m, "%-16s %s\n", "mode", s);
|
||||
|
||||
switch (cs->mstate) {
|
||||
case MS_UNINITIALIZED:
|
||||
@ -2176,25 +2144,21 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
|
||||
default:
|
||||
s = "??";
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "mstate", s);
|
||||
seq_printf(m, "%-16s %s\n", "mstate", s);
|
||||
|
||||
len += sprintf(page+len, "%-16s %s\n", "running",
|
||||
cs->running ? "yes" : "no");
|
||||
len += sprintf(page+len, "%-16s %s\n", "connected",
|
||||
cs->connected ? "yes" : "no");
|
||||
len += sprintf(page+len, "%-16s %s\n", "isdn_up",
|
||||
cs->isdn_up ? "yes" : "no");
|
||||
len += sprintf(page+len, "%-16s %s\n", "cidmode",
|
||||
cs->cidmode ? "yes" : "no");
|
||||
seq_printf(m, "%-16s %s\n", "running", cs->running ? "yes" : "no");
|
||||
seq_printf(m, "%-16s %s\n", "connected", cs->connected ? "yes" : "no");
|
||||
seq_printf(m, "%-16s %s\n", "isdn_up", cs->isdn_up ? "yes" : "no");
|
||||
seq_printf(m, "%-16s %s\n", "cidmode", cs->cidmode ? "yes" : "no");
|
||||
|
||||
for (i = 0; i < cs->channels; i++) {
|
||||
len += sprintf(page+len, "[%d]%-13s %d\n", i, "corrupted",
|
||||
seq_printf(m, "[%d]%-13s %d\n", i, "corrupted",
|
||||
cs->bcs[i].corrupted);
|
||||
len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_down",
|
||||
seq_printf(m, "[%d]%-13s %d\n", i, "trans_down",
|
||||
cs->bcs[i].trans_down);
|
||||
len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_up",
|
||||
seq_printf(m, "[%d]%-13s %d\n", i, "trans_up",
|
||||
cs->bcs[i].trans_up);
|
||||
len += sprintf(page+len, "[%d]%-13s %d\n", i, "chstate",
|
||||
seq_printf(m, "[%d]%-13s %d\n", i, "chstate",
|
||||
cs->bcs[i].chstate);
|
||||
switch (cs->bcs[i].proto2) {
|
||||
case L2_BITSYNC:
|
||||
@ -2209,11 +2173,23 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off,
|
||||
default:
|
||||
s = "??";
|
||||
}
|
||||
len += sprintf(page+len, "[%d]%-13s %s\n", i, "proto2", s);
|
||||
seq_printf(m, "[%d]%-13s %s\n", i, "proto2", s);
|
||||
}
|
||||
return len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gigaset_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, gigaset_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations gigaset_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = gigaset_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static struct capi_driver capi_driver_gigaset = {
|
||||
.name = "gigaset",
|
||||
@ -2256,7 +2232,7 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid)
|
||||
iif->ctr.release_appl = gigaset_release_appl;
|
||||
iif->ctr.send_message = gigaset_send_message;
|
||||
iif->ctr.procinfo = gigaset_procinfo;
|
||||
iif->ctr.ctr_read_proc = gigaset_ctr_read_proc;
|
||||
iif->ctr.proc_fops = &gigaset_proc_fops;
|
||||
INIT_LIST_HEAD(&iif->appls);
|
||||
skb_queue_head_init(&iif->sendqueue);
|
||||
atomic_set(&iif->sendqlen, 0);
|
||||
|
@ -149,10 +149,8 @@ static int test_timeout(struct at_state_t *at_state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!gigaset_add_event(at_state->cs, at_state, EV_TIMEOUT, NULL,
|
||||
at_state->timer_index, NULL))
|
||||
dev_err(at_state->cs->dev, "%s: out of memory\n",
|
||||
__func__);
|
||||
gigaset_add_event(at_state->cs, at_state, EV_TIMEOUT, NULL,
|
||||
at_state->timer_index, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -180,7 +178,7 @@ static void timer_tick(unsigned long data)
|
||||
if (cs->running) {
|
||||
mod_timer(&cs->timer, jiffies + msecs_to_jiffies(GIG_TICK));
|
||||
if (timeout) {
|
||||
gig_dbg(DEBUG_CMD, "scheduling timeout");
|
||||
gig_dbg(DEBUG_EVENT, "scheduling timeout");
|
||||
tasklet_schedule(&cs->event_tasklet);
|
||||
}
|
||||
}
|
||||
@ -194,14 +192,14 @@ int gigaset_get_channel(struct bc_state *bcs)
|
||||
|
||||
spin_lock_irqsave(&bcs->cs->lock, flags);
|
||||
if (bcs->use_count || !try_module_get(bcs->cs->driver->owner)) {
|
||||
gig_dbg(DEBUG_ANY, "could not allocate channel %d",
|
||||
gig_dbg(DEBUG_CHANNEL, "could not allocate channel %d",
|
||||
bcs->channel);
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
++bcs->use_count;
|
||||
bcs->busy = 1;
|
||||
gig_dbg(DEBUG_ANY, "allocated channel %d", bcs->channel);
|
||||
gig_dbg(DEBUG_CHANNEL, "allocated channel %d", bcs->channel);
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
return 1;
|
||||
}
|
||||
@ -213,7 +211,7 @@ struct bc_state *gigaset_get_free_channel(struct cardstate *cs)
|
||||
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
if (!try_module_get(cs->driver->owner)) {
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_CHANNEL,
|
||||
"could not get module for allocating channel");
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
return NULL;
|
||||
@ -223,12 +221,12 @@ struct bc_state *gigaset_get_free_channel(struct cardstate *cs)
|
||||
++cs->bcs[i].use_count;
|
||||
cs->bcs[i].busy = 1;
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
gig_dbg(DEBUG_ANY, "allocated channel %d", i);
|
||||
gig_dbg(DEBUG_CHANNEL, "allocated channel %d", i);
|
||||
return cs->bcs + i;
|
||||
}
|
||||
module_put(cs->driver->owner);
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
gig_dbg(DEBUG_ANY, "no free channel");
|
||||
gig_dbg(DEBUG_CHANNEL, "no free channel");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -238,14 +236,15 @@ void gigaset_free_channel(struct bc_state *bcs)
|
||||
|
||||
spin_lock_irqsave(&bcs->cs->lock, flags);
|
||||
if (!bcs->busy) {
|
||||
gig_dbg(DEBUG_ANY, "could not free channel %d", bcs->channel);
|
||||
gig_dbg(DEBUG_CHANNEL, "could not free channel %d",
|
||||
bcs->channel);
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
return;
|
||||
}
|
||||
--bcs->use_count;
|
||||
bcs->busy = 0;
|
||||
module_put(bcs->cs->driver->owner);
|
||||
gig_dbg(DEBUG_ANY, "freed channel %d", bcs->channel);
|
||||
gig_dbg(DEBUG_CHANNEL, "freed channel %d", bcs->channel);
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
}
|
||||
|
||||
@ -258,14 +257,15 @@ int gigaset_get_channels(struct cardstate *cs)
|
||||
for (i = 0; i < cs->channels; ++i)
|
||||
if (cs->bcs[i].use_count) {
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
gig_dbg(DEBUG_ANY, "could not allocate all channels");
|
||||
gig_dbg(DEBUG_CHANNEL,
|
||||
"could not allocate all channels");
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < cs->channels; ++i)
|
||||
++cs->bcs[i].use_count;
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
|
||||
gig_dbg(DEBUG_ANY, "allocated all channels");
|
||||
gig_dbg(DEBUG_CHANNEL, "allocated all channels");
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -275,7 +275,7 @@ void gigaset_free_channels(struct cardstate *cs)
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
gig_dbg(DEBUG_ANY, "unblocking all channels");
|
||||
gig_dbg(DEBUG_CHANNEL, "unblocking all channels");
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
for (i = 0; i < cs->channels; ++i)
|
||||
--cs->bcs[i].use_count;
|
||||
@ -287,7 +287,7 @@ void gigaset_block_channels(struct cardstate *cs)
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
gig_dbg(DEBUG_ANY, "blocking all channels");
|
||||
gig_dbg(DEBUG_CHANNEL, "blocking all channels");
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
for (i = 0; i < cs->channels; ++i)
|
||||
++cs->bcs[i].use_count;
|
||||
@ -338,6 +338,8 @@ struct event_t *gigaset_add_event(struct cardstate *cs,
|
||||
unsigned next, tail;
|
||||
struct event_t *event = NULL;
|
||||
|
||||
gig_dbg(DEBUG_EVENT, "queueing event %d", type);
|
||||
|
||||
spin_lock_irqsave(&cs->ev_lock, flags);
|
||||
|
||||
tail = cs->ev_tail;
|
||||
@ -934,11 +936,8 @@ int gigaset_start(struct cardstate *cs)
|
||||
|
||||
if (!gigaset_add_event(cs, &cs->at_state, EV_START, NULL, 0, NULL)) {
|
||||
cs->waiting = 0;
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
goto error;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling START");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
@ -973,12 +972,8 @@ int gigaset_shutdown(struct cardstate *cs)
|
||||
|
||||
cs->waiting = 1;
|
||||
|
||||
if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL)) {
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL))
|
||||
goto exit;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling SHUTDOWN");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
@ -1004,12 +999,8 @@ void gigaset_stop(struct cardstate *cs)
|
||||
|
||||
cs->waiting = 1;
|
||||
|
||||
if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL)) {
|
||||
dev_err(cs->dev, "%s: out of memory\n", __func__);
|
||||
if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL))
|
||||
goto exit;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling STOP");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
|
@ -427,7 +427,7 @@ static int isdn_getnum(char *p)
|
||||
{
|
||||
int v = -1;
|
||||
|
||||
gig_dbg(DEBUG_TRANSCMD, "string: %s", p);
|
||||
gig_dbg(DEBUG_EVENT, "string: %s", p);
|
||||
|
||||
while (*p >= '0' && *p <= '9')
|
||||
v = ((v < 0) ? 0 : (v * 10)) + (int) ((*p++) - '0');
|
||||
@ -444,7 +444,7 @@ static int isdn_gethex(char *p)
|
||||
int v = 0;
|
||||
int c;
|
||||
|
||||
gig_dbg(DEBUG_TRANSCMD, "string: %s", p);
|
||||
gig_dbg(DEBUG_EVENT, "string: %s", p);
|
||||
|
||||
if (!*p)
|
||||
return -1;
|
||||
@ -517,7 +517,6 @@ void gigaset_handle_modem_response(struct cardstate *cs)
|
||||
return;
|
||||
}
|
||||
cs->respdata[len] = 0;
|
||||
gig_dbg(DEBUG_TRANSCMD, "raw string: '%s'", cs->respdata);
|
||||
argv[0] = cs->respdata;
|
||||
params = 1;
|
||||
if (cs->at_state.getstring) {
|
||||
@ -552,14 +551,14 @@ void gigaset_handle_modem_response(struct cardstate *cs)
|
||||
for (j = 1; j < params; ++j)
|
||||
argv[j][-1] = 0;
|
||||
|
||||
gig_dbg(DEBUG_TRANSCMD, "CMD received: %s", argv[0]);
|
||||
gig_dbg(DEBUG_EVENT, "CMD received: %s", argv[0]);
|
||||
if (cid) {
|
||||
--params;
|
||||
gig_dbg(DEBUG_TRANSCMD, "CID: %s", argv[params]);
|
||||
gig_dbg(DEBUG_EVENT, "CID: %s", argv[params]);
|
||||
}
|
||||
gig_dbg(DEBUG_TRANSCMD, "available params: %d", params - 1);
|
||||
gig_dbg(DEBUG_EVENT, "available params: %d", params - 1);
|
||||
for (j = 1; j < params; j++)
|
||||
gig_dbg(DEBUG_TRANSCMD, "param %d: %s", j, argv[j]);
|
||||
gig_dbg(DEBUG_EVENT, "param %d: %s", j, argv[j]);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&cs->ev_lock, flags);
|
||||
@ -642,7 +641,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
|
||||
dev_err(cs->dev, "out of memory\n");
|
||||
++curarg;
|
||||
}
|
||||
gig_dbg(DEBUG_CMD, "string==%s",
|
||||
gig_dbg(DEBUG_EVENT, "string==%s",
|
||||
event->ptr ? (char *) event->ptr : "NULL");
|
||||
break;
|
||||
case RT_ZCAU:
|
||||
@ -669,7 +668,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
|
||||
++curarg;
|
||||
} else
|
||||
event->parameter = -1;
|
||||
gig_dbg(DEBUG_CMD, "parameter==%d", event->parameter);
|
||||
gig_dbg(DEBUG_EVENT, "parameter==%d", event->parameter);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -684,7 +683,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
|
||||
spin_unlock_irqrestore(&cs->ev_lock, flags);
|
||||
|
||||
if (curarg != params)
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_EVENT,
|
||||
"invalid number of processed parameters: %d/%d",
|
||||
curarg, params);
|
||||
}
|
||||
@ -705,8 +704,8 @@ static void disconnect(struct at_state_t **at_state_p)
|
||||
/* revert to selected idle mode */
|
||||
if (!cs->cidmode) {
|
||||
cs->at_state.pending_commands |= PC_UMMODE;
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_UMMODE");
|
||||
cs->commands_pending = 1;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_UMMODE");
|
||||
}
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
|
||||
@ -784,15 +783,15 @@ static void init_failed(struct cardstate *cs, int mode)
|
||||
static void schedule_init(struct cardstate *cs, int state)
|
||||
{
|
||||
if (cs->at_state.pending_commands & PC_INIT) {
|
||||
gig_dbg(DEBUG_CMD, "not scheduling PC_INIT again");
|
||||
gig_dbg(DEBUG_EVENT, "not scheduling PC_INIT again");
|
||||
return;
|
||||
}
|
||||
cs->mstate = state;
|
||||
cs->mode = M_UNKNOWN;
|
||||
gigaset_block_channels(cs);
|
||||
cs->at_state.pending_commands |= PC_INIT;
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_INIT");
|
||||
cs->commands_pending = 1;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_INIT");
|
||||
}
|
||||
|
||||
/* Add "AT" to a command, add the cid, dle encode it, send the result to the
|
||||
@ -923,7 +922,7 @@ static void start_dial(struct at_state_t *at_state, void *data,
|
||||
}
|
||||
|
||||
at_state->pending_commands |= PC_CID;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_CID");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_CID");
|
||||
cs->commands_pending = 1;
|
||||
return;
|
||||
|
||||
@ -933,7 +932,7 @@ static void start_dial(struct at_state_t *at_state, void *data,
|
||||
commands[i] = NULL;
|
||||
}
|
||||
at_state->pending_commands |= PC_NOCID;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_NOCID");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_NOCID");
|
||||
cs->commands_pending = 1;
|
||||
return;
|
||||
}
|
||||
@ -955,7 +954,7 @@ static void start_accept(struct at_state_t *at_state)
|
||||
dev_err(at_state->cs->dev, "out of memory\n");
|
||||
/* error reset */
|
||||
at_state->pending_commands |= PC_HUP;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_HUP");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_HUP");
|
||||
cs->commands_pending = 1;
|
||||
return;
|
||||
}
|
||||
@ -964,7 +963,7 @@ static void start_accept(struct at_state_t *at_state)
|
||||
snprintf(bcs->commands[AT_ISO], 9, "^SISO=%u\r", bcs->channel + 1);
|
||||
|
||||
at_state->pending_commands |= PC_ACCEPT;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_ACCEPT");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_ACCEPT");
|
||||
cs->commands_pending = 1;
|
||||
}
|
||||
|
||||
@ -1009,8 +1008,8 @@ static void do_shutdown(struct cardstate *cs)
|
||||
if (cs->mstate == MS_READY) {
|
||||
cs->mstate = MS_SHUTDOWN;
|
||||
cs->at_state.pending_commands |= PC_SHUTDOWN;
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_SHUTDOWN");
|
||||
cs->commands_pending = 1;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_SHUTDOWN");
|
||||
} else
|
||||
finish_shutdown(cs);
|
||||
}
|
||||
@ -1191,8 +1190,8 @@ static void do_action(int action, struct cardstate *cs,
|
||||
}
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
cs->at_state.pending_commands |= PC_CIDMODE;
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_CIDMODE");
|
||||
cs->commands_pending = 1;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
|
||||
break;
|
||||
case ACT_FAILINIT:
|
||||
dev_warn(cs->dev, "Could not initialize the device.\n");
|
||||
@ -1443,7 +1442,7 @@ static void do_action(int action, struct cardstate *cs,
|
||||
case ACT_GOTVER:
|
||||
if (cs->gotfwver == 0) {
|
||||
cs->gotfwver = 1;
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_EVENT,
|
||||
"firmware version %02d.%03d.%02d.%02d",
|
||||
cs->fwver[0], cs->fwver[1],
|
||||
cs->fwver[2], cs->fwver[3]);
|
||||
@ -1481,8 +1480,8 @@ static void do_action(int action, struct cardstate *cs,
|
||||
break;
|
||||
case ACT_HUP:
|
||||
at_state->pending_commands |= PC_HUP;
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_HUP");
|
||||
cs->commands_pending = 1;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_HUP");
|
||||
break;
|
||||
|
||||
/* hotplug events */
|
||||
@ -1519,10 +1518,10 @@ static void do_action(int action, struct cardstate *cs,
|
||||
cs->cidmode = ev->parameter;
|
||||
if (ev->parameter) {
|
||||
cs->at_state.pending_commands |= PC_CIDMODE;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_CIDMODE");
|
||||
} else {
|
||||
cs->at_state.pending_commands |= PC_UMMODE;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_UMMODE");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_UMMODE");
|
||||
}
|
||||
cs->commands_pending = 1;
|
||||
}
|
||||
@ -1573,6 +1572,8 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
|
||||
if (ev->cid >= 0) {
|
||||
at_state = at_state_from_cid(cs, ev->cid);
|
||||
if (!at_state) {
|
||||
gig_dbg(DEBUG_EVENT, "event %d for invalid cid %d",
|
||||
ev->type, ev->cid);
|
||||
gigaset_add_event(cs, &cs->at_state, RSP_WRONG_CID,
|
||||
NULL, 0, NULL);
|
||||
return;
|
||||
@ -1580,13 +1581,13 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
|
||||
} else {
|
||||
at_state = ev->at_state;
|
||||
if (at_state_invalid(cs, at_state)) {
|
||||
gig_dbg(DEBUG_ANY, "event for invalid at_state %p",
|
||||
gig_dbg(DEBUG_EVENT, "event for invalid at_state %p",
|
||||
at_state);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "connection state %d, event %d",
|
||||
gig_dbg(DEBUG_EVENT, "connection state %d, event %d",
|
||||
at_state->ConState, ev->type);
|
||||
|
||||
bcs = at_state->bcs;
|
||||
@ -1600,11 +1601,11 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
|
||||
if (ev->parameter != at_state->timer_index
|
||||
|| !at_state->timer_active) {
|
||||
ev->type = RSP_NONE; /* old timeout */
|
||||
gig_dbg(DEBUG_ANY, "old timeout");
|
||||
gig_dbg(DEBUG_EVENT, "old timeout");
|
||||
} else if (!at_state->waiting)
|
||||
gig_dbg(DEBUG_ANY, "timeout occurred");
|
||||
gig_dbg(DEBUG_EVENT, "timeout occurred");
|
||||
else
|
||||
gig_dbg(DEBUG_ANY, "stopped waiting");
|
||||
gig_dbg(DEBUG_EVENT, "stopped waiting");
|
||||
}
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
|
||||
@ -1712,11 +1713,11 @@ static void process_command_flags(struct cardstate *cs)
|
||||
cs->commands_pending = 0;
|
||||
|
||||
if (cs->cur_at_seq) {
|
||||
gig_dbg(DEBUG_CMD, "not searching scheduled commands: busy");
|
||||
gig_dbg(DEBUG_EVENT, "not searching scheduled commands: busy");
|
||||
return;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "searching scheduled commands");
|
||||
gig_dbg(DEBUG_EVENT, "searching scheduled commands");
|
||||
|
||||
sequence = SEQ_NONE;
|
||||
|
||||
@ -1857,7 +1858,7 @@ static void process_command_flags(struct cardstate *cs)
|
||||
switch (cs->mode) {
|
||||
case M_UNIMODEM:
|
||||
cs->at_state.pending_commands |= PC_CIDMODE;
|
||||
gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
|
||||
gig_dbg(DEBUG_EVENT, "Scheduling PC_CIDMODE");
|
||||
cs->commands_pending = 1;
|
||||
return;
|
||||
#ifdef GIG_MAYINITONDIAL
|
||||
|
@ -38,7 +38,7 @@
|
||||
#define GIG_COMPAT {0, 4, 0, 0}
|
||||
|
||||
#define MAX_REC_PARAMS 10 /* Max. number of params in response string */
|
||||
#define MAX_RESP_SIZE 512 /* Max. size of a response string */
|
||||
#define MAX_RESP_SIZE 511 /* Max. size of a response string */
|
||||
|
||||
#define MAX_EVENTS 64 /* size of event queue */
|
||||
|
||||
@ -78,9 +78,10 @@ enum debuglevel {
|
||||
DEBUG_STREAM = 0x00040, /* application data stream I/O events */
|
||||
DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */
|
||||
DEBUG_LLDATA = 0x00100, /* sent/received LL data */
|
||||
DEBUG_EVENT = 0x00200, /* event processing */
|
||||
DEBUG_DRIVER = 0x00400, /* driver structure */
|
||||
DEBUG_HDLC = 0x00800, /* M10x HDLC processing */
|
||||
DEBUG_WRITE = 0x01000, /* M105 data write */
|
||||
DEBUG_CHANNEL = 0x01000, /* channel allocation/deallocation */
|
||||
DEBUG_TRANSCMD = 0x02000, /* AT-COMMANDS+RESPONSES */
|
||||
DEBUG_MCMD = 0x04000, /* COMMANDS THAT ARE SENT VERY OFTEN */
|
||||
DEBUG_INIT = 0x08000, /* (de)allocation+initialization of data
|
||||
@ -498,7 +499,7 @@ struct cardstate {
|
||||
spinlock_t ev_lock;
|
||||
|
||||
/* current modem response */
|
||||
unsigned char respdata[MAX_RESP_SIZE];
|
||||
unsigned char respdata[MAX_RESP_SIZE+1];
|
||||
unsigned cbytes;
|
||||
|
||||
/* private data of hardware drivers */
|
||||
@ -785,8 +786,6 @@ static inline void gigaset_schedule_event(struct cardstate *cs)
|
||||
static inline void gigaset_bchannel_down(struct bc_state *bcs)
|
||||
{
|
||||
gigaset_add_event(bcs->cs, &bcs->at_state, EV_BC_CLOSED, NULL, 0, NULL);
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling BC_CLOSED");
|
||||
gigaset_schedule_event(bcs->cs);
|
||||
}
|
||||
|
||||
@ -795,8 +794,6 @@ static inline void gigaset_bchannel_down(struct bc_state *bcs)
|
||||
static inline void gigaset_bchannel_up(struct bc_state *bcs)
|
||||
{
|
||||
gigaset_add_event(bcs->cs, &bcs->at_state, EV_BC_OPEN, NULL, 0, NULL);
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling BC_OPEN");
|
||||
gigaset_schedule_event(bcs->cs);
|
||||
}
|
||||
|
||||
|
@ -216,7 +216,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
return -EINVAL;
|
||||
|
||||
case ISDN_CMD_DIAL:
|
||||
gig_dbg(DEBUG_ANY,
|
||||
gig_dbg(DEBUG_CMD,
|
||||
"ISDN_CMD_DIAL (phone: %s, msn: %s, si1: %d, si2: %d)",
|
||||
cntrl->parm.setup.phone, cntrl->parm.setup.eazmsn,
|
||||
cntrl->parm.setup.si1, cntrl->parm.setup.si2);
|
||||
@ -304,11 +304,10 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
gigaset_free_channel(bcs);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling DIAL");
|
||||
gigaset_schedule_event(cs);
|
||||
break;
|
||||
case ISDN_CMD_ACCEPTD:
|
||||
gig_dbg(DEBUG_CMD, "ISDN_CMD_ACCEPTD");
|
||||
if (ch >= cs->channels) {
|
||||
dev_err(cs->dev,
|
||||
"ISDN_CMD_ACCEPTD: invalid channel (%d)\n", ch);
|
||||
@ -318,14 +317,11 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
if (!gigaset_add_event(cs, &bcs->at_state,
|
||||
EV_ACCEPT, NULL, 0, NULL))
|
||||
return -ENOMEM;
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling ACCEPT");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
break;
|
||||
case ISDN_CMD_ACCEPTB:
|
||||
break;
|
||||
case ISDN_CMD_HANGUP:
|
||||
gig_dbg(DEBUG_CMD, "ISDN_CMD_HANGUP");
|
||||
if (ch >= cs->channels) {
|
||||
dev_err(cs->dev,
|
||||
"ISDN_CMD_HANGUP: invalid channel (%d)\n", ch);
|
||||
@ -335,8 +331,6 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
if (!gigaset_add_event(cs, &bcs->at_state,
|
||||
EV_HUP, NULL, 0, NULL))
|
||||
return -ENOMEM;
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling HUP");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
break;
|
||||
@ -376,6 +370,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
}
|
||||
break;
|
||||
case ISDN_CMD_SETL3: /* Set L3 to given protocol */
|
||||
gig_dbg(DEBUG_CMD, "ISDN_CMD_SETL3");
|
||||
if (ch >= cs->channels) {
|
||||
dev_err(cs->dev,
|
||||
"ISDN_CMD_SETL3: invalid channel (%d)\n", ch);
|
||||
@ -390,44 +385,9 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
||||
}
|
||||
|
||||
break;
|
||||
case ISDN_CMD_PROCEED:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_PROCEED");
|
||||
break;
|
||||
case ISDN_CMD_ALERT:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_ALERT");
|
||||
if (cntrl->arg >= cs->channels) {
|
||||
dev_err(cs->dev,
|
||||
"ISDN_CMD_ALERT: invalid channel (%d)\n",
|
||||
(int) cntrl->arg);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case ISDN_CMD_REDIR:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_REDIR");
|
||||
break;
|
||||
case ISDN_CMD_PROT_IO:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_PROT_IO");
|
||||
break;
|
||||
case ISDN_CMD_FAXCMD:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_FAXCMD");
|
||||
break;
|
||||
case ISDN_CMD_GETL2:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_GETL2");
|
||||
break;
|
||||
case ISDN_CMD_GETL3:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_GETL3");
|
||||
break;
|
||||
case ISDN_CMD_GETEAZ:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_GETEAZ");
|
||||
break;
|
||||
case ISDN_CMD_SETSIL:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_SETSIL");
|
||||
break;
|
||||
case ISDN_CMD_GETSIL:
|
||||
gig_dbg(DEBUG_ANY, "ISDN_CMD_GETSIL");
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(cs->dev, "unknown command %d from LL\n",
|
||||
gig_dbg(DEBUG_CMD, "unknown command %d from LL",
|
||||
cntrl->command);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -45,8 +45,6 @@ static int if_lock(struct cardstate *cs, int *arg)
|
||||
cs->waiting = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling IF_LOCK");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
@ -81,8 +79,6 @@ static int if_version(struct cardstate *cs, unsigned arg[4])
|
||||
cs->waiting = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling IF_VER");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
@ -274,7 +270,7 @@ static int if_ioctl(struct tty_struct *tty, struct file *file,
|
||||
? -EFAULT : 0;
|
||||
break;
|
||||
default:
|
||||
gig_dbg(DEBUG_ANY, "%s: arg not supported - 0x%04x",
|
||||
gig_dbg(DEBUG_IF, "%s: arg not supported - 0x%04x",
|
||||
__func__, cmd);
|
||||
retval = -ENOIOCTLCMD;
|
||||
}
|
||||
@ -455,7 +451,7 @@ static void if_throttle(struct tty_struct *tty)
|
||||
else if (!cs->open_count)
|
||||
dev_warn(cs->dev, "%s: device not opened\n", __func__);
|
||||
else
|
||||
gig_dbg(DEBUG_ANY, "%s: not implemented\n", __func__);
|
||||
gig_dbg(DEBUG_IF, "%s: not implemented\n", __func__);
|
||||
|
||||
mutex_unlock(&cs->mutex);
|
||||
}
|
||||
@ -479,7 +475,7 @@ static void if_unthrottle(struct tty_struct *tty)
|
||||
else if (!cs->open_count)
|
||||
dev_warn(cs->dev, "%s: device not opened\n", __func__);
|
||||
else
|
||||
gig_dbg(DEBUG_ANY, "%s: not implemented\n", __func__);
|
||||
gig_dbg(DEBUG_IF, "%s: not implemented\n", __func__);
|
||||
|
||||
mutex_unlock(&cs->mutex);
|
||||
}
|
||||
@ -630,7 +626,7 @@ void gigaset_if_receive(struct cardstate *cs,
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
tty = cs->tty;
|
||||
if (tty == NULL)
|
||||
gig_dbg(DEBUG_ANY, "receive on closed device");
|
||||
gig_dbg(DEBUG_IF, "receive on closed device");
|
||||
else {
|
||||
tty_buffer_request_room(tty, len);
|
||||
tty_insert_flip_string(tty, buffer, len);
|
||||
|
@ -905,29 +905,49 @@ void gigaset_isoc_receive(unsigned char *src, unsigned count,
|
||||
|
||||
/* == data input =========================================================== */
|
||||
|
||||
/* process a block of received bytes in command mode (mstate != MS_LOCKED)
|
||||
* Append received bytes to the command response buffer and forward them
|
||||
* line by line to the response handler.
|
||||
* Note: Received lines may be terminated by CR, LF, or CR LF, which will be
|
||||
* removed before passing the line to the response handler.
|
||||
*/
|
||||
static void cmd_loop(unsigned char *src, int numbytes, struct inbuf_t *inbuf)
|
||||
{
|
||||
struct cardstate *cs = inbuf->cs;
|
||||
unsigned cbytes = cs->cbytes;
|
||||
unsigned char c;
|
||||
|
||||
while (numbytes--) {
|
||||
/* copy next character, check for end of line */
|
||||
switch (cs->respdata[cbytes] = *src++) {
|
||||
case '\r':
|
||||
c = *src++;
|
||||
switch (c) {
|
||||
case '\n':
|
||||
/* end of line */
|
||||
gig_dbg(DEBUG_TRANSCMD, "%s: End of Command (%d Bytes)",
|
||||
__func__, cbytes);
|
||||
if (cbytes >= MAX_RESP_SIZE - 1)
|
||||
dev_warn(cs->dev, "response too large\n");
|
||||
if (cbytes == 0 && cs->respdata[0] == '\r') {
|
||||
/* collapse LF with preceding CR */
|
||||
cs->respdata[0] = 0;
|
||||
break;
|
||||
}
|
||||
/* --v-- fall through --v-- */
|
||||
case '\r':
|
||||
/* end of message line, pass to response handler */
|
||||
if (cbytes >= MAX_RESP_SIZE) {
|
||||
dev_warn(cs->dev, "response too large (%d)\n",
|
||||
cbytes);
|
||||
cbytes = MAX_RESP_SIZE;
|
||||
}
|
||||
cs->cbytes = cbytes;
|
||||
gigaset_dbg_buffer(DEBUG_TRANSCMD, "received response",
|
||||
cbytes, cs->respdata);
|
||||
gigaset_handle_modem_response(cs);
|
||||
cbytes = 0;
|
||||
|
||||
/* store EOL byte for CRLF collapsing */
|
||||
cs->respdata[0] = c;
|
||||
break;
|
||||
default:
|
||||
/* advance in line buffer, checking for overflow */
|
||||
if (cbytes < MAX_RESP_SIZE - 1)
|
||||
cbytes++;
|
||||
/* append to line buffer if possible */
|
||||
if (cbytes < MAX_RESP_SIZE)
|
||||
cs->respdata[cbytes] = c;
|
||||
cbytes++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -958,8 +978,6 @@ void gigaset_isoc_input(struct inbuf_t *inbuf)
|
||||
numbytes, src);
|
||||
gigaset_if_receive(inbuf->cs, src, numbytes);
|
||||
} else {
|
||||
gigaset_dbg_buffer(DEBUG_CMD, "received response",
|
||||
numbytes, src);
|
||||
cmd_loop(src, numbytes, inbuf);
|
||||
}
|
||||
|
||||
|
@ -48,8 +48,6 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
|
||||
mutex_unlock(&cs->mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_CMD, "scheduling PROC_CIDMODE");
|
||||
gigaset_schedule_event(cs);
|
||||
|
||||
wait_event(cs->waitqueue, !cs->waiting);
|
||||
|
@ -628,7 +628,7 @@ static int write_modem(struct cardstate *cs)
|
||||
struct usb_cardstate *ucs = cs->hw.usb;
|
||||
unsigned long flags;
|
||||
|
||||
gig_dbg(DEBUG_WRITE, "len: %d...", bcs->tx_skb->len);
|
||||
gig_dbg(DEBUG_OUTPUT, "len: %d...", bcs->tx_skb->len);
|
||||
|
||||
if (!bcs->tx_skb->len) {
|
||||
dev_kfree_skb_any(bcs->tx_skb);
|
||||
|
@ -556,8 +556,7 @@ u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
|
||||
void b1_parse_version(avmctrl_info *card);
|
||||
irqreturn_t b1_interrupt(int interrupt, void *devptr);
|
||||
|
||||
int b1ctl_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl);
|
||||
extern const struct file_operations b1ctl_proc_fops;
|
||||
|
||||
avmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *,
|
||||
long rsize, long ssize);
|
||||
@ -577,7 +576,6 @@ void b1dma_register_appl(struct capi_ctr *ctrl,
|
||||
capi_register_params *rp);
|
||||
void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl);
|
||||
u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
|
||||
int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl);
|
||||
extern const struct file_operations b1dmactl_proc_fops;
|
||||
|
||||
#endif /* _AVMCARD_H_ */
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mm.h>
|
||||
@ -634,18 +636,17 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
int b1ctl_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl)
|
||||
static int b1ctl_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctrl = m->private;
|
||||
avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
|
||||
avmcard *card = cinfo->card;
|
||||
u8 flag;
|
||||
int len = 0;
|
||||
char *s;
|
||||
|
||||
len += sprintf(page+len, "%-16s %s\n", "name", card->name);
|
||||
len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);
|
||||
len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);
|
||||
seq_printf(m, "%-16s %s\n", "name", card->name);
|
||||
seq_printf(m, "%-16s 0x%x\n", "io", card->port);
|
||||
seq_printf(m, "%-16s %d\n", "irq", card->irq);
|
||||
switch (card->cardtype) {
|
||||
case avm_b1isa: s = "B1 ISA"; break;
|
||||
case avm_b1pci: s = "B1 PCI"; break;
|
||||
@ -658,20 +659,20 @@ int b1ctl_read_proc(char *page, char **start, off_t off,
|
||||
case avm_c2: s = "C2"; break;
|
||||
default: s = "???"; break;
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "type", s);
|
||||
seq_printf(m, "%-16s %s\n", "type", s);
|
||||
if (card->cardtype == avm_t1isa)
|
||||
len += sprintf(page+len, "%-16s %d\n", "cardnr", card->cardnr);
|
||||
seq_printf(m, "%-16s %d\n", "cardnr", card->cardnr);
|
||||
if ((s = cinfo->version[VER_DRIVER]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_driver", s);
|
||||
if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
|
||||
if ((s = cinfo->version[VER_SERIAL]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_serial", s);
|
||||
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[3];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
|
||||
"protocol",
|
||||
(flag & 0x01) ? " DSS1" : "",
|
||||
(flag & 0x02) ? " CT1" : "",
|
||||
@ -685,7 +686,7 @@ int b1ctl_read_proc(char *page, char **start, off_t off,
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[5];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s\n",
|
||||
"linetype",
|
||||
(flag & 0x01) ? " point to point" : "",
|
||||
(flag & 0x02) ? " point to multipoint" : "",
|
||||
@ -693,16 +694,25 @@ int b1ctl_read_proc(char *page, char **start, off_t off,
|
||||
(flag & 0x04) ? " leased line with D-channel" : ""
|
||||
);
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
|
||||
if (off+count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len-off) ? count : len-off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int b1ctl_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, b1ctl_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
const struct file_operations b1ctl_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = b1ctl_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
EXPORT_SYMBOL(b1ctl_proc_fops);
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
@ -781,8 +791,6 @@ EXPORT_SYMBOL(b1_send_message);
|
||||
EXPORT_SYMBOL(b1_parse_version);
|
||||
EXPORT_SYMBOL(b1_interrupt);
|
||||
|
||||
EXPORT_SYMBOL(b1ctl_read_proc);
|
||||
|
||||
static int __init b1_init(void)
|
||||
{
|
||||
char *p;
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mm.h>
|
||||
@ -855,21 +857,20 @@ u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl)
|
||||
static int b1dmactl_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctrl = m->private;
|
||||
avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
|
||||
avmcard *card = cinfo->card;
|
||||
u8 flag;
|
||||
int len = 0;
|
||||
char *s;
|
||||
u32 txoff, txlen, rxoff, rxlen, csr;
|
||||
unsigned long flags;
|
||||
|
||||
len += sprintf(page+len, "%-16s %s\n", "name", card->name);
|
||||
len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);
|
||||
len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);
|
||||
len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase);
|
||||
seq_printf(m, "%-16s %s\n", "name", card->name);
|
||||
seq_printf(m, "%-16s 0x%x\n", "io", card->port);
|
||||
seq_printf(m, "%-16s %d\n", "irq", card->irq);
|
||||
seq_printf(m, "%-16s 0x%lx\n", "membase", card->membase);
|
||||
switch (card->cardtype) {
|
||||
case avm_b1isa: s = "B1 ISA"; break;
|
||||
case avm_b1pci: s = "B1 PCI"; break;
|
||||
@ -882,18 +883,18 @@ int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
case avm_c2: s = "C2"; break;
|
||||
default: s = "???"; break;
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "type", s);
|
||||
seq_printf(m, "%-16s %s\n", "type", s);
|
||||
if ((s = cinfo->version[VER_DRIVER]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_driver", s);
|
||||
if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
|
||||
if ((s = cinfo->version[VER_SERIAL]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_serial", s);
|
||||
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[3];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
|
||||
"protocol",
|
||||
(flag & 0x01) ? " DSS1" : "",
|
||||
(flag & 0x02) ? " CT1" : "",
|
||||
@ -907,7 +908,7 @@ int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[5];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s\n",
|
||||
"linetype",
|
||||
(flag & 0x01) ? " point to point" : "",
|
||||
(flag & 0x02) ? " point to multipoint" : "",
|
||||
@ -915,7 +916,7 @@ int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
(flag & 0x04) ? " leased line with D-channel" : ""
|
||||
);
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
|
||||
|
||||
spin_lock_irqsave(&card->lock, flags);
|
||||
@ -930,27 +931,30 @@ int b1dmactl_read_proc(char *page, char **start, off_t off,
|
||||
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
|
||||
len += sprintf(page+len, "%-16s 0x%lx\n",
|
||||
"csr (cached)", (unsigned long)card->csr);
|
||||
len += sprintf(page+len, "%-16s 0x%lx\n",
|
||||
"csr", (unsigned long)csr);
|
||||
len += sprintf(page+len, "%-16s %lu\n",
|
||||
"txoff", (unsigned long)txoff);
|
||||
len += sprintf(page+len, "%-16s %lu\n",
|
||||
"txlen", (unsigned long)txlen);
|
||||
len += sprintf(page+len, "%-16s %lu\n",
|
||||
"rxoff", (unsigned long)rxoff);
|
||||
len += sprintf(page+len, "%-16s %lu\n",
|
||||
"rxlen", (unsigned long)rxlen);
|
||||
seq_printf(m, "%-16s 0x%lx\n", "csr (cached)", (unsigned long)card->csr);
|
||||
seq_printf(m, "%-16s 0x%lx\n", "csr", (unsigned long)csr);
|
||||
seq_printf(m, "%-16s %lu\n", "txoff", (unsigned long)txoff);
|
||||
seq_printf(m, "%-16s %lu\n", "txlen", (unsigned long)txlen);
|
||||
seq_printf(m, "%-16s %lu\n", "rxoff", (unsigned long)rxoff);
|
||||
seq_printf(m, "%-16s %lu\n", "rxlen", (unsigned long)rxlen);
|
||||
|
||||
if (off+count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len-off) ? count : len-off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int b1dmactl_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, b1dmactl_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
const struct file_operations b1dmactl_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = b1dmactl_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
EXPORT_SYMBOL(b1dmactl_proc_fops);
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
EXPORT_SYMBOL(b1dma_reset);
|
||||
@ -963,7 +967,6 @@ EXPORT_SYMBOL(b1dma_reset_ctr);
|
||||
EXPORT_SYMBOL(b1dma_register_appl);
|
||||
EXPORT_SYMBOL(b1dma_release_appl);
|
||||
EXPORT_SYMBOL(b1dma_send_message);
|
||||
EXPORT_SYMBOL(b1dmactl_read_proc);
|
||||
|
||||
static int __init b1dma_init(void)
|
||||
{
|
||||
|
@ -121,7 +121,7 @@ static int b1isa_probe(struct pci_dev *pdev)
|
||||
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = b1isa_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -112,7 +112,7 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev)
|
||||
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = b1pci_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
cinfo->capi_ctrl.owner = THIS_MODULE;
|
||||
|
||||
@ -251,7 +251,7 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev)
|
||||
cinfo->capi_ctrl.load_firmware = b1dma_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = b1pciv4_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -108,7 +108,7 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq,
|
||||
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = b1pcmcia_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mm.h>
|
||||
@ -1062,19 +1064,18 @@ static char *c4_procinfo(struct capi_ctr *ctrl)
|
||||
return cinfo->infobuf;
|
||||
}
|
||||
|
||||
static int c4_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl)
|
||||
static int c4_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctrl = m->private;
|
||||
avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
|
||||
avmcard *card = cinfo->card;
|
||||
u8 flag;
|
||||
int len = 0;
|
||||
char *s;
|
||||
|
||||
len += sprintf(page+len, "%-16s %s\n", "name", card->name);
|
||||
len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);
|
||||
len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);
|
||||
len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase);
|
||||
seq_printf(m, "%-16s %s\n", "name", card->name);
|
||||
seq_printf(m, "%-16s 0x%x\n", "io", card->port);
|
||||
seq_printf(m, "%-16s %d\n", "irq", card->irq);
|
||||
seq_printf(m, "%-16s 0x%lx\n", "membase", card->membase);
|
||||
switch (card->cardtype) {
|
||||
case avm_b1isa: s = "B1 ISA"; break;
|
||||
case avm_b1pci: s = "B1 PCI"; break;
|
||||
@ -1087,18 +1088,18 @@ static int c4_read_proc(char *page, char **start, off_t off,
|
||||
case avm_c2: s = "C2"; break;
|
||||
default: s = "???"; break;
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "type", s);
|
||||
seq_printf(m, "%-16s %s\n", "type", s);
|
||||
if ((s = cinfo->version[VER_DRIVER]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_driver", s);
|
||||
if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
|
||||
if ((s = cinfo->version[VER_SERIAL]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_serial", s);
|
||||
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[3];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
|
||||
"protocol",
|
||||
(flag & 0x01) ? " DSS1" : "",
|
||||
(flag & 0x02) ? " CT1" : "",
|
||||
@ -1112,7 +1113,7 @@ static int c4_read_proc(char *page, char **start, off_t off,
|
||||
if (card->cardtype != avm_m1) {
|
||||
flag = ((u8 *)(ctrl->profile.manu))[5];
|
||||
if (flag)
|
||||
len += sprintf(page+len, "%-16s%s%s%s%s\n",
|
||||
seq_printf(m, "%-16s%s%s%s%s\n",
|
||||
"linetype",
|
||||
(flag & 0x01) ? " point to point" : "",
|
||||
(flag & 0x02) ? " point to multipoint" : "",
|
||||
@ -1120,16 +1121,24 @@ static int c4_read_proc(char *page, char **start, off_t off,
|
||||
(flag & 0x04) ? " leased line with D-channel" : ""
|
||||
);
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
|
||||
if (off+count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len-off) ? count : len-off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int c4_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, c4_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations c4_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = c4_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
|
||||
@ -1201,7 +1210,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
|
||||
cinfo->capi_ctrl.load_firmware = c4_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = c4_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = c4_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = c4_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &c4_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -429,7 +429,7 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr)
|
||||
cinfo->capi_ctrl.load_firmware = t1isa_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = t1isa_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = t1isa_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -119,7 +119,7 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev)
|
||||
cinfo->capi_ctrl.load_firmware = b1dma_load_firmware;
|
||||
cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr;
|
||||
cinfo->capi_ctrl.procinfo = t1pci_procinfo;
|
||||
cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc;
|
||||
cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops;
|
||||
strcpy(cinfo->capi_ctrl.name, card->name);
|
||||
|
||||
retval = attach_capi_ctr(&cinfo->capi_ctrl);
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include "os_capi.h"
|
||||
@ -75,25 +76,32 @@ void diva_os_free_message_buffer(diva_os_message_buffer_s * dmb)
|
||||
/*
|
||||
* proc function for controller info
|
||||
*/
|
||||
static int diva_ctl_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl)
|
||||
static int diva_ctl_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctrl = m->private;
|
||||
diva_card *card = (diva_card *) ctrl->driverdata;
|
||||
int len = 0;
|
||||
|
||||
len += sprintf(page + len, "%s\n", ctrl->name);
|
||||
len += sprintf(page + len, "Serial No. : %s\n", ctrl->serial);
|
||||
len += sprintf(page + len, "Id : %d\n", card->Id);
|
||||
len += sprintf(page + len, "Channels : %d\n", card->d.channels);
|
||||
seq_printf(m, "%s\n", ctrl->name);
|
||||
seq_printf(m, "Serial No. : %s\n", ctrl->serial);
|
||||
seq_printf(m, "Id : %d\n", card->Id);
|
||||
seq_printf(m, "Channels : %d\n", card->d.channels);
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diva_ctl_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, diva_ctl_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations diva_ctl_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = diva_ctl_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
/*
|
||||
* set additional os settings in capi_ctr struct
|
||||
*/
|
||||
@ -102,7 +110,7 @@ void diva_os_set_controller_struct(struct capi_ctr *ctrl)
|
||||
ctrl->driver_name = DRIVERLNAME;
|
||||
ctrl->load_firmware = NULL;
|
||||
ctrl->reset_ctr = NULL;
|
||||
ctrl->ctr_read_proc = diva_ctl_read_proc;
|
||||
ctrl->proc_fops = &diva_ctl_proc_fops;
|
||||
ctrl->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
#include "platform.h"
|
||||
@ -62,39 +63,41 @@ static char *getrev(const char *revision)
|
||||
return rev;
|
||||
}
|
||||
|
||||
static int
|
||||
proc_read(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
static int divadidd_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len = 0;
|
||||
char tmprev[32];
|
||||
|
||||
strcpy(tmprev, main_revision);
|
||||
len += sprintf(page + len, "%s\n", DRIVERNAME);
|
||||
len += sprintf(page + len, "name : %s\n", DRIVERLNAME);
|
||||
len += sprintf(page + len, "release : %s\n", DRIVERRELEASE_DIDD);
|
||||
len += sprintf(page + len, "build : %s(%s)\n",
|
||||
seq_printf(m, "%s\n", DRIVERNAME);
|
||||
seq_printf(m, "name : %s\n", DRIVERLNAME);
|
||||
seq_printf(m, "release : %s\n", DRIVERRELEASE_DIDD);
|
||||
seq_printf(m, "build : %s(%s)\n",
|
||||
diva_didd_common_code_build, DIVA_BUILD);
|
||||
len += sprintf(page + len, "revision : %s\n", getrev(tmprev));
|
||||
seq_printf(m, "revision : %s\n", getrev(tmprev));
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int divadidd_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, divadidd_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations divadidd_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = divadidd_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int DIVA_INIT_FUNCTION create_proc(void)
|
||||
{
|
||||
proc_net_eicon = proc_mkdir("eicon", init_net.proc_net);
|
||||
|
||||
if (proc_net_eicon) {
|
||||
if ((proc_didd =
|
||||
create_proc_entry(DRIVERLNAME, S_IFREG | S_IRUGO,
|
||||
proc_net_eicon))) {
|
||||
proc_didd->read_proc = proc_read;
|
||||
}
|
||||
proc_didd = proc_create(DRIVERLNAME, S_IRUGO, proc_net_eicon,
|
||||
&divadidd_proc_fops);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/poll.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
@ -86,39 +87,40 @@ static void diva_um_timer_function(unsigned long data);
|
||||
extern struct proc_dir_entry *proc_net_eicon;
|
||||
static struct proc_dir_entry *um_idi_proc_entry = NULL;
|
||||
|
||||
static int
|
||||
um_idi_proc_read(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
static int um_idi_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len = 0;
|
||||
char tmprev[32];
|
||||
|
||||
len += sprintf(page + len, "%s\n", DRIVERNAME);
|
||||
len += sprintf(page + len, "name : %s\n", DRIVERLNAME);
|
||||
len += sprintf(page + len, "release : %s\n", DRIVERRELEASE_IDI);
|
||||
seq_printf(m, "%s\n", DRIVERNAME);
|
||||
seq_printf(m, "name : %s\n", DRIVERLNAME);
|
||||
seq_printf(m, "release : %s\n", DRIVERRELEASE_IDI);
|
||||
strcpy(tmprev, main_revision);
|
||||
len += sprintf(page + len, "revision : %s\n", getrev(tmprev));
|
||||
len += sprintf(page + len, "build : %s\n", DIVA_BUILD);
|
||||
len += sprintf(page + len, "major : %d\n", major);
|
||||
seq_printf(m, "revision : %s\n", getrev(tmprev));
|
||||
seq_printf(m, "build : %s\n", DIVA_BUILD);
|
||||
seq_printf(m, "major : %d\n", major);
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int um_idi_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, um_idi_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations um_idi_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = um_idi_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int DIVA_INIT_FUNCTION create_um_idi_proc(void)
|
||||
{
|
||||
um_idi_proc_entry = create_proc_entry(DRIVERLNAME,
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
proc_net_eicon);
|
||||
um_idi_proc_entry = proc_create(DRIVERLNAME, S_IRUGO, proc_net_eicon,
|
||||
&um_idi_proc_fops);
|
||||
if (!um_idi_proc_entry)
|
||||
return (0);
|
||||
|
||||
um_idi_proc_entry->read_proc = um_idi_proc_read;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/list.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
@ -141,14 +142,10 @@ void remove_divas_proc(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** write group_optimization
|
||||
*/
|
||||
static int
|
||||
write_grp_opt(struct file *file, const char __user *buffer, unsigned long count,
|
||||
void *data)
|
||||
static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
|
||||
if ((count == 1) || (count == 2)) {
|
||||
@ -172,14 +169,10 @@ write_grp_opt(struct file *file, const char __user *buffer, unsigned long count,
|
||||
return (-EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
** write dynamic_l1_down
|
||||
*/
|
||||
static int
|
||||
write_d_l1_down(struct file *file, const char __user *buffer, unsigned long count,
|
||||
void *data)
|
||||
static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
|
||||
if ((count == 1) || (count == 2)) {
|
||||
@ -203,63 +196,62 @@ write_d_l1_down(struct file *file, const char __user *buffer, unsigned long coun
|
||||
return (-EINVAL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** read dynamic_l1_down
|
||||
*/
|
||||
static int
|
||||
read_d_l1_down(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
static int d_l1_down_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int len = 0;
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
diva_os_xdi_adapter_t *a = m->private;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
|
||||
len += sprintf(page + len, "%s\n",
|
||||
seq_printf(m, "%s\n",
|
||||
(IoAdapter->capi_cfg.
|
||||
cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" :
|
||||
"0");
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** read group_optimization
|
||||
*/
|
||||
static int
|
||||
read_grp_opt(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
static int d_l1_down_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
int len = 0;
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
return single_open(file, d_l1_down_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations d_l1_down_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = d_l1_down_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.write = d_l1_down_proc_write,
|
||||
};
|
||||
|
||||
static int grp_opt_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
diva_os_xdi_adapter_t *a = m->private;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
|
||||
len += sprintf(page + len, "%s\n",
|
||||
seq_printf(m, "%s\n",
|
||||
(IoAdapter->capi_cfg.
|
||||
cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON)
|
||||
? "1" : "0");
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** info write
|
||||
*/
|
||||
static int
|
||||
info_write(struct file *file, const char __user *buffer, unsigned long count,
|
||||
void *data)
|
||||
static int grp_opt_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
return single_open(file, grp_opt_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations grp_opt_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = grp_opt_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.write = grp_opt_proc_write,
|
||||
};
|
||||
|
||||
static ssize_t info_proc_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
char c[4];
|
||||
|
||||
@ -277,63 +269,46 @@ info_write(struct file *file, const char __user *buffer, unsigned long count,
|
||||
return (-EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
** info read
|
||||
*/
|
||||
static int
|
||||
info_read(char *page, char **start, off_t off, int count, int *eof,
|
||||
void *data)
|
||||
static int info_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int i = 0;
|
||||
int len = 0;
|
||||
char *p;
|
||||
char tmpser[16];
|
||||
diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data;
|
||||
diva_os_xdi_adapter_t *a = m->private;
|
||||
PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
|
||||
|
||||
len +=
|
||||
sprintf(page + len, "Name : %s\n",
|
||||
IoAdapter->Properties.Name);
|
||||
len += sprintf(page + len, "DSP state : %08x\n", a->dsp_mask);
|
||||
len += sprintf(page + len, "Channels : %02d\n",
|
||||
IoAdapter->Properties.Channels);
|
||||
len += sprintf(page + len, "E. max/used : %03d/%03d\n",
|
||||
seq_printf(m, "Name : %s\n", IoAdapter->Properties.Name);
|
||||
seq_printf(m, "DSP state : %08x\n", a->dsp_mask);
|
||||
seq_printf(m, "Channels : %02d\n", IoAdapter->Properties.Channels);
|
||||
seq_printf(m, "E. max/used : %03d/%03d\n",
|
||||
IoAdapter->e_max, IoAdapter->e_count);
|
||||
diva_get_vserial_number(IoAdapter, tmpser);
|
||||
len += sprintf(page + len, "Serial : %s\n", tmpser);
|
||||
len +=
|
||||
sprintf(page + len, "IRQ : %d\n",
|
||||
IoAdapter->irq_info.irq_nr);
|
||||
len += sprintf(page + len, "CardIndex : %d\n", a->CardIndex);
|
||||
len += sprintf(page + len, "CardOrdinal : %d\n", a->CardOrdinal);
|
||||
len += sprintf(page + len, "Controller : %d\n", a->controller);
|
||||
len += sprintf(page + len, "Bus-Type : %s\n",
|
||||
seq_printf(m, "Serial : %s\n", tmpser);
|
||||
seq_printf(m, "IRQ : %d\n", IoAdapter->irq_info.irq_nr);
|
||||
seq_printf(m, "CardIndex : %d\n", a->CardIndex);
|
||||
seq_printf(m, "CardOrdinal : %d\n", a->CardOrdinal);
|
||||
seq_printf(m, "Controller : %d\n", a->controller);
|
||||
seq_printf(m, "Bus-Type : %s\n",
|
||||
(a->Bus ==
|
||||
DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI");
|
||||
len += sprintf(page + len, "Port-Name : %s\n", a->port_name);
|
||||
seq_printf(m, "Port-Name : %s\n", a->port_name);
|
||||
if (a->Bus == DIVAS_XDI_ADAPTER_BUS_PCI) {
|
||||
len +=
|
||||
sprintf(page + len, "PCI-bus : %d\n",
|
||||
a->resources.pci.bus);
|
||||
len +=
|
||||
sprintf(page + len, "PCI-func : %d\n",
|
||||
a->resources.pci.func);
|
||||
seq_printf(m, "PCI-bus : %d\n", a->resources.pci.bus);
|
||||
seq_printf(m, "PCI-func : %d\n", a->resources.pci.func);
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (a->resources.pci.bar[i]) {
|
||||
len +=
|
||||
sprintf(page + len,
|
||||
seq_printf(m,
|
||||
"Mem / I/O %d : 0x%x / mapped : 0x%lx",
|
||||
i, a->resources.pci.bar[i],
|
||||
(unsigned long) a->resources.
|
||||
pci.addr[i]);
|
||||
if (a->resources.pci.length[i]) {
|
||||
len +=
|
||||
sprintf(page + len,
|
||||
seq_printf(m,
|
||||
" / length : %d",
|
||||
a->resources.pci.
|
||||
length[i]);
|
||||
}
|
||||
len += sprintf(page + len, "\n");
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -353,16 +328,25 @@ info_read(char *page, char **start, off_t off, int count, int *eof,
|
||||
} else {
|
||||
p = "ready";
|
||||
}
|
||||
len += sprintf(page + len, "State : %s\n", p);
|
||||
seq_printf(m, "State : %s\n", p);
|
||||
|
||||
if (off + count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len - off) ? count : len - off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int info_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, info_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations info_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = info_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.write = info_proc_write,
|
||||
};
|
||||
|
||||
/*
|
||||
** adapter proc init/de-init
|
||||
*/
|
||||
@ -380,28 +364,20 @@ int create_adapter_proc(diva_os_xdi_adapter_t * a)
|
||||
return (0);
|
||||
a->proc_adapter_dir = (void *) de;
|
||||
|
||||
if (!(pe =
|
||||
create_proc_entry(info_proc_name, S_IFREG | S_IRUGO | S_IWUSR, de)))
|
||||
pe = proc_create_data(info_proc_name, S_IRUGO | S_IWUSR, de,
|
||||
&info_proc_fops, a);
|
||||
if (!pe)
|
||||
return (0);
|
||||
a->proc_info = (void *) pe;
|
||||
pe->write_proc = info_write;
|
||||
pe->read_proc = info_read;
|
||||
pe->data = a;
|
||||
|
||||
if ((pe = create_proc_entry(grp_opt_proc_name,
|
||||
S_IFREG | S_IRUGO | S_IWUSR, de))) {
|
||||
pe = proc_create_data(grp_opt_proc_name, S_IRUGO | S_IWUSR, de,
|
||||
&grp_opt_proc_fops, a);
|
||||
if (pe)
|
||||
a->proc_grp_opt = (void *) pe;
|
||||
pe->write_proc = write_grp_opt;
|
||||
pe->read_proc = read_grp_opt;
|
||||
pe->data = a;
|
||||
}
|
||||
if ((pe = create_proc_entry(d_l1_down_proc_name,
|
||||
S_IFREG | S_IRUGO | S_IWUSR, de))) {
|
||||
pe = proc_create_data(d_l1_down_proc_name, S_IRUGO | S_IWUSR, de,
|
||||
&d_l1_down_proc_fops, a);
|
||||
if (pe)
|
||||
a->proc_d_l1_down = (void *) pe;
|
||||
pe->write_proc = write_d_l1_down;
|
||||
pe->read_proc = read_d_l1_down;
|
||||
pe->data = a;
|
||||
}
|
||||
|
||||
DBG_TRC(("proc entry %s created", tmp));
|
||||
|
||||
|
@ -2846,7 +2846,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
|
||||
int conf;
|
||||
|
||||
if (ch < 0 || ch > 31)
|
||||
return EINVAL;
|
||||
return -EINVAL;
|
||||
oslot_tx = hc->chan[ch].slot_tx;
|
||||
oslot_rx = hc->chan[ch].slot_rx;
|
||||
conf = hc->chan[ch].conf;
|
||||
|
@ -1133,6 +1133,7 @@ inf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (err) {
|
||||
kfree(sc);
|
||||
release_card(card);
|
||||
break;
|
||||
} else
|
||||
card->sc[i - 1] = sc;
|
||||
}
|
||||
|
@ -529,6 +529,7 @@ W6692_fill_Bfifo(struct w6692_ch *wch)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int
|
||||
setvolume(struct w6692_ch *wch, int mic, struct sk_buff *skb)
|
||||
{
|
||||
@ -571,6 +572,7 @@ enable_pots(struct w6692_ch *wch)
|
||||
WriteW6692(card, W_PCTL, card->pctl);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
disable_pots(struct w6692_ch *wch)
|
||||
|
@ -138,7 +138,7 @@ waitrecmsg(struct IsdnCardState *cs, u_char *len,
|
||||
while((!(cs->BC_Read_Reg(cs, 0, ISAR_IRQBIT) & ISAR_IRQSTA)) &&
|
||||
(timeout++ < maxdelay))
|
||||
udelay(1);
|
||||
if (timeout >= maxdelay) {
|
||||
if (timeout > maxdelay) {
|
||||
printk(KERN_WARNING"isar recmsg IRQSTA timeout\n");
|
||||
return(0);
|
||||
}
|
||||
|
@ -11,6 +11,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/skbuff.h>
|
||||
@ -432,26 +434,16 @@ static u16 hycapi_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
hycapi_read_proc
|
||||
|
||||
Informations provided in the /proc/capi-entries.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
static int hycapi_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, struct capi_ctr *ctrl)
|
||||
static int hycapi_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capi_ctr *ctrl = m->private;
|
||||
hycapictrl_info *cinfo = (hycapictrl_info *)(ctrl->driverdata);
|
||||
hysdn_card *card = cinfo->card;
|
||||
int len = 0;
|
||||
char *s;
|
||||
#ifdef HYCAPI_PRINTFNAMES
|
||||
printk(KERN_NOTICE "hycapi_read_proc\n");
|
||||
#endif
|
||||
len += sprintf(page+len, "%-16s %s\n", "name", cinfo->cardname);
|
||||
len += sprintf(page+len, "%-16s 0x%x\n", "io", card->iobase);
|
||||
len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);
|
||||
|
||||
seq_printf(m, "%-16s %s\n", "name", cinfo->cardname);
|
||||
seq_printf(m, "%-16s 0x%x\n", "io", card->iobase);
|
||||
seq_printf(m, "%-16s %d\n", "irq", card->irq);
|
||||
|
||||
switch (card->brdtype) {
|
||||
case BD_PCCARD: s = "HYSDN Hycard"; break;
|
||||
@ -461,24 +453,32 @@ static int hycapi_read_proc(char *page, char **start, off_t off,
|
||||
case BD_PLEXUS: s = "HYSDN Plexus30"; break;
|
||||
default: s = "???"; break;
|
||||
}
|
||||
len += sprintf(page+len, "%-16s %s\n", "type", s);
|
||||
seq_printf(m, "%-16s %s\n", "type", s);
|
||||
if ((s = cinfo->version[VER_DRIVER]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_driver", s);
|
||||
if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
|
||||
if ((s = cinfo->version[VER_SERIAL]) != NULL)
|
||||
len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
|
||||
seq_printf(m, "%-16s %s\n", "ver_serial", s);
|
||||
|
||||
len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
|
||||
|
||||
if (off+count >= len)
|
||||
*eof = 1;
|
||||
if (len < off)
|
||||
return 0;
|
||||
*start = page + off;
|
||||
return ((count < len-off) ? count : len-off);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hycapi_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, hycapi_proc_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static const struct file_operations hycapi_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = hycapi_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
/**************************************************************
|
||||
hycapi_load_firmware
|
||||
|
||||
@ -774,7 +774,7 @@ hycapi_capi_create(hysdn_card *card)
|
||||
ctrl->load_firmware = hycapi_load_firmware;
|
||||
ctrl->reset_ctr = hycapi_reset_ctr;
|
||||
ctrl->procinfo = hycapi_procinfo;
|
||||
ctrl->ctr_read_proc = hycapi_read_proc;
|
||||
ctrl->proc_fops = &hycapi_proc_fops;
|
||||
strcpy(ctrl->name, cinfo->cardname);
|
||||
ctrl->owner = THIS_MODULE;
|
||||
|
||||
|
@ -134,14 +134,7 @@ source "drivers/isdn/sc/Kconfig"
|
||||
|
||||
source "drivers/isdn/act2000/Kconfig"
|
||||
|
||||
source "drivers/isdn/hysdn/Kconfig"
|
||||
|
||||
endmenu
|
||||
# end ISDN_I4L
|
||||
endif
|
||||
|
||||
config ISDN_HDLC
|
||||
tristate
|
||||
select CRC_CCITT
|
||||
select BITREVERSE
|
||||
|
||||
|
@ -950,11 +950,8 @@ static int dvb_net_filter_sec_set(struct net_device *dev,
|
||||
(*secfilter)->filter_mask[10] = mac_mask[1];
|
||||
(*secfilter)->filter_mask[11]=mac_mask[0];
|
||||
|
||||
dprintk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n",
|
||||
dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
dprintk("%s: filter mask=%02x %02x %02x %02x %02x %02x\n",
|
||||
dev->name, mac_mask[0], mac_mask[1], mac_mask[2],
|
||||
mac_mask[3], mac_mask[4], mac_mask[5]);
|
||||
dprintk("%s: filter mac=%pM\n", dev->name, mac);
|
||||
dprintk("%s: filter mask=%pM\n", dev->name, mac_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1142,18 +1139,18 @@ static void wq_set_multicast_list (struct work_struct *work)
|
||||
} else if ((dev->flags & IFF_ALLMULTI)) {
|
||||
dprintk("%s: allmulti mode\n", dev->name);
|
||||
priv->rx_mode = RX_MODE_ALL_MULTI;
|
||||
} else if (dev->mc_count) {
|
||||
} else if (!netdev_mc_empty(dev)) {
|
||||
int mci;
|
||||
struct dev_mc_list *mc;
|
||||
|
||||
dprintk("%s: set_mc_list, %d entries\n",
|
||||
dev->name, dev->mc_count);
|
||||
dev->name, netdev_mc_count(dev));
|
||||
|
||||
priv->rx_mode = RX_MODE_MULTI;
|
||||
priv->multi_num = 0;
|
||||
|
||||
for (mci = 0, mc=dev->mc_list;
|
||||
mci < dev->mc_count;
|
||||
mci < netdev_mc_count(dev);
|
||||
mc = mc->next, mci++) {
|
||||
dvb_set_mc_filter(dev, mc);
|
||||
}
|
||||
@ -1240,7 +1237,6 @@ static void dvb_net_setup(struct net_device *dev)
|
||||
dev->header_ops = &dvb_header_ops;
|
||||
dev->netdev_ops = &dvb_netdev_ops;
|
||||
dev->mtu = 4096;
|
||||
dev->mc_count = 0;
|
||||
|
||||
dev->flags |= IFF_NOARP;
|
||||
}
|
||||
|
@ -111,10 +111,7 @@ static int print_serial_number(struct seq_file *seq, u8 * serialno, int max_len)
|
||||
break;
|
||||
|
||||
case I2O_SNFORMAT_LAN48_MAC: /* LAN-48 MAC Address */
|
||||
seq_printf(seq,
|
||||
"LAN-48 MAC address @ %02X:%02X:%02X:%02X:%02X:%02X",
|
||||
serialno[2], serialno[3],
|
||||
serialno[4], serialno[5], serialno[6], serialno[7]);
|
||||
seq_printf(seq, "LAN-48 MAC address @ %pM", &serialno[2]);
|
||||
break;
|
||||
|
||||
case I2O_SNFORMAT_WAN: /* WAN MAC Address */
|
||||
@ -126,10 +123,8 @@ static int print_serial_number(struct seq_file *seq, u8 * serialno, int max_len)
|
||||
case I2O_SNFORMAT_LAN64_MAC: /* LAN-64 MAC Address */
|
||||
/* FIXME: Figure out what a LAN-64 address really looks like?? */
|
||||
seq_printf(seq,
|
||||
"LAN-64 MAC address @ [?:%02X:%02X:?] %02X:%02X:%02X:%02X:%02X:%02X",
|
||||
serialno[8], serialno[9],
|
||||
serialno[2], serialno[3],
|
||||
serialno[4], serialno[5], serialno[6], serialno[7]);
|
||||
"LAN-64 MAC address @ [?:%02X:%02X:?] %pM",
|
||||
serialno[8], serialno[9], &serialno[2]);
|
||||
break;
|
||||
|
||||
case I2O_SNFORMAT_DDM: /* I2O DDM */
|
||||
|
@ -43,15 +43,14 @@ static int iwmct_fw_parser_init(struct iwmct_priv *priv, const u8 *file,
|
||||
struct iwmct_parser *parser = &priv->parser;
|
||||
struct iwmct_fw_hdr *fw_hdr = &parser->versions;
|
||||
|
||||
LOG_INFOEX(priv, INIT, "-->\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "-->\n");
|
||||
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "file_size=%zd\n", file_size);
|
||||
|
||||
parser->file = file;
|
||||
parser->file_size = file_size;
|
||||
parser->cur_pos = 0;
|
||||
parser->buf = NULL;
|
||||
|
||||
parser->entry_point = 0;
|
||||
parser->buf = kzalloc(block_size, GFP_KERNEL);
|
||||
if (!parser->buf) {
|
||||
LOG_ERROR(priv, FW_DOWNLOAD, "kzalloc error\n");
|
||||
@ -70,7 +69,7 @@ static int iwmct_fw_parser_init(struct iwmct_priv *priv, const u8 *file,
|
||||
|
||||
parser->cur_pos += sizeof(struct iwmct_fw_hdr);
|
||||
|
||||
LOG_INFOEX(priv, INIT, "<--\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "<--\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -113,7 +112,7 @@ static int iwmct_parse_next_section(struct iwmct_priv *priv, const u8 **p_sec,
|
||||
struct iwmct_dbg *dbg = &priv->dbg;
|
||||
struct iwmct_fw_sec_hdr *sec_hdr;
|
||||
|
||||
LOG_INFOEX(priv, INIT, "-->\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "-->\n");
|
||||
|
||||
while (parser->cur_pos + sizeof(struct iwmct_fw_sec_hdr)
|
||||
<= parser->file_size) {
|
||||
@ -152,7 +151,7 @@ static int iwmct_parse_next_section(struct iwmct_priv *priv, const u8 **p_sec,
|
||||
"finished with section cur_pos=%zd\n", parser->cur_pos);
|
||||
}
|
||||
|
||||
LOG_INFOEX(priv, INIT, "<--\n");
|
||||
LOG_TRACE(priv, INIT, "<--\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -167,7 +166,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec,
|
||||
int ret = 0;
|
||||
u32 cmd = 0;
|
||||
|
||||
LOG_INFOEX(priv, INIT, "-->\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "-->\n");
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "Download address 0x%x size 0x%zx\n",
|
||||
addr, sec_size);
|
||||
|
||||
@ -229,7 +228,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec,
|
||||
hdr->cmd = cpu_to_le32(cmd);
|
||||
/* send it down */
|
||||
/* TODO: add more proper sending and error checking */
|
||||
ret = iwmct_tx(priv, 0, parser->buf, trans_size);
|
||||
ret = iwmct_tx(priv, parser->buf, trans_size);
|
||||
if (ret != 0) {
|
||||
LOG_INFO(priv, FW_DOWNLOAD,
|
||||
"iwmct_tx returned %d\n", ret);
|
||||
@ -251,7 +250,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec,
|
||||
if (sent < sec_size)
|
||||
ret = -EINVAL;
|
||||
exit:
|
||||
LOG_INFOEX(priv, INIT, "<--\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "<--\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -262,7 +261,7 @@ static int iwmct_kick_fw(struct iwmct_priv *priv, bool jump)
|
||||
int ret;
|
||||
u32 cmd;
|
||||
|
||||
LOG_INFOEX(priv, INIT, "-->\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "-->\n");
|
||||
|
||||
memset(parser->buf, 0, parser->buf_size);
|
||||
cmd = IWMC_CMD_SIGNATURE << CMD_HDR_SIGNATURE_POS;
|
||||
@ -281,11 +280,11 @@ static int iwmct_kick_fw(struct iwmct_priv *priv, bool jump)
|
||||
LOG_HEXDUMP(FW_DOWNLOAD, parser->buf, sizeof(*hdr));
|
||||
/* send it down */
|
||||
/* TODO: add more proper sending and error checking */
|
||||
ret = iwmct_tx(priv, 0, parser->buf, IWMC_SDIO_BLK_SIZE);
|
||||
ret = iwmct_tx(priv, parser->buf, IWMC_SDIO_BLK_SIZE);
|
||||
if (ret)
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "iwmct_tx returned %d", ret);
|
||||
|
||||
LOG_INFOEX(priv, INIT, "<--\n");
|
||||
LOG_TRACE(priv, FW_DOWNLOAD, "<--\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -298,8 +297,16 @@ int iwmct_fw_load(struct iwmct_priv *priv)
|
||||
__le32 addr;
|
||||
int ret;
|
||||
|
||||
/* clear parser struct */
|
||||
memset(&priv->parser, 0, sizeof(struct iwmct_parser));
|
||||
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "barker download request 0x%x is:\n",
|
||||
priv->barker);
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "******* Top FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_TOP_MSK) ? "was" : "not");
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "******* GPS FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_GPS_MSK) ? "was" : "not");
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "******* BT FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_BT_MSK) ? "was" : "not");
|
||||
|
||||
|
||||
/* get the firmware */
|
||||
ret = request_firmware(&raw, fw_name, &priv->func->dev);
|
||||
@ -317,6 +324,7 @@ int iwmct_fw_load(struct iwmct_priv *priv)
|
||||
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "Read firmware '%s'\n", fw_name);
|
||||
|
||||
/* clear parser struct */
|
||||
ret = iwmct_fw_parser_init(priv, raw->data, raw->size, priv->trans_len);
|
||||
if (ret < 0) {
|
||||
LOG_ERROR(priv, FW_DOWNLOAD,
|
||||
@ -324,7 +332,6 @@ int iwmct_fw_load(struct iwmct_priv *priv)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* checksum */
|
||||
if (!iwmct_checksum(priv)) {
|
||||
LOG_ERROR(priv, FW_DOWNLOAD, "checksum error\n");
|
||||
ret = -EINVAL;
|
||||
@ -333,23 +340,18 @@ int iwmct_fw_load(struct iwmct_priv *priv)
|
||||
|
||||
/* download firmware to device */
|
||||
while (iwmct_parse_next_section(priv, &pdata, &len, &addr)) {
|
||||
if (iwmct_download_section(priv, pdata, len, addr)) {
|
||||
ret = iwmct_download_section(priv, pdata, len, addr);
|
||||
if (ret) {
|
||||
LOG_ERROR(priv, FW_DOWNLOAD,
|
||||
"%s download section failed\n", fw_name);
|
||||
ret = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
iwmct_kick_fw(priv, !!(priv->barker & BARKER_DNLOAD_JUMP_MSK));
|
||||
ret = iwmct_kick_fw(priv, !!(priv->barker & BARKER_DNLOAD_JUMP_MSK));
|
||||
|
||||
exit:
|
||||
kfree(priv->parser.buf);
|
||||
|
||||
if (raw)
|
||||
release_firmware(raw);
|
||||
|
||||
raw = NULL;
|
||||
|
||||
release_firmware(raw);
|
||||
return ret;
|
||||
}
|
||||
|
@ -196,9 +196,7 @@ struct iwmct_priv {
|
||||
struct list_head read_req_list;
|
||||
};
|
||||
|
||||
extern int iwmct_tx(struct iwmct_priv *priv, unsigned int addr,
|
||||
void *src, int count);
|
||||
|
||||
extern int iwmct_tx(struct iwmct_priv *priv, void *src, int count);
|
||||
extern int iwmct_fw_load(struct iwmct_priv *priv);
|
||||
|
||||
extern void iwmct_dbg_init_params(struct iwmct_priv *drv);
|
||||
|
@ -37,13 +37,26 @@
|
||||
#define LOG_SEV_INFO 3
|
||||
#define LOG_SEV_INFOEX 4
|
||||
|
||||
#define LOG_SEV_FILTER_ALL \
|
||||
(BIT(LOG_SEV_CRITICAL) | \
|
||||
BIT(LOG_SEV_ERROR) | \
|
||||
BIT(LOG_SEV_WARNING) | \
|
||||
BIT(LOG_SEV_INFO) | \
|
||||
/* Log levels not defined for FW */
|
||||
#define LOG_SEV_TRACE 5
|
||||
#define LOG_SEV_DUMP 6
|
||||
|
||||
#define LOG_SEV_FW_FILTER_ALL \
|
||||
(BIT(LOG_SEV_CRITICAL) | \
|
||||
BIT(LOG_SEV_ERROR) | \
|
||||
BIT(LOG_SEV_WARNING) | \
|
||||
BIT(LOG_SEV_INFO) | \
|
||||
BIT(LOG_SEV_INFOEX))
|
||||
|
||||
#define LOG_SEV_FILTER_ALL \
|
||||
(BIT(LOG_SEV_CRITICAL) | \
|
||||
BIT(LOG_SEV_ERROR) | \
|
||||
BIT(LOG_SEV_WARNING) | \
|
||||
BIT(LOG_SEV_INFO) | \
|
||||
BIT(LOG_SEV_INFOEX) | \
|
||||
BIT(LOG_SEV_TRACE) | \
|
||||
BIT(LOG_SEV_DUMP))
|
||||
|
||||
/* log source */
|
||||
#define LOG_SRC_INIT 0
|
||||
#define LOG_SRC_DEBUGFS 1
|
||||
@ -104,16 +117,16 @@ do { \
|
||||
__func__, __LINE__, ##args); \
|
||||
} while (0)
|
||||
|
||||
#define LOG_INFOEX(priv, src, fmt, args...) \
|
||||
#define LOG_TRACE(priv, src, fmt, args...) \
|
||||
do { \
|
||||
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFOEX)) \
|
||||
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_TRACE)) \
|
||||
dev_dbg(priv2dev(priv), "%s %d: " fmt, \
|
||||
__func__, __LINE__, ##args); \
|
||||
} while (0)
|
||||
|
||||
#define LOG_HEXDUMP(src, ptr, len) \
|
||||
do { \
|
||||
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFOEX)) \
|
||||
if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_DUMP)) \
|
||||
print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE, \
|
||||
16, 1, ptr, len, false); \
|
||||
} while (0)
|
||||
@ -142,7 +155,7 @@ ssize_t store_iwmct_log_level_fw(struct device *d,
|
||||
#define LOG_ERROR(priv, src, fmt, args...)
|
||||
#define LOG_WARNING(priv, src, fmt, args...)
|
||||
#define LOG_INFO(priv, src, fmt, args...)
|
||||
#define LOG_INFOEX(priv, src, fmt, args...)
|
||||
#define LOG_TRACE(priv, src, fmt, args...)
|
||||
#define LOG_HEXDUMP(src, ptr, len)
|
||||
|
||||
static inline void iwmct_log_top_message(struct iwmct_priv *priv,
|
||||
|
@ -49,6 +49,20 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR(DRIVER_COPYRIGHT);
|
||||
MODULE_FIRMWARE(FW_NAME(FW_API_VER));
|
||||
|
||||
|
||||
static inline int __iwmct_tx(struct iwmct_priv *priv, void *src, int count)
|
||||
{
|
||||
return sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR, src, count);
|
||||
|
||||
}
|
||||
int iwmct_tx(struct iwmct_priv *priv, void *src, int count)
|
||||
{
|
||||
int ret;
|
||||
sdio_claim_host(priv->func);
|
||||
ret = __iwmct_tx(priv, src, count);
|
||||
sdio_release_host(priv->func);
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* This workers main task is to wait for OP_OPR_ALIVE
|
||||
* from TOP FW until ALIVE_MSG_TIMOUT timeout is elapsed.
|
||||
@ -66,7 +80,7 @@ static void iwmct_rescan_worker(struct work_struct *ws)
|
||||
|
||||
ret = bus_rescan_devices(priv->func->dev.bus);
|
||||
if (ret < 0)
|
||||
LOG_INFO(priv, FW_DOWNLOAD, "bus_rescan_devices FAILED!!!\n");
|
||||
LOG_INFO(priv, INIT, "bus_rescan_devices FAILED!!!\n");
|
||||
}
|
||||
|
||||
static void op_top_message(struct iwmct_priv *priv, struct top_msg *msg)
|
||||
@ -137,7 +151,7 @@ int iwmct_send_hcmd(struct iwmct_priv *priv, u8 *cmd, u16 len)
|
||||
int ret;
|
||||
u8 *buf;
|
||||
|
||||
LOG_INFOEX(priv, FW_MSG, "Sending hcmd:\n");
|
||||
LOG_TRACE(priv, FW_MSG, "Sending hcmd:\n");
|
||||
|
||||
/* add padding to 256 for IWMC */
|
||||
((struct top_msg *)cmd)->hdr.flags |= CMD_FLAG_PADDING_256;
|
||||
@ -158,27 +172,12 @@ int iwmct_send_hcmd(struct iwmct_priv *priv, u8 *cmd, u16 len)
|
||||
}
|
||||
|
||||
memcpy(buf, cmd, len);
|
||||
|
||||
sdio_claim_host(priv->func);
|
||||
ret = sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR, buf,
|
||||
FW_HCMD_BLOCK_SIZE);
|
||||
sdio_release_host(priv->func);
|
||||
ret = iwmct_tx(priv, buf, FW_HCMD_BLOCK_SIZE);
|
||||
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iwmct_tx(struct iwmct_priv *priv, unsigned int addr,
|
||||
void *src, int count)
|
||||
{
|
||||
int ret;
|
||||
|
||||
sdio_claim_host(priv->func);
|
||||
ret = sdio_memcpy_toio(priv->func, addr, src, count);
|
||||
sdio_release_host(priv->func);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void iwmct_irq_read_worker(struct work_struct *ws)
|
||||
{
|
||||
@ -192,7 +191,7 @@ static void iwmct_irq_read_worker(struct work_struct *ws)
|
||||
|
||||
priv = container_of(ws, struct iwmct_priv, isr_worker);
|
||||
|
||||
LOG_INFO(priv, IRQ, "enter iwmct_irq_read_worker %p\n", ws);
|
||||
LOG_TRACE(priv, IRQ, "enter iwmct_irq_read_worker %p\n", ws);
|
||||
|
||||
/* --------------------- Handshake with device -------------------- */
|
||||
sdio_claim_host(priv->func);
|
||||
@ -273,8 +272,7 @@ static void iwmct_irq_read_worker(struct work_struct *ws)
|
||||
|
||||
if (barker & BARKER_DNLOAD_SYNC_MSK) {
|
||||
/* Send the same barker back */
|
||||
ret = sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR,
|
||||
buf, iosize);
|
||||
ret = __iwmct_tx(priv, buf, iosize);
|
||||
if (ret) {
|
||||
LOG_ERROR(priv, IRQ,
|
||||
"error %d echoing barker\n", ret);
|
||||
@ -292,15 +290,6 @@ static void iwmct_irq_read_worker(struct work_struct *ws)
|
||||
|
||||
sdio_release_host(priv->func);
|
||||
|
||||
|
||||
LOG_INFO(priv, IRQ, "barker download request 0x%x is:\n", priv->barker);
|
||||
LOG_INFO(priv, IRQ, "******* Top FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_TOP_MSK) ? "was" : "not");
|
||||
LOG_INFO(priv, IRQ, "******* GPS FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_GPS_MSK) ? "was" : "not");
|
||||
LOG_INFO(priv, IRQ, "******* BT FW %s requested ********\n",
|
||||
(priv->barker & BARKER_DNLOAD_BT_MSK) ? "was" : "not");
|
||||
|
||||
if (priv->dbg.fw_download)
|
||||
iwmct_fw_load(priv);
|
||||
else
|
||||
@ -312,7 +301,7 @@ static void iwmct_irq_read_worker(struct work_struct *ws)
|
||||
sdio_release_host(priv->func);
|
||||
exit:
|
||||
kfree(buf);
|
||||
LOG_INFO(priv, IRQ, "exit iwmct_irq_read_worker\n");
|
||||
LOG_TRACE(priv, IRQ, "exit iwmct_irq_read_worker\n");
|
||||
}
|
||||
|
||||
static void iwmct_irq(struct sdio_func *func)
|
||||
@ -325,12 +314,12 @@ static void iwmct_irq(struct sdio_func *func)
|
||||
|
||||
priv = sdio_get_drvdata(func);
|
||||
|
||||
LOG_INFO(priv, IRQ, "enter iwmct_irq\n");
|
||||
LOG_TRACE(priv, IRQ, "enter iwmct_irq\n");
|
||||
|
||||
/* read the function's status register */
|
||||
val = sdio_readb(func, IWMC_SDIO_INTR_STATUS_ADDR, &ret);
|
||||
|
||||
LOG_INFO(priv, IRQ, "iir value = %d, ret=%d\n", val, ret);
|
||||
LOG_TRACE(priv, IRQ, "iir value = %d, ret=%d\n", val, ret);
|
||||
|
||||
if (!val) {
|
||||
LOG_ERROR(priv, IRQ, "iir = 0, exiting ISR\n");
|
||||
@ -372,7 +361,7 @@ static void iwmct_irq(struct sdio_func *func)
|
||||
|
||||
queue_work(priv->wq, &priv->isr_worker);
|
||||
|
||||
LOG_INFO(priv, IRQ, "exit iwmct_irq\n");
|
||||
LOG_TRACE(priv, IRQ, "exit iwmct_irq\n");
|
||||
|
||||
return;
|
||||
|
||||
@ -660,7 +649,7 @@ static int __init iwmct_init(void)
|
||||
|
||||
/* Default log filter settings */
|
||||
iwmct_log_set_filter(LOG_SRC_ALL, LOG_SEV_FILTER_RUNTIME);
|
||||
iwmct_log_set_filter(LOG_SRC_FW_MSG, LOG_SEV_FILTER_ALL);
|
||||
iwmct_log_set_filter(LOG_SRC_FW_MSG, LOG_SEV_FW_FILTER_ALL);
|
||||
iwmct_log_set_fw_filter(LOG_SRC_ALL, FW_LOG_SEV_FILTER_RUNTIME);
|
||||
|
||||
rc = sdio_register_driver(&iwmct_driver);
|
||||
|
@ -812,7 +812,7 @@ static void set_multicast_list(struct net_device *dev)
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
outb(RX_PROM, RX_CMD);
|
||||
inb(RX_STATUS);
|
||||
} else if (dev->mc_list || dev->flags & IFF_ALLMULTI) {
|
||||
} else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
|
||||
/* Multicast or all multicast is the same */
|
||||
outb(RX_MULT, RX_CMD);
|
||||
inb(RX_STATUS); /* Clear status. */
|
||||
|
@ -1216,7 +1216,7 @@ static int elp_close(struct net_device *dev)
|
||||
static void elp_set_mc_list(struct net_device *dev)
|
||||
{
|
||||
elp_device *adapter = netdev_priv(dev);
|
||||
struct dev_mc_list *dmi = dev->mc_list;
|
||||
struct dev_mc_list *dmi;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
||||
@ -1229,11 +1229,10 @@ static void elp_set_mc_list(struct net_device *dev)
|
||||
/* send a "load multicast list" command to the board, max 10 addrs/cmd */
|
||||
/* if num_addrs==0 the list will be cleared */
|
||||
adapter->tx_pcb.command = CMD_LOAD_MULTICAST_LIST;
|
||||
adapter->tx_pcb.length = 6 * dev->mc_count;
|
||||
for (i = 0; i < dev->mc_count; i++) {
|
||||
memcpy(adapter->tx_pcb.data.multicast[i], dmi->dmi_addr, 6);
|
||||
dmi = dmi->next;
|
||||
}
|
||||
adapter->tx_pcb.length = 6 * netdev_mc_count(dev);
|
||||
i = 0;
|
||||
netdev_for_each_mc_addr(dmi, dev)
|
||||
memcpy(adapter->tx_pcb.data.multicast[i++], dmi->dmi_addr, 6);
|
||||
adapter->got[CMD_LOAD_MULTICAST_LIST] = 0;
|
||||
if (!send_pcb(dev, &adapter->tx_pcb))
|
||||
pr_err("%s: couldn't send set_multicast command\n", dev->name);
|
||||
@ -1244,7 +1243,7 @@ static void elp_set_mc_list(struct net_device *dev)
|
||||
TIMEOUT_MSG(__LINE__);
|
||||
}
|
||||
}
|
||||
if (dev->mc_count)
|
||||
if (!netdev_mc_empty(dev))
|
||||
adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD | RECV_MULTI;
|
||||
else /* num_addrs == 0 */
|
||||
adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD;
|
||||
|
@ -1111,12 +1111,14 @@ set_multicast_list(struct net_device *dev)
|
||||
unsigned long flags;
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
int ioaddr = dev->base_addr;
|
||||
int mc_count = netdev_mc_count(dev);
|
||||
|
||||
if (el3_debug > 1) {
|
||||
static int old;
|
||||
if (old != dev->mc_count) {
|
||||
old = dev->mc_count;
|
||||
pr_debug("%s: Setting Rx mode to %d addresses.\n", dev->name, dev->mc_count);
|
||||
if (old != mc_count) {
|
||||
old = mc_count;
|
||||
pr_debug("%s: Setting Rx mode to %d addresses.\n",
|
||||
dev->name, mc_count);
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&lp->lock, flags);
|
||||
@ -1124,7 +1126,7 @@ set_multicast_list(struct net_device *dev)
|
||||
outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
|
||||
ioaddr + EL3_CMD);
|
||||
}
|
||||
else if (dev->mc_count || (dev->flags&IFF_ALLMULTI)) {
|
||||
else if (mc_count || (dev->flags&IFF_ALLMULTI)) {
|
||||
outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast, ioaddr + EL3_CMD);
|
||||
}
|
||||
else
|
||||
|
@ -1536,7 +1536,7 @@ static void set_rx_mode(struct net_device *dev)
|
||||
pr_debug("%s: Setting promiscuous mode.\n",
|
||||
dev->name);
|
||||
new_mode = SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm;
|
||||
} else if ((dev->mc_list) || (dev->flags & IFF_ALLMULTI)) {
|
||||
} else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
|
||||
new_mode = SetRxFilter | RxStation | RxMulticast | RxBroadcast;
|
||||
} else
|
||||
new_mode = SetRxFilter | RxStation | RxBroadcast;
|
||||
|
@ -625,8 +625,8 @@ static int init586(struct net_device *dev)
|
||||
volatile struct iasetup_cmd_struct *ias_cmd;
|
||||
volatile struct tdr_cmd_struct *tdr_cmd;
|
||||
volatile struct mcsetup_cmd_struct *mc_cmd;
|
||||
struct dev_mc_list *dmi = dev->mc_list;
|
||||
int num_addrs = dev->mc_count;
|
||||
struct dev_mc_list *dmi;
|
||||
int num_addrs = netdev_mc_count(dev);
|
||||
|
||||
ptr = (void *) ((char *) p->scb + sizeof(struct scb_struct));
|
||||
|
||||
@ -771,7 +771,7 @@ static int init586(struct net_device *dev)
|
||||
* Multicast setup
|
||||
*/
|
||||
|
||||
if (dev->mc_count) {
|
||||
if (num_addrs) {
|
||||
/* I don't understand this: do we really need memory after the init? */
|
||||
int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
|
||||
if (len <= 0) {
|
||||
@ -787,10 +787,9 @@ static int init586(struct net_device *dev)
|
||||
mc_cmd->cmd_cmd = CMD_MCSETUP | CMD_LAST;
|
||||
mc_cmd->cmd_link = 0xffff;
|
||||
mc_cmd->mc_cnt = num_addrs * 6;
|
||||
for (i = 0; i < num_addrs; i++) {
|
||||
memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr, 6);
|
||||
dmi = dmi->next;
|
||||
}
|
||||
i = 0;
|
||||
netdev_for_each_mc_addr(dmi, dev)
|
||||
memcpy((char *) mc_cmd->mc_list[i++], dmi->dmi_addr, 6);
|
||||
p->scb->cbl_offset = make16(mc_cmd);
|
||||
p->scb->cmd = CUC_START;
|
||||
elmc_id_attn586();
|
||||
|
@ -1526,32 +1526,29 @@ static void do_mc32_set_multicast_list(struct net_device *dev, int retry)
|
||||
|
||||
if ((dev->flags&IFF_PROMISC) ||
|
||||
(dev->flags&IFF_ALLMULTI) ||
|
||||
dev->mc_count > 10)
|
||||
netdev_mc_count(dev) > 10)
|
||||
/* Enable promiscuous mode */
|
||||
filt |= 1;
|
||||
else if(dev->mc_count)
|
||||
else if (!netdev_mc_empty(dev))
|
||||
{
|
||||
unsigned char block[62];
|
||||
unsigned char *bp;
|
||||
struct dev_mc_list *dmc=dev->mc_list;
|
||||
|
||||
int i;
|
||||
struct dev_mc_list *dmc;
|
||||
|
||||
if(retry==0)
|
||||
lp->mc_list_valid = 0;
|
||||
if(!lp->mc_list_valid)
|
||||
{
|
||||
block[1]=0;
|
||||
block[0]=dev->mc_count;
|
||||
block[0]=netdev_mc_count(dev);
|
||||
bp=block+2;
|
||||
|
||||
for(i=0;i<dev->mc_count;i++)
|
||||
{
|
||||
netdev_for_each_mc_addr(dmc, dev) {
|
||||
memcpy(bp, dmc->dmi_addr, 6);
|
||||
bp+=6;
|
||||
dmc=dmc->next;
|
||||
}
|
||||
if(mc32_command_nowait(dev, 2, block, 2+6*dev->mc_count)==-1)
|
||||
if(mc32_command_nowait(dev, 2, block,
|
||||
2+6*netdev_mc_count(dev))==-1)
|
||||
{
|
||||
lp->mc_reload_wait = 1;
|
||||
return;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user