mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 04:50:53 +07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Lots of fixes, here goes: 1) NULL deref in qtnfmac, from Gustavo A. R. Silva. 2) Kernel oops when fw download fails in rtlwifi, from Ping-Ke Shih. 3) Lost completion messages in AF_XDP, from Magnus Karlsson. 4) Correct bogus self-assignment in rhashtable, from Rishabh Bhatnagar. 5) Fix regression in ipv6 route append handling, from David Ahern. 6) Fix masking in __set_phy_supported(), from Heiner Kallweit. 7) Missing module owner set in x_tables icmp, from Florian Westphal. 8) liquidio's timeouts are HZ dependent, fix from Nicholas Mc Guire. 9) Link setting fixes for sh_eth and ravb, from Vladimir Zapolskiy. 10) Fix NULL deref when using chains in act_csum, from Davide Caratti. 11) XDP_REDIRECT needs to check if the interface is up and whether the MTU is sufficient. From Toshiaki Makita. 12) Net diag can do a double free when killing TCP_NEW_SYN_RECV connections, from Lorenzo Colitti. 13) nf_defrag in ipv6 can unnecessarily hold onto dst entries for a full minute, delaying device unregister. From Eric Dumazet. 14) Update MAC entries in the correct order in ixgbe, from Alexander Duyck. 15) Don't leave partial mangles bpf program in jit_subprogs, from Daniel Borkmann. 16) Fix pfmemalloc SKB state propagation, from Stefano Brivio. 17) Fix ACK handling in DCTCP congestion control, from Yuchung Cheng. 18) Use after free in tun XDP_TX, from Toshiaki Makita. 19) Stale ipv6 header pointer in ipv6 gre code, from Prashant Bhole. 20) Don't reuse remainder of RX page when XDP is set in mlx4, from Saeed Mahameed. 21) Fix window probe handling of TCP rapair sockets, from Stefan Baranoff. 22) Missing socket locking in smc_ioctl(), from Ursula Braun. 23) IPV6_ILA needs DST_CACHE, from Arnd Bergmann. 24) Spectre v1 fix in cxgb3, from Gustavo A. R. Silva. 25) Two spots in ipv6 do a rol32() on a hash value but ignore the result. Fixes from Colin Ian King" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (176 commits) tcp: identify cryptic messages as TCP seq # bugs ptp: fix missing break in switch hv_netvsc: Fix napi reschedule while receive completion is busy MAINTAINERS: Drop inactive Vitaly Bordug's email net: cavium: Add fine-granular dependencies on PCI net: qca_spi: Fix log level if probe fails net: qca_spi: Make sure the QCA7000 reset is triggered net: qca_spi: Avoid packet drop during initial sync ipv6: fix useless rol32 call on hash ipv6: sr: fix useless rol32 call on hash net: sched: Using NULL instead of plain integer net: usb: asix: replace mii_nway_restart in resume path net: cxgb3_main: fix potential Spectre v1 lib/rhashtable: consider param->min_size when setting initial table size net/smc: reset recv timeout after clc handshake net/smc: add error handling for get_user() net/smc: optimize consumer cursor updates net/nfc: Avoid stalls when nfc_alloc_send_skb() returned NULL. ipv6: ila: select CONFIG_DST_CACHE net: usb: rtl8150: demote allmulti message to dev_dbg() ...
This commit is contained in:
commit
024ddc0ce1
@ -1490,7 +1490,7 @@ To remove an ARP target:
|
||||
|
||||
To configure the interval between learning packet transmits:
|
||||
# echo 12 > /sys/class/net/bond0/bonding/lp_interval
|
||||
NOTE: the lp_inteval is the number of seconds between instances where
|
||||
NOTE: the lp_interval is the number of seconds between instances where
|
||||
the bonding driver sends learning packets to each slaves peer switch. The
|
||||
default interval is 1 second.
|
||||
|
||||
|
@ -47,41 +47,45 @@ Driver Configuration Parameters
|
||||
The default value for each parameter is generally the recommended setting,
|
||||
unless otherwise noted.
|
||||
|
||||
Rx Descriptors: Number of receive descriptors. A receive descriptor is a data
|
||||
Rx Descriptors:
|
||||
Number of receive descriptors. A receive descriptor is a data
|
||||
structure that describes a receive buffer and its attributes to the network
|
||||
controller. The data in the descriptor is used by the controller to write
|
||||
data from the controller to host memory. In the 3.x.x driver the valid range
|
||||
for this parameter is 64-256. The default value is 256. This parameter can be
|
||||
changed using the command::
|
||||
|
||||
ethtool -G eth? rx n
|
||||
ethtool -G eth? rx n
|
||||
|
||||
Where n is the number of desired Rx descriptors.
|
||||
|
||||
Tx Descriptors: Number of transmit descriptors. A transmit descriptor is a data
|
||||
Tx Descriptors:
|
||||
Number of transmit descriptors. A transmit descriptor is a data
|
||||
structure that describes a transmit buffer and its attributes to the network
|
||||
controller. The data in the descriptor is used by the controller to read
|
||||
data from the host memory to the controller. In the 3.x.x driver the valid
|
||||
range for this parameter is 64-256. The default value is 128. This parameter
|
||||
can be changed using the command::
|
||||
|
||||
ethtool -G eth? tx n
|
||||
ethtool -G eth? tx n
|
||||
|
||||
Where n is the number of desired Tx descriptors.
|
||||
|
||||
Speed/Duplex: The driver auto-negotiates the link speed and duplex settings by
|
||||
Speed/Duplex:
|
||||
The driver auto-negotiates the link speed and duplex settings by
|
||||
default. The ethtool utility can be used as follows to force speed/duplex.::
|
||||
|
||||
ethtool -s eth? autoneg off speed {10|100} duplex {full|half}
|
||||
ethtool -s eth? autoneg off speed {10|100} duplex {full|half}
|
||||
|
||||
NOTE: setting the speed/duplex to incorrect values will cause the link to
|
||||
fail.
|
||||
|
||||
Event Log Message Level: The driver uses the message level flag to log events
|
||||
Event Log Message Level:
|
||||
The driver uses the message level flag to log events
|
||||
to syslog. The message level can be set at driver load time. It can also be
|
||||
set using the command::
|
||||
|
||||
ethtool -s eth? msglvl n
|
||||
ethtool -s eth? msglvl n
|
||||
|
||||
|
||||
Additional Configurations
|
||||
@ -92,7 +96,7 @@ Configuring the Driver on Different Distributions
|
||||
|
||||
Configuring a network driver to load properly when the system is started
|
||||
is distribution dependent. Typically, the configuration process involves
|
||||
adding an alias line to /etc/modprobe.d/*.conf as well as editing other
|
||||
adding an alias line to `/etc/modprobe.d/*.conf` as well as editing other
|
||||
system startup scripts and/or configuration files. Many popular Linux
|
||||
distributions ship with tools to make these changes for you. To learn
|
||||
the proper way to configure a network device for your system, refer to
|
||||
@ -160,7 +164,10 @@ This results in unbalanced receive traffic.
|
||||
If you have multiple interfaces in a server, either turn on ARP
|
||||
filtering by
|
||||
|
||||
(1) entering:: echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
|
||||
(1) entering::
|
||||
|
||||
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
|
||||
|
||||
(this only works if your kernel's version is higher than 2.4.5), or
|
||||
|
||||
(2) installing the interfaces in separate broadcast domains (either
|
||||
|
@ -34,7 +34,8 @@ Command Line Parameters
|
||||
The default value for each parameter is generally the recommended setting,
|
||||
unless otherwise noted.
|
||||
|
||||
NOTES: For more information about the AutoNeg, Duplex, and Speed
|
||||
NOTES:
|
||||
For more information about the AutoNeg, Duplex, and Speed
|
||||
parameters, see the "Speed and Duplex Configuration" section in
|
||||
this document.
|
||||
|
||||
@ -45,22 +46,27 @@ NOTES: For more information about the AutoNeg, Duplex, and Speed
|
||||
|
||||
AutoNeg
|
||||
-------
|
||||
|
||||
(Supported only on adapters with copper connections)
|
||||
Valid Range: 0x01-0x0F, 0x20-0x2F
|
||||
Default Value: 0x2F
|
||||
|
||||
:Valid Range: 0x01-0x0F, 0x20-0x2F
|
||||
:Default Value: 0x2F
|
||||
|
||||
This parameter is a bit-mask that specifies the speed and duplex settings
|
||||
advertised by the adapter. When this parameter is used, the Speed and
|
||||
Duplex parameters must not be specified.
|
||||
|
||||
NOTE: Refer to the Speed and Duplex section of this readme for more
|
||||
NOTE:
|
||||
Refer to the Speed and Duplex section of this readme for more
|
||||
information on the AutoNeg parameter.
|
||||
|
||||
Duplex
|
||||
------
|
||||
|
||||
(Supported only on adapters with copper connections)
|
||||
Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
|
||||
Default Value: 0
|
||||
|
||||
:Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
|
||||
:Default Value: 0
|
||||
|
||||
This defines the direction in which data is allowed to flow. Can be
|
||||
either one or two-directional. If both Duplex and the link partner are
|
||||
@ -70,18 +76,22 @@ duplex.
|
||||
|
||||
FlowControl
|
||||
-----------
|
||||
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
||||
Default Value: Reads flow control settings from the EEPROM
|
||||
|
||||
:Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
||||
:Default Value: Reads flow control settings from the EEPROM
|
||||
|
||||
This parameter controls the automatic generation(Tx) and response(Rx)
|
||||
to Ethernet PAUSE frames.
|
||||
|
||||
InterruptThrottleRate
|
||||
---------------------
|
||||
|
||||
(not supported on Intel(R) 82542, 82543 or 82544-based adapters)
|
||||
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||
4=simplified balancing)
|
||||
Default Value: 3
|
||||
|
||||
:Valid Range:
|
||||
0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||
4=simplified balancing)
|
||||
:Default Value: 3
|
||||
|
||||
The driver can limit the amount of interrupts per second that the adapter
|
||||
will generate for incoming packets. It does this by writing a value to the
|
||||
@ -135,13 +145,15 @@ Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
||||
and may improve small packet latency, but is generally not suitable
|
||||
for bulk throughput traffic.
|
||||
|
||||
NOTE: InterruptThrottleRate takes precedence over the TxAbsIntDelay and
|
||||
NOTE:
|
||||
InterruptThrottleRate takes precedence over the TxAbsIntDelay and
|
||||
RxAbsIntDelay parameters. In other words, minimizing the receive
|
||||
and/or transmit absolute delays does not force the controller to
|
||||
generate more interrupts than what the Interrupt Throttle Rate
|
||||
allows.
|
||||
|
||||
CAUTION: If you are using the Intel(R) PRO/1000 CT Network Connection
|
||||
CAUTION:
|
||||
If you are using the Intel(R) PRO/1000 CT Network Connection
|
||||
(controller 82547), setting InterruptThrottleRate to a value
|
||||
greater than 75,000, may hang (stop transmitting) adapters
|
||||
under certain network conditions. If this occurs a NETDEV
|
||||
@ -151,7 +163,8 @@ CAUTION: If you are using the Intel(R) PRO/1000 CT Network Connection
|
||||
hang, ensure that InterruptThrottleRate is set no greater
|
||||
than 75,000 and is not set to 0.
|
||||
|
||||
NOTE: When e1000 is loaded with default settings and multiple adapters
|
||||
NOTE:
|
||||
When e1000 is loaded with default settings and multiple adapters
|
||||
are in use simultaneously, the CPU utilization may increase non-
|
||||
linearly. In order to limit the CPU utilization without impacting
|
||||
the overall throughput, we recommend that you load the driver as
|
||||
@ -168,9 +181,11 @@ NOTE: When e1000 is loaded with default settings and multiple adapters
|
||||
|
||||
RxDescriptors
|
||||
-------------
|
||||
Valid Range: 48-256 for 82542 and 82543-based adapters
|
||||
48-4096 for all other supported adapters
|
||||
Default Value: 256
|
||||
|
||||
:Valid Range:
|
||||
- 48-256 for 82542 and 82543-based adapters
|
||||
- 48-4096 for all other supported adapters
|
||||
:Default Value: 256
|
||||
|
||||
This value specifies the number of receive buffer descriptors allocated
|
||||
by the driver. Increasing this value allows the driver to buffer more
|
||||
@ -180,15 +195,17 @@ Each descriptor is 16 bytes. A receive buffer is also allocated for each
|
||||
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
|
||||
on the MTU setting. The maximum MTU size is 16110.
|
||||
|
||||
NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
||||
NOTE:
|
||||
MTU designates the frame size. It only needs to be set for Jumbo
|
||||
Frames. Depending on the available system resources, the request
|
||||
for a higher number of receive descriptors may be denied. In this
|
||||
case, use a lower number.
|
||||
|
||||
RxIntDelay
|
||||
----------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 0
|
||||
|
||||
:Valid Range: 0-65535 (0=off)
|
||||
:Default Value: 0
|
||||
|
||||
This value delays the generation of receive interrupts in units of 1.024
|
||||
microseconds. Receive interrupt reduction can improve CPU efficiency if
|
||||
@ -198,7 +215,8 @@ of TCP traffic. If the system is reporting dropped receives, this value
|
||||
may be set too high, causing the driver to run out of available receive
|
||||
descriptors.
|
||||
|
||||
CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
||||
CAUTION:
|
||||
When setting RxIntDelay to a value other than 0, adapters may
|
||||
hang (stop transmitting) under certain network conditions. If
|
||||
this occurs a NETDEV WATCHDOG message is logged in the system
|
||||
event log. In addition, the controller is automatically reset,
|
||||
@ -207,9 +225,11 @@ CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
||||
|
||||
RxAbsIntDelay
|
||||
-------------
|
||||
|
||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 128
|
||||
|
||||
:Valid Range: 0-65535 (0=off)
|
||||
:Default Value: 128
|
||||
|
||||
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||
receive interrupt is generated. Useful only if RxIntDelay is non-zero,
|
||||
@ -220,9 +240,11 @@ conditions.
|
||||
|
||||
Speed
|
||||
-----
|
||||
|
||||
(This parameter is supported only on adapters with copper connections.)
|
||||
Valid Settings: 0, 10, 100, 1000
|
||||
Default Value: 0 (auto-negotiate at all supported speeds)
|
||||
|
||||
:Valid Settings: 0, 10, 100, 1000
|
||||
:Default Value: 0 (auto-negotiate at all supported speeds)
|
||||
|
||||
Speed forces the line speed to the specified value in megabits per second
|
||||
(Mbps). If this parameter is not specified or is set to 0 and the link
|
||||
@ -231,22 +253,26 @@ speed. Duplex should also be set when Speed is set to either 10 or 100.
|
||||
|
||||
TxDescriptors
|
||||
-------------
|
||||
Valid Range: 48-256 for 82542 and 82543-based adapters
|
||||
48-4096 for all other supported adapters
|
||||
Default Value: 256
|
||||
|
||||
:Valid Range:
|
||||
- 48-256 for 82542 and 82543-based adapters
|
||||
- 48-4096 for all other supported adapters
|
||||
:Default Value: 256
|
||||
|
||||
This value is the number of transmit descriptors allocated by the driver.
|
||||
Increasing this value allows the driver to queue more transmits. Each
|
||||
descriptor is 16 bytes.
|
||||
|
||||
NOTE: Depending on the available system resources, the request for a
|
||||
NOTE:
|
||||
Depending on the available system resources, the request for a
|
||||
higher number of transmit descriptors may be denied. In this case,
|
||||
use a lower number.
|
||||
|
||||
TxIntDelay
|
||||
----------
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 8
|
||||
|
||||
:Valid Range: 0-65535 (0=off)
|
||||
:Default Value: 8
|
||||
|
||||
This value delays the generation of transmit interrupts in units of
|
||||
1.024 microseconds. Transmit interrupt reduction can improve CPU
|
||||
@ -256,9 +282,11 @@ causing the driver to run out of available transmit descriptors.
|
||||
|
||||
TxAbsIntDelay
|
||||
-------------
|
||||
|
||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||
Valid Range: 0-65535 (0=off)
|
||||
Default Value: 32
|
||||
|
||||
:Valid Range: 0-65535 (0=off)
|
||||
:Default Value: 32
|
||||
|
||||
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||
transmit interrupt is generated. Useful only if TxIntDelay is non-zero,
|
||||
@ -269,18 +297,21 @@ network conditions.
|
||||
|
||||
XsumRX
|
||||
------
|
||||
|
||||
(This parameter is NOT supported on the 82542-based adapter.)
|
||||
Valid Range: 0-1
|
||||
Default Value: 1
|
||||
|
||||
:Valid Range: 0-1
|
||||
:Default Value: 1
|
||||
|
||||
A value of '1' indicates that the driver should enable IP checksum
|
||||
offload for received packets (both UDP and TCP) to the adapter hardware.
|
||||
|
||||
Copybreak
|
||||
---------
|
||||
Valid Range: 0-xxxxxxx (0=off)
|
||||
Default Value: 256
|
||||
Usage: modprobe e1000.ko copybreak=128
|
||||
|
||||
:Valid Range: 0-xxxxxxx (0=off)
|
||||
:Default Value: 256
|
||||
:Usage: modprobe e1000.ko copybreak=128
|
||||
|
||||
Driver copies all packets below or equaling this size to a fresh RX
|
||||
buffer before handing it up the stack.
|
||||
@ -292,8 +323,9 @@ it is also available during runtime at
|
||||
|
||||
SmartPowerDownEnable
|
||||
--------------------
|
||||
Valid Range: 0-1
|
||||
Default Value: 0 (disabled)
|
||||
|
||||
:Valid Range: 0-1
|
||||
:Default Value: 0 (disabled)
|
||||
|
||||
Allows PHY to turn off in lower power states. The user can turn off
|
||||
this parameter in supported chipsets.
|
||||
@ -309,14 +341,14 @@ fiber interface board only links at 1000 Mbps full-duplex.
|
||||
|
||||
For copper-based boards, the keywords interact as follows:
|
||||
|
||||
The default operation is auto-negotiate. The board advertises all
|
||||
- The default operation is auto-negotiate. The board advertises all
|
||||
supported speed and duplex combinations, and it links at the highest
|
||||
common speed and duplex mode IF the link partner is set to auto-negotiate.
|
||||
|
||||
If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps
|
||||
- If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps
|
||||
is advertised (The 1000BaseT spec requires auto-negotiation.)
|
||||
|
||||
If Speed = 10 or 100, then both Speed and Duplex should be set. Auto-
|
||||
- If Speed = 10 or 100, then both Speed and Duplex should be set. Auto-
|
||||
negotiation is disabled, and the AutoNeg parameter is ignored. Partner
|
||||
SHOULD also be forced.
|
||||
|
||||
@ -328,13 +360,15 @@ process.
|
||||
The parameter may be specified as either a decimal or hexadecimal value as
|
||||
determined by the bitmap below.
|
||||
|
||||
============== ====== ====== ======= ======= ====== ====== ======= ======
|
||||
Bit position 7 6 5 4 3 2 1 0
|
||||
Decimal Value 128 64 32 16 8 4 2 1
|
||||
Hex value 80 40 20 10 8 4 2 1
|
||||
Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10
|
||||
Duplex Full Full Half Full Half
|
||||
============== ====== ====== ======= ======= ====== ====== ======= ======
|
||||
|
||||
Some examples of using AutoNeg:
|
||||
Some examples of using AutoNeg::
|
||||
|
||||
modprobe e1000 AutoNeg=0x01 (Restricts autonegotiation to 10 Half)
|
||||
modprobe e1000 AutoNeg=1 (Same as above)
|
||||
@ -357,56 +391,59 @@ Additional Configurations
|
||||
|
||||
Jumbo Frames
|
||||
------------
|
||||
Jumbo Frames support is enabled by changing the MTU to a value larger
|
||||
than the default of 1500. Use the ifconfig command to increase the MTU
|
||||
size. For example::
|
||||
|
||||
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
||||
the default of 1500. Use the ifconfig command to increase the MTU size.
|
||||
For example::
|
||||
|
||||
ifconfig eth<x> mtu 9000 up
|
||||
|
||||
This setting is not saved across reboots. It can be made permanent if
|
||||
you add::
|
||||
This setting is not saved across reboots. It can be made permanent if
|
||||
you add::
|
||||
|
||||
MTU=9000
|
||||
|
||||
to the file /etc/sysconfig/network-scripts/ifcfg-eth<x>. This example
|
||||
applies to the Red Hat distributions; other distributions may store this
|
||||
setting in a different location.
|
||||
to the file /etc/sysconfig/network-scripts/ifcfg-eth<x>. This example
|
||||
applies to the Red Hat distributions; other distributions may store this
|
||||
setting in a different location.
|
||||
|
||||
Notes: Degradation in throughput performance may be observed in some
|
||||
Jumbo frames environments. If this is observed, increasing the
|
||||
application's socket buffer size and/or increasing the
|
||||
/proc/sys/net/ipv4/tcp_*mem entry values may help. See the specific
|
||||
application manual and /usr/src/linux*/Documentation/
|
||||
networking/ip-sysctl.txt for more details.
|
||||
Notes:
|
||||
Degradation in throughput performance may be observed in some Jumbo frames
|
||||
environments. If this is observed, increasing the application's socket buffer
|
||||
size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
|
||||
See the specific application manual and /usr/src/linux*/Documentation/
|
||||
networking/ip-sysctl.txt for more details.
|
||||
|
||||
- The maximum MTU setting for Jumbo Frames is 16110. This value
|
||||
coincides with the maximum Jumbo Frames size of 16128.
|
||||
- The maximum MTU setting for Jumbo Frames is 16110. This value coincides
|
||||
with the maximum Jumbo Frames size of 16128.
|
||||
|
||||
- Using Jumbo frames at 10 or 100 Mbps is not supported and may result
|
||||
in poor performance or loss of link.
|
||||
- Using Jumbo frames at 10 or 100 Mbps is not supported and may result in
|
||||
poor performance or loss of link.
|
||||
|
||||
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not
|
||||
support Jumbo Frames. These correspond to the following product names:
|
||||
Intel(R) PRO/1000 Gigabit Server Adapter Intel(R) PRO/1000 PM Network
|
||||
Connection
|
||||
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not
|
||||
support Jumbo Frames. These correspond to the following product names::
|
||||
|
||||
Intel(R) PRO/1000 Gigabit Server Adapter
|
||||
Intel(R) PRO/1000 PM Network Connection
|
||||
|
||||
ethtool
|
||||
-------
|
||||
The driver utilizes the ethtool interface for driver configuration and
|
||||
diagnostics, as well as displaying statistical information. The ethtool
|
||||
version 1.6 or later is required for this functionality.
|
||||
|
||||
The latest release of ethtool can be found from
|
||||
https://www.kernel.org/pub/software/network/ethtool/
|
||||
The driver utilizes the ethtool interface for driver configuration and
|
||||
diagnostics, as well as displaying statistical information. The ethtool
|
||||
version 1.6 or later is required for this functionality.
|
||||
|
||||
The latest release of ethtool can be found from
|
||||
https://www.kernel.org/pub/software/network/ethtool/
|
||||
|
||||
Enabling Wake on LAN* (WoL)
|
||||
---------------------------
|
||||
WoL is configured through the ethtool* utility.
|
||||
|
||||
WoL will be enabled on the system during the next shut down or reboot.
|
||||
For this driver version, in order to enable WoL, the e1000 driver must be
|
||||
loaded when shutting down or rebooting the system.
|
||||
WoL is configured through the ethtool* utility.
|
||||
|
||||
WoL will be enabled on the system during the next shut down or reboot.
|
||||
For this driver version, in order to enable WoL, the e1000 driver must be
|
||||
loaded when shutting down or rebooting the system.
|
||||
|
||||
Support
|
||||
=======
|
||||
|
@ -2523,7 +2523,7 @@ S: Supported
|
||||
F: drivers/scsi/esas2r
|
||||
|
||||
ATUSB IEEE 802.15.4 RADIO DRIVER
|
||||
M: Stefan Schmidt <stefan@osg.samsung.com>
|
||||
M: Stefan Schmidt <stefan@datenfreihafen.org>
|
||||
L: linux-wpan@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ieee802154/atusb.c
|
||||
@ -5790,7 +5790,6 @@ F: include/linux/fsl/
|
||||
|
||||
FREESCALE SOC FS_ENET DRIVER
|
||||
M: Pantelis Antoniou <pantelis.antoniou@gmail.com>
|
||||
M: Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -6909,7 +6908,7 @@ F: drivers/clk/clk-versaclock5.c
|
||||
|
||||
IEEE 802.15.4 SUBSYSTEM
|
||||
M: Alexander Aring <alex.aring@gmail.com>
|
||||
M: Stefan Schmidt <stefan@osg.samsung.com>
|
||||
M: Stefan Schmidt <stefan@datenfreihafen.org>
|
||||
L: linux-wpan@vger.kernel.org
|
||||
W: http://wpan.cakelab.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git
|
||||
@ -8629,7 +8628,7 @@ MARVELL MWIFIEX WIRELESS DRIVER
|
||||
M: Amitkumar Karwar <amitkarwar@gmail.com>
|
||||
M: Nishant Sarmukadam <nishants@marvell.com>
|
||||
M: Ganapathi Bhat <gbhat@marvell.com>
|
||||
M: Xinming Hu <huxm@marvell.com>
|
||||
M: Xinming Hu <huxinming820@gmail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/marvell/mwifiex/
|
||||
|
@ -63,8 +63,6 @@
|
||||
|
||||
#define AQ_CFG_NAPI_WEIGHT 64U
|
||||
|
||||
#define AQ_CFG_MULTICAST_ADDRESS_MAX 32U
|
||||
|
||||
/*#define AQ_CFG_MAC_ADDR_PERMANENT {0x30, 0x0E, 0xE3, 0x12, 0x34, 0x56}*/
|
||||
|
||||
#define AQ_NIC_FC_OFF 0U
|
||||
|
@ -98,6 +98,8 @@ struct aq_stats_s {
|
||||
#define AQ_HW_MEDIA_TYPE_TP 1U
|
||||
#define AQ_HW_MEDIA_TYPE_FIBRE 2U
|
||||
|
||||
#define AQ_HW_MULTICAST_ADDRESS_MAX 32U
|
||||
|
||||
struct aq_hw_s {
|
||||
atomic_t flags;
|
||||
u8 rbl_enabled:1;
|
||||
@ -177,7 +179,7 @@ struct aq_hw_ops {
|
||||
unsigned int packet_filter);
|
||||
|
||||
int (*hw_multicast_list_set)(struct aq_hw_s *self,
|
||||
u8 ar_mac[AQ_CFG_MULTICAST_ADDRESS_MAX]
|
||||
u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX]
|
||||
[ETH_ALEN],
|
||||
u32 count);
|
||||
|
||||
|
@ -135,17 +135,10 @@ static int aq_ndev_set_mac_address(struct net_device *ndev, void *addr)
|
||||
static void aq_ndev_set_multicast_settings(struct net_device *ndev)
|
||||
{
|
||||
struct aq_nic_s *aq_nic = netdev_priv(ndev);
|
||||
int err = 0;
|
||||
|
||||
err = aq_nic_set_packet_filter(aq_nic, ndev->flags);
|
||||
if (err < 0)
|
||||
return;
|
||||
aq_nic_set_packet_filter(aq_nic, ndev->flags);
|
||||
|
||||
if (netdev_mc_count(ndev)) {
|
||||
err = aq_nic_set_multicast_list(aq_nic, ndev);
|
||||
if (err < 0)
|
||||
return;
|
||||
}
|
||||
aq_nic_set_multicast_list(aq_nic, ndev);
|
||||
}
|
||||
|
||||
static const struct net_device_ops aq_ndev_ops = {
|
||||
|
@ -563,34 +563,41 @@ int aq_nic_set_packet_filter(struct aq_nic_s *self, unsigned int flags)
|
||||
|
||||
int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
|
||||
{
|
||||
unsigned int packet_filter = self->packet_filter;
|
||||
struct netdev_hw_addr *ha = NULL;
|
||||
unsigned int i = 0U;
|
||||
|
||||
self->mc_list.count = 0U;
|
||||
|
||||
netdev_for_each_mc_addr(ha, ndev) {
|
||||
ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
||||
++self->mc_list.count;
|
||||
|
||||
if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) {
|
||||
/* Number of filters is too big: atlantic does not support this.
|
||||
* Force all multi filter to support this.
|
||||
* With this we disable all UC filters and setup "all pass"
|
||||
* multicast mask
|
||||
*/
|
||||
self->packet_filter |= IFF_ALLMULTI;
|
||||
self->aq_nic_cfg.mc_list_count = 0;
|
||||
return self->aq_hw_ops->hw_packet_filter_set(self->aq_hw,
|
||||
self->packet_filter);
|
||||
self->mc_list.count = 0;
|
||||
if (netdev_uc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) {
|
||||
packet_filter |= IFF_PROMISC;
|
||||
} else {
|
||||
return self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
|
||||
self->mc_list.ar,
|
||||
self->mc_list.count);
|
||||
netdev_for_each_uc_addr(ha, ndev) {
|
||||
ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
||||
|
||||
if (i >= AQ_HW_MULTICAST_ADDRESS_MAX)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i + netdev_mc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) {
|
||||
packet_filter |= IFF_ALLMULTI;
|
||||
} else {
|
||||
netdev_for_each_mc_addr(ha, ndev) {
|
||||
ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
||||
|
||||
if (i >= AQ_HW_MULTICAST_ADDRESS_MAX)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i > 0 && i < AQ_HW_MULTICAST_ADDRESS_MAX) {
|
||||
packet_filter |= IFF_MULTICAST;
|
||||
self->mc_list.count = i;
|
||||
self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
|
||||
self->mc_list.ar,
|
||||
self->mc_list.count);
|
||||
}
|
||||
return aq_nic_set_packet_filter(self, packet_filter);
|
||||
}
|
||||
|
||||
int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
|
||||
|
@ -75,7 +75,7 @@ struct aq_nic_s {
|
||||
struct aq_hw_link_status_s link_status;
|
||||
struct {
|
||||
u32 count;
|
||||
u8 ar[AQ_CFG_MULTICAST_ADDRESS_MAX][ETH_ALEN];
|
||||
u8 ar[AQ_HW_MULTICAST_ADDRESS_MAX][ETH_ALEN];
|
||||
} mc_list;
|
||||
|
||||
struct pci_dev *pdev;
|
||||
|
@ -765,7 +765,7 @@ static int hw_atl_a0_hw_packet_filter_set(struct aq_hw_s *self,
|
||||
|
||||
static int hw_atl_a0_hw_multicast_list_set(struct aq_hw_s *self,
|
||||
u8 ar_mac
|
||||
[AQ_CFG_MULTICAST_ADDRESS_MAX]
|
||||
[AQ_HW_MULTICAST_ADDRESS_MAX]
|
||||
[ETH_ALEN],
|
||||
u32 count)
|
||||
{
|
||||
|
@ -784,7 +784,7 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,
|
||||
|
||||
static int hw_atl_b0_hw_multicast_list_set(struct aq_hw_s *self,
|
||||
u8 ar_mac
|
||||
[AQ_CFG_MULTICAST_ADDRESS_MAX]
|
||||
[AQ_HW_MULTICAST_ADDRESS_MAX]
|
||||
[ETH_ALEN],
|
||||
u32 count)
|
||||
{
|
||||
@ -812,7 +812,7 @@ static int hw_atl_b0_hw_multicast_list_set(struct aq_hw_s *self,
|
||||
|
||||
hw_atl_rpfl2_uc_flr_en_set(self,
|
||||
(self->aq_nic_cfg->is_mc_list_enabled),
|
||||
HW_ATL_B0_MAC_MIN + i);
|
||||
HW_ATL_B0_MAC_MIN + i);
|
||||
}
|
||||
|
||||
err = aq_hw_err_from_flags(self);
|
||||
|
@ -1946,8 +1946,8 @@ static int bcm_sysport_open(struct net_device *dev)
|
||||
if (!priv->is_lite)
|
||||
priv->crc_fwd = !!(umac_readl(priv, UMAC_CMD) & CMD_CRC_FWD);
|
||||
else
|
||||
priv->crc_fwd = !!(gib_readl(priv, GIB_CONTROL) &
|
||||
GIB_FCS_STRIP);
|
||||
priv->crc_fwd = !((gib_readl(priv, GIB_CONTROL) &
|
||||
GIB_FCS_STRIP) >> GIB_FCS_STRIP_SHIFT);
|
||||
|
||||
phydev = of_phy_connect(dev, priv->phy_dn, bcm_sysport_adj_link,
|
||||
0, priv->phy_interface);
|
||||
|
@ -278,7 +278,8 @@ struct bcm_rsb {
|
||||
#define GIB_GTX_CLK_EXT_CLK (0 << GIB_GTX_CLK_SEL_SHIFT)
|
||||
#define GIB_GTX_CLK_125MHZ (1 << GIB_GTX_CLK_SEL_SHIFT)
|
||||
#define GIB_GTX_CLK_250MHZ (2 << GIB_GTX_CLK_SEL_SHIFT)
|
||||
#define GIB_FCS_STRIP (1 << 6)
|
||||
#define GIB_FCS_STRIP_SHIFT 6
|
||||
#define GIB_FCS_STRIP (1 << GIB_FCS_STRIP_SHIFT)
|
||||
#define GIB_LCL_LOOP_EN (1 << 7)
|
||||
#define GIB_LCL_LOOP_TXEN (1 << 8)
|
||||
#define GIB_RMT_LOOP_EN (1 << 9)
|
||||
|
@ -5712,7 +5712,9 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
|
||||
}
|
||||
vnic->uc_filter_count = 1;
|
||||
|
||||
vnic->rx_mask = CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
|
||||
vnic->rx_mask = 0;
|
||||
if (bp->dev->flags & IFF_BROADCAST)
|
||||
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
|
||||
|
||||
if ((bp->dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
|
||||
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
|
||||
@ -5917,7 +5919,7 @@ unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
|
||||
return min_t(unsigned int, hw_resc->max_irqs, hw_resc->max_cp_rings);
|
||||
}
|
||||
|
||||
void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max_irqs)
|
||||
static void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max_irqs)
|
||||
{
|
||||
bp->hw_resc.max_irqs = max_irqs;
|
||||
}
|
||||
@ -6888,7 +6890,7 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
|
||||
rc = bnxt_request_irq(bp);
|
||||
if (rc) {
|
||||
netdev_err(bp->dev, "bnxt_request_irq err: %x\n", rc);
|
||||
goto open_err;
|
||||
goto open_err_irq;
|
||||
}
|
||||
}
|
||||
|
||||
@ -6928,6 +6930,8 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
|
||||
open_err:
|
||||
bnxt_debug_dev_exit(bp);
|
||||
bnxt_disable_napi(bp);
|
||||
|
||||
open_err_irq:
|
||||
bnxt_del_napi(bp);
|
||||
|
||||
open_err_free_mem:
|
||||
@ -7214,13 +7218,16 @@ static void bnxt_set_rx_mode(struct net_device *dev)
|
||||
|
||||
mask &= ~(CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS |
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_MCAST |
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST);
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST |
|
||||
CFA_L2_SET_RX_MASK_REQ_MASK_BCAST);
|
||||
|
||||
if ((dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
|
||||
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
|
||||
|
||||
uc_update = bnxt_uc_list_updated(bp);
|
||||
|
||||
if (dev->flags & IFF_BROADCAST)
|
||||
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
|
||||
if (dev->flags & IFF_ALLMULTI) {
|
||||
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
|
||||
vnic->mc_list_count = 0;
|
||||
@ -8502,11 +8509,11 @@ int bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, bool shared)
|
||||
int rx, tx, cp;
|
||||
|
||||
_bnxt_get_max_rings(bp, &rx, &tx, &cp);
|
||||
*max_rx = rx;
|
||||
*max_tx = tx;
|
||||
if (!rx || !tx || !cp)
|
||||
return -ENOMEM;
|
||||
|
||||
*max_rx = rx;
|
||||
*max_tx = tx;
|
||||
return bnxt_trim_rings(bp, max_rx, max_tx, cp, shared);
|
||||
}
|
||||
|
||||
@ -8520,8 +8527,11 @@ static int bnxt_get_dflt_rings(struct bnxt *bp, int *max_rx, int *max_tx,
|
||||
/* Not enough rings, try disabling agg rings. */
|
||||
bp->flags &= ~BNXT_FLAG_AGG_RINGS;
|
||||
rc = bnxt_get_max_rings(bp, max_rx, max_tx, shared);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
/* set BNXT_FLAG_AGG_RINGS back for consistency */
|
||||
bp->flags |= BNXT_FLAG_AGG_RINGS;
|
||||
return rc;
|
||||
}
|
||||
bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
|
||||
bp->dev->hw_features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW);
|
||||
bp->dev->features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW);
|
||||
|
@ -1470,7 +1470,6 @@ void bnxt_set_max_func_stat_ctxs(struct bnxt *bp, unsigned int max);
|
||||
unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp);
|
||||
void bnxt_set_max_func_cp_rings(struct bnxt *bp, unsigned int max);
|
||||
unsigned int bnxt_get_max_func_irqs(struct bnxt *bp);
|
||||
void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max);
|
||||
int bnxt_get_avail_msix(struct bnxt *bp, int num);
|
||||
int bnxt_reserve_rings(struct bnxt *bp);
|
||||
void bnxt_tx_disable(struct bnxt *bp);
|
||||
|
@ -27,6 +27,15 @@
|
||||
#define BNXT_FID_INVALID 0xffff
|
||||
#define VLAN_TCI(vid, prio) ((vid) | ((prio) << VLAN_PRIO_SHIFT))
|
||||
|
||||
#define is_vlan_pcp_wildcarded(vlan_tci_mask) \
|
||||
((ntohs(vlan_tci_mask) & VLAN_PRIO_MASK) == 0x0000)
|
||||
#define is_vlan_pcp_exactmatch(vlan_tci_mask) \
|
||||
((ntohs(vlan_tci_mask) & VLAN_PRIO_MASK) == VLAN_PRIO_MASK)
|
||||
#define is_vlan_pcp_zero(vlan_tci) \
|
||||
((ntohs(vlan_tci) & VLAN_PRIO_MASK) == 0x0000)
|
||||
#define is_vid_exactmatch(vlan_tci_mask) \
|
||||
((ntohs(vlan_tci_mask) & VLAN_VID_MASK) == VLAN_VID_MASK)
|
||||
|
||||
/* Return the dst fid of the func for flow forwarding
|
||||
* For PFs: src_fid is the fid of the PF
|
||||
* For VF-reps: src_fid the fid of the VF
|
||||
@ -389,6 +398,21 @@ static bool is_exactmatch(void *mask, int len)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_vlan_tci_allowed(__be16 vlan_tci_mask,
|
||||
__be16 vlan_tci)
|
||||
{
|
||||
/* VLAN priority must be either exactly zero or fully wildcarded and
|
||||
* VLAN id must be exact match.
|
||||
*/
|
||||
if (is_vid_exactmatch(vlan_tci_mask) &&
|
||||
((is_vlan_pcp_exactmatch(vlan_tci_mask) &&
|
||||
is_vlan_pcp_zero(vlan_tci)) ||
|
||||
is_vlan_pcp_wildcarded(vlan_tci_mask)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool bits_set(void *key, int len)
|
||||
{
|
||||
const u8 *p = key;
|
||||
@ -803,9 +827,9 @@ static bool bnxt_tc_can_offload(struct bnxt *bp, struct bnxt_tc_flow *flow)
|
||||
/* Currently VLAN fields cannot be partial wildcard */
|
||||
if (bits_set(&flow->l2_key.inner_vlan_tci,
|
||||
sizeof(flow->l2_key.inner_vlan_tci)) &&
|
||||
!is_exactmatch(&flow->l2_mask.inner_vlan_tci,
|
||||
sizeof(flow->l2_mask.inner_vlan_tci))) {
|
||||
netdev_info(bp->dev, "Wildcard match unsupported for VLAN TCI\n");
|
||||
!is_vlan_tci_allowed(flow->l2_mask.inner_vlan_tci,
|
||||
flow->l2_key.inner_vlan_tci)) {
|
||||
netdev_info(bp->dev, "Unsupported VLAN TCI\n");
|
||||
return false;
|
||||
}
|
||||
if (bits_set(&flow->l2_key.inner_vlan_tpid,
|
||||
|
@ -169,7 +169,6 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id,
|
||||
edev->ulp_tbl[ulp_id].msix_requested = avail_msix;
|
||||
}
|
||||
bnxt_fill_msix_vecs(bp, ent);
|
||||
bnxt_set_max_func_irqs(bp, bnxt_get_max_func_irqs(bp) - avail_msix);
|
||||
bnxt_set_max_func_cp_rings(bp, max_cp_rings - avail_msix);
|
||||
edev->flags |= BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
return avail_msix;
|
||||
@ -192,7 +191,6 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id)
|
||||
msix_requested = edev->ulp_tbl[ulp_id].msix_requested;
|
||||
bnxt_set_max_func_cp_rings(bp, max_cp_rings + msix_requested);
|
||||
edev->ulp_tbl[ulp_id].msix_requested = 0;
|
||||
bnxt_set_max_func_irqs(bp, bnxt_get_max_func_irqs(bp) + msix_requested);
|
||||
edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
if (netif_running(dev)) {
|
||||
bnxt_close_nic(bp, true, false);
|
||||
|
@ -6,11 +6,15 @@
|
||||
* Copyright (C) 2004 Sun Microsystems Inc.
|
||||
* Copyright (C) 2005-2016 Broadcom Corporation.
|
||||
* Copyright (C) 2016-2017 Broadcom Limited.
|
||||
* Copyright (C) 2018 Broadcom. All Rights Reserved. The term "Broadcom"
|
||||
* refers to Broadcom Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Firmware is:
|
||||
* Derived from proprietary unpublished source code,
|
||||
* Copyright (C) 2000-2016 Broadcom Corporation.
|
||||
* Copyright (C) 2016-2017 Broadcom Ltd.
|
||||
* Copyright (C) 2018 Broadcom. All Rights Reserved. The term "Broadcom"
|
||||
* refers to Broadcom Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission is hereby granted for the distribution of this firmware
|
||||
* data in hexadecimal or equivalent format, provided this copyright
|
||||
@ -9290,6 +9294,15 @@ static int tg3_chip_reset(struct tg3 *tp)
|
||||
|
||||
tg3_restore_clk(tp);
|
||||
|
||||
/* Increase the core clock speed to fix tx timeout issue for 5762
|
||||
* with 100Mbps link speed.
|
||||
*/
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_5762) {
|
||||
val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
|
||||
tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val |
|
||||
TG3_CPMU_MAC_ORIDE_ENABLE);
|
||||
}
|
||||
|
||||
/* Reprobe ASF enable state. */
|
||||
tg3_flag_clear(tp, ENABLE_ASF);
|
||||
tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK |
|
||||
|
@ -7,6 +7,8 @@
|
||||
* Copyright (C) 2004 Sun Microsystems Inc.
|
||||
* Copyright (C) 2007-2016 Broadcom Corporation.
|
||||
* Copyright (C) 2016-2017 Broadcom Limited.
|
||||
* Copyright (C) 2018 Broadcom. All Rights Reserved. The term "Broadcom"
|
||||
* refers to Broadcom Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#ifndef _T3_H
|
||||
|
@ -166,6 +166,7 @@
|
||||
#define GEM_DCFG6 0x0294 /* Design Config 6 */
|
||||
#define GEM_DCFG7 0x0298 /* Design Config 7 */
|
||||
#define GEM_DCFG8 0x029C /* Design Config 8 */
|
||||
#define GEM_DCFG10 0x02A4 /* Design Config 10 */
|
||||
|
||||
#define GEM_TXBDCTRL 0x04cc /* TX Buffer Descriptor control register */
|
||||
#define GEM_RXBDCTRL 0x04d0 /* RX Buffer Descriptor control register */
|
||||
@ -490,6 +491,12 @@
|
||||
#define GEM_SCR2CMP_OFFSET 0
|
||||
#define GEM_SCR2CMP_SIZE 8
|
||||
|
||||
/* Bitfields in DCFG10 */
|
||||
#define GEM_TXBD_RDBUFF_OFFSET 12
|
||||
#define GEM_TXBD_RDBUFF_SIZE 4
|
||||
#define GEM_RXBD_RDBUFF_OFFSET 8
|
||||
#define GEM_RXBD_RDBUFF_SIZE 4
|
||||
|
||||
/* Bitfields in TISUBN */
|
||||
#define GEM_SUBNSINCR_OFFSET 0
|
||||
#define GEM_SUBNSINCR_SIZE 16
|
||||
@ -635,6 +642,7 @@
|
||||
#define MACB_CAPS_USRIO_DISABLED 0x00000010
|
||||
#define MACB_CAPS_JUMBO 0x00000020
|
||||
#define MACB_CAPS_GEM_HAS_PTP 0x00000040
|
||||
#define MACB_CAPS_BD_RD_PREFETCH 0x00000080
|
||||
#define MACB_CAPS_FIFO_MODE 0x10000000
|
||||
#define MACB_CAPS_GIGABIT_MODE_AVAILABLE 0x20000000
|
||||
#define MACB_CAPS_SG_DISABLED 0x40000000
|
||||
@ -1203,6 +1211,9 @@ struct macb {
|
||||
unsigned int max_tuples;
|
||||
|
||||
struct tasklet_struct hresp_err_tasklet;
|
||||
|
||||
int rx_bd_rd_prefetch;
|
||||
int tx_bd_rd_prefetch;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MACB_USE_HWSTAMP
|
||||
|
@ -1811,23 +1811,25 @@ static void macb_free_consistent(struct macb *bp)
|
||||
{
|
||||
struct macb_queue *queue;
|
||||
unsigned int q;
|
||||
int size;
|
||||
|
||||
queue = &bp->queues[0];
|
||||
bp->macbgem_ops.mog_free_rx_buffers(bp);
|
||||
if (queue->rx_ring) {
|
||||
dma_free_coherent(&bp->pdev->dev, RX_RING_BYTES(bp),
|
||||
queue->rx_ring, queue->rx_ring_dma);
|
||||
queue->rx_ring = NULL;
|
||||
}
|
||||
|
||||
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
|
||||
kfree(queue->tx_skb);
|
||||
queue->tx_skb = NULL;
|
||||
if (queue->tx_ring) {
|
||||
dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES(bp),
|
||||
size = TX_RING_BYTES(bp) + bp->tx_bd_rd_prefetch;
|
||||
dma_free_coherent(&bp->pdev->dev, size,
|
||||
queue->tx_ring, queue->tx_ring_dma);
|
||||
queue->tx_ring = NULL;
|
||||
}
|
||||
if (queue->rx_ring) {
|
||||
size = RX_RING_BYTES(bp) + bp->rx_bd_rd_prefetch;
|
||||
dma_free_coherent(&bp->pdev->dev, size,
|
||||
queue->rx_ring, queue->rx_ring_dma);
|
||||
queue->rx_ring = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1874,7 +1876,7 @@ static int macb_alloc_consistent(struct macb *bp)
|
||||
int size;
|
||||
|
||||
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
|
||||
size = TX_RING_BYTES(bp);
|
||||
size = TX_RING_BYTES(bp) + bp->tx_bd_rd_prefetch;
|
||||
queue->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
|
||||
&queue->tx_ring_dma,
|
||||
GFP_KERNEL);
|
||||
@ -1890,7 +1892,7 @@ static int macb_alloc_consistent(struct macb *bp)
|
||||
if (!queue->tx_skb)
|
||||
goto out_err;
|
||||
|
||||
size = RX_RING_BYTES(bp);
|
||||
size = RX_RING_BYTES(bp) + bp->rx_bd_rd_prefetch;
|
||||
queue->rx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
|
||||
&queue->rx_ring_dma, GFP_KERNEL);
|
||||
if (!queue->rx_ring)
|
||||
@ -3797,7 +3799,7 @@ static const struct macb_config np4_config = {
|
||||
static const struct macb_config zynqmp_config = {
|
||||
.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
|
||||
MACB_CAPS_JUMBO |
|
||||
MACB_CAPS_GEM_HAS_PTP,
|
||||
MACB_CAPS_GEM_HAS_PTP | MACB_CAPS_BD_RD_PREFETCH,
|
||||
.dma_burst_length = 16,
|
||||
.clk_init = macb_clk_init,
|
||||
.init = macb_init,
|
||||
@ -3858,7 +3860,7 @@ static int macb_probe(struct platform_device *pdev)
|
||||
void __iomem *mem;
|
||||
const char *mac;
|
||||
struct macb *bp;
|
||||
int err;
|
||||
int err, val;
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
mem = devm_ioremap_resource(&pdev->dev, regs);
|
||||
@ -3947,6 +3949,18 @@ static int macb_probe(struct platform_device *pdev)
|
||||
else
|
||||
dev->max_mtu = ETH_DATA_LEN;
|
||||
|
||||
if (bp->caps & MACB_CAPS_BD_RD_PREFETCH) {
|
||||
val = GEM_BFEXT(RXBD_RDBUFF, gem_readl(bp, DCFG10));
|
||||
if (val)
|
||||
bp->rx_bd_rd_prefetch = (2 << (val - 1)) *
|
||||
macb_dma_desc_get_size(bp);
|
||||
|
||||
val = GEM_BFEXT(TXBD_RDBUFF, gem_readl(bp, DCFG10));
|
||||
if (val)
|
||||
bp->tx_bd_rd_prefetch = (2 << (val - 1)) *
|
||||
macb_dma_desc_get_size(bp);
|
||||
}
|
||||
|
||||
mac = of_get_mac_address(np);
|
||||
if (mac) {
|
||||
ether_addr_copy(bp->dev->dev_addr, mac);
|
||||
|
@ -15,7 +15,7 @@ if NET_VENDOR_CAVIUM
|
||||
|
||||
config THUNDER_NIC_PF
|
||||
tristate "Thunder Physical function driver"
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
select THUNDER_NIC_BGX
|
||||
---help---
|
||||
This driver supports Thunder's NIC physical function.
|
||||
@ -28,13 +28,13 @@ config THUNDER_NIC_PF
|
||||
config THUNDER_NIC_VF
|
||||
tristate "Thunder Virtual function driver"
|
||||
imply CAVIUM_PTP
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
---help---
|
||||
This driver supports Thunder's NIC virtual function
|
||||
|
||||
config THUNDER_NIC_BGX
|
||||
tristate "Thunder MAC interface driver (BGX)"
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
select PHYLIB
|
||||
select MDIO_THUNDER
|
||||
select THUNDER_NIC_RGX
|
||||
@ -44,7 +44,7 @@ config THUNDER_NIC_BGX
|
||||
|
||||
config THUNDER_NIC_RGX
|
||||
tristate "Thunder MAC interface driver (RGX)"
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
select PHYLIB
|
||||
select MDIO_THUNDER
|
||||
---help---
|
||||
@ -53,7 +53,7 @@ config THUNDER_NIC_RGX
|
||||
|
||||
config CAVIUM_PTP
|
||||
tristate "Cavium PTP coprocessor as PTP clock"
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
imply PTP_1588_CLOCK
|
||||
default y
|
||||
---help---
|
||||
@ -65,7 +65,7 @@ config CAVIUM_PTP
|
||||
|
||||
config LIQUIDIO
|
||||
tristate "Cavium LiquidIO support"
|
||||
depends on 64BIT
|
||||
depends on 64BIT && PCI
|
||||
depends on MAY_USE_DEVLINK
|
||||
imply PTP_1588_CLOCK
|
||||
select FW_LOADER
|
||||
|
@ -91,6 +91,9 @@ static int octeon_console_debug_enabled(u32 console)
|
||||
*/
|
||||
#define LIO_SYNC_OCTEON_TIME_INTERVAL_MS 60000
|
||||
|
||||
/* time to wait for possible in-flight requests in milliseconds */
|
||||
#define WAIT_INFLIGHT_REQUEST msecs_to_jiffies(1000)
|
||||
|
||||
struct lio_trusted_vf_ctx {
|
||||
struct completion complete;
|
||||
int status;
|
||||
@ -259,7 +262,7 @@ static inline void pcierror_quiesce_device(struct octeon_device *oct)
|
||||
force_io_queues_off(oct);
|
||||
|
||||
/* To allow for in-flight requests */
|
||||
schedule_timeout_uninterruptible(100);
|
||||
schedule_timeout_uninterruptible(WAIT_INFLIGHT_REQUEST);
|
||||
|
||||
if (wait_for_pending_requests(oct))
|
||||
dev_err(&oct->pci_dev->dev, "There were pending requests\n");
|
||||
|
@ -643,13 +643,21 @@ static int octeon_mgmt_set_mac_address(struct net_device *netdev, void *addr)
|
||||
static int octeon_mgmt_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
{
|
||||
struct octeon_mgmt *p = netdev_priv(netdev);
|
||||
int size_without_fcs = new_mtu + OCTEON_MGMT_RX_HEADROOM;
|
||||
int max_packet = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||
|
||||
netdev->mtu = new_mtu;
|
||||
|
||||
cvmx_write_csr(p->agl + AGL_GMX_RX_FRM_MAX, size_without_fcs);
|
||||
/* HW lifts the limit if the frame is VLAN tagged
|
||||
* (+4 bytes per each tag, up to two tags)
|
||||
*/
|
||||
cvmx_write_csr(p->agl + AGL_GMX_RX_FRM_MAX, max_packet);
|
||||
/* Set the hardware to truncate packets larger than the MTU. The jabber
|
||||
* register must be set to a multiple of 8 bytes, so round up. JABBER is
|
||||
* an unconditional limit, so we need to account for two possible VLAN
|
||||
* tags.
|
||||
*/
|
||||
cvmx_write_csr(p->agl + AGL_GMX_RX_JABBER,
|
||||
(size_without_fcs + 7) & 0xfff8);
|
||||
(max_packet + 7 + VLAN_HLEN * 2) & 0xfff8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/nospec.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "cxgb3_ioctl.h"
|
||||
@ -2268,6 +2269,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
|
||||
if (t.qset_idx >= nqsets)
|
||||
return -EINVAL;
|
||||
t.qset_idx = array_index_nospec(t.qset_idx, nqsets);
|
||||
|
||||
q = &adapter->params.sge.qset[q1 + t.qset_idx];
|
||||
t.rspq_size = q->rspq_size;
|
||||
|
@ -8702,7 +8702,7 @@ static int t4_get_flash_params(struct adapter *adap)
|
||||
};
|
||||
|
||||
unsigned int part, manufacturer;
|
||||
unsigned int density, size;
|
||||
unsigned int density, size = 0;
|
||||
u32 flashid = 0;
|
||||
int ret;
|
||||
|
||||
@ -8772,11 +8772,6 @@ static int t4_get_flash_params(struct adapter *adap)
|
||||
case 0x22: /* 256MB */
|
||||
size = 1 << 28;
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(adap->pdev_dev, "Micron Flash Part has bad size, ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -8792,10 +8787,6 @@ static int t4_get_flash_params(struct adapter *adap)
|
||||
case 0x17: /* 64MB */
|
||||
size = 1 << 26;
|
||||
break;
|
||||
default:
|
||||
dev_err(adap->pdev_dev, "ISSI Flash Part has bad size, ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -8811,10 +8802,6 @@ static int t4_get_flash_params(struct adapter *adap)
|
||||
case 0x18: /* 16MB */
|
||||
size = 1 << 24;
|
||||
break;
|
||||
default:
|
||||
dev_err(adap->pdev_dev, "Macronix Flash Part has bad size, ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -8830,17 +8817,21 @@ static int t4_get_flash_params(struct adapter *adap)
|
||||
case 0x18: /* 16MB */
|
||||
size = 1 << 24;
|
||||
break;
|
||||
default:
|
||||
dev_err(adap->pdev_dev, "Winbond Flash Part has bad size, ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
dev_err(adap->pdev_dev, "Unsupported Flash Part, ID = %#x\n",
|
||||
flashid);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* If we didn't recognize the FLASH part, that's no real issue: the
|
||||
* Hardware/Software contract says that Hardware will _*ALWAYS*_
|
||||
* use a FLASH part which is at least 4MB in size and has 64KB
|
||||
* sectors. The unrecognized FLASH part is likely to be much larger
|
||||
* than 4MB, but that's all we really need.
|
||||
*/
|
||||
if (size == 0) {
|
||||
dev_warn(adap->pdev_dev, "Unknown Flash Part, ID = %#x, assuming 4MB\n",
|
||||
flashid);
|
||||
size = 1 << 22;
|
||||
}
|
||||
|
||||
/* Store decoded Flash size and fall through into vetting code. */
|
||||
|
@ -329,7 +329,8 @@ static void replenish_rx_pool(struct ibmvnic_adapter *adapter,
|
||||
return;
|
||||
|
||||
failure:
|
||||
dev_info(dev, "replenish pools failure\n");
|
||||
if (lpar_rc != H_PARAMETER && lpar_rc != H_CLOSED)
|
||||
dev_err_ratelimited(dev, "rx: replenish packet buffer failed\n");
|
||||
pool->free_map[pool->next_free] = index;
|
||||
pool->rx_buff[index].skb = NULL;
|
||||
|
||||
@ -1617,7 +1618,8 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
&tx_crq);
|
||||
}
|
||||
if (lpar_rc != H_SUCCESS) {
|
||||
dev_err(dev, "tx failed with code %ld\n", lpar_rc);
|
||||
if (lpar_rc != H_CLOSED && lpar_rc != H_PARAMETER)
|
||||
dev_err_ratelimited(dev, "tx: send failed\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_buff->skb = NULL;
|
||||
|
||||
@ -1825,8 +1827,8 @@ static int do_reset(struct ibmvnic_adapter *adapter,
|
||||
|
||||
rc = ibmvnic_login(netdev);
|
||||
if (rc) {
|
||||
adapter->state = VNIC_PROBED;
|
||||
return 0;
|
||||
adapter->state = reset_state;
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM ||
|
||||
@ -3204,6 +3206,25 @@ static union ibmvnic_crq *ibmvnic_next_crq(struct ibmvnic_adapter *adapter)
|
||||
return crq;
|
||||
}
|
||||
|
||||
static void print_subcrq_error(struct device *dev, int rc, const char *func)
|
||||
{
|
||||
switch (rc) {
|
||||
case H_PARAMETER:
|
||||
dev_warn_ratelimited(dev,
|
||||
"%s failed: Send request is malformed or adapter failover pending. (rc=%d)\n",
|
||||
func, rc);
|
||||
break;
|
||||
case H_CLOSED:
|
||||
dev_warn_ratelimited(dev,
|
||||
"%s failed: Backing queue closed. Adapter is down or failover pending. (rc=%d)\n",
|
||||
func, rc);
|
||||
break;
|
||||
default:
|
||||
dev_err_ratelimited(dev, "%s failed: (rc=%d)\n", func, rc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int send_subcrq(struct ibmvnic_adapter *adapter, u64 remote_handle,
|
||||
union sub_crq *sub_crq)
|
||||
{
|
||||
@ -3230,11 +3251,8 @@ static int send_subcrq(struct ibmvnic_adapter *adapter, u64 remote_handle,
|
||||
cpu_to_be64(u64_crq[2]),
|
||||
cpu_to_be64(u64_crq[3]));
|
||||
|
||||
if (rc) {
|
||||
if (rc == H_CLOSED)
|
||||
dev_warn(dev, "CRQ Queue closed\n");
|
||||
dev_err(dev, "Send error (rc=%d)\n", rc);
|
||||
}
|
||||
if (rc)
|
||||
print_subcrq_error(dev, rc, __func__);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -3252,11 +3270,8 @@ static int send_subcrq_indirect(struct ibmvnic_adapter *adapter,
|
||||
cpu_to_be64(remote_handle),
|
||||
ioba, num_entries);
|
||||
|
||||
if (rc) {
|
||||
if (rc == H_CLOSED)
|
||||
dev_warn(dev, "CRQ Queue closed\n");
|
||||
dev_err(dev, "Send (indirect) error (rc=%d)\n", rc);
|
||||
}
|
||||
if (rc)
|
||||
print_subcrq_error(dev, rc, __func__);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -1871,7 +1871,12 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
||||
if (enable_addr != 0)
|
||||
rar_high |= IXGBE_RAH_AV;
|
||||
|
||||
/* Record lower 32 bits of MAC address and then make
|
||||
* sure that write is flushed to hardware before writing
|
||||
* the upper 16 bits and setting the valid bit.
|
||||
*/
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
|
||||
return 0;
|
||||
@ -1903,8 +1908,13 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
|
||||
/* Clear the address valid bit and upper 16 bits of the address
|
||||
* before clearing the lower bits. This way we aren't updating
|
||||
* a live filter.
|
||||
*/
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
|
||||
|
||||
/* clear VMDq pool/queue selection for this RAR */
|
||||
hw->mac.ops.clear_vmdq(hw, index, IXGBE_CLEAR_VMDQ_ALL);
|
||||
|
@ -839,7 +839,7 @@ int ixgbe_ipsec_tx(struct ixgbe_ring *tx_ring,
|
||||
}
|
||||
|
||||
itd->sa_idx = xs->xso.offload_handle - IXGBE_IPSEC_BASE_TX_INDEX;
|
||||
if (unlikely(itd->sa_idx > IXGBE_IPSEC_MAX_SA_COUNT)) {
|
||||
if (unlikely(itd->sa_idx >= IXGBE_IPSEC_MAX_SA_COUNT)) {
|
||||
netdev_err(tx_ring->netdev, "%s: bad sa_idx=%d handle=%lu\n",
|
||||
__func__, itd->sa_idx, xs->xso.offload_handle);
|
||||
return 0;
|
||||
|
@ -474,10 +474,10 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
|
||||
{
|
||||
const struct mlx4_en_frag_info *frag_info = priv->frag_info;
|
||||
unsigned int truesize = 0;
|
||||
bool release = true;
|
||||
int nr, frag_size;
|
||||
struct page *page;
|
||||
dma_addr_t dma;
|
||||
bool release;
|
||||
|
||||
/* Collect used fragments while replacing them in the HW descriptors */
|
||||
for (nr = 0;; frags++) {
|
||||
@ -500,7 +500,11 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
|
||||
release = page_count(page) != 1 ||
|
||||
page_is_pfmemalloc(page) ||
|
||||
page_to_nid(page) != numa_mem_id();
|
||||
} else {
|
||||
} else if (!priv->rx_headroom) {
|
||||
/* rx_headroom for non XDP setup is always 0.
|
||||
* When XDP is set, the above condition will
|
||||
* guarantee page is always released.
|
||||
*/
|
||||
u32 sz_align = ALIGN(frag_size, SMP_CACHE_BYTES);
|
||||
|
||||
frags->page_offset += sz_align;
|
||||
|
@ -4756,6 +4756,12 @@ static void mlxsw_sp_rt6_destroy(struct mlxsw_sp_rt6 *mlxsw_sp_rt6)
|
||||
kfree(mlxsw_sp_rt6);
|
||||
}
|
||||
|
||||
static bool mlxsw_sp_fib6_rt_can_mp(const struct fib6_info *rt)
|
||||
{
|
||||
/* RTF_CACHE routes are ignored */
|
||||
return (rt->fib6_flags & (RTF_GATEWAY | RTF_ADDRCONF)) == RTF_GATEWAY;
|
||||
}
|
||||
|
||||
static struct fib6_info *
|
||||
mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry)
|
||||
{
|
||||
@ -4765,11 +4771,11 @@ mlxsw_sp_fib6_entry_rt(const struct mlxsw_sp_fib6_entry *fib6_entry)
|
||||
|
||||
static struct mlxsw_sp_fib6_entry *
|
||||
mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node,
|
||||
const struct fib6_info *nrt, bool append)
|
||||
const struct fib6_info *nrt, bool replace)
|
||||
{
|
||||
struct mlxsw_sp_fib6_entry *fib6_entry;
|
||||
|
||||
if (!append)
|
||||
if (!mlxsw_sp_fib6_rt_can_mp(nrt) || replace)
|
||||
return NULL;
|
||||
|
||||
list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) {
|
||||
@ -4784,7 +4790,8 @@ mlxsw_sp_fib6_node_mp_entry_find(const struct mlxsw_sp_fib_node *fib_node,
|
||||
break;
|
||||
if (rt->fib6_metric < nrt->fib6_metric)
|
||||
continue;
|
||||
if (rt->fib6_metric == nrt->fib6_metric)
|
||||
if (rt->fib6_metric == nrt->fib6_metric &&
|
||||
mlxsw_sp_fib6_rt_can_mp(rt))
|
||||
return fib6_entry;
|
||||
if (rt->fib6_metric > nrt->fib6_metric)
|
||||
break;
|
||||
@ -5163,7 +5170,7 @@ static struct mlxsw_sp_fib6_entry *
|
||||
mlxsw_sp_fib6_node_entry_find(const struct mlxsw_sp_fib_node *fib_node,
|
||||
const struct fib6_info *nrt, bool replace)
|
||||
{
|
||||
struct mlxsw_sp_fib6_entry *fib6_entry;
|
||||
struct mlxsw_sp_fib6_entry *fib6_entry, *fallback = NULL;
|
||||
|
||||
list_for_each_entry(fib6_entry, &fib_node->entry_list, common.list) {
|
||||
struct fib6_info *rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
|
||||
@ -5172,13 +5179,18 @@ mlxsw_sp_fib6_node_entry_find(const struct mlxsw_sp_fib_node *fib_node,
|
||||
continue;
|
||||
if (rt->fib6_table->tb6_id != nrt->fib6_table->tb6_id)
|
||||
break;
|
||||
if (replace && rt->fib6_metric == nrt->fib6_metric)
|
||||
return fib6_entry;
|
||||
if (replace && rt->fib6_metric == nrt->fib6_metric) {
|
||||
if (mlxsw_sp_fib6_rt_can_mp(rt) ==
|
||||
mlxsw_sp_fib6_rt_can_mp(nrt))
|
||||
return fib6_entry;
|
||||
if (mlxsw_sp_fib6_rt_can_mp(nrt))
|
||||
fallback = fallback ?: fib6_entry;
|
||||
}
|
||||
if (rt->fib6_metric > nrt->fib6_metric)
|
||||
return fib6_entry;
|
||||
return fallback ?: fib6_entry;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return fallback;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -5304,8 +5316,7 @@ static void mlxsw_sp_fib6_entry_replace(struct mlxsw_sp *mlxsw_sp,
|
||||
}
|
||||
|
||||
static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
|
||||
struct fib6_info *rt, bool replace,
|
||||
bool append)
|
||||
struct fib6_info *rt, bool replace)
|
||||
{
|
||||
struct mlxsw_sp_fib6_entry *fib6_entry;
|
||||
struct mlxsw_sp_fib_node *fib_node;
|
||||
@ -5331,7 +5342,7 @@ static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
|
||||
/* Before creating a new entry, try to append route to an existing
|
||||
* multipath entry.
|
||||
*/
|
||||
fib6_entry = mlxsw_sp_fib6_node_mp_entry_find(fib_node, rt, append);
|
||||
fib6_entry = mlxsw_sp_fib6_node_mp_entry_find(fib_node, rt, replace);
|
||||
if (fib6_entry) {
|
||||
err = mlxsw_sp_fib6_entry_nexthop_add(mlxsw_sp, fib6_entry, rt);
|
||||
if (err)
|
||||
@ -5339,14 +5350,6 @@ static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We received an append event, yet did not find any route to
|
||||
* append to.
|
||||
*/
|
||||
if (WARN_ON(append)) {
|
||||
err = -EINVAL;
|
||||
goto err_fib6_entry_append;
|
||||
}
|
||||
|
||||
fib6_entry = mlxsw_sp_fib6_entry_create(mlxsw_sp, fib_node, rt);
|
||||
if (IS_ERR(fib6_entry)) {
|
||||
err = PTR_ERR(fib6_entry);
|
||||
@ -5364,7 +5367,6 @@ static int mlxsw_sp_router_fib6_add(struct mlxsw_sp *mlxsw_sp,
|
||||
err_fib6_node_entry_link:
|
||||
mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry);
|
||||
err_fib6_entry_create:
|
||||
err_fib6_entry_append:
|
||||
err_fib6_entry_nexthop_add:
|
||||
mlxsw_sp_fib_node_put(mlxsw_sp, fib_node);
|
||||
return err;
|
||||
@ -5715,7 +5717,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
|
||||
struct mlxsw_sp_fib_event_work *fib_work =
|
||||
container_of(work, struct mlxsw_sp_fib_event_work, work);
|
||||
struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp;
|
||||
bool replace, append;
|
||||
bool replace;
|
||||
int err;
|
||||
|
||||
rtnl_lock();
|
||||
@ -5726,10 +5728,8 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
|
||||
case FIB_EVENT_ENTRY_APPEND: /* fall through */
|
||||
case FIB_EVENT_ENTRY_ADD:
|
||||
replace = fib_work->event == FIB_EVENT_ENTRY_REPLACE;
|
||||
append = fib_work->event == FIB_EVENT_ENTRY_APPEND;
|
||||
err = mlxsw_sp_router_fib6_add(mlxsw_sp,
|
||||
fib_work->fen6_info.rt, replace,
|
||||
append);
|
||||
fib_work->fen6_info.rt, replace);
|
||||
if (err)
|
||||
mlxsw_sp_router_fib_abort(mlxsw_sp);
|
||||
mlxsw_sp_rt6_release(fib_work->fen6_info.rt);
|
||||
|
@ -502,6 +502,7 @@ enum BAR_ID {
|
||||
struct qed_nvm_image_info {
|
||||
u32 num_images;
|
||||
struct bist_nvm_image_att *image_att;
|
||||
bool valid;
|
||||
};
|
||||
|
||||
#define DRV_MODULE_VERSION \
|
||||
|
@ -6723,7 +6723,7 @@ static enum dbg_status qed_parse_mcp_trace_buf(u8 *trace_buf,
|
||||
format_idx = header & MFW_TRACE_EVENTID_MASK;
|
||||
|
||||
/* Skip message if its index doesn't exist in the meta data */
|
||||
if (format_idx > s_mcp_trace_meta.formats_num) {
|
||||
if (format_idx >= s_mcp_trace_meta.formats_num) {
|
||||
u8 format_size =
|
||||
(u8)((header & MFW_TRACE_PRM_SIZE_MASK) >>
|
||||
MFW_TRACE_PRM_SIZE_SHIFT);
|
||||
|
@ -371,7 +371,7 @@ static struct qed_dev *qed_probe(struct pci_dev *pdev,
|
||||
goto err2;
|
||||
}
|
||||
|
||||
DP_INFO(cdev, "qed_probe completed successffuly\n");
|
||||
DP_INFO(cdev, "qed_probe completed successfully\n");
|
||||
|
||||
return cdev;
|
||||
|
||||
|
@ -592,6 +592,9 @@ int qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn,
|
||||
*o_mcp_resp = mb_params.mcp_resp;
|
||||
*o_mcp_param = mb_params.mcp_param;
|
||||
|
||||
/* nvm_info needs to be updated */
|
||||
p_hwfn->nvm_info.valid = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2555,11 +2558,14 @@ int qed_mcp_bist_nvm_get_image_att(struct qed_hwfn *p_hwfn,
|
||||
|
||||
int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
||||
{
|
||||
struct qed_nvm_image_info *nvm_info = &p_hwfn->nvm_info;
|
||||
struct qed_nvm_image_info nvm_info;
|
||||
struct qed_ptt *p_ptt;
|
||||
int rc;
|
||||
u32 i;
|
||||
|
||||
if (p_hwfn->nvm_info.valid)
|
||||
return 0;
|
||||
|
||||
p_ptt = qed_ptt_acquire(p_hwfn);
|
||||
if (!p_ptt) {
|
||||
DP_ERR(p_hwfn, "failed to acquire ptt\n");
|
||||
@ -2567,29 +2573,29 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
||||
}
|
||||
|
||||
/* Acquire from MFW the amount of available images */
|
||||
nvm_info->num_images = 0;
|
||||
nvm_info.num_images = 0;
|
||||
rc = qed_mcp_bist_nvm_get_num_images(p_hwfn,
|
||||
p_ptt, &nvm_info->num_images);
|
||||
p_ptt, &nvm_info.num_images);
|
||||
if (rc == -EOPNOTSUPP) {
|
||||
DP_INFO(p_hwfn, "DRV_MSG_CODE_BIST_TEST is not supported\n");
|
||||
goto out;
|
||||
} else if (rc || !nvm_info->num_images) {
|
||||
} else if (rc || !nvm_info.num_images) {
|
||||
DP_ERR(p_hwfn, "Failed getting number of images\n");
|
||||
goto err0;
|
||||
}
|
||||
|
||||
nvm_info->image_att = kmalloc_array(nvm_info->num_images,
|
||||
sizeof(struct bist_nvm_image_att),
|
||||
GFP_KERNEL);
|
||||
if (!nvm_info->image_att) {
|
||||
nvm_info.image_att = kmalloc_array(nvm_info.num_images,
|
||||
sizeof(struct bist_nvm_image_att),
|
||||
GFP_KERNEL);
|
||||
if (!nvm_info.image_att) {
|
||||
rc = -ENOMEM;
|
||||
goto err0;
|
||||
}
|
||||
|
||||
/* Iterate over images and get their attributes */
|
||||
for (i = 0; i < nvm_info->num_images; i++) {
|
||||
for (i = 0; i < nvm_info.num_images; i++) {
|
||||
rc = qed_mcp_bist_nvm_get_image_att(p_hwfn, p_ptt,
|
||||
&nvm_info->image_att[i], i);
|
||||
&nvm_info.image_att[i], i);
|
||||
if (rc) {
|
||||
DP_ERR(p_hwfn,
|
||||
"Failed getting image index %d attributes\n", i);
|
||||
@ -2597,14 +2603,22 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
|
||||
}
|
||||
|
||||
DP_VERBOSE(p_hwfn, QED_MSG_SP, "image index %d, size %x\n", i,
|
||||
nvm_info->image_att[i].len);
|
||||
nvm_info.image_att[i].len);
|
||||
}
|
||||
out:
|
||||
/* Update hwfn's nvm_info */
|
||||
if (nvm_info.num_images) {
|
||||
p_hwfn->nvm_info.num_images = nvm_info.num_images;
|
||||
kfree(p_hwfn->nvm_info.image_att);
|
||||
p_hwfn->nvm_info.image_att = nvm_info.image_att;
|
||||
p_hwfn->nvm_info.valid = true;
|
||||
}
|
||||
|
||||
qed_ptt_release(p_hwfn, p_ptt);
|
||||
return 0;
|
||||
|
||||
err1:
|
||||
kfree(nvm_info->image_att);
|
||||
kfree(nvm_info.image_att);
|
||||
err0:
|
||||
qed_ptt_release(p_hwfn, p_ptt);
|
||||
return rc;
|
||||
@ -2641,6 +2655,7 @@ qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
qed_mcp_nvm_info_populate(p_hwfn);
|
||||
for (i = 0; i < p_hwfn->nvm_info.num_images; i++)
|
||||
if (type == p_hwfn->nvm_info.image_att[i].image_type)
|
||||
break;
|
||||
|
@ -1128,6 +1128,8 @@ static ssize_t qlcnic_83xx_sysfs_flash_write_handler(struct file *filp,
|
||||
struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
||||
|
||||
ret = kstrtoul(buf, 16, &data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
switch (data) {
|
||||
case QLC_83XX_FLASH_SECTOR_ERASE_CMD:
|
||||
|
@ -658,7 +658,7 @@ qcaspi_netdev_open(struct net_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
netif_start_queue(qca->net_dev);
|
||||
/* SPI thread takes care of TX queue */
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -760,6 +760,9 @@ qcaspi_netdev_tx_timeout(struct net_device *dev)
|
||||
qca->net_dev->stats.tx_errors++;
|
||||
/* Trigger tx queue flush and QCA7000 reset */
|
||||
qca->sync = QCASPI_SYNC_UNKNOWN;
|
||||
|
||||
if (qca->spi_thread)
|
||||
wake_up_process(qca->spi_thread);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -878,22 +881,22 @@ qca_spi_probe(struct spi_device *spi)
|
||||
|
||||
if ((qcaspi_clkspeed < QCASPI_CLK_SPEED_MIN) ||
|
||||
(qcaspi_clkspeed > QCASPI_CLK_SPEED_MAX)) {
|
||||
dev_info(&spi->dev, "Invalid clkspeed: %d\n",
|
||||
qcaspi_clkspeed);
|
||||
dev_err(&spi->dev, "Invalid clkspeed: %d\n",
|
||||
qcaspi_clkspeed);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((qcaspi_burst_len < QCASPI_BURST_LEN_MIN) ||
|
||||
(qcaspi_burst_len > QCASPI_BURST_LEN_MAX)) {
|
||||
dev_info(&spi->dev, "Invalid burst len: %d\n",
|
||||
qcaspi_burst_len);
|
||||
dev_err(&spi->dev, "Invalid burst len: %d\n",
|
||||
qcaspi_burst_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((qcaspi_pluggable < QCASPI_PLUGGABLE_MIN) ||
|
||||
(qcaspi_pluggable > QCASPI_PLUGGABLE_MAX)) {
|
||||
dev_info(&spi->dev, "Invalid pluggable: %d\n",
|
||||
qcaspi_pluggable);
|
||||
dev_err(&spi->dev, "Invalid pluggable: %d\n",
|
||||
qcaspi_pluggable);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -955,8 +958,8 @@ qca_spi_probe(struct spi_device *spi)
|
||||
}
|
||||
|
||||
if (register_netdev(qcaspi_devs)) {
|
||||
dev_info(&spi->dev, "Unable to register net device %s\n",
|
||||
qcaspi_devs->name);
|
||||
dev_err(&spi->dev, "Unable to register net device %s\n",
|
||||
qcaspi_devs->name);
|
||||
free_netdev(qcaspi_devs);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
@ -7789,6 +7789,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
NETIF_F_HW_VLAN_CTAG_RX;
|
||||
dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
|
||||
NETIF_F_HIGHDMA;
|
||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||
|
||||
tp->cp_cmd |= RxChkSum | RxVlan;
|
||||
|
||||
|
@ -980,6 +980,13 @@ static void ravb_adjust_link(struct net_device *ndev)
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
struct phy_device *phydev = ndev->phydev;
|
||||
bool new_state = false;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* Disable TX and RX right over here, if E-MAC change is ignored */
|
||||
if (priv->no_avb_link)
|
||||
ravb_rcv_snd_disable(ndev);
|
||||
|
||||
if (phydev->link) {
|
||||
if (phydev->duplex != priv->duplex) {
|
||||
@ -997,18 +1004,21 @@ static void ravb_adjust_link(struct net_device *ndev)
|
||||
ravb_modify(ndev, ECMR, ECMR_TXF, 0);
|
||||
new_state = true;
|
||||
priv->link = phydev->link;
|
||||
if (priv->no_avb_link)
|
||||
ravb_rcv_snd_enable(ndev);
|
||||
}
|
||||
} else if (priv->link) {
|
||||
new_state = true;
|
||||
priv->link = 0;
|
||||
priv->speed = 0;
|
||||
priv->duplex = -1;
|
||||
if (priv->no_avb_link)
|
||||
ravb_rcv_snd_disable(ndev);
|
||||
}
|
||||
|
||||
/* Enable TX and RX right over here, if E-MAC change is ignored */
|
||||
if (priv->no_avb_link && phydev->link)
|
||||
ravb_rcv_snd_enable(ndev);
|
||||
|
||||
mmiowb();
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
if (new_state && netif_msg_link(priv))
|
||||
phy_print_status(phydev);
|
||||
}
|
||||
@ -1096,75 +1106,6 @@ static int ravb_phy_start(struct net_device *ndev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ravb_get_link_ksettings(struct net_device *ndev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
unsigned long flags;
|
||||
|
||||
if (!ndev->phydev)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
phy_ethtool_ksettings_get(ndev->phydev, cmd);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ravb_set_link_ksettings(struct net_device *ndev,
|
||||
const struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
unsigned long flags;
|
||||
int error;
|
||||
|
||||
if (!ndev->phydev)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* Disable TX and RX */
|
||||
ravb_rcv_snd_disable(ndev);
|
||||
|
||||
error = phy_ethtool_ksettings_set(ndev->phydev, cmd);
|
||||
if (error)
|
||||
goto error_exit;
|
||||
|
||||
if (cmd->base.duplex == DUPLEX_FULL)
|
||||
priv->duplex = 1;
|
||||
else
|
||||
priv->duplex = 0;
|
||||
|
||||
ravb_set_duplex(ndev);
|
||||
|
||||
error_exit:
|
||||
mdelay(1);
|
||||
|
||||
/* Enable TX and RX */
|
||||
ravb_rcv_snd_enable(ndev);
|
||||
|
||||
mmiowb();
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int ravb_nway_reset(struct net_device *ndev)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
int error = -ENODEV;
|
||||
unsigned long flags;
|
||||
|
||||
if (ndev->phydev) {
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
error = phy_start_aneg(ndev->phydev);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static u32 ravb_get_msglevel(struct net_device *ndev)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
@ -1377,7 +1318,7 @@ static int ravb_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ravb_ethtool_ops = {
|
||||
.nway_reset = ravb_nway_reset,
|
||||
.nway_reset = phy_ethtool_nway_reset,
|
||||
.get_msglevel = ravb_get_msglevel,
|
||||
.set_msglevel = ravb_set_msglevel,
|
||||
.get_link = ethtool_op_get_link,
|
||||
@ -1387,8 +1328,8 @@ static const struct ethtool_ops ravb_ethtool_ops = {
|
||||
.get_ringparam = ravb_get_ringparam,
|
||||
.set_ringparam = ravb_set_ringparam,
|
||||
.get_ts_info = ravb_get_ts_info,
|
||||
.get_link_ksettings = ravb_get_link_ksettings,
|
||||
.set_link_ksettings = ravb_set_link_ksettings,
|
||||
.get_link_ksettings = phy_ethtool_get_link_ksettings,
|
||||
.set_link_ksettings = phy_ethtool_set_link_ksettings,
|
||||
.get_wol = ravb_get_wol,
|
||||
.set_wol = ravb_set_wol,
|
||||
};
|
||||
|
@ -1927,8 +1927,15 @@ static void sh_eth_adjust_link(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
struct phy_device *phydev = ndev->phydev;
|
||||
unsigned long flags;
|
||||
int new_state = 0;
|
||||
|
||||
spin_lock_irqsave(&mdp->lock, flags);
|
||||
|
||||
/* Disable TX and RX right over here, if E-MAC change is ignored */
|
||||
if (mdp->cd->no_psr || mdp->no_ether_link)
|
||||
sh_eth_rcv_snd_disable(ndev);
|
||||
|
||||
if (phydev->link) {
|
||||
if (phydev->duplex != mdp->duplex) {
|
||||
new_state = 1;
|
||||
@ -1947,18 +1954,21 @@ static void sh_eth_adjust_link(struct net_device *ndev)
|
||||
sh_eth_modify(ndev, ECMR, ECMR_TXF, 0);
|
||||
new_state = 1;
|
||||
mdp->link = phydev->link;
|
||||
if (mdp->cd->no_psr || mdp->no_ether_link)
|
||||
sh_eth_rcv_snd_enable(ndev);
|
||||
}
|
||||
} else if (mdp->link) {
|
||||
new_state = 1;
|
||||
mdp->link = 0;
|
||||
mdp->speed = 0;
|
||||
mdp->duplex = -1;
|
||||
if (mdp->cd->no_psr || mdp->no_ether_link)
|
||||
sh_eth_rcv_snd_disable(ndev);
|
||||
}
|
||||
|
||||
/* Enable TX and RX right over here, if E-MAC change is ignored */
|
||||
if ((mdp->cd->no_psr || mdp->no_ether_link) && phydev->link)
|
||||
sh_eth_rcv_snd_enable(ndev);
|
||||
|
||||
mmiowb();
|
||||
spin_unlock_irqrestore(&mdp->lock, flags);
|
||||
|
||||
if (new_state && netif_msg_link(mdp))
|
||||
phy_print_status(phydev);
|
||||
}
|
||||
@ -2030,60 +2040,6 @@ static int sh_eth_phy_start(struct net_device *ndev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sh_eth_get_link_ksettings(struct net_device *ndev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
unsigned long flags;
|
||||
|
||||
if (!ndev->phydev)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&mdp->lock, flags);
|
||||
phy_ethtool_ksettings_get(ndev->phydev, cmd);
|
||||
spin_unlock_irqrestore(&mdp->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sh_eth_set_link_ksettings(struct net_device *ndev,
|
||||
const struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (!ndev->phydev)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&mdp->lock, flags);
|
||||
|
||||
/* disable tx and rx */
|
||||
sh_eth_rcv_snd_disable(ndev);
|
||||
|
||||
ret = phy_ethtool_ksettings_set(ndev->phydev, cmd);
|
||||
if (ret)
|
||||
goto error_exit;
|
||||
|
||||
if (cmd->base.duplex == DUPLEX_FULL)
|
||||
mdp->duplex = 1;
|
||||
else
|
||||
mdp->duplex = 0;
|
||||
|
||||
if (mdp->cd->set_duplex)
|
||||
mdp->cd->set_duplex(ndev);
|
||||
|
||||
error_exit:
|
||||
mdelay(1);
|
||||
|
||||
/* enable tx and rx */
|
||||
sh_eth_rcv_snd_enable(ndev);
|
||||
|
||||
spin_unlock_irqrestore(&mdp->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* If it is ever necessary to increase SH_ETH_REG_DUMP_MAX_REGS, the
|
||||
* version must be bumped as well. Just adding registers up to that
|
||||
* limit is fine, as long as the existing register indices don't
|
||||
@ -2263,22 +2219,6 @@ static void sh_eth_get_regs(struct net_device *ndev, struct ethtool_regs *regs,
|
||||
pm_runtime_put_sync(&mdp->pdev->dev);
|
||||
}
|
||||
|
||||
static int sh_eth_nway_reset(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (!ndev->phydev)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&mdp->lock, flags);
|
||||
ret = phy_start_aneg(ndev->phydev);
|
||||
spin_unlock_irqrestore(&mdp->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 sh_eth_get_msglevel(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
@ -2429,7 +2369,7 @@ static int sh_eth_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
|
||||
static const struct ethtool_ops sh_eth_ethtool_ops = {
|
||||
.get_regs_len = sh_eth_get_regs_len,
|
||||
.get_regs = sh_eth_get_regs,
|
||||
.nway_reset = sh_eth_nway_reset,
|
||||
.nway_reset = phy_ethtool_nway_reset,
|
||||
.get_msglevel = sh_eth_get_msglevel,
|
||||
.set_msglevel = sh_eth_set_msglevel,
|
||||
.get_link = ethtool_op_get_link,
|
||||
@ -2438,8 +2378,8 @@ static const struct ethtool_ops sh_eth_ethtool_ops = {
|
||||
.get_sset_count = sh_eth_get_sset_count,
|
||||
.get_ringparam = sh_eth_get_ringparam,
|
||||
.set_ringparam = sh_eth_set_ringparam,
|
||||
.get_link_ksettings = sh_eth_get_link_ksettings,
|
||||
.set_link_ksettings = sh_eth_set_link_ksettings,
|
||||
.get_link_ksettings = phy_ethtool_get_link_ksettings,
|
||||
.set_link_ksettings = phy_ethtool_set_link_ksettings,
|
||||
.get_wol = sh_eth_get_wol,
|
||||
.set_wol = sh_eth_set_wol,
|
||||
};
|
||||
|
@ -4288,9 +4288,9 @@ static int efx_ef10_filter_pri(struct efx_ef10_filter_table *table,
|
||||
return -EPROTONOSUPPORT;
|
||||
}
|
||||
|
||||
static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||
struct efx_filter_spec *spec,
|
||||
bool replace_equal)
|
||||
static s32 efx_ef10_filter_insert_locked(struct efx_nic *efx,
|
||||
struct efx_filter_spec *spec,
|
||||
bool replace_equal)
|
||||
{
|
||||
DECLARE_BITMAP(mc_rem_map, EFX_EF10_FILTER_SEARCH_LIMIT);
|
||||
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||
@ -4307,7 +4307,7 @@ static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||
bool is_mc_recip;
|
||||
s32 rc;
|
||||
|
||||
down_read(&efx->filter_sem);
|
||||
WARN_ON(!rwsem_is_locked(&efx->filter_sem));
|
||||
table = efx->filter_state;
|
||||
down_write(&table->lock);
|
||||
|
||||
@ -4498,10 +4498,22 @@ static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||
if (rss_locked)
|
||||
mutex_unlock(&efx->rss_lock);
|
||||
up_write(&table->lock);
|
||||
up_read(&efx->filter_sem);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||
struct efx_filter_spec *spec,
|
||||
bool replace_equal)
|
||||
{
|
||||
s32 ret;
|
||||
|
||||
down_read(&efx->filter_sem);
|
||||
ret = efx_ef10_filter_insert_locked(efx, spec, replace_equal);
|
||||
up_read(&efx->filter_sem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void efx_ef10_filter_update_rx_scatter(struct efx_nic *efx)
|
||||
{
|
||||
/* no need to do anything here on EF10 */
|
||||
@ -5285,7 +5297,7 @@ static int efx_ef10_filter_insert_addr_list(struct efx_nic *efx,
|
||||
EFX_WARN_ON_PARANOID(ids[i] != EFX_EF10_FILTER_ID_INVALID);
|
||||
efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, filter_flags, 0);
|
||||
efx_filter_set_eth_local(&spec, vlan->vid, addr_list[i].addr);
|
||||
rc = efx_ef10_filter_insert(efx, &spec, true);
|
||||
rc = efx_ef10_filter_insert_locked(efx, &spec, true);
|
||||
if (rc < 0) {
|
||||
if (rollback) {
|
||||
netif_info(efx, drv, efx->net_dev,
|
||||
@ -5314,7 +5326,7 @@ static int efx_ef10_filter_insert_addr_list(struct efx_nic *efx,
|
||||
efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, filter_flags, 0);
|
||||
eth_broadcast_addr(baddr);
|
||||
efx_filter_set_eth_local(&spec, vlan->vid, baddr);
|
||||
rc = efx_ef10_filter_insert(efx, &spec, true);
|
||||
rc = efx_ef10_filter_insert_locked(efx, &spec, true);
|
||||
if (rc < 0) {
|
||||
netif_warn(efx, drv, efx->net_dev,
|
||||
"Broadcast filter insert failed rc=%d\n", rc);
|
||||
@ -5370,7 +5382,7 @@ static int efx_ef10_filter_insert_def(struct efx_nic *efx,
|
||||
if (vlan->vid != EFX_FILTER_VID_UNSPEC)
|
||||
efx_filter_set_eth_local(&spec, vlan->vid, NULL);
|
||||
|
||||
rc = efx_ef10_filter_insert(efx, &spec, true);
|
||||
rc = efx_ef10_filter_insert_locked(efx, &spec, true);
|
||||
if (rc < 0) {
|
||||
const char *um = multicast ? "Multicast" : "Unicast";
|
||||
const char *encap_name = "";
|
||||
@ -5430,7 +5442,7 @@ static int efx_ef10_filter_insert_def(struct efx_nic *efx,
|
||||
filter_flags, 0);
|
||||
eth_broadcast_addr(baddr);
|
||||
efx_filter_set_eth_local(&spec, vlan->vid, baddr);
|
||||
rc = efx_ef10_filter_insert(efx, &spec, true);
|
||||
rc = efx_ef10_filter_insert_locked(efx, &spec, true);
|
||||
if (rc < 0) {
|
||||
netif_warn(efx, drv, efx->net_dev,
|
||||
"Broadcast filter insert failed rc=%d\n",
|
||||
|
@ -1871,12 +1871,6 @@ static void efx_remove_filters(struct efx_nic *efx)
|
||||
up_write(&efx->filter_sem);
|
||||
}
|
||||
|
||||
static void efx_restore_filters(struct efx_nic *efx)
|
||||
{
|
||||
down_read(&efx->filter_sem);
|
||||
efx->type->filter_table_restore(efx);
|
||||
up_read(&efx->filter_sem);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
@ -2688,6 +2682,7 @@ void efx_reset_down(struct efx_nic *efx, enum reset_type method)
|
||||
efx_disable_interrupts(efx);
|
||||
|
||||
mutex_lock(&efx->mac_lock);
|
||||
down_write(&efx->filter_sem);
|
||||
mutex_lock(&efx->rss_lock);
|
||||
if (efx->port_initialized && method != RESET_TYPE_INVISIBLE &&
|
||||
method != RESET_TYPE_DATAPATH)
|
||||
@ -2745,9 +2740,8 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok)
|
||||
if (efx->type->rx_restore_rss_contexts)
|
||||
efx->type->rx_restore_rss_contexts(efx);
|
||||
mutex_unlock(&efx->rss_lock);
|
||||
down_read(&efx->filter_sem);
|
||||
efx_restore_filters(efx);
|
||||
up_read(&efx->filter_sem);
|
||||
efx->type->filter_table_restore(efx);
|
||||
up_write(&efx->filter_sem);
|
||||
if (efx->type->sriov_reset)
|
||||
efx->type->sriov_reset(efx);
|
||||
|
||||
@ -2764,6 +2758,7 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok)
|
||||
efx->port_initialized = false;
|
||||
|
||||
mutex_unlock(&efx->rss_lock);
|
||||
up_write(&efx->filter_sem);
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
|
||||
return rc;
|
||||
@ -3473,7 +3468,9 @@ static int efx_pci_probe_main(struct efx_nic *efx)
|
||||
|
||||
efx_init_napi(efx);
|
||||
|
||||
down_write(&efx->filter_sem);
|
||||
rc = efx->type->init(efx);
|
||||
up_write(&efx->filter_sem);
|
||||
if (rc) {
|
||||
netif_err(efx, probe, efx->net_dev,
|
||||
"failed to initialise NIC\n");
|
||||
@ -3765,7 +3762,9 @@ static int efx_pm_resume(struct device *dev)
|
||||
rc = efx->type->reset(efx, RESET_TYPE_ALL);
|
||||
if (rc)
|
||||
return rc;
|
||||
down_write(&efx->filter_sem);
|
||||
rc = efx->type->init(efx);
|
||||
up_write(&efx->filter_sem);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = efx_pm_thaw(dev);
|
||||
|
@ -37,7 +37,7 @@
|
||||
* is done in the "stmmac files"
|
||||
*/
|
||||
|
||||
/* struct emac_variant - Descrive dwmac-sun8i hardware variant
|
||||
/* struct emac_variant - Describe dwmac-sun8i hardware variant
|
||||
* @default_syscon_value: The default value of the EMAC register in syscon
|
||||
* This value is used for disabling properly EMAC
|
||||
* and used as a good starting value in case of the
|
||||
|
@ -94,7 +94,6 @@ static int dwmac1000_validate_ucast_entries(int ucast_entries)
|
||||
/**
|
||||
* stmmac_axi_setup - parse DT parameters for programming the AXI register
|
||||
* @pdev: platform device
|
||||
* @priv: driver private struct.
|
||||
* Description:
|
||||
* if required, from device-tree the AXI internal register can be tuned
|
||||
* by using platform parameters.
|
||||
|
@ -1274,6 +1274,7 @@ int netvsc_poll(struct napi_struct *napi, int budget)
|
||||
struct hv_device *device = netvsc_channel_to_device(channel);
|
||||
struct net_device *ndev = hv_get_drvdata(device);
|
||||
int work_done = 0;
|
||||
int ret;
|
||||
|
||||
/* If starting a new interval */
|
||||
if (!nvchan->desc)
|
||||
@ -1285,16 +1286,18 @@ int netvsc_poll(struct napi_struct *napi, int budget)
|
||||
nvchan->desc = hv_pkt_iter_next(channel, nvchan->desc);
|
||||
}
|
||||
|
||||
/* If send of pending receive completions suceeded
|
||||
* and did not exhaust NAPI budget this time
|
||||
* and not doing busy poll
|
||||
/* Send any pending receive completions */
|
||||
ret = send_recv_completions(ndev, net_device, nvchan);
|
||||
|
||||
/* If it did not exhaust NAPI budget this time
|
||||
* and not doing busy poll
|
||||
* then re-enable host interrupts
|
||||
* and reschedule if ring is not empty.
|
||||
* and reschedule if ring is not empty
|
||||
* or sending receive completion failed.
|
||||
*/
|
||||
if (send_recv_completions(ndev, net_device, nvchan) == 0 &&
|
||||
work_done < budget &&
|
||||
if (work_done < budget &&
|
||||
napi_complete_done(napi, work_done) &&
|
||||
hv_end_read(&channel->inbound) &&
|
||||
(ret || hv_end_read(&channel->inbound)) &&
|
||||
napi_schedule_prep(napi)) {
|
||||
hv_begin_read(&channel->inbound);
|
||||
__napi_schedule(napi);
|
||||
|
@ -1338,6 +1338,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
|
||||
/* setting up multiple channels failed */
|
||||
net_device->max_chn = 1;
|
||||
net_device->num_chn = 1;
|
||||
return 0;
|
||||
|
||||
err_dev_remv:
|
||||
rndis_filter_device_remove(dev, net_device);
|
||||
|
@ -275,6 +275,8 @@ struct adf7242_local {
|
||||
struct spi_message stat_msg;
|
||||
struct spi_transfer stat_xfer;
|
||||
struct dentry *debugfs_root;
|
||||
struct delayed_work work;
|
||||
struct workqueue_struct *wqueue;
|
||||
unsigned long flags;
|
||||
int tx_stat;
|
||||
bool promiscuous;
|
||||
@ -575,10 +577,26 @@ static int adf7242_cmd_rx(struct adf7242_local *lp)
|
||||
/* Wait until the ACK is sent */
|
||||
adf7242_wait_status(lp, RC_STATUS_PHY_RDY, RC_STATUS_MASK, __LINE__);
|
||||
adf7242_clear_irqstat(lp);
|
||||
mod_delayed_work(lp->wqueue, &lp->work, msecs_to_jiffies(400));
|
||||
|
||||
return adf7242_cmd(lp, CMD_RC_RX);
|
||||
}
|
||||
|
||||
static void adf7242_rx_cal_work(struct work_struct *work)
|
||||
{
|
||||
struct adf7242_local *lp =
|
||||
container_of(work, struct adf7242_local, work.work);
|
||||
|
||||
/* Reissuing RC_RX every 400ms - to adjust for offset
|
||||
* drift in receiver (datasheet page 61, OCL section)
|
||||
*/
|
||||
|
||||
if (!test_bit(FLAG_XMIT, &lp->flags)) {
|
||||
adf7242_cmd(lp, CMD_RC_PHY_RDY);
|
||||
adf7242_cmd_rx(lp);
|
||||
}
|
||||
}
|
||||
|
||||
static int adf7242_set_txpower(struct ieee802154_hw *hw, int mbm)
|
||||
{
|
||||
struct adf7242_local *lp = hw->priv;
|
||||
@ -686,7 +704,7 @@ static int adf7242_start(struct ieee802154_hw *hw)
|
||||
enable_irq(lp->spi->irq);
|
||||
set_bit(FLAG_START, &lp->flags);
|
||||
|
||||
return adf7242_cmd(lp, CMD_RC_RX);
|
||||
return adf7242_cmd_rx(lp);
|
||||
}
|
||||
|
||||
static void adf7242_stop(struct ieee802154_hw *hw)
|
||||
@ -694,6 +712,7 @@ static void adf7242_stop(struct ieee802154_hw *hw)
|
||||
struct adf7242_local *lp = hw->priv;
|
||||
|
||||
disable_irq(lp->spi->irq);
|
||||
cancel_delayed_work_sync(&lp->work);
|
||||
adf7242_cmd(lp, CMD_RC_IDLE);
|
||||
clear_bit(FLAG_START, &lp->flags);
|
||||
adf7242_clear_irqstat(lp);
|
||||
@ -719,7 +738,10 @@ static int adf7242_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
|
||||
adf7242_write_reg(lp, REG_CH_FREQ1, freq >> 8);
|
||||
adf7242_write_reg(lp, REG_CH_FREQ2, freq >> 16);
|
||||
|
||||
return adf7242_cmd(lp, CMD_RC_RX);
|
||||
if (test_bit(FLAG_START, &lp->flags))
|
||||
return adf7242_cmd_rx(lp);
|
||||
else
|
||||
return adf7242_cmd(lp, CMD_RC_PHY_RDY);
|
||||
}
|
||||
|
||||
static int adf7242_set_hw_addr_filt(struct ieee802154_hw *hw,
|
||||
@ -814,6 +836,7 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
|
||||
/* ensure existing instances of the IRQ handler have completed */
|
||||
disable_irq(lp->spi->irq);
|
||||
set_bit(FLAG_XMIT, &lp->flags);
|
||||
cancel_delayed_work_sync(&lp->work);
|
||||
reinit_completion(&lp->tx_complete);
|
||||
adf7242_cmd(lp, CMD_RC_PHY_RDY);
|
||||
adf7242_clear_irqstat(lp);
|
||||
@ -952,6 +975,7 @@ static irqreturn_t adf7242_isr(int irq, void *data)
|
||||
unsigned int xmit;
|
||||
u8 irq1;
|
||||
|
||||
mod_delayed_work(lp->wqueue, &lp->work, msecs_to_jiffies(400));
|
||||
adf7242_read_reg(lp, REG_IRQ1_SRC1, &irq1);
|
||||
|
||||
if (!(irq1 & (IRQ_RX_PKT_RCVD | IRQ_CSMA_CA)))
|
||||
@ -1241,6 +1265,9 @@ static int adf7242_probe(struct spi_device *spi)
|
||||
spi_message_add_tail(&lp->stat_xfer, &lp->stat_msg);
|
||||
|
||||
spi_set_drvdata(spi, lp);
|
||||
INIT_DELAYED_WORK(&lp->work, adf7242_rx_cal_work);
|
||||
lp->wqueue = alloc_ordered_workqueue(dev_name(&spi->dev),
|
||||
WQ_MEM_RECLAIM);
|
||||
|
||||
ret = adf7242_hw_init(lp);
|
||||
if (ret)
|
||||
@ -1284,6 +1311,9 @@ static int adf7242_remove(struct spi_device *spi)
|
||||
if (!IS_ERR_OR_NULL(lp->debugfs_root))
|
||||
debugfs_remove_recursive(lp->debugfs_root);
|
||||
|
||||
cancel_delayed_work_sync(&lp->work);
|
||||
destroy_workqueue(lp->wqueue);
|
||||
|
||||
ieee802154_unregister_hw(lp->hw);
|
||||
mutex_destroy(&lp->bmux);
|
||||
ieee802154_free_hw(lp->hw);
|
||||
|
@ -940,7 +940,7 @@ at86rf230_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
|
||||
static int
|
||||
at86rf230_ed(struct ieee802154_hw *hw, u8 *level)
|
||||
{
|
||||
BUG_ON(!level);
|
||||
WARN_ON(!level);
|
||||
*level = 0xbe;
|
||||
return 0;
|
||||
}
|
||||
@ -1121,8 +1121,7 @@ at86rf230_set_hw_addr_filt(struct ieee802154_hw *hw,
|
||||
if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
|
||||
u16 addr = le16_to_cpu(filt->short_addr);
|
||||
|
||||
dev_vdbg(&lp->spi->dev,
|
||||
"at86rf230_set_hw_addr_filt called for saddr\n");
|
||||
dev_vdbg(&lp->spi->dev, "%s called for saddr\n", __func__);
|
||||
__at86rf230_write(lp, RG_SHORT_ADDR_0, addr);
|
||||
__at86rf230_write(lp, RG_SHORT_ADDR_1, addr >> 8);
|
||||
}
|
||||
@ -1130,8 +1129,7 @@ at86rf230_set_hw_addr_filt(struct ieee802154_hw *hw,
|
||||
if (changed & IEEE802154_AFILT_PANID_CHANGED) {
|
||||
u16 pan = le16_to_cpu(filt->pan_id);
|
||||
|
||||
dev_vdbg(&lp->spi->dev,
|
||||
"at86rf230_set_hw_addr_filt called for pan id\n");
|
||||
dev_vdbg(&lp->spi->dev, "%s called for pan id\n", __func__);
|
||||
__at86rf230_write(lp, RG_PAN_ID_0, pan);
|
||||
__at86rf230_write(lp, RG_PAN_ID_1, pan >> 8);
|
||||
}
|
||||
@ -1140,15 +1138,13 @@ at86rf230_set_hw_addr_filt(struct ieee802154_hw *hw,
|
||||
u8 i, addr[8];
|
||||
|
||||
memcpy(addr, &filt->ieee_addr, 8);
|
||||
dev_vdbg(&lp->spi->dev,
|
||||
"at86rf230_set_hw_addr_filt called for IEEE addr\n");
|
||||
dev_vdbg(&lp->spi->dev, "%s called for IEEE addr\n", __func__);
|
||||
for (i = 0; i < 8; i++)
|
||||
__at86rf230_write(lp, RG_IEEE_ADDR_0 + i, addr[i]);
|
||||
}
|
||||
|
||||
if (changed & IEEE802154_AFILT_PANC_CHANGED) {
|
||||
dev_vdbg(&lp->spi->dev,
|
||||
"at86rf230_set_hw_addr_filt called for panc change\n");
|
||||
dev_vdbg(&lp->spi->dev, "%s called for panc change\n", __func__);
|
||||
if (filt->pan_coord)
|
||||
at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1);
|
||||
else
|
||||
@ -1252,7 +1248,6 @@ at86rf230_set_cca_mode(struct ieee802154_hw *hw,
|
||||
return at86rf230_write_subreg(lp, SR_CCA_MODE, val);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
at86rf230_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ struct fakelb_phy {
|
||||
|
||||
static int fakelb_hw_ed(struct ieee802154_hw *hw, u8 *level)
|
||||
{
|
||||
BUG_ON(!level);
|
||||
WARN_ON(!level);
|
||||
*level = 0xbe;
|
||||
|
||||
return 0;
|
||||
|
@ -15,10 +15,11 @@
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -130,8 +130,9 @@
|
||||
#define MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS BIT(12)
|
||||
#define MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE BIT(14)
|
||||
|
||||
#define MII_88E1121_PHY_LED_CTRL 16
|
||||
#define MII_PHY_LED_CTRL 16
|
||||
#define MII_88E1121_PHY_LED_DEF 0x0030
|
||||
#define MII_88E1510_PHY_LED_DEF 0x1177
|
||||
|
||||
#define MII_M1011_PHY_STATUS 0x11
|
||||
#define MII_M1011_PHY_STATUS_1000 0x8000
|
||||
@ -632,8 +633,40 @@ static int m88e1510_config_aneg(struct phy_device *phydev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void marvell_config_led(struct phy_device *phydev)
|
||||
{
|
||||
u16 def_config;
|
||||
int err;
|
||||
|
||||
switch (MARVELL_PHY_FAMILY_ID(phydev->phy_id)) {
|
||||
/* Default PHY LED config: LED[0] .. Link, LED[1] .. Activity */
|
||||
case MARVELL_PHY_FAMILY_ID(MARVELL_PHY_ID_88E1121R):
|
||||
case MARVELL_PHY_FAMILY_ID(MARVELL_PHY_ID_88E1318S):
|
||||
def_config = MII_88E1121_PHY_LED_DEF;
|
||||
break;
|
||||
/* Default PHY LED config:
|
||||
* LED[0] .. 1000Mbps Link
|
||||
* LED[1] .. 100Mbps Link
|
||||
* LED[2] .. Blink, Activity
|
||||
*/
|
||||
case MARVELL_PHY_FAMILY_ID(MARVELL_PHY_ID_88E1510):
|
||||
def_config = MII_88E1510_PHY_LED_DEF;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
err = phy_write_paged(phydev, MII_MARVELL_LED_PAGE, MII_PHY_LED_CTRL,
|
||||
def_config);
|
||||
if (err < 0)
|
||||
pr_warn("Fail to config marvell phy LED.\n");
|
||||
}
|
||||
|
||||
static int marvell_config_init(struct phy_device *phydev)
|
||||
{
|
||||
/* Set defalut LED */
|
||||
marvell_config_led(phydev);
|
||||
|
||||
/* Set registers from marvell,reg-init DT property */
|
||||
return marvell_of_reg_init(phydev);
|
||||
}
|
||||
@ -813,21 +846,6 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
||||
return genphy_soft_reset(phydev);
|
||||
}
|
||||
|
||||
static int m88e1121_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Default PHY LED config: LED[0] .. Link, LED[1] .. Activity */
|
||||
err = phy_write_paged(phydev, MII_MARVELL_LED_PAGE,
|
||||
MII_88E1121_PHY_LED_CTRL,
|
||||
MII_88E1121_PHY_LED_DEF);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Set marvell,reg-init configuration from device tree */
|
||||
return marvell_config_init(phydev);
|
||||
}
|
||||
|
||||
static int m88e1318_config_init(struct phy_device *phydev)
|
||||
{
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
@ -841,7 +859,7 @@ static int m88e1318_config_init(struct phy_device *phydev)
|
||||
return err;
|
||||
}
|
||||
|
||||
return m88e1121_config_init(phydev);
|
||||
return marvell_config_init(phydev);
|
||||
}
|
||||
|
||||
static int m88e1510_config_init(struct phy_device *phydev)
|
||||
@ -2087,7 +2105,7 @@ static struct phy_driver marvell_drivers[] = {
|
||||
.features = PHY_GBIT_FEATURES,
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.probe = &m88e1121_probe,
|
||||
.config_init = &m88e1121_config_init,
|
||||
.config_init = &marvell_config_init,
|
||||
.config_aneg = &m88e1121_config_aneg,
|
||||
.read_status = &marvell_read_status,
|
||||
.ack_interrupt = &marvell_ack_interrupt,
|
||||
|
@ -1724,11 +1724,8 @@ EXPORT_SYMBOL(genphy_loopback);
|
||||
|
||||
static int __set_phy_supported(struct phy_device *phydev, u32 max_speed)
|
||||
{
|
||||
/* The default values for phydev->supported are provided by the PHY
|
||||
* driver "features" member, we want to reset to sane defaults first
|
||||
* before supporting higher speeds.
|
||||
*/
|
||||
phydev->supported &= PHY_DEFAULT_FEATURES;
|
||||
phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES |
|
||||
PHY_10BT_FEATURES);
|
||||
|
||||
switch (max_speed) {
|
||||
default:
|
||||
|
@ -349,7 +349,6 @@ static int sfp_register_bus(struct sfp_bus *bus)
|
||||
}
|
||||
if (bus->started)
|
||||
bus->socket_ops->start(bus->sfp);
|
||||
bus->netdev->sfp_bus = bus;
|
||||
bus->registered = true;
|
||||
return 0;
|
||||
}
|
||||
@ -364,7 +363,6 @@ static void sfp_unregister_bus(struct sfp_bus *bus)
|
||||
if (bus->phydev && ops && ops->disconnect_phy)
|
||||
ops->disconnect_phy(bus->upstream);
|
||||
}
|
||||
bus->netdev->sfp_bus = NULL;
|
||||
bus->registered = false;
|
||||
}
|
||||
|
||||
@ -436,6 +434,14 @@ void sfp_upstream_stop(struct sfp_bus *bus)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sfp_upstream_stop);
|
||||
|
||||
static void sfp_upstream_clear(struct sfp_bus *bus)
|
||||
{
|
||||
bus->upstream_ops = NULL;
|
||||
bus->upstream = NULL;
|
||||
bus->netdev->sfp_bus = NULL;
|
||||
bus->netdev = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* sfp_register_upstream() - Register the neighbouring device
|
||||
* @fwnode: firmware node for the SFP bus
|
||||
@ -461,9 +467,13 @@ struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
|
||||
bus->upstream_ops = ops;
|
||||
bus->upstream = upstream;
|
||||
bus->netdev = ndev;
|
||||
ndev->sfp_bus = bus;
|
||||
|
||||
if (bus->sfp)
|
||||
if (bus->sfp) {
|
||||
ret = sfp_register_bus(bus);
|
||||
if (ret)
|
||||
sfp_upstream_clear(bus);
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
@ -488,8 +498,7 @@ void sfp_unregister_upstream(struct sfp_bus *bus)
|
||||
rtnl_lock();
|
||||
if (bus->sfp)
|
||||
sfp_unregister_bus(bus);
|
||||
bus->upstream = NULL;
|
||||
bus->netdev = NULL;
|
||||
sfp_upstream_clear(bus);
|
||||
rtnl_unlock();
|
||||
|
||||
sfp_bus_put(bus);
|
||||
@ -561,6 +570,13 @@ void sfp_module_remove(struct sfp_bus *bus)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sfp_module_remove);
|
||||
|
||||
static void sfp_socket_clear(struct sfp_bus *bus)
|
||||
{
|
||||
bus->sfp_dev = NULL;
|
||||
bus->sfp = NULL;
|
||||
bus->socket_ops = NULL;
|
||||
}
|
||||
|
||||
struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
|
||||
const struct sfp_socket_ops *ops)
|
||||
{
|
||||
@ -573,8 +589,11 @@ struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
|
||||
bus->sfp = sfp;
|
||||
bus->socket_ops = ops;
|
||||
|
||||
if (bus->netdev)
|
||||
if (bus->netdev) {
|
||||
ret = sfp_register_bus(bus);
|
||||
if (ret)
|
||||
sfp_socket_clear(bus);
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
@ -592,9 +611,7 @@ void sfp_unregister_socket(struct sfp_bus *bus)
|
||||
rtnl_lock();
|
||||
if (bus->netdev)
|
||||
sfp_unregister_bus(bus);
|
||||
bus->sfp_dev = NULL;
|
||||
bus->sfp = NULL;
|
||||
bus->socket_ops = NULL;
|
||||
sfp_socket_clear(bus);
|
||||
rtnl_unlock();
|
||||
|
||||
sfp_bus_put(bus);
|
||||
|
@ -1688,7 +1688,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
||||
case XDP_TX:
|
||||
get_page(alloc_frag->page);
|
||||
alloc_frag->offset += buflen;
|
||||
if (tun_xdp_tx(tun->dev, &xdp))
|
||||
if (tun_xdp_tx(tun->dev, &xdp) < 0)
|
||||
goto err_redirect;
|
||||
rcu_read_unlock();
|
||||
local_bh_enable();
|
||||
|
@ -642,10 +642,12 @@ static void ax88772_restore_phy(struct usbnet *dev)
|
||||
priv->presvd_phy_advertise);
|
||||
|
||||
/* Restore BMCR */
|
||||
if (priv->presvd_phy_bmcr & BMCR_ANENABLE)
|
||||
priv->presvd_phy_bmcr |= BMCR_ANRESTART;
|
||||
|
||||
asix_mdio_write_nopm(dev->net, dev->mii.phy_id, MII_BMCR,
|
||||
priv->presvd_phy_bmcr);
|
||||
|
||||
mii_nway_restart(&dev->mii);
|
||||
priv->presvd_phy_advertise = 0;
|
||||
priv->presvd_phy_bmcr = 0;
|
||||
}
|
||||
|
@ -3344,6 +3344,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
||||
pkt_cnt = 0;
|
||||
count = 0;
|
||||
length = 0;
|
||||
spin_lock_irqsave(&tqp->lock, flags);
|
||||
for (skb = tqp->next; pkt_cnt < tqp->qlen; skb = skb->next) {
|
||||
if (skb_is_gso(skb)) {
|
||||
if (pkt_cnt) {
|
||||
@ -3352,7 +3353,8 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
||||
}
|
||||
count = 1;
|
||||
length = skb->len - TX_OVERHEAD;
|
||||
skb2 = skb_dequeue(tqp);
|
||||
__skb_unlink(skb, tqp);
|
||||
spin_unlock_irqrestore(&tqp->lock, flags);
|
||||
goto gso_skb;
|
||||
}
|
||||
|
||||
@ -3361,6 +3363,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev)
|
||||
skb_totallen = skb->len + roundup(skb_totallen, sizeof(u32));
|
||||
pkt_cnt++;
|
||||
}
|
||||
spin_unlock_irqrestore(&tqp->lock, flags);
|
||||
|
||||
/* copy to a single skb */
|
||||
skb = alloc_skb(skb_totallen, GFP_ATOMIC);
|
||||
|
@ -1253,6 +1253,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */
|
||||
{QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */
|
||||
{QMI_QUIRK_SET_DTR(0x2c7c, 0x0306, 4)}, /* Quectel EP06 Mini PCIe */
|
||||
|
||||
|
@ -681,7 +681,7 @@ static void rtl8150_set_multicast(struct net_device *netdev)
|
||||
(netdev->flags & IFF_ALLMULTI)) {
|
||||
rx_creg &= 0xfffe;
|
||||
rx_creg |= 0x0002;
|
||||
dev_info(&netdev->dev, "%s: allmulti set\n", netdev->name);
|
||||
dev_dbg(&netdev->dev, "%s: allmulti set\n", netdev->name);
|
||||
} else {
|
||||
/* ~RX_MULTICAST, ~RX_PROMISCUOUS */
|
||||
rx_creg &= 0x00fc;
|
||||
|
@ -82,6 +82,9 @@ static bool turbo_mode = true;
|
||||
module_param(turbo_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
|
||||
|
||||
static int smsc75xx_link_ok_nopm(struct usbnet *dev);
|
||||
static int smsc75xx_phy_gig_workaround(struct usbnet *dev);
|
||||
|
||||
static int __must_check __smsc75xx_read_reg(struct usbnet *dev, u32 index,
|
||||
u32 *data, int in_pm)
|
||||
{
|
||||
@ -852,6 +855,9 @@ static int smsc75xx_phy_initialize(struct usbnet *dev)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* phy workaround for gig link */
|
||||
smsc75xx_phy_gig_workaround(dev);
|
||||
|
||||
smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
|
||||
ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP |
|
||||
ADVERTISE_PAUSE_ASYM);
|
||||
@ -987,6 +993,62 @@ static int smsc75xx_wait_ready(struct usbnet *dev, int in_pm)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int smsc75xx_phy_gig_workaround(struct usbnet *dev)
|
||||
{
|
||||
struct mii_if_info *mii = &dev->mii;
|
||||
int ret = 0, timeout = 0;
|
||||
u32 buf, link_up = 0;
|
||||
|
||||
/* Set the phy in Gig loopback */
|
||||
smsc75xx_mdio_write(dev->net, mii->phy_id, MII_BMCR, 0x4040);
|
||||
|
||||
/* Wait for the link up */
|
||||
do {
|
||||
link_up = smsc75xx_link_ok_nopm(dev);
|
||||
usleep_range(10000, 20000);
|
||||
timeout++;
|
||||
} while ((!link_up) && (timeout < 1000));
|
||||
|
||||
if (timeout >= 1000) {
|
||||
netdev_warn(dev->net, "Timeout waiting for PHY link up\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* phy reset */
|
||||
ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
buf |= PMT_CTL_PHY_RST;
|
||||
|
||||
ret = smsc75xx_write_reg(dev, PMT_CTL, buf);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Failed to write PMT_CTL: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
timeout = 0;
|
||||
do {
|
||||
usleep_range(10000, 20000);
|
||||
ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
timeout++;
|
||||
} while ((buf & PMT_CTL_PHY_RST) && (timeout < 100));
|
||||
|
||||
if (timeout >= 100) {
|
||||
netdev_warn(dev->net, "timeout waiting for PHY Reset\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smsc75xx_reset(struct usbnet *dev)
|
||||
{
|
||||
struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
|
||||
|
@ -6058,8 +6058,19 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
|
||||
ath10k_mac_max_vht_nss(vht_mcs_mask)));
|
||||
|
||||
if (changed & IEEE80211_RC_BW_CHANGED) {
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n",
|
||||
sta->addr, bw);
|
||||
enum wmi_phy_mode mode;
|
||||
|
||||
mode = chan_to_phymode(&def);
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n",
|
||||
sta->addr, bw, mode);
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
WMI_PEER_PHYMODE, mode);
|
||||
if (err) {
|
||||
ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
|
||||
sta->addr, mode, err);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
WMI_PEER_CHAN_WIDTH, bw);
|
||||
@ -6100,6 +6111,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
|
||||
sta->addr);
|
||||
}
|
||||
|
||||
exit:
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
|
||||
|
@ -6144,6 +6144,7 @@ enum wmi_peer_param {
|
||||
WMI_PEER_NSS = 0x5,
|
||||
WMI_PEER_USE_4ADDR = 0x6,
|
||||
WMI_PEER_DEBUG = 0xa,
|
||||
WMI_PEER_PHYMODE = 0xd,
|
||||
WMI_PEER_DUMMY_VAR = 0xff, /* dummy parameter for STA PS workaround */
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
|
@ -4296,6 +4296,13 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
if (bus) {
|
||||
/* Stop watchdog task */
|
||||
if (bus->watchdog_tsk) {
|
||||
send_sig(SIGTERM, bus->watchdog_tsk, 1);
|
||||
kthread_stop(bus->watchdog_tsk);
|
||||
bus->watchdog_tsk = NULL;
|
||||
}
|
||||
|
||||
/* De-register interrupt handler */
|
||||
brcmf_sdiod_intr_unregister(bus->sdiodev);
|
||||
|
||||
|
@ -644,11 +644,6 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
|
||||
MWIFIEX_FUNC_SHUTDOWN);
|
||||
}
|
||||
|
||||
if (adapter->workqueue)
|
||||
flush_workqueue(adapter->workqueue);
|
||||
|
||||
mwifiex_usb_free(card);
|
||||
|
||||
mwifiex_dbg(adapter, FATAL,
|
||||
"%s: removing card\n", __func__);
|
||||
mwifiex_remove_card(adapter);
|
||||
@ -1356,6 +1351,8 @@ static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
|
||||
{
|
||||
struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
|
||||
|
||||
mwifiex_usb_free(card);
|
||||
|
||||
mwifiex_usb_cleanup_tx_aggr(adapter);
|
||||
|
||||
card->adapter = NULL;
|
||||
|
@ -986,13 +986,15 @@ static void mt7601u_agc_tune(struct mt7601u_dev *dev)
|
||||
*/
|
||||
spin_lock_bh(&dev->con_mon_lock);
|
||||
avg_rssi = ewma_rssi_read(&dev->avg_rssi);
|
||||
WARN_ON_ONCE(avg_rssi == 0);
|
||||
spin_unlock_bh(&dev->con_mon_lock);
|
||||
if (avg_rssi == 0)
|
||||
return;
|
||||
|
||||
avg_rssi = -avg_rssi;
|
||||
if (avg_rssi <= -70)
|
||||
val -= 0x20;
|
||||
else if (avg_rssi <= -60)
|
||||
val -= 0x10;
|
||||
spin_unlock_bh(&dev->con_mon_lock);
|
||||
|
||||
if (val != mt7601u_bbp_rr(dev, 66))
|
||||
mt7601u_bbp_wr(dev, 66, val);
|
||||
|
@ -654,8 +654,7 @@ qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev,
|
||||
vif = qtnf_mac_get_base_vif(mac);
|
||||
if (!vif) {
|
||||
pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (vif->wdev.iftype != NL80211_IFTYPE_STATION) {
|
||||
|
@ -484,18 +484,21 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
|
||||
|
||||
}
|
||||
|
||||
void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
|
||||
void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
del_timer_sync(&rtlpriv->works.watchdog_timer);
|
||||
|
||||
cancel_delayed_work(&rtlpriv->works.watchdog_wq);
|
||||
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
|
||||
cancel_delayed_work(&rtlpriv->works.ps_work);
|
||||
cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
|
||||
cancel_delayed_work(&rtlpriv->works.fwevt_wq);
|
||||
cancel_delayed_work(&rtlpriv->works.c2hcmd_wq);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.watchdog_wq);
|
||||
if (ips_wq)
|
||||
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
|
||||
else
|
||||
cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.ps_work);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.ps_rfon_wq);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.fwevt_wq);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.c2hcmd_wq);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
|
||||
|
||||
|
@ -121,7 +121,7 @@ void rtl_init_rfkill(struct ieee80211_hw *hw);
|
||||
void rtl_deinit_rfkill(struct ieee80211_hw *hw);
|
||||
|
||||
void rtl_watch_dog_timer_callback(struct timer_list *t);
|
||||
void rtl_deinit_deferred_work(struct ieee80211_hw *hw);
|
||||
void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq);
|
||||
|
||||
bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
|
||||
int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht,
|
||||
|
@ -130,7 +130,6 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context,
|
||||
firmware->size);
|
||||
rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
|
||||
}
|
||||
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||
release_firmware(firmware);
|
||||
}
|
||||
|
||||
@ -196,7 +195,7 @@ static void rtl_op_stop(struct ieee80211_hw *hw)
|
||||
/* reset sec info */
|
||||
rtl_cam_reset_sec_info(hw);
|
||||
|
||||
rtl_deinit_deferred_work(hw);
|
||||
rtl_deinit_deferred_work(hw, false);
|
||||
}
|
||||
rtlpriv->intf_ops->adapter_stop(hw);
|
||||
|
||||
|
@ -2377,7 +2377,7 @@ void rtl_pci_disconnect(struct pci_dev *pdev)
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtlmac->mac80211_registered = 0;
|
||||
} else {
|
||||
rtl_deinit_deferred_work(hw);
|
||||
rtl_deinit_deferred_work(hw, false);
|
||||
rtlpriv->intf_ops->adapter_stop(hw);
|
||||
}
|
||||
rtlpriv->cfg->ops->disable_interrupt(hw);
|
||||
|
@ -71,7 +71,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw)
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
/*<1> Stop all timer */
|
||||
rtl_deinit_deferred_work(hw);
|
||||
rtl_deinit_deferred_work(hw, true);
|
||||
|
||||
/*<2> Disable Interrupt */
|
||||
rtlpriv->cfg->ops->disable_interrupt(hw);
|
||||
@ -292,7 +292,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
enum rf_pwrstate rtstate;
|
||||
|
||||
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
|
||||
cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
|
||||
|
||||
mutex_lock(&rtlpriv->locks.ips_mutex);
|
||||
if (ppsc->inactiveps) {
|
||||
|
@ -1132,7 +1132,7 @@ void rtl_usb_disconnect(struct usb_interface *intf)
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtlmac->mac80211_registered = 0;
|
||||
} else {
|
||||
rtl_deinit_deferred_work(hw);
|
||||
rtl_deinit_deferred_work(hw, false);
|
||||
rtlpriv->intf_ops->adapter_stop(hw);
|
||||
}
|
||||
/*deinit rfkill */
|
||||
|
@ -89,6 +89,7 @@ int ptp_set_pinfunc(struct ptp_clock *ptp, unsigned int pin,
|
||||
case PTP_PF_PHYSYNC:
|
||||
if (chan != 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
#ifndef _BPF_CGROUP_H
|
||||
#define _BPF_CGROUP_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/jump_label.h>
|
||||
#include <uapi/linux/bpf.h>
|
||||
|
||||
|
@ -765,8 +765,8 @@ static inline bool bpf_dump_raw_ok(void)
|
||||
struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,
|
||||
const struct bpf_insn *patch, u32 len);
|
||||
|
||||
static inline int __xdp_generic_ok_fwd_dev(struct sk_buff *skb,
|
||||
struct net_device *fwd)
|
||||
static inline int xdp_ok_fwd_dev(const struct net_device *fwd,
|
||||
unsigned int pktlen)
|
||||
{
|
||||
unsigned int len;
|
||||
|
||||
@ -774,7 +774,7 @@ static inline int __xdp_generic_ok_fwd_dev(struct sk_buff *skb,
|
||||
return -ENETDOWN;
|
||||
|
||||
len = fwd->mtu + fwd->hard_header_len + VLAN_HLEN;
|
||||
if (skb->len > len)
|
||||
if (pktlen > len)
|
||||
return -EMSGSIZE;
|
||||
|
||||
return 0;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#define __FSL_GUTS_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
/**
|
||||
* Global Utility Registers.
|
||||
|
@ -105,13 +105,13 @@ static inline bool br_vlan_enabled(const struct net_device *dev)
|
||||
|
||||
static inline int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid)
|
||||
{
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int br_vlan_get_info(const struct net_device *dev, u16 vid,
|
||||
struct bridge_vlan_info *p_vinfo)
|
||||
{
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -109,6 +109,8 @@ struct ip_mc_list {
|
||||
extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u8 proto);
|
||||
extern int igmp_rcv(struct sk_buff *);
|
||||
extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
|
||||
extern int ip_mc_join_group_ssm(struct sock *sk, struct ip_mreqn *imr,
|
||||
unsigned int mode);
|
||||
extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
|
||||
extern void ip_mc_drop_socket(struct sock *sk);
|
||||
extern int ip_mc_source(int add, int omode, struct sock *sk,
|
||||
|
@ -27,6 +27,8 @@
|
||||
*/
|
||||
#define MARVELL_PHY_ID_88E6390 0x01410f90
|
||||
|
||||
#define MARVELL_PHY_FAMILY_ID(id) ((id) >> 4)
|
||||
|
||||
/* struct phy_device dev_flags definitions */
|
||||
#define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001
|
||||
#define MARVELL_PHY_M1118_DNS323_LEDS 0x00000002
|
||||
|
@ -630,6 +630,7 @@ typedef unsigned char *sk_buff_data_t;
|
||||
* @hash: the packet hash
|
||||
* @queue_mapping: Queue mapping for multiqueue devices
|
||||
* @xmit_more: More SKBs are pending for this queue
|
||||
* @pfmemalloc: skbuff was allocated from PFMEMALLOC reserves
|
||||
* @ndisc_nodetype: router type (from link layer)
|
||||
* @ooo_okay: allow the mapping of a socket to a queue to be changed
|
||||
* @l4_hash: indicate hash is a canonical 4-tuple hash over transport
|
||||
@ -735,7 +736,7 @@ struct sk_buff {
|
||||
peeked:1,
|
||||
head_frag:1,
|
||||
xmit_more:1,
|
||||
__unused:1; /* one bit hole */
|
||||
pfmemalloc:1;
|
||||
|
||||
/* fields enclosed in headers_start/headers_end are copied
|
||||
* using a single memcpy() in __copy_skb_header()
|
||||
@ -754,31 +755,30 @@ struct sk_buff {
|
||||
|
||||
__u8 __pkt_type_offset[0];
|
||||
__u8 pkt_type:3;
|
||||
__u8 pfmemalloc:1;
|
||||
__u8 ignore_df:1;
|
||||
|
||||
__u8 nf_trace:1;
|
||||
__u8 ip_summed:2;
|
||||
__u8 ooo_okay:1;
|
||||
|
||||
__u8 l4_hash:1;
|
||||
__u8 sw_hash:1;
|
||||
__u8 wifi_acked_valid:1;
|
||||
__u8 wifi_acked:1;
|
||||
|
||||
__u8 no_fcs:1;
|
||||
/* Indicates the inner headers are valid in the skbuff. */
|
||||
__u8 encapsulation:1;
|
||||
__u8 encap_hdr_csum:1;
|
||||
__u8 csum_valid:1;
|
||||
|
||||
__u8 csum_complete_sw:1;
|
||||
__u8 csum_level:2;
|
||||
__u8 csum_not_inet:1;
|
||||
|
||||
__u8 dst_pending_confirm:1;
|
||||
#ifdef CONFIG_IPV6_NDISC_NODETYPE
|
||||
__u8 ndisc_nodetype:2;
|
||||
#endif
|
||||
__u8 ipvs_property:1;
|
||||
|
||||
__u8 inner_protocol_type:1;
|
||||
__u8 remcsum_offload:1;
|
||||
#ifdef CONFIG_NET_SWITCHDEV
|
||||
|
@ -66,6 +66,12 @@ static inline bool rt6_need_strict(const struct in6_addr *daddr)
|
||||
(IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
|
||||
}
|
||||
|
||||
static inline bool rt6_qualify_for_ecmp(const struct fib6_info *f6i)
|
||||
{
|
||||
return (f6i->fib6_flags & (RTF_GATEWAY|RTF_ADDRCONF|RTF_DYNAMIC)) ==
|
||||
RTF_GATEWAY;
|
||||
}
|
||||
|
||||
void ip6_route_input(struct sk_buff *skb);
|
||||
struct dst_entry *ip6_route_input_lookup(struct net *net,
|
||||
struct net_device *dev,
|
||||
|
@ -355,14 +355,7 @@ struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
|
||||
struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
|
||||
struct ipv6_txoptions *opt,
|
||||
int newtype,
|
||||
struct ipv6_opt_hdr __user *newopt,
|
||||
int newoptlen);
|
||||
struct ipv6_txoptions *
|
||||
ipv6_renew_options_kern(struct sock *sk,
|
||||
struct ipv6_txoptions *opt,
|
||||
int newtype,
|
||||
struct ipv6_opt_hdr *newopt,
|
||||
int newoptlen);
|
||||
struct ipv6_opt_hdr *newopt);
|
||||
struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
|
||||
struct ipv6_txoptions *opt);
|
||||
|
||||
@ -830,7 +823,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
|
||||
* to minimize possbility that any useful information to an
|
||||
* attacker is leaked. Only lower 20 bits are relevant.
|
||||
*/
|
||||
rol32(hash, 16);
|
||||
hash = rol32(hash, 16);
|
||||
|
||||
flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
|
||||
|
||||
@ -1107,6 +1100,8 @@ void ipv6_sysctl_unregister(void);
|
||||
|
||||
int ipv6_sock_mc_join(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
int ipv6_sock_mc_join_ssm(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr, unsigned int mode);
|
||||
int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
#endif /* _NET_IPV6_H */
|
||||
|
@ -65,4 +65,10 @@ extern const struct nft_expr_ops nft_payload_fast_ops;
|
||||
extern struct static_key_false nft_counters_enabled;
|
||||
extern struct static_key_false nft_trace_enabled;
|
||||
|
||||
extern struct nft_set_type nft_set_rhash_type;
|
||||
extern struct nft_set_type nft_set_hash_type;
|
||||
extern struct nft_set_type nft_set_hash_fast_type;
|
||||
extern struct nft_set_type nft_set_rbtree_type;
|
||||
extern struct nft_set_type nft_set_bitmap_type;
|
||||
|
||||
#endif /* _NET_NF_TABLES_CORE_H */
|
||||
|
@ -64,7 +64,7 @@ nf_tproxy_handle_time_wait4(struct net *net, struct sk_buff *skb,
|
||||
* belonging to established connections going through that one.
|
||||
*/
|
||||
struct sock *
|
||||
nf_tproxy_get_sock_v4(struct net *net, struct sk_buff *skb, void *hp,
|
||||
nf_tproxy_get_sock_v4(struct net *net, struct sk_buff *skb,
|
||||
const u8 protocol,
|
||||
const __be32 saddr, const __be32 daddr,
|
||||
const __be16 sport, const __be16 dport,
|
||||
@ -103,7 +103,7 @@ nf_tproxy_handle_time_wait6(struct sk_buff *skb, int tproto, int thoff,
|
||||
struct sock *sk);
|
||||
|
||||
struct sock *
|
||||
nf_tproxy_get_sock_v6(struct net *net, struct sk_buff *skb, int thoff, void *hp,
|
||||
nf_tproxy_get_sock_v6(struct net *net, struct sk_buff *skb, int thoff,
|
||||
const u8 protocol,
|
||||
const struct in6_addr *saddr, const struct in6_addr *daddr,
|
||||
const __be16 sport, const __be16 dport,
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include <linux/tc_act/tc_csum.h>
|
||||
|
||||
struct tcf_csum_params {
|
||||
int action;
|
||||
u32 update_flags;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
@ -18,7 +18,6 @@
|
||||
struct tcf_tunnel_key_params {
|
||||
struct rcu_head rcu;
|
||||
int tcft_action;
|
||||
int action;
|
||||
struct metadata_dst *tcft_enc_metadata;
|
||||
};
|
||||
|
||||
|
@ -828,6 +828,10 @@ struct tcp_skb_cb {
|
||||
|
||||
#define TCP_SKB_CB(__skb) ((struct tcp_skb_cb *)&((__skb)->cb[0]))
|
||||
|
||||
static inline void bpf_compute_data_end_sk_skb(struct sk_buff *skb)
|
||||
{
|
||||
TCP_SKB_CB(skb)->bpf.data_end = skb->data + skb_headlen(skb);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
/* This is the variant of inet6_iif() that must be used by TCP,
|
||||
@ -908,8 +912,6 @@ enum tcp_ca_event {
|
||||
CA_EVENT_LOSS, /* loss timeout */
|
||||
CA_EVENT_ECN_NO_CE, /* ECT set, but not CE marked */
|
||||
CA_EVENT_ECN_IS_CE, /* received CE marked IP packet */
|
||||
CA_EVENT_DELAYED_ACK, /* Delayed ack is sent */
|
||||
CA_EVENT_NON_DELAYED_ACK,
|
||||
};
|
||||
|
||||
/* Information about inbound ACK, passed to cong_ops->in_ack_event() */
|
||||
|
@ -60,6 +60,10 @@ struct xdp_sock {
|
||||
bool zc;
|
||||
/* Protects multiple processes in the control path */
|
||||
struct mutex mutex;
|
||||
/* Mutual exclusion of NAPI TX thread and sendmsg error paths
|
||||
* in the SKB destructor callback.
|
||||
*/
|
||||
spinlock_t tx_completion_lock;
|
||||
u64 rx_dropped;
|
||||
};
|
||||
|
||||
|
@ -226,7 +226,7 @@ enum tunable_id {
|
||||
ETHTOOL_TX_COPYBREAK,
|
||||
ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
|
||||
/*
|
||||
* Add your fresh new tubale attribute above and remember to update
|
||||
* Add your fresh new tunable attribute above and remember to update
|
||||
* tunable_strings[] in net/core/ethtool.c
|
||||
*/
|
||||
__ETHTOOL_TUNABLE_COUNT,
|
||||
|
@ -127,6 +127,10 @@ enum {
|
||||
|
||||
#define TCP_CM_INQ TCP_INQ
|
||||
|
||||
#define TCP_REPAIR_ON 1
|
||||
#define TCP_REPAIR_OFF 0
|
||||
#define TCP_REPAIR_OFF_NO_WP -1 /* Turn off without window probes */
|
||||
|
||||
struct tcp_repair_opt {
|
||||
__u32 opt_code;
|
||||
__u32 opt_val;
|
||||
|
@ -991,16 +991,13 @@ static void btf_int_bits_seq_show(const struct btf *btf,
|
||||
void *data, u8 bits_offset,
|
||||
struct seq_file *m)
|
||||
{
|
||||
u16 left_shift_bits, right_shift_bits;
|
||||
u32 int_data = btf_type_int(t);
|
||||
u16 nr_bits = BTF_INT_BITS(int_data);
|
||||
u16 total_bits_offset;
|
||||
u16 nr_copy_bytes;
|
||||
u16 nr_copy_bits;
|
||||
u8 nr_upper_bits;
|
||||
union {
|
||||
u64 u64_num;
|
||||
u8 u8_nums[8];
|
||||
} print_num;
|
||||
u64 print_num;
|
||||
|
||||
total_bits_offset = bits_offset + BTF_INT_OFFSET(int_data);
|
||||
data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
|
||||
@ -1008,21 +1005,20 @@ static void btf_int_bits_seq_show(const struct btf *btf,
|
||||
nr_copy_bits = nr_bits + bits_offset;
|
||||
nr_copy_bytes = BITS_ROUNDUP_BYTES(nr_copy_bits);
|
||||
|
||||
print_num.u64_num = 0;
|
||||
memcpy(&print_num.u64_num, data, nr_copy_bytes);
|
||||
print_num = 0;
|
||||
memcpy(&print_num, data, nr_copy_bytes);
|
||||
|
||||
/* Ditch the higher order bits */
|
||||
nr_upper_bits = BITS_PER_BYTE_MASKED(nr_copy_bits);
|
||||
if (nr_upper_bits) {
|
||||
/* We need to mask out some bits of the upper byte. */
|
||||
u8 mask = (1 << nr_upper_bits) - 1;
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
left_shift_bits = bits_offset;
|
||||
#else
|
||||
left_shift_bits = BITS_PER_U64 - nr_copy_bits;
|
||||
#endif
|
||||
right_shift_bits = BITS_PER_U64 - nr_bits;
|
||||
|
||||
print_num.u8_nums[nr_copy_bytes - 1] &= mask;
|
||||
}
|
||||
print_num <<= left_shift_bits;
|
||||
print_num >>= right_shift_bits;
|
||||
|
||||
print_num.u64_num >>= bits_offset;
|
||||
|
||||
seq_printf(m, "0x%llx", print_num.u64_num);
|
||||
seq_printf(m, "0x%llx", print_num);
|
||||
}
|
||||
|
||||
static void btf_int_seq_show(const struct btf *btf, const struct btf_type *t,
|
||||
|
@ -334,10 +334,15 @@ int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_buff *xdp,
|
||||
{
|
||||
struct net_device *dev = dst->dev;
|
||||
struct xdp_frame *xdpf;
|
||||
int err;
|
||||
|
||||
if (!dev->netdev_ops->ndo_xdp_xmit)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = xdp_ok_fwd_dev(dev, xdp->data_end - xdp->data);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
xdpf = convert_to_xdp_frame(xdp);
|
||||
if (unlikely(!xdpf))
|
||||
return -EOVERFLOW;
|
||||
@ -350,7 +355,7 @@ int dev_map_generic_redirect(struct bpf_dtab_netdev *dst, struct sk_buff *skb,
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __xdp_generic_ok_fwd_dev(skb, dst->dev);
|
||||
err = xdp_ok_fwd_dev(dst->dev, skb->len);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
skb->dev = dst->dev;
|
||||
|
@ -747,13 +747,15 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
|
||||
* old element will be freed immediately.
|
||||
* Otherwise return an error
|
||||
*/
|
||||
atomic_dec(&htab->count);
|
||||
return ERR_PTR(-E2BIG);
|
||||
l_new = ERR_PTR(-E2BIG);
|
||||
goto dec_count;
|
||||
}
|
||||
l_new = kmalloc_node(htab->elem_size, GFP_ATOMIC | __GFP_NOWARN,
|
||||
htab->map.numa_node);
|
||||
if (!l_new)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (!l_new) {
|
||||
l_new = ERR_PTR(-ENOMEM);
|
||||
goto dec_count;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(l_new->key, key, key_size);
|
||||
@ -766,7 +768,8 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
|
||||
GFP_ATOMIC | __GFP_NOWARN);
|
||||
if (!pptr) {
|
||||
kfree(l_new);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
l_new = ERR_PTR(-ENOMEM);
|
||||
goto dec_count;
|
||||
}
|
||||
}
|
||||
|
||||
@ -780,6 +783,9 @@ static struct htab_elem *alloc_htab_elem(struct bpf_htab *htab, void *key,
|
||||
|
||||
l_new->hash = hash;
|
||||
return l_new;
|
||||
dec_count:
|
||||
atomic_dec(&htab->count);
|
||||
return l_new;
|
||||
}
|
||||
|
||||
static int check_flags(struct bpf_htab *htab, struct htab_elem *l_old,
|
||||
|
@ -312,10 +312,12 @@ static void bpf_tcp_close(struct sock *sk, long timeout)
|
||||
struct smap_psock *psock;
|
||||
struct sock *osk;
|
||||
|
||||
lock_sock(sk);
|
||||
rcu_read_lock();
|
||||
psock = smap_psock_sk(sk);
|
||||
if (unlikely(!psock)) {
|
||||
rcu_read_unlock();
|
||||
release_sock(sk);
|
||||
return sk->sk_prot->close(sk, timeout);
|
||||
}
|
||||
|
||||
@ -371,6 +373,7 @@ static void bpf_tcp_close(struct sock *sk, long timeout)
|
||||
e = psock_map_pop(sk, psock);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
release_sock(sk);
|
||||
close_fun(sk, timeout);
|
||||
}
|
||||
|
||||
@ -568,7 +571,8 @@ static int free_sg(struct sock *sk, int start, struct sk_msg_buff *md)
|
||||
while (sg[i].length) {
|
||||
free += sg[i].length;
|
||||
sk_mem_uncharge(sk, sg[i].length);
|
||||
put_page(sg_page(&sg[i]));
|
||||
if (!md->skb)
|
||||
put_page(sg_page(&sg[i]));
|
||||
sg[i].length = 0;
|
||||
sg[i].page_link = 0;
|
||||
sg[i].offset = 0;
|
||||
@ -577,6 +581,8 @@ static int free_sg(struct sock *sk, int start, struct sk_msg_buff *md)
|
||||
if (i == MAX_SKB_FRAGS)
|
||||
i = 0;
|
||||
}
|
||||
if (md->skb)
|
||||
consume_skb(md->skb);
|
||||
|
||||
return free;
|
||||
}
|
||||
@ -1230,7 +1236,7 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
|
||||
*/
|
||||
TCP_SKB_CB(skb)->bpf.sk_redir = NULL;
|
||||
skb->sk = psock->sock;
|
||||
bpf_compute_data_pointers(skb);
|
||||
bpf_compute_data_end_sk_skb(skb);
|
||||
preempt_disable();
|
||||
rc = (*prog->bpf_func)(skb, prog->insnsi);
|
||||
preempt_enable();
|
||||
@ -1485,7 +1491,7 @@ static int smap_parse_func_strparser(struct strparser *strp,
|
||||
* any socket yet.
|
||||
*/
|
||||
skb->sk = psock->sock;
|
||||
bpf_compute_data_pointers(skb);
|
||||
bpf_compute_data_end_sk_skb(skb);
|
||||
rc = (*prog->bpf_func)(skb, prog->insnsi);
|
||||
skb->sk = NULL;
|
||||
rcu_read_unlock();
|
||||
@ -1896,7 +1902,7 @@ static int __sock_map_ctx_update_elem(struct bpf_map *map,
|
||||
e = kzalloc(sizeof(*e), GFP_ATOMIC | __GFP_NOWARN);
|
||||
if (!e) {
|
||||
err = -ENOMEM;
|
||||
goto out_progs;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2069,7 +2075,13 @@ static int sock_map_update_elem(struct bpf_map *map,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
lock_sock(skops.sk);
|
||||
preempt_disable();
|
||||
rcu_read_lock();
|
||||
err = sock_map_ctx_update_elem(&skops, map, key, flags);
|
||||
rcu_read_unlock();
|
||||
preempt_enable();
|
||||
release_sock(skops.sk);
|
||||
fput(socket->file);
|
||||
return err;
|
||||
}
|
||||
@ -2342,7 +2354,10 @@ static int sock_hash_ctx_update_elem(struct bpf_sock_ops_kern *skops,
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
/* bpf_map_update_elem() can be called in_irq() */
|
||||
/* psock is valid here because otherwise above *ctx_update_elem would
|
||||
* have thrown an error. It is safe to skip error check.
|
||||
*/
|
||||
psock = smap_psock_sk(sock);
|
||||
raw_spin_lock_bh(&b->lock);
|
||||
l_old = lookup_elem_raw(head, hash, key, key_size);
|
||||
if (l_old && map_flags == BPF_NOEXIST) {
|
||||
@ -2360,12 +2375,6 @@ static int sock_hash_ctx_update_elem(struct bpf_sock_ops_kern *skops,
|
||||
goto bucket_err;
|
||||
}
|
||||
|
||||
psock = smap_psock_sk(sock);
|
||||
if (unlikely(!psock)) {
|
||||
err = -EINVAL;
|
||||
goto bucket_err;
|
||||
}
|
||||
|
||||
rcu_assign_pointer(e->hash_link, l_new);
|
||||
rcu_assign_pointer(e->htab,
|
||||
container_of(map, struct bpf_htab, map));
|
||||
@ -2388,12 +2397,10 @@ static int sock_hash_ctx_update_elem(struct bpf_sock_ops_kern *skops,
|
||||
raw_spin_unlock_bh(&b->lock);
|
||||
return 0;
|
||||
bucket_err:
|
||||
smap_release_sock(psock, sock);
|
||||
raw_spin_unlock_bh(&b->lock);
|
||||
err:
|
||||
kfree(e);
|
||||
psock = smap_psock_sk(sock);
|
||||
if (psock)
|
||||
smap_release_sock(psock, sock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -2415,7 +2422,13 @@ static int sock_hash_update_elem(struct bpf_map *map,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
lock_sock(skops.sk);
|
||||
preempt_disable();
|
||||
rcu_read_lock();
|
||||
err = sock_hash_ctx_update_elem(&skops, map, key, flags);
|
||||
rcu_read_unlock();
|
||||
preempt_enable();
|
||||
release_sock(skops.sk);
|
||||
fput(socket->file);
|
||||
return err;
|
||||
}
|
||||
@ -2472,10 +2485,8 @@ struct sock *__sock_hash_lookup_elem(struct bpf_map *map, void *key)
|
||||
b = __select_bucket(htab, hash);
|
||||
head = &b->head;
|
||||
|
||||
raw_spin_lock_bh(&b->lock);
|
||||
l = lookup_elem_raw(head, hash, key, key_size);
|
||||
sk = l ? l->sk : NULL;
|
||||
raw_spin_unlock_bh(&b->lock);
|
||||
return sk;
|
||||
}
|
||||
|
||||
|
@ -735,7 +735,9 @@ static int map_update_elem(union bpf_attr *attr)
|
||||
if (bpf_map_is_dev_bound(map)) {
|
||||
err = bpf_map_offload_update_elem(map, key, value, attr->flags);
|
||||
goto out;
|
||||
} else if (map->map_type == BPF_MAP_TYPE_CPUMAP) {
|
||||
} else if (map->map_type == BPF_MAP_TYPE_CPUMAP ||
|
||||
map->map_type == BPF_MAP_TYPE_SOCKHASH ||
|
||||
map->map_type == BPF_MAP_TYPE_SOCKMAP) {
|
||||
err = map->ops->map_update_elem(map, key, value, attr->flags);
|
||||
goto out;
|
||||
}
|
||||
|
@ -5430,6 +5430,10 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
||||
if (insn->code != (BPF_JMP | BPF_CALL) ||
|
||||
insn->src_reg != BPF_PSEUDO_CALL)
|
||||
continue;
|
||||
/* Upon error here we cannot fall back to interpreter but
|
||||
* need a hard reject of the program. Thus -EFAULT is
|
||||
* propagated in any case.
|
||||
*/
|
||||
subprog = find_subprog(env, i + insn->imm + 1);
|
||||
if (subprog < 0) {
|
||||
WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
|
||||
@ -5450,7 +5454,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
||||
|
||||
func = kcalloc(env->subprog_cnt, sizeof(prog), GFP_KERNEL);
|
||||
if (!func)
|
||||
return -ENOMEM;
|
||||
goto out_undo_insn;
|
||||
|
||||
for (i = 0; i < env->subprog_cnt; i++) {
|
||||
subprog_start = subprog_end;
|
||||
@ -5515,7 +5519,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
||||
tmp = bpf_int_jit_compile(func[i]);
|
||||
if (tmp != func[i] || func[i]->bpf_func != old_bpf_func) {
|
||||
verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
|
||||
err = -EFAULT;
|
||||
err = -ENOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
cond_resched();
|
||||
@ -5552,6 +5556,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
||||
if (func[i])
|
||||
bpf_jit_free(func[i]);
|
||||
kfree(func);
|
||||
out_undo_insn:
|
||||
/* cleanup main prog to be interpreted */
|
||||
prog->jit_requested = 0;
|
||||
for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
|
||||
@ -5578,6 +5583,8 @@ static int fixup_call_args(struct bpf_verifier_env *env)
|
||||
err = jit_subprogs(env);
|
||||
if (err == 0)
|
||||
return 0;
|
||||
if (err == -EFAULT)
|
||||
return err;
|
||||
}
|
||||
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
|
||||
for (i = 0; i < prog->len; i++, insn++) {
|
||||
|
@ -774,7 +774,7 @@ int rhashtable_walk_start_check(struct rhashtable_iter *iter)
|
||||
skip++;
|
||||
if (list == iter->list) {
|
||||
iter->p = p;
|
||||
skip = skip;
|
||||
iter->skip = skip;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
@ -964,8 +964,16 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_stop);
|
||||
|
||||
static size_t rounded_hashtable_size(const struct rhashtable_params *params)
|
||||
{
|
||||
return max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
|
||||
(unsigned long)params->min_size);
|
||||
size_t retsize;
|
||||
|
||||
if (params->nelem_hint)
|
||||
retsize = max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
|
||||
(unsigned long)params->min_size);
|
||||
else
|
||||
retsize = max(HASH_DEFAULT_SIZE,
|
||||
(unsigned long)params->min_size);
|
||||
|
||||
return retsize;
|
||||
}
|
||||
|
||||
static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
|
||||
@ -1022,8 +1030,6 @@ int rhashtable_init(struct rhashtable *ht,
|
||||
struct bucket_table *tbl;
|
||||
size_t size;
|
||||
|
||||
size = HASH_DEFAULT_SIZE;
|
||||
|
||||
if ((!params->key_len && !params->obj_hashfn) ||
|
||||
(params->obj_hashfn && !params->obj_cmpfn))
|
||||
return -EINVAL;
|
||||
@ -1050,8 +1056,7 @@ int rhashtable_init(struct rhashtable *ht,
|
||||
|
||||
ht->p.min_size = max_t(u16, ht->p.min_size, HASH_MIN_SIZE);
|
||||
|
||||
if (params->nelem_hint)
|
||||
size = rounded_hashtable_size(&ht->p);
|
||||
size = rounded_hashtable_size(&ht->p);
|
||||
|
||||
if (params->locks_mul)
|
||||
ht->p.locks_mul = roundup_pow_of_two(params->locks_mul);
|
||||
@ -1143,13 +1148,14 @@ void rhashtable_free_and_destroy(struct rhashtable *ht,
|
||||
void (*free_fn)(void *ptr, void *arg),
|
||||
void *arg)
|
||||
{
|
||||
struct bucket_table *tbl;
|
||||
struct bucket_table *tbl, *next_tbl;
|
||||
unsigned int i;
|
||||
|
||||
cancel_work_sync(&ht->run_work);
|
||||
|
||||
mutex_lock(&ht->mutex);
|
||||
tbl = rht_dereference(ht->tbl, ht);
|
||||
restart:
|
||||
if (free_fn) {
|
||||
for (i = 0; i < tbl->size; i++) {
|
||||
struct rhash_head *pos, *next;
|
||||
@ -1166,7 +1172,12 @@ void rhashtable_free_and_destroy(struct rhashtable *ht,
|
||||
}
|
||||
}
|
||||
|
||||
next_tbl = rht_dereference(tbl->future_tbl, ht);
|
||||
bucket_table_free(tbl);
|
||||
if (next_tbl) {
|
||||
tbl = next_tbl;
|
||||
goto restart;
|
||||
}
|
||||
mutex_unlock(&ht->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rhashtable_free_and_destroy);
|
||||
|
@ -2732,7 +2732,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_gw_node *curr_gw;
|
||||
struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@ -2780,6 +2780,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
if (curr_gw)
|
||||
batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
||||
|
@ -927,7 +927,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_gw_node *curr_gw;
|
||||
struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@ -995,6 +995,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
if (curr_gw)
|
||||
batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "debugfs.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/dcache.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
@ -343,6 +344,25 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
|
||||
* @hard_iface: hard interface which was renamed
|
||||
*/
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
const char *name = hard_iface->net_dev->name;
|
||||
struct dentry *dir;
|
||||
struct dentry *d;
|
||||
|
||||
dir = hard_iface->debug_dir;
|
||||
if (!dir)
|
||||
return;
|
||||
|
||||
d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
if (!d)
|
||||
pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_del_hardif() - delete the base directory for a hard interface
|
||||
* in debugfs.
|
||||
@ -413,6 +433,26 @@ int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_rename_meshif() - Fix debugfs path for renamed softif
|
||||
* @dev: net_device which was renamed
|
||||
*/
|
||||
void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
const char *name = dev->name;
|
||||
struct dentry *dir;
|
||||
struct dentry *d;
|
||||
|
||||
dir = bat_priv->debug_dir;
|
||||
if (!dir)
|
||||
return;
|
||||
|
||||
d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
if (!d)
|
||||
pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_del_meshif() - Remove interface dependent debugfs entries
|
||||
* @dev: netdev struct of the soft interface
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user