aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/networking/LICENSE.qlcnic51
-rw-r--r--drivers/net/bonding/bond_3ad.c8
-rw-r--r--drivers/net/bonding/bond_alb.c16
-rw-r--r--drivers/net/bonding/bond_main.c96
-rw-r--r--drivers/net/bonding/bonding.h1
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h4
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c1
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c217
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c400
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c28
-rw-r--r--drivers/net/ethernet/i825xx/Kconfig2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c45
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c50
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c48
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/common.h8
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/descs.h31
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/norm_desc.c38
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c8
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_main.c13
-rw-r--r--include/linux/if_vlan.h6
-rw-r--r--include/net/inet_timewait_sock.h1
-rw-r--r--include/net/ipv6.h3
-rw-r--r--net/8021q/vlan_core.c7
-rw-r--r--net/batman-adv/translation-table.c17
-rw-r--r--net/batman-adv/types.h4
-rw-r--r--net/core/dev.c4
-rw-r--r--net/dccp/ipv6.c4
-rw-r--r--net/ipv4/tcp_minisocks.c1
-rw-r--r--net/ipv6/addrconf.c43
-rw-r--r--net/ipv6/inet6_connection_sock.c2
-rw-r--r--net/ipv6/ip6_output.c9
-rw-r--r--net/ipv6/route.c3
-rw-r--r--net/ipv6/tcp_ipv6.c17
-rw-r--r--net/sctp/ipv6.c2
39 files changed, 634 insertions, 567 deletions
diff --git a/Documentation/networking/LICENSE.qlcnic b/Documentation/networking/LICENSE.qlcnic
index 29ad4b106420..e7fb2c6023bc 100644
--- a/Documentation/networking/LICENSE.qlcnic
+++ b/Documentation/networking/LICENSE.qlcnic
@@ -1,61 +1,22 @@
1Copyright (c) 2009-2010 QLogic Corporation 1Copyright (c) 2009-2011 QLogic Corporation
2QLogic Linux qlcnic NIC Driver 2QLogic Linux qlcnic NIC Driver
3 3
4This program includes a device driver for Linux 2.6 that may be
5distributed with QLogic hardware specific firmware binary file.
6You may modify and redistribute the device driver code under the 4You may modify and redistribute the device driver code under the
7GNU General Public License (a copy of which is attached hereto as 5GNU General Public License (a copy of which is attached hereto as
8Exhibit A) published by the Free Software Foundation (version 2). 6Exhibit A) published by the Free Software Foundation (version 2).
9 7
10You may redistribute the hardware specific firmware binary file
11under the following terms:
12
13 1. Redistribution of source code (only if applicable),
14 must retain the above copyright notice, this list of
15 conditions and the following disclaimer.
16
17 2. Redistribution in binary form must reproduce the above
18 copyright notice, this list of conditions and the
19 following disclaimer in the documentation and/or other
20 materials provided with the distribution.
21
22 3. The name of QLogic Corporation may not be used to
23 endorse or promote products derived from this software
24 without specific prior written permission
25
26REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
27THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
28EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
30PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
31BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
33TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
35ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38POSSIBILITY OF SUCH DAMAGE.
39
40USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
41CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
42OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
43TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
44ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
45COMBINATION WITH THIS PROGRAM.
46
47 8
48EXHIBIT A 9EXHIBIT A
49 10
50 GNU GENERAL PUBLIC LICENSE 11 GNU GENERAL PUBLIC LICENSE
51 Version 2, June 1991 12 Version 2, June 1991
52 13
53 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 14 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
54 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 15 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
55 Everyone is permitted to copy and distribute verbatim copies 16 Everyone is permitted to copy and distribute verbatim copies
56 of this license document, but changing it is not allowed. 17 of this license document, but changing it is not allowed.
57 18
58 Preamble 19 Preamble
59 20
60 The licenses for most software are designed to take away your 21 The licenses for most software are designed to take away your
61freedom to share and change it. By contrast, the GNU General Public 22freedom to share and change it. By contrast, the GNU General Public
@@ -105,7 +66,7 @@ patent must be licensed for everyone's free use or not licensed at all.
105 The precise terms and conditions for copying, distribution and 66 The precise terms and conditions for copying, distribution and
106modification follow. 67modification follow.
107 68
108 GNU GENERAL PUBLIC LICENSE 69 GNU GENERAL PUBLIC LICENSE
109 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 70 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
110 71
111 0. This License applies to any program or other work which contains 72 0. This License applies to any program or other work which contains
@@ -304,7 +265,7 @@ make exceptions for this. Our decision will be guided by the two goals
304of preserving the free status of all derivatives of our free software and 265of preserving the free status of all derivatives of our free software and
305of promoting the sharing and reuse of software generally. 266of promoting the sharing and reuse of software generally.
306 267
307 NO WARRANTY 268 NO WARRANTY
308 269
309 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 270 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
310FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 271FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index b33c099d65a4..0ae0d7c54ccf 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -2110,9 +2110,6 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2110 2110
2111 read_lock(&bond->lock); 2111 read_lock(&bond->lock);
2112 2112
2113 if (bond->kill_timers)
2114 goto out;
2115
2116 //check if there are any slaves 2113 //check if there are any slaves
2117 if (bond->slave_cnt == 0) 2114 if (bond->slave_cnt == 0)
2118 goto re_arm; 2115 goto re_arm;
@@ -2161,9 +2158,8 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2161 } 2158 }
2162 2159
2163re_arm: 2160re_arm:
2164 if (!bond->kill_timers) 2161 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
2165 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); 2162
2166out:
2167 read_unlock(&bond->lock); 2163 read_unlock(&bond->lock);
2168} 2164}
2169 2165
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index d4fbd2e62616..106b88a04738 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -1343,10 +1343,6 @@ void bond_alb_monitor(struct work_struct *work)
1343 1343
1344 read_lock(&bond->lock); 1344 read_lock(&bond->lock);
1345 1345
1346 if (bond->kill_timers) {
1347 goto out;
1348 }
1349
1350 if (bond->slave_cnt == 0) { 1346 if (bond->slave_cnt == 0) {
1351 bond_info->tx_rebalance_counter = 0; 1347 bond_info->tx_rebalance_counter = 0;
1352 bond_info->lp_counter = 0; 1348 bond_info->lp_counter = 0;
@@ -1401,10 +1397,13 @@ void bond_alb_monitor(struct work_struct *work)
1401 1397
1402 /* 1398 /*
1403 * dev_set_promiscuity requires rtnl and 1399 * dev_set_promiscuity requires rtnl and
1404 * nothing else. 1400 * nothing else. Avoid race with bond_close.
1405 */ 1401 */
1406 read_unlock(&bond->lock); 1402 read_unlock(&bond->lock);
1407 rtnl_lock(); 1403 if (!rtnl_trylock()) {
1404 read_lock(&bond->lock);
1405 goto re_arm;
1406 }
1408 1407
1409 bond_info->rlb_promisc_timeout_counter = 0; 1408 bond_info->rlb_promisc_timeout_counter = 0;
1410 1409
@@ -1440,9 +1439,8 @@ void bond_alb_monitor(struct work_struct *work)
1440 } 1439 }
1441 1440
1442re_arm: 1441re_arm:
1443 if (!bond->kill_timers) 1442 queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks);
1444 queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); 1443
1445out:
1446 read_unlock(&bond->lock); 1444 read_unlock(&bond->lock);
1447} 1445}
1448 1446
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index c5944f1a4f9d..c34cc1e7c6f6 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -773,9 +773,6 @@ static void bond_resend_igmp_join_requests(struct bonding *bond)
773 773
774 read_lock(&bond->lock); 774 read_lock(&bond->lock);
775 775
776 if (bond->kill_timers)
777 goto out;
778
779 /* rejoin all groups on bond device */ 776 /* rejoin all groups on bond device */
780 __bond_resend_igmp_join_requests(bond->dev); 777 __bond_resend_igmp_join_requests(bond->dev);
781 778
@@ -789,9 +786,9 @@ static void bond_resend_igmp_join_requests(struct bonding *bond)
789 __bond_resend_igmp_join_requests(vlan_dev); 786 __bond_resend_igmp_join_requests(vlan_dev);
790 } 787 }
791 788
792 if ((--bond->igmp_retrans > 0) && !bond->kill_timers) 789 if (--bond->igmp_retrans > 0)
793 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); 790 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);
794out: 791
795 read_unlock(&bond->lock); 792 read_unlock(&bond->lock);
796} 793}
797 794
@@ -2517,10 +2514,11 @@ void bond_mii_monitor(struct work_struct *work)
2517 struct bonding *bond = container_of(work, struct bonding, 2514 struct bonding *bond = container_of(work, struct bonding,
2518 mii_work.work); 2515 mii_work.work);
2519 bool should_notify_peers = false; 2516 bool should_notify_peers = false;
2517 unsigned long delay;
2520 2518
2521 read_lock(&bond->lock); 2519 read_lock(&bond->lock);
2522 if (bond->kill_timers) 2520
2523 goto out; 2521 delay = msecs_to_jiffies(bond->params.miimon);
2524 2522
2525 if (bond->slave_cnt == 0) 2523 if (bond->slave_cnt == 0)
2526 goto re_arm; 2524 goto re_arm;
@@ -2529,7 +2527,15 @@ void bond_mii_monitor(struct work_struct *work)
2529 2527
2530 if (bond_miimon_inspect(bond)) { 2528 if (bond_miimon_inspect(bond)) {
2531 read_unlock(&bond->lock); 2529 read_unlock(&bond->lock);
2532 rtnl_lock(); 2530
2531 /* Race avoidance with bond_close cancel of workqueue */
2532 if (!rtnl_trylock()) {
2533 read_lock(&bond->lock);
2534 delay = 1;
2535 should_notify_peers = false;
2536 goto re_arm;
2537 }
2538
2533 read_lock(&bond->lock); 2539 read_lock(&bond->lock);
2534 2540
2535 bond_miimon_commit(bond); 2541 bond_miimon_commit(bond);
@@ -2540,14 +2546,18 @@ void bond_mii_monitor(struct work_struct *work)
2540 } 2546 }
2541 2547
2542re_arm: 2548re_arm:
2543 if (bond->params.miimon && !bond->kill_timers) 2549 if (bond->params.miimon)
2544 queue_delayed_work(bond->wq, &bond->mii_work, 2550 queue_delayed_work(bond->wq, &bond->mii_work, delay);
2545 msecs_to_jiffies(bond->params.miimon)); 2551
2546out:
2547 read_unlock(&bond->lock); 2552 read_unlock(&bond->lock);
2548 2553
2549 if (should_notify_peers) { 2554 if (should_notify_peers) {
2550 rtnl_lock(); 2555 if (!rtnl_trylock()) {
2556 read_lock(&bond->lock);
2557 bond->send_peer_notif++;
2558 read_unlock(&bond->lock);
2559 return;
2560 }
2551 netdev_bonding_change(bond->dev, NETDEV_NOTIFY_PEERS); 2561 netdev_bonding_change(bond->dev, NETDEV_NOTIFY_PEERS);
2552 rtnl_unlock(); 2562 rtnl_unlock();
2553 } 2563 }
@@ -2789,9 +2799,6 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2789 2799
2790 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); 2800 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval);
2791 2801
2792 if (bond->kill_timers)
2793 goto out;
2794
2795 if (bond->slave_cnt == 0) 2802 if (bond->slave_cnt == 0)
2796 goto re_arm; 2803 goto re_arm;
2797 2804
@@ -2888,9 +2895,9 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
2888 } 2895 }
2889 2896
2890re_arm: 2897re_arm:
2891 if (bond->params.arp_interval && !bond->kill_timers) 2898 if (bond->params.arp_interval)
2892 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); 2899 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks);
2893out: 2900
2894 read_unlock(&bond->lock); 2901 read_unlock(&bond->lock);
2895} 2902}
2896 2903
@@ -3131,9 +3138,6 @@ void bond_activebackup_arp_mon(struct work_struct *work)
3131 3138
3132 read_lock(&bond->lock); 3139 read_lock(&bond->lock);
3133 3140
3134 if (bond->kill_timers)
3135 goto out;
3136
3137 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); 3141 delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval);
3138 3142
3139 if (bond->slave_cnt == 0) 3143 if (bond->slave_cnt == 0)
@@ -3143,7 +3147,15 @@ void bond_activebackup_arp_mon(struct work_struct *work)
3143 3147
3144 if (bond_ab_arp_inspect(bond, delta_in_ticks)) { 3148 if (bond_ab_arp_inspect(bond, delta_in_ticks)) {
3145 read_unlock(&bond->lock); 3149 read_unlock(&bond->lock);
3146 rtnl_lock(); 3150
3151 /* Race avoidance with bond_close flush of workqueue */
3152 if (!rtnl_trylock()) {
3153 read_lock(&bond->lock);
3154 delta_in_ticks = 1;
3155 should_notify_peers = false;
3156 goto re_arm;
3157 }
3158
3147 read_lock(&bond->lock); 3159 read_lock(&bond->lock);
3148 3160
3149 bond_ab_arp_commit(bond, delta_in_ticks); 3161 bond_ab_arp_commit(bond, delta_in_ticks);
@@ -3156,13 +3168,18 @@ void bond_activebackup_arp_mon(struct work_struct *work)
3156 bond_ab_arp_probe(bond); 3168 bond_ab_arp_probe(bond);
3157 3169
3158re_arm: 3170re_arm:
3159 if (bond->params.arp_interval && !bond->kill_timers) 3171 if (bond->params.arp_interval)
3160 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); 3172 queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks);
3161out: 3173
3162 read_unlock(&bond->lock); 3174 read_unlock(&bond->lock);
3163 3175
3164 if (should_notify_peers) { 3176 if (should_notify_peers) {
3165 rtnl_lock(); 3177 if (!rtnl_trylock()) {
3178 read_lock(&bond->lock);
3179 bond->send_peer_notif++;
3180 read_unlock(&bond->lock);
3181 return;
3182 }
3166 netdev_bonding_change(bond->dev, NETDEV_NOTIFY_PEERS); 3183 netdev_bonding_change(bond->dev, NETDEV_NOTIFY_PEERS);
3167 rtnl_unlock(); 3184 rtnl_unlock();
3168 } 3185 }
@@ -3424,8 +3441,6 @@ static int bond_open(struct net_device *bond_dev)
3424 struct slave *slave; 3441 struct slave *slave;
3425 int i; 3442 int i;
3426 3443
3427 bond->kill_timers = 0;
3428
3429 /* reset slave->backup and slave->inactive */ 3444 /* reset slave->backup and slave->inactive */
3430 read_lock(&bond->lock); 3445 read_lock(&bond->lock);
3431 if (bond->slave_cnt > 0) { 3446 if (bond->slave_cnt > 0) {
@@ -3494,33 +3509,30 @@ static int bond_close(struct net_device *bond_dev)
3494 3509
3495 bond->send_peer_notif = 0; 3510 bond->send_peer_notif = 0;
3496 3511
3497 /* signal timers not to re-arm */
3498 bond->kill_timers = 1;
3499
3500 write_unlock_bh(&bond->lock); 3512 write_unlock_bh(&bond->lock);
3501 3513
3502 if (bond->params.miimon) { /* link check interval, in milliseconds. */ 3514 if (bond->params.miimon) { /* link check interval, in milliseconds. */
3503 cancel_delayed_work(&bond->mii_work); 3515 cancel_delayed_work_sync(&bond->mii_work);
3504 } 3516 }
3505 3517
3506 if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ 3518 if (bond->params.arp_interval) { /* arp interval, in milliseconds. */
3507 cancel_delayed_work(&bond->arp_work); 3519 cancel_delayed_work_sync(&bond->arp_work);
3508 } 3520 }
3509 3521
3510 switch (bond->params.mode) { 3522 switch (bond->params.mode) {
3511 case BOND_MODE_8023AD: 3523 case BOND_MODE_8023AD:
3512 cancel_delayed_work(&bond->ad_work); 3524 cancel_delayed_work_sync(&bond->ad_work);
3513 break; 3525 break;
3514 case BOND_MODE_TLB: 3526 case BOND_MODE_TLB:
3515 case BOND_MODE_ALB: 3527 case BOND_MODE_ALB:
3516 cancel_delayed_work(&bond->alb_work); 3528 cancel_delayed_work_sync(&bond->alb_work);
3517 break; 3529 break;
3518 default: 3530 default:
3519 break; 3531 break;
3520 } 3532 }
3521 3533
3522 if (delayed_work_pending(&bond->mcast_work)) 3534 if (delayed_work_pending(&bond->mcast_work))
3523 cancel_delayed_work(&bond->mcast_work); 3535 cancel_delayed_work_sync(&bond->mcast_work);
3524 3536
3525 if (bond_is_lb(bond)) { 3537 if (bond_is_lb(bond)) {
3526 /* Must be called only after all 3538 /* Must be called only after all
@@ -4367,26 +4379,22 @@ static void bond_setup(struct net_device *bond_dev)
4367 4379
4368static void bond_work_cancel_all(struct bonding *bond) 4380static void bond_work_cancel_all(struct bonding *bond)
4369{ 4381{
4370 write_lock_bh(&bond->lock);
4371 bond->kill_timers = 1;
4372 write_unlock_bh(&bond->lock);
4373
4374 if (bond->params.miimon && delayed_work_pending(&bond->mii_work)) 4382 if (bond->params.miimon && delayed_work_pending(&bond->mii_work))
4375 cancel_delayed_work(&bond->mii_work); 4383 cancel_delayed_work_sync(&bond->mii_work);
4376 4384
4377 if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work)) 4385 if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work))
4378 cancel_delayed_work(&bond->arp_work); 4386 cancel_delayed_work_sync(&bond->arp_work);
4379 4387
4380 if (bond->params.mode == BOND_MODE_ALB && 4388 if (bond->params.mode == BOND_MODE_ALB &&
4381 delayed_work_pending(&bond->alb_work)) 4389 delayed_work_pending(&bond->alb_work))
4382 cancel_delayed_work(&bond->alb_work); 4390 cancel_delayed_work_sync(&bond->alb_work);
4383 4391
4384 if (bond->params.mode == BOND_MODE_8023AD && 4392 if (bond->params.mode == BOND_MODE_8023AD &&
4385 delayed_work_pending(&bond->ad_work)) 4393 delayed_work_pending(&bond->ad_work))
4386 cancel_delayed_work(&bond->ad_work); 4394 cancel_delayed_work_sync(&bond->ad_work);
4387 4395
4388 if (delayed_work_pending(&bond->mcast_work)) 4396 if (delayed_work_pending(&bond->mcast_work))
4389 cancel_delayed_work(&bond->mcast_work); 4397 cancel_delayed_work_sync(&bond->mcast_work);
4390} 4398}
4391 4399
4392/* 4400/*
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 82fec5fc75d7..1aecc37e5b4d 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -222,7 +222,6 @@ struct bonding {
222 struct slave *); 222 struct slave *);
223 rwlock_t lock; 223 rwlock_t lock;
224 rwlock_t curr_slave_lock; 224 rwlock_t curr_slave_lock;
225 s8 kill_timers;
226 u8 send_peer_notif; 225 u8 send_peer_notif;
227 s8 setup_by_slave; 226 s8 setup_by_slave;
228 s8 igmp_retrans; 227 s8 igmp_retrans;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index 627a5807836d..aec7212ac983 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -23,8 +23,8 @@
23 * (you will need to reboot afterwards) */ 23 * (you will need to reboot afterwards) */
24/* #define BNX2X_STOP_ON_ERROR */ 24/* #define BNX2X_STOP_ON_ERROR */
25 25
26#define DRV_MODULE_VERSION "1.70.00-0" 26#define DRV_MODULE_VERSION "1.70.30-0"
27#define DRV_MODULE_RELDATE "2011/06/13" 27#define DRV_MODULE_RELDATE "2011/10/25"
28#define BNX2X_BC_VER 0x040200 28#define BNX2X_BC_VER 0x040200
29 29
30#if defined(CONFIG_DCB) 30#if defined(CONFIG_DCB)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index 1a6e37ce730c..f0ca8b27a55e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -329,6 +329,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
329 PORT_HW_CFG_PHY_SELECTION_FIRST_PHY; 329 PORT_HW_CFG_PHY_SELECTION_FIRST_PHY;
330 break; 330 break;
331 case PORT_FIBRE: 331 case PORT_FIBRE:
332 case PORT_DA:
332 if (bp->port.supported[cfg_idx] & SUPPORTED_FIBRE) 333 if (bp->port.supported[cfg_idx] & SUPPORTED_FIBRE)
333 break; /* no port change */ 334 break; /* no port change */
334 335
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
index e44b858ff12f..fc754cb6cc0f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
@@ -2550,7 +2550,7 @@ struct host_func_stats {
2550 2550
2551#define BCM_5710_FW_MAJOR_VERSION 7 2551#define BCM_5710_FW_MAJOR_VERSION 7
2552#define BCM_5710_FW_MINOR_VERSION 0 2552#define BCM_5710_FW_MINOR_VERSION 0
2553#define BCM_5710_FW_REVISION_VERSION 23 2553#define BCM_5710_FW_REVISION_VERSION 29
2554#define BCM_5710_FW_ENGINEERING_VERSION 0 2554#define BCM_5710_FW_ENGINEERING_VERSION 0
2555#define BCM_5710_FW_COMPILE_FLAGS 1 2555#define BCM_5710_FW_COMPILE_FLAGS 1
2556 2556
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index 818723c9e678..bce203fa4b9e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -45,6 +45,9 @@
45#define MCPR_IMC_COMMAND_READ_OP 1 45#define MCPR_IMC_COMMAND_READ_OP 1
46#define MCPR_IMC_COMMAND_WRITE_OP 2 46#define MCPR_IMC_COMMAND_WRITE_OP 2
47 47
48/* LED Blink rate that will achieve ~15.9Hz */
49#define LED_BLINK_RATE_VAL_E3 354
50#define LED_BLINK_RATE_VAL_E1X_E2 480
48/***********************************************************/ 51/***********************************************************/
49/* Shortcut definitions */ 52/* Shortcut definitions */
50/***********************************************************/ 53/***********************************************************/
@@ -258,6 +261,7 @@
258 261
259#define MAX_PACKET_SIZE (9700) 262#define MAX_PACKET_SIZE (9700)
260#define WC_UC_TIMEOUT 100 263#define WC_UC_TIMEOUT 100
264#define MAX_KR_LINK_RETRY 4
261 265
262/**********************************************************/ 266/**********************************************************/
263/* INTERFACE */ 267/* INTERFACE */
@@ -1490,6 +1494,18 @@ static void bnx2x_set_xumac_nig(struct link_params *params,
1490 NIG_REG_P0_MAC_PAUSE_OUT_EN, tx_pause_en); 1494 NIG_REG_P0_MAC_PAUSE_OUT_EN, tx_pause_en);
1491} 1495}
1492 1496
1497static void bnx2x_umac_disable(struct link_params *params)
1498{
1499 u32 umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0;
1500 struct bnx2x *bp = params->bp;
1501 if (!(REG_RD(bp, MISC_REG_RESET_REG_2) &
1502 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)))
1503 return;
1504
1505 /* Disable RX and TX */
1506 REG_WR(bp, umac_base + UMAC_REG_COMMAND_CONFIG, 0);
1507}
1508
1493static void bnx2x_umac_enable(struct link_params *params, 1509static void bnx2x_umac_enable(struct link_params *params,
1494 struct link_vars *vars, u8 lb) 1510 struct link_vars *vars, u8 lb)
1495{ 1511{
@@ -1599,8 +1615,9 @@ static u8 bnx2x_is_4_port_mode(struct bnx2x *bp)
1599} 1615}
1600 1616
1601/* Define the XMAC mode */ 1617/* Define the XMAC mode */
1602static void bnx2x_xmac_init(struct bnx2x *bp, u32 max_speed) 1618static void bnx2x_xmac_init(struct link_params *params, u32 max_speed)
1603{ 1619{
1620 struct bnx2x *bp = params->bp;
1604 u32 is_port4mode = bnx2x_is_4_port_mode(bp); 1621 u32 is_port4mode = bnx2x_is_4_port_mode(bp);
1605 1622
1606 /** 1623 /**
@@ -1610,7 +1627,8 @@ static void bnx2x_xmac_init(struct bnx2x *bp, u32 max_speed)
1610 * ports of the path 1627 * ports of the path
1611 **/ 1628 **/
1612 1629
1613 if (is_port4mode && (REG_RD(bp, MISC_REG_RESET_REG_2) & 1630 if ((CHIP_NUM(bp) == CHIP_NUM_57840) &&
1631 (REG_RD(bp, MISC_REG_RESET_REG_2) &
1614 MISC_REGISTERS_RESET_REG_2_XMAC)) { 1632 MISC_REGISTERS_RESET_REG_2_XMAC)) {
1615 DP(NETIF_MSG_LINK, 1633 DP(NETIF_MSG_LINK,
1616 "XMAC already out of reset in 4-port mode\n"); 1634 "XMAC already out of reset in 4-port mode\n");
@@ -1677,10 +1695,6 @@ static void bnx2x_xmac_disable(struct link_params *params)
1677 (pfc_ctrl | (1<<1))); 1695 (pfc_ctrl | (1<<1)));
1678 DP(NETIF_MSG_LINK, "Disable XMAC on port %x\n", port); 1696 DP(NETIF_MSG_LINK, "Disable XMAC on port %x\n", port);
1679 REG_WR(bp, xmac_base + XMAC_REG_CTRL, 0); 1697 REG_WR(bp, xmac_base + XMAC_REG_CTRL, 0);
1680 usleep_range(1000, 1000);
1681 bnx2x_set_xumac_nig(params, 0, 0);
1682 REG_WR(bp, xmac_base + XMAC_REG_CTRL,
1683 XMAC_CTRL_REG_SOFT_RESET);
1684 } 1698 }
1685} 1699}
1686 1700
@@ -1693,7 +1707,7 @@ static int bnx2x_xmac_enable(struct link_params *params,
1693 1707
1694 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; 1708 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
1695 1709
1696 bnx2x_xmac_init(bp, vars->line_speed); 1710 bnx2x_xmac_init(params, vars->line_speed);
1697 1711
1698 /* 1712 /*
1699 * This register determines on which events the MAC will assert 1713 * This register determines on which events the MAC will assert
@@ -3575,6 +3589,11 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3575 u16 val16 = 0, lane, bam37 = 0; 3589 u16 val16 = 0, lane, bam37 = 0;
3576 struct bnx2x *bp = params->bp; 3590 struct bnx2x *bp = params->bp;
3577 DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); 3591 DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n");
3592
3593 /* Disable Autoneg: re-enable it after adv is done. */
3594 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3595 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0);
3596
3578 /* Check adding advertisement for 1G KX */ 3597 /* Check adding advertisement for 1G KX */
3579 if (((vars->line_speed == SPEED_AUTO_NEG) && 3598 if (((vars->line_speed == SPEED_AUTO_NEG) &&
3580 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || 3599 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
@@ -3616,9 +3635,6 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3616 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3635 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3617 MDIO_WC_REG_CL72_USERB0_CL72_2P5_DEF_CTRL, 3636 MDIO_WC_REG_CL72_USERB0_CL72_2P5_DEF_CTRL,
3618 0x03f0); 3637 0x03f0);
3619 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3620 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,
3621 0x383f);
3622 3638
3623 /* Advertised speeds */ 3639 /* Advertised speeds */
3624 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3640 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
@@ -3645,19 +3661,22 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3645 /* Advertise pause */ 3661 /* Advertise pause */
3646 bnx2x_ext_phy_set_pause(params, phy, vars); 3662 bnx2x_ext_phy_set_pause(params, phy, vars);
3647 3663
3648 /* Enable Autoneg */ 3664 vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY;
3649 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3650 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1000);
3651
3652 /* Over 1G - AN local device user page 1 */
3653 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3654 MDIO_WC_REG_DIGITAL3_UP1, 0x1f);
3655 3665
3656 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3666 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
3657 MDIO_WC_REG_DIGITAL5_MISC7, &val16); 3667 MDIO_WC_REG_DIGITAL5_MISC7, &val16);
3658 3668
3659 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, 3669 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3660 MDIO_WC_REG_DIGITAL5_MISC7, val16 | 0x100); 3670 MDIO_WC_REG_DIGITAL5_MISC7, val16 | 0x100);
3671
3672 /* Over 1G - AN local device user page 1 */
3673 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3674 MDIO_WC_REG_DIGITAL3_UP1, 0x1f);
3675
3676 /* Enable Autoneg */
3677 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3678 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1000);
3679
3661} 3680}
3662 3681
3663static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy, 3682static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,
@@ -4126,6 +4145,85 @@ static int bnx2x_is_sfp_module_plugged(struct bnx2x_phy *phy,
4126 else 4145 else
4127 return 0; 4146 return 0;
4128} 4147}
4148static int bnx2x_warpcore_get_sigdet(struct bnx2x_phy *phy,
4149 struct link_params *params)
4150{
4151 u16 gp2_status_reg0, lane;
4152 struct bnx2x *bp = params->bp;
4153
4154 lane = bnx2x_get_warpcore_lane(phy, params);
4155
4156 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, MDIO_WC_REG_GP2_STATUS_GP_2_0,
4157 &gp2_status_reg0);
4158
4159 return (gp2_status_reg0 >> (8+lane)) & 0x1;
4160}
4161
4162static void bnx2x_warpcore_config_runtime(struct bnx2x_phy *phy,
4163 struct link_params *params,
4164 struct link_vars *vars)
4165{
4166 struct bnx2x *bp = params->bp;
4167 u32 serdes_net_if;
4168 u16 gp_status1 = 0, lnkup = 0, lnkup_kr = 0;
4169 u16 lane = bnx2x_get_warpcore_lane(phy, params);
4170
4171 vars->turn_to_run_wc_rt = vars->turn_to_run_wc_rt ? 0 : 1;
4172
4173 if (!vars->turn_to_run_wc_rt)
4174 return;
4175
4176 /* return if there is no link partner */
4177 if (!(bnx2x_warpcore_get_sigdet(phy, params))) {
4178 DP(NETIF_MSG_LINK, "bnx2x_warpcore_get_sigdet false\n");
4179 return;
4180 }
4181
4182 if (vars->rx_tx_asic_rst) {
4183 serdes_net_if = (REG_RD(bp, params->shmem_base +
4184 offsetof(struct shmem_region, dev_info.
4185 port_hw_config[params->port].default_cfg)) &
4186 PORT_HW_CFG_NET_SERDES_IF_MASK);
4187
4188 switch (serdes_net_if) {
4189 case PORT_HW_CFG_NET_SERDES_IF_KR:
4190 /* Do we get link yet? */
4191 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 0x81d1,
4192 &gp_status1);
4193 lnkup = (gp_status1 >> (8+lane)) & 0x1;/* 1G */
4194 /*10G KR*/
4195 lnkup_kr = (gp_status1 >> (12+lane)) & 0x1;
4196
4197 DP(NETIF_MSG_LINK,
4198 "gp_status1 0x%x\n", gp_status1);
4199
4200 if (lnkup_kr || lnkup) {
4201 vars->rx_tx_asic_rst = 0;
4202 DP(NETIF_MSG_LINK,
4203 "link up, rx_tx_asic_rst 0x%x\n",
4204 vars->rx_tx_asic_rst);
4205 } else {
4206 /*reset the lane to see if link comes up.*/
4207 bnx2x_warpcore_reset_lane(bp, phy, 1);
4208 bnx2x_warpcore_reset_lane(bp, phy, 0);
4209
4210 /* restart Autoneg */
4211 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
4212 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1200);
4213
4214 vars->rx_tx_asic_rst--;
4215 DP(NETIF_MSG_LINK, "0x%x retry left\n",
4216 vars->rx_tx_asic_rst);
4217 }
4218 break;
4219
4220 default:
4221 break;
4222 }
4223
4224 } /*params->rx_tx_asic_rst*/
4225
4226}
4129 4227
4130static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy, 4228static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy,
4131 struct link_params *params, 4229 struct link_params *params,
@@ -5896,7 +5994,13 @@ int bnx2x_set_led(struct link_params *params,
5896 SHARED_HW_CFG_LED_MAC1); 5994 SHARED_HW_CFG_LED_MAC1);
5897 5995
5898 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); 5996 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
5899 EMAC_WR(bp, EMAC_REG_EMAC_LED, (tmp | EMAC_LED_OVERRIDE)); 5997 if (params->phy[EXT_PHY1].type ==
5998 PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE)
5999 EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp & 0xfff1);
6000 else {
6001 EMAC_WR(bp, EMAC_REG_EMAC_LED,
6002 (tmp | EMAC_LED_OVERRIDE));
6003 }
5900 break; 6004 break;
5901 6005
5902 case LED_MODE_OPER: 6006 case LED_MODE_OPER:
@@ -5949,17 +6053,33 @@ int bnx2x_set_led(struct link_params *params,
5949 else 6053 else
5950 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 6054 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4,
5951 hw_led_mode); 6055 hw_led_mode);
6056 } else if ((params->phy[EXT_PHY1].type ==
6057 PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) &&
6058 (mode != LED_MODE_OPER)) {
6059 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0);
6060 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
6061 EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp | 0x3);
5952 } else 6062 } else
5953 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, hw_led_mode); 6063 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4,
6064 hw_led_mode);
5954 6065
5955 REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 + port*4, 0); 6066 REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 + port*4, 0);
5956 /* Set blinking rate to ~15.9Hz */ 6067 /* Set blinking rate to ~15.9Hz */
5957 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_P0 + port*4, 6068 if (CHIP_IS_E3(bp))
5958 LED_BLINK_RATE_VAL); 6069 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_P0 + port*4,
6070 LED_BLINK_RATE_VAL_E3);
6071 else
6072 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_P0 + port*4,
6073 LED_BLINK_RATE_VAL_E1X_E2);
5959 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 + 6074 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 +
5960 port*4, 1); 6075 port*4, 1);
5961 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); 6076 if ((params->phy[EXT_PHY1].type !=
5962 EMAC_WR(bp, EMAC_REG_EMAC_LED, (tmp & (~EMAC_LED_OVERRIDE))); 6077 PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) &&
6078 (mode != LED_MODE_OPER)) {
6079 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
6080 EMAC_WR(bp, EMAC_REG_EMAC_LED,
6081 (tmp & (~EMAC_LED_OVERRIDE)));
6082 }
5963 6083
5964 if (CHIP_IS_E1(bp) && 6084 if (CHIP_IS_E1(bp) &&
5965 ((speed == SPEED_2500) || 6085 ((speed == SPEED_2500) ||
@@ -6218,8 +6338,10 @@ static int bnx2x_update_link_down(struct link_params *params,
6218 MISC_REGISTERS_RESET_REG_2_CLEAR, 6338 MISC_REGISTERS_RESET_REG_2_CLEAR,
6219 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); 6339 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
6220 } 6340 }
6221 if (CHIP_IS_E3(bp)) 6341 if (CHIP_IS_E3(bp)) {
6222 bnx2x_xmac_disable(params); 6342 bnx2x_xmac_disable(params);
6343 bnx2x_umac_disable(params);
6344 }
6223 6345
6224 return 0; 6346 return 0;
6225} 6347}
@@ -10205,22 +10327,6 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy,
10205 return 0; 10327 return 0;
10206} 10328}
10207 10329
10208static void bnx2x_54618se_set_link_led(struct bnx2x_phy *phy,
10209 struct link_params *params, u8 mode)
10210{
10211 struct bnx2x *bp = params->bp;
10212 DP(NETIF_MSG_LINK, "54618SE set link led (mode=%x)\n", mode);
10213 switch (mode) {
10214 case LED_MODE_FRONT_PANEL_OFF:
10215 case LED_MODE_OFF:
10216 case LED_MODE_OPER:
10217 case LED_MODE_ON:
10218 default:
10219 break;
10220 }
10221 return;
10222}
10223
10224static void bnx2x_54618se_link_reset(struct bnx2x_phy *phy, 10330static void bnx2x_54618se_link_reset(struct bnx2x_phy *phy,
10225 struct link_params *params) 10331 struct link_params *params)
10226{ 10332{
@@ -10997,7 +11103,7 @@ static struct bnx2x_phy phy_54618se = {
10997 .config_loopback = (config_loopback_t)bnx2x_54618se_config_loopback, 11103 .config_loopback = (config_loopback_t)bnx2x_54618se_config_loopback,
10998 .format_fw_ver = (format_fw_ver_t)NULL, 11104 .format_fw_ver = (format_fw_ver_t)NULL,
10999 .hw_reset = (hw_reset_t)NULL, 11105 .hw_reset = (hw_reset_t)NULL,
11000 .set_link_led = (set_link_led_t)bnx2x_54618se_set_link_led, 11106 .set_link_led = (set_link_led_t)NULL,
11001 .phy_specific_func = (phy_specific_func_t)NULL 11107 .phy_specific_func = (phy_specific_func_t)NULL
11002}; 11108};
11003/*****************************************************************/ 11109/*****************************************************************/
@@ -11718,8 +11824,10 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
11718 /* Stop BigMac rx */ 11824 /* Stop BigMac rx */
11719 if (!CHIP_IS_E3(bp)) 11825 if (!CHIP_IS_E3(bp))
11720 bnx2x_bmac_rx_disable(bp, port); 11826 bnx2x_bmac_rx_disable(bp, port);
11721 else 11827 else {
11722 bnx2x_xmac_disable(params); 11828 bnx2x_xmac_disable(params);
11829 bnx2x_umac_disable(params);
11830 }
11723 /* disable emac */ 11831 /* disable emac */
11724 if (!CHIP_IS_E3(bp)) 11832 if (!CHIP_IS_E3(bp))
11725 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0); 11833 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0);
@@ -11757,14 +11865,21 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
11757 if (params->phy[INT_PHY].link_reset) 11865 if (params->phy[INT_PHY].link_reset)
11758 params->phy[INT_PHY].link_reset( 11866 params->phy[INT_PHY].link_reset(
11759 &params->phy[INT_PHY], params); 11867 &params->phy[INT_PHY], params);
11760 /* reset BigMac */
11761 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
11762 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
11763 11868
11764 /* disable nig ingress interface */ 11869 /* disable nig ingress interface */
11765 if (!CHIP_IS_E3(bp)) { 11870 if (!CHIP_IS_E3(bp)) {
11871 /* reset BigMac */
11872 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
11873 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
11766 REG_WR(bp, NIG_REG_BMAC0_IN_EN + port*4, 0); 11874 REG_WR(bp, NIG_REG_BMAC0_IN_EN + port*4, 0);
11767 REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0); 11875 REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0);
11876 } else {
11877 u32 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
11878 bnx2x_set_xumac_nig(params, 0, 0);
11879 if (REG_RD(bp, MISC_REG_RESET_REG_2) &
11880 MISC_REGISTERS_RESET_REG_2_XMAC)
11881 REG_WR(bp, xmac_base + XMAC_REG_CTRL,
11882 XMAC_CTRL_REG_SOFT_RESET);
11768 } 11883 }
11769 vars->link_up = 0; 11884 vars->link_up = 0;
11770 vars->phy_flags = 0; 11885 vars->phy_flags = 0;
@@ -12332,11 +12447,6 @@ void bnx2x_period_func(struct link_params *params, struct link_vars *vars)
12332{ 12447{
12333 struct bnx2x *bp = params->bp; 12448 struct bnx2x *bp = params->bp;
12334 u16 phy_idx; 12449 u16 phy_idx;
12335 if (!params) {
12336 DP(NETIF_MSG_LINK, "Uninitialized params !\n");
12337 return;
12338 }
12339
12340 for (phy_idx = INT_PHY; phy_idx < MAX_PHYS; phy_idx++) { 12450 for (phy_idx = INT_PHY; phy_idx < MAX_PHYS; phy_idx++) {
12341 if (params->phy[phy_idx].flags & FLAGS_TX_ERROR_CHECK) { 12451 if (params->phy[phy_idx].flags & FLAGS_TX_ERROR_CHECK) {
12342 bnx2x_set_aer_mmd(params, &params->phy[phy_idx]); 12452 bnx2x_set_aer_mmd(params, &params->phy[phy_idx]);
@@ -12345,8 +12455,13 @@ void bnx2x_period_func(struct link_params *params, struct link_vars *vars)
12345 } 12455 }
12346 } 12456 }
12347 12457
12348 if (CHIP_IS_E3(bp)) 12458 if (CHIP_IS_E3(bp)) {
12459 struct bnx2x_phy *phy = &params->phy[INT_PHY];
12460 bnx2x_set_aer_mmd(params, phy);
12349 bnx2x_check_over_curr(params, vars); 12461 bnx2x_check_over_curr(params, vars);
12462 bnx2x_warpcore_config_runtime(phy, params, vars);
12463 }
12464
12350} 12465}
12351 12466
12352u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base) 12467u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
index c12db6da213e..2a46e633abe9 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
@@ -303,6 +303,9 @@ struct link_vars {
303#define PERIODIC_FLAGS_LINK_EVENT 0x0001 303#define PERIODIC_FLAGS_LINK_EVENT 0x0001
304 304
305 u32 aeu_int_mask; 305 u32 aeu_int_mask;
306 u8 rx_tx_asic_rst;
307 u8 turn_to_run_wc_rt;
308 u16 rsrv2;
306}; 309};
307 310
308/***********************************************************/ 311/***********************************************************/
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index e0ff96193c49..824b8e6021f6 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -428,28 +428,33 @@ static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
428 return &wrb->payload.sgl[0]; 428 return &wrb->payload.sgl[0];
429} 429}
430 430
431/* Don't touch the hdr after it's prepared */
432static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
433 bool embedded, u8 sge_cnt, u32 opcode)
434{
435 if (embedded)
436 wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
437 else
438 wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
439 MCC_WRB_SGE_CNT_SHIFT;
440 wrb->payload_length = payload_len;
441 wrb->tag0 = opcode;
442 be_dws_cpu_to_le(wrb, 8);
443}
444 431
445/* Don't touch the hdr after it's prepared */ 432/* Don't touch the hdr after it's prepared */
446static void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr, 433/* mem will be NULL for embedded commands */
447 u8 subsystem, u8 opcode, int cmd_len) 434static void be_wrb_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
435 u8 subsystem, u8 opcode, int cmd_len,
436 struct be_mcc_wrb *wrb, struct be_dma_mem *mem)
448{ 437{
438 struct be_sge *sge;
439
449 req_hdr->opcode = opcode; 440 req_hdr->opcode = opcode;
450 req_hdr->subsystem = subsystem; 441 req_hdr->subsystem = subsystem;
451 req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr)); 442 req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
452 req_hdr->version = 0; 443 req_hdr->version = 0;
444
445 wrb->tag0 = opcode;
446 wrb->tag1 = subsystem;
447 wrb->payload_length = cmd_len;
448 if (mem) {
449 wrb->embedded |= (1 & MCC_WRB_SGE_CNT_MASK) <<
450 MCC_WRB_SGE_CNT_SHIFT;
451 sge = nonembedded_sgl(wrb);
452 sge->pa_hi = cpu_to_le32(upper_32_bits(mem->dma));
453 sge->pa_lo = cpu_to_le32(mem->dma & 0xFFFFFFFF);
454 sge->len = cpu_to_le32(mem->size);
455 } else
456 wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
457 be_dws_cpu_to_le(wrb, 8);
453} 458}
454 459
455static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages, 460static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
@@ -586,10 +591,8 @@ int be_cmd_eq_create(struct be_adapter *adapter,
586 wrb = wrb_from_mbox(adapter); 591 wrb = wrb_from_mbox(adapter);
587 req = embedded_payload(wrb); 592 req = embedded_payload(wrb);
588 593
589 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, OPCODE_COMMON_EQ_CREATE); 594 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
590 595 OPCODE_COMMON_EQ_CREATE, sizeof(*req), wrb, NULL);
591 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
592 OPCODE_COMMON_EQ_CREATE, sizeof(*req));
593 596
594 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 597 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
595 598
@@ -632,12 +635,8 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
632 } 635 }
633 req = embedded_payload(wrb); 636 req = embedded_payload(wrb);
634 637
635 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 638 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
636 OPCODE_COMMON_NTWK_MAC_QUERY); 639 OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req), wrb, NULL);
637
638 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
639 OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req));
640
641 req->type = type; 640 req->type = type;
642 if (permanent) { 641 if (permanent) {
643 req->permanent = 1; 642 req->permanent = 1;
@@ -674,11 +673,8 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
674 } 673 }
675 req = embedded_payload(wrb); 674 req = embedded_payload(wrb);
676 675
677 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 676 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
678 OPCODE_COMMON_NTWK_PMAC_ADD); 677 OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req), wrb, NULL);
679
680 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
681 OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req));
682 678
683 req->hdr.domain = domain; 679 req->hdr.domain = domain;
684 req->if_id = cpu_to_le32(if_id); 680 req->if_id = cpu_to_le32(if_id);
@@ -692,6 +688,10 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
692 688
693err: 689err:
694 spin_unlock_bh(&adapter->mcc_lock); 690 spin_unlock_bh(&adapter->mcc_lock);
691
692 if (status == MCC_STATUS_UNAUTHORIZED_REQUEST)
693 status = -EPERM;
694
695 return status; 695 return status;
696} 696}
697 697
@@ -711,11 +711,8 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id, u32 dom)
711 } 711 }
712 req = embedded_payload(wrb); 712 req = embedded_payload(wrb);
713 713
714 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 714 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
715 OPCODE_COMMON_NTWK_PMAC_DEL); 715 OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req), wrb, NULL);
716
717 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
718 OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req));
719 716
720 req->hdr.domain = dom; 717 req->hdr.domain = dom;
721 req->if_id = cpu_to_le32(if_id); 718 req->if_id = cpu_to_le32(if_id);
@@ -746,11 +743,8 @@ int be_cmd_cq_create(struct be_adapter *adapter,
746 req = embedded_payload(wrb); 743 req = embedded_payload(wrb);
747 ctxt = &req->context; 744 ctxt = &req->context;
748 745
749 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 746 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
750 OPCODE_COMMON_CQ_CREATE); 747 OPCODE_COMMON_CQ_CREATE, sizeof(*req), wrb, NULL);
751
752 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
753 OPCODE_COMMON_CQ_CREATE, sizeof(*req));
754 748
755 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 749 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
756 if (lancer_chip(adapter)) { 750 if (lancer_chip(adapter)) {
@@ -822,11 +816,8 @@ int be_cmd_mccq_ext_create(struct be_adapter *adapter,
822 req = embedded_payload(wrb); 816 req = embedded_payload(wrb);
823 ctxt = &req->context; 817 ctxt = &req->context;
824 818
825 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 819 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
826 OPCODE_COMMON_MCC_CREATE_EXT); 820 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb, NULL);
827
828 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
829 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req));
830 821
831 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 822 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
832 if (lancer_chip(adapter)) { 823 if (lancer_chip(adapter)) {
@@ -882,11 +873,8 @@ int be_cmd_mccq_org_create(struct be_adapter *adapter,
882 req = embedded_payload(wrb); 873 req = embedded_payload(wrb);
883 ctxt = &req->context; 874 ctxt = &req->context;
884 875
885 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 876 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
886 OPCODE_COMMON_MCC_CREATE); 877 OPCODE_COMMON_MCC_CREATE, sizeof(*req), wrb, NULL);
887
888 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
889 OPCODE_COMMON_MCC_CREATE, sizeof(*req));
890 878
891 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 879 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
892 880
@@ -943,11 +931,8 @@ int be_cmd_txq_create(struct be_adapter *adapter,
943 req = embedded_payload(wrb); 931 req = embedded_payload(wrb);
944 ctxt = &req->context; 932 ctxt = &req->context;
945 933
946 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 934 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
947 OPCODE_ETH_TX_CREATE); 935 OPCODE_ETH_TX_CREATE, sizeof(*req), wrb, NULL);
948
949 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_TX_CREATE,
950 sizeof(*req));
951 936
952 if (lancer_chip(adapter)) { 937 if (lancer_chip(adapter)) {
953 req->hdr.version = 1; 938 req->hdr.version = 1;
@@ -999,11 +984,8 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
999 } 984 }
1000 req = embedded_payload(wrb); 985 req = embedded_payload(wrb);
1001 986
1002 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 987 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1003 OPCODE_ETH_RX_CREATE); 988 OPCODE_ETH_RX_CREATE, sizeof(*req), wrb, NULL);
1004
1005 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_CREATE,
1006 sizeof(*req));
1007 989
1008 req->cq_id = cpu_to_le16(cq_id); 990 req->cq_id = cpu_to_le16(cq_id);
1009 req->frag_size = fls(frag_size) - 1; 991 req->frag_size = fls(frag_size) - 1;
@@ -1071,9 +1053,8 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
1071 BUG(); 1053 BUG();
1072 } 1054 }
1073 1055
1074 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, opcode); 1056 be_wrb_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req), wrb,
1075 1057 NULL);
1076 be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
1077 req->id = cpu_to_le16(q->id); 1058 req->id = cpu_to_le16(q->id);
1078 1059
1079 status = be_mbox_notify_wait(adapter); 1060 status = be_mbox_notify_wait(adapter);
@@ -1100,9 +1081,8 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
1100 } 1081 }
1101 req = embedded_payload(wrb); 1082 req = embedded_payload(wrb);
1102 1083
1103 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, OPCODE_ETH_RX_DESTROY); 1084 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1104 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_DESTROY, 1085 OPCODE_ETH_RX_DESTROY, sizeof(*req), wrb, NULL);
1105 sizeof(*req));
1106 req->id = cpu_to_le16(q->id); 1086 req->id = cpu_to_le16(q->id);
1107 1087
1108 status = be_mcc_notify_wait(adapter); 1088 status = be_mcc_notify_wait(adapter);
@@ -1133,12 +1113,8 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
1133 } 1113 }
1134 req = embedded_payload(wrb); 1114 req = embedded_payload(wrb);
1135 1115
1136 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1116 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1137 OPCODE_COMMON_NTWK_INTERFACE_CREATE); 1117 OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req), wrb, NULL);
1138
1139 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1140 OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req));
1141
1142 req->hdr.domain = domain; 1118 req->hdr.domain = domain;
1143 req->capability_flags = cpu_to_le32(cap_flags); 1119 req->capability_flags = cpu_to_le32(cap_flags);
1144 req->enable_flags = cpu_to_le32(en_flags); 1120 req->enable_flags = cpu_to_le32(en_flags);
@@ -1182,12 +1158,8 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id, u32 domain)
1182 } 1158 }
1183 req = embedded_payload(wrb); 1159 req = embedded_payload(wrb);
1184 1160
1185 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1161 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1186 OPCODE_COMMON_NTWK_INTERFACE_DESTROY); 1162 OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req), wrb, NULL);
1187
1188 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1189 OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req));
1190
1191 req->hdr.domain = domain; 1163 req->hdr.domain = domain;
1192 req->interface_id = cpu_to_le32(interface_id); 1164 req->interface_id = cpu_to_le32(interface_id);
1193 1165
@@ -1205,7 +1177,6 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
1205{ 1177{
1206 struct be_mcc_wrb *wrb; 1178 struct be_mcc_wrb *wrb;
1207 struct be_cmd_req_hdr *hdr; 1179 struct be_cmd_req_hdr *hdr;
1208 struct be_sge *sge;
1209 int status = 0; 1180 int status = 0;
1210 1181
1211 if (MODULO(adapter->work_counter, be_get_temp_freq) == 0) 1182 if (MODULO(adapter->work_counter, be_get_temp_freq) == 0)
@@ -1219,22 +1190,13 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
1219 goto err; 1190 goto err;
1220 } 1191 }
1221 hdr = nonemb_cmd->va; 1192 hdr = nonemb_cmd->va;
1222 sge = nonembedded_sgl(wrb);
1223
1224 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1,
1225 OPCODE_ETH_GET_STATISTICS);
1226 1193
1227 be_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH, 1194 be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
1228 OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size); 1195 OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd);
1229 1196
1230 if (adapter->generation == BE_GEN3) 1197 if (adapter->generation == BE_GEN3)
1231 hdr->version = 1; 1198 hdr->version = 1;
1232 1199
1233 wrb->tag1 = CMD_SUBSYSTEM_ETH;
1234 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
1235 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
1236 sge->len = cpu_to_le32(nonemb_cmd->size);
1237
1238 be_mcc_notify(adapter); 1200 be_mcc_notify(adapter);
1239 adapter->stats_cmd_sent = true; 1201 adapter->stats_cmd_sent = true;
1240 1202
@@ -1250,7 +1212,6 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
1250 1212
1251 struct be_mcc_wrb *wrb; 1213 struct be_mcc_wrb *wrb;
1252 struct lancer_cmd_req_pport_stats *req; 1214 struct lancer_cmd_req_pport_stats *req;
1253 struct be_sge *sge;
1254 int status = 0; 1215 int status = 0;
1255 1216
1256 spin_lock_bh(&adapter->mcc_lock); 1217 spin_lock_bh(&adapter->mcc_lock);
@@ -1261,23 +1222,14 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
1261 goto err; 1222 goto err;
1262 } 1223 }
1263 req = nonemb_cmd->va; 1224 req = nonemb_cmd->va;
1264 sge = nonembedded_sgl(wrb);
1265
1266 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1,
1267 OPCODE_ETH_GET_PPORT_STATS);
1268
1269 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1270 OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size);
1271 1225
1226 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1227 OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size, wrb,
1228 nonemb_cmd);
1272 1229
1273 req->cmd_params.params.pport_num = cpu_to_le16(adapter->port_num); 1230 req->cmd_params.params.pport_num = cpu_to_le16(adapter->port_num);
1274 req->cmd_params.params.reset_stats = 0; 1231 req->cmd_params.params.reset_stats = 0;
1275 1232
1276 wrb->tag1 = CMD_SUBSYSTEM_ETH;
1277 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
1278 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
1279 sge->len = cpu_to_le32(nonemb_cmd->size);
1280
1281 be_mcc_notify(adapter); 1233 be_mcc_notify(adapter);
1282 adapter->stats_cmd_sent = true; 1234 adapter->stats_cmd_sent = true;
1283 1235
@@ -1303,11 +1255,8 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed,
1303 } 1255 }
1304 req = embedded_payload(wrb); 1256 req = embedded_payload(wrb);
1305 1257
1306 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1258 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1307 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY); 1259 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
1308
1309 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1310 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req));
1311 1260
1312 status = be_mcc_notify_wait(adapter); 1261 status = be_mcc_notify_wait(adapter);
1313 if (!status) { 1262 if (!status) {
@@ -1343,11 +1292,9 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
1343 } 1292 }
1344 req = embedded_payload(wrb); 1293 req = embedded_payload(wrb);
1345 1294
1346 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1295 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1347 OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES); 1296 OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req),
1348 1297 wrb, NULL);
1349 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1350 OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req));
1351 1298
1352 wrb->tag1 = mccq_index; 1299 wrb->tag1 = mccq_index;
1353 1300
@@ -1374,11 +1321,8 @@ int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size)
1374 } 1321 }
1375 req = embedded_payload(wrb); 1322 req = embedded_payload(wrb);
1376 1323
1377 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1324 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1378 OPCODE_COMMON_MANAGE_FAT); 1325 OPCODE_COMMON_MANAGE_FAT, sizeof(*req), wrb, NULL);
1379
1380 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1381 OPCODE_COMMON_MANAGE_FAT, sizeof(*req));
1382 req->fat_operation = cpu_to_le32(QUERY_FAT); 1326 req->fat_operation = cpu_to_le32(QUERY_FAT);
1383 status = be_mcc_notify_wait(adapter); 1327 status = be_mcc_notify_wait(adapter);
1384 if (!status) { 1328 if (!status) {
@@ -1397,7 +1341,6 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
1397 struct be_dma_mem get_fat_cmd; 1341 struct be_dma_mem get_fat_cmd;
1398 struct be_mcc_wrb *wrb; 1342 struct be_mcc_wrb *wrb;
1399 struct be_cmd_req_get_fat *req; 1343 struct be_cmd_req_get_fat *req;
1400 struct be_sge *sge;
1401 u32 offset = 0, total_size, buf_size, 1344 u32 offset = 0, total_size, buf_size,
1402 log_offset = sizeof(u32), payload_len; 1345 log_offset = sizeof(u32), payload_len;
1403 int status; 1346 int status;
@@ -1430,18 +1373,11 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
1430 goto err; 1373 goto err;
1431 } 1374 }
1432 req = get_fat_cmd.va; 1375 req = get_fat_cmd.va;
1433 sge = nonembedded_sgl(wrb);
1434 1376
1435 payload_len = sizeof(struct be_cmd_req_get_fat) + buf_size; 1377 payload_len = sizeof(struct be_cmd_req_get_fat) + buf_size;
1436 be_wrb_hdr_prepare(wrb, payload_len, false, 1, 1378 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1437 OPCODE_COMMON_MANAGE_FAT); 1379 OPCODE_COMMON_MANAGE_FAT, payload_len, wrb,
1438 1380 &get_fat_cmd);
1439 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1440 OPCODE_COMMON_MANAGE_FAT, payload_len);
1441
1442 sge->pa_hi = cpu_to_le32(upper_32_bits(get_fat_cmd.dma));
1443 sge->pa_lo = cpu_to_le32(get_fat_cmd.dma & 0xFFFFFFFF);
1444 sge->len = cpu_to_le32(get_fat_cmd.size);
1445 1381
1446 req->fat_operation = cpu_to_le32(RETRIEVE_FAT); 1382 req->fat_operation = cpu_to_le32(RETRIEVE_FAT);
1447 req->read_log_offset = cpu_to_le32(log_offset); 1383 req->read_log_offset = cpu_to_le32(log_offset);
@@ -1485,11 +1421,9 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver,
1485 } 1421 }
1486 1422
1487 req = embedded_payload(wrb); 1423 req = embedded_payload(wrb);
1488 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
1489 OPCODE_COMMON_GET_FW_VERSION);
1490 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1491 OPCODE_COMMON_GET_FW_VERSION, sizeof(*req));
1492 1424
1425 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1426 OPCODE_COMMON_GET_FW_VERSION, sizeof(*req), wrb, NULL);
1493 status = be_mcc_notify_wait(adapter); 1427 status = be_mcc_notify_wait(adapter);
1494 if (!status) { 1428 if (!status) {
1495 struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); 1429 struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
@@ -1520,11 +1454,8 @@ int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd)
1520 } 1454 }
1521 req = embedded_payload(wrb); 1455 req = embedded_payload(wrb);
1522 1456
1523 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1457 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1524 OPCODE_COMMON_MODIFY_EQ_DELAY); 1458 OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req), wrb, NULL);
1525
1526 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1527 OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req));
1528 1459
1529 req->num_eq = cpu_to_le32(1); 1460 req->num_eq = cpu_to_le32(1);
1530 req->delay[0].eq_id = cpu_to_le32(eq_id); 1461 req->delay[0].eq_id = cpu_to_le32(eq_id);
@@ -1555,11 +1486,8 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
1555 } 1486 }
1556 req = embedded_payload(wrb); 1487 req = embedded_payload(wrb);
1557 1488
1558 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1489 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1559 OPCODE_COMMON_NTWK_VLAN_CONFIG); 1490 OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req), wrb, NULL);
1560
1561 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1562 OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req));
1563 1491
1564 req->interface_id = if_id; 1492 req->interface_id = if_id;
1565 req->promiscuous = promiscuous; 1493 req->promiscuous = promiscuous;
@@ -1582,7 +1510,6 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
1582 struct be_mcc_wrb *wrb; 1510 struct be_mcc_wrb *wrb;
1583 struct be_dma_mem *mem = &adapter->rx_filter; 1511 struct be_dma_mem *mem = &adapter->rx_filter;
1584 struct be_cmd_req_rx_filter *req = mem->va; 1512 struct be_cmd_req_rx_filter *req = mem->va;
1585 struct be_sge *sge;
1586 int status; 1513 int status;
1587 1514
1588 spin_lock_bh(&adapter->mcc_lock); 1515 spin_lock_bh(&adapter->mcc_lock);
@@ -1592,16 +1519,10 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
1592 status = -EBUSY; 1519 status = -EBUSY;
1593 goto err; 1520 goto err;
1594 } 1521 }
1595 sge = nonembedded_sgl(wrb);
1596 sge->pa_hi = cpu_to_le32(upper_32_bits(mem->dma));
1597 sge->pa_lo = cpu_to_le32(mem->dma & 0xFFFFFFFF);
1598 sge->len = cpu_to_le32(mem->size);
1599 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
1600 OPCODE_COMMON_NTWK_RX_FILTER);
1601
1602 memset(req, 0, sizeof(*req)); 1522 memset(req, 0, sizeof(*req));
1603 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1523 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1604 OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req)); 1524 OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req),
1525 wrb, mem);
1605 1526
1606 req->if_id = cpu_to_le32(adapter->if_handle); 1527 req->if_id = cpu_to_le32(adapter->if_handle);
1607 if (flags & IFF_PROMISC) { 1528 if (flags & IFF_PROMISC) {
@@ -1646,11 +1567,8 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
1646 } 1567 }
1647 req = embedded_payload(wrb); 1568 req = embedded_payload(wrb);
1648 1569
1649 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1570 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1650 OPCODE_COMMON_SET_FLOW_CONTROL); 1571 OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req), wrb, NULL);
1651
1652 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1653 OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req));
1654 1572
1655 req->tx_flow_control = cpu_to_le16((u16)tx_fc); 1573 req->tx_flow_control = cpu_to_le16((u16)tx_fc);
1656 req->rx_flow_control = cpu_to_le16((u16)rx_fc); 1574 req->rx_flow_control = cpu_to_le16((u16)rx_fc);
@@ -1678,11 +1596,8 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
1678 } 1596 }
1679 req = embedded_payload(wrb); 1597 req = embedded_payload(wrb);
1680 1598
1681 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1599 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1682 OPCODE_COMMON_GET_FLOW_CONTROL); 1600 OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req), wrb, NULL);
1683
1684 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1685 OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req));
1686 1601
1687 status = be_mcc_notify_wait(adapter); 1602 status = be_mcc_notify_wait(adapter);
1688 if (!status) { 1603 if (!status) {
@@ -1711,11 +1626,8 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
1711 wrb = wrb_from_mbox(adapter); 1626 wrb = wrb_from_mbox(adapter);
1712 req = embedded_payload(wrb); 1627 req = embedded_payload(wrb);
1713 1628
1714 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1629 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1715 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG); 1630 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req), wrb, NULL);
1716
1717 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1718 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
1719 1631
1720 status = be_mbox_notify_wait(adapter); 1632 status = be_mbox_notify_wait(adapter);
1721 if (!status) { 1633 if (!status) {
@@ -1742,11 +1654,8 @@ int be_cmd_reset_function(struct be_adapter *adapter)
1742 wrb = wrb_from_mbox(adapter); 1654 wrb = wrb_from_mbox(adapter);
1743 req = embedded_payload(wrb); 1655 req = embedded_payload(wrb);
1744 1656
1745 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1657 be_wrb_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON,
1746 OPCODE_COMMON_FUNCTION_RESET); 1658 OPCODE_COMMON_FUNCTION_RESET, sizeof(*req), wrb, NULL);
1747
1748 be_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON,
1749 OPCODE_COMMON_FUNCTION_RESET, sizeof(*req));
1750 1659
1751 status = be_mbox_notify_wait(adapter); 1660 status = be_mbox_notify_wait(adapter);
1752 1661
@@ -1768,11 +1677,8 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
1768 wrb = wrb_from_mbox(adapter); 1677 wrb = wrb_from_mbox(adapter);
1769 req = embedded_payload(wrb); 1678 req = embedded_payload(wrb);
1770 1679
1771 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1680 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1772 OPCODE_ETH_RSS_CONFIG); 1681 OPCODE_ETH_RSS_CONFIG, sizeof(*req), wrb, NULL);
1773
1774 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1775 OPCODE_ETH_RSS_CONFIG, sizeof(*req));
1776 1682
1777 req->if_id = cpu_to_le32(adapter->if_handle); 1683 req->if_id = cpu_to_le32(adapter->if_handle);
1778 req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4); 1684 req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4);
@@ -1804,11 +1710,8 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
1804 } 1710 }
1805 req = embedded_payload(wrb); 1711 req = embedded_payload(wrb);
1806 1712
1807 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1713 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1808 OPCODE_COMMON_ENABLE_DISABLE_BEACON); 1714 OPCODE_COMMON_ENABLE_DISABLE_BEACON, sizeof(*req), wrb, NULL);
1809
1810 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1811 OPCODE_COMMON_ENABLE_DISABLE_BEACON, sizeof(*req));
1812 1715
1813 req->port_num = port_num; 1716 req->port_num = port_num;
1814 req->beacon_state = state; 1717 req->beacon_state = state;
@@ -1838,11 +1741,8 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
1838 } 1741 }
1839 req = embedded_payload(wrb); 1742 req = embedded_payload(wrb);
1840 1743
1841 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1744 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1842 OPCODE_COMMON_GET_BEACON_STATE); 1745 OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req), wrb, NULL);
1843
1844 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1845 OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req));
1846 1746
1847 req->port_num = port_num; 1747 req->port_num = port_num;
1848 1748
@@ -1879,13 +1779,10 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
1879 1779
1880 req = embedded_payload(wrb); 1780 req = embedded_payload(wrb);
1881 1781
1882 be_wrb_hdr_prepare(wrb, sizeof(struct lancer_cmd_req_write_object), 1782 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1883 true, 1, OPCODE_COMMON_WRITE_OBJECT);
1884 wrb->tag1 = CMD_SUBSYSTEM_COMMON;
1885
1886 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1887 OPCODE_COMMON_WRITE_OBJECT, 1783 OPCODE_COMMON_WRITE_OBJECT,
1888 sizeof(struct lancer_cmd_req_write_object)); 1784 sizeof(struct lancer_cmd_req_write_object), wrb,
1785 NULL);
1889 1786
1890 ctxt = &req->context; 1787 ctxt = &req->context;
1891 AMAP_SET_BITS(struct amap_lancer_write_obj_context, 1788 AMAP_SET_BITS(struct amap_lancer_write_obj_context,
@@ -1938,7 +1835,6 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
1938{ 1835{
1939 struct be_mcc_wrb *wrb; 1836 struct be_mcc_wrb *wrb;
1940 struct be_cmd_write_flashrom *req; 1837 struct be_cmd_write_flashrom *req;
1941 struct be_sge *sge;
1942 int status; 1838 int status;
1943 1839
1944 spin_lock_bh(&adapter->mcc_lock); 1840 spin_lock_bh(&adapter->mcc_lock);
@@ -1950,17 +1846,9 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
1950 goto err_unlock; 1846 goto err_unlock;
1951 } 1847 }
1952 req = cmd->va; 1848 req = cmd->va;
1953 sge = nonembedded_sgl(wrb);
1954
1955 be_wrb_hdr_prepare(wrb, cmd->size, false, 1,
1956 OPCODE_COMMON_WRITE_FLASHROM);
1957 wrb->tag1 = CMD_SUBSYSTEM_COMMON;
1958 1849
1959 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1850 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1960 OPCODE_COMMON_WRITE_FLASHROM, cmd->size); 1851 OPCODE_COMMON_WRITE_FLASHROM, cmd->size, wrb, cmd);
1961 sge->pa_hi = cpu_to_le32(upper_32_bits(cmd->dma));
1962 sge->pa_lo = cpu_to_le32(cmd->dma & 0xFFFFFFFF);
1963 sge->len = cpu_to_le32(cmd->size);
1964 1852
1965 req->params.op_type = cpu_to_le32(flash_type); 1853 req->params.op_type = cpu_to_le32(flash_type);
1966 req->params.op_code = cpu_to_le32(flash_opcode); 1854 req->params.op_code = cpu_to_le32(flash_opcode);
@@ -1998,11 +1886,8 @@ int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
1998 } 1886 }
1999 req = embedded_payload(wrb); 1887 req = embedded_payload(wrb);
2000 1888
2001 be_wrb_hdr_prepare(wrb, sizeof(*req)+4, true, 0, 1889 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2002 OPCODE_COMMON_READ_FLASHROM); 1890 OPCODE_COMMON_READ_FLASHROM, sizeof(*req)+4, wrb, NULL);
2003
2004 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2005 OPCODE_COMMON_READ_FLASHROM, sizeof(*req)+4);
2006 1891
2007 req->params.op_type = cpu_to_le32(IMG_TYPE_REDBOOT); 1892 req->params.op_type = cpu_to_le32(IMG_TYPE_REDBOOT);
2008 req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT); 1893 req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
@@ -2023,7 +1908,6 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
2023{ 1908{
2024 struct be_mcc_wrb *wrb; 1909 struct be_mcc_wrb *wrb;
2025 struct be_cmd_req_acpi_wol_magic_config *req; 1910 struct be_cmd_req_acpi_wol_magic_config *req;
2026 struct be_sge *sge;
2027 int status; 1911 int status;
2028 1912
2029 spin_lock_bh(&adapter->mcc_lock); 1913 spin_lock_bh(&adapter->mcc_lock);
@@ -2034,19 +1918,12 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
2034 goto err; 1918 goto err;
2035 } 1919 }
2036 req = nonemb_cmd->va; 1920 req = nonemb_cmd->va;
2037 sge = nonembedded_sgl(wrb);
2038 1921
2039 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1, 1922 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
2040 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG); 1923 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, sizeof(*req), wrb,
2041 1924 nonemb_cmd);
2042 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
2043 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, sizeof(*req));
2044 memcpy(req->magic_mac, mac, ETH_ALEN); 1925 memcpy(req->magic_mac, mac, ETH_ALEN);
2045 1926
2046 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
2047 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
2048 sge->len = cpu_to_le32(nonemb_cmd->size);
2049
2050 status = be_mcc_notify_wait(adapter); 1927 status = be_mcc_notify_wait(adapter);
2051 1928
2052err: 1929err:
@@ -2071,12 +1948,9 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
2071 1948
2072 req = embedded_payload(wrb); 1949 req = embedded_payload(wrb);
2073 1950
2074 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1951 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2075 OPCODE_LOWLEVEL_SET_LOOPBACK_MODE); 1952 OPCODE_LOWLEVEL_SET_LOOPBACK_MODE, sizeof(*req), wrb,
2076 1953 NULL);
2077 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2078 OPCODE_LOWLEVEL_SET_LOOPBACK_MODE,
2079 sizeof(*req));
2080 1954
2081 req->src_port = port_num; 1955 req->src_port = port_num;
2082 req->dest_port = port_num; 1956 req->dest_port = port_num;
@@ -2106,11 +1980,8 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
2106 1980
2107 req = embedded_payload(wrb); 1981 req = embedded_payload(wrb);
2108 1982
2109 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 1983 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2110 OPCODE_LOWLEVEL_LOOPBACK_TEST); 1984 OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL);
2111
2112 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2113 OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req));
2114 req->hdr.timeout = cpu_to_le32(4); 1985 req->hdr.timeout = cpu_to_le32(4);
2115 1986
2116 req->pattern = cpu_to_le64(pattern); 1987 req->pattern = cpu_to_le64(pattern);
@@ -2136,7 +2007,6 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
2136{ 2007{
2137 struct be_mcc_wrb *wrb; 2008 struct be_mcc_wrb *wrb;
2138 struct be_cmd_req_ddrdma_test *req; 2009 struct be_cmd_req_ddrdma_test *req;
2139 struct be_sge *sge;
2140 int status; 2010 int status;
2141 int i, j = 0; 2011 int i, j = 0;
2142 2012
@@ -2148,15 +2018,8 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
2148 goto err; 2018 goto err;
2149 } 2019 }
2150 req = cmd->va; 2020 req = cmd->va;
2151 sge = nonembedded_sgl(wrb); 2021 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2152 be_wrb_hdr_prepare(wrb, cmd->size, false, 1, 2022 OPCODE_LOWLEVEL_HOST_DDR_DMA, cmd->size, wrb, cmd);
2153 OPCODE_LOWLEVEL_HOST_DDR_DMA);
2154 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
2155 OPCODE_LOWLEVEL_HOST_DDR_DMA, cmd->size);
2156
2157 sge->pa_hi = cpu_to_le32(upper_32_bits(cmd->dma));
2158 sge->pa_lo = cpu_to_le32(cmd->dma & 0xFFFFFFFF);
2159 sge->len = cpu_to_le32(cmd->size);
2160 2023
2161 req->pattern = cpu_to_le64(pattern); 2024 req->pattern = cpu_to_le64(pattern);
2162 req->byte_count = cpu_to_le32(byte_cnt); 2025 req->byte_count = cpu_to_le32(byte_cnt);
@@ -2201,15 +2064,9 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
2201 req = nonemb_cmd->va; 2064 req = nonemb_cmd->va;
2202 sge = nonembedded_sgl(wrb); 2065 sge = nonembedded_sgl(wrb);
2203 2066
2204 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1, 2067 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2205 OPCODE_COMMON_SEEPROM_READ); 2068 OPCODE_COMMON_SEEPROM_READ, sizeof(*req), wrb,
2206 2069 nonemb_cmd);
2207 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2208 OPCODE_COMMON_SEEPROM_READ, sizeof(*req));
2209
2210 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
2211 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
2212 sge->len = cpu_to_le32(nonemb_cmd->size);
2213 2070
2214 status = be_mcc_notify_wait(adapter); 2071 status = be_mcc_notify_wait(adapter);
2215 2072
@@ -2223,7 +2080,6 @@ int be_cmd_get_phy_info(struct be_adapter *adapter,
2223{ 2080{
2224 struct be_mcc_wrb *wrb; 2081 struct be_mcc_wrb *wrb;
2225 struct be_cmd_req_get_phy_info *req; 2082 struct be_cmd_req_get_phy_info *req;
2226 struct be_sge *sge;
2227 struct be_dma_mem cmd; 2083 struct be_dma_mem cmd;
2228 int status; 2084 int status;
2229 2085
@@ -2244,18 +2100,10 @@ int be_cmd_get_phy_info(struct be_adapter *adapter,
2244 } 2100 }
2245 2101
2246 req = cmd.va; 2102 req = cmd.va;
2247 sge = nonembedded_sgl(wrb);
2248
2249 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
2250 OPCODE_COMMON_GET_PHY_DETAILS);
2251 2103
2252 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 2104 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2253 OPCODE_COMMON_GET_PHY_DETAILS, 2105 OPCODE_COMMON_GET_PHY_DETAILS, sizeof(*req),
2254 sizeof(*req)); 2106 wrb, &cmd);
2255
2256 sge->pa_hi = cpu_to_le32(upper_32_bits(cmd.dma));
2257 sge->pa_lo = cpu_to_le32(cmd.dma & 0xFFFFFFFF);
2258 sge->len = cpu_to_le32(cmd.size);
2259 2107
2260 status = be_mcc_notify_wait(adapter); 2108 status = be_mcc_notify_wait(adapter);
2261 if (!status) { 2109 if (!status) {
@@ -2288,11 +2136,8 @@ int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
2288 2136
2289 req = embedded_payload(wrb); 2137 req = embedded_payload(wrb);
2290 2138
2291 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 2139 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2292 OPCODE_COMMON_SET_QOS); 2140 OPCODE_COMMON_SET_QOS, sizeof(*req), wrb, NULL);
2293
2294 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2295 OPCODE_COMMON_SET_QOS, sizeof(*req));
2296 2141
2297 req->hdr.domain = domain; 2142 req->hdr.domain = domain;
2298 req->valid_bits = cpu_to_le32(BE_QOS_BITS_NIC); 2143 req->valid_bits = cpu_to_le32(BE_QOS_BITS_NIC);
@@ -2310,7 +2155,6 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
2310 struct be_mcc_wrb *wrb; 2155 struct be_mcc_wrb *wrb;
2311 struct be_cmd_req_cntl_attribs *req; 2156 struct be_cmd_req_cntl_attribs *req;
2312 struct be_cmd_resp_cntl_attribs *resp; 2157 struct be_cmd_resp_cntl_attribs *resp;
2313 struct be_sge *sge;
2314 int status; 2158 int status;
2315 int payload_len = max(sizeof(*req), sizeof(*resp)); 2159 int payload_len = max(sizeof(*req), sizeof(*resp));
2316 struct mgmt_controller_attrib *attribs; 2160 struct mgmt_controller_attrib *attribs;
@@ -2335,15 +2179,10 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
2335 goto err; 2179 goto err;
2336 } 2180 }
2337 req = attribs_cmd.va; 2181 req = attribs_cmd.va;
2338 sge = nonembedded_sgl(wrb);
2339 2182
2340 be_wrb_hdr_prepare(wrb, payload_len, false, 1, 2183 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2341 OPCODE_COMMON_GET_CNTL_ATTRIBUTES); 2184 OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len, wrb,
2342 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 2185 &attribs_cmd);
2343 OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len);
2344 sge->pa_hi = cpu_to_le32(upper_32_bits(attribs_cmd.dma));
2345 sge->pa_lo = cpu_to_le32(attribs_cmd.dma & 0xFFFFFFFF);
2346 sge->len = cpu_to_le32(attribs_cmd.size);
2347 2186
2348 status = be_mbox_notify_wait(adapter); 2187 status = be_mbox_notify_wait(adapter);
2349 if (!status) { 2188 if (!status) {
@@ -2376,11 +2215,8 @@ int be_cmd_req_native_mode(struct be_adapter *adapter)
2376 2215
2377 req = embedded_payload(wrb); 2216 req = embedded_payload(wrb);
2378 2217
2379 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 2218 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2380 OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP); 2219 OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP, sizeof(*req), wrb, NULL);
2381
2382 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2383 OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP, sizeof(*req));
2384 2220
2385 req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS | 2221 req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS |
2386 CAPABILITY_BE3_NATIVE_ERX_API); 2222 CAPABILITY_BE3_NATIVE_ERX_API);
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index d6a232a300ad..21804972fa2f 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -229,27 +229,29 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
229 struct be_adapter *adapter = netdev_priv(netdev); 229 struct be_adapter *adapter = netdev_priv(netdev);
230 struct sockaddr *addr = p; 230 struct sockaddr *addr = p;
231 int status = 0; 231 int status = 0;
232 u8 current_mac[ETH_ALEN];
233 u32 pmac_id = adapter->pmac_id;
232 234
233 if (!is_valid_ether_addr(addr->sa_data)) 235 if (!is_valid_ether_addr(addr->sa_data))
234 return -EADDRNOTAVAIL; 236 return -EADDRNOTAVAIL;
235 237
236 /* MAC addr configuration will be done in hardware for VFs 238 status = be_cmd_mac_addr_query(adapter, current_mac,
237 * by their corresponding PFs. Just copy to netdev addr here 239 MAC_ADDRESS_TYPE_NETWORK, false, adapter->if_handle);
238 */
239 if (!be_physfn(adapter))
240 goto netdev_addr;
241
242 status = be_cmd_pmac_del(adapter, adapter->if_handle,
243 adapter->pmac_id, 0);
244 if (status) 240 if (status)
245 return status; 241 goto err;
246 242
247 status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, 243 if (memcmp(addr->sa_data, current_mac, ETH_ALEN)) {
244 status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data,
248 adapter->if_handle, &adapter->pmac_id, 0); 245 adapter->if_handle, &adapter->pmac_id, 0);
249netdev_addr: 246 if (status)
250 if (!status) 247 goto err;
251 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
252 248
249 be_cmd_pmac_del(adapter, adapter->if_handle, pmac_id, 0);
250 }
251 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
252 return 0;
253err:
254 dev_err(&adapter->pdev->dev, "MAC %pM set Failed\n", addr->sa_data);
253 return status; 255 return status;
254} 256}
255 257
diff --git a/drivers/net/ethernet/i825xx/Kconfig b/drivers/net/ethernet/i825xx/Kconfig
index 2be46986cbe2..ca1ae985c6df 100644
--- a/drivers/net/ethernet/i825xx/Kconfig
+++ b/drivers/net/ethernet/i825xx/Kconfig
@@ -85,7 +85,7 @@ config APRICOT
85 85
86config BVME6000_NET 86config BVME6000_NET
87 tristate "BVME6000 Ethernet support" 87 tristate "BVME6000 Ethernet support"
88 depends on BVME6000MVME16x 88 depends on BVME6000
89 ---help--- 89 ---help---
90 This is the driver for the Ethernet interface on BVME4000 and 90 This is the driver for the Ethernet interface on BVME4000 and
91 BVME6000 VME boards. Say Y here to include the driver for this chip 91 BVME6000 VME boards. Say Y here to include the driver for this chip
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 2fd1ba8fee4a..7ed53dbb8646 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -36,8 +36,8 @@
36 36
37#define _QLCNIC_LINUX_MAJOR 5 37#define _QLCNIC_LINUX_MAJOR 5
38#define _QLCNIC_LINUX_MINOR 0 38#define _QLCNIC_LINUX_MINOR 0
39#define _QLCNIC_LINUX_SUBVERSION 24 39#define _QLCNIC_LINUX_SUBVERSION 25
40#define QLCNIC_LINUX_VERSIONID "5.0.24" 40#define QLCNIC_LINUX_VERSIONID "5.0.25"
41#define QLCNIC_DRV_IDC_VER 0x01 41#define QLCNIC_DRV_IDC_VER 0x01
42#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ 42#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
43 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) 43 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 5d8bec283267..8aa1c6e8667b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -935,31 +935,49 @@ static int qlcnic_set_led(struct net_device *dev,
935{ 935{
936 struct qlcnic_adapter *adapter = netdev_priv(dev); 936 struct qlcnic_adapter *adapter = netdev_priv(dev);
937 int max_sds_rings = adapter->max_sds_rings; 937 int max_sds_rings = adapter->max_sds_rings;
938 int err = -EIO, active = 1;
939
940 if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
941 netdev_warn(dev, "LED test not supported for non "
942 "privilege function\n");
943 return -EOPNOTSUPP;
944 }
938 945
939 switch (state) { 946 switch (state) {
940 case ETHTOOL_ID_ACTIVE: 947 case ETHTOOL_ID_ACTIVE:
941 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) 948 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state))
942 return -EBUSY; 949 return -EBUSY;
943 950
944 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 951 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
945 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 952 break;
946 return -EIO;
947 953
948 if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST)) { 954 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
949 clear_bit(__QLCNIC_RESETTING, &adapter->state); 955 if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
950 return -EIO; 956 break;
951 }
952 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state); 957 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
953 } 958 }
954 959
955 if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) 960 if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) {
956 return 0; 961 err = 0;
962 break;
963 }
957 964
958 dev_err(&adapter->pdev->dev, 965 dev_err(&adapter->pdev->dev,
959 "Failed to set LED blink state.\n"); 966 "Failed to set LED blink state.\n");
960 break; 967 break;
961 968
962 case ETHTOOL_ID_INACTIVE: 969 case ETHTOOL_ID_INACTIVE:
970 active = 0;
971
972 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
973 break;
974
975 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
976 if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
977 break;
978 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
979 }
980
963 if (adapter->nic_ops->config_led(adapter, 0, 0xf)) 981 if (adapter->nic_ops->config_led(adapter, 0, 0xf))
964 dev_err(&adapter->pdev->dev, 982 dev_err(&adapter->pdev->dev,
965 "Failed to reset LED blink state.\n"); 983 "Failed to reset LED blink state.\n");
@@ -970,14 +988,13 @@ static int qlcnic_set_led(struct net_device *dev,
970 return -EINVAL; 988 return -EINVAL;
971 } 989 }
972 990
973 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) { 991 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
974 qlcnic_diag_free_res(dev, max_sds_rings); 992 qlcnic_diag_free_res(dev, max_sds_rings);
975 clear_bit(__QLCNIC_RESETTING, &adapter->state);
976 }
977 993
978 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 994 if (!active || err)
995 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
979 996
980 return -EIO; 997 return err;
981} 998}
982 999
983static void 1000static void
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
index 92bc8ce9b287..a52819303d1b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
@@ -407,7 +407,9 @@ enum {
407#define QLCNIC_CRB_SRE QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_SRE) 407#define QLCNIC_CRB_SRE QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_SRE)
408#define QLCNIC_CRB_ROMUSB \ 408#define QLCNIC_CRB_ROMUSB \
409 QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_ROMUSB) 409 QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_ROMUSB)
410#define QLCNIC_CRB_EPG QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_EG)
410#define QLCNIC_CRB_I2Q QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_I2Q) 411#define QLCNIC_CRB_I2Q QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_I2Q)
412#define QLCNIC_CRB_TIMER QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_TIMR)
411#define QLCNIC_CRB_I2C0 QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_I2C0) 413#define QLCNIC_CRB_I2C0 QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_I2C0)
412#define QLCNIC_CRB_SMB QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_SMB) 414#define QLCNIC_CRB_SMB QLCNIC_PCI_CRB_WINDOW(QLCNIC_HW_PX_MAP_CRB_SMB)
413#define QLCNIC_CRB_MAX QLCNIC_PCI_CRB_WINDOW(64) 415#define QLCNIC_CRB_MAX QLCNIC_PCI_CRB_WINDOW(64)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 74e9d7b94965..bcb81e47543a 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -566,7 +566,7 @@ int qlcnic_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
566 return -EIO; 566 return -EIO;
567 567
568 if (qlcnic_nic_set_promisc(adapter, VPORT_MISS_MODE_ACCEPT_ALL)) { 568 if (qlcnic_nic_set_promisc(adapter, VPORT_MISS_MODE_ACCEPT_ALL)) {
569 qlcnic_set_fw_loopback(adapter, mode); 569 qlcnic_set_fw_loopback(adapter, 0);
570 return -EIO; 570 return -EIO;
571 } 571 }
572 572
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index 312c1c37889d..38669583840c 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -422,9 +422,53 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
422 QLCWR32(adapter, CRB_CMDPEG_STATE, 0); 422 QLCWR32(adapter, CRB_CMDPEG_STATE, 0);
423 QLCWR32(adapter, CRB_RCVPEG_STATE, 0); 423 QLCWR32(adapter, CRB_RCVPEG_STATE, 0);
424 424
425 qlcnic_rom_lock(adapter); 425 /* Halt all the indiviual PEGs and other blocks */
426 QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0xfeffffff); 426 /* disable all I2Q */
427 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x10, 0x0);
428 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x14, 0x0);
429 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x18, 0x0);
430 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x1c, 0x0);
431 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x20, 0x0);
432 QLCWR32(adapter, QLCNIC_CRB_I2Q + 0x24, 0x0);
433
434 /* disable all niu interrupts */
435 QLCWR32(adapter, QLCNIC_CRB_NIU + 0x40, 0xff);
436 /* disable xge rx/tx */
437 QLCWR32(adapter, QLCNIC_CRB_NIU + 0x70000, 0x00);
438 /* disable xg1 rx/tx */
439 QLCWR32(adapter, QLCNIC_CRB_NIU + 0x80000, 0x00);
440 /* disable sideband mac */
441 QLCWR32(adapter, QLCNIC_CRB_NIU + 0x90000, 0x00);
442 /* disable ap0 mac */
443 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xa0000, 0x00);
444 /* disable ap1 mac */
445 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00);
446
447 /* halt sre */
448 val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000);
449 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1)));
450
451 /* halt epg */
452 QLCWR32(adapter, QLCNIC_CRB_EPG + 0x1300, 0x1);
453
454 /* halt timers */
455 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x0, 0x0);
456 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x8, 0x0);
457 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x10, 0x0);
458 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x18, 0x0);
459 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x100, 0x0);
460 QLCWR32(adapter, QLCNIC_CRB_TIMER + 0x200, 0x0);
461 /* halt pegs */
462 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, 1);
463 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, 1);
464 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, 1);
465 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, 1);
466 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, 1);
467 msleep(20);
468
427 qlcnic_rom_unlock(adapter); 469 qlcnic_rom_unlock(adapter);
470 /* big hammer don't reset CAM block on reset */
471 QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0xfeffffff);
428 472
429 /* Init HW CRB block */ 473 /* Init HW CRB block */
430 if (qlcnic_rom_fast_read(adapter, 0, &n) != 0 || (n != 0xcafecafe) || 474 if (qlcnic_rom_fast_read(adapter, 0, &n) != 0 || (n != 0xcafecafe) ||
@@ -522,8 +566,10 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
522 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x8, 0); 566 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x8, 0);
523 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0xc, 0); 567 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0xc, 0);
524 msleep(1); 568 msleep(1);
569
525 QLCWR32(adapter, QLCNIC_PEG_HALT_STATUS1, 0); 570 QLCWR32(adapter, QLCNIC_PEG_HALT_STATUS1, 0);
526 QLCWR32(adapter, QLCNIC_PEG_HALT_STATUS2, 0); 571 QLCWR32(adapter, QLCNIC_PEG_HALT_STATUS2, 0);
572
527 return 0; 573 return 0;
528} 574}
529 575
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 106503f118f6..0bd163828e33 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2840,8 +2840,15 @@ qlcnic_fwinit_work(struct work_struct *work)
2840 goto wait_npar; 2840 goto wait_npar;
2841 } 2841 }
2842 2842
2843 if (dev_state == QLCNIC_DEV_INITIALIZING ||
2844 dev_state == QLCNIC_DEV_READY) {
2845 dev_info(&adapter->pdev->dev, "Detected state change from "
2846 "DEV_NEED_RESET, skipping ack check\n");
2847 goto skip_ack_check;
2848 }
2849
2843 if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) { 2850 if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) {
2844 dev_err(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n", 2851 dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n",
2845 adapter->reset_ack_timeo); 2852 adapter->reset_ack_timeo);
2846 goto skip_ack_check; 2853 goto skip_ack_check;
2847 } 2854 }
@@ -3497,11 +3504,16 @@ qlcnic_store_beacon(struct device *dev,
3497{ 3504{
3498 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 3505 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
3499 int max_sds_rings = adapter->max_sds_rings; 3506 int max_sds_rings = adapter->max_sds_rings;
3500 int dev_down = 0;
3501 u16 beacon; 3507 u16 beacon;
3502 u8 b_state, b_rate; 3508 u8 b_state, b_rate;
3503 int err; 3509 int err;
3504 3510
3511 if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
3512 dev_warn(dev, "LED test not supported for non "
3513 "privilege function\n");
3514 return -EOPNOTSUPP;
3515 }
3516
3505 if (len != sizeof(u16)) 3517 if (len != sizeof(u16))
3506 return QL_STATUS_INVALID_PARAM; 3518 return QL_STATUS_INVALID_PARAM;
3507 3519
@@ -3513,36 +3525,40 @@ qlcnic_store_beacon(struct device *dev,
3513 if (adapter->ahw->beacon_state == b_state) 3525 if (adapter->ahw->beacon_state == b_state)
3514 return len; 3526 return len;
3515 3527
3528 rtnl_lock();
3529
3516 if (!adapter->ahw->beacon_state) 3530 if (!adapter->ahw->beacon_state)
3517 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) 3531 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
3532 rtnl_unlock();
3518 return -EBUSY; 3533 return -EBUSY;
3534 }
3535
3536 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
3537 err = -EIO;
3538 goto out;
3539 }
3519 3540
3520 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 3541 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
3521 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
3522 return -EIO;
3523 err = qlcnic_diag_alloc_res(adapter->netdev, QLCNIC_LED_TEST); 3542 err = qlcnic_diag_alloc_res(adapter->netdev, QLCNIC_LED_TEST);
3524 if (err) { 3543 if (err)
3525 clear_bit(__QLCNIC_RESETTING, &adapter->state); 3544 goto out;
3526 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 3545 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
3527 return err;
3528 }
3529 dev_down = 1;
3530 } 3546 }
3531 3547
3532 err = qlcnic_config_led(adapter, b_state, b_rate); 3548 err = qlcnic_config_led(adapter, b_state, b_rate);
3533 3549
3534 if (!err) { 3550 if (!err) {
3535 adapter->ahw->beacon_state = b_state;
3536 err = len; 3551 err = len;
3552 adapter->ahw->beacon_state = b_state;
3537 } 3553 }
3538 3554
3539 if (dev_down) { 3555 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
3540 qlcnic_diag_free_res(adapter->netdev, max_sds_rings); 3556 qlcnic_diag_free_res(adapter->netdev, max_sds_rings);
3541 clear_bit(__QLCNIC_RESETTING, &adapter->state);
3542 }
3543 3557
3544 if (!b_state) 3558 out:
3559 if (!adapter->ahw->beacon_state)
3545 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 3560 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
3561 rtnl_unlock();
3546 3562
3547 return err; 3563 return err;
3548} 3564}
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h
index 9100c100d295..2cc119295821 100644
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -49,7 +49,7 @@ struct stmmac_extra_stats {
49 unsigned long tx_underflow ____cacheline_aligned; 49 unsigned long tx_underflow ____cacheline_aligned;
50 unsigned long tx_carrier; 50 unsigned long tx_carrier;
51 unsigned long tx_losscarrier; 51 unsigned long tx_losscarrier;
52 unsigned long tx_heartbeat; 52 unsigned long vlan_tag;
53 unsigned long tx_deferred; 53 unsigned long tx_deferred;
54 unsigned long tx_vlan; 54 unsigned long tx_vlan;
55 unsigned long tx_jabber; 55 unsigned long tx_jabber;
@@ -58,9 +58,9 @@ struct stmmac_extra_stats {
58 unsigned long tx_ip_header_error; 58 unsigned long tx_ip_header_error;
59 /* Receive errors */ 59 /* Receive errors */
60 unsigned long rx_desc; 60 unsigned long rx_desc;
61 unsigned long rx_partial; 61 unsigned long sa_filter_fail;
62 unsigned long rx_runt; 62 unsigned long overflow_error;
63 unsigned long rx_toolong; 63 unsigned long ipc_csum_error;
64 unsigned long rx_collision; 64 unsigned long rx_collision;
65 unsigned long rx_crc; 65 unsigned long rx_crc;
66 unsigned long rx_length; 66 unsigned long rx_length;
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs.h b/drivers/net/ethernet/stmicro/stmmac/descs.h
index 63a03e264694..9820ec842cc0 100644
--- a/drivers/net/ethernet/stmicro/stmmac/descs.h
+++ b/drivers/net/ethernet/stmicro/stmmac/descs.h
@@ -25,33 +25,34 @@ struct dma_desc {
25 union { 25 union {
26 struct { 26 struct {
27 /* RDES0 */ 27 /* RDES0 */
28 u32 reserved1:1; 28 u32 payload_csum_error:1;
29 u32 crc_error:1; 29 u32 crc_error:1;
30 u32 dribbling:1; 30 u32 dribbling:1;
31 u32 mii_error:1; 31 u32 mii_error:1;
32 u32 receive_watchdog:1; 32 u32 receive_watchdog:1;
33 u32 frame_type:1; 33 u32 frame_type:1;
34 u32 collision:1; 34 u32 collision:1;
35 u32 frame_too_long:1; 35 u32 ipc_csum_error:1;
36 u32 last_descriptor:1; 36 u32 last_descriptor:1;
37 u32 first_descriptor:1; 37 u32 first_descriptor:1;
38 u32 multicast_frame:1; 38 u32 vlan_tag:1;
39 u32 run_frame:1; 39 u32 overflow_error:1;
40 u32 length_error:1; 40 u32 length_error:1;
41 u32 partial_frame_error:1; 41 u32 sa_filter_fail:1;
42 u32 descriptor_error:1; 42 u32 descriptor_error:1;
43 u32 error_summary:1; 43 u32 error_summary:1;
44 u32 frame_length:14; 44 u32 frame_length:14;
45 u32 filtering_fail:1; 45 u32 da_filter_fail:1;
46 u32 own:1; 46 u32 own:1;
47 /* RDES1 */ 47 /* RDES1 */
48 u32 buffer1_size:11; 48 u32 buffer1_size:11;
49 u32 buffer2_size:11; 49 u32 buffer2_size:11;
50 u32 reserved2:2; 50 u32 reserved1:2;
51 u32 second_address_chained:1; 51 u32 second_address_chained:1;
52 u32 end_ring:1; 52 u32 end_ring:1;
53 u32 reserved3:5; 53 u32 reserved2:5;
54 u32 disable_ic:1; 54 u32 disable_ic:1;
55
55 } rx; 56 } rx;
56 struct { 57 struct {
57 /* RDES0 */ 58 /* RDES0 */
@@ -91,24 +92,28 @@ struct dma_desc {
91 u32 underflow_error:1; 92 u32 underflow_error:1;
92 u32 excessive_deferral:1; 93 u32 excessive_deferral:1;
93 u32 collision_count:4; 94 u32 collision_count:4;
94 u32 heartbeat_fail:1; 95 u32 vlan_frame:1;
95 u32 excessive_collisions:1; 96 u32 excessive_collisions:1;
96 u32 late_collision:1; 97 u32 late_collision:1;
97 u32 no_carrier:1; 98 u32 no_carrier:1;
98 u32 loss_carrier:1; 99 u32 loss_carrier:1;
99 u32 reserved1:3; 100 u32 payload_error:1;
101 u32 frame_flushed:1;
102 u32 jabber_timeout:1;
100 u32 error_summary:1; 103 u32 error_summary:1;
101 u32 reserved2:15; 104 u32 ip_header_error:1;
105 u32 time_stamp_status:1;
106 u32 reserved1:13;
102 u32 own:1; 107 u32 own:1;
103 /* TDES1 */ 108 /* TDES1 */
104 u32 buffer1_size:11; 109 u32 buffer1_size:11;
105 u32 buffer2_size:11; 110 u32 buffer2_size:11;
106 u32 reserved3:1; 111 u32 time_stamp_enable:1;
107 u32 disable_padding:1; 112 u32 disable_padding:1;
108 u32 second_address_chained:1; 113 u32 second_address_chained:1;
109 u32 end_ring:1; 114 u32 end_ring:1;
110 u32 crc_disable:1; 115 u32 crc_disable:1;
111 u32 reserved4:2; 116 u32 checksum_insertion:2;
112 u32 first_segment:1; 117 u32 first_segment:1;
113 u32 last_segment:1; 118 u32 last_segment:1;
114 u32 interrupt:1; 119 u32 interrupt:1;
diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
index f7e8ba7f501a..fda5d2b31d3a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c
@@ -50,11 +50,12 @@ static int ndesc_get_tx_status(void *data, struct stmmac_extra_stats *x,
50 stats->collisions += p->des01.tx.collision_count; 50 stats->collisions += p->des01.tx.collision_count;
51 ret = -1; 51 ret = -1;
52 } 52 }
53 if (unlikely(p->des01.tx.heartbeat_fail)) { 53
54 x->tx_heartbeat++; 54 if (p->des01.etx.vlan_frame) {
55 stats->tx_heartbeat_errors++; 55 CHIP_DBG(KERN_INFO "GMAC TX status: VLAN frame\n");
56 ret = -1; 56 x->tx_vlan++;
57 } 57 }
58
58 if (unlikely(p->des01.tx.deferred)) 59 if (unlikely(p->des01.tx.deferred))
59 x->tx_deferred++; 60 x->tx_deferred++;
60 61
@@ -68,12 +69,12 @@ static int ndesc_get_tx_len(struct dma_desc *p)
68 69
69/* This function verifies if each incoming frame has some errors 70/* This function verifies if each incoming frame has some errors
70 * and, if required, updates the multicast statistics. 71 * and, if required, updates the multicast statistics.
71 * In case of success, it returns csum_none because the device 72 * In case of success, it returns good_frame because the GMAC device
72 * is not able to compute the csum in HW. */ 73 * is supposed to be able to compute the csum in HW. */
73static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, 74static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
74 struct dma_desc *p) 75 struct dma_desc *p)
75{ 76{
76 int ret = csum_none; 77 int ret = good_frame;
77 struct net_device_stats *stats = (struct net_device_stats *)data; 78 struct net_device_stats *stats = (struct net_device_stats *)data;
78 79
79 if (unlikely(p->des01.rx.last_descriptor == 0)) { 80 if (unlikely(p->des01.rx.last_descriptor == 0)) {
@@ -86,12 +87,12 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
86 if (unlikely(p->des01.rx.error_summary)) { 87 if (unlikely(p->des01.rx.error_summary)) {
87 if (unlikely(p->des01.rx.descriptor_error)) 88 if (unlikely(p->des01.rx.descriptor_error))
88 x->rx_desc++; 89 x->rx_desc++;
89 if (unlikely(p->des01.rx.partial_frame_error)) 90 if (unlikely(p->des01.rx.sa_filter_fail))
90 x->rx_partial++; 91 x->sa_filter_fail++;
91 if (unlikely(p->des01.rx.run_frame)) 92 if (unlikely(p->des01.rx.overflow_error))
92 x->rx_runt++; 93 x->overflow_error++;
93 if (unlikely(p->des01.rx.frame_too_long)) 94 if (unlikely(p->des01.rx.ipc_csum_error))
94 x->rx_toolong++; 95 x->ipc_csum_error++;
95 if (unlikely(p->des01.rx.collision)) { 96 if (unlikely(p->des01.rx.collision)) {
96 x->rx_collision++; 97 x->rx_collision++;
97 stats->collisions++; 98 stats->collisions++;
@@ -113,10 +114,10 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
113 x->rx_mii++; 114 x->rx_mii++;
114 ret = discard_frame; 115 ret = discard_frame;
115 } 116 }
116 if (p->des01.rx.multicast_frame) { 117#ifdef STMMAC_VLAN_TAG_USED
117 x->rx_multicast++; 118 if (p->des01.rx.vlan_tag)
118 stats->multicast++; 119 x->vlan_tag++;
119 } 120#endif
120 return ret; 121 return ret;
121} 122}
122 123
@@ -184,6 +185,9 @@ static void ndesc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
184{ 185{
185 p->des01.tx.first_segment = is_fs; 186 p->des01.tx.first_segment = is_fs;
186 norm_set_tx_desc_len(p, len); 187 norm_set_tx_desc_len(p, len);
188
189 if (likely(csum_flag))
190 p->des01.tx.checksum_insertion = cic_full;
187} 191}
188 192
189static void ndesc_clear_tx_ic(struct dma_desc *p) 193static void ndesc_clear_tx_ic(struct dma_desc *p)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index 406404f6e321..e8eff09bbbd7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -50,7 +50,7 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {
50 STMMAC_STAT(tx_underflow), 50 STMMAC_STAT(tx_underflow),
51 STMMAC_STAT(tx_carrier), 51 STMMAC_STAT(tx_carrier),
52 STMMAC_STAT(tx_losscarrier), 52 STMMAC_STAT(tx_losscarrier),
53 STMMAC_STAT(tx_heartbeat), 53 STMMAC_STAT(vlan_tag),
54 STMMAC_STAT(tx_deferred), 54 STMMAC_STAT(tx_deferred),
55 STMMAC_STAT(tx_vlan), 55 STMMAC_STAT(tx_vlan),
56 STMMAC_STAT(rx_vlan), 56 STMMAC_STAT(rx_vlan),
@@ -59,9 +59,9 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {
59 STMMAC_STAT(tx_payload_error), 59 STMMAC_STAT(tx_payload_error),
60 STMMAC_STAT(tx_ip_header_error), 60 STMMAC_STAT(tx_ip_header_error),
61 STMMAC_STAT(rx_desc), 61 STMMAC_STAT(rx_desc),
62 STMMAC_STAT(rx_partial), 62 STMMAC_STAT(sa_filter_fail),
63 STMMAC_STAT(rx_runt), 63 STMMAC_STAT(overflow_error),
64 STMMAC_STAT(rx_toolong), 64 STMMAC_STAT(ipc_csum_error),
65 STMMAC_STAT(rx_collision), 65 STMMAC_STAT(rx_collision),
66 STMMAC_STAT(rx_crc), 66 STMMAC_STAT(rx_crc),
67 STMMAC_STAT(rx_length), 67 STMMAC_STAT(rx_length),
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index aeaa15b451de..20546bbbb8db 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -325,7 +325,7 @@ static int stmmac_init_phy(struct net_device *dev)
325 (interface == PHY_INTERFACE_MODE_RMII))) { 325 (interface == PHY_INTERFACE_MODE_RMII))) {
326 phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause | 326 phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause |
327 SUPPORTED_Asym_Pause); 327 SUPPORTED_Asym_Pause);
328 priv->phydev->advertising = priv->phydev->supported; 328 phydev->advertising = phydev->supported;
329 } 329 }
330 330
331 /* 331 /*
@@ -812,9 +812,11 @@ static u32 stmmac_get_synopsys_id(struct stmmac_priv *priv)
812 */ 812 */
813static int stmmac_get_hw_features(struct stmmac_priv *priv) 813static int stmmac_get_hw_features(struct stmmac_priv *priv)
814{ 814{
815 u32 hw_cap = priv->hw->dma->get_hw_feature(priv->ioaddr); 815 u32 hw_cap = 0;
816
817 if (priv->hw->dma->get_hw_feature) {
818 hw_cap = priv->hw->dma->get_hw_feature(priv->ioaddr);
816 819
817 if (likely(hw_cap)) {
818 priv->dma_cap.mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL); 820 priv->dma_cap.mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
819 priv->dma_cap.mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1; 821 priv->dma_cap.mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
820 priv->dma_cap.half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2; 822 priv->dma_cap.half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
@@ -937,6 +939,7 @@ static int stmmac_open(struct net_device *dev)
937 939
938 stmmac_get_hw_features(priv); 940 stmmac_get_hw_features(priv);
939 941
942 priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr);
940 if (priv->rx_coe) 943 if (priv->rx_coe)
941 pr_info("stmmac: Rx Checksum Offload Engine supported\n"); 944 pr_info("stmmac: Rx Checksum Offload Engine supported\n");
942 if (priv->plat->tx_coe) 945 if (priv->plat->tx_coe)
@@ -1274,8 +1277,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
1274#endif 1277#endif
1275 skb->protocol = eth_type_trans(skb, priv->dev); 1278 skb->protocol = eth_type_trans(skb, priv->dev);
1276 1279
1277 if (unlikely(status == csum_none)) { 1280 if (unlikely(!priv->rx_coe)) {
1278 /* always for the old mac 10/100 */ 1281 /* No RX COE for old mac10/100 devices */
1279 skb_checksum_none_assert(skb); 1282 skb_checksum_none_assert(skb);
1280 netif_receive_skb(skb); 1283 netif_receive_skb(skb);
1281 } else { 1284 } else {
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 44da4822bcab..12d5543b14f2 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -106,7 +106,7 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,
106extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); 106extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
107extern u16 vlan_dev_vlan_id(const struct net_device *dev); 107extern u16 vlan_dev_vlan_id(const struct net_device *dev);
108 108
109extern bool vlan_do_receive(struct sk_buff **skb); 109extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler);
110extern struct sk_buff *vlan_untag(struct sk_buff *skb); 110extern struct sk_buff *vlan_untag(struct sk_buff *skb);
111 111
112#else 112#else
@@ -128,9 +128,9 @@ static inline u16 vlan_dev_vlan_id(const struct net_device *dev)
128 return 0; 128 return 0;
129} 129}
130 130
131static inline bool vlan_do_receive(struct sk_buff **skb) 131static inline bool vlan_do_receive(struct sk_buff **skb, bool last_handler)
132{ 132{
133 if ((*skb)->vlan_tci & VLAN_VID_MASK) 133 if (((*skb)->vlan_tci & VLAN_VID_MASK) && last_handler)
134 (*skb)->pkt_type = PACKET_OTHERHOST; 134 (*skb)->pkt_type = PACKET_OTHERHOST;
135 return false; 135 return false;
136} 136}
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h
index 180231c5bbbe..f91a1fb5da7c 100644
--- a/include/net/inet_timewait_sock.h
+++ b/include/net/inet_timewait_sock.h
@@ -134,6 +134,7 @@ struct inet_timewait_sock {
134 struct inet_bind_bucket *tw_tb; 134 struct inet_bind_bucket *tw_tb;
135 struct hlist_node tw_death_node; 135 struct hlist_node tw_death_node;
136}; 136};
137#define tw_tclass tw_tos
137 138
138static inline void inet_twsk_add_node_rcu(struct inet_timewait_sock *tw, 139static inline void inet_twsk_add_node_rcu(struct inet_timewait_sock *tw,
139 struct hlist_nulls_head *list) 140 struct hlist_nulls_head *list)
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 3b5ac1fbff39..a366a8a1fe23 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -486,7 +486,8 @@ extern int ip6_rcv_finish(struct sk_buff *skb);
486extern int ip6_xmit(struct sock *sk, 486extern int ip6_xmit(struct sock *sk,
487 struct sk_buff *skb, 487 struct sk_buff *skb,
488 struct flowi6 *fl6, 488 struct flowi6 *fl6,
489 struct ipv6_txoptions *opt); 489 struct ipv6_txoptions *opt,
490 int tclass);
490 491
491extern int ip6_nd_hdr(struct sock *sk, 492extern int ip6_nd_hdr(struct sock *sk,
492 struct sk_buff *skb, 493 struct sk_buff *skb,
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
index f1f2f7bb6661..163397f1fd5a 100644
--- a/net/8021q/vlan_core.c
+++ b/net/8021q/vlan_core.c
@@ -4,7 +4,7 @@
4#include <linux/netpoll.h> 4#include <linux/netpoll.h>
5#include "vlan.h" 5#include "vlan.h"
6 6
7bool vlan_do_receive(struct sk_buff **skbp) 7bool vlan_do_receive(struct sk_buff **skbp, bool last_handler)
8{ 8{
9 struct sk_buff *skb = *skbp; 9 struct sk_buff *skb = *skbp;
10 u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK; 10 u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK;
@@ -13,7 +13,10 @@ bool vlan_do_receive(struct sk_buff **skbp)
13 13
14 vlan_dev = vlan_find_dev(skb->dev, vlan_id); 14 vlan_dev = vlan_find_dev(skb->dev, vlan_id);
15 if (!vlan_dev) { 15 if (!vlan_dev) {
16 if (vlan_id) 16 /* Only the last call to vlan_do_receive() should change
17 * pkt_type to PACKET_OTHERHOST
18 */
19 if (vlan_id && last_handler)
17 skb->pkt_type = PACKET_OTHERHOST; 20 skb->pkt_type = PACKET_OTHERHOST;
18 return false; 21 return false;
19 } 22 }
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 873fb3d8e56f..c7aafc7c5ed4 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry)
137 kfree_rcu(tt_local_entry, rcu); 137 kfree_rcu(tt_local_entry, rcu);
138} 138}
139 139
140static void tt_global_entry_free_rcu(struct rcu_head *rcu)
141{
142 struct tt_global_entry *tt_global_entry;
143
144 tt_global_entry = container_of(rcu, struct tt_global_entry, rcu);
145
146 if (tt_global_entry->orig_node)
147 orig_node_free_ref(tt_global_entry->orig_node);
148
149 kfree(tt_global_entry);
150}
151
140static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) 152static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry)
141{ 153{
142 if (atomic_dec_and_test(&tt_global_entry->refcount)) 154 if (atomic_dec_and_test(&tt_global_entry->refcount))
143 kfree_rcu(tt_global_entry, rcu); 155 call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu);
144} 156}
145 157
146static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, 158static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr,
@@ -710,6 +722,9 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
710 struct hlist_head *head; 722 struct hlist_head *head;
711 spinlock_t *list_lock; /* protects write access to the hash lists */ 723 spinlock_t *list_lock; /* protects write access to the hash lists */
712 724
725 if (!hash)
726 return;
727
713 for (i = 0; i < hash->size; i++) { 728 for (i = 0; i < hash->size; i++) {
714 head = &hash->table[i]; 729 head = &hash->table[i];
715 list_lock = &hash->list_locks[i]; 730 list_lock = &hash->list_locks[i];
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 1ae355750511..ab8d0fe6df5a 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -224,22 +224,22 @@ struct socket_packet {
224 224
225struct tt_local_entry { 225struct tt_local_entry {
226 uint8_t addr[ETH_ALEN]; 226 uint8_t addr[ETH_ALEN];
227 struct hlist_node hash_entry;
227 unsigned long last_seen; 228 unsigned long last_seen;
228 uint16_t flags; 229 uint16_t flags;
229 atomic_t refcount; 230 atomic_t refcount;
230 struct rcu_head rcu; 231 struct rcu_head rcu;
231 struct hlist_node hash_entry;
232}; 232};
233 233
234struct tt_global_entry { 234struct tt_global_entry {
235 uint8_t addr[ETH_ALEN]; 235 uint8_t addr[ETH_ALEN];
236 struct hlist_node hash_entry; /* entry in the global table */
236 struct orig_node *orig_node; 237 struct orig_node *orig_node;
237 uint8_t ttvn; 238 uint8_t ttvn;
238 uint16_t flags; /* only TT_GLOBAL_ROAM is used */ 239 uint16_t flags; /* only TT_GLOBAL_ROAM is used */
239 unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ 240 unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
240 atomic_t refcount; 241 atomic_t refcount;
241 struct rcu_head rcu; 242 struct rcu_head rcu;
242 struct hlist_node hash_entry; /* entry in the global table */
243}; 243};
244 244
245struct tt_change_node { 245struct tt_change_node {
diff --git a/net/core/dev.c b/net/core/dev.c
index edcf019c056d..6ba50a1e404c 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3283,18 +3283,18 @@ another_round:
3283ncls: 3283ncls:
3284#endif 3284#endif
3285 3285
3286 rx_handler = rcu_dereference(skb->dev->rx_handler);
3286 if (vlan_tx_tag_present(skb)) { 3287 if (vlan_tx_tag_present(skb)) {
3287 if (pt_prev) { 3288 if (pt_prev) {
3288 ret = deliver_skb(skb, pt_prev, orig_dev); 3289 ret = deliver_skb(skb, pt_prev, orig_dev);
3289 pt_prev = NULL; 3290 pt_prev = NULL;
3290 } 3291 }
3291 if (vlan_do_receive(&skb)) 3292 if (vlan_do_receive(&skb, !rx_handler))
3292 goto another_round; 3293 goto another_round;
3293 else if (unlikely(!skb)) 3294 else if (unlikely(!skb))
3294 goto out; 3295 goto out;
3295 } 3296 }
3296 3297
3297 rx_handler = rcu_dereference(skb->dev->rx_handler);
3298 if (rx_handler) { 3298 if (rx_handler) {
3299 if (pt_prev) { 3299 if (pt_prev) {
3300 ret = deliver_skb(skb, pt_prev, orig_dev); 3300 ret = deliver_skb(skb, pt_prev, orig_dev);
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index b74f76117dcf..17ee85ce148d 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -271,7 +271,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
271 &ireq6->loc_addr, 271 &ireq6->loc_addr,
272 &ireq6->rmt_addr); 272 &ireq6->rmt_addr);
273 ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr); 273 ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr);
274 err = ip6_xmit(sk, skb, &fl6, opt); 274 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
275 err = net_xmit_eval(err); 275 err = net_xmit_eval(err);
276 } 276 }
277 277
@@ -326,7 +326,7 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
326 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); 326 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
327 if (!IS_ERR(dst)) { 327 if (!IS_ERR(dst)) {
328 skb_dst_set(skb, dst); 328 skb_dst_set(skb, dst);
329 ip6_xmit(ctl_sk, skb, &fl6, NULL); 329 ip6_xmit(ctl_sk, skb, &fl6, NULL, 0);
330 DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS); 330 DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
331 DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS); 331 DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS);
332 return; 332 return;
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 85a2fbebd7ef..66363b689ad6 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -345,6 +345,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
345 tw6 = inet6_twsk((struct sock *)tw); 345 tw6 = inet6_twsk((struct sock *)tw);
346 ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr); 346 ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr);
347 ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr); 347 ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr);
348 tw->tw_tclass = np->tclass;
348 tw->tw_ipv6only = np->ipv6only; 349 tw->tw_ipv6only = np->ipv6only;
349 } 350 }
350#endif 351#endif
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index e39239e6426e..d0611a5de45f 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1713,6 +1713,40 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
1713 ip6_route_add(&cfg); 1713 ip6_route_add(&cfg);
1714} 1714}
1715 1715
1716
1717static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
1718 int plen,
1719 const struct net_device *dev,
1720 u32 flags, u32 noflags)
1721{
1722 struct fib6_node *fn;
1723 struct rt6_info *rt = NULL;
1724 struct fib6_table *table;
1725
1726 table = fib6_get_table(dev_net(dev), RT6_TABLE_PREFIX);
1727 if (table == NULL)
1728 return NULL;
1729
1730 write_lock_bh(&table->tb6_lock);
1731 fn = fib6_locate(&table->tb6_root, pfx, plen, NULL, 0);
1732 if (!fn)
1733 goto out;
1734 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
1735 if (rt->rt6i_dev->ifindex != dev->ifindex)
1736 continue;
1737 if ((rt->rt6i_flags & flags) != flags)
1738 continue;
1739 if ((noflags != 0) && ((rt->rt6i_flags & flags) != 0))
1740 continue;
1741 dst_hold(&rt->dst);
1742 break;
1743 }
1744out:
1745 write_unlock_bh(&table->tb6_lock);
1746 return rt;
1747}
1748
1749
1716/* Create "default" multicast route to the interface */ 1750/* Create "default" multicast route to the interface */
1717 1751
1718static void addrconf_add_mroute(struct net_device *dev) 1752static void addrconf_add_mroute(struct net_device *dev)
@@ -1842,10 +1876,13 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
1842 if (addrconf_finite_timeout(rt_expires)) 1876 if (addrconf_finite_timeout(rt_expires))
1843 rt_expires *= HZ; 1877 rt_expires *= HZ;
1844 1878
1845 rt = rt6_lookup(net, &pinfo->prefix, NULL, 1879 rt = addrconf_get_prefix_route(&pinfo->prefix,
1846 dev->ifindex, 1); 1880 pinfo->prefix_len,
1881 dev,
1882 RTF_ADDRCONF | RTF_PREFIX_RT,
1883 RTF_GATEWAY | RTF_DEFAULT);
1847 1884
1848 if (rt && addrconf_is_prefix_route(rt)) { 1885 if (rt) {
1849 /* Autoconf prefix route */ 1886 /* Autoconf prefix route */
1850 if (valid_lft == 0) { 1887 if (valid_lft == 0) {
1851 ip6_del_rt(rt); 1888 ip6_del_rt(rt);
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c
index 2916200f90c1..fee46d5a2f12 100644
--- a/net/ipv6/inet6_connection_sock.c
+++ b/net/ipv6/inet6_connection_sock.c
@@ -248,7 +248,7 @@ int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
248 /* Restore final destination back after routing done */ 248 /* Restore final destination back after routing done */
249 ipv6_addr_copy(&fl6.daddr, &np->daddr); 249 ipv6_addr_copy(&fl6.daddr, &np->daddr);
250 250
251 res = ip6_xmit(sk, skb, &fl6, np->opt); 251 res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
252 rcu_read_unlock(); 252 rcu_read_unlock();
253 return res; 253 return res;
254} 254}
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 1c9bf8b5c30a..84d0bd5cac93 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -180,7 +180,7 @@ int ip6_output(struct sk_buff *skb)
180 */ 180 */
181 181
182int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, 182int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
183 struct ipv6_txoptions *opt) 183 struct ipv6_txoptions *opt, int tclass)
184{ 184{
185 struct net *net = sock_net(sk); 185 struct net *net = sock_net(sk);
186 struct ipv6_pinfo *np = inet6_sk(sk); 186 struct ipv6_pinfo *np = inet6_sk(sk);
@@ -190,7 +190,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
190 u8 proto = fl6->flowi6_proto; 190 u8 proto = fl6->flowi6_proto;
191 int seg_len = skb->len; 191 int seg_len = skb->len;
192 int hlimit = -1; 192 int hlimit = -1;
193 int tclass = 0;
194 u32 mtu; 193 u32 mtu;
195 194
196 if (opt) { 195 if (opt) {
@@ -228,10 +227,8 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
228 /* 227 /*
229 * Fill in the IPv6 header 228 * Fill in the IPv6 header
230 */ 229 */
231 if (np) { 230 if (np)
232 tclass = np->tclass;
233 hlimit = np->hop_limit; 231 hlimit = np->hop_limit;
234 }
235 if (hlimit < 0) 232 if (hlimit < 0)
236 hlimit = ip6_dst_hoplimit(dst); 233 hlimit = ip6_dst_hoplimit(dst);
237 234
@@ -1126,7 +1123,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
1126 hh_len + fragheaderlen + transhdrlen + 20, 1123 hh_len + fragheaderlen + transhdrlen + 20,
1127 (flags & MSG_DONTWAIT), &err); 1124 (flags & MSG_DONTWAIT), &err);
1128 if (skb == NULL) 1125 if (skb == NULL)
1129 return -ENOMEM; 1126 return err;
1130 1127
1131 /* reserve space for Hardware header */ 1128 /* reserve space for Hardware header */
1132 skb_reserve(skb, hh_len); 1129 skb_reserve(skb, hh_len);
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index fb545edef6ea..57b82dc1ae91 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1086,11 +1086,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
1086 rt->dst.output = ip6_output; 1086 rt->dst.output = ip6_output;
1087 dst_set_neighbour(&rt->dst, neigh); 1087 dst_set_neighbour(&rt->dst, neigh);
1088 atomic_set(&rt->dst.__refcnt, 1); 1088 atomic_set(&rt->dst.__refcnt, 1);
1089 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
1090
1091 ipv6_addr_copy(&rt->rt6i_dst.addr, addr); 1089 ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
1092 rt->rt6i_dst.plen = 128; 1090 rt->rt6i_dst.plen = 128;
1093 rt->rt6i_idev = idev; 1091 rt->rt6i_idev = idev;
1092 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
1094 1093
1095 spin_lock_bh(&icmp6_dst_lock); 1094 spin_lock_bh(&icmp6_dst_lock);
1096 rt->dst.next = icmp6_dst_gc_list; 1095 rt->dst.next = icmp6_dst_gc_list;
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index c8683fcc487a..10b2b3165a1a 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -513,7 +513,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
513 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); 513 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
514 514
515 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr); 515 ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr);
516 err = ip6_xmit(sk, skb, &fl6, opt); 516 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
517 err = net_xmit_eval(err); 517 err = net_xmit_eval(err);
518 } 518 }
519 519
@@ -979,7 +979,7 @@ static int tcp6_gro_complete(struct sk_buff *skb)
979} 979}
980 980
981static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, 981static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
982 u32 ts, struct tcp_md5sig_key *key, int rst) 982 u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass)
983{ 983{
984 const struct tcphdr *th = tcp_hdr(skb); 984 const struct tcphdr *th = tcp_hdr(skb);
985 struct tcphdr *t1; 985 struct tcphdr *t1;
@@ -1060,7 +1060,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
1060 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); 1060 dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
1061 if (!IS_ERR(dst)) { 1061 if (!IS_ERR(dst)) {
1062 skb_dst_set(buff, dst); 1062 skb_dst_set(buff, dst);
1063 ip6_xmit(ctl_sk, buff, &fl6, NULL); 1063 ip6_xmit(ctl_sk, buff, &fl6, NULL, tclass);
1064 TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); 1064 TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
1065 if (rst) 1065 if (rst)
1066 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS); 1066 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
@@ -1093,13 +1093,13 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1093 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len - 1093 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
1094 (th->doff << 2); 1094 (th->doff << 2);
1095 1095
1096 tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1); 1096 tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0);
1097} 1097}
1098 1098
1099static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts, 1099static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
1100 struct tcp_md5sig_key *key) 1100 struct tcp_md5sig_key *key, u8 tclass)
1101{ 1101{
1102 tcp_v6_send_response(skb, seq, ack, win, ts, key, 0); 1102 tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass);
1103} 1103}
1104 1104
1105static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) 1105static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
@@ -1109,7 +1109,8 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1109 1109
1110 tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, 1110 tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
1111 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, 1111 tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
1112 tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw)); 1112 tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),
1113 tw->tw_tclass);
1113 1114
1114 inet_twsk_put(tw); 1115 inet_twsk_put(tw);
1115} 1116}
@@ -1118,7 +1119,7 @@ static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
1118 struct request_sock *req) 1119 struct request_sock *req)
1119{ 1120{
1120 tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent, 1121 tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
1121 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr)); 1122 tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0);
1122} 1123}
1123 1124
1124 1125
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index aabaee41dd3e..810427833bcd 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -243,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
243 if (!(transport->param_flags & SPP_PMTUD_ENABLE)) 243 if (!(transport->param_flags & SPP_PMTUD_ENABLE))
244 skb->local_df = 1; 244 skb->local_df = 1;
245 245
246 return ip6_xmit(sk, skb, &fl6, np->opt); 246 return ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
247} 247}
248 248
249/* Returns the dst cache entry for the given source and destination ip 249/* Returns the dst cache entry for the given source and destination ip