Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking merge from David Miller: "1) Move ixgbe driver over to purely page based buffering on receive. From Alexander Duyck. 2) Add receive packet steering support to e1000e, from Bruce Allan. 3) Convert TCP MD5 support over to RCU, from Eric Dumazet. 4) Reduce cpu usage in handling out-of-order TCP packets on modern systems, also from Eric Dumazet. 5) Support the IP{,V6}_UNICAST_IF socket options, making the wine folks happy, from Erich Hoover. 6) Support VLAN trunking from guests in hyperv driver, from Haiyang Zhang. 7) Support byte-queue-limtis in r8169, from Igor Maravic. 8) Outline code intended for IP_RECVTOS in IP_PKTOPTIONS existed but was never properly implemented, Jiri Benc fixed that. 9) 64-bit statistics support in r8169 and 8139too, from Junchang Wang. 10) Support kernel side dump filtering by ctmark in netfilter ctnetlink, from Pablo Neira Ayuso. 11) Support byte-queue-limits in gianfar driver, from Paul Gortmaker. 12) Add new peek socket options to assist with socket migration, from Pavel Emelyanov. 13) Add sch_plug packet scheduler whose queue is controlled by userland daemons using explicit freeze and release commands. From Shriram Rajagopalan. 14) Fix FCOE checksum offload handling on transmit, from Yi Zou." * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1846 commits) Fix pppol2tp getsockname() Remove printk from rds_sendmsg ipv6: fix incorrent ipv6 ipsec packet fragment cpsw: Hook up default ndo_change_mtu. net: qmi_wwan: fix build error due to cdc-wdm dependecy netdev: driver: ethernet: Add TI CPSW driver netdev: driver: ethernet: add cpsw address lookup engine support phy: add am79c874 PHY support mlx4_core: fix race on comm channel bonding: send igmp report for its master fs_enet: Add MPC5125 FEC support and PHY interface selection net: bpf_jit: fix BPF_S_LDX_B_MSH compilation net: update the usage of CHECKSUM_UNNECESSARY fcoe: use CHECKSUM_UNNECESSARY instead of CHECKSUM_PARTIAL on tx net: do not do gso for CHECKSUM_UNNECESSARY in netif_needs_gso ixgbe: Fix issues with SR-IOV loopback when flow control is disabled net/hyperv: Fix the code handling tx busy ixgbe: fix namespace issues when FCoE/DCB is not enabled rtlwifi: Remove unused ETH_ADDR_LEN defines igbvf: Use ETH_ALEN ... Fix up fairly trivial conflicts in drivers/isdn/gigaset/interface.c and drivers/net/usb/{Kconfig,qmi_wwan.c} as per David.
This commit is contained in:
commit
3b59bf0816
1687 changed files with 123578 additions and 96539 deletions
|
@ -65,6 +65,13 @@ Description:
|
|||
Defines the penalty which will be applied to an
|
||||
originator message's tq-field on every hop.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/routing_algo
|
||||
Date: Dec 2011
|
||||
Contact: Marek Lindner <lindner_marek@yahoo.de>
|
||||
Description:
|
||||
Defines the routing procotol this mesh instance
|
||||
uses to find the optimal paths through the mesh.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/vis_mode
|
||||
Date: May 2010
|
||||
Contact: Marek Lindner <lindner_marek@yahoo.de>
|
||||
|
|
|
@ -129,7 +129,6 @@
|
|||
!Finclude/net/cfg80211.h cfg80211_pmksa
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_auth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_auth_timeout
|
||||
!Finclude/net/cfg80211.h __cfg80211_auth_canceled
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_assoc
|
||||
!Finclude/net/cfg80211.h cfg80211_send_assoc_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_send_deauth
|
||||
|
|
28
Documentation/devicetree/bindings/net/stmmac.txt
Normal file
28
Documentation/devicetree/bindings/net/stmmac.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
* STMicroelectronics 10/100/1000 Ethernet driver (GMAC)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "st,spear600-gmac"
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupt-parent: Should be the phandle for the interrupt controller
|
||||
that services interrupts for this device
|
||||
- interrupts: Should contain the STMMAC interrupts
|
||||
- interrupt-names: Should contain the interrupt names "macirq"
|
||||
"eth_wake_irq" if this interrupt is supported in the "interrupts"
|
||||
property
|
||||
- phy-mode: String, operation mode of the PHY interface.
|
||||
Supported values are: "mii", "rmii", "gmii", "rgmii".
|
||||
|
||||
Optional properties:
|
||||
- mac-address: 6 bytes, mac address
|
||||
|
||||
Examples:
|
||||
|
||||
gmac0: ethernet@e0800000 {
|
||||
compatible = "st,spear600-gmac";
|
||||
reg = <0xe0800000 0x8000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <24 23>;
|
||||
interrupt-names = "macirq", "eth_wake_irq";
|
||||
mac-address = [000000000000]; /* Filled in by U-Boot */
|
||||
phy-mode = "gmii";
|
||||
};
|
|
@ -255,7 +255,7 @@ Code Seq#(hex) Include File Comments
|
|||
linux/ixjuser.h <http://web.archive.org/web/*/http://www.quicknet.net>
|
||||
'r' 00-1F linux/msdos_fs.h and fs/fat/dir.c
|
||||
's' all linux/cdk.h
|
||||
't' 00-7F linux/if_ppp.h
|
||||
't' 00-7F linux/ppp-ioctl.h
|
||||
't' 80-8F linux/isdn_ppp.h
|
||||
't' 90 linux/toshiba.h
|
||||
'u' 00-1F linux/smb_fs.h gone
|
||||
|
|
|
@ -89,7 +89,7 @@ TTY_DRIVER_MAGIC 0x5402 tty_driver include/linux/tty_driver.h
|
|||
MGSLPC_MAGIC 0x5402 mgslpc_info drivers/char/pcmcia/synclink_cs.c
|
||||
TTY_LDISC_MAGIC 0x5403 tty_ldisc include/linux/tty_ldisc.h
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial drivers/usb/serial/usb-serial.h
|
||||
FULL_DUPLEX_MAGIC 0x6969 drivers/net/tulip/de2104x.c
|
||||
FULL_DUPLEX_MAGIC 0x6969 drivers/net/ethernet/dec/tulip/de2104x.c
|
||||
USB_BLUETOOTH_MAGIC 0x6d02 usb_bluetooth drivers/usb/class/bluetty.c
|
||||
RFCOMM_TTY_MAGIC 0x6d02 net/bluetooth/rfcomm/tty.c
|
||||
USB_SERIAL_PORT_MAGIC 0x7301 usb_serial_port drivers/usb/serial/usb-serial.h
|
||||
|
|
|
@ -1,46 +1,288 @@
|
|||
Copyright (c) 2003-2008 QLogic Corporation
|
||||
QLogic Linux Networking HBA Driver
|
||||
Copyright (c) 2003-2011 QLogic Corporation
|
||||
QLogic Linux qlge NIC Driver
|
||||
|
||||
This program includes a device driver for Linux 2.6 that may be
|
||||
distributed with QLogic hardware specific firmware binary file.
|
||||
You may modify and redistribute the device driver code under the
|
||||
GNU General Public License as published by the Free Software
|
||||
Foundation (version 2 or a later version).
|
||||
GNU General Public License (a copy of which is attached hereto as
|
||||
Exhibit A) published by the Free Software Foundation (version 2).
|
||||
|
||||
You may redistribute the hardware specific firmware binary file
|
||||
under the following terms:
|
||||
|
||||
1. Redistribution of source code (only if applicable),
|
||||
must retain the above copyright notice, this list of
|
||||
conditions and the following disclaimer.
|
||||
EXHIBIT A
|
||||
|
||||
2. Redistribution in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
3. The name of QLogic Corporation may not be used to
|
||||
endorse or promote products derived from this software
|
||||
without specific prior written permission
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
|
||||
THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
Preamble
|
||||
|
||||
USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
|
||||
CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
|
||||
OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
|
||||
TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
|
||||
ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
|
||||
COMBINATION WITH THIS PROGRAM.
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
|
|
@ -111,7 +111,7 @@ When creating PPPoL2TP sockets, the application provides information
|
|||
to the driver about the socket in a socket connect() call. Source and
|
||||
destination tunnel and session ids are provided, as well as the file
|
||||
descriptor of a UDP socket. See struct pppol2tp_addr in
|
||||
include/linux/if_ppp.h. Note that zero tunnel / session ids are
|
||||
include/linux/if_pppol2tp.h. Note that zero tunnel / session ids are
|
||||
treated specially. When creating the per-tunnel PPPoL2TP management
|
||||
socket in Step 2 above, zero source and destination session ids are
|
||||
specified, which tells the driver to prepare the supplied UDP file
|
||||
|
|
99
Documentation/networking/mac80211-auth-assoc-deauth.txt
Normal file
99
Documentation/networking/mac80211-auth-assoc-deauth.txt
Normal file
|
@ -0,0 +1,99 @@
|
|||
#
|
||||
# This outlines the Linux authentication/association and
|
||||
# deauthentication/disassociation flows.
|
||||
#
|
||||
# This can be converted into a diagram using the service
|
||||
# at http://www.websequencediagrams.com/
|
||||
#
|
||||
|
||||
participant userspace
|
||||
participant mac80211
|
||||
participant driver
|
||||
|
||||
alt authentication needed (not FT)
|
||||
userspace->mac80211: authenticate
|
||||
|
||||
alt authenticated/authenticating already
|
||||
mac80211->driver: sta_state(AP, not-exists)
|
||||
mac80211->driver: bss_info_changed(clear BSSID)
|
||||
else associated
|
||||
note over mac80211,driver
|
||||
like deauth/disassoc, without sending the
|
||||
BA session stop & deauth/disassoc frames
|
||||
end note
|
||||
end
|
||||
|
||||
mac80211->driver: config(channel, non-HT)
|
||||
mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap)
|
||||
mac80211->driver: sta_state(AP, exists)
|
||||
|
||||
alt no probe request data known
|
||||
mac80211->driver: TX directed probe request
|
||||
driver->mac80211: RX probe response
|
||||
end
|
||||
|
||||
mac80211->driver: TX auth frame
|
||||
driver->mac80211: RX auth frame
|
||||
|
||||
alt WEP shared key auth
|
||||
mac80211->driver: TX auth frame
|
||||
driver->mac80211: RX auth frame
|
||||
end
|
||||
|
||||
mac80211->driver: sta_state(AP, authenticated)
|
||||
mac80211->userspace: RX auth frame
|
||||
|
||||
end
|
||||
|
||||
userspace->mac80211: associate
|
||||
alt authenticated or associated
|
||||
note over mac80211,driver: cleanup like for authenticate
|
||||
end
|
||||
|
||||
alt not previously authenticated (FT)
|
||||
mac80211->driver: config(channel, non-HT)
|
||||
mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap)
|
||||
mac80211->driver: sta_state(AP, exists)
|
||||
mac80211->driver: sta_state(AP, authenticated)
|
||||
end
|
||||
mac80211->driver: TX assoc
|
||||
driver->mac80211: RX assoc response
|
||||
note over mac80211: init rate control
|
||||
mac80211->driver: sta_state(AP, associated)
|
||||
|
||||
alt not using WPA
|
||||
mac80211->driver: sta_state(AP, authorized)
|
||||
end
|
||||
|
||||
mac80211->driver: set up QoS parameters
|
||||
|
||||
alt is HT channel
|
||||
mac80211->driver: config(channel, HT params)
|
||||
end
|
||||
|
||||
mac80211->driver: bss_info_changed(QoS, HT, associated with AID)
|
||||
mac80211->userspace: associated
|
||||
|
||||
note left of userspace: associated now
|
||||
|
||||
alt using WPA
|
||||
note over userspace
|
||||
do 4-way-handshake
|
||||
(data frames)
|
||||
end note
|
||||
userspace->mac80211: authorized
|
||||
mac80211->driver: sta_state(AP, authorized)
|
||||
end
|
||||
|
||||
userspace->mac80211: deauthenticate/disassociate
|
||||
mac80211->driver: stop BA sessions
|
||||
mac80211->driver: TX deauth/disassoc
|
||||
mac80211->driver: flush frames
|
||||
mac80211->driver: sta_state(AP,associated)
|
||||
mac80211->driver: sta_state(AP,authenticated)
|
||||
mac80211->driver: sta_state(AP,exists)
|
||||
mac80211->driver: sta_state(AP,not-exists)
|
||||
mac80211->driver: turn off powersave
|
||||
mac80211->driver: bss_info_changed(clear BSSID, not associated, no QoS, ...)
|
||||
mac80211->driver: config(non-HT channel type)
|
||||
mac80211->userspace: disconnected
|
|
@ -152,3 +152,16 @@ NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
|
|||
headers. Some drivers set this because the cards can't handle the bigger MTU.
|
||||
[FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU
|
||||
VLANs. This may be not useful, though.]
|
||||
|
||||
* rx-fcs
|
||||
|
||||
This requests that the NIC append the Ethernet Frame Checksum (FCS)
|
||||
to the end of the skb data. This allows sniffers and other tools to
|
||||
read the CRC recorded by the NIC on receipt of the packet.
|
||||
|
||||
* rx-all
|
||||
|
||||
This requests that the NIC receive all possible frames, including errored
|
||||
frames (such as bad FCS, etc). This can be helpful when sniffing a link with
|
||||
bad packets on it. Some NICs may receive more packets if also put into normal
|
||||
PROMISC mdoe.
|
||||
|
|
|
@ -62,7 +62,8 @@ The MDIO bus
|
|||
5) The bus must also be declared somewhere as a device, and registered.
|
||||
|
||||
As an example for how one driver implemented an mdio bus driver, see
|
||||
drivers/net/gianfar_mii.c and arch/ppc/syslib/mpc85xx_devices.c
|
||||
drivers/net/ethernet/freescale/fsl_pq_mdio.c and an associated DTS file
|
||||
for one of the users. (e.g. "git grep fsl,.*-mdio arch/powerpc/boot/dts/")
|
||||
|
||||
Connecting to a PHY
|
||||
|
||||
|
|
|
@ -342,7 +342,7 @@ an interface unit are:
|
|||
numbers on received multilink fragments
|
||||
SC_MP_XSHORTSEQ transmit short multilink sequence nos.
|
||||
|
||||
The values of these flags are defined in <linux/if_ppp.h>. Note
|
||||
The values of these flags are defined in <linux/ppp-ioctl.h>. Note
|
||||
that the values of the SC_MULTILINK, SC_MP_SHORTSEQ and
|
||||
SC_MP_XSHORTSEQ bits are ignored if the CONFIG_PPP_MULTILINK option
|
||||
is not selected.
|
||||
|
@ -358,7 +358,7 @@ an interface unit are:
|
|||
|
||||
* PPPIOCSCOMPRESS sets the parameters for packet compression or
|
||||
decompression. The argument should point to a ppp_option_data
|
||||
structure (defined in <linux/if_ppp.h>), which contains a
|
||||
structure (defined in <linux/ppp-ioctl.h>), which contains a
|
||||
pointer/length pair which should describe a block of memory
|
||||
containing a CCP option specifying a compression method and its
|
||||
parameters. The ppp_option_data struct also contains a `transmit'
|
||||
|
@ -395,7 +395,7 @@ an interface unit are:
|
|||
|
||||
* PPPIOCSNPMODE sets the network-protocol mode for a given network
|
||||
protocol. The argument should point to an npioctl struct (defined
|
||||
in <linux/if_ppp.h>). The `protocol' field gives the PPP protocol
|
||||
in <linux/ppp-ioctl.h>). The `protocol' field gives the PPP protocol
|
||||
number for the protocol to be affected, and the `mode' field
|
||||
specifies what to do with packets for that protocol:
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ TTY_DRIVER_MAGIC 0x5402 tty_driver include/linux/tty_driver.h
|
|||
MGSLPC_MAGIC 0x5402 mgslpc_info drivers/char/pcmcia/synclink_cs.c
|
||||
TTY_LDISC_MAGIC 0x5403 tty_ldisc include/linux/tty_ldisc.h
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial drivers/usb/serial/usb-serial.h
|
||||
FULL_DUPLEX_MAGIC 0x6969 drivers/net/tulip/de2104x.c
|
||||
FULL_DUPLEX_MAGIC 0x6969 drivers/net/ethernet/dec/tulip/de2104x.c
|
||||
USB_BLUETOOTH_MAGIC 0x6d02 usb_bluetooth drivers/usb/class/bluetty.c
|
||||
RFCOMM_TTY_MAGIC 0x6d02 net/bluetooth/rfcomm/tty.c
|
||||
USB_SERIAL_PORT_MAGIC 0x7301 usb_serial_port drivers/usb/serial/usb-serial.h
|
||||
|
|
26
MAINTAINERS
26
MAINTAINERS
|
@ -1405,7 +1405,7 @@ F: net/ax25/
|
|||
B43 WIRELESS DRIVER
|
||||
M: Stefano Brivio <stefano.brivio@polimi.it>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: b43-dev@lists.infradead.org (moderated for non-subscribers)
|
||||
L: b43-dev@lists.infradead.org
|
||||
W: http://linuxwireless.org/en/users/Drivers/b43
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/b43/
|
||||
|
@ -1414,6 +1414,7 @@ B43LEGACY WIRELESS DRIVER
|
|||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
M: Stefano Brivio <stefano.brivio@polimi.it>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: b43-dev@lists.infradead.org
|
||||
W: http://linuxwireless.org/en/users/Drivers/b43
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/b43legacy/
|
||||
|
@ -1571,7 +1572,6 @@ F: drivers/net/ethernet/broadcom/tg3.*
|
|||
|
||||
BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
|
||||
M: Brett Rudley <brudley@broadcom.com>
|
||||
M: Henry Ptasinski <henryp@broadcom.com>
|
||||
M: Roland Vossen <rvossen@broadcom.com>
|
||||
M: Arend van Spriel <arend@broadcom.com>
|
||||
M: Franky (Zhenhui) Lin <frankyl@broadcom.com>
|
||||
|
@ -1809,7 +1809,8 @@ F: Documentation/zh_CN/
|
|||
CISCO VIC ETHERNET NIC DRIVER
|
||||
M: Christian Benvenuti <benve@cisco.com>
|
||||
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||
M: David Wang <dwang2@cisco.com>
|
||||
M: Neel Patel <neepatel@cisco.com>
|
||||
M: Nishank Trivedi <nistrive@cisco.com>
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/cisco/enic/
|
||||
|
||||
|
@ -4937,8 +4938,6 @@ F: fs/ocfs2/
|
|||
|
||||
ORINOCO DRIVER
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: orinoco-users@lists.sourceforge.net
|
||||
L: orinoco-devel@lists.sourceforge.net
|
||||
W: http://linuxwireless.org/en/users/Drivers/orinoco
|
||||
W: http://www.nongnu.org/orinoco/
|
||||
S: Orphan
|
||||
|
@ -5345,6 +5344,17 @@ L: cbe-oss-dev@lists.ozlabs.org
|
|||
S: Maintained
|
||||
F: drivers/block/ps3vram.c
|
||||
|
||||
PTP HARDWARE CLOCK SUPPORT
|
||||
M: Richard Cochran <richardcochran@gmail.com>
|
||||
S: Maintained
|
||||
W: http://linuxptp.sourceforge.net/
|
||||
F: Documentation/ABI/testing/sysfs-ptp
|
||||
F: Documentation/ptp/*
|
||||
F: drivers/net/gianfar_ptp.c
|
||||
F: drivers/net/phy/dp83640*
|
||||
F: drivers/ptp/*
|
||||
F: include/linux/ptp_cl*
|
||||
|
||||
PTRACE SUPPORT
|
||||
M: Roland McGrath <roland@redhat.com>
|
||||
M: Oleg Nesterov <oleg@redhat.com>
|
||||
|
@ -7501,6 +7511,12 @@ S: Supported
|
|||
F: Documentation/filesystems/xfs.txt
|
||||
F: fs/xfs/
|
||||
|
||||
XILINX AXI ETHERNET DRIVER
|
||||
M: Ariane Keller <ariane.keller@tik.ee.ethz.ch>
|
||||
M: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/xilinx/xilinx_axienet*
|
||||
|
||||
XILINX SYSTEMACE DRIVER
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
W: http://www.secretlab.ca/
|
||||
|
|
|
@ -71,6 +71,10 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
||||
* have to define SOCK_NONBLOCK to a different value here.
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* __ASM_AVR32_SOCKET_H */
|
||||
|
|
|
@ -821,7 +821,7 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
/* the MAC is stored in OTP memory page 0xDF */
|
||||
u32 ret;
|
||||
|
@ -834,5 +834,6 @@ void bfin_get_ether_addr(char *addr)
|
|||
for (ret = 0; ret < 6; ++ret)
|
||||
addr[ret] = otp_mac_p[5 - ret];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -730,9 +730,8 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -846,7 +846,7 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
/* the MAC is stored in OTP memory page 0xDF */
|
||||
u32 ret;
|
||||
|
@ -859,5 +859,6 @@ void bfin_get_ether_addr(char *addr)
|
|||
for (ret = 0; ret < 6; ++ret)
|
||||
addr[ret] = otp_mac_p[5 - ret];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -983,9 +983,8 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -870,7 +870,7 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
/* the MAC is stored in OTP memory page 0xDF */
|
||||
u32 ret;
|
||||
|
@ -883,5 +883,6 @@ void bfin_get_ether_addr(char *addr)
|
|||
for (ret = 0; ret < 6; ++ret)
|
||||
addr[ret] = otp_mac_p[5 - ret];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -1311,7 +1311,7 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
/* the MAC is stored in OTP memory page 0xDF */
|
||||
u32 ret;
|
||||
|
@ -1324,5 +1324,6 @@ void bfin_get_ether_addr(char *addr)
|
|||
for (ret = 0; ret < 6; ++ret)
|
||||
addr[ret] = otp_mac_p[5 - ret];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -931,7 +931,7 @@ void native_machine_restart(char *cmd)
|
|||
bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
/* the MAC is stored in OTP memory page 0xDF */
|
||||
u32 ret;
|
||||
|
@ -945,5 +945,6 @@ void bfin_get_ether_addr(char *addr)
|
|||
for (ret = 0; ret < 6; ++ret)
|
||||
addr[ret] = otp_mac_p[5 - ret];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -813,9 +813,8 @@ void __init native_machine_early_platform_add_devices(void)
|
|||
ARRAY_SIZE(cm_bf537e_early_devices));
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -790,9 +790,8 @@ void __init native_machine_early_platform_add_devices(void)
|
|||
ARRAY_SIZE(cm_bf537u_early_devices));
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -399,9 +399,10 @@ arch_initcall(dnp5370_init);
|
|||
/*
|
||||
* Currently the MAC address is saved in Flash by U-Boot
|
||||
*/
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
*(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC);
|
||||
*(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -535,9 +535,8 @@ void __init native_machine_early_platform_add_devices(void)
|
|||
ARRAY_SIZE(stamp_early_devices));
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -2993,9 +2993,10 @@ void native_machine_restart(char *cmd)
|
|||
* Currently the MAC address is saved in Flash by U-Boot
|
||||
*/
|
||||
#define FLASH_MAC 0x203f0000
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
*(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC);
|
||||
*(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -780,9 +780,8 @@ void __init native_machine_early_platform_add_devices(void)
|
|||
ARRAY_SIZE(cm_bf537_early_devices));
|
||||
}
|
||||
|
||||
void bfin_get_ether_addr(char *addr)
|
||||
int bfin_get_ether_addr(char *addr)
|
||||
{
|
||||
random_ether_addr(addr);
|
||||
printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(bfin_get_ether_addr);
|
||||
|
|
|
@ -66,6 +66,10 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
||||
|
|
|
@ -64,6 +64,10 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -182,7 +182,7 @@ simeth_probe1(void)
|
|||
unsigned char mac_addr[ETH_ALEN];
|
||||
struct simeth_local *local;
|
||||
struct net_device *dev;
|
||||
int fd, i, err, rc;
|
||||
int fd, err, rc;
|
||||
|
||||
/*
|
||||
* XXX Fix me
|
||||
|
@ -223,12 +223,8 @@ simeth_probe1(void)
|
|||
panic("%s: out of interrupt vectors!\n", __func__);
|
||||
dev->irq = rc;
|
||||
|
||||
printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr",
|
||||
dev->name, simeth_device, local->simfd);
|
||||
for(i = 0; i < ETH_ALEN; i++) {
|
||||
printk(" %2.2x", dev->dev_addr[i]);
|
||||
}
|
||||
printk(", IRQ %d\n", dev->irq);
|
||||
printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr=%pm, IRQ %d\n",
|
||||
dev->name, simeth_device, local->simfd, dev->dev_addr, dev->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -73,5 +73,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_IA64_SOCKET_H */
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_M32R_SOCKET_H */
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
# under Linux.
|
||||
#
|
||||
|
||||
obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o
|
||||
obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
|
||||
obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
|
||||
|
|
|
@ -107,8 +107,7 @@ int nvram_getenv(char *name, char *val, size_t val_len)
|
|||
value = eq + 1;
|
||||
if ((eq - var) == strlen(name) &&
|
||||
strncmp(var, name, (eq - var)) == 0) {
|
||||
snprintf(val, val_len, "%s", value);
|
||||
return 0;
|
||||
return snprintf(val, val_len, "%s", value);
|
||||
}
|
||||
}
|
||||
return NVRAM_ERR_ENVNOTFOUND;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
|
||||
* Copyright (C) 2006 Michael Buesch <m@bues.ch>
|
||||
* Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
|
||||
* Copyright (C) 2010-2011 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
* Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -85,156 +85,7 @@ static void bcm47xx_machine_halt(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
#define READ_FROM_NVRAM(_outvar, name, buf) \
|
||||
if (nvram_getprefix(prefix, name, buf, sizeof(buf)) >= 0)\
|
||||
sprom->_outvar = simple_strtoul(buf, NULL, 0);
|
||||
|
||||
#define READ_FROM_NVRAM2(_outvar, name1, name2, buf) \
|
||||
if (nvram_getprefix(prefix, name1, buf, sizeof(buf)) >= 0 || \
|
||||
nvram_getprefix(prefix, name2, buf, sizeof(buf)) >= 0)\
|
||||
sprom->_outvar = simple_strtoul(buf, NULL, 0);
|
||||
|
||||
static inline int nvram_getprefix(const char *prefix, char *name,
|
||||
char *buf, int len)
|
||||
{
|
||||
if (prefix) {
|
||||
char key[100];
|
||||
|
||||
snprintf(key, sizeof(key), "%s%s", prefix, name);
|
||||
return nvram_getenv(key, buf, len);
|
||||
}
|
||||
|
||||
return nvram_getenv(name, buf, len);
|
||||
}
|
||||
|
||||
static u32 nvram_getu32(const char *name, char *buf, int len)
|
||||
{
|
||||
int rv;
|
||||
char key[100];
|
||||
u16 var0, var1;
|
||||
|
||||
snprintf(key, sizeof(key), "%s0", name);
|
||||
rv = nvram_getenv(key, buf, len);
|
||||
/* return 0 here so this looks like unset */
|
||||
if (rv < 0)
|
||||
return 0;
|
||||
var0 = simple_strtoul(buf, NULL, 0);
|
||||
|
||||
snprintf(key, sizeof(key), "%s1", name);
|
||||
rv = nvram_getenv(key, buf, len);
|
||||
if (rv < 0)
|
||||
return 0;
|
||||
var1 = simple_strtoul(buf, NULL, 0);
|
||||
return var1 << 16 | var0;
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
char buf[100];
|
||||
u32 boardflags;
|
||||
|
||||
memset(sprom, 0, sizeof(struct ssb_sprom));
|
||||
|
||||
sprom->revision = 1; /* Fallback: Old hardware does not define this. */
|
||||
READ_FROM_NVRAM(revision, "sromrev", buf);
|
||||
if (nvram_getprefix(prefix, "il0macaddr", buf, sizeof(buf)) >= 0 ||
|
||||
nvram_getprefix(prefix, "macaddr", buf, sizeof(buf)) >= 0)
|
||||
nvram_parse_macaddr(buf, sprom->il0mac);
|
||||
if (nvram_getprefix(prefix, "et0macaddr", buf, sizeof(buf)) >= 0)
|
||||
nvram_parse_macaddr(buf, sprom->et0mac);
|
||||
if (nvram_getprefix(prefix, "et1macaddr", buf, sizeof(buf)) >= 0)
|
||||
nvram_parse_macaddr(buf, sprom->et1mac);
|
||||
READ_FROM_NVRAM(et0phyaddr, "et0phyaddr", buf);
|
||||
READ_FROM_NVRAM(et1phyaddr, "et1phyaddr", buf);
|
||||
READ_FROM_NVRAM(et0mdcport, "et0mdcport", buf);
|
||||
READ_FROM_NVRAM(et1mdcport, "et1mdcport", buf);
|
||||
READ_FROM_NVRAM(board_rev, "boardrev", buf);
|
||||
READ_FROM_NVRAM(country_code, "ccode", buf);
|
||||
READ_FROM_NVRAM(ant_available_a, "aa5g", buf);
|
||||
READ_FROM_NVRAM(ant_available_bg, "aa2g", buf);
|
||||
READ_FROM_NVRAM(pa0b0, "pa0b0", buf);
|
||||
READ_FROM_NVRAM(pa0b1, "pa0b1", buf);
|
||||
READ_FROM_NVRAM(pa0b2, "pa0b2", buf);
|
||||
READ_FROM_NVRAM(pa1b0, "pa1b0", buf);
|
||||
READ_FROM_NVRAM(pa1b1, "pa1b1", buf);
|
||||
READ_FROM_NVRAM(pa1b2, "pa1b2", buf);
|
||||
READ_FROM_NVRAM(pa1lob0, "pa1lob0", buf);
|
||||
READ_FROM_NVRAM(pa1lob2, "pa1lob1", buf);
|
||||
READ_FROM_NVRAM(pa1lob1, "pa1lob2", buf);
|
||||
READ_FROM_NVRAM(pa1hib0, "pa1hib0", buf);
|
||||
READ_FROM_NVRAM(pa1hib2, "pa1hib1", buf);
|
||||
READ_FROM_NVRAM(pa1hib1, "pa1hib2", buf);
|
||||
READ_FROM_NVRAM2(gpio0, "ledbh0", "wl0gpio0", buf);
|
||||
READ_FROM_NVRAM2(gpio1, "ledbh1", "wl0gpio1", buf);
|
||||
READ_FROM_NVRAM2(gpio2, "ledbh2", "wl0gpio2", buf);
|
||||
READ_FROM_NVRAM2(gpio3, "ledbh3", "wl0gpio3", buf);
|
||||
READ_FROM_NVRAM2(maxpwr_bg, "maxp2ga0", "pa0maxpwr", buf);
|
||||
READ_FROM_NVRAM2(maxpwr_al, "maxp5gla0", "pa1lomaxpwr", buf);
|
||||
READ_FROM_NVRAM2(maxpwr_a, "maxp5ga0", "pa1maxpwr", buf);
|
||||
READ_FROM_NVRAM2(maxpwr_ah, "maxp5gha0", "pa1himaxpwr", buf);
|
||||
READ_FROM_NVRAM2(itssi_bg, "itt5ga0", "pa0itssit", buf);
|
||||
READ_FROM_NVRAM2(itssi_a, "itt2ga0", "pa1itssit", buf);
|
||||
READ_FROM_NVRAM(tri2g, "tri2g", buf);
|
||||
READ_FROM_NVRAM(tri5gl, "tri5gl", buf);
|
||||
READ_FROM_NVRAM(tri5g, "tri5g", buf);
|
||||
READ_FROM_NVRAM(tri5gh, "tri5gh", buf);
|
||||
READ_FROM_NVRAM(txpid2g[0], "txpid2ga0", buf);
|
||||
READ_FROM_NVRAM(txpid2g[1], "txpid2ga1", buf);
|
||||
READ_FROM_NVRAM(txpid2g[2], "txpid2ga2", buf);
|
||||
READ_FROM_NVRAM(txpid2g[3], "txpid2ga3", buf);
|
||||
READ_FROM_NVRAM(txpid5g[0], "txpid5ga0", buf);
|
||||
READ_FROM_NVRAM(txpid5g[1], "txpid5ga1", buf);
|
||||
READ_FROM_NVRAM(txpid5g[2], "txpid5ga2", buf);
|
||||
READ_FROM_NVRAM(txpid5g[3], "txpid5ga3", buf);
|
||||
READ_FROM_NVRAM(txpid5gl[0], "txpid5gla0", buf);
|
||||
READ_FROM_NVRAM(txpid5gl[1], "txpid5gla1", buf);
|
||||
READ_FROM_NVRAM(txpid5gl[2], "txpid5gla2", buf);
|
||||
READ_FROM_NVRAM(txpid5gl[3], "txpid5gla3", buf);
|
||||
READ_FROM_NVRAM(txpid5gh[0], "txpid5gha0", buf);
|
||||
READ_FROM_NVRAM(txpid5gh[1], "txpid5gha1", buf);
|
||||
READ_FROM_NVRAM(txpid5gh[2], "txpid5gha2", buf);
|
||||
READ_FROM_NVRAM(txpid5gh[3], "txpid5gha3", buf);
|
||||
READ_FROM_NVRAM(rxpo2g, "rxpo2g", buf);
|
||||
READ_FROM_NVRAM(rxpo5g, "rxpo5g", buf);
|
||||
READ_FROM_NVRAM(rssisav2g, "rssisav2g", buf);
|
||||
READ_FROM_NVRAM(rssismc2g, "rssismc2g", buf);
|
||||
READ_FROM_NVRAM(rssismf2g, "rssismf2g", buf);
|
||||
READ_FROM_NVRAM(bxa2g, "bxa2g", buf);
|
||||
READ_FROM_NVRAM(rssisav5g, "rssisav5g", buf);
|
||||
READ_FROM_NVRAM(rssismc5g, "rssismc5g", buf);
|
||||
READ_FROM_NVRAM(rssismf5g, "rssismf5g", buf);
|
||||
READ_FROM_NVRAM(bxa5g, "bxa5g", buf);
|
||||
READ_FROM_NVRAM(cck2gpo, "cck2gpo", buf);
|
||||
|
||||
sprom->ofdm2gpo = nvram_getu32("ofdm2gpo", buf, sizeof(buf));
|
||||
sprom->ofdm5glpo = nvram_getu32("ofdm5glpo", buf, sizeof(buf));
|
||||
sprom->ofdm5gpo = nvram_getu32("ofdm5gpo", buf, sizeof(buf));
|
||||
sprom->ofdm5ghpo = nvram_getu32("ofdm5ghpo", buf, sizeof(buf));
|
||||
|
||||
READ_FROM_NVRAM(antenna_gain.ghz24.a0, "ag0", buf);
|
||||
READ_FROM_NVRAM(antenna_gain.ghz24.a1, "ag1", buf);
|
||||
READ_FROM_NVRAM(antenna_gain.ghz24.a2, "ag2", buf);
|
||||
READ_FROM_NVRAM(antenna_gain.ghz24.a3, "ag3", buf);
|
||||
memcpy(&sprom->antenna_gain.ghz5, &sprom->antenna_gain.ghz24,
|
||||
sizeof(sprom->antenna_gain.ghz5));
|
||||
|
||||
if (nvram_getprefix(prefix, "boardflags", buf, sizeof(buf)) >= 0) {
|
||||
boardflags = simple_strtoul(buf, NULL, 0);
|
||||
if (boardflags) {
|
||||
sprom->boardflags_lo = (boardflags & 0x0000FFFFU);
|
||||
sprom->boardflags_hi = (boardflags & 0xFFFF0000U) >> 16;
|
||||
}
|
||||
}
|
||||
if (nvram_getprefix(prefix, "boardflags2", buf, sizeof(buf)) >= 0) {
|
||||
boardflags = simple_strtoul(buf, NULL, 0);
|
||||
if (boardflags) {
|
||||
sprom->boardflags2_lo = (boardflags & 0x0000FFFFU);
|
||||
sprom->boardflags2_hi = (boardflags & 0xFFFF0000U) >> 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int bcm47xx_get_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
char prefix[10];
|
||||
|
||||
|
@ -251,7 +102,7 @@ int bcm47xx_get_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
|
|||
}
|
||||
|
||||
static int bcm47xx_get_invariants(struct ssb_bus *bus,
|
||||
struct ssb_init_invariants *iv)
|
||||
struct ssb_init_invariants *iv)
|
||||
{
|
||||
char buf[20];
|
||||
|
||||
|
@ -281,7 +132,7 @@ static void __init bcm47xx_register_ssb(void)
|
|||
char buf[100];
|
||||
struct ssb_mipscore *mcore;
|
||||
|
||||
err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom);
|
||||
err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb);
|
||||
if (err)
|
||||
printk(KERN_WARNING "bcm47xx: someone else already registered"
|
||||
" a ssb SPROM callback handler (err %d)\n", err);
|
||||
|
@ -308,10 +159,41 @@ static void __init bcm47xx_register_ssb(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
char prefix[10];
|
||||
struct bcma_device *core;
|
||||
|
||||
switch (bus->hosttype) {
|
||||
case BCMA_HOSTTYPE_PCI:
|
||||
snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
bcm47xx_fill_sprom(out, prefix);
|
||||
return 0;
|
||||
case BCMA_HOSTTYPE_SOC:
|
||||
bcm47xx_fill_sprom_ethernet(out, NULL);
|
||||
core = bcma_find_core(bus, BCMA_CORE_80211);
|
||||
if (core) {
|
||||
snprintf(prefix, sizeof(prefix), "sb/%u/",
|
||||
core->core_index);
|
||||
bcm47xx_fill_sprom(out, prefix);
|
||||
}
|
||||
return 0;
|
||||
default:
|
||||
pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init bcm47xx_register_bcma(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma);
|
||||
if (err)
|
||||
pr_warn("bcm47xx: someone else already registered a bcma SPROM callback handler (err %d)\n", err);
|
||||
|
||||
err = bcma_host_soc_register(&bcm47xx_bus.bcma);
|
||||
if (err)
|
||||
panic("Failed to initialize BCMA bus (err %d)", err);
|
||||
|
|
620
arch/mips/bcm47xx/sprom.c
Normal file
620
arch/mips/bcm47xx/sprom.c
Normal file
|
@ -0,0 +1,620 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org>
|
||||
* Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
|
||||
* Copyright (C) 2006 Michael Buesch <m@bues.ch>
|
||||
* Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
|
||||
* Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* 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.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <bcm47xx.h>
|
||||
#include <nvram.h>
|
||||
|
||||
static void create_key(const char *prefix, const char *postfix,
|
||||
const char *name, char *buf, int len)
|
||||
{
|
||||
if (prefix && postfix)
|
||||
snprintf(buf, len, "%s%s%s", prefix, name, postfix);
|
||||
else if (prefix)
|
||||
snprintf(buf, len, "%s%s", prefix, name);
|
||||
else if (postfix)
|
||||
snprintf(buf, len, "%s%s", name, postfix);
|
||||
else
|
||||
snprintf(buf, len, "%s", name);
|
||||
}
|
||||
|
||||
#define NVRAM_READ_VAL(type) \
|
||||
static void nvram_read_ ## type (const char *prefix, \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset) \
|
||||
{ \
|
||||
char buf[100]; \
|
||||
char key[40]; \
|
||||
int err; \
|
||||
type var; \
|
||||
\
|
||||
create_key(prefix, postfix, name, key, sizeof(key)); \
|
||||
\
|
||||
err = nvram_getenv(key, buf, sizeof(buf)); \
|
||||
if (err < 0) \
|
||||
return; \
|
||||
err = kstrto ## type (buf, 0, &var); \
|
||||
if (err) { \
|
||||
pr_warn("can not parse nvram name %s with value %s" \
|
||||
" got %i", key, buf, err); \
|
||||
return; \
|
||||
} \
|
||||
if (allset && var == allset) \
|
||||
return; \
|
||||
*val = var; \
|
||||
}
|
||||
|
||||
NVRAM_READ_VAL(u8)
|
||||
NVRAM_READ_VAL(s8)
|
||||
NVRAM_READ_VAL(u16)
|
||||
NVRAM_READ_VAL(u32)
|
||||
|
||||
#undef NVRAM_READ_VAL
|
||||
|
||||
static void nvram_read_u32_2(const char *prefix, const char *name,
|
||||
u16 *val_lo, u16 *val_hi)
|
||||
{
|
||||
char buf[100];
|
||||
char key[40];
|
||||
int err;
|
||||
u32 val;
|
||||
|
||||
create_key(prefix, NULL, name, key, sizeof(key));
|
||||
|
||||
err = nvram_getenv(key, buf, sizeof(buf));
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(buf, 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s with value %s got %i",
|
||||
key, buf, err);
|
||||
return;
|
||||
}
|
||||
*val_lo = (val & 0x0000FFFFU);
|
||||
*val_hi = (val & 0xFFFF0000U) >> 16;
|
||||
}
|
||||
|
||||
static void nvram_read_leddc(const char *prefix, const char *name,
|
||||
u8 *leddc_on_time, u8 *leddc_off_time)
|
||||
{
|
||||
char buf[100];
|
||||
char key[40];
|
||||
int err;
|
||||
u32 val;
|
||||
|
||||
create_key(prefix, NULL, name, key, sizeof(key));
|
||||
|
||||
err = nvram_getenv(key, buf, sizeof(buf));
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(buf, 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s with value %s got %i",
|
||||
key, buf, err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (val == 0xffff || val == 0xffffffff)
|
||||
return;
|
||||
|
||||
*leddc_on_time = val & 0xff;
|
||||
*leddc_off_time = (val >> 16) & 0xff;
|
||||
}
|
||||
|
||||
static void nvram_read_macaddr(const char *prefix, const char *name,
|
||||
u8 (*val)[6])
|
||||
{
|
||||
char buf[100];
|
||||
char key[40];
|
||||
int err;
|
||||
|
||||
create_key(prefix, NULL, name, key, sizeof(key));
|
||||
|
||||
err = nvram_getenv(key, buf, sizeof(buf));
|
||||
if (err < 0)
|
||||
return;
|
||||
nvram_parse_macaddr(buf, *val);
|
||||
}
|
||||
|
||||
static void nvram_read_alpha2(const char *prefix, const char *name,
|
||||
char (*val)[2])
|
||||
{
|
||||
char buf[10];
|
||||
char key[40];
|
||||
int err;
|
||||
|
||||
create_key(prefix, NULL, name, key, sizeof(key));
|
||||
|
||||
err = nvram_getenv(key, buf, sizeof(buf));
|
||||
if (err < 0)
|
||||
return;
|
||||
if (buf[0] == '0')
|
||||
return;
|
||||
if (strlen(buf) > 2) {
|
||||
pr_warn("alpha2 is too long %s", buf);
|
||||
return;
|
||||
}
|
||||
memcpy(val, buf, sizeof(val));
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0);
|
||||
nvram_read_u16(prefix, NULL, "boardnum", &sprom->board_num, 0);
|
||||
nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff);
|
||||
nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff);
|
||||
nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff);
|
||||
nvram_read_u8(prefix, NULL, "ledbh3", &sprom->gpio3, 0xff);
|
||||
nvram_read_u8(prefix, NULL, "aa2g", &sprom->ant_available_bg, 0);
|
||||
nvram_read_u8(prefix, NULL, "aa5g", &sprom->ant_available_a, 0);
|
||||
nvram_read_s8(prefix, NULL, "ag0", &sprom->antenna_gain.a0, 0);
|
||||
nvram_read_s8(prefix, NULL, "ag1", &sprom->antenna_gain.a1, 0);
|
||||
nvram_read_alpha2(prefix, "ccode", &sprom->alpha2);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r12389(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "pa0b0", &sprom->pa0b0, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa0b1", &sprom->pa0b1, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa0b2", &sprom->pa0b2, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa0itssit", &sprom->itssi_bg, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa0maxpwr", &sprom->maxpwr_bg, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1b0", &sprom->pa1b0, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1b1", &sprom->pa1b1, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1b2", &sprom->pa1b2, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa1itssit", &sprom->itssi_a, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa1maxpwr", &sprom->maxpwr_a, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r1(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "boardflags", &sprom->boardflags_lo, 0);
|
||||
nvram_read_u8(prefix, NULL, "cc", &sprom->country_code, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r2389(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
nvram_read_u8(prefix, NULL, "opo", &sprom->opo, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1lob0", &sprom->pa1lob0, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1lob1", &sprom->pa1lob1, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1lob2", &sprom->pa1lob2, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1hib0", &sprom->pa1hib0, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1hib1", &sprom->pa1hib1, 0);
|
||||
nvram_read_u16(prefix, NULL, "pa1hib2", &sprom->pa1hib2, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa1lomaxpwr", &sprom->maxpwr_al, 0);
|
||||
nvram_read_u8(prefix, NULL, "pa1himaxpwr", &sprom->maxpwr_ah, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r2(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r389(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u8(prefix, NULL, "bxa2g", &sprom->bxa2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssisav2g", &sprom->rssisav2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssismc2g", &sprom->rssismc2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssismf2g", &sprom->rssismf2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "bxa5g", &sprom->bxa5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssisav5g", &sprom->rssisav5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssismc5g", &sprom->rssismc5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "rssismf5g", &sprom->rssismf5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "tri2g", &sprom->tri2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "tri5g", &sprom->tri5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "tri5gl", &sprom->tri5gl, 0);
|
||||
nvram_read_u8(prefix, NULL, "tri5gh", &sprom->tri5gh, 0);
|
||||
nvram_read_s8(prefix, NULL, "rxpo2g", &sprom->rxpo2g, 0);
|
||||
nvram_read_s8(prefix, NULL, "rxpo5g", &sprom->rxpo5g, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r3(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0);
|
||||
nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0);
|
||||
nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time,
|
||||
&sprom->leddc_off_time);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r4589(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi);
|
||||
nvram_read_u32_2(prefix, "boardflags2", &sprom->boardflags2_lo,
|
||||
&sprom->boardflags2_hi);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0);
|
||||
nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0);
|
||||
nvram_read_s8(prefix, NULL, "ag2", &sprom->antenna_gain.a2, 0);
|
||||
nvram_read_s8(prefix, NULL, "ag3", &sprom->antenna_gain.a3, 0);
|
||||
nvram_read_u8(prefix, NULL, "txchain", &sprom->txchain, 0xf);
|
||||
nvram_read_u8(prefix, NULL, "rxchain", &sprom->rxchain, 0xf);
|
||||
nvram_read_u8(prefix, NULL, "antswitch", &sprom->antswitch, 0xff);
|
||||
nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time,
|
||||
&sprom->leddc_off_time);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r458(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "cck2gpo", &sprom->cck2gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "ofdm2gpo", &sprom->ofdm2gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "ofdm5gpo", &sprom->ofdm5gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "ofdm5glpo", &sprom->ofdm5glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "ofdm5ghpo", &sprom->ofdm5ghpo, 0);
|
||||
nvram_read_u16(prefix, NULL, "cddpo", &sprom->cddpo, 0);
|
||||
nvram_read_u16(prefix, NULL, "stbcpo", &sprom->stbcpo, 0);
|
||||
nvram_read_u16(prefix, NULL, "bw40po", &sprom->bw40po, 0);
|
||||
nvram_read_u16(prefix, NULL, "bwduppo", &sprom->bwduppo, 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo0", &sprom->mcs2gpo[0], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo1", &sprom->mcs2gpo[1], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo2", &sprom->mcs2gpo[2], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo3", &sprom->mcs2gpo[3], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo4", &sprom->mcs2gpo[4], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo5", &sprom->mcs2gpo[5], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo6", &sprom->mcs2gpo[6], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs2gpo7", &sprom->mcs2gpo[7], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo0", &sprom->mcs5gpo[0], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo1", &sprom->mcs5gpo[1], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo2", &sprom->mcs5gpo[2], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo3", &sprom->mcs5gpo[3], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo4", &sprom->mcs5gpo[4], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo5", &sprom->mcs5gpo[5], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo6", &sprom->mcs5gpo[6], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5gpo7", &sprom->mcs5gpo[7], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo0", &sprom->mcs5glpo[0], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo1", &sprom->mcs5glpo[1], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo2", &sprom->mcs5glpo[2], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo3", &sprom->mcs5glpo[3], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo4", &sprom->mcs5glpo[4], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo5", &sprom->mcs5glpo[5], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo6", &sprom->mcs5glpo[6], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5glpo7", &sprom->mcs5glpo[7], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo0", &sprom->mcs5ghpo[0], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo1", &sprom->mcs5ghpo[1], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo2", &sprom->mcs5ghpo[2], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo3", &sprom->mcs5ghpo[3], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo4", &sprom->mcs5ghpo[4], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo5", &sprom->mcs5ghpo[5], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo6", &sprom->mcs5ghpo[6], 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs5ghpo7", &sprom->mcs5ghpo[7], 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r45(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u8(prefix, NULL, "txpid2ga0", &sprom->txpid2g[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid2ga1", &sprom->txpid2g[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid2ga2", &sprom->txpid2g[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid2ga3", &sprom->txpid2g[3], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5ga0", &sprom->txpid5g[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5ga1", &sprom->txpid5g[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5ga2", &sprom->txpid5g[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5ga3", &sprom->txpid5g[3], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gla0", &sprom->txpid5gl[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gla1", &sprom->txpid5gl[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gla2", &sprom->txpid5gl[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gla3", &sprom->txpid5gl[3], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gha0", &sprom->txpid5gh[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gha1", &sprom->txpid5gh[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gha2", &sprom->txpid5gh[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "txpid5gha3", &sprom->txpid5gh[3], 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r89(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u8(prefix, NULL, "tssipos2g", &sprom->fem.ghz2.tssipos, 0);
|
||||
nvram_read_u8(prefix, NULL, "extpagain2g",
|
||||
&sprom->fem.ghz2.extpa_gain, 0);
|
||||
nvram_read_u8(prefix, NULL, "pdetrange2g",
|
||||
&sprom->fem.ghz2.pdet_range, 0);
|
||||
nvram_read_u8(prefix, NULL, "triso2g", &sprom->fem.ghz2.tr_iso, 0);
|
||||
nvram_read_u8(prefix, NULL, "antswctl2g", &sprom->fem.ghz2.antswlut, 0);
|
||||
nvram_read_u8(prefix, NULL, "tssipos5g", &sprom->fem.ghz5.tssipos, 0);
|
||||
nvram_read_u8(prefix, NULL, "extpagain5g",
|
||||
&sprom->fem.ghz5.extpa_gain, 0);
|
||||
nvram_read_u8(prefix, NULL, "pdetrange5g",
|
||||
&sprom->fem.ghz5.pdet_range, 0);
|
||||
nvram_read_u8(prefix, NULL, "triso5g", &sprom->fem.ghz5.tr_iso, 0);
|
||||
nvram_read_u8(prefix, NULL, "antswctl5g", &sprom->fem.ghz5.antswlut, 0);
|
||||
nvram_read_u8(prefix, NULL, "tempthresh", &sprom->tempthresh, 0);
|
||||
nvram_read_u8(prefix, NULL, "tempoffset", &sprom->tempoffset, 0);
|
||||
nvram_read_u16(prefix, NULL, "rawtempsense", &sprom->rawtempsense, 0);
|
||||
nvram_read_u8(prefix, NULL, "measpower", &sprom->measpower, 0);
|
||||
nvram_read_u8(prefix, NULL, "tempsense_slope",
|
||||
&sprom->tempsense_slope, 0);
|
||||
nvram_read_u8(prefix, NULL, "tempcorrx", &sprom->tempcorrx, 0);
|
||||
nvram_read_u8(prefix, NULL, "tempsense_option",
|
||||
&sprom->tempsense_option, 0);
|
||||
nvram_read_u8(prefix, NULL, "freqoffset_corr",
|
||||
&sprom->freqoffset_corr, 0);
|
||||
nvram_read_u8(prefix, NULL, "iqcal_swp_dis", &sprom->iqcal_swp_dis, 0);
|
||||
nvram_read_u8(prefix, NULL, "hw_iqcal_en", &sprom->hw_iqcal_en, 0);
|
||||
nvram_read_u8(prefix, NULL, "elna2g", &sprom->elna2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "elna5g", &sprom->elna5g, 0);
|
||||
nvram_read_u8(prefix, NULL, "phycal_tempdelta",
|
||||
&sprom->phycal_tempdelta, 0);
|
||||
nvram_read_u8(prefix, NULL, "temps_period", &sprom->temps_period, 0);
|
||||
nvram_read_u8(prefix, NULL, "temps_hysteresis",
|
||||
&sprom->temps_hysteresis, 0);
|
||||
nvram_read_u8(prefix, NULL, "measpower1", &sprom->measpower1, 0);
|
||||
nvram_read_u8(prefix, NULL, "measpower2", &sprom->measpower2, 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr2ga0",
|
||||
&sprom->rxgainerr2ga[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr2ga1",
|
||||
&sprom->rxgainerr2ga[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr2ga2",
|
||||
&sprom->rxgainerr2ga[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gla0",
|
||||
&sprom->rxgainerr5gla[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gla1",
|
||||
&sprom->rxgainerr5gla[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gla2",
|
||||
&sprom->rxgainerr5gla[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gma0",
|
||||
&sprom->rxgainerr5gma[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gma1",
|
||||
&sprom->rxgainerr5gma[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gma2",
|
||||
&sprom->rxgainerr5gma[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gha0",
|
||||
&sprom->rxgainerr5gha[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gha1",
|
||||
&sprom->rxgainerr5gha[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gha2",
|
||||
&sprom->rxgainerr5gha[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gua0",
|
||||
&sprom->rxgainerr5gua[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gua1",
|
||||
&sprom->rxgainerr5gua[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "rxgainerr5gua2",
|
||||
&sprom->rxgainerr5gua[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl2ga0", &sprom->noiselvl2ga[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl2ga1", &sprom->noiselvl2ga[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl2ga2", &sprom->noiselvl2ga[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gla0",
|
||||
&sprom->noiselvl5gla[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gla1",
|
||||
&sprom->noiselvl5gla[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gla2",
|
||||
&sprom->noiselvl5gla[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gma0",
|
||||
&sprom->noiselvl5gma[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gma1",
|
||||
&sprom->noiselvl5gma[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gma2",
|
||||
&sprom->noiselvl5gma[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gha0",
|
||||
&sprom->noiselvl5gha[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gha1",
|
||||
&sprom->noiselvl5gha[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gha2",
|
||||
&sprom->noiselvl5gha[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gua0",
|
||||
&sprom->noiselvl5gua[0], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gua1",
|
||||
&sprom->noiselvl5gua[1], 0);
|
||||
nvram_read_u8(prefix, NULL, "noiselvl5gua2",
|
||||
&sprom->noiselvl5gua[2], 0);
|
||||
nvram_read_u8(prefix, NULL, "pcieingress_war",
|
||||
&sprom->pcieingress_war, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_r9(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "cckbw202gpo", &sprom->cckbw202gpo, 0);
|
||||
nvram_read_u16(prefix, NULL, "cckbw20ul2gpo", &sprom->cckbw20ul2gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw202gpo",
|
||||
&sprom->legofdmbw202gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw20ul2gpo",
|
||||
&sprom->legofdmbw20ul2gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw205glpo",
|
||||
&sprom->legofdmbw205glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw20ul5glpo",
|
||||
&sprom->legofdmbw20ul5glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw205gmpo",
|
||||
&sprom->legofdmbw205gmpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw20ul5gmpo",
|
||||
&sprom->legofdmbw20ul5gmpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw205ghpo",
|
||||
&sprom->legofdmbw205ghpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "legofdmbw20ul5ghpo",
|
||||
&sprom->legofdmbw20ul5ghpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw202gpo", &sprom->mcsbw202gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw20ul2gpo", &sprom->mcsbw20ul2gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw402gpo", &sprom->mcsbw402gpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw205glpo", &sprom->mcsbw205glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw20ul5glpo",
|
||||
&sprom->mcsbw20ul5glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw405glpo", &sprom->mcsbw405glpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw205gmpo", &sprom->mcsbw205gmpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw20ul5gmpo",
|
||||
&sprom->mcsbw20ul5gmpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw405gmpo", &sprom->mcsbw405gmpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw205ghpo", &sprom->mcsbw205ghpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw20ul5ghpo",
|
||||
&sprom->mcsbw20ul5ghpo, 0);
|
||||
nvram_read_u32(prefix, NULL, "mcsbw405ghpo", &sprom->mcsbw405ghpo, 0);
|
||||
nvram_read_u16(prefix, NULL, "mcs32po", &sprom->mcs32po, 0);
|
||||
nvram_read_u16(prefix, NULL, "legofdm40duppo",
|
||||
&sprom->legofdm40duppo, 0);
|
||||
nvram_read_u8(prefix, NULL, "sar2g", &sprom->sar2g, 0);
|
||||
nvram_read_u8(prefix, NULL, "sar5g", &sprom->sar5g, 0);
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_path_r4589(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
char postfix[2];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i];
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u8(prefix, postfix, "maxp2ga",
|
||||
&pwr_info->maxpwr_2g, 0);
|
||||
nvram_read_u8(prefix, postfix, "itt2ga",
|
||||
&pwr_info->itssi_2g, 0);
|
||||
nvram_read_u8(prefix, postfix, "itt5ga",
|
||||
&pwr_info->itssi_5g, 0);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw0a",
|
||||
&pwr_info->pa_2g[0], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw1a",
|
||||
&pwr_info->pa_2g[1], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw2a",
|
||||
&pwr_info->pa_2g[2], 0);
|
||||
nvram_read_u8(prefix, postfix, "maxp5ga",
|
||||
&pwr_info->maxpwr_5g, 0);
|
||||
nvram_read_u8(prefix, postfix, "maxp5gha",
|
||||
&pwr_info->maxpwr_5gh, 0);
|
||||
nvram_read_u8(prefix, postfix, "maxp5gla",
|
||||
&pwr_info->maxpwr_5gl, 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw0a",
|
||||
&pwr_info->pa_5g[0], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw1a",
|
||||
&pwr_info->pa_5g[1], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw2a",
|
||||
&pwr_info->pa_5g[2], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw0a",
|
||||
&pwr_info->pa_5gl[0], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw1a",
|
||||
&pwr_info->pa_5gl[1], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw2a",
|
||||
&pwr_info->pa_5gl[2], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw0a",
|
||||
&pwr_info->pa_5gh[0], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw1a",
|
||||
&pwr_info->pa_5gh[1], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw2a",
|
||||
&pwr_info->pa_5gh[2], 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void bcm47xx_fill_sprom_path_r45(struct ssb_sprom *sprom,
|
||||
const char *prefix)
|
||||
{
|
||||
char postfix[2];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sprom->core_pwr_info); i++) {
|
||||
struct ssb_sprom_core_pwr_info *pwr_info = &sprom->core_pwr_info[i];
|
||||
snprintf(postfix, sizeof(postfix), "%i", i);
|
||||
nvram_read_u16(prefix, postfix, "pa2gw3a",
|
||||
&pwr_info->pa_2g[3], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5gw3a",
|
||||
&pwr_info->pa_5g[3], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5glw3a",
|
||||
&pwr_info->pa_5gl[3], 0);
|
||||
nvram_read_u16(prefix, postfix, "pa5ghw3a",
|
||||
&pwr_info->pa_5gh[3], 0);
|
||||
}
|
||||
}
|
||||
|
||||
void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
nvram_read_macaddr(prefix, "et0macaddr", &sprom->et0mac);
|
||||
nvram_read_u8(prefix, NULL, "et0mdcport", &sprom->et0mdcport, 0);
|
||||
nvram_read_u8(prefix, NULL, "et0phyaddr", &sprom->et0phyaddr, 0);
|
||||
|
||||
nvram_read_macaddr(prefix, "et1macaddr", &sprom->et1mac);
|
||||
nvram_read_u8(prefix, NULL, "et1mdcport", &sprom->et1mdcport, 0);
|
||||
nvram_read_u8(prefix, NULL, "et1phyaddr", &sprom->et1phyaddr, 0);
|
||||
|
||||
nvram_read_macaddr(prefix, "macaddr", &sprom->il0mac);
|
||||
nvram_read_macaddr(prefix, "il0macaddr", &sprom->il0mac);
|
||||
}
|
||||
|
||||
void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix)
|
||||
{
|
||||
memset(sprom, 0, sizeof(struct ssb_sprom));
|
||||
|
||||
bcm47xx_fill_sprom_ethernet(sprom, prefix);
|
||||
|
||||
nvram_read_u8(prefix, NULL, "sromrev", &sprom->revision, 0);
|
||||
|
||||
switch (sprom->revision) {
|
||||
case 1:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r1(sprom, prefix);
|
||||
break;
|
||||
case 2:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r2389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r2(sprom, prefix);
|
||||
break;
|
||||
case 3:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r2389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r3(sprom, prefix);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r458(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r45(sprom, prefix);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_path_r45(sprom, prefix);
|
||||
break;
|
||||
case 8:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r2389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r458(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r89(sprom, prefix);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix);
|
||||
break;
|
||||
case 9:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r2389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r89(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r9(sprom, prefix);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix);
|
||||
break;
|
||||
default:
|
||||
pr_warn("Unsupported SPROM revision %d detected. Will extract"
|
||||
" v1\n", sprom->revision);
|
||||
sprom->revision = 1;
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix);
|
||||
bcm47xx_fill_sprom_r1(sprom, prefix);
|
||||
}
|
||||
}
|
|
@ -44,4 +44,7 @@ union bcm47xx_bus {
|
|||
extern union bcm47xx_bus bcm47xx_bus;
|
||||
extern enum bcm47xx_bus_type bcm47xx_bus_type;
|
||||
|
||||
void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix);
|
||||
void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom, const char *prefix);
|
||||
|
||||
#endif /* __ASM_BCM47XX_H */
|
||||
|
|
|
@ -37,7 +37,7 @@ struct nvram_header {
|
|||
|
||||
extern int nvram_getenv(char *name, char *val, size_t val_len);
|
||||
|
||||
static inline void nvram_parse_macaddr(char *buf, u8 *macaddr)
|
||||
static inline void nvram_parse_macaddr(char *buf, u8 macaddr[6])
|
||||
{
|
||||
if (strchr(buf, ':'))
|
||||
sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &macaddr[0],
|
||||
|
|
|
@ -84,6 +84,10 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <bcm47xx.h>
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
|
@ -32,15 +33,12 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
static int bcm47xx_pcibios_plat_dev_init_ssb(struct pci_dev *dev)
|
||||
{
|
||||
int res;
|
||||
u8 slot, pin;
|
||||
|
||||
if (bcm47xx_bus_type != BCM47XX_BUS_TYPE_SSB)
|
||||
return 0;
|
||||
|
||||
res = ssb_pcibios_plat_dev_init(dev);
|
||||
if (res < 0) {
|
||||
printk(KERN_ALERT "PCI: Failed to init device %s\n",
|
||||
|
@ -60,6 +58,47 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
|||
}
|
||||
|
||||
dev->irq = res;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
static int bcm47xx_pcibios_plat_dev_init_bcma(struct pci_dev *dev)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = bcma_core_pci_plat_dev_init(dev);
|
||||
if (res < 0) {
|
||||
printk(KERN_ALERT "PCI: Failed to init device %s\n",
|
||||
pci_name(dev));
|
||||
return res;
|
||||
}
|
||||
|
||||
res = bcma_core_pci_pcibios_map_irq(dev);
|
||||
|
||||
/* IRQ-0 and IRQ-1 are software interrupts. */
|
||||
if (res < 2) {
|
||||
printk(KERN_ALERT "PCI: Failed to map IRQ of device %s\n",
|
||||
pci_name(dev));
|
||||
return res;
|
||||
}
|
||||
|
||||
dev->irq = res;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_SSB)
|
||||
return bcm47xx_pcibios_plat_dev_init_ssb(dev);
|
||||
else
|
||||
#endif
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA)
|
||||
return bcm47xx_pcibios_plat_dev_init_bcma(dev);
|
||||
else
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -64,5 +64,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -63,6 +63,11 @@
|
|||
|
||||
#define SO_WIFI_STATUS 0x4022
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 0x4023
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 0x4024
|
||||
|
||||
|
||||
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
||||
* have to define SOCK_NONBLOCK to a different value here.
|
||||
|
|
|
@ -222,7 +222,7 @@
|
|||
|
||||
EMAC0: ethernet@ef600c00 {
|
||||
device_type = "network";
|
||||
compatible = "ibm,emac4sync";
|
||||
compatible = "ibm,emac-apm821xx", "ibm,emac4sync";
|
||||
interrupt-parent = <&EMAC0>;
|
||||
interrupts = <0x0 0x1>;
|
||||
#interrupt-cells = <1>;
|
||||
|
|
|
@ -71,5 +71,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_POWERPC_SOCKET_H */
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#define SIOC_QETH_ARP_FLUSH_CACHE (SIOCDEVPRIVATE + 4)
|
||||
#define SIOC_QETH_ADP_SET_SNMP_CONTROL (SIOCDEVPRIVATE + 5)
|
||||
#define SIOC_QETH_GET_CARD_TYPE (SIOCDEVPRIVATE + 6)
|
||||
#define SIOC_QETH_QUERY_OAT (SIOCDEVPRIVATE + 7)
|
||||
|
||||
struct qeth_arp_cache_entry {
|
||||
__u8 macaddr[6];
|
||||
|
@ -107,4 +108,10 @@ struct qeth_arp_query_user_data {
|
|||
char *entries;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct qeth_query_oat_data {
|
||||
__u32 command;
|
||||
__u32 buffer_len;
|
||||
__u32 response_len;
|
||||
__u64 ptr;
|
||||
};
|
||||
#endif /* __ASM_S390_QETH_IOCTL_H__ */
|
||||
|
|
|
@ -72,5 +72,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -60,6 +60,11 @@
|
|||
|
||||
#define SO_WIFI_STATUS 0x0025
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 0x0026
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 0x0027
|
||||
|
||||
|
||||
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
||||
#define SO_SECURITY_AUTHENTICATION 0x5001
|
||||
|
|
|
@ -293,7 +293,7 @@ static void uml_net_user_timer_expire(unsigned long _conn)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void setup_etheraddr(char *str, unsigned char *addr, char *name)
|
||||
static int setup_etheraddr(char *str, unsigned char *addr, char *name)
|
||||
{
|
||||
char *end;
|
||||
int i;
|
||||
|
@ -334,12 +334,13 @@ static void setup_etheraddr(char *str, unsigned char *addr, char *name)
|
|||
addr[0] | 0x02, addr[1], addr[2], addr[3], addr[4],
|
||||
addr[5]);
|
||||
}
|
||||
return;
|
||||
return 0;
|
||||
|
||||
random:
|
||||
printk(KERN_INFO
|
||||
"Choosing a random ethernet address for device %s\n", name);
|
||||
random_ether_addr(addr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(devices_lock);
|
||||
|
@ -391,6 +392,7 @@ static void eth_configure(int n, void *init, char *mac,
|
|||
struct net_device *dev;
|
||||
struct uml_net_private *lp;
|
||||
int err, size;
|
||||
int random_mac;
|
||||
|
||||
size = transport->private_size + sizeof(struct uml_net_private);
|
||||
|
||||
|
@ -417,7 +419,7 @@ static void eth_configure(int n, void *init, char *mac,
|
|||
*/
|
||||
snprintf(dev->name, sizeof(dev->name), "eth%d", n);
|
||||
|
||||
setup_etheraddr(mac, device->mac, dev->name);
|
||||
random_mac = setup_etheraddr(mac, device->mac, dev->name);
|
||||
|
||||
printk(KERN_INFO "Netdevice %d (%pM) : ", n, device->mac);
|
||||
|
||||
|
@ -474,6 +476,9 @@ static void eth_configure(int n, void *init, char *mac,
|
|||
|
||||
/* don't use eth_mac_addr, it will not work here */
|
||||
memcpy(dev->dev_addr, device->mac, ETH_ALEN);
|
||||
if (random_mac)
|
||||
dev->addr_assign_type |= NET_ADDR_RANDOM;
|
||||
|
||||
dev->mtu = transport->user->mtu;
|
||||
dev->netdev_ops = ¨_netdev_ops;
|
||||
dev->ethtool_ops = ¨_net_ethtool_ops;
|
||||
|
|
|
@ -475,8 +475,10 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
case BPF_S_LD_W_ABS:
|
||||
func = sk_load_word;
|
||||
common_load: seen |= SEEN_DATAREF;
|
||||
if ((int)K < 0)
|
||||
if ((int)K < 0) {
|
||||
/* Abort the JIT because __load_pointer() is needed. */
|
||||
goto out;
|
||||
}
|
||||
t_offset = func - (image + addrs[i]);
|
||||
EMIT1_off32(0xbe, K); /* mov imm32,%esi */
|
||||
EMIT1_off32(0xe8, t_offset); /* call */
|
||||
|
@ -489,14 +491,8 @@ common_load: seen |= SEEN_DATAREF;
|
|||
goto common_load;
|
||||
case BPF_S_LDX_B_MSH:
|
||||
if ((int)K < 0) {
|
||||
if (pc_ret0 > 0) {
|
||||
/* addrs[pc_ret0 - 1] is the start address */
|
||||
EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]);
|
||||
break;
|
||||
}
|
||||
CLEAR_A();
|
||||
EMIT_JMP(cleanup_addr - addrs[i]);
|
||||
break;
|
||||
/* Abort the JIT because __load_pointer() is needed. */
|
||||
goto out;
|
||||
}
|
||||
seen |= SEEN_DATAREF | SEEN_XREG;
|
||||
t_offset = sk_load_byte_msh - (image + addrs[i]);
|
||||
|
|
|
@ -75,5 +75,9 @@
|
|||
|
||||
#define SO_WIFI_STATUS 41
|
||||
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
||||
#define SO_PEEK_OFF 42
|
||||
|
||||
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
||||
#define SO_NOFCS 43
|
||||
|
||||
#endif /* _XTENSA_SOCKET_H */
|
||||
|
|
|
@ -389,9 +389,13 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|||
(nlh->nlmsg_flags & NLM_F_DUMP))) {
|
||||
if (link->dump == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return netlink_dump_start(crypto_nlsk, skb, nlh,
|
||||
link->dump, link->done, 0);
|
||||
{
|
||||
struct netlink_dump_control c = {
|
||||
.dump = link->dump,
|
||||
.done = link->done,
|
||||
};
|
||||
return netlink_dump_start(crypto_nlsk, skb, nlh, &c);
|
||||
}
|
||||
}
|
||||
|
||||
err = nlmsg_parse(nlh, crypto_msg_min[type], attrs, CRYPTOCFGA_MAX,
|
||||
|
|
|
@ -156,9 +156,6 @@ static int tx_complete = 0,dma_complete = 0,queued = 0,requeued = 0,
|
|||
|
||||
static struct atm_dev *eni_boards = NULL;
|
||||
|
||||
static u32 *cpu_zeroes = NULL; /* aligned "magic" zeroes */
|
||||
static dma_addr_t zeroes;
|
||||
|
||||
/* Read/write registers on card */
|
||||
#define eni_in(r) readl(eni_dev->reg+(r)*4)
|
||||
#define eni_out(v,r) writel((v),eni_dev->reg+(r)*4)
|
||||
|
@ -1138,8 +1135,10 @@ DPRINTK("doing direct send\n"); /* @@@ well, this doesn't work anyway */
|
|||
skb_shinfo(skb)->frags[i].page_offset,
|
||||
skb_frag_size(&skb_shinfo(skb)->frags[i]));
|
||||
}
|
||||
if (skb->len & 3)
|
||||
put_dma(tx->index,eni_dev->dma,&j,zeroes,4-(skb->len & 3));
|
||||
if (skb->len & 3) {
|
||||
put_dma(tx->index, eni_dev->dma, &j, eni_dev->zero.dma,
|
||||
4 - (skb->len & 3));
|
||||
}
|
||||
/* JK for AAL5 trailer - AAL0 doesn't need it, but who cares ... */
|
||||
eni_dev->dma[j++] = (((tx->tx_pos+size) & (tx->words-1)) <<
|
||||
MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) |
|
||||
|
@ -1728,6 +1727,7 @@ static int __devinit eni_do_init(struct atm_dev *dev)
|
|||
"mapping\n",dev->number);
|
||||
return error;
|
||||
}
|
||||
eni_dev->ioaddr = base;
|
||||
eni_dev->base_diff = real_base - (unsigned long) base;
|
||||
/* id may not be present in ASIC Tonga boards - check this @@@ */
|
||||
if (!eni_dev->asic) {
|
||||
|
@ -1789,6 +1789,14 @@ unmap:
|
|||
goto out;
|
||||
}
|
||||
|
||||
static void eni_do_release(struct atm_dev *dev)
|
||||
{
|
||||
struct eni_dev *ed = ENI_DEV(dev);
|
||||
|
||||
dev->phy->stop(dev);
|
||||
dev->phy = NULL;
|
||||
iounmap(ed->ioaddr);
|
||||
}
|
||||
|
||||
static int __devinit eni_start(struct atm_dev *dev)
|
||||
{
|
||||
|
@ -1873,7 +1881,7 @@ free_list:
|
|||
kfree(eni_dev->free_list);
|
||||
|
||||
free_irq:
|
||||
free_irq(eni_dev->irq, eni_dev);
|
||||
free_irq(eni_dev->irq, dev);
|
||||
|
||||
out:
|
||||
return error;
|
||||
|
@ -2220,48 +2228,60 @@ static const struct atmdev_ops ops = {
|
|||
|
||||
|
||||
static int __devinit eni_init_one(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *ent)
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
struct atm_dev *dev;
|
||||
struct eni_dev *eni_dev;
|
||||
int error = -ENOMEM;
|
||||
struct eni_zero *zero;
|
||||
int rc;
|
||||
|
||||
DPRINTK("eni_init_one\n");
|
||||
rc = pci_enable_device(pci_dev);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
if (pci_enable_device(pci_dev)) {
|
||||
error = -EIO;
|
||||
goto out0;
|
||||
}
|
||||
rc = -ENOMEM;
|
||||
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
||||
if (!eni_dev)
|
||||
goto err_disable;
|
||||
|
||||
zero = &eni_dev->zero;
|
||||
zero->addr = pci_alloc_consistent(pci_dev, ENI_ZEROES_SIZE, &zero->dma);
|
||||
if (!zero->addr)
|
||||
goto err_kfree;
|
||||
|
||||
eni_dev = kmalloc(sizeof(struct eni_dev),GFP_KERNEL);
|
||||
if (!eni_dev) goto out0;
|
||||
if (!cpu_zeroes) {
|
||||
cpu_zeroes = pci_alloc_consistent(pci_dev,ENI_ZEROES_SIZE,
|
||||
&zeroes);
|
||||
if (!cpu_zeroes) goto out1;
|
||||
}
|
||||
dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!dev) goto out2;
|
||||
if (!dev)
|
||||
goto err_free_consistent;
|
||||
|
||||
dev->dev_data = eni_dev;
|
||||
pci_set_drvdata(pci_dev, dev);
|
||||
eni_dev->pci_dev = pci_dev;
|
||||
dev->dev_data = eni_dev;
|
||||
eni_dev->asic = ent->driver_data;
|
||||
error = eni_do_init(dev);
|
||||
if (error) goto out3;
|
||||
error = eni_start(dev);
|
||||
if (error) goto out3;
|
||||
|
||||
rc = eni_do_init(dev);
|
||||
if (rc < 0)
|
||||
goto err_unregister;
|
||||
|
||||
rc = eni_start(dev);
|
||||
if (rc < 0)
|
||||
goto err_eni_release;
|
||||
|
||||
eni_dev->more = eni_boards;
|
||||
eni_boards = dev;
|
||||
return 0;
|
||||
out3:
|
||||
out:
|
||||
return rc;
|
||||
|
||||
err_eni_release:
|
||||
eni_do_release(dev);
|
||||
err_unregister:
|
||||
atm_dev_deregister(dev);
|
||||
out2:
|
||||
pci_free_consistent(eni_dev->pci_dev,ENI_ZEROES_SIZE,cpu_zeroes,zeroes);
|
||||
cpu_zeroes = NULL;
|
||||
out1:
|
||||
err_free_consistent:
|
||||
pci_free_consistent(pci_dev, ENI_ZEROES_SIZE, zero->addr, zero->dma);
|
||||
err_kfree:
|
||||
kfree(eni_dev);
|
||||
out0:
|
||||
return error;
|
||||
err_disable:
|
||||
pci_disable_device(pci_dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2273,9 +2293,17 @@ static struct pci_device_id eni_pci_tbl[] = {
|
|||
MODULE_DEVICE_TABLE(pci,eni_pci_tbl);
|
||||
|
||||
|
||||
static void __devexit eni_remove_one(struct pci_dev *pci_dev)
|
||||
static void __devexit eni_remove_one(struct pci_dev *pdev)
|
||||
{
|
||||
/* grrr */
|
||||
struct atm_dev *dev = pci_get_drvdata(pdev);
|
||||
struct eni_dev *ed = ENI_DEV(dev);
|
||||
struct eni_zero *zero = &ed->zero;
|
||||
|
||||
eni_do_release(dev);
|
||||
atm_dev_deregister(dev);
|
||||
pci_free_consistent(pdev, ENI_ZEROES_SIZE, zero->addr, zero->dma);
|
||||
kfree(ed);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -72,6 +72,7 @@ struct eni_dev {
|
|||
u32 events; /* pending events */
|
||||
/*-------------------------------- base pointers into Midway address
|
||||
space */
|
||||
void __iomem *ioaddr;
|
||||
void __iomem *phy; /* PHY interface chip registers */
|
||||
void __iomem *reg; /* register base */
|
||||
void __iomem *ram; /* RAM base */
|
||||
|
@ -86,6 +87,10 @@ struct eni_dev {
|
|||
wait_queue_head_t tx_wait; /* for close */
|
||||
int tx_bw; /* remaining bandwidth */
|
||||
u32 dma[TX_DMA_BUF*2]; /* DMA request scratch area */
|
||||
struct eni_zero { /* aligned "magic" zeroes */
|
||||
u32 *addr;
|
||||
dma_addr_t dma;
|
||||
} zero;
|
||||
int tx_mult; /* buffer size multiplier (percent) */
|
||||
/*-------------------------------- RX part */
|
||||
u32 serv_read; /* host service read index */
|
||||
|
|
|
@ -1572,7 +1572,7 @@ static inline void host_vcc_unbind(struct lanai_dev *lanai,
|
|||
|
||||
static void lanai_reset(struct lanai_dev *lanai)
|
||||
{
|
||||
printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not "
|
||||
printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* resetting - not "
|
||||
"implemented\n", lanai->number);
|
||||
/* TODO */
|
||||
/* The following is just a hack until we write the real
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
struct bcma_bus;
|
||||
|
||||
/* main.c */
|
||||
int bcma_bus_register(struct bcma_bus *bus);
|
||||
int __devinit bcma_bus_register(struct bcma_bus *bus);
|
||||
void bcma_bus_unregister(struct bcma_bus *bus);
|
||||
int __init bcma_bus_early_register(struct bcma_bus *bus,
|
||||
struct bcma_device *core_cc,
|
||||
|
@ -48,8 +48,12 @@ extern int __init bcma_host_pci_init(void);
|
|||
extern void __exit bcma_host_pci_exit(void);
|
||||
#endif /* CONFIG_BCMA_HOST_PCI */
|
||||
|
||||
/* driver_pci.c */
|
||||
u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
|
||||
|
||||
#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
|
||||
void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
|
||||
bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc);
|
||||
void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
|
||||
#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,7 @@ static void bcma_pmu_resources_init(struct bcma_drv_cc *cc)
|
|||
min_msk = 0x200D;
|
||||
max_msk = 0xFFFF;
|
||||
break;
|
||||
case 0x4331:
|
||||
case 43224:
|
||||
case 43225:
|
||||
break;
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
* Broadcom specific AMBA
|
||||
* PCI Core
|
||||
*
|
||||
* Copyright 2005, Broadcom Corporation
|
||||
* Copyright 2005, 2011, Broadcom Corporation
|
||||
* Copyright 2006, 2007, Michael Buesch <m@bues.ch>
|
||||
* Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* Licensed under the GNU/GPL. See COPYING for details.
|
||||
*/
|
||||
|
@ -16,40 +17,41 @@
|
|||
* R/W ops.
|
||||
**************************************************/
|
||||
|
||||
static u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address)
|
||||
u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address)
|
||||
{
|
||||
pcicore_write32(pc, 0x130, address);
|
||||
pcicore_read32(pc, 0x130);
|
||||
return pcicore_read32(pc, 0x134);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_ADDR, address);
|
||||
pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_ADDR);
|
||||
return pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_DATA);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void bcma_pcie_write(struct bcma_drv_pci *pc, u32 address, u32 data)
|
||||
{
|
||||
pcicore_write32(pc, 0x130, address);
|
||||
pcicore_read32(pc, 0x130);
|
||||
pcicore_write32(pc, 0x134, data);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_ADDR, address);
|
||||
pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_ADDR);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_DATA, data);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
|
||||
{
|
||||
const u16 mdio_control = 0x128;
|
||||
const u16 mdio_data = 0x12C;
|
||||
u32 v;
|
||||
int i;
|
||||
|
||||
v = (1 << 30); /* Start of Transaction */
|
||||
v |= (1 << 28); /* Write Transaction */
|
||||
v |= (1 << 17); /* Turnaround */
|
||||
v |= (0x1F << 18);
|
||||
v = BCMA_CORE_PCI_MDIODATA_START;
|
||||
v |= BCMA_CORE_PCI_MDIODATA_WRITE;
|
||||
v |= (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
|
||||
BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
|
||||
v |= (BCMA_CORE_PCI_MDIODATA_BLK_ADDR <<
|
||||
BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
|
||||
v |= BCMA_CORE_PCI_MDIODATA_TA;
|
||||
v |= (phy << 4);
|
||||
pcicore_write32(pc, mdio_data, v);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
|
||||
|
||||
udelay(10);
|
||||
for (i = 0; i < 200; i++) {
|
||||
v = pcicore_read32(pc, mdio_control);
|
||||
if (v & 0x100 /* Trans complete */)
|
||||
v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
|
||||
if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE)
|
||||
break;
|
||||
msleep(1);
|
||||
}
|
||||
|
@ -57,79 +59,84 @@ static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
|
|||
|
||||
static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address)
|
||||
{
|
||||
const u16 mdio_control = 0x128;
|
||||
const u16 mdio_data = 0x12C;
|
||||
int max_retries = 10;
|
||||
u16 ret = 0;
|
||||
u32 v;
|
||||
int i;
|
||||
|
||||
v = 0x80; /* Enable Preamble Sequence */
|
||||
v |= 0x2; /* MDIO Clock Divisor */
|
||||
pcicore_write32(pc, mdio_control, v);
|
||||
/* enable mdio access to SERDES */
|
||||
v = BCMA_CORE_PCI_MDIOCTL_PREAM_EN;
|
||||
v |= BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL;
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, v);
|
||||
|
||||
if (pc->core->id.rev >= 10) {
|
||||
max_retries = 200;
|
||||
bcma_pcie_mdio_set_phy(pc, device);
|
||||
v = (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
|
||||
BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
|
||||
v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
|
||||
} else {
|
||||
v = (device << BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD);
|
||||
v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD);
|
||||
}
|
||||
|
||||
v = (1 << 30); /* Start of Transaction */
|
||||
v |= (1 << 29); /* Read Transaction */
|
||||
v |= (1 << 17); /* Turnaround */
|
||||
if (pc->core->id.rev < 10)
|
||||
v |= (u32)device << 22;
|
||||
v |= (u32)address << 18;
|
||||
pcicore_write32(pc, mdio_data, v);
|
||||
v = BCMA_CORE_PCI_MDIODATA_START;
|
||||
v |= BCMA_CORE_PCI_MDIODATA_READ;
|
||||
v |= BCMA_CORE_PCI_MDIODATA_TA;
|
||||
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
|
||||
/* Wait for the device to complete the transaction */
|
||||
udelay(10);
|
||||
for (i = 0; i < max_retries; i++) {
|
||||
v = pcicore_read32(pc, mdio_control);
|
||||
if (v & 0x100 /* Trans complete */) {
|
||||
v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
|
||||
if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) {
|
||||
udelay(10);
|
||||
ret = pcicore_read32(pc, mdio_data);
|
||||
ret = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_DATA);
|
||||
break;
|
||||
}
|
||||
msleep(1);
|
||||
}
|
||||
pcicore_write32(pc, mdio_control, 0);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
|
||||
u8 address, u16 data)
|
||||
{
|
||||
const u16 mdio_control = 0x128;
|
||||
const u16 mdio_data = 0x12C;
|
||||
int max_retries = 10;
|
||||
u32 v;
|
||||
int i;
|
||||
|
||||
v = 0x80; /* Enable Preamble Sequence */
|
||||
v |= 0x2; /* MDIO Clock Divisor */
|
||||
pcicore_write32(pc, mdio_control, v);
|
||||
/* enable mdio access to SERDES */
|
||||
v = BCMA_CORE_PCI_MDIOCTL_PREAM_EN;
|
||||
v |= BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL;
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, v);
|
||||
|
||||
if (pc->core->id.rev >= 10) {
|
||||
max_retries = 200;
|
||||
bcma_pcie_mdio_set_phy(pc, device);
|
||||
v = (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
|
||||
BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
|
||||
v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
|
||||
} else {
|
||||
v = (device << BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD);
|
||||
v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD);
|
||||
}
|
||||
|
||||
v = (1 << 30); /* Start of Transaction */
|
||||
v |= (1 << 28); /* Write Transaction */
|
||||
v |= (1 << 17); /* Turnaround */
|
||||
if (pc->core->id.rev < 10)
|
||||
v |= (u32)device << 22;
|
||||
v |= (u32)address << 18;
|
||||
v = BCMA_CORE_PCI_MDIODATA_START;
|
||||
v |= BCMA_CORE_PCI_MDIODATA_WRITE;
|
||||
v |= BCMA_CORE_PCI_MDIODATA_TA;
|
||||
v |= data;
|
||||
pcicore_write32(pc, mdio_data, v);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
|
||||
/* Wait for the device to complete the transaction */
|
||||
udelay(10);
|
||||
for (i = 0; i < max_retries; i++) {
|
||||
v = pcicore_read32(pc, mdio_control);
|
||||
if (v & 0x100 /* Trans complete */)
|
||||
v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
|
||||
if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE)
|
||||
break;
|
||||
msleep(1);
|
||||
}
|
||||
pcicore_write32(pc, mdio_control, 0);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
|
@ -138,72 +145,53 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
|
|||
|
||||
static u8 bcma_pcicore_polarity_workaround(struct bcma_drv_pci *pc)
|
||||
{
|
||||
return (bcma_pcie_read(pc, 0x204) & 0x10) ? 0xC0 : 0x80;
|
||||
u32 tmp;
|
||||
|
||||
tmp = bcma_pcie_read(pc, BCMA_CORE_PCI_PLP_STATUSREG);
|
||||
if (tmp & BCMA_CORE_PCI_PLP_POLARITYINV_STAT)
|
||||
return BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE |
|
||||
BCMA_CORE_PCI_SERDES_RX_CTRL_POLARITY;
|
||||
else
|
||||
return BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE;
|
||||
}
|
||||
|
||||
static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc)
|
||||
{
|
||||
const u8 serdes_pll_device = 0x1D;
|
||||
const u8 serdes_rx_device = 0x1F;
|
||||
u16 tmp;
|
||||
|
||||
bcma_pcie_mdio_write(pc, serdes_rx_device, 1 /* Control */,
|
||||
bcma_pcicore_polarity_workaround(pc));
|
||||
tmp = bcma_pcie_mdio_read(pc, serdes_pll_device, 1 /* Control */);
|
||||
if (tmp & 0x4000)
|
||||
bcma_pcie_mdio_write(pc, serdes_pll_device, 1, tmp & ~0x4000);
|
||||
bcma_pcie_mdio_write(pc, BCMA_CORE_PCI_MDIODATA_DEV_RX,
|
||||
BCMA_CORE_PCI_SERDES_RX_CTRL,
|
||||
bcma_pcicore_polarity_workaround(pc));
|
||||
tmp = bcma_pcie_mdio_read(pc, BCMA_CORE_PCI_MDIODATA_DEV_PLL,
|
||||
BCMA_CORE_PCI_SERDES_PLL_CTRL);
|
||||
if (tmp & BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN)
|
||||
bcma_pcie_mdio_write(pc, BCMA_CORE_PCI_MDIODATA_DEV_PLL,
|
||||
BCMA_CORE_PCI_SERDES_PLL_CTRL,
|
||||
tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN);
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
* Init.
|
||||
**************************************************/
|
||||
|
||||
static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
|
||||
static void __devinit bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
|
||||
{
|
||||
bcma_pcicore_serdes_workaround(pc);
|
||||
}
|
||||
|
||||
static bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
|
||||
{
|
||||
struct bcma_bus *bus = pc->core->bus;
|
||||
u16 chipid_top;
|
||||
|
||||
chipid_top = (bus->chipinfo.id & 0xFF00);
|
||||
if (chipid_top != 0x4700 &&
|
||||
chipid_top != 0x5300)
|
||||
return false;
|
||||
|
||||
#ifdef CONFIG_SSB_DRIVER_PCICORE
|
||||
if (bus->sprom.boardflags_lo & SSB_BFL_NOPCI)
|
||||
return false;
|
||||
#endif /* CONFIG_SSB_DRIVER_PCICORE */
|
||||
|
||||
#if 0
|
||||
/* TODO: on BCMA we use address from EROM instead of magic formula */
|
||||
u32 tmp;
|
||||
return !mips_busprobe32(tmp, (bus->mmio +
|
||||
(pc->core->core_index * BCMA_CORE_SIZE)));
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void bcma_core_pci_init(struct bcma_drv_pci *pc)
|
||||
void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc)
|
||||
{
|
||||
if (pc->setup_done)
|
||||
return;
|
||||
|
||||
if (bcma_core_pci_is_in_hostmode(pc)) {
|
||||
#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
|
||||
pc->hostmode = bcma_core_pci_is_in_hostmode(pc);
|
||||
if (pc->hostmode)
|
||||
bcma_core_pci_hostmode_init(pc);
|
||||
#else
|
||||
pr_err("Driver compiled without support for hostmode PCI\n");
|
||||
#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
|
||||
} else {
|
||||
bcma_core_pci_clientmode_init(pc);
|
||||
}
|
||||
|
||||
pc->setup_done = true;
|
||||
if (!pc->hostmode)
|
||||
bcma_core_pci_clientmode_init(pc);
|
||||
}
|
||||
|
||||
int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
|
||||
|
|
|
@ -2,13 +2,587 @@
|
|||
* Broadcom specific AMBA
|
||||
* PCI Core in hostmode
|
||||
*
|
||||
* Copyright 2005 - 2011, Broadcom Corporation
|
||||
* Copyright 2006, 2007, Michael Buesch <m@bues.ch>
|
||||
* Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* Licensed under the GNU/GPL. See COPYING for details.
|
||||
*/
|
||||
|
||||
#include "bcma_private.h"
|
||||
#include <linux/export.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <asm/paccess.h>
|
||||
|
||||
void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
|
||||
/* Probe a 32bit value on the bus and catch bus exceptions.
|
||||
* Returns nonzero on a bus exception.
|
||||
* This is MIPS specific */
|
||||
#define mips_busprobe32(val, addr) get_dbe((val), ((u32 *)(addr)))
|
||||
|
||||
/* Assume one-hot slot wiring */
|
||||
#define BCMA_PCI_SLOT_MAX 16
|
||||
#define PCI_CONFIG_SPACE_SIZE 256
|
||||
|
||||
bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
|
||||
{
|
||||
pr_err("No support for PCI core in hostmode yet\n");
|
||||
struct bcma_bus *bus = pc->core->bus;
|
||||
u16 chipid_top;
|
||||
u32 tmp;
|
||||
|
||||
chipid_top = (bus->chipinfo.id & 0xFF00);
|
||||
if (chipid_top != 0x4700 &&
|
||||
chipid_top != 0x5300)
|
||||
return false;
|
||||
|
||||
if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) {
|
||||
pr_info("This PCI core is disabled and not working\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
bcma_core_enable(pc->core, 0);
|
||||
|
||||
return !mips_busprobe32(tmp, pc->core->io_addr);
|
||||
}
|
||||
|
||||
static u32 bcma_pcie_read_config(struct bcma_drv_pci *pc, u32 address)
|
||||
{
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_ADDR, address);
|
||||
pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_ADDR);
|
||||
return pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_DATA);
|
||||
}
|
||||
|
||||
static void bcma_pcie_write_config(struct bcma_drv_pci *pc, u32 address,
|
||||
u32 data)
|
||||
{
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_ADDR, address);
|
||||
pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_ADDR);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_DATA, data);
|
||||
}
|
||||
|
||||
static u32 bcma_get_cfgspace_addr(struct bcma_drv_pci *pc, unsigned int dev,
|
||||
unsigned int func, unsigned int off)
|
||||
{
|
||||
u32 addr = 0;
|
||||
|
||||
/* Issue config commands only when the data link is up (atleast
|
||||
* one external pcie device is present).
|
||||
*/
|
||||
if (dev >= 2 || !(bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_LSREG)
|
||||
& BCMA_CORE_PCI_DLLP_LSREG_LINKUP))
|
||||
goto out;
|
||||
|
||||
/* Type 0 transaction */
|
||||
/* Slide the PCI window to the appropriate slot */
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI1, BCMA_CORE_PCI_SBTOPCI_CFG0);
|
||||
/* Calculate the address */
|
||||
addr = pc->host_controller->host_cfg_addr;
|
||||
addr |= (dev << BCMA_CORE_PCI_CFG_SLOT_SHIFT);
|
||||
addr |= (func << BCMA_CORE_PCI_CFG_FUN_SHIFT);
|
||||
addr |= (off & ~3);
|
||||
|
||||
out:
|
||||
return addr;
|
||||
}
|
||||
|
||||
static int bcma_extpci_read_config(struct bcma_drv_pci *pc, unsigned int dev,
|
||||
unsigned int func, unsigned int off,
|
||||
void *buf, int len)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
u32 addr, val;
|
||||
void __iomem *mmio = 0;
|
||||
|
||||
WARN_ON(!pc->hostmode);
|
||||
if (unlikely(len != 1 && len != 2 && len != 4))
|
||||
goto out;
|
||||
if (dev == 0) {
|
||||
/* we support only two functions on device 0 */
|
||||
if (func > 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* accesses to config registers with offsets >= 256
|
||||
* requires indirect access.
|
||||
*/
|
||||
if (off >= PCI_CONFIG_SPACE_SIZE) {
|
||||
addr = (func << 12);
|
||||
addr |= (off & 0x0FFF);
|
||||
val = bcma_pcie_read_config(pc, addr);
|
||||
} else {
|
||||
addr = BCMA_CORE_PCI_PCICFG0;
|
||||
addr |= (func << 8);
|
||||
addr |= (off & 0xfc);
|
||||
val = pcicore_read32(pc, addr);
|
||||
}
|
||||
} else {
|
||||
addr = bcma_get_cfgspace_addr(pc, dev, func, off);
|
||||
if (unlikely(!addr))
|
||||
goto out;
|
||||
err = -ENOMEM;
|
||||
mmio = ioremap_nocache(addr, len);
|
||||
if (!mmio)
|
||||
goto out;
|
||||
|
||||
if (mips_busprobe32(val, mmio)) {
|
||||
val = 0xffffffff;
|
||||
goto unmap;
|
||||
}
|
||||
|
||||
val = readl(mmio);
|
||||
}
|
||||
val >>= (8 * (off & 3));
|
||||
|
||||
switch (len) {
|
||||
case 1:
|
||||
*((u8 *)buf) = (u8)val;
|
||||
break;
|
||||
case 2:
|
||||
*((u16 *)buf) = (u16)val;
|
||||
break;
|
||||
case 4:
|
||||
*((u32 *)buf) = (u32)val;
|
||||
break;
|
||||
}
|
||||
err = 0;
|
||||
unmap:
|
||||
if (mmio)
|
||||
iounmap(mmio);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
|
||||
unsigned int func, unsigned int off,
|
||||
const void *buf, int len)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
u32 addr = 0, val = 0;
|
||||
void __iomem *mmio = 0;
|
||||
u16 chipid = pc->core->bus->chipinfo.id;
|
||||
|
||||
WARN_ON(!pc->hostmode);
|
||||
if (unlikely(len != 1 && len != 2 && len != 4))
|
||||
goto out;
|
||||
if (dev == 0) {
|
||||
/* accesses to config registers with offsets >= 256
|
||||
* requires indirect access.
|
||||
*/
|
||||
if (off < PCI_CONFIG_SPACE_SIZE) {
|
||||
addr = pc->core->addr + BCMA_CORE_PCI_PCICFG0;
|
||||
addr |= (func << 8);
|
||||
addr |= (off & 0xfc);
|
||||
mmio = ioremap_nocache(addr, len);
|
||||
if (!mmio)
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
addr = bcma_get_cfgspace_addr(pc, dev, func, off);
|
||||
if (unlikely(!addr))
|
||||
goto out;
|
||||
err = -ENOMEM;
|
||||
mmio = ioremap_nocache(addr, len);
|
||||
if (!mmio)
|
||||
goto out;
|
||||
|
||||
if (mips_busprobe32(val, mmio)) {
|
||||
val = 0xffffffff;
|
||||
goto unmap;
|
||||
}
|
||||
}
|
||||
|
||||
switch (len) {
|
||||
case 1:
|
||||
val = readl(mmio);
|
||||
val &= ~(0xFF << (8 * (off & 3)));
|
||||
val |= *((const u8 *)buf) << (8 * (off & 3));
|
||||
break;
|
||||
case 2:
|
||||
val = readl(mmio);
|
||||
val &= ~(0xFFFF << (8 * (off & 3)));
|
||||
val |= *((const u16 *)buf) << (8 * (off & 3));
|
||||
break;
|
||||
case 4:
|
||||
val = *((const u32 *)buf);
|
||||
break;
|
||||
}
|
||||
if (dev == 0 && !addr) {
|
||||
/* accesses to config registers with offsets >= 256
|
||||
* requires indirect access.
|
||||
*/
|
||||
addr = (func << 12);
|
||||
addr |= (off & 0x0FFF);
|
||||
bcma_pcie_write_config(pc, addr, val);
|
||||
} else {
|
||||
writel(val, mmio);
|
||||
|
||||
if (chipid == 0x4716 || chipid == 0x4748)
|
||||
readl(mmio);
|
||||
}
|
||||
|
||||
err = 0;
|
||||
unmap:
|
||||
if (mmio)
|
||||
iounmap(mmio);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int bcma_core_pci_hostmode_read_config(struct pci_bus *bus,
|
||||
unsigned int devfn,
|
||||
int reg, int size, u32 *val)
|
||||
{
|
||||
unsigned long flags;
|
||||
int err;
|
||||
struct bcma_drv_pci *pc;
|
||||
struct bcma_drv_pci_host *pc_host;
|
||||
|
||||
pc_host = container_of(bus->ops, struct bcma_drv_pci_host, pci_ops);
|
||||
pc = pc_host->pdev;
|
||||
|
||||
spin_lock_irqsave(&pc_host->cfgspace_lock, flags);
|
||||
err = bcma_extpci_read_config(pc, PCI_SLOT(devfn),
|
||||
PCI_FUNC(devfn), reg, val, size);
|
||||
spin_unlock_irqrestore(&pc_host->cfgspace_lock, flags);
|
||||
|
||||
return err ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static int bcma_core_pci_hostmode_write_config(struct pci_bus *bus,
|
||||
unsigned int devfn,
|
||||
int reg, int size, u32 val)
|
||||
{
|
||||
unsigned long flags;
|
||||
int err;
|
||||
struct bcma_drv_pci *pc;
|
||||
struct bcma_drv_pci_host *pc_host;
|
||||
|
||||
pc_host = container_of(bus->ops, struct bcma_drv_pci_host, pci_ops);
|
||||
pc = pc_host->pdev;
|
||||
|
||||
spin_lock_irqsave(&pc_host->cfgspace_lock, flags);
|
||||
err = bcma_extpci_write_config(pc, PCI_SLOT(devfn),
|
||||
PCI_FUNC(devfn), reg, &val, size);
|
||||
spin_unlock_irqrestore(&pc_host->cfgspace_lock, flags);
|
||||
|
||||
return err ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
/* return cap_offset if requested capability exists in the PCI config space */
|
||||
static u8 __devinit bcma_find_pci_capability(struct bcma_drv_pci *pc,
|
||||
unsigned int dev,
|
||||
unsigned int func, u8 req_cap_id,
|
||||
unsigned char *buf, u32 *buflen)
|
||||
{
|
||||
u8 cap_id;
|
||||
u8 cap_ptr = 0;
|
||||
u32 bufsize;
|
||||
u8 byte_val;
|
||||
|
||||
/* check for Header type 0 */
|
||||
bcma_extpci_read_config(pc, dev, func, PCI_HEADER_TYPE, &byte_val,
|
||||
sizeof(u8));
|
||||
if ((byte_val & 0x7f) != PCI_HEADER_TYPE_NORMAL)
|
||||
return cap_ptr;
|
||||
|
||||
/* check if the capability pointer field exists */
|
||||
bcma_extpci_read_config(pc, dev, func, PCI_STATUS, &byte_val,
|
||||
sizeof(u8));
|
||||
if (!(byte_val & PCI_STATUS_CAP_LIST))
|
||||
return cap_ptr;
|
||||
|
||||
/* check if the capability pointer is 0x00 */
|
||||
bcma_extpci_read_config(pc, dev, func, PCI_CAPABILITY_LIST, &cap_ptr,
|
||||
sizeof(u8));
|
||||
if (cap_ptr == 0x00)
|
||||
return cap_ptr;
|
||||
|
||||
/* loop thr'u the capability list and see if the requested capabilty
|
||||
* exists */
|
||||
bcma_extpci_read_config(pc, dev, func, cap_ptr, &cap_id, sizeof(u8));
|
||||
while (cap_id != req_cap_id) {
|
||||
bcma_extpci_read_config(pc, dev, func, cap_ptr + 1, &cap_ptr,
|
||||
sizeof(u8));
|
||||
if (cap_ptr == 0x00)
|
||||
return cap_ptr;
|
||||
bcma_extpci_read_config(pc, dev, func, cap_ptr, &cap_id,
|
||||
sizeof(u8));
|
||||
}
|
||||
|
||||
/* found the caller requested capability */
|
||||
if ((buf != NULL) && (buflen != NULL)) {
|
||||
u8 cap_data;
|
||||
|
||||
bufsize = *buflen;
|
||||
if (!bufsize)
|
||||
return cap_ptr;
|
||||
|
||||
*buflen = 0;
|
||||
|
||||
/* copy the cpability data excluding cap ID and next ptr */
|
||||
cap_data = cap_ptr + 2;
|
||||
if ((bufsize + cap_data) > PCI_CONFIG_SPACE_SIZE)
|
||||
bufsize = PCI_CONFIG_SPACE_SIZE - cap_data;
|
||||
*buflen = bufsize;
|
||||
while (bufsize--) {
|
||||
bcma_extpci_read_config(pc, dev, func, cap_data, buf,
|
||||
sizeof(u8));
|
||||
cap_data++;
|
||||
buf++;
|
||||
}
|
||||
}
|
||||
|
||||
return cap_ptr;
|
||||
}
|
||||
|
||||
/* If the root port is capable of returning Config Request
|
||||
* Retry Status (CRS) Completion Status to software then
|
||||
* enable the feature.
|
||||
*/
|
||||
static void __devinit bcma_core_pci_enable_crs(struct bcma_drv_pci *pc)
|
||||
{
|
||||
u8 cap_ptr, root_ctrl, root_cap, dev;
|
||||
u16 val16;
|
||||
int i;
|
||||
|
||||
cap_ptr = bcma_find_pci_capability(pc, 0, 0, PCI_CAP_ID_EXP, NULL,
|
||||
NULL);
|
||||
root_cap = cap_ptr + PCI_EXP_RTCAP;
|
||||
bcma_extpci_read_config(pc, 0, 0, root_cap, &val16, sizeof(u16));
|
||||
if (val16 & BCMA_CORE_PCI_RC_CRS_VISIBILITY) {
|
||||
/* Enable CRS software visibility */
|
||||
root_ctrl = cap_ptr + PCI_EXP_RTCTL;
|
||||
val16 = PCI_EXP_RTCTL_CRSSVE;
|
||||
bcma_extpci_read_config(pc, 0, 0, root_ctrl, &val16,
|
||||
sizeof(u16));
|
||||
|
||||
/* Initiate a configuration request to read the vendor id
|
||||
* field of the device function's config space header after
|
||||
* 100 ms wait time from the end of Reset. If the device is
|
||||
* not done with its internal initialization, it must at
|
||||
* least return a completion TLP, with a completion status
|
||||
* of "Configuration Request Retry Status (CRS)". The root
|
||||
* complex must complete the request to the host by returning
|
||||
* a read-data value of 0001h for the Vendor ID field and
|
||||
* all 1s for any additional bytes included in the request.
|
||||
* Poll using the config reads for max wait time of 1 sec or
|
||||
* until we receive the successful completion status. Repeat
|
||||
* the procedure for all the devices.
|
||||
*/
|
||||
for (dev = 1; dev < BCMA_PCI_SLOT_MAX; dev++) {
|
||||
for (i = 0; i < 100000; i++) {
|
||||
bcma_extpci_read_config(pc, dev, 0,
|
||||
PCI_VENDOR_ID, &val16,
|
||||
sizeof(val16));
|
||||
if (val16 != 0x1)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
if (val16 == 0x1)
|
||||
pr_err("PCI: Broken device in slot %d\n", dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
|
||||
{
|
||||
struct bcma_bus *bus = pc->core->bus;
|
||||
struct bcma_drv_pci_host *pc_host;
|
||||
u32 tmp;
|
||||
u32 pci_membase_1G;
|
||||
unsigned long io_map_base;
|
||||
|
||||
pr_info("PCIEcore in host mode found\n");
|
||||
|
||||
pc_host = kzalloc(sizeof(*pc_host), GFP_KERNEL);
|
||||
if (!pc_host) {
|
||||
pr_err("can not allocate memory");
|
||||
return;
|
||||
}
|
||||
|
||||
pc->host_controller = pc_host;
|
||||
pc_host->pci_controller.io_resource = &pc_host->io_resource;
|
||||
pc_host->pci_controller.mem_resource = &pc_host->mem_resource;
|
||||
pc_host->pci_controller.pci_ops = &pc_host->pci_ops;
|
||||
pc_host->pdev = pc;
|
||||
|
||||
pci_membase_1G = BCMA_SOC_PCI_DMA;
|
||||
pc_host->host_cfg_addr = BCMA_SOC_PCI_CFG;
|
||||
|
||||
pc_host->pci_ops.read = bcma_core_pci_hostmode_read_config;
|
||||
pc_host->pci_ops.write = bcma_core_pci_hostmode_write_config;
|
||||
|
||||
pc_host->mem_resource.name = "BCMA PCIcore external memory",
|
||||
pc_host->mem_resource.start = BCMA_SOC_PCI_DMA;
|
||||
pc_host->mem_resource.end = BCMA_SOC_PCI_DMA + BCMA_SOC_PCI_DMA_SZ - 1;
|
||||
pc_host->mem_resource.flags = IORESOURCE_MEM | IORESOURCE_PCI_FIXED;
|
||||
|
||||
pc_host->io_resource.name = "BCMA PCIcore external I/O",
|
||||
pc_host->io_resource.start = 0x100;
|
||||
pc_host->io_resource.end = 0x7FF;
|
||||
pc_host->io_resource.flags = IORESOURCE_IO | IORESOURCE_PCI_FIXED;
|
||||
|
||||
/* Reset RC */
|
||||
udelay(3000);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST_OE);
|
||||
udelay(1000);
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST |
|
||||
BCMA_CORE_PCI_CTL_RST_OE);
|
||||
|
||||
/* 64 MB I/O access window. On 4716, use
|
||||
* sbtopcie0 to access the device registers. We
|
||||
* can't use address match 2 (1 GB window) region
|
||||
* as mips can't generate 64-bit address on the
|
||||
* backplane.
|
||||
*/
|
||||
if (bus->chipinfo.id == 0x4716 || bus->chipinfo.id == 0x4748) {
|
||||
pc_host->mem_resource.start = BCMA_SOC_PCI_MEM;
|
||||
pc_host->mem_resource.end = BCMA_SOC_PCI_MEM +
|
||||
BCMA_SOC_PCI_MEM_SZ - 1;
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
|
||||
BCMA_CORE_PCI_SBTOPCI_MEM | BCMA_SOC_PCI_MEM);
|
||||
} else if (bus->chipinfo.id == 0x5300) {
|
||||
tmp = BCMA_CORE_PCI_SBTOPCI_MEM;
|
||||
tmp |= BCMA_CORE_PCI_SBTOPCI_PREF;
|
||||
tmp |= BCMA_CORE_PCI_SBTOPCI_BURST;
|
||||
if (pc->core->core_unit == 0) {
|
||||
pc_host->mem_resource.start = BCMA_SOC_PCI_MEM;
|
||||
pc_host->mem_resource.end = BCMA_SOC_PCI_MEM +
|
||||
BCMA_SOC_PCI_MEM_SZ - 1;
|
||||
pci_membase_1G = BCMA_SOC_PCIE_DMA_H32;
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
|
||||
tmp | BCMA_SOC_PCI_MEM);
|
||||
} else if (pc->core->core_unit == 1) {
|
||||
pc_host->mem_resource.start = BCMA_SOC_PCI1_MEM;
|
||||
pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM +
|
||||
BCMA_SOC_PCI_MEM_SZ - 1;
|
||||
pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32;
|
||||
pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG;
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
|
||||
tmp | BCMA_SOC_PCI1_MEM);
|
||||
}
|
||||
} else
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
|
||||
BCMA_CORE_PCI_SBTOPCI_IO);
|
||||
|
||||
/* 64 MB configuration access window */
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI1, BCMA_CORE_PCI_SBTOPCI_CFG0);
|
||||
|
||||
/* 1 GB memory access window */
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI2,
|
||||
BCMA_CORE_PCI_SBTOPCI_MEM | pci_membase_1G);
|
||||
|
||||
|
||||
/* As per PCI Express Base Spec 1.1 we need to wait for
|
||||
* at least 100 ms from the end of a reset (cold/warm/hot)
|
||||
* before issuing configuration requests to PCI Express
|
||||
* devices.
|
||||
*/
|
||||
udelay(100000);
|
||||
|
||||
bcma_core_pci_enable_crs(pc);
|
||||
|
||||
/* Enable PCI bridge BAR0 memory & master access */
|
||||
tmp = PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
||||
bcma_extpci_write_config(pc, 0, 0, PCI_COMMAND, &tmp, sizeof(tmp));
|
||||
|
||||
/* Enable PCI interrupts */
|
||||
pcicore_write32(pc, BCMA_CORE_PCI_IMASK, BCMA_CORE_PCI_IMASK_INTA);
|
||||
|
||||
/* Ok, ready to run, register it to the system.
|
||||
* The following needs change, if we want to port hostmode
|
||||
* to non-MIPS platform. */
|
||||
io_map_base = (unsigned long)ioremap_nocache(BCMA_SOC_PCI_MEM,
|
||||
0x04000000);
|
||||
pc_host->pci_controller.io_map_base = io_map_base;
|
||||
set_io_port_base(pc_host->pci_controller.io_map_base);
|
||||
/* Give some time to the PCI controller to configure itself with the new
|
||||
* values. Not waiting at this point causes crashes of the machine. */
|
||||
mdelay(10);
|
||||
register_pci_controller(&pc_host->pci_controller);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Early PCI fixup for a device on the PCI-core bridge. */
|
||||
static void bcma_core_pci_fixup_pcibridge(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
|
||||
/* This is not a device on the PCI-core bridge. */
|
||||
return;
|
||||
}
|
||||
if (PCI_SLOT(dev->devfn) != 0)
|
||||
return;
|
||||
|
||||
pr_info("PCI: Fixing up bridge %s\n", pci_name(dev));
|
||||
|
||||
/* Enable PCI bridge bus mastering and memory space */
|
||||
pci_set_master(dev);
|
||||
if (pcibios_enable_device(dev, ~0) < 0) {
|
||||
pr_err("PCI: BCMA bridge enable failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enable PCI bridge BAR1 prefetch and burst */
|
||||
pci_write_config_dword(dev, BCMA_PCI_BAR1_CONTROL, 3);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, bcma_core_pci_fixup_pcibridge);
|
||||
|
||||
/* Early PCI fixup for all PCI-cores to set the correct memory address. */
|
||||
static void bcma_core_pci_fixup_addresses(struct pci_dev *dev)
|
||||
{
|
||||
struct resource *res;
|
||||
int pos;
|
||||
|
||||
if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
|
||||
/* This is not a device on the PCI-core bridge. */
|
||||
return;
|
||||
}
|
||||
if (PCI_SLOT(dev->devfn) == 0)
|
||||
return;
|
||||
|
||||
pr_info("PCI: Fixing up addresses %s\n", pci_name(dev));
|
||||
|
||||
for (pos = 0; pos < 6; pos++) {
|
||||
res = &dev->resource[pos];
|
||||
if (res->flags & (IORESOURCE_IO | IORESOURCE_MEM))
|
||||
pci_assign_resource(dev, pos);
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, bcma_core_pci_fixup_addresses);
|
||||
|
||||
/* This function is called when doing a pci_enable_device().
|
||||
* We must first check if the device is a device on the PCI-core bridge. */
|
||||
int bcma_core_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
struct bcma_drv_pci_host *pc_host;
|
||||
|
||||
if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
|
||||
/* This is not a device on the PCI-core bridge. */
|
||||
return -ENODEV;
|
||||
}
|
||||
pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
|
||||
pci_ops);
|
||||
|
||||
pr_info("PCI: Fixing up device %s\n", pci_name(dev));
|
||||
|
||||
/* Fix up interrupt lines */
|
||||
dev->irq = bcma_core_mips_irq(pc_host->pdev->core) + 2;
|
||||
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bcma_core_pci_plat_dev_init);
|
||||
|
||||
/* PCI device IRQ mapping. */
|
||||
int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev)
|
||||
{
|
||||
struct bcma_drv_pci_host *pc_host;
|
||||
|
||||
if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
|
||||
/* This is not a device on the PCI-core bridge. */
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
|
||||
pci_ops);
|
||||
return bcma_core_mips_irq(pc_host->pdev->core) + 2;
|
||||
}
|
||||
EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);
|
||||
|
|
|
@ -154,8 +154,8 @@ const struct bcma_host_ops bcma_host_pci_ops = {
|
|||
.awrite32 = bcma_host_pci_awrite32,
|
||||
};
|
||||
|
||||
static int bcma_host_pci_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id)
|
||||
static int __devinit bcma_host_pci_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id)
|
||||
{
|
||||
struct bcma_bus *bus;
|
||||
int err = -ENOMEM;
|
||||
|
|
|
@ -13,6 +13,12 @@
|
|||
MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/* contains the number the next bus should get. */
|
||||
static unsigned int bcma_bus_next_num = 0;
|
||||
|
||||
/* bcma_buses_mutex locks the bcma_bus_next_num */
|
||||
static DEFINE_MUTEX(bcma_buses_mutex);
|
||||
|
||||
static int bcma_bus_match(struct device *dev, struct device_driver *drv);
|
||||
static int bcma_device_probe(struct device *dev);
|
||||
static int bcma_device_remove(struct device *dev);
|
||||
|
@ -55,7 +61,7 @@ static struct bus_type bcma_bus_type = {
|
|||
.dev_attrs = bcma_device_attrs,
|
||||
};
|
||||
|
||||
static struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
||||
struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
||||
{
|
||||
struct bcma_device *core;
|
||||
|
||||
|
@ -65,6 +71,7 @@ static struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bcma_find_core);
|
||||
|
||||
static void bcma_release_core_dev(struct device *dev)
|
||||
{
|
||||
|
@ -93,7 +100,7 @@ static int bcma_register_cores(struct bcma_bus *bus)
|
|||
|
||||
core->dev.release = bcma_release_core_dev;
|
||||
core->dev.bus = &bcma_bus_type;
|
||||
dev_set_name(&core->dev, "bcma%d:%d", 0/*bus->num*/, dev_id);
|
||||
dev_set_name(&core->dev, "bcma%d:%d", bus->num, dev_id);
|
||||
|
||||
switch (bus->hosttype) {
|
||||
case BCMA_HOSTTYPE_PCI:
|
||||
|
@ -132,11 +139,15 @@ static void bcma_unregister_cores(struct bcma_bus *bus)
|
|||
}
|
||||
}
|
||||
|
||||
int bcma_bus_register(struct bcma_bus *bus)
|
||||
int __devinit bcma_bus_register(struct bcma_bus *bus)
|
||||
{
|
||||
int err;
|
||||
struct bcma_device *core;
|
||||
|
||||
mutex_lock(&bcma_buses_mutex);
|
||||
bus->num = bcma_bus_next_num++;
|
||||
mutex_unlock(&bcma_buses_mutex);
|
||||
|
||||
/* Scan for devices (cores) */
|
||||
err = bcma_bus_scan(bus);
|
||||
if (err) {
|
||||
|
|
|
@ -212,6 +212,17 @@ static struct bcma_device *bcma_find_core_by_index(struct bcma_bus *bus,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct bcma_device *bcma_find_core_reverse(struct bcma_bus *bus, u16 coreid)
|
||||
{
|
||||
struct bcma_device *core;
|
||||
|
||||
list_for_each_entry_reverse(core, &bus->cores, list) {
|
||||
if (core->id.id == coreid)
|
||||
return core;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
|
||||
struct bcma_device_id *match, int core_num,
|
||||
struct bcma_device *core)
|
||||
|
@ -353,6 +364,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
|
|||
void bcma_init_bus(struct bcma_bus *bus)
|
||||
{
|
||||
s32 tmp;
|
||||
struct bcma_chipinfo *chipinfo = &(bus->chipinfo);
|
||||
|
||||
if (bus->init_done)
|
||||
return;
|
||||
|
@ -363,9 +375,12 @@ void bcma_init_bus(struct bcma_bus *bus)
|
|||
bcma_scan_switch_core(bus, BCMA_ADDR_BASE);
|
||||
|
||||
tmp = bcma_scan_read32(bus, 0, BCMA_CC_ID);
|
||||
bus->chipinfo.id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
|
||||
bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
|
||||
bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
|
||||
chipinfo->id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
|
||||
chipinfo->rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
|
||||
chipinfo->pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
|
||||
pr_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n",
|
||||
chipinfo->id, chipinfo->rev, chipinfo->pkg);
|
||||
|
||||
bus->init_done = true;
|
||||
}
|
||||
|
||||
|
@ -392,6 +407,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|||
bcma_scan_switch_core(bus, erombase);
|
||||
|
||||
while (eromptr < eromend) {
|
||||
struct bcma_device *other_core;
|
||||
struct bcma_device *core = kzalloc(sizeof(*core), GFP_KERNEL);
|
||||
if (!core)
|
||||
return -ENOMEM;
|
||||
|
@ -414,6 +430,8 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
|||
|
||||
core->core_index = core_num++;
|
||||
bus->nr_cores++;
|
||||
other_core = bcma_find_core_reverse(bus, core->id.id);
|
||||
core->core_unit = (other_core == NULL) ? 0 : other_core->core_unit + 1;
|
||||
|
||||
pr_info("Core %d found: %s "
|
||||
"(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
* Broadcom specific AMBA
|
||||
* SPROM reading
|
||||
*
|
||||
* Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* Licensed under the GNU/GPL. See COPYING for details.
|
||||
*/
|
||||
|
||||
|
@ -14,7 +16,57 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define SPOFF(offset) ((offset) / sizeof(u16))
|
||||
static int(*get_fallback_sprom)(struct bcma_bus *dev, struct ssb_sprom *out);
|
||||
|
||||
/**
|
||||
* bcma_arch_register_fallback_sprom - Registers a method providing a
|
||||
* fallback SPROM if no SPROM is found.
|
||||
*
|
||||
* @sprom_callback: The callback function.
|
||||
*
|
||||
* With this function the architecture implementation may register a
|
||||
* callback handler which fills the SPROM data structure. The fallback is
|
||||
* used for PCI based BCMA devices, where no valid SPROM can be found
|
||||
* in the shadow registers and to provide the SPROM for SoCs where BCMA is
|
||||
* to controll the system bus.
|
||||
*
|
||||
* This function is useful for weird architectures that have a half-assed
|
||||
* BCMA device hardwired to their PCI bus.
|
||||
*
|
||||
* This function is available for architecture code, only. So it is not
|
||||
* exported.
|
||||
*/
|
||||
int bcma_arch_register_fallback_sprom(int (*sprom_callback)(struct bcma_bus *bus,
|
||||
struct ssb_sprom *out))
|
||||
{
|
||||
if (get_fallback_sprom)
|
||||
return -EEXIST;
|
||||
get_fallback_sprom = sprom_callback;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bcma_fill_sprom_with_fallback(struct bcma_bus *bus,
|
||||
struct ssb_sprom *out)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!get_fallback_sprom) {
|
||||
err = -ENOENT;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
err = get_fallback_sprom(bus, out);
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
pr_debug("Using SPROM revision %d provided by"
|
||||
" platform.\n", bus->sprom.revision);
|
||||
return 0;
|
||||
fail:
|
||||
pr_warn("Using fallback SPROM failed (err %d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
* R/W ops.
|
||||
|
@ -124,10 +176,21 @@ static int bcma_sprom_valid(const u16 *sprom)
|
|||
* SPROM extraction.
|
||||
**************************************************/
|
||||
|
||||
#define SPOFF(offset) ((offset) / sizeof(u16))
|
||||
|
||||
#define SPEX(_field, _offset, _mask, _shift) \
|
||||
bus->sprom._field = ((sprom[SPOFF(_offset)] & (_mask)) >> (_shift))
|
||||
|
||||
static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
|
||||
{
|
||||
u16 v;
|
||||
u16 v, o;
|
||||
int i;
|
||||
u16 pwr_info_offset[] = {
|
||||
SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,
|
||||
SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3
|
||||
};
|
||||
BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
|
||||
ARRAY_SIZE(bus->sprom.core_pwr_info));
|
||||
|
||||
bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] &
|
||||
SSB_SPROM_REVISION_REV;
|
||||
|
@ -137,85 +200,229 @@ static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
|
|||
*(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v);
|
||||
}
|
||||
|
||||
bus->sprom.board_rev = sprom[SPOFF(SSB_SPROM8_BOARDREV)];
|
||||
SPEX(board_rev, SSB_SPROM8_BOARDREV, ~0, 0);
|
||||
|
||||
bus->sprom.txpid2g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] &
|
||||
SSB_SPROM4_TXPID2G0) >> SSB_SPROM4_TXPID2G0_SHIFT;
|
||||
bus->sprom.txpid2g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] &
|
||||
SSB_SPROM4_TXPID2G1) >> SSB_SPROM4_TXPID2G1_SHIFT;
|
||||
bus->sprom.txpid2g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] &
|
||||
SSB_SPROM4_TXPID2G2) >> SSB_SPROM4_TXPID2G2_SHIFT;
|
||||
bus->sprom.txpid2g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] &
|
||||
SSB_SPROM4_TXPID2G3) >> SSB_SPROM4_TXPID2G3_SHIFT;
|
||||
SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G0,
|
||||
SSB_SPROM4_TXPID2G0_SHIFT);
|
||||
SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G1,
|
||||
SSB_SPROM4_TXPID2G1_SHIFT);
|
||||
SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G2,
|
||||
SSB_SPROM4_TXPID2G2_SHIFT);
|
||||
SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G3,
|
||||
SSB_SPROM4_TXPID2G3_SHIFT);
|
||||
|
||||
bus->sprom.txpid5gl[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] &
|
||||
SSB_SPROM4_TXPID5GL0) >> SSB_SPROM4_TXPID5GL0_SHIFT;
|
||||
bus->sprom.txpid5gl[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] &
|
||||
SSB_SPROM4_TXPID5GL1) >> SSB_SPROM4_TXPID5GL1_SHIFT;
|
||||
bus->sprom.txpid5gl[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] &
|
||||
SSB_SPROM4_TXPID5GL2) >> SSB_SPROM4_TXPID5GL2_SHIFT;
|
||||
bus->sprom.txpid5gl[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] &
|
||||
SSB_SPROM4_TXPID5GL3) >> SSB_SPROM4_TXPID5GL3_SHIFT;
|
||||
SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL0,
|
||||
SSB_SPROM4_TXPID5GL0_SHIFT);
|
||||
SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL1,
|
||||
SSB_SPROM4_TXPID5GL1_SHIFT);
|
||||
SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL2,
|
||||
SSB_SPROM4_TXPID5GL2_SHIFT);
|
||||
SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL3,
|
||||
SSB_SPROM4_TXPID5GL3_SHIFT);
|
||||
|
||||
bus->sprom.txpid5g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] &
|
||||
SSB_SPROM4_TXPID5G0) >> SSB_SPROM4_TXPID5G0_SHIFT;
|
||||
bus->sprom.txpid5g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] &
|
||||
SSB_SPROM4_TXPID5G1) >> SSB_SPROM4_TXPID5G1_SHIFT;
|
||||
bus->sprom.txpid5g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] &
|
||||
SSB_SPROM4_TXPID5G2) >> SSB_SPROM4_TXPID5G2_SHIFT;
|
||||
bus->sprom.txpid5g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] &
|
||||
SSB_SPROM4_TXPID5G3) >> SSB_SPROM4_TXPID5G3_SHIFT;
|
||||
SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G0,
|
||||
SSB_SPROM4_TXPID5G0_SHIFT);
|
||||
SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G1,
|
||||
SSB_SPROM4_TXPID5G1_SHIFT);
|
||||
SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G2,
|
||||
SSB_SPROM4_TXPID5G2_SHIFT);
|
||||
SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G3,
|
||||
SSB_SPROM4_TXPID5G3_SHIFT);
|
||||
|
||||
bus->sprom.txpid5gh[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] &
|
||||
SSB_SPROM4_TXPID5GH0) >> SSB_SPROM4_TXPID5GH0_SHIFT;
|
||||
bus->sprom.txpid5gh[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] &
|
||||
SSB_SPROM4_TXPID5GH1) >> SSB_SPROM4_TXPID5GH1_SHIFT;
|
||||
bus->sprom.txpid5gh[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] &
|
||||
SSB_SPROM4_TXPID5GH2) >> SSB_SPROM4_TXPID5GH2_SHIFT;
|
||||
bus->sprom.txpid5gh[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] &
|
||||
SSB_SPROM4_TXPID5GH3) >> SSB_SPROM4_TXPID5GH3_SHIFT;
|
||||
SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH0,
|
||||
SSB_SPROM4_TXPID5GH0_SHIFT);
|
||||
SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH1,
|
||||
SSB_SPROM4_TXPID5GH1_SHIFT);
|
||||
SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH2,
|
||||
SSB_SPROM4_TXPID5GH2_SHIFT);
|
||||
SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH3,
|
||||
SSB_SPROM4_TXPID5GH3_SHIFT);
|
||||
|
||||
bus->sprom.boardflags_lo = sprom[SPOFF(SSB_SPROM8_BFLLO)];
|
||||
bus->sprom.boardflags_hi = sprom[SPOFF(SSB_SPROM8_BFLHI)];
|
||||
bus->sprom.boardflags2_lo = sprom[SPOFF(SSB_SPROM8_BFL2LO)];
|
||||
bus->sprom.boardflags2_hi = sprom[SPOFF(SSB_SPROM8_BFL2HI)];
|
||||
SPEX(boardflags_lo, SSB_SPROM8_BFLLO, ~0, 0);
|
||||
SPEX(boardflags_hi, SSB_SPROM8_BFLHI, ~0, 0);
|
||||
SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, ~0, 0);
|
||||
SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, ~0, 0);
|
||||
|
||||
bus->sprom.country_code = sprom[SPOFF(SSB_SPROM8_CCODE)];
|
||||
SPEX(country_code, SSB_SPROM8_CCODE, ~0, 0);
|
||||
|
||||
bus->sprom.fem.ghz2.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
|
||||
SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT;
|
||||
bus->sprom.fem.ghz2.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
|
||||
SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT;
|
||||
bus->sprom.fem.ghz2.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
|
||||
SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT;
|
||||
bus->sprom.fem.ghz2.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
|
||||
SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT;
|
||||
bus->sprom.fem.ghz2.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
|
||||
SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT;
|
||||
/* Extract cores power info info */
|
||||
for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
|
||||
o = pwr_info_offset[i];
|
||||
SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
|
||||
SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT);
|
||||
SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
|
||||
SSB_SPROM8_2G_MAXP, 0);
|
||||
|
||||
bus->sprom.fem.ghz5.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
|
||||
SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT;
|
||||
bus->sprom.fem.ghz5.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
|
||||
SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT;
|
||||
bus->sprom.fem.ghz5.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
|
||||
SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT;
|
||||
bus->sprom.fem.ghz5.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
|
||||
SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT;
|
||||
bus->sprom.fem.ghz5.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
|
||||
SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT;
|
||||
SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0);
|
||||
|
||||
SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
|
||||
SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT);
|
||||
SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
|
||||
SSB_SPROM8_5G_MAXP, 0);
|
||||
SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP,
|
||||
SSB_SPROM8_5GH_MAXP, 0);
|
||||
SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP,
|
||||
SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT);
|
||||
|
||||
SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0);
|
||||
SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0);
|
||||
}
|
||||
|
||||
SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TSSIPOS,
|
||||
SSB_SROM8_FEM_TSSIPOS_SHIFT);
|
||||
SPEX(fem.ghz2.extpa_gain, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_EXTPA_GAIN,
|
||||
SSB_SROM8_FEM_EXTPA_GAIN_SHIFT);
|
||||
SPEX(fem.ghz2.pdet_range, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_PDET_RANGE,
|
||||
SSB_SROM8_FEM_PDET_RANGE_SHIFT);
|
||||
SPEX(fem.ghz2.tr_iso, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TR_ISO,
|
||||
SSB_SROM8_FEM_TR_ISO_SHIFT);
|
||||
SPEX(fem.ghz2.antswlut, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_ANTSWLUT,
|
||||
SSB_SROM8_FEM_ANTSWLUT_SHIFT);
|
||||
|
||||
SPEX(fem.ghz5.tssipos, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TSSIPOS,
|
||||
SSB_SROM8_FEM_TSSIPOS_SHIFT);
|
||||
SPEX(fem.ghz5.extpa_gain, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_EXTPA_GAIN,
|
||||
SSB_SROM8_FEM_EXTPA_GAIN_SHIFT);
|
||||
SPEX(fem.ghz5.pdet_range, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_PDET_RANGE,
|
||||
SSB_SROM8_FEM_PDET_RANGE_SHIFT);
|
||||
SPEX(fem.ghz5.tr_iso, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TR_ISO,
|
||||
SSB_SROM8_FEM_TR_ISO_SHIFT);
|
||||
SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_ANTSWLUT,
|
||||
SSB_SROM8_FEM_ANTSWLUT_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Indicates the presence of external SPROM.
|
||||
*/
|
||||
static bool bcma_sprom_ext_available(struct bcma_bus *bus)
|
||||
{
|
||||
u32 chip_status;
|
||||
u32 srom_control;
|
||||
u32 present_mask;
|
||||
|
||||
if (bus->drv_cc.core->id.rev >= 31) {
|
||||
if (!(bus->drv_cc.capabilities & BCMA_CC_CAP_SPROM))
|
||||
return false;
|
||||
|
||||
srom_control = bcma_read32(bus->drv_cc.core,
|
||||
BCMA_CC_SROM_CONTROL);
|
||||
return srom_control & BCMA_CC_SROM_CONTROL_PRESENT;
|
||||
}
|
||||
|
||||
/* older chipcommon revisions use chip status register */
|
||||
chip_status = bcma_read32(bus->drv_cc.core, BCMA_CC_CHIPSTAT);
|
||||
switch (bus->chipinfo.id) {
|
||||
case 0x4313:
|
||||
present_mask = BCMA_CC_CHIPST_4313_SPROM_PRESENT;
|
||||
break;
|
||||
|
||||
case 0x4331:
|
||||
present_mask = BCMA_CC_CHIPST_4331_SPROM_PRESENT;
|
||||
break;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
||||
return chip_status & present_mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Indicates that on-chip OTP memory is present and enabled.
|
||||
*/
|
||||
static bool bcma_sprom_onchip_available(struct bcma_bus *bus)
|
||||
{
|
||||
u32 chip_status;
|
||||
u32 otpsize = 0;
|
||||
bool present;
|
||||
|
||||
chip_status = bcma_read32(bus->drv_cc.core, BCMA_CC_CHIPSTAT);
|
||||
switch (bus->chipinfo.id) {
|
||||
case 0x4313:
|
||||
present = chip_status & BCMA_CC_CHIPST_4313_OTP_PRESENT;
|
||||
break;
|
||||
|
||||
case 0x4331:
|
||||
present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT;
|
||||
break;
|
||||
|
||||
case 43224:
|
||||
case 43225:
|
||||
/* for these chips OTP is always available */
|
||||
present = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
present = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (present) {
|
||||
otpsize = bus->drv_cc.capabilities & BCMA_CC_CAP_OTPS;
|
||||
otpsize >>= BCMA_CC_CAP_OTPS_SHIFT;
|
||||
}
|
||||
|
||||
return otpsize != 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify OTP is filled and determine the byte
|
||||
* offset where SPROM data is located.
|
||||
*
|
||||
* On error, returns 0; byte offset otherwise.
|
||||
*/
|
||||
static int bcma_sprom_onchip_offset(struct bcma_bus *bus)
|
||||
{
|
||||
struct bcma_device *cc = bus->drv_cc.core;
|
||||
u32 offset;
|
||||
|
||||
/* verify OTP status */
|
||||
if ((bcma_read32(cc, BCMA_CC_OTPS) & BCMA_CC_OTPS_GU_PROG_HW) == 0)
|
||||
return 0;
|
||||
|
||||
/* obtain bit offset from otplayout register */
|
||||
offset = (bcma_read32(cc, BCMA_CC_OTPL) & BCMA_CC_OTPL_GURGN_OFFSET);
|
||||
return BCMA_CC_SPROM + (offset >> 3);
|
||||
}
|
||||
|
||||
int bcma_sprom_get(struct bcma_bus *bus)
|
||||
{
|
||||
u16 offset;
|
||||
u16 offset = BCMA_CC_SPROM;
|
||||
u16 *sprom;
|
||||
int err = 0;
|
||||
|
||||
if (!bus->drv_cc.core)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!(bus->drv_cc.capabilities & BCMA_CC_CAP_SPROM))
|
||||
return -ENOENT;
|
||||
if (!bcma_sprom_ext_available(bus)) {
|
||||
/*
|
||||
* External SPROM takes precedence so check
|
||||
* on-chip OTP only when no external SPROM
|
||||
* is present.
|
||||
*/
|
||||
if (bcma_sprom_onchip_available(bus)) {
|
||||
/* determine offset */
|
||||
offset = bcma_sprom_onchip_offset(bus);
|
||||
}
|
||||
if (!offset) {
|
||||
/*
|
||||
* Maybe there is no SPROM on the device?
|
||||
* Now we ask the arch code if there is some sprom
|
||||
* available for this device in some other storage.
|
||||
*/
|
||||
err = bcma_fill_sprom_with_fallback(bus, &bus->sprom);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
|
@ -225,11 +432,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
|
|||
if (bus->chipinfo.id == 0x4331)
|
||||
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
|
||||
|
||||
/* Most cards have SPROM moved by additional offset 0x30 (48 dwords).
|
||||
* According to brcm80211 this applies to cards with PCIe rev >= 6
|
||||
* TODO: understand this condition and use it */
|
||||
offset = (bus->chipinfo.id == 0x4331) ? BCMA_CC_SPROM :
|
||||
BCMA_CC_SPROM_PCIE6;
|
||||
pr_debug("SPROM offset 0x%x\n", offset);
|
||||
bcma_sprom_read(bus, offset, sprom);
|
||||
|
||||
if (bus->chipinfo.id == 0x4331)
|
||||
|
|
|
@ -65,12 +65,14 @@ static struct usb_device_id ath3k_table[] = {
|
|||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||
{ USB_DEVICE(0x13d3, 0x3304) },
|
||||
{ USB_DEVICE(0x0930, 0x0215) },
|
||||
{ USB_DEVICE(0x0489, 0xE03D) },
|
||||
|
||||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03F0, 0x311D) },
|
||||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3004) },
|
||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
|
@ -87,6 +89,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
|
|
@ -411,7 +411,7 @@ unlock:
|
|||
|
||||
static int bfusb_open(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
struct bfusb_data *data = hci_get_drvdata(hdev);
|
||||
unsigned long flags;
|
||||
int i, err;
|
||||
|
||||
|
@ -437,7 +437,7 @@ static int bfusb_open(struct hci_dev *hdev)
|
|||
|
||||
static int bfusb_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
struct bfusb_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
|
@ -448,7 +448,7 @@ static int bfusb_flush(struct hci_dev *hdev)
|
|||
|
||||
static int bfusb_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
struct bfusb_data *data = hci_get_drvdata(hdev);
|
||||
unsigned long flags;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
@ -483,7 +483,7 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
|||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
data = hdev->driver_data;
|
||||
data = hci_get_drvdata(hdev);
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
|
@ -544,15 +544,6 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bfusb_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -705,18 +696,15 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
data->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
hci_set_drvdata(hdev, data);
|
||||
SET_HCIDEV_DEV(hdev, &intf->dev);
|
||||
|
||||
hdev->open = bfusb_open;
|
||||
hdev->close = bfusb_close;
|
||||
hdev->flush = bfusb_flush;
|
||||
hdev->send = bfusb_send_frame;
|
||||
hdev->destruct = bfusb_destruct;
|
||||
hdev->ioctl = bfusb_ioctl;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
hci_free_dev(hdev);
|
||||
|
@ -753,6 +741,7 @@ static void bfusb_disconnect(struct usb_interface *intf)
|
|||
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static struct usb_driver bfusb_driver = {
|
||||
|
|
|
@ -561,7 +561,7 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
|
|||
|
||||
static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
bluecard_info_t *info = hci_get_drvdata(hdev);
|
||||
struct sk_buff *skb;
|
||||
|
||||
/* Ericsson baud rate command */
|
||||
|
@ -609,7 +609,7 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
|
|||
|
||||
static int bluecard_hci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
bluecard_info_t *info = hci_get_drvdata(hdev);
|
||||
|
||||
/* Drop TX queue */
|
||||
skb_queue_purge(&(info->txq));
|
||||
|
@ -620,7 +620,7 @@ static int bluecard_hci_flush(struct hci_dev *hdev)
|
|||
|
||||
static int bluecard_hci_open(struct hci_dev *hdev)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
bluecard_info_t *info = hci_get_drvdata(hdev);
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
|
||||
|
@ -640,7 +640,7 @@ static int bluecard_hci_open(struct hci_dev *hdev)
|
|||
|
||||
static int bluecard_hci_close(struct hci_dev *hdev)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
bluecard_info_t *info = hci_get_drvdata(hdev);
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
|
||||
|
@ -667,7 +667,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = (bluecard_info_t *)(hdev->driver_data);
|
||||
info = hci_get_drvdata(hdev);
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
|
@ -691,11 +691,6 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
|
||||
static void bluecard_hci_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static int bluecard_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -734,18 +729,15 @@ static int bluecard_open(bluecard_info_t *info)
|
|||
info->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
hci_set_drvdata(hdev, info);
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = bluecard_hci_open;
|
||||
hdev->close = bluecard_hci_close;
|
||||
hdev->flush = bluecard_hci_flush;
|
||||
hdev->send = bluecard_hci_send_frame;
|
||||
hdev->destruct = bluecard_hci_destruct;
|
||||
hdev->ioctl = bluecard_hci_ioctl;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
id = inb(iobase + 0x30);
|
||||
|
||||
if ((id & 0x0f) == 0x02)
|
||||
|
|
|
@ -66,7 +66,7 @@ struct hci_vendor_hdr {
|
|||
|
||||
static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s queue %d buffer %p count %d", hdev->name,
|
||||
queue, buf, count);
|
||||
|
@ -189,7 +189,7 @@ done:
|
|||
static void bpa10x_rx_complete(struct urb *urb)
|
||||
{
|
||||
struct hci_dev *hdev = urb->context;
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s urb %p status %d count %d", hdev->name,
|
||||
|
@ -219,7 +219,7 @@ static void bpa10x_rx_complete(struct urb *urb)
|
|||
|
||||
static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
struct urb *urb;
|
||||
unsigned char *buf;
|
||||
unsigned int pipe;
|
||||
|
@ -260,7 +260,7 @@ static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)
|
|||
|
||||
static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
struct urb *urb;
|
||||
unsigned char *buf;
|
||||
unsigned int pipe;
|
||||
|
@ -301,7 +301,7 @@ static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)
|
|||
|
||||
static int bpa10x_open(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
@ -329,7 +329,7 @@ error:
|
|||
|
||||
static int bpa10x_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -343,7 +343,7 @@ static int bpa10x_close(struct hci_dev *hdev)
|
|||
|
||||
static int bpa10x_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -355,7 +355,7 @@ static int bpa10x_flush(struct hci_dev *hdev)
|
|||
static int bpa10x_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
struct bpa10x_data *data = hci_get_drvdata(hdev);
|
||||
struct usb_ctrlrequest *dr;
|
||||
struct urb *urb;
|
||||
unsigned int pipe;
|
||||
|
@ -432,17 +432,6 @@ static int bpa10x_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bpa10x_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct bpa10x_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
kfree_skb(data->rx_skb[0]);
|
||||
kfree_skb(data->rx_skb[1]);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct bpa10x_data *data;
|
||||
|
@ -470,7 +459,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
|
|||
}
|
||||
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
|
@ -480,9 +469,6 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
|
|||
hdev->close = bpa10x_close;
|
||||
hdev->flush = bpa10x_flush;
|
||||
hdev->send = bpa10x_send_frame;
|
||||
hdev->destruct = bpa10x_destruct;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
|
@ -512,6 +498,9 @@ static void bpa10x_disconnect(struct usb_interface *intf)
|
|||
hci_unregister_dev(data->hdev);
|
||||
|
||||
hci_free_dev(data->hdev);
|
||||
kfree_skb(data->rx_skb[0]);
|
||||
kfree_skb(data->rx_skb[1]);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static struct usb_driver bpa10x_driver = {
|
||||
|
|
|
@ -389,7 +389,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
|
|||
|
||||
static int bt3c_hci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
bt3c_info_t *info = (bt3c_info_t *)(hdev->driver_data);
|
||||
bt3c_info_t *info = hci_get_drvdata(hdev);
|
||||
|
||||
/* Drop TX queue */
|
||||
skb_queue_purge(&(info->txq));
|
||||
|
@ -428,7 +428,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = (bt3c_info_t *) (hdev->driver_data);
|
||||
info = hci_get_drvdata(hdev);
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
|
@ -456,11 +456,6 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
|
||||
static void bt3c_hci_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -580,18 +575,15 @@ static int bt3c_open(bt3c_info_t *info)
|
|||
info->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
hci_set_drvdata(hdev, info);
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = bt3c_hci_open;
|
||||
hdev->close = bt3c_hci_close;
|
||||
hdev->flush = bt3c_hci_flush;
|
||||
hdev->send = bt3c_hci_send_frame;
|
||||
hdev->destruct = bt3c_hci_destruct;
|
||||
hdev->ioctl = bt3c_hci_ioctl;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
/* Load firmware */
|
||||
err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
|
||||
if (err < 0) {
|
||||
|
|
|
@ -384,7 +384,7 @@ static const struct file_operations btmrvl_txdnldready_fops = {
|
|||
|
||||
void btmrvl_debugfs_init(struct hci_dev *hdev)
|
||||
{
|
||||
struct btmrvl_private *priv = hdev->driver_data;
|
||||
struct btmrvl_private *priv = hci_get_drvdata(hdev);
|
||||
struct btmrvl_debugfs_data *dbg;
|
||||
|
||||
if (!hdev->debugfs)
|
||||
|
@ -401,36 +401,34 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
|
|||
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);
|
||||
priv, &btmrvl_psmode_fops);
|
||||
dbg->pscmd = debugfs_create_file("pscmd", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_pscmd_fops);
|
||||
priv, &btmrvl_pscmd_fops);
|
||||
dbg->gpiogap = debugfs_create_file("gpiogap", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_gpiogap_fops);
|
||||
priv, &btmrvl_gpiogap_fops);
|
||||
dbg->hsmode = debugfs_create_file("hsmode", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_hsmode_fops);
|
||||
priv, &btmrvl_hsmode_fops);
|
||||
dbg->hscmd = debugfs_create_file("hscmd", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_hscmd_fops);
|
||||
priv, &btmrvl_hscmd_fops);
|
||||
dbg->hscfgcmd = debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
|
||||
hdev->driver_data, &btmrvl_hscfgcmd_fops);
|
||||
priv, &btmrvl_hscfgcmd_fops);
|
||||
|
||||
dbg->status_dir = debugfs_create_dir("status", hdev->debugfs);
|
||||
dbg->curpsmode = debugfs_create_file("curpsmode", 0444,
|
||||
dbg->status_dir,
|
||||
hdev->driver_data,
|
||||
&btmrvl_curpsmode_fops);
|
||||
dbg->status_dir, priv,
|
||||
&btmrvl_curpsmode_fops);
|
||||
dbg->psstate = debugfs_create_file("psstate", 0444, dbg->status_dir,
|
||||
hdev->driver_data, &btmrvl_psstate_fops);
|
||||
priv, &btmrvl_psstate_fops);
|
||||
dbg->hsstate = debugfs_create_file("hsstate", 0444, dbg->status_dir,
|
||||
hdev->driver_data, &btmrvl_hsstate_fops);
|
||||
priv, &btmrvl_hsstate_fops);
|
||||
dbg->txdnldready = debugfs_create_file("txdnldready", 0444,
|
||||
dbg->status_dir,
|
||||
hdev->driver_data,
|
||||
&btmrvl_txdnldready_fops);
|
||||
dbg->status_dir, priv,
|
||||
&btmrvl_txdnldready_fops);
|
||||
}
|
||||
|
||||
void btmrvl_debugfs_remove(struct hci_dev *hdev)
|
||||
{
|
||||
struct btmrvl_private *priv = hdev->driver_data;
|
||||
struct btmrvl_private *priv = hci_get_drvdata(hdev);
|
||||
struct btmrvl_debugfs_data *dbg = priv->debugfs_data;
|
||||
|
||||
if (!dbg)
|
||||
|
|
|
@ -387,10 +387,6 @@ static int btmrvl_ioctl(struct hci_dev *hdev,
|
|||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static void btmrvl_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
}
|
||||
|
||||
static int btmrvl_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
|
@ -398,12 +394,13 @@ static int btmrvl_send_frame(struct sk_buff *skb)
|
|||
|
||||
BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len);
|
||||
|
||||
if (!hdev || !hdev->driver_data) {
|
||||
if (!hdev) {
|
||||
BT_ERR("Frame for unknown HCI device");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
priv = (struct btmrvl_private *) hdev->driver_data;
|
||||
priv = hci_get_drvdata(hdev);
|
||||
|
||||
if (!test_bit(HCI_RUNNING, &hdev->flags)) {
|
||||
BT_ERR("Failed testing HCI_RUNING, flags=%lx", hdev->flags);
|
||||
print_hex_dump_bytes("data: ", DUMP_PREFIX_OFFSET,
|
||||
|
@ -434,7 +431,7 @@ static int btmrvl_send_frame(struct sk_buff *skb)
|
|||
|
||||
static int btmrvl_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct btmrvl_private *priv = hdev->driver_data;
|
||||
struct btmrvl_private *priv = hci_get_drvdata(hdev);
|
||||
|
||||
skb_queue_purge(&priv->adapter->tx_queue);
|
||||
|
||||
|
@ -443,7 +440,7 @@ static int btmrvl_flush(struct hci_dev *hdev)
|
|||
|
||||
static int btmrvl_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct btmrvl_private *priv = hdev->driver_data;
|
||||
struct btmrvl_private *priv = hci_get_drvdata(hdev);
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
@ -546,16 +543,14 @@ int btmrvl_register_hdev(struct btmrvl_private *priv)
|
|||
}
|
||||
|
||||
priv->btmrvl_dev.hcidev = hdev;
|
||||
hdev->driver_data = priv;
|
||||
hci_set_drvdata(hdev, priv);
|
||||
|
||||
hdev->bus = HCI_SDIO;
|
||||
hdev->open = btmrvl_open;
|
||||
hdev->close = btmrvl_close;
|
||||
hdev->flush = btmrvl_flush;
|
||||
hdev->send = btmrvl_send_frame;
|
||||
hdev->destruct = btmrvl_destruct;
|
||||
hdev->ioctl = btmrvl_ioctl;
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
|
||||
|
||||
|
|
|
@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func)
|
|||
|
||||
static int btsdio_open(struct hci_dev *hdev)
|
||||
{
|
||||
struct btsdio_data *data = hdev->driver_data;
|
||||
struct btsdio_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
@ -225,7 +225,7 @@ release:
|
|||
|
||||
static int btsdio_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct btsdio_data *data = hdev->driver_data;
|
||||
struct btsdio_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -246,7 +246,7 @@ static int btsdio_close(struct hci_dev *hdev)
|
|||
|
||||
static int btsdio_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct btsdio_data *data = hdev->driver_data;
|
||||
struct btsdio_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -258,7 +258,7 @@ static int btsdio_flush(struct hci_dev *hdev)
|
|||
static int btsdio_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
struct btsdio_data *data = hdev->driver_data;
|
||||
struct btsdio_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -289,15 +289,6 @@ static int btsdio_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void btsdio_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct btsdio_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static int btsdio_probe(struct sdio_func *func,
|
||||
const struct sdio_device_id *id)
|
||||
{
|
||||
|
@ -330,7 +321,7 @@ static int btsdio_probe(struct sdio_func *func,
|
|||
}
|
||||
|
||||
hdev->bus = HCI_SDIO;
|
||||
hdev->driver_data = data;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
||||
if (id->class == SDIO_CLASS_BT_AMP)
|
||||
hdev->dev_type = HCI_AMP;
|
||||
|
@ -345,9 +336,6 @@ static int btsdio_probe(struct sdio_func *func,
|
|||
hdev->close = btsdio_close;
|
||||
hdev->flush = btsdio_flush;
|
||||
hdev->send = btsdio_send_frame;
|
||||
hdev->destruct = btsdio_destruct;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0) {
|
||||
|
@ -378,6 +366,7 @@ static void btsdio_remove(struct sdio_func *func)
|
|||
hci_unregister_dev(hdev);
|
||||
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static struct sdio_driver btsdio_driver = {
|
||||
|
|
|
@ -397,7 +397,7 @@ static void btuart_change_speed(btuart_info_t *info, unsigned int speed)
|
|||
|
||||
static int btuart_hci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
btuart_info_t *info = (btuart_info_t *)(hdev->driver_data);
|
||||
btuart_info_t *info = hci_get_drvdata(hdev);
|
||||
|
||||
/* Drop TX queue */
|
||||
skb_queue_purge(&(info->txq));
|
||||
|
@ -435,7 +435,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = (btuart_info_t *)(hdev->driver_data);
|
||||
info = hci_get_drvdata(hdev);
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
|
@ -459,11 +459,6 @@ static int btuart_hci_send_frame(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
|
||||
static void btuart_hci_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static int btuart_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -498,18 +493,15 @@ static int btuart_open(btuart_info_t *info)
|
|||
info->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
hci_set_drvdata(hdev, info);
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = btuart_hci_open;
|
||||
hdev->close = btuart_hci_close;
|
||||
hdev->flush = btuart_hci_flush;
|
||||
hdev->send = btuart_hci_send_frame;
|
||||
hdev->destruct = btuart_hci_destruct;
|
||||
hdev->ioctl = btuart_hci_ioctl;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
spin_lock_irqsave(&(info->lock), flags);
|
||||
|
||||
/* Reset UART */
|
||||
|
|
|
@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = {
|
|||
|
||||
/* Broadcom BCM20702A0 */
|
||||
{ USB_DEVICE(0x0a5c, 0x21e3) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e6) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21f3) },
|
||||
{ USB_DEVICE(0x413c, 0x8197) },
|
||||
|
||||
|
@ -121,12 +122,14 @@ static struct usb_device_id blacklist_table[] = {
|
|||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros 3012 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
@ -243,7 +246,7 @@ static int inc_tx(struct btusb_data *data)
|
|||
static void btusb_intr_complete(struct urb *urb)
|
||||
{
|
||||
struct hci_dev *hdev = urb->context;
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s urb %p status %d count %d", hdev->name,
|
||||
|
@ -282,7 +285,7 @@ static void btusb_intr_complete(struct urb *urb)
|
|||
|
||||
static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
struct urb *urb;
|
||||
unsigned char *buf;
|
||||
unsigned int pipe;
|
||||
|
@ -331,7 +334,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
|||
static void btusb_bulk_complete(struct urb *urb)
|
||||
{
|
||||
struct hci_dev *hdev = urb->context;
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s urb %p status %d count %d", hdev->name,
|
||||
|
@ -370,7 +373,7 @@ static void btusb_bulk_complete(struct urb *urb)
|
|||
|
||||
static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
struct urb *urb;
|
||||
unsigned char *buf;
|
||||
unsigned int pipe;
|
||||
|
@ -417,7 +420,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
|||
static void btusb_isoc_complete(struct urb *urb)
|
||||
{
|
||||
struct hci_dev *hdev = urb->context;
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
int i, err;
|
||||
|
||||
BT_DBG("%s urb %p status %d count %d", hdev->name,
|
||||
|
@ -484,7 +487,7 @@ static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
|
|||
|
||||
static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
struct urb *urb;
|
||||
unsigned char *buf;
|
||||
unsigned int pipe;
|
||||
|
@ -537,7 +540,7 @@ static void btusb_tx_complete(struct urb *urb)
|
|||
{
|
||||
struct sk_buff *skb = urb->context;
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s urb %p status %d count %d", hdev->name,
|
||||
urb, urb->status, urb->actual_length);
|
||||
|
@ -584,7 +587,7 @@ done:
|
|||
|
||||
static int btusb_open(struct hci_dev *hdev)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
@ -634,7 +637,7 @@ static void btusb_stop_traffic(struct btusb_data *data)
|
|||
|
||||
static int btusb_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
int err;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
@ -664,7 +667,7 @@ failed:
|
|||
|
||||
static int btusb_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
|
@ -676,7 +679,7 @@ static int btusb_flush(struct hci_dev *hdev)
|
|||
static int btusb_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
struct usb_ctrlrequest *dr;
|
||||
struct urb *urb;
|
||||
unsigned int pipe;
|
||||
|
@ -784,18 +787,9 @@ done:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void btusb_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s evt %d", hdev->name, evt);
|
||||
|
||||
|
@ -807,7 +801,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
|
|||
|
||||
static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||
struct usb_interface *intf = data->isoc;
|
||||
struct usb_endpoint_descriptor *ep_desc;
|
||||
int i, err;
|
||||
|
@ -995,7 +989,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
}
|
||||
|
||||
hdev->bus = HCI_USB;
|
||||
hdev->driver_data = data;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
|
@ -1005,11 +999,8 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
hdev->close = btusb_close;
|
||||
hdev->flush = btusb_flush;
|
||||
hdev->send = btusb_send_frame;
|
||||
hdev->destruct = btusb_destruct;
|
||||
hdev->notify = btusb_notify;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
/* Interface numbers are hardcoded in the specification */
|
||||
data->isoc = usb_ifnum_to_if(data->udev, 1);
|
||||
|
||||
|
@ -1091,9 +1082,6 @@ static void btusb_disconnect(struct usb_interface *intf)
|
|||
return;
|
||||
|
||||
hdev = data->hdev;
|
||||
|
||||
__hci_dev_hold(hdev);
|
||||
|
||||
usb_set_intfdata(data->intf, NULL);
|
||||
|
||||
if (data->isoc)
|
||||
|
@ -1106,9 +1094,8 @@ static void btusb_disconnect(struct usb_interface *intf)
|
|||
else if (data->isoc)
|
||||
usb_driver_release_interface(&btusb_driver, data->isoc);
|
||||
|
||||
__hci_dev_put(hdev);
|
||||
|
||||
hci_free_dev(hdev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
@ -161,7 +161,7 @@ static int ti_st_open(struct hci_dev *hdev)
|
|||
return -EBUSY;
|
||||
|
||||
/* provide contexts for callbacks from ST */
|
||||
hst = hdev->driver_data;
|
||||
hst = hci_get_drvdata(hdev);
|
||||
|
||||
for (i = 0; i < MAX_BT_CHNL_IDS; i++) {
|
||||
ti_st_proto[i].priv_data = hst;
|
||||
|
@ -236,7 +236,7 @@ done:
|
|||
static int ti_st_close(struct hci_dev *hdev)
|
||||
{
|
||||
int err, i;
|
||||
struct ti_st *hst = hdev->driver_data;
|
||||
struct ti_st *hst = hci_get_drvdata(hdev);
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
@ -264,7 +264,7 @@ static int ti_st_send_frame(struct sk_buff *skb)
|
|||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
hst = hdev->driver_data;
|
||||
hst = hci_get_drvdata(hdev);
|
||||
|
||||
/* Prepend skb with frame type */
|
||||
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
|
||||
|
@ -291,14 +291,6 @@ static int ti_st_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ti_st_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
BT_DBG("%s", hdev->name);
|
||||
/* do nothing here, since platform remove
|
||||
* would free the hdev->driver_data
|
||||
*/
|
||||
}
|
||||
|
||||
static int bt_ti_probe(struct platform_device *pdev)
|
||||
{
|
||||
static struct ti_st *hst;
|
||||
|
@ -320,13 +312,11 @@ static int bt_ti_probe(struct platform_device *pdev)
|
|||
|
||||
hst->hdev = hdev;
|
||||
hdev->bus = HCI_UART;
|
||||
hdev->driver_data = hst;
|
||||
hci_set_drvdata(hdev, hst);
|
||||
hdev->open = ti_st_open;
|
||||
hdev->close = ti_st_close;
|
||||
hdev->flush = NULL;
|
||||
hdev->send = ti_st_send_frame;
|
||||
hdev->destruct = ti_st_destruct;
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0) {
|
||||
|
|
|
@ -83,9 +83,6 @@ typedef struct dtl1_info_t {
|
|||
|
||||
|
||||
static int dtl1_config(struct pcmcia_device *link);
|
||||
static void dtl1_release(struct pcmcia_device *link);
|
||||
|
||||
static void dtl1_detach(struct pcmcia_device *p_dev);
|
||||
|
||||
|
||||
/* Transmit states */
|
||||
|
@ -367,7 +364,7 @@ static int dtl1_hci_open(struct hci_dev *hdev)
|
|||
|
||||
static int dtl1_hci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
dtl1_info_t *info = (dtl1_info_t *)(hdev->driver_data);
|
||||
dtl1_info_t *info = hci_get_drvdata(hdev);
|
||||
|
||||
/* Drop TX queue */
|
||||
skb_queue_purge(&(info->txq));
|
||||
|
@ -399,7 +396,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = (dtl1_info_t *)(hdev->driver_data);
|
||||
info = hci_get_drvdata(hdev);
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
|
@ -442,11 +439,6 @@ static int dtl1_hci_send_frame(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
|
||||
static void dtl1_hci_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -483,18 +475,15 @@ static int dtl1_open(dtl1_info_t *info)
|
|||
info->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
hci_set_drvdata(hdev, info);
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = dtl1_hci_open;
|
||||
hdev->close = dtl1_hci_close;
|
||||
hdev->flush = dtl1_hci_flush;
|
||||
hdev->send = dtl1_hci_send_frame;
|
||||
hdev->destruct = dtl1_hci_destruct;
|
||||
hdev->ioctl = dtl1_hci_ioctl;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
spin_lock_irqsave(&(info->lock), flags);
|
||||
|
||||
/* Reset UART */
|
||||
|
@ -579,8 +568,8 @@ static void dtl1_detach(struct pcmcia_device *link)
|
|||
{
|
||||
dtl1_info_t *info = link->priv;
|
||||
|
||||
dtl1_release(link);
|
||||
|
||||
dtl1_close(info);
|
||||
pcmcia_disable_device(link);
|
||||
kfree(info);
|
||||
}
|
||||
|
||||
|
@ -619,21 +608,10 @@ static int dtl1_config(struct pcmcia_device *link)
|
|||
return 0;
|
||||
|
||||
failed:
|
||||
dtl1_release(link);
|
||||
dtl1_detach(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
static void dtl1_release(struct pcmcia_device *link)
|
||||
{
|
||||
dtl1_info_t *info = link->priv;
|
||||
|
||||
dtl1_close(info);
|
||||
|
||||
pcmcia_disable_device(link);
|
||||
}
|
||||
|
||||
|
||||
static const struct pcmcia_device_id dtl1_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-1", 0xe1bfdd64, 0xe168480d),
|
||||
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-4", 0xe1bfdd64, 0x9102bc82),
|
||||
|
|
|
@ -112,7 +112,7 @@ static int ath_open(struct hci_uart *hu)
|
|||
|
||||
BT_DBG("hu %p", hu);
|
||||
|
||||
ath = kzalloc(sizeof(*ath), GFP_ATOMIC);
|
||||
ath = kzalloc(sizeof(*ath), GFP_KERNEL);
|
||||
if (!ath)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -692,7 +692,7 @@ static int bcsp_open(struct hci_uart *hu)
|
|||
|
||||
BT_DBG("hu %p", hu);
|
||||
|
||||
bcsp = kzalloc(sizeof(*bcsp), GFP_ATOMIC);
|
||||
bcsp = kzalloc(sizeof(*bcsp), GFP_KERNEL);
|
||||
if (!bcsp)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ static int h4_open(struct hci_uart *hu)
|
|||
|
||||
BT_DBG("hu %p", hu);
|
||||
|
||||
h4 = kzalloc(sizeof(*h4), GFP_ATOMIC);
|
||||
h4 = kzalloc(sizeof(*h4), GFP_KERNEL);
|
||||
if (!h4)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -48,8 +48,6 @@
|
|||
|
||||
#define VERSION "2.2"
|
||||
|
||||
static bool reset = 0;
|
||||
|
||||
static struct hci_uart_proto *hup[HCI_UART_MAX_PROTO];
|
||||
|
||||
int hci_uart_register_proto(struct hci_uart_proto *p)
|
||||
|
@ -174,7 +172,7 @@ static int hci_uart_open(struct hci_dev *hdev)
|
|||
/* Reset device */
|
||||
static int hci_uart_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct hci_uart *hu = (struct hci_uart *) hdev->driver_data;
|
||||
struct hci_uart *hu = hci_get_drvdata(hdev);
|
||||
struct tty_struct *tty = hu->tty;
|
||||
|
||||
BT_DBG("hdev %p tty %p", hdev, tty);
|
||||
|
@ -220,7 +218,7 @@ static int hci_uart_send_frame(struct sk_buff *skb)
|
|||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
hu = (struct hci_uart *) hdev->driver_data;
|
||||
hu = hci_get_drvdata(hdev);
|
||||
|
||||
BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
|
||||
|
||||
|
@ -231,15 +229,6 @@ static int hci_uart_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hci_uart_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
if (!hdev)
|
||||
return;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
kfree(hdev->driver_data);
|
||||
}
|
||||
|
||||
/* ------ LDISC part ------ */
|
||||
/* hci_uart_tty_open
|
||||
*
|
||||
|
@ -316,6 +305,8 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
|||
hci_free_dev(hdev);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(hu);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -391,23 +382,25 @@ static int hci_uart_register_dev(struct hci_uart *hu)
|
|||
hu->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_UART;
|
||||
hdev->driver_data = hu;
|
||||
hci_set_drvdata(hdev, hu);
|
||||
|
||||
hdev->open = hci_uart_open;
|
||||
hdev->close = hci_uart_close;
|
||||
hdev->flush = hci_uart_flush;
|
||||
hdev->send = hci_uart_send_frame;
|
||||
hdev->destruct = hci_uart_destruct;
|
||||
hdev->parent = hu->tty->dev;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
if (!reset)
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
|
||||
if (!test_bit(HCI_UART_RESET_ON_INIT, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
if (test_bit(HCI_UART_CREATE_AMP, &hu->hdev_flags))
|
||||
hdev->dev_type = HCI_AMP;
|
||||
else
|
||||
hdev->dev_type = HCI_BREDR;
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
hci_free_dev(hdev);
|
||||
|
@ -594,9 +587,6 @@ static void __exit hci_uart_exit(void)
|
|||
module_init(hci_uart_init);
|
||||
module_exit(hci_uart_exit);
|
||||
|
||||
module_param(reset, bool, 0644);
|
||||
MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
|
||||
|
||||
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
|
||||
MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
|
||||
MODULE_VERSION(VERSION);
|
||||
|
|
|
@ -125,7 +125,7 @@ static int ll_open(struct hci_uart *hu)
|
|||
|
||||
BT_DBG("hu %p", hu);
|
||||
|
||||
ll = kzalloc(sizeof(*ll), GFP_ATOMIC);
|
||||
ll = kzalloc(sizeof(*ll), GFP_KERNEL);
|
||||
if (!ll)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
#define HCI_UART_ATH3K 5
|
||||
|
||||
#define HCI_UART_RAW_DEVICE 0
|
||||
#define HCI_UART_RESET_ON_INIT 1
|
||||
#define HCI_UART_CREATE_AMP 2
|
||||
|
||||
struct hci_uart;
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ static int vhci_open_dev(struct hci_dev *hdev)
|
|||
|
||||
static int vhci_close_dev(struct hci_dev *hdev)
|
||||
{
|
||||
struct vhci_data *data = hdev->driver_data;
|
||||
struct vhci_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
@ -73,7 +73,7 @@ static int vhci_close_dev(struct hci_dev *hdev)
|
|||
|
||||
static int vhci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct vhci_data *data = hdev->driver_data;
|
||||
struct vhci_data *data = hci_get_drvdata(hdev);
|
||||
|
||||
skb_queue_purge(&data->readq);
|
||||
|
||||
|
@ -93,7 +93,7 @@ static int vhci_send_frame(struct sk_buff *skb)
|
|||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
data = hdev->driver_data;
|
||||
data = hci_get_drvdata(hdev);
|
||||
|
||||
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
|
||||
skb_queue_tail(&data->readq, skb);
|
||||
|
@ -103,11 +103,6 @@ static int vhci_send_frame(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vhci_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
kfree(hdev->driver_data);
|
||||
}
|
||||
|
||||
static inline ssize_t vhci_get_user(struct vhci_data *data,
|
||||
const char __user *buf, size_t count)
|
||||
{
|
||||
|
@ -239,7 +234,7 @@ static int vhci_open(struct inode *inode, struct file *file)
|
|||
data->hdev = hdev;
|
||||
|
||||
hdev->bus = HCI_VIRTUAL;
|
||||
hdev->driver_data = data;
|
||||
hci_set_drvdata(hdev, data);
|
||||
|
||||
if (amp)
|
||||
hdev->dev_type = HCI_AMP;
|
||||
|
@ -248,9 +243,6 @@ static int vhci_open(struct inode *inode, struct file *file)
|
|||
hdev->close = vhci_close_dev;
|
||||
hdev->flush = vhci_flush;
|
||||
hdev->send = vhci_send_frame;
|
||||
hdev->destruct = vhci_destruct;
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
|
@ -273,6 +265,7 @@ static int vhci_release(struct inode *inode, struct file *file)
|
|||
hci_free_dev(hdev);
|
||||
|
||||
file->private_data = NULL;
|
||||
kfree(data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -178,22 +178,26 @@ static void queue_req(struct addr_req *req)
|
|||
mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *addr)
|
||||
static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *dev_addr, void *daddr)
|
||||
{
|
||||
struct neighbour *n;
|
||||
int ret;
|
||||
|
||||
n = dst_neigh_lookup(dst, daddr);
|
||||
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour_noref(dst);
|
||||
if (!n || !(n->nud_state & NUD_VALID)) {
|
||||
if (n)
|
||||
neigh_event_send(n, NULL);
|
||||
ret = -ENODATA;
|
||||
} else {
|
||||
ret = rdma_copy_addr(addr, dst->dev, n->ha);
|
||||
ret = rdma_copy_addr(dev_addr, dst->dev, n->ha);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (n)
|
||||
neigh_release(n);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -232,7 +236,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
|
|||
goto put;
|
||||
}
|
||||
|
||||
ret = dst_fetch_ha(&rt->dst, addr);
|
||||
ret = dst_fetch_ha(&rt->dst, addr, &fl4.daddr);
|
||||
put:
|
||||
ip_rt_put(rt);
|
||||
out:
|
||||
|
@ -280,7 +284,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
|
|||
goto put;
|
||||
}
|
||||
|
||||
ret = dst_fetch_ha(dst, addr);
|
||||
ret = dst_fetch_ha(dst, addr, &fl6.daddr);
|
||||
put:
|
||||
dst_release(dst);
|
||||
return ret;
|
||||
|
|
|
@ -147,9 +147,13 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|||
if (op < 0 || op >= client->nops ||
|
||||
!client->cb_table[RDMA_NL_GET_OP(op)].dump)
|
||||
return -EINVAL;
|
||||
return netlink_dump_start(nls, skb, nlh,
|
||||
client->cb_table[op].dump,
|
||||
NULL, 0);
|
||||
|
||||
{
|
||||
struct netlink_dump_control c = {
|
||||
.dump = client->cb_table[op].dump,
|
||||
};
|
||||
return netlink_dump_start(nls, skb, nlh, &c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1562,11 +1562,11 @@ static int import_ep(struct c4iw_ep *ep, __be32 peer_ip, struct dst_entry *dst,
|
|||
struct neighbour *n;
|
||||
int err, step;
|
||||
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour_noref(dst);
|
||||
err = -ENODEV;
|
||||
n = dst_neigh_lookup(dst, &peer_ip);
|
||||
if (!n)
|
||||
goto out;
|
||||
return -ENODEV;
|
||||
|
||||
rcu_read_lock();
|
||||
err = -ENOMEM;
|
||||
if (n->dev->flags & IFF_LOOPBACK) {
|
||||
struct net_device *pdev;
|
||||
|
@ -1614,6 +1614,8 @@ static int import_ep(struct c4iw_ep *ep, __be32 peer_ip, struct dst_entry *dst,
|
|||
out:
|
||||
rcu_read_unlock();
|
||||
|
||||
neigh_release(n);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -1351,8 +1351,9 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
|||
else
|
||||
netdev = nesvnic->netdev;
|
||||
|
||||
neigh = dst_neigh_lookup(&rt->dst, &dst_ip);
|
||||
|
||||
rcu_read_lock();
|
||||
neigh = dst_get_neighbour_noref(&rt->dst);
|
||||
if (neigh) {
|
||||
if (neigh->nud_state & NUD_VALID) {
|
||||
nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
|
||||
|
@ -1379,9 +1380,12 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
|||
neigh_event_send(neigh, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
||||
if (neigh)
|
||||
neigh_release(neigh);
|
||||
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Author Fritz Elfert
|
||||
* Copyright by Fritz Elfert <fritz@isdn4linux.de>
|
||||
*
|
||||
*
|
||||
* This software may be used and distributed according to the terms
|
||||
* of the GNU General Public License, incorporated herein by reference.
|
||||
*
|
||||
|
@ -40,21 +40,21 @@
|
|||
/* Struct for adding new cards */
|
||||
typedef struct act2000_cdef {
|
||||
int bus;
|
||||
int port;
|
||||
int irq;
|
||||
char id[10];
|
||||
int port;
|
||||
int irq;
|
||||
char id[10];
|
||||
} act2000_cdef;
|
||||
|
||||
/* Struct for downloading firmware */
|
||||
typedef struct act2000_ddef {
|
||||
int length; /* Length of code */
|
||||
char __user *buffer; /* Ptr. to code */
|
||||
int length; /* Length of code */
|
||||
char __user *buffer; /* Ptr. to code */
|
||||
} act2000_ddef;
|
||||
|
||||
typedef struct act2000_fwid {
|
||||
char isdn[4];
|
||||
char revlen[2];
|
||||
char revision[504];
|
||||
char isdn[4];
|
||||
char revlen[2];
|
||||
char revision[504];
|
||||
} act2000_fwid;
|
||||
|
||||
#if defined(__KERNEL__) || defined(__DEBUGVAR__)
|
||||
|
@ -128,8 +128,8 @@ typedef struct act2000_chan {
|
|||
|
||||
typedef struct msn_entry {
|
||||
char eaz;
|
||||
char msn[16];
|
||||
struct msn_entry * next;
|
||||
char msn[16];
|
||||
struct msn_entry *next;
|
||||
} msn_entry;
|
||||
|
||||
typedef struct irq_data_isa {
|
||||
|
@ -183,17 +183,17 @@ typedef struct act2000_card {
|
|||
|
||||
static inline void act2000_schedule_tx(act2000_card *card)
|
||||
{
|
||||
schedule_work(&card->snd_tq);
|
||||
schedule_work(&card->snd_tq);
|
||||
}
|
||||
|
||||
static inline void act2000_schedule_rx(act2000_card *card)
|
||||
{
|
||||
schedule_work(&card->rcv_tq);
|
||||
schedule_work(&card->rcv_tq);
|
||||
}
|
||||
|
||||
static inline void act2000_schedule_poll(act2000_card *card)
|
||||
{
|
||||
schedule_work(&card->poll_tq);
|
||||
schedule_work(&card->poll_tq);
|
||||
}
|
||||
|
||||
extern char *act2000_find_eaz(act2000_card *, char);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Author Fritz Elfert
|
||||
* Copyright by Fritz Elfert <fritz@isdn4linux.de>
|
||||
*
|
||||
*
|
||||
* This software may be used and distributed according to the terms
|
||||
* of the GNU General Public License, incorporated herein by reference.
|
||||
*
|
||||
|
@ -25,99 +25,99 @@
|
|||
static int
|
||||
act2000_isa_reset(unsigned short portbase)
|
||||
{
|
||||
unsigned char reg;
|
||||
int i;
|
||||
int found;
|
||||
int serial = 0;
|
||||
unsigned char reg;
|
||||
int i;
|
||||
int found;
|
||||
int serial = 0;
|
||||
|
||||
found = 0;
|
||||
if ((reg = inb(portbase + ISA_COR)) != 0xff) {
|
||||
outb(reg | ISA_COR_RESET, portbase + ISA_COR);
|
||||
mdelay(10);
|
||||
outb(reg, portbase + ISA_COR);
|
||||
mdelay(10);
|
||||
found = 0;
|
||||
if ((reg = inb(portbase + ISA_COR)) != 0xff) {
|
||||
outb(reg | ISA_COR_RESET, portbase + ISA_COR);
|
||||
mdelay(10);
|
||||
outb(reg, portbase + ISA_COR);
|
||||
mdelay(10);
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (inb(portbase + ISA_ISR) & ISA_ISR_SERIAL)
|
||||
serial |= 0x10000;
|
||||
serial >>= 1;
|
||||
}
|
||||
if (serial == ISA_SER_ID)
|
||||
found++;
|
||||
}
|
||||
return found;
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (inb(portbase + ISA_ISR) & ISA_ISR_SERIAL)
|
||||
serial |= 0x10000;
|
||||
serial >>= 1;
|
||||
}
|
||||
if (serial == ISA_SER_ID)
|
||||
found++;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
int
|
||||
act2000_isa_detect(unsigned short portbase)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (request_region(portbase, ACT2000_PORTLEN, "act2000isa")) {
|
||||
ret = act2000_isa_reset(portbase);
|
||||
ret = act2000_isa_reset(portbase);
|
||||
release_region(portbase, ISA_REGION);
|
||||
}
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
act2000_isa_interrupt(int dummy, void *dev_id)
|
||||
{
|
||||
act2000_card *card = dev_id;
|
||||
u_char istatus;
|
||||
act2000_card *card = dev_id;
|
||||
u_char istatus;
|
||||
|
||||
istatus = (inb(ISA_PORT_ISR) & 0x07);
|
||||
if (istatus & ISA_ISR_OUT) {
|
||||
/* RX fifo has data */
|
||||
istatus = (inb(ISA_PORT_ISR) & 0x07);
|
||||
if (istatus & ISA_ISR_OUT) {
|
||||
/* RX fifo has data */
|
||||
istatus &= ISA_ISR_OUT_MASK;
|
||||
outb(0, ISA_PORT_SIS);
|
||||
act2000_isa_receive(card);
|
||||
outb(ISA_SIS_INT, ISA_PORT_SIS);
|
||||
}
|
||||
if (istatus & ISA_ISR_ERR) {
|
||||
/* Error Interrupt */
|
||||
}
|
||||
if (istatus & ISA_ISR_ERR) {
|
||||
/* Error Interrupt */
|
||||
istatus &= ISA_ISR_ERR_MASK;
|
||||
printk(KERN_WARNING "act2000: errIRQ\n");
|
||||
}
|
||||
printk(KERN_WARNING "act2000: errIRQ\n");
|
||||
}
|
||||
if (istatus)
|
||||
printk(KERN_DEBUG "act2000: ?IRQ %d %02x\n", card->irq, istatus);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void
|
||||
act2000_isa_select_irq(act2000_card * card)
|
||||
act2000_isa_select_irq(act2000_card *card)
|
||||
{
|
||||
unsigned char reg;
|
||||
|
||||
reg = (inb(ISA_PORT_COR) & ~ISA_COR_IRQOFF) | ISA_COR_PERR;
|
||||
switch (card->irq) {
|
||||
case 3:
|
||||
reg = ISA_COR_IRQ03;
|
||||
break;
|
||||
case 5:
|
||||
reg = ISA_COR_IRQ05;
|
||||
break;
|
||||
case 7:
|
||||
reg = ISA_COR_IRQ07;
|
||||
break;
|
||||
case 10:
|
||||
reg = ISA_COR_IRQ10;
|
||||
break;
|
||||
case 11:
|
||||
reg = ISA_COR_IRQ11;
|
||||
break;
|
||||
case 12:
|
||||
reg = ISA_COR_IRQ12;
|
||||
break;
|
||||
case 15:
|
||||
reg = ISA_COR_IRQ15;
|
||||
break;
|
||||
case 3:
|
||||
reg = ISA_COR_IRQ03;
|
||||
break;
|
||||
case 5:
|
||||
reg = ISA_COR_IRQ05;
|
||||
break;
|
||||
case 7:
|
||||
reg = ISA_COR_IRQ07;
|
||||
break;
|
||||
case 10:
|
||||
reg = ISA_COR_IRQ10;
|
||||
break;
|
||||
case 11:
|
||||
reg = ISA_COR_IRQ11;
|
||||
break;
|
||||
case 12:
|
||||
reg = ISA_COR_IRQ12;
|
||||
break;
|
||||
case 15:
|
||||
reg = ISA_COR_IRQ15;
|
||||
break;
|
||||
}
|
||||
outb(reg, ISA_PORT_COR);
|
||||
}
|
||||
|
||||
static void
|
||||
act2000_isa_enable_irq(act2000_card * card)
|
||||
act2000_isa_enable_irq(act2000_card *card)
|
||||
{
|
||||
act2000_isa_select_irq(card);
|
||||
/* Enable READ irq */
|
||||
|
@ -129,102 +129,102 @@ act2000_isa_enable_irq(act2000_card * card)
|
|||
* If irq is -1, choose next free irq, else irq is given explicitly.
|
||||
*/
|
||||
int
|
||||
act2000_isa_config_irq(act2000_card * card, short irq)
|
||||
act2000_isa_config_irq(act2000_card *card, short irq)
|
||||
{
|
||||
int old_irq;
|
||||
|
||||
if (card->flags & ACT2000_FLAGS_IVALID) {
|
||||
free_irq(card->irq, card);
|
||||
}
|
||||
card->flags &= ~ACT2000_FLAGS_IVALID;
|
||||
outb(ISA_COR_IRQOFF, ISA_PORT_COR);
|
||||
if (!irq)
|
||||
return 0;
|
||||
if (card->flags & ACT2000_FLAGS_IVALID) {
|
||||
free_irq(card->irq, card);
|
||||
}
|
||||
card->flags &= ~ACT2000_FLAGS_IVALID;
|
||||
outb(ISA_COR_IRQOFF, ISA_PORT_COR);
|
||||
if (!irq)
|
||||
return 0;
|
||||
|
||||
old_irq = card->irq;
|
||||
card->irq = irq;
|
||||
if (request_irq(irq, &act2000_isa_interrupt, 0, card->regname, card)) {
|
||||
card->irq = old_irq;
|
||||
card->flags |= ACT2000_FLAGS_IVALID;
|
||||
printk(KERN_WARNING
|
||||
"act2000: Could not request irq %d\n",irq);
|
||||
return -EBUSY;
|
||||
} else {
|
||||
printk(KERN_WARNING
|
||||
"act2000: Could not request irq %d\n", irq);
|
||||
return -EBUSY;
|
||||
} else {
|
||||
act2000_isa_select_irq(card);
|
||||
/* Disable READ and WRITE irq */
|
||||
outb(0, ISA_PORT_SIS);
|
||||
outb(0, ISA_PORT_SOS);
|
||||
}
|
||||
return 0;
|
||||
/* Disable READ and WRITE irq */
|
||||
outb(0, ISA_PORT_SIS);
|
||||
outb(0, ISA_PORT_SOS);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
act2000_isa_config_port(act2000_card * card, unsigned short portbase)
|
||||
act2000_isa_config_port(act2000_card *card, unsigned short portbase)
|
||||
{
|
||||
if (card->flags & ACT2000_FLAGS_PVALID) {
|
||||
release_region(card->port, ISA_REGION);
|
||||
card->flags &= ~ACT2000_FLAGS_PVALID;
|
||||
}
|
||||
if (card->flags & ACT2000_FLAGS_PVALID) {
|
||||
release_region(card->port, ISA_REGION);
|
||||
card->flags &= ~ACT2000_FLAGS_PVALID;
|
||||
}
|
||||
if (request_region(portbase, ACT2000_PORTLEN, card->regname) == NULL)
|
||||
return -EBUSY;
|
||||
else {
|
||||
card->port = portbase;
|
||||
card->flags |= ACT2000_FLAGS_PVALID;
|
||||
return 0;
|
||||
}
|
||||
card->port = portbase;
|
||||
card->flags |= ACT2000_FLAGS_PVALID;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Release ressources, used by an adaptor.
|
||||
*/
|
||||
void
|
||||
act2000_isa_release(act2000_card * card)
|
||||
act2000_isa_release(act2000_card *card)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&card->lock, flags);
|
||||
if (card->flags & ACT2000_FLAGS_IVALID)
|
||||
free_irq(card->irq, card);
|
||||
spin_lock_irqsave(&card->lock, flags);
|
||||
if (card->flags & ACT2000_FLAGS_IVALID)
|
||||
free_irq(card->irq, card);
|
||||
|
||||
card->flags &= ~ACT2000_FLAGS_IVALID;
|
||||
if (card->flags & ACT2000_FLAGS_PVALID)
|
||||
release_region(card->port, ISA_REGION);
|
||||
card->flags &= ~ACT2000_FLAGS_PVALID;
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
card->flags &= ~ACT2000_FLAGS_IVALID;
|
||||
if (card->flags & ACT2000_FLAGS_PVALID)
|
||||
release_region(card->port, ISA_REGION);
|
||||
card->flags &= ~ACT2000_FLAGS_PVALID;
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
}
|
||||
|
||||
static int
|
||||
act2000_isa_writeb(act2000_card * card, u_char data)
|
||||
act2000_isa_writeb(act2000_card *card, u_char data)
|
||||
{
|
||||
u_char timeout = 40;
|
||||
u_char timeout = 40;
|
||||
|
||||
while (timeout) {
|
||||
if (inb(ISA_PORT_SOS) & ISA_SOS_READY) {
|
||||
outb(data, ISA_PORT_SDO);
|
||||
return 0;
|
||||
} else {
|
||||
timeout--;
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
while (timeout) {
|
||||
if (inb(ISA_PORT_SOS) & ISA_SOS_READY) {
|
||||
outb(data, ISA_PORT_SDO);
|
||||
return 0;
|
||||
} else {
|
||||
timeout--;
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
act2000_isa_readb(act2000_card * card, u_char * data)
|
||||
act2000_isa_readb(act2000_card *card, u_char *data)
|
||||
{
|
||||
u_char timeout = 40;
|
||||
u_char timeout = 40;
|
||||
|
||||
while (timeout) {
|
||||
if (inb(ISA_PORT_SIS) & ISA_SIS_READY) {
|
||||
*data = inb(ISA_PORT_SDI);
|
||||
return 0;
|
||||
} else {
|
||||
timeout--;
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
while (timeout) {
|
||||
if (inb(ISA_PORT_SIS) & ISA_SIS_READY) {
|
||||
*data = inb(ISA_PORT_SDI);
|
||||
return 0;
|
||||
} else {
|
||||
timeout--;
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -232,11 +232,11 @@ act2000_isa_receive(act2000_card *card)
|
|||
{
|
||||
u_char c;
|
||||
|
||||
if (test_and_set_bit(ACT2000_LOCK_RX, (void *) &card->ilock) != 0)
|
||||
if (test_and_set_bit(ACT2000_LOCK_RX, (void *) &card->ilock) != 0)
|
||||
return;
|
||||
while (!act2000_isa_readb(card, &c)) {
|
||||
if (card->idat.isa.rcvidx < 8) {
|
||||
card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] = c;
|
||||
card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] = c;
|
||||
if (card->idat.isa.rcvidx == 8) {
|
||||
int valid = actcapi_chkhdr(card, (actcapi_msghdr *)&card->idat.isa.rcvhdr);
|
||||
|
||||
|
@ -291,14 +291,14 @@ act2000_isa_receive(act2000_card *card)
|
|||
}
|
||||
|
||||
void
|
||||
act2000_isa_send(act2000_card * card)
|
||||
act2000_isa_send(act2000_card *card)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct sk_buff *skb;
|
||||
actcapi_msg *msg;
|
||||
int l;
|
||||
|
||||
if (test_and_set_bit(ACT2000_LOCK_TX, (void *) &card->ilock) != 0)
|
||||
if (test_and_set_bit(ACT2000_LOCK_TX, (void *) &card->ilock) != 0)
|
||||
return;
|
||||
while (1) {
|
||||
spin_lock_irqsave(&card->lock, flags);
|
||||
|
@ -307,7 +307,7 @@ act2000_isa_send(act2000_card * card)
|
|||
card->ack_msg = card->sbuf->data;
|
||||
msg = (actcapi_msg *)card->sbuf->data;
|
||||
if ((msg->hdr.cmd.cmd == 0x86) &&
|
||||
(msg->hdr.cmd.subcmd == 0) ) {
|
||||
(msg->hdr.cmd.subcmd == 0)) {
|
||||
/* Save flags in message */
|
||||
card->need_b3ack = msg->msg.data_b3_req.flags;
|
||||
msg->msg.data_b3_req.flags = 0;
|
||||
|
@ -335,7 +335,7 @@ act2000_isa_send(act2000_card * card)
|
|||
}
|
||||
msg = (actcapi_msg *)card->ack_msg;
|
||||
if ((msg->hdr.cmd.cmd == 0x86) &&
|
||||
(msg->hdr.cmd.subcmd == 0) ) {
|
||||
(msg->hdr.cmd.subcmd == 0)) {
|
||||
/*
|
||||
* If it's user data, reset data-ptr
|
||||
* and put skb into ackq.
|
||||
|
@ -354,90 +354,90 @@ act2000_isa_send(act2000_card * card)
|
|||
* Get firmware ID, check for 'ISDN' signature.
|
||||
*/
|
||||
static int
|
||||
act2000_isa_getid(act2000_card * card)
|
||||
act2000_isa_getid(act2000_card *card)
|
||||
{
|
||||
|
||||
act2000_fwid fid;
|
||||
u_char *p = (u_char *) & fid;
|
||||
int count = 0;
|
||||
act2000_fwid fid;
|
||||
u_char *p = (u_char *)&fid;
|
||||
int count = 0;
|
||||
|
||||
while (1) {
|
||||
if (count > 510)
|
||||
return -EPROTO;
|
||||
if (act2000_isa_readb(card, p++))
|
||||
break;
|
||||
count++;
|
||||
}
|
||||
if (count <= 20) {
|
||||
printk(KERN_WARNING "act2000: No Firmware-ID!\n");
|
||||
return -ETIME;
|
||||
}
|
||||
*p = '\0';
|
||||
fid.revlen[0] = '\0';
|
||||
if (strcmp(fid.isdn, "ISDN")) {
|
||||
printk(KERN_WARNING "act2000: Wrong Firmware-ID!\n");
|
||||
return -EPROTO;
|
||||
}
|
||||
while (1) {
|
||||
if (count > 510)
|
||||
return -EPROTO;
|
||||
if (act2000_isa_readb(card, p++))
|
||||
break;
|
||||
count++;
|
||||
}
|
||||
if (count <= 20) {
|
||||
printk(KERN_WARNING "act2000: No Firmware-ID!\n");
|
||||
return -ETIME;
|
||||
}
|
||||
*p = '\0';
|
||||
fid.revlen[0] = '\0';
|
||||
if (strcmp(fid.isdn, "ISDN")) {
|
||||
printk(KERN_WARNING "act2000: Wrong Firmware-ID!\n");
|
||||
return -EPROTO;
|
||||
}
|
||||
if ((p = strchr(fid.revision, '\n')))
|
||||
*p = '\0';
|
||||
printk(KERN_INFO "act2000: Firmware-ID: %s\n", fid.revision);
|
||||
printk(KERN_INFO "act2000: Firmware-ID: %s\n", fid.revision);
|
||||
if (card->flags & ACT2000_FLAGS_IVALID) {
|
||||
printk(KERN_DEBUG "Enabling Interrupts ...\n");
|
||||
act2000_isa_enable_irq(card);
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Download microcode into card, check Firmware signature.
|
||||
*/
|
||||
int
|
||||
act2000_isa_download(act2000_card * card, act2000_ddef __user * cb)
|
||||
act2000_isa_download(act2000_card *card, act2000_ddef __user *cb)
|
||||
{
|
||||
unsigned int length;
|
||||
int l;
|
||||
int c;
|
||||
long timeout;
|
||||
u_char *b;
|
||||
u_char __user *p;
|
||||
u_char *buf;
|
||||
act2000_ddef cblock;
|
||||
unsigned int length;
|
||||
int l;
|
||||
int c;
|
||||
long timeout;
|
||||
u_char *b;
|
||||
u_char __user *p;
|
||||
u_char *buf;
|
||||
act2000_ddef cblock;
|
||||
|
||||
if (!act2000_isa_reset(card->port))
|
||||
return -ENXIO;
|
||||
msleep_interruptible(500);
|
||||
if (copy_from_user(&cblock, cb, sizeof(cblock)))
|
||||
return -EFAULT;
|
||||
length = cblock.length;
|
||||
p = cblock.buffer;
|
||||
if (!access_ok(VERIFY_READ, p, length))
|
||||
return -EFAULT;
|
||||
buf = kmalloc(1024, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
timeout = 0;
|
||||
while (length) {
|
||||
l = (length > 1024) ? 1024 : length;
|
||||
c = 0;
|
||||
b = buf;
|
||||
if (copy_from_user(buf, p, l)) {
|
||||
kfree(buf);
|
||||
return -EFAULT;
|
||||
}
|
||||
while (c < l) {
|
||||
if (act2000_isa_writeb(card, *b++)) {
|
||||
printk(KERN_WARNING
|
||||
"act2000: loader timed out"
|
||||
" len=%d c=%d\n", length, c);
|
||||
kfree(buf);
|
||||
return -ETIME;
|
||||
}
|
||||
c++;
|
||||
}
|
||||
length -= l;
|
||||
p += l;
|
||||
}
|
||||
kfree(buf);
|
||||
msleep_interruptible(500);
|
||||
return (act2000_isa_getid(card));
|
||||
if (!act2000_isa_reset(card->port))
|
||||
return -ENXIO;
|
||||
msleep_interruptible(500);
|
||||
if (copy_from_user(&cblock, cb, sizeof(cblock)))
|
||||
return -EFAULT;
|
||||
length = cblock.length;
|
||||
p = cblock.buffer;
|
||||
if (!access_ok(VERIFY_READ, p, length))
|
||||
return -EFAULT;
|
||||
buf = kmalloc(1024, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
timeout = 0;
|
||||
while (length) {
|
||||
l = (length > 1024) ? 1024 : length;
|
||||
c = 0;
|
||||
b = buf;
|
||||
if (copy_from_user(buf, p, l)) {
|
||||
kfree(buf);
|
||||
return -EFAULT;
|
||||
}
|
||||
while (c < l) {
|
||||
if (act2000_isa_writeb(card, *b++)) {
|
||||
printk(KERN_WARNING
|
||||
"act2000: loader timed out"
|
||||
" len=%d c=%d\n", length, c);
|
||||
kfree(buf);
|
||||
return -ETIME;
|
||||
}
|
||||
c++;
|
||||
}
|
||||
length -= l;
|
||||
p += l;
|
||||
}
|
||||
kfree(buf);
|
||||
msleep_interruptible(500);
|
||||
return (act2000_isa_getid(card));
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Author Fritz Elfert
|
||||
* Copyright by Fritz Elfert <fritz@isdn4linux.de>
|
||||
*
|
||||
*
|
||||
* This software may be used and distributed according to the terms
|
||||
* of the GNU General Public License, incorporated herein by reference.
|
||||
*
|
||||
|
@ -18,9 +18,9 @@
|
|||
#define ISA_POLL_LOOP 40 /* Try to read-write before give up */
|
||||
|
||||
typedef enum {
|
||||
INT_NO_CHANGE = 0, /* Do not change the Mask */
|
||||
INT_ON = 1, /* Set to Enable */
|
||||
INT_OFF = 2, /* Set to Disable */
|
||||
INT_NO_CHANGE = 0, /* Do not change the Mask */
|
||||
INT_ON = 1, /* Set to Enable */
|
||||
INT_OFF = 2, /* Set to Disable */
|
||||
} ISA_INT_T;
|
||||
|
||||
/**************************************************************************/
|
||||
|
@ -114,22 +114,22 @@ typedef enum {
|
|||
|
||||
|
||||
/* Macros for accessing ports */
|
||||
#define ISA_PORT_COR (card->port+ISA_COR)
|
||||
#define ISA_PORT_ISR (card->port+ISA_ISR)
|
||||
#define ISA_PORT_EPR (card->port+ISA_EPR)
|
||||
#define ISA_PORT_EER (card->port+ISA_EER)
|
||||
#define ISA_PORT_SDI (card->port+ISA_SDI)
|
||||
#define ISA_PORT_SDO (card->port+ISA_SDO)
|
||||
#define ISA_PORT_SIS (card->port+ISA_SIS)
|
||||
#define ISA_PORT_SOS (card->port+ISA_SOS)
|
||||
#define ISA_PORT_COR (card->port + ISA_COR)
|
||||
#define ISA_PORT_ISR (card->port + ISA_ISR)
|
||||
#define ISA_PORT_EPR (card->port + ISA_EPR)
|
||||
#define ISA_PORT_EER (card->port + ISA_EER)
|
||||
#define ISA_PORT_SDI (card->port + ISA_SDI)
|
||||
#define ISA_PORT_SDO (card->port + ISA_SDO)
|
||||
#define ISA_PORT_SIS (card->port + ISA_SIS)
|
||||
#define ISA_PORT_SOS (card->port + ISA_SOS)
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
extern int act2000_isa_detect(unsigned short portbase);
|
||||
extern int act2000_isa_config_irq(act2000_card * card, short irq);
|
||||
extern int act2000_isa_config_port(act2000_card * card, unsigned short portbase);
|
||||
extern int act2000_isa_download(act2000_card * card, act2000_ddef __user * cb);
|
||||
extern void act2000_isa_release(act2000_card * card);
|
||||
extern int act2000_isa_config_irq(act2000_card *card, short irq);
|
||||
extern int act2000_isa_config_port(act2000_card *card, unsigned short portbase);
|
||||
extern int act2000_isa_download(act2000_card *card, act2000_ddef __user *cb);
|
||||
extern void act2000_isa_release(act2000_card *card);
|
||||
extern void act2000_isa_receive(act2000_card *card);
|
||||
extern void act2000_isa_send(act2000_card *card);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Author Fritz Elfert
|
||||
* Copyright by Fritz Elfert <fritz@isdn4linux.de>
|
||||
*
|
||||
*
|
||||
* This software may be used and distributed according to the terms
|
||||
* of the GNU General Public License, incorporated herein by reference.
|
||||
*
|
||||
|
@ -46,10 +46,10 @@ typedef struct actcapi_addr {
|
|||
typedef union actcapi_infonr { /* info number */
|
||||
__u16 mask; /* info-mask field */
|
||||
struct bmask { /* bit definitions */
|
||||
unsigned codes : 3; /* code set */
|
||||
unsigned rsvd : 5; /* reserved */
|
||||
unsigned svind : 1; /* single, variable length ind. */
|
||||
unsigned wtype : 7; /* W-element type */
|
||||
unsigned codes:3; /* code set */
|
||||
unsigned rsvd:5; /* reserved */
|
||||
unsigned svind:1; /* single, variable length ind. */
|
||||
unsigned wtype:7; /* W-element type */
|
||||
} bmask;
|
||||
} actcapi_infonr;
|
||||
|
||||
|
@ -59,13 +59,13 @@ typedef union actcapi_infoel { /* info element */
|
|||
__u8 display[40]; /* display contents */
|
||||
__u8 uuinfo[40]; /* User-user info field */
|
||||
struct cause { /* Cause information */
|
||||
unsigned ext2 : 1; /* extension */
|
||||
unsigned cod : 2; /* coding standard */
|
||||
unsigned spare : 1; /* spare */
|
||||
unsigned loc : 4; /* location */
|
||||
unsigned ext1 : 1; /* extension */
|
||||
unsigned cval : 7; /* Cause value */
|
||||
} cause;
|
||||
unsigned ext2:1; /* extension */
|
||||
unsigned cod:2; /* coding standard */
|
||||
unsigned spare:1; /* spare */
|
||||
unsigned loc:4; /* location */
|
||||
unsigned ext1:1; /* extension */
|
||||
unsigned cval:7; /* Cause value */
|
||||
} cause;
|
||||
struct charge { /* Charging information */
|
||||
__u8 toc; /* type of charging info */
|
||||
__u8 unit[10]; /* charging units */
|
||||
|
@ -111,14 +111,14 @@ typedef struct actcapi_ncpd {
|
|||
* Bit 5-7 = Controller
|
||||
* Bit 8-15 = NCCI
|
||||
*/
|
||||
#define MAKE_NCCI(plci,contr,ncci) \
|
||||
((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
|
||||
#define MAKE_NCCI(plci, contr, ncci) \
|
||||
((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
|
||||
|
||||
#define EVAL_NCCI(fakencci,plci,contr,ncci) { \
|
||||
plci = fakencci & 0x1f; \
|
||||
contr = (fakencci >> 5) & 0x7; \
|
||||
ncci = (fakencci >> 8) & 0xff; \
|
||||
}
|
||||
#define EVAL_NCCI(fakencci, plci, contr, ncci) { \
|
||||
plci = fakencci & 0x1f; \
|
||||
contr = (fakencci >> 5) & 0x7; \
|
||||
ncci = (fakencci >> 8) & 0xff; \
|
||||
}
|
||||
|
||||
/*
|
||||
* Layout of PLCI field in a B3 DATA CAPI message is different from
|
||||
|
@ -128,13 +128,13 @@ typedef struct actcapi_ncpd {
|
|||
* Bit 5-7 = Controller
|
||||
* Bit 8-15 = reserved (must be 0)
|
||||
*/
|
||||
#define MAKE_PLCI(plci,contr) \
|
||||
((plci & 0x1f) | ((contr & 0x7) << 5))
|
||||
#define MAKE_PLCI(plci, contr) \
|
||||
((plci & 0x1f) | ((contr & 0x7) << 5))
|
||||
|
||||
#define EVAL_PLCI(fakeplci,plci,contr) { \
|
||||
plci = fakeplci & 0x1f; \
|
||||
contr = (fakeplci >> 5) & 0x7; \
|
||||
}
|
||||
#define EVAL_PLCI(fakeplci, plci, contr) { \
|
||||
plci = fakeplci & 0x1f; \
|
||||
contr = (fakeplci >> 5) & 0x7; \
|
||||
}
|
||||
|
||||
typedef struct actcapi_msg {
|
||||
actcapi_msghdr hdr;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -25,7 +25,7 @@
|
|||
#include <linux/tty.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/ppp_defs.h>
|
||||
#include <linux/if_ppp.h>
|
||||
#include <linux/ppp-ioctl.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
@ -164,7 +164,7 @@ static int capiminor_del_ack(struct capiminor *mp, u16 datahandle)
|
|||
|
||||
spin_lock_bh(&mp->ackqlock);
|
||||
list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
|
||||
if (p->datahandle == datahandle) {
|
||||
if (p->datahandle == datahandle) {
|
||||
list_del(&p->list);
|
||||
mp->nack--;
|
||||
spin_unlock_bh(&mp->ackqlock);
|
||||
|
@ -199,8 +199,8 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci)
|
|||
unsigned int minor;
|
||||
|
||||
mp = kzalloc(sizeof(*mp), GFP_KERNEL);
|
||||
if (!mp) {
|
||||
printk(KERN_ERR "capi: can't alloc capiminor\n");
|
||||
if (!mp) {
|
||||
printk(KERN_ERR "capi: can't alloc capiminor\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -391,7 +391,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb)
|
|||
struct sk_buff *nskb;
|
||||
nskb = alloc_skb(CAPI_DATA_B3_RESP_LEN, GFP_KERNEL);
|
||||
if (nskb) {
|
||||
u16 datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4+4+2);
|
||||
u16 datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 4 + 2);
|
||||
unsigned char *s = skb_put(nskb, CAPI_DATA_B3_RESP_LEN);
|
||||
capimsg_setu16(s, 0, CAPI_DATA_B3_RESP_LEN);
|
||||
capimsg_setu16(s, 2, mp->ap->applid);
|
||||
|
@ -418,7 +418,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
|
|||
pr_debug("capi: currently no receiver\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
ld = tty_ldisc_ref(tty);
|
||||
if (!ld) {
|
||||
/* fatal error, do not requeue */
|
||||
|
@ -459,7 +459,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
|
|||
ld->ops->receive_buf(tty, skb->data, NULL, skb->len);
|
||||
} else {
|
||||
printk(KERN_ERR "capi: send DATA_B3_RESP failed=%x\n",
|
||||
errcode);
|
||||
errcode);
|
||||
kfree_skb(nskb);
|
||||
|
||||
if (errcode == CAPI_SENDQUEUEFULL)
|
||||
|
@ -618,7 +618,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
|
|||
goto unlock_out;
|
||||
}
|
||||
if (CAPIMSG_SUBCOMMAND(skb->data) == CAPI_IND) {
|
||||
datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4+4+2);
|
||||
datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 4 + 2);
|
||||
pr_debug("capi_signal: DATA_B3_IND %u len=%d\n",
|
||||
datahandle, skb->len-CAPIMSG_LEN(skb->data));
|
||||
skb_queue_tail(&mp->inqueue, skb);
|
||||
|
@ -627,10 +627,10 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
|
|||
|
||||
} else if (CAPIMSG_SUBCOMMAND(skb->data) == CAPI_CONF) {
|
||||
|
||||
datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4);
|
||||
datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4);
|
||||
pr_debug("capi_signal: DATA_B3_CONF %u 0x%x\n",
|
||||
datahandle,
|
||||
CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4+2));
|
||||
CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 2));
|
||||
kfree_skb(skb);
|
||||
capiminor_del_ack(mp, datahandle);
|
||||
tty = tty_port_tty_get(&mp->port);
|
||||
|
@ -669,7 +669,7 @@ capi_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
|||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
err = wait_event_interruptible(cdev->recvwait,
|
||||
(skb = skb_dequeue(&cdev->recvqueue)));
|
||||
(skb = skb_dequeue(&cdev->recvqueue)));
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@ -736,7 +736,7 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
capi_poll(struct file *file, poll_table * wait)
|
||||
capi_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
struct capidev *cdev = file->private_data;
|
||||
unsigned int mask = 0;
|
||||
|
@ -786,75 +786,75 @@ register_out:
|
|||
return retval;
|
||||
|
||||
case CAPI_GET_VERSION:
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_version(data.contr, &data.version);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
if (copy_to_user(argp, &data.version,
|
||||
sizeof(data.version)))
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_version(data.contr, &data.version);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
if (copy_to_user(argp, &data.version,
|
||||
sizeof(data.version)))
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CAPI_GET_SERIAL:
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_serial (data.contr, data.serial);
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_serial(data.contr, data.serial);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
if (copy_to_user(argp, data.serial,
|
||||
sizeof(data.serial)))
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
case CAPI_GET_PROFILE:
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
|
||||
if (data.contr == 0) {
|
||||
cdev->errcode = capi20_get_profile(data.contr, &data.profile);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
if (copy_to_user(argp, data.serial,
|
||||
sizeof(data.serial)))
|
||||
return -EFAULT;
|
||||
|
||||
retval = copy_to_user(argp,
|
||||
&data.profile.ncontroller,
|
||||
sizeof(data.profile.ncontroller));
|
||||
|
||||
} else {
|
||||
cdev->errcode = capi20_get_profile(data.contr, &data.profile);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
|
||||
retval = copy_to_user(argp, &data.profile,
|
||||
sizeof(data.profile));
|
||||
}
|
||||
return 0;
|
||||
case CAPI_GET_PROFILE:
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
|
||||
if (data.contr == 0) {
|
||||
cdev->errcode = capi20_get_profile(data.contr, &data.profile);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
|
||||
retval = copy_to_user(argp,
|
||||
&data.profile.ncontroller,
|
||||
sizeof(data.profile.ncontroller));
|
||||
|
||||
} else {
|
||||
cdev->errcode = capi20_get_profile(data.contr, &data.profile);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
|
||||
retval = copy_to_user(argp, &data.profile,
|
||||
sizeof(data.profile));
|
||||
}
|
||||
if (retval)
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
if (retval)
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CAPI_GET_MANUFACTURER:
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_manufacturer(data.contr, data.manufacturer);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
{
|
||||
if (copy_from_user(&data.contr, argp,
|
||||
sizeof(data.contr)))
|
||||
return -EFAULT;
|
||||
cdev->errcode = capi20_get_manufacturer(data.contr, data.manufacturer);
|
||||
if (cdev->errcode)
|
||||
return -EIO;
|
||||
|
||||
if (copy_to_user(argp, data.manufacturer,
|
||||
sizeof(data.manufacturer)))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(argp, data.manufacturer,
|
||||
sizeof(data.manufacturer)))
|
||||
return -EFAULT;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
case CAPI_GET_ERRCODE:
|
||||
data.errcode = cdev->errcode;
|
||||
cdev->errcode = CAPI_NOERROR;
|
||||
|
@ -871,15 +871,15 @@ register_out:
|
|||
return -ENXIO;
|
||||
|
||||
case CAPI_MANUFACTURER_CMD:
|
||||
{
|
||||
struct capi_manufacturer_cmd mcmd;
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (copy_from_user(&mcmd, argp, sizeof(mcmd)))
|
||||
return -EFAULT;
|
||||
return capi20_manufacturer(mcmd.cmd, mcmd.data);
|
||||
}
|
||||
return 0;
|
||||
{
|
||||
struct capi_manufacturer_cmd mcmd;
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (copy_from_user(&mcmd, argp, sizeof(mcmd)))
|
||||
return -EFAULT;
|
||||
return capi20_manufacturer(mcmd.cmd, mcmd.data);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CAPI_SET_FLAGS:
|
||||
case CAPI_CLR_FLAGS: {
|
||||
|
@ -1066,7 +1066,7 @@ static int capinc_tty_write(struct tty_struct *tty,
|
|||
mp->outbytes += skb->len;
|
||||
}
|
||||
|
||||
skb = alloc_skb(CAPI_DATA_B3_REQ_LEN+count, GFP_ATOMIC);
|
||||
skb = alloc_skb(CAPI_DATA_B3_REQ_LEN + count, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
printk(KERN_ERR "capinc_tty_write: alloc_skb failed\n");
|
||||
spin_unlock_bh(&mp->outlock);
|
||||
|
@ -1107,7 +1107,7 @@ static int capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
|
|||
invoke_send = true;
|
||||
}
|
||||
|
||||
skb = alloc_skb(CAPI_DATA_B3_REQ_LEN+CAPI_MAX_BLKSIZE, GFP_ATOMIC);
|
||||
skb = alloc_skb(CAPI_DATA_B3_REQ_LEN + CAPI_MAX_BLKSIZE, GFP_ATOMIC);
|
||||
if (skb) {
|
||||
skb_reserve(skb, CAPI_DATA_B3_REQ_LEN);
|
||||
*(skb_put(skb, 1)) = ch;
|
||||
|
@ -1171,12 +1171,12 @@ static int capinc_tty_chars_in_buffer(struct tty_struct *tty)
|
|||
}
|
||||
|
||||
static int capinc_tty_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static void capinc_tty_set_termios(struct tty_struct *tty, struct ktermios * old)
|
||||
static void capinc_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
{
|
||||
pr_debug("capinc_tty_set_termios\n");
|
||||
}
|
||||
|
@ -1339,18 +1339,18 @@ static inline void capinc_tty_exit(void) { }
|
|||
*/
|
||||
static int capi20_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct capidev *cdev;
|
||||
struct capidev *cdev;
|
||||
struct list_head *l;
|
||||
|
||||
mutex_lock(&capidev_list_lock);
|
||||
list_for_each(l, &capidev_list) {
|
||||
cdev = list_entry(l, struct capidev, list);
|
||||
seq_printf(m, "0 %d %lu %lu %lu %lu\n",
|
||||
cdev->ap.applid,
|
||||
cdev->ap.nrecvctlpkt,
|
||||
cdev->ap.nrecvdatapkt,
|
||||
cdev->ap.nsentctlpkt,
|
||||
cdev->ap.nsentdatapkt);
|
||||
cdev->ap.applid,
|
||||
cdev->ap.nrecvctlpkt,
|
||||
cdev->ap.nrecvdatapkt,
|
||||
cdev->ap.nsentctlpkt,
|
||||
cdev->ap.nsentdatapkt);
|
||||
}
|
||||
mutex_unlock(&capidev_list_lock);
|
||||
return 0;
|
||||
|
@ -1445,9 +1445,9 @@ static int __init capi_init(void)
|
|||
proc_init();
|
||||
|
||||
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
|
||||
compileinfo = " (middleware)";
|
||||
compileinfo = " (middleware)";
|
||||
#else
|
||||
compileinfo = " (no middleware)";
|
||||
compileinfo = " (no middleware)";
|
||||
#endif
|
||||
printk(KERN_NOTICE "CAPI 2.0 started up with major %d%s\n",
|
||||
capi_major, compileinfo);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -34,7 +34,7 @@
|
|||
* per plci state machine
|
||||
*/
|
||||
#define ST_PLCI_NONE 0 /* P-0 */
|
||||
#define ST_PLCI_OUTGOING 1 /* P-0.1 */
|
||||
#define ST_PLCI_OUTGOING 1 /* P-0.1 */
|
||||
#define ST_PLCI_ALLOCATED 2 /* P-1 */
|
||||
#define ST_PLCI_ACTIVE 3 /* P-ACT */
|
||||
#define ST_PLCI_INCOMING 4 /* P-2 */
|
||||
|
@ -47,20 +47,20 @@
|
|||
#define ST_PLCI_HELD 11 /* P-HELD */
|
||||
|
||||
#define EV_PLCI_CONNECT_REQ 1 /* P-0 -> P-0.1
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_CONF_ERROR 2 /* P-0.1 -> P-0
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_CONF_OK 3 /* P-0.1 -> P-1
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_FACILITY_IND_UP 4 /* P-0 -> P-1
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_IND 5 /* P-0 -> P-2
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_ACTIVE_IND 6 /* P-1 -> P-ACT
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_REJECT 7 /* P-2 -> P-5
|
||||
P-3 -> P-5
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_DISCONNECT_REQ 8 /* P-1 -> P-5
|
||||
P-2 -> P-5
|
||||
P-3 -> P-5
|
||||
|
@ -68,7 +68,7 @@
|
|||
P-ACT -> P-5
|
||||
P-Res -> P-5 (*)
|
||||
P-HELD -> P-5 (*)
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_DISCONNECT_IND 9 /* P-1 -> P-6
|
||||
P-2 -> P-6
|
||||
P-3 -> P-6
|
||||
|
@ -77,35 +77,35 @@
|
|||
P-ACT -> P-6
|
||||
P-Res -> P-6 (*)
|
||||
P-HELD -> P-6 (*)
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_FACILITY_IND_DOWN 10 /* P-0.1 -> P-5
|
||||
P-1 -> P-5
|
||||
P-ACT -> P-5
|
||||
P-2 -> P-5
|
||||
P-3 -> P-5
|
||||
P-4 -> P-5
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_DISCONNECT_RESP 11 /* P-6 -> P-0
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CONNECT_RESP 12 /* P-6 -> P-0
|
||||
*/
|
||||
*/
|
||||
|
||||
#define EV_PLCI_RESUME_REQ 13 /* P-0 -> P-0.Res
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_RESUME_CONF_OK 14 /* P-0.Res -> P-Res
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_RESUME_CONF_ERROR 15 /* P-0.Res -> P-0
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_RESUME_IND 16 /* P-Res -> P-ACT
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_HOLD_IND 17 /* P-ACT -> P-HELD
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_RETRIEVE_IND 18 /* P-HELD -> P-ACT
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_SUSPEND_IND 19 /* P-ACT -> P-5
|
||||
*/
|
||||
*/
|
||||
#define EV_PLCI_CD_IND 20 /* P-2 -> P-5
|
||||
*/
|
||||
*/
|
||||
|
||||
/*
|
||||
* per ncci state machine
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/isdn/capilli.h>
|
||||
|
||||
#define DBG(format, arg...) do { \
|
||||
printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
|
||||
} while (0)
|
||||
#define DBG(format, arg...) do { \
|
||||
printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
|
||||
} while (0)
|
||||
|
||||
struct capilib_msgidqueue {
|
||||
struct capilib_msgidqueue *next;
|
||||
|
@ -28,7 +28,7 @@ struct capilib_ncci {
|
|||
// ---------------------------------------------------------------------------
|
||||
// NCCI Handling
|
||||
|
||||
static inline void mq_init(struct capilib_ncci * np)
|
||||
static inline void mq_init(struct capilib_ncci *np)
|
||||
{
|
||||
u_int i;
|
||||
np->msgidqueue = NULL;
|
||||
|
@ -42,7 +42,7 @@ static inline void mq_init(struct capilib_ncci * np)
|
|||
}
|
||||
}
|
||||
|
||||
static inline int mq_enqueue(struct capilib_ncci * np, u16 msgid)
|
||||
static inline int mq_enqueue(struct capilib_ncci *np, u16 msgid)
|
||||
{
|
||||
struct capilib_msgidqueue *mq;
|
||||
if ((mq = np->msgidfree) == NULL)
|
||||
|
@ -59,7 +59,7 @@ static inline int mq_enqueue(struct capilib_ncci * np, u16 msgid)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline int mq_dequeue(struct capilib_ncci * np, u16 msgid)
|
||||
static inline int mq_dequeue(struct capilib_ncci *np, u16 msgid)
|
||||
{
|
||||
struct capilib_msgidqueue **pp;
|
||||
for (pp = &np->msgidqueue; *pp; pp = &(*pp)->next) {
|
||||
|
@ -165,7 +165,7 @@ u16 capilib_data_b3_req(struct list_head *head, u16 applid, u32 ncci, u16 msgid)
|
|||
continue;
|
||||
if (np->ncci != ncci)
|
||||
continue;
|
||||
|
||||
|
||||
if (mq_enqueue(np, msgid) == 0)
|
||||
return CAPI_SENDQUEUEFULL;
|
||||
|
||||
|
@ -188,7 +188,7 @@ void capilib_data_b3_conf(struct list_head *head, u16 applid, u32 ncci, u16 msgi
|
|||
continue;
|
||||
if (np->ncci != ncci)
|
||||
continue;
|
||||
|
||||
|
||||
if (mq_dequeue(np, msgid) == 0) {
|
||||
printk(KERN_ERR "kcapi: msgid %hu ncci 0x%x not on queue\n",
|
||||
msgid, ncci);
|
||||
|
|
|
@ -25,149 +25,149 @@
|
|||
#ifndef CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
|
||||
char *capi_info2str(u16 reason)
|
||||
{
|
||||
return "..";
|
||||
return "..";
|
||||
}
|
||||
#else
|
||||
char *capi_info2str(u16 reason)
|
||||
{
|
||||
switch (reason) {
|
||||
switch (reason) {
|
||||
|
||||
/*-- informative values (corresponding message was processed) -----*/
|
||||
case 0x0001:
|
||||
return "NCPI not supported by current protocol, NCPI ignored";
|
||||
return "NCPI not supported by current protocol, NCPI ignored";
|
||||
case 0x0002:
|
||||
return "Flags not supported by current protocol, flags ignored";
|
||||
return "Flags not supported by current protocol, flags ignored";
|
||||
case 0x0003:
|
||||
return "Alert already sent by another application";
|
||||
return "Alert already sent by another application";
|
||||
|
||||
/*-- error information concerning CAPI_REGISTER -----*/
|
||||
case 0x1001:
|
||||
return "Too many applications";
|
||||
return "Too many applications";
|
||||
case 0x1002:
|
||||
return "Logical block size too small, must be at least 128 Bytes";
|
||||
return "Logical block size too small, must be at least 128 Bytes";
|
||||
case 0x1003:
|
||||
return "Buffer exceeds 64 kByte";
|
||||
return "Buffer exceeds 64 kByte";
|
||||
case 0x1004:
|
||||
return "Message buffer size too small, must be at least 1024 Bytes";
|
||||
return "Message buffer size too small, must be at least 1024 Bytes";
|
||||
case 0x1005:
|
||||
return "Max. number of logical connections not supported";
|
||||
return "Max. number of logical connections not supported";
|
||||
case 0x1006:
|
||||
return "Reserved";
|
||||
return "Reserved";
|
||||
case 0x1007:
|
||||
return "The message could not be accepted because of an internal busy condition";
|
||||
return "The message could not be accepted because of an internal busy condition";
|
||||
case 0x1008:
|
||||
return "OS resource error (no memory ?)";
|
||||
return "OS resource error (no memory ?)";
|
||||
case 0x1009:
|
||||
return "CAPI not installed";
|
||||
return "CAPI not installed";
|
||||
case 0x100A:
|
||||
return "Controller does not support external equipment";
|
||||
return "Controller does not support external equipment";
|
||||
case 0x100B:
|
||||
return "Controller does only support external equipment";
|
||||
return "Controller does only support external equipment";
|
||||
|
||||
/*-- error information concerning message exchange functions -----*/
|
||||
case 0x1101:
|
||||
return "Illegal application number";
|
||||
return "Illegal application number";
|
||||
case 0x1102:
|
||||
return "Illegal command or subcommand or message length less than 12 bytes";
|
||||
return "Illegal command or subcommand or message length less than 12 bytes";
|
||||
case 0x1103:
|
||||
return "The message could not be accepted because of a queue full condition !! The error code does not imply that CAPI cannot receive messages directed to another controller, PLCI or NCCI";
|
||||
return "The message could not be accepted because of a queue full condition !! The error code does not imply that CAPI cannot receive messages directed to another controller, PLCI or NCCI";
|
||||
case 0x1104:
|
||||
return "Queue is empty";
|
||||
return "Queue is empty";
|
||||
case 0x1105:
|
||||
return "Queue overflow, a message was lost !! This indicates a configuration error. The only recovery from this error is to perform a CAPI_RELEASE";
|
||||
return "Queue overflow, a message was lost !! This indicates a configuration error. The only recovery from this error is to perform a CAPI_RELEASE";
|
||||
case 0x1106:
|
||||
return "Unknown notification parameter";
|
||||
return "Unknown notification parameter";
|
||||
case 0x1107:
|
||||
return "The Message could not be accepted because of an internal busy condition";
|
||||
return "The Message could not be accepted because of an internal busy condition";
|
||||
case 0x1108:
|
||||
return "OS Resource error (no memory ?)";
|
||||
return "OS Resource error (no memory ?)";
|
||||
case 0x1109:
|
||||
return "CAPI not installed";
|
||||
return "CAPI not installed";
|
||||
case 0x110A:
|
||||
return "Controller does not support external equipment";
|
||||
return "Controller does not support external equipment";
|
||||
case 0x110B:
|
||||
return "Controller does only support external equipment";
|
||||
return "Controller does only support external equipment";
|
||||
|
||||
/*-- error information concerning resource / coding problems -----*/
|
||||
case 0x2001:
|
||||
return "Message not supported in current state";
|
||||
return "Message not supported in current state";
|
||||
case 0x2002:
|
||||
return "Illegal Controller / PLCI / NCCI";
|
||||
return "Illegal Controller / PLCI / NCCI";
|
||||
case 0x2003:
|
||||
return "Out of PLCI";
|
||||
return "Out of PLCI";
|
||||
case 0x2004:
|
||||
return "Out of NCCI";
|
||||
return "Out of NCCI";
|
||||
case 0x2005:
|
||||
return "Out of LISTEN";
|
||||
return "Out of LISTEN";
|
||||
case 0x2006:
|
||||
return "Out of FAX resources (protocol T.30)";
|
||||
return "Out of FAX resources (protocol T.30)";
|
||||
case 0x2007:
|
||||
return "Illegal message parameter coding";
|
||||
return "Illegal message parameter coding";
|
||||
|
||||
/*-- error information concerning requested services -----*/
|
||||
case 0x3001:
|
||||
return "B1 protocol not supported";
|
||||
case 0x3002:
|
||||
return "B2 protocol not supported";
|
||||
case 0x3003:
|
||||
return "B3 protocol not supported";
|
||||
case 0x3004:
|
||||
return "B1 protocol parameter not supported";
|
||||
case 0x3005:
|
||||
return "B2 protocol parameter not supported";
|
||||
case 0x3006:
|
||||
return "B3 protocol parameter not supported";
|
||||
case 0x3007:
|
||||
return "B protocol combination not supported";
|
||||
case 0x3008:
|
||||
return "NCPI not supported";
|
||||
case 0x3009:
|
||||
return "CIP Value unknown";
|
||||
case 0x300A:
|
||||
return "Flags not supported (reserved bits)";
|
||||
case 0x300B:
|
||||
return "Facility not supported";
|
||||
case 0x300C:
|
||||
return "Data length not supported by current protocol";
|
||||
case 0x300D:
|
||||
return "Reset procedure not supported by current protocol";
|
||||
return "B1 protocol not supported";
|
||||
case 0x3002:
|
||||
return "B2 protocol not supported";
|
||||
case 0x3003:
|
||||
return "B3 protocol not supported";
|
||||
case 0x3004:
|
||||
return "B1 protocol parameter not supported";
|
||||
case 0x3005:
|
||||
return "B2 protocol parameter not supported";
|
||||
case 0x3006:
|
||||
return "B3 protocol parameter not supported";
|
||||
case 0x3007:
|
||||
return "B protocol combination not supported";
|
||||
case 0x3008:
|
||||
return "NCPI not supported";
|
||||
case 0x3009:
|
||||
return "CIP Value unknown";
|
||||
case 0x300A:
|
||||
return "Flags not supported (reserved bits)";
|
||||
case 0x300B:
|
||||
return "Facility not supported";
|
||||
case 0x300C:
|
||||
return "Data length not supported by current protocol";
|
||||
case 0x300D:
|
||||
return "Reset procedure not supported by current protocol";
|
||||
|
||||
/*-- informations about the clearing of a physical connection -----*/
|
||||
case 0x3301:
|
||||
return "Protocol error layer 1 (broken line or B-channel removed by signalling protocol)";
|
||||
case 0x3302:
|
||||
return "Protocol error layer 2";
|
||||
case 0x3303:
|
||||
return "Protocol error layer 3";
|
||||
case 0x3304:
|
||||
return "Another application got that call";
|
||||
case 0x3301:
|
||||
return "Protocol error layer 1 (broken line or B-channel removed by signalling protocol)";
|
||||
case 0x3302:
|
||||
return "Protocol error layer 2";
|
||||
case 0x3303:
|
||||
return "Protocol error layer 3";
|
||||
case 0x3304:
|
||||
return "Another application got that call";
|
||||
/*-- T.30 specific reasons -----*/
|
||||
case 0x3311:
|
||||
return "Connecting not successful (remote station is no FAX G3 machine)";
|
||||
case 0x3312:
|
||||
return "Connecting not successful (training error)";
|
||||
case 0x3313:
|
||||
return "Disconnected before transfer (remote station does not support transfer mode, e.g. resolution)";
|
||||
case 0x3314:
|
||||
return "Disconnected during transfer (remote abort)";
|
||||
case 0x3315:
|
||||
return "Disconnected during transfer (remote procedure error, e.g. unsuccessful repetition of T.30 commands)";
|
||||
case 0x3316:
|
||||
return "Disconnected during transfer (local tx data underrun)";
|
||||
case 0x3317:
|
||||
return "Disconnected during transfer (local rx data overflow)";
|
||||
case 0x3318:
|
||||
return "Disconnected during transfer (local abort)";
|
||||
case 0x3319:
|
||||
return "Illegal parameter coding (e.g. SFF coding error)";
|
||||
case 0x3311:
|
||||
return "Connecting not successful (remote station is no FAX G3 machine)";
|
||||
case 0x3312:
|
||||
return "Connecting not successful (training error)";
|
||||
case 0x3313:
|
||||
return "Disconnected before transfer (remote station does not support transfer mode, e.g. resolution)";
|
||||
case 0x3314:
|
||||
return "Disconnected during transfer (remote abort)";
|
||||
case 0x3315:
|
||||
return "Disconnected during transfer (remote procedure error, e.g. unsuccessful repetition of T.30 commands)";
|
||||
case 0x3316:
|
||||
return "Disconnected during transfer (local tx data underrun)";
|
||||
case 0x3317:
|
||||
return "Disconnected during transfer (local rx data overflow)";
|
||||
case 0x3318:
|
||||
return "Disconnected during transfer (local abort)";
|
||||
case 0x3319:
|
||||
return "Illegal parameter coding (e.g. SFF coding error)";
|
||||
|
||||
/*-- disconnect causes from the network according to ETS 300 102-1/Q.931 -----*/
|
||||
case 0x3481: return "Unallocated (unassigned) number";
|
||||
case 0x3482: return "No route to specified transit network";
|
||||
case 0x3483: return "No route to destination";
|
||||
case 0x3486: return "Channel unacceptable";
|
||||
case 0x3487:
|
||||
return "Call awarded and being delivered in an established channel";
|
||||
case 0x3487:
|
||||
return "Call awarded and being delivered in an established channel";
|
||||
case 0x3490: return "Normal call clearing";
|
||||
case 0x3491: return "User busy";
|
||||
case 0x3492: return "No user responding";
|
||||
|
@ -217,7 +217,7 @@ char *capi_info2str(u16 reason)
|
|||
case 0x34FF: return "Interworking, unspecified";
|
||||
|
||||
default: return "No additional information";
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -235,169 +235,169 @@ typedef struct {
|
|||
|
||||
static _cdef cdef[] =
|
||||
{
|
||||
/*00 */
|
||||
{_CEND},
|
||||
/*01 */
|
||||
{_CEND},
|
||||
/*02 */
|
||||
{_CEND},
|
||||
/*03 */
|
||||
{_CDWORD, offsetof(_cmsg, adr.adrController)},
|
||||
/*04 */
|
||||
{_CMSTRUCT, offsetof(_cmsg, AdditionalInfo)},
|
||||
/*05 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B1configuration)},
|
||||
/*06 */
|
||||
{_CWORD, offsetof(_cmsg, B1protocol)},
|
||||
/*07 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B2configuration)},
|
||||
/*08 */
|
||||
{_CWORD, offsetof(_cmsg, B2protocol)},
|
||||
/*09 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B3configuration)},
|
||||
/*0a */
|
||||
{_CWORD, offsetof(_cmsg, B3protocol)},
|
||||
/*0b */
|
||||
{_CSTRUCT, offsetof(_cmsg, BC)},
|
||||
/*0c */
|
||||
{_CSTRUCT, offsetof(_cmsg, BChannelinformation)},
|
||||
/*0d */
|
||||
{_CMSTRUCT, offsetof(_cmsg, BProtocol)},
|
||||
/*0e */
|
||||
{_CSTRUCT, offsetof(_cmsg, CalledPartyNumber)},
|
||||
/*0f */
|
||||
{_CSTRUCT, offsetof(_cmsg, CalledPartySubaddress)},
|
||||
/*10 */
|
||||
{_CSTRUCT, offsetof(_cmsg, CallingPartyNumber)},
|
||||
/*11 */
|
||||
{_CSTRUCT, offsetof(_cmsg, CallingPartySubaddress)},
|
||||
/*12 */
|
||||
{_CDWORD, offsetof(_cmsg, CIPmask)},
|
||||
/*13 */
|
||||
{_CDWORD, offsetof(_cmsg, CIPmask2)},
|
||||
/*14 */
|
||||
{_CWORD, offsetof(_cmsg, CIPValue)},
|
||||
/*15 */
|
||||
{_CDWORD, offsetof(_cmsg, Class)},
|
||||
/*16 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ConnectedNumber)},
|
||||
/*17 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ConnectedSubaddress)},
|
||||
/*18 */
|
||||
{_CDWORD, offsetof(_cmsg, Data)},
|
||||
/*19 */
|
||||
{_CWORD, offsetof(_cmsg, DataHandle)},
|
||||
/*1a */
|
||||
{_CWORD, offsetof(_cmsg, DataLength)},
|
||||
/*1b */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityConfirmationParameter)},
|
||||
/*1c */
|
||||
{_CSTRUCT, offsetof(_cmsg, Facilitydataarray)},
|
||||
/*1d */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityIndicationParameter)},
|
||||
/*1e */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityRequestParameter)},
|
||||
/*1f */
|
||||
{_CWORD, offsetof(_cmsg, FacilitySelector)},
|
||||
/*20 */
|
||||
{_CWORD, offsetof(_cmsg, Flags)},
|
||||
/*21 */
|
||||
{_CDWORD, offsetof(_cmsg, Function)},
|
||||
/*22 */
|
||||
{_CSTRUCT, offsetof(_cmsg, HLC)},
|
||||
/*23 */
|
||||
{_CWORD, offsetof(_cmsg, Info)},
|
||||
/*24 */
|
||||
{_CSTRUCT, offsetof(_cmsg, InfoElement)},
|
||||
/*25 */
|
||||
{_CDWORD, offsetof(_cmsg, InfoMask)},
|
||||
/*26 */
|
||||
{_CWORD, offsetof(_cmsg, InfoNumber)},
|
||||
/*27 */
|
||||
{_CSTRUCT, offsetof(_cmsg, Keypadfacility)},
|
||||
/*28 */
|
||||
{_CSTRUCT, offsetof(_cmsg, LLC)},
|
||||
/*29 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ManuData)},
|
||||
/*2a */
|
||||
{_CDWORD, offsetof(_cmsg, ManuID)},
|
||||
/*2b */
|
||||
{_CSTRUCT, offsetof(_cmsg, NCPI)},
|
||||
/*2c */
|
||||
{_CWORD, offsetof(_cmsg, Reason)},
|
||||
/*2d */
|
||||
{_CWORD, offsetof(_cmsg, Reason_B3)},
|
||||
/*2e */
|
||||
{_CWORD, offsetof(_cmsg, Reject)},
|
||||
/*2f */
|
||||
{_CSTRUCT, offsetof(_cmsg, Useruserdata)}
|
||||
/*00 */
|
||||
{_CEND},
|
||||
/*01 */
|
||||
{_CEND},
|
||||
/*02 */
|
||||
{_CEND},
|
||||
/*03 */
|
||||
{_CDWORD, offsetof(_cmsg, adr.adrController)},
|
||||
/*04 */
|
||||
{_CMSTRUCT, offsetof(_cmsg, AdditionalInfo)},
|
||||
/*05 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B1configuration)},
|
||||
/*06 */
|
||||
{_CWORD, offsetof(_cmsg, B1protocol)},
|
||||
/*07 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B2configuration)},
|
||||
/*08 */
|
||||
{_CWORD, offsetof(_cmsg, B2protocol)},
|
||||
/*09 */
|
||||
{_CSTRUCT, offsetof(_cmsg, B3configuration)},
|
||||
/*0a */
|
||||
{_CWORD, offsetof(_cmsg, B3protocol)},
|
||||
/*0b */
|
||||
{_CSTRUCT, offsetof(_cmsg, BC)},
|
||||
/*0c */
|
||||
{_CSTRUCT, offsetof(_cmsg, BChannelinformation)},
|
||||
/*0d */
|
||||
{_CMSTRUCT, offsetof(_cmsg, BProtocol)},
|
||||
/*0e */
|
||||
{_CSTRUCT, offsetof(_cmsg, CalledPartyNumber)},
|
||||
/*0f */
|
||||
{_CSTRUCT, offsetof(_cmsg, CalledPartySubaddress)},
|
||||
/*10 */
|
||||
{_CSTRUCT, offsetof(_cmsg, CallingPartyNumber)},
|
||||
/*11 */
|
||||
{_CSTRUCT, offsetof(_cmsg, CallingPartySubaddress)},
|
||||
/*12 */
|
||||
{_CDWORD, offsetof(_cmsg, CIPmask)},
|
||||
/*13 */
|
||||
{_CDWORD, offsetof(_cmsg, CIPmask2)},
|
||||
/*14 */
|
||||
{_CWORD, offsetof(_cmsg, CIPValue)},
|
||||
/*15 */
|
||||
{_CDWORD, offsetof(_cmsg, Class)},
|
||||
/*16 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ConnectedNumber)},
|
||||
/*17 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ConnectedSubaddress)},
|
||||
/*18 */
|
||||
{_CDWORD, offsetof(_cmsg, Data)},
|
||||
/*19 */
|
||||
{_CWORD, offsetof(_cmsg, DataHandle)},
|
||||
/*1a */
|
||||
{_CWORD, offsetof(_cmsg, DataLength)},
|
||||
/*1b */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityConfirmationParameter)},
|
||||
/*1c */
|
||||
{_CSTRUCT, offsetof(_cmsg, Facilitydataarray)},
|
||||
/*1d */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityIndicationParameter)},
|
||||
/*1e */
|
||||
{_CSTRUCT, offsetof(_cmsg, FacilityRequestParameter)},
|
||||
/*1f */
|
||||
{_CWORD, offsetof(_cmsg, FacilitySelector)},
|
||||
/*20 */
|
||||
{_CWORD, offsetof(_cmsg, Flags)},
|
||||
/*21 */
|
||||
{_CDWORD, offsetof(_cmsg, Function)},
|
||||
/*22 */
|
||||
{_CSTRUCT, offsetof(_cmsg, HLC)},
|
||||
/*23 */
|
||||
{_CWORD, offsetof(_cmsg, Info)},
|
||||
/*24 */
|
||||
{_CSTRUCT, offsetof(_cmsg, InfoElement)},
|
||||
/*25 */
|
||||
{_CDWORD, offsetof(_cmsg, InfoMask)},
|
||||
/*26 */
|
||||
{_CWORD, offsetof(_cmsg, InfoNumber)},
|
||||
/*27 */
|
||||
{_CSTRUCT, offsetof(_cmsg, Keypadfacility)},
|
||||
/*28 */
|
||||
{_CSTRUCT, offsetof(_cmsg, LLC)},
|
||||
/*29 */
|
||||
{_CSTRUCT, offsetof(_cmsg, ManuData)},
|
||||
/*2a */
|
||||
{_CDWORD, offsetof(_cmsg, ManuID)},
|
||||
/*2b */
|
||||
{_CSTRUCT, offsetof(_cmsg, NCPI)},
|
||||
/*2c */
|
||||
{_CWORD, offsetof(_cmsg, Reason)},
|
||||
/*2d */
|
||||
{_CWORD, offsetof(_cmsg, Reason_B3)},
|
||||
/*2e */
|
||||
{_CWORD, offsetof(_cmsg, Reject)},
|
||||
/*2f */
|
||||
{_CSTRUCT, offsetof(_cmsg, Useruserdata)}
|
||||
};
|
||||
|
||||
static unsigned char *cpars[] =
|
||||
{
|
||||
/* ALERT_REQ */ [0x01] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_REQ */ [0x02] = "\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* DISCONNECT_REQ */ [0x04] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* LISTEN_REQ */ [0x05] = "\x03\x25\x12\x13\x10\x11\x01",
|
||||
/* INFO_REQ */ [0x08] = "\x03\x0e\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* FACILITY_REQ */ [0x09] = "\x03\x1f\x1e\x01",
|
||||
/* SELECT_B_PROTOCOL_REQ */ [0x0a] = "\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01",
|
||||
/* CONNECT_B3_REQ */ [0x0b] = "\x03\x2b\x01",
|
||||
/* DISCONNECT_B3_REQ */ [0x0d] = "\x03\x2b\x01",
|
||||
/* DATA_B3_REQ */ [0x0f] = "\x03\x18\x1a\x19\x20\x01",
|
||||
/* RESET_B3_REQ */ [0x10] = "\x03\x2b\x01",
|
||||
/* ALERT_CONF */ [0x13] = "\x03\x23\x01",
|
||||
/* CONNECT_CONF */ [0x14] = "\x03\x23\x01",
|
||||
/* DISCONNECT_CONF */ [0x16] = "\x03\x23\x01",
|
||||
/* LISTEN_CONF */ [0x17] = "\x03\x23\x01",
|
||||
/* MANUFACTURER_REQ */ [0x18] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_CONF */ [0x1a] = "\x03\x23\x01",
|
||||
/* FACILITY_CONF */ [0x1b] = "\x03\x23\x1f\x1b\x01",
|
||||
/* SELECT_B_PROTOCOL_CONF */ [0x1c] = "\x03\x23\x01",
|
||||
/* CONNECT_B3_CONF */ [0x1d] = "\x03\x23\x01",
|
||||
/* DISCONNECT_B3_CONF */ [0x1f] = "\x03\x23\x01",
|
||||
/* DATA_B3_CONF */ [0x21] = "\x03\x19\x23\x01",
|
||||
/* RESET_B3_CONF */ [0x22] = "\x03\x23\x01",
|
||||
/* CONNECT_IND */ [0x26] = "\x03\x14\x0e\x10\x0f\x11\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_ACTIVE_IND */ [0x27] = "\x03\x16\x17\x28\x01",
|
||||
/* DISCONNECT_IND */ [0x28] = "\x03\x2c\x01",
|
||||
/* MANUFACTURER_CONF */ [0x2a] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_IND */ [0x2c] = "\x03\x26\x24\x01",
|
||||
/* FACILITY_IND */ [0x2d] = "\x03\x1f\x1d\x01",
|
||||
/* CONNECT_B3_IND */ [0x2f] = "\x03\x2b\x01",
|
||||
/* CONNECT_B3_ACTIVE_IND */ [0x30] = "\x03\x2b\x01",
|
||||
/* DISCONNECT_B3_IND */ [0x31] = "\x03\x2d\x2b\x01",
|
||||
/* DATA_B3_IND */ [0x33] = "\x03\x18\x1a\x19\x20\x01",
|
||||
/* RESET_B3_IND */ [0x34] = "\x03\x2b\x01",
|
||||
/* CONNECT_B3_T90_ACTIVE_IND */ [0x35] = "\x03\x2b\x01",
|
||||
/* CONNECT_RESP */ [0x38] = "\x03\x2e\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x28\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_ACTIVE_RESP */ [0x39] = "\x03\x01",
|
||||
/* DISCONNECT_RESP */ [0x3a] = "\x03\x01",
|
||||
/* MANUFACTURER_IND */ [0x3c] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_RESP */ [0x3e] = "\x03\x01",
|
||||
/* FACILITY_RESP */ [0x3f] = "\x03\x1f\x01",
|
||||
/* CONNECT_B3_RESP */ [0x41] = "\x03\x2e\x2b\x01",
|
||||
/* CONNECT_B3_ACTIVE_RESP */ [0x42] = "\x03\x01",
|
||||
/* DISCONNECT_B3_RESP */ [0x43] = "\x03\x01",
|
||||
/* DATA_B3_RESP */ [0x45] = "\x03\x19\x01",
|
||||
/* RESET_B3_RESP */ [0x46] = "\x03\x01",
|
||||
/* CONNECT_B3_T90_ACTIVE_RESP */ [0x47] = "\x03\x01",
|
||||
/* MANUFACTURER_RESP */ [0x4e] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* ALERT_REQ */ [0x01] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_REQ */ [0x02] = "\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* DISCONNECT_REQ */ [0x04] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* LISTEN_REQ */ [0x05] = "\x03\x25\x12\x13\x10\x11\x01",
|
||||
/* INFO_REQ */ [0x08] = "\x03\x0e\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* FACILITY_REQ */ [0x09] = "\x03\x1f\x1e\x01",
|
||||
/* SELECT_B_PROTOCOL_REQ */ [0x0a] = "\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01",
|
||||
/* CONNECT_B3_REQ */ [0x0b] = "\x03\x2b\x01",
|
||||
/* DISCONNECT_B3_REQ */ [0x0d] = "\x03\x2b\x01",
|
||||
/* DATA_B3_REQ */ [0x0f] = "\x03\x18\x1a\x19\x20\x01",
|
||||
/* RESET_B3_REQ */ [0x10] = "\x03\x2b\x01",
|
||||
/* ALERT_CONF */ [0x13] = "\x03\x23\x01",
|
||||
/* CONNECT_CONF */ [0x14] = "\x03\x23\x01",
|
||||
/* DISCONNECT_CONF */ [0x16] = "\x03\x23\x01",
|
||||
/* LISTEN_CONF */ [0x17] = "\x03\x23\x01",
|
||||
/* MANUFACTURER_REQ */ [0x18] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_CONF */ [0x1a] = "\x03\x23\x01",
|
||||
/* FACILITY_CONF */ [0x1b] = "\x03\x23\x1f\x1b\x01",
|
||||
/* SELECT_B_PROTOCOL_CONF */ [0x1c] = "\x03\x23\x01",
|
||||
/* CONNECT_B3_CONF */ [0x1d] = "\x03\x23\x01",
|
||||
/* DISCONNECT_B3_CONF */ [0x1f] = "\x03\x23\x01",
|
||||
/* DATA_B3_CONF */ [0x21] = "\x03\x19\x23\x01",
|
||||
/* RESET_B3_CONF */ [0x22] = "\x03\x23\x01",
|
||||
/* CONNECT_IND */ [0x26] = "\x03\x14\x0e\x10\x0f\x11\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_ACTIVE_IND */ [0x27] = "\x03\x16\x17\x28\x01",
|
||||
/* DISCONNECT_IND */ [0x28] = "\x03\x2c\x01",
|
||||
/* MANUFACTURER_CONF */ [0x2a] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_IND */ [0x2c] = "\x03\x26\x24\x01",
|
||||
/* FACILITY_IND */ [0x2d] = "\x03\x1f\x1d\x01",
|
||||
/* CONNECT_B3_IND */ [0x2f] = "\x03\x2b\x01",
|
||||
/* CONNECT_B3_ACTIVE_IND */ [0x30] = "\x03\x2b\x01",
|
||||
/* DISCONNECT_B3_IND */ [0x31] = "\x03\x2d\x2b\x01",
|
||||
/* DATA_B3_IND */ [0x33] = "\x03\x18\x1a\x19\x20\x01",
|
||||
/* RESET_B3_IND */ [0x34] = "\x03\x2b\x01",
|
||||
/* CONNECT_B3_T90_ACTIVE_IND */ [0x35] = "\x03\x2b\x01",
|
||||
/* CONNECT_RESP */ [0x38] = "\x03\x2e\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x28\x04\x0c\x27\x2f\x1c\x01\x01",
|
||||
/* CONNECT_ACTIVE_RESP */ [0x39] = "\x03\x01",
|
||||
/* DISCONNECT_RESP */ [0x3a] = "\x03\x01",
|
||||
/* MANUFACTURER_IND */ [0x3c] = "\x03\x2a\x15\x21\x29\x01",
|
||||
/* INFO_RESP */ [0x3e] = "\x03\x01",
|
||||
/* FACILITY_RESP */ [0x3f] = "\x03\x1f\x01",
|
||||
/* CONNECT_B3_RESP */ [0x41] = "\x03\x2e\x2b\x01",
|
||||
/* CONNECT_B3_ACTIVE_RESP */ [0x42] = "\x03\x01",
|
||||
/* DISCONNECT_B3_RESP */ [0x43] = "\x03\x01",
|
||||
/* DATA_B3_RESP */ [0x45] = "\x03\x19\x01",
|
||||
/* RESET_B3_RESP */ [0x46] = "\x03\x01",
|
||||
/* CONNECT_B3_T90_ACTIVE_RESP */ [0x47] = "\x03\x01",
|
||||
/* MANUFACTURER_RESP */ [0x4e] = "\x03\x2a\x15\x21\x29\x01",
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
|
||||
#define byteTLcpy(x,y) *(u8 *)(x)=*(u8 *)(y);
|
||||
#define wordTLcpy(x,y) *(u16 *)(x)=*(u16 *)(y);
|
||||
#define dwordTLcpy(x,y) memcpy(x,y,4);
|
||||
#define structTLcpy(x,y,l) memcpy (x,y,l)
|
||||
#define structTLcpyovl(x,y,l) memmove (x,y,l)
|
||||
#define byteTLcpy(x, y) *(u8 *)(x) = *(u8 *)(y);
|
||||
#define wordTLcpy(x, y) *(u16 *)(x) = *(u16 *)(y);
|
||||
#define dwordTLcpy(x, y) memcpy(x, y, 4);
|
||||
#define structTLcpy(x, y, l) memcpy(x, y, l)
|
||||
#define structTLcpyovl(x, y, l) memmove(x, y, l)
|
||||
|
||||
#define byteTRcpy(x,y) *(u8 *)(y)=*(u8 *)(x);
|
||||
#define wordTRcpy(x,y) *(u16 *)(y)=*(u16 *)(x);
|
||||
#define dwordTRcpy(x,y) memcpy(y,x,4);
|
||||
#define structTRcpy(x,y,l) memcpy (y,x,l)
|
||||
#define structTRcpyovl(x,y,l) memmove (y,x,l)
|
||||
#define byteTRcpy(x, y) *(u8 *)(y) = *(u8 *)(x);
|
||||
#define wordTRcpy(x, y) *(u16 *)(y) = *(u16 *)(x);
|
||||
#define dwordTRcpy(x, y) memcpy(y, x, 4);
|
||||
#define structTRcpy(x, y, l) memcpy(y, x, l)
|
||||
#define structTRcpyovl(x, y, l) memmove(y, x, l)
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
static unsigned command_2_index(unsigned c, unsigned sc)
|
||||
|
@ -414,9 +414,9 @@ static unsigned command_2_index(unsigned c, unsigned sc)
|
|||
|
||||
/*-------------------------------------------------------*/
|
||||
#define TYP (cdef[cmsg->par[cmsg->p]].typ)
|
||||
#define OFF (((u8 *)cmsg)+cdef[cmsg->par[cmsg->p]].off)
|
||||
#define OFF (((u8 *)cmsg) + cdef[cmsg->par[cmsg->p]].off)
|
||||
|
||||
static void jumpcstruct(_cmsg * cmsg)
|
||||
static void jumpcstruct(_cmsg *cmsg)
|
||||
{
|
||||
unsigned layer;
|
||||
for (cmsg->p++, layer = 1; layer;) {
|
||||
|
@ -433,7 +433,7 @@ static void jumpcstruct(_cmsg * cmsg)
|
|||
}
|
||||
}
|
||||
/*-------------------------------------------------------*/
|
||||
static void pars_2_message(_cmsg * cmsg)
|
||||
static void pars_2_message(_cmsg *cmsg)
|
||||
{
|
||||
|
||||
for (; TYP != _CEND; cmsg->p++) {
|
||||
|
@ -499,7 +499,7 @@ static void pars_2_message(_cmsg * cmsg)
|
|||
* Return value: 0 for success
|
||||
*/
|
||||
|
||||
unsigned capi_cmsg2message(_cmsg * cmsg, u8 * msg)
|
||||
unsigned capi_cmsg2message(_cmsg *cmsg, u8 *msg)
|
||||
{
|
||||
cmsg->m = msg;
|
||||
cmsg->l = 8;
|
||||
|
@ -518,7 +518,7 @@ unsigned capi_cmsg2message(_cmsg * cmsg, u8 * msg)
|
|||
}
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
static void message_2_pars(_cmsg * cmsg)
|
||||
static void message_2_pars(_cmsg *cmsg)
|
||||
{
|
||||
for (; TYP != _CEND; cmsg->p++) {
|
||||
|
||||
|
@ -569,7 +569,7 @@ static void message_2_pars(_cmsg * cmsg)
|
|||
* Return value: 0 for success
|
||||
*/
|
||||
|
||||
unsigned capi_message2cmsg(_cmsg * cmsg, u8 * msg)
|
||||
unsigned capi_message2cmsg(_cmsg *cmsg, u8 *msg)
|
||||
{
|
||||
memset(cmsg, 0, sizeof(_cmsg));
|
||||
cmsg->m = msg;
|
||||
|
@ -600,7 +600,7 @@ unsigned capi_message2cmsg(_cmsg * cmsg, u8 * msg)
|
|||
* Return value: 0 for success
|
||||
*/
|
||||
|
||||
unsigned capi_cmsg_header(_cmsg * cmsg, u16 _ApplId,
|
||||
unsigned capi_cmsg_header(_cmsg *cmsg, u16 _ApplId,
|
||||
u8 _Command, u8 _Subcommand,
|
||||
u16 _Messagenumber, u32 _Controller)
|
||||
{
|
||||
|
@ -689,54 +689,54 @@ char *capi_cmd2str(u8 cmd, u8 subcmd)
|
|||
|
||||
static char *pnames[] =
|
||||
{
|
||||
/*00 */ NULL,
|
||||
/*01 */ NULL,
|
||||
/*02 */ NULL,
|
||||
/*03 */ "Controller/PLCI/NCCI",
|
||||
/*04 */ "AdditionalInfo",
|
||||
/*05 */ "B1configuration",
|
||||
/*06 */ "B1protocol",
|
||||
/*07 */ "B2configuration",
|
||||
/*08 */ "B2protocol",
|
||||
/*09 */ "B3configuration",
|
||||
/*0a */ "B3protocol",
|
||||
/*0b */ "BC",
|
||||
/*0c */ "BChannelinformation",
|
||||
/*0d */ "BProtocol",
|
||||
/*0e */ "CalledPartyNumber",
|
||||
/*0f */ "CalledPartySubaddress",
|
||||
/*10 */ "CallingPartyNumber",
|
||||
/*11 */ "CallingPartySubaddress",
|
||||
/*12 */ "CIPmask",
|
||||
/*13 */ "CIPmask2",
|
||||
/*14 */ "CIPValue",
|
||||
/*15 */ "Class",
|
||||
/*16 */ "ConnectedNumber",
|
||||
/*17 */ "ConnectedSubaddress",
|
||||
/*18 */ "Data32",
|
||||
/*19 */ "DataHandle",
|
||||
/*1a */ "DataLength",
|
||||
/*1b */ "FacilityConfirmationParameter",
|
||||
/*1c */ "Facilitydataarray",
|
||||
/*1d */ "FacilityIndicationParameter",
|
||||
/*1e */ "FacilityRequestParameter",
|
||||
/*1f */ "FacilitySelector",
|
||||
/*20 */ "Flags",
|
||||
/*21 */ "Function",
|
||||
/*22 */ "HLC",
|
||||
/*23 */ "Info",
|
||||
/*24 */ "InfoElement",
|
||||
/*25 */ "InfoMask",
|
||||
/*26 */ "InfoNumber",
|
||||
/*27 */ "Keypadfacility",
|
||||
/*28 */ "LLC",
|
||||
/*29 */ "ManuData",
|
||||
/*2a */ "ManuID",
|
||||
/*2b */ "NCPI",
|
||||
/*2c */ "Reason",
|
||||
/*2d */ "Reason_B3",
|
||||
/*2e */ "Reject",
|
||||
/*2f */ "Useruserdata"
|
||||
/*00 */ NULL,
|
||||
/*01 */ NULL,
|
||||
/*02 */ NULL,
|
||||
/*03 */ "Controller/PLCI/NCCI",
|
||||
/*04 */ "AdditionalInfo",
|
||||
/*05 */ "B1configuration",
|
||||
/*06 */ "B1protocol",
|
||||
/*07 */ "B2configuration",
|
||||
/*08 */ "B2protocol",
|
||||
/*09 */ "B3configuration",
|
||||
/*0a */ "B3protocol",
|
||||
/*0b */ "BC",
|
||||
/*0c */ "BChannelinformation",
|
||||
/*0d */ "BProtocol",
|
||||
/*0e */ "CalledPartyNumber",
|
||||
/*0f */ "CalledPartySubaddress",
|
||||
/*10 */ "CallingPartyNumber",
|
||||
/*11 */ "CallingPartySubaddress",
|
||||
/*12 */ "CIPmask",
|
||||
/*13 */ "CIPmask2",
|
||||
/*14 */ "CIPValue",
|
||||
/*15 */ "Class",
|
||||
/*16 */ "ConnectedNumber",
|
||||
/*17 */ "ConnectedSubaddress",
|
||||
/*18 */ "Data32",
|
||||
/*19 */ "DataHandle",
|
||||
/*1a */ "DataLength",
|
||||
/*1b */ "FacilityConfirmationParameter",
|
||||
/*1c */ "Facilitydataarray",
|
||||
/*1d */ "FacilityIndicationParameter",
|
||||
/*1e */ "FacilityRequestParameter",
|
||||
/*1f */ "FacilitySelector",
|
||||
/*20 */ "Flags",
|
||||
/*21 */ "Function",
|
||||
/*22 */ "HLC",
|
||||
/*23 */ "Info",
|
||||
/*24 */ "InfoElement",
|
||||
/*25 */ "InfoMask",
|
||||
/*26 */ "InfoNumber",
|
||||
/*27 */ "Keypadfacility",
|
||||
/*28 */ "LLC",
|
||||
/*29 */ "ManuData",
|
||||
/*2a */ "ManuID",
|
||||
/*2b */ "NCPI",
|
||||
/*2c */ "Reason",
|
||||
/*2d */ "Reason_B3",
|
||||
/*2e */ "Reject",
|
||||
/*2f */ "Useruserdata"
|
||||
};
|
||||
|
||||
|
||||
|
@ -744,10 +744,10 @@ static char *pnames[] =
|
|||
#include <stdarg.h>
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt,...)
|
||||
static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt, ...)
|
||||
{
|
||||
va_list f;
|
||||
size_t n,r;
|
||||
size_t n, r;
|
||||
|
||||
if (!cdb)
|
||||
return NULL;
|
||||
|
@ -783,7 +783,7 @@ static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt,...)
|
|||
return cdb;
|
||||
}
|
||||
|
||||
static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 * m, unsigned len)
|
||||
static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 *m, unsigned len)
|
||||
{
|
||||
unsigned hex = 0;
|
||||
|
||||
|
@ -807,7 +807,7 @@ static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 * m, unsigned len)
|
|||
return cdb;
|
||||
}
|
||||
|
||||
static _cdebbuf *printstruct(_cdebbuf *cdb, u8 * m)
|
||||
static _cdebbuf *printstruct(_cdebbuf *cdb, u8 *m)
|
||||
{
|
||||
unsigned len;
|
||||
|
||||
|
@ -940,7 +940,7 @@ void cdebbuf_free(_cdebbuf *cdb)
|
|||
* The returned buffer should be freed by a call to cdebbuf_free() after use.
|
||||
*/
|
||||
|
||||
_cdebbuf *capi_message2str(u8 * msg)
|
||||
_cdebbuf *capi_message2str(u8 *msg)
|
||||
{
|
||||
_cdebbuf *cdb;
|
||||
_cmsg *cmsg;
|
||||
|
@ -964,10 +964,10 @@ _cdebbuf *capi_message2str(u8 * msg)
|
|||
cmsg->par = cpars[command_2_index(cmsg->Command, cmsg->Subcommand)];
|
||||
|
||||
cdb = bufprint(cdb, "%-26s ID=%03d #0x%04x LEN=%04d\n",
|
||||
mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
|
||||
((unsigned short *) msg)[1],
|
||||
((unsigned short *) msg)[3],
|
||||
((unsigned short *) msg)[0]);
|
||||
mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
|
||||
((unsigned short *) msg)[1],
|
||||
((unsigned short *) msg)[3],
|
||||
((unsigned short *) msg)[0]);
|
||||
|
||||
cdb = protocol_message_2_pars(cdb, cmsg, 1);
|
||||
if (unlikely(cmsg != g_cmsg))
|
||||
|
@ -986,7 +986,7 @@ _cdebbuf *capi_message2str(u8 * msg)
|
|||
* The returned buffer should be freed by a call to cdebbuf_free() after use.
|
||||
*/
|
||||
|
||||
_cdebbuf *capi_cmsg2str(_cmsg * cmsg)
|
||||
_cdebbuf *capi_cmsg2str(_cmsg *cmsg)
|
||||
{
|
||||
_cdebbuf *cdb;
|
||||
|
||||
|
@ -998,17 +998,17 @@ _cdebbuf *capi_cmsg2str(_cmsg * cmsg)
|
|||
cmsg->l = 8;
|
||||
cmsg->p = 0;
|
||||
cdb = bufprint(cdb, "%s ID=%03d #0x%04x LEN=%04d\n",
|
||||
mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
|
||||
((u16 *) cmsg->m)[1],
|
||||
((u16 *) cmsg->m)[3],
|
||||
((u16 *) cmsg->m)[0]);
|
||||
mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
|
||||
((u16 *) cmsg->m)[1],
|
||||
((u16 *) cmsg->m)[3],
|
||||
((u16 *) cmsg->m)[0]);
|
||||
cdb = protocol_message_2_pars(cdb, cmsg, 1);
|
||||
return cdb;
|
||||
}
|
||||
|
||||
int __init cdebug_init(void)
|
||||
{
|
||||
g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL);
|
||||
g_cmsg = kmalloc(sizeof(_cmsg), GFP_KERNEL);
|
||||
if (!g_cmsg)
|
||||
return -ENOMEM;
|
||||
g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL);
|
||||
|
@ -1041,12 +1041,12 @@ void __exit cdebug_exit(void)
|
|||
|
||||
static _cdebbuf g_debbuf = {"CONFIG_CAPI_TRACE not enabled", NULL, 0, 0};
|
||||
|
||||
_cdebbuf *capi_message2str(u8 * msg)
|
||||
_cdebbuf *capi_message2str(u8 *msg)
|
||||
{
|
||||
return &g_debbuf;
|
||||
}
|
||||
|
||||
_cdebbuf *capi_cmsg2str(_cmsg * cmsg)
|
||||
_cdebbuf *capi_cmsg2str(_cmsg *cmsg)
|
||||
{
|
||||
return &g_debbuf;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue