* [PATCH v1 2/2] TCPCT API sockopt update to draft -03
From: William Allen Simpson @ 2011-01-12 17:59 UTC (permalink / raw)
To: Linux Kernel Developers
Cc: Linux Kernel Network Developers, David Miller, Andrew Morton
In-Reply-To: <4D2DE824.10205@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 517 bytes --]
Use most recently specified symbols of RFC-to-be-6013.
Permit setting either cookie or s_data (alternatively).
Split the data value from socket option header, saving more than
1K of stack space in the handler by copying long data values
directly from user space into the kref block.
Signed-off-by: William.Allen.Simpson@gmail.com
---
include/linux/tcp.h | 35 ++++++++++++-----
net/ipv4/tcp.c | 102 +++++++++++++++++++++++++++++++++++---------------
2 files changed, 96 insertions(+), 41 deletions(-)
[-- Attachment #2: TCPCT+API-03v1+2.6.37.patch --]
[-- Type: text/plain, Size: 7252 bytes --]
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index e64f4c6..c8f4017 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -185,22 +185,37 @@ struct tcp_md5sig {
#define TCP_COOKIE_PAIR_SIZE (2*TCP_COOKIE_MAX)
/* Flags for both getsockopt and setsockopt */
-#define TCP_COOKIE_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */
-#define TCP_COOKIE_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies,
+#define TCPCT_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */
+#define TCPCT_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies,
* supercedes everything. */
-
-/* Flags for getsockopt */
-#define TCP_S_DATA_IN (1 << 2) /* Was data received? */
-#define TCP_S_DATA_OUT (1 << 3) /* Was data sent? */
-
-/* TCP_COOKIE_TRANSACTIONS data */
+#define TCPCT_IN_DATA (1 << 2) /* Was data received? */
+#define TCPCT_OUT_DATA (1 << 3) /* Was data sent? */
+/* reserved for future use: bits 4 .. 6 */
+#define TCPCT_EXTEND (1 << 7)
+
+/* Extended Option flags for both getsockopt and setsockopt */
+#define TCPCT_EXTEND_SIZE (0x7) /* mask */
+#define TCPCT_EXTEND_TS32 (0x1) /* default */
+#define TCPCT_EXTEND_TS64 (0x2)
+#define TCPCT_EXTEND_TS128 (0x4)
+
+/* TCP_COOKIE_TRANSACTIONS socket option header */
struct tcp_cookie_transactions {
__u16 tcpct_flags; /* see above */
- __u8 __tcpct_pad1; /* zero */
+ __u8 tcpct_extended;
__u8 tcpct_cookie_desired; /* bytes */
__u16 tcpct_s_data_desired; /* bytes of variable data */
__u16 tcpct_used; /* bytes in value */
- __u8 tcpct_value[TCP_MSS_DEFAULT];
+};
+
+struct tcpct_full {
+ struct tcp_cookie_transactions soh;
+ __u8 tcpct_value[TCP_COOKIE_PAIR_SIZE];
+};
+
+struct tcpct_half {
+ struct tcp_cookie_transactions soh;
+ __u8 tcpct_value[TCP_COOKIE_MAX];
};
#ifdef __KERNEL__
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 6c11eec..a5c7933 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2143,25 +2143,14 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
case TCP_COOKIE_TRANSACTIONS: {
struct tcp_cookie_transactions ctd;
struct tcp_cookie_values *cvp = NULL;
+ int s_data_used = 0;
if (sizeof(ctd) > optlen)
return -EINVAL;
if (copy_from_user(&ctd, optval, sizeof(ctd)))
return -EFAULT;
- if (ctd.tcpct_used > sizeof(ctd.tcpct_value) ||
- ctd.tcpct_s_data_desired > TCP_MSS_DESIRED)
- return -EINVAL;
-
- if (ctd.tcpct_cookie_desired == 0) {
- /* default to global value */
- } else if ((0x1 & ctd.tcpct_cookie_desired) ||
- ctd.tcpct_cookie_desired > TCP_COOKIE_MAX ||
- ctd.tcpct_cookie_desired < TCP_COOKIE_MIN) {
- return -EINVAL;
- }
-
- if (TCP_COOKIE_OUT_NEVER & ctd.tcpct_flags) {
+ if (TCPCT_OUT_NEVER & ctd.tcpct_flags) {
/* Supercedes all other values */
lock_sock(sk);
if (tp->cookie_values != NULL) {
@@ -2175,6 +2164,41 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
return err;
}
+ if (ctd.tcpct_cookie_desired == 0) {
+ /* default to global value */
+ } else if ((0x1 & ctd.tcpct_cookie_desired) ||
+ ctd.tcpct_cookie_desired > TCP_COOKIE_MAX ||
+ ctd.tcpct_cookie_desired < TCP_COOKIE_MIN) {
+ return -EINVAL;
+ }
+
+ if (ctd.tcpct_used > 0) {
+ if (ctd.tcpct_used + sizeof(ctd) > optlen)
+ return -EINVAL;
+ if (TCPCT_OUT_DATA & ctd.tcpct_flags) {
+ if (ctd.tcpct_used >
+ sysctl_tcp_syn_ack_data_limit)
+ return -EINVAL;
+ if (ctd.tcpct_s_data_desired > 0)
+ return -EINVAL;
+ s_data_used = ctd.tcpct_used;
+ } else {
+ if (ctd.tcpct_used > TCP_COOKIE_PAIR_SIZE)
+ return -EINVAL;
+ if (ctd.tcpct_used !=
+ ctd.tcpct_cookie_desired &&
+ ctd.tcpct_used !=
+ ctd.tcpct_cookie_desired * 2)
+ return -EINVAL;
+ if (ctd.tcpct_s_data_desired >
+ sysctl_tcp_syn_data_limit)
+ return -EINVAL;
+ }
+ } else if (TCPCT_OUT_DATA & ctd.tcpct_flags) {
+ /* unexpected flag without s_data */
+ return -EINVAL;
+ }
+
/* Allocate ancillary memory before locking.
*/
if (ctd.tcpct_used > 0 ||
@@ -2182,7 +2206,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
(sysctl_tcp_cookie_size > 0 ||
ctd.tcpct_cookie_desired > 0 ||
ctd.tcpct_s_data_desired > 0))) {
- cvp = kzalloc(sizeof(*cvp) + ctd.tcpct_used,
+ cvp = kzalloc(sizeof(*cvp) + s_data_used,
GFP_KERNEL);
if (cvp == NULL)
return -ENOMEM;
@@ -2191,7 +2215,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
}
lock_sock(sk);
tp->rx_opt.cookie_in_always =
- (TCP_COOKIE_IN_ALWAYS & ctd.tcpct_flags);
+ (TCPCT_IN_ALWAYS & ctd.tcpct_flags);
tp->rx_opt.cookie_out_never = 0; /* false */
if (tp->cookie_values != NULL) {
@@ -2210,11 +2234,27 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (cvp != NULL) {
cvp->cookie_desired = ctd.tcpct_cookie_desired;
- if (ctd.tcpct_used > 0) {
- memcpy(cvp->s_data_payload, ctd.tcpct_value,
- ctd.tcpct_used);
- cvp->s_data_desired = ctd.tcpct_used;
+ if (s_data_used > 0) {
+ if (copy_from_user(cvp->s_data_payload,
+ optval + sizeof(ctd),
+ s_data_used)) {
+ kref_put(&cvp->kref,
+ tcp_cookie_values_release);
+ return -EFAULT;
+ }
+ cvp->s_data_desired = s_data_used;
cvp->s_data_constant = 1; /* true */
+ } else if (ctd.tcpct_used > 0) {
+ if (copy_from_user(cvp->cookie_pair,
+ optval + sizeof(ctd),
+ ctd.tcpct_used)) {
+ kref_put(&cvp->kref,
+ tcp_cookie_values_release);
+ return -EFAULT;
+ }
+ /* No constant payload data. */
+ cvp->s_data_desired = ctd.tcpct_s_data_desired;
+ cvp->s_data_constant = 0; /* false */
} else {
/* No constant payload data. */
cvp->s_data_desired = ctd.tcpct_s_data_desired;
@@ -2574,7 +2614,7 @@ static int do_tcp_getsockopt(struct sock *sk, int level,
return 0;
case TCP_COOKIE_TRANSACTIONS: {
- struct tcp_cookie_transactions ctd;
+ struct tcpct_full ctd;
struct tcp_cookie_values *cvp = tp->cookie_values;
if (get_user(len, optlen))
@@ -2583,23 +2623,23 @@ static int do_tcp_getsockopt(struct sock *sk, int level,
return -EINVAL;
memset(&ctd, 0, sizeof(ctd));
- ctd.tcpct_flags = (tp->rx_opt.cookie_in_always ?
- TCP_COOKIE_IN_ALWAYS : 0)
- | (tp->rx_opt.cookie_out_never ?
- TCP_COOKIE_OUT_NEVER : 0);
+ ctd.soh.tcpct_flags = (tp->rx_opt.cookie_in_always ?
+ TCPCT_IN_ALWAYS : 0)
+ | (tp->rx_opt.cookie_out_never ?
+ TCPCT_OUT_NEVER : 0);
if (cvp != NULL) {
- ctd.tcpct_flags |= (cvp->s_data_in ?
- TCP_S_DATA_IN : 0)
- | (cvp->s_data_out ?
- TCP_S_DATA_OUT : 0);
+ ctd.soh.tcpct_flags |= (cvp->s_data_in ?
+ TCPCT_IN_DATA : 0)
+ | (cvp->s_data_out ?
+ TCPCT_OUT_DATA : 0);
- ctd.tcpct_cookie_desired = cvp->cookie_desired;
- ctd.tcpct_s_data_desired = cvp->s_data_desired;
+ ctd.soh.tcpct_cookie_desired = cvp->cookie_desired;
+ ctd.soh.tcpct_s_data_desired = cvp->s_data_desired;
memcpy(&ctd.tcpct_value[0], &cvp->cookie_pair[0],
cvp->cookie_pair_size);
- ctd.tcpct_used = cvp->cookie_pair_size;
+ ctd.soh.tcpct_used = cvp->cookie_pair_size;
}
if (put_user(sizeof(ctd), optlen))
--
1.7.1
^ permalink raw reply related
* Re: [PATCH net-next-2.6] netdev: tilepro: Use is_multicast_ether_addr helper
From: Chris Metcalf @ 2011-01-12 17:49 UTC (permalink / raw)
To: Tobias Klauser; +Cc: netdev
In-Reply-To: <1294824713-10644-1-git-send-email-tklauser@distanz.ch>
On 1/12/2011 4:31 AM, Tobias Klauser wrote:
> Use is_multicast_ether_addr from linux/etherdevice.h instead of a custom
> macro. Also remove the broadcast address check, as it is considered a
> multicast address too.
>
> Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
> ---
> drivers/net/tile/tilepro.c | 10 +---------
> 1 files changed, 1 insertions(+), 9 deletions(-)
Thanks, I've taken this into the Tilera tree!
--
Chris Metcalf, Tilera Corp.
http://www.tilera.com
^ permalink raw reply
* [PATCH v1 1/2] TCPCT API sysctl update to draft -03
From: William Allen Simpson @ 2011-01-12 17:52 UTC (permalink / raw)
To: Linux Kernel Developers
Cc: Linux Kernel Network Developers, David Miller, Andrew Morton
In-Reply-To: <4D2DE824.10205@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 602 bytes --]
Use most recently specified symbols of RFC-to-be-6013.
Allows different global s_data limits for SYN and SYN_ACK.
CC: "Eric W. Biederman" <ebiederm@xmission.com>
CC: Stephen Hemminger <shemminger@vyatta.com>
CC: Andi Kleen <andi@firstfloor.org>
Signed-off-by: William.Allen.Simpson@gmail.com
---
Documentation/networking/ip-sysctl.txt | 10 ++++++++++
include/net/tcp.h | 2 ++
net/ipv4/sysctl_net_ipv4.c | 25 ++++++++++++++++++++++++-
net/ipv4/tcp_output.c | 19 +++++++++++++++++--
4 files changed, 53 insertions(+), 3 deletions(-)
[-- Attachment #2: TCPCT+API-03u1+2.6.37.patch --]
[-- Type: text/plain, Size: 4111 bytes --]
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index d99940d..4e14b3a 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -184,6 +184,16 @@ tcp_cookie_size - INTEGER
as the minimum. Odd values are interpreted as the next even value.
Default: 0 (off).
+tcp_syn_data_limit - INTEGER
+ Limit for TCP Cookie Transactions (TCPCT) data transmitted with
+ the <SYN>. Default: 496. Maximum: 496.
+
+tcp_syn_ack_data_limit - INTEGER
+ Limit for TCP Cookie Transactions (TCPCT) data transmitted with
+ the <SYN,ACK(SYN)>. As a matter of security policy, keep the
+ setting small to avoid amplification denial of service attacks.
+ Default: 80. Maximum: 1220.
+
tcp_dsack - BOOLEAN
Allows TCP to send "duplicate" SACKs.
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 38509f0..3ac2bca 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -241,6 +241,8 @@ extern int sysctl_tcp_workaround_signed_windows;
extern int sysctl_tcp_slow_start_after_idle;
extern int sysctl_tcp_max_ssthresh;
extern int sysctl_tcp_cookie_size;
+extern int sysctl_tcp_syn_data_limit;
+extern int sysctl_tcp_syn_ack_data_limit;
extern int sysctl_tcp_thin_linear_timeouts;
extern int sysctl_tcp_thin_dupack;
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 1a45665..629f90b 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -30,6 +30,9 @@ static int tcp_adv_win_scale_min = -31;
static int tcp_adv_win_scale_max = 31;
static int ip_ttl_min = 1;
static int ip_ttl_max = 255;
+static int tcp_cookie_max = TCP_COOKIE_MAX;
+static int tcp_syn_data_max = TCP_MSS_DEFAULT - 40;
+static int tcp_syn_ack_data_max = TCP_MSS_DESIRED;
/* Update system visible IP port range */
static void set_local_port_range(int range[2])
@@ -588,7 +591,27 @@ static struct ctl_table ipv4_table[] = {
.data = &sysctl_tcp_cookie_size,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = proc_dointvec
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &zero,
+ .extra2 = &tcp_cookie_max,
+ },
+ {
+ .procname = "tcp_syn_data_limit",
+ .data = &sysctl_tcp_syn_data_limit,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &zero,
+ .extra2 = &tcp_syn_data_max,
+ },
+ {
+ .procname = "tcp_syn_ack_data_limit",
+ .data = &sysctl_tcp_syn_ack_data_limit,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &zero,
+ .extra2 = &tcp_syn_ack_data_max,
},
{
.procname = "tcp_thin_linear_timeouts",
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index dc7c096..16a9e40 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -63,6 +63,15 @@ int sysctl_tcp_slow_start_after_idle __read_mostly = 1;
int sysctl_tcp_cookie_size __read_mostly = 0; /* TCP_COOKIE_MAX */
EXPORT_SYMBOL_GPL(sysctl_tcp_cookie_size);
+int sysctl_tcp_syn_data_limit __read_mostly = TCP_MSS_DEFAULT - 40;
+EXPORT_SYMBOL_GPL(sysctl_tcp_syn_data_limit);
+
+/* As a matter of security policy, keep the setting small to avoid
+ * amplification denial of service attacks.
+ */
+int sysctl_tcp_syn_ack_data_limit __read_mostly = 80; /* TCP_MSS_DESIRED */
+EXPORT_SYMBOL_GPL(sysctl_tcp_syn_ack_data_limit);
+
/* Account for new data that has been sent to the network. */
static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
@@ -2418,10 +2427,16 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
struct tcp_md5sig_key *md5;
int tcp_header_size;
int mss;
- int s_data_desired = 0;
+ int s_data_desired;
- if (cvp != NULL && cvp->s_data_constant && cvp->s_data_desired)
+ if (cvp != NULL &&
+ cvp->s_data_constant &&
+ cvp->s_data_desired > 0 &&
+ cvp->s_data_desired <= sysctl_tcp_syn_ack_data_limit)
s_data_desired = cvp->s_data_desired;
+ else
+ s_data_desired = 0;
+
skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC);
if (skb == NULL)
return NULL;
--
1.7.1
^ permalink raw reply related
* RE: [E1000-devel] [e100] Page allocation failure warning(?) in 2.6.36.3
From: Eric Dumazet @ 2011-01-12 17:48 UTC (permalink / raw)
To: Chris Rankin
Cc: David Miller, e1000-devel@lists.sourceforge.net, Tushar NDave,
netdev@vger.kernel.org, Jeff Kirsher
In-Reply-To: <247288.34804.qm@web121705.mail.ne1.yahoo.com>
Le mercredi 12 janvier 2011 à 09:42 -0800, Chris Rankin a écrit :
> --- On Wed, 12/1/11, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> > Apparently e100 driver uses GFP_ATOMIC allocations in setup
> > phase, and your machine doesnt have enough memory.
>
> Thanks. You'd think 64 MB of RAM would be enough... ;-).
I remember using linux on a 8MB machine a loooong time ago, but not a
2.6 kernel :)
^ permalink raw reply
* TCPCT API update for 2.6.37
From: William Allen Simpson @ 2011-01-12 17:43 UTC (permalink / raw)
To: Linux Kernel Developers
Cc: Linux Kernel Network Developers, David Miller, Andrew Morton
With the recent flurry of messages related to TCPCT, I devoted a nice
snowy Saturday afternoon to updating the socket option code. Linux is
rather behind on TCPCT implementation, so this will help with future
software compatibility.
Currently, any userland programs written to RFC-to-be-6013 will not
interoperate with Linux 2.6.33 and beyond. I've made these patches
for 2.6.37 -- they'll also need to be ported to earlier releases.
I'm not on this list, so anybody with comments should CC me. Thanks.
^ permalink raw reply
* RE: [E1000-devel] [e100] Page allocation failure warning(?) in 2.6.36.3
From: Chris Rankin @ 2011-01-12 17:42 UTC (permalink / raw)
To: David Miller, Eric Dumazet
Cc: e1000-devel@lists.sourceforge.net, Tushar NDave,
netdev@vger.kernel.org, Jeff Kirsher
In-Reply-To: <1294853710.3981.108.camel@edumazet-laptop>
--- On Wed, 12/1/11, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> Apparently e100 driver uses GFP_ATOMIC allocations in setup
> phase, and your machine doesnt have enough memory.
Thanks. You'd think 64 MB of RAM would be enough... ;-).
Cheers,
Chris
^ permalink raw reply
* Re: [e100] Page allocation failure warning(?) in 2.6.36.3
From: Eric Dumazet @ 2011-01-12 17:35 UTC (permalink / raw)
To: Chris Rankin, David Miller
Cc: e1000-devel@lists.sourceforge.net, netdev@vger.kernel.org,
Jeff Kirsher
In-Reply-To: <314995.84049.qm@web121708.mail.ne1.yahoo.com>
Le mardi 11 janvier 2011 à 12:59 -0800, Chris Rankin a écrit :
> Tushar,
>
> As promised:
>
> $ /sbin/ifconfig -a
> br0 Link encap:Ethernet HWaddr 00:03:47:3b:29:5c
> inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
> inet6 addr: fe80::203:47ff:fe3b:295c/64 Scope:Link
> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
> RX packets:372485 errors:0 dropped:0 overruns:0 frame:0
> TX packets:383917 errors:0 dropped:0 overruns:0 carrier:0
> collisions:0 txqueuelen:0
> RX bytes:37566127 (35.8 MiB) TX bytes:225458273 (215.0 MiB)
>
> eth0 Link encap:Ethernet HWaddr 00:90:27:76:d0:ec
> inet addr:10.0.43.2 Bcast:10.0.43.255 Mask:255.255.255.0
> inet6 addr: fe80::290:27ff:fe76:d0ec/64 Scope:Link
> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
> RX packets:432016 errors:0 dropped:0 overruns:0 frame:0
> TX packets:377602 errors:0 dropped:0 overruns:0 carrier:0
> collisions:0 txqueuelen:1000
> RX bytes:229629017 (218.9 MiB) TX bytes:41958103 (40.0 MiB)
>
> eth1 Link encap:Ethernet HWaddr 00:03:47:3b:29:5c
> inet6 addr: fe80::203:47ff:fe3b:295c/64 Scope:Link
> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
> RX packets:364683 errors:0 dropped:0 overruns:0 frame:0
> TX packets:369235 errors:1 dropped:0 overruns:0 carrier:1
> collisions:0 txqueuelen:1000
> RX bytes:42445811 (40.4 MiB) TX bytes:203414933 (193.9 MiB)
>
> eth2 Link encap:Ethernet HWaddr 00:03:47:3b:29:5d
> inet6 addr: fe80::203:47ff:fe3b:295d/64 Scope:Link
> UP BROADCAST MULTICAST MTU:1500 Metric:1
> RX packets:9059 errors:1 dropped:0 overruns:0 frame:1
> TX packets:15437 errors:0 dropped:0 overruns:0 carrier:0
> collisions:0 txqueuelen:1000
> RX bytes:691449 (675.2 KiB) TX bytes:22232699 (21.2 MiB)
>
> lo Link encap:Local Loopback
> inet addr:127.0.0.1 Mask:255.0.0.0
> inet6 addr: ::1/128 Scope:Host
> UP LOOPBACK RUNNING MTU:16436 Metric:1
> RX packets:797 errors:0 dropped:0 overruns:0 frame:0
> TX packets:797 errors:0 dropped:0 overruns:0 carrier:0
> collisions:0 txqueuelen:0
> RX bytes:81543 (79.6 KiB) TX bytes:81543 (79.6 KiB)
>
> $ cat /etc/network/interfaces
> # This file describes the network interfaces available on your system
> # and how to activate them. For more information, see interfaces(5).
>
> # The loopback network interface
> auto lo
> iface lo inet loopback
>
> # The primary network interface
> allow-hotplug eth0
> iface eth0 inet static
> address 10.0.43.2
> netmask 255.255.255.0
> network 10.0.43.0
> broadcast 10.0.43.255
> gateway 10.0.43.1
> # dns-* options are implemented by the resolvconf package, if installed
> dns-nameservers 192.168.0.1
> dns-search underworld
>
> auto br0
> iface br0 inet static
> address 192.168.0.1
> netmask 255.255.255.0
> network 192.168.0.0
> broadcast 192.168.0.255
> bridge-ports eth1 eth2
> bridge_hello 1
> bridge_fd 4
> bridge_maxage 4
> post-up /sbin/route add -net 224.0.0.0 netmask 240.0.0.0 dev br0
>
> Cheers,
> Chris
>
Apparently e100 driver uses GFP_ATOMIC allocations in setup phase, and
your machine doesnt have enough memory.
I would try following patch, allowing the use of GFP_KERNEL at init
time, to let vm games play.
Thanks
[PATCH] e100: use GFP_KERNEL allocations at device init stage
In lowmem conditions, e100 driver can fail its initialization, because
of GFP_ATOMIC abuse.
Switch to GFP_KERNEL were applicable.
Add __GFP_NOWARN flag to GFP_ATOMIC allocations, since driver can cope
with failed allocations (if setup succeeded)
Reported-by: Chris Rankin <rankincj@yahoo.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
diff --git a/drivers/net/e100.c b/drivers/net/e100.c
index b0aa9e6..e4d8a70 100644
--- a/drivers/net/e100.c
+++ b/drivers/net/e100.c
@@ -1880,9 +1880,21 @@ static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
}
#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
-static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
+
+static struct sk_buff *e100_alloc_skb(struct net_device *dev, gfp_t flags)
+{
+ struct sk_buff *skb;
+
+ skb = __netdev_alloc_skb(dev, RFD_BUF_LEN + NET_IP_ALIGN, flags);
+ if (NET_IP_ALIGN && skb)
+ skb_reserve(skb, NET_IP_ALIGN);
+ return skb;
+}
+
+static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx, gfp_t flags)
{
- if (!(rx->skb = netdev_alloc_skb_ip_align(nic->netdev, RFD_BUF_LEN)))
+ rx->skb = e100_alloc_skb(nic->netdev, flags);
+ if (!rx->skb)
return -ENOMEM;
/* Init, and map the RFD. */
@@ -2026,7 +2038,8 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
/* Alloc new skbs to refill list */
for (rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
- if (unlikely(e100_rx_alloc_skb(nic, rx)))
+ if (unlikely(e100_rx_alloc_skb(nic, rx,
+ GFP_ATOMIC | __GFP_NOWARN)))
break; /* Better luck next time (see watchdog) */
}
@@ -2102,13 +2115,13 @@ static int e100_rx_alloc_list(struct nic *nic)
nic->rx_to_use = nic->rx_to_clean = NULL;
nic->ru_running = RU_UNINITIALIZED;
- if (!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_ATOMIC)))
+ if (!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_KERNEL)))
return -ENOMEM;
for (rx = nic->rxs, i = 0; i < count; rx++, i++) {
rx->next = (i + 1 < count) ? rx + 1 : nic->rxs;
rx->prev = (i == 0) ? nic->rxs + count - 1 : rx - 1;
- if (e100_rx_alloc_skb(nic, rx)) {
+ if (e100_rx_alloc_skb(nic, rx, GFP_KERNEL)) {
e100_rx_clean_list(nic);
return -ENOMEM;
}
------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand
malware threats, the impact they can have on your business, and how you
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
^ permalink raw reply related
* Re: [RFC] sched: CHOKe packet scheduler (v0.6)
From: Eric Dumazet @ 2011-01-12 17:33 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David Miller, netdev
In-Reply-To: <20110112092739.4cdcb6f4@nehalam>
Le mercredi 12 janvier 2011 à 09:27 -0800, Stephen Hemminger a écrit :
> On Wed, 12 Jan 2011 08:13:48 +0100
> Eric Dumazet <eric.dumazet@gmail.com> wrote:
>
> > Hi Stephen, here is my v0.6 version :
> >
> > - Added sanity checks before kcalloc()/kzalloc()
> > - Added a __GFP_NOWARN to kcalloc()
> > - Added call to qdisc_bstats_update() after commit bfe0d0298f2a67d94d5
> > (net_sched: factorize qdisc stats handling)
> >
> > TODO :
> > - Added a stat specific update to track CHOKe probabilistic dual-drops
> > I temporarily use requeues counter to make sure our code works
>
> I am going to redo stats and config.
> Should thresholds be packet or byte based? I prefer packet
> Also leaning towards merging qmax and qlimit together.
I believe CHOKe spirit is per packet, I agree with you.
(This makes the tab[] array sizing directly depends on ctl->limit, not
on a computation ctl->limit/smallest_packet_size)
Not sure we can merge qmax and qlimit, are you sure its OK with CHOKe
paper and experimental results ?
(Sorry I cant spend too much time right now to check this point)
^ permalink raw reply
* Re: [RFC] sched: CHOKe packet scheduler (v0.6)
From: Stephen Hemminger @ 2011-01-12 17:27 UTC (permalink / raw)
To: Eric Dumazet; +Cc: David Miller, netdev
In-Reply-To: <1294816428.3447.106.camel@edumazet-laptop>
On Wed, 12 Jan 2011 08:13:48 +0100
Eric Dumazet <eric.dumazet@gmail.com> wrote:
> Hi Stephen, here is my v0.6 version :
>
> - Added sanity checks before kcalloc()/kzalloc()
> - Added a __GFP_NOWARN to kcalloc()
> - Added call to qdisc_bstats_update() after commit bfe0d0298f2a67d94d5
> (net_sched: factorize qdisc stats handling)
>
> TODO :
> - Added a stat specific update to track CHOKe probabilistic dual-drops
> I temporarily use requeues counter to make sure our code works
I am going to redo stats and config.
Should thresholds be packet or byte based? I prefer packet
Also leaning towards merging qmax and qlimit together.
^ permalink raw reply
* Re: [uclinux-dist-devel] [PATCH net-next-2.6] netdev: bfin_mac: Use is_multicast_ether_addr helper
From: Joe Perches @ 2011-01-12 17:18 UTC (permalink / raw)
To: Mike Frysinger
Cc: Tobias Klauser, Michael Hennerich, uclinux-dist-devel, netdev
In-Reply-To: <AANLkTimztPZB3N+ZYNsDM9L3ZEM+x__bBc-JCRgO8iDC@mail.gmail.com>
On Wed, 2011-01-12 at 11:38 -0500, Mike Frysinger wrote:
> On Wed, Jan 12, 2011 at 04:30, Tobias Klauser wrote:
> > --- a/drivers/net/bfin_mac.c
> > +++ b/drivers/net/bfin_mac.c
> > @@ -1293,7 +1293,7 @@ static void bfin_mac_multicast_hash(struct net_device *dev)
> > addrs = ha->addr;
> >
> > /* skip non-multicast addresses */
> > - if (!(*addrs & 1))
> > + if (!is_multicast_ether_addr(addrs))
> > continue;
>
> looks good to me ...
> Acked-by: Mike Frysinger <vapier@gentoo.org>
Does a netdev_for_each_mc_addr loop entry really
need to verify that the address is multicast?
Couldn't this just be:
netdev_for_each_mc_addr(ha, dev) {
crc = ether_crc(ETH_ALEN, ha->addr);
crc >>= 26;
if (crc & 0x20)
emac_hashhi |= 1 << (crc & 0x1f);
else
emac_hashlo |= 1 << (crc & 0x1f);
}
^ permalink raw reply
* Re: [uclinux-dist-devel] [PATCH net-next-2.6] netdev: bfin_mac: Use is_multicast_ether_addr helper
From: Mike Frysinger @ 2011-01-12 16:38 UTC (permalink / raw)
To: Tobias Klauser; +Cc: Michael Hennerich, uclinux-dist-devel, netdev
In-Reply-To: <1294824611-10483-1-git-send-email-tklauser@distanz.ch>
On Wed, Jan 12, 2011 at 04:30, Tobias Klauser wrote:
> --- a/drivers/net/bfin_mac.c
> +++ b/drivers/net/bfin_mac.c
> @@ -1293,7 +1293,7 @@ static void bfin_mac_multicast_hash(struct net_device *dev)
> addrs = ha->addr;
>
> /* skip non-multicast addresses */
> - if (!(*addrs & 1))
> + if (!is_multicast_ether_addr(addrs))
> continue;
looks good to me ...
Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
^ permalink raw reply
* [PATCH ethtool 7/7] ethtool.8: Fix capitalisation
From: Ben Hutchings @ 2011-01-12 16:23 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Write 'Ethernet' and 'PHY' thus.
Use the proper macro for the trademark symbol.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.8.in b/ethtool.8.in
index 203d33d..0ee91a0 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -337,10 +337,10 @@ settings of the specified device.
Shows a short help message.
.TP
.B \-a \-\-show\-pause
-Queries the specified ethernet device for pause parameter information.
+Queries the specified Ethernet device for pause parameter information.
.TP
.B \-A \-\-pause
-Changes the pause parameters of the specified ethernet device.
+Changes the pause parameters of the specified Ethernet device.
.TP
.A2 autoneg on off
Specifies whether pause autonegotiation should be enabled.
@@ -456,7 +456,7 @@ Length of time to perform phys-id, in seconds.
Queries the specified network device for permanent hardware address.
.TP
.B \-r \-\-negotiate
-Restarts auto-negotiation on the specified ethernet device, if
+Restarts auto-negotiation on the specified Ethernet device, if
auto-negotiation is enabled.
.TP
.B \-S \-\-statistics
@@ -535,7 +535,7 @@ this option is a string of characters specifying which options to enable.
.PD 0
.TP 3
.B p
-Wake on phy activity
+Wake on PHY activity
.TP 3
.B u
Wake on unicast messages
@@ -550,10 +550,10 @@ Wake on broadcast messages
Wake on ARP
.TP 3
.B g
-Wake on MagicPacket(tm)
+Wake on MagicPacket\[tm]
.TP 3
.B s
-Enable SecureOn(tm) password for MagicPacket(tm)
+Enable SecureOn\[tm] password for MagicPacket\[tm]
.TP 3
.B d
Disable (wake on nothing). This option clears all previous options.
@@ -561,8 +561,8 @@ Disable (wake on nothing). This option clears all previous options.
.RE
.TP
.B sopass \*(MA\c
-Sets the SecureOn(tm) password. The argument to this option must be 6
-bytes in ethernet MAC hex format (\*(MA).
+Sets the SecureOn\[tm] password. The argument to this option must be 6
+bytes in Ethernet MAC hex format (\*(MA).
.PP
.BI msglvl \ N
.br
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 6/7] ethtool.8: Reword synopses for consistency and style
From: Ben Hutchings @ 2011-01-12 16:23 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.8.in b/ethtool.8.in
index b7ba73e..203d33d 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -87,7 +87,7 @@
.TH ETHTOOL 8 "January 2011" "Ethtool version @VERSION@"
.SH NAME
-ethtool \- Display or change network driver and hardware settings
+ethtool \- query or control network driver and hardware settings
.SH SYNOPSIS
.B ethtool
.I ethX
@@ -322,8 +322,8 @@ ethtool \- Display or change network driver and hardware settings
.SH DESCRIPTION
.BI ethtool
-is used for querying and changing settings of a network device driver
-and hardware, particularly for wired Ethernet devices.
+is used to query and control network device driver and hardware
+settings, particularly for wired Ethernet devices.
.I ethX
is the name of the network device on which ethtool should operate.
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 5/7] ethtool.8: Generalise references to network devices, not Ethernet
From: Ben Hutchings @ 2011-01-12 16:23 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Most operations are generically applicable to devices using other
link-layer protocols.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.8.in b/ethtool.8.in
index 4554ca0..b7ba73e 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -87,7 +87,7 @@
.TH ETHTOOL 8 "January 2011" "Ethtool version @VERSION@"
.SH NAME
-ethtool \- Display or change ethernet card settings
+ethtool \- Display or change network driver and hardware settings
.SH SYNOPSIS
.B ethtool
.I ethX
@@ -322,10 +322,11 @@ ethtool \- Display or change ethernet card settings
.SH DESCRIPTION
.BI ethtool
-is used for querying settings of an ethernet device and changing them.
+is used for querying and changing settings of a network device driver
+and hardware, particularly for wired Ethernet devices.
.I ethX
-is the name of the ethernet device on which ethtool should operate.
+is the name of the network device on which ethtool should operate.
.SH OPTIONS
.B ethtool
@@ -351,16 +352,16 @@ Specifies whether RX pause should be enabled.
Specifies whether TX pause should be enabled.
.TP
.B \-c \-\-show\-coalesce
-Queries the specified ethernet device for coalescing information.
+Queries the specified network device for coalescing information.
.TP
.B \-C \-\-coalesce
-Changes the coalescing settings of the specified ethernet device.
+Changes the coalescing settings of the specified network device.
.TP
.B \-g \-\-show\-ring
-Queries the specified ethernet device for rx/tx ring parameter information.
+Queries the specified network device for rx/tx ring parameter information.
.TP
.B \-G \-\-set\-ring
-Changes the rx/tx ring parameters of the specified ethernet device.
+Changes the rx/tx ring parameters of the specified network device.
.TP
.BI rx \ N
Changes the number of ring entries for the Rx ring.
@@ -375,10 +376,10 @@ Changes the number of ring entries for the Rx Jumbo ring.
Changes the number of ring entries for the Tx ring.
.TP
.B \-i \-\-driver
-Queries the specified ethernet device for associated driver information.
+Queries the specified network device for associated driver information.
.TP
.B \-d \-\-register\-dump
-Retrieves and prints a register dump for the specified ethernet device.
+Retrieves and prints a register dump for the specified network device.
The register format for some devices is known and decoded others
are printed in hex.
When
@@ -391,13 +392,13 @@ than reading from the device.
.TP
.B \-e \-\-eeprom\-dump
-Retrieves and prints an EEPROM dump for the specified ethernet device.
+Retrieves and prints an EEPROM dump for the specified network device.
When raw is enabled, then it dumps the raw EEPROM data to stdout. The
length and offset parameters allow dumping certain portions of the EEPROM.
Default is to dump the entire EEPROM.
.TP
.B \-E \-\-change\-eeprom
-If value is specified, changes EEPROM byte for the specified ethernet device.
+If value is specified, changes EEPROM byte for the specified network device.
offset and value specify which byte and it's new value. If value is not
specified, stdin is read and written to the EEPROM. The length and offset
parameters allow writing to certain portions of the EEPROM.
@@ -405,10 +406,10 @@ Because of the persistent nature of writing to the EEPROM, a device-specific
magic key must be specified to prevent the accidental writing to the EEPROM.
.TP
.B \-k \-\-show\-offload
-Queries the specified ethernet device for offload information.
+Queries the specified network device for offload information.
.TP
.B \-K \-\-offload
-Changes the offload parameters of the specified ethernet device.
+Changes the offload parameters of the specified network device.
.TP
.A2 rx on off
Specifies whether RX checksumming should be enabled.
@@ -446,24 +447,24 @@ Specifies whether receive hashing offload should be enabled
.B \-p \-\-identify
Initiates adapter-specific action intended to enable an operator to
easily identify the adapter by sight. Typically this involves
-blinking one or more LEDs on the specific ethernet port.
+blinking one or more LEDs on the specific network port.
.TP
.B N
Length of time to perform phys-id, in seconds.
.TP
.B \-P \-\-show-permaddr
-Queries the specified ethernet device for permanent hardware address.
+Queries the specified network device for permanent hardware address.
.TP
.B \-r \-\-negotiate
Restarts auto-negotiation on the specified ethernet device, if
auto-negotiation is enabled.
.TP
.B \-S \-\-statistics
-Queries the specified ethernet device for NIC- and driver-specific
+Queries the specified network device for NIC- and driver-specific
statistics.
.TP
.B \-t \-\-test
-Executes adapter selftest on the specified ethernet device. Possible test modes are:
+Executes adapter selftest on the specified network device. Possible test modes are:
.TP
.A1 offline online
defines test type:
@@ -473,7 +474,7 @@ defines test type:
means to perform limited set of tests do not interrupting normal adapter operation.
.TP
.B \-s \-\-change
-Allows changing some or all settings of the specified ethernet device.
+Allows changing some or all settings of the specified network device.
All following options only apply if
.B \-s
was specified.
@@ -799,7 +800,7 @@ Specifies the Rx queue to send packets to, or some other action.
.PD
.RE
.SH BUGS
-Not supported (in part or whole) on all ethernet drivers.
+Not supported (in part or whole) on all network drivers.
.SH AUTHOR
.B ethtool
was written by David Miller.
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 4/7] ethtool.8: Fix obvious spelling errors
From: Ben Hutchings @ 2011-01-12 16:22 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.8.in b/ethtool.8.in
index 75f63ba..4554ca0 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -491,12 +491,12 @@ Selects device port.
.TP
.A2 autoneg on off
Specifies whether autonegotiation should be enabled. Autonegotiation
-is enabled by deafult, but in some network devices may have trouble
+is enabled by default, but in some network devices may have trouble
with it, so you can disable it if really necessary.
.TP
.BI advertise \ N
Sets the speed and duplex advertised by autonegotiation. The argument is
-a hexidecimal value using one or a combination of the following values:
+a hexadecimal value using one or a combination of the following values:
.RS
.PD 0
.TP 3
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 3/7] ethtool.8: Substitute version at configure time
From: Ben Hutchings @ 2011-01-12 16:22 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Rename ethtool.8 to ethtool.8.in and let autoconf set the version.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/configure.ac b/configure.ac
index 9bc8c26..a96fd4d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -29,5 +29,5 @@ dnl Checks for library functions.
AC_HEADER_STDC
AC_CHECK_FUNCS(socket strtol)
-AC_CONFIG_FILES([Makefile ethtool.spec])
+AC_CONFIG_FILES([Makefile ethtool.spec ethtool.8])
AC_OUTPUT
diff --git a/ethtool.8 b/ethtool.8.in
similarity index 99%
rename from ethtool.8
rename to ethtool.8.in
index 8c2137b..75f63ba 100644
--- a/ethtool.8
+++ b/ethtool.8.in
@@ -85,7 +85,7 @@
. hy \\n(HY
..
-.TH ETHTOOL 8 "January 2011" "Ethtool version 2.6.37"
+.TH ETHTOOL 8 "January 2011" "Ethtool version @VERSION@"
.SH NAME
ethtool \- Display or change ethernet card settings
.SH SYNOPSIS
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 2/7] ethtool.8: Update date, version, web site reference
From: Ben Hutchings @ 2011-01-12 16:22 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.8 b/ethtool.8
index 1760924..8c2137b 100644
--- a/ethtool.8
+++ b/ethtool.8
@@ -1,6 +1,7 @@
.\" -*- nroff -*-
.\" Copyright 1999 by David S. Miller. All Rights Reserved.
.\" Portions Copyright 2001 Sun Microsystems
+.\" Portions Copyright 2007, 2009 Free Software Foundation, Inc.
.\" This file may be copied under the terms of the GNU Public License.
.\"
.\" .An - list of n alternative values as in "flav vanilla|strawberry"
@@ -48,7 +49,43 @@
.\" \(*HO - hash options
.\"
.ds HO \fBm\fP|\fBv\fP|\fBt\fP|\fBs\fP|\fBd\fP|\fBf\fP|\fBn\fP|\fBr\fP...
-.TH ETHTOOL 8 "July 2007" "Ethtool version 6"
+.\" Start URL.
+.de UR
+. ds m1 \\$1\"
+. nh
+. if \\n(mH \{\
+. \" Start diversion in a new environment.
+. do ev URL-div
+. do di URL-div
+. \}
+..
+.\" End URL.
+.de UE
+. ie \\n(mH \{\
+. br
+. di
+. ev
+.
+. \" Has there been one or more input lines for the link text?
+. ie \\n(dn \{\
+. do HTML-NS "<a href=""\\*(m1"">"
+. \" Yes, strip off final newline of diversion and emit it.
+. do chop URL-div
+. do URL-div
+\c
+. do HTML-NS </a>
+. \}
+. el \
+. do HTML-NS "<a href=""\\*(m1"">\\*(m1</a>"
+\&\\$*\"
+. \}
+. el \
+\\*(la\\*(m1\\*(ra\\$*\"
+.
+. hy \\n(HY
+..
+
+.TH ETHTOOL 8 "January 2011" "Ethtool version 2.6.37"
.SH NAME
ethtool \- Display or change ethernet card settings
.SH SYNOPSIS
@@ -777,6 +814,6 @@ Scott Feldman,
Andi Kleen.
.SH AVAILABILITY
.B ethtool
-is available over the Web on the SourceForge site at
-http://sourceforge.net/projects/gkernel/
-
+is available from
+.UR http://www.kernel.org/pub/software/network/ethtool/
+.UE
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 1/7] ethtool: Fix spelling and spacing in online help
From: Ben Hutchings @ 2011-01-12 16:22 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers, Kelly Anderson
In-Reply-To: <1294849266.3946.0.camel@bwh-desktop>
Kelly Anderson <kelly@silka.with-linux.com> pointed out that
the help for --show-nfc was missing a space between two words.
I checked the rest of the help text with aspell and found one
other error.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
diff --git a/ethtool.c b/ethtool.c
index 63e0ead..1afdfe4 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -224,13 +224,13 @@ static struct option {
" [ offset N ]\n"
" [ length N ]\n"
" [ value N ]\n" },
- { "-r", "--negotiate", MODE_NWAY_RST, "Restart N-WAY negotation" },
+ { "-r", "--negotiate", MODE_NWAY_RST, "Restart N-WAY negotiation" },
{ "-p", "--identify", MODE_PHYS_ID, "Show visible port identification (e.g. blinking)",
" [ TIME-IN-SECONDS ]\n" },
{ "-t", "--test", MODE_TEST, "Execute adapter self test",
" [ online | offline ]\n" },
{ "-S", "--statistics", MODE_GSTATS, "Show adapter statistics" },
- { "-n", "--show-nfc", MODE_GNFC, "Show Rx network flow classification"
+ { "-n", "--show-nfc", MODE_GNFC, "Show Rx network flow classification "
"options",
" [ rx-flow-hash tcp4|udp4|ah4|sctp4|"
"tcp6|udp6|ah6|sctp6 ]\n" },
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply related
* [PATCH ethtool 0/7] Documentation fixes
From: Ben Hutchings @ 2011-01-12 16:21 UTC (permalink / raw)
To: netdev; +Cc: linux-net-drivers
Some minor fixes to the online help and manual page.
Ben Hutchings (7):
ethtool: Fix spelling and spacing in online help
ethtool.8: Update date, version, web site reference
ethtool.8: Substitute version at configure time
ethtool.8: Fix obvious spelling errors
ethtool.8: Generalise references to network devices, not Ethernet
ethtool.8: Reword synopses for consistency and style
ethtool.8: Fix capitalisation
configure.ac | 2 +-
ethtool.8 => ethtool.8.in | 104 ++++++++++++++++++++++++++++++--------------
ethtool.c | 4 +-
3 files changed, 74 insertions(+), 36 deletions(-)
rename ethtool.8 => ethtool.8.in (84%)
--
1.7.3.4
--
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply
* Re: [PATCH v4 08/10] ARM: mxs: add ocotp read function
From: Uwe Kleine-König @ 2011-01-12 16:01 UTC (permalink / raw)
To: Sascha Hauer
Cc: Shawn Guo, davem, gerg, baruch, eric, bryan.wu, r64343, B32542,
lw, w.sang, jamie, jamie, netdev, linux-arm-kernel
In-Reply-To: <20110112145036.GY12078@pengutronix.de>
Hello Sascha,
On Wed, Jan 12, 2011 at 03:50:36PM +0100, Sascha Hauer wrote:
> On Wed, Jan 12, 2011 at 02:47:12PM +0800, Shawn Guo wrote:
> > On Tue, Jan 11, 2011 at 02:31:37PM +0100, Sascha Hauer wrote:
> > > On Thu, Jan 06, 2011 at 03:13:16PM +0800, Shawn Guo wrote:
> > > > Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
> > > > ---
> > > > Changes for v4:
> > > > - Call cpu_relax() during polling
> > > >
> > > > Changes for v2:
> > > > - Add mutex locking for mxs_read_ocotp()
> > > > - Use type size_t for count and i
> > > > - Add comment for clk_enable/disable skipping
> > > > - Add ERROR bit clearing and polling step
> > > >
> > > > arch/arm/mach-mxs/Makefile | 2 +-
> > > > arch/arm/mach-mxs/include/mach/common.h | 1 +
> > > > arch/arm/mach-mxs/ocotp.c | 79 +++++++++++++++++++++++++++++++
> > > > 3 files changed, 81 insertions(+), 1 deletions(-)
> > > > create mode 100644 arch/arm/mach-mxs/ocotp.c
> > > >
> > > > diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
> > > > index 39d3f9c..f23ebbd 100644
> > > > --- a/arch/arm/mach-mxs/Makefile
> > > > +++ b/arch/arm/mach-mxs/Makefile
> > > > @@ -1,5 +1,5 @@
> > > > # Common support
> > > > -obj-y := clock.o devices.o gpio.o icoll.o iomux.o system.o timer.o
> > > > +obj-y := clock.o devices.o gpio.o icoll.o iomux.o ocotp.o system.o timer.o
> > > >
> > > > obj-$(CONFIG_SOC_IMX23) += clock-mx23.o mm-mx23.o
> > > > obj-$(CONFIG_SOC_IMX28) += clock-mx28.o mm-mx28.o
> > > > diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h
> > > > index 59133eb..cf02552 100644
> > > > --- a/arch/arm/mach-mxs/include/mach/common.h
> > > > +++ b/arch/arm/mach-mxs/include/mach/common.h
> > > > @@ -13,6 +13,7 @@
> > > >
> > > > struct clk;
> > > >
> > > > +extern int mxs_read_ocotp(int offset, int count, u32 *values);
> > > > extern int mxs_reset_block(void __iomem *);
> > > > extern void mxs_timer_init(struct clk *, int);
> > > >
> > > > diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c
> > > > new file mode 100644
> > > > index 0000000..e2d39aa
> > > > --- /dev/null
> > > > +++ b/arch/arm/mach-mxs/ocotp.c
> > > > @@ -0,0 +1,79 @@
> > > > +/*
> > > > + * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
> > > > + *
> > > > + * This program is free software; you can redistribute it and/or modify
> > > > + * it under the terms of the GNU General Public License as published by
> > > > + * the Free Software Foundation; either version 2 of the License, or
> > > > + * (at your option) any later version.
> > > > + *
> > > > + * This program is distributed in the hope that it will be useful,
> > > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > > > + * GNU General Public License for more details.
> > > > + */
> > > > +
> > > > +#include <linux/delay.h>
> > > > +#include <linux/err.h>
> > > > +#include <linux/mutex.h>
> > > > +
> > > > +#include <mach/mxs.h>
> > > > +
> > > > +#define BM_OCOTP_CTRL_BUSY (1 << 8)
> > > > +#define BM_OCOTP_CTRL_ERROR (1 << 9)
> > > > +#define BM_OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
> > > > +
> > > > +static DEFINE_MUTEX(ocotp_mutex);
> > > > +
> > > > +int mxs_read_ocotp(unsigned offset, size_t count, u32 *values)
> > > > +{
> > > > + void __iomem *ocotp_base = MXS_IO_ADDRESS(MXS_OCOTP_BASE_ADDR);
> > > > + int timeout = 0x400;
> > > > + size_t i;
> > > > +
> > > > + mutex_lock(&ocotp_mutex);
> > > > +
> > > > + /*
> > > > + * clk_enable(hbus_clk) for ocotp can be skipped
> > > > + * as it must be on when system is running.
> > > > + */
> > > > +
> > > > + /* try to clear ERROR bit */
> > > > + __mxs_clrl(BM_OCOTP_CTRL_ERROR, ocotp_base);
> > >
> > > This operation does not try to clear the error bit but actually clears
> > > it...
> > >
> > > > +
> > > > + /* check both BUSY and ERROR cleared */
> > > > + while ((__raw_readl(ocotp_base) &
> > > > + (BM_OCOTP_CTRL_BUSY | BM_OCOTP_CTRL_ERROR)) && --timeout)
> > > > + cpu_relax();
> > >
> > > ...which means you do not have to poll the error bit here...
> > >
> > > > +
> > > > + if (unlikely(!timeout))
> > > > + goto error_unlock;
> > > > +
> > > > + /* open OCOTP banks for read */
> > > > + __mxs_setl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
> > > > +
> > > > + /* approximately wait 32 hclk cycles */
> > > > + udelay(1);
> > > > +
> > > > + /* poll BUSY bit becoming cleared */
> > > > + timeout = 0x400;
> > > > + while ((__raw_readl(ocotp_base) & BM_OCOTP_CTRL_BUSY) && --timeout)
> > > > + cpu_relax();
> > >
> > > ...which means you can factor out a ocotp_wait_busy function and let the
> > > code speak instead of the comments.
> > >
> > > > +
> > > > + if (unlikely(!timeout))
> > > > + goto error_unlock;
> > > > +
> > > > + for (i = 0; i < count; i++, offset += 4)
> > > > + *values++ = __raw_readl(ocotp_base + offset);
> > >
> > > The registers in the ocotp are 16 byte aligned. Does it really make
> > > sense to provide a function allowing to read the gaps between the
> > > registers?
> > >
> > Good catch. The count was added to ease the consecutive otp word
> > reading, as there is bank open/close cost for otp read. What about
> > the following changes?
> >
> > int mxs_read_ocotp(unsigned offset, size_t otp_word_cnt, u32 *values)
> > {
> > ......
> >
> > for (i = 0; i < otp_word_cnt; i++, offset += 0x10)
> > *values++ = __raw_readl(ocotp_base + offset);
> >
> > ......
> > }
>
> I would rather make a function like this:
>
> static u32 ocotp[0x27];
>
> const u32 *mxs_get_ocotp(void)
> {
> static int once = 0;
>
> if (once)
> return ocotp
>
> /* bank open */
>
> for (i = 0; i < 0x27; i++)
> ocotp[i] = readl(ocotp_base + 0x20 + i * 0x10)
>
> /* bank_close */
>
> once = 1;
>
> return ocotp;
which is save on UP when it's not called from irq context.
Additionally I suggest a #define for 0x27 and 0x20.
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply
* Re: [PATCH v2 2/2] netlink: support setting devgroup parameters
From: jamal @ 2011-01-12 15:44 UTC (permalink / raw)
To: Vlad Dogaru; +Cc: netdev, Octavian Purdila
In-Reply-To: <1294763724-9927-3-git-send-email-ddvlad@rosedu.org>
On Tue, 2011-01-11 at 18:35 +0200, Vlad Dogaru wrote:
> If a rtnetlink request specifies a negative or zero ifindex and has no
> interface name attribute, but has a group attribute, then the chenges
> are made to all the interfaces belonging to the specified group.
>
> Signed-off-by: Vlad Dogaru <ddvlad@rosedu.org>
Looks good. Please just do some basic tests like setting a few
interfaces to the same group, changing their MTU and setting admin
up then down. If it works add my ACKed-by on both patches.
The only thing that will still generate a lot of noise is the netlink
events that will be generated afterwards for each change on a netdev in
a group i.e a single netlink message..
Maybe we could batch those in a future patch
cheers,
jamal
^ permalink raw reply
* Re: [PATCH v2 1/2] net_device: add support for network device groups
From: jamal @ 2011-01-12 15:40 UTC (permalink / raw)
To: Vlad Dogaru; +Cc: netdev, Octavian Purdila
In-Reply-To: <1294763724-9927-2-git-send-email-ddvlad@rosedu.org>
On Tue, 2011-01-11 at 18:35 +0200, Vlad Dogaru wrote:
> Net devices can now be grouped, enabling simpler manipulation from
> userspace. This patch adds a group field to the net_device strucure, as
^^^^^
typo
> well as rtnetlink support to query and modify it.
>
> + unsigned int group;
Should that be int?
cheers,
jamal
^ permalink raw reply
* [patch] bridge-utils: show selected bridge
From: Anton Danilov @ 2011-01-12 15:29 UTC (permalink / raw)
To: netdev
diff --git a/brctl/brctl_cmd.c b/brctl/brctl_cmd.c
index d37e99c..d95fe54 100644
--- a/brctl/brctl_cmd.c
+++ b/brctl/brctl_cmd.c
@@ -338,8 +338,14 @@ static int show_bridge(const char *name, void *arg)
static int br_cmd_show(int argc, char *const* argv)
{
+ int i = 0;
+
printf("bridge name\tbridge id\t\tSTP enabled\tinterfaces\n");
- br_foreach_bridge(show_bridge, NULL);
+ if (argc == 1)
+ br_foreach_bridge(show_bridge, NULL);
+ else
+ for(i = 2; i <= argc; i++)
+ show_bridge(argv[i - 1], NULL);
return 0;
}
@@ -454,7 +460,8 @@ static const struct command commands[] = {
"<bridge> <port> <cost>\tset path cost" },
{ 3, "setportprio", br_cmd_setportprio,
"<bridge> <port> <prio>\tset port priority" },
- { 0, "show", br_cmd_show, "\t\t\tshow a list of bridges" },
+ { 0, "show", br_cmd_show,
+ "[ <bridge> ]\t\tshow a list of bridges" },
{ 1, "showmacs", br_cmd_showmacs,
"<bridge>\t\tshow a list of mac addrs"},
{ 1, "showstp", br_cmd_showstp,
--
Anton.
^ permalink raw reply related
* [PATCH] net: remove dev_txq_stats_fold()
From: Eric Dumazet @ 2011-01-12 15:02 UTC (permalink / raw)
To: Jarek Poplawski, David Miller
Cc: David Brownell, Michał Nazarewicz, Neil Jones, linux-usb,
netdev, Alexander Duyck, Jeff Kirsher
In-Reply-To: <1294840379.3981.31.camel@edumazet-laptop>
Le mercredi 12 janvier 2011 à 14:52 +0100, Eric Dumazet a écrit :
> Or even better, remove these counters since there is no users left but
> ixgbe.
>
> (vlans, tunnels, ... now use percpu stats)
>
>
Thanks Jarek for the reminder :)
[PATCH] net: remove dev_txq_stats_fold()
After recent changes, (percpu stats on vlan/tunnels...), we dont need
anymore per struct netdev_queue tx_bytes/tx_packets/tx_dropped counters.
Only remaining users are ixgbe, sch_teql & macvlan :
1) ixgbe can be converted to use existing tx_ring counters.
2) macvlan incremented txq->tx_dropped, it can use the
dev->stats.tx_dropped counter.
3) sch_teql : almost revert ab35cd4b8f42 (Use net_device internal stats)
Now we have ndo_get_stats64(), use it.
This removes a lockdep warning (and possible lockup) in rndis gadget,
calling dev_get_stats() from hard IRQ context.
Ref: http://www.spinics.net/lists/netdev/msg149202.html
Reported-by: Neil Jones <neiljay@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Jarek Poplawski <jarkao2@gmail.com>
CC: Alexander Duyck <alexander.h.duyck@intel.com>
CC: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ixgbe/ixgbe_main.c | 23 ++++++++++++++++-------
drivers/net/macvtap.c | 2 +-
include/linux/netdevice.h | 5 -----
net/core/dev.c | 29 -----------------------------
net/sched/sch_teql.c | 26 +++++++++++++++++++++-----
5 files changed, 38 insertions(+), 47 deletions(-)
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index a060610..602078b 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -6667,8 +6667,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
struct ixgbe_adapter *adapter,
struct ixgbe_ring *tx_ring)
{
- struct net_device *netdev = tx_ring->netdev;
- struct netdev_queue *txq;
unsigned int first;
unsigned int tx_flags = 0;
u8 hdr_len = 0;
@@ -6765,9 +6763,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
/* add the ATR filter if ATR is on */
if (test_bit(__IXGBE_TX_FDIR_INIT_DONE, &tx_ring->state))
ixgbe_atr(tx_ring, skb, tx_flags, protocol);
- txq = netdev_get_tx_queue(netdev, tx_ring->queue_index);
- txq->tx_bytes += skb->len;
- txq->tx_packets++;
ixgbe_tx_queue(tx_ring, tx_flags, count, skb->len, hdr_len);
ixgbe_maybe_stop_tx(tx_ring, DESC_NEEDED);
@@ -6925,8 +6920,6 @@ static struct rtnl_link_stats64 *ixgbe_get_stats64(struct net_device *netdev,
struct ixgbe_adapter *adapter = netdev_priv(netdev);
int i;
- /* accurate rx/tx bytes/packets stats */
- dev_txq_stats_fold(netdev, stats);
rcu_read_lock();
for (i = 0; i < adapter->num_rx_queues; i++) {
struct ixgbe_ring *ring = ACCESS_ONCE(adapter->rx_ring[i]);
@@ -6943,6 +6936,22 @@ static struct rtnl_link_stats64 *ixgbe_get_stats64(struct net_device *netdev,
stats->rx_bytes += bytes;
}
}
+
+ for (i = 0; i < adapter->num_tx_queues; i++) {
+ struct ixgbe_ring *ring = ACCESS_ONCE(adapter->tx_ring[i]);
+ u64 bytes, packets;
+ unsigned int start;
+
+ if (ring) {
+ do {
+ start = u64_stats_fetch_begin_bh(&ring->syncp);
+ packets = ring->stats.packets;
+ bytes = ring->stats.bytes;
+ } while (u64_stats_fetch_retry_bh(&ring->syncp, start));
+ stats->tx_packets += packets;
+ stats->tx_bytes += bytes;
+ }
+ }
rcu_read_unlock();
/* following stats updated by ixgbe_watchdog_task() */
stats->multicast = netdev->stats.multicast;
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 21845af..5933621 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -585,7 +585,7 @@ err:
rcu_read_lock_bh();
vlan = rcu_dereference(q->vlan);
if (vlan)
- netdev_get_tx_queue(vlan->dev, 0)->tx_dropped++;
+ vlan->dev->stats.tx_dropped++;
rcu_read_unlock_bh();
return err;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index be4957c..d971346 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -520,9 +520,6 @@ struct netdev_queue {
* please use this field instead of dev->trans_start
*/
unsigned long trans_start;
- u64 tx_bytes;
- u64 tx_packets;
- u64 tx_dropped;
} ____cacheline_aligned_in_smp;
static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
@@ -2265,8 +2262,6 @@ extern void dev_load(struct net *net, const char *name);
extern void dev_mcast_init(void);
extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
struct rtnl_link_stats64 *storage);
-extern void dev_txq_stats_fold(const struct net_device *dev,
- struct rtnl_link_stats64 *stats);
extern int netdev_max_backlog;
extern int netdev_tstamp_prequeue;
diff --git a/net/core/dev.c b/net/core/dev.c
index a3ef808..83507c2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5523,34 +5523,6 @@ void netdev_run_todo(void)
}
}
-/**
- * dev_txq_stats_fold - fold tx_queues stats
- * @dev: device to get statistics from
- * @stats: struct rtnl_link_stats64 to hold results
- */
-void dev_txq_stats_fold(const struct net_device *dev,
- struct rtnl_link_stats64 *stats)
-{
- u64 tx_bytes = 0, tx_packets = 0, tx_dropped = 0;
- unsigned int i;
- struct netdev_queue *txq;
-
- for (i = 0; i < dev->num_tx_queues; i++) {
- txq = netdev_get_tx_queue(dev, i);
- spin_lock_bh(&txq->_xmit_lock);
- tx_bytes += txq->tx_bytes;
- tx_packets += txq->tx_packets;
- tx_dropped += txq->tx_dropped;
- spin_unlock_bh(&txq->_xmit_lock);
- }
- if (tx_bytes || tx_packets || tx_dropped) {
- stats->tx_bytes = tx_bytes;
- stats->tx_packets = tx_packets;
- stats->tx_dropped = tx_dropped;
- }
-}
-EXPORT_SYMBOL(dev_txq_stats_fold);
-
/* Convert net_device_stats to rtnl_link_stats64. They have the same
* fields in the same order, with only the type differing.
*/
@@ -5594,7 +5566,6 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
netdev_stats_to_stats64(storage, ops->ndo_get_stats(dev));
} else {
netdev_stats_to_stats64(storage, &dev->stats);
- dev_txq_stats_fold(dev, storage);
}
storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
return storage;
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c
index af9360d..8b82c13 100644
--- a/net/sched/sch_teql.c
+++ b/net/sched/sch_teql.c
@@ -59,6 +59,10 @@ struct teql_master
struct net_device *dev;
struct Qdisc *slaves;
struct list_head master_list;
+ u64 tx_bytes;
+ u64 tx_packets;
+ u64 tx_errors;
+ u64 tx_dropped;
};
struct teql_sched_data
@@ -274,7 +278,6 @@ static inline int teql_resolve(struct sk_buff *skb,
static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct teql_master *master = netdev_priv(dev);
- struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);
struct Qdisc *start, *q;
int busy;
int nores;
@@ -314,8 +317,8 @@ restart:
__netif_tx_unlock(slave_txq);
master->slaves = NEXT_SLAVE(q);
netif_wake_queue(dev);
- txq->tx_packets++;
- txq->tx_bytes += length;
+ master->tx_packets++;
+ master->tx_bytes += length;
return NETDEV_TX_OK;
}
__netif_tx_unlock(slave_txq);
@@ -342,10 +345,10 @@ restart:
netif_stop_queue(dev);
return NETDEV_TX_BUSY;
}
- dev->stats.tx_errors++;
+ master->tx_errors++;
drop:
- txq->tx_dropped++;
+ master->tx_dropped++;
dev_kfree_skb(skb);
return NETDEV_TX_OK;
}
@@ -398,6 +401,18 @@ static int teql_master_close(struct net_device *dev)
return 0;
}
+static struct rtnl_link_stats64 *teql_master_stats64(struct net_device *dev,
+ struct rtnl_link_stats64 *stats)
+{
+ struct teql_master *m = netdev_priv(dev);
+
+ stats->tx_packets = m->tx_packets;
+ stats->tx_bytes = m->tx_bytes;
+ stats->tx_errors = m->tx_errors;
+ stats->tx_dropped = m->tx_dropped;
+ return stats;
+}
+
static int teql_master_mtu(struct net_device *dev, int new_mtu)
{
struct teql_master *m = netdev_priv(dev);
@@ -422,6 +437,7 @@ static const struct net_device_ops teql_netdev_ops = {
.ndo_open = teql_master_open,
.ndo_stop = teql_master_close,
.ndo_start_xmit = teql_master_xmit,
+ .ndo_get_stats64 = teql_master_stats64,
.ndo_change_mtu = teql_master_mtu,
};
^ permalink raw reply related
* Re: [PATCH v4 08/10] ARM: mxs: add ocotp read function
From: Sascha Hauer @ 2011-01-12 14:50 UTC (permalink / raw)
To: Shawn Guo
Cc: davem, gerg, baruch, eric, bryan.wu, r64343, B32542,
u.kleine-koenig, lw, w.sang, jamie, jamie, netdev,
linux-arm-kernel
In-Reply-To: <20110112064711.GG2888@freescale.com>
On Wed, Jan 12, 2011 at 02:47:12PM +0800, Shawn Guo wrote:
> Hi Sascha,
>
> On Tue, Jan 11, 2011 at 02:31:37PM +0100, Sascha Hauer wrote:
> > On Thu, Jan 06, 2011 at 03:13:16PM +0800, Shawn Guo wrote:
> > > Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
> > > ---
> > > Changes for v4:
> > > - Call cpu_relax() during polling
> > >
> > > Changes for v2:
> > > - Add mutex locking for mxs_read_ocotp()
> > > - Use type size_t for count and i
> > > - Add comment for clk_enable/disable skipping
> > > - Add ERROR bit clearing and polling step
> > >
> > > arch/arm/mach-mxs/Makefile | 2 +-
> > > arch/arm/mach-mxs/include/mach/common.h | 1 +
> > > arch/arm/mach-mxs/ocotp.c | 79 +++++++++++++++++++++++++++++++
> > > 3 files changed, 81 insertions(+), 1 deletions(-)
> > > create mode 100644 arch/arm/mach-mxs/ocotp.c
> > >
> > > diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
> > > index 39d3f9c..f23ebbd 100644
> > > --- a/arch/arm/mach-mxs/Makefile
> > > +++ b/arch/arm/mach-mxs/Makefile
> > > @@ -1,5 +1,5 @@
> > > # Common support
> > > -obj-y := clock.o devices.o gpio.o icoll.o iomux.o system.o timer.o
> > > +obj-y := clock.o devices.o gpio.o icoll.o iomux.o ocotp.o system.o timer.o
> > >
> > > obj-$(CONFIG_SOC_IMX23) += clock-mx23.o mm-mx23.o
> > > obj-$(CONFIG_SOC_IMX28) += clock-mx28.o mm-mx28.o
> > > diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h
> > > index 59133eb..cf02552 100644
> > > --- a/arch/arm/mach-mxs/include/mach/common.h
> > > +++ b/arch/arm/mach-mxs/include/mach/common.h
> > > @@ -13,6 +13,7 @@
> > >
> > > struct clk;
> > >
> > > +extern int mxs_read_ocotp(int offset, int count, u32 *values);
> > > extern int mxs_reset_block(void __iomem *);
> > > extern void mxs_timer_init(struct clk *, int);
> > >
> > > diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c
> > > new file mode 100644
> > > index 0000000..e2d39aa
> > > --- /dev/null
> > > +++ b/arch/arm/mach-mxs/ocotp.c
> > > @@ -0,0 +1,79 @@
> > > +/*
> > > + * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
> > > + *
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License as published by
> > > + * the Free Software Foundation; either version 2 of the License, or
> > > + * (at your option) any later version.
> > > + *
> > > + * This program is distributed in the hope that it will be useful,
> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > > + * GNU General Public License for more details.
> > > + */
> > > +
> > > +#include <linux/delay.h>
> > > +#include <linux/err.h>
> > > +#include <linux/mutex.h>
> > > +
> > > +#include <mach/mxs.h>
> > > +
> > > +#define BM_OCOTP_CTRL_BUSY (1 << 8)
> > > +#define BM_OCOTP_CTRL_ERROR (1 << 9)
> > > +#define BM_OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
> > > +
> > > +static DEFINE_MUTEX(ocotp_mutex);
> > > +
> > > +int mxs_read_ocotp(unsigned offset, size_t count, u32 *values)
> > > +{
> > > + void __iomem *ocotp_base = MXS_IO_ADDRESS(MXS_OCOTP_BASE_ADDR);
> > > + int timeout = 0x400;
> > > + size_t i;
> > > +
> > > + mutex_lock(&ocotp_mutex);
> > > +
> > > + /*
> > > + * clk_enable(hbus_clk) for ocotp can be skipped
> > > + * as it must be on when system is running.
> > > + */
> > > +
> > > + /* try to clear ERROR bit */
> > > + __mxs_clrl(BM_OCOTP_CTRL_ERROR, ocotp_base);
> >
> > This operation does not try to clear the error bit but actually clears
> > it...
> >
> > > +
> > > + /* check both BUSY and ERROR cleared */
> > > + while ((__raw_readl(ocotp_base) &
> > > + (BM_OCOTP_CTRL_BUSY | BM_OCOTP_CTRL_ERROR)) && --timeout)
> > > + cpu_relax();
> >
> > ...which means you do not have to poll the error bit here...
> >
> > > +
> > > + if (unlikely(!timeout))
> > > + goto error_unlock;
> > > +
> > > + /* open OCOTP banks for read */
> > > + __mxs_setl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
> > > +
> > > + /* approximately wait 32 hclk cycles */
> > > + udelay(1);
> > > +
> > > + /* poll BUSY bit becoming cleared */
> > > + timeout = 0x400;
> > > + while ((__raw_readl(ocotp_base) & BM_OCOTP_CTRL_BUSY) && --timeout)
> > > + cpu_relax();
> >
> > ...which means you can factor out a ocotp_wait_busy function and let the
> > code speak instead of the comments.
> >
> > > +
> > > + if (unlikely(!timeout))
> > > + goto error_unlock;
> > > +
> > > + for (i = 0; i < count; i++, offset += 4)
> > > + *values++ = __raw_readl(ocotp_base + offset);
> >
> > The registers in the ocotp are 16 byte aligned. Does it really make
> > sense to provide a function allowing to read the gaps between the
> > registers?
> >
> Good catch. The count was added to ease the consecutive otp word
> reading, as there is bank open/close cost for otp read. What about
> the following changes?
>
> int mxs_read_ocotp(unsigned offset, size_t otp_word_cnt, u32 *values)
> {
> ......
>
> for (i = 0; i < otp_word_cnt; i++, offset += 0x10)
> *values++ = __raw_readl(ocotp_base + offset);
>
> ......
> }
I would rather make a function like this:
static u32 ocotp[0x27];
const u32 *mxs_get_ocotp(void)
{
static int once = 0;
if (once)
return ocotp
/* bank open */
for (i = 0; i < 0x27; i++)
ocotp[i] = readl(ocotp_base + 0x20 + i * 0x10)
/* bank_close */
once = 1;
return ocotp;
}
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ 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