Re: Can decnet be deprecated?

2018-11-25 Thread Loganaden Velvindron
On Sun, Nov 25, 2018 at 4:14 AM David Ahern  wrote:
>
> IPX was moved to staging at the end of last year. Can decnet follow
> suit? git log seems to indicate no active development in a very long time.
>
> David

Kill it :)


Re: ipv6 issues after an DDoS for kernel 4.6.3

2016-07-08 Thread Loganaden Velvindron
On Fri, Jul 8, 2016 at 6:14 PM, Eric Dumazet  wrote:
> On Fri, 2016-07-08 at 15:51 +0200, Toralf Förster wrote:
>> I do run a 4.6.3 hardened Gentoo kernel at a commodity i7 server. A
>> DDoS with about 300 MBit/sec over 5 mins resulted an issue for ipv6 at
>> that system.
>>
>> The IPv6 monitoring from my ISP told my that the to be monitored
>> services (80, 443, 5) weren't reachable any longer at ipv6 (at
>> ipv4 there was no issue). Restarting the NIC brought back green lights
>> for the services at the ipv6 ports too.
>
> Hard to tell without knowing DDOS details, but IPv6 lacks some
> scalability improvements found in IPv4.
>
> IPv4 no longer has a routing cache, but IPv6 still has one.
>

Any pointers as to which part of the kernel to look for to implement
one for IPv6 ?


> Are you sure conntrack is needed at all ?
>
>


Re: [PATCH] iproute2: Fix musl compatibility

2016-03-02 Thread Loganaden Velvindron
ping stephen.


[PATCH] iproute2: Fix musl compatibility

2016-02-22 Thread Loganaden Velvindron
Don't redefine in6_addr due to including linux/in6.h and also fix
the case of MAXPATHLEN constant not found.

(Original patch from VoidLinux)

Signed-off-by: Loganaden Velvindron <lo...@hackers.mu>
---
 include/linux/if_bridge.h | 1 -
 include/linux/netfilter.h | 2 --
 include/linux/xfrm.h  | 1 -
 include/utils.h   | 1 +
 4 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
index ee197a3..f823aa4 100644
--- a/include/linux/if_bridge.h
+++ b/include/linux/if_bridge.h
@@ -15,7 +15,6 @@
 
 #include 
 #include 
-#include 
 
 #define SYSFS_BRIDGE_ATTR  "bridge"
 #define SYSFS_BRIDGE_FDB   "brforward"
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
index b71b4c9..3e4e6ae 100644
--- a/include/linux/netfilter.h
+++ b/include/linux/netfilter.h
@@ -4,8 +4,6 @@
 #include 
 
 #include 
-#include 
-#include 
 
 /* Responses from hook functions. */
 #define NF_DROP 0
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
index b8f5451..a9761a5 100644
--- a/include/linux/xfrm.h
+++ b/include/linux/xfrm.h
@@ -1,7 +1,6 @@
 #ifndef _LINUX_XFRM_H
 #define _LINUX_XFRM_H
 
-#include 
 #include 
 
 /* All of the structures in this file may not change size as they are
diff --git a/include/utils.h b/include/utils.h
index c43427c..debcdde 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -1,6 +1,7 @@
 #ifndef __UTILS_H__
 #define __UTILS_H__ 1
 
+#include  /* MAXPATHLEN */
 #include 
 #include 
 #include 
-- 
2.7.0


[PATCH net-next ] net: ipv4: memset addr before calling copy_to_user()

2015-11-08 Thread Loganaden Velvindron
zero addr before calling copy_to_user()
 
Signed-off-by: Loganaden Velvindron <lo...@elandsys.com>
---
 net/ipv4/ip_sockglue.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index c3c359a..d7a5a8b 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -1373,6 +1373,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, 
int optname,
case IP_MULTICAST_IF:
{
struct in_addr addr;
+   memset(, 0, sizeof(addr));
len = min_t(unsigned int, len, sizeof(struct in_addr));
addr.s_addr = inet->mc_addr;
release_sock(sk);
-- 
2.6.2
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: nothing other than BUG fixes please

2015-11-03 Thread Loganaden Velvindron
On Tue, Nov 3, 2015 at 4:10 AM, David Miller  wrote:
>
>
> If it's not a bug fix, I really don't want to see it submitted at
> this time.  No exceptions.
>
> Things will stay this way until some short period after the merge
> window opens and I open up net-next and patchwork to new feature
> patches and cleanups.
>
> Anyone violating this will not even get an email reply from me,
> I will simply toss your submission from patchwork silently.  It's
> simply too much pointless work for me to keep reminding people
> what I explicitly state on the list about the state of the trees
> we develop under.
>
> The best part is this will only punish the people who don't pay
> attention and just blindly come post patches here when it's convenient
> for them to submit patches, rather than actually reading the list and
> making an effort to participate in development properly.


Do small "security" patches that prevent resource leakage count as bugfixes ?

e.g:
http://patchwork.ozlabs.org/patch/537519/


>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next] use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userland later on.

2015-10-28 Thread Loganaden Velvindron
---
 net/bridge/netfilter/ebtables.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index f46ca41..26922e9 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct 
ebt_replace *repl,
   the check on the size is done later, when we have the lock */
if (repl->num_counters) {
unsigned long size = repl->num_counters * sizeof(*counterstmp);
-   counterstmp = vmalloc(size);
+   counterstmp = vzalloc(size);
if (!counterstmp)
return -ENOMEM;
}
@@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t,
return -EINVAL;
}
 
-   counterstmp = vmalloc(nentries * sizeof(*counterstmp));
+   counterstmp = vzalloc(nentries * sizeof(*counterstmp));
if (!counterstmp)
return -ENOMEM;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userland la

2015-10-28 Thread Loganaden Velvindron
---
 net/bridge/netfilter/ebtables.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index f46ca41..26922e9 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct 
ebt_replace *repl,
   the check on the size is done later, when we have the lock */
if (repl->num_counters) {
unsigned long size = repl->num_counters * sizeof(*counterstmp);
-   counterstmp = vmalloc(size);
+   counterstmp = vzalloc(size);
if (!counterstmp)
return -ENOMEM;
}
@@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t,
return -EINVAL;
}
 
-   counterstmp = vmalloc(nentries * sizeof(*counterstmp));
+   counterstmp = vzalloc(nentries * sizeof(*counterstmp));
if (!counterstmp)
return -ENOMEM;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userlan

2015-10-28 Thread Loganaden Velvindron
On Wed, Oct 28, 2015 at 09:10:20PM +0300, Sergei Shtylyov wrote:
> Hello.
> 
>Your subject is too long, it should have been placed in the changelog
> partially. You you didn't sign off on the patch, so it can't applied.
> 
> MBR, Sergei

Thank you. Please reject this patch. I re-sent a proper one in another mail.
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH net-next] net: bridge: use vzalloc() instead of vmalloc() as counterstmp is not cleared before it is used in get_counters(). counterstmp might be leaked partially when it is sent to userlan

2015-10-28 Thread Loganaden Velvindron
Please reject this patch. I sent a proper one with the sign-on later on.


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/1 net-next] net: bridge: use vzalloc() instead of vmalloc() for counterstmp

2015-10-28 Thread Loganaden Velvindron
counterstmp is not cleared before it is used in get_counters(). it might be 
leaked partially when it is sent to userland later on.

Signed-off-by: Loganaden Velvindron <lo...@elandsys.com>
---
 net/bridge/netfilter/ebtables.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index f46ca41..26922e9 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -989,7 +989,7 @@ static int do_replace_finish(struct net *net, struct 
ebt_replace *repl,
   the check on the size is done later, when we have the lock */
if (repl->num_counters) {
unsigned long size = repl->num_counters * sizeof(*counterstmp);
-   counterstmp = vmalloc(size);
+   counterstmp = vzalloc(size);
if (!counterstmp)
return -ENOMEM;
}
@@ -1410,7 +1410,7 @@ static int copy_counters_to_user(struct ebt_table *t,
return -EINVAL;
}
 
-   counterstmp = vmalloc(nentries * sizeof(*counterstmp));
+   counterstmp = vzalloc(nentries * sizeof(*counterstmp));
if (!counterstmp)
return -ENOMEM;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net-next] 3c59x: Add BQL support for 3c59x ethernet driver.

2015-08-20 Thread Loganaden Velvindron
This BQL patch is based on work done by Tino Reichardt.

Tested on :05:00.0: 3Com PCI 3c905C Tornado at c9e6e000 by running
Flent several times.


Signed-off-by: Loganaden Velvindron lo...@elandsys.com
---
 drivers/net/ethernet/3com/3c59x.c | 23 ---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/3com/3c59x.c 
b/drivers/net/ethernet/3com/3c59x.c
index 753887d..2839af0 100644
--- a/drivers/net/ethernet/3com/3c59x.c
+++ b/drivers/net/ethernet/3com/3c59x.c
@@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev)
if (vp-cb_fn_base) /* The PCMCIA people are 
idiots.  */
iowrite32(0x8000, vp-cb_fn_base + 4);
netif_start_queue (dev);
+   netdev_reset_queue(dev);
 err_out:
return err;
 }
@@ -1935,16 +1936,18 @@ static void vortex_tx_timeout(struct net_device *dev)
if (vp-cur_tx - vp-dirty_tx  0ioread32(ioaddr + 
DownListPtr) == 0)
iowrite32(vp-tx_ring_dma + (vp-dirty_tx % 
TX_RING_SIZE) * sizeof(struct boom_tx_desc),
 ioaddr + DownListPtr);
-   if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE)
+   if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE) {
netif_wake_queue (dev);
+   netdev_reset_queue (dev);
+   }
if (vp-drv_flags  IS_BOOMERANG)
iowrite8(PKT_BUF_SZ8, ioaddr + TxFreeThreshold);
iowrite16(DownUnstall, ioaddr + EL3_CMD);
} else {
dev-stats.tx_dropped++;
netif_wake_queue(dev);
+   netdev_reset_queue(dev);
}
-
/* Issue Tx Enable */
iowrite16(TxEnable, ioaddr + EL3_CMD);
dev-trans_start = jiffies; /* prevent tx timeout */
@@ -2063,6 +2066,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
 {
struct vortex_private *vp = netdev_priv(dev);
void __iomem *ioaddr = vp-ioaddr;
+   int skblen = skb-len;
 
/* Put out the doubleword header... */
iowrite32(skb-len, ioaddr + TX_FIFO);
@@ -2094,6 +2098,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
}
}
 
+   netdev_sent_queue(dev, skblen);
 
/* Clear the Tx status stack. */
{
@@ -2125,6 +2130,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
void __iomem *ioaddr = vp-ioaddr;
/* Calculate the next Tx descriptor entry. */
int entry = vp-cur_tx % TX_RING_SIZE;
+   int skblen = skb-len;
struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % 
TX_RING_SIZE];
unsigned long flags;
dma_addr_t dma_addr;
@@ -2230,6 +2236,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
}
 
vp-cur_tx++;
+   netdev_sent_queue(dev, skblen);
+
if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE - 1) {
netif_stop_queue (dev);
} else {/* Clear previous 
interrupt enable. */
@@ -2267,6 +2275,7 @@ vortex_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;
 
ioaddr = vp-ioaddr;
spin_lock(vp-lock);
@@ -2314,6 +2323,8 @@ vortex_interrupt(int irq, void *dev_id)
if (ioread16(ioaddr + Wn7_MasterStatus)  0x1000) {
iowrite16(0x1000, ioaddr + Wn7_MasterStatus); 
/* Ack the event. */
pci_unmap_single(VORTEX_PCI(vp), 
vp-tx_skb_dma, (vp-tx_skb-len + 3)  ~3, PCI_DMA_TODEVICE);
+   pkts_compl++;
+   bytes_compl += vp-tx_skb-len;
dev_kfree_skb_irq(vp-tx_skb); /* Release the 
transferred buffer */
if (ioread16(ioaddr + TxFree)  1536) {
/*
@@ -2358,6 +2369,7 @@ vortex_interrupt(int irq, void *dev_id)
iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
} while ((status = ioread16(ioaddr + EL3_STATUS))  (IntLatch | 
RxComplete));
 
+   netdev_completed_queue(dev, pkts_compl, bytes_compl);
spin_unlock(vp-window_lock);
 
if (vortex_debug  4)
@@ -2382,6 +2394,7 @@ boomerang_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;
 
ioaddr = vp-ioaddr;
 
@@ -2455,6 +2468,8 @@ boomerang_interrupt(int irq, void *dev_id)
pci_unmap_single(VORTEX_PCI(vp),

le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE);
 #endif
+   pkts_compl

[PATCH net-next] 3c59x: Add BQL support for 3c59x ethernet driver.

2015-08-19 Thread Loganaden Velvindron
---
 drivers/net/ethernet/3com/3c59x.c | 23 ---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/3com/3c59x.c 
b/drivers/net/ethernet/3com/3c59x.c
index 753887d..2839af0 100644
--- a/drivers/net/ethernet/3com/3c59x.c
+++ b/drivers/net/ethernet/3com/3c59x.c
@@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev)
if (vp-cb_fn_base) /* The PCMCIA people are 
idiots.  */
iowrite32(0x8000, vp-cb_fn_base + 4);
netif_start_queue (dev);
+   netdev_reset_queue(dev);
 err_out:
return err;
 }
@@ -1935,16 +1936,18 @@ static void vortex_tx_timeout(struct net_device *dev)
if (vp-cur_tx - vp-dirty_tx  0ioread32(ioaddr + 
DownListPtr) == 0)
iowrite32(vp-tx_ring_dma + (vp-dirty_tx % 
TX_RING_SIZE) * sizeof(struct boom_tx_desc),
 ioaddr + DownListPtr);
-   if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE)
+   if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE) {
netif_wake_queue (dev);
+   netdev_reset_queue (dev);
+   }
if (vp-drv_flags  IS_BOOMERANG)
iowrite8(PKT_BUF_SZ8, ioaddr + TxFreeThreshold);
iowrite16(DownUnstall, ioaddr + EL3_CMD);
} else {
dev-stats.tx_dropped++;
netif_wake_queue(dev);
+   netdev_reset_queue(dev);
}
-
/* Issue Tx Enable */
iowrite16(TxEnable, ioaddr + EL3_CMD);
dev-trans_start = jiffies; /* prevent tx timeout */
@@ -2063,6 +2066,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
 {
struct vortex_private *vp = netdev_priv(dev);
void __iomem *ioaddr = vp-ioaddr;
+   int skblen = skb-len;
 
/* Put out the doubleword header... */
iowrite32(skb-len, ioaddr + TX_FIFO);
@@ -2094,6 +2098,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
}
}
 
+   netdev_sent_queue(dev, skblen);
 
/* Clear the Tx status stack. */
{
@@ -2125,6 +2130,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
void __iomem *ioaddr = vp-ioaddr;
/* Calculate the next Tx descriptor entry. */
int entry = vp-cur_tx % TX_RING_SIZE;
+   int skblen = skb-len;
struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % 
TX_RING_SIZE];
unsigned long flags;
dma_addr_t dma_addr;
@@ -2230,6 +2236,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
}
 
vp-cur_tx++;
+   netdev_sent_queue(dev, skblen);
+
if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE - 1) {
netif_stop_queue (dev);
} else {/* Clear previous 
interrupt enable. */
@@ -2267,6 +2275,7 @@ vortex_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;
 
ioaddr = vp-ioaddr;
spin_lock(vp-lock);
@@ -2314,6 +2323,8 @@ vortex_interrupt(int irq, void *dev_id)
if (ioread16(ioaddr + Wn7_MasterStatus)  0x1000) {
iowrite16(0x1000, ioaddr + Wn7_MasterStatus); 
/* Ack the event. */
pci_unmap_single(VORTEX_PCI(vp), 
vp-tx_skb_dma, (vp-tx_skb-len + 3)  ~3, PCI_DMA_TODEVICE);
+   pkts_compl++;
+   bytes_compl += vp-tx_skb-len;
dev_kfree_skb_irq(vp-tx_skb); /* Release the 
transferred buffer */
if (ioread16(ioaddr + TxFree)  1536) {
/*
@@ -2358,6 +2369,7 @@ vortex_interrupt(int irq, void *dev_id)
iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
} while ((status = ioread16(ioaddr + EL3_STATUS))  (IntLatch | 
RxComplete));
 
+   netdev_completed_queue(dev, pkts_compl, bytes_compl);
spin_unlock(vp-window_lock);
 
if (vortex_debug  4)
@@ -2382,6 +2394,7 @@ boomerang_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;
 
ioaddr = vp-ioaddr;
 
@@ -2455,6 +2468,8 @@ boomerang_interrupt(int irq, void *dev_id)
pci_unmap_single(VORTEX_PCI(vp),

le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE);
 #endif
+   pkts_compl++;
+   bytes_compl += skb-len;
dev_kfree_skb_irq(skb);
vp-tx_skbuff[entry] = NULL;
  

[PATCH] Add BQL support for 3c59x, based on patch from Tino Reichardt.

2015-08-01 Thread Loganaden Velvindron
Tested on 3Com PCI 3c905C Tornardo by running Flent multiple times.

Signed-off-by: Loganaden Velvindron lo...@elandsys.com
---
 drivers/net/ethernet/3com/3c59x.c | 17 -
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/3com/3c59x.c 
b/drivers/net/ethernet/3com/3c59x.c
index 2d1ce3c..5b1b818 100644
--- a/drivers/net/ethernet/3com/3c59x.c
+++ b/drivers/net/ethernet/3com/3c59x.c
@@ -1726,6 +1726,7 @@ vortex_up(struct net_device *dev)
if (vp-cb_fn_base) /* The PCMCIA people are 
idiots.  */
iowrite32(0x8000, vp-cb_fn_base + 4);
netif_start_queue (dev);
+   netdev_reset_queue(dev);
 err_out:
return err;
 }
@@ -2064,6 +2065,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
 {
struct vortex_private *vp = netdev_priv(dev);
void __iomem *ioaddr = vp-ioaddr;
+   int skblen = skb-len;
 
/* Put out the doubleword header... */
iowrite32(skb-len, ioaddr + TX_FIFO);
@@ -2095,6 +2097,7 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
}
}
 
+   netdev_sent_queue(dev, skblen);
 
/* Clear the Tx status stack. */
{
@@ -2126,6 +2129,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
void __iomem *ioaddr = vp-ioaddr;
/* Calculate the next Tx descriptor entry. */
int entry = vp-cur_tx % TX_RING_SIZE;
+   int skblen = skb-len;
struct boom_tx_desc *prev_entry = vp-tx_ring[(vp-cur_tx-1) % 
TX_RING_SIZE];
unsigned long flags;
dma_addr_t dma_addr;
@@ -2231,6 +2235,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
}
 
vp-cur_tx++;
+   netdev_sent_queue(dev, skblen);
+
if (vp-cur_tx - vp-dirty_tx  TX_RING_SIZE - 1) {
netif_stop_queue (dev);
} else {/* Clear previous 
interrupt enable. */
@@ -2268,6 +2274,7 @@ vortex_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;   
 
ioaddr = vp-ioaddr;
spin_lock(vp-lock);
@@ -2315,6 +2322,8 @@ vortex_interrupt(int irq, void *dev_id)
if (ioread16(ioaddr + Wn7_MasterStatus)  0x1000) {
iowrite16(0x1000, ioaddr + Wn7_MasterStatus); 
/* Ack the event. */
pci_unmap_single(VORTEX_PCI(vp), 
vp-tx_skb_dma, (vp-tx_skb-len + 3)  ~3, PCI_DMA_TODEVICE);
+   pkts_compl++;
+   bytes_compl += vp-tx_skb-len;
dev_kfree_skb_irq(vp-tx_skb); /* Release the 
transferred buffer */
if (ioread16(ioaddr + TxFree)  1536) {
/*
@@ -2359,6 +2368,7 @@ vortex_interrupt(int irq, void *dev_id)
iowrite16(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
} while ((status = ioread16(ioaddr + EL3_STATUS))  (IntLatch | 
RxComplete));
 
+   netdev_completed_queue(dev, pkts_compl, bytes_compl);
spin_unlock(vp-window_lock);
 
if (vortex_debug  4)
@@ -2383,6 +2393,7 @@ boomerang_interrupt(int irq, void *dev_id)
int status;
int work_done = max_interrupt_work;
int handled = 0;
+   unsigned int bytes_compl = 0, pkts_compl = 0;
 
ioaddr = vp-ioaddr;
 
@@ -2456,6 +2467,8 @@ boomerang_interrupt(int irq, void *dev_id)
pci_unmap_single(VORTEX_PCI(vp),

le32_to_cpu(vp-tx_ring[entry].addr), skb-len, PCI_DMA_TODEVICE);
 #endif
+   pkts_compl++;
+   bytes_compl += skb-len;
dev_kfree_skb_irq(skb);
vp-tx_skbuff[entry] = NULL;
} else {
@@ -2496,6 +2509,7 @@ boomerang_interrupt(int irq, void *dev_id)
iowrite32(0x8000, vp-cb_fn_base + 4);
 
} while ((status = ioread16(ioaddr + EL3_STATUS))  IntLatch);
+   netdev_completed_queue(dev, pkts_compl, bytes_compl);
 
if (vortex_debug  4)
pr_debug(%s: exiting interrupt, status %4.4x.\n,
@@ -2697,7 +2711,8 @@ vortex_down(struct net_device *dev, int final_down)
struct vortex_private *vp = netdev_priv(dev);
void __iomem *ioaddr = vp-ioaddr;
 
-   netif_stop_queue (dev);
+   netdev_reset_queue(dev);
+   netif_stop_queue(dev);
 
del_timer_sync(vp-rx_oom_timer);
del_timer_sync(vp-timer);
-- 
2.4.5

--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo