* Re: [PATCH] netdevice: fix sparse warning for HARD_TX_LOCK
From: David Miller @ 2016-11-27 20:44 UTC (permalink / raw)
To: mst; +Cc: linux-kernel, netdev
In-Reply-To: <1479963754-24105-1-git-send-email-mst@redhat.com>
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: Thu, 24 Nov 2016 07:04:08 +0200
> sparse warns about context imbalance in any code
> that uses HARD_TX_LOCK/UNLOCK - this is because it's
> unable to determine that flags don't change so
> lock and unlock are paired.
>
> Seems easy enough to fix by adding __acquire/__release
> calls.
>
> With this patch af_packet.c is now sparse-clean,
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Applied to net-next, thanks.
^ permalink raw reply
* [PATCH] mv88e6xxx: Fix mv88e6xxx_g1_irq_free() interrupt count
From: Andreas Färber @ 2016-11-27 20:43 UTC (permalink / raw)
To: netdev
Cc: linux-arm-kernel, Uwe Kleine-König, Michal Hrusecki,
Tomas Hlavacek, Bedřicha Košatu, Andreas Färber,
Andrew Lunn, Vivien Didelot, Florian Fainelli, linux-kernel
mv88e6xxx_g1_irq_setup() sets up chip->g1_irq.nirqs interrupt mappings,
so free the same amount. This will be 8 or 9 in practice, less than 16.
Fixes: dc30c35be720 ("net: dsa: mv88e6xxx: Implement interrupt support.")
Cc: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
drivers/net/dsa/mv88e6xxx/chip.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 98302358ceb9..95b9efb33ec7 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -421,7 +421,7 @@ static void mv88e6xxx_g1_irq_free(struct mv88e6xxx_chip *chip)
free_irq(chip->irq, chip);
- for (irq = 0; irq < 16; irq++) {
+ for (irq = 0; irq < chip->g1_irq.nirqs; irq++) {
virq = irq_find_mapping(chip->g1_irq.domain, irq);
irq_dispose_mapping(virq);
}
--
2.6.6
^ permalink raw reply related
* Re: [PATCH net-next v2 0/4] Documentation: net: phy: Improve documentation
From: Martin Blumenstingl @ 2016-11-27 20:32 UTC (permalink / raw)
To: Florian Fainelli
Cc: netdev, davem, andrew, sf84, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet
In-Reply-To: <20161127184449.12351-1-f.fainelli@gmail.com>
On Sun, Nov 27, 2016 at 7:44 PM, Florian Fainelli <f.fainelli@gmail.com> wrote:
> Hi all,
>
> This patch series addresses discussions and feedback that was recently received
> on the mailing-list in the area of: flow control/pause frames, interpretation of
> phy_interface_t and finally add some links to useful standards documents.
>
> Changes in v2:
>
> - clarify a few things in the RGMII section, add a paragraph about common issues
> with RGMII delay mismatches
Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Thanks a lot Florian, this will definitely help others in the future!
> Florian Fainelli (4):
> Documentation: net: phy: remove description of function pointers
> Documentation: net: phy: Add a paragraph about pause frames/flow
> control
> Documentation: net: phy: Add blurb about RGMII
> Documentation: net: phy: Add links to several standards documents
>
> Documentation/networking/phy.txt | 139 +++++++++++++++++++++++++++++----------
> 1 file changed, 104 insertions(+), 35 deletions(-)
>
> --
> 2.9.3
>
^ permalink raw reply
* Re: [PATCH v3] cpsw: ethtool: add support for getting/setting EEE registers
From: David Miller @ 2016-11-27 20:27 UTC (permalink / raw)
To: yegorslists
Cc: netdev, linux-omap, grygorii.strashko, mugunthanvnm, roszenrami,
f.fainelli
In-Reply-To: <1479979021-13715-1-git-send-email-yegorslists@googlemail.com>
From: yegorslists@googlemail.com
Date: Thu, 24 Nov 2016 10:17:01 +0100
> From: Yegor Yefremov <yegorslists@googlemail.com>
>
> Add the ability to query and set Energy Efficient Ethernet parameters
> via ethtool for applicable devices.
>
> This patch doesn't activate full EEE support in cpsw driver, but it
> enables reading and writing EEE advertising settings. This way one
> can disable advertising EEE for certain speeds.
>
> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> Acked-by: Rami Rosen <roszenrami@gmail.com>
> ---
> Changes:
> v3: explain what features will be available with this patch (Florian Fainelli)
> v2: make routines static (Rami Rosen)
Does not apply cleanly to net-next, please respin.
^ permalink raw reply
* Re: [PATCH net-next 1/1] ptp: gianfar: Use high resolution frequency method.
From: David Miller @ 2016-11-27 20:27 UTC (permalink / raw)
To: ulrik.debie-os; +Cc: netdev, richardcochran
In-Reply-To: <20161123201104.9706-1-ulrik.debie-os@e2big.org>
From: Ulrik De Bie <ulrik.debie-os@e2big.org>
Date: Wed, 23 Nov 2016 21:11:04 +0100
> This patch depends on commit d8d263541913 ("ptp: Introduce a high
> resolution frequency adjustment method.")
>
> The gianfar devices offer a frequency resolution of about 0.46 ppb
> (depends on actual value of tmr_add, for the calculation assumed
> 0x80000000). This patch lets users of the device benefit from the increased
> frequency resolution when tuning the clock. Thanks to the rounding the
> maximum error between the requested frequency and the applied frequency
> will then be about 0.23 ppb.
>
> Tested on a v3.3.8 kernel on a real gianfar device. Verified compilation
> on net-next (currently at v4.9-rc5).
>
> Signed-off-by: Ulrik De Bie <ulrik.debie-os@e2big.org>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] mlx4: do not use priv->stats_lock in mlx4_en_auto_moderation()
From: David Miller @ 2016-11-27 20:26 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev, tariqt
In-Reply-To: <1479923212.8455.515.camel@edumazet-glaptop3.roam.corp.google.com>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Wed, 23 Nov 2016 09:46:52 -0800
> From: Eric Dumazet <edumazet@google.com>
>
> Per RX ring packets/bytes counters are not protected by global
> priv->stats_lock.
>
> Better not confuse the reader, and use READ_ONCE() to show we read
> these counters without surrounding synchronization.
>
> Interrupt moderation is best effort, and we do not really care of
> ultra precise counters.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied.
^ permalink raw reply
* Re: [PATCH v2] ipv6:ipv6_pinfo dereferenced after NULL check
From: David Miller @ 2016-11-27 20:25 UTC (permalink / raw)
To: manjeet.p
Cc: kuznet, jmorris, yoshfuji, kaber, netdev, linux-kernel, pankaj.m,
ajeet.y, r.thapliyal, hannes
In-Reply-To: <1479984117-39005-1-git-send-email-manjeet.p@samsung.com>
From: Manjeet Pawar <manjeet.p@samsung.com>
Date: Thu, 24 Nov 2016 16:11:57 +0530
> From: Rohit Thapliyal <r.thapliyal@samsung.com>
>
> np checked for NULL and then dereferenced. It should be modified
> for NULL case.
>
> Signed-off-by: Rohit Thapliyal <r.thapliyal@samsung.com>
> Signed-off-by: Manjeet Pawar <manjeet.p@samsung.com>
> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Reviewed-by: Akhilesh Kumar <akhilesh.k@samsung.com>
I do not think inet6_sk(sk) can ever be NULL in this function.
All callers fall into two categories:
1) Calls where arguments already dereference np in some way to
pass arguments to ip6_xmit():
net/dccp/ipv6.c: err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
net/ipv6/inet6_connection_sock.c: res = ip6_xmit(sk, skb, &fl6, rcu_dereference(np->opt),
net/ipv6/tcp_ipv6.c: err = ip6_xmit(sk, skb, fl6, opt, np->tclass);
net/sctp/ipv6.c: res = ip6_xmit(sk, skb, fl6, rcu_dereference(np->opt), np->tclass);
2) Calls where the socket is a "control" socket which is initialized
at procotol registration time and therefore definitely has
a proper inet6_sk() pointer set up.
net/dccp/ipv6.c: ip6_xmit(ctl_sk, skb, &fl6, NULL, 0);
net/ipv6/tcp_ipv6.c: ip6_xmit(ctl_sk, buff, &fl6, NULL, tclass);
Therefore, I think we should simply remove the NULL test entirely.
^ permalink raw reply
* Re: [PATCH net-next 09/11] qede: Better utilize the qede_[rt]x_queue
From: David Miller @ 2016-11-27 20:16 UTC (permalink / raw)
To: Yuval.Mintz; +Cc: lkp, netdev
In-Reply-To: <BL2PR07MB23064E75618105466EAA79A68D8B0@BL2PR07MB2306.namprd07.prod.outlook.com>
From: "Mintz, Yuval" <Yuval.Mintz@cavium.com>
Date: Sun, 27 Nov 2016 16:15:42 +0000
> I'd say this is a false positive, given that MTU can't be so large.
False positive or not you must fix the warning and resubmit this
series with that fixed.
^ permalink raw reply
* [PATCH] rtlwifi: Add updates for RTL8723BE and RTL8821AE
From: Larry Finger @ 2016-11-27 19:28 UTC (permalink / raw)
To: linux-firmware-DgEjT+Ai2ygdnm+yROfE0A
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA, Larry Finger,
netdev-u79uwXL29TY76Z2rM5mHXA
The new versions will only work with new versions of the drivers. For
that reason, they are given new names and the old versions are retained.
Signed-off-by: Larry Finger <Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
---
WHENCE | 4 ++++
rtlwifi/rtl8723befw_36.bin | Bin 0 -> 31762 bytes
rtlwifi/rtl8821aefw_29.bin | Bin 0 -> 28348 bytes
3 files changed, 4 insertions(+)
create mode 100644 rtlwifi/rtl8723befw_36.bin
create mode 100644 rtlwifi/rtl8821aefw_29.bin
diff --git a/WHENCE b/WHENCE
index 90d6e4d..c31fe15 100644
--- a/WHENCE
+++ b/WHENCE
@@ -2329,6 +2329,8 @@ Driver: rtl8723be - Realtek 802.11n WLAN driver for RTL8723BE
Info: From Vendor's realtek/rtlwifi_linux_mac80211_0019.0320.2014V628 driver
File: rtlwifi/rtl8723befw.bin
+Info: Update to version 36 - Sent by Realtek
+File: rtlwifi/rtl8723befw_36.bin
Licence: Redistributable. See LICENCE.rtlwifi_firmware.txt for details.
@@ -2370,6 +2372,8 @@ Driver: rtl8821ae - Realtek 802.11n WLAN driver for RTL8821AE
Info: From Vendor's realtek/rtlwifi_linux_mac80211_0019.0320.2014V628 driver
File: rtlwifi/rtl8821aefw.bin
File: rtlwifi/rtl8821aefw_wowlan.bin
+Info: Update to version 29 - Sent by Realtek
+File: rtlwifi/rtl8821aefw_29.bin
Licence: Redistributable. See LICENCE.rtlwifi_firmware.txt for details.
diff --git a/rtlwifi/rtl8723befw_36.bin b/rtlwifi/rtl8723befw_36.bin
new file mode 100644
index 0000000000000000000000000000000000000000..1bb9b9c8cea95689a0d27f9d7c264ad63728dde1
GIT binary patch
literal 31762
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
M8dR)JhVGZ{SDBkI`Tzg`
literal 0
HcmV?d00001
diff --git a/rtlwifi/rtl8821aefw_29.bin b/rtlwifi/rtl8821aefw_29.bin
new file mode 100644
index 0000000000000000000000000000000000000000..f0acde46948149dd6c49d203814e2dc417b07e91
GIT binary patch
literal 28348
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
Ow{ZbD-Q0C;TmLUs$&o4m
literal 0
HcmV?d00001
--
2.10.0
^ permalink raw reply related
* Xmas Offer
From: Mrs Julie Leach @ 2016-11-27 19:22 UTC (permalink / raw)
To: Recipients
You are a recipient to Mrs Julie Leach Donation of $3 million USD. Contact ( julieleach93@gmail.com ) for claims.
^ permalink raw reply
* [PATCH net-next v2 3/4] Documentation: net: phy: Add blurb about RGMII
From: Florian Fainelli @ 2016-11-27 18:44 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet, Florian Fainelli
In-Reply-To: <20161127184449.12351-1-f.fainelli@gmail.com>
RGMII is a recurring source of pain for people with Gigabit Ethernet
hardware since it may require PHY driver and MAC driver level
configuration hints. Document what are the expectations from PHYLIB and
what options exist.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
Documentation/networking/phy.txt | 76 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt
index 9a42a9414cea..7a0cb1212b9e 100644
--- a/Documentation/networking/phy.txt
+++ b/Documentation/networking/phy.txt
@@ -65,6 +65,82 @@ The MDIO bus
drivers/net/ethernet/freescale/fsl_pq_mdio.c and an associated DTS file
for one of the users. (e.g. "git grep fsl,.*-mdio arch/powerpc/boot/dts/")
+(RG)MII/electrical interface considerations
+
+ The Reduced Gigabit Medium Independent Interface (RGMII) is a 12 pins
+ electrical signal interface using a synchronous 125Mhz clock signal and several
+ data lines. Due to this design decision, a 1.5ns to 2ns delay must be added
+ between the clock line (RXC or TXC) and the data lines to let the PHY (clock
+ sink) have enough setup and hold times to sample the data lines correctly. The
+ PHY library offers different types of PHY_INTERFACE_MODE_RGMII* values to let
+ the PHY driver and optionaly the MAC driver implement the required delay. The
+ values of phy_interface_t must be understood from the perspective of the PHY
+ device itself, leading to the following:
+
+ * PHY_INTERFACE_MODE_RGMII: the PHY is not responsible for inserting any
+ internal delay by itself, it assumes that either the Ethernet MAC (if capable
+ or the PCB traces) insert the correct 1.5-2ns delay
+
+ * PHY_INTERFACE_MODE_RGMII_TXID: the PHY should be inserting an internal delay
+ for the transmit data lines (TXD[3:0]) processed by the PHY device
+
+ * PHY_INTERFACE_MODE_RGMII_RXID: the PHY should be inserting an internal delay
+ for the receive data lines (RXD[3:0]) processed by the PHY device
+
+ * PHY_INTERFACE_MODE_RGMII_ID: the PHY should be inserting internal delays for
+ both transmit AND receive data lines from/to the PHY device
+
+ Whenever it is possible, it is preferrable to utilize the PHY side RGMII delay
+ for several reasons:
+
+ * PHY devices may offer sub-nanosecond granularity in how they allow a
+ receiver/transmitter side delay (e.g: 0.5, 1.0, 1.5ns) to be specified. Such
+ precision may be required to account for differences in PCB trace lengths
+
+ * PHY devices are typically qualified for a large range of applications
+ (industrial, medical, automotive...), and they provide a constant and
+ reliable delay across temperature/pressure/voltage ranges
+
+ * PHY device drivers in PHYLIB being reusable by nature, being able to
+ configure correctly a specified delay enables more designs with similar delay
+ requirements to be operate correctly
+
+ For cases where the PHY is not capable of providing this delay, but the
+ Ethernet MAC driver is capable of doing it, the correct phy_interface_t value
+ should be PHY_INTERFACE_MODE_RGMII, and the Ethernet MAC driver should be
+ configured correctly in order to provide the required transmit and/or receive
+ side delay from the perspective of the PHY device. Conversely, if the Ethernet
+ MAC driver looks at the phy_interface_t value, for any other mode but
+ PHY_INTERFACE_MODE_RGMII, it should make sure that the MAC-level delays are
+ disabled.
+
+ In case neither the Ethernet MAC, nor the PHY are capable of providing the
+ required delays, as defined per the RGMII standard, several options may be
+ available:
+
+ * Some SoCs may offer a pin pad/mux/controller capable of configuring a given
+ set of pins' drive strength, delays and voltage, and it may be a suitable
+ option to insert the expected 2ns RGMII delay
+
+ * Modifying the PCB design to include a fixed delay (e.g: using a specifically
+ designed serpentine), which may not require software configuration at all
+
+Common problems with RGMII delay mismatch
+
+ When there is a RGMII delay mismatch between the Ethernet MAC and the PHY, this
+ will most likely result in the clock and data line sampling to capture unstable
+ signals, typical symptoms include:
+
+ * Transmission/reception partially works, and there is frequent or occasional
+ packet loss observed
+
+ * Ethernet MAC may report some, or all packets ingressing with a FCS/CRC error,
+ or just discard them all
+
+ * Switching to lower speeds such as 10/100Mbits/sec makes the problem go away
+ (since there is enough setup/hold time in that case)
+
+
Connecting to a PHY
Sometime during startup, the network driver needs to establish a connection
--
2.9.3
^ permalink raw reply related
* [PATCH net-next v2 4/4] Documentation: net: phy: Add links to several standards documents
From: Florian Fainelli @ 2016-11-27 18:44 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet, Florian Fainelli
In-Reply-To: <20161127184449.12351-1-f.fainelli@gmail.com>
Add links to the IEEE 802.3-2008 document, and the RGMII v1.3 and v2.0
revisions of the standard.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
Documentation/networking/phy.txt | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt
index 7a0cb1212b9e..6734cf1f64d4 100644
--- a/Documentation/networking/phy.txt
+++ b/Documentation/networking/phy.txt
@@ -406,3 +406,13 @@ Board Fixups
The stubs set one of the two matching criteria, and set the other one to
match anything.
+Standards
+
+ IEEE Standard 802.3: CSMA/CD Access Method and Physical Layer Specifications, Section Two:
+ http://standards.ieee.org/getieee802/download/802.3-2008_section2.pdf
+
+ RGMII v1.3:
+ http://web.archive.org/web/20160303212629/http://www.hp.com/rnd/pdfs/RGMIIv1_3.pdf
+
+ RGMII v2.0:
+ http://web.archive.org/web/20160303171328/http://www.hp.com/rnd/pdfs/RGMIIv2_0_final_hp.pdf
--
2.9.3
^ permalink raw reply related
* [PATCH net-next v2 2/4] Documentation: net: phy: Add a paragraph about pause frames/flow control
From: Florian Fainelli @ 2016-11-27 18:44 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet, Florian Fainelli
In-Reply-To: <20161127184449.12351-1-f.fainelli@gmail.com>
Describe that the Ethernet MAC controller is ultimately responsible for
dealing with proper pause frames/flow control advertisement and
enabling, and that it is therefore allowed to have it change
phydev->supported/advertising with SUPPORTED_Pause and
SUPPORTED_AsymPause.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
Documentation/networking/phy.txt | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt
index 4b25c0f24201..9a42a9414cea 100644
--- a/Documentation/networking/phy.txt
+++ b/Documentation/networking/phy.txt
@@ -127,8 +127,9 @@ Letting the PHY Abstraction Layer do Everything
values pruned from them which don't make sense for your controller (a 10/100
controller may be connected to a gigabit capable PHY, so you would need to
mask off SUPPORTED_1000baseT*). See include/linux/ethtool.h for definitions
- for these bitfields. Note that you should not SET any bits, or the PHY may
- get put into an unsupported state.
+ for these bitfields. Note that you should not SET any bits, except the
+ SUPPORTED_Pause and SUPPORTED_AsymPause bits (see below), or the PHY may get
+ put into an unsupported state.
Lastly, once the controller is ready to handle network traffic, you call
phy_start(phydev). This tells the PAL that you are ready, and configures the
@@ -139,6 +140,19 @@ Letting the PHY Abstraction Layer do Everything
When you want to disconnect from the network (even if just briefly), you call
phy_stop(phydev).
+Pause frames / flow control
+
+ The PHY does not participate directly in flow control/pause frames except by
+ making sure that the SUPPORTED_Pause and SUPPORTED_AsymPause bits are set in
+ MII_ADVERTISE to indicate towards the link partner that the Ethernet MAC
+ controller supports such a thing. Since flow control/pause frames generation
+ involves the Ethernet MAC driver, it is recommended that this driver takes care
+ of properly indicating advertisement and support for such features by setting
+ the SUPPORTED_Pause and SUPPORTED_AsymPause bits accordingly. This can be done
+ either before or after phy_connect() and/or as a result of implementing the
+ ethtool::set_pauseparam feature.
+
+
Keeping Close Tabs on the PAL
It is possible that the PAL's built-in state machine needs a little help to
--
2.9.3
^ permalink raw reply related
* [PATCH net-next v2 1/4] Documentation: net: phy: remove description of function pointers
From: Florian Fainelli @ 2016-11-27 18:44 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet, Florian Fainelli
In-Reply-To: <20161127184449.12351-1-f.fainelli@gmail.com>
Remove the function pointers documentation which duplicates information
found in include/linux/phy.h. Maintaining documentation about two
different locations just does not work, but the code is less likely to
be outdated.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
Documentation/networking/phy.txt | 35 ++---------------------------------
1 file changed, 2 insertions(+), 33 deletions(-)
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt
index 7ab9404a8412..4b25c0f24201 100644
--- a/Documentation/networking/phy.txt
+++ b/Documentation/networking/phy.txt
@@ -251,39 +251,8 @@ Writing a PHY driver
PHY_BASIC_FEATURES, but you can look in include/mii.h for other
features.
- Each driver consists of a number of function pointers:
-
- soft_reset: perform a PHY software reset
- config_init: configures PHY into a sane state after a reset.
- For instance, a Davicom PHY requires descrambling disabled.
- probe: Allocate phy->priv, optionally refuse to bind.
- PHY may not have been reset or had fixups run yet.
- suspend/resume: power management
- config_aneg: Changes the speed/duplex/negotiation settings
- aneg_done: Determines the auto-negotiation result
- read_status: Reads the current speed/duplex/negotiation settings
- ack_interrupt: Clear a pending interrupt
- did_interrupt: Checks if the PHY generated an interrupt
- config_intr: Enable or disable interrupts
- remove: Does any driver take-down
- ts_info: Queries about the HW timestamping status
- match_phy_device: used for Clause 45 capable PHYs to match devices
- in package and ensure they are compatible
- hwtstamp: Set the PHY HW timestamping configuration
- rxtstamp: Requests a receive timestamp at the PHY level for a 'skb'
- txtsamp: Requests a transmit timestamp at the PHY level for a 'skb'
- set_wol: Enable Wake-on-LAN at the PHY level
- get_wol: Get the Wake-on-LAN status at the PHY level
- link_change_notify: called to inform the core is about to change the
- link state, can be used to work around bogus PHY between state changes
- read_mmd_indirect: Read PHY MMD indirect register
- write_mmd_indirect: Write PHY MMD indirect register
- module_info: Get the size and type of an EEPROM contained in an plug-in
- module
- module_eeprom: Get EEPROM information of a plug-in module
- get_sset_count: Get number of strings sets that get_strings will count
- get_strings: Get strings from requested objects (statistics)
- get_stats: Get the extended statistics from the PHY device
+ Each driver consists of a number of function pointers, documented
+ in include/linux/phy.h under the phy_driver structure.
Of these, only config_aneg and read_status are required to be
assigned by the driver code. The rest are optional. Also, it is
--
2.9.3
^ permalink raw reply related
* [PATCH net-next v2 0/4] Documentation: net: phy: Improve documentation
From: Florian Fainelli @ 2016-11-27 18:44 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet, Florian Fainelli
Hi all,
This patch series addresses discussions and feedback that was recently received
on the mailing-list in the area of: flow control/pause frames, interpretation of
phy_interface_t and finally add some links to useful standards documents.
Changes in v2:
- clarify a few things in the RGMII section, add a paragraph about common issues
with RGMII delay mismatches
Florian Fainelli (4):
Documentation: net: phy: remove description of function pointers
Documentation: net: phy: Add a paragraph about pause frames/flow
control
Documentation: net: phy: Add blurb about RGMII
Documentation: net: phy: Add links to several standards documents
Documentation/networking/phy.txt | 139 +++++++++++++++++++++++++++++----------
1 file changed, 104 insertions(+), 35 deletions(-)
--
2.9.3
^ permalink raw reply
* Re: [PATCH net-next 0/4] Documentation: net: phy: Improve documentation
From: Florian Fainelli @ 2016-11-27 18:18 UTC (permalink / raw)
To: netdev
Cc: davem, andrew, sf84, martin.blumenstingl, mans, alexandre.torgue,
peppe.cavallaro, timur, jbrunet
In-Reply-To: <20161127060133.10357-1-f.fainelli@gmail.com>
David,
Le 26/11/2016 à 22:01, Florian Fainelli a écrit :
> Hi all,
>
> This patch series addresses discussions and feedback that was recently received
> on the mailing-list in the area of: flow control/pause frames, interpretation of
> phy_interface_t and finally add some links to useful standards documents.
I will improve patch 3 a bit since it contains some minor mistakes and
could deserve some more clarifications, stay tuned, thanks!
--
Florian
^ permalink raw reply
* Re: [PATCH iproute2 0/3] update ifstat for new stats
From: Roopa Prabhu @ 2016-11-27 18:00 UTC (permalink / raw)
To: Nogah Frankel
Cc: netdev, eladr, yotamg, jiri, idosch, ogerlitz,
Nikolay Aleksandrov
In-Reply-To: <1479996760-61271-1-git-send-email-nogahf@mellanox.com>
(resending ...failed to send it to the list earlier)
On 11/24/16, 6:12 AM, Nogah Frankel wrote:
> Previously stats were gotten by RTM_GETLINK which return 32 bits based
> statistics. It support only one type of stats.
> Lately, a new method to get stats was added - RTM_GETSTATS. It supports
> ability to choose stats type. The basic stats were changed from 32 bits
> based to 64 bits based.
>
> This patchset change ifstat to the new method, add it the ability to
> choose an extended type of statistic, and add the extended type of SW
> stats for packets that hit cpu.
>
>
(please cc me on the GETSTATS patches)
This looks similar to the one I had submitted here: https://www.spinics.net/lists/netdev/msg375546.html <https://www.spinics.net/lists/netdev/msg375546.html>
There are a few issues with this approach.. (unless they have already been looked at by your patch series).
This fails new ifstat on older kernels. Moving to 64bit also invalidates existing ifstats history file.
If you follow the discussion on my patch, there is a way to move to a new history file for 64bit
stats file and still be compatible (ie create a new file for 64 bit stats).
I had started work on fixing these limitations..., but then re-thinking all other new stats in one place
in the context of the new stats api, it is better to extend ip link. This work is also in progress.
here is how we think it should be (also CCing nikolay):
ip link stats /* similar to ip -s link for completeness */
ip link xstats [igmp|lacp] /* depending on link-type */
ip link afstats [inet|inet6|mpls] /* depending on link-family */
ip link offloadstas [cpu|..]
possible future global non-link stats with 'ip stats [tcp]' and so on.
^ permalink raw reply
* Re: [PATCH v3 net-next 1/2] net: ethernet: slicoss: add slicoss gigabit ethernet driver
From: Markus Böhme @ 2016-11-27 17:59 UTC (permalink / raw)
To: Lino Sanfilippo, davem, charrer, liodot, gregkh, andrew
Cc: devel, netdev, linux-kernel
In-Reply-To: <1480162850-8014-2-git-send-email-LinoSanfilippo@gmx.de>
Hello Lino,
just some things barely worth mentioning:
On 11/26/2016 01:20 PM, Lino Sanfilippo wrote:
> Add driver for Alacritech gigabit ethernet cards with SLIC (session-layer
> interface control) technology. The driver provides basic support without
> SLIC for the following devices:
>
> - Mojave cards (single port PCI Gigabit) both copper and fiber
> - Oasis cards (single and dual port PCI-x Gigabit) copper and fiber
> - Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber
>
> Signed-off-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
> ---
> drivers/net/ethernet/Kconfig | 1 +
> drivers/net/ethernet/Makefile | 1 +
> drivers/net/ethernet/alacritech/Kconfig | 28 +
> drivers/net/ethernet/alacritech/Makefile | 4 +
> drivers/net/ethernet/alacritech/slic.h | 576 +++++++++
> drivers/net/ethernet/alacritech/slicoss.c | 1867 +++++++++++++++++++++++++++++
> 6 files changed, 2477 insertions(+)
> create mode 100644 drivers/net/ethernet/alacritech/Kconfig
> create mode 100644 drivers/net/ethernet/alacritech/Makefile
> create mode 100644 drivers/net/ethernet/alacritech/slic.h
> create mode 100644 drivers/net/ethernet/alacritech/slicoss.c
>
[...]
> diff --git a/drivers/net/ethernet/alacritech/slic.h b/drivers/net/ethernet/alacritech/slic.h
> new file mode 100644
> index 0000000..c62d46b
> --- /dev/null
> +++ b/drivers/net/ethernet/alacritech/slic.h
> @@ -0,0 +1,576 @@
> +
> +#ifndef _SLIC_H
> +#define _SLIC_H
I found a bunch of unused #defines in slic.h. I cannot judge if they are
worth keeping:
SLIC_VRHSTATB_LONGE
SLIC_VRHSTATB_PREA
SLIC_ISR_IO
SLIC_ISR_PING_MASK
SLIC_GIG_SPEED_MASK
SLIC_GMCR_RESET
SLIC_XCR_RESET
SLIC_XCR_XMTEN
SLIC_XCR_PAUSEEN
SLIC_XCR_LOADRNG
SLIC_REG_DBAR
SLIC_REG_PING
SLIC_REG_DUMP_CMD
SLIC_REG_DUMP_DATA
SLIC_REG_WRHOSTID
SLIC_REG_LOW_POWER
SLIC_REG_RESET_IFACE
SLIC_REG_ADDR_UPPER
SLIC_REG_HBAR64
SLIC_REG_DBAR64
SLIC_REG_CBAR64
SLIC_REG_RBAR64
SLIC_REG_WRVLANID
SLIC_REG_READ_XF_INFO
SLIC_REG_WRITE_XF_INFO
SLIC_REG_TICKS_PER_SEC
These device IDs are not used, either, but maybe it's good to keep them
for documentation purposes:
PCI_SUBDEVICE_ID_ALACRITECH_1000X1_2
PCI_SUBDEVICE_ID_ALACRITECH_SES1001T
PCI_SUBDEVICE_ID_ALACRITECH_SEN2002XT
PCI_SUBDEVICE_ID_ALACRITECH_SEN2001XT
PCI_SUBDEVICE_ID_ALACRITECH_SEN2104ET
PCI_SUBDEVICE_ID_ALACRITECH_SEN2102ET
[...]
> +
> +/* SLIC EEPROM structure for Oasis */
> +struct slic_mojave_eeprom {
Comment: "for Mojave".
[...]
> +struct slic_device {
> + struct pci_dev *pdev;
> + struct net_device *netdev;
> + void __iomem *regs;
> + /* upper address setting lock */
> + spinlock_t upper_lock;
> + struct slic_shmem shmem;
> + struct napi_struct napi;
> + struct slic_rx_queue rxq;
> + struct slic_tx_queue txq;
> + struct slic_stat_queue stq;
> + struct slic_stats stats;
> + struct slic_upr_list upr_list;
> + /* link configuration lock */
> + spinlock_t link_lock;
> + bool promisc;
> + bool autoneg;
> + int speed;
> + int duplex;
Maybe make speed and duplex unsigned? They are assigned and compared
against unsigned values in slicoss.c, so this would get rid of some
(benign, because of the range of the values) -Wsign-compare warnings in
slic_configure_link_locked. However, in a comparison there SPEED_UNKNOWN
would need to be casted to unsigned to prevent another one popping up.
[...]
> +#endif /* _SLIC_H */
> diff --git a/drivers/net/ethernet/alacritech/slicoss.c b/drivers/net/ethernet/alacritech/slicoss.c
> new file mode 100644
> index 0000000..8cd862a
> --- /dev/null
> +++ b/drivers/net/ethernet/alacritech/slicoss.c
> @@ -0,0 +1,1867 @@
[...]
> +
> +static const struct pci_device_id slic_id_tbl[] = {
> + { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH,
> + PCI_DEVICE_ID_ALACRITECH_MOAVE) },
I missed this in slic.h, but is this a typo and "MOAVE" should be
"MOJAVE"? There are a couple similar #defines in slic.h.
[...]
> +static void slic_refill_rx_queue(struct slic_device *sdev, gfp_t gfp)
> +{
> + const unsigned int ALIGN_MASK = SLIC_RX_BUFF_ALIGN - 1;
> + unsigned int maplen = SLIC_RX_BUFF_SIZE;
> + struct slic_rx_queue *rxq = &sdev->rxq;
> + struct net_device *dev = sdev->netdev;
> + struct slic_rx_buffer *buff;
> + struct slic_rx_desc *desc;
> + unsigned int misalign;
> + unsigned int offset;
> + struct sk_buff *skb;
> + dma_addr_t paddr;
> +
> + while (slic_get_free_rx_descs(rxq) > SLIC_MAX_REQ_RX_DESCS) {
> + skb = alloc_skb(maplen + ALIGN_MASK, gfp);
> + if (!skb)
> + break;
> +
> + paddr = dma_map_single(&sdev->pdev->dev, skb->data, maplen,
> + DMA_FROM_DEVICE);
> + if (dma_mapping_error(&sdev->pdev->dev, paddr)) {
> + netdev_err(dev, "mapping rx packet failed\n");
> + /* drop skb */
> + dev_kfree_skb_any(skb);
> + break;
> + }
> + /* ensure head buffer descriptors are 256 byte aligned */
> + offset = 0;
> + misalign = paddr & ALIGN_MASK;
> + if (misalign) {
> + offset = SLIC_RX_BUFF_ALIGN - misalign;
> + skb_reserve(skb, offset);
> + }
> + /* the HW expects dma chunks for descriptor + frame data */
> + desc = (struct slic_rx_desc *)skb->data;
> + memset(desc, 0, sizeof(*desc));
> +
> + buff = &rxq->rxbuffs[rxq->put_idx];
> + buff->skb = skb;
> + dma_unmap_addr_set(buff, map_addr, paddr);
> + dma_unmap_len_set(buff, map_len, maplen);
> + buff->addr_offset = offset;
> + /* head buffer descriptors are placed immediately before skb */
> + slic_write(sdev, SLIC_REG_HBAR, lower_32_bits(paddr) +
> + offset);
This fits nicely on one line. :-)
[...]
> +static int slic_init_tx_queue(struct slic_device *sdev)
> +{
> + struct slic_tx_queue *txq = &sdev->txq;
> + struct slic_tx_buffer *buff;
> + struct slic_tx_desc *desc;
> + int err;
> + int i;
You could make i unsigned...
> +
> + txq->len = SLIC_NUM_TX_DESCS;
> + txq->put_idx = 0;
> + txq->done_idx = 0;
> +
> + txq->txbuffs = kcalloc(txq->len, sizeof(*buff), GFP_KERNEL);
> + if (!txq->txbuffs)
> + return -ENOMEM;
> +
> + txq->dma_pool = dma_pool_create("slic_pool", &sdev->pdev->dev,
> + sizeof(*desc), SLIC_TX_DESC_ALIGN,
> + 4096);
> + if (!txq->dma_pool) {
> + err = -ENOMEM;
> + netdev_err(sdev->netdev, "failed to create dma pool\n");
> + goto free_buffs;
> + }
> +
> + for (i = 0; i < txq->len; i++) {
...to fix a signed/unsigned comparison warning here, but...
> + buff = &txq->txbuffs[i];
> + desc = dma_pool_zalloc(txq->dma_pool, GFP_KERNEL,
> + &buff->desc_paddr);
> + if (!desc) {
> + netdev_err(sdev->netdev,
> + "failed to alloc pool chunk (%i)\n", i);
> + err = -ENOMEM;
> + goto free_descs;
> + }
> +
> + desc->hnd = cpu_to_le32((u32)(i + 1));
> + desc->cmd = SLIC_CMD_XMT_REQ;
> + desc->flags = 0;
> + desc->type = cpu_to_le32(SLIC_CMD_TYPE_DUMB);
> + buff->desc = desc;
> + }
> +
> + return 0;
> +
> +free_descs:
> + while (i--) {
...this would require reworking this logic to prevent an endless loop,
so probably not worth bothering, considering that txq->len is well
within the positive signed range.
> + buff = &txq->txbuffs[i];
> + dma_pool_free(txq->dma_pool, buff->desc, buff->desc_paddr);
> + }
> + dma_pool_destroy(txq->dma_pool);
> +
> +free_buffs:
> + kfree(txq->txbuffs);
> +
> + return err;
> +}
> +
> +static void slic_free_tx_queue(struct slic_device *sdev)
> +{
> + struct slic_tx_queue *txq = &sdev->txq;
> + struct slic_tx_buffer *buff;
> + int i;
Make i unsigned? One warning less, almost no work invested.
> +
> + for (i = 0; i < txq->len; i++) {
> + buff = &txq->txbuffs[i];
> + dma_pool_free(txq->dma_pool, buff->desc, buff->desc_paddr);
> + if (!buff->skb)
> + continue;
> +
> + dma_unmap_single(&sdev->pdev->dev,
> + dma_unmap_addr(buff, map_addr),
> + dma_unmap_len(buff, map_len), DMA_TO_DEVICE);
> + consume_skb(buff->skb);
> + }
> + dma_pool_destroy(txq->dma_pool);
> +
> + kfree(txq->txbuffs);
> +}
> +
[...]
> +static void slic_free_rx_queue(struct slic_device *sdev)
> +{
> + struct slic_rx_queue *rxq = &sdev->rxq;
> + struct slic_rx_buffer *buff;
> + int i;
Unsigned?
> +
> + /* free rx buffers */
> + for (i = 0; i < rxq->len; i++) {
> + buff = &rxq->rxbuffs[i];
> +
> + if (!buff->skb)
> + continue;
> +
> + dma_unmap_single(&sdev->pdev->dev,
> + dma_unmap_addr(buff, map_addr),
> + dma_unmap_len(buff, map_len),
> + DMA_FROM_DEVICE);
> + consume_skb(buff->skb);
> + }
> + kfree(rxq->rxbuffs);
> +}
[...]
> +static int slic_load_firmware(struct slic_device *sdev)
> +{
> + u32 sectstart[SLIC_FIRMWARE_MAX_SECTIONS];
> + u32 sectsize[SLIC_FIRMWARE_MAX_SECTIONS];
> + const struct firmware *fw;
> + unsigned int datalen;
> + const char *file;
> + int code_start;
> + u32 numsects;
> + int idx = 0;
> + u32 sect;
> + u32 instr;
> + u32 addr;
> + u32 base;
> + int err;
> + int i;
Make i unsigned?
> +
> + file = (sdev->model == SLIC_MODEL_OASIS) ? SLIC_FIRMWARE_OASIS :
> + SLIC_FIRMWARE_MOAVE;
> + err = request_firmware(&fw, file, &sdev->pdev->dev);
> + if (err) {
> + dev_err(&sdev->pdev->dev, "failed to load firmware %s\n", file);
> + return err;
> + }
> + /* Do an initial sanity check concerning firmware size now. A further
> + * check follows below.
> + */
> + if (fw->size < SLIC_FIRMWARE_MIN_SIZE) {
> + dev_err(&sdev->pdev->dev,
> + "invalid firmware size %zu (min is %u)\n", fw->size,
> + SLIC_FIRMWARE_MIN_SIZE);
> + err = -EINVAL;
> + goto release;
> + }
> +
> + numsects = slic_read_dword_from_firmware(fw, &idx);
> + if (numsects == 0 || numsects > SLIC_FIRMWARE_MAX_SECTIONS) {
> + dev_err(&sdev->pdev->dev,
> + "invalid number of sections in firmware: %u", numsects);
> + err = -EINVAL;
> + goto release;
> + }
> +
> + datalen = numsects * 8 + 4;
> + for (i = 0; i < numsects; i++) {
> + sectsize[i] = slic_read_dword_from_firmware(fw, &idx);
> + datalen += sectsize[i];
> + }
> +
> + /* do another sanity check against firmware size */
> + if (datalen > fw->size) {
> + dev_err(&sdev->pdev->dev,
> + "invalid firmware size %zu (expected >= %u)\n",
> + fw->size, datalen);
> + err = -EINVAL;
> + goto release;
> + }
> + /* get sections */
> + for (i = 0; i < numsects; i++)
> + sectstart[i] = slic_read_dword_from_firmware(fw, &idx);
> +
> + code_start = idx;
> + instr = slic_read_dword_from_firmware(fw, &idx);
> +
> + for (sect = 0; sect < numsects; sect++) {
> + unsigned int ssize = sectsize[sect] >> 3;
> +
> + base = sectstart[sect];
> +
> + for (addr = 0; addr < ssize; addr++) {
> + /* write out instruction address */
> + slic_write(sdev, SLIC_REG_WCS, base + addr);
> + /* write out instruction to low addr */
> + slic_write(sdev, SLIC_REG_WCS, instr);
> + instr = slic_read_dword_from_firmware(fw, &idx);
> + /* write out instruction to high addr */
> + slic_write(sdev, SLIC_REG_WCS, instr);
> + instr = slic_read_dword_from_firmware(fw, &idx);
> + }
> + }
> +
> + idx = code_start;
> +
> + for (sect = 0; sect < numsects; sect++) {
> + unsigned int ssize = sectsize[sect] >> 3;
> +
> + instr = slic_read_dword_from_firmware(fw, &idx);
> + base = sectstart[sect];
> + if (base < 0x8000)
> + continue;
> +
> + for (addr = 0; addr < ssize; addr++) {
> + /* write out instruction address */
> + slic_write(sdev, SLIC_REG_WCS,
> + SLIC_WCS_COMPARE | (base + addr));
> + /* write out instruction to low addr */
> + slic_write(sdev, SLIC_REG_WCS, instr);
> + instr = slic_read_dword_from_firmware(fw, &idx);
> + /* write out instruction to high addr */
> + slic_write(sdev, SLIC_REG_WCS, instr);
> + instr = slic_read_dword_from_firmware(fw, &idx);
> + }
> + }
> + slic_flush_write(sdev);
> + mdelay(10);
> + /* everything OK, kick off the card */
> + slic_write(sdev, SLIC_REG_WCS, SLIC_WCS_START);
> + slic_flush_write(sdev);
> + /* wait long enough for ucode to init card and reach the mainloop */
> + mdelay(20);
> +release:
> + release_firmware(fw);
> +
> + return err;
> +}
[...]
> +static int slic_init_iface(struct slic_device *sdev)
> +{
> + struct slic_shmem *sm = &sdev->shmem;
> + int err;
> +
> + sdev->upr_list.pending = false;
> +
> + err = slic_init_shmem(sdev);
> + if (err) {
> + netdev_err(sdev->netdev, "failed to load firmware\n");
Wrong error message.
> + return err;
> + }
[...]
> +static netdev_tx_t slic_xmit(struct sk_buff *skb, struct net_device *dev)
> +{
> + struct slic_device *sdev = netdev_priv(dev);
> + struct slic_tx_queue *txq = &sdev->txq;
> + struct slic_tx_buffer *buff;
> + struct slic_tx_desc *desc;
> + dma_addr_t paddr;
> + u32 cbar_val;
> + u32 maplen;
> +
> + if (unlikely(slic_get_free_tx_descs(txq) < SLIC_MAX_REQ_TX_DESCS)) {
> + netdev_err(dev, "BUG! not enought tx LEs left: %u\n",
"Enough"?
> + slic_get_free_tx_descs(txq));
> + return NETDEV_TX_BUSY;
> + }
[...]
> +static int slic_read_eeprom(struct slic_device *sdev)
> +{
> + unsigned int devfn = PCI_FUNC(sdev->pdev->devfn);
> + struct slic_shmem *sm = &sdev->shmem;
> + struct slic_shmem_data *sm_data = sm->shmem_data;
> + const unsigned int MAX_LOOPS = 5000;
Another benign -Wsign-compare warning can be fixed by either dropping
the unsigned here or making i below unsigned, too.
> + unsigned int codesize;
> + unsigned char *eeprom;
> + struct slic_upr *upr;
> + dma_addr_t paddr;
> + int err = 0;
> + u8 *mac[2];
> + int i = 0;
> +
> + eeprom = dma_zalloc_coherent(&sdev->pdev->dev, SLIC_EEPROM_SIZE,
> + &paddr, GFP_KERNEL);
> + if (!eeprom)
> + return -ENOMEM;
> +
> + slic_write(sdev, SLIC_REG_ICR, SLIC_ICR_INT_OFF);
> + /* setup ISP temporarily */
> + slic_write(sdev, SLIC_REG_ISP, lower_32_bits(sm->isr_paddr));
> +
> + err = slic_new_upr(sdev, SLIC_UPR_CONFIG, paddr);
> + if (!err) {
> + for (i = 0; i < MAX_LOOPS; i++) {
> + if (le32_to_cpu(sm_data->isr) & SLIC_ISR_UPC)
> + break;
> + mdelay(1);
> + }
> + if (i == MAX_LOOPS) {
> + dev_err(&sdev->pdev->dev,
> + "timed out while waiting for eeprom data\n");
> + err = -ETIMEDOUT;
> + }
> + upr = slic_dequeue_upr(sdev);
> + kfree(upr);
> + }
> +
> + slic_write(sdev, SLIC_REG_ISP, 0);
> + slic_write(sdev, SLIC_REG_ISR, 0);
> + slic_flush_write(sdev);
> +
> + if (err)
> + goto free_eeprom;
> +
> + if (sdev->model == SLIC_MODEL_OASIS) {
> + struct slic_oasis_eeprom *oee;
> +
> + oee = (struct slic_oasis_eeprom *)eeprom;
> + mac[0] = oee->mac;
> + mac[1] = oee->mac2;
> + codesize = le16_to_cpu(oee->eeprom_code_size);
> + } else {
> + struct slic_mojave_eeprom *mee;
> +
> + mee = (struct slic_mojave_eeprom *)eeprom;
> + mac[0] = mee->mac;
> + mac[1] = mee->mac2;
> + codesize = le16_to_cpu(mee->eeprom_code_size);
> + }
> +
> + if (!slic_eeprom_valid(eeprom, codesize)) {
> + dev_err(&sdev->pdev->dev, "invalid checksum in eeprom\n");
> + err = -EINVAL;
> + goto free_eeprom;
> + }
> + /* set mac address */
> + ether_addr_copy(sdev->netdev->dev_addr, mac[devfn]);
> +free_eeprom:
> + dma_free_coherent(&sdev->pdev->dev, SLIC_EEPROM_SIZE, eeprom, paddr);
> +
> + return err;
> +}
[...]
> +static int slic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> +{
[...]
> + err = register_netdev(dev);
> + if (err) {
> + dev_err(&pdev->dev, "failed to register net device: %i\n",
> + err);
Could be on one line.
Regards,
Markus
^ permalink raw reply
* RE: [PATCH net-next 09/11] qede: Better utilize the qede_[rt]x_queue
From: Mintz, Yuval @ 2016-11-27 16:15 UTC (permalink / raw)
To: kbuild test robot, davem@davemloft.net, netdev@vger.kernel.org
In-Reply-To: <201611272330.xRUonBtv%fengguang.wu@intel.com>
> Hi Yuval,
>
> [auto build test WARNING on net-next/master]
>
> url: https://github.com/0day-ci/linux/commits/Yuval-Mintz/qed-Add-XDP-
> support/20161127-225956
> config: tile-allmodconfig (attached as .config)
> compiler: tilegx-linux-gcc (GCC) 4.6.2
> reproduce:
> wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-
> tests.git/plain/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=tile
>
> All warnings (new ones prefixed by >>):
>
> drivers/net/ethernet/qlogic/qede/qede_main.c: In function
> 'qede_alloc_mem_rxq':
> >> drivers/net/ethernet/qlogic/qede/qede_main.c:2960:3: warning: large
> >> integer implicitly truncated to unsigned type [-Woverflow]
>
> vim +2960 drivers/net/ethernet/qlogic/qede/qede_main.c
>
> 55482edc Manish Chopra 2016-03-04 2944 err:
> 55482edc Manish Chopra 2016-03-04 2945 qede_free_sge_mem(edev,
> rxq);
> 55482edc Manish Chopra 2016-03-04 2946 edev->gro_disable = 1;
> 55482edc Manish Chopra 2016-03-04 2947 return -ENOMEM;
> 55482edc Manish Chopra 2016-03-04 2948 } 55482edc Manish Chopra 2016-
> 03-04 2949
> 2950219d Yuval Mintz 2015-10-26 2950 /* This function allocates all
> memory needed per Rx queue */
> 1a635e48 Yuval Mintz 2016-08-15 2951 static int
> qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
> 2950219d Yuval Mintz 2015-10-26 2952 {
> f86af2df Manish Chopra 2016-04-20 2953 int i, rc, size;
> 2950219d Yuval Mintz 2015-10-26 2954
> 2950219d Yuval Mintz 2015-10-26 2955 rxq->num_rx_buffers = edev-
> >q_num_rx_buffers;
> 2950219d Yuval Mintz 2015-10-26 2956
> 1a635e48 Yuval Mintz 2016-08-15 2957 rxq->rx_buf_size =
> NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu;
> 1a635e48 Yuval Mintz 2016-08-15 2958
> fc48b7a6 Yuval Mintz 2016-02-15 2959 if (rxq->rx_buf_size >
> PAGE_SIZE)
> fc48b7a6 Yuval Mintz 2016-02-15 @2960 rxq->rx_buf_size =
> PAGE_SIZE;
I'd say this is a false positive, given that MTU can't be so large.
Although patch #10 is going to hit the same when setting rx_buf_seg_size
[also a u16] to PAGE_SIZE to make sure there's a single packet per page.
While I can surely address that, I was just wondering about whether this
is an interesting scenario at the moment. I.e., using XDP with 64 Kb pages
is going to be very costly from a memory perspective.
^ permalink raw reply
* [PATCH net 2/2] net/mlx4: Fix uninitialized fields in rule when adding promiscuous mode to device managed flow steering
From: Tariq Toukan @ 2016-11-27 17:20 UTC (permalink / raw)
To: David S. Miller
Cc: netdev, Eran Ben Elisha, Sebastian Ott, Steve Wise,
Jack Morgenstein, Tariq Toukan
In-Reply-To: <1480267252-26146-1-git-send-email-tariqt@mellanox.com>
From: Jack Morgenstein <jackm@dev.mellanox.co.il>
In procedure mlx4_flow_steer_promisc_add(), several fields
were left uninitialized in the rule structure.
Correctly initialize these fields.
Fixes: 592e49dda812 ("net/mlx4: Implement promiscuous mode with device managed flow-steering")
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/mcg.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index 94b891c118c1..1a670b681555 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -1457,7 +1457,12 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
u32 qpn, enum mlx4_net_trans_promisc_mode mode)
{
- struct mlx4_net_trans_rule rule;
+ struct mlx4_net_trans_rule rule = {
+ .queue_mode = MLX4_NET_TRANS_Q_FIFO,
+ .exclusive = 0,
+ .allow_loopback = 1,
+ };
+
u64 *regid_p;
switch (mode) {
--
1.8.3.1
^ permalink raw reply related
* [PATCH net 0/2] mlx4 bug fixes for 4.9
From: Tariq Toukan @ 2016-11-27 17:20 UTC (permalink / raw)
To: David S. Miller
Cc: netdev, Eran Ben Elisha, Sebastian Ott, Steve Wise, Tariq Toukan
Hi Dave,
This patchset includes 2 bug fixes:
* In patch 1 we revert the commit that avoids invoking unregister_netdev
in shutdown flow, as it introduces netdev presence issues where
it can be accessed unsafely by ndo operations during the flow.
* Patch 2 is a simple fix for a variable uninitialization issue.
Series generated against net commit:
6998cc6ec237 tipc: resolve connection flow control compatibility problem
Thanks,
Tariq.
Jack Morgenstein (1):
net/mlx4: Fix uninitialized fields in rule when adding promiscuous
mode to device managed flow steering
Tariq Toukan (1):
Revert "net/mlx4_en: Avoid unregister_netdev at shutdown flow"
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 17 ++---------------
drivers/net/ethernet/mellanox/mlx4/main.c | 5 +----
drivers/net/ethernet/mellanox/mlx4/mcg.c | 7 ++++++-
include/linux/mlx4/device.h | 1 -
4 files changed, 9 insertions(+), 21 deletions(-)
--
1.8.3.1
^ permalink raw reply
* [PATCH net 1/2] Revert "net/mlx4_en: Avoid unregister_netdev at shutdown flow"
From: Tariq Toukan @ 2016-11-27 17:20 UTC (permalink / raw)
To: David S. Miller
Cc: netdev, Eran Ben Elisha, Sebastian Ott, Steve Wise, Tariq Toukan,
Jiri Pirko
In-Reply-To: <1480267252-26146-1-git-send-email-tariqt@mellanox.com>
This reverts commit 9d76931180557270796f9631e2c79b9c7bb3c9fb.
Using unregister_netdev at shutdown flow prevents calling
the netdev's ndos or trying to access its freed resources.
This fixes crashes like the following:
Call Trace:
[<ffffffff81587a6e>] dev_get_phys_port_id+0x1e/0x30
[<ffffffff815a36ce>] rtnl_fill_ifinfo+0x4be/0xff0
[<ffffffff815a53f3>] rtmsg_ifinfo_build_skb+0x73/0xe0
[<ffffffff815a5476>] rtmsg_ifinfo.part.27+0x16/0x50
[<ffffffff815a54c8>] rtmsg_ifinfo+0x18/0x20
[<ffffffff8158a6c6>] netdev_state_change+0x46/0x50
[<ffffffff815a5e78>] linkwatch_do_dev+0x38/0x50
[<ffffffff815a6165>] __linkwatch_run_queue+0xf5/0x170
[<ffffffff815a6205>] linkwatch_event+0x25/0x30
[<ffffffff81099a82>] process_one_work+0x152/0x400
[<ffffffff8109a325>] worker_thread+0x125/0x4b0
[<ffffffff8109a200>] ? rescuer_thread+0x350/0x350
[<ffffffff8109fc6a>] kthread+0xca/0xe0
[<ffffffff8109fba0>] ? kthread_park+0x60/0x60
[<ffffffff816a1285>] ret_from_fork+0x25/0x30
Fixes: 9d7693118055 ("net/mlx4_en: Avoid unregister_netdev at shutdown flow")
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Reported-by: Steve Wise <swise@opengridcomputing.com>
Cc: Jiri Pirko <jiri@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 17 ++---------------
drivers/net/ethernet/mellanox/mlx4/main.c | 5 +----
include/linux/mlx4/device.h | 1 -
3 files changed, 3 insertions(+), 20 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index a60f635da78b..fb8bb027b69c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -2079,13 +2079,6 @@ static int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
return -ENOMEM;
}
-static void mlx4_en_shutdown(struct net_device *dev)
-{
- rtnl_lock();
- netif_device_detach(dev);
- mlx4_en_close(dev);
- rtnl_unlock();
-}
static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
struct mlx4_en_priv *src,
@@ -2162,8 +2155,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
- bool shutdown = mdev->dev->persist->interface_state &
- MLX4_INTERFACE_STATE_SHUTDOWN;
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
@@ -2171,10 +2162,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
if (priv->registered) {
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
priv->port));
- if (shutdown)
- mlx4_en_shutdown(dev);
- else
- unregister_netdev(dev);
+ unregister_netdev(dev);
}
if (priv->allocated)
@@ -2203,8 +2191,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
kfree(priv->tx_ring);
kfree(priv->tx_cq);
- if (!shutdown)
- free_netdev(dev);
+ free_netdev(dev);
}
static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 6f4e67bc3538..75d07fa9d0b1 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -4147,11 +4147,8 @@ static void mlx4_shutdown(struct pci_dev *pdev)
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
mutex_lock(&persist->interface_state_mutex);
- if (persist->interface_state & MLX4_INTERFACE_STATE_UP) {
- /* Notify mlx4 clients that the kernel is being shut down */
- persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN;
+ if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
mlx4_unload_one(pdev);
- }
mutex_unlock(&persist->interface_state_mutex);
}
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 3be7abd6e722..c9f379689dd0 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -476,7 +476,6 @@ enum {
enum {
MLX4_INTERFACE_STATE_UP = 1 << 0,
MLX4_INTERFACE_STATE_DELETION = 1 << 1,
- MLX4_INTERFACE_STATE_SHUTDOWN = 1 << 2,
};
#define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \
--
1.8.3.1
^ permalink raw reply related
* [PATCH] wireless: ath: ath9k: constify ath_bus_ops structure
From: Bhumika Goyal @ 2016-11-27 17:03 UTC (permalink / raw)
To: julia.lawall, ath9k-devel, kvalo, linux-wireless, ath9k-devel,
netdev, linux-kernel
Cc: Bhumika Goyal
Declare the structure ath_bus_ops as const as it is only passed as an
argument to the function ath9k_init_device. This argument is of type
const struct ath_bus_ops *, so ath_bus_ops structures with this property
can be declared as const.
Done using Coccinelle:
@r1 disable optional_qualifier @
identifier i;
position p;
@@
static struct ath_bus_ops i@p = {...};
@ok1@
identifier r1.i;
position p;
expression e1,e2;
@@
ath9k_init_device(e1,e2,&i@p)
@bad@
position p!={r1.p,ok1.p};
identifier r1.i;
@@
i@p
@depends on !bad disable optional_qualifier@
identifier r1.i;
@@
static
+const
struct ath_bus_ops i={...};
@depends on !bad disable optional_qualifier@
identifier r1.i;
@@
+const
struct ath_bus_ops i;
File size before:
text data bss dec hex filename
1295 232 0 1527 5f7 ath/ath9k/ahb.o
File size after:
text data bss dec hex filename
1359 176 0 1535 5ff ath/ath9k/ahb.o
Signed-off-by: Bhumika Goyal <bhumirks@gmail.com>
---
drivers/net/wireless/ath/ath9k/ahb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c
index bea6186..2bd982c 100644
--- a/drivers/net/wireless/ath/ath9k/ahb.c
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
@@ -62,7 +62,7 @@ static bool ath_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
return false;
}
-static struct ath_bus_ops ath_ahb_bus_ops = {
+static const struct ath_bus_ops ath_ahb_bus_ops = {
.ath_bus_type = ATH_AHB,
.read_cachesize = ath_ahb_read_cachesize,
.eeprom_read = ath_ahb_eeprom_read,
--
1.9.1
^ permalink raw reply related
* Re: Crash due to mutex genl_lock called from RCU context
From: Eric Dumazet @ 2016-11-27 16:23 UTC (permalink / raw)
To: Cong Wang
Cc: Subash Abhinov Kasiviswanathan, Thomas Graf,
Linux Kernel Network Developers, Herbert Xu
In-Reply-To: <CAM_iQpUnz2kkjOFuk3fKKEYDh54b9WHk1dvH098mGtrGTPjZFQ@mail.gmail.com>
On Sat, 2016-11-26 at 22:28 -0800, Cong Wang wrote:
> On Sat, Nov 26, 2016 at 6:26 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> >
> > Are you telling me inet_release() is called when we close() the first
> > file descriptor ?
> >
> > fd1 = socket()
> > fd2 = dup(fd1);
> > close(fd2) -> release() ???
>
> Sorry, I didn't express myself clearly, I meant your change,
> if exclude the SOCK_RCU_FREE part, basically reverts this commit:
>
> commit 3f660d66dfbc13ea4b61d3865851b348444c24b4
> Author: Herbert Xu <herbert@gondor.apana.org.au>
> Date: Thu May 3 03:17:14 2007 -0700
>
> [NETLINK]: Kill CB only when socket is unused
>
> IOW, ->release() is called when the last sock fd ref is gone, but ->destructor()
> is called with the last sock ref is gone. They are very different.
Hmm...
> I am confused, what Subash reported is a kernel warning which can
> surely be fixed by removing genl lock (if it is correct, I need to double
> check), so why for net-next?
Because Subash pointed to a buggy commit.
We want to fix all issues bring by this commit, not only the immediate
problem about mutex.
I have no idea if we can safely remove the mutex from genl_lock_done() :
The genl_lock() is not only protecting the socket itself, it might
protect global data as well, or protect some kind of lock ordering among
multiple mutexes.
Have you checked all genl users, down to linux-4.0 , point where commit
21e4902aea80ef35a was added ?
Herbert, Thomas, your help would be appreciated, thanks.
^ permalink raw reply
* Re: Large performance regression with 6in4 tunnel (sit)
From: Eli Cooper @ 2016-11-27 16:22 UTC (permalink / raw)
To: Stephen Rothwell; +Cc: netdev
In-Reply-To: <20161127130229.4c88cc2c@canb.auug.org.au>
Hi Stephen,
On 2016/11/27 10:02, Stephen Rothwell wrote:
> Hi Eli,
>
> On Sun, 27 Nov 2016 11:54:41 +1100 Stephen Rothwell <sfr@canb.auug.org.au> wrote:
>> On Fri, 25 Nov 2016 14:05:04 +0800 Eli Cooper <elicooper@gmx.com> wrote:
>>> I think this is similar to the bug I fixed in commit ae148b085876
>>> ("ip6_tunnel: Update skb->protocol to ETH_P_IPV6 in ip6_tnl_xmit()").
>>>
>>> I can reproduce a similar problem by applying xfrm to sit traffic.
>>> TSO/GSO packets are dropped when IPSec is enabled, and IPv6 throughput
>>> drops to 10s of Kbps. I am not sure if this is the same issue you
>>> experienced, but I wrote a patch that fixed at least the issue I had.
>>>
>>> Could you test the patch I sent to the mailing list just now?
>> Thanks for the patch!
>>
>> Its a bit tricky to test since the problem only occurs in a production
>> machine (I tried reproducing in a VM, but the problem did not occur),
That's probably because the ethernet NIC in your VM does not support
segmentation offloading. You could, however, try reproducing it on
another (real) machine with the same driver.
>> but I will try to just rebuild the sit module and see if I can insert
>> the modified one.
> OK, I tried your patch and unfortunately, it doesn't seem to have
> worked ... I still get the large packets dropped and resent smaller.
>
It's a shame ... In my case, large packets are dropped only when xfrm is
in effect (therefore another output path is taken), and probably that's
not your case. Well, on the plus side, at least you reminded me that sit
device also needs to update skb's protocol.
Thanks,
Eli
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox