Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH] sctp: fix memory leak in sctp_datamsg_from_user() when copy from user space fails
From: Vlad Yasevich @ 2012-11-26 14:52 UTC (permalink / raw)
  To: Tommi Rantala
  Cc: linux-sctp, netdev, Neil Horman, Sridhar Samudrala,
	David S. Miller, Dave Jones
In-Reply-To: <1353590491-12166-1-git-send-email-tt.rantala@gmail.com>

On 11/22/2012 08:21 AM, Tommi Rantala wrote:
> Trinity (the syscall fuzzer) discovered a memory leak in SCTP,
> reproducible e.g. with the sendto() syscall by passing invalid
> user space pointer in the second argument:
>
>   #include <string.h>
>   #include <arpa/inet.h>
>   #include <sys/socket.h>
>
>   int main(void)
>   {
>           int fd;
>           struct sockaddr_in sa;
>
>           fd = socket(AF_INET, SOCK_STREAM, 132 /*IPPROTO_SCTP*/);
>           if (fd < 0)
>                   return 1;
>
>           memset(&sa, 0, sizeof(sa));
>           sa.sin_family = AF_INET;
>           sa.sin_addr.s_addr = inet_addr("127.0.0.1");
>           sa.sin_port = htons(11111);
>
>           sendto(fd, NULL, 1, 0, (struct sockaddr *)&sa, sizeof(sa));
>
>           return 0;
>   }
>
> As far as I can tell, the leak has been around since ~2003.
>
> Signed-off-by: Tommi Rantala <tt.rantala@gmail.com>
> ---
>   net/sctp/chunk.c |    7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c
> index 7c2df9c..d241ef5 100644
> --- a/net/sctp/chunk.c
> +++ b/net/sctp/chunk.c
> @@ -284,7 +284,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
>   			goto errout;
>   		err = sctp_user_addto_chunk(chunk, offset, len, msgh->msg_iov);
>   		if (err < 0)
> -			goto errout;
> +			goto errout_chunk_put;
>
>   		offset += len;
>
> @@ -324,7 +324,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
>   		__skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr
>   			   - (__u8 *)chunk->skb->data);
>   		if (err < 0)
> -			goto errout;
> +			goto errout_chunk_put;
>
>   		sctp_datamsg_assign(msg, chunk);
>   		list_add_tail(&chunk->frag_list, &msg->chunks);
> @@ -332,6 +332,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
>
>   	return msg;
>
> +errout_chunk_put:
> +	sctp_chunk_put(chunk);
> +
>   errout:
>   	list_for_each_safe(pos, temp, &msg->chunks) {
>   		list_del_init(pos);
>

Should be using sctp_chunk_free().  Good find.

-vlad

^ permalink raw reply

* Re: [RFC net-next PATCH V1 0/9] net: fragmentation performance scalability on NUMA/SMP systems
From: Jesper Dangaard Brouer @ 2012-11-26 14:42 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David S. Miller, Florian Westphal, netdev, Pablo Neira Ayuso,
	Thomas Graf, Cong Wang, Patrick McHardy, Paul E. McKenney,
	Herbert Xu
In-Reply-To: <1353859891.30446.634.camel@edumazet-glaptop>

On Sun, 2012-11-25 at 08:11 -0800, Eric Dumazet wrote:
> On Sun, 2012-11-25 at 09:53 +0100, Jesper Dangaard Brouer wrote:
> 
> > Yes, for the default large 64k packets size, its just a "fake"
> > benchmark.  And notice with my fixes, we are even faster than the
> > none-frag/single-UDP packet case... but its because we are getting a
> > GSO/GRO effect.
> 
> Could you elaborate on this GSO/GRO effect ?

On the big system, I saw none-frag UDP (1472 bytes) throughput of:
  7356.57 + 7351.78 + 7330.60 + 7269.26 = 29308.21 Mbit/s

While with UDP fragments size 65507 bytes I saw:
  9228.75 + 9207.81 + 9615.83 + 9615.87 = 37668.26 Mbit/s

Fragmented UDP is faster by:
 37668.26 - 29308.21 = 8360.05 Mbit/s

The 65507 bytes UDP size is just a benchmark test, and have no real-life
relevance.  As performance starts to drop (below none-frag/normal case)
when the frag size is decreased, to more realistic sizes...


-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Sr. Network Kernel Developer at Red Hat
  Author of http://www.iptv-analyzer.org
  LinkedIn: http://www.linkedin.com/in/brouer

^ permalink raw reply

* Re: [PATCH v2] atm: br2684: Fix excessive queue bloat
From: Jesper Dangaard Brouer @ 2012-11-26 14:16 UTC (permalink / raw)
  To: David Woodhouse
  Cc: netdev, John Crispin, Dave Täht, Chas Williams (CONTRACTOR),
	Jesper Brouer
In-Reply-To: <1353881212.26346.303.camel@shinybook.infradead.org>


Nice work David Woodhouse.  What OpenWRT supported box have this 
hardware? (I want one so I can play with it ;-))

Cheers,
   Jesper Brouer

--
-------------------------------------------------------------------
MSc. Master of Computer Science
Dept. of Computer Science, University of Copenhagen
Author of http://www.adsl-optimizer.dk
-------------------------------------------------------------------

^ permalink raw reply

* [PATCH] irda: irttp: fix memory leak in irttp_open_tsap() error path
From: Tommi Rantala @ 2012-11-26 14:16 UTC (permalink / raw)
  To: netdev; +Cc: Samuel Ortiz, David S. Miller, Dave Jones, Tommi Rantala

Cleanup the memory we allocated earlier in irttp_open_tsap() when we hit
this error path. The leak goes back to at least 1da177e4
("Linux-2.6.12-rc2").

Discovered with Trinity (the syscall fuzzer).

Signed-off-by: Tommi Rantala <tt.rantala@gmail.com>
---
 net/irda/irttp.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/net/irda/irttp.c b/net/irda/irttp.c
index 1002e33..ae43c62 100644
--- a/net/irda/irttp.c
+++ b/net/irda/irttp.c
@@ -441,6 +441,7 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit, notify_t *notify)
 	lsap = irlmp_open_lsap(stsap_sel, &ttp_notify, 0);
 	if (lsap == NULL) {
 		IRDA_DEBUG(0, "%s: unable to allocate LSAP!!\n", __func__);
+		__irttp_close_tsap(self);
 		return NULL;
 	}
 
-- 
1.7.9.5

^ permalink raw reply related

* Re: [PATCH 4/5] smsc95xx: refactor entering suspend modes
From: Bjørn Mork @ 2012-11-26 13:48 UTC (permalink / raw)
  To: Steve Glendinning
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-usb-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1353607526-19307-5-git-send-email-steve.glendinning-nksJyM/082jR7s880joybQ@public.gmane.org>

[adding linux-usb to CC as this is very USB specific]

Steve Glendinning <steve.glendinning-nksJyM/082jR7s880joybQ@public.gmane.org> writes:

> +	smsc95xx_set_feature(dev, USB_DEVICE_REMOTE_WAKEUP);

That does look a bit strange to me.  This is a USB interface driver.
The USB device is handled by the generic "usb" USB device driver, which
will DTRT for you.  I don't think you need to set any USB device
features here.

Sorry for not commenting on this earlier.... It took me a while to
understand why that part surprised me.


Bjørn
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply

* Re: [PATCH net-next v2] net: clean up locking in inet_frag_find()
From: Jesper Dangaard Brouer @ 2012-11-26 13:42 UTC (permalink / raw)
  To: Cong Wang, David Miller; +Cc: netdev, Eric Dumazet
In-Reply-To: <1353914786-10426-1-git-send-email-amwang@redhat.com>


Could we please hold back on this cleanup patch, as I have a stack of 9
patches modifying this area.

If people find this cleanup useful/correct?, I can integrate it into my
patch stack...

--Jesper

On Mon, 2012-11-26 at 15:26 +0800, Cong Wang wrote:
> It is weird to take the read lock outside of inet_frag_find()
> but release it inside...  This can be improved by refactoring
> the code, that is, introducing inet{4,6}_frag_find() which call
> the their own hash function, inet{4,6}_hash_frag(), hiding the
> details from their callers.

^ permalink raw reply

* Re: linux-next: manual merge of the akpm tree with Linus' tree
From: Xiaotian Feng @ 2012-11-26 13:25 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Andrew Morton, linux-next, linux-kernel, David Miller, netdev
In-Reply-To: <20121126234844.1952cdd84c3ba041cfe7a9af@canb.auug.org.au>

On Mon, Nov 26, 2012 at 8:48 PM, Stephen Rothwell <sfr@canb.auug.org.au> wrote:
> Hi Andrew,
>
> Today's linux-next merge of the akpm tree got a conflict in
> drivers/net/ethernet/jme.c between commit 71c6c837a0fe ("drivers/net: fix
> tasklet misuse issue") from Linus' tree and commit  "tasklet: ignore
> disabled tasklet in tasklet_action()" from the akpm tree.
>

You can simply remove the following part of the patch


@@ -1862,8 +1862,8 @@ jme_open(struct net_device *netdev)

         tasklet_enable(&jme->linkch_task);
         tasklet_enable(&jme->txclean_task);
-       tasklet_hi_enable(&jme->rxclean_task);
-       tasklet_hi_enable(&jme->rxempty_task);
+       tasklet_enable(&jme->rxclean_task);
+       tasklet_enable(&jme->rxempty_task);

         rc = jme_request_irq(jme);
         if (rc)

Do you want me to re-generate a patch for you?


> I am not sure what to do here, so I have dropped the akpm patch.
>
> --
> Cheers,
> Stephen Rothwell                    sfr@canb.auug.org.au

^ permalink raw reply

* linux-next: manual merge of the akpm tree with Linus' tree
From: Stephen Rothwell @ 2012-11-26 12:48 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-next, linux-kernel, Xiaotian Feng, David Miller, netdev

[-- Attachment #1: Type: text/plain, Size: 421 bytes --]

Hi Andrew,

Today's linux-next merge of the akpm tree got a conflict in
drivers/net/ethernet/jme.c between commit 71c6c837a0fe ("drivers/net: fix
tasklet misuse issue") from Linus' tree and commit  "tasklet: ignore
disabled tasklet in tasklet_action()" from the akpm tree.

I am not sure what to do here, so I have dropped the akpm patch.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* iputils-s20121126
From: YOSHIFUJI Hideaki @ 2012-11-26 12:13 UTC (permalink / raw)
  To: 'netdev@vger.kernel.org'; +Cc: YOSHIFUJI Hideaki

Hello.

iputils-s20121126 comes with a lot of bug fixes and improvements.

New features and bux fixes (selected) since s20121114:
        - static link support for libidn.
        - arping: select default interface.
        - ninfod: rejects queries from global addresses.
        - ping: do not free uninitialized value (bug since s20121112).
        - ping6: -N subject-ipv6 and subject-ipv4 sub-options fixed.
        - ping6: Randomize nonce field in NI Queries.
        - ping6: source routing deprecated.
        - tracepath: broken if port was omitted (bug since s20121112).

Files:
        https://sourceforge.net/projects/iputils/files/
        http://www.skbuff.net/iputils/
Tree:
        http://www.linux-ipv6.org/gitweb/gitweb.cgi?p=gitroot/iputils.git
        https://sourceforge.net/p/iputils/code/ci/HEAD/tree/

Regards,

--yoshfuji
----------
Changelogs:

Jan Synacek (2):
      ping,ping6: Add newline to error message.
      ping: Don't free an unintialized value.

YOSHIFUJI Hideaki (69):
      arping,clockdiff,ping,rarpd,rdisc,traceroute6 doc:
s/CAP_NET_RAWIO/CAP_NET_RAW/.
      ping,ping6: Do not assume radix point is denoted by '.' (-i option).
      arping,ping,ping6,rdisc,traceroute6: Fix version string.
      makefile: Give -fno-strict-aliasing to compiler by default.
      ping6: Use SCOPE_DELIMITER.
      Makefile: Remove -lm from ADDLIB.
      rdisc_srv,Makefile: Fix build.
      rdisc_srv,Makefile: Build rdisc_srv with make all.
      arping: set_device_broadcast() does not need to store return value
of sub-functions.
      arping,Makefile: Make default interface configurable.
      arping: Do not allow empty device name (-I option).
      arping: Introduce check_ifflags() helper function.
      arping: Introduce device structure to hold output device information.
      arping: ALlow no default interface and select one by getifaddrs().
      arping: Introduce 2nd (legacy) method to select interface by ioctls.
      arping,Makefile: Allow build without getifaddrs() with
WITHOUT_IFADDRS=yes.
      Makefile: Use $< instead of $^ to complile C source code.
      ping,ping6: Reorder command-line options in alphabetical order.
      ping6: Show suboptions for Node Information Queries if -N
suboption is invalid.
      ping,ping6 doc: Readability for TOS (-Q) option.
      rdisc: Missing new line after usage.
      rdisc: Make rdisc with responder support if configured.
      Makefile: distclean depends on clean.
      Makefile: Default to -O3.
      Makefile: Minimize options to gcc.
      Makefile: Add rule to build assembly files.
      arping,Makefile: 3rd legacy implementation to check network devices.
      arping: Less ifdefs.
      rdisc doc: Document -r, -p and -T options.
      ping6: NI Subjecet address did not work (-N subject-{ipv6,ipv4]
suboptions).
      ping6: Ensure to detect subject type conflicts.
      iputils-s20121121
      ping6: Use IN6_IS_ADDR_UNSPECIFIED() instead of our own helper
function.
      ping6 doc: Explicitly describe ping6 is IPv6 version if ping.
      ping6: Deprecate source routing by default (RFC5095).
      ping6: Use RFC3542 functions and definition for source routing.
      ping6: Introduce niquery_is_enabled() for readability.
      arping doc: interface is optional (-I option).
      ping: Eliminate dirty hack to cope with ancient egcs bug.
      Makefile: Fix missing right parenthese in comment.
      arping: Fix build failure with USE_SYSFS=yes and/or
WITHOUT_IFADDRS=yes
      arping: Unify source files.
      arping: Reorder functions and comment out unsued code.
      arping,ping,ping6,tracepath,traceroute6 Makefile: Support static
link of libidn by USE_IDN=static.
      Makefile: Minimize statically linked libraries.
      ping6: Do not clear seq check array twice for NI.
      ping6: Use MD5_DIGEST_LENGTH instead of magic value 16.
      ping6: Introduce helper functions for nonce in NI.
      ping6: Introduce NI_NONCE_SIZE macro instead of magic value 8.
      ping6: Ensure to call srand() to get some randomness in NI Nonce.
      ping6: Generate different NI Nonce in each NI Query (Memory version).
      ping6: Generate different NI Nonce in each NI Query (MD5 version).
      ping6: Cache NI Nonce.
      ping6: Print 'sequence number' embedded in NI Nonce.
      ninfod: Do noy try to memcpy to self.
      ninfod Makefile: More precise dependencies.
      ninfod: Discard multicat packet outside linklocal scope.
      ninfod: Apply default policy to refuse queries from global addresses.
      ninfod: Normalize timespec for delay.
      ninfod: Fix double-free without pthreads.
      ninfod: Do not mix output from multiple threads.
      ninfod: Employ internal buffer in stderrlog() for common case.
      iputils-s20121125
      tracepath: Repair tracepath without -p option.
      tracepath,tracepath6: -p option in usage.
      ping,ping6: Use MAX_DUP_CHK directly, not using mx_dup_chk variable.
      ping,ping6: Abstract received bitmap macros/definitions.
      ping,ping6: Use __u64 or __u32 for bitmap.
      iputils-s20121126

^ permalink raw reply

* [PATCH net-next] cpts: add missing kconfig dependency
From: Richard Cochran @ 2012-11-26 12:07 UTC (permalink / raw)
  To: netdev; +Cc: linux-arm-kernel, David Miller, Cyril Chemparathy, Mugunthan V N

The Common Platform Time Sync function of the CPSW does not depend the
CPSW configuration option as it should. This patch fixes the issue by
adding the dependency.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
 drivers/net/ethernet/ti/Kconfig |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig
index 48fcb5e..4426151 100644
--- a/drivers/net/ethernet/ti/Kconfig
+++ b/drivers/net/ethernet/ti/Kconfig
@@ -62,6 +62,7 @@ config TI_CPSW
 
 config TI_CPTS
 	boolean "TI Common Platform Time Sync (CPTS) Support"
+	depends on TI_CPSW
 	select PTP_1588_CLOCK
 	---help---
 	  This driver supports the Common Platform Time Sync unit of
-- 
1.7.2.5

^ permalink raw reply related

* [PATCH net-next 2/2] ptp: reduce stack usage when measuring the system time offset
From: Richard Cochran @ 2012-11-26 11:44 UTC (permalink / raw)
  To: netdev; +Cc: David Miller
In-Reply-To: <1146e32bcb835ebf394bab91db3161600ab5213a.1353929829.git.richardcochran@gmail.com>

This patch removes the large buffer from the stack of the system
offset ioctl and replaces it with a kmalloced buffer.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
 drivers/ptp/ptp_chardev.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
index 9d7542e..34a0c60 100644
--- a/drivers/ptp/ptp_chardev.c
+++ b/drivers/ptp/ptp_chardev.c
@@ -34,7 +34,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
 {
 	struct ptp_clock_caps caps;
 	struct ptp_clock_request req;
-	struct ptp_sys_offset sysoff;
+	struct ptp_sys_offset *sysoff = NULL;
 	struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock);
 	struct ptp_clock_info *ops = ptp->info;
 	struct ptp_clock_time *pct;
@@ -94,17 +94,22 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
 		break;
 
 	case PTP_SYS_OFFSET:
-		if (copy_from_user(&sysoff, (void __user *)arg,
-				   sizeof(sysoff))) {
+		sysoff = kmalloc(sizeof(*sysoff), GFP_KERNEL);
+		if (!sysoff) {
+			err = -ENOMEM;
+			break;
+		}
+		if (copy_from_user(sysoff, (void __user *)arg,
+				   sizeof(*sysoff))) {
 			err = -EFAULT;
 			break;
 		}
-		if (sysoff.n_samples > PTP_MAX_SAMPLES) {
+		if (sysoff->n_samples > PTP_MAX_SAMPLES) {
 			err = -EINVAL;
 			break;
 		}
-		pct = &sysoff.ts[0];
-		for (i = 0; i < sysoff.n_samples; i++) {
+		pct = &sysoff->ts[0];
+		for (i = 0; i < sysoff->n_samples; i++) {
 			getnstimeofday(&ts);
 			pct->sec = ts.tv_sec;
 			pct->nsec = ts.tv_nsec;
@@ -117,7 +122,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
 		getnstimeofday(&ts);
 		pct->sec = ts.tv_sec;
 		pct->nsec = ts.tv_nsec;
-		if (copy_to_user((void __user *)arg, &sysoff, sizeof(sysoff)))
+		if (copy_to_user((void __user *)arg, sysoff, sizeof(*sysoff)))
 			err = -EFAULT;
 		break;
 
@@ -125,6 +130,8 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
 		err = -ENOTTY;
 		break;
 	}
+
+	kfree(sysoff);
 	return err;
 }
 
-- 
1.7.2.5

^ permalink raw reply related

* [PATCH net-next 1/2] ptp: reduce stack usage when reading external time stamps
From: Richard Cochran @ 2012-11-26 11:44 UTC (permalink / raw)
  To: netdev; +Cc: David Miller
In-Reply-To: <20121102020631.GI16883@yliu-dev.sh.intel.com>

This patch removes the large buffer from the stack of the read file
operation and replaces it with a kmalloced buffer.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
 drivers/ptp/ptp_chardev.c |   22 +++++++++++++++++-----
 1 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
index 4f8ae80..9d7542e 100644
--- a/drivers/ptp/ptp_chardev.c
+++ b/drivers/ptp/ptp_chardev.c
@@ -21,6 +21,7 @@
 #include <linux/posix-clock.h>
 #include <linux/poll.h>
 #include <linux/sched.h>
+#include <linux/slab.h>
 
 #include "ptp_private.h"
 
@@ -136,20 +137,23 @@ unsigned int ptp_poll(struct posix_clock *pc, struct file *fp, poll_table *wait)
 	return queue_cnt(&ptp->tsevq) ? POLLIN : 0;
 }
 
+#define EXTTS_BUFSIZE (PTP_BUF_TIMESTAMPS * sizeof(struct ptp_extts_event))
+
 ssize_t ptp_read(struct posix_clock *pc,
 		 uint rdflags, char __user *buf, size_t cnt)
 {
 	struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock);
 	struct timestamp_event_queue *queue = &ptp->tsevq;
-	struct ptp_extts_event event[PTP_BUF_TIMESTAMPS];
+	struct ptp_extts_event *event;
 	unsigned long flags;
 	size_t qcnt, i;
+	int result;
 
 	if (cnt % sizeof(struct ptp_extts_event) != 0)
 		return -EINVAL;
 
-	if (cnt > sizeof(event))
-		cnt = sizeof(event);
+	if (cnt > EXTTS_BUFSIZE)
+		cnt = EXTTS_BUFSIZE;
 
 	cnt = cnt / sizeof(struct ptp_extts_event);
 
@@ -167,6 +171,12 @@ ssize_t ptp_read(struct posix_clock *pc,
 		return -ENODEV;
 	}
 
+	event = kmalloc(EXTTS_BUFSIZE, GFP_KERNEL);
+	if (!event) {
+		mutex_unlock(&ptp->tsevq_mux);
+		return -ENOMEM;
+	}
+
 	spin_lock_irqsave(&queue->lock, flags);
 
 	qcnt = queue_cnt(queue);
@@ -185,8 +195,10 @@ ssize_t ptp_read(struct posix_clock *pc,
 
 	mutex_unlock(&ptp->tsevq_mux);
 
+	result = cnt;
 	if (copy_to_user(buf, event, cnt))
-		return -EFAULT;
+		result = -EFAULT;
 
-	return cnt;
+	kfree(event);
+	return result;
 }
-- 
1.7.2.5

^ permalink raw reply related

* Re: [PATCH] net/macb: Use non-coherent memory for rx buffers
From: Nicolas Ferre @ 2012-11-26 10:44 UTC (permalink / raw)
  To: Joachim Eastwood
  Cc: David S. Miller, netdev, linux-arm-kernel, linux-kernel,
	Jean-Christophe PLAGNIOL-VILLARD, Havard Skinnemoen
In-Reply-To: <CAGhQ9VwWmP_B17LnAEqDHcL8Yd-s0C-Bf35z3+=vnJmK_NoCSw@mail.gmail.com>

On 11/23/2012 05:12 PM, Joachim Eastwood :
> Hi Nicolas,
> 
> On 23 November 2012 14:50, Nicolas Ferre <nicolas.ferre@atmel.com> wrote:
>> From: Havard Skinnemoen <havard@skinnemoen.net>
>>
>> Allocate regular pages to use as backing for the RX ring and use the
>> DMA API to sync the caches. This should give a bit better performance
>> since it allows the CPU to do burst transfers from memory. It is also
>> a necessary step on the way to reduce the amount of copying done by
>> the driver.
>>
>> Signed-off-by: Havard Skinnemoen <havard@skinnemoen.net>
>> [nicolas.ferre@atmel.com: adapt to newer kernel]
>> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
>> ---
>>  drivers/net/ethernet/cadence/macb.c | 206 +++++++++++++++++++++++-------------
>>  drivers/net/ethernet/cadence/macb.h |  20 +++-
>>  2 files changed, 148 insertions(+), 78 deletions(-)
> 
> <snip>
> 
>> diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h
>> index 570908b..74e68a3 100644
>> --- a/drivers/net/ethernet/cadence/macb.h
>> +++ b/drivers/net/ethernet/cadence/macb.h
>> @@ -453,6 +453,23 @@ struct macb_dma_desc {
>>  #define MACB_TX_USED_SIZE                      1
>>
>>  /**
>> + * struct macb_rx_page - data associated with a page used as RX buffers
>> + * @page: Physical page used as storage for the buffers
>> + * @phys: DMA address of the page
>> + *
>> + * Each page is used to provide %MACB_RX_BUFFERS_PER_PAGE RX buffers.
>> + * The page gets an initial reference when it is inserted into the
>> + * ring, and an additional reference each time it is passed up the
>> + * stack as a fragment. When all the buffers have been used, we drop
>> + * the initial reference and allocate a new page. Any additional
>> + * references are dropped when the higher layers free the skb.
>> + */
>> +struct macb_rx_page {
>> +       struct page             *page;
>> +       dma_addr_t              phys;
>> +};
>> +
>> +/**
>>   * struct macb_tx_skb - data about an skb which is being transmitted
>>   * @skb: skb currently being transmitted
>>   * @mapping: DMA address of the skb's data buffer
>> @@ -543,7 +560,7 @@ struct macb {
>>
>>         unsigned int            rx_tail;
>>         struct macb_dma_desc    *rx_ring;
>> -       void                    *rx_buffers;
>> +       struct macb_rx_page     *rx_page;
>>
>>         unsigned int            tx_head, tx_tail;
>>         struct macb_dma_desc    *tx_ring;
>> @@ -564,7 +581,6 @@ struct macb {
>>
>>         dma_addr_t              rx_ring_dma;
>>         dma_addr_t              tx_ring_dma;
>> -       dma_addr_t              rx_buffers_dma;
>>
>>         struct mii_bus          *mii_bus;
>>         struct phy_device       *phy_dev;
>> --
> 
> struct macb is shared between at91_ether and macb. Removing
> rx_buffers_dma and rx_buffers will break compilation on at91_ether.

OMG, you are absolutely right.

> So please either leave the two struct members alone, for now, or fix
> up at91_ether at the same time.

Well, I do not plan to touch at91_ether driver for the moment, so I
certainly will keep the two struct members for now.

I will wait a little more feedback before sending a v2 patch with these
changes.

Best regards,
-- 
Nicolas Ferre

^ permalink raw reply

* Re: [PATCH 1/3] net: stmmac: change GMAC control register for SGMII
From: Giuseppe CAVALLARO @ 2012-11-26 10:31 UTC (permalink / raw)
  To: Byungho An; +Cc: davem, jeffrey.t.kirsher, netdev, kgene.kim, linux-kernel
In-Reply-To: <004b01cdc959$80af8030$820e8090$%an@samsung.com>

On 11/23/2012 10:04 AM, Byungho An wrote:
>
> This patch changes GMAC control register (TC(Transmit
> Configuration) and PS(Port Selection) bit for SGMII.
> In case of SGMII, TC bit is '1' and PS bit is 0.

IMO this new support that should be released for net-next and further 
effort is actually needed.

The availability of the PCS registers is given by looking at the HW 
feature register. In fact, these are optional registers.
I don't want to break the compatibility with old chips.

I do not see why we have to use Kconfig macro to select ANE etc
(as you do in your patches).
The driver could directly manage the phy device by itself if possible 
and the stmmac_init_phy should be reworked.

There are several things that need to be implemented. For example:

The ISR (e.g. priv->hw->mac->host_irq_status) should be able to manage 
these new interrupts.
The code has to be able to maintain the user interface.
For example if you want to enable ANE or manage Advertisement caps.

> Signed-off-by: Byungho An <bh74.an@samsung.com>
> ---

[snip]

> +	if (priv->phydev->interface == PHY_INTERFACE_MODE_SGMII) {
> +		value = readl(priv->ioaddr);
> +		/* GMAC_CONTROL_TC : transmit config in RGMII/SGMII */
> +		value |= 0x1000000;
> +		/* GMAC_CONTROL_PS : Port Selection for GMII */
> +		value &= ~(0x8000);
> +		writel(value, priv->ioaddr);
> +	}
> +


This parts of code have to be moved in
drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c

Pls, do not use value |= 0x1000000 but provide the appropriate defines.

>   	/* Request the IRQ lines */
>   	ret = request_irq(dev->irq, stmmac_interrupt,
>   			 IRQF_SHARED, dev->name, dev);
>

^ permalink raw reply

* WARNING VIRUS DETECTED
From: WEBMAIL UPGRADE @ 2012-11-26  9:47 UTC (permalink / raw)
  To: Recipients

Strong virus has been detected in your email account, which might make you lose your email account if not deleted. Use the below web link to Delete the virus in your email account:

Click link below:
https://docs.google.com/spreadsheet/viewform?formkey=dFRMRm9TOHlwS2lVNWtEZEhYTjVoMGc6MQ

Thank you for using our email.
Copyright ©2012 Email Helpdesk Centre

^ permalink raw reply

* Re: BQL support in gianfar causes network hickup
From: Tino Keitel @ 2012-11-26 10:01 UTC (permalink / raw)
  To: Eric Dumazet, Paul Gortmaker; +Cc: netdev, Keitel, Tino (ALC NetworX GmbH)
In-Reply-To: <1353800616.2590.4562.camel@edumazet-glaptop>

On Sat, Nov 24, 2012 at 15:43:36 -0800, Eric Dumazet wrote:

[...]

> Hmm, I wonder if BQL makes a particular bug showing more often.
> 
> I see gianfar uses a very small watchdog_timeo of 1 second, while many
> drivers use 5 seconds.
> 
> What happens if you change this to 5 seconds ?

I still got the trace and a failing ptp client.

Regards,
Tino

^ permalink raw reply

* linux-next: manual merge of the arm-soc tree with the net-next tree
From: Stephen Rothwell @ 2012-11-26  9:45 UTC (permalink / raw)
  To: Olof Johansson, Arnd Bergmann, linux-arm-kernel
  Cc: linux-next, linux-kernel, Mugunthan V N, Vaibhav Hiremath,
	David Miller, netdev, AnilKumar Ch, Benoit Cousson, Jon Hunter,
	Afzal Mohammed, Philip, Avinash, Ajay Kumar Gupta

[-- Attachment #1: Type: text/plain, Size: 4866 bytes --]

Hi all,

Today's linux-next merge of the arm-soc tree got a conflict in
arch/arm/boot/dts/am33xx.dtsi between commit 1a39a65cba08 ("arm/dts:
am33xx: Add CPSW and MDIO module nodes for AM33XX") from the net-next
tree and commits 059b185d5345 ("ARM: dts: AM33XX: Add D_CAN device tree
data") and 4c94ac29b5c1 ("ARM: dts: OMAP: Move interrupt-parent to the
root node to avoid duplication") (and a few others that added more later
nodes) from the arm-soc tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff --cc arch/arm/boot/dts/am33xx.dtsi
index a4615b4,20a3f29..0000000
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@@ -210,53 -222,121 +222,168 @@@
  			interrupts = <91>;
  		};
  
 +		mac: ethernet@4a100000 {
 +			compatible = "ti,cpsw";
 +			ti,hwmods = "cpgmac0";
 +			cpdma_channels = <8>;
 +			ale_entries = <1024>;
 +			bd_ram_size = <0x2000>;
 +			no_bd_ram = <0>;
 +			rx_descs = <64>;
 +			mac_control = <0x20>;
 +			slaves = <2>;
 +			cpts_active_slave = <0>;
 +			cpts_clock_mult = <0x80000000>;
 +			cpts_clock_shift = <29>;
 +			reg = <0x4a100000 0x800
 +			       0x4a101200 0x100>;
 +			#address-cells = <1>;
 +			#size-cells = <1>;
- 			interrupt-parent = <&intc>;
 +			/*
 +			 * c0_rx_thresh_pend
 +			 * c0_rx_pend
 +			 * c0_tx_pend
 +			 * c0_misc_pend
 +			 */
 +			interrupts = <40 41 42 43>;
 +			ranges;
 +
 +			davinci_mdio: mdio@4a101000 {
 +				compatible = "ti,davinci_mdio";
 +				#address-cells = <1>;
 +				#size-cells = <0>;
 +				ti,hwmods = "davinci_mdio";
 +				bus_freq = <1000000>;
 +				reg = <0x4a101000 0x100>;
 +			};
 +
 +			cpsw_emac0: slave@4a100200 {
 +				/* Filled in by U-Boot */
 +				mac-address = [ 00 00 00 00 00 00 ];
 +			};
 +
 +			cpsw_emac1: slave@4a100300 {
 +				/* Filled in by U-Boot */
 +				mac-address = [ 00 00 00 00 00 00 ];
 +			};
 +
 +		};
++
+ 		dcan0: d_can@481cc000 {
+ 			compatible = "bosch,d_can";
+ 			ti,hwmods = "d_can0";
+ 			reg = <0x481cc000 0x2000>;
+ 			interrupts = <52>;
+ 			status = "disabled";
+ 		};
+ 
+ 		dcan1: d_can@481d0000 {
+ 			compatible = "bosch,d_can";
+ 			ti,hwmods = "d_can1";
+ 			reg = <0x481d0000 0x2000>;
+ 			interrupts = <55>;
+ 			status = "disabled";
+ 		};
+ 
+ 		timer1: timer@44e31000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x44e31000 0x400>;
+ 			interrupts = <67>;
+ 			ti,hwmods = "timer1";
+ 			ti,timer-alwon;
+ 		};
+ 
+ 		timer2: timer@48040000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x48040000 0x400>;
+ 			interrupts = <68>;
+ 			ti,hwmods = "timer2";
+ 		};
+ 
+ 		timer3: timer@48042000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x48042000 0x400>;
+ 			interrupts = <69>;
+ 			ti,hwmods = "timer3";
+ 		};
+ 
+ 		timer4: timer@48044000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x48044000 0x400>;
+ 			interrupts = <92>;
+ 			ti,hwmods = "timer4";
+ 			ti,timer-pwm;
+ 		};
+ 
+ 		timer5: timer@48046000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x48046000 0x400>;
+ 			interrupts = <93>;
+ 			ti,hwmods = "timer5";
+ 			ti,timer-pwm;
+ 		};
+ 
+ 		timer6: timer@48048000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x48048000 0x400>;
+ 			interrupts = <94>;
+ 			ti,hwmods = "timer6";
+ 			ti,timer-pwm;
+ 		};
+ 
+ 		timer7: timer@4804a000 {
+ 			compatible = "ti,omap2-timer";
+ 			reg = <0x4804a000 0x400>;
+ 			interrupts = <95>;
+ 			ti,hwmods = "timer7";
+ 			ti,timer-pwm;
+ 		};
+ 
+ 		rtc@44e3e000 {
+ 			compatible = "ti,da830-rtc";
+ 			reg = <0x44e3e000 0x1000>;
+ 			interrupts = <75
+ 				      76>;
+ 			ti,hwmods = "rtc";
+ 		};
+ 
+ 		spi0: spi@48030000 {
+ 			compatible = "ti,omap4-mcspi";
+ 			#address-cells = <1>;
+ 			#size-cells = <0>;
+ 			reg = <0x48030000 0x400>;
+ 			interrupt = <65>;
+ 			ti,spi-num-cs = <2>;
+ 			ti,hwmods = "spi0";
+ 			status = "disabled";
+ 		};
+ 
+ 		spi1: spi@481a0000 {
+ 			compatible = "ti,omap4-mcspi";
+ 			#address-cells = <1>;
+ 			#size-cells = <0>;
+ 			reg = <0x481a0000 0x400>;
+ 			interrupt = <125>;
+ 			ti,spi-num-cs = <2>;
+ 			ti,hwmods = "spi1";
+ 			status = "disabled";
+ 		};
+ 
+ 		usb@47400000 {
+ 			compatible = "ti,musb-am33xx";
+ 			reg = <0x47400000 0x1000	/* usbss */
+ 			       0x47401000 0x800		/* musb instance 0 */
+ 			       0x47401800 0x800>;	/* musb instance 1 */
+ 			interrupts = <17		/* usbss */
+ 				      18		/* musb instance 0 */
+ 				      19>;		/* musb instance 1 */
+ 			multipoint = <1>;
+ 			num-eps = <16>;
+ 			ram-bits = <12>;
+ 			port0-mode = <3>;
+ 			port1-mode = <3>;
+ 			power = <250>;
+ 			ti,hwmods = "usb_otg_hs";
+ 		};
  	};
  };

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* Re: [PATCH] ewrk3: silence GCC warning
From: Paul Bolle @ 2012-11-26  9:41 UTC (permalink / raw)
  To: richard -rw- weinberger; +Cc: netdev, linux-kernel
In-Reply-To: <CAFLxGvyfH3WdNpsGzV2OgvyT_8hu4U03+HEuv3u9DvSkOmNBtA@mail.gmail.com>

On Sun, 2012-11-25 at 11:45 +0100, richard -rw- weinberger wrote:
> > While we're touching this code also drop an outdated comment, that
> > should have been dropped with the patch named "MODULE_PARM conversions"
> > from early 2005.
> 
> Please send this change as an additional patch.

Sure. Although it will be a trivial patch I suppose it's easiest for
everyone if I still send it to netdev (and not to trivial, which
normally handles stuff like that).


Paul Bolle   

^ permalink raw reply

* RE: [PATCH 080/493] fddi: remove use of __devexit_p
From: David Laight @ 2012-11-26  9:33 UTC (permalink / raw)
  To: Maciej W. Rozycki, Greg KH; +Cc: Bill Pemberton, netdev
In-Reply-To: <alpine.LFD.2.02.1211260425240.25230@eddie.linux-mips.org>

> > Even those don't care about less than 5k of memory, do they?
> 
>  I guess you're right.  As long as it's not 5k per driver +
> who_knows_how_much per platform for some generic stuff that is.  Of course
> this is still a waste, but I can accept it as a compromise between the use

If you are worried about that much memory (eg for a small embedded Linux)
I'r worry about the sizes of all the hash tables that keep popping up.
At least some of them really need converting to some kind of tree.

	David

^ permalink raw reply

* Re: [PATCH] arping: Fix find_device_by_ifaddrs()
From: Jan Synacek @ 2012-11-26  9:26 UTC (permalink / raw)
  To: yoshfuji; +Cc: netdev
In-Reply-To: <1353574275-21742-1-git-send-email-jsynacek@redhat.com>

On 11/22/2012 09:51 AM, Jan Synacek wrote:
> Look for another device if the device name and the currently found one are the
> same, not different.
> 
> Also, make checking for the device's flags nonfatal.
> 
> Signed-off-by: Jan Synacek <jsynacek@redhat.com>
> ---
>  arping.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arping.c b/arping.c
> index ff77bec..d0edccf 100644
> --- a/arping.c
> +++ b/arping.c
> @@ -550,10 +550,10 @@ static int find_device_by_ifaddrs(void)
>  			continue;
>  		if (ifa->ifa_addr->sa_family != AF_PACKET)
>  			continue;
> -		if (device.name && ifa->ifa_name && strcmp(ifa->ifa_name, device.name))
> +		if (device.name && ifa->ifa_name && !strcmp(ifa->ifa_name, device.name))
>  			continue;
>  
> -		if (check_ifflags(ifa->ifa_flags, device.name != NULL) < 0)
> +		if (check_ifflags(ifa->ifa_flags, 0) < 0)
>  			continue;
>  
>  		if (!((struct sockaddr_ll *)ifa->ifa_addr)->sll_halen)
> 

Please, disregard this patch. I found a problem with it and will send a proper
patch soon.

Cheers,

-- 
Jan Synacek
Software Engineer, BaseOS team Brno, Red Hat

^ permalink raw reply

* Re: private netdev flags into UAPI?
From: David Howells @ 2012-11-26  9:22 UTC (permalink / raw)
  To: Or Gerlitz; +Cc: dhowells, netdev
In-Reply-To: <50B1CC1B.20104@mellanox.com>

Or Gerlitz <ogerlitz@mellanox.com> wrote:

> not sure if this has been brought up before, but I realized that the private
> IFF_yyy netdevice flags which weren't exposed to user space so far have been
> moved to include/uapi/linux/if.h, isn't that wrong?

They were exposed to userspace already.  On my Fedora 16 test box, I see:

	[root@andromeda ~]# grep -r IFF_EBRIDGE /usr/include/linux
	/usr/include/linux/if.h:#define IFF_EBRIDGE     0x2             /* Ethernet bridging device.    */

which is from:

	kernel-headers-3.3.6-3.fc16.x86_64

which was built before UAPI proper started going in:

	[root@andromeda ~]# rpm -qfi /usr/include/linux/if.h | grep "Build Date"
	Build Date  : Wed 16 May 2012 23:05:59 BST

Looking at commit 607ca46e97a1b6594b29647d98a32d545c24bdff, I see:

	--------------------------- include/uapi/linux/if.h ---------------------------
	similarity index 100%
	rename from include/linux/if.h
	rename to include/uapi/linux/if.h

so my script just moved it without alteration.

David

^ permalink raw reply

* Re: [RFC net-next PATCH V1 9/9] net: frag remove readers-writer lock (hack)
From: Florian Westphal @ 2012-11-26  9:18 UTC (permalink / raw)
  To: Jesper Dangaard Brouer
  Cc: Eric Dumazet, David S. Miller, Florian Westphal, netdev,
	Pablo Neira Ayuso, Thomas Graf, Cong Wang, Patrick McHardy,
	Paul E. McKenney, Herbert Xu
In-Reply-To: <20121123130847.18764.87682.stgit@dragon>

Jesper Dangaard Brouer <brouer@redhat.com> wrote:
> After all the other patches, the rw_lock is now the contention point.
> 
> This is a quick hack, that remove the readers-writer lock, by
> disabling/breaking hash rebuilding.  Just to see how big the
> performance gain would be.
> 
>   2x10G size(4416) result: 6481+6764 = 13245 Mbit/s (gen: 7652+8077 Mbit/s)
> 
>   4x10G size(4416) result:(5610+6283+5735+5238)=22866 Mbit/s
>                      (gen: 6530+7860+5967+5238 =25595 Mbit/s)
> 
> And the results show, that its a big win. With 4x10G size(4416)
> before: 17923 Mbit/s -> now: 22866 Mbit/s increase 4943 Mbit/s.
> With 2x10G size(4416) before 10689 Mbit/s -> 13245 Mbit/s
> increase 2556 Mbit/s.
> 
> I'll work on a real solution for removing the rw_lock while still
> supporting hash rebuilding.  Suggestions and ideas are welcome.

<devils advocate>
Why not kill it altogether, and just set new secret_interval
without moving frag queues to new location?

The only consequence is that all fragments queued at the time of
changing secret_interval will be lost, and free'd by evictor/timer.

Default secret rebuild interval is 10 minutes, should we care about
small packet loss every 10 minutes?
</devils advocate>

^ permalink raw reply

* RE: Re: RTL 8169  linux driver question
From: David Laight @ 2012-11-26  9:15 UTC (permalink / raw)
  To: Stéphane ANCELOT, netdev; +Cc: sancelot
In-Reply-To: <50AFCB1D.8080002@free.fr>

> I had problem with it, my application sends a frame that is immediately
> transmitted back by some slaves, there was abnormally 100us  lost
> between the send and receive call.
> 
> Finally I found it was coming from the following register setup in the
> driver :
> 
> RTL_W16(IntrMitigate, 0x5151);
> 
> Can you give me some details about it, since I do not have the RTL8169
> programming guide.

