* Re: [PATCH v2 2/2] r8169: Support RTL8105E
From: Francois Romieu @ 2011-02-21 7:33 UTC (permalink / raw)
To: Hayes Wang; +Cc: netdev, linux-kernel
In-Reply-To: <1298018085-1370-2-git-send-email-hayeswang@realtek.com>
Hayes Wang <hayeswang@realtek.com> :
> Support the new chips for RTL8105E
>
> Signed-off-by: Hayes Wang <hayeswang@realtek.com>
> ---
> drivers/net/r8169.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 90 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
> index 9eaf78f..ffe6b00 100644
> --- a/drivers/net/r8169.c
> +++ b/drivers/net/r8169.c
[...]
> @@ -267,6 +272,12 @@ enum rtl8168_8101_registers {
> #define EPHYAR_REG_MASK 0x1f
> #define EPHYAR_REG_SHIFT 16
> #define EPHYAR_DATA_MASK 0xffff
> + DLLPR = 0xd0,
> +#define PM_SWITCH (1 << 6)
> + TWSI = 0xd2,
> + MCU = 0xd3,
> +#define EN_NDP (1 << 3)
> +#define EN_OOB_RESET (1 << 2)
> DBG_REG = 0xd1,
> #define FIX_NAK_1 (1 << 4)
> #define FIX_NAK_2 (1 << 3)
Please pack them in increasing order and it will be perfect
(i.e. 0xd0, 0xd1, 0xd2, 0xd3 instead of current 0xd0, 0xd2 (?), 0xd3, 0xd1).
[...]
> @@ -2435,6 +2452,33 @@ static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
> rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
> }
>
> +static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
> +{
> + static const struct phy_reg phy_reg_init[] = {
> + {0x1f, 0x0005},
> + {0x1a, 0x0000},
> + {0x1f, 0x0000},
> +
> + {0x1f, 0x0004},
> + {0x1c, 0x0000},
> + {0x1f, 0x0000},
> +
> + {0x1f, 0x0001},
> + {0x15, 0x7701},
> + {0x1f, 0x0000}
^^ ^^
Minor nit: please insert spaces (as in similar declarations).
> + };
> +
> + /* Diable ALDPS before ram code */
^^ Missing "b".
> + rtl_writephy(tp, 0x1f, 0x0000);
> + rtl_writephy(tp, 0x18, 0x0310);
> + msleep(100);
> +
> + if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0)
> + netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
> +
> + rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
> +}
The "if (RTL_R8(0xef) & 0x08)" and "if (RTL_R8(0xef) & 0x010)" conditionals
from the previous iteration have been removed. If it is done on purpose, a
short explanation or notification in the description of the patch is always
welcome.
--
Ueimor
^ permalink raw reply
* Re: linux-next: build warning after merge of the driver-core tree
From: Greg KH @ 2011-02-21 6:32 UTC (permalink / raw)
To: Stephen Rothwell
Cc: linux-next, linux-kernel, Marc Kleine-Budde, Ilya Yanok,
David Miller, netdev
In-Reply-To: <20110221170226.c43175f7.sfr@canb.auug.org.au>
On Mon, Feb 21, 2011 at 05:02:26PM +1100, Stephen Rothwell wrote:
> Hi Greg,
>
> After merging the driver-core tree, today's linux-next build (x86_64
> allmodconfig) produced this warning:
>
> drivers/net/dnet.c: In function 'dnet_mii_init':
> drivers/net/dnet.c:340: warning: passing argument 1 of 'platform_set_drvdata' from incompatible pointer type
> include/linux/platform_device.h:138: note: expected 'struct platform_device *' but argument is of type 'struct net_device *'
>
> Revealed by commit 71d642908d4e8e7a2a4a6e0490432e719ff466d5 ("Driver
> core: convert platform_{get,set}_drvdata to static inline functions").
> Introduced by commit 4796417417a62e2ae83d92cb92e1ecf9ec67b5f5 ("dnet:
> Dave DNET ethernet controller driver (updated)").
It sounds like the driver is wrong here :(
thanks,
greg k-h
^ permalink raw reply
* [PATCH]drivers:isdn:istream.c Fix typo pice to piece
From: Justin P. Mattock @ 2011-02-21 6:31 UTC (permalink / raw)
To: trivial; +Cc: mac, isdn, netdev, linux-kernel, Justin P. Mattock
The below patch changes a typo "pice" to "piece"
Signed-off-by: Justin P. Mattock <justinmattock@gmail.com>
---
drivers/isdn/hardware/eicon/istream.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/isdn/hardware/eicon/istream.c b/drivers/isdn/hardware/eicon/istream.c
index 18f8798..7bd5baa 100644
--- a/drivers/isdn/hardware/eicon/istream.c
+++ b/drivers/isdn/hardware/eicon/istream.c
@@ -62,7 +62,7 @@ void diva_xdi_provide_istream_info (ADAPTER* a,
stream interface.
If synchronous service was requested, then function
does return amount of data written to stream.
- 'final' does indicate that pice of data to be written is
+ 'final' does indicate that piece of data to be written is
final part of frame (necessary only by structured datatransfer)
return 0 if zero lengh packet was written
return -1 if stream is full
--
1.6.5.2.180.gc5b3e
^ permalink raw reply related
* Re: [PATCH] ipv4: add DiffServ priority based routing
From: Philip Prindeville @ 2011-02-21 6:01 UTC (permalink / raw)
To: Benny Amorsen; +Cc: David Miller, torsten.schmidt, netdev
In-Reply-To: <m3tyslyej6.fsf@ursa.amorsen.dk>
On 3/12/10 3:18 AM, Benny Amorsen wrote:
> David Miller<davem@davemloft.net> writes:
>
>> Look, this doesn't work. QoS handling and policy belongs in the
>> egress point to the network, it's the only way to control this
>> properly and prevent abuse.
> First, QoS is important even within the network. Modern switches come
> pre-configured with sane defaults which ensure that e.g. EF marked
> packets get priority over non-EF-marked packets. Cisco, HP, and
> Linksys-Cisco at least provide a decent out-of-the-box configuration.
>
> This can obviously be abused, but the solution there is the same as in
> network abuses: Either apply the LART or change the configuration of the
> switches to be less trusting. We haven't, so far, had a customer where
> the LART was necessary, much less had to reconfigure a switch.
>
> So why not let Linux provide the same out-of-the-box experience as the
> switches do? If the trust is abused Linux provides lots of tools to make
> it less trusting or even to punish the abusers.
>
>
> /Benny
For those who want to use DiffServ as the out-of-the-box default configuration, and trust the marking on their traffic, I don't understand why certain folks are so adamant about not supporting this.
Torsten's patch to allow rt_tos2priority() to use IPTOS_PRECEDENCE() instead seemed reasonable.
Especially in a network using 802.1p or 802.1q encapsulation.
^ permalink raw reply
* linux-next: build warning after merge of the driver-core tree
From: Stephen Rothwell @ 2011-02-21 6:02 UTC (permalink / raw)
To: Greg KH
Cc: linux-next, linux-kernel, Marc Kleine-Budde, Ilya Yanok,
David Miller, netdev
[-- Attachment #1: Type: text/plain, Size: 781 bytes --]
Hi Greg,
After merging the driver-core tree, today's linux-next build (x86_64
allmodconfig) produced this warning:
drivers/net/dnet.c: In function 'dnet_mii_init':
drivers/net/dnet.c:340: warning: passing argument 1 of 'platform_set_drvdata' from incompatible pointer type
include/linux/platform_device.h:138: note: expected 'struct platform_device *' but argument is of type 'struct net_device *'
Revealed by commit 71d642908d4e8e7a2a4a6e0490432e719ff466d5 ("Driver
core: convert platform_{get,set}_drvdata to static inline functions").
Introduced by commit 4796417417a62e2ae83d92cb92e1ecf9ec67b5f5 ("dnet:
Dave DNET ethernet controller driver (updated)").
--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
[-- Attachment #2: Type: application/pgp-signature, Size: 490 bytes --]
^ permalink raw reply
* Re: Ethernet over GRE and vlans
From: Herbert Xu @ 2011-02-21 5:38 UTC (permalink / raw)
To: Jonathan Thibault; +Cc: netdev
In-Reply-To: <4D43A296.4040906@navigue.com>
On Sat, Jan 29, 2011 at 12:16:06AM -0500, Jonathan Thibault wrote:
>
> Is it wrong on my part to expect such behaviour from gretap devices
> or is this simply not possible/implemented yet?
I don't see why this shouldn't work, so it might be a bug or
misconfiguration. How did you setup gre1.1 and gre2.2?
Cheers,
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply
* [PATCH] cls_u32: fix sparse warnings
From: Stephen Hemminger @ 2011-02-21 2:14 UTC (permalink / raw)
To: David Miller, jamal; +Cc: netdev
The variable _data is used in asm-generic to define sections
which causes sparse warnings, so just rename the variable.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
net/sched/cls_u32.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
--- a/net/sched/cls_u32.c 2011-02-20 17:50:45.469140817 -0800
+++ b/net/sched/cls_u32.c 2011-02-20 17:51:40.205778673 -0800
@@ -134,12 +134,12 @@ next_knode:
for (i = n->sel.nkeys; i > 0; i--, key++) {
int toff = off + key->off + (off2 & key->offmask);
- __be32 *data, _data;
+ __be32 *data, hdata;
if (skb_headroom(skb) + toff > INT_MAX)
goto out;
- data = skb_header_pointer(skb, toff, 4, &_data);
+ data = skb_header_pointer(skb, toff, 4, &hdata);
if (!data)
goto out;
if ((*data ^ key->val) & key->mask) {
@@ -187,10 +187,10 @@ check_terminal:
ht = n->ht_down;
sel = 0;
if (ht->divisor) {
- __be32 *data, _data;
+ __be32 *data, hdata;
data = skb_header_pointer(skb, off + n->sel.hoff, 4,
- &_data);
+ &hdata);
if (!data)
goto out;
sel = ht->divisor & u32_hash_fold(*data, &n->sel,
@@ -202,11 +202,11 @@ check_terminal:
if (n->sel.flags & (TC_U32_OFFSET | TC_U32_VAROFFSET)) {
off2 = n->sel.off + 3;
if (n->sel.flags & TC_U32_VAROFFSET) {
- __be16 *data, _data;
+ __be16 *data, hdata;
data = skb_header_pointer(skb,
off + n->sel.offoff,
- 2, &_data);
+ 2, &hdata);
if (!data)
goto out;
off2 += ntohs(n->sel.offmask & *data) >>
^ permalink raw reply
* Re: libmnl limitation...
From: David Miller @ 2011-02-20 22:38 UTC (permalink / raw)
To: pablo; +Cc: netdev
In-Reply-To: <4D61964E.3090705@netfilter.org>
From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Sun, 20 Feb 2011 23:31:42 +0100
> On 20/02/11 23:25, Pablo Neira Ayuso wrote:
>> On 20/02/11 22:41, David Miller wrote:
>>>
>>> Unfortunately, libmnl only allows setting socket options
>>> that are of SOL_NETLINK.
>>>
>>> This precludes setting socket options such as SO_ATTACH_FILTER
>>> which need to be of level SOL_SOCKET.
>>>
>>> It seems to be a mistake to have hard-coded the socket level
>>> instead of simply letting the user specify it :-/
>>
>> Indeed, I'm going to obsolete the current function and provide a new
>> one. Sorry.
>
> Actually, we can obsolete mnl_setsockopt(...), which is silly BTW, and
> we can use mnl_socket_get_fd(...) with setsockopt(...).
Sure.
^ permalink raw reply
* Re: [PATCH] route_bench: Filter out all responses.
From: David Miller @ 2011-02-20 22:32 UTC (permalink / raw)
To: pablo; +Cc: netdev
In-Reply-To: <4D61957F.5060905@netfilter.org>
From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Sun, 20 Feb 2011 23:28:15 +0100
> You can use:
>
> extern int mnl_socket_get_fd(const struct mnl_socket *nl);
>
> Thus, you can invoke setsockopt directly ;-).
Thank you, I didn't notice that interface.
I'll check in the following.
--------------------
route_bench: Remove knowledge of libmnl internals, not needed.
Since mnl_socket_get_fd() exists, we can use that.
Thanks to Pablo.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
route_bench.c | 13 ++-----------
1 files changed, 2 insertions(+), 11 deletions(-)
diff --git a/route_bench.c b/route_bench.c
index 6c6b525..063b15e 100644
--- a/route_bench.c
+++ b/route_bench.c
@@ -24,16 +24,6 @@
#include <linux/rtnetlink.h>
#include <linux/filter.h>
-/* XXX Ugly knowledge of internals, but there is currently no way
- * XXX provided by the libmnl library to set socket options that are
- * XXX of level other than SOL_NETLINK. And we need to set one of
- * XXX level SOL_SOCKET to install the socket filter.
- */
-struct mnl_socket {
- int fd;
- struct sockaddr_nl addr;
-};
-
static int usage(void)
{
printf("usage: route_bench [ -o ] [ -l count ]\n");
@@ -178,7 +168,8 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
portid = mnl_socket_get_portid(nl);
- err = setsockopt(nl->fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
+ err = setsockopt(mnl_socket_get_fd(nl), SOL_SOCKET,
+ SO_ATTACH_FILTER, &filter, sizeof(filter));
if (err) {
perror("setsockopt");
return -1;
--
1.7.4.1
^ permalink raw reply related
* Re: libmnl limitation...
From: Pablo Neira Ayuso @ 2011-02-20 22:31 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <4D6194C2.5020202@netfilter.org>
On 20/02/11 23:25, Pablo Neira Ayuso wrote:
> On 20/02/11 22:41, David Miller wrote:
>>
>> Unfortunately, libmnl only allows setting socket options
>> that are of SOL_NETLINK.
>>
>> This precludes setting socket options such as SO_ATTACH_FILTER
>> which need to be of level SOL_SOCKET.
>>
>> It seems to be a mistake to have hard-coded the socket level
>> instead of simply letting the user specify it :-/
>
> Indeed, I'm going to obsolete the current function and provide a new
> one. Sorry.
Actually, we can obsolete mnl_setsockopt(...), which is silly BTW, and
we can use mnl_socket_get_fd(...) with setsockopt(...).
^ permalink raw reply
* Re: [PATCH] route_bench: Filter out all responses.
From: Pablo Neira Ayuso @ 2011-02-20 22:28 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20110220.140450.48516784.davem@davemloft.net>
On 20/02/11 23:04, David Miller wrote:
>
> Install a socket filter to reduce the pure netlink overhead.
>
> Unfortunately the libmnl library does not provide a way to
> set socket options that are of level other than SOL_NETLINK.
>
> So we hack it by knowing some things about libmnl internals.
>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> ---
>
> The knowledge of libmnl internals is unfortunate, but there
> is currently no other way to do this.
>
> route_bench.c | 33 +++++++++++++++++++++++++--------
> 1 files changed, 25 insertions(+), 8 deletions(-)
>
> diff --git a/route_bench.c b/route_bench.c
> index c75ea45..6c6b525 100644
> --- a/route_bench.c
> +++ b/route_bench.c
> @@ -22,6 +22,17 @@
> #include <linux/if.h>
> #include <linux/if_link.h>
> #include <linux/rtnetlink.h>
> +#include <linux/filter.h>
> +
> +/* XXX Ugly knowledge of internals, but there is currently no way
> + * XXX provided by the libmnl library to set socket options that are
> + * XXX of level other than SOL_NETLINK. And we need to set one of
> + * XXX level SOL_SOCKET to install the socket filter.
> + */
> +struct mnl_socket {
> + int fd;
> + struct sockaddr_nl addr;
> +};
>
> static int usage(void)
> {
> @@ -139,8 +150,10 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
> unsigned int mark, unsigned int iif)
> {
> char send_buf[MNL_SOCKET_BUFFER_SIZE];
> - char recv_buf[MNL_SOCKET_BUFFER_SIZE];
> unsigned int min, sec, frac, tmp;
> + struct sock_filter insns = { .code = BPF_RET | BPF_K,
> + .k = 0 };
> + struct sock_fprog filter = { .len = 1, .filter = &insns, };
> struct bench_state *s = &state;
> struct timeval start_time;
> struct timeval end_time;
> @@ -148,7 +161,7 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
> struct nlmsghdr *nlh;
> unsigned int portid;
> struct rtmsg *rtm;
> - int i;
> + int i, err;
>
> init_bench_state(s);
>
> @@ -165,10 +178,15 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
>
> portid = mnl_socket_get_portid(nl);
>
> + err = setsockopt(nl->fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
> + if (err) {
> + perror("setsockopt");
> + return -1;
> + }
> +
You can use:
extern int mnl_socket_get_fd(const struct mnl_socket *nl);
Thus, you can invoke setsockopt directly ;-).
^ permalink raw reply
* Re: libmnl limitation...
From: Pablo Neira Ayuso @ 2011-02-20 22:25 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20110220.134128.115926805.davem@davemloft.net>
On 20/02/11 22:41, David Miller wrote:
>
> Unfortunately, libmnl only allows setting socket options
> that are of SOL_NETLINK.
>
> This precludes setting socket options such as SO_ATTACH_FILTER
> which need to be of level SOL_SOCKET.
>
> It seems to be a mistake to have hard-coded the socket level
> instead of simply letting the user specify it :-/
Indeed, I'm going to obsolete the current function and provide a new
one. Sorry.
^ permalink raw reply
* [PATCH] route_bench: Filter out all responses.
From: David Miller @ 2011-02-20 22:04 UTC (permalink / raw)
To: netdev; +Cc: pablo
Install a socket filter to reduce the pure netlink overhead.
Unfortunately the libmnl library does not provide a way to
set socket options that are of level other than SOL_NETLINK.
So we hack it by knowing some things about libmnl internals.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
The knowledge of libmnl internals is unfortunate, but there
is currently no other way to do this.
route_bench.c | 33 +++++++++++++++++++++++++--------
1 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/route_bench.c b/route_bench.c
index c75ea45..6c6b525 100644
--- a/route_bench.c
+++ b/route_bench.c
@@ -22,6 +22,17 @@
#include <linux/if.h>
#include <linux/if_link.h>
#include <linux/rtnetlink.h>
+#include <linux/filter.h>
+
+/* XXX Ugly knowledge of internals, but there is currently no way
+ * XXX provided by the libmnl library to set socket options that are
+ * XXX of level other than SOL_NETLINK. And we need to set one of
+ * XXX level SOL_SOCKET to install the socket filter.
+ */
+struct mnl_socket {
+ int fd;
+ struct sockaddr_nl addr;
+};
static int usage(void)
{
@@ -139,8 +150,10 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
unsigned int mark, unsigned int iif)
{
char send_buf[MNL_SOCKET_BUFFER_SIZE];
- char recv_buf[MNL_SOCKET_BUFFER_SIZE];
unsigned int min, sec, frac, tmp;
+ struct sock_filter insns = { .code = BPF_RET | BPF_K,
+ .k = 0 };
+ struct sock_fprog filter = { .len = 1, .filter = &insns, };
struct bench_state *s = &state;
struct timeval start_time;
struct timeval end_time;
@@ -148,7 +161,7 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
struct nlmsghdr *nlh;
unsigned int portid;
struct rtmsg *rtm;
- int i;
+ int i, err;
init_bench_state(s);
@@ -165,10 +178,15 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
portid = mnl_socket_get_portid(nl);
+ err = setsockopt(nl->fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
+ if (err) {
+ perror("setsockopt");
+ return -1;
+ }
+
gettimeofday(&start_time, NULL);
for (i = 0; i < count; i++) {
unsigned int seq;
- int ret;
nlh = mnl_nlmsg_put_header(send_buf);
nlh->nlmsg_type = RTM_GETROUTE;
@@ -197,11 +215,10 @@ static int do_bench(int count, in_addr_t src_addr, in_addr_t dst_addr,
perror("mnl_socket_sendto");
return -1;
}
- ret = mnl_socket_recvfrom(nl, recv_buf, sizeof(recv_buf));
- if (ret < 0) {
- perror("mnl_sock_recvfrom");
- return -1;
- }
+
+ /* No need to do a receive, as the socket filter rejects
+ * all packets.
+ */
advance_bench_state(s);
}
--
1.7.4.1
^ permalink raw reply related
* [PATCH 2/2] DM9000B: Fix PHY power for network down/up
From: Henry Nestler @ 2011-02-20 21:45 UTC (permalink / raw)
To: netdev; +Cc: akpm, tori, linux-arm-kernel
DM9000 revision B needs 1 ms delay after PHY power on (see spec), and PHY
power must on in register DM9000_GPR before all other settings will change.
Remember, that register DM9000_GPR was not changed by reset sequence.
Without these fix the FIFO goes out of sync and sends wrong data after
sequence of "ifconfig ethX down ; sleep 3 ; ifconfig ethX up".
---
Kernel version 2.6.38-rc5
drivers/net/dm9000.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2d4c4fc..5925569 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -802,10 +802,7 @@ dm9000_init_dm9000(struct net_device *dev)
/* Checksum mode */
dm9000_set_rx_csum_unlocked(dev, db->rx_csum);
- /* GPIO0 on pre-activate PHY */
- iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
iow(db, DM9000_GPCR, GPCR_GEP_CNTL); /* Let GPIO0 output */
- iow(db, DM9000_GPR, 0); /* Enable PHY */
ncr = (db->flags & DM9000_PLATF_EXT_PHY) ? NCR_EXT_PHY : 0;
@@ -1194,6 +1191,10 @@ dm9000_open(struct net_device *dev)
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
return -EAGAIN;
+ /* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */
+ iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
+ udelay(1000); /* delay needs by DM9000B */
+
/* Initialize DM9000 board */
dm9000_reset(db);
dm9000_init_dm9000(dev);
^ permalink raw reply related
* [PATCH 1/2] DM9000B: Fix reg_save after spin_lock in dm9000_timeout
From: Henry Nestler @ 2011-02-20 21:44 UTC (permalink / raw)
To: netdev; +Cc: trivial, akpm, tori
The spin_lock should hold before reading register.
---
Kernel version 2.6.38-rc5
drivers/net/dm9000.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2d4c4fc..2bbd496 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -852,8 +852,8 @@ static void dm9000_timeout(struct net_device *dev)
unsigned long flags;
/* Save previous register address */
- reg_save = readb(db->io_addr);
spin_lock_irqsave(&db->lock, flags);
+ reg_save = readb(db->io_addr);
netif_stop_queue(dev);
dm9000_reset(db);
^ permalink raw reply related
* [PATCH net-next 0/6] be2net: patch series
From: Ajit Khaparde @ 2011-02-20 21:42 UTC (permalink / raw)
To: netdev, davem
Patch series for the be2net driver.
[1/6] be2net: add new counters to display via ethtool stats
[2/6] be2net: fixes in ethtool selftest
[3/6] be2net: variable name change
[4/6] be2net: fix to ignore transparent vlan ids wrongly indicated by NIC
[5/6] be2net: add code to display temperature of ASIC
[6/6] be2net: use hba_port_num instead of port_num
Please Apply.
Thanks
-Ajit
^ permalink raw reply
* [PATCH net-next 5/6] be2net: add code to display temperature of ASIC
From: Ajit Khaparde @ 2011-02-20 21:42 UTC (permalink / raw)
To: netdev, davem
Add support to display temperature of ASIC via ethtool -S
From: Somnath K <somnath.kotur@emulex.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be.h | 7 ++++++
drivers/net/benet/be_cmds.c | 44 ++++++++++++++++++++++++++++++++++++++++
drivers/net/benet/be_cmds.h | 16 ++++++++++++++
drivers/net/benet/be_ethtool.c | 11 ++++++++-
4 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 7bf8dd4..46b951f 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -225,6 +225,10 @@ struct be_rx_obj {
u32 cache_line_barrier[15];
};
+struct be_drv_stats {
+ u8 be_on_die_temperature;
+};
+
struct be_vf_cfg {
unsigned char vf_mac_addr[ETH_ALEN];
u32 vf_if_handle;
@@ -234,6 +238,7 @@ struct be_vf_cfg {
};
#define BE_INVALID_PMAC_ID 0xffffffff
+
struct be_adapter {
struct pci_dev *pdev;
struct net_device *netdev;
@@ -269,6 +274,7 @@ struct be_adapter {
u32 big_page_size; /* Compounded page size shared by rx wrbs */
u8 msix_vec_next_idx;
+ struct be_drv_stats drv_stats;
struct vlan_group *vlan_grp;
u16 vlans_added;
@@ -281,6 +287,7 @@ struct be_adapter {
struct be_dma_mem stats_cmd;
/* Work queue used to perform periodic tasks like getting statistics */
struct delayed_work work;
+ u16 work_counter;
/* Ethtool knobs and info */
bool rx_csum; /* BE card must perform rx-checksumming */
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index 59d25ac..ff62aae 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -18,6 +18,9 @@
#include "be.h"
#include "be_cmds.h"
+/* Must be a power of 2 or else MODULO will BUG_ON */
+static int be_get_temp_freq = 32;
+
static void be_mcc_notify(struct be_adapter *adapter)
{
struct be_queue_info *mccq = &adapter->mcc_obj.q;
@@ -1069,6 +1072,9 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
struct be_sge *sge;
int status = 0;
+ if (MODULO(adapter->work_counter, be_get_temp_freq) == 0)
+ be_cmd_get_die_temperature(adapter);
+
spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
@@ -1136,6 +1142,44 @@ err:
return status;
}
+/* Uses synchronous mcc */
+int be_cmd_get_die_temperature(struct be_adapter *adapter)
+{
+ struct be_mcc_wrb *wrb;
+ struct be_cmd_req_get_cntl_addnl_attribs *req;
+ int status;
+
+ spin_lock_bh(&adapter->mcc_lock);
+
+ wrb = wrb_from_mccq(adapter);
+ if (!wrb) {
+ status = -EBUSY;
+ goto err;
+ }
+ req = embedded_payload(wrb);
+
+ be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
+ OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES);
+
+ be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+ OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req));
+
+ status = be_mcc_notify_wait(adapter);
+ if (!status) {
+ struct be_cmd_resp_get_cntl_addnl_attribs *resp =
+ embedded_payload(wrb);
+ adapter->drv_stats.be_on_die_temperature =
+ resp->on_die_temperature;
+ }
+ /* If IOCTL fails once, do not bother issuing it again */
+ else
+ be_get_temp_freq = 0;
+
+err:
+ spin_unlock_bh(&adapter->mcc_lock);
+ return status;
+}
+
/* Uses Mbox */
int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
{
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index a5af296..6e89de8 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -189,6 +189,7 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_GET_BEACON_STATE 70
#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
#define OPCODE_COMMON_GET_PHY_DETAILS 102
+#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121
#define OPCODE_ETH_RSS_CONFIG 1
#define OPCODE_ETH_ACPI_CONFIG 2
@@ -668,6 +669,20 @@ struct be_cmd_resp_get_stats {
struct be_hw_stats hw_stats;
};
+struct be_cmd_req_get_cntl_addnl_attribs {
+ struct be_cmd_req_hdr hdr;
+ u8 rsvd[8];
+};
+
+struct be_cmd_resp_get_cntl_addnl_attribs {
+ struct be_cmd_resp_hdr hdr;
+ u16 ipl_file_number;
+ u8 ipl_file_version;
+ u8 rsvd0;
+ u8 on_die_temperature; /* in degrees centigrade*/
+ u8 rsvd1[3];
+};
+
struct be_cmd_req_vlan_config {
struct be_cmd_req_hdr hdr;
u8 interface_id;
@@ -1099,4 +1114,5 @@ extern int be_cmd_get_phy_info(struct be_adapter *adapter,
struct be_dma_mem *cmd);
extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
extern void be_detect_dump_ue(struct be_adapter *adapter);
+extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index 0833cbd..4766693 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -27,7 +27,7 @@ struct be_ethtool_stat {
};
enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
- PMEMSTAT};
+ PMEMSTAT, DRVSTAT};
#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
offsetof(_struct, field)
#define NETSTAT_INFO(field) #field, NETSTAT,\
@@ -46,6 +46,9 @@ enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
FIELDINFO(struct be_erx_stats, field)
#define PMEMSTAT_INFO(field) #field, PMEMSTAT,\
FIELDINFO(struct be_pmem_stats, field)
+#define DRVSTAT_INFO(field) #field, DRVSTAT,\
+ FIELDINFO(struct be_drv_stats, \
+ field)
static const struct be_ethtool_stat et_stats[] = {
{NETSTAT_INFO(rx_packets)},
@@ -105,7 +108,8 @@ static const struct be_ethtool_stat et_stats[] = {
{MISCSTAT_INFO(rx_drops_mtu)},
{MISCSTAT_INFO(port0_jabber_events)},
{MISCSTAT_INFO(port1_jabber_events)},
- {PMEMSTAT_INFO(eth_red_drops)}
+ {PMEMSTAT_INFO(eth_red_drops)},
+ {DRVSTAT_INFO(be_on_die_temperature)}
};
#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
@@ -285,6 +289,9 @@ be_get_ethtool_stats(struct net_device *netdev,
case PMEMSTAT:
p = &hw_stats->pmem;
break;
+ case DRVSTAT:
+ p = &adapter->drv_stats;
+ break;
}
p = (u8 *)p + et_stats[i].offset;
--
1.7.1
^ permalink raw reply related
* [PATCH net-next 6/6] be2net: use hba_port_num instead of port_num
From: Ajit Khaparde @ 2011-02-20 21:42 UTC (permalink / raw)
To: netdev, davem
Use hba_port_num for phy loopback and ethtool phy identification.
From: Suresh R <suresh.reddy@emulex.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be.h | 1 +
drivers/net/benet/be_cmds.c | 54 ++++++++++++++++++++++++++++++++++++++++
drivers/net/benet/be_cmds.h | 12 +++++++++
drivers/net/benet/be_ethtool.c | 12 ++++----
drivers/net/benet/be_hw.h | 47 ++++++++++++++++++++++++++++++++++
drivers/net/benet/be_main.c | 4 +++
6 files changed, 124 insertions(+), 6 deletions(-)
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 46b951f..ed709a5 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -318,6 +318,7 @@ struct be_adapter {
struct be_vf_cfg vf_cfg[BE_MAX_VF];
u8 is_virtfn;
u32 sli_family;
+ u8 hba_port_num;
u16 pvid;
};
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index ff62aae..1822ecd 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -1954,3 +1954,57 @@ err:
spin_unlock_bh(&adapter->mcc_lock);
return status;
}
+
+int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
+{
+ struct be_mcc_wrb *wrb;
+ struct be_cmd_req_cntl_attribs *req;
+ struct be_cmd_resp_cntl_attribs *resp;
+ struct be_sge *sge;
+ int status;
+ int payload_len = max(sizeof(*req), sizeof(*resp));
+ struct mgmt_controller_attrib *attribs;
+ struct be_dma_mem attribs_cmd;
+
+ memset(&attribs_cmd, 0, sizeof(struct be_dma_mem));
+ attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs);
+ attribs_cmd.va = pci_alloc_consistent(adapter->pdev, attribs_cmd.size,
+ &attribs_cmd.dma);
+ if (!attribs_cmd.va) {
+ dev_err(&adapter->pdev->dev,
+ "Memory allocation failure\n");
+ return -ENOMEM;
+ }
+
+ if (mutex_lock_interruptible(&adapter->mbox_lock))
+ return -1;
+
+ wrb = wrb_from_mbox(adapter);
+ if (!wrb) {
+ status = -EBUSY;
+ goto err;
+ }
+ req = attribs_cmd.va;
+ sge = nonembedded_sgl(wrb);
+
+ be_wrb_hdr_prepare(wrb, payload_len, false, 1,
+ OPCODE_COMMON_GET_CNTL_ATTRIBUTES);
+ be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+ OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len);
+ sge->pa_hi = cpu_to_le32(upper_32_bits(attribs_cmd.dma));
+ sge->pa_lo = cpu_to_le32(attribs_cmd.dma & 0xFFFFFFFF);
+ sge->len = cpu_to_le32(attribs_cmd.size);
+
+ status = be_mbox_notify_wait(adapter);
+ if (!status) {
+ attribs = (struct mgmt_controller_attrib *)( attribs_cmd.va +
+ sizeof(struct be_cmd_resp_hdr));
+ adapter->hba_port_num = attribs->hba_attribs.phy_port;
+ }
+
+err:
+ mutex_unlock(&adapter->mbox_lock);
+ pci_free_consistent(adapter->pdev, attribs_cmd.size, attribs_cmd.va,
+ attribs_cmd.dma);
+ return status;
+}
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index 6e89de8..93e5768 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -169,6 +169,7 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_SET_QOS 28
#define OPCODE_COMMON_MCC_CREATE_EXT 90
#define OPCODE_COMMON_SEEPROM_READ 30
+#define OPCODE_COMMON_GET_CNTL_ATTRIBUTES 32
#define OPCODE_COMMON_NTWK_RX_FILTER 34
#define OPCODE_COMMON_GET_FW_VERSION 35
#define OPCODE_COMMON_SET_FLOW_CONTROL 36
@@ -1030,6 +1031,16 @@ struct be_cmd_resp_set_qos {
u32 rsvd;
};
+/*********************** Controller Attributes ***********************/
+struct be_cmd_req_cntl_attribs {
+ struct be_cmd_req_hdr hdr;
+};
+
+struct be_cmd_resp_cntl_attribs {
+ struct be_cmd_resp_hdr hdr;
+ struct mgmt_controller_attrib attribs;
+};
+
extern int be_pci_fnum_get(struct be_adapter *adapter);
extern int be_cmd_POST(struct be_adapter *adapter);
extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
@@ -1115,4 +1126,5 @@ extern int be_cmd_get_phy_info(struct be_adapter *adapter,
extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
extern void be_detect_dump_ue(struct be_adapter *adapter);
extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
+extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index 4766693..6e5e433 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -513,7 +513,7 @@ be_phys_id(struct net_device *netdev, u32 data)
int status;
u32 cur;
- be_cmd_get_beacon_state(adapter, adapter->port_num, &cur);
+ be_cmd_get_beacon_state(adapter, adapter->hba_port_num, &cur);
if (cur == BEACON_STATE_ENABLED)
return 0;
@@ -521,12 +521,12 @@ be_phys_id(struct net_device *netdev, u32 data)
if (data < 2)
data = 2;
- status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0,
+ status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
BEACON_STATE_ENABLED);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(data*HZ);
- status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0,
+ status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
BEACON_STATE_DISABLED);
return status;
@@ -605,12 +605,12 @@ err:
static u64 be_loopback_test(struct be_adapter *adapter, u8 loopback_type,
u64 *status)
{
- be_cmd_set_loopback(adapter, adapter->port_num,
+ be_cmd_set_loopback(adapter, adapter->hba_port_num,
loopback_type, 1);
- *status = be_cmd_loopback_test(adapter, adapter->port_num,
+ *status = be_cmd_loopback_test(adapter, adapter->hba_port_num,
loopback_type, 1500,
2, 0xabc);
- be_cmd_set_loopback(adapter, adapter->port_num,
+ be_cmd_set_loopback(adapter, adapter->hba_port_num,
BE_NO_LOOPBACK, 1);
return *status;
}
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h
index 4096d97..3f459f7 100644
--- a/drivers/net/benet/be_hw.h
+++ b/drivers/net/benet/be_hw.h
@@ -327,6 +327,53 @@ struct be_eth_rx_compl {
u32 dw[4];
};
+struct mgmt_hba_attribs {
+ u8 flashrom_version_string[32];
+ u8 manufacturer_name[32];
+ u32 supported_modes;
+ u32 rsvd0[3];
+ u8 ncsi_ver_string[12];
+ u32 default_extended_timeout;
+ u8 controller_model_number[32];
+ u8 controller_description[64];
+ u8 controller_serial_number[32];
+ u8 ip_version_string[32];
+ u8 firmware_version_string[32];
+ u8 bios_version_string[32];
+ u8 redboot_version_string[32];
+ u8 driver_version_string[32];
+ u8 fw_on_flash_version_string[32];
+ u32 functionalities_supported;
+ u16 max_cdblength;
+ u8 asic_revision;
+ u8 generational_guid[16];
+ u8 hba_port_count;
+ u16 default_link_down_timeout;
+ u8 iscsi_ver_min_max;
+ u8 multifunction_device;
+ u8 cache_valid;
+ u8 hba_status;
+ u8 max_domains_supported;
+ u8 phy_port;
+ u32 firmware_post_status;
+ u32 hba_mtu[8];
+ u32 rsvd1[4];
+};
+
+struct mgmt_controller_attrib {
+ struct mgmt_hba_attribs hba_attribs;
+ u16 pci_vendor_id;
+ u16 pci_device_id;
+ u16 pci_sub_vendor_id;
+ u16 pci_sub_system_id;
+ u8 pci_bus_number;
+ u8 pci_device_number;
+ u8 pci_function_number;
+ u8 interface_type;
+ u64 unique_identifier;
+ u32 rsvd0[5];
+};
+
struct controller_id {
u32 vendor;
u32 device;
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index cd6fda7..0bdccb1 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -2868,6 +2868,10 @@ static int be_get_config(struct be_adapter *adapter)
else
adapter->max_vlans = BE_NUM_VLANS_SUPPORTED;
+ status = be_cmd_get_cntl_attributes(adapter);
+ if (status)
+ return status;
+
return 0;
}
--
1.7.1
^ permalink raw reply related
* [PATCH net-next 3/6] be2net: variable name change
From: Ajit Khaparde @ 2011-02-20 21:41 UTC (permalink / raw)
To: netdev, davem
change occurances of stats_ioctl_sent to stats_cmd_sent
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be.h | 2 +-
drivers/net/benet/be_cmds.c | 4 ++--
drivers/net/benet/be_main.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 3a800e2..fb605e8 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -298,7 +298,7 @@ struct be_adapter {
u32 rx_fc; /* Rx flow control */
u32 tx_fc; /* Tx flow control */
bool ue_detected;
- bool stats_ioctl_sent;
+ bool stats_cmd_sent;
int link_speed;
u8 port_type;
u8 transceiver;
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index 619ebc2..7120106 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -81,7 +81,7 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
be_dws_le_to_cpu(&resp->hw_stats,
sizeof(resp->hw_stats));
netdev_stats_update(adapter);
- adapter->stats_ioctl_sent = false;
+ adapter->stats_cmd_sent = false;
}
} else if ((compl_status != MCC_STATUS_NOT_SUPPORTED) &&
(compl->tag0 != OPCODE_COMMON_NTWK_MAC_QUERY)) {
@@ -1075,7 +1075,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
sge->len = cpu_to_le32(nonemb_cmd->size);
be_mcc_notify(adapter);
- adapter->stats_ioctl_sent = true;
+ adapter->stats_cmd_sent = true;
err:
spin_unlock_bh(&adapter->mcc_lock);
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index aad7ea3..b9e170d 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -1873,7 +1873,7 @@ static void be_worker(struct work_struct *work)
goto reschedule;
}
- if (!adapter->stats_ioctl_sent)
+ if (!adapter->stats_cmd_sent)
be_cmd_get_stats(adapter, &adapter->stats_cmd);
be_tx_rate_update(adapter);
--
1.7.1
^ permalink raw reply related
* [PATCH net-next 4/6] be2net: fix to ignore transparent vlan ids wrongly indicated by NIC
From: Ajit Khaparde @ 2011-02-20 21:41 UTC (permalink / raw)
To: netdev, davem
With transparent VLAN tagging, the ASIC wrongly indicates packets with VLAN ID.
Strip them off in the driver. The VLAN Tag to be stripped will be given to the host
as an async message.
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be.h | 1 +
drivers/net/benet/be_cmds.c | 14 ++++++++++++++
drivers/net/benet/be_cmds.h | 13 +++++++++++++
drivers/net/benet/be_main.c | 6 ++++++
4 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index fb605e8..7bf8dd4 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -311,6 +311,7 @@ struct be_adapter {
struct be_vf_cfg vf_cfg[BE_MAX_VF];
u8 is_virtfn;
u32 sli_family;
+ u16 pvid;
};
#define be_physfn(adapter) (!adapter->is_virtfn)
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index 7120106..59d25ac 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -124,6 +124,16 @@ static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
}
}
+/*Grp5 PVID evt*/
+static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
+ struct be_async_event_grp5_pvid_state *evt)
+{
+ if (evt->enabled)
+ adapter->pvid = evt->tag;
+ else
+ adapter->pvid = 0;
+}
+
static void be_async_grp5_evt_process(struct be_adapter *adapter,
u32 trailer, struct be_mcc_compl *evt)
{
@@ -141,6 +151,10 @@ static void be_async_grp5_evt_process(struct be_adapter *adapter,
be_async_grp5_qos_speed_process(adapter,
(struct be_async_event_grp5_qos_link_speed *)evt);
break;
+ case ASYNC_EVENT_PVID_STATE:
+ be_async_grp5_pvid_state_process(adapter,
+ (struct be_async_event_grp5_pvid_state *)evt);
+ break;
default:
dev_warn(&adapter->pdev->dev, "Unknown grp5 event!\n");
break;
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index 331e954..a5af296 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -88,6 +88,7 @@ struct be_mcc_compl {
#define ASYNC_EVENT_CODE_GRP_5 0x5
#define ASYNC_EVENT_QOS_SPEED 0x1
#define ASYNC_EVENT_COS_PRIORITY 0x2
+#define ASYNC_EVENT_PVID_STATE 0x3
struct be_async_event_trailer {
u32 code;
};
@@ -134,6 +135,18 @@ struct be_async_event_grp5_cos_priority {
struct be_async_event_trailer trailer;
} __packed;
+/* When the event code of an async trailer is GRP5 and event type is
+ * PVID state, the mcc_compl must be interpreted as follows
+ */
+struct be_async_event_grp5_pvid_state {
+ u8 enabled;
+ u8 rsvd0;
+ u16 tag;
+ u32 event_tag;
+ u32 rsvd1;
+ struct be_async_event_trailer trailer;
+} __packed;
+
struct be_mcc_mailbox {
struct be_mcc_wrb wrb;
struct be_mcc_compl compl;
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index b9e170d..cd6fda7 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -1047,6 +1047,9 @@ static void be_rx_compl_process(struct be_adapter *adapter,
if ((adapter->function_mode & 0x400) && !vtm)
vlanf = 0;
+ if ((adapter->pvid == vlanf) && !adapter->vlan_tag[vlanf])
+ vlanf = 0;
+
if (unlikely(vlanf)) {
if (!adapter->vlan_grp || adapter->vlans_added == 0) {
kfree_skb(skb);
@@ -1087,6 +1090,9 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
if ((adapter->function_mode & 0x400) && !vtm)
vlanf = 0;
+ if ((adapter->pvid == vlanf) && !adapter->vlan_tag[vlanf])
+ vlanf = 0;
+
skb = napi_get_frags(&eq_obj->napi);
if (!skb) {
be_rx_compl_discard(adapter, rxo, rxcp);
--
1.7.1
^ permalink raw reply related
* [PATCH net-next 1/6] be2net: add new counters to display via ethtool stats
From: Ajit Khaparde @ 2011-02-20 21:41 UTC (permalink / raw)
To: netdev, davem
New counters:
> jabber frame stats
> red drop stats
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be_cmds.h | 12 ++++++++++--
drivers/net/benet/be_ethtool.c | 13 +++++++++++--
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index 91c5d2b..331e954 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -619,7 +619,10 @@ struct be_rxf_stats {
u32 rx_drops_invalid_ring; /* dword 145*/
u32 forwarded_packets; /* dword 146*/
u32 rx_drops_mtu; /* dword 147*/
- u32 rsvd0[15];
+ u32 rsvd0[7];
+ u32 port0_jabber_events;
+ u32 port1_jabber_events;
+ u32 rsvd1[6];
};
struct be_erx_stats {
@@ -630,11 +633,16 @@ struct be_erx_stats {
u32 debug_pmem_pbuf_dealloc; /* dword 47*/
};
+struct be_pmem_stats {
+ u32 eth_red_drops;
+ u32 rsvd[4];
+};
+
struct be_hw_stats {
struct be_rxf_stats rxf;
u32 rsvd[48];
struct be_erx_stats erx;
- u32 rsvd1[6];
+ struct be_pmem_stats pmem;
};
struct be_cmd_req_get_stats {
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index 07b4ab9..82a9a27 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -26,7 +26,8 @@ struct be_ethtool_stat {
int offset;
};
-enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT};
+enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
+ PMEMSTAT};
#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
offsetof(_struct, field)
#define NETSTAT_INFO(field) #field, NETSTAT,\
@@ -43,6 +44,8 @@ enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT};
field)
#define ERXSTAT_INFO(field) #field, ERXSTAT,\
FIELDINFO(struct be_erx_stats, field)
+#define PMEMSTAT_INFO(field) #field, PMEMSTAT,\
+ FIELDINFO(struct be_pmem_stats, field)
static const struct be_ethtool_stat et_stats[] = {
{NETSTAT_INFO(rx_packets)},
@@ -99,7 +102,10 @@ static const struct be_ethtool_stat et_stats[] = {
{MISCSTAT_INFO(rx_drops_too_many_frags)},
{MISCSTAT_INFO(rx_drops_invalid_ring)},
{MISCSTAT_INFO(forwarded_packets)},
- {MISCSTAT_INFO(rx_drops_mtu)}
+ {MISCSTAT_INFO(rx_drops_mtu)},
+ {MISCSTAT_INFO(port0_jabber_events)},
+ {MISCSTAT_INFO(port1_jabber_events)},
+ {PMEMSTAT_INFO(eth_red_drops)}
};
#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
@@ -276,6 +282,9 @@ be_get_ethtool_stats(struct net_device *netdev,
case MISCSTAT:
p = &hw_stats->rxf;
break;
+ case PMEMSTAT:
+ p = &hw_stats->pmem;
+ break;
}
p = (u8 *)p + et_stats[i].offset;
--
1.7.1
^ permalink raw reply related
* [PATCH net-next 2/6] be2net: fixes in ethtool selftest
From: Ajit Khaparde @ 2011-02-20 21:41 UTC (permalink / raw)
To: netdev, davem
> add missing separator between items in ethtool self_test array
> fix reporting of test resluts when link is down and
when selftest command fails.
From: Suresh R <suresh.reddy@emulex.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
---
drivers/net/benet/be_ethtool.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index 82a9a27..0833cbd 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -127,7 +127,7 @@ static const char et_self_tests[][ETH_GSTRING_LEN] = {
"MAC Loopback test",
"PHY Loopback test",
"External Loopback test",
- "DDR DMA test"
+ "DDR DMA test",
"Link test"
};
@@ -642,7 +642,8 @@ be_self_test(struct net_device *netdev, struct ethtool_test *test, u64 *data)
&qos_link_speed) != 0) {
test->flags |= ETH_TEST_FL_FAILED;
data[4] = -1;
- } else if (mac_speed) {
+ } else if (!mac_speed) {
+ test->flags |= ETH_TEST_FL_FAILED;
data[4] = 1;
}
}
--
1.7.1
^ permalink raw reply related
* libmnl limitation...
From: David Miller @ 2011-02-20 21:41 UTC (permalink / raw)
To: pablo; +Cc: netdev
Unfortunately, libmnl only allows setting socket options
that are of SOL_NETLINK.
This precludes setting socket options such as SO_ATTACH_FILTER
which need to be of level SOL_SOCKET.
It seems to be a mistake to have hard-coded the socket level
instead of simply letting the user specify it :-/
^ permalink raw reply
* Re: Advice on network driver design
From: Felix Radensky @ 2011-02-20 21:01 UTC (permalink / raw)
To: Micha Nelissen; +Cc: netdev@vger.kernel.org
In-Reply-To: <4D615A1E.5070002@neli.hopto.org>
Hi Micha
On 02/20/2011 08:14 PM, Micha Nelissen wrote:
> Felix Radensky wrote:
>> The host platform is Freescale P2020. The custom hardware is
>> FPGA with several TX FIFOs, single RX FIFO and a set of registers.
>
> Wasn't it easier to use the in-SOC ethernet controllers?
FPGA talks some satellite protocol to the outside world, so the
target box is essentially a ethernet to satellite router.
Felix.
^ permalink raw reply
* Re: Question about tg3 and bnx2 driver suppliers
From: Stephen Hemminger @ 2011-02-20 20:41 UTC (permalink / raw)
To: Eric Dumazet; +Cc: Micha Nelissen, Michael Durket, netdev@vger.kernel.org
In-Reply-To: <1298229420.8559.59.camel@edumazet-laptop>
On Sun, 20 Feb 2011 20:17:00 +0100
Eric Dumazet <eric.dumazet@gmail.com> wrote:
> Le dimanche 20 février 2011 à 19:19 +0100, Micha Nelissen a écrit :
> > Eric Dumazet wrote:
> > > One possible cause of packet drops is when softirqs are disabled for too
> > > long periods, even if NIC has a big RX ring (check ethtool -g eth0)
> >
> > Why aren't the softirqs converted to workqueues? Wouldn't that cut
> > dependencies to other softirq users and improve latency?
> >
>
> Because it was done like that in the old days.
>
> Its a bit less important these days, now typical machines have 8+ cpus.
> Each device interrupt can be handled by its own cpu :)
The latency to schedule a work queue is still much higher
than the latency to do a softirq. Last time I played around with it,
things like loopback performance dropped 10% if using work queue.
^ 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