* Re: Linux Kernel Development - A Practical Approach
From: Tapas Mishra @ 2010-10-05 10:49 UTC (permalink / raw)
To: Linux Kernel Explorer; +Cc: kernelnewbies, linux-kernel, netdev, linux-fsdevel
In-Reply-To: <AANLkTim9RFG799GVEkA0GjU_th_vTv_Y8SqYb1WLBUYp@mail.gmail.com>
On Tue, Oct 5, 2010 at 12:20 AM, Linux "Kernel" Explorer
<mylinuxlab@gmail.com> wrote:
> Hello Everyone,
>
> I am reading 'Linux Kernel Development' by Robert Love these days.
>
> This book takes you on a theoretical journey of the linux kernel
> world.Though the book is good but I do have my share of concerns.
Exactly even I do have same concerns.
www.crashcourse.ca
check the above website till today this is the only most relevant
thing which I find easy to begin with.
You can then go to understand some more howtos on internet that will help.
LKD is no doubt good book but even I do not appreciate that.
Jumping directly to code in your or even mine type of situation is
not easy having said that I would say you not to
indulge into books.If possible get some one who can easily give you a
hands on experience.
Then you will be able to understand what the text books talk.
A good advice I got from some one who works with processors is rather
than going in manuals
jump into the code you play with it and then you will gradually understand.
There may be different views but I would suggest you not to read books.
^ permalink raw reply
* Re: [patch 2/2] drivers/net/stmmac/: add HAS_IOMEM dependency
From: Peppe CAVALLARO @ 2010-10-05 10:46 UTC (permalink / raw)
To: David Miller
Cc: akpm@linux-foundation.org, netdev@vger.kernel.org,
schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com
In-Reply-To: <20101003.220035.183055886.davem@davemloft.net>
Hello
On 10/04/2010 07:00 AM, David Miller wrote:
> From: akpm@linux-foundation.org
> Date: Fri, 01 Oct 2010 14:17:13 -0700
>
> > From: Martin Schwidefsky <schwidefsky@de.ibm.com>
> >
> > The stmmac driver does not compile on s390:
> >
> > drivers/net/stmmac/stmmac_main.c: In function 'stmmac_adjust_link':
> > drivers/net/stmmac/stmmac_main.c:210: error: implicit declaration of function
> 'readl'
> > drivers/net/stmmac/stmmac_main.c:263: error: implicit declaration of function
> 'writel'
> > drivers/net/stmmac/stmmac_main.c: In function 'stmmac_dvr_probe':
> > drivers/net/stmmac/stmmac_main.c:1674: error: implicit declaration of
> function 'ioremap'
> > drivers/net/stmmac/stmmac_main.c:1674: warning: assignment makes pointer from
> integer without a cast
> > drivers/net/stmmac/stmmac_main.c:1761: error: implicit declaration of
> function 'iounmap'
> > make[3]: *** [drivers/net/stmmac/stmmac_main.o] Error 1
> >
> > Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
> > Cc: Giuseppe CAVALLARO <peppe.cavallaro@st.com>
> > Cc: David S. Miller <davem@davemloft.net>
> > Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>
> This got fixed by adding a dependency on CPU_SUBTYPE_ST40.
This dependency was removed in driver included in net-next Git (because
the CPU_SUBTYPE_ST40 is a dead option).
I've seen that other drivers depend on HAS_IOMEM that is always defined
for STM and ARM targets (where the I know the stmmac is used); No
problem for me to add this new dependency to in HAS_IOMEM the stmmac's
Kconfig if actually needed.
Regards
Peppe
^ permalink raw reply
* Re: [PATCH] iwl3945: queue the right work if the scan needs to be aborted
From: Stanislaw Gruszka @ 2010-10-05 10:43 UTC (permalink / raw)
To: Florian Mickler
Cc: stable-DgEjT+Ai2ygdnm+yROfE0A,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Guy, Wey-Yi, Chatre, Reinette, Intel Linux Wireless,
John W. Linville, Berg, Johannes, Cahill, Ben M,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20101005121242.79cdafc2-mGsOIKOveelVRbCss4o9kg@public.gmane.org>
On Tue, Oct 05, 2010 at 12:12:42PM +0200, Florian Mickler wrote:
> > Unfortunately this patch is not right thing to do. If you look at
> > abort_scan work, it do nothing if STATUS_SCAN_ABORTING bit is not set.
> > That's wrong because we have to complete scan (with abort == true).
> > If STATUS_SCAN_ABORTING will be set, abort_work will send scan cancel
> > commands to hardware what is wrong if scan was not started yet.
> >
> > What we can eventually do, except apply iwl-scan rewrite from
> > wireless-testing, is something like that:
> >
> > iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
> >
> > clear_bit(STATUS_SCAN_HW, &priv->status);
> > clear_bit(STATUS_SCANNING, &priv->status);
> > /* inform mac80211 scan aborted */
> > set_bit(STATUS_SCAN_ABORTING, &priv->status);
> > queue_work(priv->workqueue, &priv->scan_completed);
> >
> > ieee80211_scan_completed
> >
> > if (!internal) {
> > bool aborted = test_bit(STATUS_SCAN_ABORTING, &priv->status);
> > ieee80211_scan_completed(priv->hw, aborted);
> >
> > }
> >
> > However, I do not think we should go with that to -stable (below
> > 2.6.36). IIRC warnings showed up in current 2.6.36-rc, because of
> > some other changes in the code.
> >
> > Stanislaw
>
> Thx for looking at this. I suspect you know the code better than I do.. what is about the
> first jump to :done in iwlagn_request_scan()
>
> if (!iwl_is_ready(priv)) {
> IWL_WARN(priv, "request scan called when driver not ready.\n");
> goto done;
> }
>
> Does abort_scan need to do anything in that case?
Yes, because we do not return value to mac80211 about .hw_scan failure,
we always return 0, what is completely wrong. And yes, return error can
be done instead of queueing scan_completed to improve situation - this is
one of the thing, we do in wireless-testing.
> I can't see where we set up the hardware for scanning in that case.
> (I've gone through the codepath coming from the mac80211 hw_scan)
.hw_scan = iwl_mac_hw_scan -> iwl_scan_initiate ->
"priv->cfg->ops->utils->request_scan" = {iwl3945,iwlang}_request_scan
Stanislaw
--
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: [v2 RFC PATCH 0/4] Implement multiqueue virtio-net
From: Krishna Kumar2 @ 2010-10-05 10:40 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: anthony, arnd, avi, davem, kvm, netdev, rusty
In-Reply-To: <20100919124443.GJ7350@redhat.com>
"Michael S. Tsirkin" <mst@redhat.com> wrote on 09/19/2010 06:14:43 PM:
> Could you document how exactly do you measure multistream bandwidth:
> netperf flags, etc?
All results were without any netperf flags or system tuning:
for i in $list
do
netperf -c -C -l 60 -H 192.168.122.1 > /tmp/netperf.$$.$i &
done
wait
Another script processes the result files. It also displays the
start time/end time of each iteration to make sure skew due to
parallel netperfs is minimal.
I changed the vhost functionality once more to try to get the
best model, the new model being:
1. #numtxqs=1 -> #vhosts=1, this thread handles both RX/TX.
2. #numtxqs>1 -> vhost[0] handles RX and vhost[1-MAX] handles
TX[0-n], where MAX is 4. Beyond numtxqs=4, the remaining TX
queues are handled by vhost threads in round-robin fashion.
Results from here on are with these changes, and only "tuning" is
to set each vhost's affinity to CPUs[0-3] ("taskset -p f <vhost-pids>").
> Any idea where does this come from?
> Do you see more TX interrupts? RX interrupts? Exits?
> Do interrupts bounce more between guest CPUs?
> 4. Identify reasons for single netperf BW regression.
After testing various combinations of #txqs, #vhosts, #netperf
sessions, I think the drop for 1 stream is due to TX and RX for
a flow being processed on different cpus. I did two more tests:
1. Pin vhosts to same CPU:
- BW drop is much lower for 1 stream case (- 5 to -8% range)
- But performance is not so high for more sessions.
2. Changed vhost to be single threaded:
- No degradation for 1 session, and improvement for upto
8, sometimes 16 streams (5-12%).
- BW degrades after that, all the way till 128 netperf sessions.
- But overall CPU utilization improves.
Summary of the entire run (for 1-128 sessions):
txq=4: BW: (-2.3) CPU: (-16.5) RCPU: (-5.3)
txq=16: BW: (-1.9) CPU: (-24.9) RCPU: (-9.6)
I don't see any reasons mentioned above. However, for higher
number of netperf sessions, I see a big increase in retransmissions:
_______________________________________
#netperf ORG NEW
BW (#retr) BW (#retr)
_______________________________________
1 70244 (0) 64102 (0)
4 21421 (0) 36570 (416)
8 21746 (0) 38604 (148)
16 21783 (0) 40632 (464)
32 22677 (0) 37163 (1053)
64 23648 (4) 36449 (2197)
128 23251 (2) 31676 (3185)
_______________________________________
Single netperf case didn't have any retransmissions so that is not
the cause for drop. I tested ixgbe (MQ):
___________________________________________________________
#netperf ixgbe ixgbe (pin intrs to cpu#0 on
both server/client)
BW (#retr) BW (#retr)
___________________________________________________________
1 3567 (117) 6000 (251)
2 4406 (477) 6298 (725)
4 6119 (1085) 7208 (3387)
8 6595 (4276) 7381 (15296)
16 6651 (11651) 6856 (30394)
___________________________________________________________
> 5. Test perf in more scenarious:
> small packets
512 byte packets - BW drop for upto 8 (sometimes 16) netperf sessions,
but increases with #sessions:
_______________________________________________________________________________
# BW1 BW2 (%) CPU1 CPU2 (%) RCPU1 RCPU2 (%)
_______________________________________________________________________________
1 4043 3800 (-6.0) 50 50 (0) 86 98 (13.9)
2 8358 7485 (-10.4) 153 178 (16.3) 230 264 (14.7)
4 20664 13567 (-34.3) 448 490 (9.3) 530 624 (17.7)
8 25198 17590 (-30.1) 967 1021 (5.5) 1085 1257 (15.8)
16 23791 24057 (1.1) 1904 2220 (16.5) 2156 2578 (19.5)
24 23055 26378 (14.4) 2807 3378 (20.3) 3225 3901 (20.9)
32 22873 27116 (18.5) 3748 4525 (20.7) 4307 5239 (21.6)
40 22876 29106 (27.2) 4705 5717 (21.5) 5388 6591 (22.3)
48 23099 31352 (35.7) 5642 6986 (23.8) 6475 8085 (24.8)
64 22645 30563 (34.9) 7527 9027 (19.9) 8619 10656 (23.6)
80 22497 31922 (41.8) 9375 11390 (21.4) 10736 13485 (25.6)
96 22509 32718 (45.3) 11271 13710 (21.6) 12927 16269 (25.8)
128 22255 32397 (45.5) 15036 18093 (20.3) 17144 21608 (26.0)
_______________________________________________________________________________
SUM: BW: (16.7) CPU: (20.6) RCPU: (24.3)
_______________________________________________________________________________
> host -> guest
_______________________________________________________________________________
# BW1 BW2 (%) CPU1 CPU2 (%) RCPU1 RCPU2 (%)
_______________________________________________________________________________
*1 70706 90398 (27.8) 300 327 (9.0) 140 175 (25.0)
2 20951 21937 (4.7) 188 196 (4.2) 93 103 (10.7)
4 19952 25281 (26.7) 397 496 (24.9) 210 304 (44.7)
8 18559 24992 (34.6) 802 1010 (25.9) 439 659 (50.1)
16 18882 25608 (35.6) 1642 2082 (26.7) 953 1454 (52.5)
24 19012 26955 (41.7) 2465 3153 (27.9) 1452 2254 (55.2)
32 19846 26894 (35.5) 3278 4238 (29.2) 1914 3081 (60.9)
40 19704 27034 (37.2) 4104 5303 (29.2) 2409 3866 (60.4)
48 19721 26832 (36.0) 4924 6418 (30.3) 2898 4701 (62.2)
64 19650 26849 (36.6) 6595 8611 (30.5) 3975 6433 (61.8)
80 19432 26823 (38.0) 8244 10817 (31.2) 4985 8165 (63.7)
96 20347 27886 (37.0) 9913 13017 (31.3) 5982 9860 (64.8)
128 19108 27715 (45.0) 13254 17546 (32.3) 8153 13589 (66.6)
_______________________________________________________________________________
SUM: BW: (32.4) CPU: (30.4) RCPU: (62.6)
_______________________________________________________________________________
*: Sum over 7 iterations, remaining test cases are sum over 2 iterations
> guest <-> external
I haven't done this right now since I don't have a setup. I guess
it would be limited by wire speed and gains may not be there. I
will try to do this later when I get the setup.
> in last case:
> find some other way to measure host CPU utilization,
> try multiqueue and single queue devices
> 6. Use above to figure out what is a sane default for numtxqs
A. Summary for default I/O (16K):
#txqs=2 (#vhost=3): BW: (37.6) CPU: (69.2) RCPU: (40.8)
#txqs=4 (#vhost=5): BW: (36.9) CPU: (60.9) RCPU: (25.2)
#txqs=8 (#vhost=5): BW: (41.8) CPU: (50.0) RCPU: (15.2)
#txqs=16 (#vhost=5): BW: (40.4) CPU: (49.9) RCPU: (10.0)
B. Summary for 512 byte I/O:
#txqs=2 (#vhost=3): BW: (31.6) CPU: (35.7) RCPU: (28.6)
#txqs=4 (#vhost=5): BW: (5.7) CPU: (27.2) RCPU: (22.7)
#txqs=8 (#vhost=5): BW: (-.6) CPU: (25.1) RCPU: (22.5)
#txqs=16 (#vhost=5): BW: (-6.6) CPU: (24.7) RCPU: (21.7)
Summary:
1. Average BW increase for regular I/O is best for #txq=16 with the
least CPU utilization increase.
2. The average BW for 512 byte I/O is best for lower #txq=2. For higher
#txqs, BW increased only after a particular #netperf sessions - in
my testing that limit was 32 netperf sessions.
3. Multiple txq for guest by itself doesn't seem to have any issues.
Guest CPU% increase is slightly higher than BW improvement. I
think it is true for all mq drivers since more paths run in parallel
upto the device instead of sleeping and allowing one thread to send
all packets via qdisc_restart.
4. Having high number of txqs gives better gains and reduces cpu util
on the guest and the host.
5. MQ is intended for server loads. MQ should probably not be explicitly
specified for client systems.
6. No regression with numtxqs=1 (or if mq option is not used) in any
testing scenario.
I will send the v3 patch within a day after some more testing.
Thanks,
- KK
^ permalink raw reply
* Re: [MeeGo-Dev][PATCH v3] Topcliff: Update PCH_CAN driver to 2.6.35
From: Masayuki Ohtake @ 2010-10-05 10:21 UTC (permalink / raw)
To: Wolfgang Grandegger
Cc: andrew.chih.howe.khor-ral2JQCrhuEAvxtiuMwx3w,
qi.wang-ral2JQCrhuEAvxtiuMwx3w,
margie.foster-ral2JQCrhuEAvxtiuMwx3w,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
yong.y.wang-ral2JQCrhuEAvxtiuMwx3w,
socketcan-core-0fE9KPoRgkgATYTw5x5z8w,
kok.howg.ewe-ral2JQCrhuEAvxtiuMwx3w,
joel.clark-ral2JQCrhuEAvxtiuMwx3w, Tomoya MORINAGA,
meego-dev-WXzIur8shnEAvxtiuMwx3w, David S. Miller,
Christian Pellegrin, Samuel Ortiz
In-Reply-To: <4CA5D6D7.3010608@grandegger.com>
Hi Wolfgang,
I could confirm below.
With FIFO mode, it is able to receive packet with in-order.
We are now implementing FIFO mode.
Thanks, Ohtake(OKISemi)
----- Original Message -----
From: "Wolfgang Grandegger" <wg-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
To: "Masayuki Ohtake" <masa-korg-ECg8zkTtlr0C6LszWs/t0g@public.gmane.org>
Cc: <andrew.chih.howe.khor-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>; <qi.wang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>; <margie.foster-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>; <netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>;
<yong.y.wang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>; <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>; <socketcan-core-0fE9KPoRgkgATYTw5x5z8w@public.gmane.org>; <kok.howg.ewe-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>;
"Christian Pellegrin" <chripell-VaTbYqLCNhc@public.gmane.org>; "Tomoya MORINAGA" <morinaga526-ECg8zkTtlr0C6LszWs/t0g@public.gmane.org>; <meego-dev-WXzIur8shnEAvxtiuMwx3w@public.gmane.org>;
"David S. Miller" <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>; <joel.clark-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>; "Samuel Ortiz" <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Sent: Friday, October 01, 2010 9:40 PM
Subject: Re: [MeeGo-Dev][PATCH v3] Topcliff: Update PCH_CAN driver to 2.6.35
> On 10/01/2010 12:02 PM, Masayuki Ohtake wrote:
> > Hi Wolfgang Grandegger,
> >
> > Thank you for your comments.
> >
> > We will modify and re-post ASAP.
> >
> > I have a comment about below.
> >> In this driver you are using just *one* RX object. This means that the
> >> CPU must handle new messages as quickly as possible otherwise message
> >> losses will happen, right?. For sure, this will not make user's happy.
> >> Any chance to use more RX objects in FIFO mode?
> >
> > In case implementing with FIFO mode,
> > received packets may be our of order.
>
> Hm, FIFO means "First in First out"! It might be tricky to implement,
> though.
>
> > Because our CAN register access is slow.
> >
> > I am confirming our CAN HW spec and the possibility of our-of-order.
>
> I don't understand?
>
> Wolfgang.
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" 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
* [RFC] bna: cleanup dead code and namespace issues
From: Stephen Hemminger @ 2010-10-05 10:20 UTC (permalink / raw)
To: Rasesh Mody, Debashis Dutt, David S. Miller; +Cc: netdev
The new bna driver is full of issues that I found by running
some namespace checks:
1. Lots of dead code relating to RSS and stats clearing
2. Some functions which should be local, especially ones
that risk namespace collision with other code.
3. The table for interrupt control should be declared const.
The driver still is sloppy about namespace prefixes. It uses
bna_, bnad_, bfa_, rxf_, __rxf and cna_ prefixes. Please convert it
to have all variables and functions that are global use only
one prefix.
Compile tested only.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
Patch against net-next-2.6 tree.
drivers/net/bna/bfa_ioc.c | 8
drivers/net/bna/bfa_ioc.h | 1
drivers/net/bna/bfa_ioc_ct.c | 2
drivers/net/bna/bfa_sm.h | 2
drivers/net/bna/bna.h | 108 ----------
drivers/net/bna/bna_ctrl.c | 427 ++++---------------------------------------
drivers/net/bna/bna_hw.h | 1
drivers/net/bna/bna_txrx.c | 108 +++-------
drivers/net/bna/bnad.c | 13 -
drivers/net/bna/cna_fwimg.c | 2
10 files changed, 90 insertions(+), 582 deletions(-)
--- a/drivers/net/bna/bfa_ioc.c 2010-10-05 18:28:08.081647186 +0900
+++ b/drivers/net/bna/bfa_ioc.c 2010-10-05 18:55:15.241670954 +0900
@@ -65,7 +65,7 @@
(!list_empty(&((__ioc)->mbox_mod.cmd_q)) || \
readl((__ioc)->ioc_regs.hfn_mbox_cmd))
-bool bfa_nw_auto_recover = true;
+static bool bfa_nw_auto_recover = true;
/*
* forward declarations
@@ -1276,12 +1276,6 @@ bfa_nw_ioc_auto_recover(bool auto_recove
bfa_nw_auto_recover = auto_recover;
}
-bool
-bfa_nw_ioc_is_operational(struct bfa_ioc *ioc)
-{
- return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op);
-}
-
static void
bfa_ioc_msgget(struct bfa_ioc *ioc, void *mbmsg)
{
--- a/drivers/net/bna/bfa_ioc_ct.c 2010-10-05 18:28:08.105640040 +0900
+++ b/drivers/net/bna/bfa_ioc_ct.c 2010-10-05 18:35:37.373640864 +0900
@@ -34,7 +34,7 @@ static void bfa_ioc_ct_notify_hbfail(str
static void bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc);
static enum bfa_status bfa_ioc_ct_pll_init(void __iomem *rb, bool fcmode);
-struct bfa_ioc_hwif nw_hwif_ct;
+static struct bfa_ioc_hwif nw_hwif_ct;
/**
* Called from bfa_ioc_attach() to map asic specific calls.
--- a/drivers/net/bna/bna.h 2010-10-05 18:33:24.969649777 +0900
+++ b/drivers/net/bna/bna.h 2010-10-05 19:14:12.306169796 +0900
@@ -19,8 +19,7 @@
#include "bfi_ll.h"
#include "bna_types.h"
-extern u32 bna_dim_vector[][BNA_BIAS_T_MAX];
-extern u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
+extern const u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
/**
*
@@ -344,9 +343,6 @@ do { \
* BNA
*/
-/* Internal APIs */
-void bna_adv_res_req(struct bna_res_info *res_info);
-
/* APIs for BNAD */
void bna_res_req(struct bna_res_info *res_info);
void bna_init(struct bna *bna, struct bnad *bnad,
@@ -354,7 +350,6 @@ void bna_init(struct bna *bna, struct bn
struct bna_res_info *res_info);
void bna_uninit(struct bna *bna);
void bna_stats_get(struct bna *bna);
-void bna_stats_clr(struct bna *bna);
void bna_get_perm_mac(struct bna *bna, u8 *mac);
/* APIs for Rx */
@@ -376,18 +371,6 @@ void bna_rit_mod_seg_put(struct bna_rit_
* DEVICE
*/
-/* Interanl APIs */
-void bna_adv_device_init(struct bna_device *device, struct bna *bna,
- struct bna_res_info *res_info);
-
-/* APIs for BNA */
-void bna_device_init(struct bna_device *device, struct bna *bna,
- struct bna_res_info *res_info);
-void bna_device_uninit(struct bna_device *device);
-void bna_device_cb_port_stopped(void *arg, enum bna_cb_status status);
-int bna_device_status_get(struct bna_device *device);
-int bna_device_state_get(struct bna_device *device);
-
/* APIs for BNAD */
void bna_device_enable(struct bna_device *device);
void bna_device_disable(struct bna_device *device,
@@ -397,12 +380,6 @@ void bna_device_disable(struct bna_devic
* MBOX
*/
-/* APIs for DEVICE */
-void bna_mbox_mod_init(struct bna_mbox_mod *mbox_mod, struct bna *bna);
-void bna_mbox_mod_uninit(struct bna_mbox_mod *mbox_mod);
-void bna_mbox_mod_start(struct bna_mbox_mod *mbox_mod);
-void bna_mbox_mod_stop(struct bna_mbox_mod *mbox_mod);
-
/* APIs for PORT, TX, RX */
void bna_mbox_handler(struct bna *bna, u32 intr_status);
void bna_mbox_send(struct bna *bna, struct bna_mbox_qe *mbox_qe);
@@ -411,17 +388,6 @@ void bna_mbox_send(struct bna *bna, stru
* PORT
*/
-/* APIs for BNA */
-void bna_port_init(struct bna_port *port, struct bna *bna);
-void bna_port_uninit(struct bna_port *port);
-int bna_port_state_get(struct bna_port *port);
-int bna_llport_state_get(struct bna_llport *llport);
-
-/* APIs for DEVICE */
-void bna_port_start(struct bna_port *port);
-void bna_port_stop(struct bna_port *port);
-void bna_port_fail(struct bna_port *port);
-
/* API for RX */
int bna_port_mtu_get(struct bna_port *port);
void bna_llport_admin_up(struct bna_llport *llport);
@@ -437,12 +403,6 @@ void bna_port_pause_config(struct bna_po
void bna_port_mtu_set(struct bna_port *port, int mtu,
void (*cbfn)(struct bnad *, enum bna_cb_status));
void bna_port_mac_get(struct bna_port *port, mac_t *mac);
-void bna_port_type_set(struct bna_port *port, enum bna_port_type type);
-void bna_port_linkcbfn_set(struct bna_port *port,
- void (*linkcbfn)(struct bnad *,
- enum bna_link_status));
-void bna_port_admin_up(struct bna_port *port);
-void bna_port_admin_down(struct bna_port *port);
/* Callbacks for TX, RX */
void bna_port_cb_tx_stopped(struct bna_port *port,
@@ -450,11 +410,6 @@ void bna_port_cb_tx_stopped(struct bna_p
void bna_port_cb_rx_stopped(struct bna_port *port,
enum bna_cb_status status);
-/* Callbacks for MBOX */
-void bna_port_cb_link_up(struct bna_port *port, struct bfi_ll_aen *aen,
- int status);
-void bna_port_cb_link_down(struct bna_port *port, int status);
-
/**
* IB
*/
@@ -464,25 +419,10 @@ void bna_ib_mod_init(struct bna_ib_mod *
struct bna_res_info *res_info);
void bna_ib_mod_uninit(struct bna_ib_mod *ib_mod);
-/* APIs for TX, RX */
-struct bna_ib *bna_ib_get(struct bna_ib_mod *ib_mod,
- enum bna_intr_type intr_type, int vector);
-void bna_ib_put(struct bna_ib_mod *ib_mod, struct bna_ib *ib);
-int bna_ib_reserve_idx(struct bna_ib *ib);
-void bna_ib_release_idx(struct bna_ib *ib, int idx);
-int bna_ib_config(struct bna_ib *ib, struct bna_ib_config *ib_config);
-void bna_ib_start(struct bna_ib *ib);
-void bna_ib_stop(struct bna_ib *ib);
-void bna_ib_fail(struct bna_ib *ib);
-void bna_ib_coalescing_timeo_set(struct bna_ib *ib, u8 coalescing_timeo);
-
/**
* TX MODULE AND TX
*/
-/* Internal APIs */
-void bna_tx_prio_changed(struct bna_tx *tx, int prio);
-
/* APIs for BNA */
void bna_tx_mod_init(struct bna_tx_mod *tx_mod, struct bna *bna,
struct bna_res_info *res_info);
@@ -508,10 +448,6 @@ void bna_tx_enable(struct bna_tx *tx);
void bna_tx_disable(struct bna_tx *tx, enum bna_cleanup_type type,
void (*cbfn)(void *, struct bna_tx *,
enum bna_cb_status));
-enum bna_cb_status
-bna_tx_prio_set(struct bna_tx *tx, int prio,
- void (*cbfn)(struct bnad *, struct bna_tx *,
- enum bna_cb_status));
void bna_tx_coalescing_timeo_set(struct bna_tx *tx, int coalescing_timeo);
/**
@@ -564,35 +500,20 @@ void bna_rx_disable(struct bna_rx *rx, e
void (*cbfn)(void *, struct bna_rx *,
enum bna_cb_status));
void bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo);
-void bna_rx_dim_reconfig(struct bna *bna, u32 vector[][BNA_BIAS_T_MAX]);
+void bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX]);
void bna_rx_dim_update(struct bna_ccb *ccb);
enum bna_cb_status
bna_rx_ucast_set(struct bna_rx *rx, u8 *ucmac,
void (*cbfn)(struct bnad *, struct bna_rx *,
enum bna_cb_status));
enum bna_cb_status
-bna_rx_ucast_add(struct bna_rx *rx, u8* ucmac,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
-enum bna_cb_status
-bna_rx_ucast_del(struct bna_rx *rx, u8 *ucmac,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
-enum bna_cb_status
bna_rx_mcast_add(struct bna_rx *rx, u8 *mcmac,
void (*cbfn)(struct bnad *, struct bna_rx *,
enum bna_cb_status));
enum bna_cb_status
-bna_rx_mcast_del(struct bna_rx *rx, u8 *mcmac,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
-enum bna_cb_status
bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mcmac,
void (*cbfn)(struct bnad *, struct bna_rx *,
enum bna_cb_status));
-void bna_rx_mcast_delall(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
enum bna_cb_status
bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
enum bna_rxmode bitmask,
@@ -601,37 +522,12 @@ bna_rx_mode_set(struct bna_rx *rx, enum
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_vlanfilter_disable(struct bna_rx *rx);
-void bna_rx_rss_enable(struct bna_rx *rx);
-void bna_rx_rss_disable(struct bna_rx *rx);
-void bna_rx_rss_reconfig(struct bna_rx *rx, struct bna_rxf_rss *rss_config);
-void bna_rx_rss_rit_set(struct bna_rx *rx, unsigned int *vectors,
- int nvectors);
void bna_rx_hds_enable(struct bna_rx *rx, struct bna_rxf_hds *hds_config,
void (*cbfn)(struct bnad *, struct bna_rx *,
enum bna_cb_status));
void bna_rx_hds_disable(struct bna_rx *rx,
void (*cbfn)(struct bnad *, struct bna_rx *,
enum bna_cb_status));
-void bna_rx_receive_pause(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
-void bna_rx_receive_resume(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status));
-
-/* RxF APIs for RX */
-void bna_rxf_start(struct bna_rxf *rxf);
-void bna_rxf_stop(struct bna_rxf *rxf);
-void bna_rxf_fail(struct bna_rxf *rxf);
-void bna_rxf_init(struct bna_rxf *rxf, struct bna_rx *rx,
- struct bna_rx_config *q_config);
-void bna_rxf_uninit(struct bna_rxf *rxf);
-
-/* Callback from RXF to RX */
-void bna_rx_cb_rxf_stopped(struct bna_rx *rx, enum bna_cb_status);
-void bna_rx_cb_rxf_started(struct bna_rx *rx, enum bna_cb_status);
-
/**
* BNAD
*/
--- a/drivers/net/bna/bna_ctrl.c 2010-10-05 18:28:08.125665071 +0900
+++ b/drivers/net/bna/bna_ctrl.c 2010-10-05 19:17:51.037641382 +0900
@@ -19,6 +19,13 @@
#include "bfa_sm.h"
#include "bfa_wc.h"
+static void bna_device_cb_port_stopped(void *arg, enum bna_cb_status status);
+static void bna_adv_device_init(struct bna_device *device, struct bna *bna,
+ struct bna_res_info *res_info);
+static void bna_port_cb_link_up(struct bna_port *port, struct bfi_ll_aen *aen,
+ int status);
+static void bna_port_cb_link_down(struct bna_port *port, int status);
+
/**
* MBOX
*/
@@ -96,7 +103,7 @@ bna_ll_isr(void *llarg, struct bfi_mbmsg
bna_mbox_aen_callback(bna, msg);
}
-void
+static void
bna_err_handler(struct bna *bna, u32 intr_status)
{
u32 init_halt;
@@ -140,7 +147,7 @@ bna_mbox_send(struct bna *bna, struct bn
}
}
-void
+static void
bna_mbox_flush_q(struct bna *bna, struct list_head *q)
{
struct bna_mbox_qe *mb_qe = NULL;
@@ -166,18 +173,18 @@ bna_mbox_flush_q(struct bna *bna, struct
bna->mbox_mod.state = BNA_MBOX_FREE;
}
-void
+static void
bna_mbox_mod_start(struct bna_mbox_mod *mbox_mod)
{
}
-void
+static void
bna_mbox_mod_stop(struct bna_mbox_mod *mbox_mod)
{
bna_mbox_flush_q(mbox_mod->bna, &mbox_mod->posted_q);
}
-void
+static void
bna_mbox_mod_init(struct bna_mbox_mod *mbox_mod, struct bna *bna)
{
bfa_nw_ioc_mbox_regisr(&bna->device.ioc, BFI_MC_LL, bna_ll_isr, bna);
@@ -187,7 +194,7 @@ bna_mbox_mod_init(struct bna_mbox_mod *m
mbox_mod->bna = bna;
}
-void
+static void
bna_mbox_mod_uninit(struct bna_mbox_mod *mbox_mod)
{
mbox_mod->bna = NULL;
@@ -538,7 +545,7 @@ bna_fw_cb_llport_down(void *arg, int sta
bfa_fsm_send_event(llport, LLPORT_E_FWRESP_DOWN);
}
-void
+static void
bna_port_cb_llport_stopped(struct bna_port *port,
enum bna_cb_status status)
{
@@ -591,7 +598,7 @@ bna_llport_fail(struct bna_llport *llpor
bfa_fsm_send_event(llport, LLPORT_E_FAIL);
}
-int
+static int
bna_llport_state_get(struct bna_llport *llport)
{
return bfa_sm_to_state(llport_sm_table, llport->fsm);
@@ -1109,7 +1116,7 @@ bna_port_cb_chld_stopped(void *arg)
bfa_fsm_send_event(port, PORT_E_CHLD_STOPPED);
}
-void
+static void
bna_port_init(struct bna_port *port, struct bna *bna)
{
port->bna = bna;
@@ -1137,7 +1144,7 @@ bna_port_init(struct bna_port *port, str
bna_llport_init(&port->llport, bna);
}
-void
+static void
bna_port_uninit(struct bna_port *port)
{
bna_llport_uninit(&port->llport);
@@ -1147,13 +1154,13 @@ bna_port_uninit(struct bna_port *port)
port->bna = NULL;
}
-int
+static int
bna_port_state_get(struct bna_port *port)
{
return bfa_sm_to_state(port_sm_table, port->fsm);
}
-void
+static void
bna_port_start(struct bna_port *port)
{
port->flags |= BNA_PORT_F_DEVICE_READY;
@@ -1161,7 +1168,7 @@ bna_port_start(struct bna_port *port)
bfa_fsm_send_event(port, PORT_E_START);
}
-void
+static void
bna_port_stop(struct bna_port *port)
{
port->stop_cbfn = bna_device_cb_port_stopped;
@@ -1171,7 +1178,7 @@ bna_port_stop(struct bna_port *port)
bfa_fsm_send_event(port, PORT_E_STOP);
}
-void
+static void
bna_port_fail(struct bna_port *port)
{
port->flags &= ~BNA_PORT_F_DEVICE_READY;
@@ -1190,7 +1197,7 @@ bna_port_cb_rx_stopped(struct bna_port *
bfa_wc_down(&port->chld_stop_wc);
}
-void
+static void
bna_port_cb_link_up(struct bna_port *port, struct bfi_ll_aen *aen,
int status)
{
@@ -1218,7 +1225,7 @@ bna_port_cb_link_up(struct bna_port *por
port->link_cbfn(port->bna->bnad, port->llport.link_status);
}
-void
+static void
bna_port_cb_link_down(struct bna_port *port, int status)
{
port->llport.link_status = BNA_LINK_DOWN;
@@ -1293,54 +1300,6 @@ bna_port_mac_get(struct bna_port *port,
}
/**
- * Should be called only when port is disabled
- */
-void
-bna_port_type_set(struct bna_port *port, enum bna_port_type type)
-{
- port->type = type;
- port->llport.type = type;
-}
-
-/**
- * Should be called only when port is disabled
- */
-void
-bna_port_linkcbfn_set(struct bna_port *port,
- void (*linkcbfn)(struct bnad *, enum bna_link_status))
-{
- port->link_cbfn = linkcbfn;
-}
-
-void
-bna_port_admin_up(struct bna_port *port)
-{
- struct bna_llport *llport = &port->llport;
-
- if (llport->flags & BNA_LLPORT_F_ENABLED)
- return;
-
- llport->flags |= BNA_LLPORT_F_ENABLED;
-
- if (llport->flags & BNA_LLPORT_F_RX_ENABLED)
- bfa_fsm_send_event(llport, LLPORT_E_UP);
-}
-
-void
-bna_port_admin_down(struct bna_port *port)
-{
- struct bna_llport *llport = &port->llport;
-
- if (!(llport->flags & BNA_LLPORT_F_ENABLED))
- return;
-
- llport->flags &= ~BNA_LLPORT_F_ENABLED;
-
- if (llport->flags & BNA_LLPORT_F_RX_ENABLED)
- bfa_fsm_send_event(llport, LLPORT_E_DOWN);
-}
-
-/**
* DEVICE
*/
#define enable_mbox_intr(_device)\
@@ -1357,7 +1316,7 @@ do {\
bnad_cb_device_disable_mbox_intr((_device)->bna->bnad);\
} while (0)
-const struct bna_chip_regs_offset reg_offset[] =
+static const struct bna_chip_regs_offset reg_offset[] =
{{HOST_PAGE_NUM_FN0, HOSTFN0_INT_STATUS,
HOSTFN0_INT_MASK, HOST_MSIX_ERR_INDEX_FN0},
{HOST_PAGE_NUM_FN1, HOSTFN1_INT_STATUS,
@@ -1642,7 +1601,7 @@ static struct bfa_ioc_cbfn bfa_iocll_cbf
bna_device_cb_iocll_reset
};
-void
+static void
bna_device_init(struct bna_device *device, struct bna *bna,
struct bna_res_info *res_info)
{
@@ -1681,7 +1640,7 @@ bna_device_init(struct bna_device *devic
bfa_fsm_set_state(device, bna_device_sm_stopped);
}
-void
+static void
bna_device_uninit(struct bna_device *device)
{
bna_mbox_mod_uninit(&device->bna->mbox_mod);
@@ -1691,7 +1650,7 @@ bna_device_uninit(struct bna_device *dev
device->bna = NULL;
}
-void
+static void
bna_device_cb_port_stopped(void *arg, enum bna_cb_status status)
{
struct bna_device *device = (struct bna_device *)arg;
@@ -1699,7 +1658,7 @@ bna_device_cb_port_stopped(void *arg, en
bfa_fsm_send_event(device, DEVICE_E_PORT_STOPPED);
}
-int
+static int
bna_device_status_get(struct bna_device *device)
{
return device->fsm == (bfa_fsm_t)bna_device_sm_ready;
@@ -1733,13 +1692,13 @@ bna_device_disable(struct bna_device *de
bfa_fsm_send_event(device, DEVICE_E_DISABLE);
}
-int
+static int
bna_device_state_get(struct bna_device *device)
{
return bfa_sm_to_state(device_sm_table, device->fsm);
}
-u32 bna_dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX] = {
+static const u32 bna_dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX] = {
{12, 20},
{10, 18},
{8, 16},
@@ -1750,7 +1709,7 @@ u32 bna_dim_vector[BNA_LOAD_T_MAX][BNA_B
{1, 2},
};
-u32 bna_napi_dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX] = {
+const u32 bna_napi_dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX] = {
{12, 12},
{6, 10},
{5, 10},
@@ -1762,7 +1721,7 @@ u32 bna_napi_dim_vector[BNA_LOAD_T_MAX][
};
/* device */
-void
+static void
bna_adv_device_init(struct bna_device *device, struct bna *bna,
struct bna_res_info *res_info)
{
@@ -1790,7 +1749,7 @@ bna_adv_device_init(struct bna_device *d
/* utils */
-void
+static void
bna_adv_res_req(struct bna_res_info *res_info)
{
/* DMA memory for COMMON_MODULE */
@@ -2044,36 +2003,6 @@ bna_fw_stats_get(struct bna *bna)
bna->stats.txf_bmap[1] = bna->tx_mod.txf_bmap[1];
}
-static void
-bna_fw_cb_stats_clr(void *arg, int status)
-{
- struct bna *bna = (struct bna *)arg;
-
- bfa_q_qe_init(&bna->mbox_qe.qe);
-
- memset(bna->stats.sw_stats, 0, sizeof(struct bna_sw_stats));
- memset(bna->stats.hw_stats, 0, sizeof(struct bfi_ll_stats));
-
- bnad_cb_stats_clr(bna->bnad);
-}
-
-static void
-bna_fw_stats_clr(struct bna *bna)
-{
- struct bfi_ll_stats_req ll_req;
-
- bfi_h2i_set(ll_req.mh, BFI_MC_LL, BFI_LL_H2I_STATS_CLEAR_REQ, 0);
- ll_req.stats_mask = htons(BFI_LL_STATS_ALL);
- ll_req.rxf_id_mask[0] = htonl(0xffffffff);
- ll_req.rxf_id_mask[1] = htonl(0xffffffff);
- ll_req.txf_id_mask[0] = htonl(0xffffffff);
- ll_req.txf_id_mask[1] = htonl(0xffffffff);
-
- bna_mbox_qe_fill(&bna->mbox_qe, &ll_req, sizeof(ll_req),
- bna_fw_cb_stats_clr, bna);
- bna_mbox_send(bna, &bna->mbox_qe);
-}
-
void
bna_stats_get(struct bna *bna)
{
@@ -2083,22 +2012,8 @@ bna_stats_get(struct bna *bna)
bnad_cb_stats_get(bna->bnad, BNA_CB_FAIL, &bna->stats);
}
-void
-bna_stats_clr(struct bna *bna)
-{
- if (bna_device_status_get(&bna->device))
- bna_fw_stats_clr(bna);
- else {
- memset(&bna->stats.sw_stats, 0,
- sizeof(struct bna_sw_stats));
- memset(bna->stats.hw_stats, 0,
- sizeof(struct bfi_ll_stats));
- bnad_cb_stats_clr(bna->bnad);
- }
-}
-
/* IB */
-void
+static void
bna_ib_coalescing_timeo_set(struct bna_ib *ib, u8 coalescing_timeo)
{
ib->ib_config.coalescing_timeo = coalescing_timeo;
@@ -2157,7 +2072,7 @@ rxf_fltr_mbox_cmd(struct bna_rxf *rxf, u
bna_mbox_send(rxf->rx->bna, &rxf->mbox_qe);
}
-void
+static void
__rxf_default_function_config(struct bna_rxf *rxf, enum bna_status status)
{
struct bna_rx_fndb_ram *rx_fndb_ram;
@@ -2553,7 +2468,7 @@ rxf_reset_packet_filter_allmulti(struct
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_promisc_enable(struct bna_rxf *rxf)
{
struct bna *bna = rxf->rx->bna;
@@ -2584,7 +2499,7 @@ rxf_promisc_enable(struct bna_rxf *rxf)
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_promisc_disable(struct bna_rxf *rxf)
{
struct bna *bna = rxf->rx->bna;
@@ -2623,7 +2538,7 @@ rxf_promisc_disable(struct bna_rxf *rxf)
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_default_enable(struct bna_rxf *rxf)
{
struct bna *bna = rxf->rx->bna;
@@ -2654,7 +2569,7 @@ rxf_default_enable(struct bna_rxf *rxf)
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_default_disable(struct bna_rxf *rxf)
{
struct bna *bna = rxf->rx->bna;
@@ -2693,7 +2608,7 @@ rxf_default_disable(struct bna_rxf *rxf)
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_allmulti_enable(struct bna_rxf *rxf)
{
int ret = 0;
@@ -2721,7 +2636,7 @@ rxf_allmulti_enable(struct bna_rxf *rxf)
* 0 = no h/w change
* 1 = need h/w change
*/
-int
+static int
rxf_allmulti_disable(struct bna_rxf *rxf)
{
int ret = 0;
@@ -2745,158 +2660,7 @@ rxf_allmulti_disable(struct bna_rxf *rxf
return ret;
}
-/* RxF <- bnad */
-void
-bna_rx_mcast_delall(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
- struct list_head *qe;
- struct bna_mac *mac;
- int need_hw_config = 0;
- /* Purge all entries from pending_add_q */
- while (!list_empty(&rxf->mcast_pending_add_q)) {
- bfa_q_deq(&rxf->mcast_pending_add_q, &qe);
- mac = (struct bna_mac *)qe;
- bfa_q_qe_init(&mac->qe);
- bna_mcam_mod_mac_put(&rxf->rx->bna->mcam_mod, mac);
- }
-
- /* Schedule all entries in active_q for deletion */
- while (!list_empty(&rxf->mcast_active_q)) {
- bfa_q_deq(&rxf->mcast_active_q, &qe);
- mac = (struct bna_mac *)qe;
- bfa_q_qe_init(&mac->qe);
- list_add_tail(&mac->qe, &rxf->mcast_pending_del_q);
- need_hw_config = 1;
- }
-
- if (need_hw_config) {
- rxf->cam_fltr_cbfn = cbfn;
- rxf->cam_fltr_cbarg = rx->bna->bnad;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
- return;
- }
-
- if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
-}
-
-/* RxF <- Rx */
-void
-bna_rx_receive_resume(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
-
- if (rxf->rxf_oper_state == BNA_RXF_OPER_STATE_PAUSED) {
- rxf->oper_state_cbfn = cbfn;
- rxf->oper_state_cbarg = rx->bna->bnad;
- bfa_fsm_send_event(rxf, RXF_E_RESUME);
- } else if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
-}
-
-void
-bna_rx_receive_pause(struct bna_rx *rx,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
-
- if (rxf->rxf_oper_state == BNA_RXF_OPER_STATE_RUNNING) {
- rxf->oper_state_cbfn = cbfn;
- rxf->oper_state_cbarg = rx->bna->bnad;
- bfa_fsm_send_event(rxf, RXF_E_PAUSE);
- } else if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
-}
-
-/* RxF <- bnad */
-enum bna_cb_status
-bna_rx_ucast_add(struct bna_rx *rx, u8 *addr,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
- struct list_head *qe;
- struct bna_mac *mac;
-
- /* Check if already added */
- list_for_each(qe, &rxf->ucast_active_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
- return BNA_CB_SUCCESS;
- }
- }
-
- /* Check if pending addition */
- list_for_each(qe, &rxf->ucast_pending_add_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
- return BNA_CB_SUCCESS;
- }
- }
-
- mac = bna_ucam_mod_mac_get(&rxf->rx->bna->ucam_mod);
- if (mac == NULL)
- return BNA_CB_UCAST_CAM_FULL;
- bfa_q_qe_init(&mac->qe);
- memcpy(mac->addr, addr, ETH_ALEN);
- list_add_tail(&mac->qe, &rxf->ucast_pending_add_q);
-
- rxf->cam_fltr_cbfn = cbfn;
- rxf->cam_fltr_cbarg = rx->bna->bnad;
-
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
-
- return BNA_CB_SUCCESS;
-}
-
-/* RxF <- bnad */
-enum bna_cb_status
-bna_rx_ucast_del(struct bna_rx *rx, u8 *addr,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
- struct list_head *qe;
- struct bna_mac *mac;
-
- list_for_each(qe, &rxf->ucast_pending_add_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- list_del(qe);
- bfa_q_qe_init(qe);
- bna_ucam_mod_mac_put(&rxf->rx->bna->ucam_mod, mac);
- if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
- return BNA_CB_SUCCESS;
- }
- }
-
- list_for_each(qe, &rxf->ucast_active_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- list_del(qe);
- bfa_q_qe_init(qe);
- list_add_tail(qe, &rxf->ucast_pending_del_q);
- rxf->cam_fltr_cbfn = cbfn;
- rxf->cam_fltr_cbarg = rx->bna->bnad;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
- return BNA_CB_SUCCESS;
- }
- }
-
- return BNA_CB_INVALID_MAC;
-}
/* RxF <- bnad */
enum bna_cb_status
@@ -2978,38 +2742,6 @@ err_return:
return BNA_CB_FAIL;
}
-/* RxF <- bnad */
-void
-bna_rx_rss_enable(struct bna_rx *rx)
-{
- struct bna_rxf *rxf = &rx->rxf;
-
- rxf->rxf_flags |= BNA_RXF_FL_RSS_CONFIG_PENDING;
- rxf->rss_status = BNA_STATUS_T_ENABLED;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
-}
-
-/* RxF <- bnad */
-void
-bna_rx_rss_disable(struct bna_rx *rx)
-{
- struct bna_rxf *rxf = &rx->rxf;
-
- rxf->rxf_flags |= BNA_RXF_FL_RSS_CONFIG_PENDING;
- rxf->rss_status = BNA_STATUS_T_DISABLED;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
-}
-
-/* RxF <- bnad */
-void
-bna_rx_rss_reconfig(struct bna_rx *rx, struct bna_rxf_rss *rss_config)
-{
- struct bna_rxf *rxf = &rx->rxf;
- rxf->rxf_flags |= BNA_RXF_FL_RSS_CONFIG_PENDING;
- rxf->rss_status = BNA_STATUS_T_ENABLED;
- rxf->rss_cfg = *rss_config;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
-}
void
/* RxF <- bnad */
@@ -3024,68 +2756,8 @@ bna_rx_vlanfilter_enable(struct bna_rx *
}
}
-/* RxF <- bnad */
-void
-bna_rx_vlanfilter_disable(struct bna_rx *rx)
-{
- struct bna_rxf *rxf = &rx->rxf;
-
- if (rxf->vlan_filter_status == BNA_STATUS_T_ENABLED) {
- rxf->rxf_flags |= BNA_RXF_FL_VLAN_CONFIG_PENDING;
- rxf->vlan_filter_status = BNA_STATUS_T_DISABLED;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
- }
-}
-
/* Rx */
-struct bna_rxp *
-bna_rx_get_rxp(struct bna_rx *rx, int vector)
-{
- struct bna_rxp *rxp;
- struct list_head *qe;
-
- list_for_each(qe, &rx->rxp_q) {
- rxp = (struct bna_rxp *)qe;
- if (rxp->vector == vector)
- return rxp;
- }
- return NULL;
-}
-
-/*
- * bna_rx_rss_rit_set()
- * Sets the Q ids for the specified msi-x vectors in the RIT.
- * Maximum rit size supported is 64, which should be the max size of the
- * vectors array.
- */
-
-void
-bna_rx_rss_rit_set(struct bna_rx *rx, unsigned int *vectors, int nvectors)
-{
- int i;
- struct bna_rxp *rxp;
- struct bna_rxq *q0 = NULL, *q1 = NULL;
- struct bna *bna;
- struct bna_rxf *rxf;
-
- /* Build the RIT contents for this RX */
- bna = rx->bna;
-
- rxf = &rx->rxf;
- for (i = 0; i < nvectors; i++) {
- rxp = bna_rx_get_rxp(rx, vectors[i]);
-
- GET_RXQS(rxp, q0, q1);
- rxf->rit_segment->rit[i].large_rxq_id = q0->rxq_id;
- rxf->rit_segment->rit[i].small_rxq_id = (q1 ? q1->rxq_id : 0);
- }
-
- rxf->rit_segment->rit_size = nvectors;
-
- /* Subsequent call to enable/reconfig RSS will update the RIT in h/w */
-}
-
/* Rx <- bnad */
void
bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo)
@@ -3102,7 +2774,7 @@ bna_rx_coalescing_timeo_set(struct bna_r
/* Rx <- bnad */
void
-bna_rx_dim_reconfig(struct bna *bna, u32 vector[][BNA_BIAS_T_MAX])
+bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX])
{
int i, j;
@@ -3164,21 +2836,6 @@ bna_rx_dim_update(struct bna_ccb *ccb)
}
/* Tx */
-/* TX <- bnad */
-enum bna_cb_status
-bna_tx_prio_set(struct bna_tx *tx, int prio,
- void (*cbfn)(struct bnad *, struct bna_tx *,
- enum bna_cb_status))
-{
- if (tx->flags & BNA_TX_F_PRIO_LOCK)
- return BNA_CB_FAIL;
- else {
- tx->prio_change_cbfn = cbfn;
- bna_tx_prio_changed(tx, prio);
- }
-
- return BNA_CB_SUCCESS;
-}
/* TX <- bnad */
void
--- a/drivers/net/bna/bna_hw.h 2010-10-05 18:45:27.577646257 +0900
+++ b/drivers/net/bna/bna_hw.h 2010-10-05 18:45:32.957640709 +0900
@@ -1282,7 +1282,6 @@ struct bna_chip_regs_offset {
u32 fn_int_mask;
u32 msix_idx;
};
-extern const struct bna_chip_regs_offset reg_offset[];
struct bna_chip_regs {
void __iomem *page_addr;
--- a/drivers/net/bna/bna_txrx.c 2010-10-05 18:28:08.141648599 +0900
+++ b/drivers/net/bna/bna_txrx.c 2010-10-05 19:17:57.785641486 +0900
@@ -59,6 +59,10 @@ struct bna_ibidx_pool {
};
init_ibidx_pool(ibidx_pool);
+/* Callback from RXF to RX */
+static void bna_rx_cb_rxf_stopped(struct bna_rx *rx, enum bna_cb_status);
+static void bna_rx_cb_rxf_started(struct bna_rx *rx, enum bna_cb_status);
+
static struct bna_intr *
bna_intr_get(struct bna_ib_mod *ib_mod, enum bna_intr_type intr_type,
int vector)
@@ -195,7 +199,7 @@ bna_ib_mod_uninit(struct bna_ib_mod *ib_
ib_mod->bna = NULL;
}
-struct bna_ib *
+static struct bna_ib *
bna_ib_get(struct bna_ib_mod *ib_mod,
enum bna_intr_type intr_type,
int vector)
@@ -240,7 +244,7 @@ bna_ib_get(struct bna_ib_mod *ib_mod,
return ib;
}
-void
+static void
bna_ib_put(struct bna_ib_mod *ib_mod, struct bna_ib *ib)
{
bna_intr_put(ib_mod, ib->intr);
@@ -255,7 +259,7 @@ bna_ib_put(struct bna_ib_mod *ib_mod, st
}
/* Returns index offset - starting from 0 */
-int
+static int
bna_ib_reserve_idx(struct bna_ib *ib)
{
struct bna_ib_mod *ib_mod = &ib->bna->ib_mod;
@@ -309,7 +313,7 @@ bna_ib_reserve_idx(struct bna_ib *ib)
return idx;
}
-void
+static void
bna_ib_release_idx(struct bna_ib *ib, int idx)
{
struct bna_ib_mod *ib_mod = &ib->bna->ib_mod;
@@ -356,7 +360,7 @@ bna_ib_release_idx(struct bna_ib *ib, in
}
}
-int
+static int
bna_ib_config(struct bna_ib *ib, struct bna_ib_config *ib_config)
{
if (ib->start_count)
@@ -374,7 +378,7 @@ bna_ib_config(struct bna_ib *ib, struct
return 0;
}
-void
+static void
bna_ib_start(struct bna_ib *ib)
{
struct bna_ib_blk_mem ib_cfg;
@@ -450,7 +454,7 @@ bna_ib_start(struct bna_ib *ib)
}
}
-void
+static void
bna_ib_stop(struct bna_ib *ib)
{
u32 intx_mask;
@@ -468,7 +472,7 @@ bna_ib_stop(struct bna_ib *ib)
}
}
-void
+static void
bna_ib_fail(struct bna_ib *ib)
{
ib->start_count = 0;
@@ -1394,7 +1398,7 @@ rxf_reset_packet_filter(struct bna_rxf *
rxf_reset_packet_filter_allmulti(rxf);
}
-void
+static void
bna_rxf_init(struct bna_rxf *rxf,
struct bna_rx *rx,
struct bna_rx_config *q_config)
@@ -1444,7 +1448,7 @@ bna_rxf_init(struct bna_rxf *rxf,
bfa_fsm_set_state(rxf, bna_rxf_sm_stopped);
}
-void
+static void
bna_rxf_uninit(struct bna_rxf *rxf)
{
struct bna_mac *mac;
@@ -1476,7 +1480,7 @@ bna_rxf_uninit(struct bna_rxf *rxf)
rxf->rx = NULL;
}
-void
+static void
bna_rxf_start(struct bna_rxf *rxf)
{
rxf->start_cbfn = bna_rx_cb_rxf_started;
@@ -1485,7 +1489,7 @@ bna_rxf_start(struct bna_rxf *rxf)
bfa_fsm_send_event(rxf, RXF_E_START);
}
-void
+static void
bna_rxf_stop(struct bna_rxf *rxf)
{
rxf->stop_cbfn = bna_rx_cb_rxf_stopped;
@@ -1493,7 +1497,7 @@ bna_rxf_stop(struct bna_rxf *rxf)
bfa_fsm_send_event(rxf, RXF_E_STOP);
}
-void
+static void
bna_rxf_fail(struct bna_rxf *rxf)
{
rxf->rxf_flags |= BNA_RXF_FL_FAILED;
@@ -1575,42 +1579,6 @@ bna_rx_mcast_add(struct bna_rx *rx, u8 *
return BNA_CB_SUCCESS;
}
-enum bna_cb_status
-bna_rx_mcast_del(struct bna_rx *rx, u8 *addr,
- void (*cbfn)(struct bnad *, struct bna_rx *,
- enum bna_cb_status))
-{
- struct bna_rxf *rxf = &rx->rxf;
- struct list_head *qe;
- struct bna_mac *mac;
-
- list_for_each(qe, &rxf->mcast_pending_add_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- list_del(qe);
- bfa_q_qe_init(qe);
- bna_mcam_mod_mac_put(&rxf->rx->bna->mcam_mod, mac);
- if (cbfn)
- (*cbfn)(rx->bna->bnad, rx, BNA_CB_SUCCESS);
- return BNA_CB_SUCCESS;
- }
- }
-
- list_for_each(qe, &rxf->mcast_active_q) {
- mac = (struct bna_mac *)qe;
- if (BNA_MAC_IS_EQUAL(mac->addr, addr)) {
- list_del(qe);
- bfa_q_qe_init(qe);
- list_add_tail(qe, &rxf->mcast_pending_del_q);
- rxf->cam_fltr_cbfn = cbfn;
- rxf->cam_fltr_cbarg = rx->bna->bnad;
- bfa_fsm_send_event(rxf, RXF_E_CAM_FLTR_MOD);
- return BNA_CB_SUCCESS;
- }
- }
-
- return BNA_CB_INVALID_MAC;
-}
enum bna_cb_status
bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mclist,
@@ -1862,7 +1830,7 @@ bfa_fsm_state_decl(bna_rx, rxf_stop_wait
bfa_fsm_state_decl(bna_rx, rxq_stop_wait,
struct bna_rx, enum bna_rx_event);
-static struct bfa_sm_table rx_sm_table[] = {
+static const struct bfa_sm_table rx_sm_table[] = {
{BFA_SM(bna_rx_sm_stopped), BNA_RX_STOPPED},
{BFA_SM(bna_rx_sm_rxf_start_wait), BNA_RX_RXF_START_WAIT},
{BFA_SM(bna_rx_sm_started), BNA_RX_STARTED},
@@ -2247,7 +2215,7 @@ bna_rit_create(struct bna_rx *rx)
}
}
-int
+static int
_rx_can_satisfy(struct bna_rx_mod *rx_mod,
struct bna_rx_config *rx_cfg)
{
@@ -2272,7 +2240,7 @@ _rx_can_satisfy(struct bna_rx_mod *rx_mo
return 1;
}
-struct bna_rxq *
+static struct bna_rxq *
_get_free_rxq(struct bna_rx_mod *rx_mod)
{
struct bna_rxq *rxq = NULL;
@@ -2286,7 +2254,7 @@ _get_free_rxq(struct bna_rx_mod *rx_mod)
return rxq;
}
-void
+static void
_put_free_rxq(struct bna_rx_mod *rx_mod, struct bna_rxq *rxq)
{
bfa_q_qe_init(&rxq->qe);
@@ -2294,7 +2262,7 @@ _put_free_rxq(struct bna_rx_mod *rx_mod,
rx_mod->rxq_free_count++;
}
-struct bna_rxp *
+static struct bna_rxp *
_get_free_rxp(struct bna_rx_mod *rx_mod)
{
struct list_head *qe = NULL;
@@ -2310,7 +2278,7 @@ _get_free_rxp(struct bna_rx_mod *rx_mod)
return rxp;
}
-void
+static void
_put_free_rxp(struct bna_rx_mod *rx_mod, struct bna_rxp *rxp)
{
bfa_q_qe_init(&rxp->qe);
@@ -2318,7 +2286,7 @@ _put_free_rxp(struct bna_rx_mod *rx_mod,
rx_mod->rxp_free_count++;
}
-struct bna_rx *
+static struct bna_rx *
_get_free_rx(struct bna_rx_mod *rx_mod)
{
struct list_head *qe = NULL;
@@ -2336,7 +2304,7 @@ _get_free_rx(struct bna_rx_mod *rx_mod)
return rx;
}
-void
+static void
_put_free_rx(struct bna_rx_mod *rx_mod, struct bna_rx *rx)
{
bfa_q_qe_init(&rx->qe);
@@ -2344,7 +2312,7 @@ _put_free_rx(struct bna_rx_mod *rx_mod,
rx_mod->rx_free_count++;
}
-void
+static void
_rx_init(struct bna_rx *rx, struct bna *bna)
{
rx->bna = bna;
@@ -2360,7 +2328,7 @@ _rx_init(struct bna_rx *rx, struct bna *
rx->stop_cbarg = NULL;
}
-void
+static void
_rxp_add_rxqs(struct bna_rxp *rxp,
struct bna_rxq *q0,
struct bna_rxq *q1)
@@ -2383,7 +2351,7 @@ _rxp_add_rxqs(struct bna_rxp *rxp,
}
}
-void
+static void
_rxq_qpt_init(struct bna_rxq *rxq,
struct bna_rxp *rxp,
u32 page_count,
@@ -2412,7 +2380,7 @@ _rxq_qpt_init(struct bna_rxq *rxq,
}
}
-void
+static void
_rxp_cqpt_setup(struct bna_rxp *rxp,
u32 page_count,
u32 page_size,
@@ -2441,13 +2409,13 @@ _rxp_cqpt_setup(struct bna_rxp *rxp,
}
}
-void
+static void
_rx_add_rxp(struct bna_rx *rx, struct bna_rxp *rxp)
{
list_add_tail(&rxp->qe, &rx->rxp_q);
}
-void
+static void
_init_rxmod_queues(struct bna_rx_mod *rx_mod)
{
INIT_LIST_HEAD(&rx_mod->rx_free_q);
@@ -2460,7 +2428,7 @@ _init_rxmod_queues(struct bna_rx_mod *rx
rx_mod->rxp_free_count = 0;
}
-void
+static void
_rx_ctor(struct bna_rx *rx, int id)
{
bfa_q_qe_init(&rx->qe);
@@ -2492,7 +2460,7 @@ bna_rx_cb_rxq_stopped_all(void *arg)
bfa_fsm_send_event(rx, RX_E_RXQ_STOPPED);
}
-void
+static void
bna_rx_mod_cb_rx_stopped(void *arg, struct bna_rx *rx,
enum bna_cb_status status)
{
@@ -2501,7 +2469,7 @@ bna_rx_mod_cb_rx_stopped(void *arg, stru
bfa_wc_down(&rx_mod->rx_stop_wc);
}
-void
+static void
bna_rx_mod_cb_rx_stopped_all(void *arg)
{
struct bna_rx_mod *rx_mod = (struct bna_rx_mod *)arg;
@@ -2511,7 +2479,7 @@ bna_rx_mod_cb_rx_stopped_all(void *arg)
rx_mod->stop_cbfn = NULL;
}
-void
+static void
bna_rx_start(struct bna_rx *rx)
{
rx->rx_flags |= BNA_RX_F_PORT_ENABLED;
@@ -2519,7 +2487,7 @@ bna_rx_start(struct bna_rx *rx)
bfa_fsm_send_event(rx, RX_E_START);
}
-void
+static void
bna_rx_stop(struct bna_rx *rx)
{
rx->rx_flags &= ~BNA_RX_F_PORT_ENABLED;
@@ -2532,7 +2500,7 @@ bna_rx_stop(struct bna_rx *rx)
}
}
-void
+static void
bna_rx_fail(struct bna_rx *rx)
{
/* Indicate port is not enabled, and failed */
@@ -3731,7 +3699,7 @@ bna_tx_fail(struct bna_tx *tx)
bfa_fsm_send_event(tx, TX_E_FAIL);
}
-void
+static void
bna_tx_prio_changed(struct bna_tx *tx, int prio)
{
struct bna_txq *txq;
--- a/drivers/net/bna/bnad.c 2010-10-05 18:28:08.157640648 +0900
+++ b/drivers/net/bna/bnad.c 2010-10-05 19:11:35.125672896 +0900
@@ -28,7 +28,7 @@
#include "bna.h"
#include "cna.h"
-DEFINE_MUTEX(bnad_fwimg_mutex);
+static DEFINE_MUTEX(bnad_fwimg_mutex);
/*
* Module params
@@ -46,7 +46,7 @@ MODULE_PARM_DESC(bnad_ioc_auto_recover,
*/
u32 bnad_rxqs_per_cq = 2;
-const u8 bnad_bcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+static const u8 bnad_bcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
/*
* Local MACROS
@@ -684,7 +684,7 @@ bnad_enable_mbox_irq(struct bnad *bnad)
* Called with bnad->bna_lock held b'cos of
* bnad->cfg_flags access.
*/
-void
+static void
bnad_disable_mbox_irq(struct bnad *bnad)
{
int irq = BNAD_GET_MBOX_IRQ(bnad);
@@ -953,11 +953,6 @@ bnad_cb_stats_get(struct bnad *bnad, enu
jiffies + msecs_to_jiffies(BNAD_STATS_TIMER_FREQ));
}
-void
-bnad_cb_stats_clr(struct bnad *bnad)
-{
-}
-
/* Resource allocation, free functions */
static void
@@ -3211,7 +3206,7 @@ bnad_pci_remove(struct pci_dev *pdev)
free_netdev(netdev);
}
-const struct pci_device_id bnad_pci_id_table[] = {
+static const struct pci_device_id bnad_pci_id_table[] = {
{
PCI_DEVICE(PCI_VENDOR_ID_BROCADE,
PCI_DEVICE_ID_BROCADE_CT),
--- a/drivers/net/bna/cna_fwimg.c 2010-10-05 18:28:08.173646664 +0900
+++ b/drivers/net/bna/cna_fwimg.c 2010-10-05 18:29:06.225688125 +0900
@@ -22,7 +22,7 @@ const struct firmware *bfi_fw;
static u32 *bfi_image_ct_cna;
static u32 bfi_image_ct_cna_size;
-u32 *
+static u32 *
cna_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
u32 *bfi_image_size, char *fw_name)
{
--- a/drivers/net/bna/bfa_ioc.h 2010-10-05 18:54:23.662672433 +0900
+++ b/drivers/net/bna/bfa_ioc.h 2010-10-05 18:54:30.857688208 +0900
@@ -271,7 +271,6 @@ void bfa_nw_ioc_enable(struct bfa_ioc *i
void bfa_nw_ioc_disable(struct bfa_ioc *ioc);
void bfa_nw_ioc_error_isr(struct bfa_ioc *ioc);
-bool bfa_nw_ioc_is_operational(struct bfa_ioc *ioc);
void bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr);
void bfa_nw_ioc_hbfail_register(struct bfa_ioc *ioc,
--- a/drivers/net/bna/bfa_sm.h 2010-10-05 19:12:40.405663296 +0900
+++ b/drivers/net/bna/bfa_sm.h 2010-10-05 19:12:48.897641119 +0900
@@ -77,7 +77,7 @@ typedef void (*bfa_fsm_t)(void *fsm, int
((_fsm)->fsm == (bfa_fsm_t)(_state))
static inline int
-bfa_sm_to_state(struct bfa_sm_table *smt, bfa_sm_t sm)
+bfa_sm_to_state(const struct bfa_sm_table *smt, bfa_sm_t sm)
{
int i = 0;
^ permalink raw reply
* Re: [PATCH] iwl3945: queue the right work if the scan needs to be aborted
From: Florian Mickler @ 2010-10-05 10:12 UTC (permalink / raw)
To: Stanislaw Gruszka
Cc: stable, linux-wireless@vger.kernel.org, Guy, Wey-Yi,
Chatre, Reinette, Intel Linux Wireless, John W. Linville,
Berg, Johannes, Cahill, Ben M, netdev@vger.kernel.org,
linux-kernel
In-Reply-To: <20101005085717.GA18012@redhat.com>
On Tue, 5 Oct 2010 10:57:17 +0200
Stanislaw Gruszka <sgruszka@redhat.com> wrote:
> On Tue, Oct 05, 2010 at 08:43:05AM +0200, Florian Mickler wrote:
> > commit e7ee762cf074b0fd8eec483d0cef8fdbf0d04b81
> >
> >
> > Begin forwarded message:
> > On Fri, 2010-09-24 at 09:22 -0700, Florian Mickler wrote:
> > > iwl3945's scan_completed calls into the mac80211 stack which triggers a
> > > warn on if there is no scan outstanding.
> > >
> > > This can be avoided by not calling scan_completed but abort_scan in
> > > iwl3945_request_scan in the done: branch of the function which is used
> > > as an error out.
> > >
> > > The done: branch seems to be an error-out branch, as, for example, if
> > > iwl_is_ready(priv) returns false the done: branch is executed.
> > >
> > > NOTE:
> > > I'm not familiar with the driver at all.
> > > I just quickly scanned as a reaction to
> > >
> > > https://bugzilla.kernel.org/show_bug.cgi?id=17722
> > >
> > > the users of scan_completed in the iwl3945 driver and noted the odd
> > > discrepancy between the comment above this instance and the comment in
> > > mac80211 scan_completed function.
> > > Signed-off-by: Florian Mickler <florian@mickler.org>
> > Acked-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
> > > ---
> > go into wireless-2.6 and stable only, scan fix already in
> > wireless-next-2.6
>
> >
> > Thanks
> > Wey
> >
> > > drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 2 +-
> > > drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +-
> > > 2 files changed, 2 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > > index 9dd9e64..8fd00a6 100644
> > > --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > > +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > > @@ -1411,7 +1411,7 @@ void iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
> > > clear_bit(STATUS_SCAN_HW, &priv->status);
> > > clear_bit(STATUS_SCANNING, &priv->status);
> > > /* inform mac80211 scan aborted */
> > > - queue_work(priv->workqueue, &priv->scan_completed);
> > > + queue_work(priv->workqueue, &priv->abort_scan);
>
> Unfortunately this patch is not right thing to do. If you look at
> abort_scan work, it do nothing if STATUS_SCAN_ABORTING bit is not set.
> That's wrong because we have to complete scan (with abort == true).
> If STATUS_SCAN_ABORTING will be set, abort_work will send scan cancel
> commands to hardware what is wrong if scan was not started yet.
>
> What we can eventually do, except apply iwl-scan rewrite from
> wireless-testing, is something like that:
>
> iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
>
> clear_bit(STATUS_SCAN_HW, &priv->status);
> clear_bit(STATUS_SCANNING, &priv->status);
> /* inform mac80211 scan aborted */
> set_bit(STATUS_SCAN_ABORTING, &priv->status);
> queue_work(priv->workqueue, &priv->scan_completed);
>
> ieee80211_scan_completed
>
> if (!internal) {
> bool aborted = test_bit(STATUS_SCAN_ABORTING, &priv->status);
> ieee80211_scan_completed(priv->hw, aborted);
>
> }
>
> However, I do not think we should go with that to -stable (below
> 2.6.36). IIRC warnings showed up in current 2.6.36-rc, because of
> some other changes in the code.
>
> Stanislaw
Thx for looking at this. I suspect you know the code better than I do.. what is about the
first jump to :done in iwlagn_request_scan()
if (!iwl_is_ready(priv)) {
IWL_WARN(priv, "request scan called when driver not ready.\n");
goto done;
}
Does abort_scan need to do anything in that case?
I can't see where we set up the hardware for scanning in that case.
(I've gone through the codepath coming from the mac80211 hw_scan)
Regards,
Flo
^ permalink raw reply
* Re: [patch v5 00/12] IPVS: SIP Persistence Engine
From: Simon Horman @ 2010-10-05 10:00 UTC (permalink / raw)
To: Patrick McHardy
Cc: lvs-devel, netdev, netfilter, netfilter-devel, Jan Engelhardt,
Stephen Hemminger, Wensong Zhang, Julian Anastasov
In-Reply-To: <4CAA215C.8040605@trash.net>
On Mon, Oct 04, 2010 at 08:47:56PM +0200, Patrick McHardy wrote:
> Am 04.10.2010 15:46, schrieb Simon Horman:
> > CODE AVAILABILITY
> >
> > The kernel patches (12) are available in git as the pe-5 branch of
> > git://git.kernel.org/pub/scm/linux/kernel/git/horms/lvs-test-2.6.git
>
> Pulled, thanks Simon. I get a warning in ip_vs_pe_sip.c however,
> please send a fix for this on top.
>
> net/netfilter/ipvs/ip_vs_pe_sip.c:11: warning: 'ip_vs_dbg_callid'
> defined but not used
Sorry about that, I will investigate and send a fix.
^ permalink raw reply
* Re: Fw: [PATCH] iwl3945: queue the right work if the scan needs to be aborted
From: Stanislaw Gruszka @ 2010-10-05 8:57 UTC (permalink / raw)
To: Florian Mickler
Cc: stable-DgEjT+Ai2ygdnm+yROfE0A,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Guy, Wey-Yi, Chatre, Reinette, Intel Linux Wireless,
John W. Linville, Berg, Johannes, Cahill, Ben M,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20101005084305.52a31ed4-mGsOIKOveelVRbCss4o9kg@public.gmane.org>
On Tue, Oct 05, 2010 at 08:43:05AM +0200, Florian Mickler wrote:
> commit e7ee762cf074b0fd8eec483d0cef8fdbf0d04b81
>
>
> Begin forwarded message:
> On Fri, 2010-09-24 at 09:22 -0700, Florian Mickler wrote:
> > iwl3945's scan_completed calls into the mac80211 stack which triggers a
> > warn on if there is no scan outstanding.
> >
> > This can be avoided by not calling scan_completed but abort_scan in
> > iwl3945_request_scan in the done: branch of the function which is used
> > as an error out.
> >
> > The done: branch seems to be an error-out branch, as, for example, if
> > iwl_is_ready(priv) returns false the done: branch is executed.
> >
> > NOTE:
> > I'm not familiar with the driver at all.
> > I just quickly scanned as a reaction to
> >
> > https://bugzilla.kernel.org/show_bug.cgi?id=17722
> >
> > the users of scan_completed in the iwl3945 driver and noted the odd
> > discrepancy between the comment above this instance and the comment in
> > mac80211 scan_completed function.
> > Signed-off-by: Florian Mickler <florian-sVu6HhrpSfRAfugRpC6u6w@public.gmane.org>
> Acked-by: Wey-Yi Guy <wey-yi.w.guy-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> > ---
> go into wireless-2.6 and stable only, scan fix already in
> wireless-next-2.6
>
> Thanks
> Wey
>
> > drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 2 +-
> > drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +-
> > 2 files changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > index 9dd9e64..8fd00a6 100644
> > --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
> > @@ -1411,7 +1411,7 @@ void iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
> > clear_bit(STATUS_SCAN_HW, &priv->status);
> > clear_bit(STATUS_SCANNING, &priv->status);
> > /* inform mac80211 scan aborted */
> > - queue_work(priv->workqueue, &priv->scan_completed);
> > + queue_work(priv->workqueue, &priv->abort_scan);
Unfortunately this patch is not right thing to do. If you look at
abort_scan work, it do nothing if STATUS_SCAN_ABORTING bit is not set.
That's wrong because we have to complete scan (with abort == true).
If STATUS_SCAN_ABORTING will be set, abort_work will send scan cancel
commands to hardware what is wrong if scan was not started yet.
What we can eventually do, except apply iwl-scan rewrite from
wireless-testing, is something like that:
iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
clear_bit(STATUS_SCAN_HW, &priv->status);
clear_bit(STATUS_SCANNING, &priv->status);
/* inform mac80211 scan aborted */
set_bit(STATUS_SCAN_ABORTING, &priv->status);
queue_work(priv->workqueue, &priv->scan_completed);
ieee80211_scan_completed
if (!internal) {
bool aborted = test_bit(STATUS_SCAN_ABORTING, &priv->status);
ieee80211_scan_completed(priv->hw, aborted);
}
However, I do not think we should go with that to -stable (below
2.6.36). IIRC warnings showed up in current 2.6.36-rc, because of
some other changes in the code.
Stanislaw
--
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] caif: fix two caif_connect() bugs
From: Eric Dumazet @ 2010-10-05 8:42 UTC (permalink / raw)
To: David Miller; +Cc: netdev, Sjur Braendeland
caif_connect() might dereference a netdevice after dev_put() it.
It also doesnt check dev_get_by_index() return value and could
dereference a NULL pointer.
Fix it, using RCU to avoid taking a reference.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Sjur Braendeland <sjur.brandeland@stericsson.com>
---
net/caif/caif_socket.c | 21 +++++++++++++++------
1 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index 8ce9047..4bf28f2 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -827,6 +827,7 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
long timeo;
int err;
int ifindex, headroom, tailroom;
+ unsigned int mtu;
struct net_device *dev;
lock_sock(sk);
@@ -896,15 +897,23 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
cf_sk->sk.sk_state = CAIF_DISCONNECTED;
goto out;
}
- dev = dev_get_by_index(sock_net(sk), ifindex);
+
+ err = -ENODEV;
+ rcu_read_lock();
+ dev = dev_get_by_index_rcu(sock_net(sk), ifindex);
+ if (!dev) {
+ rcu_read_unlock();
+ goto out;
+ }
cf_sk->headroom = LL_RESERVED_SPACE_EXTRA(dev, headroom);
+ mtu = dev->mtu;
+ rcu_read_unlock();
+
cf_sk->tailroom = tailroom;
- cf_sk->maxframe = dev->mtu - (headroom + tailroom);
- dev_put(dev);
+ cf_sk->maxframe = mtu - (headroom + tailroom);
if (cf_sk->maxframe < 1) {
- pr_warning("CAIF: %s(): CAIF Interface MTU too small (%d)\n",
- __func__, dev->mtu);
- err = -ENODEV;
+ pr_warning("CAIF: %s(): CAIF Interface MTU too small (%u)\n",
+ __func__, mtu);
goto out;
}
^ permalink raw reply related
* [PATCH] ppp: Use a real SKB control block in fragmentation engine.
From: David Miller @ 2010-10-05 8:37 UTC (permalink / raw)
To: netdev
Do this instead of subverting fields in skb proper.
The macros that could very easily match variable or function
names were also just asking for trouble.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
Committed to net-next-2.6
drivers/net/ppp_generic.c | 46 ++++++++++++++++++++++++--------------------
1 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
index 736b917..866e221 100644
--- a/drivers/net/ppp_generic.c
+++ b/drivers/net/ppp_generic.c
@@ -1547,9 +1547,11 @@ ppp_channel_push(struct channel *pch)
* Receive-side routines.
*/
-/* misuse a few fields of the skb for MP reconstruction */
-#define sequence priority
-#define BEbits cb[0]
+struct ppp_mp_skb_parm {
+ u32 sequence;
+ u8 BEbits;
+};
+#define PPP_MP_CB(skb) ((struct ppp_mp_skb_parm *)((skb)->cb))
static inline void
ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
@@ -1878,13 +1880,13 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5];
mask = 0xffffff;
}
- skb->BEbits = skb->data[2];
+ PPP_MP_CB(skb)->BEbits = skb->data[2];
skb_pull(skb, mphdrlen); /* pull off PPP and MP headers */
/*
* Do protocol ID decompression on the first fragment of each packet.
*/
- if ((skb->BEbits & B) && (skb->data[0] & 1))
+ if ((PPP_MP_CB(skb)->BEbits & B) && (skb->data[0] & 1))
*skb_push(skb, 1) = 0;
/*
@@ -1896,7 +1898,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
seq += mask + 1;
else if ((int)(seq - ppp->minseq) > (int)(mask >> 1))
seq -= mask + 1; /* should never happen */
- skb->sequence = seq;
+ PPP_MP_CB(skb)->sequence = seq;
pch->lastseq = seq;
/*
@@ -1932,8 +1934,8 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
before the start of the queue. */
if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) {
struct sk_buff *mskb = skb_peek(&ppp->mrq);
- if (seq_before(ppp->minseq, mskb->sequence))
- ppp->minseq = mskb->sequence;
+ if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence))
+ ppp->minseq = PPP_MP_CB(mskb)->sequence;
}
/* Pull completed packets off the queue and receive them. */
@@ -1963,12 +1965,12 @@ ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb)
{
struct sk_buff *p;
struct sk_buff_head *list = &ppp->mrq;
- u32 seq = skb->sequence;
+ u32 seq = PPP_MP_CB(skb)->sequence;
/* N.B. we don't need to lock the list lock because we have the
ppp unit receive-side lock. */
skb_queue_walk(list, p) {
- if (seq_before(seq, p->sequence))
+ if (seq_before(seq, PPP_MP_CB(p)->sequence))
break;
}
__skb_queue_before(list, p, skb);
@@ -1997,22 +1999,22 @@ ppp_mp_reconstruct(struct ppp *ppp)
tail = NULL;
for (p = head; p != (struct sk_buff *) list; p = next) {
next = p->next;
- if (seq_before(p->sequence, seq)) {
+ if (seq_before(PPP_MP_CB(p)->sequence, seq)) {
/* this can't happen, anyway ignore the skb */
printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n",
- p->sequence, seq);
+ PPP_MP_CB(p)->sequence, seq);
head = next;
continue;
}
- if (p->sequence != seq) {
+ if (PPP_MP_CB(p)->sequence != seq) {
/* Fragment `seq' is missing. If it is after
minseq, it might arrive later, so stop here. */
if (seq_after(seq, minseq))
break;
/* Fragment `seq' is lost, keep going. */
lost = 1;
- seq = seq_before(minseq, p->sequence)?
- minseq + 1: p->sequence;
+ seq = seq_before(minseq, PPP_MP_CB(p)->sequence)?
+ minseq + 1: PPP_MP_CB(p)->sequence;
next = p;
continue;
}
@@ -2026,7 +2028,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
*/
/* B bit set indicates this fragment starts a packet */
- if (p->BEbits & B) {
+ if (PPP_MP_CB(p)->BEbits & B) {
head = p;
lost = 0;
len = 0;
@@ -2035,7 +2037,8 @@ ppp_mp_reconstruct(struct ppp *ppp)
len += p->len;
/* Got a complete packet yet? */
- if (lost == 0 && (p->BEbits & E) && (head->BEbits & B)) {
+ if (lost == 0 && (PPP_MP_CB(p)->BEbits & E) &&
+ (PPP_MP_CB(head)->BEbits & B)) {
if (len > ppp->mrru + 2) {
++ppp->dev->stats.rx_length_errors;
printk(KERN_DEBUG "PPP: reconstructed packet"
@@ -2061,7 +2064,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
* and we haven't found a complete valid packet yet,
* we can discard up to and including this fragment.
*/
- if (p->BEbits & E)
+ if (PPP_MP_CB(p)->BEbits & E)
head = next;
++seq;
@@ -2071,10 +2074,11 @@ ppp_mp_reconstruct(struct ppp *ppp)
if (tail != NULL) {
/* If we have discarded any fragments,
signal a receive error. */
- if (head->sequence != ppp->nextseq) {
+ if (PPP_MP_CB(head)->sequence != ppp->nextseq) {
if (ppp->debug & 1)
printk(KERN_DEBUG " missed pkts %u..%u\n",
- ppp->nextseq, head->sequence-1);
+ ppp->nextseq,
+ PPP_MP_CB(head)->sequence-1);
++ppp->dev->stats.rx_dropped;
ppp_receive_error(ppp);
}
@@ -2083,7 +2087,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
/* copy to a single skb */
for (p = head; p != tail->next; p = p->next)
skb_copy_bits(p, 0, skb_put(skb, p->len), p->len);
- ppp->nextseq = tail->sequence + 1;
+ ppp->nextseq = PPP_MP_CB(tail)->sequence + 1;
head = tail->next;
}
--
1.7.3.1
^ permalink raw reply related
* Re: [PATCH] caif: remove duplicated include
From: David Miller @ 2010-10-05 7:49 UTC (permalink / raw)
To: sjur.brandeland; +Cc: nikai, netdev, linux-kernel
In-Reply-To: <81C3A93C17462B4BBD7E272753C1057919238FAF3A@EXDCVYMBSTM005.EQ1STM.local>
From: Sjur BRENDELAND <sjur.brandeland@stericsson.com>
Date: Tue, 5 Oct 2010 08:34:13 +0200
> Nicolas Kaiser wrote:
>> Remove duplicated include.
>>
>> Signed-off-by: Nicolas Kaiser <nikai@nikai.net>
>
> Looks good, thanks.
> Acked-by: Sjur Braendeland <sjur.brandeland@stericsson.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] ipv6: make __ipv6_isatap_ifid static
From: David Miller @ 2010-10-05 7:49 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20101005151753.363121b8@s6510>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 5 Oct 2010 15:17:53 +0900
> Another exported symbol only used in one file
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] fib: fib_rules_cleanup can be static
From: David Miller @ 2010-10-05 7:49 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20101005151417.57eae0b0@s6510>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 5 Oct 2010 15:14:17 +0900
> fib_rules_cleanup_ups is only defined and used in one place.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] fib: cleanups
From: David Miller @ 2010-10-05 7:48 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev
In-Reply-To: <1286258418.2457.7.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Tue, 05 Oct 2010 08:00:18 +0200
> Code style cleanups before upcoming functional changes.
> C99 initializer for fib_props array.
>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] qlcnic: remove dead code
From: David Miller @ 2010-10-05 7:48 UTC (permalink / raw)
To: shemminger
Cc: amit.salecha, netdev, ameen.rahman, anirban.chakraborty,
sritej.velaga
In-Reply-To: <20101005104430.554c03e6@s6510>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 5 Oct 2010 10:44:30 +0900
> This driver has several pieces of dead code (found by running
> make namespacecheck). This patch removes them.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] wimax: make functions local
From: David Miller @ 2010-10-05 7:48 UTC (permalink / raw)
To: shemminger; +Cc: inaky, linux-wimax, netdev
In-Reply-To: <20101005145959.362fbd85@s6510>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 5 Oct 2010 14:59:59 +0900
> Make wimax variables and functions local if possible.
> Compile tested only.
>
> This also removes a couple of unused EXPORT_SYMBOL.
> If this breaks some out of tree code, please fix that
> by putting the code in the kernel tree.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [patch] cls_u32: signedness bug
From: David Miller @ 2010-10-05 7:40 UTC (permalink / raw)
To: error27; +Cc: hadi, shemminger, elendil, xiaosuo, netdev, kernel-janitors
In-Reply-To: <20101004122836.GB5692@bicker>
From: Dan Carpenter <error27@gmail.com>
Date: Mon, 4 Oct 2010 14:28:36 +0200
> skb_headroom() is unsigned so "skb_headroom(skb) + toff" is also
> unsigned and can't be less than zero. This test was added in 66d50d25:
> "u32: negative offset fix" It was supposed to fix a regression.
>
> Signed-off-by: Dan Carpenter <error27@gmail.com>
> ---
> Compile tested only. Please check.
This looks correct to me, thanks for fixing this.
Applied.
^ permalink raw reply
* Re: [PATCH 2/2] [RFC] don't let BCM63XX_PHY depend on non-existant symbol
From: David Miller @ 2010-10-05 7:36 UTC (permalink / raw)
To: u.kleine-koenig; +Cc: netdev, mbizon, florian, ralf
In-Reply-To: <1286185413-22924-2-git-send-email-u.kleine-koenig@pengutronix.de>
From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date: Mon, 4 Oct 2010 11:43:33 +0200
> The kernel doesn't have a symbol called BCM63XX. There is a symbol
> BCM63XX_ENET (introduced in 9b1fc55a0500, 6 weeks after 09bb9aa0ed that
> introduced BCM63XX_PHY), but the driver compiles without that, too.
>
> Cc: Maxime Bizon <mbizon@freebox.fr>
> Cc: Florian Fainelli <florian@openwrt.org>
> Cc: David S. Miller <davem@davemloft.net>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Looks good to me, applied.
Thanks.
^ permalink raw reply
* Re: [PATCH 1/2] net/phy: fix many "defined but unused" warnings
From: David Miller @ 2010-10-05 7:36 UTC (permalink / raw)
To: u.kleine-koenig; +Cc: netdev
In-Reply-To: <1286185413-22924-1-git-send-email-u.kleine-koenig@pengutronix.de>
From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date: Mon, 4 Oct 2010 11:43:32 +0200
> MODULE_DEVICE_TABLE only expdrivers/net/phy/bcm63xx.c:134: warning: 'bcm63xx_tbl' defined but not usedands to something if it's compiled
> for a module. So when building-in support for the phys, the
> mdio_device_id tables are unused. Marking them with __maybe_unused
> fixes the following warnings:
>
> drivers/net/phy/bcm63xx.c:134: warning: 'bcm63xx_tbl' defined but not used
> drivers/net/phy/broadcom.c:933: warning: 'broadcom_tbl' defined but not used
> drivers/net/phy/cicada.c:162: warning: 'cicada_tbl' defined but not used
> drivers/net/phy/davicom.c:222: warning: 'davicom_tbl' defined but not used
> drivers/net/phy/et1011c.c:114: warning: 'et1011c_tbl' defined but not used
> drivers/net/phy/icplus.c:137: warning: 'icplus_tbl' defined but not used
> drivers/net/phy/lxt.c:226: warning: 'lxt_tbl' defined but not used
> drivers/net/phy/marvell.c:724: warning: 'marvell_tbl' defined but not used
> drivers/net/phy/micrel.c:234: warning: 'micrel_tbl' defined but not used
> drivers/net/phy/national.c:154: warning: 'ns_tbl' defined but not used
> drivers/net/phy/qsemi.c:141: warning: 'qs6612_tbl' defined but not used
> drivers/net/phy/realtek.c:82: warning: 'realtek_tbl' defined but not used
> drivers/net/phy/smsc.c:257: warning: 'smsc_tbl' defined but not used
> drivers/net/phy/ste10Xp.c:135: warning: 'ste10Xp_tbl' defined but not used
> drivers/net/phy/vitesse.c:195: warning: 'vitesse_tbl' defined but not used
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Unfortunate but necessary for now, so applied, thanks.
Maybe we can eventually put something into MODULE_DEVICE_TABLE to add a nop-style
reference, enough to shut up the compiler but not actually compile the table into
the code.
^ permalink raw reply
* [PATCH V4] fs: allow for more than 2^31 files
From: Eric Dumazet @ 2010-10-05 7:32 UTC (permalink / raw)
To: Andrew Morton
Cc: David Miller, Robin Holt, dipankar, viro, bcrl, den, mingo,
mszeredi, cmm, npiggin, xemul, linux-kernel, netdev
In-Reply-To: <1285910958.2705.56.camel@edumazet-laptop>
Andrew,
Could you please review this patch, you probably are the right guy to
take it, because it crosses fs and net trees.
Note : /proc/sys/fs/file-nr is a read-only file, so this patch doesnt
depend on previous patch (sysctl: fix min/max handling in
__do_proc_doulongvec_minmax())
Thanks !
[PATCH V4] fs: allow for more than 2^31 files
Robin Holt tried to boot a 16TB system and found af_unix was overflowing
a 32bit value :
<quote>
We were seeing a failure which prevented boot. The kernel was incapable
of creating either a named pipe or unix domain socket. This comes down
to a common kernel function called unix_create1() which does:
atomic_inc(&unix_nr_socks);
if (atomic_read(&unix_nr_socks) > 2 * get_max_files())
goto out;
The function get_max_files() is a simple return of files_stat.max_files.
files_stat.max_files is a signed integer and is computed in
fs/file_table.c's files_init().
n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = n;
In our case, mempages (total_ram_pages) is approx 3,758,096,384
(0xe0000000). That leaves max_files at approximately 1,503,238,553.
This causes 2 * get_max_files() to integer overflow.
</quote>
Fix is to let /proc/sys/fs/file-nr & /proc/sys/fs/file-max use long
integers, and change af_unix to use an atomic_long_t instead of
atomic_t.
get_max_files() is changed to return an unsigned long.
get_nr_files() is changed to return a long.
unix_nr_socks is changed from atomic_t to atomic_long_t, while not
strictly needed to address Robin problem.
Before patch (on a 64bit kernel) :
# echo 2147483648 >/proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
-18446744071562067968
After patch:
# echo 2147483648 >/proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
2147483648
# cat /proc/sys/fs/file-nr
704 0 2147483648
Reported-by: Robin Holt <holt@sgi.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: David Miller <davem@davemloft.net>
Reviewed-by: Robin Holt <holt@sgi.com>
Tested-by: Robin Holt <holt@sgi.com>
---
fs/file_table.c | 17 +++++++----------
include/linux/fs.h | 8 ++++----
kernel/sysctl.c | 6 +++---
net/unix/af_unix.c | 14 +++++++-------
4 files changed, 21 insertions(+), 24 deletions(-)
diff --git a/fs/file_table.c b/fs/file_table.c
index a04bdd8..c3dee38 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -60,7 +60,7 @@ static inline void file_free(struct file *f)
/*
* Return the total number of open files in the system
*/
-static int get_nr_files(void)
+static long get_nr_files(void)
{
return percpu_counter_read_positive(&nr_files);
}
@@ -68,7 +68,7 @@ static int get_nr_files(void)
/*
* Return the maximum number of open files in the system
*/
-int get_max_files(void)
+unsigned long get_max_files(void)
{
return files_stat.max_files;
}
@@ -82,7 +82,7 @@ int proc_nr_files(ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
files_stat.nr_files = get_nr_files();
- return proc_dointvec(table, write, buffer, lenp, ppos);
+ return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
}
#else
int proc_nr_files(ctl_table *table, int write,
@@ -105,7 +105,7 @@ int proc_nr_files(ctl_table *table, int write,
struct file *get_empty_filp(void)
{
const struct cred *cred = current_cred();
- static int old_max;
+ static long old_max;
struct file * f;
/*
@@ -140,8 +140,7 @@ struct file *get_empty_filp(void)
over:
/* Ran out of filps - report that */
if (get_nr_files() > old_max) {
- printk(KERN_INFO "VFS: file-max limit %d reached\n",
- get_max_files());
+ pr_info("VFS: file-max limit %lu reached\n", get_max_files());
old_max = get_nr_files();
}
goto fail;
@@ -487,7 +486,7 @@ retry:
void __init files_init(unsigned long mempages)
{
- int n;
+ unsigned long n;
filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
@@ -498,9 +497,7 @@ void __init files_init(unsigned long mempages)
*/
n = (mempages * (PAGE_SIZE / 1024)) / 10;
- files_stat.max_files = n;
- if (files_stat.max_files < NR_FILE)
- files_stat.max_files = NR_FILE;
+ files_stat.max_files = max_t(unsigned long, n, NR_FILE);
files_defer_init();
lg_lock_init(files_lglock);
percpu_counter_init(&nr_files, 0);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 63d069b..8c06590 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -34,9 +34,9 @@
/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
- int nr_files; /* read only */
- int nr_free_files; /* read only */
- int max_files; /* tunable */
+ unsigned long nr_files; /* read only */
+ unsigned long nr_free_files; /* read only */
+ unsigned long max_files; /* tunable */
};
struct inodes_stat_t {
@@ -404,7 +404,7 @@ extern void __init inode_init_early(void);
extern void __init files_init(unsigned long);
extern struct files_stat_struct files_stat;
-extern int get_max_files(void);
+extern unsigned long get_max_files(void);
extern int sysctl_nr_open;
extern struct inodes_stat_t inodes_stat;
extern int leases_enable, lease_break_time;
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index f88552c..f789a0a 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1352,16 +1352,16 @@ static struct ctl_table fs_table[] = {
{
.procname = "file-nr",
.data = &files_stat,
- .maxlen = 3*sizeof(int),
+ .maxlen = sizeof(files_stat),
.mode = 0444,
.proc_handler = proc_nr_files,
},
{
.procname = "file-max",
.data = &files_stat.max_files,
- .maxlen = sizeof(int),
+ .maxlen = sizeof(files_stat.max_files),
.mode = 0644,
- .proc_handler = proc_dointvec,
+ .proc_handler = proc_doulongvec_minmax,
},
{
.procname = "nr_open",
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 0b39b24..3e1d7d1 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -117,7 +117,7 @@
static struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1];
static DEFINE_SPINLOCK(unix_table_lock);
-static atomic_t unix_nr_socks = ATOMIC_INIT(0);
+static atomic_long_t unix_nr_socks;
#define unix_sockets_unbound (&unix_socket_table[UNIX_HASH_SIZE])
@@ -360,13 +360,13 @@ static void unix_sock_destructor(struct sock *sk)
if (u->addr)
unix_release_addr(u->addr);
- atomic_dec(&unix_nr_socks);
+ atomic_long_dec(&unix_nr_socks);
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
local_bh_enable();
#ifdef UNIX_REFCNT_DEBUG
- printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk,
- atomic_read(&unix_nr_socks));
+ printk(KERN_DEBUG "UNIX %p is destroyed, %ld are still alive.\n", sk,
+ atomic_long_read(&unix_nr_socks));
#endif
}
@@ -606,8 +606,8 @@ static struct sock *unix_create1(struct net *net, struct socket *sock)
struct sock *sk = NULL;
struct unix_sock *u;
- atomic_inc(&unix_nr_socks);
- if (atomic_read(&unix_nr_socks) > 2 * get_max_files())
+ atomic_long_inc(&unix_nr_socks);
+ if (atomic_long_read(&unix_nr_socks) > 2 * get_max_files())
goto out;
sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto);
@@ -632,7 +632,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock)
unix_insert_socket(unix_sockets_unbound, sk);
out:
if (sk == NULL)
- atomic_dec(&unix_nr_socks);
+ atomic_long_dec(&unix_nr_socks);
else {
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
^ permalink raw reply related
* Re: [PATCH net-next V3] net: dynamic ingress_queue allocation
From: Eric Dumazet @ 2010-10-05 7:31 UTC (permalink / raw)
To: David Miller; +Cc: jarkao2, hadi, netdev
In-Reply-To: <20101005.002450.58425682.davem@davemloft.net>
Le mardi 05 octobre 2010 à 00:24 -0700, David Miller a écrit :
> From: Eric Dumazet <eric.dumazet@gmail.com>
> Date: Sat, 02 Oct 2010 18:11:55 +0200
>
> > [PATCH net-next V3] net: dynamic ingress_queue allocation
> >
> > ingress being not used very much, and net_device->ingress_queue being
> > quite a big object (128 or 256 bytes), use a dynamic allocation if
> > needed (tc qdisc add dev eth0 ingress ...)
> >
> > dev_ingress_queue(dev) helper should be used only with RTNL taken.
> >
> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
>
> This looks good to me, applied, thanks Eric.
Thanks to Jarek, Jamal, and you :)
^ permalink raw reply
* Re: [PATCH net-next] net: relax rtnl_dereference()
From: David Miller @ 2010-10-05 7:29 UTC (permalink / raw)
To: eric.dumazet; +Cc: hadi, netdev, jarkao2
In-Reply-To: <1286182812.18293.22.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 04 Oct 2010 11:00:12 +0200
> Le lundi 04 octobre 2010 à 10:42 +0200, Eric Dumazet a écrit :
>
>> BTW, rtnl_dereference() should be changed to use
>> rcu_dereference_protected() instead of rcu_dereference_check() :
>> If RTBL is held, there is no need to force a barrier.
>>
>
> [PATCH net-next] net: relax rtnl_dereference()
>
> rtnl_dereference() is used in contexts where RTNL is held, to fetch an
> RCU protected pointer.
>
> Updates to this pointer are prevented by RTNL, so we dont need
> smp_read_barrier_depends() and the ACCESS_ONCE() provided in
> rcu_dereference_check().
>
> rtnl_dereference() is mainly a macro to document the locking invariant.
>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Applied, thanks.
^ permalink raw reply
* Re: ipvs: Use frag walker helper in SCTP proto support.
From: David Miller @ 2010-10-05 7:27 UTC (permalink / raw)
To: horms; +Cc: netdev, netfilter-devel, lvs-devel, kaber
In-Reply-To: <20101004075911.GB2359@verge.net.au>
From: Simon Horman <horms@verge.net.au>
Date: Mon, 4 Oct 2010 16:59:12 +0900
> On Sun, Oct 03, 2010 at 11:46:01PM -0700, David Miller wrote:
>>
>> Signed-off-by: David S. Miller <davem@davemloft.net>
>
> Acked-by: Simon Horman <horms@verge.net.au>
>
> Dave, I'm happy for this to go via your tree or Partick's.
> I don't believe it conflicts with any of the other changes
> that are pending.
I'll toss it into net-next-2.6, thanks for reviewing.
^ permalink raw reply
* Re: [PATCH net-next V3] net: dynamic ingress_queue allocation
From: David Miller @ 2010-10-05 7:24 UTC (permalink / raw)
To: eric.dumazet; +Cc: jarkao2, hadi, netdev
In-Reply-To: <1286035915.2582.2472.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 02 Oct 2010 18:11:55 +0200
> [PATCH net-next V3] net: dynamic ingress_queue allocation
>
> ingress being not used very much, and net_device->ingress_queue being
> quite a big object (128 or 256 bytes), use a dynamic allocation if
> needed (tc qdisc add dev eth0 ingress ...)
>
> dev_ingress_queue(dev) helper should be used only with RTNL taken.
>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
This looks good to me, applied, thanks Eric.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox