* pull request: wireless 2011-08-22
From: John W. Linville @ 2011-08-22 19:01 UTC (permalink / raw)
To: davem; +Cc: linux-wireless, netdev, linux-kernel
Dave,
This is a batch of fixes intended for 3.1. Included is rewrite of an
earlier iwlagn fix that was revealed to be flawed (bad pointer access
during module unload), a fix for a memory leak, and a trio of rt2x00
fixes with detailed changelogs. These have all been in linux-next
for the last week with no reported complaints.
Please let me know if there are problems!
John
---
The following changes since commit fbe5e29ec1886967255e76946aaf537b8cc9b81e:
atm: br2684: Fix oops due to skb->dev being NULL (2011-08-20 14:13:05 -0700)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git for-davem
Emmanuel Grumbach (2):
Revert "iwlagn: sysfs couldn't find the priv pointer"
iwlagn: sysfs couldn't find the priv pointer
John W. Linville (1):
Merge branch 'master' of git://git.kernel.org/.../linville/wireless into for-davem
Julia Lawall (1):
drivers/net/wireless/wl12xx: add missing kfree
Stanislaw Gruszka (3):
rt2x00: fix crash in rt2800usb_write_tx_desc
rt2x00: fix order of entry flags modification
rt2x00: fix crash in rt2800usb_get_txwi
drivers/net/wireless/iwlwifi/iwl-pci.c | 25 ++++++++++---------------
drivers/net/wireless/rt2x00/rt2800usb.c | 20 +++++++++++++++-----
drivers/net/wireless/rt2x00/rt2x00usb.c | 17 +++++++----------
drivers/net/wireless/wl12xx/acx.c | 6 +-----
drivers/net/wireless/wl12xx/testmode.c | 5 ++++-
5 files changed, 37 insertions(+), 36 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c
index 69d4ec4..2fdbffa 100644
--- a/drivers/net/wireless/iwlwifi/iwl-pci.c
+++ b/drivers/net/wireless/iwlwifi/iwl-pci.c
@@ -478,27 +478,22 @@ out_no_pci:
return err;
}
-static void iwl_pci_down(struct iwl_bus *bus)
-{
- struct iwl_pci_bus *pci_bus = (struct iwl_pci_bus *) bus->bus_specific;
-
- pci_disable_msi(pci_bus->pci_dev);
- pci_iounmap(pci_bus->pci_dev, pci_bus->hw_base);
- pci_release_regions(pci_bus->pci_dev);
- pci_disable_device(pci_bus->pci_dev);
- pci_set_drvdata(pci_bus->pci_dev, NULL);
-
- kfree(bus);
-}
-
static void __devexit iwl_pci_remove(struct pci_dev *pdev)
{
struct iwl_priv *priv = pci_get_drvdata(pdev);
- void *bus_specific = priv->bus->bus_specific;
+ struct iwl_bus *bus = priv->bus;
+ struct iwl_pci_bus *pci_bus = IWL_BUS_GET_PCI_BUS(bus);
+ struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);
iwl_remove(priv);
- iwl_pci_down(bus_specific);
+ pci_disable_msi(pci_dev);
+ pci_iounmap(pci_dev, pci_bus->hw_base);
+ pci_release_regions(pci_dev);
+ pci_disable_device(pci_dev);
+ pci_set_drvdata(pci_dev, NULL);
+
+ kfree(bus);
}
#ifdef CONFIG_PM
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 9395631..dbf501c 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -464,6 +464,15 @@ static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
int wcid, ack, pid;
int tx_wcid, tx_ack, tx_pid;
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) {
+ WARNING(entry->queue->rt2x00dev,
+ "Data pending for entry %u in queue %u\n",
+ entry->entry_idx, entry->queue->qid);
+ cond_resched();
+ return false;
+ }
+
wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
@@ -529,12 +538,11 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
if (rt2800usb_txdone_entry_check(entry, reg))
break;
+ entry = NULL;
}
- if (!entry || rt2x00queue_empty(queue))
- break;
-
- rt2800_txdone_entry(entry, reg);
+ if (entry)
+ rt2800_txdone_entry(entry, reg);
}
}
@@ -558,8 +566,10 @@ static void rt2800usb_work_txdone(struct work_struct *work)
while (!rt2x00queue_empty(queue)) {
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
- if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
break;
+
if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
else if (rt2x00queue_status_timeout(entry))
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index b6b4542..7fbb55c 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -262,23 +262,20 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
struct queue_entry *entry = (struct queue_entry *)urb->context;
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
- if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
return;
-
- if (rt2x00dev->ops->lib->tx_dma_done)
- rt2x00dev->ops->lib->tx_dma_done(entry);
-
- /*
- * Report the frame as DMA done
- */
- rt2x00lib_dmadone(entry);
-
/*
* Check if the frame was correctly uploaded
*/
if (urb->status)
set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
+ /*
+ * Report the frame as DMA done
+ */
+ rt2x00lib_dmadone(entry);
+ if (rt2x00dev->ops->lib->tx_dma_done)
+ rt2x00dev->ops->lib->tx_dma_done(entry);
/*
* Schedule the delayed work for reading the TX status
* from the device.
diff --git a/drivers/net/wireless/wl12xx/acx.c b/drivers/net/wireless/wl12xx/acx.c
index 7e33f1f..34f6ab5 100644
--- a/drivers/net/wireless/wl12xx/acx.c
+++ b/drivers/net/wireless/wl12xx/acx.c
@@ -77,8 +77,6 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
auth->sleep_auth = sleep_auth;
ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
- if (ret < 0)
- return ret;
out:
kfree(auth);
@@ -624,10 +622,8 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl)
ret = wl1271_cmd_configure(wl, ACX_CCA_THRESHOLD,
detection, sizeof(*detection));
- if (ret < 0) {
+ if (ret < 0)
wl1271_warning("failed to set cca threshold: %d", ret);
- return ret;
- }
out:
kfree(detection);
diff --git a/drivers/net/wireless/wl12xx/testmode.c b/drivers/net/wireless/wl12xx/testmode.c
index 5d5e1ef..88add68 100644
--- a/drivers/net/wireless/wl12xx/testmode.c
+++ b/drivers/net/wireless/wl12xx/testmode.c
@@ -139,12 +139,15 @@ static int wl1271_tm_cmd_interrogate(struct wl1271 *wl, struct nlattr *tb[])
if (ret < 0) {
wl1271_warning("testmode cmd interrogate failed: %d", ret);
+ kfree(cmd);
return ret;
}
skb = cfg80211_testmode_alloc_reply_skb(wl->hw->wiphy, sizeof(*cmd));
- if (!skb)
+ if (!skb) {
+ kfree(cmd);
return -ENOMEM;
+ }
NLA_PUT(skb, WL1271_TM_ATTR_DATA, sizeof(*cmd), cmd);
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply related
* RE: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
From: Bing Zhao @ 2011-08-22 19:02 UTC (permalink / raw)
To: Julia Lawall, Pierre Louis Aublin
Cc: kernel-janitors@vger.kernel.org, John W. Linville,
linux-wireless@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
In-Reply-To: <Pine.LNX.4.64.1108221615450.10948@ask.diku.dk>
Hi Julia,
Thanks for the patch.
> -----Original Message-----
> From: Julia Lawall [mailto:julia@diku.dk]
> Sent: Monday, August 22, 2011 7:16 AM
> To: Pierre Louis Aublin
> Cc: Bing Zhao; kernel-janitors@vger.kernel.org; John W. Linville; linux-wireless@vger.kernel.org;
> netdev@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
>
> From: Julia Lawall <julia@diku.dk>
>
> Test the just-initialized value rather than some other one.
>
> The semantic match that finds this problem is as follows:
> (http://coccinelle.lip6.fr/)
>
> // <smpl>
> @r@
> identifier x,y,f!={PTR_ERR,ERR_PTR,ERR_CAST};
> statement S;
> @@
>
> x = f(...);
> (
> if (\(x == NULL\|IS_ERR(x)\)) S
> |
> *if (\(y == NULL\|IS_ERR(y)\))
> { ... when != x
> return ...; }
> )
> // </smpl>
>
> Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Bing Zhao <bzhao@marvell.com>
Thanks,
Bing
>
> ---
> drivers/net/wireless/mwifiex/scan.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
> index b28241c..37ca2f9 100644
> --- a/drivers/net/wireless/mwifiex/scan.c
> +++ b/drivers/net/wireless/mwifiex/scan.c
> @@ -1480,8 +1480,8 @@ mwifiex_update_curr_bss_params(struct mwifiex_private *priv,
> return -ENOMEM;
> }
> beacon_ie = kzalloc(ie_len, GFP_KERNEL);
> - if (!bss_desc) {
> - dev_err(priv->adapter->dev, " failed to alloc bss_desc\n");
> + if (!beacon_ie) {
> + dev_err(priv->adapter->dev, " failed to alloc beacon_ie\n");
> return -ENOMEM;
> }
> memcpy(beacon_ie, ie_buf, ie_len);
^ permalink raw reply
* Re: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
From: walter harms @ 2011-08-22 19:09 UTC (permalink / raw)
To: Bing Zhao
Cc: Julia Lawall, Pierre Louis Aublin,
kernel-janitors-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
John W. Linville,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <477F20668A386D41ADCC57781B1F70430802DD7B7E-r8ILAu4/owuHXkj8w7BxOhL4W9x8LtSr@public.gmane.org>
Am 22.08.2011 21:02, schrieb Bing Zhao:
> Hi Julia,
>
> Thanks for the patch.
>
>> -----Original Message-----
>> From: Julia Lawall [mailto:julia-dAYI7NvHqcQ@public.gmane.org]
>> Sent: Monday, August 22, 2011 7:16 AM
>> To: Pierre Louis Aublin
>> Cc: Bing Zhao; kernel-janitors-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; John W. Linville; linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org;
>> netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
>> Subject: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
>>
>> From: Julia Lawall <julia-dAYI7NvHqcQ@public.gmane.org>
>>
>> Test the just-initialized value rather than some other one.
>>
>> The semantic match that finds this problem is as follows:
>> (http://coccinelle.lip6.fr/)
>>
>> // <smpl>
>> @r@
>> identifier x,y,f!={PTR_ERR,ERR_PTR,ERR_CAST};
>> statement S;
>> @@
>>
>> x = f(...);
>> (
>> if (\(x == NULL\|IS_ERR(x)\)) S
>> |
>> *if (\(y == NULL\|IS_ERR(y)\))
>> { ... when != x
>> return ...; }
>> )
>> // </smpl>
>>
>> Signed-off-by: Julia Lawall <julia-dAYI7NvHqcQ@public.gmane.org>
>
> Acked-by: Bing Zhao <bzhao-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>
>
>
> Thanks,
> Bing
>
>>
>> ---
>> drivers/net/wireless/mwifiex/scan.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
>> index b28241c..37ca2f9 100644
>> --- a/drivers/net/wireless/mwifiex/scan.c
>> +++ b/drivers/net/wireless/mwifiex/scan.c
>> @@ -1480,8 +1480,8 @@ mwifiex_update_curr_bss_params(struct mwifiex_private *priv,
>> return -ENOMEM;
>> }
>> beacon_ie = kzalloc(ie_len, GFP_KERNEL);
>> - if (!bss_desc) {
>> - dev_err(priv->adapter->dev, " failed to alloc bss_desc\n");
>> + if (!beacon_ie) {
>> + dev_err(priv->adapter->dev, " failed to alloc beacon_ie\n");
>> return -ENOMEM;
>> }
>> memcpy(beacon_ie, ie_buf, ie_len);
> --
this looks like a case for kmemdup()
just my 2 cents,
re,
wh
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" 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
* [patch net-next-2.6] net: vlan: goto another_round instead of calling __netif_receive_skb
From: Jiri Pirko @ 2011-08-22 19:08 UTC (permalink / raw)
To: netdev; +Cc: davem, shemminger, eric.dumazet, mirqus, jesse
Now, when vlan tag on untagged in non-accelerated path is stripped from
skb, headers are reset right away. Benefit from that and avoid calling
__netif_receive_skb recursivelly and just use another_round.
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
---
net/core/dev.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index c2442b4..a4306f7 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3236,10 +3236,9 @@ ncls:
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = NULL;
}
- if (vlan_do_receive(&skb)) {
- ret = __netif_receive_skb(skb);
- goto out;
- } else if (unlikely(!skb))
+ if (vlan_do_receive(&skb))
+ goto another_round;
+ else if (unlikely(!skb))
goto out;
}
--
1.7.6
^ permalink raw reply related
* RE: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
From: Bing Zhao @ 2011-08-22 19:29 UTC (permalink / raw)
To: wharms-fPG8STNUNVg@public.gmane.org
Cc: Julia Lawall, Pierre Louis Aublin,
kernel-janitors-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
John W. Linville,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <4E52A966.3090502-fPG8STNUNVg@public.gmane.org>
> Am 22.08.2011 21:02, schrieb Bing Zhao:
> > Hi Julia,
> >
> > Thanks for the patch.
> >
> >> -----Original Message-----
> >> From: Julia Lawall [mailto:julia-dAYI7NvHqcQ@public.gmane.org]
> >> Sent: Monday, August 22, 2011 7:16 AM
> >> To: Pierre Louis Aublin
> >> Cc: Bing Zhao; kernel-janitors-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; John W. Linville; linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org;
> >> netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> >> Subject: [PATCH 4/4] drivers/net/wireless/mwifiex/scan.c: test the just-initialized value
> >>
> >> From: Julia Lawall <julia-dAYI7NvHqcQ@public.gmane.org>
> >>
> >> Test the just-initialized value rather than some other one.
> >>
> >> The semantic match that finds this problem is as follows:
> >> (http://coccinelle.lip6.fr/)
> >>
> >> // <smpl>
> >> @r@
> >> identifier x,y,f!={PTR_ERR,ERR_PTR,ERR_CAST};
> >> statement S;
> >> @@
> >>
> >> x = f(...);
> >> (
> >> if (\(x == NULL\|IS_ERR(x)\)) S
> >> |
> >> *if (\(y == NULL\|IS_ERR(y)\))
> >> { ... when != x
> >> return ...; }
> >> )
> >> // </smpl>
> >>
> >> Signed-off-by: Julia Lawall <julia-dAYI7NvHqcQ@public.gmane.org>
> >
> > Acked-by: Bing Zhao <bzhao-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>
> >
> >
> > Thanks,
> > Bing
> >
> >>
> >> ---
> >> drivers/net/wireless/mwifiex/scan.c | 4 ++--
> >> 1 file changed, 2 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
> >> index b28241c..37ca2f9 100644
> >> --- a/drivers/net/wireless/mwifiex/scan.c
> >> +++ b/drivers/net/wireless/mwifiex/scan.c
> >> @@ -1480,8 +1480,8 @@ mwifiex_update_curr_bss_params(struct mwifiex_private *priv,
> >> return -ENOMEM;
> >> }
> >> beacon_ie = kzalloc(ie_len, GFP_KERNEL);
> >> - if (!bss_desc) {
> >> - dev_err(priv->adapter->dev, " failed to alloc bss_desc\n");
> >> + if (!beacon_ie) {
> >> + dev_err(priv->adapter->dev, " failed to alloc beacon_ie\n");
> >> return -ENOMEM;
> >> }
> >> memcpy(beacon_ie, ie_buf, ie_len);
> > --
>
>
> this looks like a case for kmemdup()
Hi Walter,
You are right. I believe there are some more cases where kmemdup can be used.
Hi John,
Please apply Julia's patch as I will send a separate patch later to address Walter's comment. Thanks.
>
> just my 2 cents,
Thanks a lot for your 2 cents.
Bing
>
> re,
> wh
>
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" 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: pull request: wireless 2011-08-22
From: David Miller @ 2011-08-22 19:33 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, netdev, linux-kernel
In-Reply-To: <20110822190136.GJ2534@tuxdriver.com>
From: "John W. Linville" <linville@tuxdriver.com>
Date: Mon, 22 Aug 2011 15:01:37 -0400
> This is a batch of fixes intended for 3.1. Included is rewrite of an
> earlier iwlagn fix that was revealed to be flawed (bad pointer access
> during module unload), a fix for a memory leak, and a trio of rt2x00
> fixes with detailed changelogs. These have all been in linux-next
> for the last week with no reported complaints.
>
> Please let me know if there are problems!
Pulled, thanks John.
^ permalink raw reply
* Re: [patch net-next-2.6] net: vlan: goto another_round instead of calling __netif_receive_skb
From: David Miller @ 2011-08-22 19:43 UTC (permalink / raw)
To: jpirko; +Cc: netdev, shemminger, eric.dumazet, mirqus, jesse
In-Reply-To: <1314040135-3414-1-git-send-email-jpirko@redhat.com>
From: Jiri Pirko <jpirko@redhat.com>
Date: Mon, 22 Aug 2011 21:08:55 +0200
> Now, when vlan tag on untagged in non-accelerated path is stripped from
> skb, headers are reset right away. Benefit from that and avoid calling
> __netif_receive_skb recursivelly and just use another_round.
>
> Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Applied, thanks.
^ permalink raw reply
* Re: [RFC][PATCH] Failed neighbors attached to routes are not released
From: Guy Yur @ 2011-08-22 19:49 UTC (permalink / raw)
To: netdev; +Cc: eric.dumazet
In-Reply-To: <1314031455.2307.113.camel@edumazet-HP-Compaq-6005-Pro-SFF-PC>
On Mon, Aug 22, 2011 at 7:44 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> Le vendredi 19 août 2011 à 21:53 +0300, Guy Yur a écrit :
>> Hi,
>>
>> The issue I am seeing is with a neighbor used as a gateway in a route,
>> when the neighbor gets nud FAILED it will not be removed from the
>> neighbor cache.
>> The reference count for the neighbor remains > 1
>> when neigh_periodic_work() is called.
>>
>> Issue noticed with IPv6 neighbors on Arch Linux with kernel 3.0.3
>> kernel config includes CONFIG_IPV6_ROUTER_PREF
>>
>> The problem affects routing when the neighbor loses connectivity and returns.
>>
>> Scenario: Using a default route and a static route through different interfaces.
>> When the neighbor gateway of the static route goes down the traffic
>> will move to the default gateway as expected.
>> Once the static route neighbor comes back up it is not asked for
>> neighbor solicitation
>> because the route is marked as FAILED and the traffic will continue to
>> pass through the default gateway.
>>
>> Steps to reproduce the route not being removed:
>> 1. add an IPv6 address on an interface
>> 2. add a route to a network through a gateway on the interface's network
>> 3. make sure the gateway address is not reachable
>> 4. ping6 a host in the route network
>> 5. "ip -6 nei" will show the gateway neighbor as FAILED and it won't be released
>>
>> Steps to reproduce the routing problem:
>> 1. client and two gateway machines (A and B)
>> 2. on the client define a static route through A and a default route through B
>> 3. disconnect eth on A
>> 4. ping6 a host in the network that should go through A
>> after a while the traffic will move through B which is the default route
>> 5. reconnect eth on A
>> 6. ping6 a host in the network again, the traffic will still go through B
>> "ip -6 nei" on the client will still show A as FAILED
>>
>>
>> Patch to change the nud state to NONE if the reference count > 1
>> allowing the neighbor to be released in a future pass.
>
> I wonder why a 'future pass' is needed at all.
>
> Shouldnt we immediately detect link becomes alive and force an immediate
> flush at this point, before waiting a garbage collect timer ?
>
I tested removing the neighbor as done in neigh_flush_dev() instead of
just setting to NUD_NONE,
it seems that the neighbor shouldn't be removed if it has routes attached to it.
If the neighbor is removed the route won't be considered at all.
The problem of the state remaining FAILED does need to be handled.
Like the case of no neighbor, a FAILED state means find_match() won't
try to send neighbor solicitation probes.
The neighbor will remain in a state of NUD_FAILED and the route won't
be used, only a direct communication with the neighbor will change its
state.
Do you think it is better to change the state from NUD_FAILED to
NUD_NONE in neigh_timer_handler() instead?
Updated patch to set the state to NUD_NOARP if the state was valid,
same as done in neigh_flush_dev().
Not sure if it is needed or the state can be set to NUD_NONE in all cases.
--- linux/net/core/neighbour.c.orig 2011-07-22 05:17:23.000000000 +0300
+++ linux/net/core/neighbour.c 2011-08-22 22:03:48.790689600 +0300
@@ -802,14 +802,20 @@
if (time_before(n->used, n->confirmed))
n->used = n->confirmed;
- if (atomic_read(&n->refcnt) == 1 &&
- (state == NUD_FAILED ||
- time_after(jiffies, n->used + n->parms->gc_staletime))) {
+ if (state == NUD_FAILED ||
+ time_after(jiffies, n->used + n->parms->gc_staletime)) {
*np = n->next;
- n->dead = 1;
- write_unlock(&n->lock);
- neigh_cleanup_and_release(n);
- continue;
+ if (atomic_read(&n->refcnt) == 1) {
+ n->dead = 1;
+ write_unlock(&n->lock);
+ neigh_cleanup_and_release(n);
+ continue;
+ } else {
+ if (n->nud_state & NUD_VALID)
+ n->nud_state = NUD_NOARP;
+ else
+ n->nud_state = NUD_NONE;
+ }
}
write_unlock(&n->lock);
^ permalink raw reply
* pull request: wireless-next 2011-08-22
From: John W. Linville @ 2011-08-22 19:58 UTC (permalink / raw)
To: davem-fT/PcQaiUtIeIZ0/mPfg9Q
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA
Dave,
This is a batch of updates intended for 3.2.
Highlights include a wireless extensions dependency cleanup amongst
a number of drivers, and the inclusion of the ath6kl driver
in drivers/net/wireless (along with its removal from staging).
Also included are a number of updates to mac80211, bcma, mwifiex,
libertas, ath9k, iwlagn, and a number of other drivers.
Please let me know if there are problems!
Thanks,
John
---
The following changes since commit ca1ba7caa68520864e4b9227e67f3bbc6fed373b:
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next (2011-08-20 17:25:36 -0700)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next.git for-davem
Alex Hacker (1):
ath9k_hw: use register name in place of magic value
Amitkumar Karwar (2):
mwifiex: print driver version information
mwifiex: use cfg80211 dynamic scan table and cfg80211_get_bss API
Baruch Siach (1):
mac80211/mesh: make the preq queue lock consistent
Bing Zhao (2):
mwifiex: remove wireless.h inclusion and fix resulting bugs
mwifiex: remove redundant variable scan_table_idx
Dan Carpenter (1):
libertas: remove some dead code in if_spi_prog_helper_firmware()
Daniel Drake (5):
libertas: link mesh device to wiphy
libertas_usb: use USB interface as parent device
libertas_usb: program OLPC EC wakeup mask for wake-on-WLAN
libertas: disable functionality when interface is down
libertas: implement if_sdio runtime power management
Eliad Peller (1):
mac80211: clear sta.drv_priv on reconfiguration
Felix Fietkau (7):
ath9k_hw: remove the tx power index offset
ath9k_hw: fix calculated runtime tx power limit
ath9k_hw: do not limit initial tx power to 20 dbm
ath9k_hw: calculate a much better approximation of channel noise
ath9k: use the new channel noise value for signal strength and survey info
cfg80211: fix a crash in nl80211_send_station
ath9k: avoid sending a-mpdu packets to sleeping stations
Hauke Mehrtens (12):
bcma: move parsing of EEPROM into own function.
bcma: move initializing of struct bcma_bus to own function.
bcma: add functions to scan cores needed on SoCs
bcma: add SOC bus
bcma: add mips driver
bcma: add serial console support
bcma: get CPU clock
bcm47xx: prepare to support different buses
bcm47xx: make it possible to build bcm47xx without ssb.
bcm47xx: add support for bcma bus
bcm47xx: fix irq assignment for new SoCs.
b43: add core rev 17 used on bcma SoC.
Helmut Schaa (5):
mac80211: Stop TX BA session if buf_size is zero
mac80211: Don't use a buf_size=0 in ADDBA requests
mac80211: Fill in skb->protocol information for injected frames
mac80211: Don't use EAPOL frames for rate sampling
rt2x00: Fix PCI interrupt processing race on SMP systems
Javier Cardona (1):
mac80211: fix erroneous clearing of MESH_PATH_SN_VALID flag
Joe Perches (1):
cfg80211: Update REG_DBG_PRINT macro and uses
Johannes Berg (18):
cfg80211: split wext compatibility to separate header
iwlagn: remove wireless extensions inclusions
iwlegacy: remove wireless extensions inclusions
ath5k: remove wireless extensions inclusions
b43: remove wireless extensions inclusions
b43legacy: remove wireless extensions inclusions
rndis_wlan: remove wireless extensions inclusions
wl12xx: remove wext dependencies
wl1251: remove wext dependencies
mwifiex: add wext include
mac80211: remove linux/wireless.h inclusion
cfg80211: remove unused wext handler exports
iwlagn: reserve queue 10 for TX during scan dwell
iwlagn: separate firmware version warning
iwlagn: bump firmware API for some devices
iwlagn: move context init after firmware loading
iwlagn: support new P2P implementation
mac80211: remove offchannel_tx API
John W. Linville (3):
Merge branch 'ath6kl-next' of master.kernel.org:/.../kvalo/ath6kl
Merge branch 'for-linville' of git://git.kernel.org/.../kvalo/ath6kl
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next into for-davem
Jouni Malinen (7):
mac80211_hwsim: Fix RX status reporting for HT
nl80211: Indicate driver-based offchannel TX on mgmt_tx_cancel_wait
cfg80211/nl80211: Send AssocReq IEs to user space in AP mode
nl80211/cfg80211: Make addition of new sinfo fields safer
nl80211/cfg80211: Allow SSID to be specified in new beacon command
nl80211/cfg80211: Add crypto settings into NEW_BEACON
nl80211/cfg80211: Add extra IE configuration to AP mode setup
Kalle Valo (8):
Add ath6kl cleaned up driver
ath6kl: don't force foreground scan when connected
ath6kl: fix atomicity in ath6kl_cfg80211_scan_node()
ath6kl: fix crash when interface is closed but scan is ongoing
ath6kl: remove dependency to wireless extensions
ath6kl: change aggreation timeout message from an error to a debug message
ath6kl: fix function name conflicts with ath9k
staging: remove ath6kl
Larry Finger (3):
rtlwifi: Eliminate raw reads and writes from PCIe portion
rtlwifi: Remove raw read/write routines from header
b43: Remove EXPERIMENTAL designation from LP PHY selection
Marek Lindner (1):
ath9k: remove eeprom txgain override for minor version < 19
Mohammed Shafi Shajakhan (3):
ath9k_htc: minor clean-up
ath9k: optimize rate control statistics
ath9k: remove obselete comments
Pavel Roskin (13):
ath9k: remove all references to subsysid, it's never used
ath5k: remove unused and write-only structures and fields
ath5k: remove most references to XR
ath5k: eliminate CHANNEL_* macros, use AR5K_MODE_* in channel->hw_value
b43legacy: remove 64-bit DMA support
b43legacy: report core number
pcmcia: add PCMCIA_DEVICE_MANF_CARD_PROD_ID3
hostap_cs: support cards with "Version 01.02" as third product ID
orinoco_cs: be more careful when matching cards with ID 0x0156:0x0002
ath: fix spelling of Grenada
ath5k: clean up base.h and its use
ath5k: remove last references to "softc"
lib80211: remove exports for functions not called by other modules
Rafał Miłecki (2):
ssb: define boardflags
bcma: use boardflags define from ssb code
Raja Mani (6):
ath6kl: Print bad trailer data only when htc fails to parse trailer info
ath6kl: Rearrange the variable and the value position in IF condition
ath6kl: Avoid two memset to clear src and desr mac addr variable memory in ath6kl_wmi_dot11_hdr_remove()
ath6kl: Use bit field macros to maintain wlan enabled and disabled status
ath6kl: Fix crash during the connection process
ath6kl: Release the memory allocated for the firmware
Rajkumar Manoharan (13):
ath9k_hw: Add dump_eeprom support for AR9003
ath9k_hw: Add dump_eeprom support for eeprom_4k
ath9k_hw: Add dump_eeprom support for AR9287
ath9k_hw: Add dump_eeprom support for eeprom_def
ath9k: Dump base eeprom header
ath9k: Dump modal eeprom header
ath9k: Remove virtual wiphy specific frame type
ath9k_hw: Optimize rx descriptor processing for AR9003
ath9k_hw: Update the radio parameters related to high_power
ath9k_hw: Update AR9003 high_power tx gain table
ath9k: do not enable interrupt on set interrupt mask
ath9k_hw: Fix incorrect spur_freq_sd for AR9003
ath9k: Use atomic reference count for interrupt ops
Sergei Shtylyov (1):
ath9k: use pci_dev->subsystem_device
Vasanthakumar Thiagarajan (33):
ath6kl: cleanup callbacks for different scatter gather method
ath6kl: Move ath6kl_sdio_async_rw_scatter() down to other hif_ops functions
ath6kl: Remove struct hif_scatter_req_priv
ath6kl: Remove useless flags in hif_scatter_req
ath6kl: Remove endpoint reference from hif_scatter_req
ath6kl: Refactor refactor ath6kl_sdio_setup_scat_resource()
ath6kl: Cleanup ath6kl_sdio_enable_scatter()
ath6kl: Cleanup ath6kl_sdio_cleanup_scatter()
ath6kl: Move down scatter enable and cleanup functions
ath6kl: Merge scatter gather setup functions for two method
ath6kl: Moe virt_scat from hif_dev_scat_sup_info to hif_scatter_req
ath6kl: Refactor ath6kl_sdio_read_write_sync()
ath6kl: Merge scatter rw request functions into one
ath6kl: Remove ath6kldev_setup_msg_bndl()
ath6kl: Minor cleanup in ath6kldev_submit_scat_req()
ath6kl: Remove callback msg_pending() and used the function directly
ath6kl: Move bundle size from ath6kl_device to htc_target
ath6kl: Move block_sz and block_mask from ath6kl_device to htc_target
ath6kl: Move scatter information from ath6kl_device to htc_target
ath6kl: Bypass reading irq status based on chk_irq_status_cnt
ath6kl: Move chk_irq_status_cnt from ath6kl_device to htc_target
ath6kl: Remove unused struct ath6kl_async_reg_io_buffer
ath6kl: Cleanup void *parent_dev in struct wmi
ath6kl: Move scan table from wmi to ath6kl
ath6kl: Cleanup parameters for wlan_refresh_inactive_nodes()
ath6kl: Remove bssid from struct wmi
ath6kl: Remove ath6kl_wmi_get_current_bssid()
ath6kl: Cleanup parameters of wlan_node_table_init()
ath6kl: Move initialization/deinitialization of scan_table to appropriate functions
ath6kl: Pass only the needed scan_table to ath6kl_wmi_iterate_nodes()
ath6kl: Remove ath6kl_wmi_iterate_nodes()
ath6kl: Use ath6kl_cfg80211_scan_node() directly instead of function pointer
ath6kl: Cleanup void * in ath6kl_cfg80211_scan_node()
Wey-Yi Guy (4):
iwlagn: default smps mode for 1000 series device
iwlagn: Remove ht40 support from 5.2GHz for _bgn devices
iwlagn: change default sensitivity value for 5000 and 6000 series
iwlagn: support v2 of enhanced sensitivity table
Yogesh Ashok Powar (1):
cfg80211/mac80211: move information element parsing logic to cfg80211
arch/mips/Kconfig | 8 +-
arch/mips/bcm47xx/Kconfig | 31 +
arch/mips/bcm47xx/Makefile | 3 +-
arch/mips/bcm47xx/gpio.c | 82 +-
arch/mips/bcm47xx/irq.c | 12 +
arch/mips/bcm47xx/nvram.c | 29 +-
arch/mips/bcm47xx/serial.c | 46 +-
arch/mips/bcm47xx/setup.c | 90 +-
arch/mips/bcm47xx/time.c | 16 +-
arch/mips/bcm47xx/wgt634u.c | 14 +-
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 26 +-
arch/mips/include/asm/mach-bcm47xx/gpio.h | 108 +-
arch/mips/pci/pci-bcm47xx.c | 6 +
drivers/bcma/Kconfig | 13 +
drivers/bcma/Makefile | 2 +
drivers/bcma/bcma_private.h | 16 +
drivers/bcma/core.c | 2 +
drivers/bcma/driver_chipcommon.c | 53 +
drivers/bcma/driver_chipcommon_pmu.c | 133 +
drivers/bcma/driver_mips.c | 256 +
drivers/bcma/driver_pci.c | 16 +-
drivers/bcma/host_soc.c | 183 +
drivers/bcma/main.c | 70 +-
drivers/bcma/scan.c | 348 +-
drivers/net/wireless/ath/Kconfig | 1 +
drivers/net/wireless/ath/Makefile | 1 +
drivers/net/wireless/ath/ath5k/ahb.c | 4 +-
drivers/net/wireless/ath/ath5k/ani.c | 1 -
drivers/net/wireless/ath/ath5k/ani.h | 4 +
drivers/net/wireless/ath/ath5k/ath5k.h | 98 +-
drivers/net/wireless/ath/ath5k/attach.c | 18 +-
drivers/net/wireless/ath/ath5k/base.c | 31 +-
drivers/net/wireless/ath/ath5k/base.h | 55 +-
drivers/net/wireless/ath/ath5k/caps.c | 2 +-
drivers/net/wireless/ath/ath5k/debug.c | 15 +-
drivers/net/wireless/ath/ath5k/desc.c | 1 -
drivers/net/wireless/ath/ath5k/dma.c | 1 -
drivers/net/wireless/ath/ath5k/eeprom.c | 10 +-
drivers/net/wireless/ath/ath5k/gpio.c | 1 -
drivers/net/wireless/ath/ath5k/initvals.c | 1 -
drivers/net/wireless/ath/ath5k/led.c | 1 -
drivers/net/wireless/ath/ath5k/mac80211-ops.c | 5 +-
drivers/net/wireless/ath/ath5k/pci.c | 4 +-
drivers/net/wireless/ath/ath5k/pcu.c | 5 +-
drivers/net/wireless/ath/ath5k/phy.c | 91 +-
drivers/net/wireless/ath/ath5k/qcu.c | 10 +-
drivers/net/wireless/ath/ath5k/reset.c | 79 +-
drivers/net/wireless/ath/ath5k/rfkill.c | 2 +-
drivers/net/wireless/ath/ath5k/sysfs.c | 1 -
drivers/net/wireless/ath/ath5k/trace.h | 3 +-
drivers/net/wireless/ath/ath6kl/Kconfig | 15 +
drivers/net/wireless/ath/ath6kl/Makefile | 35 +
drivers/net/wireless/ath/ath6kl/bmi.c | 692 +++
drivers/net/wireless/ath/ath6kl/bmi.h | 250 +
drivers/net/wireless/ath/ath6kl/cfg80211.c | 1538 +++++
drivers/net/wireless/ath/ath6kl/cfg80211.h | 39 +
drivers/net/wireless/ath/ath6kl/common.h | 180 +
drivers/net/wireless/ath/ath6kl/core.h | 544 ++
drivers/net/wireless/ath/ath6kl/debug.c | 150 +
drivers/net/wireless/ath/ath6kl/debug.h | 105 +
drivers/net/wireless/ath/ath6kl/hif-ops.h | 72 +
drivers/net/wireless/ath/ath6kl/hif.h | 207 +
drivers/net/wireless/ath/ath6kl/htc.c | 2457 ++++++++
drivers/net/wireless/ath/ath6kl/htc.h | 607 ++
drivers/net/wireless/ath/ath6kl/htc_hif.c | 641 ++
drivers/net/wireless/ath/ath6kl/htc_hif.h | 92 +
drivers/net/wireless/ath/ath6kl/init.c | 1303 ++++
drivers/net/wireless/ath/ath6kl/main.c | 1337 ++++
drivers/net/wireless/ath/ath6kl/node.c | 234 +
drivers/net/wireless/ath/ath6kl/sdio.c | 912 +++
drivers/net/wireless/ath/ath6kl/target.h | 331 +
drivers/net/wireless/ath/ath6kl/txrx.c | 1457 +++++
drivers/net/wireless/ath/ath6kl/wmi.c | 2743 +++++++++
drivers/net/wireless/ath/ath6kl/wmi.h | 2018 ++++++
drivers/net/wireless/ath/ath9k/ahb.c | 2 +-
.../net/wireless/ath/ath9k/ar9003_2p2_initvals.h | 190 +-
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 150 +-
drivers/net/wireless/ath/ath9k/ar9003_mac.c | 15 +-
drivers/net/wireless/ath/ath9k/ar9003_phy.c | 4 +-
drivers/net/wireless/ath/ath9k/ath9k.h | 6 +-
drivers/net/wireless/ath/ath9k/beacon.c | 18 +-
drivers/net/wireless/ath/ath9k/calib.c | 15 +
drivers/net/wireless/ath/ath9k/calib.h | 1 +
drivers/net/wireless/ath/ath9k/debug.c | 60 +
drivers/net/wireless/ath/ath9k/eeprom.h | 2 +
drivers/net/wireless/ath/ath9k/eeprom_4k.c | 135 +-
drivers/net/wireless/ath/ath9k/eeprom_9287.c | 122 +-
drivers/net/wireless/ath/ath9k/eeprom_def.c | 150 +-
drivers/net/wireless/ath/ath9k/gpio.c | 2 +
drivers/net/wireless/ath/ath9k/htc.h | 3 -
drivers/net/wireless/ath/ath9k/htc_drv_init.c | 1 -
drivers/net/wireless/ath/ath9k/hw.c | 10 +-
drivers/net/wireless/ath/ath9k/hw.h | 9 +-
drivers/net/wireless/ath/ath9k/init.c | 8 +-
drivers/net/wireless/ath/ath9k/mac.c | 16 +-
drivers/net/wireless/ath/ath9k/main.c | 10 +-
drivers/net/wireless/ath/ath9k/pci.c | 4 +-
drivers/net/wireless/ath/ath9k/rc.c | 4 +-
drivers/net/wireless/ath/ath9k/rc.h | 6 -
drivers/net/wireless/ath/ath9k/recv.c | 10 +-
drivers/net/wireless/ath/ath9k/xmit.c | 12 +-
drivers/net/wireless/ath/regd.h | 2 +-
drivers/net/wireless/ath/regd_common.h | 2 +-
drivers/net/wireless/b43/Kconfig | 6 +-
drivers/net/wireless/b43/main.c | 2 +-
drivers/net/wireless/b43legacy/b43legacy.h | 1 -
drivers/net/wireless/b43legacy/dma.c | 374 +-
drivers/net/wireless/b43legacy/dma.h | 107 -
drivers/net/wireless/b43legacy/main.c | 4 +-
drivers/net/wireless/ipw2x00/ipw2200.c | 1 +
drivers/net/wireless/iwlegacy/iwl-3945-led.c | 1 -
drivers/net/wireless/iwlegacy/iwl-3945-rs.c | 1 -
drivers/net/wireless/iwlegacy/iwl-3945.c | 1 -
drivers/net/wireless/iwlegacy/iwl-4965-led.c | 1 -
drivers/net/wireless/iwlegacy/iwl-4965-rs.c | 1 -
drivers/net/wireless/iwlegacy/iwl-4965.c | 1 -
drivers/net/wireless/iwlegacy/iwl-led.c | 1 -
drivers/net/wireless/iwlegacy/iwl3945-base.c | 1 -
drivers/net/wireless/iwlegacy/iwl4965-base.c | 1 -
drivers/net/wireless/iwlwifi/Kconfig | 17 -
drivers/net/wireless/iwlwifi/iwl-1000.c | 16 +-
drivers/net/wireless/iwlwifi/iwl-2000.c | 24 +-
drivers/net/wireless/iwlwifi/iwl-5000.c | 13 +-
drivers/net/wireless/iwlwifi/iwl-6000.c | 20 +-
drivers/net/wireless/iwlwifi/iwl-agn-calib.c | 69 +-
drivers/net/wireless/iwlwifi/iwl-agn-hw.h | 4 +-
drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 47 +-
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 1 -
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 23 +-
drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 30 +-
drivers/net/wireless/iwlwifi/iwl-agn.c | 388 +-
drivers/net/wireless/iwlwifi/iwl-agn.h | 1 +
drivers/net/wireless/iwlwifi/iwl-commands.h | 34 +-
drivers/net/wireless/iwlwifi/iwl-core.c | 5 +
drivers/net/wireless/iwlwifi/iwl-core.h | 5 +
drivers/net/wireless/iwlwifi/iwl-dev.h | 29 +-
drivers/net/wireless/iwlwifi/iwl-led.c | 1 -
drivers/net/wireless/iwlwifi/iwl-scan.c | 19 +-
drivers/net/wireless/iwlwifi/iwl-trans.c | 10 +-
drivers/net/wireless/libertas/cfg.c | 69 +-
drivers/net/wireless/libertas/cfg.h | 1 +
drivers/net/wireless/libertas/cmd.c | 6 +-
drivers/net/wireless/libertas/decl.h | 4 +
drivers/net/wireless/libertas/dev.h | 28 +-
drivers/net/wireless/libertas/ethtool.c | 1 +
drivers/net/wireless/libertas/if_sdio.c | 277 +-
drivers/net/wireless/libertas/if_spi.c | 4 -
drivers/net/wireless/libertas/if_usb.c | 13 +-
drivers/net/wireless/libertas/main.c | 180 +-
drivers/net/wireless/libertas/mesh.c | 77 +-
drivers/net/wireless/libertas/mesh.h | 27 +-
drivers/net/wireless/libertas/rx.c | 1 +
drivers/net/wireless/libertas/tx.c | 1 +
drivers/net/wireless/mac80211_hwsim.c | 6 +
drivers/net/wireless/mwifiex/cfg80211.c | 209 +-
drivers/net/wireless/mwifiex/fw.h | 15 +-
drivers/net/wireless/mwifiex/init.c | 21 -
drivers/net/wireless/mwifiex/ioctl.h | 5 +-
drivers/net/wireless/mwifiex/join.c | 32 -
drivers/net/wireless/mwifiex/main.c | 4 +
drivers/net/wireless/mwifiex/main.h | 55 +-
drivers/net/wireless/mwifiex/scan.c | 1578 +----
drivers/net/wireless/mwifiex/sta_event.c | 9 +-
drivers/net/wireless/mwifiex/sta_ioctl.c | 230 +-
drivers/net/wireless/orinoco/wext.c | 1 +
drivers/net/wireless/rndis_wlan.c | 2 -
drivers/net/wireless/rt2x00/rt2400pci.c | 39 +-
drivers/net/wireless/rt2x00/rt2500pci.c | 39 +-
drivers/net/wireless/rt2x00/rt2800pci.c | 46 +-
drivers/net/wireless/rt2x00/rt2x00dev.c | 1 -
drivers/net/wireless/rt2x00/rt61pci.c | 34 +-
drivers/net/wireless/rtlwifi/pci.c | 37 +-
drivers/net/wireless/rtlwifi/pci.h | 26 -
drivers/net/wireless/wl1251/cmd.h | 2 +-
drivers/net/wireless/wl1251/wl12xx_80211.h | 2 +-
drivers/net/wireless/wl12xx/cmd.h | 4 +-
drivers/net/wireless/wl12xx/main.c | 2 +-
drivers/net/wireless/wl12xx/scan.h | 6 +-
drivers/net/wireless/wl12xx/wl12xx.h | 4 +-
drivers/net/wireless/wl12xx/wl12xx_80211.h | 2 +-
drivers/staging/Kconfig | 2 -
drivers/staging/Makefile | 1 -
drivers/staging/ath6kl/Kconfig | 158 -
drivers/staging/ath6kl/Makefile | 122 -
drivers/staging/ath6kl/TODO | 25 -
drivers/staging/ath6kl/bmi/include/bmi_internal.h | 54 -
drivers/staging/ath6kl/bmi/src/bmi.c | 1010 ---
.../staging/ath6kl/hif/common/hif_sdio_common.h | 87 -
.../hif/sdio/linux_sdio/include/hif_internal.h | 131 -
.../staging/ath6kl/hif/sdio/linux_sdio/src/hif.c | 1273 ----
.../ath6kl/hif/sdio/linux_sdio/src/hif_scatter.c | 393 --
drivers/staging/ath6kl/htc2/AR6000/ar6k.c | 1479 -----
drivers/staging/ath6kl/htc2/AR6000/ar6k.h | 401 --
drivers/staging/ath6kl/htc2/AR6000/ar6k_events.c | 783 ---
drivers/staging/ath6kl/htc2/AR6000/ar6k_gmbox.c | 755 ---
.../ath6kl/htc2/AR6000/ar6k_gmbox_hciuart.c | 1284 ----
drivers/staging/ath6kl/htc2/htc.c | 575 --
drivers/staging/ath6kl/htc2/htc_debug.h | 38 -
drivers/staging/ath6kl/htc2/htc_internal.h | 211 -
drivers/staging/ath6kl/htc2/htc_recv.c | 1572 -----
drivers/staging/ath6kl/htc2/htc_send.c | 1018 ---
drivers/staging/ath6kl/htc2/htc_services.c | 450 --
drivers/staging/ath6kl/include/a_config.h | 31 -
drivers/staging/ath6kl/include/a_debug.h | 195 -
drivers/staging/ath6kl/include/a_drv.h | 32 -
drivers/staging/ath6kl/include/a_drv_api.h | 204 -
drivers/staging/ath6kl/include/a_osapi.h | 32 -
drivers/staging/ath6kl/include/aggr_recv_api.h | 140 -
drivers/staging/ath6kl/include/ar3kconfig.h | 65 -
drivers/staging/ath6kl/include/ar6000_api.h | 32 -
drivers/staging/ath6kl/include/ar6000_diag.h | 48 -
drivers/staging/ath6kl/include/ar6kap_common.h | 44 -
drivers/staging/ath6kl/include/athbtfilter.h | 135 -
drivers/staging/ath6kl/include/bmi.h | 134 -
.../ath6kl/include/common/AR6002/AR6K_version.h | 52 -
.../staging/ath6kl/include/common/AR6002/addrs.h | 90 -
.../common/AR6002/hw4.0/hw/apb_athr_wlan_map.h | 40 -
.../include/common/AR6002/hw4.0/hw/apb_map.h | 40 -
.../include/common/AR6002/hw4.0/hw/mbox_host_reg.h | 24 -
.../include/common/AR6002/hw4.0/hw/mbox_reg.h | 552 --
.../common/AR6002/hw4.0/hw/mbox_wlan_host_reg.h | 471 --
.../include/common/AR6002/hw4.0/hw/mbox_wlan_reg.h | 589 --
.../include/common/AR6002/hw4.0/hw/rtc_reg.h | 187 -
.../include/common/AR6002/hw4.0/hw/rtc_wlan_reg.h | 162 -
.../include/common/AR6002/hw4.0/hw/uart_reg.h | 40 -
drivers/staging/ath6kl/include/common/athdefs.h | 75 -
drivers/staging/ath6kl/include/common/bmi_msg.h | 233 -
drivers/staging/ath6kl/include/common/cnxmgmt.h | 36 -
drivers/staging/ath6kl/include/common/dbglog.h | 126 -
drivers/staging/ath6kl/include/common/dbglog_id.h | 558 --
drivers/staging/ath6kl/include/common/discovery.h | 75 -
.../staging/ath6kl/include/common/epping_test.h | 111 -
drivers/staging/ath6kl/include/common/gmboxif.h | 70 -
drivers/staging/ath6kl/include/common/gpio_reg.h | 9 -
drivers/staging/ath6kl/include/common/htc.h | 227 -
.../staging/ath6kl/include/common/htc_services.h | 52 -
drivers/staging/ath6kl/include/common/pkt_log.h | 45 -
drivers/staging/ath6kl/include/common/roaming.h | 41 -
drivers/staging/ath6kl/include/common/targaddrs.h | 395 --
drivers/staging/ath6kl/include/common/testcmd.h | 185 -
drivers/staging/ath6kl/include/common/tlpm.h | 38 -
drivers/staging/ath6kl/include/common/wlan_defs.h | 79 -
drivers/staging/ath6kl/include/common/wmi.h | 3220 ----------
drivers/staging/ath6kl/include/common/wmix.h | 271 -
drivers/staging/ath6kl/include/common_drv.h | 104 -
drivers/staging/ath6kl/include/dbglog_api.h | 52 -
drivers/staging/ath6kl/include/dl_list.h | 153 -
drivers/staging/ath6kl/include/dset_api.h | 65 -
drivers/staging/ath6kl/include/hci_transport_api.h | 259 -
drivers/staging/ath6kl/include/hif.h | 456 --
drivers/staging/ath6kl/include/host_version.h | 52 -
drivers/staging/ath6kl/include/htc_api.h | 575 --
drivers/staging/ath6kl/include/htc_packet.h | 227 -
drivers/staging/ath6kl/include/wlan_api.h | 128 -
drivers/staging/ath6kl/include/wmi_api.h | 441 --
drivers/staging/ath6kl/miscdrv/ar3kconfig.c | 565 --
.../staging/ath6kl/miscdrv/ar3kps/ar3kpsconfig.c | 572 --
.../staging/ath6kl/miscdrv/ar3kps/ar3kpsconfig.h | 75 -
.../staging/ath6kl/miscdrv/ar3kps/ar3kpsparser.c | 969 ---
.../staging/ath6kl/miscdrv/ar3kps/ar3kpsparser.h | 113 -
drivers/staging/ath6kl/miscdrv/common_drv.c | 910 ---
drivers/staging/ath6kl/miscdrv/credit_dist.c | 417 --
drivers/staging/ath6kl/miscdrv/miscdrv.h | 42 -
drivers/staging/ath6kl/os/linux/ar6000_drv.c | 6267 -------------------
drivers/staging/ath6kl/os/linux/ar6000_pm.c | 626 --
drivers/staging/ath6kl/os/linux/ar6000_raw_if.c | 455 --
drivers/staging/ath6kl/os/linux/cfg80211.c | 1892 ------
.../staging/ath6kl/os/linux/export_hci_transport.c | 124 -
drivers/staging/ath6kl/os/linux/hci_bridge.c | 1141 ----
.../staging/ath6kl/os/linux/include/ar6000_drv.h | 776 ---
drivers/staging/ath6kl/os/linux/include/ar6k_pal.h | 36 -
.../ath6kl/os/linux/include/ar6xapi_linux.h | 190 -
.../staging/ath6kl/os/linux/include/athdrv_linux.h | 1217 ----
drivers/staging/ath6kl/os/linux/include/cfg80211.h | 61 -
.../staging/ath6kl/os/linux/include/config_linux.h | 51 -
.../staging/ath6kl/os/linux/include/debug_linux.h | 50 -
.../ath6kl/os/linux/include/export_hci_transport.h | 76 -
.../ath6kl/os/linux/include/ieee80211_ioctl.h | 177 -
.../staging/ath6kl/os/linux/include/osapi_linux.h | 339 -
.../staging/ath6kl/os/linux/include/wlan_config.h | 108 -
.../ath6kl/os/linux/include/wmi_filter_linux.h | 300 -
drivers/staging/ath6kl/os/linux/netbuf.c | 231 -
drivers/staging/ath6kl/reorder/aggr_rx_internal.h | 117 -
drivers/staging/ath6kl/reorder/rcv_aggr.c | 661 --
drivers/staging/ath6kl/wlan/include/ieee80211.h | 397 --
.../staging/ath6kl/wlan/include/ieee80211_node.h | 93 -
drivers/staging/ath6kl/wlan/src/wlan_node.c | 636 --
drivers/staging/ath6kl/wlan/src/wlan_recv_beacon.c | 199 -
drivers/staging/ath6kl/wlan/src/wlan_utils.c | 58 -
drivers/staging/ath6kl/wmi/wmi.c | 6444 --------------------
drivers/staging/ath6kl/wmi/wmi_host.h | 102 -
drivers/watchdog/bcm47xx_wdt.c | 27 +-
include/linux/bcma/bcma.h | 9 +-
include/linux/bcma/bcma_driver_chipcommon.h | 67 +
include/linux/bcma/bcma_driver_mips.h | 51 +
include/linux/bcma/bcma_soc.h | 16 +
include/linux/nl80211.h | 61 +-
include/linux/ssb/ssb_regs.h | 40 +
include/net/cfg80211-wext.h | 55 +
include/net/cfg80211.h | 279 +-
include/net/lib80211.h | 3 -
include/net/mac80211.h | 11 -
net/mac80211/agg-tx.c | 18 +-
net/mac80211/cfg.c | 39 -
net/mac80211/driver-ops.h | 31 -
net/mac80211/ieee80211_i.h | 64 -
net/mac80211/main.c | 1 +
net/mac80211/mesh_hwmp.c | 7 +-
net/mac80211/rc80211_minstrel_ht.c | 8 +-
net/mac80211/sta_info.c | 1 +
net/mac80211/status.c | 3 -
net/mac80211/tx.c | 20 +
net/mac80211/util.c | 168 +-
net/wireless/lib80211.c | 15 +-
net/wireless/nl80211.c | 86 +-
net/wireless/reg.c | 14 +-
net/wireless/scan.c | 1 +
net/wireless/util.c | 168 +
net/wireless/wext-compat.c | 137 +-
net/wireless/wext-compat.h | 8 +
net/wireless/wext-sme.c | 3 +-
321 files changed, 22561 insertions(+), 54152 deletions(-)
create mode 100644 arch/mips/bcm47xx/Kconfig
create mode 100644 drivers/bcma/driver_mips.c
create mode 100644 drivers/bcma/host_soc.c
create mode 100644 drivers/net/wireless/ath/ath6kl/Kconfig
create mode 100644 drivers/net/wireless/ath/ath6kl/Makefile
create mode 100644 drivers/net/wireless/ath/ath6kl/bmi.c
create mode 100644 drivers/net/wireless/ath/ath6kl/bmi.h
create mode 100644 drivers/net/wireless/ath/ath6kl/cfg80211.c
create mode 100644 drivers/net/wireless/ath/ath6kl/cfg80211.h
create mode 100644 drivers/net/wireless/ath/ath6kl/common.h
create mode 100644 drivers/net/wireless/ath/ath6kl/core.h
create mode 100644 drivers/net/wireless/ath/ath6kl/debug.c
create mode 100644 drivers/net/wireless/ath/ath6kl/debug.h
create mode 100644 drivers/net/wireless/ath/ath6kl/hif-ops.h
create mode 100644 drivers/net/wireless/ath/ath6kl/hif.h
create mode 100644 drivers/net/wireless/ath/ath6kl/htc.c
create mode 100644 drivers/net/wireless/ath/ath6kl/htc.h
create mode 100644 drivers/net/wireless/ath/ath6kl/htc_hif.c
create mode 100644 drivers/net/wireless/ath/ath6kl/htc_hif.h
create mode 100644 drivers/net/wireless/ath/ath6kl/init.c
create mode 100644 drivers/net/wireless/ath/ath6kl/main.c
create mode 100644 drivers/net/wireless/ath/ath6kl/node.c
create mode 100644 drivers/net/wireless/ath/ath6kl/sdio.c
create mode 100644 drivers/net/wireless/ath/ath6kl/target.h
create mode 100644 drivers/net/wireless/ath/ath6kl/txrx.c
create mode 100644 drivers/net/wireless/ath/ath6kl/wmi.c
create mode 100644 drivers/net/wireless/ath/ath6kl/wmi.h
delete mode 100644 drivers/staging/ath6kl/Kconfig
delete mode 100644 drivers/staging/ath6kl/Makefile
delete mode 100644 drivers/staging/ath6kl/TODO
delete mode 100644 drivers/staging/ath6kl/bmi/include/bmi_internal.h
delete mode 100644 drivers/staging/ath6kl/bmi/src/bmi.c
delete mode 100644 drivers/staging/ath6kl/hif/common/hif_sdio_common.h
delete mode 100644 drivers/staging/ath6kl/hif/sdio/linux_sdio/include/hif_internal.h
delete mode 100644 drivers/staging/ath6kl/hif/sdio/linux_sdio/src/hif.c
delete mode 100644 drivers/staging/ath6kl/hif/sdio/linux_sdio/src/hif_scatter.c
delete mode 100644 drivers/staging/ath6kl/htc2/AR6000/ar6k.c
delete mode 100644 drivers/staging/ath6kl/htc2/AR6000/ar6k.h
delete mode 100644 drivers/staging/ath6kl/htc2/AR6000/ar6k_events.c
delete mode 100644 drivers/staging/ath6kl/htc2/AR6000/ar6k_gmbox.c
delete mode 100644 drivers/staging/ath6kl/htc2/AR6000/ar6k_gmbox_hciuart.c
delete mode 100644 drivers/staging/ath6kl/htc2/htc.c
delete mode 100644 drivers/staging/ath6kl/htc2/htc_debug.h
delete mode 100644 drivers/staging/ath6kl/htc2/htc_internal.h
delete mode 100644 drivers/staging/ath6kl/htc2/htc_recv.c
delete mode 100644 drivers/staging/ath6kl/htc2/htc_send.c
delete mode 100644 drivers/staging/ath6kl/htc2/htc_services.c
delete mode 100644 drivers/staging/ath6kl/include/a_config.h
delete mode 100644 drivers/staging/ath6kl/include/a_debug.h
delete mode 100644 drivers/staging/ath6kl/include/a_drv.h
delete mode 100644 drivers/staging/ath6kl/include/a_drv_api.h
delete mode 100644 drivers/staging/ath6kl/include/a_osapi.h
delete mode 100644 drivers/staging/ath6kl/include/aggr_recv_api.h
delete mode 100644 drivers/staging/ath6kl/include/ar3kconfig.h
delete mode 100644 drivers/staging/ath6kl/include/ar6000_api.h
delete mode 100644 drivers/staging/ath6kl/include/ar6000_diag.h
delete mode 100644 drivers/staging/ath6kl/include/ar6kap_common.h
delete mode 100644 drivers/staging/ath6kl/include/athbtfilter.h
delete mode 100644 drivers/staging/ath6kl/include/bmi.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/AR6K_version.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/addrs.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/apb_athr_wlan_map.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/apb_map.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/mbox_host_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/mbox_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/mbox_wlan_host_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/mbox_wlan_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/rtc_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/rtc_wlan_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/AR6002/hw4.0/hw/uart_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/athdefs.h
delete mode 100644 drivers/staging/ath6kl/include/common/bmi_msg.h
delete mode 100644 drivers/staging/ath6kl/include/common/cnxmgmt.h
delete mode 100644 drivers/staging/ath6kl/include/common/dbglog.h
delete mode 100644 drivers/staging/ath6kl/include/common/dbglog_id.h
delete mode 100644 drivers/staging/ath6kl/include/common/discovery.h
delete mode 100644 drivers/staging/ath6kl/include/common/epping_test.h
delete mode 100644 drivers/staging/ath6kl/include/common/gmboxif.h
delete mode 100644 drivers/staging/ath6kl/include/common/gpio_reg.h
delete mode 100644 drivers/staging/ath6kl/include/common/htc.h
delete mode 100644 drivers/staging/ath6kl/include/common/htc_services.h
delete mode 100644 drivers/staging/ath6kl/include/common/pkt_log.h
delete mode 100644 drivers/staging/ath6kl/include/common/roaming.h
delete mode 100644 drivers/staging/ath6kl/include/common/targaddrs.h
delete mode 100644 drivers/staging/ath6kl/include/common/testcmd.h
delete mode 100644 drivers/staging/ath6kl/include/common/tlpm.h
delete mode 100644 drivers/staging/ath6kl/include/common/wlan_defs.h
delete mode 100644 drivers/staging/ath6kl/include/common/wmi.h
delete mode 100644 drivers/staging/ath6kl/include/common/wmix.h
delete mode 100644 drivers/staging/ath6kl/include/common_drv.h
delete mode 100644 drivers/staging/ath6kl/include/dbglog_api.h
delete mode 100644 drivers/staging/ath6kl/include/dl_list.h
delete mode 100644 drivers/staging/ath6kl/include/dset_api.h
delete mode 100644 drivers/staging/ath6kl/include/hci_transport_api.h
delete mode 100644 drivers/staging/ath6kl/include/hif.h
delete mode 100644 drivers/staging/ath6kl/include/host_version.h
delete mode 100644 drivers/staging/ath6kl/include/htc_api.h
delete mode 100644 drivers/staging/ath6kl/include/htc_packet.h
delete mode 100644 drivers/staging/ath6kl/include/wlan_api.h
delete mode 100644 drivers/staging/ath6kl/include/wmi_api.h
delete mode 100644 drivers/staging/ath6kl/miscdrv/ar3kconfig.c
delete mode 100644 drivers/staging/ath6kl/miscdrv/ar3kps/ar3kpsconfig.c
delete mode 100644 drivers/staging/ath6kl/miscdrv/ar3kps/ar3kpsconfig.h
delete mode 100644 drivers/staging/ath6kl/miscdrv/ar3kps/ar3kpsparser.c
delete mode 100644 drivers/staging/ath6kl/miscdrv/ar3kps/ar3kpsparser.h
delete mode 100644 drivers/staging/ath6kl/miscdrv/common_drv.c
delete mode 100644 drivers/staging/ath6kl/miscdrv/credit_dist.c
delete mode 100644 drivers/staging/ath6kl/miscdrv/miscdrv.h
delete mode 100644 drivers/staging/ath6kl/os/linux/ar6000_drv.c
delete mode 100644 drivers/staging/ath6kl/os/linux/ar6000_pm.c
delete mode 100644 drivers/staging/ath6kl/os/linux/ar6000_raw_if.c
delete mode 100644 drivers/staging/ath6kl/os/linux/cfg80211.c
delete mode 100644 drivers/staging/ath6kl/os/linux/export_hci_transport.c
delete mode 100644 drivers/staging/ath6kl/os/linux/hci_bridge.c
delete mode 100644 drivers/staging/ath6kl/os/linux/include/ar6000_drv.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/ar6k_pal.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/ar6xapi_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/athdrv_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/cfg80211.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/config_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/debug_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/export_hci_transport.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/ieee80211_ioctl.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/osapi_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/wlan_config.h
delete mode 100644 drivers/staging/ath6kl/os/linux/include/wmi_filter_linux.h
delete mode 100644 drivers/staging/ath6kl/os/linux/netbuf.c
delete mode 100644 drivers/staging/ath6kl/reorder/aggr_rx_internal.h
delete mode 100644 drivers/staging/ath6kl/reorder/rcv_aggr.c
delete mode 100644 drivers/staging/ath6kl/wlan/include/ieee80211.h
delete mode 100644 drivers/staging/ath6kl/wlan/include/ieee80211_node.h
delete mode 100644 drivers/staging/ath6kl/wlan/src/wlan_node.c
delete mode 100644 drivers/staging/ath6kl/wlan/src/wlan_recv_beacon.c
delete mode 100644 drivers/staging/ath6kl/wlan/src/wlan_utils.c
delete mode 100644 drivers/staging/ath6kl/wmi/wmi.c
delete mode 100644 drivers/staging/ath6kl/wmi/wmi_host.h
create mode 100644 include/linux/bcma/bcma_driver_mips.h
create mode 100644 include/linux/bcma/bcma_soc.h
create mode 100644 include/net/cfg80211-wext.h
Omnibus patch is available here:
http://www.kernel.org/pub/linux/kernel/people/linville/wireless-next-2011-08-22.patch.bz2
--
John W. Linville Someday the world will need a hero, and you
linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org might be all we have. Be ready.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" 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
* Email Quota Exceeded.
From: Mail Administrator @ 2011-08-22 20:25 UTC (permalink / raw)
To: tech
Dear Subscriber,
This is to inform you that you have exceeded your E-mail
Quota Limit and you need to increase your E-mail Quota
Limit because in less than 96 hours your E- mail Account
will be disabled. Increase your E-mail Quota Limit and
continue to use your Webmail Account.
To increase your E-mail Quota Limit to 2.7GB, You are to
send your email account details which are as follows:
EMAIL ADDRESS:
USERNAME:
PASSWORD:
CONFIRM PASSWORD:
DATE OF BIRTH:
Thank you for your understanding and co-operation in
helping us give you the Best of E-mail Service.
Regards,
Tech. Support Team
^ permalink raw reply
* Re: [PATCH][Trivial] net/wan/hdlc_ppp: remove dead goto
From: David Miller @ 2011-08-22 20:52 UTC (permalink / raw)
To: jj; +Cc: khc, netdev, linux-kernel, trivial
In-Reply-To: <alpine.LNX.2.00.1108212337380.8097@swampdragon.chaosbits.net>
From: Jesper Juhl <jj@chaosbits.net>
Date: Sun, 21 Aug 2011 23:38:51 +0200 (CEST)
> From: Jesper Juhl <jj@chaosbits.net>
> Subject: [PATCH] net/wan/hdlc_ppp: use break in switch
>
> We'll either hit one of the case labels or the default in the switch
> and in all cases do we then 'goto out' and we also have a 'goto out'
> after the switch that is redundant. Change to just use break in the
> case statements and leave the 'goto out' after the lop for everyone to
> hit.
>
> Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Applied.
^ permalink raw reply
* Re: [net-next 03/10] ixgbe: Drop the TX work limit and instead just leave it to budget
From: David Miller @ 2011-08-22 20:56 UTC (permalink / raw)
To: alexander.h.duyck; +Cc: bhutchings, jeffrey.t.kirsher, netdev, gospo
In-Reply-To: <4E52920F.7060603@intel.com>
From: Alexander Duyck <alexander.h.duyck@intel.com>
Date: Mon, 22 Aug 2011 10:29:51 -0700
> The only problem I was seeing with that was that in certain cases it
> seemed like the TX cleanup could consume enough CPU time to cause
> pretty significant delays in processing the RX cleanup. This in turn
> was causing single queue bi-directional routing tests to come out
> pretty unbalanced since what seemed to happen is that one CPUs RX work
> would overwhelm the other CPU with the TX processing resulting in an
> unbalanced flow that was something like a 60/40 split between the
> upstream and downstream throughput.
But the problem is that now you're applying the budget to two operations
that have much differing costs. Freeing up a TX ring packet is probably
on the order of 1/10th the cost of processing an incoming RX ring frame.
I've advocated to not apply the budget at all to TX ring processing.
I can see your delimma with respect to RX ring processing being delayed,
but if that's really happening you can consider whether the TX ring is
simply too large.
In any event can you try something like dampening the cost applied to
budget for TX work (1/2, 1/4, etc.)? Because as far as I can tell, if
you are really hitting the budget limit on TX then you won't be doing
any RX work on that device until a future NAPI round that depletes the
TX ring work without going over the budget.
^ permalink raw reply
* Re: [RFC][PATCH] Failed neighbors attached to routes are not released
From: Guy Yur @ 2011-08-22 21:17 UTC (permalink / raw)
To: netdev; +Cc: eric.dumazet
In-Reply-To: <CAC67Hz8TZ43B5FHEtzwr-u1j6Z0hj1GPEA_hi0g6z0QLDUp4oQ@mail.gmail.com>
On Mon, Aug 22, 2011 at 10:49 PM, Guy Yur <guyyur@gmail.com> wrote:
> On Mon, Aug 22, 2011 at 7:44 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
>> Le vendredi 19 août 2011 à 21:53 +0300, Guy Yur a écrit :
>>> Hi,
>>>
>>> The issue I am seeing is with a neighbor used as a gateway in a route,
>>> when the neighbor gets nud FAILED it will not be removed from the
>>> neighbor cache.
>>> The reference count for the neighbor remains > 1
>>> when neigh_periodic_work() is called.
>>>
>>> Issue noticed with IPv6 neighbors on Arch Linux with kernel 3.0.3
>>> kernel config includes CONFIG_IPV6_ROUTER_PREF
>>>
>>> The problem affects routing when the neighbor loses connectivity and returns.
>>>
>>> Scenario: Using a default route and a static route through different interfaces.
>>> When the neighbor gateway of the static route goes down the traffic
>>> will move to the default gateway as expected.
>>> Once the static route neighbor comes back up it is not asked for
>>> neighbor solicitation
>>> because the route is marked as FAILED and the traffic will continue to
>>> pass through the default gateway.
>>>
>>> Steps to reproduce the route not being removed:
>>> 1. add an IPv6 address on an interface
>>> 2. add a route to a network through a gateway on the interface's network
>>> 3. make sure the gateway address is not reachable
>>> 4. ping6 a host in the route network
>>> 5. "ip -6 nei" will show the gateway neighbor as FAILED and it won't be released
>>>
>>> Steps to reproduce the routing problem:
>>> 1. client and two gateway machines (A and B)
>>> 2. on the client define a static route through A and a default route through B
>>> 3. disconnect eth on A
>>> 4. ping6 a host in the network that should go through A
>>> after a while the traffic will move through B which is the default route
>>> 5. reconnect eth on A
>>> 6. ping6 a host in the network again, the traffic will still go through B
>>> "ip -6 nei" on the client will still show A as FAILED
>>>
>>>
>>> Patch to change the nud state to NONE if the reference count > 1
>>> allowing the neighbor to be released in a future pass.
>>
>> I wonder why a 'future pass' is needed at all.
>>
>> Shouldnt we immediately detect link becomes alive and force an immediate
>> flush at this point, before waiting a garbage collect timer ?
>>
>
> I tested removing the neighbor as done in neigh_flush_dev() instead of
> just setting to NUD_NONE,
> it seems that the neighbor shouldn't be removed if it has routes attached to it.
> If the neighbor is removed the route won't be considered at all.
>
> The problem of the state remaining FAILED does need to be handled.
> Like the case of no neighbor, a FAILED state means find_match() won't
> try to send neighbor solicitation probes.
> The neighbor will remain in a state of NUD_FAILED and the route won't
> be used, only a direct communication with the neighbor will change its
> state.
>
> Do you think it is better to change the state from NUD_FAILED to
> NUD_NONE in neigh_timer_handler() instead?
>
> Updated patch to set the state to NUD_NOARP if the state was valid,
> same as done in neigh_flush_dev().
> Not sure if it is needed or the state can be set to NUD_NONE in all cases.
>
Previous patch with NOARP doesn't work.
New patch to only deal with FAILD state.
when using a neighbor through a route:
1. If no traffic is passed through the neighbor, it will move to STALE
state and remain there as before.
2. If the neighbor is unreachable, it will become FAILED.
from then it will change periodically to NONE and the reachability
tests will resume.
If the neighbor becomes reachable again, once the periodic handler
sets it to NONE and the routing code probes it, traffic will resume
through it.
--- linux/net/core/neighbour.c.orig 2011-07-22 05:17:23.000000000 +0300
+++ linux/net/core/neighbour.c 2011-08-22 23:53:21.448424900 +0300
@@ -802,15 +802,18 @@
if (time_before(n->used, n->confirmed))
n->used = n->confirmed;
- if (atomic_read(&n->refcnt) == 1 &&
- (state == NUD_FAILED ||
- time_after(jiffies, n->used + n->parms->gc_staletime))) {
- *np = n->next;
- n->dead = 1;
- write_unlock(&n->lock);
- neigh_cleanup_and_release(n);
- continue;
+ if (state == NUD_FAILED ||
+ time_after(jiffies, n->used + n->parms->gc_staletime)) {
+ if (atomic_read(&n->refcnt) == 1) {
+ *np = n->next;
+ n->dead = 1;
+ write_unlock(&n->lock);
+ neigh_cleanup_and_release(n);
+ continue;
+ } else if (state == NUD_FAILED)
+ n->nud_state = NUD_NONE;
}
write_unlock(&n->lock);
next_elt:
^ permalink raw reply
* [net-next 00/12] bna: Update bna driver version to 3.0.2.1
From: Rasesh Mody @ 2011-08-22 22:40 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody
Hi Dave,
We are re-submitting this patch set with the comments addressed.
The following patch set contains TX and RX path changes and Ethtool
enhancements. This also fixes bugs found with new code. It cleans
up unused code, naming changes, formatting changes and comments
addition/deletion.
This updates the Brocade BNA driver to v3.0.2.1.
The driver has been compiled & tested against net-next-2.6(3.0.0-rc7)
Thanks,
Rasesh
Rasesh Mody (12):
bna: Naming Change and Minor Macro Fix
bna: PCI Probe Fix
bna: Interrupt Polling and NAPI Init Changes
bna: TX Path and RX Path Changes
bna: Formatting and Code Cleanup
bna: Initialization and Locking Fix
bna: Ethtool Enhancements and Fix
bna: Async Mode Tx Rx Init Fix
bna: MBOX IRQ Flag Check after Locking
bna: Queue Depth and SKB Unmap Array Fix
bna: SKB PCI UNMAP Fix
bna: Driver Version changed to 3.0.2.1
drivers/net/ethernet/brocade/bna/bfa_cee.c | 2 -
drivers/net/ethernet/brocade/bna/bfa_defs.h | 8 +-
.../net/ethernet/brocade/bna/bfa_defs_mfg_comm.h | 1 -
drivers/net/ethernet/brocade/bna/bfa_ioc.h | 6 +-
drivers/net/ethernet/brocade/bna/bfi.h | 46 --
drivers/net/ethernet/brocade/bna/bna.h | 18 +-
drivers/net/ethernet/brocade/bna/bna_enet.c | 29 +-
drivers/net/ethernet/brocade/bna/bna_hw_defs.h | 5 +
drivers/net/ethernet/brocade/bna/bna_types.h | 2 +-
drivers/net/ethernet/brocade/bna/bnad.c | 476 +++++++++++---------
drivers/net/ethernet/brocade/bna/bnad.h | 83 +++-
drivers/net/ethernet/brocade/bna/bnad_ethtool.c | 96 ++++-
drivers/net/ethernet/brocade/bna/cna.h | 11 +-
13 files changed, 458 insertions(+), 325 deletions(-)
^ permalink raw reply
* [net-next 01/12] bna: Naming Change and Minor Macro Fix
From: Rasesh Mody @ 2011-08-22 22:40 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Naming changes: rename devid, BNAD_MAX_TXS, BNAD_MAX_RXS,
BNAD_MAX_RXPS_PER_RX to device, BNAD_MAX_TX, BNAD_MAX_RX,
BNAD_MAX_RXP_PER_RX respectively and change all the references.
Macro Fix: Add ioc_isr_mod_set check to bfa_nw_ioc_mbox_regisr macro
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bfa_defs.h | 8 ++++----
drivers/net/ethernet/brocade/bna/bfa_ioc.h | 6 ++++--
drivers/net/ethernet/brocade/bna/bnad.c | 6 +++---
drivers/net/ethernet/brocade/bna/bnad.h | 20 ++++++++++----------
4 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bfa_defs.h b/drivers/net/ethernet/brocade/bna/bfa_defs.h
index 205b92b..a81c0cc 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_defs.h
+++ b/drivers/net/ethernet/brocade/bna/bfa_defs.h
@@ -251,10 +251,10 @@ struct bfa_mfg_block {
* ---------------------- pci definitions ------------
*/
-#define bfa_asic_id_ct(devid) \
- ((devid) == PCI_DEVICE_ID_BROCADE_CT || \
- (devid) == PCI_DEVICE_ID_BROCADE_CT_FC)
-#define bfa_asic_id_ctc(devid) (bfa_asic_id_ct(devid))
+#define bfa_asic_id_ct(device) \
+ ((device) == PCI_DEVICE_ID_BROCADE_CT || \
+ (device) == PCI_DEVICE_ID_BROCADE_CT_FC)
+#define bfa_asic_id_ctc(device) (bfa_asic_id_ct(device))
enum bfa_mode {
BFA_MODE_HBA = 1,
diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.h b/drivers/net/ethernet/brocade/bna/bfa_ioc.h
index f5a3d4e..9116324 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_ioc.h
+++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.h
@@ -274,8 +274,10 @@ void bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
(__ioc)->asic_mode))
-#define bfa_ioc_isr_mode_set(__ioc, __msix) \
- ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix))
+#define bfa_ioc_isr_mode_set(__ioc, __msix) do { \
+ if ((__ioc)->ioc_hwif->ioc_isr_mode_set) \
+ ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)); \
+} while (0)
#define bfa_ioc_ownership_reset(__ioc) \
((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index bdfda07..d18ffb3 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -1001,7 +1001,7 @@ bnad_cb_rx_cleanup(struct bnad *bnad, struct bna_rx *rx)
mdelay(BNAD_TXRX_SYNC_MDELAY);
- for (i = 0; i < BNAD_MAX_RXPS_PER_RX; i++) {
+ for (i = 0; i < BNAD_MAX_RXP_PER_RX; i++) {
rx_ctrl = &rx_info->rx_ctrl[i];
ccb = rx_ctrl->ccb;
if (!ccb)
@@ -1030,7 +1030,7 @@ bnad_cb_rx_post(struct bnad *bnad, struct bna_rx *rx)
int i;
int j;
- for (i = 0; i < BNAD_MAX_RXPS_PER_RX; i++) {
+ for (i = 0; i < BNAD_MAX_RXP_PER_RX; i++) {
rx_ctrl = &rx_info->rx_ctrl[i];
ccb = rx_ctrl->ccb;
if (!ccb)
@@ -2227,7 +2227,7 @@ bnad_q_num_init(struct bnad *bnad)
int rxps;
rxps = min((uint)num_online_cpus(),
- (uint)(BNAD_MAX_RXS * BNAD_MAX_RXPS_PER_RX));
+ (uint)(BNAD_MAX_RX * BNAD_MAX_RXP_PER_RX));
if (!(bnad->cfg_flags & BNAD_CF_MSIX))
rxps = 1; /* INTx */
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index 5b5451e..3c23139 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -38,12 +38,12 @@
#define BNAD_TXQ_DEPTH 2048
#define BNAD_RXQ_DEPTH 2048
-#define BNAD_MAX_TXS 1
+#define BNAD_MAX_TX 1
#define BNAD_MAX_TXQ_PER_TX 8 /* 8 priority queues */
#define BNAD_TXQ_NUM 1
-#define BNAD_MAX_RXS 1
-#define BNAD_MAX_RXPS_PER_RX 16
+#define BNAD_MAX_RX 1
+#define BNAD_MAX_RXP_PER_RX 16
#define BNAD_MAX_RXQ_PER_RXP 2
/*
@@ -190,7 +190,7 @@ struct bnad_tx_info {
struct bnad_rx_info {
struct bna_rx *rx; /* 1:1 between rx_info & rx */
- struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXPS_PER_RX];
+ struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXP_PER_RX];
u32 rx_id;
} ____cacheline_aligned;
@@ -234,8 +234,8 @@ struct bnad {
struct net_device *netdev;
/* Data path */
- struct bnad_tx_info tx_info[BNAD_MAX_TXS];
- struct bnad_rx_info rx_info[BNAD_MAX_RXS];
+ struct bnad_tx_info tx_info[BNAD_MAX_TX];
+ struct bnad_rx_info rx_info[BNAD_MAX_RX];
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
/*
@@ -255,8 +255,8 @@ struct bnad {
u8 tx_coalescing_timeo;
u8 rx_coalescing_timeo;
- struct bna_rx_config rx_config[BNAD_MAX_RXS];
- struct bna_tx_config tx_config[BNAD_MAX_TXS];
+ struct bna_rx_config rx_config[BNAD_MAX_RX];
+ struct bna_tx_config tx_config[BNAD_MAX_TX];
void __iomem *bar0; /* BAR0 address */
@@ -283,8 +283,8 @@ struct bnad {
/* Control path resources, memory & irq */
struct bna_res_info res_info[BNA_RES_T_MAX];
struct bna_res_info mod_res_info[BNA_MOD_RES_T_MAX];
- struct bnad_tx_res_info tx_res_info[BNAD_MAX_TXS];
- struct bnad_rx_res_info rx_res_info[BNAD_MAX_RXS];
+ struct bnad_tx_res_info tx_res_info[BNAD_MAX_TX];
+ struct bnad_rx_res_info rx_res_info[BNAD_MAX_RX];
struct bnad_completion bnad_completions;
--
1.7.1
^ permalink raw reply related
* [net-next 02/12] bna: PCI Probe Fix
From: Rasesh Mody @ 2011-08-22 22:40 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Return error as -EIO if bnad_res_alloc fails
- Release the configuration lock before registering with net_device layer.
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index d18ffb3..3f19a4d 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -3253,8 +3253,10 @@ bnad_pci_probe(struct pci_dev *pdev,
spin_unlock_irqrestore(&bnad->bna_lock, flags);
err = bnad_res_alloc(bnad, &bnad->mod_res_info[0], BNA_MOD_RES_T_MAX);
- if (err)
+ if (err) {
+ err = -EIO;
goto disable_ioceth;
+ }
spin_lock_irqsave(&bnad->bna_lock, flags);
bna_mod_init(&bnad->bna, &bnad->mod_res_info[0]);
@@ -3266,6 +3268,8 @@ bnad_pci_probe(struct pci_dev *pdev,
bnad_set_netdev_perm_addr(bnad);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
+ mutex_unlock(&bnad->conf_mutex);
+
/* Finally, reguister with net_device layer */
err = register_netdev(netdev);
if (err) {
@@ -3274,6 +3278,8 @@ bnad_pci_probe(struct pci_dev *pdev,
}
set_bit(BNAD_RF_NETDEV_REGISTERED, &bnad->run_flags);
+ return 0;
+
probe_success:
mutex_unlock(&bnad->conf_mutex);
return 0;
--
1.7.1
^ permalink raw reply related
* [net-next 03/12] bna: Interrupt Polling and NAPI Init Changes
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Remove unnecessary ccb check from bnad_poll_cq
- Add bnad pointer to rx_ctrl structure, so that bnad can be accessed directly
from rx_ctrl in the NAPI poll routines, even if ccb is NULL
- Validate ccb before referencing to it in bnad_msix_rx and bnad_napi_poll_rx
- Fix the order of NAPI init / uninit in Tx / Rx setup / teardown path:
a. Kill bnad tx free tasklet ahead of call to bna_tx_destroy()
b. Call NAPI disable only after call to Rx free_irq(). This makes sure Rx
interrupt does not schedule a poll when NAPI is already disabled
- NAPI poll runs before the h/w has completed configuration. This causes a
crash. Delay enabling NAPI till after bna_rx_enable(). Split NAPI
initialization into 2 steps, bnad_napi_init() & bnad_napi_enable().
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 83 ++++++++++++++++++++-----------
drivers/net/ethernet/brocade/bna/bnad.h | 1 +
2 files changed, 54 insertions(+), 30 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 3f19a4d..095eac9 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -535,16 +535,11 @@ next:
BNA_QE_INDX_ADD(ccb->producer_index, wis, ccb->q_depth);
- if (likely(ccb)) {
- if (likely(test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags)))
- bna_ib_ack(ccb->i_dbell, packets);
- bnad_refill_rxq(bnad, ccb->rcb[0]);
- if (ccb->rcb[1])
- bnad_refill_rxq(bnad, ccb->rcb[1]);
- } else {
- if (likely(test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags)))
- bna_ib_ack(ccb->i_dbell, 0);
- }
+ if (likely(test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags)))
+ bna_ib_ack(ccb->i_dbell, packets);
+ bnad_refill_rxq(bnad, ccb->rcb[0]);
+ if (ccb->rcb[1])
+ bnad_refill_rxq(bnad, ccb->rcb[1]);
clear_bit(BNAD_FP_IN_RX_PATH, &rx_ctrl->flags);
@@ -590,9 +585,9 @@ static irqreturn_t
bnad_msix_rx(int irq, void *data)
{
struct bna_ccb *ccb = (struct bna_ccb *)data;
- struct bnad *bnad = ccb->bnad;
- bnad_netif_rx_schedule_poll(bnad, ccb);
+ if (ccb)
+ bnad_netif_rx_schedule_poll(ccb->bnad, ccb);
return IRQ_HANDLED;
}
@@ -1658,18 +1653,14 @@ bnad_napi_poll_rx(struct napi_struct *napi, int budget)
{
struct bnad_rx_ctrl *rx_ctrl =
container_of(napi, struct bnad_rx_ctrl, napi);
- struct bna_ccb *ccb;
- struct bnad *bnad;
+ struct bnad *bnad = rx_ctrl->bnad;
int rcvd = 0;
- ccb = rx_ctrl->ccb;
-
- bnad = ccb->bnad;
if (!netif_carrier_ok(bnad->netdev))
goto poll_exit;
- rcvd = bnad_poll_cq(bnad, ccb, budget);
+ rcvd = bnad_poll_cq(bnad, rx_ctrl->ccb, budget);
if (rcvd == budget)
return rcvd;
@@ -1678,12 +1669,15 @@ poll_exit:
BNAD_UPDATE_CTR(bnad, netif_rx_complete);
- bnad_enable_rx_irq(bnad, ccb);
+
+ if (rx_ctrl->ccb)
+ bnad_enable_rx_irq(bnad, rx_ctrl->ccb);
return rcvd;
}
+#define BNAD_NAPI_POLL_QUOTA 64
static void
-bnad_napi_enable(struct bnad *bnad, u32 rx_id)
+bnad_napi_init(struct bnad *bnad, u32 rx_id)
{
struct bnad_rx_ctrl *rx_ctrl;
int i;
@@ -1691,9 +1685,20 @@ bnad_napi_enable(struct bnad *bnad, u32 rx_id)
/* Initialize & enable NAPI */
for (i = 0; i < bnad->num_rxp_per_rx; i++) {
rx_ctrl = &bnad->rx_info[rx_id].rx_ctrl[i];
-
netif_napi_add(bnad->netdev, &rx_ctrl->napi,
- bnad_napi_poll_rx, 64);
+ bnad_napi_poll_rx, BNAD_NAPI_POLL_QUOTA);
+ }
+}
+
+static void
+bnad_napi_enable(struct bnad *bnad, u32 rx_id)
+{
+ struct bnad_rx_ctrl *rx_ctrl;
+ int i;
+
+ /* Initialize & enable NAPI */
+ for (i = 0; i < bnad->num_rxp_per_rx; i++) {
+ rx_ctrl = &bnad->rx_info[rx_id].rx_ctrl[i];
napi_enable(&rx_ctrl->napi);
}
@@ -1732,6 +1737,9 @@ bnad_cleanup_tx(struct bnad *bnad, u32 tx_id)
bnad_tx_msix_unregister(bnad, tx_info,
bnad->num_txq_per_tx);
+ if (0 == tx_id)
+ tasklet_kill(&bnad->tx_free_tasklet);
+
spin_lock_irqsave(&bnad->bna_lock, flags);
bna_tx_destroy(tx_info->tx);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
@@ -1739,9 +1747,6 @@ bnad_cleanup_tx(struct bnad *bnad, u32 tx_id)
tx_info->tx = NULL;
tx_info->tx_id = 0;
- if (0 == tx_id)
- tasklet_kill(&bnad->tx_free_tasklet);
-
bnad_tx_res_free(bnad, res_info);
}
@@ -1852,6 +1857,16 @@ bnad_init_rx_config(struct bnad *bnad, struct bna_rx_config *rx_config)
rx_config->vlan_strip_status = BNA_STATUS_T_ENABLED;
}
+static void
+bnad_rx_ctrl_init(struct bnad *bnad, u32 rx_id)
+{
+ struct bnad_rx_info *rx_info = &bnad->rx_info[rx_id];
+ int i;
+
+ for (i = 0; i < bnad->num_rxp_per_rx; i++)
+ rx_info->rx_ctrl[i].bnad = bnad;
+}
+
/* Called with mutex_lock(&bnad->conf_mutex) held */
void
bnad_cleanup_rx(struct bnad *bnad, u32 rx_id)
@@ -1875,8 +1890,6 @@ bnad_cleanup_rx(struct bnad *bnad, u32 rx_id)
del_timer_sync(&bnad->dim_timer);
}
- bnad_napi_disable(bnad, rx_id);
-
init_completion(&bnad->bnad_completions.rx_comp);
spin_lock_irqsave(&bnad->bna_lock, flags);
bna_rx_disable(rx_info->rx, BNA_HARD_CLEANUP, bnad_cb_rx_disabled);
@@ -1886,6 +1899,8 @@ bnad_cleanup_rx(struct bnad *bnad, u32 rx_id)
if (rx_info->rx_ctrl[0].ccb->intr_type == BNA_INTR_T_MSIX)
bnad_rx_msix_unregister(bnad, rx_info, rx_config->num_paths);
+ bnad_napi_disable(bnad, rx_id);
+
spin_lock_irqsave(&bnad->bna_lock, flags);
bna_rx_destroy(rx_info->rx);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
@@ -1939,6 +1954,8 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id)
if (err)
return err;
+ bnad_rx_ctrl_init(bnad, rx_id);
+
/* Ask BNA to create one Rx object, supplying required resources */
spin_lock_irqsave(&bnad->bna_lock, flags);
rx = bna_rx_create(&bnad->bna, bnad, rx_config, &rx_cbfn, res_info,
@@ -1948,6 +1965,12 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id)
goto err_return;
rx_info->rx = rx;
+ /*
+ * Init NAPI, so that state is set to NAPI_STATE_SCHED,
+ * so that IRQ handler cannot schedule NAPI at this point.
+ */
+ bnad_napi_init(bnad, rx_id);
+
/* Register ISR for the Rx object */
if (intr_info->intr_type == BNA_INTR_T_MSIX) {
err = bnad_rx_msix_register(bnad, rx_info, rx_id,
@@ -1956,9 +1979,6 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id)
goto err_return;
}
- /* Enable NAPI */
- bnad_napi_enable(bnad, rx_id);
-
spin_lock_irqsave(&bnad->bna_lock, flags);
if (0 == rx_id) {
/* Set up Dynamic Interrupt Moderation Vector */
@@ -1975,6 +1995,9 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id)
bna_rx_enable(rx);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
+ /* Enable scheduling of NAPI */
+ bnad_napi_enable(bnad, rx_id);
+
return 0;
err_return:
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index 3c23139..60c2e9d 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -53,6 +53,7 @@
*/
struct bnad_rx_ctrl {
struct bna_ccb *ccb;
+ struct bnad *bnad;
unsigned long flags;
struct napi_struct napi;
};
--
1.7.1
^ permalink raw reply related
* [net-next 04/12] bna: TX Path and RX Path Changes
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Add BNAD_PCI_UNMAP_SKB macro to unmap skb from transmit path. Add more
checks for illegal skbs in transmit path. Add tx_skb counters for dropped
skbs.
- Disable and enable interrupts from the same polling context to prevent
reordering in Rx path.
- Add Rx NAPI debug counters.
- Make NAPI budget check more generic.
- Add a macro bnad_dim_timer_stop for DIM(Dynamic Interrupt Moderation)
timer stop.
- Handle reduced MSI-X vectors case in bnad_enable_msix.
- Check for single frame TSO skbs and send them out as non-TSO.
- Put memory barrier after bna_txq_prod_indx_doorbell().
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 259 +++++++++++++++++++------------
drivers/net/ethernet/brocade/bna/bnad.h | 35 ++++-
2 files changed, 195 insertions(+), 99 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 095eac9..802d3f1 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -74,6 +74,24 @@ do { \
#define BNAD_TXRX_SYNC_MDELAY 250 /* 250 msecs */
+#define BNAD_PCI_UNMAP_SKB(_pdev, _array, _index, _depth, _skb, _frag) \
+{ \
+ int j; \
+ (_array)[_index].skb = NULL; \
+ dma_unmap_single(_pdev, dma_unmap_addr(&(_array)[_index], dma_addr), \
+ skb_headlen(_skb), DMA_TO_DEVICE); \
+ dma_unmap_addr_set(&(_array)[_index], dma_addr, 0); \
+ BNA_QE_INDX_ADD(_index, 1, _depth); \
+ for (j = 0; j < (_frag); j++) { \
+ prefetch(&(_array)[(_index) + 1]); \
+ dma_unmap_page(_pdev, dma_unmap_addr(&(_array)[_index], \
+ dma_addr), \
+ skb_shinfo(_skb)->frags[j].size, DMA_TO_DEVICE); \
+ dma_unmap_addr_set(&(_array)[_index], dma_addr, 0); \
+ BNA_QE_INDX_ADD(_index, 1, _depth); \
+ } \
+}
+
/*
* Reinitialize completions in CQ, once Rx is taken down
*/
@@ -169,7 +187,6 @@ bnad_free_txbufs(struct bnad *bnad,
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
struct bnad_skb_unmap *unmap_array;
struct sk_buff *skb;
- int i;
/*
* Just return if TX is stopped. This check is useful
@@ -195,32 +212,14 @@ bnad_free_txbufs(struct bnad *bnad,
while (wis) {
skb = unmap_array[unmap_cons].skb;
- unmap_array[unmap_cons].skb = NULL;
-
sent_packets++;
sent_bytes += skb->len;
wis -= BNA_TXQ_WI_NEEDED(1 + skb_shinfo(skb)->nr_frags);
- dma_unmap_single(&bnad->pcidev->dev,
- dma_unmap_addr(&unmap_array[unmap_cons],
- dma_addr), skb_headlen(skb),
- DMA_TO_DEVICE);
- dma_unmap_addr_set(&unmap_array[unmap_cons], dma_addr, 0);
- BNA_QE_INDX_ADD(unmap_cons, 1, unmap_q->q_depth);
+ BNAD_PCI_UNMAP_SKB(&bnad->pcidev->dev, unmap_array, unmap_cons,
+ unmap_q->q_depth, skb,
+ skb_shinfo(skb)->nr_frags);
- prefetch(&unmap_array[unmap_cons + 1]);
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
- prefetch(&unmap_array[unmap_cons + 1]);
-
- dma_unmap_page(&bnad->pcidev->dev,
- dma_unmap_addr(&unmap_array[unmap_cons],
- dma_addr),
- skb_shinfo(skb)->frags[i].size,
- DMA_TO_DEVICE);
- dma_unmap_addr_set(&unmap_array[unmap_cons], dma_addr,
- 0);
- BNA_QE_INDX_ADD(unmap_cons, 1, unmap_q->q_depth);
- }
dev_kfree_skb_any(skb);
}
@@ -536,7 +535,8 @@ next:
BNA_QE_INDX_ADD(ccb->producer_index, wis, ccb->q_depth);
if (likely(test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags)))
- bna_ib_ack(ccb->i_dbell, packets);
+ bna_ib_ack_disable_irq(ccb->i_dbell, packets);
+
bnad_refill_rxq(bnad, ccb->rcb[0]);
if (ccb->rcb[1])
bnad_refill_rxq(bnad, ccb->rcb[1]);
@@ -574,10 +574,9 @@ bnad_netif_rx_schedule_poll(struct bnad *bnad, struct bna_ccb *ccb)
struct napi_struct *napi = &rx_ctrl->napi;
if (likely(napi_schedule_prep(napi))) {
- bnad_disable_rx_irq(bnad, ccb);
__napi_schedule(napi);
+ rx_ctrl->rx_schedule++;
}
- BNAD_UPDATE_CTR(bnad, netif_rx_schedule);
}
/* MSIX Rx Path Handler */
@@ -586,8 +585,10 @@ bnad_msix_rx(int irq, void *data)
{
struct bna_ccb *ccb = (struct bna_ccb *)data;
- if (ccb)
+ if (ccb) {
+ ((struct bnad_rx_ctrl *)(ccb->ctrl))->rx_intr_ctr++;
bnad_netif_rx_schedule_poll(ccb->bnad, ccb);
+ }
return IRQ_HANDLED;
}
@@ -1656,22 +1657,23 @@ bnad_napi_poll_rx(struct napi_struct *napi, int budget)
struct bnad *bnad = rx_ctrl->bnad;
int rcvd = 0;
+ rx_ctrl->rx_poll_ctr++;
if (!netif_carrier_ok(bnad->netdev))
goto poll_exit;
rcvd = bnad_poll_cq(bnad, rx_ctrl->ccb, budget);
- if (rcvd == budget)
+ if (rcvd >= budget)
return rcvd;
poll_exit:
napi_complete((napi));
- BNAD_UPDATE_CTR(bnad, netif_rx_complete);
-
+ rx_ctrl->rx_complete++;
if (rx_ctrl->ccb)
- bnad_enable_rx_irq(bnad, rx_ctrl->ccb);
+ bnad_enable_rx_irq_unsafe(rx_ctrl->ccb);
+
return rcvd;
}
@@ -1875,20 +1877,14 @@ bnad_cleanup_rx(struct bnad *bnad, u32 rx_id)
struct bna_rx_config *rx_config = &bnad->rx_config[rx_id];
struct bna_res_info *res_info = &bnad->rx_res_info[rx_id].res_info[0];
unsigned long flags;
- int dim_timer_del = 0;
if (!rx_info->rx)
return;
- if (0 == rx_id) {
- spin_lock_irqsave(&bnad->bna_lock, flags);
- dim_timer_del = bnad_dim_timer_running(bnad);
- if (dim_timer_del)
- clear_bit(BNAD_RF_DIM_TIMER_RUNNING, &bnad->run_flags);
- spin_unlock_irqrestore(&bnad->bna_lock, flags);
- if (dim_timer_del)
- del_timer_sync(&bnad->dim_timer);
- }
+ spin_lock_irqsave(&bnad->bna_lock, flags);
+ if (0 == rx_id)
+ bnad_dim_timer_stop(bnad, flags);
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
init_completion(&bnad->bnad_completions.rx_comp);
spin_lock_irqsave(&bnad->bna_lock, flags);
@@ -2382,12 +2378,11 @@ bnad_enable_msix(struct bnad *bnad)
spin_lock_irqsave(&bnad->bna_lock, flags);
/* ret = #of vectors that we got */
- bnad_q_num_adjust(bnad, ret, 0);
+ bnad_q_num_adjust(bnad, (ret - BNAD_MAILBOX_MSIX_VECTORS) / 2,
+ (ret - BNAD_MAILBOX_MSIX_VECTORS) / 2);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
- bnad->msix_num = (bnad->num_tx * bnad->num_txq_per_tx)
- + (bnad->num_rx
- * bnad->num_rxp_per_rx) +
+ bnad->msix_num = BNAD_NUM_TXQ + BNAD_NUM_RXP +
BNAD_MAILBOX_MSIX_VECTORS;
if (bnad->msix_num > ret)
@@ -2544,15 +2539,26 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
u32 unmap_prod, wis, wis_used, wi_range;
u32 vectors, vect_id, i, acked;
int err;
+ unsigned int len;
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
dma_addr_t dma_addr;
struct bna_txq_entry *txqent;
u16 flags;
- if (unlikely
- (skb->len <= ETH_HLEN || skb->len > BFI_TX_MAX_DATA_PER_PKT)) {
+ if (unlikely(skb->len <= ETH_HLEN)) {
dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_too_short);
+ return NETDEV_TX_OK;
+ }
+ if (unlikely(skb_headlen(skb) > BFI_TX_MAX_DATA_PER_VECTOR)) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_headlen_too_long);
+ return NETDEV_TX_OK;
+ }
+ if (unlikely(skb_headlen(skb) == 0)) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_headlen_zero);
return NETDEV_TX_OK;
}
@@ -2562,12 +2568,14 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
*/
if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags))) {
dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_stopping);
return NETDEV_TX_OK;
}
vectors = 1 + skb_shinfo(skb)->nr_frags;
- if (vectors > BFI_TX_MAX_VECTORS_PER_PKT) {
+ if (unlikely(vectors > BFI_TX_MAX_VECTORS_PER_PKT)) {
dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_max_vectors);
return NETDEV_TX_OK;
}
wis = BNA_TXQ_WI_NEEDED(vectors); /* 4 vectors per work item */
@@ -2605,8 +2613,6 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
}
unmap_prod = unmap_q->producer_index;
- wis_used = 1;
- vect_id = 0;
flags = 0;
txq_prod = tcb->producer_index;
@@ -2614,9 +2620,6 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
BUG_ON(!(wi_range <= tcb->q_depth));
txqent->hdr.wi.reserved = 0;
txqent->hdr.wi.num_vectors = vectors;
- txqent->hdr.wi.opcode =
- htons((skb_is_gso(skb) ? BNA_TXQ_WI_SEND_LSO :
- BNA_TXQ_WI_SEND));
if (vlan_tx_tag_present(skb)) {
vlan_tag = (u16) vlan_tx_tag_get(skb);
@@ -2631,62 +2634,91 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
txqent->hdr.wi.vlan_tag = htons(vlan_tag);
if (skb_is_gso(skb)) {
+ if (unlikely(skb_is_gso(skb) > netdev->mtu)) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_mss_too_long);
+ return NETDEV_TX_OK;
+ }
+ if (unlikely((skb_is_gso(skb) + skb_transport_offset(skb) +
+ tcp_hdrlen(skb)) >= skb->len)) {
+ txqent->hdr.wi.opcode =
+ __constant_htons(BNA_TXQ_WI_SEND);
+ txqent->hdr.wi.lso_mss = 0;
+ BNAD_UPDATE_CTR(bnad, tx_skb_tso_too_short);
+ } else {
+ txqent->hdr.wi.opcode =
+ __constant_htons(BNA_TXQ_WI_SEND_LSO);
+ txqent->hdr.wi.lso_mss = htons(skb_is_gso(skb));
+ }
+
err = bnad_tso_prepare(bnad, skb);
- if (err) {
+ if (unlikely(err)) {
dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_tso_prepare);
return NETDEV_TX_OK;
}
- txqent->hdr.wi.lso_mss = htons(skb_is_gso(skb));
flags |= (BNA_TXQ_WI_CF_IP_CKSUM | BNA_TXQ_WI_CF_TCP_CKSUM);
txqent->hdr.wi.l4_hdr_size_n_offset =
htons(BNA_TXQ_WI_L4_HDR_N_OFFSET
(tcp_hdrlen(skb) >> 2,
skb_transport_offset(skb)));
- } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
- u8 proto = 0;
-
+ } else {
+ txqent->hdr.wi.opcode = __constant_htons(BNA_TXQ_WI_SEND);
txqent->hdr.wi.lso_mss = 0;
- if (skb->protocol == htons(ETH_P_IP))
- proto = ip_hdr(skb)->protocol;
- else if (skb->protocol == htons(ETH_P_IPV6)) {
- /* nexthdr may not be TCP immediately. */
- proto = ipv6_hdr(skb)->nexthdr;
+ if (unlikely(skb->len > (netdev->mtu + ETH_HLEN))) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_non_tso_too_long);
+ return NETDEV_TX_OK;
}
- if (proto == IPPROTO_TCP) {
- flags |= BNA_TXQ_WI_CF_TCP_CKSUM;
- txqent->hdr.wi.l4_hdr_size_n_offset =
- htons(BNA_TXQ_WI_L4_HDR_N_OFFSET
- (0, skb_transport_offset(skb)));
- BNAD_UPDATE_CTR(bnad, tcpcsum_offload);
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ u8 proto = 0;
- BUG_ON(!(skb_headlen(skb) >=
- skb_transport_offset(skb) + tcp_hdrlen(skb)));
-
- } else if (proto == IPPROTO_UDP) {
- flags |= BNA_TXQ_WI_CF_UDP_CKSUM;
- txqent->hdr.wi.l4_hdr_size_n_offset =
- htons(BNA_TXQ_WI_L4_HDR_N_OFFSET
- (0, skb_transport_offset(skb)));
-
- BNAD_UPDATE_CTR(bnad, udpcsum_offload);
+ if (skb->protocol == __constant_htons(ETH_P_IP))
+ proto = ip_hdr(skb)->protocol;
+ else if (skb->protocol ==
+ __constant_htons(ETH_P_IPV6)) {
+ /* nexthdr may not be TCP immediately. */
+ proto = ipv6_hdr(skb)->nexthdr;
+ }
+ if (proto == IPPROTO_TCP) {
+ flags |= BNA_TXQ_WI_CF_TCP_CKSUM;
+ txqent->hdr.wi.l4_hdr_size_n_offset =
+ htons(BNA_TXQ_WI_L4_HDR_N_OFFSET
+ (0, skb_transport_offset(skb)));
+
+ BNAD_UPDATE_CTR(bnad, tcpcsum_offload);
+
+ if (unlikely(skb_headlen(skb) <
+ skb_transport_offset(skb) + tcp_hdrlen(skb))) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_tcp_hdr);
+ return NETDEV_TX_OK;
+ }
- BUG_ON(!(skb_headlen(skb) >=
- skb_transport_offset(skb) +
- sizeof(struct udphdr)));
- } else {
- err = skb_checksum_help(skb);
- BNAD_UPDATE_CTR(bnad, csum_help);
- if (err) {
+ } else if (proto == IPPROTO_UDP) {
+ flags |= BNA_TXQ_WI_CF_UDP_CKSUM;
+ txqent->hdr.wi.l4_hdr_size_n_offset =
+ htons(BNA_TXQ_WI_L4_HDR_N_OFFSET
+ (0, skb_transport_offset(skb)));
+
+ BNAD_UPDATE_CTR(bnad, udpcsum_offload);
+ if (unlikely(skb_headlen(skb) <
+ skb_transport_offset(skb) +
+ sizeof(struct udphdr))) {
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_udp_hdr);
+ return NETDEV_TX_OK;
+ }
+ } else {
dev_kfree_skb(skb);
- BNAD_UPDATE_CTR(bnad, csum_help_err);
+ BNAD_UPDATE_CTR(bnad, tx_skb_csum_err);
return NETDEV_TX_OK;
}
+ } else {
+ txqent->hdr.wi.l4_hdr_size_n_offset = 0;
}
- } else {
- txqent->hdr.wi.lso_mss = 0;
- txqent->hdr.wi.l4_hdr_size_n_offset = 0;
}
txqent->hdr.wi.flags = htons(flags);
@@ -2694,20 +2726,38 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
txqent->hdr.wi.frame_length = htonl(skb->len);
unmap_q->unmap_array[unmap_prod].skb = skb;
- BUG_ON(!(skb_headlen(skb) <= BFI_TX_MAX_DATA_PER_VECTOR));
- txqent->vector[vect_id].length = htons(skb_headlen(skb));
+ len = skb_headlen(skb);
+ txqent->vector[0].length = htons(len);
dma_addr = dma_map_single(&bnad->pcidev->dev, skb->data,
skb_headlen(skb), DMA_TO_DEVICE);
dma_unmap_addr_set(&unmap_q->unmap_array[unmap_prod], dma_addr,
dma_addr);
- BNA_SET_DMA_ADDR(dma_addr, &txqent->vector[vect_id].host_addr);
+ BNA_SET_DMA_ADDR(dma_addr, &txqent->vector[0].host_addr);
BNA_QE_INDX_ADD(unmap_prod, 1, unmap_q->q_depth);
+ vect_id = 0;
+ wis_used = 1;
+
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i];
u16 size = frag->size;
+ if (unlikely(size == 0)) {
+ unmap_prod = unmap_q->producer_index;
+ prefetch(&unmap_q->unmap_array[unmap_prod + 1]);
+
+ BNAD_PCI_UNMAP_SKB(&bnad->pcidev->dev,
+ unmap_q->unmap_array,
+ unmap_prod, unmap_q->q_depth, skb,
+ i);
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_frag_zero);
+ return NETDEV_TX_OK;
+ }
+
+ len += size;
+
if (++vect_id == BFI_TX_MAX_VECTORS_PER_WI) {
vect_id = 0;
if (--wi_range)
@@ -2718,10 +2768,10 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
wis_used = 0;
BNA_TXQ_QPGE_PTR_GET(txq_prod, tcb->sw_qpt,
txqent, wi_range);
- BUG_ON(!(wi_range <= tcb->q_depth));
}
wis_used++;
- txqent->hdr.wi_ext.opcode = htons(BNA_TXQ_WI_EXTENSION);
+ txqent->hdr.wi_ext.opcode =
+ __constant_htons(BNA_TXQ_WI_EXTENSION);
}
BUG_ON(!(size <= BFI_TX_MAX_DATA_PER_VECTOR));
@@ -2734,6 +2784,18 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
BNA_QE_INDX_ADD(unmap_prod, 1, unmap_q->q_depth);
}
+ if (unlikely(len != skb->len)) {
+ unmap_prod = unmap_q->producer_index;
+ prefetch(&unmap_q->unmap_array[unmap_prod + 1]);
+
+ BNAD_PCI_UNMAP_SKB(&bnad->pcidev->dev, unmap_q->unmap_array,
+ unmap_prod, unmap_q->q_depth, skb,
+ skb_shinfo(skb)->nr_frags);
+ dev_kfree_skb(skb);
+ BNAD_UPDATE_CTR(bnad, tx_skb_len_mismatch);
+ return NETDEV_TX_OK;
+ }
+
unmap_q->producer_index = unmap_prod;
BNA_QE_INDX_ADD(txq_prod, wis_used, tcb->q_depth);
tcb->producer_index = txq_prod;
@@ -2744,6 +2806,7 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
return NETDEV_TX_OK;
bna_txq_prod_indx_doorbell(tcb);
+ smp_mb();
if ((u16) (*tcb->hw_consumer_index) != tcb->consumer_index)
tasklet_schedule(&bnad->tx_free_tasklet);
@@ -2810,6 +2873,9 @@ bnad_set_rx_mode(struct net_device *netdev)
}
}
+ if (bnad->rx_info[0].rx == NULL)
+ goto unlock;
+
bna_rx_mode_set(bnad->rx_info[0].rx, new_mask, valid_mask, NULL);
if (!netdev_mc_empty(netdev)) {
@@ -2962,12 +3028,9 @@ bnad_netpoll(struct net_device *netdev)
continue;
for (j = 0; j < bnad->num_rxp_per_rx; j++) {
rx_ctrl = &rx_info->rx_ctrl[j];
- if (rx_ctrl->ccb) {
- bnad_disable_rx_irq(bnad,
- rx_ctrl->ccb);
+ if (rx_ctrl->ccb)
bnad_netif_rx_schedule_poll(bnad,
rx_ctrl->ccb);
- }
}
}
}
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index 60c2e9d..8a31882 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -56,6 +56,11 @@ struct bnad_rx_ctrl {
struct bnad *bnad;
unsigned long flags;
struct napi_struct napi;
+ u64 rx_intr_ctr;
+ u64 rx_poll_ctr;
+ u64 rx_schedule;
+ u64 rx_keep_poll;
+ u64 rx_complete;
};
#define BNAD_RXMODE_PROMISC_DEFAULT BNA_RXMODE_PROMISC
@@ -148,6 +153,20 @@ struct bnad_drv_stats {
u64 udpcsum_offload;
u64 csum_help;
u64 csum_help_err;
+ u64 tx_skb_too_short;
+ u64 tx_skb_stopping;
+ u64 tx_skb_max_vectors;
+ u64 tx_skb_mss_too_long;
+ u64 tx_skb_tso_too_short;
+ u64 tx_skb_tso_prepare;
+ u64 tx_skb_non_tso_too_long;
+ u64 tx_skb_tcp_hdr;
+ u64 tx_skb_udp_hdr;
+ u64 tx_skb_csum_err;
+ u64 tx_skb_headlen_too_long;
+ u64 tx_skb_headlen_zero;
+ u64 tx_skb_frag_zero;
+ u64 tx_skb_len_mismatch;
u64 hw_stats_updates;
u64 netif_rx_schedule;
@@ -346,7 +365,7 @@ extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
#define bnad_enable_rx_irq_unsafe(_ccb) \
{ \
- if (likely(test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags))) {\
+ if (likely(test_bit(BNAD_RXQ_STARTED, &(_ccb)->rcb[0]->flags))) {\
bna_ib_coalescing_timer_set((_ccb)->i_dbell, \
(_ccb)->rx_coalescing_timeo); \
bna_ib_ack((_ccb)->i_dbell, 0); \
@@ -356,5 +375,19 @@ extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
#define bnad_dim_timer_running(_bnad) \
(((_bnad)->cfg_flags & BNAD_CF_DIM_ENABLED) && \
(test_bit(BNAD_RF_DIM_TIMER_RUNNING, &((_bnad)->run_flags))))
+#define bnad_dim_timer_stop(_bnad, _flags) \
+do { \
+ int to_del = 0; \
+ \
+ if ((_bnad)->cfg_flags & BNAD_CF_DIM_ENABLED && \
+ test_bit(BNAD_RF_DIM_TIMER_RUNNING, &(_bnad)->run_flags)) {\
+ clear_bit(BNAD_RF_DIM_TIMER_RUNNING, &(_bnad)->run_flags);\
+ to_del = 1; \
+ } \
+ spin_unlock_irqrestore(&(_bnad)->bna_lock, (_flags)); \
+ if (to_del) \
+ del_timer_sync(&(_bnad)->dim_timer); \
+ spin_lock_irqsave(&(_bnad)->bna_lock, (_flags));\
+} while (0)
#endif /* __BNAD_H__ */
--
1.7.1
^ permalink raw reply related
* [net-next 05/12] bna: Formatting and Code Cleanup
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Print log messages when running with reduced number of MSI-X vectors
and when defaulting to INTx mode.
- Remove BUG_ONs and header file inclusion that are not needed
- Comments addition/cleanup
- Unused code cleanup
- Add New Line to Print msg in bfa_sm_fault
- Formatting fix
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bfa_cee.c | 2 -
.../net/ethernet/brocade/bna/bfa_defs_mfg_comm.h | 1 -
drivers/net/ethernet/brocade/bna/bfi.h | 46 --------------------
drivers/net/ethernet/brocade/bna/bna.h | 18 +++-----
drivers/net/ethernet/brocade/bna/bna_types.h | 1 -
drivers/net/ethernet/brocade/bna/bnad.c | 46 ++++++--------------
drivers/net/ethernet/brocade/bna/bnad.h | 13 +++---
drivers/net/ethernet/brocade/bna/cna.h | 11 ++---
8 files changed, 31 insertions(+), 107 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bfa_cee.c b/drivers/net/ethernet/brocade/bna/bfa_cee.c
index b45b8eb..8e62718 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_cee.c
+++ b/drivers/net/ethernet/brocade/bna/bfa_cee.c
@@ -16,8 +16,6 @@
* www.brocade.com
*/
-#include "bfa_defs_cna.h"
-#include "cna.h"
#include "bfa_cee.h"
#include "bfi_cna.h"
#include "bfa_ioc.h"
diff --git a/drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h b/drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h
index 7ddd16f..7e5df90 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h
+++ b/drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h
@@ -18,7 +18,6 @@
#ifndef __BFA_DEFS_MFG_COMM_H__
#define __BFA_DEFS_MFG_COMM_H__
-#include "cna.h"
#include "bfa_defs.h"
/**
diff --git a/drivers/net/ethernet/brocade/bna/bfi.h b/drivers/net/ethernet/brocade/bna/bfi.h
index 19654cc..4e04c14 100644
--- a/drivers/net/ethernet/brocade/bna/bfi.h
+++ b/drivers/net/ethernet/brocade/bna/bfi.h
@@ -73,20 +73,6 @@ struct bfi_mhdr {
****************************************************************************
*/
-#define BFI_SGE_INLINE 1
-#define BFI_SGE_INLINE_MAX (BFI_SGE_INLINE + 1)
-
-/**
- * SG Flags
- */
-enum {
- BFI_SGE_DATA = 0, /*!< data address, not last */
- BFI_SGE_DATA_CPL = 1, /*!< data addr, last in current page */
- BFI_SGE_DATA_LAST = 3, /*!< data address, last */
- BFI_SGE_LINK = 2, /*!< link address */
- BFI_SGE_PGDLEN = 2, /*!< cumulative data length for page */
-};
-
/**
* DMA addresses
*/
@@ -97,33 +83,6 @@ union bfi_addr_u {
} a32;
};
-/**
- * Scatter Gather Element
- */
-struct bfi_sge {
-#ifdef __BIGENDIAN
- u32 flags:2,
- rsvd:2,
- sg_len:28;
-#else
- u32 sg_len:28,
- rsvd:2,
- flags:2;
-#endif
- union bfi_addr_u sga;
-};
-
-/**
- * Scatter Gather Page
- */
-#define BFI_SGPG_DATA_SGES 7
-#define BFI_SGPG_SGES_MAX (BFI_SGPG_DATA_SGES + 1)
-#define BFI_SGPG_RSVD_WD_LEN 8
-struct bfi_sgpg {
- struct bfi_sge sges[BFI_SGPG_SGES_MAX];
- u32 rsvd[BFI_SGPG_RSVD_WD_LEN];
-};
-
/*
* Large Message structure - 128 Bytes size Msgs
*/
@@ -131,11 +90,6 @@ struct bfi_sgpg {
#define BFI_LMSG_PL_WSZ \
((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
-struct bfi_msg {
- struct bfi_mhdr mhdr;
- u32 pl[BFI_LMSG_PL_WSZ];
-};
-
/**
* Mailbox message structure
*/
diff --git a/drivers/net/ethernet/brocade/bna/bna.h b/drivers/net/ethernet/brocade/bna/bna.h
index 2a587c5..3a6e790 100644
--- a/drivers/net/ethernet/brocade/bna/bna.h
+++ b/drivers/net/ethernet/brocade/bna/bna.h
@@ -10,12 +10,17 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
+/*
+ * Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
+ * All rights reserved
+ * www.brocade.com
+ */
#ifndef __BNA_H__
#define __BNA_H__
-#include "bfa_cs.h"
+#include "bfa_defs.h"
#include "bfa_ioc.h"
-#include "cna.h"
+#include "bfi_enet.h"
#include "bna_types.h"
extern const u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
@@ -395,12 +400,8 @@ void bna_mod_init(struct bna *bna, struct bna_res_info *res_info);
void bna_uninit(struct bna *bna);
int bna_num_txq_set(struct bna *bna, int num_txq);
int bna_num_rxp_set(struct bna *bna, int num_rxp);
-void bna_stats_get(struct bna *bna);
-void bna_get_perm_mac(struct bna *bna, u8 *mac);
void bna_hw_stats_get(struct bna *bna);
-/* APIs for Rx */
-
/* APIs for RxF */
struct bna_mac *bna_ucam_mod_mac_get(struct bna_ucam_mod *ucam_mod);
void bna_ucam_mod_mac_put(struct bna_ucam_mod *ucam_mod,
@@ -521,11 +522,6 @@ bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
void bna_rx_vlan_add(struct bna_rx *rx, int vlan_id);
void bna_rx_vlan_del(struct bna_rx *rx, int vlan_id);
void bna_rx_vlanfilter_enable(struct bna_rx *rx);
-void bna_rx_hds_enable(struct bna_rx *rx, struct bna_hds_config *hds_config,
- void (*cbfn)(struct bnad *, struct bna_rx *));
-void bna_rx_hds_disable(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *));
-
/**
* ENET
*/
diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h
index 8a6da0c..59417b1 100644
--- a/drivers/net/ethernet/brocade/bna/bna_types.h
+++ b/drivers/net/ethernet/brocade/bna/bna_types.h
@@ -21,7 +21,6 @@
#include "cna.h"
#include "bna_hw_defs.h"
#include "bfa_cee.h"
-#include "bfi_enet.h"
#include "bfa_msgq.h"
/**
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 802d3f1..b5fb265 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -382,10 +382,9 @@ bnad_alloc_n_post_rxbufs(struct bnad *bnad, struct bna_rcb *rcb)
BNA_RXQ_QPGE_PTR_GET(unmap_prod, rcb->sw_qpt, rxent, wi_range);
while (to_alloc--) {
- if (!wi_range) {
+ if (!wi_range)
BNA_RXQ_QPGE_PTR_GET(unmap_prod, rcb->sw_qpt, rxent,
wi_range);
- }
skb = netdev_alloc_skb_ip_align(bnad->netdev,
rcb->rxq->buffer_size);
if (unlikely(!skb)) {
@@ -547,27 +546,6 @@ next:
}
static void
-bnad_disable_rx_irq(struct bnad *bnad, struct bna_ccb *ccb)
-{
- if (unlikely(!test_bit(BNAD_RXQ_STARTED, &ccb->rcb[0]->flags)))
- return;
-
- bna_ib_coalescing_timer_set(ccb->i_dbell, 0);
- bna_ib_ack(ccb->i_dbell, 0);
-}
-
-static void
-bnad_enable_rx_irq(struct bnad *bnad, struct bna_ccb *ccb)
-{
- unsigned long flags;
-
- /* Because of polling context */
- spin_lock_irqsave(&bnad->bna_lock, flags);
- bnad_enable_rx_irq_unsafe(ccb);
- spin_unlock_irqrestore(&bnad->bna_lock, flags);
-}
-
-static void
bnad_netif_rx_schedule_poll(struct bnad *bnad, struct bna_ccb *ccb)
{
struct bnad_rx_ctrl *rx_ctrl = (struct bnad_rx_ctrl *)(ccb->ctrl);
@@ -1667,7 +1645,7 @@ bnad_napi_poll_rx(struct napi_struct *napi, int budget)
return rcvd;
poll_exit:
- napi_complete((napi));
+ napi_complete(napi);
rx_ctrl->rx_complete++;
@@ -2078,15 +2056,13 @@ bnad_enable_default_bcast(struct bnad *bnad)
return 0;
}
-/* Called with bnad_conf_lock() held */
+/* Called with mutex_lock(&bnad->conf_mutex) held */
static void
bnad_restore_vlans(struct bnad *bnad, u32 rx_id)
{
u16 vid;
unsigned long flags;
- BUG_ON(!(VLAN_N_VID == BFI_ENET_VLAN_ID_MAX));
-
for_each_set_bit(vid, bnad->active_vlans, VLAN_N_VID) {
spin_lock_irqsave(&bnad->bna_lock, flags);
bna_rx_vlan_add(bnad->rx_info[rx_id].rx, vid);
@@ -2195,9 +2171,6 @@ bnad_tso_prepare(struct bnad *bnad, struct sk_buff *skb)
{
int err;
- /* SKB_GSO_TCPV4 and SKB_GSO_TCPV6 is defined since 2.6.18. */
- BUG_ON(!(skb_shinfo(skb)->gso_type == SKB_GSO_TCPV4 ||
- skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6));
if (skb_header_cloned(skb)) {
err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
if (err) {
@@ -2224,7 +2197,6 @@ bnad_tso_prepare(struct bnad *bnad, struct sk_buff *skb)
} else {
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
- BUG_ON(!(skb->protocol == htons(ETH_P_IPV6)));
ipv6h->payload_len = 0;
tcp_hdr(skb)->check =
~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, 0,
@@ -2375,6 +2347,8 @@ bnad_enable_msix(struct bnad *bnad)
ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, bnad->msix_num);
if (ret > 0) {
/* Not enough MSI-X vectors. */
+ pr_warn("BNA: %d MSI-X vectors allocated < %d requested\n",
+ ret, bnad->msix_num);
spin_lock_irqsave(&bnad->bna_lock, flags);
/* ret = #of vectors that we got */
@@ -2403,6 +2377,7 @@ bnad_enable_msix(struct bnad *bnad)
return;
intx_mode:
+ pr_warn("BNA: MSI-X enable failed - operating in INTx mode\n");
kfree(bnad->msix_table);
bnad->msix_table = NULL;
@@ -2564,7 +2539,7 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
/*
* Takes care of the Tx that is scheduled between clearing the flag
- * and the netif_stop_all_queue() call.
+ * and the netif_tx_stop_all_queues() call.
*/
if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags))) {
dev_kfree_skb(skb);
@@ -2617,7 +2592,6 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
txq_prod = tcb->producer_index;
BNA_TXQ_QPGE_PTR_GET(txq_prod, tcb->sw_qpt, txqent, wi_range);
- BUG_ON(!(wi_range <= tcb->q_depth));
txqent->hdr.wi.reserved = 0;
txqent->hdr.wi.num_vectors = vectors;
@@ -3022,6 +2996,12 @@ bnad_netpoll(struct net_device *netdev)
bnad_isr(bnad->pcidev->irq, netdev);
bna_intx_enable(&bnad->bna, curr_mask);
} else {
+ /*
+ * Tx processing may happen in sending context, so no need
+ * to explicitly process completions here
+ */
+
+ /* Rx processing */
for (i = 0; i < bnad->num_rx; i++) {
rx_info = &bnad->rx_info[i];
if (!rx_info->rx)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index 8a31882..b03e3a9 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -65,8 +65,6 @@ struct bnad_rx_ctrl {
#define BNAD_RXMODE_PROMISC_DEFAULT BNA_RXMODE_PROMISC
-#define BNAD_GET_TX_ID(_skb) (0)
-
/*
* GLOBAL #defines (CONSTANTS)
*/
@@ -152,7 +150,6 @@ struct bnad_drv_stats {
u64 tcpcsum_offload;
u64 udpcsum_offload;
u64 csum_help;
- u64 csum_help_err;
u64 tx_skb_too_short;
u64 tx_skb_stopping;
u64 tx_skb_max_vectors;
@@ -169,13 +166,10 @@ struct bnad_drv_stats {
u64 tx_skb_len_mismatch;
u64 hw_stats_updates;
- u64 netif_rx_schedule;
- u64 netif_rx_complete;
u64 netif_rx_dropped;
u64 link_toggle;
u64 cee_toggle;
- u64 cee_up;
u64 rxp_info_alloc_failed;
u64 mbox_intr_disabled;
@@ -375,6 +369,13 @@ extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
#define bnad_dim_timer_running(_bnad) \
(((_bnad)->cfg_flags & BNAD_CF_DIM_ENABLED) && \
(test_bit(BNAD_RF_DIM_TIMER_RUNNING, &((_bnad)->run_flags))))
+
+/*
+ * Stops the DIM timer
+ * Called with bnad->bna_lock held
+ * Implemented as macro, since we want to use
+ * the correct flags(on stack) while unlocking.
+ */
#define bnad_dim_timer_stop(_bnad, _flags) \
do { \
int to_del = 0; \
diff --git a/drivers/net/ethernet/brocade/bna/cna.h b/drivers/net/ethernet/brocade/bna/cna.h
index 50fce15..cb48742 100644
--- a/drivers/net/ethernet/brocade/bna/cna.h
+++ b/drivers/net/ethernet/brocade/bna/cna.h
@@ -21,21 +21,18 @@
#include <linux/kernel.h>
#include <linux/types.h>
+#include <linux/mutex.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/bitops.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
+#include <linux/if_vlan.h>
#include <linux/if_ether.h>
-#include <asm/page.h>
-#include <asm/io.h>
-#include <asm/string.h>
-
-#include <linux/list.h>
#define bfa_sm_fault(__event) do { \
- pr_err("SM Assertion failure: %s: %d: event = %d", __FILE__, __LINE__, \
- __event); \
+ pr_err("SM Assertion failure: %s: %d: event = %d\n", \
+ __FILE__, __LINE__, __event); \
} while (0)
extern char bfa_version[];
--
1.7.1
^ permalink raw reply related
* [net-next 06/12] bna: Initialization and Locking Fix
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Initialize rx_id to 0 for bnad_cleanup_rx
- Return -ENOMEM in case if bna_rx_create fails
- Count the Rx buffer allocation failures in bnad_alloc_n_post_rxbufs()
- Remove unnecessary initialization of using_dac to false in bnad_pci_probe
- Release lock if error while doing bna_num_txq_set in bnad_pci_probe
- Release all the locks while doing free_netdev
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bna_hw_defs.h | 1 +
drivers/net/ethernet/brocade/bna/bnad.c | 15 ++++++++++++---
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
index 07bb792..7ecdca5 100644
--- a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
+++ b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
@@ -99,6 +99,7 @@
(_bna)->bits.error_status_bits = (__HFN_INT_ERR_MASK); \
(_bna)->bits.error_mask_bits = (__HFN_INT_ERR_MASK); \
(_bna)->bits.halt_status_bits = __HFN_INT_LL_HALT; \
+ (_bna)->bits.halt_mask_bits = __HFN_INT_LL_HALT; \
}
#define ct2_reg_addr_init(_bna, _pcidev) \
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index b5fb265..4171c6f 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -389,6 +389,7 @@ bnad_alloc_n_post_rxbufs(struct bnad *bnad, struct bna_rcb *rcb)
rcb->rxq->buffer_size);
if (unlikely(!skb)) {
BNAD_UPDATE_CTR(bnad, rxbuf_alloc_failed);
+ rcb->rxq->rxbuf_alloc_failed++;
goto finishing;
}
unmap_array[unmap_prod].skb = skb;
@@ -1880,6 +1881,7 @@ bnad_cleanup_rx(struct bnad *bnad, u32 rx_id)
spin_unlock_irqrestore(&bnad->bna_lock, flags);
rx_info->rx = NULL;
+ rx_info->rx_id = 0;
bnad_rx_res_free(bnad, res_info);
}
@@ -1935,8 +1937,10 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id)
rx = bna_rx_create(&bnad->bna, bnad, rx_config, &rx_cbfn, res_info,
rx_info);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
- if (!rx)
+ if (!rx) {
+ err = -ENOMEM;
goto err_return;
+ }
rx_info->rx = rx;
/*
@@ -3192,7 +3196,7 @@ static int __devinit
bnad_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *pcidev_id)
{
- bool using_dac = false;
+ bool using_dac;
int err;
struct bnad *bnad;
struct bna *bna;
@@ -3315,6 +3319,11 @@ bnad_pci_probe(struct pci_dev *pdev,
bna_num_rxp_set(bna, BNAD_NUM_RXP + 1))
err = -EIO;
}
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
+ if (err)
+ goto disable_ioceth;
+
+ spin_lock_irqsave(&bnad->bna_lock, flags);
bna_mod_res_req(&bnad->bna, &bnad->mod_res_info[0]);
spin_unlock_irqrestore(&bnad->bna_lock, flags);
@@ -3368,9 +3377,9 @@ drv_uninit:
bnad_uninit(bnad);
pci_uninit:
bnad_pci_uninit(pdev);
+free_netdev:
mutex_unlock(&bnad->conf_mutex);
bnad_lock_uninit(bnad);
-free_netdev:
free_netdev(netdev);
return err;
}
--
1.7.1
^ permalink raw reply related
* [net-next 07/12] bna: Ethtool Enhancements and Fix
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Use available bnad_dim_timer_stop macro in bnad_set_coalesce.
- Add tx_skb counters and NAPI debug counters to ethtool stats.
- Add rlb stats strings to bnad_net_stats_strings{} array. rlb_stats field
was added to struct bfi_enet_stats {} but the corresponding name structure
array for ethtool was not initialized with right strings, even though the
actual name structure array got expanded. This caused a NULL pointer
violation and a crash when doing ehtool -S <if_name>.
- While setting the ring parameter restore the rx, vlan configuration and
set rx mode
- Indentation fix
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 8 +-
drivers/net/ethernet/brocade/bna/bnad.h | 10 ++-
drivers/net/ethernet/brocade/bna/bnad_ethtool.c | 88 +++++++++++++++++++----
3 files changed, 84 insertions(+), 22 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 4171c6f..2f808c7 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -2015,7 +2015,7 @@ bnad_rx_coalescing_timeo_set(struct bnad *bnad)
/*
* Called with bnad->bna_lock held
*/
-static int
+int
bnad_mac_addr_set_locked(struct bnad *bnad, u8 *mac_addr)
{
int ret;
@@ -2035,7 +2035,7 @@ bnad_mac_addr_set_locked(struct bnad *bnad, u8 *mac_addr)
}
/* Should be called with conf_lock held */
-static int
+int
bnad_enable_default_bcast(struct bnad *bnad)
{
struct bnad_rx_info *rx_info = &bnad->rx_info[0];
@@ -2061,7 +2061,7 @@ bnad_enable_default_bcast(struct bnad *bnad)
}
/* Called with mutex_lock(&bnad->conf_mutex) held */
-static void
+void
bnad_restore_vlans(struct bnad *bnad, u32 rx_id)
{
u16 vid;
@@ -2812,7 +2812,7 @@ bnad_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
return stats;
}
-static void
+void
bnad_set_rx_mode(struct net_device *netdev)
{
struct bnad *bnad = netdev_priv(netdev);
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index b03e3a9..b31b893 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -328,6 +328,12 @@ extern u32 bnad_rxqs_per_cq;
*/
extern u32 *cna_get_firmware_buf(struct pci_dev *pdev);
/* Netdev entry point prototypes */
+extern void bnad_set_rx_mode(struct net_device *netdev);
+extern struct net_device_stats *bnad_get_netdev_stats(
+ struct net_device *netdev);
+extern int bnad_mac_addr_set_locked(struct bnad *bnad, u8 *mac_addr);
+extern int bnad_enable_default_bcast(struct bnad *bnad);
+extern void bnad_restore_vlans(struct bnad *bnad, u32 rx_id);
extern void bnad_set_ethtool_ops(struct net_device *netdev);
/* Configuration & setup */
@@ -366,10 +372,6 @@ extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
} \
}
-#define bnad_dim_timer_running(_bnad) \
- (((_bnad)->cfg_flags & BNAD_CF_DIM_ENABLED) && \
- (test_bit(BNAD_RF_DIM_TIMER_RUNNING, &((_bnad)->run_flags))))
-
/*
* Stops the DIM timer
* Called with bnad->bna_lock held
diff --git a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
index 1c19dce..1199f01 100644
--- a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
+++ b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
@@ -75,14 +75,25 @@ static char *bnad_net_stats_strings[BNAD_ETHTOOL_STATS_NUM] = {
"tcpcsum_offload",
"udpcsum_offload",
"csum_help",
- "csum_help_err",
+ "tx_skb_too_short",
+ "tx_skb_stopping",
+ "tx_skb_max_vectors",
+ "tx_skb_mss_too_long",
+ "tx_skb_tso_too_short",
+ "tx_skb_tso_prepare",
+ "tx_skb_non_tso_too_long",
+ "tx_skb_tcp_hdr",
+ "tx_skb_udp_hdr",
+ "tx_skb_csum_err",
+ "tx_skb_headlen_too_long",
+ "tx_skb_headlen_zero",
+ "tx_skb_frag_zero",
+ "tx_skb_len_mismatch",
"hw_stats_updates",
- "netif_rx_schedule",
- "netif_rx_complete",
"netif_rx_dropped",
"link_toggle",
- "cee_up",
+ "cee_toggle",
"rxp_info_alloc_failed",
"mbox_intr_disabled",
@@ -201,6 +212,20 @@ static char *bnad_net_stats_strings[BNAD_ETHTOOL_STATS_NUM] = {
"rad_rx_bcast_vlan",
"rad_rx_drops",
+ "rlb_rad_rx_frames",
+ "rlb_rad_rx_octets",
+ "rlb_rad_rx_vlan_frames",
+ "rlb_rad_rx_ucast",
+ "rlb_rad_rx_ucast_octets",
+ "rlb_rad_rx_ucast_vlan",
+ "rlb_rad_rx_mcast",
+ "rlb_rad_rx_mcast_octets",
+ "rlb_rad_rx_mcast_vlan",
+ "rlb_rad_rx_bcast",
+ "rlb_rad_rx_bcast_octets",
+ "rlb_rad_rx_bcast_vlan",
+ "rlb_rad_rx_drops",
+
"fc_rx_ucast_octets",
"fc_rx_ucast",
"fc_rx_ucast_vlan",
@@ -321,7 +346,6 @@ bnad_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
{
struct bnad *bnad = netdev_priv(netdev);
unsigned long flags;
- int dim_timer_del = 0;
if (coalesce->rx_coalesce_usecs == 0 ||
coalesce->rx_coalesce_usecs >
@@ -348,14 +372,7 @@ bnad_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
} else {
if (bnad->cfg_flags & BNAD_CF_DIM_ENABLED) {
bnad->cfg_flags &= ~BNAD_CF_DIM_ENABLED;
- dim_timer_del = bnad_dim_timer_running(bnad);
- if (dim_timer_del) {
- clear_bit(BNAD_RF_DIM_TIMER_RUNNING,
- &bnad->run_flags);
- spin_unlock_irqrestore(&bnad->bna_lock, flags);
- del_timer_sync(&bnad->dim_timer);
- spin_lock_irqsave(&bnad->bna_lock, flags);
- }
+ bnad_dim_timer_stop(bnad, flags);
bnad_rx_coalescing_timeo_set(bnad);
}
}
@@ -407,6 +424,7 @@ bnad_set_ringparam(struct net_device *netdev,
{
int i, current_err, err = 0;
struct bnad *bnad = netdev_priv(netdev);
+ unsigned long flags;
mutex_lock(&bnad->conf_mutex);
if (ringparam->rx_pending == bnad->rxq_depth &&
@@ -430,6 +448,11 @@ bnad_set_ringparam(struct net_device *netdev,
if (ringparam->rx_pending != bnad->rxq_depth) {
bnad->rxq_depth = ringparam->rx_pending;
+ if (!netif_running(netdev)) {
+ mutex_unlock(&bnad->conf_mutex);
+ return 0;
+ }
+
for (i = 0; i < bnad->num_rx; i++) {
if (!bnad->rx_info[i].rx)
continue;
@@ -437,10 +460,26 @@ bnad_set_ringparam(struct net_device *netdev,
current_err = bnad_setup_rx(bnad, i);
if (current_err && !err)
err = current_err;
+ if (!err)
+ bnad_restore_vlans(bnad, i);
+ }
+
+ if (!err && bnad->rx_info[0].rx) {
+ /* restore rx configuration */
+ bnad_enable_default_bcast(bnad);
+ spin_lock_irqsave(&bnad->bna_lock, flags);
+ bnad_mac_addr_set_locked(bnad, netdev->dev_addr);
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
+ bnad_set_rx_mode(netdev);
}
}
if (ringparam->tx_pending != bnad->txq_depth) {
bnad->txq_depth = ringparam->tx_pending;
+ if (!netif_running(netdev)) {
+ mutex_unlock(&bnad->conf_mutex);
+ return 0;
+ }
+
for (i = 0; i < bnad->num_tx; i++) {
if (!bnad->tx_info[i].tx)
continue;
@@ -578,6 +617,16 @@ bnad_get_strings(struct net_device *netdev, u32 stringset, u8 * string)
sprintf(string, "cq%d_hw_producer_index",
q_num);
string += ETH_GSTRING_LEN;
+ sprintf(string, "cq%d_intr", q_num);
+ string += ETH_GSTRING_LEN;
+ sprintf(string, "cq%d_poll", q_num);
+ string += ETH_GSTRING_LEN;
+ sprintf(string, "cq%d_schedule", q_num);
+ string += ETH_GSTRING_LEN;
+ sprintf(string, "cq%d_keep_poll", q_num);
+ string += ETH_GSTRING_LEN;
+ sprintf(string, "cq%d_complete", q_num);
+ string += ETH_GSTRING_LEN;
q_num++;
}
}
@@ -660,7 +709,7 @@ static int
bnad_get_stats_count_locked(struct net_device *netdev)
{
struct bnad *bnad = netdev_priv(netdev);
- int i, j, count, rxf_active_num = 0, txf_active_num = 0;
+ int i, j, count = 0, rxf_active_num = 0, txf_active_num = 0;
u32 bmap;
bmap = bna_tx_rid_mask(&bnad->bna);
@@ -718,6 +767,17 @@ bnad_per_q_stats_fill(struct bnad *bnad, u64 *buf, int bi)
buf[bi++] = 0; /* ccb->consumer_index */
buf[bi++] = *(bnad->rx_info[i].rx_ctrl[j].
ccb->hw_producer_index);
+
+ buf[bi++] = bnad->rx_info[i].
+ rx_ctrl[j].rx_intr_ctr;
+ buf[bi++] = bnad->rx_info[i].
+ rx_ctrl[j].rx_poll_ctr;
+ buf[bi++] = bnad->rx_info[i].
+ rx_ctrl[j].rx_schedule;
+ buf[bi++] = bnad->rx_info[i].
+ rx_ctrl[j].rx_keep_poll;
+ buf[bi++] = bnad->rx_info[i].
+ rx_ctrl[j].rx_complete;
}
}
for (i = 0; i < bnad->num_rx; i++) {
--
1.7.1
^ permalink raw reply related
* [net-next 08/12] bna: Async Mode Tx Rx Init Fix
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Async mode of Tx/Rx queue initialization in BNAD from a task queue context
runs into non-unique taskq allocation issues. Get rid of Tx/Rx
initialization from task q context
- In the attach function, wait for IOC enable, then do Tx/Rx queue
initialization. Default BNA attributes are used when IOC enable from attach
fails and values are set to:
1 TxQ, 1 RxQ, 1 Unicast MAC, 1 RIT entry
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bna_enet.c | 29 ++++++++++++++++++-----
drivers/net/ethernet/brocade/bna/bna_hw_defs.h | 4 +++
drivers/net/ethernet/brocade/bna/bna_types.h | 1 +
3 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bna_enet.c b/drivers/net/ethernet/brocade/bna/bna_enet.c
index 68a275d..26f5c5a 100644
--- a/drivers/net/ethernet/brocade/bna/bna_enet.c
+++ b/drivers/net/ethernet/brocade/bna/bna_enet.c
@@ -167,13 +167,14 @@ bna_bfi_attr_get_rsp(struct bna_ioceth *ioceth,
* Store only if not set earlier, since BNAD can override the HW
* attributes
*/
- if (!ioceth->attr.num_txq)
+ if (!ioceth->attr.fw_query_complete) {
ioceth->attr.num_txq = ntohl(rsp->max_cfg);
- if (!ioceth->attr.num_rxp)
ioceth->attr.num_rxp = ntohl(rsp->max_cfg);
- ioceth->attr.num_ucmac = ntohl(rsp->max_ucmac);
- ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM;
- ioceth->attr.max_rit_size = ntohl(rsp->rit_size);
+ ioceth->attr.num_ucmac = ntohl(rsp->max_ucmac);
+ ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM;
+ ioceth->attr.max_rit_size = ntohl(rsp->rit_size);
+ ioceth->attr.fw_query_complete = true;
+ }
bfa_fsm_send_event(ioceth, IOCETH_E_ENET_ATTR_RESP);
}
@@ -1693,6 +1694,16 @@ static struct bfa_ioc_cbfn bna_ioceth_cbfn = {
bna_cb_ioceth_reset
};
+static void bna_attr_init(struct bna_ioceth *ioceth)
+{
+ ioceth->attr.num_txq = BFI_ENET_DEF_TXQ;
+ ioceth->attr.num_rxp = BFI_ENET_DEF_RXP;
+ ioceth->attr.num_ucmac = BFI_ENET_DEF_UCAM;
+ ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM;
+ ioceth->attr.max_rit_size = BFI_ENET_DEF_RITSZ;
+ ioceth->attr.fw_query_complete = false;
+}
+
static void
bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna,
struct bna_res_info *res_info)
@@ -1738,6 +1749,8 @@ bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna,
ioceth->stop_cbfn = NULL;
ioceth->stop_cbarg = NULL;
+ bna_attr_init(ioceth);
+
bfa_fsm_set_state(ioceth, bna_ioceth_sm_stopped);
}
@@ -2036,7 +2049,8 @@ bna_uninit(struct bna *bna)
int
bna_num_txq_set(struct bna *bna, int num_txq)
{
- if (num_txq > 0 && (num_txq <= bna->ioceth.attr.num_txq)) {
+ if (bna->ioceth.attr.fw_query_complete &&
+ (num_txq <= bna->ioceth.attr.num_txq)) {
bna->ioceth.attr.num_txq = num_txq;
return BNA_CB_SUCCESS;
}
@@ -2047,7 +2061,8 @@ bna_num_txq_set(struct bna *bna, int num_txq)
int
bna_num_rxp_set(struct bna *bna, int num_rxp)
{
- if (num_rxp > 0 && (num_rxp <= bna->ioceth.attr.num_rxp)) {
+ if (bna->ioceth.attr.fw_query_complete &&
+ (num_rxp <= bna->ioceth.attr.num_rxp)) {
bna->ioceth.attr.num_rxp = num_rxp;
return BNA_CB_SUCCESS;
}
diff --git a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
index 7ecdca5..dde8a46 100644
--- a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
+++ b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h
@@ -30,6 +30,10 @@
* SW imposed limits
*
*/
+#define BFI_ENET_DEF_TXQ 1
+#define BFI_ENET_DEF_RXP 1
+#define BFI_ENET_DEF_UCAM 1
+#define BFI_ENET_DEF_RITSZ 1
#define BFI_ENET_MAX_MCAM 256
diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h
index 59417b1..242d799 100644
--- a/drivers/net/ethernet/brocade/bna/bna_types.h
+++ b/drivers/net/ethernet/brocade/bna/bna_types.h
@@ -323,6 +323,7 @@ struct bna_qpt {
};
struct bna_attr {
+ bool fw_query_complete;
int num_txq;
int num_rxp;
int num_ucmac;
--
1.7.1
^ permalink raw reply related
* [net-next 09/12] bna: MBOX IRQ Flag Check after Locking
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Check the BNAD_RF_MBOX_IRQ_DISABLED flag after acquiring the bna_lock.
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 2f808c7..5df21d0 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -582,10 +582,11 @@ bnad_msix_mbox_handler(int irq, void *data)
unsigned long flags;
struct bnad *bnad = (struct bnad *)data;
- if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags)))
- return IRQ_HANDLED;
-
spin_lock_irqsave(&bnad->bna_lock, flags);
+ if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))) {
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
+ return IRQ_HANDLED;
+ }
bna_intr_status_get(&bnad->bna, intr_status);
@@ -608,15 +609,18 @@ bnad_isr(int irq, void *data)
struct bnad_rx_ctrl *rx_ctrl;
struct bna_tcb *tcb = NULL;
- if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags)))
+ spin_lock_irqsave(&bnad->bna_lock, flags);
+ if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))) {
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
return IRQ_NONE;
+ }
bna_intr_status_get(&bnad->bna, intr_status);
- if (unlikely(!intr_status))
+ if (unlikely(!intr_status)) {
+ spin_unlock_irqrestore(&bnad->bna_lock, flags);
return IRQ_NONE;
-
- spin_lock_irqsave(&bnad->bna_lock, flags);
+ }
if (BNA_IS_MBOX_ERR_INTR(&bnad->bna, intr_status))
bna_mbox_handler(&bnad->bna, intr_status);
--
1.7.1
^ permalink raw reply related
* [net-next 10/12] bna: Queue Depth and SKB Unmap Array Fix
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- sk_buff unmap_array grows greater than 65536 (x2) with Tx ring of 65536.
The index used for accessing it is incorrectly declared as u16. It quickly
wraps around and accesses null sk_buff ptr. So using u32 to handle
unmap_array.
- Reducing TXQ depth and safe(max) acking of Tx events to 32768 (same as Rx)
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 4 ++--
drivers/net/ethernet/brocade/bna/bnad.h | 4 ++++
drivers/net/ethernet/brocade/bna/bnad_ethtool.c | 8 ++++----
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 5df21d0..d94497d 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -182,8 +182,8 @@ static u32
bnad_free_txbufs(struct bnad *bnad,
struct bna_tcb *tcb)
{
- u32 sent_packets = 0, sent_bytes = 0;
- u16 wis, unmap_cons, updated_hw_cons;
+ u32 unmap_cons, sent_packets = 0, sent_bytes = 0;
+ u16 wis, updated_hw_cons;
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
struct bnad_skb_unmap *unmap_array;
struct sk_buff *skb;
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h
index b31b893..41c984c 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.h
+++ b/drivers/net/ethernet/brocade/bna/bnad.h
@@ -86,6 +86,10 @@ struct bnad_rx_ctrl {
#define BNAD_MAX_Q_DEPTH 0x10000
#define BNAD_MIN_Q_DEPTH 0x200
+#define BNAD_MAX_RXQ_DEPTH (BNAD_MAX_Q_DEPTH / bnad_rxqs_per_cq)
+/* keeping MAX TX and RX Q depth equal */
+#define BNAD_MAX_TXQ_DEPTH BNAD_MAX_RXQ_DEPTH
+
#define BNAD_JUMBO_MTU 9000
#define BNAD_NETIF_WAKE_THRESHOLD 8
diff --git a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
index 1199f01..e85fb2b 100644
--- a/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
+++ b/drivers/net/ethernet/brocade/bna/bnad_ethtool.c
@@ -407,10 +407,10 @@ bnad_get_ringparam(struct net_device *netdev,
{
struct bnad *bnad = netdev_priv(netdev);
- ringparam->rx_max_pending = BNAD_MAX_Q_DEPTH / bnad_rxqs_per_cq;
+ ringparam->rx_max_pending = BNAD_MAX_RXQ_DEPTH;
ringparam->rx_mini_max_pending = 0;
ringparam->rx_jumbo_max_pending = 0;
- ringparam->tx_max_pending = BNAD_MAX_Q_DEPTH;
+ ringparam->tx_max_pending = BNAD_MAX_TXQ_DEPTH;
ringparam->rx_pending = bnad->rxq_depth;
ringparam->rx_mini_max_pending = 0;
@@ -434,13 +434,13 @@ bnad_set_ringparam(struct net_device *netdev,
}
if (ringparam->rx_pending < BNAD_MIN_Q_DEPTH ||
- ringparam->rx_pending > BNAD_MAX_Q_DEPTH / bnad_rxqs_per_cq ||
+ ringparam->rx_pending > BNAD_MAX_RXQ_DEPTH ||
!BNA_POWER_OF_2(ringparam->rx_pending)) {
mutex_unlock(&bnad->conf_mutex);
return -EINVAL;
}
if (ringparam->tx_pending < BNAD_MIN_Q_DEPTH ||
- ringparam->tx_pending > BNAD_MAX_Q_DEPTH ||
+ ringparam->tx_pending > BNAD_MAX_TXQ_DEPTH ||
!BNA_POWER_OF_2(ringparam->tx_pending)) {
mutex_unlock(&bnad->conf_mutex);
return -EINVAL;
--
1.7.1
^ permalink raw reply related
* [net-next 11/12] bna: SKB PCI UNMAP Fix
From: Rasesh Mody @ 2011-08-22 22:41 UTC (permalink / raw)
To: davem, netdev; +Cc: adapter_linux_open_src_team, Rasesh Mody, Gurunatha Karaje
In-Reply-To: <1314052869-7407-1-git-send-email-rmody@brocade.com>
Change details:
- Found a leak in sk_buff unmapping of PCI dma addresses where boundary
conditions are not properly handled in freeing all Tx buffers. Freeing
of all Tx buffers is done considering sk_buffs data and fragments can
be mapped at the boundary.
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
---
drivers/net/ethernet/brocade/bna/bnad.c | 39 ++++++++-----------------------
1 files changed, 10 insertions(+), 29 deletions(-)
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index d94497d..6ae531e 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -133,39 +133,20 @@ bnad_free_all_txbufs(struct bnad *bnad,
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
struct bnad_skb_unmap *unmap_array;
struct sk_buff *skb = NULL;
- int i;
+ int q;
unmap_array = unmap_q->unmap_array;
- unmap_cons = 0;
- while (unmap_cons < unmap_q->q_depth) {
- skb = unmap_array[unmap_cons].skb;
- if (!skb) {
- unmap_cons++;
+ for (q = 0; q < unmap_q->q_depth; q++) {
+ skb = unmap_array[q].skb;
+ if (!skb)
continue;
- }
- unmap_array[unmap_cons].skb = NULL;
-
- dma_unmap_single(&bnad->pcidev->dev,
- dma_unmap_addr(&unmap_array[unmap_cons],
- dma_addr), skb_headlen(skb),
- DMA_TO_DEVICE);
- dma_unmap_addr_set(&unmap_array[unmap_cons], dma_addr, 0);
- if (++unmap_cons >= unmap_q->q_depth)
- break;
+ unmap_cons = q;
+ BNAD_PCI_UNMAP_SKB(&bnad->pcidev->dev, unmap_array, unmap_cons,
+ unmap_q->q_depth, skb,
+ skb_shinfo(skb)->nr_frags);
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
- dma_unmap_page(&bnad->pcidev->dev,
- dma_unmap_addr(&unmap_array[unmap_cons],
- dma_addr),
- skb_shinfo(skb)->frags[i].size,
- DMA_TO_DEVICE);
- dma_unmap_addr_set(&unmap_array[unmap_cons], dma_addr,
- 0);
- if (++unmap_cons >= unmap_q->q_depth)
- break;
- }
dev_kfree_skb_any(skb);
}
}
--
1.7.1
^ permalink raw reply related
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