diff options
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 @@ | |||
1 | Copyright (c) 2009-2010 QLogic Corporation | 1 | Copyright (c) 2009-2011 QLogic Corporation |
2 | QLogic Linux qlcnic NIC Driver | 2 | QLogic Linux qlcnic NIC Driver |
3 | 3 | ||
4 | This program includes a device driver for Linux 2.6 that may be | ||
5 | distributed with QLogic hardware specific firmware binary file. | ||
6 | You may modify and redistribute the device driver code under the | 4 | You may modify and redistribute the device driver code under the |
7 | GNU General Public License (a copy of which is attached hereto as | 5 | GNU General Public License (a copy of which is attached hereto as |
8 | Exhibit A) published by the Free Software Foundation (version 2). | 6 | Exhibit A) published by the Free Software Foundation (version 2). |
9 | 7 | ||
10 | You may redistribute the hardware specific firmware binary file | ||
11 | under 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 | |||
26 | REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE, | ||
27 | THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY | ||
28 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
29 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | ||
30 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR | ||
31 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
32 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | ||
33 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
34 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
35 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
36 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
37 | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
38 | POSSIBILITY OF SUCH DAMAGE. | ||
39 | |||
40 | USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT | ||
41 | CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR | ||
42 | OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT, | ||
43 | TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN | ||
44 | ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN | ||
45 | COMBINATION WITH THIS PROGRAM. | ||
46 | |||
47 | 8 | ||
48 | EXHIBIT A | 9 | EXHIBIT 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 |
61 | freedom to share and change it. By contrast, the GNU General Public | 22 | freedom 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 |
106 | modification follow. | 67 | modification 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 | |||
304 | of preserving the free status of all derivatives of our free software and | 265 | of preserving the free status of all derivatives of our free software and |
305 | of promoting the sharing and reuse of software generally. | 266 | of 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 |
310 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | 271 | FOR 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 | ||
2163 | re_arm: | 2160 | re_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 | |
2166 | out: | ||
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 | ||
1442 | re_arm: | 1441 | re_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 | |
1445 | out: | ||
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); |
794 | out: | 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 | ||
2542 | re_arm: | 2548 | re_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 | |
2546 | out: | ||
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 | ||
2890 | re_arm: | 2897 | re_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); |
2893 | out: | 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 | ||
3158 | re_arm: | 3170 | re_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); |
3161 | out: | 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 | ||
4368 | static void bond_work_cancel_all(struct bonding *bond) | 4380 | static 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 | ||
1497 | static 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 | |||
1493 | static void bnx2x_umac_enable(struct link_params *params, | 1509 | static 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 */ |
1602 | static void bnx2x_xmac_init(struct bnx2x *bp, u32 max_speed) | 1618 | static 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 | ||
3663 | static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy, | 3682 | static 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 | } |
4148 | static 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 | |||
4162 | static 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 | ||
4130 | static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy, | 4228 | static 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 | ||
10208 | static 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 | |||
10224 | static void bnx2x_54618se_link_reset(struct bnx2x_phy *phy, | 10330 | static 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 | ¶ms->phy[INT_PHY], params); | 11867 | ¶ms->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, ¶ms->phy[phy_idx]); | 12452 | bnx2x_set_aer_mmd(params, ¶ms->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 = ¶ms->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 | ||
12352 | u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base) | 12467 | u8 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 */ | ||
432 | static 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 */ |
446 | static 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) | 434 | static 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 | ||
455 | static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages, | 460 | static 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 | ||
693 | err: | 689 | err: |
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 | ||
2052 | err: | 1929 | err: |
@@ -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); |
249 | netdev_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; | ||
253 | err: | ||
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 | ||
86 | config BVME6000_NET | 86 | config 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 | ||
983 | static void | 1000 | static 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. */ |
73 | static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, | 74 | static 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 | ||
189 | static void ndesc_clear_tx_ic(struct dma_desc *p) | 193 | static 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 | */ |
813 | static int stmmac_get_hw_features(struct stmmac_priv *priv) | 813 | static 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, | |||
106 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); | 106 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
107 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); | 107 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
108 | 108 | ||
109 | extern bool vlan_do_receive(struct sk_buff **skb); | 109 | extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler); |
110 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); | 110 | extern 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 | ||
131 | static inline bool vlan_do_receive(struct sk_buff **skb) | 131 | static 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 | ||
138 | static inline void inet_twsk_add_node_rcu(struct inet_timewait_sock *tw, | 139 | static 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); | |||
486 | extern int ip6_xmit(struct sock *sk, | 486 | extern 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 | ||
491 | extern int ip6_nd_hdr(struct sock *sk, | 492 | extern 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 | ||
7 | bool vlan_do_receive(struct sk_buff **skbp) | 7 | bool 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 | ||
140 | static 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 | |||
140 | static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) | 152 | static 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 | ||
146 | static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, | 158 | static 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 | ||
225 | struct tt_local_entry { | 225 | struct 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 | ||
234 | struct tt_global_entry { | 234 | struct 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 | ||
245 | struct tt_change_node { | 245 | struct 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: | |||
3283 | ncls: | 3283 | ncls: |
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 | |||
1717 | static 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 | } | ||
1744 | out: | ||
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 | ||
1718 | static void addrconf_add_mroute(struct net_device *dev) | 1752 | static 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 | ||
182 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, | 182 | int 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 | ||
981 | static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | 981 | static 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 | ||
1099 | static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts, | 1099 | static 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 | ||
1105 | static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) | 1105 | static 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 |