That sounds like an 'interrupt mitigation' setting - which will cause
RX interrupts to be delayed a short time in order to reduce the
interrupt load on the kernel.

There is usually an 'ethtool' setting to disable interrupt mitigation.

	David

^ permalink raw reply

* [net-next.git 6/6] stmmac: update the driver version to Nov_2012
From: Giuseppe CAVALLARO @ 2012-11-26  9:10 UTC (permalink / raw)
  To: netdev; +Cc: bhutchings, davem, Giuseppe Cavallaro
In-Reply-To: <1353921046-5121-1-git-send-email-peppe.cavallaro@st.com>

Many new feauture have been introduced in the driver:
ethtool coalesce options, Rx HW watchdog... so this patch updates the
driver's version.

Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index fe0535c..023a4fb 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -24,7 +24,7 @@
 #define __STMMAC_H__
 
 #define STMMAC_RESOURCE_NAME   "stmmaceth"
-#define DRV_MODULE_VERSION	"March_2012"
+#define DRV_MODULE_VERSION	"Nov_2012"
 
 #include <linux/clk.h>
 #include <linux/stmmac.h>
-- 
1.7.4.4

^ permalink raw reply related

* [net-next.git 4/6 (V2)] stmmac: get/set coalesce parameters via ethtool
From: Giuseppe CAVALLARO @ 2012-11-26  9:10 UTC (permalink / raw)
  To: netdev; +Cc: bhutchings, davem, Giuseppe Cavallaro
In-Reply-To: <1353921046-5121-1-git-send-email-peppe.cavallaro@st.com>

This patch is to get/set the tx/rx coalesce parameters
via ethtool interface.

Tests have been done on several platform with different GMAC chips w/o and w/
RX watchdog feature.

V2: reject coalesce settings that are not supported.

Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Reviewed-by: Ben Hutchings <bhutchings@solarflare.com>
---
 .../net/ethernet/stmicro/stmmac/stmmac_ethtool.c   |   83 ++++++++++++++++++++
 1 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index 240acd2..f2aa013 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -524,6 +524,87 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
 	return phy_ethtool_set_eee(priv->phydev, edata);
 }
 
+static u32 stmmac_usec2riwt(u32 usec, struct stmmac_priv *priv)
+{
+	unsigned long clk = clk_get_rate(priv->stmmac_clk);
+
+	if (!clk)
+		return 0;
+
+	return (usec * (clk / 1000000)) / 256;
+}
+
+static u32 stmmac_riwt2usec(u32 riwt, struct stmmac_priv *priv)
+{
+	unsigned long clk = clk_get_rate(priv->stmmac_clk);
+
+	if (!clk)
+		return 0;
+
+	return (riwt * 256) / (clk / 1000000);
+}
+
+static int stmmac_get_coalesce(struct net_device *dev,
+			       struct ethtool_coalesce *ec)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	ec->tx_coalesce_usecs = priv->tx_coal_timer;
+	ec->tx_max_coalesced_frames = priv->tx_coal_frames;
+
+	if (priv->use_riwt)
+		ec->rx_coalesce_usecs = stmmac_riwt2usec(priv->rx_riwt, priv);
+
+	return 0;
+}
+
+static int stmmac_set_coalesce(struct net_device *dev,
+			       struct ethtool_coalesce *ec)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+	unsigned int rx_riwt;
+
+	/* Check not supported parameters  */
+	if ((ec->rx_max_coalesced_frames) || (ec->rx_coalesce_usecs_irq) ||
+	    (ec->rx_max_coalesced_frames_irq) || (ec->tx_coalesce_usecs_irq) ||
+	    (ec->use_adaptive_rx_coalesce) || (ec->use_adaptive_tx_coalesce) ||
+	    (ec->pkt_rate_low) || (ec->rx_coalesce_usecs_low) ||
+	    (ec->rx_max_coalesced_frames_low) || (ec->tx_coalesce_usecs_high) ||
+	    (ec->tx_max_coalesced_frames_low) || (ec->pkt_rate_high) ||
+	    (ec->tx_coalesce_usecs_low) || (ec->rx_coalesce_usecs_high) ||
+	    (ec->rx_max_coalesced_frames_high) ||
+	    (ec->tx_max_coalesced_frames_irq) ||
+	    (ec->stats_block_coalesce_usecs) ||
+	    (ec->tx_max_coalesced_frames_high) || (ec->rate_sample_interval))
+		return -EOPNOTSUPP;
+
+	if (ec->rx_coalesce_usecs == 0)
+		return -EINVAL;
+
+	if ((ec->tx_coalesce_usecs == 0) &&
+	    (ec->tx_max_coalesced_frames == 0))
+		return -EINVAL;
+
+	if ((ec->tx_coalesce_usecs > STMMAC_COAL_TX_TIMER) ||
+	    (ec->tx_max_coalesced_frames > STMMAC_TX_MAX_FRAMES))
+		return -EINVAL;
+
+	rx_riwt = stmmac_usec2riwt(ec->rx_coalesce_usecs, priv);
+
+	if ((rx_riwt > MAX_DMA_RIWT) || (rx_riwt < MIN_DMA_RIWT))
+		return -EINVAL;
+	else if (!priv->use_riwt)
+		return -EOPNOTSUPP;
+
+	/* Only copy relevant parameters, ignore all others. */
+	priv->tx_coal_frames = ec->tx_max_coalesced_frames;
+	priv->tx_coal_timer = ec->tx_coalesce_usecs;
+	priv->rx_riwt = rx_riwt;
+	priv->hw->dma->rx_watchdog(priv->ioaddr, priv->rx_riwt);
+
+	return 0;
+}
+
 static const struct ethtool_ops stmmac_ethtool_ops = {
 	.begin = stmmac_check_if_running,
 	.get_drvinfo = stmmac_ethtool_getdrvinfo,
@@ -544,6 +625,8 @@ static const struct ethtool_ops stmmac_ethtool_ops = {
 	.set_eee = stmmac_ethtool_op_set_eee,
 	.get_sset_count	= stmmac_get_sset_count,
 	.get_ts_info = ethtool_op_get_ts_info,
+	.get_coalesce = stmmac_get_coalesce,
+	.set_coalesce = stmmac_set_coalesce,
 };
 
 void stmmac_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox