Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits) bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL. vlan: Calling vlan_hwaccel_do_receive() is always valid. tproxy: use the interface primary IP address as a default value for --on-ip tproxy: added IPv6 support to the socket match cxgb3: function namespace cleanup tproxy: added IPv6 support to the TPROXY target tproxy: added IPv6 socket lookup function to nf_tproxy_core be2net: Changes to use only priority codes allowed by f/w tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled tproxy: added tproxy sockopt interface in the IPV6 layer tproxy: added udp6_lib_lookup function tproxy: added const specifiers to udp lookup functions tproxy: split off ipv6 defragmentation to a separate module l2tp: small cleanup nf_nat: restrict ICMP translation for embedded header can: mcp251x: fix generation of error frames can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set can-raw: add msg_flags to distinguish local traffic 9p: client code cleanup rds: make local functions/variables static ... Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and drivers/net/wireless/ath/ath9k/debug.c as per David
This commit is contained in:
commit
5f05647dd8
|
@ -0,0 +1,495 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE set PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||
<set>
|
||||
<setinfo>
|
||||
<title>The 802.11 subsystems – for kernel developers</title>
|
||||
<subtitle>
|
||||
Explaining wireless 802.11 networking in the Linux kernel
|
||||
</subtitle>
|
||||
|
||||
<copyright>
|
||||
<year>2007-2009</year>
|
||||
<holder>Johannes Berg</holder>
|
||||
</copyright>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Johannes</firstname>
|
||||
<surname>Berg</surname>
|
||||
<affiliation>
|
||||
<address><email>johannes@sipsolutions.net</email></address>
|
||||
</affiliation>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
This documentation is free software; you can redistribute
|
||||
it and/or modify it under the terms of the GNU General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
</para>
|
||||
<para>
|
||||
This documentation is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
</para>
|
||||
<para>
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this documentation; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
MA 02111-1307 USA
|
||||
</para>
|
||||
<para>
|
||||
For more details see the file COPYING in the source
|
||||
distribution of Linux.
|
||||
</para>
|
||||
</legalnotice>
|
||||
|
||||
<abstract>
|
||||
<para>
|
||||
These books attempt to give a description of the
|
||||
various subsystems that play a role in 802.11 wireless
|
||||
networking in Linux. Since these books are for kernel
|
||||
developers they attempts to document the structures
|
||||
and functions used in the kernel as well as giving a
|
||||
higher-level overview.
|
||||
</para>
|
||||
<para>
|
||||
The reader is expected to be familiar with the 802.11
|
||||
standard as published by the IEEE in 802.11-2007 (or
|
||||
possibly later versions). References to this standard
|
||||
will be given as "802.11-2007 8.1.5".
|
||||
</para>
|
||||
</abstract>
|
||||
</setinfo>
|
||||
<book id="cfg80211-developers-guide">
|
||||
<bookinfo>
|
||||
<title>The cfg80211 subsystem</title>
|
||||
|
||||
<abstract>
|
||||
!Pinclude/net/cfg80211.h Introduction
|
||||
</abstract>
|
||||
</bookinfo>
|
||||
<chapter>
|
||||
<title>Device registration</title>
|
||||
!Pinclude/net/cfg80211.h Device registration
|
||||
!Finclude/net/cfg80211.h ieee80211_band
|
||||
!Finclude/net/cfg80211.h ieee80211_channel_flags
|
||||
!Finclude/net/cfg80211.h ieee80211_channel
|
||||
!Finclude/net/cfg80211.h ieee80211_rate_flags
|
||||
!Finclude/net/cfg80211.h ieee80211_rate
|
||||
!Finclude/net/cfg80211.h ieee80211_sta_ht_cap
|
||||
!Finclude/net/cfg80211.h ieee80211_supported_band
|
||||
!Finclude/net/cfg80211.h cfg80211_signal_type
|
||||
!Finclude/net/cfg80211.h wiphy_params_flags
|
||||
!Finclude/net/cfg80211.h wiphy_flags
|
||||
!Finclude/net/cfg80211.h wiphy
|
||||
!Finclude/net/cfg80211.h wireless_dev
|
||||
!Finclude/net/cfg80211.h wiphy_new
|
||||
!Finclude/net/cfg80211.h wiphy_register
|
||||
!Finclude/net/cfg80211.h wiphy_unregister
|
||||
!Finclude/net/cfg80211.h wiphy_free
|
||||
|
||||
!Finclude/net/cfg80211.h wiphy_name
|
||||
!Finclude/net/cfg80211.h wiphy_dev
|
||||
!Finclude/net/cfg80211.h wiphy_priv
|
||||
!Finclude/net/cfg80211.h priv_to_wiphy
|
||||
!Finclude/net/cfg80211.h set_wiphy_dev
|
||||
!Finclude/net/cfg80211.h wdev_priv
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Actions and configuration</title>
|
||||
!Pinclude/net/cfg80211.h Actions and configuration
|
||||
!Finclude/net/cfg80211.h cfg80211_ops
|
||||
!Finclude/net/cfg80211.h vif_params
|
||||
!Finclude/net/cfg80211.h key_params
|
||||
!Finclude/net/cfg80211.h survey_info_flags
|
||||
!Finclude/net/cfg80211.h survey_info
|
||||
!Finclude/net/cfg80211.h beacon_parameters
|
||||
!Finclude/net/cfg80211.h plink_actions
|
||||
!Finclude/net/cfg80211.h station_parameters
|
||||
!Finclude/net/cfg80211.h station_info_flags
|
||||
!Finclude/net/cfg80211.h rate_info_flags
|
||||
!Finclude/net/cfg80211.h rate_info
|
||||
!Finclude/net/cfg80211.h station_info
|
||||
!Finclude/net/cfg80211.h monitor_flags
|
||||
!Finclude/net/cfg80211.h mpath_info_flags
|
||||
!Finclude/net/cfg80211.h mpath_info
|
||||
!Finclude/net/cfg80211.h bss_parameters
|
||||
!Finclude/net/cfg80211.h ieee80211_txq_params
|
||||
!Finclude/net/cfg80211.h cfg80211_crypto_settings
|
||||
!Finclude/net/cfg80211.h cfg80211_auth_request
|
||||
!Finclude/net/cfg80211.h cfg80211_assoc_request
|
||||
!Finclude/net/cfg80211.h cfg80211_deauth_request
|
||||
!Finclude/net/cfg80211.h cfg80211_disassoc_request
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_params
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_params
|
||||
!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
|
||||
!Finclude/net/cfg80211.h __cfg80211_send_deauth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h __cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_result
|
||||
!Finclude/net/cfg80211.h cfg80211_roamed
|
||||
!Finclude/net/cfg80211.h cfg80211_disconnected
|
||||
!Finclude/net/cfg80211.h cfg80211_ready_on_channel
|
||||
!Finclude/net/cfg80211.h cfg80211_remain_on_channel_expired
|
||||
!Finclude/net/cfg80211.h cfg80211_new_sta
|
||||
!Finclude/net/cfg80211.h cfg80211_rx_mgmt
|
||||
!Finclude/net/cfg80211.h cfg80211_mgmt_tx_status
|
||||
!Finclude/net/cfg80211.h cfg80211_cqm_rssi_notify
|
||||
!Finclude/net/cfg80211.h cfg80211_michael_mic_failure
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Scanning and BSS list handling</title>
|
||||
!Pinclude/net/cfg80211.h Scanning and BSS list handling
|
||||
!Finclude/net/cfg80211.h cfg80211_ssid
|
||||
!Finclude/net/cfg80211.h cfg80211_scan_request
|
||||
!Finclude/net/cfg80211.h cfg80211_scan_done
|
||||
!Finclude/net/cfg80211.h cfg80211_bss
|
||||
!Finclude/net/cfg80211.h cfg80211_inform_bss_frame
|
||||
!Finclude/net/cfg80211.h cfg80211_inform_bss
|
||||
!Finclude/net/cfg80211.h cfg80211_unlink_bss
|
||||
!Finclude/net/cfg80211.h cfg80211_find_ie
|
||||
!Finclude/net/cfg80211.h ieee80211_bss_get_ie
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Utility functions</title>
|
||||
!Pinclude/net/cfg80211.h Utility functions
|
||||
!Finclude/net/cfg80211.h ieee80211_channel_to_frequency
|
||||
!Finclude/net/cfg80211.h ieee80211_frequency_to_channel
|
||||
!Finclude/net/cfg80211.h ieee80211_get_channel
|
||||
!Finclude/net/cfg80211.h ieee80211_get_response_rate
|
||||
!Finclude/net/cfg80211.h ieee80211_hdrlen
|
||||
!Finclude/net/cfg80211.h ieee80211_get_hdrlen_from_skb
|
||||
!Finclude/net/cfg80211.h ieee80211_radiotap_iterator
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Data path helpers</title>
|
||||
!Pinclude/net/cfg80211.h Data path helpers
|
||||
!Finclude/net/cfg80211.h ieee80211_data_to_8023
|
||||
!Finclude/net/cfg80211.h ieee80211_data_from_8023
|
||||
!Finclude/net/cfg80211.h ieee80211_amsdu_to_8023s
|
||||
!Finclude/net/cfg80211.h cfg80211_classify8021d
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Regulatory enforcement infrastructure</title>
|
||||
!Pinclude/net/cfg80211.h Regulatory enforcement infrastructure
|
||||
!Finclude/net/cfg80211.h regulatory_hint
|
||||
!Finclude/net/cfg80211.h wiphy_apply_custom_regulatory
|
||||
!Finclude/net/cfg80211.h freq_reg_info
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>RFkill integration</title>
|
||||
!Pinclude/net/cfg80211.h RFkill integration
|
||||
!Finclude/net/cfg80211.h wiphy_rfkill_set_hw_state
|
||||
!Finclude/net/cfg80211.h wiphy_rfkill_start_polling
|
||||
!Finclude/net/cfg80211.h wiphy_rfkill_stop_polling
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Test mode</title>
|
||||
!Pinclude/net/cfg80211.h Test mode
|
||||
!Finclude/net/cfg80211.h cfg80211_testmode_alloc_reply_skb
|
||||
!Finclude/net/cfg80211.h cfg80211_testmode_reply
|
||||
!Finclude/net/cfg80211.h cfg80211_testmode_alloc_event_skb
|
||||
!Finclude/net/cfg80211.h cfg80211_testmode_event
|
||||
</chapter>
|
||||
</book>
|
||||
<book id="mac80211-developers-guide">
|
||||
<bookinfo>
|
||||
<title>The mac80211 subsystem</title>
|
||||
<abstract>
|
||||
!Pinclude/net/mac80211.h Introduction
|
||||
!Pinclude/net/mac80211.h Warning
|
||||
</abstract>
|
||||
</bookinfo>
|
||||
|
||||
<toc></toc>
|
||||
|
||||
<!--
|
||||
Generally, this document shall be ordered by increasing complexity.
|
||||
It is important to note that readers should be able to read only
|
||||
the first few sections to get a working driver and only advanced
|
||||
usage should require reading the full document.
|
||||
-->
|
||||
|
||||
<part>
|
||||
<title>The basic mac80211 driver interface</title>
|
||||
<partintro>
|
||||
<para>
|
||||
You should read and understand the information contained
|
||||
within this part of the book while implementing a driver.
|
||||
In some chapters, advanced usage is noted, that may be
|
||||
skipped at first.
|
||||
</para>
|
||||
<para>
|
||||
This part of the book only covers station and monitor mode
|
||||
functionality, additional information required to implement
|
||||
the other modes is covered in the second part of the book.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="basics">
|
||||
<title>Basic hardware handling</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter shall contain information on getting a hw
|
||||
struct allocated and registered with mac80211.
|
||||
</para>
|
||||
<para>
|
||||
Since it is required to allocate rates/modes before registering
|
||||
a hw struct, this chapter shall also contain information on setting
|
||||
up the rate/mode structs.
|
||||
</para>
|
||||
<para>
|
||||
Additionally, some discussion about the callbacks and
|
||||
the general programming model should be in here, including
|
||||
the definition of ieee80211_ops which will be referred to
|
||||
a lot.
|
||||
</para>
|
||||
<para>
|
||||
Finally, a discussion of hardware capabilities should be done
|
||||
with references to other parts of the book.
|
||||
</para>
|
||||
<!-- intentionally multiple !F lines to get proper order -->
|
||||
!Finclude/net/mac80211.h ieee80211_hw
|
||||
!Finclude/net/mac80211.h ieee80211_hw_flags
|
||||
!Finclude/net/mac80211.h SET_IEEE80211_DEV
|
||||
!Finclude/net/mac80211.h SET_IEEE80211_PERM_ADDR
|
||||
!Finclude/net/mac80211.h ieee80211_ops
|
||||
!Finclude/net/mac80211.h ieee80211_alloc_hw
|
||||
!Finclude/net/mac80211.h ieee80211_register_hw
|
||||
!Finclude/net/mac80211.h ieee80211_get_tx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_rx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_radio_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_unregister_hw
|
||||
!Finclude/net/mac80211.h ieee80211_free_hw
|
||||
</chapter>
|
||||
|
||||
<chapter id="phy-handling">
|
||||
<title>PHY configuration</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter should describe PHY handling including
|
||||
start/stop callbacks and the various structures used.
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_conf
|
||||
!Finclude/net/mac80211.h ieee80211_conf_flags
|
||||
</chapter>
|
||||
|
||||
<chapter id="iface-handling">
|
||||
<title>Virtual interfaces</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter should describe virtual interface basics
|
||||
that are relevant to the driver (VLANs, MGMT etc are not.)
|
||||
It should explain the use of the add_iface/remove_iface
|
||||
callbacks as well as the interface configuration callbacks.
|
||||
</para>
|
||||
<para>Things related to AP mode should be discussed there.</para>
|
||||
<para>
|
||||
Things related to supporting multiple interfaces should be
|
||||
in the appropriate chapter, a BIG FAT note should be here about
|
||||
this though and the recommendation to allow only a single
|
||||
interface in STA mode at first!
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_vif
|
||||
</chapter>
|
||||
|
||||
<chapter id="rx-tx">
|
||||
<title>Receive and transmit processing</title>
|
||||
<sect1>
|
||||
<title>what should be here</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This should describe the receive and transmit
|
||||
paths in mac80211/the drivers as well as
|
||||
transmit status handling.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Frame format</title>
|
||||
!Pinclude/net/mac80211.h Frame format
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Packet alignment</title>
|
||||
!Pnet/mac80211/rx.c Packet alignment
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Calling into mac80211 from interrupts</title>
|
||||
!Pinclude/net/mac80211.h Calling mac80211 from interrupts
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>functions/definitions</title>
|
||||
!Finclude/net/mac80211.h ieee80211_rx_status
|
||||
!Finclude/net/mac80211.h mac80211_rx_flags
|
||||
!Finclude/net/mac80211.h ieee80211_tx_info
|
||||
!Finclude/net/mac80211.h ieee80211_rx
|
||||
!Finclude/net/mac80211.h ieee80211_rx_irqsafe
|
||||
!Finclude/net/mac80211.h ieee80211_tx_status
|
||||
!Finclude/net/mac80211.h ieee80211_tx_status_irqsafe
|
||||
!Finclude/net/mac80211.h ieee80211_rts_get
|
||||
!Finclude/net/mac80211.h ieee80211_rts_duration
|
||||
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
||||
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
||||
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
||||
!Finclude/net/mac80211.h ieee80211_wake_queue
|
||||
!Finclude/net/mac80211.h ieee80211_stop_queue
|
||||
!Finclude/net/mac80211.h ieee80211_wake_queues
|
||||
!Finclude/net/mac80211.h ieee80211_stop_queues
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="filters">
|
||||
<title>Frame filtering</title>
|
||||
!Pinclude/net/mac80211.h Frame filtering
|
||||
!Finclude/net/mac80211.h ieee80211_filter_flags
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="advanced">
|
||||
<title>Advanced driver interface</title>
|
||||
<partintro>
|
||||
<para>
|
||||
Information contained within this part of the book is
|
||||
of interest only for advanced interaction of mac80211
|
||||
with drivers to exploit more hardware capabilities and
|
||||
improve performance.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="hardware-crypto-offload">
|
||||
<title>Hardware crypto acceleration</title>
|
||||
!Pinclude/net/mac80211.h Hardware crypto acceleration
|
||||
<!-- intentionally multiple !F lines to get proper order -->
|
||||
!Finclude/net/mac80211.h set_key_cmd
|
||||
!Finclude/net/mac80211.h ieee80211_key_conf
|
||||
!Finclude/net/mac80211.h ieee80211_key_flags
|
||||
</chapter>
|
||||
|
||||
<chapter id="powersave">
|
||||
<title>Powersave support</title>
|
||||
!Pinclude/net/mac80211.h Powersave support
|
||||
</chapter>
|
||||
|
||||
<chapter id="beacon-filter">
|
||||
<title>Beacon filter support</title>
|
||||
!Pinclude/net/mac80211.h Beacon filter support
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_loss
|
||||
</chapter>
|
||||
|
||||
<chapter id="qos">
|
||||
<title>Multiple queues and QoS support</title>
|
||||
<para>TBD</para>
|
||||
!Finclude/net/mac80211.h ieee80211_tx_queue_params
|
||||
</chapter>
|
||||
|
||||
<chapter id="AP">
|
||||
<title>Access point mode support</title>
|
||||
<para>TBD</para>
|
||||
<para>Some parts of the if_conf should be discussed here instead</para>
|
||||
<para>
|
||||
Insert notes about VLAN interfaces with hw crypto here or
|
||||
in the hw crypto chapter.
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_get_buffered_bc
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_get
|
||||
</chapter>
|
||||
|
||||
<chapter id="multi-iface">
|
||||
<title>Supporting multiple virtual interfaces</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
Note: WDS with identical MAC address should almost always be OK
|
||||
</para>
|
||||
<para>
|
||||
Insert notes about having multiple virtual interfaces with
|
||||
different MAC addresses here, note which configurations are
|
||||
supported by mac80211, add notes about supporting hw crypto
|
||||
with it.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="hardware-scan-offload">
|
||||
<title>Hardware scan offload</title>
|
||||
<para>TBD</para>
|
||||
!Finclude/net/mac80211.h ieee80211_scan_completed
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="rate-control">
|
||||
<title>Rate control interface</title>
|
||||
<partintro>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This part of the book describes the rate control algorithm
|
||||
interface and how it relates to mac80211 and drivers.
|
||||
</para>
|
||||
</partintro>
|
||||
<chapter id="dummy">
|
||||
<title>dummy chapter</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="internal">
|
||||
<title>Internals</title>
|
||||
<partintro>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This part of the book describes mac80211 internals.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="key-handling">
|
||||
<title>Key handling</title>
|
||||
<sect1>
|
||||
<title>Key handling basics</title>
|
||||
!Pnet/mac80211/key.c Key handling basics
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>MORE TBD</title>
|
||||
<para>TBD</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="rx-processing">
|
||||
<title>Receive processing</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="tx-processing">
|
||||
<title>Transmit processing</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="sta-info">
|
||||
<title>Station info handling</title>
|
||||
<sect1>
|
||||
<title>Programming information</title>
|
||||
!Fnet/mac80211/sta_info.h sta_info
|
||||
!Fnet/mac80211/sta_info.h ieee80211_sta_info_flags
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>STA information lifetime rules</title>
|
||||
!Pnet/mac80211/sta_info.c STA information lifetime rules
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="synchronisation">
|
||||
<title>Synchronisation</title>
|
||||
<para>TBD</para>
|
||||
<para>Locking, lots of RCU</para>
|
||||
</chapter>
|
||||
</part>
|
||||
</book>
|
||||
</set>
|
|
@ -12,7 +12,7 @@ DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
|||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
||||
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
||||
mac80211.xml debugobjects.xml sh.xml regulator.xml \
|
||||
80211.xml debugobjects.xml sh.xml regulator.xml \
|
||||
alsa-driver-api.xml writing-an-alsa-driver.xml \
|
||||
tracepoint.xml media.xml drm.xml
|
||||
|
||||
|
|
|
@ -1,337 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||
|
||||
<book id="mac80211-developers-guide">
|
||||
<bookinfo>
|
||||
<title>The mac80211 subsystem for kernel developers</title>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Johannes</firstname>
|
||||
<surname>Berg</surname>
|
||||
<affiliation>
|
||||
<address><email>johannes@sipsolutions.net</email></address>
|
||||
</affiliation>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<copyright>
|
||||
<year>2007-2009</year>
|
||||
<holder>Johannes Berg</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
This documentation is free software; you can redistribute
|
||||
it and/or modify it under the terms of the GNU General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
This documentation is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this documentation; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
MA 02111-1307 USA
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more details see the file COPYING in the source
|
||||
distribution of Linux.
|
||||
</para>
|
||||
</legalnotice>
|
||||
|
||||
<abstract>
|
||||
!Pinclude/net/mac80211.h Introduction
|
||||
!Pinclude/net/mac80211.h Warning
|
||||
</abstract>
|
||||
</bookinfo>
|
||||
|
||||
<toc></toc>
|
||||
|
||||
<!--
|
||||
Generally, this document shall be ordered by increasing complexity.
|
||||
It is important to note that readers should be able to read only
|
||||
the first few sections to get a working driver and only advanced
|
||||
usage should require reading the full document.
|
||||
-->
|
||||
|
||||
<part>
|
||||
<title>The basic mac80211 driver interface</title>
|
||||
<partintro>
|
||||
<para>
|
||||
You should read and understand the information contained
|
||||
within this part of the book while implementing a driver.
|
||||
In some chapters, advanced usage is noted, that may be
|
||||
skipped at first.
|
||||
</para>
|
||||
<para>
|
||||
This part of the book only covers station and monitor mode
|
||||
functionality, additional information required to implement
|
||||
the other modes is covered in the second part of the book.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="basics">
|
||||
<title>Basic hardware handling</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter shall contain information on getting a hw
|
||||
struct allocated and registered with mac80211.
|
||||
</para>
|
||||
<para>
|
||||
Since it is required to allocate rates/modes before registering
|
||||
a hw struct, this chapter shall also contain information on setting
|
||||
up the rate/mode structs.
|
||||
</para>
|
||||
<para>
|
||||
Additionally, some discussion about the callbacks and
|
||||
the general programming model should be in here, including
|
||||
the definition of ieee80211_ops which will be referred to
|
||||
a lot.
|
||||
</para>
|
||||
<para>
|
||||
Finally, a discussion of hardware capabilities should be done
|
||||
with references to other parts of the book.
|
||||
</para>
|
||||
<!-- intentionally multiple !F lines to get proper order -->
|
||||
!Finclude/net/mac80211.h ieee80211_hw
|
||||
!Finclude/net/mac80211.h ieee80211_hw_flags
|
||||
!Finclude/net/mac80211.h SET_IEEE80211_DEV
|
||||
!Finclude/net/mac80211.h SET_IEEE80211_PERM_ADDR
|
||||
!Finclude/net/mac80211.h ieee80211_ops
|
||||
!Finclude/net/mac80211.h ieee80211_alloc_hw
|
||||
!Finclude/net/mac80211.h ieee80211_register_hw
|
||||
!Finclude/net/mac80211.h ieee80211_get_tx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_rx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_radio_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_unregister_hw
|
||||
!Finclude/net/mac80211.h ieee80211_free_hw
|
||||
</chapter>
|
||||
|
||||
<chapter id="phy-handling">
|
||||
<title>PHY configuration</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter should describe PHY handling including
|
||||
start/stop callbacks and the various structures used.
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_conf
|
||||
!Finclude/net/mac80211.h ieee80211_conf_flags
|
||||
</chapter>
|
||||
|
||||
<chapter id="iface-handling">
|
||||
<title>Virtual interfaces</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This chapter should describe virtual interface basics
|
||||
that are relevant to the driver (VLANs, MGMT etc are not.)
|
||||
It should explain the use of the add_iface/remove_iface
|
||||
callbacks as well as the interface configuration callbacks.
|
||||
</para>
|
||||
<para>Things related to AP mode should be discussed there.</para>
|
||||
<para>
|
||||
Things related to supporting multiple interfaces should be
|
||||
in the appropriate chapter, a BIG FAT note should be here about
|
||||
this though and the recommendation to allow only a single
|
||||
interface in STA mode at first!
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_vif
|
||||
</chapter>
|
||||
|
||||
<chapter id="rx-tx">
|
||||
<title>Receive and transmit processing</title>
|
||||
<sect1>
|
||||
<title>what should be here</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This should describe the receive and transmit
|
||||
paths in mac80211/the drivers as well as
|
||||
transmit status handling.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Frame format</title>
|
||||
!Pinclude/net/mac80211.h Frame format
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Packet alignment</title>
|
||||
!Pnet/mac80211/rx.c Packet alignment
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Calling into mac80211 from interrupts</title>
|
||||
!Pinclude/net/mac80211.h Calling mac80211 from interrupts
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>functions/definitions</title>
|
||||
!Finclude/net/mac80211.h ieee80211_rx_status
|
||||
!Finclude/net/mac80211.h mac80211_rx_flags
|
||||
!Finclude/net/mac80211.h ieee80211_tx_info
|
||||
!Finclude/net/mac80211.h ieee80211_rx
|
||||
!Finclude/net/mac80211.h ieee80211_rx_irqsafe
|
||||
!Finclude/net/mac80211.h ieee80211_tx_status
|
||||
!Finclude/net/mac80211.h ieee80211_tx_status_irqsafe
|
||||
!Finclude/net/mac80211.h ieee80211_rts_get
|
||||
!Finclude/net/mac80211.h ieee80211_rts_duration
|
||||
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
||||
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
||||
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
||||
!Finclude/net/mac80211.h ieee80211_wake_queue
|
||||
!Finclude/net/mac80211.h ieee80211_stop_queue
|
||||
!Finclude/net/mac80211.h ieee80211_wake_queues
|
||||
!Finclude/net/mac80211.h ieee80211_stop_queues
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="filters">
|
||||
<title>Frame filtering</title>
|
||||
!Pinclude/net/mac80211.h Frame filtering
|
||||
!Finclude/net/mac80211.h ieee80211_filter_flags
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="advanced">
|
||||
<title>Advanced driver interface</title>
|
||||
<partintro>
|
||||
<para>
|
||||
Information contained within this part of the book is
|
||||
of interest only for advanced interaction of mac80211
|
||||
with drivers to exploit more hardware capabilities and
|
||||
improve performance.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="hardware-crypto-offload">
|
||||
<title>Hardware crypto acceleration</title>
|
||||
!Pinclude/net/mac80211.h Hardware crypto acceleration
|
||||
<!-- intentionally multiple !F lines to get proper order -->
|
||||
!Finclude/net/mac80211.h set_key_cmd
|
||||
!Finclude/net/mac80211.h ieee80211_key_conf
|
||||
!Finclude/net/mac80211.h ieee80211_key_alg
|
||||
!Finclude/net/mac80211.h ieee80211_key_flags
|
||||
</chapter>
|
||||
|
||||
<chapter id="powersave">
|
||||
<title>Powersave support</title>
|
||||
!Pinclude/net/mac80211.h Powersave support
|
||||
</chapter>
|
||||
|
||||
<chapter id="beacon-filter">
|
||||
<title>Beacon filter support</title>
|
||||
!Pinclude/net/mac80211.h Beacon filter support
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_loss
|
||||
</chapter>
|
||||
|
||||
<chapter id="qos">
|
||||
<title>Multiple queues and QoS support</title>
|
||||
<para>TBD</para>
|
||||
!Finclude/net/mac80211.h ieee80211_tx_queue_params
|
||||
</chapter>
|
||||
|
||||
<chapter id="AP">
|
||||
<title>Access point mode support</title>
|
||||
<para>TBD</para>
|
||||
<para>Some parts of the if_conf should be discussed here instead</para>
|
||||
<para>
|
||||
Insert notes about VLAN interfaces with hw crypto here or
|
||||
in the hw crypto chapter.
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_get_buffered_bc
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_get
|
||||
</chapter>
|
||||
|
||||
<chapter id="multi-iface">
|
||||
<title>Supporting multiple virtual interfaces</title>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
Note: WDS with identical MAC address should almost always be OK
|
||||
</para>
|
||||
<para>
|
||||
Insert notes about having multiple virtual interfaces with
|
||||
different MAC addresses here, note which configurations are
|
||||
supported by mac80211, add notes about supporting hw crypto
|
||||
with it.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="hardware-scan-offload">
|
||||
<title>Hardware scan offload</title>
|
||||
<para>TBD</para>
|
||||
!Finclude/net/mac80211.h ieee80211_scan_completed
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="rate-control">
|
||||
<title>Rate control interface</title>
|
||||
<partintro>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This part of the book describes the rate control algorithm
|
||||
interface and how it relates to mac80211 and drivers.
|
||||
</para>
|
||||
</partintro>
|
||||
<chapter id="dummy">
|
||||
<title>dummy chapter</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="internal">
|
||||
<title>Internals</title>
|
||||
<partintro>
|
||||
<para>TBD</para>
|
||||
<para>
|
||||
This part of the book describes mac80211 internals.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="key-handling">
|
||||
<title>Key handling</title>
|
||||
<sect1>
|
||||
<title>Key handling basics</title>
|
||||
!Pnet/mac80211/key.c Key handling basics
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>MORE TBD</title>
|
||||
<para>TBD</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="rx-processing">
|
||||
<title>Receive processing</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="tx-processing">
|
||||
<title>Transmit processing</title>
|
||||
<para>TBD</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="sta-info">
|
||||
<title>Station info handling</title>
|
||||
<sect1>
|
||||
<title>Programming information</title>
|
||||
!Fnet/mac80211/sta_info.h sta_info
|
||||
!Fnet/mac80211/sta_info.h ieee80211_sta_info_flags
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>STA information lifetime rules</title>
|
||||
!Pnet/mac80211/sta_info.c STA information lifetime rules
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="synchronisation">
|
||||
<title>Synchronisation</title>
|
||||
<para>TBD</para>
|
||||
<para>Locking, lots of RCU</para>
|
||||
</chapter>
|
||||
</part>
|
||||
</book>
|
|
@ -536,3 +536,12 @@ Who: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
|||
|
||||
----------------------------
|
||||
|
||||
What: iwlwifi disable_hw_scan module parameters
|
||||
When: 2.6.40
|
||||
Why: Hareware scan is the prefer method for iwlwifi devices for
|
||||
scanning operation. Remove software scan support for all the
|
||||
iwlwifi devices.
|
||||
|
||||
Who: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
|
||||
----------------------------
|
||||
|
|
|
@ -765,6 +765,14 @@ xmit_hash_policy
|
|||
does not exist, and the layer2 policy is the only policy. The
|
||||
layer2+3 value was added for bonding version 3.2.2.
|
||||
|
||||
resend_igmp
|
||||
|
||||
Specifies the number of IGMP membership reports to be issued after
|
||||
a failover event. One membership report is issued immediately after
|
||||
the failover, subsequent packets are sent in each 200ms interval.
|
||||
|
||||
The valid range is 0 - 255; the default value is 1. This option
|
||||
was added for bonding version 3.7.0.
|
||||
|
||||
3. Configuring Bonding Devices
|
||||
==============================
|
||||
|
|
|
@ -22,6 +22,7 @@ This file contains
|
|||
4.1.2 RAW socket option CAN_RAW_ERR_FILTER
|
||||
4.1.3 RAW socket option CAN_RAW_LOOPBACK
|
||||
4.1.4 RAW socket option CAN_RAW_RECV_OWN_MSGS
|
||||
4.1.5 RAW socket returned message flags
|
||||
4.2 Broadcast Manager protocol sockets (SOCK_DGRAM)
|
||||
4.3 connected transport protocols (SOCK_SEQPACKET)
|
||||
4.4 unconnected transport protocols (SOCK_DGRAM)
|
||||
|
@ -471,6 +472,17 @@ solution for a couple of reasons:
|
|||
setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
|
||||
&recv_own_msgs, sizeof(recv_own_msgs));
|
||||
|
||||
4.1.5 RAW socket returned message flags
|
||||
|
||||
When using recvmsg() call, the msg->msg_flags may contain following flags:
|
||||
|
||||
MSG_DONTROUTE: set when the received frame was created on the local host.
|
||||
|
||||
MSG_CONFIRM: set when the frame was sent via the socket it is received on.
|
||||
This flag can be interpreted as a 'transmission confirmation' when the
|
||||
CAN driver supports the echo of frames on driver level, see 3.2 and 6.2.
|
||||
In order to receive such messages, CAN_RAW_RECV_OWN_MSGS must be set.
|
||||
|
||||
4.2 Broadcast Manager protocol sockets (SOCK_DGRAM)
|
||||
4.3 connected transport protocols (SOCK_SEQPACKET)
|
||||
4.4 unconnected transport protocols (SOCK_DGRAM)
|
||||
|
|
|
@ -1,18 +1,20 @@
|
|||
DCCP protocol
|
||||
============
|
||||
=============
|
||||
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
- Introduction
|
||||
- Missing features
|
||||
- Socket options
|
||||
- Sysctl variables
|
||||
- IOCTLs
|
||||
- Other tunables
|
||||
- Notes
|
||||
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
Datagram Congestion Control Protocol (DCCP) is an unreliable, connection
|
||||
oriented protocol designed to solve issues present in UDP and TCP, particularly
|
||||
for real-time and multimedia (streaming) traffic.
|
||||
|
@ -29,9 +31,9 @@ It has a base protocol and pluggable congestion control IDs (CCIDs).
|
|||
DCCP is a Proposed Standard (RFC 2026), and the homepage for DCCP as a protocol
|
||||
is at http://www.ietf.org/html.charters/dccp-charter.html
|
||||
|
||||
|
||||
Missing features
|
||||
================
|
||||
|
||||
The Linux DCCP implementation does not currently support all the features that are
|
||||
specified in RFCs 4340...42.
|
||||
|
||||
|
@ -45,7 +47,6 @@ http://linux-net.osdl.org/index.php/DCCP_Testing#Experimental_DCCP_source_tree
|
|||
|
||||
Socket options
|
||||
==============
|
||||
|
||||
DCCP_SOCKOPT_SERVICE sets the service. The specification mandates use of
|
||||
service codes (RFC 4340, sec. 8.1.2); if this socket option is not set,
|
||||
the socket will fall back to 0 (which means that no meaningful service code
|
||||
|
@ -112,6 +113,7 @@ DCCP_SOCKOPT_CCID_TX_INFO
|
|||
On unidirectional connections it is useful to close the unused half-connection
|
||||
via shutdown (SHUT_WR or SHUT_RD): this will reduce per-packet processing costs.
|
||||
|
||||
|
||||
Sysctl variables
|
||||
================
|
||||
Several DCCP default parameters can be managed by the following sysctls
|
||||
|
@ -155,15 +157,30 @@ sync_ratelimit = 125 ms
|
|||
sequence-invalid packets on the same socket (RFC 4340, 7.5.4). The unit
|
||||
of this parameter is milliseconds; a value of 0 disables rate-limiting.
|
||||
|
||||
|
||||
IOCTLS
|
||||
======
|
||||
FIONREAD
|
||||
Works as in udp(7): returns in the `int' argument pointer the size of
|
||||
the next pending datagram in bytes, or 0 when no datagram is pending.
|
||||
|
||||
|
||||
Other tunables
|
||||
==============
|
||||
Per-route rto_min support
|
||||
CCID-2 supports the RTAX_RTO_MIN per-route setting for the minimum value
|
||||
of the RTO timer. This setting can be modified via the 'rto_min' option
|
||||
of iproute2; for example:
|
||||
> ip route change 10.0.0.0/24 rto_min 250j dev wlan0
|
||||
> ip route add 10.0.0.254/32 rto_min 800j dev wlan0
|
||||
> ip route show dev wlan0
|
||||
CCID-3 also supports the rto_min setting: it is used to define the lower
|
||||
bound for the expiry of the nofeedback timer. This can be useful on LANs
|
||||
with very low RTTs (e.g., loopback, Gbit ethernet).
|
||||
|
||||
|
||||
Notes
|
||||
=====
|
||||
|
||||
DCCP does not travel through NAT successfully at present on many boxes. This is
|
||||
because the checksum covers the pseudo-header as per TCP and UDP. Linux NAT
|
||||
support for DCCP has been added.
|
||||
|
|
|
@ -1014,6 +1014,12 @@ conf/interface/*:
|
|||
accept_ra - BOOLEAN
|
||||
Accept Router Advertisements; autoconfigure using them.
|
||||
|
||||
Possible values are:
|
||||
0 Do not accept Router Advertisements.
|
||||
1 Accept Router Advertisements if forwarding is disabled.
|
||||
2 Overrule forwarding behaviour. Accept Router Advertisements
|
||||
even if forwarding is enabled.
|
||||
|
||||
Functional default: enabled if local forwarding is disabled.
|
||||
disabled if local forwarding is enabled.
|
||||
|
||||
|
@ -1075,7 +1081,12 @@ forwarding - BOOLEAN
|
|||
Note: It is recommended to have the same setting on all
|
||||
interfaces; mixed router/host scenarios are rather uncommon.
|
||||
|
||||
FALSE:
|
||||
Possible values are:
|
||||
0 Forwarding disabled
|
||||
1 Forwarding enabled
|
||||
2 Forwarding enabled (Hybrid Mode)
|
||||
|
||||
FALSE (0):
|
||||
|
||||
By default, Host behaviour is assumed. This means:
|
||||
|
||||
|
@ -1085,18 +1096,24 @@ forwarding - BOOLEAN
|
|||
Advertisements (and do autoconfiguration).
|
||||
4. If accept_redirects is TRUE (default), accept Redirects.
|
||||
|
||||
TRUE:
|
||||
TRUE (1):
|
||||
|
||||
If local forwarding is enabled, Router behaviour is assumed.
|
||||
This means exactly the reverse from the above:
|
||||
|
||||
1. IsRouter flag is set in Neighbour Advertisements.
|
||||
2. Router Solicitations are not sent.
|
||||
3. Router Advertisements are ignored.
|
||||
3. Router Advertisements are ignored unless accept_ra is 2.
|
||||
4. Redirects are ignored.
|
||||
|
||||
Default: FALSE if global forwarding is disabled (default),
|
||||
otherwise TRUE.
|
||||
TRUE (2):
|
||||
|
||||
Hybrid mode. Same behaviour as TRUE, except for:
|
||||
|
||||
2. Router Solicitations are being sent when necessary.
|
||||
|
||||
Default: 0 (disabled) if global forwarding is disabled (default),
|
||||
otherwise 1 (enabled).
|
||||
|
||||
hop_limit - INTEGER
|
||||
Default Hop Limit to set.
|
||||
|
|
|
@ -112,6 +112,22 @@ However, connect() and getpeername() are not supported, as they did
|
|||
not seem useful with Phonet usages (could be added easily).
|
||||
|
||||
|
||||
Resource subscription
|
||||
---------------------
|
||||
|
||||
A Phonet datagram socket can be subscribed to any number of 8-bits
|
||||
Phonet resources, as follow:
|
||||
|
||||
uint32_t res = 0xXX;
|
||||
ioctl(fd, SIOCPNADDRESOURCE, &res);
|
||||
|
||||
Subscription is similarly cancelled using the SIOCPNDELRESOURCE I/O
|
||||
control request, or when the socket is closed.
|
||||
|
||||
Note that no more than one socket can be subcribed to any given
|
||||
resource at a time. If not, ioctl() will return EBUSY.
|
||||
|
||||
|
||||
Phonet Pipe protocol
|
||||
--------------------
|
||||
|
||||
|
@ -166,6 +182,46 @@ The pipe protocol provides two socket options at the SOL_PNPIPE level:
|
|||
or zero if encapsulation is off.
|
||||
|
||||
|
||||
Phonet Pipe-controller Implementation
|
||||
-------------------------------------
|
||||
|
||||
Phonet Pipe-controller is enabled by selecting the CONFIG_PHONET_PIPECTRLR Kconfig
|
||||
option. It is useful when communicating with those Nokia Modems which do not
|
||||
implement Pipe controller in them e.g. Nokia Slim Modem used in ST-Ericsson
|
||||
U8500 platform.
|
||||
|
||||
The implementation is based on the Data Connection Establishment Sequence
|
||||
depicted in 'Nokia Wireless Modem API - Wireless_modem_user_guide.pdf'
|
||||
document.
|
||||
|
||||
It allows a phonet sequenced socket (host-pep) to initiate a Pipe connection
|
||||
between itself and a remote pipe-end point (e.g. modem).
|
||||
|
||||
The implementation adds socket options at SOL_PNPIPE level:
|
||||
|
||||
PNPIPE_PIPE_HANDLE
|
||||
It accepts an integer argument for setting value of pipe handle.
|
||||
|
||||
PNPIPE_ENABLE accepts one integer value (int). If set to zero, the pipe
|
||||
is disabled. If the value is non-zero, the pipe is enabled. If the pipe
|
||||
is not (yet) connected, ENOTCONN is error is returned.
|
||||
|
||||
The implementation also adds socket 'connect'. On calling the 'connect', pipe
|
||||
will be created between the source socket and the destination, and the pipe
|
||||
state will be set to PIPE_DISABLED.
|
||||
|
||||
After a pipe has been created and enabled successfully, the Pipe data can be
|
||||
exchanged between the host-pep and remote-pep (modem).
|
||||
|
||||
User-space would typically follow below sequence with Pipe controller:-
|
||||
-socket
|
||||
-bind
|
||||
-setsockopt for PNPIPE_PIPE_HANDLE
|
||||
-connect
|
||||
-setsockopt for PNPIPE_ENCAP_IP
|
||||
-setsockopt for PNPIPE_ENABLE
|
||||
|
||||
|
||||
Authors
|
||||
-------
|
||||
|
||||
|
|
|
@ -172,15 +172,19 @@ struct skb_shared_hwtstamps {
|
|||
};
|
||||
|
||||
Time stamps for outgoing packets are to be generated as follows:
|
||||
- In hard_start_xmit(), check if skb_tx(skb)->hardware is set no-zero.
|
||||
If yes, then the driver is expected to do hardware time stamping.
|
||||
- In hard_start_xmit(), check if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
|
||||
is set no-zero. If yes, then the driver is expected to do hardware time
|
||||
stamping.
|
||||
- If this is possible for the skb and requested, then declare
|
||||
that the driver is doing the time stamping by setting the field
|
||||
skb_tx(skb)->in_progress non-zero. You might want to keep a pointer
|
||||
to the associated skb for the next step and not free the skb. A driver
|
||||
not supporting hardware time stamping doesn't do that. A driver must
|
||||
never touch sk_buff::tstamp! It is used to store software generated
|
||||
time stamps by the network subsystem.
|
||||
that the driver is doing the time stamping by setting the flag
|
||||
SKBTX_IN_PROGRESS in skb_shinfo(skb)->tx_flags , e.g. with
|
||||
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
|
||||
You might want to keep a pointer to the associated skb for the next step
|
||||
and not free the skb. A driver not supporting hardware time stamping doesn't
|
||||
do that. A driver must never touch sk_buff::tstamp! It is used to store
|
||||
software generated time stamps by the network subsystem.
|
||||
- As soon as the driver has sent the packet and/or obtained a
|
||||
hardware time stamp for it, it passes the time stamp back by
|
||||
calling skb_hwtstamp_tx() with the original skb, the raw
|
||||
|
@ -191,6 +195,6 @@ Time stamps for outgoing packets are to be generated as follows:
|
|||
this would occur at a later time in the processing pipeline than other
|
||||
software time stamping and therefore could lead to unexpected deltas
|
||||
between time stamps.
|
||||
- If the driver did not call set skb_tx(skb)->in_progress, then
|
||||
- If the driver did not set the SKBTX_IN_PROGRESS flag (see above), then
|
||||
dev_hard_start_xmit() checks whether software time stamping
|
||||
is wanted as fallback and potentially generates the time stamp.
|
||||
|
|
62
MAINTAINERS
62
MAINTAINERS
|
@ -1151,6 +1151,13 @@ W: http://wireless.kernel.org/en/users/Drivers/ar9170
|
|||
S: Maintained
|
||||
F: drivers/net/wireless/ath/ar9170/
|
||||
|
||||
CARL9170 LINUX COMMUNITY WIRELESS DRIVER
|
||||
M: Christian Lamparter <chunkeey@googlemail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org/en/users/Drivers/carl9170
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/ath/carl9170/
|
||||
|
||||
ATK0110 HWMON DRIVER
|
||||
M: Luca Tettamanti <kronos.it@gmail.com>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
|
@ -1375,16 +1382,19 @@ F: drivers/mtd/devices/block2mtd.c
|
|||
|
||||
BLUETOOTH DRIVERS
|
||||
M: Marcel Holtmann <marcel@holtmann.org>
|
||||
M: Gustavo F. Padovan <padovan@profusion.mobi>
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://www.bluez.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
||||
S: Maintained
|
||||
F: drivers/bluetooth/
|
||||
|
||||
BLUETOOTH SUBSYSTEM
|
||||
M: Marcel Holtmann <marcel@holtmann.org>
|
||||
M: Gustavo F. Padovan <padovan@profusion.mobi>
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://www.bluez.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
||||
S: Maintained
|
||||
F: net/bluetooth/
|
||||
F: include/net/bluetooth/
|
||||
|
@ -1429,6 +1439,13 @@ L: linux-scsi@vger.kernel.org
|
|||
S: Supported
|
||||
F: drivers/scsi/bfa/
|
||||
|
||||
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
||||
M: Rasesh Mody <rmody@brocade.com>
|
||||
M: Debashis Dutt <ddutt@brocade.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/bna/
|
||||
|
||||
BSG (block layer generic sg v4 driver)
|
||||
M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
|
@ -1586,9 +1603,9 @@ S: Supported
|
|||
F: scripts/checkpatch.pl
|
||||
|
||||
CISCO VIC ETHERNET NIC DRIVER
|
||||
M: Scott Feldman <scofeldm@cisco.com>
|
||||
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
||||
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||
M: David Wang <dwang2@cisco.com>
|
||||
S: Supported
|
||||
F: drivers/net/enic/
|
||||
|
||||
|
@ -2922,6 +2939,12 @@ M: Brian King <brking@us.ibm.com>
|
|||
S: Supported
|
||||
F: drivers/scsi/ipr.*
|
||||
|
||||
IBM Power Virtual Ethernet Device Driver
|
||||
M: Santiago Leon <santil@linux.vnet.ibm.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ibmveth.*
|
||||
|
||||
IBM ServeRAID RAID DRIVER
|
||||
P: Jack Hammer
|
||||
M: Dave Jeffery <ipslinux@adaptec.com>
|
||||
|
@ -4392,13 +4415,12 @@ F: Documentation/filesystems/dlmfs.txt
|
|||
F: fs/ocfs2/
|
||||
|
||||
ORINOCO DRIVER
|
||||
M: Pavel Roskin <proski@gnu.org>
|
||||
M: David Gibson <hermes@gibson.dropbear.id.au>
|
||||
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: Maintained
|
||||
S: Orphan
|
||||
F: drivers/net/wireless/orinoco/
|
||||
|
||||
OSD LIBRARY and FILESYSTEM
|
||||
|
@ -4586,6 +4608,14 @@ L: linux-abi-devel@lists.sourceforge.net
|
|||
S: Maintained
|
||||
F: include/linux/personality.h
|
||||
|
||||
PHONET PROTOCOL
|
||||
M: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
S: Supported
|
||||
F: Documentation/networking/phonet.txt
|
||||
F: include/linux/phonet.h
|
||||
F: include/net/phonet/
|
||||
F: net/phonet/
|
||||
|
||||
PHRAM MTD DRIVER
|
||||
M: Joern Engel <joern@lazybastard.org>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
|
@ -6489,21 +6519,21 @@ S: Maintained
|
|||
F: drivers/input/misc/wistron_btns.c
|
||||
|
||||
WL1251 WIRELESS DRIVER
|
||||
M: Kalle Valo <kalle.valo@iki.fi>
|
||||
M: Kalle Valo <kvalo@adurom.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/wl12xx/*
|
||||
X: drivers/net/wireless/wl12xx/wl1271*
|
||||
F: drivers/net/wireless/wl1251/*
|
||||
|
||||
WL1271 WIRELESS DRIVER
|
||||
M: Luciano Coelho <luciano.coelho@nokia.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/wl12xx/wl1271*
|
||||
F: include/linux/wl12xx.h
|
||||
|
||||
WL3501 WIRELESS PCMCIA CARD DRIVER
|
||||
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
|
||||
|
@ -6650,6 +6680,20 @@ M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
|||
S: Maintained
|
||||
F: drivers/serial/zs.*
|
||||
|
||||
GRE DEMULTIPLEXER DRIVER
|
||||
M: Dmitry Kozlov <xeb@mail.ru>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: net/ipv4/gre.c
|
||||
F: include/net/gre.h
|
||||
|
||||
PPTP DRIVER
|
||||
M: Dmitry Kozlov <xeb@mail.ru>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/pptp.c
|
||||
W: http://sourceforge.net/projects/accel-pptp
|
||||
|
||||
THE REST
|
||||
M: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/spi/wl12xx.h>
|
||||
#include <linux/wl12xx.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/leds.h>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/wl12xx.h>
|
||||
#include <linux/wl12xx.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/clk.h>
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/wl12xx.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -27,6 +29,9 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
|
||||
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
|
||||
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
|
||||
|
||||
/* Zoom2 has Qwerty keyboard*/
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_E),
|
||||
|
@ -106,6 +111,11 @@ static struct regulator_consumer_supply zoom_vmmc2_supply = {
|
|||
.supply = "vmmc",
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vmmc3_supply = {
|
||||
.supply = "vmmc",
|
||||
.dev_name = "mmci-omap-hs.2",
|
||||
};
|
||||
|
||||
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
|
||||
static struct regulator_init_data zoom_vmmc1 = {
|
||||
.constraints = {
|
||||
|
@ -151,6 +161,38 @@ static struct regulator_init_data zoom_vsim = {
|
|||
.consumer_supplies = &zoom_vsim_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data zoom_vmmc3 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vmmc3_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config zoom_vwlan = {
|
||||
.supply_name = "vwl1271",
|
||||
.microvolts = 1800000, /* 1.8V */
|
||||
.gpio = OMAP_ZOOM_WLAN_PMENA_GPIO,
|
||||
.startup_delay = 70000, /* 70msec */
|
||||
.enable_high = 1,
|
||||
.enabled_at_boot = 0,
|
||||
.init_data = &zoom_vmmc3,
|
||||
};
|
||||
|
||||
static struct platform_device omap_vwlan_device = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &zoom_vwlan,
|
||||
},
|
||||
};
|
||||
|
||||
struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {
|
||||
.irq = OMAP_GPIO_IRQ(OMAP_ZOOM_WLAN_IRQ_GPIO),
|
||||
/* ZOOM ref clock is 26 MHz */
|
||||
.board_ref_clock = 1,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.name = "external",
|
||||
|
@ -168,6 +210,14 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
|||
.nonremovable = true,
|
||||
.power_saving = true,
|
||||
},
|
||||
{
|
||||
.name = "wl1271",
|
||||
.mmc = 3,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
.gpio_cd = -EINVAL,
|
||||
.nonremovable = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
|
@ -279,7 +329,11 @@ static void enable_board_wakeup_source(void)
|
|||
|
||||
void __init zoom_peripherals_init(void)
|
||||
{
|
||||
if (wl12xx_set_platform_data(&omap_zoom_wlan_data))
|
||||
pr_err("error setting wl12xx data\n");
|
||||
|
||||
omap_i2c_init();
|
||||
platform_device_register(&omap_vwlan_device);
|
||||
usb_musb_init(&musb_board_data);
|
||||
enable_board_wakeup_source();
|
||||
}
|
||||
|
|
|
@ -360,6 +360,7 @@ struct qdio_initialize {
|
|||
unsigned int no_output_qs;
|
||||
qdio_handler_t *input_handler;
|
||||
qdio_handler_t *output_handler;
|
||||
void (*queue_start_poll) (struct ccw_device *, int, unsigned long);
|
||||
unsigned long int_parm;
|
||||
void **input_sbal_addr_array;
|
||||
void **output_sbal_addr_array;
|
||||
|
@ -377,11 +378,13 @@ struct qdio_initialize {
|
|||
extern int qdio_allocate(struct qdio_initialize *);
|
||||
extern int qdio_establish(struct qdio_initialize *);
|
||||
extern int qdio_activate(struct ccw_device *);
|
||||
|
||||
extern int do_QDIO(struct ccw_device *cdev, unsigned int callflags,
|
||||
int q_nr, unsigned int bufnr, unsigned int count);
|
||||
extern int qdio_shutdown(struct ccw_device*, int);
|
||||
extern int do_QDIO(struct ccw_device *, unsigned int, int, unsigned int,
|
||||
unsigned int);
|
||||
extern int qdio_start_irq(struct ccw_device *, int);
|
||||
extern int qdio_stop_irq(struct ccw_device *, int);
|
||||
extern int qdio_get_next_buffers(struct ccw_device *, int, int *, int *);
|
||||
extern int qdio_shutdown(struct ccw_device *, int);
|
||||
extern int qdio_free(struct ccw_device *);
|
||||
extern int qdio_get_ssqd_desc(struct ccw_device *dev, struct qdio_ssqd_desc*);
|
||||
extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *);
|
||||
|
||||
#endif /* __QDIO_H__ */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Makefile for the Linux network (ATM) device drivers.
|
||||
#
|
||||
|
||||
fore_200e-objs := fore200e.o
|
||||
fore_200e-y := fore200e.o
|
||||
|
||||
obj-$(CONFIG_ATM_ZATM) += zatm.o uPD98402.o
|
||||
obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
|
||||
|
|
|
@ -444,8 +444,8 @@ static inline void fs_kfree_skb (struct sk_buff * skb)
|
|||
#define ROUND_NEAREST 3
|
||||
/********** make rate (not quite as much fun as Horizon) **********/
|
||||
|
||||
static unsigned int make_rate (unsigned int rate, int r,
|
||||
u16 * bits, unsigned int * actual)
|
||||
static int make_rate(unsigned int rate, int r,
|
||||
u16 *bits, unsigned int *actual)
|
||||
{
|
||||
unsigned char exp = -1; /* hush gcc */
|
||||
unsigned int man = -1; /* hush gcc */
|
||||
|
|
|
@ -1645,10 +1645,8 @@ static int hrz_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) {
|
|||
unsigned short d = 0;
|
||||
char * s = skb->data;
|
||||
if (*s++ == 'D') {
|
||||
for (i = 0; i < 4; ++i) {
|
||||
d = (d<<4) | ((*s <= '9') ? (*s - '0') : (*s - 'a' + 10));
|
||||
++s;
|
||||
}
|
||||
for (i = 0; i < 4; ++i)
|
||||
d = (d << 4) | hex_to_bin(*s++);
|
||||
PRINTK (KERN_INFO, "debug bitmap is now %hx", debug = d);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3152,7 +3152,7 @@ deinit_card(struct idt77252_dev *card)
|
|||
}
|
||||
|
||||
|
||||
static int __devinit
|
||||
static void __devinit
|
||||
init_sram(struct idt77252_dev *card)
|
||||
{
|
||||
int i;
|
||||
|
@ -3298,7 +3298,6 @@ init_sram(struct idt77252_dev *card)
|
|||
SAR_REG_RXFD);
|
||||
|
||||
IPRINTK("%s: SRAM initialization complete.\n", card->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
|
@ -3410,8 +3409,7 @@ init_card(struct atm_dev *dev)
|
|||
|
||||
writel(readl(SAR_REG_CFG) | conf, SAR_REG_CFG);
|
||||
|
||||
if (init_sram(card) < 0)
|
||||
return -1;
|
||||
init_sram(card);
|
||||
|
||||
/********************************************************************/
|
||||
/* A L L O C R A M A N D S E T V A R I O U S T H I N G S */
|
||||
|
|
|
@ -220,7 +220,7 @@ static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) {
|
|||
while (!desc_num || (dev->desc_tbl[desc_num -1]).timestamp) {
|
||||
dev->ffL.tcq_rd += 2;
|
||||
if (dev->ffL.tcq_rd > dev->ffL.tcq_ed)
|
||||
dev->ffL.tcq_rd = dev->ffL.tcq_st;
|
||||
dev->ffL.tcq_rd = dev->ffL.tcq_st;
|
||||
if (dev->ffL.tcq_rd == dev->host_tcq_wr)
|
||||
return 0xFFFF;
|
||||
desc_num = *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd);
|
||||
|
|
|
@ -117,8 +117,8 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
|
|||
(event->data[2] == MODULE_ALREADY_UP)) ?
|
||||
"Bring-up succeed" : "Bring-up failed");
|
||||
|
||||
if (event->length > 3)
|
||||
priv->btmrvl_dev.dev_type = event->data[3];
|
||||
if (event->length > 3 && event->data[3])
|
||||
priv->btmrvl_dev.dev_type = HCI_AMP;
|
||||
else
|
||||
priv->btmrvl_dev.dev_type = HCI_BREDR;
|
||||
|
||||
|
|
|
@ -46,6 +46,9 @@ static const struct sdio_device_id btsdio_table[] = {
|
|||
/* Generic Bluetooth Type-B SDIO device */
|
||||
{ SDIO_DEVICE_CLASS(SDIO_CLASS_BT_B) },
|
||||
|
||||
/* Generic Bluetooth AMP controller */
|
||||
{ SDIO_DEVICE_CLASS(SDIO_CLASS_BT_AMP) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
@ -329,6 +332,11 @@ static int btsdio_probe(struct sdio_func *func,
|
|||
hdev->bus = HCI_SDIO;
|
||||
hdev->driver_data = data;
|
||||
|
||||
if (id->class == SDIO_CLASS_BT_AMP)
|
||||
hdev->dev_type = HCI_AMP;
|
||||
else
|
||||
hdev->dev_type = HCI_BREDR;
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
SET_HCIDEV_DEV(hdev, &func->dev);
|
||||
|
|
|
@ -59,9 +59,15 @@ static struct usb_device_id btusb_table[] = {
|
|||
/* Generic Bluetooth USB device */
|
||||
{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
|
||||
|
||||
/* Apple MacBookPro 7,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8213) },
|
||||
|
||||
/* Apple iMac11,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8215) },
|
||||
|
||||
/* Apple MacBookPro6,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x8218) },
|
||||
|
||||
/* AVM BlueFRITZ! USB v2.0 */
|
||||
{ USB_DEVICE(0x057c, 0x3800) },
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ static inline void hci_uart_tx_complete(struct hci_uart *hu, int pkt_type)
|
|||
break;
|
||||
|
||||
case HCI_SCODATA_PKT:
|
||||
hdev->stat.cmd_tx++;
|
||||
hdev->stat.sco_tx++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/firewire.h>
|
||||
#include <linux/firewire-constants.h>
|
||||
#include <linux/highmem.h>
|
||||
|
@ -1361,17 +1360,6 @@ static int fwnet_change_mtu(struct net_device *net, int new_mtu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void fwnet_get_drvinfo(struct net_device *net,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strcpy(info->driver, KBUILD_MODNAME);
|
||||
strcpy(info->bus_info, "ieee1394");
|
||||
}
|
||||
|
||||
static const struct ethtool_ops fwnet_ethtool_ops = {
|
||||
.get_drvinfo = fwnet_get_drvinfo,
|
||||
};
|
||||
|
||||
static const struct net_device_ops fwnet_netdev_ops = {
|
||||
.ndo_open = fwnet_open,
|
||||
.ndo_stop = fwnet_stop,
|
||||
|
@ -1390,7 +1378,6 @@ static void fwnet_init_dev(struct net_device *net)
|
|||
net->hard_header_len = FWNET_HLEN;
|
||||
net->type = ARPHRD_IEEE1394;
|
||||
net->tx_queue_len = 10;
|
||||
SET_ETHTOOL_OPS(net, &fwnet_ethtool_ops);
|
||||
}
|
||||
|
||||
/* caller must hold fwnet_device_mutex */
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
#include <linux/tcp.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/delay.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
@ -173,8 +172,6 @@ static netdev_tx_t ether1394_tx(struct sk_buff *skb,
|
|||
struct net_device *dev);
|
||||
static void ether1394_iso(struct hpsb_iso *iso);
|
||||
|
||||
static const struct ethtool_ops ethtool_ops;
|
||||
|
||||
static int ether1394_write(struct hpsb_host *host, int srcid, int destid,
|
||||
quadlet_t *data, u64 addr, size_t len, u16 flags);
|
||||
static void ether1394_add_host(struct hpsb_host *host);
|
||||
|
@ -525,8 +522,6 @@ static void ether1394_init_dev(struct net_device *dev)
|
|||
dev->header_ops = ðer1394_header_ops;
|
||||
dev->netdev_ops = ðer1394_netdev_ops;
|
||||
|
||||
SET_ETHTOOL_OPS(dev, ðtool_ops);
|
||||
|
||||
dev->watchdog_timeo = ETHER1394_TIMEOUT;
|
||||
dev->flags = IFF_BROADCAST | IFF_MULTICAST;
|
||||
dev->features = NETIF_F_HIGHDMA;
|
||||
|
@ -1695,17 +1690,6 @@ fail:
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static void ether1394_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strcpy(info->driver, driver_name);
|
||||
strcpy(info->bus_info, "ieee1394"); /* FIXME provide more detail? */
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ethtool_ops = {
|
||||
.get_drvinfo = ether1394_get_drvinfo
|
||||
};
|
||||
|
||||
static int __init ether1394_init_module(void)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
config MLX4_INFINIBAND
|
||||
tristate "Mellanox ConnectX HCA support"
|
||||
depends on NETDEVICES && NETDEV_10000 && PCI
|
||||
select MLX4_CORE
|
||||
---help---
|
||||
This driver provides low-level InfiniBand support for
|
||||
|
|
|
@ -2701,7 +2701,7 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
|
|||
nesibdev = nesvnic->nesibdev;
|
||||
|
||||
nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
|
||||
atomic_read(&nesvnic->netdev->refcnt));
|
||||
netdev_refcnt_read(nesvnic->netdev));
|
||||
|
||||
if (nesqp->active_conn) {
|
||||
|
||||
|
@ -2791,7 +2791,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|||
atomic_inc(&cm_accepts);
|
||||
|
||||
nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
|
||||
atomic_read(&nesvnic->netdev->refcnt));
|
||||
netdev_refcnt_read(nesvnic->netdev));
|
||||
|
||||
/* allocate the ietf frame and space for private data */
|
||||
nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev,
|
||||
|
|
|
@ -785,7 +785,7 @@ static struct ib_pd *nes_alloc_pd(struct ib_device *ibdev,
|
|||
|
||||
nes_debug(NES_DBG_PD, "nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
|
||||
nesvnic, nesdev->netdev[0], nesdev->netdev[0]->name, ibdev, context,
|
||||
atomic_read(&nesvnic->netdev->refcnt));
|
||||
netdev_refcnt_read(nesvnic->netdev));
|
||||
|
||||
err = nes_alloc_resource(nesadapter, nesadapter->allocated_pds,
|
||||
nesadapter->max_pd, &pd_num, &nesadapter->next_pd);
|
||||
|
@ -1416,7 +1416,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
|||
/* update the QP table */
|
||||
nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp;
|
||||
nes_debug(NES_DBG_QP, "netdev refcnt=%u\n",
|
||||
atomic_read(&nesvnic->netdev->refcnt));
|
||||
netdev_refcnt_read(nesvnic->netdev));
|
||||
|
||||
return &nesqp->ibqp;
|
||||
}
|
||||
|
|
|
@ -1515,8 +1515,13 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
|
|||
while (*s) {
|
||||
int digit1 = 0;
|
||||
int digit2 = 0;
|
||||
if (!isdigit(*s)) return -3;
|
||||
while (isdigit(*s)) { digit1 = digit1*10 + (*s - '0'); s++; }
|
||||
char *endp;
|
||||
|
||||
digit1 = simple_strtoul(s, &endp, 10);
|
||||
if (s == endp)
|
||||
return -3;
|
||||
s = endp;
|
||||
|
||||
if (digit1 <= 0 || digit1 > 30) return -4;
|
||||
if (*s == 0 || *s == ',' || *s == ' ') {
|
||||
bmask |= (1 << digit1);
|
||||
|
@ -1526,8 +1531,12 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
|
|||
}
|
||||
if (*s != '-') return -5;
|
||||
s++;
|
||||
if (!isdigit(*s)) return -3;
|
||||
while (isdigit(*s)) { digit2 = digit2*10 + (*s - '0'); s++; }
|
||||
|
||||
digit2 = simple_strtoul(s, &endp, 10);
|
||||
if (s == endp)
|
||||
return -3;
|
||||
s = endp;
|
||||
|
||||
if (digit2 <= 0 || digit2 > 30) return -4;
|
||||
if (*s == 0 || *s == ',' || *s == ' ') {
|
||||
if (digit1 > digit2)
|
||||
|
|
|
@ -98,6 +98,16 @@ static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr)
|
|||
return capi_controller[contr - 1];
|
||||
}
|
||||
|
||||
static inline struct capi20_appl *__get_capi_appl_by_nr(u16 applid)
|
||||
{
|
||||
lockdep_assert_held(&capi_controller_lock);
|
||||
|
||||
if (applid - 1 >= CAPI_MAXAPPL)
|
||||
return NULL;
|
||||
|
||||
return capi_applications[applid - 1];
|
||||
}
|
||||
|
||||
static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid)
|
||||
{
|
||||
if (applid - 1 >= CAPI_MAXAPPL)
|
||||
|
@ -185,10 +195,9 @@ static void notify_up(u32 contr)
|
|||
ctr->state = CAPI_CTR_RUNNING;
|
||||
|
||||
for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
|
||||
ap = get_capi_appl_by_nr(applid);
|
||||
if (!ap)
|
||||
continue;
|
||||
register_appl(ctr, applid, &ap->rparam);
|
||||
ap = __get_capi_appl_by_nr(applid);
|
||||
if (ap)
|
||||
register_appl(ctr, applid, &ap->rparam);
|
||||
}
|
||||
|
||||
wake_up_interruptible_all(&ctr->state_wait_queue);
|
||||
|
@ -215,7 +224,7 @@ static void ctr_down(struct capi_ctr *ctr, int new_state)
|
|||
memset(ctr->serial, 0, sizeof(ctr->serial));
|
||||
|
||||
for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
|
||||
ap = get_capi_appl_by_nr(applid);
|
||||
ap = __get_capi_appl_by_nr(applid);
|
||||
if (ap)
|
||||
capi_ctr_put(ctr);
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ static void deflect_timer_expire(ulong arg)
|
|||
|
||||
case DEFLECT_ALERT:
|
||||
cs->ics.command = ISDN_CMD_REDIR; /* protocol */
|
||||
strcpy(cs->ics.parm.setup.phone,cs->deflect_dest);
|
||||
strlcpy(cs->ics.parm.setup.phone, cs->deflect_dest, sizeof(cs->ics.parm.setup.phone));
|
||||
strcpy(cs->ics.parm.setup.eazmsn,"Testtext delayed");
|
||||
divert_if.ll_cmd(&cs->ics);
|
||||
spin_lock_irqsave(&divert_lock, flags);
|
||||
|
@ -251,7 +251,7 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
|
|||
|
||||
case 2: /* redir */
|
||||
del_timer(&cs->timer);
|
||||
strcpy(cs->ics.parm.setup.phone, to_nr);
|
||||
strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone));
|
||||
strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual");
|
||||
ic.command = ISDN_CMD_REDIR;
|
||||
if ((i = divert_if.ll_cmd(&ic)))
|
||||
|
@ -480,7 +480,7 @@ static int isdn_divert_icall(isdn_ctrl *ic)
|
|||
if (!cs->timer.expires)
|
||||
{ strcpy(ic->parm.setup.eazmsn,"Testtext direct");
|
||||
ic->parm.setup.screen = dv->rule.screen;
|
||||
strcpy(ic->parm.setup.phone,dv->rule.to_nr);
|
||||
strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone));
|
||||
cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
|
||||
cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
|
||||
retval = 5;
|
||||
|
|
|
@ -109,6 +109,9 @@ struct bas_cardstate {
|
|||
|
||||
struct urb *urb_int_in; /* URB for interrupt pipe */
|
||||
unsigned char *int_in_buf;
|
||||
struct work_struct int_in_wq; /* for usb_clear_halt() */
|
||||
struct timer_list timer_int_in; /* int read retry delay */
|
||||
int retry_int_in;
|
||||
|
||||
spinlock_t lock; /* locks all following */
|
||||
int basstate; /* bitmap (BS_*) */
|
||||
|
@ -169,7 +172,7 @@ static char *get_usb_rcmsg(int rc)
|
|||
case -EAGAIN:
|
||||
return "start frame too early or too much scheduled";
|
||||
case -EFBIG:
|
||||
return "too many isochronous frames requested";
|
||||
return "too many isoc frames requested";
|
||||
case -EPIPE:
|
||||
return "endpoint stalled";
|
||||
case -EMSGSIZE:
|
||||
|
@ -200,13 +203,13 @@ static char *get_usb_statmsg(int status)
|
|||
case -ENOENT:
|
||||
return "unlinked (sync)";
|
||||
case -EINPROGRESS:
|
||||
return "pending";
|
||||
return "URB still pending";
|
||||
case -EPROTO:
|
||||
return "bit stuffing error, timeout, or unknown USB error";
|
||||
return "bitstuff error, timeout, or unknown USB error";
|
||||
case -EILSEQ:
|
||||
return "CRC mismatch, timeout, or unknown USB error";
|
||||
case -ETIME:
|
||||
return "timed out";
|
||||
return "USB response timeout";
|
||||
case -EPIPE:
|
||||
return "endpoint stalled";
|
||||
case -ECOMM:
|
||||
|
@ -214,15 +217,15 @@ static char *get_usb_statmsg(int status)
|
|||
case -ENOSR:
|
||||
return "OUT buffer underrun";
|
||||
case -EOVERFLOW:
|
||||
return "too much data";
|
||||
return "endpoint babble";
|
||||
case -EREMOTEIO:
|
||||
return "short packet detected";
|
||||
return "short packet";
|
||||
case -ENODEV:
|
||||
return "device removed";
|
||||
case -EXDEV:
|
||||
return "partial isochronous transfer";
|
||||
return "partial isoc transfer";
|
||||
case -EINVAL:
|
||||
return "invalid argument";
|
||||
return "ISO madness";
|
||||
case -ECONNRESET:
|
||||
return "unlinked (async)";
|
||||
case -ESHUTDOWN:
|
||||
|
@ -350,7 +353,7 @@ static inline void error_hangup(struct bc_state *bcs)
|
|||
* reset Gigaset device because of an unrecoverable error
|
||||
* This function may be called from any context, and takes care of
|
||||
* scheduling the necessary actions for execution outside of interrupt context.
|
||||
* cs->lock must not be held.
|
||||
* cs->hw.bas->lock must not be held.
|
||||
* argument:
|
||||
* controller state structure
|
||||
*/
|
||||
|
@ -358,7 +361,9 @@ static inline void error_reset(struct cardstate *cs)
|
|||
{
|
||||
/* reset interrupt pipe to recover (ignore errors) */
|
||||
update_basstate(cs->hw.bas, BS_RESETTING, 0);
|
||||
req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT);
|
||||
if (req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT))
|
||||
/* submission failed, escalate to USB port reset */
|
||||
usb_queue_reset_device(cs->hw.bas->interface);
|
||||
}
|
||||
|
||||
/* check_pending
|
||||
|
@ -438,23 +443,27 @@ static void cmd_in_timeout(unsigned long data)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ucs->retry_cmd_in++ < BAS_RETRY) {
|
||||
dev_notice(cs->dev, "control read: timeout, retry %d\n",
|
||||
ucs->retry_cmd_in);
|
||||
rc = atread_submit(cs, BAS_TIMEOUT);
|
||||
if (rc >= 0 || rc == -ENODEV)
|
||||
/* resubmitted or disconnected */
|
||||
/* - bypass regular exit block */
|
||||
return;
|
||||
} else {
|
||||
if (ucs->retry_cmd_in++ >= BAS_RETRY) {
|
||||
dev_err(cs->dev,
|
||||
"control read: timeout, giving up after %d tries\n",
|
||||
ucs->retry_cmd_in);
|
||||
kfree(ucs->rcvbuf);
|
||||
ucs->rcvbuf = NULL;
|
||||
ucs->rcvbuf_size = 0;
|
||||
error_reset(cs);
|
||||
return;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_USBREQ, "%s: timeout, retry %d",
|
||||
__func__, ucs->retry_cmd_in);
|
||||
rc = atread_submit(cs, BAS_TIMEOUT);
|
||||
if (rc < 0) {
|
||||
kfree(ucs->rcvbuf);
|
||||
ucs->rcvbuf = NULL;
|
||||
ucs->rcvbuf_size = 0;
|
||||
if (rc != -ENODEV)
|
||||
error_reset(cs);
|
||||
}
|
||||
kfree(ucs->rcvbuf);
|
||||
ucs->rcvbuf = NULL;
|
||||
ucs->rcvbuf_size = 0;
|
||||
error_reset(cs);
|
||||
}
|
||||
|
||||
/* read_ctrl_callback
|
||||
|
@ -470,18 +479,11 @@ static void read_ctrl_callback(struct urb *urb)
|
|||
struct cardstate *cs = inbuf->cs;
|
||||
struct bas_cardstate *ucs = cs->hw.bas;
|
||||
int status = urb->status;
|
||||
int have_data = 0;
|
||||
unsigned numbytes;
|
||||
int rc;
|
||||
|
||||
update_basstate(ucs, 0, BS_ATRDPEND);
|
||||
wake_up(&ucs->waitqueue);
|
||||
|
||||
if (!ucs->rcvbuf_size) {
|
||||
dev_warn(cs->dev, "%s: no receive in progress\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
del_timer(&ucs->timer_cmd_in);
|
||||
|
||||
switch (status) {
|
||||
|
@ -495,19 +497,10 @@ static void read_ctrl_callback(struct urb *urb)
|
|||
numbytes = ucs->rcvbuf_size;
|
||||
}
|
||||
|
||||
/* copy received bytes to inbuf */
|
||||
have_data = gigaset_fill_inbuf(inbuf, ucs->rcvbuf, numbytes);
|
||||
|
||||
if (unlikely(numbytes < ucs->rcvbuf_size)) {
|
||||
/* incomplete - resubmit for remaining bytes */
|
||||
ucs->rcvbuf_size -= numbytes;
|
||||
ucs->retry_cmd_in = 0;
|
||||
rc = atread_submit(cs, BAS_TIMEOUT);
|
||||
if (rc >= 0 || rc == -ENODEV)
|
||||
/* resubmitted or disconnected */
|
||||
/* - bypass regular exit block */
|
||||
return;
|
||||
error_reset(cs);
|
||||
/* copy received bytes to inbuf, notify event layer */
|
||||
if (gigaset_fill_inbuf(inbuf, ucs->rcvbuf, numbytes)) {
|
||||
gig_dbg(DEBUG_INTR, "%s-->BH", __func__);
|
||||
gigaset_schedule_event(cs);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -516,37 +509,32 @@ static void read_ctrl_callback(struct urb *urb)
|
|||
case -EINPROGRESS: /* pending */
|
||||
case -ENODEV: /* device removed */
|
||||
case -ESHUTDOWN: /* device shut down */
|
||||
/* no action necessary */
|
||||
/* no further action necessary */
|
||||
gig_dbg(DEBUG_USBREQ, "%s: %s",
|
||||
__func__, get_usb_statmsg(status));
|
||||
break;
|
||||
|
||||
default: /* severe trouble */
|
||||
dev_warn(cs->dev, "control read: %s\n",
|
||||
get_usb_statmsg(status));
|
||||
default: /* other errors: retry */
|
||||
if (ucs->retry_cmd_in++ < BAS_RETRY) {
|
||||
dev_notice(cs->dev, "control read: retry %d\n",
|
||||
ucs->retry_cmd_in);
|
||||
gig_dbg(DEBUG_USBREQ, "%s: %s, retry %d", __func__,
|
||||
get_usb_statmsg(status), ucs->retry_cmd_in);
|
||||
rc = atread_submit(cs, BAS_TIMEOUT);
|
||||
if (rc >= 0 || rc == -ENODEV)
|
||||
/* resubmitted or disconnected */
|
||||
/* - bypass regular exit block */
|
||||
if (rc >= 0)
|
||||
/* successfully resubmitted, skip freeing */
|
||||
return;
|
||||
} else {
|
||||
dev_err(cs->dev,
|
||||
"control read: giving up after %d tries\n",
|
||||
ucs->retry_cmd_in);
|
||||
if (rc == -ENODEV)
|
||||
/* disconnect, no further action necessary */
|
||||
break;
|
||||
}
|
||||
dev_err(cs->dev, "control read: %s, giving up after %d tries\n",
|
||||
get_usb_statmsg(status), ucs->retry_cmd_in);
|
||||
error_reset(cs);
|
||||
}
|
||||
|
||||
/* read finished, free buffer */
|
||||
kfree(ucs->rcvbuf);
|
||||
ucs->rcvbuf = NULL;
|
||||
ucs->rcvbuf_size = 0;
|
||||
if (have_data) {
|
||||
gig_dbg(DEBUG_INTR, "%s-->BH", __func__);
|
||||
gigaset_schedule_event(cs);
|
||||
}
|
||||
}
|
||||
|
||||
/* atread_submit
|
||||
|
@ -605,14 +593,67 @@ static int atread_submit(struct cardstate *cs, int timeout)
|
|||
|
||||
if (timeout > 0) {
|
||||
gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout);
|
||||
ucs->timer_cmd_in.expires = jiffies + timeout * HZ / 10;
|
||||
ucs->timer_cmd_in.data = (unsigned long) cs;
|
||||
ucs->timer_cmd_in.function = cmd_in_timeout;
|
||||
add_timer(&ucs->timer_cmd_in);
|
||||
mod_timer(&ucs->timer_cmd_in, jiffies + timeout * HZ / 10);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* int_in_work
|
||||
* workqueue routine to clear halt on interrupt in endpoint
|
||||
*/
|
||||
|
||||
static void int_in_work(struct work_struct *work)
|
||||
{
|
||||
struct bas_cardstate *ucs =
|
||||
container_of(work, struct bas_cardstate, int_in_wq);
|
||||
struct urb *urb = ucs->urb_int_in;
|
||||
struct cardstate *cs = urb->context;
|
||||
int rc;
|
||||
|
||||
/* clear halt condition */
|
||||
rc = usb_clear_halt(ucs->udev, urb->pipe);
|
||||
gig_dbg(DEBUG_USBREQ, "clear_halt: %s", get_usb_rcmsg(rc));
|
||||
if (rc == 0)
|
||||
/* success, resubmit interrupt read URB */
|
||||
rc = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (rc != 0 && rc != -ENODEV) {
|
||||
dev_err(cs->dev, "clear halt failed: %s\n", get_usb_rcmsg(rc));
|
||||
rc = usb_lock_device_for_reset(ucs->udev, ucs->interface);
|
||||
if (rc == 0) {
|
||||
rc = usb_reset_device(ucs->udev);
|
||||
usb_unlock_device(ucs->udev);
|
||||
}
|
||||
}
|
||||
ucs->retry_int_in = 0;
|
||||
}
|
||||
|
||||
/* int_in_resubmit
|
||||
* timer routine for interrupt read delayed resubmit
|
||||
* argument:
|
||||
* controller state structure
|
||||
*/
|
||||
static void int_in_resubmit(unsigned long data)
|
||||
{
|
||||
struct cardstate *cs = (struct cardstate *) data;
|
||||
struct bas_cardstate *ucs = cs->hw.bas;
|
||||
int rc;
|
||||
|
||||
if (ucs->retry_int_in++ >= BAS_RETRY) {
|
||||
dev_err(cs->dev, "interrupt read: giving up after %d tries\n",
|
||||
ucs->retry_int_in);
|
||||
usb_queue_reset_device(ucs->interface);
|
||||
return;
|
||||
}
|
||||
|
||||
gig_dbg(DEBUG_USBREQ, "%s: retry %d", __func__, ucs->retry_int_in);
|
||||
rc = usb_submit_urb(ucs->urb_int_in, GFP_ATOMIC);
|
||||
if (rc != 0 && rc != -ENODEV) {
|
||||
dev_err(cs->dev, "could not resubmit interrupt URB: %s\n",
|
||||
get_usb_rcmsg(rc));
|
||||
usb_queue_reset_device(ucs->interface);
|
||||
}
|
||||
}
|
||||
|
||||
/* read_int_callback
|
||||
* USB completion handler for interrupt pipe input
|
||||
* called by the USB subsystem in interrupt context
|
||||
|
@ -633,19 +674,29 @@ static void read_int_callback(struct urb *urb)
|
|||
|
||||
switch (status) {
|
||||
case 0: /* success */
|
||||
ucs->retry_int_in = 0;
|
||||
break;
|
||||
case -EPIPE: /* endpoint stalled */
|
||||
schedule_work(&ucs->int_in_wq);
|
||||
/* fall through */
|
||||
case -ENOENT: /* cancelled */
|
||||
case -ECONNRESET: /* cancelled (async) */
|
||||
case -EINPROGRESS: /* pending */
|
||||
/* ignore silently */
|
||||
case -ENODEV: /* device removed */
|
||||
case -ESHUTDOWN: /* device shut down */
|
||||
/* no further action necessary */
|
||||
gig_dbg(DEBUG_USBREQ, "%s: %s",
|
||||
__func__, get_usb_statmsg(status));
|
||||
return;
|
||||
case -ENODEV: /* device removed */
|
||||
case -ESHUTDOWN: /* device shut down */
|
||||
gig_dbg(DEBUG_USBREQ, "%s: device disconnected", __func__);
|
||||
case -EPROTO: /* protocol error or unplug */
|
||||
case -EILSEQ:
|
||||
case -ETIME:
|
||||
/* resubmit after delay */
|
||||
gig_dbg(DEBUG_USBREQ, "%s: %s",
|
||||
__func__, get_usb_statmsg(status));
|
||||
mod_timer(&ucs->timer_int_in, jiffies + HZ / 10);
|
||||
return;
|
||||
default: /* severe trouble */
|
||||
default: /* other errors: just resubmit */
|
||||
dev_warn(cs->dev, "interrupt read: %s\n",
|
||||
get_usb_statmsg(status));
|
||||
goto resubmit;
|
||||
|
@ -723,6 +774,13 @@ static void read_int_callback(struct urb *urb)
|
|||
break;
|
||||
}
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
if (ucs->basstate & BS_ATRDPEND) {
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
dev_warn(cs->dev,
|
||||
"HD_RECEIVEATDATA_ACK(%d) during HD_READ_ATMESSAGE(%d) ignored\n",
|
||||
l, ucs->rcvbuf_size);
|
||||
break;
|
||||
}
|
||||
if (ucs->rcvbuf_size) {
|
||||
/* throw away previous buffer - we have no queue */
|
||||
dev_err(cs->dev,
|
||||
|
@ -735,7 +793,6 @@ static void read_int_callback(struct urb *urb)
|
|||
if (ucs->rcvbuf == NULL) {
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
dev_err(cs->dev, "out of memory receiving AT data\n");
|
||||
error_reset(cs);
|
||||
break;
|
||||
}
|
||||
ucs->rcvbuf_size = l;
|
||||
|
@ -745,13 +802,10 @@ static void read_int_callback(struct urb *urb)
|
|||
kfree(ucs->rcvbuf);
|
||||
ucs->rcvbuf = NULL;
|
||||
ucs->rcvbuf_size = 0;
|
||||
if (rc != -ENODEV) {
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
error_reset(cs);
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
if (rc < 0 && rc != -ENODEV)
|
||||
error_reset(cs);
|
||||
break;
|
||||
|
||||
case HD_RESET_INTERRUPT_PIPE_ACK:
|
||||
|
@ -818,6 +872,7 @@ static void read_iso_callback(struct urb *urb)
|
|||
tasklet_hi_schedule(&ubc->rcvd_tasklet);
|
||||
} else {
|
||||
/* tasklet still busy, drop data and resubmit URB */
|
||||
gig_dbg(DEBUG_ISO, "%s: overrun", __func__);
|
||||
ubc->loststatus = status;
|
||||
for (i = 0; i < BAS_NUMFRAMES; i++) {
|
||||
ubc->isoinlost += urb->iso_frame_desc[i].actual_length;
|
||||
|
@ -833,13 +888,11 @@ static void read_iso_callback(struct urb *urb)
|
|||
urb->dev = bcs->cs->hw.bas->udev;
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->number_of_packets = BAS_NUMFRAMES;
|
||||
gig_dbg(DEBUG_ISO, "%s: isoc read overrun/resubmit",
|
||||
__func__);
|
||||
rc = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (unlikely(rc != 0 && rc != -ENODEV)) {
|
||||
dev_err(bcs->cs->dev,
|
||||
"could not resubmit isochronous read "
|
||||
"URB: %s\n", get_usb_rcmsg(rc));
|
||||
"could not resubmit isoc read URB: %s\n",
|
||||
get_usb_rcmsg(rc));
|
||||
dump_urb(DEBUG_ISO, "isoc read", urb);
|
||||
error_hangup(bcs);
|
||||
}
|
||||
|
@ -1081,7 +1134,7 @@ static int submit_iso_write_urb(struct isow_urbctx_t *ucx)
|
|||
gig_dbg(DEBUG_ISO, "%s: disconnected", __func__);
|
||||
else
|
||||
dev_err(ucx->bcs->cs->dev,
|
||||
"could not submit isochronous write URB: %s\n",
|
||||
"could not submit isoc write URB: %s\n",
|
||||
get_usb_rcmsg(rc));
|
||||
return rc;
|
||||
}
|
||||
|
@ -1126,7 +1179,7 @@ static void write_iso_tasklet(unsigned long data)
|
|||
ubc->isooutovfl = NULL;
|
||||
spin_unlock_irqrestore(&ubc->isooutlock, flags);
|
||||
if (ovfl) {
|
||||
dev_err(cs->dev, "isochronous write buffer underrun\n");
|
||||
dev_err(cs->dev, "isoc write underrun\n");
|
||||
error_hangup(bcs);
|
||||
break;
|
||||
}
|
||||
|
@ -1151,7 +1204,7 @@ static void write_iso_tasklet(unsigned long data)
|
|||
if (next) {
|
||||
/* couldn't put it back */
|
||||
dev_err(cs->dev,
|
||||
"losing isochronous write URB\n");
|
||||
"losing isoc write URB\n");
|
||||
error_hangup(bcs);
|
||||
}
|
||||
}
|
||||
|
@ -1178,10 +1231,10 @@ static void write_iso_tasklet(unsigned long data)
|
|||
if (ifd->status ||
|
||||
ifd->actual_length != ifd->length) {
|
||||
dev_warn(cs->dev,
|
||||
"isochronous write: frame %d: %s, "
|
||||
"only %d of %d bytes sent\n",
|
||||
i, get_usb_statmsg(ifd->status),
|
||||
ifd->actual_length, ifd->length);
|
||||
"isoc write: frame %d[%d/%d]: %s\n",
|
||||
i, ifd->actual_length,
|
||||
ifd->length,
|
||||
get_usb_statmsg(ifd->status));
|
||||
offset = (ifd->offset +
|
||||
ifd->actual_length)
|
||||
% BAS_OUTBUFSIZE;
|
||||
|
@ -1190,11 +1243,11 @@ static void write_iso_tasklet(unsigned long data)
|
|||
}
|
||||
break;
|
||||
case -EPIPE: /* stall - probably underrun */
|
||||
dev_err(cs->dev, "isochronous write stalled\n");
|
||||
dev_err(cs->dev, "isoc write: stalled\n");
|
||||
error_hangup(bcs);
|
||||
break;
|
||||
default: /* severe trouble */
|
||||
dev_warn(cs->dev, "isochronous write: %s\n",
|
||||
default: /* other errors */
|
||||
dev_warn(cs->dev, "isoc write: %s\n",
|
||||
get_usb_statmsg(status));
|
||||
}
|
||||
|
||||
|
@ -1250,6 +1303,7 @@ static void read_iso_tasklet(unsigned long data)
|
|||
struct cardstate *cs = bcs->cs;
|
||||
struct urb *urb;
|
||||
int status;
|
||||
struct usb_iso_packet_descriptor *ifd;
|
||||
char *rcvbuf;
|
||||
unsigned long flags;
|
||||
int totleft, numbytes, offset, frame, rc;
|
||||
|
@ -1267,8 +1321,7 @@ static void read_iso_tasklet(unsigned long data)
|
|||
ubc->isoindone = NULL;
|
||||
if (unlikely(ubc->loststatus != -EINPROGRESS)) {
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read overrun, "
|
||||
"dropped URB with status: %s, %d bytes lost\n",
|
||||
"isoc read overrun, URB dropped (status: %s, %d bytes)\n",
|
||||
get_usb_statmsg(ubc->loststatus),
|
||||
ubc->isoinlost);
|
||||
ubc->loststatus = -EINPROGRESS;
|
||||
|
@ -1298,11 +1351,11 @@ static void read_iso_tasklet(unsigned long data)
|
|||
__func__, get_usb_statmsg(status));
|
||||
continue; /* -> skip */
|
||||
case -EPIPE:
|
||||
dev_err(cs->dev, "isochronous read stalled\n");
|
||||
dev_err(cs->dev, "isoc read: stalled\n");
|
||||
error_hangup(bcs);
|
||||
continue; /* -> skip */
|
||||
default: /* severe trouble */
|
||||
dev_warn(cs->dev, "isochronous read: %s\n",
|
||||
default: /* other error */
|
||||
dev_warn(cs->dev, "isoc read: %s\n",
|
||||
get_usb_statmsg(status));
|
||||
goto error;
|
||||
}
|
||||
|
@ -1310,40 +1363,52 @@ static void read_iso_tasklet(unsigned long data)
|
|||
rcvbuf = urb->transfer_buffer;
|
||||
totleft = urb->actual_length;
|
||||
for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) {
|
||||
numbytes = urb->iso_frame_desc[frame].actual_length;
|
||||
if (unlikely(urb->iso_frame_desc[frame].status))
|
||||
ifd = &urb->iso_frame_desc[frame];
|
||||
numbytes = ifd->actual_length;
|
||||
switch (ifd->status) {
|
||||
case 0: /* success */
|
||||
break;
|
||||
case -EPROTO: /* protocol error or unplug */
|
||||
case -EILSEQ:
|
||||
case -ETIME:
|
||||
/* probably just disconnected, ignore */
|
||||
gig_dbg(DEBUG_ISO,
|
||||
"isoc read: frame %d[%d]: %s\n",
|
||||
frame, numbytes,
|
||||
get_usb_statmsg(ifd->status));
|
||||
break;
|
||||
default: /* other error */
|
||||
/* report, assume transferred bytes are ok */
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read: frame %d[%d]: %s\n",
|
||||
"isoc read: frame %d[%d]: %s\n",
|
||||
frame, numbytes,
|
||||
get_usb_statmsg(
|
||||
urb->iso_frame_desc[frame].status));
|
||||
get_usb_statmsg(ifd->status));
|
||||
}
|
||||
if (unlikely(numbytes > BAS_MAXFRAME))
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read: frame %d: "
|
||||
"numbytes (%d) > BAS_MAXFRAME\n",
|
||||
frame, numbytes);
|
||||
"isoc read: frame %d[%d]: %s\n",
|
||||
frame, numbytes,
|
||||
"exceeds max frame size");
|
||||
if (unlikely(numbytes > totleft)) {
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read: frame %d: "
|
||||
"numbytes (%d) > totleft (%d)\n",
|
||||
frame, numbytes, totleft);
|
||||
"isoc read: frame %d[%d]: %s\n",
|
||||
frame, numbytes,
|
||||
"exceeds total transfer length");
|
||||
numbytes = totleft;
|
||||
}
|
||||
offset = urb->iso_frame_desc[frame].offset;
|
||||
offset = ifd->offset;
|
||||
if (unlikely(offset + numbytes > BAS_INBUFSIZE)) {
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read: frame %d: "
|
||||
"offset (%d) + numbytes (%d) "
|
||||
"> BAS_INBUFSIZE\n",
|
||||
frame, offset, numbytes);
|
||||
"isoc read: frame %d[%d]: %s\n",
|
||||
frame, numbytes,
|
||||
"exceeds end of buffer");
|
||||
numbytes = BAS_INBUFSIZE - offset;
|
||||
}
|
||||
gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
|
||||
totleft -= numbytes;
|
||||
}
|
||||
if (unlikely(totleft > 0))
|
||||
dev_warn(cs->dev,
|
||||
"isochronous read: %d data bytes missing\n",
|
||||
dev_warn(cs->dev, "isoc read: %d data bytes missing\n",
|
||||
totleft);
|
||||
|
||||
error:
|
||||
|
@ -1359,9 +1424,9 @@ error:
|
|||
rc = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (unlikely(rc != 0 && rc != -ENODEV)) {
|
||||
dev_err(cs->dev,
|
||||
"could not resubmit isochronous read URB: %s\n",
|
||||
"could not resubmit isoc read URB: %s\n",
|
||||
get_usb_rcmsg(rc));
|
||||
dump_urb(DEBUG_ISO, "resubmit iso read", urb);
|
||||
dump_urb(DEBUG_ISO, "resubmit isoc read", urb);
|
||||
error_hangup(bcs);
|
||||
}
|
||||
}
|
||||
|
@ -1373,12 +1438,12 @@ error:
|
|||
/* req_timeout
|
||||
* timeout routine for control output request
|
||||
* argument:
|
||||
* B channel control structure
|
||||
* controller state structure
|
||||
*/
|
||||
static void req_timeout(unsigned long data)
|
||||
{
|
||||
struct bc_state *bcs = (struct bc_state *) data;
|
||||
struct bas_cardstate *ucs = bcs->cs->hw.bas;
|
||||
struct cardstate *cs = (struct cardstate *) data;
|
||||
struct bas_cardstate *ucs = cs->hw.bas;
|
||||
int pending;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -1395,38 +1460,44 @@ static void req_timeout(unsigned long data)
|
|||
break;
|
||||
|
||||
case HD_OPEN_ATCHANNEL:
|
||||
dev_err(bcs->cs->dev, "timeout opening AT channel\n");
|
||||
error_reset(bcs->cs);
|
||||
dev_err(cs->dev, "timeout opening AT channel\n");
|
||||
error_reset(cs);
|
||||
break;
|
||||
|
||||
case HD_OPEN_B1CHANNEL:
|
||||
dev_err(cs->dev, "timeout opening channel 1\n");
|
||||
error_hangup(&cs->bcs[0]);
|
||||
break;
|
||||
|
||||
case HD_OPEN_B2CHANNEL:
|
||||
case HD_OPEN_B1CHANNEL:
|
||||
dev_err(bcs->cs->dev, "timeout opening channel %d\n",
|
||||
bcs->channel + 1);
|
||||
error_hangup(bcs);
|
||||
dev_err(cs->dev, "timeout opening channel 2\n");
|
||||
error_hangup(&cs->bcs[1]);
|
||||
break;
|
||||
|
||||
case HD_CLOSE_ATCHANNEL:
|
||||
dev_err(bcs->cs->dev, "timeout closing AT channel\n");
|
||||
error_reset(bcs->cs);
|
||||
dev_err(cs->dev, "timeout closing AT channel\n");
|
||||
error_reset(cs);
|
||||
break;
|
||||
|
||||
case HD_CLOSE_B1CHANNEL:
|
||||
dev_err(cs->dev, "timeout closing channel 1\n");
|
||||
error_reset(cs);
|
||||
break;
|
||||
|
||||
case HD_CLOSE_B2CHANNEL:
|
||||
case HD_CLOSE_B1CHANNEL:
|
||||
dev_err(bcs->cs->dev, "timeout closing channel %d\n",
|
||||
bcs->channel + 1);
|
||||
error_reset(bcs->cs);
|
||||
dev_err(cs->dev, "timeout closing channel 2\n");
|
||||
error_reset(cs);
|
||||
break;
|
||||
|
||||
case HD_RESET_INTERRUPT_PIPE:
|
||||
/* error recovery escalation */
|
||||
dev_err(bcs->cs->dev,
|
||||
dev_err(cs->dev,
|
||||
"reset interrupt pipe timeout, attempting USB reset\n");
|
||||
usb_queue_reset_device(bcs->cs->hw.bas->interface);
|
||||
usb_queue_reset_device(ucs->interface);
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n",
|
||||
dev_warn(cs->dev, "request 0x%02x timed out, clearing\n",
|
||||
pending);
|
||||
}
|
||||
|
||||
|
@ -1557,10 +1628,7 @@ static int req_submit(struct bc_state *bcs, int req, int val, int timeout)
|
|||
|
||||
if (timeout > 0) {
|
||||
gig_dbg(DEBUG_USBREQ, "setting timeout of %d/10 secs", timeout);
|
||||
ucs->timer_ctrl.expires = jiffies + timeout * HZ / 10;
|
||||
ucs->timer_ctrl.data = (unsigned long) bcs;
|
||||
ucs->timer_ctrl.function = req_timeout;
|
||||
add_timer(&ucs->timer_ctrl);
|
||||
mod_timer(&ucs->timer_ctrl, jiffies + timeout * HZ / 10);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&ucs->lock, flags);
|
||||
|
@ -1590,21 +1658,20 @@ static int gigaset_init_bchannel(struct bc_state *bcs)
|
|||
|
||||
if (cs->hw.bas->basstate & BS_SUSPEND) {
|
||||
dev_notice(cs->dev,
|
||||
"not starting isochronous I/O, "
|
||||
"suspend in progress\n");
|
||||
"not starting isoc I/O, suspend in progress\n");
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
return -EHOSTUNREACH;
|
||||
}
|
||||
|
||||
ret = starturbs(bcs);
|
||||
if (ret < 0) {
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
dev_err(cs->dev,
|
||||
"could not start isochronous I/O for channel B%d: %s\n",
|
||||
"could not start isoc I/O for channel B%d: %s\n",
|
||||
bcs->channel + 1,
|
||||
ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret));
|
||||
if (ret != -ENODEV)
|
||||
error_hangup(bcs);
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1614,11 +1681,11 @@ static int gigaset_init_bchannel(struct bc_state *bcs)
|
|||
dev_err(cs->dev, "could not open channel B%d\n",
|
||||
bcs->channel + 1);
|
||||
stopurbs(bcs->hw.bas);
|
||||
if (ret != -ENODEV)
|
||||
error_hangup(bcs);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
if (ret < 0 && ret != -ENODEV)
|
||||
error_hangup(bcs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1826,10 +1893,7 @@ static int atwrite_submit(struct cardstate *cs, unsigned char *buf, int len)
|
|||
if (!(update_basstate(ucs, BS_ATTIMER, BS_ATREADY) & BS_ATTIMER)) {
|
||||
gig_dbg(DEBUG_OUTPUT, "setting ATREADY timeout of %d/10 secs",
|
||||
ATRDY_TIMEOUT);
|
||||
ucs->timer_atrdy.expires = jiffies + ATRDY_TIMEOUT * HZ / 10;
|
||||
ucs->timer_atrdy.data = (unsigned long) cs;
|
||||
ucs->timer_atrdy.function = atrdy_timeout;
|
||||
add_timer(&ucs->timer_atrdy);
|
||||
mod_timer(&ucs->timer_atrdy, jiffies + ATRDY_TIMEOUT * HZ / 10);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1914,6 +1978,28 @@ static int gigaset_write_cmd(struct cardstate *cs, struct cmdbuf_t *cb)
|
|||
* The next command will reopen the AT channel automatically.
|
||||
*/
|
||||
if (cb->len == 3 && !memcmp(cb->buf, "+++", 3)) {
|
||||
/* If an HD_RECEIVEATDATA_ACK message remains unhandled
|
||||
* because of an error, the base never sends another one.
|
||||
* The response channel is thus effectively blocked.
|
||||
* Closing and reopening the AT channel does *not* clear
|
||||
* this condition.
|
||||
* As a stopgap measure, submit a zero-length AT read
|
||||
* before closing the AT channel. This has the undocumented
|
||||
* effect of triggering a new HD_RECEIVEATDATA_ACK message
|
||||
* from the base if necessary.
|
||||
* The subsequent AT channel close then discards any pending
|
||||
* messages.
|
||||
*/
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
if (!(cs->hw.bas->basstate & BS_ATRDPEND)) {
|
||||
kfree(cs->hw.bas->rcvbuf);
|
||||
cs->hw.bas->rcvbuf = NULL;
|
||||
cs->hw.bas->rcvbuf_size = 0;
|
||||
cs->hw.bas->retry_cmd_in = 0;
|
||||
atread_submit(cs, 0);
|
||||
}
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
|
||||
rc = req_submit(cs->bcs, HD_CLOSE_ATCHANNEL, 0, BAS_TIMEOUT);
|
||||
if (cb->wake_tasklet)
|
||||
tasklet_schedule(cb->wake_tasklet);
|
||||
|
@ -2010,7 +2096,7 @@ static int gigaset_freebcshw(struct bc_state *bcs)
|
|||
|
||||
/* kill URBs and tasklets before freeing - better safe than sorry */
|
||||
ubc->running = 0;
|
||||
gig_dbg(DEBUG_INIT, "%s: killing iso URBs", __func__);
|
||||
gig_dbg(DEBUG_INIT, "%s: killing isoc URBs", __func__);
|
||||
for (i = 0; i < BAS_OUTURBS; ++i) {
|
||||
usb_kill_urb(ubc->isoouturbs[i].urb);
|
||||
usb_free_urb(ubc->isoouturbs[i].urb);
|
||||
|
@ -2131,10 +2217,12 @@ static int gigaset_initcshw(struct cardstate *cs)
|
|||
ucs->pending = 0;
|
||||
|
||||
ucs->basstate = 0;
|
||||
init_timer(&ucs->timer_ctrl);
|
||||
init_timer(&ucs->timer_atrdy);
|
||||
init_timer(&ucs->timer_cmd_in);
|
||||
setup_timer(&ucs->timer_ctrl, req_timeout, (unsigned long) cs);
|
||||
setup_timer(&ucs->timer_atrdy, atrdy_timeout, (unsigned long) cs);
|
||||
setup_timer(&ucs->timer_cmd_in, cmd_in_timeout, (unsigned long) cs);
|
||||
setup_timer(&ucs->timer_int_in, int_in_resubmit, (unsigned long) cs);
|
||||
init_waitqueue_head(&ucs->waitqueue);
|
||||
INIT_WORK(&ucs->int_in_wq, int_in_work);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -2282,6 +2370,7 @@ static int gigaset_probe(struct usb_interface *interface,
|
|||
get_usb_rcmsg(rc));
|
||||
goto error;
|
||||
}
|
||||
ucs->retry_int_in = 0;
|
||||
|
||||
/* tell the device that the driver is ready */
|
||||
rc = req_submit(cs->bcs, HD_DEVICE_INIT_ACK, 0, 0);
|
||||
|
@ -2334,10 +2423,12 @@ static void gigaset_disconnect(struct usb_interface *interface)
|
|||
/* stop driver (common part) */
|
||||
gigaset_stop(cs);
|
||||
|
||||
/* stop timers and URBs, free ressources */
|
||||
/* stop delayed work and URBs, free ressources */
|
||||
del_timer_sync(&ucs->timer_ctrl);
|
||||
del_timer_sync(&ucs->timer_atrdy);
|
||||
del_timer_sync(&ucs->timer_cmd_in);
|
||||
del_timer_sync(&ucs->timer_int_in);
|
||||
cancel_work_sync(&ucs->int_in_wq);
|
||||
freeurbs(cs);
|
||||
usb_set_intfdata(interface, NULL);
|
||||
kfree(ucs->rcvbuf);
|
||||
|
@ -2400,10 +2491,14 @@ static int gigaset_suspend(struct usb_interface *intf, pm_message_t message)
|
|||
/* in case of timeout, proceed anyway */
|
||||
}
|
||||
|
||||
/* kill all URBs and timers that might still be pending */
|
||||
/* kill all URBs and delayed work that might still be pending */
|
||||
usb_kill_urb(ucs->urb_ctrl);
|
||||
usb_kill_urb(ucs->urb_int_in);
|
||||
del_timer_sync(&ucs->timer_ctrl);
|
||||
del_timer_sync(&ucs->timer_atrdy);
|
||||
del_timer_sync(&ucs->timer_cmd_in);
|
||||
del_timer_sync(&ucs->timer_int_in);
|
||||
cancel_work_sync(&ucs->int_in_wq);
|
||||
|
||||
gig_dbg(DEBUG_SUSPEND, "suspend complete");
|
||||
return 0;
|
||||
|
@ -2425,6 +2520,7 @@ static int gigaset_resume(struct usb_interface *intf)
|
|||
get_usb_rcmsg(rc));
|
||||
return rc;
|
||||
}
|
||||
ucs->retry_int_in = 0;
|
||||
|
||||
/* clear suspend flag to reallow activity */
|
||||
update_basstate(ucs, 0, BS_SUSPEND);
|
||||
|
|
|
@ -1026,32 +1026,6 @@ struct cardstate *gigaset_get_cs_by_id(int id)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void gigaset_debugdrivers(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
static struct cardstate *cs;
|
||||
struct gigaset_driver *drv;
|
||||
unsigned i;
|
||||
|
||||
spin_lock_irqsave(&driver_lock, flags);
|
||||
list_for_each_entry(drv, &drivers, list) {
|
||||
gig_dbg(DEBUG_DRIVER, "driver %p", drv);
|
||||
spin_lock(&drv->lock);
|
||||
for (i = 0; i < drv->minors; ++i) {
|
||||
gig_dbg(DEBUG_DRIVER, " index %u", i);
|
||||
cs = drv->cs + i;
|
||||
gig_dbg(DEBUG_DRIVER, " cardstate %p", cs);
|
||||
gig_dbg(DEBUG_DRIVER, " flags 0x%02x", cs->flags);
|
||||
gig_dbg(DEBUG_DRIVER, " minor_index %u",
|
||||
cs->minor_index);
|
||||
gig_dbg(DEBUG_DRIVER, " driver %p", cs->driver);
|
||||
gig_dbg(DEBUG_DRIVER, " i4l id %d", cs->myid);
|
||||
}
|
||||
spin_unlock(&drv->lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&driver_lock, flags);
|
||||
}
|
||||
|
||||
static struct cardstate *gigaset_get_cs_by_minor(unsigned minor)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
@ -70,7 +70,6 @@ enum debuglevel {
|
|||
DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */
|
||||
DEBUG_LLDATA = 0x00100, /* sent/received LL data */
|
||||
DEBUG_EVENT = 0x00200, /* event processing */
|
||||
DEBUG_DRIVER = 0x00400, /* driver structure */
|
||||
DEBUG_HDLC = 0x00800, /* M10x HDLC processing */
|
||||
DEBUG_CHANNEL = 0x01000, /* channel allocation/deallocation */
|
||||
DEBUG_TRANSCMD = 0x02000, /* AT-COMMANDS+RESPONSES */
|
||||
|
@ -727,7 +726,7 @@ struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
|
|||
|
||||
/* Deallocate driver structure. */
|
||||
void gigaset_freedriver(struct gigaset_driver *drv);
|
||||
void gigaset_debugdrivers(void);
|
||||
|
||||
struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty);
|
||||
struct cardstate *gigaset_get_cs_by_id(int id);
|
||||
void gigaset_blockdriver(struct gigaset_driver *drv);
|
||||
|
|
|
@ -201,8 +201,6 @@ static int command_from_LL(isdn_ctrl *cntrl)
|
|||
int i;
|
||||
size_t l;
|
||||
|
||||
gigaset_debugdrivers();
|
||||
|
||||
gig_dbg(DEBUG_CMD, "driver: %d, command: %d, arg: 0x%lx",
|
||||
cntrl->driver, cntrl->command, cntrl->arg);
|
||||
|
||||
|
|
|
@ -842,13 +842,14 @@ static inline void trans_receive(unsigned char *src, unsigned count,
|
|||
|
||||
if (unlikely(bcs->ignore)) {
|
||||
bcs->ignore--;
|
||||
hdlc_flush(bcs);
|
||||
return;
|
||||
}
|
||||
skb = bcs->rx_skb;
|
||||
if (skb == NULL)
|
||||
if (skb == NULL) {
|
||||
skb = gigaset_new_rx_skb(bcs);
|
||||
bcs->hw.bas->goodbytes += skb->len;
|
||||
if (skb == NULL)
|
||||
return;
|
||||
}
|
||||
dobytes = bcs->rx_bufsize - skb->len;
|
||||
while (count > 0) {
|
||||
dst = skb_put(skb, count < dobytes ? count : dobytes);
|
||||
|
@ -860,6 +861,7 @@ static inline void trans_receive(unsigned char *src, unsigned count,
|
|||
if (dobytes == 0) {
|
||||
dump_bytes(DEBUG_STREAM_DUMP,
|
||||
"rcv data", skb->data, skb->len);
|
||||
bcs->hw.bas->goodbytes += skb->len;
|
||||
gigaset_skb_rcvd(bcs, skb);
|
||||
skb = gigaset_new_rx_skb(bcs);
|
||||
if (skb == NULL)
|
||||
|
|
|
@ -862,7 +862,7 @@ void diva_mnt_add_xdi_adapter (const DESCRIPTOR* d) {
|
|||
diva_os_spin_lock_magic_t old_irql, old_irql1;
|
||||
dword sec, usec, logical, serial, org_mask;
|
||||
int id, best_id = 0, free_id = -1;
|
||||
char tmp[256];
|
||||
char tmp[128];
|
||||
diva_dbg_entry_head_t* pmsg = NULL;
|
||||
int len;
|
||||
word size;
|
||||
|
|
|
@ -249,7 +249,7 @@ typedef struct _DbgHandle_
|
|||
} regTime ; /* timestamp for registration */
|
||||
void *pIrp ; /* ptr to pending i/o request */
|
||||
unsigned long dbgMask ; /* current debug mask */
|
||||
char drvName[16] ; /* ASCII name of registered driver */
|
||||
char drvName[128] ; /* ASCII name of registered driver */
|
||||
char drvTag[64] ; /* revision string */
|
||||
DbgEnd dbg_end ; /* function for debug closing */
|
||||
DbgLog dbg_prt ; /* function for debug appending */
|
||||
|
|
|
@ -234,13 +234,14 @@ read_fifo(struct IsdnCardState *cs, u_char fifo, int trans_max)
|
|||
count++;
|
||||
if (count > trans_max)
|
||||
count = trans_max; /* limit length */
|
||||
if ((skb = dev_alloc_skb(count))) {
|
||||
dst = skb_put(skb, count);
|
||||
while (count--)
|
||||
skb = dev_alloc_skb(count);
|
||||
if (skb) {
|
||||
dst = skb_put(skb, count);
|
||||
while (count--)
|
||||
*dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
|
||||
return(skb);
|
||||
}
|
||||
else return(NULL); /* no memory */
|
||||
return skb;
|
||||
} else
|
||||
return NULL; /* no memory */
|
||||
}
|
||||
|
||||
do {
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include <linux/isdn.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mutex.h>
|
||||
#include "isdn_common.h"
|
||||
#include "isdn_tty.h"
|
||||
#ifdef CONFIG_ISDN_AUDIO
|
||||
|
@ -28,6 +28,7 @@
|
|||
|
||||
/* Prototypes */
|
||||
|
||||
static DEFINE_MUTEX(modem_info_mutex);
|
||||
static int isdn_tty_edit_at(const char *, int, modem_info *);
|
||||
static void isdn_tty_check_esc(const u_char *, u_char, int, int *, u_long *);
|
||||
static void isdn_tty_modem_reset_regs(modem_info *, int);
|
||||
|
@ -1354,14 +1355,14 @@ isdn_tty_tiocmget(struct tty_struct *tty, struct file *file)
|
|||
if (tty->flags & (1 << TTY_IO_ERROR))
|
||||
return -EIO;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&modem_info_mutex);
|
||||
#ifdef ISDN_DEBUG_MODEM_IOCTL
|
||||
printk(KERN_DEBUG "ttyI%d ioctl TIOCMGET\n", info->line);
|
||||
#endif
|
||||
|
||||
control = info->mcr;
|
||||
status = info->msr;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&modem_info_mutex);
|
||||
return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
|
||||
| ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
|
||||
| ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
|
||||
|
@ -1385,7 +1386,7 @@ isdn_tty_tiocmset(struct tty_struct *tty, struct file *file,
|
|||
printk(KERN_DEBUG "ttyI%d ioctl TIOCMxxx: %x %x\n", info->line, set, clear);
|
||||
#endif
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&modem_info_mutex);
|
||||
if (set & TIOCM_RTS)
|
||||
info->mcr |= UART_MCR_RTS;
|
||||
if (set & TIOCM_DTR) {
|
||||
|
@ -1407,7 +1408,7 @@ isdn_tty_tiocmset(struct tty_struct *tty, struct file *file,
|
|||
isdn_tty_modem_hup(info, 1);
|
||||
}
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&modem_info_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3515,7 +3516,7 @@ isdn_tty_parse_at(modem_info * info)
|
|||
{
|
||||
atemu *m = &info->emu;
|
||||
char *p;
|
||||
char ds[40];
|
||||
char ds[ISDN_MSNLEN];
|
||||
|
||||
#ifdef ISDN_DEBUG_AT
|
||||
printk(KERN_DEBUG "AT: '%s'\n", m->mdmcmd);
|
||||
|
@ -3594,7 +3595,7 @@ isdn_tty_parse_at(modem_info * info)
|
|||
break;
|
||||
case '3':
|
||||
p++;
|
||||
sprintf(ds, "\r\n%d", info->emu.charge);
|
||||
snprintf(ds, sizeof(ds), "\r\n%d", info->emu.charge);
|
||||
isdn_tty_at_cout(ds, info);
|
||||
break;
|
||||
default:;
|
||||
|
|
|
@ -1237,6 +1237,7 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
|
|||
if (dsp->cmx_delay)
|
||||
dsp->rx_W = (dsp->rx_R + dsp->cmx_delay)
|
||||
& CMX_BUFF_MASK;
|
||||
else
|
||||
dsp->rx_W = (dsp->rx_R + (dsp_poll >> 1))
|
||||
& CMX_BUFF_MASK;
|
||||
} else {
|
||||
|
|
|
@ -972,7 +972,7 @@ channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
|
|||
if (debug & DEBUG_L1OIP_SOCKET)
|
||||
printk(KERN_DEBUG "%s: got new ip address from user "
|
||||
"space.\n", __func__);
|
||||
l1oip_socket_open(hc);
|
||||
l1oip_socket_open(hc);
|
||||
break;
|
||||
case MISDN_CTRL_UNSETPEER:
|
||||
if (debug & DEBUG_L1OIP_SOCKET)
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mISDNif.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include "core.h"
|
||||
|
||||
static u_int *debug;
|
||||
|
@ -205,13 +204,7 @@ mISDNStackd(void *data)
|
|||
struct mISDNstack *st = data;
|
||||
int err = 0;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
lock_kernel();
|
||||
#endif
|
||||
sigfillset(¤t->blocked);
|
||||
#ifdef CONFIG_SMP
|
||||
unlock_kernel();
|
||||
#endif
|
||||
if (*debug & DEBUG_MSG_THREAD)
|
||||
printk(KERN_DEBUG "mISDNStackd %s started\n",
|
||||
dev_name(&st->dev->dev));
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#include "callbacks.h"
|
||||
|
||||
|
||||
char * isdn_state_table[] = {
|
||||
const char * const isdn_state_table[] = {
|
||||
"Closed",
|
||||
"Call initiated",
|
||||
"Overlap sending",
|
||||
|
|
|
@ -90,7 +90,7 @@ struct fsm_timer_entry {
|
|||
unsigned long timeout; /* in seconds */
|
||||
};
|
||||
|
||||
extern char * isdn_state_table[];
|
||||
extern const char * const isdn_state_table[];
|
||||
|
||||
void pcbit_fsm_event(struct pcbit_dev *, struct pcbit_chan *,
|
||||
unsigned short event, struct callb_data *);
|
||||
|
|
|
@ -337,10 +337,10 @@ el2_probe1(struct net_device *dev, int ioaddr)
|
|||
/* Finish setting the board's parameters. */
|
||||
ei_status.stop_page = EL2_MB1_STOP_PG;
|
||||
ei_status.word16 = wordlength;
|
||||
ei_status.reset_8390 = &el2_reset_8390;
|
||||
ei_status.get_8390_hdr = &el2_get_8390_hdr;
|
||||
ei_status.block_input = &el2_block_input;
|
||||
ei_status.block_output = &el2_block_output;
|
||||
ei_status.reset_8390 = el2_reset_8390;
|
||||
ei_status.get_8390_hdr = el2_get_8390_hdr;
|
||||
ei_status.block_input = el2_block_input;
|
||||
ei_status.block_output = el2_block_output;
|
||||
|
||||
if (dev->irq == 2)
|
||||
dev->irq = 9;
|
||||
|
|
|
@ -662,7 +662,9 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
|
|||
pr_warning(" *** Warning: this IRQ is unlikely to work! ***\n");
|
||||
|
||||
{
|
||||
char *ram_split[] = { "5:3", "3:1", "1:1", "3:5" };
|
||||
static const char * const ram_split[] = {
|
||||
"5:3", "3:1", "1:1", "3:5"
|
||||
};
|
||||
__u32 config;
|
||||
EL3WINDOW(3);
|
||||
vp->available_media = inw(ioaddr + Wn3_Options);
|
||||
|
@ -734,7 +736,7 @@ static int corkscrew_open(struct net_device *dev)
|
|||
init_timer(&vp->timer);
|
||||
vp->timer.expires = jiffies + media_tbl[dev->if_port].wait;
|
||||
vp->timer.data = (unsigned long) dev;
|
||||
vp->timer.function = &corkscrew_timer; /* timer handler */
|
||||
vp->timer.function = corkscrew_timer; /* timer handler */
|
||||
add_timer(&vp->timer);
|
||||
} else
|
||||
dev->if_port = vp->default_media;
|
||||
|
|
|
@ -287,7 +287,7 @@ static int elmc_open(struct net_device *dev)
|
|||
|
||||
elmc_id_attn586(); /* disable interrupts */
|
||||
|
||||
ret = request_irq(dev->irq, elmc_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
|
||||
ret = request_irq(dev->irq, elmc_interrupt, IRQF_SHARED,
|
||||
dev->name, dev);
|
||||
if (ret) {
|
||||
pr_err("%s: couldn't get irq %d\n", dev->name, dev->irq);
|
||||
|
@ -463,7 +463,7 @@ static int __init do_elmc_probe(struct net_device *dev)
|
|||
|
||||
/* we didn't find any 3c523 in the slots we checked for */
|
||||
if (slot == MCA_NOTFOUND)
|
||||
return ((base_addr || irq) ? -ENXIO : -ENODEV);
|
||||
return (base_addr || irq) ? -ENXIO : -ENODEV;
|
||||
|
||||
mca_set_adapter_name(slot, "3Com 3c523 Etherlink/MC");
|
||||
mca_set_adapter_procfn(slot, (MCA_ProcFn) elmc_getinfo, dev);
|
||||
|
|
|
@ -443,7 +443,7 @@ static int __init mc32_probe1(struct net_device *dev, int slot)
|
|||
* Grab the IRQ
|
||||
*/
|
||||
|
||||
err = request_irq(dev->irq, mc32_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DRV_NAME, dev);
|
||||
err = request_irq(dev->irq, mc32_interrupt, IRQF_SHARED, DRV_NAME, dev);
|
||||
if (err) {
|
||||
release_region(dev->base_addr, MC32_IO_EXTENT);
|
||||
pr_err("%s: unable to get IRQ %d.\n", DRV_NAME, dev->irq);
|
||||
|
|
|
@ -1742,7 +1742,7 @@ vortex_open(struct net_device *dev)
|
|||
|
||||
/* Use the now-standard shared IRQ implementation. */
|
||||
if ((retval = request_irq(dev->irq, vp->full_bus_master_rx ?
|
||||
&boomerang_interrupt : &vortex_interrupt, IRQF_SHARED, dev->name, dev))) {
|
||||
boomerang_interrupt : vortex_interrupt, IRQF_SHARED, dev->name, dev))) {
|
||||
pr_err("%s: Could not reserve IRQ %d\n", dev->name, dev->irq);
|
||||
goto err;
|
||||
}
|
||||
|
|
|
@ -561,7 +561,7 @@ rx_status_loop:
|
|||
if (cp_rx_csum_ok(status))
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
else
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
|
||||
skb_put(skb, len);
|
||||
|
||||
|
@ -754,7 +754,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|||
}
|
||||
|
||||
#if CP_VLAN_TAG_USED
|
||||
if (cp->vlgrp && vlan_tx_tag_present(skb))
|
||||
if (vlan_tx_tag_present(skb))
|
||||
vlan_tag = TxVlanTag | swab16(vlan_tx_tag_get(skb));
|
||||
#endif
|
||||
|
||||
|
|
|
@ -180,6 +180,13 @@ config NET_SB1000
|
|||
|
||||
source "drivers/net/arcnet/Kconfig"
|
||||
|
||||
config MII
|
||||
tristate "Generic Media Independent Interface device support"
|
||||
help
|
||||
Most ethernet controllers have MII transceiver either as an external
|
||||
or internal device. It is safe to say Y or M here even if your
|
||||
ethernet card lacks MII.
|
||||
|
||||
source "drivers/net/phy/Kconfig"
|
||||
|
||||
#
|
||||
|
@ -215,13 +222,6 @@ menuconfig NET_ETHERNET
|
|||
|
||||
if NET_ETHERNET
|
||||
|
||||
config MII
|
||||
tristate "Generic Media Independent Interface device support"
|
||||
help
|
||||
Most ethernet controllers have MII transceiver either as an external
|
||||
or internal device. It is safe to say Y or M here even if your
|
||||
ethernet card lack MII.
|
||||
|
||||
config MACB
|
||||
tristate "Atmel MACB support"
|
||||
depends on HAVE_NET_MACB
|
||||
|
@ -2518,6 +2518,18 @@ config S6GMAC
|
|||
|
||||
source "drivers/net/stmmac/Kconfig"
|
||||
|
||||
config PCH_GBE
|
||||
tristate "PCH Gigabit Ethernet"
|
||||
depends on PCI
|
||||
---help---
|
||||
This is a gigabit ethernet driver for Topcliff PCH.
|
||||
Topcliff PCH is the platform controller hub that is used in Intel's
|
||||
general embedded platform.
|
||||
Topcliff PCH has Gigabit Ethernet interface.
|
||||
Using this interface, it is able to access system devices connected
|
||||
to Gigabit Ethernet.
|
||||
This driver enables Gigabit Ethernet function.
|
||||
|
||||
endif # NETDEV_1000
|
||||
|
||||
#
|
||||
|
@ -2872,6 +2884,20 @@ config QLGE
|
|||
To compile this driver as a module, choose M here: the module
|
||||
will be called qlge.
|
||||
|
||||
config BNA
|
||||
tristate "Brocade 1010/1020 10Gb Ethernet Driver support"
|
||||
depends on PCI
|
||||
---help---
|
||||
This driver supports Brocade 1010/1020 10Gb CEE capable Ethernet
|
||||
cards.
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called bna.
|
||||
|
||||
For general information and support, go to the Brocade support
|
||||
website at:
|
||||
|
||||
<http://support.brocade.com>
|
||||
|
||||
source "drivers/net/sfc/Kconfig"
|
||||
|
||||
source "drivers/net/benet/Kconfig"
|
||||
|
@ -3205,6 +3231,17 @@ config PPPOE
|
|||
which contains instruction on how to use this driver (under
|
||||
the heading "Kernel mode PPPoE").
|
||||
|
||||
config PPTP
|
||||
tristate "PPP over IPv4 (PPTP) (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && PPP && NET_IPGRE_DEMUX
|
||||
help
|
||||
Support for PPP over IPv4.(Point-to-Point Tunneling Protocol)
|
||||
|
||||
This driver requires pppd plugin to work in client mode or
|
||||
modified pptpd (poptop) to work in server mode.
|
||||
See http://accel-pptp.sourceforge.net/ for information how to
|
||||
utilize this module.
|
||||
|
||||
config PPPOATM
|
||||
tristate "PPP over ATM"
|
||||
depends on ATM && PPP
|
||||
|
|
|
@ -34,6 +34,7 @@ obj-$(CONFIG_ENIC) += enic/
|
|||
obj-$(CONFIG_JME) += jme.o
|
||||
obj-$(CONFIG_BE2NET) += benet/
|
||||
obj-$(CONFIG_VMXNET3) += vmxnet3/
|
||||
obj-$(CONFIG_BNA) += bna/
|
||||
|
||||
gianfar_driver-objs := gianfar.o \
|
||||
gianfar_ethtool.o \
|
||||
|
@ -162,6 +163,7 @@ obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
|
|||
obj-$(CONFIG_PPP_MPPE) += ppp_mppe.o
|
||||
obj-$(CONFIG_PPPOE) += pppox.o pppoe.o
|
||||
obj-$(CONFIG_PPPOL2TP) += pppox.o
|
||||
obj-$(CONFIG_PPTP) += pppox.o pptp.o
|
||||
|
||||
obj-$(CONFIG_SLIP) += slip.o
|
||||
obj-$(CONFIG_SLHC) += slhc.o
|
||||
|
@ -296,3 +298,4 @@ obj-$(CONFIG_WIMAX) += wimax/
|
|||
obj-$(CONFIG_CAIF) += caif/
|
||||
|
||||
obj-$(CONFIG_OCTEON_MGMT_ETHERNET) += octeon/
|
||||
obj-$(CONFIG_PCH_GBE) += pch_gbe/
|
||||
|
|
|
@ -2033,7 +2033,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
|
|||
skb->csum = htons(csum);
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
} else {
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
}
|
||||
|
||||
/* send it up */
|
||||
|
|
|
@ -396,7 +396,7 @@ static int amd8111e_set_coalesce(struct net_device * dev, enum coal_mode cmod)
|
|||
event_count = coal_conf->rx_event_count;
|
||||
if( timeout > MAX_TIMEOUT ||
|
||||
event_count > MAX_EVENT_COUNT )
|
||||
return -EINVAL;
|
||||
return -EINVAL;
|
||||
|
||||
timeout = timeout * DELAY_TIMER_CONV;
|
||||
writel(VAL0|STINTEN, mmio+INTEN0);
|
||||
|
@ -409,7 +409,7 @@ static int amd8111e_set_coalesce(struct net_device * dev, enum coal_mode cmod)
|
|||
event_count = coal_conf->tx_event_count;
|
||||
if( timeout > MAX_TIMEOUT ||
|
||||
event_count > MAX_EVENT_COUNT )
|
||||
return -EINVAL;
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
timeout = timeout * DELAY_TIMER_CONV;
|
||||
|
@ -903,18 +903,18 @@ static int amd8111e_read_mib(void __iomem *mmio, u8 MIB_COUNTER)
|
|||
}
|
||||
|
||||
/*
|
||||
This function reads the mib registers and returns the hardware statistics. It updates previous internal driver statistics with new values.
|
||||
*/
|
||||
static struct net_device_stats *amd8111e_get_stats(struct net_device * dev)
|
||||
* This function reads the mib registers and returns the hardware statistics.
|
||||
* It updates previous internal driver statistics with new values.
|
||||
*/
|
||||
static struct net_device_stats *amd8111e_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct amd8111e_priv *lp = netdev_priv(dev);
|
||||
void __iomem *mmio = lp->mmio;
|
||||
unsigned long flags;
|
||||
/* struct net_device_stats *prev_stats = &lp->prev_stats; */
|
||||
struct net_device_stats* new_stats = &lp->stats;
|
||||
struct net_device_stats *new_stats = &dev->stats;
|
||||
|
||||
if(!lp->opened)
|
||||
return &lp->stats;
|
||||
if (!lp->opened)
|
||||
return new_stats;
|
||||
spin_lock_irqsave (&lp->lock, flags);
|
||||
|
||||
/* stats.rx_packets */
|
||||
|
@ -1315,7 +1315,7 @@ static netdev_tx_t amd8111e_start_xmit(struct sk_buff *skb,
|
|||
lp->tx_ring[tx_index].tx_flags = 0;
|
||||
|
||||
#if AMD8111E_VLAN_TAG_USED
|
||||
if((lp->vlgrp != NULL) && vlan_tx_tag_present(skb)){
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
lp->tx_ring[tx_index].tag_ctrl_cmd |=
|
||||
cpu_to_le16(TCC_VLAN_INSERT);
|
||||
lp->tx_ring[tx_index].tag_ctrl_info =
|
||||
|
|
|
@ -787,7 +787,6 @@ struct amd8111e_priv{
|
|||
struct vlan_group *vlgrp;
|
||||
#endif
|
||||
char opened;
|
||||
struct net_device_stats stats;
|
||||
unsigned int drv_rx_errors;
|
||||
struct amd8111e_coalesce_conf coal_conf;
|
||||
|
||||
|
|
|
@ -244,7 +244,7 @@ static int ipddp_delete(struct ipddp_route *rt)
|
|||
}
|
||||
|
||||
spin_unlock_bh(&ipddp_route_lock);
|
||||
return (-ENOENT);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -259,10 +259,10 @@ static struct ipddp_route* __ipddp_find_route(struct ipddp_route *rt)
|
|||
if(f->ip == rt->ip &&
|
||||
f->at.s_net == rt->at.s_net &&
|
||||
f->at.s_node == rt->at.s_node)
|
||||
return (f);
|
||||
return f;
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ipddp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
|
@ -279,7 +279,7 @@ static int ipddp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
switch(cmd)
|
||||
{
|
||||
case SIOCADDIPDDPRT:
|
||||
return (ipddp_create(&rcp));
|
||||
return ipddp_create(&rcp);
|
||||
|
||||
case SIOCFINDIPDDPRT:
|
||||
spin_lock_bh(&ipddp_route_lock);
|
||||
|
@ -297,7 +297,7 @@ static int ipddp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
return -ENOENT;
|
||||
|
||||
case SIOCDELIPDDPRT:
|
||||
return (ipddp_delete(&rcp));
|
||||
return ipddp_delete(&rcp);
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
|
@ -727,7 +727,7 @@ static int sendup_buffer (struct net_device *dev)
|
|||
|
||||
if (ltc->command != LT_RCVLAP) {
|
||||
printk("unknown command 0x%02x from ltpc card\n",ltc->command);
|
||||
return(-1);
|
||||
return -1;
|
||||
}
|
||||
dnode = ltc->dnode;
|
||||
snode = ltc->snode;
|
||||
|
|
|
@ -300,8 +300,6 @@ am79c961_open(struct net_device *dev)
|
|||
struct dev_priv *priv = netdev_priv(dev);
|
||||
int ret;
|
||||
|
||||
memset (&priv->stats, 0, sizeof (priv->stats));
|
||||
|
||||
ret = request_irq(dev->irq, am79c961_interrupt, 0, dev->name, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -347,8 +345,7 @@ am79c961_close(struct net_device *dev)
|
|||
*/
|
||||
static struct net_device_stats *am79c961_getstats (struct net_device *dev)
|
||||
{
|
||||
struct dev_priv *priv = netdev_priv(dev);
|
||||
return &priv->stats;
|
||||
return &dev->stats;
|
||||
}
|
||||
|
||||
static void am79c961_mc_hash(char *addr, unsigned short *hash)
|
||||
|
@ -510,14 +507,14 @@ am79c961_rx(struct net_device *dev, struct dev_priv *priv)
|
|||
|
||||
if ((status & (RMD_ERR|RMD_STP|RMD_ENP)) != (RMD_STP|RMD_ENP)) {
|
||||
am_writeword (dev, hdraddr + 2, RMD_OWN);
|
||||
priv->stats.rx_errors ++;
|
||||
dev->stats.rx_errors++;
|
||||
if (status & RMD_ERR) {
|
||||
if (status & RMD_FRAM)
|
||||
priv->stats.rx_frame_errors ++;
|
||||
dev->stats.rx_frame_errors++;
|
||||
if (status & RMD_CRC)
|
||||
priv->stats.rx_crc_errors ++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
} else if (status & RMD_STP)
|
||||
priv->stats.rx_length_errors ++;
|
||||
dev->stats.rx_length_errors++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -531,12 +528,12 @@ am79c961_rx(struct net_device *dev, struct dev_priv *priv)
|
|||
am_writeword(dev, hdraddr + 2, RMD_OWN);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_rx(skb);
|
||||
priv->stats.rx_bytes += len;
|
||||
priv->stats.rx_packets ++;
|
||||
dev->stats.rx_bytes += len;
|
||||
dev->stats.rx_packets++;
|
||||
} else {
|
||||
am_writeword (dev, hdraddr + 2, RMD_OWN);
|
||||
printk (KERN_WARNING "%s: memory squeeze, dropping packet.\n", dev->name);
|
||||
priv->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
|
@ -565,7 +562,7 @@ am79c961_tx(struct net_device *dev, struct dev_priv *priv)
|
|||
if (status & TMD_ERR) {
|
||||
u_int status2;
|
||||
|
||||
priv->stats.tx_errors ++;
|
||||
dev->stats.tx_errors++;
|
||||
|
||||
status2 = am_readword (dev, hdraddr + 6);
|
||||
|
||||
|
@ -575,18 +572,18 @@ am79c961_tx(struct net_device *dev, struct dev_priv *priv)
|
|||
am_writeword (dev, hdraddr + 6, 0);
|
||||
|
||||
if (status2 & TST_RTRY)
|
||||
priv->stats.collisions += 16;
|
||||
dev->stats.collisions += 16;
|
||||
if (status2 & TST_LCOL)
|
||||
priv->stats.tx_window_errors ++;
|
||||
dev->stats.tx_window_errors++;
|
||||
if (status2 & TST_LCAR)
|
||||
priv->stats.tx_carrier_errors ++;
|
||||
dev->stats.tx_carrier_errors++;
|
||||
if (status2 & TST_UFLO)
|
||||
priv->stats.tx_fifo_errors ++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
continue;
|
||||
}
|
||||
priv->stats.tx_packets ++;
|
||||
dev->stats.tx_packets++;
|
||||
len = am_readword (dev, hdraddr + 4);
|
||||
priv->stats.tx_bytes += -len;
|
||||
dev->stats.tx_bytes += -len;
|
||||
} while (priv->txtail != priv->txhead);
|
||||
|
||||
netif_wake_queue(dev);
|
||||
|
@ -616,7 +613,7 @@ am79c961_interrupt(int irq, void *dev_id)
|
|||
}
|
||||
if (status & CSR0_MISS) {
|
||||
handled = 1;
|
||||
priv->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
if (status & CSR0_CERR) {
|
||||
handled = 1;
|
||||
|
|
|
@ -130,7 +130,6 @@
|
|||
#define ISALED0_LNKST 0x8000
|
||||
|
||||
struct dev_priv {
|
||||
struct net_device_stats stats;
|
||||
unsigned long rxbuffer[RX_BUFFERS];
|
||||
unsigned long txbuffer[TX_BUFFERS];
|
||||
unsigned char txhead;
|
||||
|
|
|
@ -175,8 +175,6 @@ struct ep93xx_priv
|
|||
struct net_device *dev;
|
||||
struct napi_struct napi;
|
||||
|
||||
struct net_device_stats stats;
|
||||
|
||||
struct mii_if_info mii;
|
||||
u8 mdc_divisor;
|
||||
};
|
||||
|
@ -230,12 +228,6 @@ static void ep93xx_mdio_write(struct net_device *dev, int phy_id, int reg, int d
|
|||
pr_info("mdio write timed out\n");
|
||||
}
|
||||
|
||||
static struct net_device_stats *ep93xx_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct ep93xx_priv *ep = netdev_priv(dev);
|
||||
return &(ep->stats);
|
||||
}
|
||||
|
||||
static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
||||
{
|
||||
struct ep93xx_priv *ep = netdev_priv(dev);
|
||||
|
@ -267,15 +259,15 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
|||
pr_crit("entry mismatch %.8x %.8x\n", rstat0, rstat1);
|
||||
|
||||
if (!(rstat0 & RSTAT0_RWE)) {
|
||||
ep->stats.rx_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
if (rstat0 & RSTAT0_OE)
|
||||
ep->stats.rx_fifo_errors++;
|
||||
dev->stats.rx_fifo_errors++;
|
||||
if (rstat0 & RSTAT0_FE)
|
||||
ep->stats.rx_frame_errors++;
|
||||
dev->stats.rx_frame_errors++;
|
||||
if (rstat0 & (RSTAT0_RUNT | RSTAT0_EDATA))
|
||||
ep->stats.rx_length_errors++;
|
||||
dev->stats.rx_length_errors++;
|
||||
if (rstat0 & RSTAT0_CRCE)
|
||||
ep->stats.rx_crc_errors++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -300,10 +292,10 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
|||
|
||||
netif_receive_skb(skb);
|
||||
|
||||
ep->stats.rx_packets++;
|
||||
ep->stats.rx_bytes += length;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += length;
|
||||
} else {
|
||||
ep->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
|
||||
err:
|
||||
|
@ -359,7 +351,7 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
int entry;
|
||||
|
||||
if (unlikely(skb->len > MAX_PKT_SIZE)) {
|
||||
ep->stats.tx_dropped++;
|
||||
dev->stats.tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
@ -415,17 +407,17 @@ static void ep93xx_tx_complete(struct net_device *dev)
|
|||
if (tstat0 & TSTAT0_TXWE) {
|
||||
int length = ep->descs->tdesc[entry].tdesc1 & 0xfff;
|
||||
|
||||
ep->stats.tx_packets++;
|
||||
ep->stats.tx_bytes += length;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += length;
|
||||
} else {
|
||||
ep->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
}
|
||||
|
||||
if (tstat0 & TSTAT0_OW)
|
||||
ep->stats.tx_window_errors++;
|
||||
dev->stats.tx_window_errors++;
|
||||
if (tstat0 & TSTAT0_TXU)
|
||||
ep->stats.tx_fifo_errors++;
|
||||
ep->stats.collisions += (tstat0 >> 16) & 0x1f;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
dev->stats.collisions += (tstat0 >> 16) & 0x1f;
|
||||
|
||||
ep->tx_clean_pointer = (entry + 1) & (TX_QUEUE_ENTRIES - 1);
|
||||
if (ep->tx_pending == TX_QUEUE_ENTRIES)
|
||||
|
@ -758,7 +750,6 @@ static const struct net_device_ops ep93xx_netdev_ops = {
|
|||
.ndo_open = ep93xx_open,
|
||||
.ndo_stop = ep93xx_close,
|
||||
.ndo_start_xmit = ep93xx_xmit,
|
||||
.ndo_get_stats = ep93xx_get_stats,
|
||||
.ndo_do_ioctl = ep93xx_ioctl,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
|
|
|
@ -68,7 +68,6 @@ static int ether1_open(struct net_device *dev);
|
|||
static int ether1_sendpacket(struct sk_buff *skb, struct net_device *dev);
|
||||
static irqreturn_t ether1_interrupt(int irq, void *dev_id);
|
||||
static int ether1_close(struct net_device *dev);
|
||||
static struct net_device_stats *ether1_getstats(struct net_device *dev);
|
||||
static void ether1_setmulticastlist(struct net_device *dev);
|
||||
static void ether1_timeout(struct net_device *dev);
|
||||
|
||||
|
@ -649,8 +648,6 @@ ether1_open (struct net_device *dev)
|
|||
if (request_irq(dev->irq, ether1_interrupt, 0, "ether1", dev))
|
||||
return -EAGAIN;
|
||||
|
||||
memset (&priv(dev)->stats, 0, sizeof (struct net_device_stats));
|
||||
|
||||
if (ether1_init_for_open (dev)) {
|
||||
free_irq (dev->irq, dev);
|
||||
return -EAGAIN;
|
||||
|
@ -673,7 +670,7 @@ ether1_timeout(struct net_device *dev)
|
|||
if (ether1_init_for_open (dev))
|
||||
printk (KERN_ERR "%s: unable to restart interface\n", dev->name);
|
||||
|
||||
priv(dev)->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
|
@ -802,21 +799,21 @@ again:
|
|||
|
||||
while (nop.nop_status & STAT_COMPLETE) {
|
||||
if (nop.nop_status & STAT_OK) {
|
||||
priv(dev)->stats.tx_packets ++;
|
||||
priv(dev)->stats.collisions += (nop.nop_status & STAT_COLLISIONS);
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.collisions += (nop.nop_status & STAT_COLLISIONS);
|
||||
} else {
|
||||
priv(dev)->stats.tx_errors ++;
|
||||
dev->stats.tx_errors++;
|
||||
|
||||
if (nop.nop_status & STAT_COLLAFTERTX)
|
||||
priv(dev)->stats.collisions ++;
|
||||
dev->stats.collisions++;
|
||||
if (nop.nop_status & STAT_NOCARRIER)
|
||||
priv(dev)->stats.tx_carrier_errors ++;
|
||||
dev->stats.tx_carrier_errors++;
|
||||
if (nop.nop_status & STAT_TXLOSTCTS)
|
||||
printk (KERN_WARNING "%s: cts lost\n", dev->name);
|
||||
if (nop.nop_status & STAT_TXSLOWDMA)
|
||||
priv(dev)->stats.tx_fifo_errors ++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
if (nop.nop_status & STAT_COLLEXCESSIVE)
|
||||
priv(dev)->stats.collisions += 16;
|
||||
dev->stats.collisions += 16;
|
||||
}
|
||||
|
||||
if (nop.nop_link == caddr) {
|
||||
|
@ -879,13 +876,13 @@ ether1_recv_done (struct net_device *dev)
|
|||
|
||||
skb->protocol = eth_type_trans (skb, dev);
|
||||
netif_rx (skb);
|
||||
priv(dev)->stats.rx_packets ++;
|
||||
dev->stats.rx_packets++;
|
||||
} else
|
||||
priv(dev)->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
} else {
|
||||
printk(KERN_WARNING "%s: %s\n", dev->name,
|
||||
(rbd.rbd_status & RBD_EOF) ? "oversized packet" : "acnt not valid");
|
||||
priv(dev)->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
|
||||
nexttail = ether1_readw(dev, priv(dev)->rx_tail, rfd_t, rfd_link, NORMALIRQS);
|
||||
|
@ -939,7 +936,7 @@ ether1_interrupt (int irq, void *dev_id)
|
|||
printk (KERN_WARNING "%s: RU went not ready: RU suspended\n", dev->name);
|
||||
ether1_writew(dev, SCB_CMDRXRESUME, SCB_ADDR, scb_t, scb_command, NORMALIRQS);
|
||||
writeb(CTRL_CA, REG_CONTROL);
|
||||
priv(dev)->stats.rx_dropped ++; /* we suspended due to lack of buffer space */
|
||||
dev->stats.rx_dropped++; /* we suspended due to lack of buffer space */
|
||||
} else
|
||||
printk(KERN_WARNING "%s: RU went not ready: %04X\n", dev->name,
|
||||
ether1_readw(dev, SCB_ADDR, scb_t, scb_status, NORMALIRQS));
|
||||
|
@ -962,12 +959,6 @@ ether1_close (struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct net_device_stats *
|
||||
ether1_getstats (struct net_device *dev)
|
||||
{
|
||||
return &priv(dev)->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set or clear the multicast filter for this adaptor.
|
||||
* num_addrs == -1 Promiscuous mode, receive all packets.
|
||||
|
@ -994,7 +985,6 @@ static const struct net_device_ops ether1_netdev_ops = {
|
|||
.ndo_open = ether1_open,
|
||||
.ndo_stop = ether1_close,
|
||||
.ndo_start_xmit = ether1_sendpacket,
|
||||
.ndo_get_stats = ether1_getstats,
|
||||
.ndo_set_multicast_list = ether1_setmulticastlist,
|
||||
.ndo_tx_timeout = ether1_timeout,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
|
||||
struct ether1_priv {
|
||||
void __iomem *base;
|
||||
struct net_device_stats stats;
|
||||
unsigned int tx_link;
|
||||
unsigned int tx_head;
|
||||
volatile unsigned int tx_tail;
|
||||
|
|
|
@ -81,7 +81,6 @@ static int ether3_open (struct net_device *dev);
|
|||
static int ether3_sendpacket (struct sk_buff *skb, struct net_device *dev);
|
||||
static irqreturn_t ether3_interrupt (int irq, void *dev_id);
|
||||
static int ether3_close (struct net_device *dev);
|
||||
static struct net_device_stats *ether3_getstats (struct net_device *dev);
|
||||
static void ether3_setmulticastlist (struct net_device *dev);
|
||||
static void ether3_timeout(struct net_device *dev);
|
||||
|
||||
|
@ -323,8 +322,6 @@ ether3_init_for_open(struct net_device *dev)
|
|||
{
|
||||
int i;
|
||||
|
||||
memset(&priv(dev)->stats, 0, sizeof(struct net_device_stats));
|
||||
|
||||
/* Reset the chip */
|
||||
ether3_outw(CFG2_RESET, REG_CONFIG2);
|
||||
udelay(4);
|
||||
|
@ -441,15 +438,6 @@ ether3_close(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current statistics. This may be called with the card open or
|
||||
* closed.
|
||||
*/
|
||||
static struct net_device_stats *ether3_getstats(struct net_device *dev)
|
||||
{
|
||||
return &priv(dev)->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set or clear promiscuous/multicast mode filter for this adaptor.
|
||||
*
|
||||
|
@ -490,7 +478,7 @@ static void ether3_timeout(struct net_device *dev)
|
|||
local_irq_restore(flags);
|
||||
|
||||
priv(dev)->regs.config2 |= CFG2_CTRLO;
|
||||
priv(dev)->stats.tx_errors += 1;
|
||||
dev->stats.tx_errors += 1;
|
||||
ether3_outw(priv(dev)->regs.config2, REG_CONFIG2);
|
||||
priv(dev)->tx_head = priv(dev)->tx_tail = 0;
|
||||
|
||||
|
@ -509,7 +497,7 @@ ether3_sendpacket(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
if (priv(dev)->broken) {
|
||||
dev_kfree_skb(skb);
|
||||
priv(dev)->stats.tx_dropped ++;
|
||||
dev->stats.tx_dropped++;
|
||||
netif_start_queue(dev);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
@ -673,7 +661,7 @@ if (next_ptr < RX_START || next_ptr >= RX_END) {
|
|||
} else
|
||||
goto dropping;
|
||||
} else {
|
||||
struct net_device_stats *stats = &priv(dev)->stats;
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
ether3_outw(next_ptr >> 8, REG_RECVEND);
|
||||
if (status & RXSTAT_OVERSIZE) stats->rx_over_errors ++;
|
||||
if (status & RXSTAT_CRCERROR) stats->rx_crc_errors ++;
|
||||
|
@ -685,14 +673,14 @@ if (next_ptr < RX_START || next_ptr >= RX_END) {
|
|||
while (-- maxcnt);
|
||||
|
||||
done:
|
||||
priv(dev)->stats.rx_packets += received;
|
||||
dev->stats.rx_packets += received;
|
||||
priv(dev)->rx_head = next_ptr;
|
||||
/*
|
||||
* If rx went off line, then that means that the buffer may be full. We
|
||||
* have dropped at least one packet.
|
||||
*/
|
||||
if (!(ether3_inw(REG_STATUS) & STAT_RXON)) {
|
||||
priv(dev)->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
ether3_outw(next_ptr, REG_RECVPTR);
|
||||
ether3_outw(priv(dev)->regs.command | CMD_RXON, REG_COMMAND);
|
||||
}
|
||||
|
@ -710,7 +698,7 @@ dropping:{
|
|||
last_warned = jiffies;
|
||||
printk("%s: memory squeeze, dropping packet.\n", dev->name);
|
||||
}
|
||||
priv(dev)->stats.rx_dropped ++;
|
||||
dev->stats.rx_dropped++;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
@ -743,13 +731,13 @@ static void ether3_tx(struct net_device *dev)
|
|||
* Update errors
|
||||
*/
|
||||
if (!(status & (TXSTAT_BABBLED | TXSTAT_16COLLISIONS)))
|
||||
priv(dev)->stats.tx_packets++;
|
||||
dev->stats.tx_packets++;
|
||||
else {
|
||||
priv(dev)->stats.tx_errors ++;
|
||||
dev->stats.tx_errors++;
|
||||
if (status & TXSTAT_16COLLISIONS)
|
||||
priv(dev)->stats.collisions += 16;
|
||||
dev->stats.collisions += 16;
|
||||
if (status & TXSTAT_BABBLED)
|
||||
priv(dev)->stats.tx_fifo_errors ++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
}
|
||||
|
||||
tx_tail = (tx_tail + 1) & 15;
|
||||
|
@ -773,7 +761,6 @@ static const struct net_device_ops ether3_netdev_ops = {
|
|||
.ndo_open = ether3_open,
|
||||
.ndo_stop = ether3_close,
|
||||
.ndo_start_xmit = ether3_sendpacket,
|
||||
.ndo_get_stats = ether3_getstats,
|
||||
.ndo_set_multicast_list = ether3_setmulticastlist,
|
||||
.ndo_tx_timeout = ether3_timeout,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
|
|
@ -164,7 +164,6 @@ struct dev_priv {
|
|||
unsigned char tx_head; /* buffer nr to insert next packet */
|
||||
unsigned char tx_tail; /* buffer nr of transmitting packet */
|
||||
unsigned int rx_head; /* address to fetch next packet from */
|
||||
struct net_device_stats stats;
|
||||
struct timer_list timer;
|
||||
int broken; /* 0 = ok, 1 = something went wrong */
|
||||
};
|
||||
|
|
|
@ -362,7 +362,7 @@ static void *slow_memcpy( void *dst, const void *src, size_t len )
|
|||
*cto++ = *cfrom++;
|
||||
MFPDELAY();
|
||||
}
|
||||
return( dst );
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
|
@ -449,7 +449,7 @@ static noinline int __init addr_accessible(volatile void *regp, int wordflag,
|
|||
vbr[2] = save_berr;
|
||||
local_irq_restore(flags);
|
||||
|
||||
return( ret );
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct net_device_ops lance_netdev_ops = {
|
||||
|
@ -526,7 +526,7 @@ static unsigned long __init lance_probe1( struct net_device *dev,
|
|||
goto probe_ok;
|
||||
|
||||
probe_fail:
|
||||
return( 0 );
|
||||
return 0;
|
||||
|
||||
probe_ok:
|
||||
lp = netdev_priv(dev);
|
||||
|
@ -556,7 +556,7 @@ static unsigned long __init lance_probe1( struct net_device *dev,
|
|||
if (request_irq(IRQ_AUTO_5, lance_interrupt, IRQ_TYPE_PRIO,
|
||||
"PAM/Riebl-ST Ethernet", dev)) {
|
||||
printk( "Lance: request for irq %d failed\n", IRQ_AUTO_5 );
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
dev->irq = (unsigned short)IRQ_AUTO_5;
|
||||
}
|
||||
|
@ -568,12 +568,12 @@ static unsigned long __init lance_probe1( struct net_device *dev,
|
|||
unsigned long irq = atari_register_vme_int();
|
||||
if (!irq) {
|
||||
printk( "Lance: request for VME interrupt failed\n" );
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
if (request_irq(irq, lance_interrupt, IRQ_TYPE_PRIO,
|
||||
"Riebl-VME Ethernet", dev)) {
|
||||
printk( "Lance: request for irq %ld failed\n", irq );
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
dev->irq = irq;
|
||||
}
|
||||
|
@ -637,7 +637,7 @@ static unsigned long __init lance_probe1( struct net_device *dev,
|
|||
/* XXX MSch */
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
|
||||
return( 1 );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -666,7 +666,7 @@ static int lance_open( struct net_device *dev )
|
|||
DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
|
||||
dev->name, i, DREG ));
|
||||
DREG = CSR0_STOP;
|
||||
return( -EIO );
|
||||
return -EIO;
|
||||
}
|
||||
DREG = CSR0_IDON;
|
||||
DREG = CSR0_STRT;
|
||||
|
@ -676,7 +676,7 @@ static int lance_open( struct net_device *dev )
|
|||
|
||||
DPRINTK( 2, ( "%s: LANCE is open, csr0 %04x\n", dev->name, DREG ));
|
||||
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1126,13 +1126,13 @@ static int lance_set_mac_address( struct net_device *dev, void *addr )
|
|||
int i;
|
||||
|
||||
if (lp->cardtype != OLD_RIEBL && lp->cardtype != NEW_RIEBL)
|
||||
return( -EOPNOTSUPP );
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (netif_running(dev)) {
|
||||
/* Only possible while card isn't started */
|
||||
DPRINTK( 1, ( "%s: hwaddr can be set only while card isn't open.\n",
|
||||
dev->name ));
|
||||
return( -EIO );
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
memcpy( dev->dev_addr, saddr->sa_data, dev->addr_len );
|
||||
|
@ -1142,7 +1142,7 @@ static int lance_set_mac_address( struct net_device *dev, void *addr )
|
|||
/* set also the magic for future sessions */
|
||||
*RIEBL_MAGIC_ADDR = RIEBL_MAGIC;
|
||||
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -559,7 +559,6 @@ struct atl1c_adapter {
|
|||
struct napi_struct napi;
|
||||
struct atl1c_hw hw;
|
||||
struct atl1c_hw_stats hw_stats;
|
||||
struct net_device_stats net_stats;
|
||||
struct mii_if_info mii; /* MII interface info */
|
||||
u16 rx_buffer_len;
|
||||
|
||||
|
|
|
@ -480,7 +480,7 @@ int atl1c_phy_reset(struct atl1c_hw *hw)
|
|||
atl1c_write_phy_reg(hw, MII_DBG_DATA, 0x929D);
|
||||
}
|
||||
if (hw->nic_type == athr_l1c || hw->nic_type == athr_l2c_b2
|
||||
|| hw->nic_type == athr_l2c || hw->nic_type == athr_l2c) {
|
||||
|| hw->nic_type == athr_l2c) {
|
||||
atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x29);
|
||||
atl1c_write_phy_reg(hw, MII_DBG_DATA, 0xB6DD);
|
||||
}
|
||||
|
|
|
@ -1562,7 +1562,7 @@ static struct net_device_stats *atl1c_get_stats(struct net_device *netdev)
|
|||
{
|
||||
struct atl1c_adapter *adapter = netdev_priv(netdev);
|
||||
struct atl1c_hw_stats *hw_stats = &adapter->hw_stats;
|
||||
struct net_device_stats *net_stats = &adapter->net_stats;
|
||||
struct net_device_stats *net_stats = &netdev->stats;
|
||||
|
||||
atl1c_update_hw_stats(adapter);
|
||||
net_stats->rx_packets = hw_stats->rx_ok;
|
||||
|
@ -1590,7 +1590,7 @@ static struct net_device_stats *atl1c_get_stats(struct net_device *netdev)
|
|||
net_stats->tx_aborted_errors = hw_stats->tx_abort_col;
|
||||
net_stats->tx_window_errors = hw_stats->tx_late_col;
|
||||
|
||||
return &adapter->net_stats;
|
||||
return net_stats;
|
||||
}
|
||||
|
||||
static inline void atl1c_clear_phy_int(struct atl1c_adapter *adapter)
|
||||
|
@ -1700,7 +1700,7 @@ static irqreturn_t atl1c_intr(int irq, void *data)
|
|||
|
||||
/* link event */
|
||||
if (status & (ISR_GPHY | ISR_MANUAL)) {
|
||||
adapter->net_stats.tx_carrier_errors++;
|
||||
netdev->stats.tx_carrier_errors++;
|
||||
atl1c_link_chg_event(adapter);
|
||||
break;
|
||||
}
|
||||
|
@ -1719,7 +1719,7 @@ static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
|
|||
* cannot figure out if the packet is fragmented or not,
|
||||
* so we tell the KERNEL CHECKSUM_NONE
|
||||
*/
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
}
|
||||
|
||||
static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid)
|
||||
|
@ -2243,7 +2243,7 @@ static netdev_tx_t atl1c_xmit_frame(struct sk_buff *skb,
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
|
||||
if (unlikely(vlan_tx_tag_present(skb))) {
|
||||
u16 vlan = vlan_tx_tag_get(skb);
|
||||
__le16 tag;
|
||||
|
||||
|
|
|
@ -1331,7 +1331,7 @@ static inline void atl1e_rx_checksum(struct atl1e_adapter *adapter,
|
|||
u16 pkt_flags;
|
||||
u16 err_flags;
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
pkt_flags = prrs->pkt_flag;
|
||||
err_flags = prrs->err_flag;
|
||||
if (((pkt_flags & RRS_IS_IPV4) || (pkt_flags & RRS_IS_IPV6)) &&
|
||||
|
@ -1814,7 +1814,7 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb,
|
|||
|
||||
tpd = atl1e_get_tpd(adapter);
|
||||
|
||||
if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
|
||||
if (unlikely(vlan_tx_tag_present(skb))) {
|
||||
u16 vlan_tag = vlan_tx_tag_get(skb);
|
||||
u16 atl1e_vlan_tag;
|
||||
|
||||
|
@ -2316,7 +2316,7 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
|
|||
netif_napi_add(netdev, &adapter->napi, atl1e_clean, 64);
|
||||
|
||||
init_timer(&adapter->phy_config_timer);
|
||||
adapter->phy_config_timer.function = &atl1e_phy_config;
|
||||
adapter->phy_config_timer.function = atl1e_phy_config;
|
||||
adapter->phy_config_timer.data = (unsigned long) adapter;
|
||||
|
||||
/* get user settings */
|
||||
|
|
|
@ -1811,7 +1811,7 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
|
|||
* the higher layers and let it be sorted out there.
|
||||
*/
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
|
||||
if (unlikely(rrd->pkt_flg & PACKET_FLAG_ERR)) {
|
||||
if (rrd->err_flg & (ERR_FLAG_CRC | ERR_FLAG_TRUNC |
|
||||
|
@ -2100,9 +2100,9 @@ static u16 atl1_tpd_avail(struct atl1_tpd_ring *tpd_ring)
|
|||
{
|
||||
u16 next_to_clean = atomic_read(&tpd_ring->next_to_clean);
|
||||
u16 next_to_use = atomic_read(&tpd_ring->next_to_use);
|
||||
return ((next_to_clean > next_to_use) ?
|
||||
return (next_to_clean > next_to_use) ?
|
||||
next_to_clean - next_to_use - 1 :
|
||||
tpd_ring->count + next_to_clean - next_to_use - 1);
|
||||
tpd_ring->count + next_to_clean - next_to_use - 1;
|
||||
}
|
||||
|
||||
static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb,
|
||||
|
@ -2408,7 +2408,7 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb,
|
|||
(u16) atomic_read(&tpd_ring->next_to_use));
|
||||
memset(ptpd, 0, sizeof(struct tx_packet_desc));
|
||||
|
||||
if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
vlan_tag = vlan_tx_tag_get(skb);
|
||||
vlan_tag = (vlan_tag << 4) | (vlan_tag >> 13) |
|
||||
((vlan_tag >> 9) & 0x8);
|
||||
|
@ -3043,7 +3043,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
|
|||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
setup_timer(&adapter->phy_config_timer, &atl1_phy_config,
|
||||
setup_timer(&adapter->phy_config_timer, atl1_phy_config,
|
||||
(unsigned long)adapter);
|
||||
adapter->phy_timer_pending = false;
|
||||
|
||||
|
|
|
@ -51,10 +51,10 @@
|
|||
|
||||
#define ATL2_DRV_VERSION "2.2.3"
|
||||
|
||||
static char atl2_driver_name[] = "atl2";
|
||||
static const char atl2_driver_name[] = "atl2";
|
||||
static const char atl2_driver_string[] = "Atheros(R) L2 Ethernet Driver";
|
||||
static char atl2_copyright[] = "Copyright (c) 2007 Atheros Corporation.";
|
||||
static char atl2_driver_version[] = ATL2_DRV_VERSION;
|
||||
static const char atl2_copyright[] = "Copyright (c) 2007 Atheros Corporation.";
|
||||
static const char atl2_driver_version[] = ATL2_DRV_VERSION;
|
||||
|
||||
MODULE_AUTHOR("Atheros Corporation <xiong.huang@atheros.com>, Chris Snook <csnook@redhat.com>");
|
||||
MODULE_DESCRIPTION("Atheros Fast Ethernet Network Driver");
|
||||
|
@ -870,7 +870,7 @@ static netdev_tx_t atl2_xmit_frame(struct sk_buff *skb,
|
|||
offset = ((u32)(skb->len-copy_len + 3) & ~3);
|
||||
}
|
||||
#ifdef NETIF_F_HW_VLAN_TX
|
||||
if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
u16 vlan_tag = vlan_tx_tag_get(skb);
|
||||
vlan_tag = (vlan_tag << 4) |
|
||||
(vlan_tag >> 13) |
|
||||
|
@ -1444,11 +1444,11 @@ static int __devinit atl2_probe(struct pci_dev *pdev,
|
|||
atl2_check_options(adapter);
|
||||
|
||||
init_timer(&adapter->watchdog_timer);
|
||||
adapter->watchdog_timer.function = &atl2_watchdog;
|
||||
adapter->watchdog_timer.function = atl2_watchdog;
|
||||
adapter->watchdog_timer.data = (unsigned long) adapter;
|
||||
|
||||
init_timer(&adapter->phy_config_timer);
|
||||
adapter->phy_config_timer.function = &atl2_phy_config;
|
||||
adapter->phy_config_timer.function = atl2_phy_config;
|
||||
adapter->phy_config_timer.data = (unsigned long) adapter;
|
||||
|
||||
INIT_WORK(&adapter->reset_task, atl2_reset_task);
|
||||
|
|
|
@ -445,7 +445,7 @@ static int net_open(struct net_device *dev)
|
|||
init_timer(&lp->timer);
|
||||
lp->timer.expires = jiffies + TIMED_CHECKER;
|
||||
lp->timer.data = (unsigned long)dev;
|
||||
lp->timer.function = &atp_timed_checker; /* timer handler */
|
||||
lp->timer.function = atp_timed_checker; /* timer handler */
|
||||
add_timer(&lp->timer);
|
||||
|
||||
netif_start_queue(dev);
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* converted to use linux-2.6.x's PHY framework
|
||||
*
|
||||
* Author: MontaVista Software, Inc.
|
||||
* ppopov@mvista.com or source@mvista.com
|
||||
* ppopov@mvista.com or source@mvista.com
|
||||
*
|
||||
* ########################################################################
|
||||
*
|
||||
|
@ -34,6 +34,8 @@
|
|||
*
|
||||
*
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/capability.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -56,11 +58,11 @@
|
|||
#include <linux/crc32.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#include <au1000.h>
|
||||
|
@ -152,11 +154,11 @@ static void au1000_enable_mac(struct net_device *dev, int force_reset)
|
|||
|
||||
spin_lock_irqsave(&aup->lock, flags);
|
||||
|
||||
if(force_reset || (!aup->mac_enabled)) {
|
||||
*aup->enable = MAC_EN_CLOCK_ENABLE;
|
||||
if (force_reset || (!aup->mac_enabled)) {
|
||||
writel(MAC_EN_CLOCK_ENABLE, &aup->enable);
|
||||
au_sync_delay(2);
|
||||
*aup->enable = (MAC_EN_RESET0 | MAC_EN_RESET1 | MAC_EN_RESET2
|
||||
| MAC_EN_CLOCK_ENABLE);
|
||||
writel((MAC_EN_RESET0 | MAC_EN_RESET1 | MAC_EN_RESET2
|
||||
| MAC_EN_CLOCK_ENABLE), &aup->enable);
|
||||
au_sync_delay(2);
|
||||
|
||||
aup->mac_enabled = 1;
|
||||
|
@ -171,12 +173,12 @@ static void au1000_enable_mac(struct net_device *dev, int force_reset)
|
|||
static int au1000_mdio_read(struct net_device *dev, int phy_addr, int reg)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
volatile u32 *const mii_control_reg = &aup->mac->mii_control;
|
||||
volatile u32 *const mii_data_reg = &aup->mac->mii_data;
|
||||
u32 *const mii_control_reg = &aup->mac->mii_control;
|
||||
u32 *const mii_data_reg = &aup->mac->mii_data;
|
||||
u32 timedout = 20;
|
||||
u32 mii_control;
|
||||
|
||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
||||
while (readl(mii_control_reg) & MAC_MII_BUSY) {
|
||||
mdelay(1);
|
||||
if (--timedout == 0) {
|
||||
netdev_err(dev, "read_MII busy timeout!!\n");
|
||||
|
@ -187,29 +189,29 @@ static int au1000_mdio_read(struct net_device *dev, int phy_addr, int reg)
|
|||
mii_control = MAC_SET_MII_SELECT_REG(reg) |
|
||||
MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_READ;
|
||||
|
||||
*mii_control_reg = mii_control;
|
||||
writel(mii_control, mii_control_reg);
|
||||
|
||||
timedout = 20;
|
||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
||||
while (readl(mii_control_reg) & MAC_MII_BUSY) {
|
||||
mdelay(1);
|
||||
if (--timedout == 0) {
|
||||
netdev_err(dev, "mdio_read busy timeout!!\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return (int)*mii_data_reg;
|
||||
return readl(mii_data_reg);
|
||||
}
|
||||
|
||||
static void au1000_mdio_write(struct net_device *dev, int phy_addr,
|
||||
int reg, u16 value)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
volatile u32 *const mii_control_reg = &aup->mac->mii_control;
|
||||
volatile u32 *const mii_data_reg = &aup->mac->mii_data;
|
||||
u32 *const mii_control_reg = &aup->mac->mii_control;
|
||||
u32 *const mii_data_reg = &aup->mac->mii_data;
|
||||
u32 timedout = 20;
|
||||
u32 mii_control;
|
||||
|
||||
while (*mii_control_reg & MAC_MII_BUSY) {
|
||||
while (readl(mii_control_reg) & MAC_MII_BUSY) {
|
||||
mdelay(1);
|
||||
if (--timedout == 0) {
|
||||
netdev_err(dev, "mdio_write busy timeout!!\n");
|
||||
|
@ -220,18 +222,22 @@ static void au1000_mdio_write(struct net_device *dev, int phy_addr,
|
|||
mii_control = MAC_SET_MII_SELECT_REG(reg) |
|
||||
MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_WRITE;
|
||||
|
||||
*mii_data_reg = value;
|
||||
*mii_control_reg = mii_control;
|
||||
writel(value, mii_data_reg);
|
||||
writel(mii_control, mii_control_reg);
|
||||
}
|
||||
|
||||
static int au1000_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
|
||||
{
|
||||
/* WARNING: bus->phy_map[phy_addr].attached_dev == dev does
|
||||
* _NOT_ hold (e.g. when PHY is accessed through other MAC's MII bus) */
|
||||
* _NOT_ hold (e.g. when PHY is accessed through other MAC's MII bus)
|
||||
*/
|
||||
struct net_device *const dev = bus->priv;
|
||||
|
||||
au1000_enable_mac(dev, 0); /* make sure the MAC associated with this
|
||||
* mii_bus is enabled */
|
||||
/* make sure the MAC associated with this
|
||||
* mii_bus is enabled
|
||||
*/
|
||||
au1000_enable_mac(dev, 0);
|
||||
|
||||
return au1000_mdio_read(dev, phy_addr, regnum);
|
||||
}
|
||||
|
||||
|
@ -240,8 +246,11 @@ static int au1000_mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum,
|
|||
{
|
||||
struct net_device *const dev = bus->priv;
|
||||
|
||||
au1000_enable_mac(dev, 0); /* make sure the MAC associated with this
|
||||
* mii_bus is enabled */
|
||||
/* make sure the MAC associated with this
|
||||
* mii_bus is enabled
|
||||
*/
|
||||
au1000_enable_mac(dev, 0);
|
||||
|
||||
au1000_mdio_write(dev, phy_addr, regnum, value);
|
||||
return 0;
|
||||
}
|
||||
|
@ -250,28 +259,37 @@ static int au1000_mdiobus_reset(struct mii_bus *bus)
|
|||
{
|
||||
struct net_device *const dev = bus->priv;
|
||||
|
||||
au1000_enable_mac(dev, 0); /* make sure the MAC associated with this
|
||||
* mii_bus is enabled */
|
||||
/* make sure the MAC associated with this
|
||||
* mii_bus is enabled
|
||||
*/
|
||||
au1000_enable_mac(dev, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void au1000_hard_stop(struct net_device *dev)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
netif_dbg(aup, drv, dev, "hard stop\n");
|
||||
|
||||
aup->mac->control &= ~(MAC_RX_ENABLE | MAC_TX_ENABLE);
|
||||
reg = readl(&aup->mac->control);
|
||||
reg &= ~(MAC_RX_ENABLE | MAC_TX_ENABLE);
|
||||
writel(reg, &aup->mac->control);
|
||||
au_sync_delay(10);
|
||||
}
|
||||
|
||||
static void au1000_enable_rx_tx(struct net_device *dev)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
netif_dbg(aup, hw, dev, "enable_rx_tx\n");
|
||||
|
||||
aup->mac->control |= (MAC_RX_ENABLE | MAC_TX_ENABLE);
|
||||
reg = readl(&aup->mac->control);
|
||||
reg |= (MAC_RX_ENABLE | MAC_TX_ENABLE);
|
||||
writel(reg, &aup->mac->control);
|
||||
au_sync_delay(10);
|
||||
}
|
||||
|
||||
|
@ -281,6 +299,7 @@ au1000_adjust_link(struct net_device *dev)
|
|||
struct au1000_private *aup = netdev_priv(dev);
|
||||
struct phy_device *phydev = aup->phy_dev;
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
int status_change = 0;
|
||||
|
||||
|
@ -312,14 +331,15 @@ au1000_adjust_link(struct net_device *dev)
|
|||
/* switching duplex mode requires to disable rx and tx! */
|
||||
au1000_hard_stop(dev);
|
||||
|
||||
if (DUPLEX_FULL == phydev->duplex)
|
||||
aup->mac->control = ((aup->mac->control
|
||||
| MAC_FULL_DUPLEX)
|
||||
& ~MAC_DISABLE_RX_OWN);
|
||||
else
|
||||
aup->mac->control = ((aup->mac->control
|
||||
& ~MAC_FULL_DUPLEX)
|
||||
| MAC_DISABLE_RX_OWN);
|
||||
reg = readl(&aup->mac->control);
|
||||
if (DUPLEX_FULL == phydev->duplex) {
|
||||
reg |= MAC_FULL_DUPLEX;
|
||||
reg &= ~MAC_DISABLE_RX_OWN;
|
||||
} else {
|
||||
reg &= ~MAC_FULL_DUPLEX;
|
||||
reg |= MAC_DISABLE_RX_OWN;
|
||||
}
|
||||
writel(reg, &aup->mac->control);
|
||||
au_sync_delay(1);
|
||||
|
||||
au1000_enable_rx_tx(dev);
|
||||
|
@ -353,10 +373,11 @@ au1000_adjust_link(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static int au1000_mii_probe (struct net_device *dev)
|
||||
static int au1000_mii_probe(struct net_device *dev)
|
||||
{
|
||||
struct au1000_private *const aup = netdev_priv(dev);
|
||||
struct phy_device *phydev = NULL;
|
||||
int phy_addr;
|
||||
|
||||
if (aup->phy_static_config) {
|
||||
BUG_ON(aup->mac_id < 0 || aup->mac_id > 1);
|
||||
|
@ -366,42 +387,46 @@ static int au1000_mii_probe (struct net_device *dev)
|
|||
else
|
||||
netdev_info(dev, "using PHY-less setup\n");
|
||||
return 0;
|
||||
} else {
|
||||
int phy_addr;
|
||||
}
|
||||
|
||||
/* find the first (lowest address) PHY on the current MAC's MII bus */
|
||||
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++)
|
||||
if (aup->mii_bus->phy_map[phy_addr]) {
|
||||
phydev = aup->mii_bus->phy_map[phy_addr];
|
||||
if (!aup->phy_search_highest_addr)
|
||||
break; /* break out with first one found */
|
||||
}
|
||||
/* find the first (lowest address) PHY
|
||||
* on the current MAC's MII bus
|
||||
*/
|
||||
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++)
|
||||
if (aup->mii_bus->phy_map[phy_addr]) {
|
||||
phydev = aup->mii_bus->phy_map[phy_addr];
|
||||
if (!aup->phy_search_highest_addr)
|
||||
/* break out with first one found */
|
||||
break;
|
||||
}
|
||||
|
||||
if (aup->phy1_search_mac0) {
|
||||
/* try harder to find a PHY */
|
||||
if (!phydev && (aup->mac_id == 1)) {
|
||||
/* no PHY found, maybe we have a dual PHY? */
|
||||
dev_info(&dev->dev, ": no PHY found on MAC1, "
|
||||
"let's see if it's attached to MAC0...\n");
|
||||
if (aup->phy1_search_mac0) {
|
||||
/* try harder to find a PHY */
|
||||
if (!phydev && (aup->mac_id == 1)) {
|
||||
/* no PHY found, maybe we have a dual PHY? */
|
||||
dev_info(&dev->dev, ": no PHY found on MAC1, "
|
||||
"let's see if it's attached to MAC0...\n");
|
||||
|
||||
/* find the first (lowest address) non-attached PHY on
|
||||
* the MAC0 MII bus */
|
||||
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
|
||||
struct phy_device *const tmp_phydev =
|
||||
aup->mii_bus->phy_map[phy_addr];
|
||||
/* find the first (lowest address) non-attached
|
||||
* PHY on the MAC0 MII bus
|
||||
*/
|
||||
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
|
||||
struct phy_device *const tmp_phydev =
|
||||
aup->mii_bus->phy_map[phy_addr];
|
||||
|
||||
if (aup->mac_id == 1)
|
||||
break;
|
||||
if (aup->mac_id == 1)
|
||||
break;
|
||||
|
||||
if (!tmp_phydev)
|
||||
continue; /* no PHY here... */
|
||||
/* no PHY here... */
|
||||
if (!tmp_phydev)
|
||||
continue;
|
||||
|
||||
if (tmp_phydev->attached_dev)
|
||||
continue; /* already claimed by MAC0 */
|
||||
/* already claimed by MAC0 */
|
||||
if (tmp_phydev->attached_dev)
|
||||
continue;
|
||||
|
||||
phydev = tmp_phydev;
|
||||
break; /* found it */
|
||||
}
|
||||
phydev = tmp_phydev;
|
||||
break; /* found it */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -452,20 +477,20 @@ static int au1000_mii_probe (struct net_device *dev)
|
|||
* has the virtual and dma address of a buffer suitable for
|
||||
* both, receive and transmit operations.
|
||||
*/
|
||||
static db_dest_t *au1000_GetFreeDB(struct au1000_private *aup)
|
||||
static struct db_dest *au1000_GetFreeDB(struct au1000_private *aup)
|
||||
{
|
||||
db_dest_t *pDB;
|
||||
struct db_dest *pDB;
|
||||
pDB = aup->pDBfree;
|
||||
|
||||
if (pDB) {
|
||||
if (pDB)
|
||||
aup->pDBfree = pDB->pnext;
|
||||
}
|
||||
|
||||
return pDB;
|
||||
}
|
||||
|
||||
void au1000_ReleaseDB(struct au1000_private *aup, db_dest_t *pDB)
|
||||
void au1000_ReleaseDB(struct au1000_private *aup, struct db_dest *pDB)
|
||||
{
|
||||
db_dest_t *pDBfree = aup->pDBfree;
|
||||
struct db_dest *pDBfree = aup->pDBfree;
|
||||
if (pDBfree)
|
||||
pDBfree->pnext = pDB;
|
||||
aup->pDBfree = pDB;
|
||||
|
@ -478,9 +503,9 @@ static void au1000_reset_mac_unlocked(struct net_device *dev)
|
|||
|
||||
au1000_hard_stop(dev);
|
||||
|
||||
*aup->enable = MAC_EN_CLOCK_ENABLE;
|
||||
writel(MAC_EN_CLOCK_ENABLE, &aup->enable);
|
||||
au_sync_delay(2);
|
||||
*aup->enable = 0;
|
||||
writel(0, &aup->enable);
|
||||
au_sync_delay(2);
|
||||
|
||||
aup->tx_full = 0;
|
||||
|
@ -507,7 +532,7 @@ static void au1000_reset_mac(struct net_device *dev)
|
|||
|
||||
spin_lock_irqsave(&aup->lock, flags);
|
||||
|
||||
au1000_reset_mac_unlocked (dev);
|
||||
au1000_reset_mac_unlocked(dev);
|
||||
|
||||
spin_unlock_irqrestore(&aup->lock, flags);
|
||||
}
|
||||
|
@ -524,11 +549,13 @@ au1000_setup_hw_rings(struct au1000_private *aup, u32 rx_base, u32 tx_base)
|
|||
|
||||
for (i = 0; i < NUM_RX_DMA; i++) {
|
||||
aup->rx_dma_ring[i] =
|
||||
(volatile rx_dma_t *) (rx_base + sizeof(rx_dma_t)*i);
|
||||
(struct rx_dma *)
|
||||
(rx_base + sizeof(struct rx_dma)*i);
|
||||
}
|
||||
for (i = 0; i < NUM_TX_DMA; i++) {
|
||||
aup->tx_dma_ring[i] =
|
||||
(volatile tx_dma_t *) (tx_base + sizeof(tx_dma_t)*i);
|
||||
(struct tx_dma *)
|
||||
(tx_base + sizeof(struct tx_dma)*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -616,18 +643,21 @@ static int au1000_init(struct net_device *dev)
|
|||
|
||||
spin_lock_irqsave(&aup->lock, flags);
|
||||
|
||||
aup->mac->control = 0;
|
||||
writel(0, &aup->mac->control);
|
||||
aup->tx_head = (aup->tx_dma_ring[0]->buff_stat & 0xC) >> 2;
|
||||
aup->tx_tail = aup->tx_head;
|
||||
aup->rx_head = (aup->rx_dma_ring[0]->buff_stat & 0xC) >> 2;
|
||||
|
||||
aup->mac->mac_addr_high = dev->dev_addr[5]<<8 | dev->dev_addr[4];
|
||||
aup->mac->mac_addr_low = dev->dev_addr[3]<<24 | dev->dev_addr[2]<<16 |
|
||||
dev->dev_addr[1]<<8 | dev->dev_addr[0];
|
||||
writel(dev->dev_addr[5]<<8 | dev->dev_addr[4],
|
||||
&aup->mac->mac_addr_high);
|
||||
writel(dev->dev_addr[3]<<24 | dev->dev_addr[2]<<16 |
|
||||
dev->dev_addr[1]<<8 | dev->dev_addr[0],
|
||||
&aup->mac->mac_addr_low);
|
||||
|
||||
for (i = 0; i < NUM_RX_DMA; i++) {
|
||||
|
||||
for (i = 0; i < NUM_RX_DMA; i++)
|
||||
aup->rx_dma_ring[i]->buff_stat |= RX_DMA_ENABLE;
|
||||
}
|
||||
|
||||
au_sync();
|
||||
|
||||
control = MAC_RX_ENABLE | MAC_TX_ENABLE;
|
||||
|
@ -643,8 +673,8 @@ static int au1000_init(struct net_device *dev)
|
|||
control |= MAC_FULL_DUPLEX;
|
||||
}
|
||||
|
||||
aup->mac->control = control;
|
||||
aup->mac->vlan1_tag = 0x8100; /* activate vlan support */
|
||||
writel(control, &aup->mac->control);
|
||||
writel(0x8100, &aup->mac->vlan1_tag); /* activate vlan support */
|
||||
au_sync();
|
||||
|
||||
spin_unlock_irqrestore(&aup->lock, flags);
|
||||
|
@ -681,9 +711,9 @@ static int au1000_rx(struct net_device *dev)
|
|||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
struct sk_buff *skb;
|
||||
volatile rx_dma_t *prxd;
|
||||
struct rx_dma *prxd;
|
||||
u32 buff_stat, status;
|
||||
db_dest_t *pDB;
|
||||
struct db_dest *pDB;
|
||||
u32 frmlen;
|
||||
|
||||
netif_dbg(aup, rx_status, dev, "au1000_rx head %d\n", aup->rx_head);
|
||||
|
@ -713,24 +743,26 @@ static int au1000_rx(struct net_device *dev)
|
|||
netif_rx(skb); /* pass the packet to upper layers */
|
||||
} else {
|
||||
if (au1000_debug > 4) {
|
||||
pr_err("rx_error(s):");
|
||||
if (status & RX_MISSED_FRAME)
|
||||
printk("rx miss\n");
|
||||
pr_cont(" miss");
|
||||
if (status & RX_WDOG_TIMER)
|
||||
printk("rx wdog\n");
|
||||
pr_cont(" wdog");
|
||||
if (status & RX_RUNT)
|
||||
printk("rx runt\n");
|
||||
pr_cont(" runt");
|
||||
if (status & RX_OVERLEN)
|
||||
printk("rx overlen\n");
|
||||
pr_cont(" overlen");
|
||||
if (status & RX_COLL)
|
||||
printk("rx coll\n");
|
||||
pr_cont(" coll");
|
||||
if (status & RX_MII_ERROR)
|
||||
printk("rx mii error\n");
|
||||
pr_cont(" mii error");
|
||||
if (status & RX_CRC_ERROR)
|
||||
printk("rx crc error\n");
|
||||
pr_cont(" crc error");
|
||||
if (status & RX_LEN_ERROR)
|
||||
printk("rx len error\n");
|
||||
pr_cont(" len error");
|
||||
if (status & RX_U_CNTRL_FRAME)
|
||||
printk("rx u control frame\n");
|
||||
pr_cont(" u control frame");
|
||||
pr_cont("\n");
|
||||
}
|
||||
}
|
||||
prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE);
|
||||
|
@ -753,7 +785,8 @@ static void au1000_update_tx_stats(struct net_device *dev, u32 status)
|
|||
if (!aup->phy_dev || (DUPLEX_FULL == aup->phy_dev->duplex)) {
|
||||
if (status & (TX_JAB_TIMEOUT | TX_UNDERRUN)) {
|
||||
/* any other tx errors are only valid
|
||||
* in half duplex mode */
|
||||
* in half duplex mode
|
||||
*/
|
||||
ps->tx_errors++;
|
||||
ps->tx_aborted_errors++;
|
||||
}
|
||||
|
@ -774,7 +807,7 @@ static void au1000_update_tx_stats(struct net_device *dev, u32 status)
|
|||
static void au1000_tx_ack(struct net_device *dev)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
volatile tx_dma_t *ptxd;
|
||||
struct tx_dma *ptxd;
|
||||
|
||||
ptxd = aup->tx_dma_ring[aup->tx_tail];
|
||||
|
||||
|
@ -854,7 +887,7 @@ static int au1000_close(struct net_device *dev)
|
|||
|
||||
spin_lock_irqsave(&aup->lock, flags);
|
||||
|
||||
au1000_reset_mac_unlocked (dev);
|
||||
au1000_reset_mac_unlocked(dev);
|
||||
|
||||
/* stop the device */
|
||||
netif_stop_queue(dev);
|
||||
|
@ -873,9 +906,9 @@ static netdev_tx_t au1000_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
struct net_device_stats *ps = &dev->stats;
|
||||
volatile tx_dma_t *ptxd;
|
||||
struct tx_dma *ptxd;
|
||||
u32 buff_stat;
|
||||
db_dest_t *pDB;
|
||||
struct db_dest *pDB;
|
||||
int i;
|
||||
|
||||
netif_dbg(aup, tx_queued, dev, "tx: aup %x len=%d, data=%p, head %d\n",
|
||||
|
@ -902,9 +935,9 @@ static netdev_tx_t au1000_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
pDB = aup->tx_db_inuse[aup->tx_head];
|
||||
skb_copy_from_linear_data(skb, (void *)pDB->vaddr, skb->len);
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
for (i = skb->len; i < ETH_ZLEN; i++) {
|
||||
for (i = skb->len; i < ETH_ZLEN; i++)
|
||||
((char *)pDB->vaddr)[i] = 0;
|
||||
}
|
||||
|
||||
ptxd->len = ETH_ZLEN;
|
||||
} else
|
||||
ptxd->len = skb->len;
|
||||
|
@ -935,15 +968,16 @@ static void au1000_tx_timeout(struct net_device *dev)
|
|||
static void au1000_multicast_list(struct net_device *dev)
|
||||
{
|
||||
struct au1000_private *aup = netdev_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
netif_dbg(aup, drv, dev, "au1000_multicast_list: flags=%x\n", dev->flags);
|
||||
|
||||
netif_dbg(aup, drv, dev, "%s: flags=%x\n", __func__, dev->flags);
|
||||
reg = readl(&aup->mac->control);
|
||||
if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
|
||||
aup->mac->control |= MAC_PROMISCUOUS;
|
||||
reg |= MAC_PROMISCUOUS;
|
||||
} else if ((dev->flags & IFF_ALLMULTI) ||
|
||||
netdev_mc_count(dev) > MULTICAST_FILTER_LIMIT) {
|
||||
aup->mac->control |= MAC_PASS_ALL_MULTI;
|
||||
aup->mac->control &= ~MAC_PROMISCUOUS;
|
||||
reg |= MAC_PASS_ALL_MULTI;
|
||||
reg &= ~MAC_PROMISCUOUS;
|
||||
netdev_info(dev, "Pass all multicast\n");
|
||||
} else {
|
||||
struct netdev_hw_addr *ha;
|
||||
|
@ -953,11 +987,12 @@ static void au1000_multicast_list(struct net_device *dev)
|
|||
netdev_for_each_mc_addr(ha, dev)
|
||||
set_bit(ether_crc(ETH_ALEN, ha->addr)>>26,
|
||||
(long *)mc_filter);
|
||||
aup->mac->multi_hash_high = mc_filter[1];
|
||||
aup->mac->multi_hash_low = mc_filter[0];
|
||||
aup->mac->control &= ~MAC_PROMISCUOUS;
|
||||
aup->mac->control |= MAC_HASH_MODE;
|
||||
writel(mc_filter[1], &aup->mac->multi_hash_high);
|
||||
writel(mc_filter[0], &aup->mac->multi_hash_low);
|
||||
reg &= ~MAC_PROMISCUOUS;
|
||||
reg |= MAC_HASH_MODE;
|
||||
}
|
||||
writel(reg, &aup->mac->control);
|
||||
}
|
||||
|
||||
static int au1000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
|
@ -991,7 +1026,7 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
struct au1000_private *aup = NULL;
|
||||
struct au1000_eth_platform_data *pd;
|
||||
struct net_device *dev = NULL;
|
||||
db_dest_t *pDB, *pDBfree;
|
||||
struct db_dest *pDB, *pDBfree;
|
||||
int irq, i, err = 0;
|
||||
struct resource *base, *macen;
|
||||
|
||||
|
@ -1016,13 +1051,15 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (!request_mem_region(base->start, resource_size(base), pdev->name)) {
|
||||
if (!request_mem_region(base->start, resource_size(base),
|
||||
pdev->name)) {
|
||||
dev_err(&pdev->dev, "failed to request memory region for base registers\n");
|
||||
err = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!request_mem_region(macen->start, resource_size(macen), pdev->name)) {
|
||||
if (!request_mem_region(macen->start, resource_size(macen),
|
||||
pdev->name)) {
|
||||
dev_err(&pdev->dev, "failed to request memory region for MAC enable register\n");
|
||||
err = -ENXIO;
|
||||
goto err_request;
|
||||
|
@ -1040,10 +1077,12 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
aup = netdev_priv(dev);
|
||||
|
||||
spin_lock_init(&aup->lock);
|
||||
aup->msg_enable = (au1000_debug < 4 ? AU1000_DEF_MSG_ENABLE : au1000_debug);
|
||||
aup->msg_enable = (au1000_debug < 4 ?
|
||||
AU1000_DEF_MSG_ENABLE : au1000_debug);
|
||||
|
||||
/* Allocate the data buffers */
|
||||
/* Snooping works fine with eth on all au1xxx */
|
||||
/* Allocate the data buffers
|
||||
* Snooping works fine with eth on all au1xxx
|
||||
*/
|
||||
aup->vaddr = (u32)dma_alloc_noncoherent(NULL, MAX_BUF_SIZE *
|
||||
(NUM_TX_BUFFS + NUM_RX_BUFFS),
|
||||
&aup->dma_addr, 0);
|
||||
|
@ -1054,15 +1093,17 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* aup->mac is the base address of the MAC's registers */
|
||||
aup->mac = (volatile mac_reg_t *)ioremap_nocache(base->start, resource_size(base));
|
||||
aup->mac = (struct mac_reg *)
|
||||
ioremap_nocache(base->start, resource_size(base));
|
||||
if (!aup->mac) {
|
||||
dev_err(&pdev->dev, "failed to ioremap MAC registers\n");
|
||||
err = -ENXIO;
|
||||
goto err_remap1;
|
||||
}
|
||||
|
||||
/* Setup some variables for quick register address access */
|
||||
aup->enable = (volatile u32 *)ioremap_nocache(macen->start, resource_size(macen));
|
||||
/* Setup some variables for quick register address access */
|
||||
aup->enable = (u32 *)ioremap_nocache(macen->start,
|
||||
resource_size(macen));
|
||||
if (!aup->enable) {
|
||||
dev_err(&pdev->dev, "failed to ioremap MAC enable register\n");
|
||||
err = -ENXIO;
|
||||
|
@ -1078,12 +1119,13 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
/* set a random MAC now in case platform_data doesn't provide one */
|
||||
random_ether_addr(dev->dev_addr);
|
||||
|
||||
*aup->enable = 0;
|
||||
writel(0, &aup->enable);
|
||||
aup->mac_enabled = 0;
|
||||
|
||||
pd = pdev->dev.platform_data;
|
||||
if (!pd) {
|
||||
dev_info(&pdev->dev, "no platform_data passed, PHY search on MAC0\n");
|
||||
dev_info(&pdev->dev, "no platform_data passed,"
|
||||
" PHY search on MAC0\n");
|
||||
aup->phy1_search_mac0 = 1;
|
||||
} else {
|
||||
if (is_valid_ether_addr(pd->mac))
|
||||
|
@ -1098,8 +1140,7 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (aup->phy_busid && aup->phy_busid > 0) {
|
||||
dev_err(&pdev->dev, "MAC0-associated PHY attached 2nd MACs MII"
|
||||
"bus not supported yet\n");
|
||||
dev_err(&pdev->dev, "MAC0-associated PHY attached 2nd MACs MII bus not supported yet\n");
|
||||
err = -ENODEV;
|
||||
goto err_mdiobus_alloc;
|
||||
}
|
||||
|
@ -1151,17 +1192,17 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
|
||||
for (i = 0; i < NUM_RX_DMA; i++) {
|
||||
pDB = au1000_GetFreeDB(aup);
|
||||
if (!pDB) {
|
||||
if (!pDB)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
aup->rx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr;
|
||||
aup->rx_db_inuse[i] = pDB;
|
||||
}
|
||||
for (i = 0; i < NUM_TX_DMA; i++) {
|
||||
pDB = au1000_GetFreeDB(aup);
|
||||
if (!pDB) {
|
||||
if (!pDB)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
aup->tx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr;
|
||||
aup->tx_dma_ring[i]->len = 0;
|
||||
aup->tx_db_inuse[i] = pDB;
|
||||
|
@ -1188,7 +1229,8 @@ static int __devinit au1000_probe(struct platform_device *pdev)
|
|||
netdev_info(dev, "Au1xx0 Ethernet found at 0x%lx, irq %d\n",
|
||||
(unsigned long)base->start, irq);
|
||||
if (version_printed++ == 0)
|
||||
printk("%s version %s %s\n", DRV_NAME, DRV_VERSION, DRV_AUTHOR);
|
||||
pr_info("%s version %s %s\n",
|
||||
DRV_NAME, DRV_VERSION, DRV_AUTHOR);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1197,7 +1239,8 @@ err_out:
|
|||
mdiobus_unregister(aup->mii_bus);
|
||||
|
||||
/* here we should have a valid dev plus aup-> register addresses
|
||||
* so we can reset the mac properly.*/
|
||||
* so we can reset the mac properly.
|
||||
*/
|
||||
au1000_reset_mac(dev);
|
||||
|
||||
for (i = 0; i < NUM_RX_DMA; i++) {
|
||||
|
|
|
@ -44,34 +44,34 @@
|
|||
* Data Buffer Descriptor. Data buffers must be aligned on 32 byte
|
||||
* boundary for both, receive and transmit.
|
||||
*/
|
||||
typedef struct db_dest {
|
||||
struct db_dest {
|
||||
struct db_dest *pnext;
|
||||
volatile u32 *vaddr;
|
||||
u32 *vaddr;
|
||||
dma_addr_t dma_addr;
|
||||
} db_dest_t;
|
||||
};
|
||||
|
||||
/*
|
||||
* The transmit and receive descriptors are memory
|
||||
* mapped registers.
|
||||
*/
|
||||
typedef struct tx_dma {
|
||||
struct tx_dma {
|
||||
u32 status;
|
||||
u32 buff_stat;
|
||||
u32 len;
|
||||
u32 pad;
|
||||
} tx_dma_t;
|
||||
};
|
||||
|
||||
typedef struct rx_dma {
|
||||
struct rx_dma {
|
||||
u32 status;
|
||||
u32 buff_stat;
|
||||
u32 pad[2];
|
||||
} rx_dma_t;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MAC control registers, memory mapped.
|
||||
*/
|
||||
typedef struct mac_reg {
|
||||
struct mac_reg {
|
||||
u32 control;
|
||||
u32 mac_addr_high;
|
||||
u32 mac_addr_low;
|
||||
|
@ -82,16 +82,16 @@ typedef struct mac_reg {
|
|||
u32 flow_control;
|
||||
u32 vlan1_tag;
|
||||
u32 vlan2_tag;
|
||||
} mac_reg_t;
|
||||
};
|
||||
|
||||
|
||||
struct au1000_private {
|
||||
db_dest_t *pDBfree;
|
||||
db_dest_t db[NUM_RX_BUFFS+NUM_TX_BUFFS];
|
||||
volatile rx_dma_t *rx_dma_ring[NUM_RX_DMA];
|
||||
volatile tx_dma_t *tx_dma_ring[NUM_TX_DMA];
|
||||
db_dest_t *rx_db_inuse[NUM_RX_DMA];
|
||||
db_dest_t *tx_db_inuse[NUM_TX_DMA];
|
||||
struct db_dest *pDBfree;
|
||||
struct db_dest db[NUM_RX_BUFFS+NUM_TX_BUFFS];
|
||||
struct rx_dma *rx_dma_ring[NUM_RX_DMA];
|
||||
struct tx_dma *tx_dma_ring[NUM_TX_DMA];
|
||||
struct db_dest *rx_db_inuse[NUM_RX_DMA];
|
||||
struct db_dest *tx_db_inuse[NUM_TX_DMA];
|
||||
u32 rx_head;
|
||||
u32 tx_head;
|
||||
u32 tx_tail;
|
||||
|
@ -99,7 +99,9 @@ struct au1000_private {
|
|||
|
||||
int mac_id;
|
||||
|
||||
int mac_enabled; /* whether MAC is currently enabled and running (req. for mdio) */
|
||||
int mac_enabled; /* whether MAC is currently enabled and running
|
||||
* (req. for mdio)
|
||||
*/
|
||||
|
||||
int old_link; /* used by au1000_adjust_link */
|
||||
int old_speed;
|
||||
|
@ -117,9 +119,11 @@ struct au1000_private {
|
|||
int phy_busid;
|
||||
int phy_irq;
|
||||
|
||||
/* These variables are just for quick access to certain regs addresses. */
|
||||
volatile mac_reg_t *mac; /* mac registers */
|
||||
volatile u32 *enable; /* address of MAC Enable Register */
|
||||
/* These variables are just for quick access
|
||||
* to certain regs addresses.
|
||||
*/
|
||||
struct mac_reg *mac; /* mac registers */
|
||||
u32 *enable; /* address of MAC Enable Register */
|
||||
|
||||
u32 vaddr; /* virtual address of rx/tx buffers */
|
||||
dma_addr_t dma_addr; /* dma address of rx/tx buffers */
|
||||
|
|
|
@ -864,6 +864,7 @@ static int ax_probe(struct platform_device *pdev)
|
|||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(&pdev->dev, "no IRQ specified\n");
|
||||
ret = -ENXIO;
|
||||
goto exit_mem;
|
||||
}
|
||||
|
||||
|
|
|
@ -818,7 +818,7 @@ static int b44_rx(struct b44 *bp, int budget)
|
|||
copy_skb->data, len);
|
||||
skb = copy_skb;
|
||||
}
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_checksum_none_assert(skb);
|
||||
skb->protocol = eth_type_trans(skb, bp->dev);
|
||||
netif_receive_skb(skb);
|
||||
received++;
|
||||
|
@ -2296,18 +2296,27 @@ static int b44_resume(struct ssb_device *sdev)
|
|||
if (!netif_running(dev))
|
||||
return 0;
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
b44_init_rings(bp);
|
||||
b44_init_hw(bp, B44_FULL_RESET);
|
||||
spin_unlock_irq(&bp->lock);
|
||||
|
||||
/*
|
||||
* As a shared interrupt, the handler can be called immediately. To be
|
||||
* able to check the interrupt status the hardware must already be
|
||||
* powered back on (b44_init_hw).
|
||||
*/
|
||||
rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
|
||||
if (rc) {
|
||||
netdev_err(dev, "request_irq failed\n");
|
||||
spin_lock_irq(&bp->lock);
|
||||
b44_halt(bp);
|
||||
b44_free_rings(bp);
|
||||
spin_unlock_irq(&bp->lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
|
||||
b44_init_rings(bp);
|
||||
b44_init_hw(bp, B44_FULL_RESET);
|
||||
netif_device_attach(bp->dev);
|
||||
spin_unlock_irq(&bp->lock);
|
||||
|
||||
b44_enable_ints(bp);
|
||||
netif_wake_queue(dev);
|
||||
|
|
|
@ -293,22 +293,22 @@ static int bcm_enet_receive_queue(struct net_device *dev, int budget)
|
|||
/* if the packet does not have start of packet _and_
|
||||
* end of packet flag set, then just recycle it */
|
||||
if ((len_stat & DMADESC_ESOP_MASK) != DMADESC_ESOP_MASK) {
|
||||
priv->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* recycle packet if it's marked as bad */
|
||||
if (unlikely(len_stat & DMADESC_ERR_MASK)) {
|
||||
priv->stats.rx_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
|
||||
if (len_stat & DMADESC_OVSIZE_MASK)
|
||||
priv->stats.rx_length_errors++;
|
||||
dev->stats.rx_length_errors++;
|
||||
if (len_stat & DMADESC_CRC_MASK)
|
||||
priv->stats.rx_crc_errors++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
if (len_stat & DMADESC_UNDER_MASK)
|
||||
priv->stats.rx_frame_errors++;
|
||||
dev->stats.rx_frame_errors++;
|
||||
if (len_stat & DMADESC_OV_MASK)
|
||||
priv->stats.rx_fifo_errors++;
|
||||
dev->stats.rx_fifo_errors++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -324,7 +324,7 @@ static int bcm_enet_receive_queue(struct net_device *dev, int budget)
|
|||
nskb = netdev_alloc_skb_ip_align(dev, len);
|
||||
if (!nskb) {
|
||||
/* forget packet, just rearm desc */
|
||||
priv->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -342,8 +342,8 @@ static int bcm_enet_receive_queue(struct net_device *dev, int budget)
|
|||
|
||||
skb_put(skb, len);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
priv->stats.rx_packets++;
|
||||
priv->stats.rx_bytes += len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
} while (--budget > 0);
|
||||
|
@ -403,7 +403,7 @@ static int bcm_enet_tx_reclaim(struct net_device *dev, int force)
|
|||
spin_unlock(&priv->tx_lock);
|
||||
|
||||
if (desc->len_stat & DMADESC_UNDER_MASK)
|
||||
priv->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
released++;
|
||||
|
@ -563,8 +563,8 @@ static int bcm_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (!priv->tx_desc_count)
|
||||
netif_stop_queue(dev);
|
||||
|
||||
priv->stats.tx_bytes += skb->len;
|
||||
priv->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
dev->stats.tx_packets++;
|
||||
ret = NETDEV_TX_OK;
|
||||
|
||||
out_unlock:
|
||||
|
@ -798,7 +798,7 @@ static int bcm_enet_open(struct net_device *dev)
|
|||
snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
|
||||
priv->mac_id ? "1" : "0", priv->phy_id);
|
||||
|
||||
phydev = phy_connect(dev, phy_id, &bcm_enet_adjust_phy_link, 0,
|
||||
phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0,
|
||||
PHY_INTERFACE_MODE_MII);
|
||||
|
||||
if (IS_ERR(phydev)) {
|
||||
|
@ -1140,17 +1140,6 @@ static int bcm_enet_stop(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* core request to return device rx/tx stats
|
||||
*/
|
||||
static struct net_device_stats *bcm_enet_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct bcm_enet_priv *priv;
|
||||
|
||||
priv = netdev_priv(dev);
|
||||
return &priv->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* ethtool callbacks
|
||||
*/
|
||||
|
@ -1163,16 +1152,18 @@ struct bcm_enet_stats {
|
|||
|
||||
#define GEN_STAT(m) sizeof(((struct bcm_enet_priv *)0)->m), \
|
||||
offsetof(struct bcm_enet_priv, m)
|
||||
#define DEV_STAT(m) sizeof(((struct net_device_stats *)0)->m), \
|
||||
offsetof(struct net_device_stats, m)
|
||||
|
||||
static const struct bcm_enet_stats bcm_enet_gstrings_stats[] = {
|
||||
{ "rx_packets", GEN_STAT(stats.rx_packets), -1 },
|
||||
{ "tx_packets", GEN_STAT(stats.tx_packets), -1 },
|
||||
{ "rx_bytes", GEN_STAT(stats.rx_bytes), -1 },
|
||||
{ "tx_bytes", GEN_STAT(stats.tx_bytes), -1 },
|
||||
{ "rx_errors", GEN_STAT(stats.rx_errors), -1 },
|
||||
{ "tx_errors", GEN_STAT(stats.tx_errors), -1 },
|
||||
{ "rx_dropped", GEN_STAT(stats.rx_dropped), -1 },
|
||||
{ "tx_dropped", GEN_STAT(stats.tx_dropped), -1 },
|
||||
{ "rx_packets", DEV_STAT(rx_packets), -1 },
|
||||
{ "tx_packets", DEV_STAT(tx_packets), -1 },
|
||||
{ "rx_bytes", DEV_STAT(rx_bytes), -1 },
|
||||
{ "tx_bytes", DEV_STAT(tx_bytes), -1 },
|
||||
{ "rx_errors", DEV_STAT(rx_errors), -1 },
|
||||
{ "tx_errors", DEV_STAT(tx_errors), -1 },
|
||||
{ "rx_dropped", DEV_STAT(rx_dropped), -1 },
|
||||
{ "tx_dropped", DEV_STAT(tx_dropped), -1 },
|
||||
|
||||
{ "rx_good_octets", GEN_STAT(mib.rx_gd_octets), ETH_MIB_RX_GD_OCTETS},
|
||||
{ "rx_good_pkts", GEN_STAT(mib.rx_gd_pkts), ETH_MIB_RX_GD_PKTS },
|
||||
|
@ -1328,7 +1319,11 @@ static void bcm_enet_get_ethtool_stats(struct net_device *netdev,
|
|||
char *p;
|
||||
|
||||
s = &bcm_enet_gstrings_stats[i];
|
||||
p = (char *)priv + s->stat_offset;
|
||||
if (s->mib_reg == -1)
|
||||
p = (char *)&netdev->stats;
|
||||
else
|
||||
p = (char *)priv;
|
||||
p += s->stat_offset;
|
||||
data[i] = (s->sizeof_stat == sizeof(u64)) ?
|
||||
*(u64 *)p : *(u32 *)p;
|
||||
}
|
||||
|
@ -1605,7 +1600,6 @@ static const struct net_device_ops bcm_enet_ops = {
|
|||
.ndo_open = bcm_enet_open,
|
||||
.ndo_stop = bcm_enet_stop,
|
||||
.ndo_start_xmit = bcm_enet_start_xmit,
|
||||
.ndo_get_stats = bcm_enet_get_stats,
|
||||
.ndo_set_mac_address = bcm_enet_set_mac_address,
|
||||
.ndo_set_multicast_list = bcm_enet_set_multicast_list,
|
||||
.ndo_do_ioctl = bcm_enet_ioctl,
|
||||
|
|
|
@ -274,7 +274,6 @@ struct bcm_enet_priv {
|
|||
int pause_tx;
|
||||
|
||||
/* stats */
|
||||
struct net_device_stats stats;
|
||||
struct bcm_enet_mib_counters mib;
|
||||
|
||||
/* after mib interrupt, mib registers update is done in this
|
||||
|
|
|
@ -78,6 +78,8 @@ static inline char *nic_name(struct pci_dev *pdev)
|
|||
#define MCC_Q_LEN 128 /* total size not to exceed 8 pages */
|
||||
#define MCC_CQ_LEN 256
|
||||
|
||||
#define MAX_RSS_QS 4 /* BE limit is 4 queues/port */
|
||||
#define BE_MAX_MSIX_VECTORS (MAX_RSS_QS + 1 + 1)/* RSS qs + 1 def Rx + Tx */
|
||||
#define BE_NAPI_WEIGHT 64
|
||||
#define MAX_RX_POST BE_NAPI_WEIGHT /* Frags posted at a time */
|
||||
#define RX_FRAGS_REFILL_WM (RX_Q_LEN - MAX_RX_POST)
|
||||
|
@ -157,10 +159,9 @@ struct be_mcc_obj {
|
|||
bool rearm_cq;
|
||||
};
|
||||
|
||||
struct be_drvr_stats {
|
||||
struct be_tx_stats {
|
||||
u32 be_tx_reqs; /* number of TX requests initiated */
|
||||
u32 be_tx_stops; /* number of times TX Q was stopped */
|
||||
u32 be_fwd_reqs; /* number of send reqs through forwarding i/f */
|
||||
u32 be_tx_wrbs; /* number of tx WRBs used */
|
||||
u32 be_tx_events; /* number of tx completion events */
|
||||
u32 be_tx_compl; /* number of tx completion entries processed */
|
||||
|
@ -169,35 +170,6 @@ struct be_drvr_stats {
|
|||
u64 be_tx_bytes_prev;
|
||||
u64 be_tx_pkts;
|
||||
u32 be_tx_rate;
|
||||
|
||||
u32 cache_barrier[16];
|
||||
|
||||
u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */
|
||||
u32 be_rx_polls; /* number of times NAPI called poll function */
|
||||
u32 be_rx_events; /* number of ucast rx completion events */
|
||||
u32 be_rx_compl; /* number of rx completion entries processed */
|
||||
ulong be_rx_jiffies;
|
||||
u64 be_rx_bytes;
|
||||
u64 be_rx_bytes_prev;
|
||||
u64 be_rx_pkts;
|
||||
u32 be_rx_rate;
|
||||
u32 be_rx_mcast_pkt;
|
||||
/* number of non ether type II frames dropped where
|
||||
* frame len > length field of Mac Hdr */
|
||||
u32 be_802_3_dropped_frames;
|
||||
/* number of non ether type II frames malformed where
|
||||
* in frame len < length field of Mac Hdr */
|
||||
u32 be_802_3_malformed_frames;
|
||||
u32 be_rxcp_err; /* Num rx completion entries w/ err set. */
|
||||
ulong rx_fps_jiffies; /* jiffies at last FPS calc */
|
||||
u32 be_rx_frags;
|
||||
u32 be_prev_rx_frags;
|
||||
u32 be_rx_fps; /* Rx frags per second */
|
||||
};
|
||||
|
||||
struct be_stats_obj {
|
||||
struct be_drvr_stats drvr_stats;
|
||||
struct be_dma_mem cmd;
|
||||
};
|
||||
|
||||
struct be_tx_obj {
|
||||
|
@ -215,10 +187,34 @@ struct be_rx_page_info {
|
|||
bool last_page_user;
|
||||
};
|
||||
|
||||
struct be_rx_stats {
|
||||
u32 rx_post_fail;/* number of ethrx buffer alloc failures */
|
||||
u32 rx_polls; /* number of times NAPI called poll function */
|
||||
u32 rx_events; /* number of ucast rx completion events */
|
||||
u32 rx_compl; /* number of rx completion entries processed */
|
||||
ulong rx_jiffies;
|
||||
u64 rx_bytes;
|
||||
u64 rx_bytes_prev;
|
||||
u64 rx_pkts;
|
||||
u32 rx_rate;
|
||||
u32 rx_mcast_pkts;
|
||||
u32 rxcp_err; /* Num rx completion entries w/ err set. */
|
||||
ulong rx_fps_jiffies; /* jiffies at last FPS calc */
|
||||
u32 rx_frags;
|
||||
u32 prev_rx_frags;
|
||||
u32 rx_fps; /* Rx frags per second */
|
||||
};
|
||||
|
||||
struct be_rx_obj {
|
||||
struct be_adapter *adapter;
|
||||
struct be_queue_info q;
|
||||
struct be_queue_info cq;
|
||||
struct be_rx_page_info page_info_tbl[RX_Q_LEN];
|
||||
struct be_eq_obj rx_eq;
|
||||
struct be_rx_stats stats;
|
||||
u8 rss_id;
|
||||
bool rx_post_starved; /* Zero rx frags have been posted to BE */
|
||||
u32 cache_line_barrier[16];
|
||||
};
|
||||
|
||||
struct be_vf_cfg {
|
||||
|
@ -229,7 +225,6 @@ struct be_vf_cfg {
|
|||
u32 vf_tx_rate;
|
||||
};
|
||||
|
||||
#define BE_NUM_MSIX_VECTORS 2 /* 1 each for Tx and Rx */
|
||||
#define BE_INVALID_PMAC_ID 0xffffffff
|
||||
struct be_adapter {
|
||||
struct pci_dev *pdev;
|
||||
|
@ -249,29 +244,31 @@ struct be_adapter {
|
|||
spinlock_t mcc_lock; /* For serializing mcc cmds to BE card */
|
||||
spinlock_t mcc_cq_lock;
|
||||
|
||||
struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS];
|
||||
struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
|
||||
bool msix_enabled;
|
||||
bool isr_registered;
|
||||
|
||||
/* TX Rings */
|
||||
struct be_eq_obj tx_eq;
|
||||
struct be_tx_obj tx_obj;
|
||||
struct be_tx_stats tx_stats;
|
||||
|
||||
u32 cache_line_break[8];
|
||||
|
||||
/* Rx rings */
|
||||
struct be_eq_obj rx_eq;
|
||||
struct be_rx_obj rx_obj;
|
||||
struct be_rx_obj rx_obj[MAX_RSS_QS + 1]; /* one default non-rss Q */
|
||||
u32 num_rx_qs;
|
||||
u32 big_page_size; /* Compounded page size shared by rx wrbs */
|
||||
bool rx_post_starved; /* Zero rx frags have been posted to BE */
|
||||
|
||||
struct vlan_group *vlan_grp;
|
||||
u16 vlans_added;
|
||||
u16 max_vlans; /* Number of vlans supported */
|
||||
u8 vlan_tag[VLAN_GROUP_ARRAY_LEN];
|
||||
u8 vlan_tag[VLAN_N_VID];
|
||||
u8 vlan_prio_bmap; /* Available Priority BitMap */
|
||||
u16 recommended_prio; /* Recommended Priority */
|
||||
struct be_dma_mem mc_cmd_mem;
|
||||
|
||||
struct be_stats_obj stats;
|
||||
struct be_dma_mem stats_cmd;
|
||||
/* Work queue used to perform periodic tasks like getting statistics */
|
||||
struct delayed_work work;
|
||||
|
||||
|
@ -287,6 +284,7 @@ struct be_adapter {
|
|||
bool promiscuous;
|
||||
bool wol;
|
||||
u32 function_mode;
|
||||
u32 function_caps;
|
||||
u32 rx_fc; /* Rx flow control */
|
||||
u32 tx_fc; /* Tx flow control */
|
||||
bool ue_detected;
|
||||
|
@ -313,10 +311,20 @@ struct be_adapter {
|
|||
|
||||
extern const struct ethtool_ops be_ethtool_ops;
|
||||
|
||||
#define drvr_stats(adapter) (&adapter->stats.drvr_stats)
|
||||
#define tx_stats(adapter) (&adapter->tx_stats)
|
||||
#define rx_stats(rxo) (&rxo->stats)
|
||||
|
||||
#define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops)
|
||||
|
||||
#define for_all_rx_queues(adapter, rxo, i) \
|
||||
for (i = 0, rxo = &adapter->rx_obj[i]; i < adapter->num_rx_qs; \
|
||||
i++, rxo++)
|
||||
|
||||
/* Just skip the first default non-rss queue */
|
||||
#define for_all_rss_queues(adapter, rxo, i) \
|
||||
for (i = 0, rxo = &adapter->rx_obj[i+1]; i < (adapter->num_rx_qs - 1);\
|
||||
i++, rxo++)
|
||||
|
||||
#define PAGE_SHIFT_4K 12
|
||||
#define PAGE_SIZE_4K (1 << PAGE_SHIFT_4K)
|
||||
|
||||
|
@ -414,6 +422,20 @@ static inline void be_check_sriov_fn_type(struct be_adapter *adapter)
|
|||
adapter->is_virtfn = (data != 0xAA);
|
||||
}
|
||||
|
||||
static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
|
||||
{
|
||||
u32 addr;
|
||||
|
||||
addr = jhash(adapter->netdev->dev_addr, ETH_ALEN, 0);
|
||||
|
||||
mac[5] = (u8)(addr & 0xFF);
|
||||
mac[4] = (u8)((addr >> 8) & 0xFF);
|
||||
mac[3] = (u8)((addr >> 16) & 0xFF);
|
||||
mac[2] = 0xC9;
|
||||
mac[1] = 0x00;
|
||||
mac[0] = 0x00;
|
||||
}
|
||||
|
||||
extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
|
||||
u16 num_popped);
|
||||
extern void be_link_status_update(struct be_adapter *adapter, bool link_up);
|
||||
|
|
|
@ -71,7 +71,7 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
|
|||
if (compl_status == MCC_STATUS_SUCCESS) {
|
||||
if (compl->tag0 == OPCODE_ETH_GET_STATISTICS) {
|
||||
struct be_cmd_resp_get_stats *resp =
|
||||
adapter->stats.cmd.va;
|
||||
adapter->stats_cmd.va;
|
||||
be_dws_le_to_cpu(&resp->hw_stats,
|
||||
sizeof(resp->hw_stats));
|
||||
netdev_stats_update(adapter);
|
||||
|
@ -96,11 +96,62 @@ static void be_async_link_state_process(struct be_adapter *adapter,
|
|||
evt->port_link_status == ASYNC_EVENT_LINK_UP);
|
||||
}
|
||||
|
||||
/* Grp5 CoS Priority evt */
|
||||
static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
|
||||
struct be_async_event_grp5_cos_priority *evt)
|
||||
{
|
||||
if (evt->valid) {
|
||||
adapter->vlan_prio_bmap = evt->available_priority_bmap;
|
||||
adapter->recommended_prio =
|
||||
evt->reco_default_priority << VLAN_PRIO_SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
/* Grp5 QOS Speed evt */
|
||||
static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
|
||||
struct be_async_event_grp5_qos_link_speed *evt)
|
||||
{
|
||||
if (evt->physical_port == adapter->port_num) {
|
||||
/* qos_link_speed is in units of 10 Mbps */
|
||||
adapter->link_speed = evt->qos_link_speed * 10;
|
||||
}
|
||||
}
|
||||
|
||||
static void be_async_grp5_evt_process(struct be_adapter *adapter,
|
||||
u32 trailer, struct be_mcc_compl *evt)
|
||||
{
|
||||
u8 event_type = 0;
|
||||
|
||||
event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
|
||||
ASYNC_TRAILER_EVENT_TYPE_MASK;
|
||||
|
||||
switch (event_type) {
|
||||
case ASYNC_EVENT_COS_PRIORITY:
|
||||
be_async_grp5_cos_priority_process(adapter,
|
||||
(struct be_async_event_grp5_cos_priority *)evt);
|
||||
break;
|
||||
case ASYNC_EVENT_QOS_SPEED:
|
||||
be_async_grp5_qos_speed_process(adapter,
|
||||
(struct be_async_event_grp5_qos_link_speed *)evt);
|
||||
break;
|
||||
default:
|
||||
dev_warn(&adapter->pdev->dev, "Unknown grp5 event!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool is_link_state_evt(u32 trailer)
|
||||
{
|
||||
return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
|
||||
ASYNC_TRAILER_EVENT_CODE_MASK) ==
|
||||
ASYNC_EVENT_CODE_LINK_STATE;
|
||||
}
|
||||
|
||||
static inline bool is_grp5_evt(u32 trailer)
|
||||
{
|
||||
return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
|
||||
ASYNC_TRAILER_EVENT_CODE_MASK) ==
|
||||
ASYNC_EVENT_CODE_LINK_STATE);
|
||||
ASYNC_EVENT_CODE_GRP_5);
|
||||
}
|
||||
|
||||
static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
|
||||
|
@ -143,6 +194,9 @@ int be_process_mcc(struct be_adapter *adapter, int *status)
|
|||
if (is_link_state_evt(compl->flags))
|
||||
be_async_link_state_process(adapter,
|
||||
(struct be_async_event_link_state *) compl);
|
||||
else if (is_grp5_evt(compl->flags))
|
||||
be_async_grp5_evt_process(adapter,
|
||||
compl->flags, compl);
|
||||
} else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
|
||||
*status = be_mcc_compl_process(adapter, compl);
|
||||
atomic_dec(&mcc_obj->q.used);
|
||||
|
@ -677,10 +731,10 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|||
ctxt = &req->context;
|
||||
|
||||
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
|
||||
OPCODE_COMMON_MCC_CREATE);
|
||||
OPCODE_COMMON_MCC_CREATE_EXT);
|
||||
|
||||
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
||||
OPCODE_COMMON_MCC_CREATE, sizeof(*req));
|
||||
OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req));
|
||||
|
||||
req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
|
||||
|
||||
|
@ -688,7 +742,8 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|||
AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
|
||||
be_encoded_q_len(mccq->len));
|
||||
AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
|
||||
|
||||
/* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */
|
||||
req->async_event_bitmap[0] |= 0x00000022;
|
||||
be_dws_cpu_to_le(ctxt, sizeof(req->context));
|
||||
|
||||
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
||||
|
@ -754,7 +809,7 @@ int be_cmd_txq_create(struct be_adapter *adapter,
|
|||
/* Uses mbox */
|
||||
int be_cmd_rxq_create(struct be_adapter *adapter,
|
||||
struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
|
||||
u16 max_frame_size, u32 if_id, u32 rss)
|
||||
u16 max_frame_size, u32 if_id, u32 rss, u8 *rss_id)
|
||||
{
|
||||
struct be_mcc_wrb *wrb;
|
||||
struct be_cmd_req_eth_rx_create *req;
|
||||
|
@ -785,6 +840,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
|
|||
struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
|
||||
rxq->id = le16_to_cpu(resp->id);
|
||||
rxq->created = true;
|
||||
*rss_id = resp->rss_id;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
|
@ -1259,7 +1315,8 @@ err:
|
|||
}
|
||||
|
||||
/* Uses mbox */
|
||||
int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num, u32 *mode)
|
||||
int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
|
||||
u32 *mode, u32 *caps)
|
||||
{
|
||||
struct be_mcc_wrb *wrb;
|
||||
struct be_cmd_req_query_fw_cfg *req;
|
||||
|
@ -1281,6 +1338,7 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num, u32 *mode)
|
|||
struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
|
||||
*port_num = le32_to_cpu(resp->phys_port);
|
||||
*mode = le32_to_cpu(resp->function_mode);
|
||||
*caps = le32_to_cpu(resp->function_caps);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
|
@ -1311,6 +1369,37 @@ int be_cmd_reset_function(struct be_adapter *adapter)
|
|||
return status;
|
||||
}
|
||||
|
||||
int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
|
||||
{
|
||||
struct be_mcc_wrb *wrb;
|
||||
struct be_cmd_req_rss_config *req;
|
||||
u32 myhash[10];
|
||||
int status;
|
||||
|
||||
spin_lock(&adapter->mbox_lock);
|
||||
|
||||
wrb = wrb_from_mbox(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
|
||||
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
|
||||
OPCODE_ETH_RSS_CONFIG);
|
||||
|
||||
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
|
||||
OPCODE_ETH_RSS_CONFIG, sizeof(*req));
|
||||
|
||||
req->if_id = cpu_to_le32(adapter->if_handle);
|
||||
req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4);
|
||||
req->cpu_table_size_log2 = cpu_to_le16(fls(table_size) - 1);
|
||||
memcpy(req->cpu_table, rsstable, table_size);
|
||||
memcpy(req->hash, myhash, sizeof(myhash));
|
||||
be_dws_cpu_to_le(req->hash, sizeof(req->hash));
|
||||
|
||||
status = be_mbox_notify_wait(adapter);
|
||||
|
||||
spin_unlock(&adapter->mbox_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Uses sync mcc */
|
||||
int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
|
||||
u8 bcn, u8 sts, u8 state)
|
||||
|
|
|
@ -82,7 +82,12 @@ struct be_mcc_compl {
|
|||
*/
|
||||
#define ASYNC_TRAILER_EVENT_CODE_SHIFT 8 /* bits 8 - 15 */
|
||||
#define ASYNC_TRAILER_EVENT_CODE_MASK 0xFF
|
||||
#define ASYNC_TRAILER_EVENT_TYPE_SHIFT 16
|
||||
#define ASYNC_TRAILER_EVENT_TYPE_MASK 0xFF
|
||||
#define ASYNC_EVENT_CODE_LINK_STATE 0x1
|
||||
#define ASYNC_EVENT_CODE_GRP_5 0x5
|
||||
#define ASYNC_EVENT_QOS_SPEED 0x1
|
||||
#define ASYNC_EVENT_COS_PRIORITY 0x2
|
||||
struct be_async_event_trailer {
|
||||
u32 code;
|
||||
};
|
||||
|
@ -105,6 +110,30 @@ struct be_async_event_link_state {
|
|||
struct be_async_event_trailer trailer;
|
||||
} __packed;
|
||||
|
||||
/* When the event code of an async trailer is GRP-5 and event_type is QOS_SPEED
|
||||
* the mcc_compl must be interpreted as follows
|
||||
*/
|
||||
struct be_async_event_grp5_qos_link_speed {
|
||||
u8 physical_port;
|
||||
u8 rsvd[5];
|
||||
u16 qos_link_speed;
|
||||
u32 event_tag;
|
||||
struct be_async_event_trailer trailer;
|
||||
} __packed;
|
||||
|
||||
/* When the event code of an async trailer is GRP5 and event type is
|
||||
* CoS-Priority, the mcc_compl must be interpreted as follows
|
||||
*/
|
||||
struct be_async_event_grp5_cos_priority {
|
||||
u8 physical_port;
|
||||
u8 available_priority_bmap;
|
||||
u8 reco_default_priority;
|
||||
u8 valid;
|
||||
u8 rsvd0;
|
||||
u8 event_tag;
|
||||
struct be_async_event_trailer trailer;
|
||||
} __packed;
|
||||
|
||||
struct be_mcc_mailbox {
|
||||
struct be_mcc_wrb wrb;
|
||||
struct be_mcc_compl compl;
|
||||
|
@ -123,8 +152,9 @@ struct be_mcc_mailbox {
|
|||
#define OPCODE_COMMON_WRITE_FLASHROM 7
|
||||
#define OPCODE_COMMON_CQ_CREATE 12
|
||||
#define OPCODE_COMMON_EQ_CREATE 13
|
||||
#define OPCODE_COMMON_MCC_CREATE 21
|
||||
#define OPCODE_COMMON_MCC_CREATE 21
|
||||
#define OPCODE_COMMON_SET_QOS 28
|
||||
#define OPCODE_COMMON_MCC_CREATE_EXT 90
|
||||
#define OPCODE_COMMON_SEEPROM_READ 30
|
||||
#define OPCODE_COMMON_NTWK_RX_FILTER 34
|
||||
#define OPCODE_COMMON_GET_FW_VERSION 35
|
||||
|
@ -147,6 +177,7 @@ struct be_mcc_mailbox {
|
|||
#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
|
||||
#define OPCODE_COMMON_GET_PHY_DETAILS 102
|
||||
|
||||
#define OPCODE_ETH_RSS_CONFIG 1
|
||||
#define OPCODE_ETH_ACPI_CONFIG 2
|
||||
#define OPCODE_ETH_PROMISCUOUS 3
|
||||
#define OPCODE_ETH_GET_STATISTICS 4
|
||||
|
@ -337,6 +368,7 @@ struct be_cmd_req_mcc_create {
|
|||
struct be_cmd_req_hdr hdr;
|
||||
u16 num_pages;
|
||||
u16 rsvd0;
|
||||
u32 async_event_bitmap[1];
|
||||
u8 context[sizeof(struct amap_mcc_context) / 8];
|
||||
struct phys_addr pages[8];
|
||||
} __packed;
|
||||
|
@ -409,7 +441,7 @@ struct be_cmd_req_eth_rx_create {
|
|||
struct be_cmd_resp_eth_rx_create {
|
||||
struct be_cmd_resp_hdr hdr;
|
||||
u16 id;
|
||||
u8 cpu_id;
|
||||
u8 rss_id;
|
||||
u8 rsvd0;
|
||||
} __packed;
|
||||
|
||||
|
@ -739,9 +771,10 @@ struct be_cmd_resp_modify_eq_delay {
|
|||
} __packed;
|
||||
|
||||
/******************** Get FW Config *******************/
|
||||
#define BE_FUNCTION_CAPS_RSS 0x2
|
||||
struct be_cmd_req_query_fw_cfg {
|
||||
struct be_cmd_req_hdr hdr;
|
||||
u32 rsvd[30];
|
||||
u32 rsvd[31];
|
||||
};
|
||||
|
||||
struct be_cmd_resp_query_fw_cfg {
|
||||
|
@ -751,6 +784,26 @@ struct be_cmd_resp_query_fw_cfg {
|
|||
u32 phys_port;
|
||||
u32 function_mode;
|
||||
u32 rsvd[26];
|
||||
u32 function_caps;
|
||||
};
|
||||
|
||||
/******************** RSS Config *******************/
|
||||
/* RSS types */
|
||||
#define RSS_ENABLE_NONE 0x0
|
||||
#define RSS_ENABLE_IPV4 0x1
|
||||
#define RSS_ENABLE_TCP_IPV4 0x2
|
||||
#define RSS_ENABLE_IPV6 0x4
|
||||
#define RSS_ENABLE_TCP_IPV6 0x8
|
||||
|
||||
struct be_cmd_req_rss_config {
|
||||
struct be_cmd_req_hdr hdr;
|
||||
u32 if_id;
|
||||
u16 enable_rss;
|
||||
u16 cpu_table_size_log2;
|
||||
u32 hash[10];
|
||||
u8 cpu_table[128];
|
||||
u8 flush;
|
||||
u8 rsvd0[3];
|
||||
};
|
||||
|
||||
/******************** Port Beacon ***************************/
|
||||
|
@ -937,7 +990,7 @@ extern int be_cmd_txq_create(struct be_adapter *adapter,
|
|||
extern int be_cmd_rxq_create(struct be_adapter *adapter,
|
||||
struct be_queue_info *rxq, u16 cq_id,
|
||||
u16 frag_size, u16 max_frame_size, u32 if_id,
|
||||
u32 rss);
|
||||
u32 rss, u8 *rss_id);
|
||||
extern int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
|
||||
int type);
|
||||
extern int be_cmd_link_status_query(struct be_adapter *adapter,
|
||||
|
@ -960,8 +1013,10 @@ extern int be_cmd_set_flow_control(struct be_adapter *adapter,
|
|||
extern int be_cmd_get_flow_control(struct be_adapter *adapter,
|
||||
u32 *tx_fc, u32 *rx_fc);
|
||||
extern int be_cmd_query_fw_cfg(struct be_adapter *adapter,
|
||||
u32 *port_num, u32 *cap);
|
||||
u32 *port_num, u32 *function_mode, u32 *function_caps);
|
||||
extern int be_cmd_reset_function(struct be_adapter *adapter);
|
||||
extern int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
|
||||
u16 table_size);
|
||||
extern int be_process_mcc(struct be_adapter *adapter, int *status);
|
||||
extern int be_cmd_set_beacon_state(struct be_adapter *adapter,
|
||||
u8 port_num, u8 beacon, u8 status, u8 state);
|
||||
|
|
|
@ -26,14 +26,16 @@ struct be_ethtool_stat {
|
|||
int offset;
|
||||
};
|
||||
|
||||
enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT, ERXSTAT};
|
||||
enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT};
|
||||
#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
|
||||
offsetof(_struct, field)
|
||||
#define NETSTAT_INFO(field) #field, NETSTAT,\
|
||||
FIELDINFO(struct net_device_stats,\
|
||||
field)
|
||||
#define DRVSTAT_INFO(field) #field, DRVSTAT,\
|
||||
FIELDINFO(struct be_drvr_stats, field)
|
||||
#define DRVSTAT_TX_INFO(field) #field, DRVSTAT_TX,\
|
||||
FIELDINFO(struct be_tx_stats, field)
|
||||
#define DRVSTAT_RX_INFO(field) #field, DRVSTAT_RX,\
|
||||
FIELDINFO(struct be_rx_stats, field)
|
||||
#define MISCSTAT_INFO(field) #field, MISCSTAT,\
|
||||
FIELDINFO(struct be_rxf_stats, field)
|
||||
#define PORTSTAT_INFO(field) #field, PORTSTAT,\
|
||||
|
@ -51,21 +53,12 @@ static const struct be_ethtool_stat et_stats[] = {
|
|||
{NETSTAT_INFO(tx_errors)},
|
||||
{NETSTAT_INFO(rx_dropped)},
|
||||
{NETSTAT_INFO(tx_dropped)},
|
||||
{DRVSTAT_INFO(be_tx_reqs)},
|
||||
{DRVSTAT_INFO(be_tx_stops)},
|
||||
{DRVSTAT_INFO(be_fwd_reqs)},
|
||||
{DRVSTAT_INFO(be_tx_wrbs)},
|
||||
{DRVSTAT_INFO(be_rx_polls)},
|
||||
{DRVSTAT_INFO(be_tx_events)},
|
||||
{DRVSTAT_INFO(be_rx_events)},
|
||||
{DRVSTAT_INFO(be_tx_compl)},
|
||||
{DRVSTAT_INFO(be_rx_compl)},
|
||||
{DRVSTAT_INFO(be_rx_mcast_pkt)},
|
||||
{DRVSTAT_INFO(be_ethrx_post_fail)},
|
||||
{DRVSTAT_INFO(be_802_3_dropped_frames)},
|
||||
{DRVSTAT_INFO(be_802_3_malformed_frames)},
|
||||
{DRVSTAT_INFO(be_tx_rate)},
|
||||
{DRVSTAT_INFO(be_rx_rate)},
|
||||
{DRVSTAT_TX_INFO(be_tx_rate)},
|
||||
{DRVSTAT_TX_INFO(be_tx_reqs)},
|
||||
{DRVSTAT_TX_INFO(be_tx_wrbs)},
|
||||
{DRVSTAT_TX_INFO(be_tx_stops)},
|
||||
{DRVSTAT_TX_INFO(be_tx_events)},
|
||||
{DRVSTAT_TX_INFO(be_tx_compl)},
|
||||
{PORTSTAT_INFO(rx_unicast_frames)},
|
||||
{PORTSTAT_INFO(rx_multicast_frames)},
|
||||
{PORTSTAT_INFO(rx_broadcast_frames)},
|
||||
|
@ -91,6 +84,9 @@ static const struct be_ethtool_stat et_stats[] = {
|
|||
{PORTSTAT_INFO(rx_non_rss_packets)},
|
||||
{PORTSTAT_INFO(rx_ipv4_packets)},
|
||||
{PORTSTAT_INFO(rx_ipv6_packets)},
|
||||
{PORTSTAT_INFO(rx_switched_unicast_packets)},
|
||||
{PORTSTAT_INFO(rx_switched_multicast_packets)},
|
||||
{PORTSTAT_INFO(rx_switched_broadcast_packets)},
|
||||
{PORTSTAT_INFO(tx_unicastframes)},
|
||||
{PORTSTAT_INFO(tx_multicastframes)},
|
||||
{PORTSTAT_INFO(tx_broadcastframes)},
|
||||
|
@ -103,11 +99,24 @@ static const struct be_ethtool_stat et_stats[] = {
|
|||
{MISCSTAT_INFO(rx_drops_too_many_frags)},
|
||||
{MISCSTAT_INFO(rx_drops_invalid_ring)},
|
||||
{MISCSTAT_INFO(forwarded_packets)},
|
||||
{MISCSTAT_INFO(rx_drops_mtu)},
|
||||
{ERXSTAT_INFO(rx_drops_no_fragments)},
|
||||
{MISCSTAT_INFO(rx_drops_mtu)}
|
||||
};
|
||||
#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
|
||||
|
||||
/* Stats related to multi RX queues */
|
||||
static const struct be_ethtool_stat et_rx_stats[] = {
|
||||
{DRVSTAT_RX_INFO(rx_bytes)},
|
||||
{DRVSTAT_RX_INFO(rx_pkts)},
|
||||
{DRVSTAT_RX_INFO(rx_rate)},
|
||||
{DRVSTAT_RX_INFO(rx_polls)},
|
||||
{DRVSTAT_RX_INFO(rx_events)},
|
||||
{DRVSTAT_RX_INFO(rx_compl)},
|
||||
{DRVSTAT_RX_INFO(rx_mcast_pkts)},
|
||||
{DRVSTAT_RX_INFO(rx_post_fail)},
|
||||
{ERXSTAT_INFO(rx_drops_no_fragments)}
|
||||
};
|
||||
#define ETHTOOL_RXSTATS_NUM (ARRAY_SIZE(et_rx_stats))
|
||||
|
||||
static const char et_self_tests[][ETH_GSTRING_LEN] = {
|
||||
"MAC Loopback test",
|
||||
"PHY Loopback test",
|
||||
|
@ -140,7 +149,7 @@ static int
|
|||
be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
||||
struct be_eq_obj *rx_eq = &adapter->rx_obj[0].rx_eq;
|
||||
struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
||||
|
||||
coalesce->rx_coalesce_usecs = rx_eq->cur_eqd;
|
||||
|
@ -164,25 +173,49 @@ static int
|
|||
be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
||||
struct be_rx_obj *rxo;
|
||||
struct be_eq_obj *rx_eq;
|
||||
struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
||||
u32 tx_max, tx_min, tx_cur;
|
||||
u32 rx_max, rx_min, rx_cur;
|
||||
int status = 0;
|
||||
int status = 0, i;
|
||||
|
||||
if (coalesce->use_adaptive_tx_coalesce == 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* if AIC is being turned on now, start with an EQD of 0 */
|
||||
if (rx_eq->enable_aic == 0 &&
|
||||
coalesce->use_adaptive_rx_coalesce == 1) {
|
||||
rx_eq->cur_eqd = 0;
|
||||
}
|
||||
rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce;
|
||||
for_all_rx_queues(adapter, rxo, i) {
|
||||
rx_eq = &rxo->rx_eq;
|
||||
|
||||
rx_max = coalesce->rx_coalesce_usecs_high;
|
||||
rx_min = coalesce->rx_coalesce_usecs_low;
|
||||
rx_cur = coalesce->rx_coalesce_usecs;
|
||||
if (!rx_eq->enable_aic && coalesce->use_adaptive_rx_coalesce)
|
||||
rx_eq->cur_eqd = 0;
|
||||
rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce;
|
||||
|
||||
rx_max = coalesce->rx_coalesce_usecs_high;
|
||||
rx_min = coalesce->rx_coalesce_usecs_low;
|
||||
rx_cur = coalesce->rx_coalesce_usecs;
|
||||
|
||||
if (rx_eq->enable_aic) {
|
||||
if (rx_max > BE_MAX_EQD)
|
||||
rx_max = BE_MAX_EQD;
|
||||
if (rx_min > rx_max)
|
||||
rx_min = rx_max;
|
||||
rx_eq->max_eqd = rx_max;
|
||||
rx_eq->min_eqd = rx_min;
|
||||
if (rx_eq->cur_eqd > rx_max)
|
||||
rx_eq->cur_eqd = rx_max;
|
||||
if (rx_eq->cur_eqd < rx_min)
|
||||
rx_eq->cur_eqd = rx_min;
|
||||
} else {
|
||||
if (rx_cur > BE_MAX_EQD)
|
||||
rx_cur = BE_MAX_EQD;
|
||||
if (rx_eq->cur_eqd != rx_cur) {
|
||||
status = be_cmd_modify_eqd(adapter, rx_eq->q.id,
|
||||
rx_cur);
|
||||
if (!status)
|
||||
rx_eq->cur_eqd = rx_cur;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tx_max = coalesce->tx_coalesce_usecs_high;
|
||||
tx_min = coalesce->tx_coalesce_usecs_low;
|
||||
|
@ -196,27 +229,6 @@ be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
|||
tx_eq->cur_eqd = tx_cur;
|
||||
}
|
||||
|
||||
if (rx_eq->enable_aic) {
|
||||
if (rx_max > BE_MAX_EQD)
|
||||
rx_max = BE_MAX_EQD;
|
||||
if (rx_min > rx_max)
|
||||
rx_min = rx_max;
|
||||
rx_eq->max_eqd = rx_max;
|
||||
rx_eq->min_eqd = rx_min;
|
||||
if (rx_eq->cur_eqd > rx_max)
|
||||
rx_eq->cur_eqd = rx_max;
|
||||
if (rx_eq->cur_eqd < rx_min)
|
||||
rx_eq->cur_eqd = rx_min;
|
||||
} else {
|
||||
if (rx_cur > BE_MAX_EQD)
|
||||
rx_cur = BE_MAX_EQD;
|
||||
if (rx_eq->cur_eqd != rx_cur) {
|
||||
status = be_cmd_modify_eqd(adapter, rx_eq->q.id,
|
||||
rx_cur);
|
||||
if (!status)
|
||||
rx_eq->cur_eqd = rx_cur;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -244,32 +256,25 @@ be_get_ethtool_stats(struct net_device *netdev,
|
|||
struct ethtool_stats *stats, uint64_t *data)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
struct be_drvr_stats *drvr_stats = &adapter->stats.drvr_stats;
|
||||
struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
|
||||
struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
|
||||
struct be_port_rxf_stats *port_stats =
|
||||
&rxf_stats->port[adapter->port_num];
|
||||
struct net_device_stats *net_stats = &netdev->stats;
|
||||
struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats_cmd.va);
|
||||
struct be_erx_stats *erx_stats = &hw_stats->erx;
|
||||
struct be_rx_obj *rxo;
|
||||
void *p = NULL;
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
|
||||
switch (et_stats[i].type) {
|
||||
case NETSTAT:
|
||||
p = net_stats;
|
||||
p = &netdev->stats;
|
||||
break;
|
||||
case DRVSTAT:
|
||||
p = drvr_stats;
|
||||
case DRVSTAT_TX:
|
||||
p = &adapter->tx_stats;
|
||||
break;
|
||||
case PORTSTAT:
|
||||
p = port_stats;
|
||||
p = &hw_stats->rxf.port[adapter->port_num];
|
||||
break;
|
||||
case MISCSTAT:
|
||||
p = rxf_stats;
|
||||
break;
|
||||
case ERXSTAT: /* Currently only one ERX stat is provided */
|
||||
p = (u32 *)erx_stats + adapter->rx_obj.q.id;
|
||||
p = &hw_stats->rxf;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -277,19 +282,44 @@ be_get_ethtool_stats(struct net_device *netdev,
|
|||
data[i] = (et_stats[i].size == sizeof(u64)) ?
|
||||
*(u64 *)p: *(u32 *)p;
|
||||
}
|
||||
|
||||
for_all_rx_queues(adapter, rxo, j) {
|
||||
for (i = 0; i < ETHTOOL_RXSTATS_NUM; i++) {
|
||||
switch (et_rx_stats[i].type) {
|
||||
case DRVSTAT_RX:
|
||||
p = (u8 *)&rxo->stats + et_rx_stats[i].offset;
|
||||
break;
|
||||
case ERXSTAT:
|
||||
p = (u32 *)erx_stats + rxo->q.id;
|
||||
break;
|
||||
}
|
||||
data[ETHTOOL_STATS_NUM + j * ETHTOOL_RXSTATS_NUM + i] =
|
||||
(et_rx_stats[i].size == sizeof(u64)) ?
|
||||
*(u64 *)p: *(u32 *)p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
be_get_stat_strings(struct net_device *netdev, uint32_t stringset,
|
||||
uint8_t *data)
|
||||
{
|
||||
int i;
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
int i, j;
|
||||
|
||||
switch (stringset) {
|
||||
case ETH_SS_STATS:
|
||||
for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
|
||||
memcpy(data, et_stats[i].desc, ETH_GSTRING_LEN);
|
||||
data += ETH_GSTRING_LEN;
|
||||
}
|
||||
for (i = 0; i < adapter->num_rx_qs; i++) {
|
||||
for (j = 0; j < ETHTOOL_RXSTATS_NUM; j++) {
|
||||
sprintf(data, "rxq%d: %s", i,
|
||||
et_rx_stats[j].desc);
|
||||
data += ETH_GSTRING_LEN;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ETH_SS_TEST:
|
||||
for (i = 0; i < ETHTOOL_TESTS_NUM; i++) {
|
||||
|
@ -302,11 +332,14 @@ be_get_stat_strings(struct net_device *netdev, uint32_t stringset,
|
|||
|
||||
static int be_get_sset_count(struct net_device *netdev, int stringset)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
switch (stringset) {
|
||||
case ETH_SS_TEST:
|
||||
return ETHTOOL_TESTS_NUM;
|
||||
case ETH_SS_STATS:
|
||||
return ETHTOOL_STATS_NUM;
|
||||
return ETHTOOL_STATS_NUM +
|
||||
adapter->num_rx_qs * ETHTOOL_RXSTATS_NUM;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -421,10 +454,10 @@ be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
|
|||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
ring->rx_max_pending = adapter->rx_obj.q.len;
|
||||
ring->rx_max_pending = adapter->rx_obj[0].q.len;
|
||||
ring->tx_max_pending = adapter->tx_obj.q.len;
|
||||
|
||||
ring->rx_pending = atomic_read(&adapter->rx_obj.q.used);
|
||||
ring->rx_pending = atomic_read(&adapter->rx_obj[0].q.used);
|
||||
ring->tx_pending = atomic_read(&adapter->tx_obj.q.used);
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -804,15 +804,14 @@ static void bfin_dump_hwtamp(char *s, ktime_t *hw, ktime_t *ts, struct timecompa
|
|||
static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
|
||||
{
|
||||
struct bfin_mac_local *lp = netdev_priv(netdev);
|
||||
union skb_shared_tx *shtx = skb_tx(skb);
|
||||
|
||||
if (shtx->hardware) {
|
||||
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
|
||||
int timeout_cnt = MAX_TIMEOUT_CNT;
|
||||
|
||||
/* When doing time stamping, keep the connection to the socket
|
||||
* a while longer
|
||||
*/
|
||||
shtx->in_progress = 1;
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
|
||||
/*
|
||||
* The timestamping is done at the EMAC module's MII/RMII interface
|
||||
|
@ -992,7 +991,6 @@ static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
|
|||
struct bfin_mac_local *lp = netdev_priv(dev);
|
||||
u16 *data;
|
||||
u32 data_align = (unsigned long)(skb->data) & 0x3;
|
||||
union skb_shared_tx *shtx = skb_tx(skb);
|
||||
|
||||
current_tx_ptr->skb = skb;
|
||||
|
||||
|
@ -1006,7 +1004,7 @@ static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
|
|||
* of this field are the length of the packet payload in bytes and the higher
|
||||
* 4 bits are the timestamping enable field.
|
||||
*/
|
||||
if (shtx->hardware)
|
||||
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
|
||||
*data |= 0x1000;
|
||||
|
||||
current_tx_ptr->desc_a.start_addr = (u32)data;
|
||||
|
@ -1016,7 +1014,7 @@ static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
|
|||
} else {
|
||||
*((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len);
|
||||
/* enable timestamping for the sent packet */
|
||||
if (shtx->hardware)
|
||||
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
|
||||
*((u16 *)(current_tx_ptr->packet)) |= 0x1000;
|
||||
memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data,
|
||||
skb->len);
|
||||
|
|
|
@ -1233,15 +1233,8 @@ static void bmac_reset_and_enable(struct net_device *dev)
|
|||
}
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
}
|
||||
static void bmac_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
|
||||
{
|
||||
struct bmac_data *bp = netdev_priv(dev);
|
||||
strcpy(info->driver, "bmac");
|
||||
strcpy(info->bus_info, dev_name(&bp->mdev->ofdev.dev));
|
||||
}
|
||||
|
||||
static const struct ethtool_ops bmac_ethtool_ops = {
|
||||
.get_drvinfo = bmac_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
};
|
||||
|
||||
|
@ -1588,7 +1581,7 @@ bmac_proc_info(char *buffer, char **start, off_t offset, int length)
|
|||
int i;
|
||||
|
||||
if (bmac_devs == NULL)
|
||||
return (-ENOSYS);
|
||||
return -ENOSYS;
|
||||
|
||||
len += sprintf(buffer, "BMAC counters & registers\n");
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
#
|
||||
# Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BNA) += bna.o
|
||||
|
||||
bna-objs := bnad.o bnad_ethtool.o bna_ctrl.o bna_txrx.o
|
||||
bna-objs += bfa_ioc.o bfa_ioc_ct.o bfa_cee.o cna_fwimg.o
|
||||
|
||||
EXTRA_CFLAGS := -Idrivers/net/bna
|
|
@ -0,0 +1,291 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#include "bfa_defs_cna.h"
|
||||
#include "cna.h"
|
||||
#include "bfa_cee.h"
|
||||
#include "bfi_cna.h"
|
||||
#include "bfa_ioc.h"
|
||||
|
||||
#define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
|
||||
#define bfa_lpuid(__arg) bfa_ioc_portid(&(__arg)->ioc)
|
||||
|
||||
static void bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg *lldp_cfg);
|
||||
static void bfa_cee_format_cee_cfg(void *buffer);
|
||||
|
||||
static void
|
||||
bfa_cee_format_cee_cfg(void *buffer)
|
||||
{
|
||||
struct bfa_cee_attr *cee_cfg = buffer;
|
||||
bfa_cee_format_lldp_cfg(&cee_cfg->lldp_remote);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_cee_stats_swap(struct bfa_cee_stats *stats)
|
||||
{
|
||||
u32 *buffer = (u32 *)stats;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (sizeof(struct bfa_cee_stats) / sizeof(u32));
|
||||
i++) {
|
||||
buffer[i] = ntohl(buffer[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg *lldp_cfg)
|
||||
{
|
||||
lldp_cfg->time_to_live =
|
||||
ntohs(lldp_cfg->time_to_live);
|
||||
lldp_cfg->enabled_system_cap =
|
||||
ntohs(lldp_cfg->enabled_system_cap);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_attr_meminfo()
|
||||
*
|
||||
* @brief Returns the size of the DMA memory needed by CEE attributes
|
||||
*
|
||||
* @param[in] void
|
||||
*
|
||||
* @return Size of DMA region
|
||||
*/
|
||||
static u32
|
||||
bfa_cee_attr_meminfo(void)
|
||||
{
|
||||
return roundup(sizeof(struct bfa_cee_attr), BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
/**
|
||||
* bfa_cee_stats_meminfo()
|
||||
*
|
||||
* @brief Returns the size of the DMA memory needed by CEE stats
|
||||
*
|
||||
* @param[in] void
|
||||
*
|
||||
* @return Size of DMA region
|
||||
*/
|
||||
static u32
|
||||
bfa_cee_stats_meminfo(void)
|
||||
{
|
||||
return roundup(sizeof(struct bfa_cee_stats), BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr()
|
||||
*
|
||||
* @brief CEE ISR for get-attributes responses from f/w
|
||||
*
|
||||
* @param[in] cee - Pointer to the CEE module
|
||||
* status - Return status from the f/w
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void
|
||||
bfa_cee_get_attr_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->get_attr_status = status;
|
||||
if (status == BFA_STATUS_OK) {
|
||||
memcpy(cee->attr, cee->attr_dma.kva,
|
||||
sizeof(struct bfa_cee_attr));
|
||||
bfa_cee_format_cee_cfg(cee->attr);
|
||||
}
|
||||
cee->get_attr_pending = false;
|
||||
if (cee->cbfn.get_attr_cbfn)
|
||||
cee->cbfn.get_attr_cbfn(cee->cbfn.get_attr_cbarg, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr()
|
||||
*
|
||||
* @brief CEE ISR for get-stats responses from f/w
|
||||
*
|
||||
* @param[in] cee - Pointer to the CEE module
|
||||
* status - Return status from the f/w
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void
|
||||
bfa_cee_get_stats_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->get_stats_status = status;
|
||||
if (status == BFA_STATUS_OK) {
|
||||
memcpy(cee->stats, cee->stats_dma.kva,
|
||||
sizeof(struct bfa_cee_stats));
|
||||
bfa_cee_stats_swap(cee->stats);
|
||||
}
|
||||
cee->get_stats_pending = false;
|
||||
if (cee->cbfn.get_stats_cbfn)
|
||||
cee->cbfn.get_stats_cbfn(cee->cbfn.get_stats_cbarg, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr()
|
||||
*
|
||||
* @brief CEE ISR for reset-stats responses from f/w
|
||||
*
|
||||
* @param[in] cee - Pointer to the CEE module
|
||||
* status - Return status from the f/w
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void
|
||||
bfa_cee_reset_stats_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->reset_stats_status = status;
|
||||
cee->reset_stats_pending = false;
|
||||
if (cee->cbfn.reset_stats_cbfn)
|
||||
cee->cbfn.reset_stats_cbfn(cee->cbfn.reset_stats_cbarg, status);
|
||||
}
|
||||
/**
|
||||
* bfa_nw_cee_meminfo()
|
||||
*
|
||||
* @brief Returns the size of the DMA memory needed by CEE module
|
||||
*
|
||||
* @param[in] void
|
||||
*
|
||||
* @return Size of DMA region
|
||||
*/
|
||||
u32
|
||||
bfa_nw_cee_meminfo(void)
|
||||
{
|
||||
return bfa_cee_attr_meminfo() + bfa_cee_stats_meminfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_nw_cee_mem_claim()
|
||||
*
|
||||
* @brief Initialized CEE DMA Memory
|
||||
*
|
||||
* @param[in] cee CEE module pointer
|
||||
* dma_kva Kernel Virtual Address of CEE DMA Memory
|
||||
* dma_pa Physical Address of CEE DMA Memory
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
void
|
||||
bfa_nw_cee_mem_claim(struct bfa_cee *cee, u8 *dma_kva, u64 dma_pa)
|
||||
{
|
||||
cee->attr_dma.kva = dma_kva;
|
||||
cee->attr_dma.pa = dma_pa;
|
||||
cee->stats_dma.kva = dma_kva + bfa_cee_attr_meminfo();
|
||||
cee->stats_dma.pa = dma_pa + bfa_cee_attr_meminfo();
|
||||
cee->attr = (struct bfa_cee_attr *) dma_kva;
|
||||
cee->stats = (struct bfa_cee_stats *)
|
||||
(dma_kva + bfa_cee_attr_meminfo());
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_isrs()
|
||||
*
|
||||
* @brief Handles Mail-box interrupts for CEE module.
|
||||
*
|
||||
* @param[in] Pointer to the CEE module data structure.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
static void
|
||||
bfa_cee_isr(void *cbarg, struct bfi_mbmsg *m)
|
||||
{
|
||||
union bfi_cee_i2h_msg_u *msg;
|
||||
struct bfi_cee_get_rsp *get_rsp;
|
||||
struct bfa_cee *cee = (struct bfa_cee *) cbarg;
|
||||
msg = (union bfi_cee_i2h_msg_u *) m;
|
||||
get_rsp = (struct bfi_cee_get_rsp *) m;
|
||||
switch (msg->mh.msg_id) {
|
||||
case BFI_CEE_I2H_GET_CFG_RSP:
|
||||
bfa_cee_get_attr_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
case BFI_CEE_I2H_GET_STATS_RSP:
|
||||
bfa_cee_get_stats_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
case BFI_CEE_I2H_RESET_STATS_RSP:
|
||||
bfa_cee_reset_stats_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
default:
|
||||
BUG_ON(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_hbfail()
|
||||
*
|
||||
* @brief CEE module heart-beat failure handler.
|
||||
*
|
||||
* @param[in] Pointer to the CEE module data structure.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
static void
|
||||
bfa_cee_hbfail(void *arg)
|
||||
{
|
||||
struct bfa_cee *cee;
|
||||
cee = (struct bfa_cee *) arg;
|
||||
|
||||
if (cee->get_attr_pending == true) {
|
||||
cee->get_attr_status = BFA_STATUS_FAILED;
|
||||
cee->get_attr_pending = false;
|
||||
if (cee->cbfn.get_attr_cbfn) {
|
||||
cee->cbfn.get_attr_cbfn(cee->cbfn.get_attr_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
if (cee->get_stats_pending == true) {
|
||||
cee->get_stats_status = BFA_STATUS_FAILED;
|
||||
cee->get_stats_pending = false;
|
||||
if (cee->cbfn.get_stats_cbfn) {
|
||||
cee->cbfn.get_stats_cbfn(cee->cbfn.get_stats_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
if (cee->reset_stats_pending == true) {
|
||||
cee->reset_stats_status = BFA_STATUS_FAILED;
|
||||
cee->reset_stats_pending = false;
|
||||
if (cee->cbfn.reset_stats_cbfn) {
|
||||
cee->cbfn.reset_stats_cbfn(cee->cbfn.reset_stats_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_nw_cee_attach()
|
||||
*
|
||||
* @brief CEE module-attach API
|
||||
*
|
||||
* @param[in] cee - Pointer to the CEE module data structure
|
||||
* ioc - Pointer to the ioc module data structure
|
||||
* dev - Pointer to the device driver module data structure
|
||||
* The device driver specific mbox ISR functions have
|
||||
* this pointer as one of the parameters.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
void
|
||||
bfa_nw_cee_attach(struct bfa_cee *cee, struct bfa_ioc *ioc,
|
||||
void *dev)
|
||||
{
|
||||
BUG_ON(!(cee != NULL));
|
||||
cee->dev = dev;
|
||||
cee->ioc = ioc;
|
||||
|
||||
bfa_nw_ioc_mbox_regisr(cee->ioc, BFI_MC_CEE, bfa_cee_isr, cee);
|
||||
bfa_ioc_hbfail_init(&cee->hbfail, bfa_cee_hbfail, cee);
|
||||
bfa_nw_ioc_hbfail_register(cee->ioc, &cee->hbfail);
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_CEE_H__
|
||||
#define __BFA_CEE_H__
|
||||
|
||||
#include "bfa_defs_cna.h"
|
||||
#include "bfa_ioc.h"
|
||||
|
||||
typedef void (*bfa_cee_get_attr_cbfn_t) (void *dev, enum bfa_status status);
|
||||
typedef void (*bfa_cee_get_stats_cbfn_t) (void *dev, enum bfa_status status);
|
||||
typedef void (*bfa_cee_reset_stats_cbfn_t) (void *dev, enum bfa_status status);
|
||||
typedef void (*bfa_cee_hbfail_cbfn_t) (void *dev, enum bfa_status status);
|
||||
|
||||
struct bfa_cee_cbfn {
|
||||
bfa_cee_get_attr_cbfn_t get_attr_cbfn;
|
||||
void *get_attr_cbarg;
|
||||
bfa_cee_get_stats_cbfn_t get_stats_cbfn;
|
||||
void *get_stats_cbarg;
|
||||
bfa_cee_reset_stats_cbfn_t reset_stats_cbfn;
|
||||
void *reset_stats_cbarg;
|
||||
};
|
||||
|
||||
struct bfa_cee {
|
||||
void *dev;
|
||||
bool get_attr_pending;
|
||||
bool get_stats_pending;
|
||||
bool reset_stats_pending;
|
||||
enum bfa_status get_attr_status;
|
||||
enum bfa_status get_stats_status;
|
||||
enum bfa_status reset_stats_status;
|
||||
struct bfa_cee_cbfn cbfn;
|
||||
struct bfa_ioc_hbfail_notify hbfail;
|
||||
struct bfa_cee_attr *attr;
|
||||
struct bfa_cee_stats *stats;
|
||||
struct bfa_dma attr_dma;
|
||||
struct bfa_dma stats_dma;
|
||||
struct bfa_ioc *ioc;
|
||||
struct bfa_mbox_cmd get_cfg_mb;
|
||||
struct bfa_mbox_cmd get_stats_mb;
|
||||
struct bfa_mbox_cmd reset_stats_mb;
|
||||
};
|
||||
|
||||
u32 bfa_nw_cee_meminfo(void);
|
||||
void bfa_nw_cee_mem_claim(struct bfa_cee *cee, u8 *dma_kva,
|
||||
u64 dma_pa);
|
||||
void bfa_nw_cee_attach(struct bfa_cee *cee, struct bfa_ioc *ioc, void *dev);
|
||||
|
||||
#endif /* __BFA_CEE_H__ */
|
|
@ -0,0 +1,243 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_DEFS_H__
|
||||
#define __BFA_DEFS_H__
|
||||
|
||||
#include "cna.h"
|
||||
#include "bfa_defs_status.h"
|
||||
#include "bfa_defs_mfg_comm.h"
|
||||
|
||||
#define BFA_STRING_32 32
|
||||
#define BFA_VERSION_LEN 64
|
||||
|
||||
/**
|
||||
* ---------------------- adapter definitions ------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* BFA adapter level attributes.
|
||||
*/
|
||||
enum {
|
||||
BFA_ADAPTER_SERIAL_NUM_LEN = STRSZ(BFA_MFG_SERIALNUM_SIZE),
|
||||
/*
|
||||
*!< adapter serial num length
|
||||
*/
|
||||
BFA_ADAPTER_MODEL_NAME_LEN = 16, /*!< model name length */
|
||||
BFA_ADAPTER_MODEL_DESCR_LEN = 128, /*!< model description length */
|
||||
BFA_ADAPTER_MFG_NAME_LEN = 8, /*!< manufacturer name length */
|
||||
BFA_ADAPTER_SYM_NAME_LEN = 64, /*!< adapter symbolic name length */
|
||||
BFA_ADAPTER_OS_TYPE_LEN = 64, /*!< adapter os type length */
|
||||
};
|
||||
|
||||
struct bfa_adapter_attr {
|
||||
char manufacturer[BFA_ADAPTER_MFG_NAME_LEN];
|
||||
char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN];
|
||||
u32 card_type;
|
||||
char model[BFA_ADAPTER_MODEL_NAME_LEN];
|
||||
char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN];
|
||||
u64 pwwn;
|
||||
char node_symname[FC_SYMNAME_MAX];
|
||||
char hw_ver[BFA_VERSION_LEN];
|
||||
char fw_ver[BFA_VERSION_LEN];
|
||||
char optrom_ver[BFA_VERSION_LEN];
|
||||
char os_type[BFA_ADAPTER_OS_TYPE_LEN];
|
||||
struct bfa_mfg_vpd vpd;
|
||||
struct mac mac;
|
||||
|
||||
u8 nports;
|
||||
u8 max_speed;
|
||||
u8 prototype;
|
||||
char asic_rev;
|
||||
|
||||
u8 pcie_gen;
|
||||
u8 pcie_lanes_orig;
|
||||
u8 pcie_lanes;
|
||||
u8 cna_capable;
|
||||
|
||||
u8 is_mezz;
|
||||
u8 trunk_capable;
|
||||
};
|
||||
|
||||
/**
|
||||
* ---------------------- IOC definitions ------------
|
||||
*/
|
||||
|
||||
enum {
|
||||
BFA_IOC_DRIVER_LEN = 16,
|
||||
BFA_IOC_CHIP_REV_LEN = 8,
|
||||
};
|
||||
|
||||
/**
|
||||
* Driver and firmware versions.
|
||||
*/
|
||||
struct bfa_ioc_driver_attr {
|
||||
char driver[BFA_IOC_DRIVER_LEN]; /*!< driver name */
|
||||
char driver_ver[BFA_VERSION_LEN]; /*!< driver version */
|
||||
char fw_ver[BFA_VERSION_LEN]; /*!< firmware version */
|
||||
char bios_ver[BFA_VERSION_LEN]; /*!< bios version */
|
||||
char efi_ver[BFA_VERSION_LEN]; /*!< EFI version */
|
||||
char ob_ver[BFA_VERSION_LEN]; /*!< openboot version */
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC PCI device attributes
|
||||
*/
|
||||
struct bfa_ioc_pci_attr {
|
||||
u16 vendor_id; /*!< PCI vendor ID */
|
||||
u16 device_id; /*!< PCI device ID */
|
||||
u16 ssid; /*!< subsystem ID */
|
||||
u16 ssvid; /*!< subsystem vendor ID */
|
||||
u32 pcifn; /*!< PCI device function */
|
||||
u32 rsvd; /* padding */
|
||||
char chip_rev[BFA_IOC_CHIP_REV_LEN]; /*!< chip revision */
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC states
|
||||
*/
|
||||
enum bfa_ioc_state {
|
||||
BFA_IOC_RESET = 1, /*!< IOC is in reset state */
|
||||
BFA_IOC_SEMWAIT = 2, /*!< Waiting for IOC h/w semaphore */
|
||||
BFA_IOC_HWINIT = 3, /*!< IOC h/w is being initialized */
|
||||
BFA_IOC_GETATTR = 4, /*!< IOC is being configured */
|
||||
BFA_IOC_OPERATIONAL = 5, /*!< IOC is operational */
|
||||
BFA_IOC_INITFAIL = 6, /*!< IOC hardware failure */
|
||||
BFA_IOC_HBFAIL = 7, /*!< IOC heart-beat failure */
|
||||
BFA_IOC_DISABLING = 8, /*!< IOC is being disabled */
|
||||
BFA_IOC_DISABLED = 9, /*!< IOC is disabled */
|
||||
BFA_IOC_FWMISMATCH = 10, /*!< IOC f/w different from drivers */
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC firmware stats
|
||||
*/
|
||||
struct bfa_fw_ioc_stats {
|
||||
u32 enable_reqs;
|
||||
u32 disable_reqs;
|
||||
u32 get_attr_reqs;
|
||||
u32 dbg_sync;
|
||||
u32 dbg_dump;
|
||||
u32 unknown_reqs;
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC driver stats
|
||||
*/
|
||||
struct bfa_ioc_drv_stats {
|
||||
u32 ioc_isrs;
|
||||
u32 ioc_enables;
|
||||
u32 ioc_disables;
|
||||
u32 ioc_hbfails;
|
||||
u32 ioc_boots;
|
||||
u32 stats_tmos;
|
||||
u32 hb_count;
|
||||
u32 disable_reqs;
|
||||
u32 enable_reqs;
|
||||
u32 disable_replies;
|
||||
u32 enable_replies;
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC statistics
|
||||
*/
|
||||
struct bfa_ioc_stats {
|
||||
struct bfa_ioc_drv_stats drv_stats; /*!< driver IOC stats */
|
||||
struct bfa_fw_ioc_stats fw_stats; /*!< firmware IOC stats */
|
||||
};
|
||||
|
||||
enum bfa_ioc_type {
|
||||
BFA_IOC_TYPE_FC = 1,
|
||||
BFA_IOC_TYPE_FCoE = 2,
|
||||
BFA_IOC_TYPE_LL = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC attributes returned in queries
|
||||
*/
|
||||
struct bfa_ioc_attr {
|
||||
enum bfa_ioc_type ioc_type;
|
||||
enum bfa_ioc_state state; /*!< IOC state */
|
||||
struct bfa_adapter_attr adapter_attr; /*!< HBA attributes */
|
||||
struct bfa_ioc_driver_attr driver_attr; /*!< driver attr */
|
||||
struct bfa_ioc_pci_attr pci_attr;
|
||||
u8 port_id; /*!< port number */
|
||||
u8 rsvd[7]; /*!< 64bit align */
|
||||
};
|
||||
|
||||
/**
|
||||
* ---------------------- mfg definitions ------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Checksum size
|
||||
*/
|
||||
#define BFA_MFG_CHKSUM_SIZE 16
|
||||
|
||||
#define BFA_MFG_PARTNUM_SIZE 14
|
||||
#define BFA_MFG_SUPPLIER_ID_SIZE 10
|
||||
#define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20
|
||||
#define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20
|
||||
#define BFA_MFG_SUPPLIER_REVISION_SIZE 4
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/**
|
||||
* @brief BFA adapter manufacturing block definition.
|
||||
*
|
||||
* All numerical fields are in big-endian format.
|
||||
*/
|
||||
struct bfa_mfg_block {
|
||||
u8 version; /*!< manufacturing block version */
|
||||
u8 mfg_sig[3]; /*!< characters 'M', 'F', 'G' */
|
||||
u16 mfgsize; /*!< mfg block size */
|
||||
u16 u16_chksum; /*!< old u16 checksum */
|
||||
char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
|
||||
char brcd_partnum[STRSZ(BFA_MFG_PARTNUM_SIZE)];
|
||||
u8 mfg_day; /*!< manufacturing day */
|
||||
u8 mfg_month; /*!< manufacturing month */
|
||||
u16 mfg_year; /*!< manufacturing year */
|
||||
u64 mfg_wwn; /*!< wwn base for this adapter */
|
||||
u8 num_wwn; /*!< number of wwns assigned */
|
||||
u8 mfg_speeds; /*!< speeds allowed for this adapter */
|
||||
u8 rsv[2];
|
||||
char supplier_id[STRSZ(BFA_MFG_SUPPLIER_ID_SIZE)];
|
||||
char supplier_partnum[STRSZ(BFA_MFG_SUPPLIER_PARTNUM_SIZE)];
|
||||
char
|
||||
supplier_serialnum[STRSZ(BFA_MFG_SUPPLIER_SERIALNUM_SIZE)];
|
||||
char
|
||||
supplier_revision[STRSZ(BFA_MFG_SUPPLIER_REVISION_SIZE)];
|
||||
mac_t mfg_mac; /*!< mac address */
|
||||
u8 num_mac; /*!< number of mac addresses */
|
||||
u8 rsv2;
|
||||
u32 mfg_type; /*!< card type */
|
||||
u8 rsv3[108];
|
||||
u8 md5_chksum[BFA_MFG_CHKSUM_SIZE]; /*!< md5 checksum */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
/**
|
||||
* ---------------------- pci definitions ------------
|
||||
*/
|
||||
|
||||
#define bfa_asic_id_ct(devid) \
|
||||
((devid) == PCI_DEVICE_ID_BROCADE_CT || \
|
||||
(devid) == PCI_DEVICE_ID_BROCADE_CT_FC)
|
||||
|
||||
#endif /* __BFA_DEFS_H__ */
|
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_DEFS_CNA_H__
|
||||
#define __BFA_DEFS_CNA_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* FC physical port statistics.
|
||||
*/
|
||||
struct bfa_port_fc_stats {
|
||||
u64 secs_reset; /*!< Seconds since stats is reset */
|
||||
u64 tx_frames; /*!< Tx frames */
|
||||
u64 tx_words; /*!< Tx words */
|
||||
u64 tx_lip; /*!< Tx LIP */
|
||||
u64 tx_nos; /*!< Tx NOS */
|
||||
u64 tx_ols; /*!< Tx OLS */
|
||||
u64 tx_lr; /*!< Tx LR */
|
||||
u64 tx_lrr; /*!< Tx LRR */
|
||||
u64 rx_frames; /*!< Rx frames */
|
||||
u64 rx_words; /*!< Rx words */
|
||||
u64 lip_count; /*!< Rx LIP */
|
||||
u64 nos_count; /*!< Rx NOS */
|
||||
u64 ols_count; /*!< Rx OLS */
|
||||
u64 lr_count; /*!< Rx LR */
|
||||
u64 lrr_count; /*!< Rx LRR */
|
||||
u64 invalid_crcs; /*!< Rx CRC err frames */
|
||||
u64 invalid_crc_gd_eof; /*!< Rx CRC err good EOF frames */
|
||||
u64 undersized_frm; /*!< Rx undersized frames */
|
||||
u64 oversized_frm; /*!< Rx oversized frames */
|
||||
u64 bad_eof_frm; /*!< Rx frames with bad EOF */
|
||||
u64 error_frames; /*!< Errored frames */
|
||||
u64 dropped_frames; /*!< Dropped frames */
|
||||
u64 link_failures; /*!< Link Failure (LF) count */
|
||||
u64 loss_of_syncs; /*!< Loss of sync count */
|
||||
u64 loss_of_signals; /*!< Loss of signal count */
|
||||
u64 primseq_errs; /*!< Primitive sequence protocol err. */
|
||||
u64 bad_os_count; /*!< Invalid ordered sets */
|
||||
u64 err_enc_out; /*!< Encoding err nonframe_8b10b */
|
||||
u64 err_enc; /*!< Encoding err frame_8b10b */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* Eth Physical Port statistics.
|
||||
*/
|
||||
struct bfa_port_eth_stats {
|
||||
u64 secs_reset; /*!< Seconds since stats is reset */
|
||||
u64 frame_64; /*!< Frames 64 bytes */
|
||||
u64 frame_65_127; /*!< Frames 65-127 bytes */
|
||||
u64 frame_128_255; /*!< Frames 128-255 bytes */
|
||||
u64 frame_256_511; /*!< Frames 256-511 bytes */
|
||||
u64 frame_512_1023; /*!< Frames 512-1023 bytes */
|
||||
u64 frame_1024_1518; /*!< Frames 1024-1518 bytes */
|
||||
u64 frame_1519_1522; /*!< Frames 1519-1522 bytes */
|
||||
u64 tx_bytes; /*!< Tx bytes */
|
||||
u64 tx_packets; /*!< Tx packets */
|
||||
u64 tx_mcast_packets; /*!< Tx multicast packets */
|
||||
u64 tx_bcast_packets; /*!< Tx broadcast packets */
|
||||
u64 tx_control_frame; /*!< Tx control frame */
|
||||
u64 tx_drop; /*!< Tx drops */
|
||||
u64 tx_jabber; /*!< Tx jabber */
|
||||
u64 tx_fcs_error; /*!< Tx FCS errors */
|
||||
u64 tx_fragments; /*!< Tx fragments */
|
||||
u64 rx_bytes; /*!< Rx bytes */
|
||||
u64 rx_packets; /*!< Rx packets */
|
||||
u64 rx_mcast_packets; /*!< Rx multicast packets */
|
||||
u64 rx_bcast_packets; /*!< Rx broadcast packets */
|
||||
u64 rx_control_frames; /*!< Rx control frames */
|
||||
u64 rx_unknown_opcode; /*!< Rx unknown opcode */
|
||||
u64 rx_drop; /*!< Rx drops */
|
||||
u64 rx_jabber; /*!< Rx jabber */
|
||||
u64 rx_fcs_error; /*!< Rx FCS errors */
|
||||
u64 rx_alignment_error; /*!< Rx alignment errors */
|
||||
u64 rx_frame_length_error; /*!< Rx frame len errors */
|
||||
u64 rx_code_error; /*!< Rx code errors */
|
||||
u64 rx_fragments; /*!< Rx fragments */
|
||||
u64 rx_pause; /*!< Rx pause */
|
||||
u64 rx_zero_pause; /*!< Rx zero pause */
|
||||
u64 tx_pause; /*!< Tx pause */
|
||||
u64 tx_zero_pause; /*!< Tx zero pause */
|
||||
u64 rx_fcoe_pause; /*!< Rx FCoE pause */
|
||||
u64 rx_fcoe_zero_pause; /*!< Rx FCoE zero pause */
|
||||
u64 tx_fcoe_pause; /*!< Tx FCoE pause */
|
||||
u64 tx_fcoe_zero_pause; /*!< Tx FCoE zero pause */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* Port statistics.
|
||||
*/
|
||||
union bfa_port_stats_u {
|
||||
struct bfa_port_fc_stats fc;
|
||||
struct bfa_port_eth_stats eth;
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
#define BFA_CEE_LLDP_MAX_STRING_LEN (128)
|
||||
#define BFA_CEE_DCBX_MAX_PRIORITY (8)
|
||||
#define BFA_CEE_DCBX_MAX_PGID (8)
|
||||
|
||||
#define BFA_CEE_LLDP_SYS_CAP_OTHER 0x0001
|
||||
#define BFA_CEE_LLDP_SYS_CAP_REPEATER 0x0002
|
||||
#define BFA_CEE_LLDP_SYS_CAP_MAC_BRIDGE 0x0004
|
||||
#define BFA_CEE_LLDP_SYS_CAP_WLAN_AP 0x0008
|
||||
#define BFA_CEE_LLDP_SYS_CAP_ROUTER 0x0010
|
||||
#define BFA_CEE_LLDP_SYS_CAP_TELEPHONE 0x0020
|
||||
#define BFA_CEE_LLDP_SYS_CAP_DOCSIS_CD 0x0040
|
||||
#define BFA_CEE_LLDP_SYS_CAP_STATION 0x0080
|
||||
#define BFA_CEE_LLDP_SYS_CAP_CVLAN 0x0100
|
||||
#define BFA_CEE_LLDP_SYS_CAP_SVLAN 0x0200
|
||||
#define BFA_CEE_LLDP_SYS_CAP_TPMR 0x0400
|
||||
|
||||
/* LLDP string type */
|
||||
struct bfa_cee_lldp_str {
|
||||
u8 sub_type;
|
||||
u8 len;
|
||||
u8 rsvd[2];
|
||||
u8 value[BFA_CEE_LLDP_MAX_STRING_LEN];
|
||||
};
|
||||
|
||||
/* LLDP paramters */
|
||||
struct bfa_cee_lldp_cfg {
|
||||
struct bfa_cee_lldp_str chassis_id;
|
||||
struct bfa_cee_lldp_str port_id;
|
||||
struct bfa_cee_lldp_str port_desc;
|
||||
struct bfa_cee_lldp_str sys_name;
|
||||
struct bfa_cee_lldp_str sys_desc;
|
||||
struct bfa_cee_lldp_str mgmt_addr;
|
||||
u16 time_to_live;
|
||||
u16 enabled_system_cap;
|
||||
};
|
||||
|
||||
enum bfa_cee_dcbx_version {
|
||||
DCBX_PROTOCOL_PRECEE = 1,
|
||||
DCBX_PROTOCOL_CEE = 2,
|
||||
};
|
||||
|
||||
enum bfa_cee_lls {
|
||||
/* LLS is down because the TLV not sent by the peer */
|
||||
CEE_LLS_DOWN_NO_TLV = 0,
|
||||
/* LLS is down as advertised by the peer */
|
||||
CEE_LLS_DOWN = 1,
|
||||
CEE_LLS_UP = 2,
|
||||
};
|
||||
|
||||
/* CEE/DCBX parameters */
|
||||
struct bfa_cee_dcbx_cfg {
|
||||
u8 pgid[BFA_CEE_DCBX_MAX_PRIORITY];
|
||||
u8 pg_percentage[BFA_CEE_DCBX_MAX_PGID];
|
||||
u8 pfc_primap; /* bitmap of priorties with PFC enabled */
|
||||
u8 fcoe_primap; /* bitmap of priorities used for FcoE traffic */
|
||||
u8 iscsi_primap; /* bitmap of priorities used for iSCSI traffic */
|
||||
u8 dcbx_version; /* operating version:CEE or preCEE */
|
||||
u8 lls_fcoe; /* FCoE Logical Link Status */
|
||||
u8 lls_lan; /* LAN Logical Link Status */
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* CEE status */
|
||||
/* Making this to tri-state for the benefit of port list command */
|
||||
enum bfa_cee_status {
|
||||
CEE_UP = 0,
|
||||
CEE_PHY_UP = 1,
|
||||
CEE_LOOPBACK = 2,
|
||||
CEE_PHY_DOWN = 3,
|
||||
};
|
||||
|
||||
/* CEE Query */
|
||||
struct bfa_cee_attr {
|
||||
u8 cee_status;
|
||||
u8 error_reason;
|
||||
struct bfa_cee_lldp_cfg lldp_remote;
|
||||
struct bfa_cee_dcbx_cfg dcbx_remote;
|
||||
mac_t src_mac;
|
||||
u8 link_speed;
|
||||
u8 nw_priority;
|
||||
u8 filler[2];
|
||||
};
|
||||
|
||||
/* LLDP/DCBX/CEE Statistics */
|
||||
struct bfa_cee_stats {
|
||||
u32 lldp_tx_frames; /*!< LLDP Tx Frames */
|
||||
u32 lldp_rx_frames; /*!< LLDP Rx Frames */
|
||||
u32 lldp_rx_frames_invalid; /*!< LLDP Rx Frames invalid */
|
||||
u32 lldp_rx_frames_new; /*!< LLDP Rx Frames new */
|
||||
u32 lldp_tlvs_unrecognized; /*!< LLDP Rx unrecognized TLVs */
|
||||
u32 lldp_rx_shutdown_tlvs; /*!< LLDP Rx shutdown TLVs */
|
||||
u32 lldp_info_aged_out; /*!< LLDP remote info aged out */
|
||||
u32 dcbx_phylink_ups; /*!< DCBX phy link ups */
|
||||
u32 dcbx_phylink_downs; /*!< DCBX phy link downs */
|
||||
u32 dcbx_rx_tlvs; /*!< DCBX Rx TLVs */
|
||||
u32 dcbx_rx_tlvs_invalid; /*!< DCBX Rx TLVs invalid */
|
||||
u32 dcbx_control_tlv_error; /*!< DCBX control TLV errors */
|
||||
u32 dcbx_feature_tlv_error; /*!< DCBX feature TLV errors */
|
||||
u32 dcbx_cee_cfg_new; /*!< DCBX new CEE cfg rcvd */
|
||||
u32 cee_status_down; /*!< CEE status down */
|
||||
u32 cee_status_up; /*!< CEE status up */
|
||||
u32 cee_hw_cfg_changed; /*!< CEE hw cfg changed */
|
||||
u32 cee_rx_invalid_cfg; /*!< CEE invalid cfg */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFA_DEFS_CNA_H__ */
|
|
@ -0,0 +1,244 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFA_DEFS_MFG_COMM_H__
|
||||
#define __BFA_DEFS_MFG_COMM_H__
|
||||
|
||||
#include "cna.h"
|
||||
|
||||
/**
|
||||
* Manufacturing block version
|
||||
*/
|
||||
#define BFA_MFG_VERSION 2
|
||||
#define BFA_MFG_VERSION_UNINIT 0xFF
|
||||
|
||||
/**
|
||||
* Manufacturing block encrypted version
|
||||
*/
|
||||
#define BFA_MFG_ENC_VER 2
|
||||
|
||||
/**
|
||||
* Manufacturing block version 1 length
|
||||
*/
|
||||
#define BFA_MFG_VER1_LEN 128
|
||||
|
||||
/**
|
||||
* Manufacturing block header length
|
||||
*/
|
||||
#define BFA_MFG_HDR_LEN 4
|
||||
|
||||
#define BFA_MFG_SERIALNUM_SIZE 11
|
||||
#define STRSZ(_n) (((_n) + 4) & ~3)
|
||||
|
||||
/**
|
||||
* Manufacturing card type
|
||||
*/
|
||||
enum {
|
||||
BFA_MFG_TYPE_CB_MAX = 825, /*!< Crossbow card type max */
|
||||
BFA_MFG_TYPE_FC8P2 = 825, /*!< 8G 2port FC card */
|
||||
BFA_MFG_TYPE_FC8P1 = 815, /*!< 8G 1port FC card */
|
||||
BFA_MFG_TYPE_FC4P2 = 425, /*!< 4G 2port FC card */
|
||||
BFA_MFG_TYPE_FC4P1 = 415, /*!< 4G 1port FC card */
|
||||
BFA_MFG_TYPE_CNA10P2 = 1020, /*!< 10G 2port CNA card */
|
||||
BFA_MFG_TYPE_CNA10P1 = 1010, /*!< 10G 1port CNA card */
|
||||
BFA_MFG_TYPE_JAYHAWK = 804, /*!< Jayhawk mezz card */
|
||||
BFA_MFG_TYPE_WANCHESE = 1007, /*!< Wanchese mezz card */
|
||||
BFA_MFG_TYPE_ASTRA = 807, /*!< Astra mezz card */
|
||||
BFA_MFG_TYPE_LIGHTNING_P0 = 902, /*!< Lightning mezz card - old */
|
||||
BFA_MFG_TYPE_LIGHTNING = 1741, /*!< Lightning mezz card */
|
||||
BFA_MFG_TYPE_INVALID = 0, /*!< Invalid card type */
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/**
|
||||
* Check if 1-port card
|
||||
*/
|
||||
#define bfa_mfg_is_1port(type) (( \
|
||||
(type) == BFA_MFG_TYPE_FC8P1 || \
|
||||
(type) == BFA_MFG_TYPE_FC4P1 || \
|
||||
(type) == BFA_MFG_TYPE_CNA10P1))
|
||||
|
||||
/**
|
||||
* Check if Mezz card
|
||||
*/
|
||||
#define bfa_mfg_is_mezz(type) (( \
|
||||
(type) == BFA_MFG_TYPE_JAYHAWK || \
|
||||
(type) == BFA_MFG_TYPE_WANCHESE || \
|
||||
(type) == BFA_MFG_TYPE_ASTRA || \
|
||||
(type) == BFA_MFG_TYPE_LIGHTNING_P0 || \
|
||||
(type) == BFA_MFG_TYPE_LIGHTNING))
|
||||
|
||||
/**
|
||||
* Check if card type valid
|
||||
*/
|
||||
#define bfa_mfg_is_card_type_valid(type) (( \
|
||||
(type) == BFA_MFG_TYPE_FC8P2 || \
|
||||
(type) == BFA_MFG_TYPE_FC8P1 || \
|
||||
(type) == BFA_MFG_TYPE_FC4P2 || \
|
||||
(type) == BFA_MFG_TYPE_FC4P1 || \
|
||||
(type) == BFA_MFG_TYPE_CNA10P2 || \
|
||||
(type) == BFA_MFG_TYPE_CNA10P1 || \
|
||||
bfa_mfg_is_mezz(type)))
|
||||
|
||||
/**
|
||||
* Check if the card having old wwn/mac handling
|
||||
*/
|
||||
#define bfa_mfg_is_old_wwn_mac_model(type) (( \
|
||||
(type) == BFA_MFG_TYPE_FC8P2 || \
|
||||
(type) == BFA_MFG_TYPE_FC8P1 || \
|
||||
(type) == BFA_MFG_TYPE_FC4P2 || \
|
||||
(type) == BFA_MFG_TYPE_FC4P1 || \
|
||||
(type) == BFA_MFG_TYPE_CNA10P2 || \
|
||||
(type) == BFA_MFG_TYPE_CNA10P1 || \
|
||||
(type) == BFA_MFG_TYPE_JAYHAWK || \
|
||||
(type) == BFA_MFG_TYPE_WANCHESE))
|
||||
|
||||
#define bfa_mfg_increment_wwn_mac(m, i) \
|
||||
do { \
|
||||
u32 t = ((m)[0] << 16) | ((m)[1] << 8) | (m)[2]; \
|
||||
t += (i); \
|
||||
(m)[0] = (t >> 16) & 0xFF; \
|
||||
(m)[1] = (t >> 8) & 0xFF; \
|
||||
(m)[2] = t & 0xFF; \
|
||||
} while (0)
|
||||
|
||||
#define bfa_mfg_adapter_prop_init_flash(card_type, prop) \
|
||||
do { \
|
||||
switch ((card_type)) { \
|
||||
case BFA_MFG_TYPE_FC8P2: \
|
||||
case BFA_MFG_TYPE_JAYHAWK: \
|
||||
case BFA_MFG_TYPE_ASTRA: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 2) | \
|
||||
BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
break; \
|
||||
case BFA_MFG_TYPE_FC8P1: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 1) | \
|
||||
BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
break; \
|
||||
case BFA_MFG_TYPE_FC4P2: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 2) | \
|
||||
BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
break; \
|
||||
case BFA_MFG_TYPE_FC4P1: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 1) | \
|
||||
BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
break; \
|
||||
case BFA_MFG_TYPE_CNA10P2: \
|
||||
case BFA_MFG_TYPE_WANCHESE: \
|
||||
case BFA_MFG_TYPE_LIGHTNING_P0: \
|
||||
case BFA_MFG_TYPE_LIGHTNING: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 2); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 10); \
|
||||
break; \
|
||||
case BFA_MFG_TYPE_CNA10P1: \
|
||||
(prop) = BFI_ADAPTER_SETP(NPORTS, 1); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 10); \
|
||||
break; \
|
||||
default: \
|
||||
(prop) = BFI_ADAPTER_UNSUPP; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
enum {
|
||||
CB_GPIO_TTV = (1), /*!< TTV debug capable cards */
|
||||
CB_GPIO_FC8P2 = (2), /*!< 8G 2port FC card */
|
||||
CB_GPIO_FC8P1 = (3), /*!< 8G 1port FC card */
|
||||
CB_GPIO_FC4P2 = (4), /*!< 4G 2port FC card */
|
||||
CB_GPIO_FC4P1 = (5), /*!< 4G 1port FC card */
|
||||
CB_GPIO_DFLY = (6), /*!< 8G 2port FC mezzanine card */
|
||||
CB_GPIO_PROTO = (1 << 7) /*!< 8G 2port FC prototypes */
|
||||
};
|
||||
|
||||
#define bfa_mfg_adapter_prop_init_gpio(gpio, card_type, prop) \
|
||||
do { \
|
||||
if ((gpio) & CB_GPIO_PROTO) { \
|
||||
(prop) |= BFI_ADAPTER_PROTO; \
|
||||
(gpio) &= ~CB_GPIO_PROTO; \
|
||||
} \
|
||||
switch ((gpio)) { \
|
||||
case CB_GPIO_TTV: \
|
||||
(prop) |= BFI_ADAPTER_TTV; \
|
||||
case CB_GPIO_DFLY: \
|
||||
case CB_GPIO_FC8P2: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 2); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
(card_type) = BFA_MFG_TYPE_FC8P2; \
|
||||
break; \
|
||||
case CB_GPIO_FC8P1: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 1); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
(card_type) = BFA_MFG_TYPE_FC8P1; \
|
||||
break; \
|
||||
case CB_GPIO_FC4P2: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 2); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
(card_type) = BFA_MFG_TYPE_FC4P2; \
|
||||
break; \
|
||||
case CB_GPIO_FC4P1: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 1); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
(card_type) = BFA_MFG_TYPE_FC4P1; \
|
||||
break; \
|
||||
default: \
|
||||
(prop) |= BFI_ADAPTER_UNSUPP; \
|
||||
(card_type) = BFA_MFG_TYPE_INVALID; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* VPD data length
|
||||
*/
|
||||
#define BFA_MFG_VPD_LEN 512
|
||||
#define BFA_MFG_VPD_LEN_INVALID 0
|
||||
|
||||
#define BFA_MFG_VPD_PCI_HDR_OFF 137
|
||||
#define BFA_MFG_VPD_PCI_VER_MASK 0x07 /*!< version mask 3 bits */
|
||||
#define BFA_MFG_VPD_PCI_VDR_MASK 0xf8 /*!< vendor mask 5 bits */
|
||||
|
||||
/**
|
||||
* VPD vendor tag
|
||||
*/
|
||||
enum {
|
||||
BFA_MFG_VPD_UNKNOWN = 0, /*!< vendor unknown */
|
||||
BFA_MFG_VPD_IBM = 1, /*!< vendor IBM */
|
||||
BFA_MFG_VPD_HP = 2, /*!< vendor HP */
|
||||
BFA_MFG_VPD_DELL = 3, /*!< vendor DELL */
|
||||
BFA_MFG_VPD_PCI_IBM = 0x08, /*!< PCI VPD IBM */
|
||||
BFA_MFG_VPD_PCI_HP = 0x10, /*!< PCI VPD HP */
|
||||
BFA_MFG_VPD_PCI_DELL = 0x20, /*!< PCI VPD DELL */
|
||||
BFA_MFG_VPD_PCI_BRCD = 0xf8, /*!< PCI VPD Brocade */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief BFA adapter flash vpd data definition.
|
||||
*
|
||||
* All numerical fields are in big-endian format.
|
||||
*/
|
||||
struct bfa_mfg_vpd {
|
||||
u8 version; /*!< vpd data version */
|
||||
u8 vpd_sig[3]; /*!< characters 'V', 'P', 'D' */
|
||||
u8 chksum; /*!< u8 checksum */
|
||||
u8 vendor; /*!< vendor */
|
||||
u8 len; /*!< vpd data length excluding header */
|
||||
u8 rsv;
|
||||
u8 data[BFA_MFG_VPD_LEN]; /*!< vpd data */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFA_DEFS_MFG_H__ */
|
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFA_DEFS_STATUS_H__
|
||||
#define __BFA_DEFS_STATUS_H__
|
||||
|
||||
/**
|
||||
* API status return values
|
||||
*
|
||||
* NOTE: The error msgs are auto generated from the comments. Only singe line
|
||||
* comments are supported
|
||||
*/
|
||||
enum bfa_status {
|
||||
BFA_STATUS_OK = 0,
|
||||
BFA_STATUS_FAILED = 1,
|
||||
BFA_STATUS_EINVAL = 2,
|
||||
BFA_STATUS_ENOMEM = 3,
|
||||
BFA_STATUS_ENOSYS = 4,
|
||||
BFA_STATUS_ETIMER = 5,
|
||||
BFA_STATUS_EPROTOCOL = 6,
|
||||
BFA_STATUS_ENOFCPORTS = 7,
|
||||
BFA_STATUS_NOFLASH = 8,
|
||||
BFA_STATUS_BADFLASH = 9,
|
||||
BFA_STATUS_SFP_UNSUPP = 10,
|
||||
BFA_STATUS_UNKNOWN_VFID = 11,
|
||||
BFA_STATUS_DATACORRUPTED = 12,
|
||||
BFA_STATUS_DEVBUSY = 13,
|
||||
BFA_STATUS_ABORTED = 14,
|
||||
BFA_STATUS_NODEV = 15,
|
||||
BFA_STATUS_HDMA_FAILED = 16,
|
||||
BFA_STATUS_FLASH_BAD_LEN = 17,
|
||||
BFA_STATUS_UNKNOWN_LWWN = 18,
|
||||
BFA_STATUS_UNKNOWN_RWWN = 19,
|
||||
BFA_STATUS_FCPT_LS_RJT = 20,
|
||||
BFA_STATUS_VPORT_EXISTS = 21,
|
||||
BFA_STATUS_VPORT_MAX = 22,
|
||||
BFA_STATUS_UNSUPP_SPEED = 23,
|
||||
BFA_STATUS_INVLD_DFSZ = 24,
|
||||
BFA_STATUS_CNFG_FAILED = 25,
|
||||
BFA_STATUS_CMD_NOTSUPP = 26,
|
||||
BFA_STATUS_NO_ADAPTER = 27,
|
||||
BFA_STATUS_LINKDOWN = 28,
|
||||
BFA_STATUS_FABRIC_RJT = 29,
|
||||
BFA_STATUS_UNKNOWN_VWWN = 30,
|
||||
BFA_STATUS_NSLOGIN_FAILED = 31,
|
||||
BFA_STATUS_NO_RPORTS = 32,
|
||||
BFA_STATUS_NSQUERY_FAILED = 33,
|
||||
BFA_STATUS_PORT_OFFLINE = 34,
|
||||
BFA_STATUS_RPORT_OFFLINE = 35,
|
||||
BFA_STATUS_TGTOPEN_FAILED = 36,
|
||||
BFA_STATUS_BAD_LUNS = 37,
|
||||
BFA_STATUS_IO_FAILURE = 38,
|
||||
BFA_STATUS_NO_FABRIC = 39,
|
||||
BFA_STATUS_EBADF = 40,
|
||||
BFA_STATUS_EINTR = 41,
|
||||
BFA_STATUS_EIO = 42,
|
||||
BFA_STATUS_ENOTTY = 43,
|
||||
BFA_STATUS_ENXIO = 44,
|
||||
BFA_STATUS_EFOPEN = 45,
|
||||
BFA_STATUS_VPORT_WWN_BP = 46,
|
||||
BFA_STATUS_PORT_NOT_DISABLED = 47,
|
||||
BFA_STATUS_BADFRMHDR = 48,
|
||||
BFA_STATUS_BADFRMSZ = 49,
|
||||
BFA_STATUS_MISSINGFRM = 50,
|
||||
BFA_STATUS_LINKTIMEOUT = 51,
|
||||
BFA_STATUS_NO_FCPIM_NEXUS = 52,
|
||||
BFA_STATUS_CHECKSUM_FAIL = 53,
|
||||
BFA_STATUS_GZME_FAILED = 54,
|
||||
BFA_STATUS_SCSISTART_REQD = 55,
|
||||
BFA_STATUS_IOC_FAILURE = 56,
|
||||
BFA_STATUS_INVALID_WWN = 57,
|
||||
BFA_STATUS_MISMATCH = 58,
|
||||
BFA_STATUS_IOC_ENABLED = 59,
|
||||
BFA_STATUS_ADAPTER_ENABLED = 60,
|
||||
BFA_STATUS_IOC_NON_OP = 61,
|
||||
BFA_STATUS_ADDR_MAP_FAILURE = 62,
|
||||
BFA_STATUS_SAME_NAME = 63,
|
||||
BFA_STATUS_PENDING = 64,
|
||||
BFA_STATUS_8G_SPD = 65,
|
||||
BFA_STATUS_4G_SPD = 66,
|
||||
BFA_STATUS_AD_IS_ENABLE = 67,
|
||||
BFA_STATUS_EINVAL_TOV = 68,
|
||||
BFA_STATUS_EINVAL_QDEPTH = 69,
|
||||
BFA_STATUS_VERSION_FAIL = 70,
|
||||
BFA_STATUS_DIAG_BUSY = 71,
|
||||
BFA_STATUS_BEACON_ON = 72,
|
||||
BFA_STATUS_BEACON_OFF = 73,
|
||||
BFA_STATUS_LBEACON_ON = 74,
|
||||
BFA_STATUS_LBEACON_OFF = 75,
|
||||
BFA_STATUS_PORT_NOT_INITED = 76,
|
||||
BFA_STATUS_RPSC_ENABLED = 77,
|
||||
BFA_STATUS_ENOFSAVE = 78,
|
||||
BFA_STATUS_BAD_FILE = 79,
|
||||
BFA_STATUS_RLIM_EN = 80,
|
||||
BFA_STATUS_RLIM_DIS = 81,
|
||||
BFA_STATUS_IOC_DISABLED = 82,
|
||||
BFA_STATUS_ADAPTER_DISABLED = 83,
|
||||
BFA_STATUS_BIOS_DISABLED = 84,
|
||||
BFA_STATUS_AUTH_ENABLED = 85,
|
||||
BFA_STATUS_AUTH_DISABLED = 86,
|
||||
BFA_STATUS_ERROR_TRL_ENABLED = 87,
|
||||
BFA_STATUS_ERROR_QOS_ENABLED = 88,
|
||||
BFA_STATUS_NO_SFP_DEV = 89,
|
||||
BFA_STATUS_MEMTEST_FAILED = 90,
|
||||
BFA_STATUS_INVALID_DEVID = 91,
|
||||
BFA_STATUS_QOS_ENABLED = 92,
|
||||
BFA_STATUS_QOS_DISABLED = 93,
|
||||
BFA_STATUS_INCORRECT_DRV_CONFIG = 94,
|
||||
BFA_STATUS_REG_FAIL = 95,
|
||||
BFA_STATUS_IM_INV_CODE = 96,
|
||||
BFA_STATUS_IM_INV_VLAN = 97,
|
||||
BFA_STATUS_IM_INV_ADAPT_NAME = 98,
|
||||
BFA_STATUS_IM_LOW_RESOURCES = 99,
|
||||
BFA_STATUS_IM_VLANID_IS_PVID = 100,
|
||||
BFA_STATUS_IM_VLANID_EXISTS = 101,
|
||||
BFA_STATUS_IM_FW_UPDATE_FAIL = 102,
|
||||
BFA_STATUS_PORTLOG_ENABLED = 103,
|
||||
BFA_STATUS_PORTLOG_DISABLED = 104,
|
||||
BFA_STATUS_FILE_NOT_FOUND = 105,
|
||||
BFA_STATUS_QOS_FC_ONLY = 106,
|
||||
BFA_STATUS_RLIM_FC_ONLY = 107,
|
||||
BFA_STATUS_CT_SPD = 108,
|
||||
BFA_STATUS_LEDTEST_OP = 109,
|
||||
BFA_STATUS_CEE_NOT_DN = 110,
|
||||
BFA_STATUS_10G_SPD = 111,
|
||||
BFA_STATUS_IM_INV_TEAM_NAME = 112,
|
||||
BFA_STATUS_IM_DUP_TEAM_NAME = 113,
|
||||
BFA_STATUS_IM_ADAPT_ALREADY_IN_TEAM = 114,
|
||||
BFA_STATUS_IM_ADAPT_HAS_VLANS = 115,
|
||||
BFA_STATUS_IM_PVID_MISMATCH = 116,
|
||||
BFA_STATUS_IM_LINK_SPEED_MISMATCH = 117,
|
||||
BFA_STATUS_IM_MTU_MISMATCH = 118,
|
||||
BFA_STATUS_IM_RSS_MISMATCH = 119,
|
||||
BFA_STATUS_IM_HDS_MISMATCH = 120,
|
||||
BFA_STATUS_IM_OFFLOAD_MISMATCH = 121,
|
||||
BFA_STATUS_IM_PORT_PARAMS = 122,
|
||||
BFA_STATUS_IM_PORT_NOT_IN_TEAM = 123,
|
||||
BFA_STATUS_IM_CANNOT_REM_PRI = 124,
|
||||
BFA_STATUS_IM_MAX_PORTS_REACHED = 125,
|
||||
BFA_STATUS_IM_LAST_PORT_DELETE = 126,
|
||||
BFA_STATUS_IM_NO_DRIVER = 127,
|
||||
BFA_STATUS_IM_MAX_VLANS_REACHED = 128,
|
||||
BFA_STATUS_TOMCAT_SPD_NOT_ALLOWED = 129,
|
||||
BFA_STATUS_NO_MINPORT_DRIVER = 130,
|
||||
BFA_STATUS_CARD_TYPE_MISMATCH = 131,
|
||||
BFA_STATUS_BAD_ASICBLK = 132,
|
||||
BFA_STATUS_NO_DRIVER = 133,
|
||||
BFA_STATUS_INVALID_MAC = 134,
|
||||
BFA_STATUS_IM_NO_VLAN = 135,
|
||||
BFA_STATUS_IM_ETH_LB_FAILED = 136,
|
||||
BFA_STATUS_IM_PVID_REMOVE = 137,
|
||||
BFA_STATUS_IM_PVID_EDIT = 138,
|
||||
BFA_STATUS_CNA_NO_BOOT = 139,
|
||||
BFA_STATUS_IM_PVID_NON_ZERO = 140,
|
||||
BFA_STATUS_IM_INETCFG_LOCK_FAILED = 141,
|
||||
BFA_STATUS_IM_GET_INETCFG_FAILED = 142,
|
||||
BFA_STATUS_IM_NOT_BOUND = 143,
|
||||
BFA_STATUS_INSUFFICIENT_PERMS = 144,
|
||||
BFA_STATUS_IM_INV_VLAN_NAME = 145,
|
||||
BFA_STATUS_CMD_NOTSUPP_CNA = 146,
|
||||
BFA_STATUS_IM_PASSTHRU_EDIT = 147,
|
||||
BFA_STATUS_IM_BIND_FAILED = 148,
|
||||
BFA_STATUS_IM_UNBIND_FAILED = 149,
|
||||
BFA_STATUS_IM_PORT_IN_TEAM = 150,
|
||||
BFA_STATUS_IM_VLAN_NOT_FOUND = 151,
|
||||
BFA_STATUS_IM_TEAM_NOT_FOUND = 152,
|
||||
BFA_STATUS_IM_TEAM_CFG_NOT_ALLOWED = 153,
|
||||
BFA_STATUS_PBC = 154,
|
||||
BFA_STATUS_DEVID_MISSING = 155,
|
||||
BFA_STATUS_BAD_FWCFG = 156,
|
||||
BFA_STATUS_CREATE_FILE = 157,
|
||||
BFA_STATUS_INVALID_VENDOR = 158,
|
||||
BFA_STATUS_SFP_NOT_READY = 159,
|
||||
BFA_STATUS_FLASH_UNINIT = 160,
|
||||
BFA_STATUS_FLASH_EMPTY = 161,
|
||||
BFA_STATUS_FLASH_CKFAIL = 162,
|
||||
BFA_STATUS_TRUNK_UNSUPP = 163,
|
||||
BFA_STATUS_TRUNK_ENABLED = 164,
|
||||
BFA_STATUS_TRUNK_DISABLED = 165,
|
||||
BFA_STATUS_TRUNK_ERROR_TRL_ENABLED = 166,
|
||||
BFA_STATUS_BOOT_CODE_UPDATED = 167,
|
||||
BFA_STATUS_BOOT_VERSION = 168,
|
||||
BFA_STATUS_CARDTYPE_MISSING = 169,
|
||||
BFA_STATUS_INVALID_CARDTYPE = 170,
|
||||
BFA_STATUS_NO_TOPOLOGY_FOR_CNA = 171,
|
||||
BFA_STATUS_IM_VLAN_OVER_TEAM_DELETE_FAILED = 172,
|
||||
BFA_STATUS_ETHBOOT_ENABLED = 173,
|
||||
BFA_STATUS_ETHBOOT_DISABLED = 174,
|
||||
BFA_STATUS_IOPROFILE_OFF = 175,
|
||||
BFA_STATUS_NO_PORT_INSTANCE = 176,
|
||||
BFA_STATUS_BOOT_CODE_TIMEDOUT = 177,
|
||||
BFA_STATUS_NO_VPORT_LOCK = 178,
|
||||
BFA_STATUS_VPORT_NO_CNFG = 179,
|
||||
BFA_STATUS_MAX_VAL
|
||||
};
|
||||
|
||||
enum bfa_eproto_status {
|
||||
BFA_EPROTO_BAD_ACCEPT = 0,
|
||||
BFA_EPROTO_UNKNOWN_RSP = 1
|
||||
};
|
||||
|
||||
#endif /* __BFA_DEFS_STATUS_H__ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,300 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_IOC_H__
|
||||
#define __BFA_IOC_H__
|
||||
|
||||
#include "bfa_sm.h"
|
||||
#include "bfi.h"
|
||||
#include "cna.h"
|
||||
|
||||
#define BFA_IOC_TOV 3000 /* msecs */
|
||||
#define BFA_IOC_HWSEM_TOV 500 /* msecs */
|
||||
#define BFA_IOC_HB_TOV 500 /* msecs */
|
||||
#define BFA_IOC_HWINIT_MAX 2
|
||||
#define BFA_IOC_TOV_RECOVER BFA_IOC_HB_TOV
|
||||
|
||||
/**
|
||||
* Generic Scatter Gather Element used by driver
|
||||
*/
|
||||
struct bfa_sge {
|
||||
u32 sg_len;
|
||||
void *sg_addr;
|
||||
};
|
||||
|
||||
/**
|
||||
* PCI device information required by IOC
|
||||
*/
|
||||
struct bfa_pcidev {
|
||||
int pci_slot;
|
||||
u8 pci_func;
|
||||
u16 device_id;
|
||||
void __iomem *pci_bar_kva;
|
||||
};
|
||||
|
||||
/**
|
||||
* Structure used to remember the DMA-able memory block's KVA and Physical
|
||||
* Address
|
||||
*/
|
||||
struct bfa_dma {
|
||||
void *kva; /* ! Kernel virtual address */
|
||||
u64 pa; /* ! Physical address */
|
||||
};
|
||||
|
||||
#define BFA_DMA_ALIGN_SZ 256
|
||||
|
||||
/**
|
||||
* smem size for Crossbow and Catapult
|
||||
*/
|
||||
#define BFI_SMEM_CB_SIZE 0x200000U /* ! 2MB for crossbow */
|
||||
#define BFI_SMEM_CT_SIZE 0x280000U /* ! 2.5MB for catapult */
|
||||
|
||||
/**
|
||||
* @brief BFA dma address assignment macro
|
||||
*/
|
||||
#define bfa_dma_addr_set(dma_addr, pa) \
|
||||
__bfa_dma_addr_set(&dma_addr, (u64)pa)
|
||||
|
||||
static inline void
|
||||
__bfa_dma_addr_set(union bfi_addr_u *dma_addr, u64 pa)
|
||||
{
|
||||
dma_addr->a32.addr_lo = (u32) pa;
|
||||
dma_addr->a32.addr_hi = (u32) (upper_32_bits(pa));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief BFA dma address assignment macro. (big endian format)
|
||||
*/
|
||||
#define bfa_dma_be_addr_set(dma_addr, pa) \
|
||||
__bfa_dma_be_addr_set(&dma_addr, (u64)pa)
|
||||
static inline void
|
||||
__bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa)
|
||||
{
|
||||
dma_addr->a32.addr_lo = (u32) htonl(pa);
|
||||
dma_addr->a32.addr_hi = (u32) htonl(upper_32_bits(pa));
|
||||
}
|
||||
|
||||
struct bfa_ioc_regs {
|
||||
void __iomem *hfn_mbox_cmd;
|
||||
void __iomem *hfn_mbox;
|
||||
void __iomem *lpu_mbox_cmd;
|
||||
void __iomem *lpu_mbox;
|
||||
void __iomem *pss_ctl_reg;
|
||||
void __iomem *pss_err_status_reg;
|
||||
void __iomem *app_pll_fast_ctl_reg;
|
||||
void __iomem *app_pll_slow_ctl_reg;
|
||||
void __iomem *ioc_sem_reg;
|
||||
void __iomem *ioc_usage_sem_reg;
|
||||
void __iomem *ioc_init_sem_reg;
|
||||
void __iomem *ioc_usage_reg;
|
||||
void __iomem *host_page_num_fn;
|
||||
void __iomem *heartbeat;
|
||||
void __iomem *ioc_fwstate;
|
||||
void __iomem *ll_halt;
|
||||
void __iomem *err_set;
|
||||
void __iomem *shirq_isr_next;
|
||||
void __iomem *shirq_msk_next;
|
||||
void __iomem *smem_page_start;
|
||||
u32 smem_pg0;
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC Mailbox structures
|
||||
*/
|
||||
struct bfa_mbox_cmd {
|
||||
struct list_head qe;
|
||||
u32 msg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC mailbox module
|
||||
*/
|
||||
typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg *m);
|
||||
struct bfa_ioc_mbox_mod {
|
||||
struct list_head cmd_q; /*!< pending mbox queue */
|
||||
int nmclass; /*!< number of handlers */
|
||||
struct {
|
||||
bfa_ioc_mbox_mcfunc_t cbfn; /*!< message handlers */
|
||||
void *cbarg;
|
||||
} mbhdlr[BFI_MC_MAX];
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC callback function interfaces
|
||||
*/
|
||||
typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status);
|
||||
typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa);
|
||||
typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa);
|
||||
typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa);
|
||||
struct bfa_ioc_cbfn {
|
||||
bfa_ioc_enable_cbfn_t enable_cbfn;
|
||||
bfa_ioc_disable_cbfn_t disable_cbfn;
|
||||
bfa_ioc_hbfail_cbfn_t hbfail_cbfn;
|
||||
bfa_ioc_reset_cbfn_t reset_cbfn;
|
||||
};
|
||||
|
||||
/**
|
||||
* Heartbeat failure notification queue element.
|
||||
*/
|
||||
struct bfa_ioc_hbfail_notify {
|
||||
struct list_head qe;
|
||||
bfa_ioc_hbfail_cbfn_t cbfn;
|
||||
void *cbarg;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize a heartbeat failure notification structure
|
||||
*/
|
||||
#define bfa_ioc_hbfail_init(__notify, __cbfn, __cbarg) do { \
|
||||
(__notify)->cbfn = (__cbfn); \
|
||||
(__notify)->cbarg = (__cbarg); \
|
||||
} while (0)
|
||||
|
||||
struct bfa_ioc {
|
||||
bfa_fsm_t fsm;
|
||||
struct bfa *bfa;
|
||||
struct bfa_pcidev pcidev;
|
||||
struct bfa_timer_mod *timer_mod;
|
||||
struct timer_list ioc_timer;
|
||||
struct timer_list sem_timer;
|
||||
struct timer_list hb_timer;
|
||||
u32 hb_count;
|
||||
u32 retry_count;
|
||||
struct list_head hb_notify_q;
|
||||
void *dbg_fwsave;
|
||||
int dbg_fwsave_len;
|
||||
bool dbg_fwsave_once;
|
||||
enum bfi_mclass ioc_mc;
|
||||
struct bfa_ioc_regs ioc_regs;
|
||||
struct bfa_ioc_drv_stats stats;
|
||||
bool auto_recover;
|
||||
bool fcmode;
|
||||
bool ctdev;
|
||||
bool cna;
|
||||
bool pllinit;
|
||||
bool stats_busy; /*!< outstanding stats */
|
||||
u8 port_id;
|
||||
|
||||
struct bfa_dma attr_dma;
|
||||
struct bfi_ioc_attr *attr;
|
||||
struct bfa_ioc_cbfn *cbfn;
|
||||
struct bfa_ioc_mbox_mod mbox_mod;
|
||||
struct bfa_ioc_hwif *ioc_hwif;
|
||||
};
|
||||
|
||||
struct bfa_ioc_hwif {
|
||||
enum bfa_status (*ioc_pll_init) (void __iomem *rb, bool fcmode);
|
||||
bool (*ioc_firmware_lock) (struct bfa_ioc *ioc);
|
||||
void (*ioc_firmware_unlock) (struct bfa_ioc *ioc);
|
||||
void (*ioc_reg_init) (struct bfa_ioc *ioc);
|
||||
void (*ioc_map_port) (struct bfa_ioc *ioc);
|
||||
void (*ioc_isr_mode_set) (struct bfa_ioc *ioc,
|
||||
bool msix);
|
||||
void (*ioc_notify_hbfail) (struct bfa_ioc *ioc);
|
||||
void (*ioc_ownership_reset) (struct bfa_ioc *ioc);
|
||||
};
|
||||
|
||||
#define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func)
|
||||
#define bfa_ioc_devid(__ioc) ((__ioc)->pcidev.device_id)
|
||||
#define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva)
|
||||
#define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
|
||||
#define bfa_ioc_fetch_stats(__ioc, __stats) \
|
||||
(((__stats)->drv_stats) = (__ioc)->stats)
|
||||
#define bfa_ioc_clr_stats(__ioc) \
|
||||
memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats))
|
||||
#define bfa_ioc_maxfrsize(__ioc) ((__ioc)->attr->maxfrsize)
|
||||
#define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit)
|
||||
#define bfa_ioc_speed_sup(__ioc) \
|
||||
BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop)
|
||||
#define bfa_ioc_get_nports(__ioc) \
|
||||
BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop)
|
||||
|
||||
#define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++)
|
||||
#define BFA_IOC_FWIMG_MINSZ (16 * 1024)
|
||||
#define BFA_IOC_FWIMG_TYPE(__ioc) \
|
||||
(((__ioc)->ctdev) ? \
|
||||
(((__ioc)->fcmode) ? BFI_IMAGE_CT_FC : BFI_IMAGE_CT_CNA) : \
|
||||
BFI_IMAGE_CB_FC)
|
||||
#define BFA_IOC_FW_SMEM_SIZE(__ioc) \
|
||||
(((__ioc)->ctdev) ? BFI_SMEM_CT_SIZE : BFI_SMEM_CB_SIZE)
|
||||
#define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
|
||||
/**
|
||||
* IOC mailbox interface
|
||||
*/
|
||||
void bfa_nw_ioc_mbox_queue(struct bfa_ioc *ioc, struct bfa_mbox_cmd *cmd);
|
||||
void bfa_nw_ioc_mbox_isr(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
|
||||
bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);
|
||||
|
||||
/**
|
||||
* IOC interfaces
|
||||
*/
|
||||
|
||||
#define bfa_ioc_pll_init_asic(__ioc) \
|
||||
((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
|
||||
(__ioc)->fcmode))
|
||||
|
||||
#define bfa_ioc_isr_mode_set(__ioc, __msix) \
|
||||
((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix))
|
||||
#define bfa_ioc_ownership_reset(__ioc) \
|
||||
((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
|
||||
|
||||
void bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc);
|
||||
|
||||
void bfa_nw_ioc_attach(struct bfa_ioc *ioc, void *bfa,
|
||||
struct bfa_ioc_cbfn *cbfn);
|
||||
void bfa_nw_ioc_auto_recover(bool auto_recover);
|
||||
void bfa_nw_ioc_detach(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_pci_init(struct bfa_ioc *ioc, struct bfa_pcidev *pcidev,
|
||||
enum bfi_mclass mc);
|
||||
u32 bfa_nw_ioc_meminfo(void);
|
||||
void bfa_nw_ioc_mem_claim(struct bfa_ioc *ioc, u8 *dm_kva, u64 dm_pa);
|
||||
void bfa_nw_ioc_enable(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_disable(struct bfa_ioc *ioc);
|
||||
|
||||
void bfa_nw_ioc_error_isr(struct bfa_ioc *ioc);
|
||||
|
||||
void bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr);
|
||||
void bfa_nw_ioc_hbfail_register(struct bfa_ioc *ioc,
|
||||
struct bfa_ioc_hbfail_notify *notify);
|
||||
bool bfa_nw_ioc_sem_get(void __iomem *sem_reg);
|
||||
void bfa_nw_ioc_sem_release(void __iomem *sem_reg);
|
||||
void bfa_nw_ioc_hw_sem_release(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_fwver_get(struct bfa_ioc *ioc,
|
||||
struct bfi_ioc_image_hdr *fwhdr);
|
||||
bool bfa_nw_ioc_fwver_cmp(struct bfa_ioc *ioc,
|
||||
struct bfi_ioc_image_hdr *fwhdr);
|
||||
mac_t bfa_nw_ioc_get_mac(struct bfa_ioc *ioc);
|
||||
|
||||
/*
|
||||
* Timeout APIs
|
||||
*/
|
||||
void bfa_nw_ioc_timeout(void *ioc);
|
||||
void bfa_nw_ioc_hb_check(void *ioc);
|
||||
void bfa_nw_ioc_sem_timeout(void *ioc);
|
||||
|
||||
/*
|
||||
* F/W Image Size & Chunk
|
||||
*/
|
||||
u32 *bfa_cb_image_get_chunk(int type, u32 off);
|
||||
u32 bfa_cb_image_get_size(int type);
|
||||
|
||||
#endif /* __BFA_IOC_H__ */
|
|
@ -0,0 +1,392 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#include "bfa_ioc.h"
|
||||
#include "cna.h"
|
||||
#include "bfi.h"
|
||||
#include "bfi_ctreg.h"
|
||||
#include "bfa_defs.h"
|
||||
|
||||
/*
|
||||
* forward declarations
|
||||
*/
|
||||
static bool bfa_ioc_ct_firmware_lock(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_firmware_unlock(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_reg_init(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_map_port(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix);
|
||||
static void bfa_ioc_ct_notify_hbfail(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc);
|
||||
static enum bfa_status bfa_ioc_ct_pll_init(void __iomem *rb, bool fcmode);
|
||||
|
||||
static struct bfa_ioc_hwif nw_hwif_ct;
|
||||
|
||||
/**
|
||||
* Called from bfa_ioc_attach() to map asic specific calls.
|
||||
*/
|
||||
void
|
||||
bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc)
|
||||
{
|
||||
nw_hwif_ct.ioc_pll_init = bfa_ioc_ct_pll_init;
|
||||
nw_hwif_ct.ioc_firmware_lock = bfa_ioc_ct_firmware_lock;
|
||||
nw_hwif_ct.ioc_firmware_unlock = bfa_ioc_ct_firmware_unlock;
|
||||
nw_hwif_ct.ioc_reg_init = bfa_ioc_ct_reg_init;
|
||||
nw_hwif_ct.ioc_map_port = bfa_ioc_ct_map_port;
|
||||
nw_hwif_ct.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set;
|
||||
nw_hwif_ct.ioc_notify_hbfail = bfa_ioc_ct_notify_hbfail;
|
||||
nw_hwif_ct.ioc_ownership_reset = bfa_ioc_ct_ownership_reset;
|
||||
|
||||
ioc->ioc_hwif = &nw_hwif_ct;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if firmware of current driver matches the running firmware.
|
||||
*/
|
||||
static bool
|
||||
bfa_ioc_ct_firmware_lock(struct bfa_ioc *ioc)
|
||||
{
|
||||
enum bfi_ioc_state ioc_fwstate;
|
||||
u32 usecnt;
|
||||
struct bfi_ioc_image_hdr fwhdr;
|
||||
|
||||
/**
|
||||
* Firmware match check is relevant only for CNA.
|
||||
*/
|
||||
if (!ioc->cna)
|
||||
return true;
|
||||
|
||||
/**
|
||||
* If bios boot (flash based) -- do not increment usage count
|
||||
*/
|
||||
if (bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc)) <
|
||||
BFA_IOC_FWIMG_MINSZ)
|
||||
return true;
|
||||
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
usecnt = readl(ioc->ioc_regs.ioc_usage_reg);
|
||||
|
||||
/**
|
||||
* If usage count is 0, always return TRUE.
|
||||
*/
|
||||
if (usecnt == 0) {
|
||||
writel(1, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
return true;
|
||||
}
|
||||
|
||||
ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate);
|
||||
|
||||
/**
|
||||
* Use count cannot be non-zero and chip in uninitialized state.
|
||||
*/
|
||||
BUG_ON(!(ioc_fwstate != BFI_IOC_UNINIT));
|
||||
|
||||
/**
|
||||
* Check if another driver with a different firmware is active
|
||||
*/
|
||||
bfa_nw_ioc_fwver_get(ioc, &fwhdr);
|
||||
if (!bfa_nw_ioc_fwver_cmp(ioc, &fwhdr)) {
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same firmware version. Increment the reference count.
|
||||
*/
|
||||
usecnt++;
|
||||
writel(usecnt, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_firmware_unlock(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 usecnt;
|
||||
|
||||
/**
|
||||
* Firmware lock is relevant only for CNA.
|
||||
*/
|
||||
if (!ioc->cna)
|
||||
return;
|
||||
|
||||
/**
|
||||
* If bios boot (flash based) -- do not decrement usage count
|
||||
*/
|
||||
if (bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc)) <
|
||||
BFA_IOC_FWIMG_MINSZ)
|
||||
return;
|
||||
|
||||
/**
|
||||
* decrement usage count
|
||||
*/
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
usecnt = readl(ioc->ioc_regs.ioc_usage_reg);
|
||||
BUG_ON(!(usecnt > 0));
|
||||
|
||||
usecnt--;
|
||||
writel(usecnt, ioc->ioc_regs.ioc_usage_reg);
|
||||
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify other functions on HB failure.
|
||||
*/
|
||||
static void
|
||||
bfa_ioc_ct_notify_hbfail(struct bfa_ioc *ioc)
|
||||
{
|
||||
if (ioc->cna) {
|
||||
writel(__FW_INIT_HALT_P, ioc->ioc_regs.ll_halt);
|
||||
/* Wait for halt to take effect */
|
||||
readl(ioc->ioc_regs.ll_halt);
|
||||
} else {
|
||||
writel(__PSS_ERR_STATUS_SET, ioc->ioc_regs.err_set);
|
||||
readl(ioc->ioc_regs.err_set);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Host to LPU mailbox message addresses
|
||||
*/
|
||||
static struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = {
|
||||
{ HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 },
|
||||
{ HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 },
|
||||
{ HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 },
|
||||
{ HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 }
|
||||
};
|
||||
|
||||
/**
|
||||
* Host <-> LPU mailbox command/status registers - port 0
|
||||
*/
|
||||
static struct { u32 hfn, lpu; } iocreg_mbcmd_p0[] = {
|
||||
{ HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT },
|
||||
{ HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT },
|
||||
{ HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT },
|
||||
{ HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT }
|
||||
};
|
||||
|
||||
/**
|
||||
* Host <-> LPU mailbox command/status registers - port 1
|
||||
*/
|
||||
static struct { u32 hfn, lpu; } iocreg_mbcmd_p1[] = {
|
||||
{ HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT },
|
||||
{ HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT },
|
||||
{ HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT },
|
||||
{ HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT }
|
||||
};
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_reg_init(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb;
|
||||
int pcifn = bfa_ioc_pcifn(ioc);
|
||||
|
||||
rb = bfa_ioc_bar0(ioc);
|
||||
|
||||
ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox;
|
||||
ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox;
|
||||
ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn;
|
||||
|
||||
if (ioc->port_id == 0) {
|
||||
ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG;
|
||||
ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG;
|
||||
ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn;
|
||||
ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0;
|
||||
} else {
|
||||
ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG);
|
||||
ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG);
|
||||
ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn;
|
||||
ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1;
|
||||
}
|
||||
|
||||
/*
|
||||
* PSS control registers
|
||||
*/
|
||||
ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG);
|
||||
ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG);
|
||||
ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG);
|
||||
ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG);
|
||||
|
||||
/*
|
||||
* IOC semaphore registers and serialization
|
||||
*/
|
||||
ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG);
|
||||
ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG);
|
||||
ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG);
|
||||
ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT);
|
||||
|
||||
/**
|
||||
* sram memory access
|
||||
*/
|
||||
ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START);
|
||||
ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT;
|
||||
|
||||
/*
|
||||
* err set reg : for notification of hb failure in fcmode
|
||||
*/
|
||||
ioc->ioc_regs.err_set = (rb + ERR_SET_REG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize IOC to port mapping.
|
||||
*/
|
||||
|
||||
#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8)
|
||||
static void
|
||||
bfa_ioc_ct_map_port(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32;
|
||||
|
||||
/**
|
||||
* For catapult, base port id on personality register and IOC type
|
||||
*/
|
||||
r32 = readl(rb + FNC_PERS_REG);
|
||||
r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc));
|
||||
ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set interrupt mode for a function: INTX or MSIX
|
||||
*/
|
||||
static void
|
||||
bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32, mode;
|
||||
|
||||
r32 = readl(rb + FNC_PERS_REG);
|
||||
|
||||
mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) &
|
||||
__F0_INTX_STATUS;
|
||||
|
||||
/**
|
||||
* If already in desired mode, do not change anything
|
||||
*/
|
||||
if (!msix && mode)
|
||||
return;
|
||||
|
||||
if (msix)
|
||||
mode = __F0_INTX_STATUS_MSIX;
|
||||
else
|
||||
mode = __F0_INTX_STATUS_INTA;
|
||||
|
||||
r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)));
|
||||
r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)));
|
||||
|
||||
writel(r32, rb + FNC_PERS_REG);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup hw semaphore and usecnt registers
|
||||
*/
|
||||
static void
|
||||
bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc)
|
||||
{
|
||||
if (ioc->cna) {
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
writel(0, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the hw sem reg to make sure that it is locked
|
||||
* before we clear it. If it is not locked, writing 1
|
||||
* will lock it instead of clearing it.
|
||||
*/
|
||||
readl(ioc->ioc_regs.ioc_sem_reg);
|
||||
bfa_nw_ioc_hw_sem_release(ioc);
|
||||
}
|
||||
|
||||
static enum bfa_status
|
||||
bfa_ioc_ct_pll_init(void __iomem *rb, bool fcmode)
|
||||
{
|
||||
u32 pll_sclk, pll_fclk, r32;
|
||||
|
||||
pll_sclk = __APP_PLL_312_LRESETN | __APP_PLL_312_ENARST |
|
||||
__APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(3U) |
|
||||
__APP_PLL_312_JITLMT0_1(3U) |
|
||||
__APP_PLL_312_CNTLMT0_1(1U);
|
||||
pll_fclk = __APP_PLL_425_LRESETN | __APP_PLL_425_ENARST |
|
||||
__APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) |
|
||||
__APP_PLL_425_JITLMT0_1(3U) |
|
||||
__APP_PLL_425_CNTLMT0_1(1U);
|
||||
if (fcmode) {
|
||||
writel(0, (rb + OP_MODE));
|
||||
writel(__APP_EMS_CMLCKSEL |
|
||||
__APP_EMS_REFCKBUFEN2 |
|
||||
__APP_EMS_CHANNEL_SEL,
|
||||
(rb + ETH_MAC_SER_REG));
|
||||
} else {
|
||||
writel(__GLOBAL_FCOE_MODE, (rb + OP_MODE));
|
||||
writel(__APP_EMS_REFCKBUFEN1,
|
||||
(rb + ETH_MAC_SER_REG));
|
||||
}
|
||||
writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG));
|
||||
writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_MSK));
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_312_LOGIC_SOFT_RESET,
|
||||
rb + APP_PLL_312_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_425_LOGIC_SOFT_RESET,
|
||||
rb + APP_PLL_425_CTL_REG);
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_312_LOGIC_SOFT_RESET | __APP_PLL_312_ENABLE,
|
||||
rb + APP_PLL_312_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_425_LOGIC_SOFT_RESET | __APP_PLL_425_ENABLE,
|
||||
rb + APP_PLL_425_CTL_REG);
|
||||
readl(rb + HOSTFN0_INT_MSK);
|
||||
udelay(2000);
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_312_ENABLE,
|
||||
rb + APP_PLL_312_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_425_ENABLE,
|
||||
rb + APP_PLL_425_CTL_REG);
|
||||
if (!fcmode) {
|
||||
writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P0));
|
||||
writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P1));
|
||||
}
|
||||
r32 = readl((rb + PSS_CTL_REG));
|
||||
r32 &= ~__PSS_LMEM_RESET;
|
||||
writel(r32, (rb + PSS_CTL_REG));
|
||||
udelay(1000);
|
||||
if (!fcmode) {
|
||||
writel(0, (rb + PMM_1T_RESET_REG_P0));
|
||||
writel(0, (rb + PMM_1T_RESET_REG_P1));
|
||||
}
|
||||
|
||||
writel(__EDRAM_BISTR_START, (rb + MBIST_CTL_REG));
|
||||
udelay(1000);
|
||||
r32 = readl((rb + MBIST_STAT_REG));
|
||||
writel(0, (rb + MBIST_CTL_REG));
|
||||
return BFA_STATUS_OK;
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file bfasm.h State machine defines
|
||||
*/
|
||||
|
||||
#ifndef __BFA_SM_H__
|
||||
#define __BFA_SM_H__
|
||||
|
||||
#include "cna.h"
|
||||
|
||||
typedef void (*bfa_sm_t)(void *sm, int event);
|
||||
|
||||
/**
|
||||
* oc - object class eg. bfa_ioc
|
||||
* st - state, eg. reset
|
||||
* otype - object type, eg. struct bfa_ioc
|
||||
* etype - object type, eg. enum ioc_event
|
||||
*/
|
||||
#define bfa_sm_state_decl(oc, st, otype, etype) \
|
||||
static void oc ## _sm_ ## st(otype * fsm, etype event)
|
||||
|
||||
#define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state))
|
||||
#define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event)))
|
||||
#define bfa_sm_get_state(_sm) ((_sm)->sm)
|
||||
#define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (bfa_sm_t)(_state))
|
||||
|
||||
/**
|
||||
* For converting from state machine function to state encoding.
|
||||
*/
|
||||
struct bfa_sm_table {
|
||||
bfa_sm_t sm; /*!< state machine function */
|
||||
int state; /*!< state machine encoding */
|
||||
char *name; /*!< state name for display */
|
||||
};
|
||||
#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
|
||||
|
||||
/**
|
||||
* State machine with entry actions.
|
||||
*/
|
||||
typedef void (*bfa_fsm_t)(void *fsm, int event);
|
||||
|
||||
/**
|
||||
* oc - object class eg. bfa_ioc
|
||||
* st - state, eg. reset
|
||||
* otype - object type, eg. struct bfa_ioc
|
||||
* etype - object type, eg. enum ioc_event
|
||||
*/
|
||||
#define bfa_fsm_state_decl(oc, st, otype, etype) \
|
||||
static void oc ## _sm_ ## st(otype * fsm, etype event); \
|
||||
static void oc ## _sm_ ## st ## _entry(otype * fsm)
|
||||
|
||||
#define bfa_fsm_set_state(_fsm, _state) do { \
|
||||
(_fsm)->fsm = (bfa_fsm_t)(_state); \
|
||||
_state ## _entry(_fsm); \
|
||||
} while (0)
|
||||
|
||||
#define bfa_fsm_send_event(_fsm, _event) ((_fsm)->fsm((_fsm), (_event)))
|
||||
#define bfa_fsm_get_state(_fsm) ((_fsm)->fsm)
|
||||
#define bfa_fsm_cmp_state(_fsm, _state) \
|
||||
((_fsm)->fsm == (bfa_fsm_t)(_state))
|
||||
|
||||
static inline int
|
||||
bfa_sm_to_state(const struct bfa_sm_table *smt, bfa_sm_t sm)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (smt[i].sm && smt[i].sm != sm)
|
||||
i++;
|
||||
return smt[i].state;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file bfa_wc.h Generic wait counter.
|
||||
*/
|
||||
|
||||
#ifndef __BFA_WC_H__
|
||||
#define __BFA_WC_H__
|
||||
|
||||
typedef void (*bfa_wc_resume_t) (void *cbarg);
|
||||
|
||||
struct bfa_wc {
|
||||
bfa_wc_resume_t wc_resume;
|
||||
void *wc_cbarg;
|
||||
int wc_count;
|
||||
};
|
||||
|
||||
static inline void
|
||||
bfa_wc_up(struct bfa_wc *wc)
|
||||
{
|
||||
wc->wc_count++;
|
||||
}
|
||||
|
||||
static inline void
|
||||
bfa_wc_down(struct bfa_wc *wc)
|
||||
{
|
||||
wc->wc_count--;
|
||||
if (wc->wc_count == 0)
|
||||
wc->wc_resume(wc->wc_cbarg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a waiting counter.
|
||||
*/
|
||||
static inline void
|
||||
bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg)
|
||||
{
|
||||
wc->wc_resume = wc_resume;
|
||||
wc->wc_cbarg = wc_cbarg;
|
||||
wc->wc_count = 0;
|
||||
bfa_wc_up(wc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for counter to reach zero
|
||||
*/
|
||||
static inline void
|
||||
bfa_wc_wait(struct bfa_wc *wc)
|
||||
{
|
||||
bfa_wc_down(wc);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,392 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFI_H__
|
||||
#define __BFI_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/**
|
||||
* BFI FW image type
|
||||
*/
|
||||
#define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */
|
||||
#define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32))
|
||||
enum {
|
||||
BFI_IMAGE_CB_FC,
|
||||
BFI_IMAGE_CT_FC,
|
||||
BFI_IMAGE_CT_CNA,
|
||||
BFI_IMAGE_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* Msg header common to all msgs
|
||||
*/
|
||||
struct bfi_mhdr {
|
||||
u8 msg_class; /*!< @ref enum bfi_mclass */
|
||||
u8 msg_id; /*!< msg opcode with in the class */
|
||||
union {
|
||||
struct {
|
||||
u8 rsvd;
|
||||
u8 lpu_id; /*!< msg destination */
|
||||
} h2i;
|
||||
u16 i2htok; /*!< token in msgs to host */
|
||||
} mtag;
|
||||
};
|
||||
|
||||
#define bfi_h2i_set(_mh, _mc, _op, _lpuid) do { \
|
||||
(_mh).msg_class = (_mc); \
|
||||
(_mh).msg_id = (_op); \
|
||||
(_mh).mtag.h2i.lpu_id = (_lpuid); \
|
||||
} while (0)
|
||||
|
||||
#define bfi_i2h_set(_mh, _mc, _op, _i2htok) do { \
|
||||
(_mh).msg_class = (_mc); \
|
||||
(_mh).msg_id = (_op); \
|
||||
(_mh).mtag.i2htok = (_i2htok); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Message opcodes: 0-127 to firmware, 128-255 to host
|
||||
*/
|
||||
#define BFI_I2H_OPCODE_BASE 128
|
||||
#define BFA_I2HM(_x) ((_x) + BFI_I2H_OPCODE_BASE)
|
||||
|
||||
/**
|
||||
****************************************************************************
|
||||
*
|
||||
* Scatter Gather Element and Page definition
|
||||
*
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
#define BFI_SGE_INLINE 1
|
||||
#define BFI_SGE_INLINE_MAX (BFI_SGE_INLINE + 1)
|
||||
|
||||
/**
|
||||
* SG Flags
|
||||
*/
|
||||
enum {
|
||||
BFI_SGE_DATA = 0, /*!< data address, not last */
|
||||
BFI_SGE_DATA_CPL = 1, /*!< data addr, last in current page */
|
||||
BFI_SGE_DATA_LAST = 3, /*!< data address, last */
|
||||
BFI_SGE_LINK = 2, /*!< link address */
|
||||
BFI_SGE_PGDLEN = 2, /*!< cumulative data length for page */
|
||||
};
|
||||
|
||||
/**
|
||||
* DMA addresses
|
||||
*/
|
||||
union bfi_addr_u {
|
||||
struct {
|
||||
u32 addr_lo;
|
||||
u32 addr_hi;
|
||||
} a32;
|
||||
};
|
||||
|
||||
/**
|
||||
* Scatter Gather Element
|
||||
*/
|
||||
struct bfi_sge {
|
||||
#ifdef __BIGENDIAN
|
||||
u32 flags:2,
|
||||
rsvd:2,
|
||||
sg_len:28;
|
||||
#else
|
||||
u32 sg_len:28,
|
||||
rsvd:2,
|
||||
flags:2;
|
||||
#endif
|
||||
union bfi_addr_u sga;
|
||||
};
|
||||
|
||||
/**
|
||||
* Scatter Gather Page
|
||||
*/
|
||||
#define BFI_SGPG_DATA_SGES 7
|
||||
#define BFI_SGPG_SGES_MAX (BFI_SGPG_DATA_SGES + 1)
|
||||
#define BFI_SGPG_RSVD_WD_LEN 8
|
||||
struct bfi_sgpg {
|
||||
struct bfi_sge sges[BFI_SGPG_SGES_MAX];
|
||||
u32 rsvd[BFI_SGPG_RSVD_WD_LEN];
|
||||
};
|
||||
|
||||
/*
|
||||
* Large Message structure - 128 Bytes size Msgs
|
||||
*/
|
||||
#define BFI_LMSG_SZ 128
|
||||
#define BFI_LMSG_PL_WSZ \
|
||||
((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
|
||||
|
||||
struct bfi_msg {
|
||||
struct bfi_mhdr mhdr;
|
||||
u32 pl[BFI_LMSG_PL_WSZ];
|
||||
};
|
||||
|
||||
/**
|
||||
* Mailbox message structure
|
||||
*/
|
||||
#define BFI_MBMSG_SZ 7
|
||||
struct bfi_mbmsg {
|
||||
struct bfi_mhdr mh;
|
||||
u32 pl[BFI_MBMSG_SZ];
|
||||
};
|
||||
|
||||
/**
|
||||
* Message Classes
|
||||
*/
|
||||
enum bfi_mclass {
|
||||
BFI_MC_IOC = 1, /*!< IO Controller (IOC) */
|
||||
BFI_MC_DIAG = 2, /*!< Diagnostic Msgs */
|
||||
BFI_MC_FLASH = 3, /*!< Flash message class */
|
||||
BFI_MC_CEE = 4, /*!< CEE */
|
||||
BFI_MC_FCPORT = 5, /*!< FC port */
|
||||
BFI_MC_IOCFC = 6, /*!< FC - IO Controller (IOC) */
|
||||
BFI_MC_LL = 7, /*!< Link Layer */
|
||||
BFI_MC_UF = 8, /*!< Unsolicited frame receive */
|
||||
BFI_MC_FCXP = 9, /*!< FC Transport */
|
||||
BFI_MC_LPS = 10, /*!< lport fc login services */
|
||||
BFI_MC_RPORT = 11, /*!< Remote port */
|
||||
BFI_MC_ITNIM = 12, /*!< I-T nexus (Initiator mode) */
|
||||
BFI_MC_IOIM_READ = 13, /*!< read IO (Initiator mode) */
|
||||
BFI_MC_IOIM_WRITE = 14, /*!< write IO (Initiator mode) */
|
||||
BFI_MC_IOIM_IO = 15, /*!< IO (Initiator mode) */
|
||||
BFI_MC_IOIM = 16, /*!< IO (Initiator mode) */
|
||||
BFI_MC_IOIM_IOCOM = 17, /*!< good IO completion */
|
||||
BFI_MC_TSKIM = 18, /*!< Initiator Task management */
|
||||
BFI_MC_SBOOT = 19, /*!< SAN boot services */
|
||||
BFI_MC_IPFC = 20, /*!< IP over FC Msgs */
|
||||
BFI_MC_PORT = 21, /*!< Physical port */
|
||||
BFI_MC_SFP = 22, /*!< SFP module */
|
||||
BFI_MC_MSGQ = 23, /*!< MSGQ */
|
||||
BFI_MC_ENET = 24, /*!< ENET commands/responses */
|
||||
BFI_MC_MAX = 32
|
||||
};
|
||||
|
||||
#define BFI_IOC_MAX_CQS 4
|
||||
#define BFI_IOC_MAX_CQS_ASIC 8
|
||||
#define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */
|
||||
|
||||
#define BFI_BOOT_TYPE_OFF 8
|
||||
#define BFI_BOOT_PARAM_OFF 12
|
||||
|
||||
#define BFI_BOOT_TYPE_NORMAL 0 /* param is device id */
|
||||
#define BFI_BOOT_TYPE_FLASH 1
|
||||
#define BFI_BOOT_TYPE_MEMTEST 2
|
||||
|
||||
#define BFI_BOOT_MEMTEST_RES_ADDR 0x900
|
||||
#define BFI_BOOT_MEMTEST_RES_SIG 0xA0A1A2A3
|
||||
|
||||
/**
|
||||
*----------------------------------------------------------------------
|
||||
* IOC
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
enum bfi_ioc_h2i_msgs {
|
||||
BFI_IOC_H2I_ENABLE_REQ = 1,
|
||||
BFI_IOC_H2I_DISABLE_REQ = 2,
|
||||
BFI_IOC_H2I_GETATTR_REQ = 3,
|
||||
BFI_IOC_H2I_DBG_SYNC = 4,
|
||||
BFI_IOC_H2I_DBG_DUMP = 5,
|
||||
};
|
||||
|
||||
enum bfi_ioc_i2h_msgs {
|
||||
BFI_IOC_I2H_ENABLE_REPLY = BFA_I2HM(1),
|
||||
BFI_IOC_I2H_DISABLE_REPLY = BFA_I2HM(2),
|
||||
BFI_IOC_I2H_GETATTR_REPLY = BFA_I2HM(3),
|
||||
BFI_IOC_I2H_READY_EVENT = BFA_I2HM(4),
|
||||
BFI_IOC_I2H_HBEAT = BFA_I2HM(5),
|
||||
};
|
||||
|
||||
/**
|
||||
* BFI_IOC_H2I_GETATTR_REQ message
|
||||
*/
|
||||
struct bfi_ioc_getattr_req {
|
||||
struct bfi_mhdr mh;
|
||||
union bfi_addr_u attr_addr;
|
||||
};
|
||||
|
||||
struct bfi_ioc_attr {
|
||||
u64 mfg_pwwn; /*!< Mfg port wwn */
|
||||
u64 mfg_nwwn; /*!< Mfg node wwn */
|
||||
mac_t mfg_mac; /*!< Mfg mac */
|
||||
u16 rsvd_a;
|
||||
u64 pwwn;
|
||||
u64 nwwn;
|
||||
mac_t mac; /*!< PBC or Mfg mac */
|
||||
u16 rsvd_b;
|
||||
mac_t fcoe_mac;
|
||||
u16 rsvd_c;
|
||||
char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
|
||||
u8 pcie_gen;
|
||||
u8 pcie_lanes_orig;
|
||||
u8 pcie_lanes;
|
||||
u8 rx_bbcredit; /*!< receive buffer credits */
|
||||
u32 adapter_prop; /*!< adapter properties */
|
||||
u16 maxfrsize; /*!< max receive frame size */
|
||||
char asic_rev;
|
||||
u8 rsvd_d;
|
||||
char fw_version[BFA_VERSION_LEN];
|
||||
char optrom_version[BFA_VERSION_LEN];
|
||||
struct bfa_mfg_vpd vpd;
|
||||
u32 card_type; /*!< card type */
|
||||
};
|
||||
|
||||
/**
|
||||
* BFI_IOC_I2H_GETATTR_REPLY message
|
||||
*/
|
||||
struct bfi_ioc_getattr_reply {
|
||||
struct bfi_mhdr mh; /*!< Common msg header */
|
||||
u8 status; /*!< cfg reply status */
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/**
|
||||
* Firmware memory page offsets
|
||||
*/
|
||||
#define BFI_IOC_SMEM_PG0_CB (0x40)
|
||||
#define BFI_IOC_SMEM_PG0_CT (0x180)
|
||||
|
||||
/**
|
||||
* Firmware statistic offset
|
||||
*/
|
||||
#define BFI_IOC_FWSTATS_OFF (0x6B40)
|
||||
#define BFI_IOC_FWSTATS_SZ (4096)
|
||||
|
||||
/**
|
||||
* Firmware trace offset
|
||||
*/
|
||||
#define BFI_IOC_TRC_OFF (0x4b00)
|
||||
#define BFI_IOC_TRC_ENTS 256
|
||||
|
||||
#define BFI_IOC_FW_SIGNATURE (0xbfadbfad)
|
||||
#define BFI_IOC_MD5SUM_SZ 4
|
||||
struct bfi_ioc_image_hdr {
|
||||
u32 signature; /*!< constant signature */
|
||||
u32 rsvd_a;
|
||||
u32 exec; /*!< exec vector */
|
||||
u32 param; /*!< parameters */
|
||||
u32 rsvd_b[4];
|
||||
u32 md5sum[BFI_IOC_MD5SUM_SZ];
|
||||
};
|
||||
|
||||
/**
|
||||
* BFI_IOC_I2H_READY_EVENT message
|
||||
*/
|
||||
struct bfi_ioc_rdy_event {
|
||||
struct bfi_mhdr mh; /*!< common msg header */
|
||||
u8 init_status; /*!< init event status */
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
struct bfi_ioc_hbeat {
|
||||
struct bfi_mhdr mh; /*!< common msg header */
|
||||
u32 hb_count; /*!< current heart beat count */
|
||||
};
|
||||
|
||||
/**
|
||||
* IOC hardware/firmware state
|
||||
*/
|
||||
enum bfi_ioc_state {
|
||||
BFI_IOC_UNINIT = 0, /*!< not initialized */
|
||||
BFI_IOC_INITING = 1, /*!< h/w is being initialized */
|
||||
BFI_IOC_HWINIT = 2, /*!< h/w is initialized */
|
||||
BFI_IOC_CFG = 3, /*!< IOC configuration in progress */
|
||||
BFI_IOC_OP = 4, /*!< IOC is operational */
|
||||
BFI_IOC_DISABLING = 5, /*!< IOC is being disabled */
|
||||
BFI_IOC_DISABLED = 6, /*!< IOC is disabled */
|
||||
BFI_IOC_CFG_DISABLED = 7, /*!< IOC is being disabled;transient */
|
||||
BFI_IOC_FAIL = 8, /*!< IOC heart-beat failure */
|
||||
BFI_IOC_MEMTEST = 9, /*!< IOC is doing memtest */
|
||||
};
|
||||
|
||||
#define BFI_IOC_ENDIAN_SIG 0x12345678
|
||||
|
||||
enum {
|
||||
BFI_ADAPTER_TYPE_FC = 0x01, /*!< FC adapters */
|
||||
BFI_ADAPTER_TYPE_MK = 0x0f0000, /*!< adapter type mask */
|
||||
BFI_ADAPTER_TYPE_SH = 16, /*!< adapter type shift */
|
||||
BFI_ADAPTER_NPORTS_MK = 0xff00, /*!< number of ports mask */
|
||||
BFI_ADAPTER_NPORTS_SH = 8, /*!< number of ports shift */
|
||||
BFI_ADAPTER_SPEED_MK = 0xff, /*!< adapter speed mask */
|
||||
BFI_ADAPTER_SPEED_SH = 0, /*!< adapter speed shift */
|
||||
BFI_ADAPTER_PROTO = 0x100000, /*!< prototype adapaters */
|
||||
BFI_ADAPTER_TTV = 0x200000, /*!< TTV debug capable */
|
||||
BFI_ADAPTER_UNSUPP = 0x400000, /*!< unknown adapter type */
|
||||
};
|
||||
|
||||
#define BFI_ADAPTER_GETP(__prop, __adap_prop) \
|
||||
(((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >> \
|
||||
BFI_ADAPTER_ ## __prop ## _SH)
|
||||
#define BFI_ADAPTER_SETP(__prop, __val) \
|
||||
((__val) << BFI_ADAPTER_ ## __prop ## _SH)
|
||||
#define BFI_ADAPTER_IS_PROTO(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_PROTO)
|
||||
#define BFI_ADAPTER_IS_TTV(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_TTV)
|
||||
#define BFI_ADAPTER_IS_UNSUPP(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_UNSUPP)
|
||||
#define BFI_ADAPTER_IS_SPECIAL(__adap_type) \
|
||||
((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \
|
||||
BFI_ADAPTER_UNSUPP))
|
||||
|
||||
/**
|
||||
* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages
|
||||
*/
|
||||
struct bfi_ioc_ctrl_req {
|
||||
struct bfi_mhdr mh;
|
||||
u8 ioc_class;
|
||||
u8 rsvd[3];
|
||||
u32 tv_sec;
|
||||
};
|
||||
|
||||
/**
|
||||
* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages
|
||||
*/
|
||||
struct bfi_ioc_ctrl_reply {
|
||||
struct bfi_mhdr mh; /*!< Common msg header */
|
||||
u8 status; /*!< enable/disable status */
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
#define BFI_IOC_MSGSZ 8
|
||||
/**
|
||||
* H2I Messages
|
||||
*/
|
||||
union bfi_ioc_h2i_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_ioc_ctrl_req enable_req;
|
||||
struct bfi_ioc_ctrl_req disable_req;
|
||||
struct bfi_ioc_getattr_req getattr_req;
|
||||
u32 mboxmsg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
/**
|
||||
* I2H Messages
|
||||
*/
|
||||
union bfi_ioc_i2h_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_ioc_rdy_event rdy_event;
|
||||
u32 mboxmsg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFI_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue