aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-03-23 18:29:27 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-23 18:29:27 -0500
commit554f593d6c411e717a71ffdcb0cfb46bb2394502 (patch)
tree338e1629408a66cfc84d199c18deb22c6e682c22
parentdebf798b1ed82053689d900670eb27fb2f1b4bd3 (diff)
parent95381c893dd71a534ab56f09b12a4e2118aa0f32 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [TG3]: Update driver version and reldate. [TG3]: Add 5755 nvram support [TG3]: Add 5755 support [IPV6]: ip6_xmit: remove unnecessary NULL ptr check [NET_SCHED]: cls_u32: remove unnecessary NULL-ptr check [IPV4]: Add fib rule netlink notifications [BNX2]: Update version and reldate [BNX2]: Separate tx producer and consumer fields [BNX2]: Move .h files to bnx2.c [BNX2]: Combine small mem allocations [BNX2]: Fix link change handling [PKTGEN]: Add MPLS extension.
-rw-r--r--Documentation/networking/pktgen.txt20
-rw-r--r--drivers/net/bnx2.c108
-rw-r--r--drivers/net/bnx2.h62
-rw-r--r--drivers/net/tg3.c84
-rw-r--r--drivers/net/tg3.h9
-rw-r--r--include/linux/pci_ids.h2
-rw-r--r--include/linux/rtnetlink.h4
-rw-r--r--net/core/pktgen.c158
-rw-r--r--net/ipv4/fib_rules.c27
-rw-r--r--net/ipv6/ip6_output.c2
-rw-r--r--net/sched/cls_u32.c6
11 files changed, 371 insertions, 111 deletions
diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt
index cc4b4d04129c..278771c9ad99 100644
--- a/Documentation/networking/pktgen.txt
+++ b/Documentation/networking/pktgen.txt
@@ -109,6 +109,22 @@ Examples:
109 cycle through the port range. 109 cycle through the port range.
110 pgset "udp_dst_max 9" set UDP destination port max. 110 pgset "udp_dst_max 9" set UDP destination port max.
111 111
112 pgset "mpls 0001000a,0002000a,0000000a" set MPLS labels (in this example
113 outer label=16,middle label=32,
114 inner label=0 (IPv4 NULL)) Note that
115 there must be no spaces between the
116 arguments. Leading zeros are required.
117 Do not set the bottom of stack bit,
118 thats done automatically. If you do
119 set the bottom of stack bit, that
120 indicates that you want to randomly
121 generate that address and the flag
122 MPLS_RND will be turned on. You
123 can have any mix of random and fixed
124 labels in the label stack.
125
126 pgset "mpls 0" turn off mpls (or any invalid argument works too!)
127
112 pgset stop aborts injection. Also, ^C aborts generator. 128 pgset stop aborts injection. Also, ^C aborts generator.
113 129
114 130
@@ -167,6 +183,8 @@ pkt_size
167min_pkt_size 183min_pkt_size
168max_pkt_size 184max_pkt_size
169 185
186mpls
187
170udp_src_min 188udp_src_min
171udp_src_max 189udp_src_max
172 190
@@ -211,4 +229,4 @@ Grant Grundler for testing on IA-64 and parisc, Harald Welte, Lennert Buytenhek
211Stephen Hemminger, Andi Kleen, Dave Miller and many others. 229Stephen Hemminger, Andi Kleen, Dave Miller and many others.
212 230
213 231
214Good luck with the linux net-development. \ No newline at end of file 232Good luck with the linux net-development.
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 7d213707008a..2671da20a496 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -9,13 +9,54 @@
9 * Written by: Michael Chan (mchan@broadcom.com) 9 * Written by: Michael Chan (mchan@broadcom.com)
10 */ 10 */
11 11
12#include <linux/config.h>
13
14#include <linux/module.h>
15#include <linux/moduleparam.h>
16
17#include <linux/kernel.h>
18#include <linux/timer.h>
19#include <linux/errno.h>
20#include <linux/ioport.h>
21#include <linux/slab.h>
22#include <linux/vmalloc.h>
23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/init.h>
26#include <linux/netdevice.h>
27#include <linux/etherdevice.h>
28#include <linux/skbuff.h>
29#include <linux/dma-mapping.h>
30#include <asm/bitops.h>
31#include <asm/io.h>
32#include <asm/irq.h>
33#include <linux/delay.h>
34#include <asm/byteorder.h>
35#include <linux/time.h>
36#include <linux/ethtool.h>
37#include <linux/mii.h>
38#ifdef NETIF_F_HW_VLAN_TX
39#include <linux/if_vlan.h>
40#define BCM_VLAN 1
41#endif
42#ifdef NETIF_F_TSO
43#include <net/ip.h>
44#include <net/tcp.h>
45#include <net/checksum.h>
46#define BCM_TSO 1
47#endif
48#include <linux/workqueue.h>
49#include <linux/crc32.h>
50#include <linux/prefetch.h>
51#include <linux/cache.h>
52
12#include "bnx2.h" 53#include "bnx2.h"
13#include "bnx2_fw.h" 54#include "bnx2_fw.h"
14 55
15#define DRV_MODULE_NAME "bnx2" 56#define DRV_MODULE_NAME "bnx2"
16#define PFX DRV_MODULE_NAME ": " 57#define PFX DRV_MODULE_NAME ": "
17#define DRV_MODULE_VERSION "1.4.38" 58#define DRV_MODULE_VERSION "1.4.39"
18#define DRV_MODULE_RELDATE "February 10, 2006" 59#define DRV_MODULE_RELDATE "March 22, 2006"
19 60
20#define RUN_AT(x) (jiffies + (x)) 61#define RUN_AT(x) (jiffies + (x))
21 62
@@ -313,8 +354,6 @@ bnx2_disable_int(struct bnx2 *bp)
313static void 354static void
314bnx2_enable_int(struct bnx2 *bp) 355bnx2_enable_int(struct bnx2 *bp)
315{ 356{
316 u32 val;
317
318 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, 357 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
319 BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | 358 BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
320 BNX2_PCICFG_INT_ACK_CMD_MASK_INT | bp->last_status_idx); 359 BNX2_PCICFG_INT_ACK_CMD_MASK_INT | bp->last_status_idx);
@@ -322,8 +361,7 @@ bnx2_enable_int(struct bnx2 *bp)
322 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, 361 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
323 BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx); 362 BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx);
324 363
325 val = REG_RD(bp, BNX2_HC_COMMAND); 364 REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
326 REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW);
327} 365}
328 366
329static void 367static void
@@ -362,15 +400,11 @@ bnx2_free_mem(struct bnx2 *bp)
362{ 400{
363 int i; 401 int i;
364 402
365 if (bp->stats_blk) {
366 pci_free_consistent(bp->pdev, sizeof(struct statistics_block),
367 bp->stats_blk, bp->stats_blk_mapping);
368 bp->stats_blk = NULL;
369 }
370 if (bp->status_blk) { 403 if (bp->status_blk) {
371 pci_free_consistent(bp->pdev, sizeof(struct status_block), 404 pci_free_consistent(bp->pdev, bp->status_stats_size,
372 bp->status_blk, bp->status_blk_mapping); 405 bp->status_blk, bp->status_blk_mapping);
373 bp->status_blk = NULL; 406 bp->status_blk = NULL;
407 bp->stats_blk = NULL;
374 } 408 }
375 if (bp->tx_desc_ring) { 409 if (bp->tx_desc_ring) {
376 pci_free_consistent(bp->pdev, 410 pci_free_consistent(bp->pdev,
@@ -395,14 +429,13 @@ bnx2_free_mem(struct bnx2 *bp)
395static int 429static int
396bnx2_alloc_mem(struct bnx2 *bp) 430bnx2_alloc_mem(struct bnx2 *bp)
397{ 431{
398 int i; 432 int i, status_blk_size;
399 433
400 bp->tx_buf_ring = kmalloc(sizeof(struct sw_bd) * TX_DESC_CNT, 434 bp->tx_buf_ring = kzalloc(sizeof(struct sw_bd) * TX_DESC_CNT,
401 GFP_KERNEL); 435 GFP_KERNEL);
402 if (bp->tx_buf_ring == NULL) 436 if (bp->tx_buf_ring == NULL)
403 return -ENOMEM; 437 return -ENOMEM;
404 438
405 memset(bp->tx_buf_ring, 0, sizeof(struct sw_bd) * TX_DESC_CNT);
406 bp->tx_desc_ring = pci_alloc_consistent(bp->pdev, 439 bp->tx_desc_ring = pci_alloc_consistent(bp->pdev,
407 sizeof(struct tx_bd) * 440 sizeof(struct tx_bd) *
408 TX_DESC_CNT, 441 TX_DESC_CNT,
@@ -428,21 +461,22 @@ bnx2_alloc_mem(struct bnx2 *bp)
428 461
429 } 462 }
430 463
431 bp->status_blk = pci_alloc_consistent(bp->pdev, 464 /* Combine status and statistics blocks into one allocation. */
432 sizeof(struct status_block), 465 status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block));
466 bp->status_stats_size = status_blk_size +
467 sizeof(struct statistics_block);
468
469 bp->status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
433 &bp->status_blk_mapping); 470 &bp->status_blk_mapping);
434 if (bp->status_blk == NULL) 471 if (bp->status_blk == NULL)
435 goto alloc_mem_err; 472 goto alloc_mem_err;
436 473
437 memset(bp->status_blk, 0, sizeof(struct status_block)); 474 memset(bp->status_blk, 0, bp->status_stats_size);
438 475
439 bp->stats_blk = pci_alloc_consistent(bp->pdev, 476 bp->stats_blk = (void *) ((unsigned long) bp->status_blk +
440 sizeof(struct statistics_block), 477 status_blk_size);
441 &bp->stats_blk_mapping);
442 if (bp->stats_blk == NULL)
443 goto alloc_mem_err;
444 478
445 memset(bp->stats_blk, 0, sizeof(struct statistics_block)); 479 bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size;
446 480
447 return 0; 481 return 0;
448 482
@@ -1926,6 +1960,13 @@ bnx2_poll(struct net_device *dev, int *budget)
1926 spin_lock(&bp->phy_lock); 1960 spin_lock(&bp->phy_lock);
1927 bnx2_phy_int(bp); 1961 bnx2_phy_int(bp);
1928 spin_unlock(&bp->phy_lock); 1962 spin_unlock(&bp->phy_lock);
1963
1964 /* This is needed to take care of transient status
1965 * during link changes.
1966 */
1967 REG_WR(bp, BNX2_HC_COMMAND,
1968 bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
1969 REG_RD(bp, BNX2_HC_COMMAND);
1929 } 1970 }
1930 1971
1931 if (bp->status_blk->status_tx_quick_consumer_index0 != bp->hw_tx_cons) 1972 if (bp->status_blk->status_tx_quick_consumer_index0 != bp->hw_tx_cons)
@@ -3307,6 +3348,8 @@ bnx2_init_chip(struct bnx2 *bp)
3307 3348
3308 udelay(20); 3349 udelay(20);
3309 3350
3351 bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND);
3352
3310 return rc; 3353 return rc;
3311} 3354}
3312 3355
@@ -3746,7 +3789,6 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
3746 struct sk_buff *skb, *rx_skb; 3789 struct sk_buff *skb, *rx_skb;
3747 unsigned char *packet; 3790 unsigned char *packet;
3748 u16 rx_start_idx, rx_idx; 3791 u16 rx_start_idx, rx_idx;
3749 u32 val;
3750 dma_addr_t map; 3792 dma_addr_t map;
3751 struct tx_bd *txbd; 3793 struct tx_bd *txbd;
3752 struct sw_bd *rx_buf; 3794 struct sw_bd *rx_buf;
@@ -3777,8 +3819,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
3777 map = pci_map_single(bp->pdev, skb->data, pkt_size, 3819 map = pci_map_single(bp->pdev, skb->data, pkt_size,
3778 PCI_DMA_TODEVICE); 3820 PCI_DMA_TODEVICE);
3779 3821
3780 val = REG_RD(bp, BNX2_HC_COMMAND); 3822 REG_WR(bp, BNX2_HC_COMMAND,
3781 REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); 3823 bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3824
3782 REG_RD(bp, BNX2_HC_COMMAND); 3825 REG_RD(bp, BNX2_HC_COMMAND);
3783 3826
3784 udelay(5); 3827 udelay(5);
@@ -3802,8 +3845,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
3802 3845
3803 udelay(100); 3846 udelay(100);
3804 3847
3805 val = REG_RD(bp, BNX2_HC_COMMAND); 3848 REG_WR(bp, BNX2_HC_COMMAND,
3806 REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); 3849 bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3850
3807 REG_RD(bp, BNX2_HC_COMMAND); 3851 REG_RD(bp, BNX2_HC_COMMAND);
3808 3852
3809 udelay(5); 3853 udelay(5);
@@ -3939,7 +3983,6 @@ static int
3939bnx2_test_intr(struct bnx2 *bp) 3983bnx2_test_intr(struct bnx2 *bp)
3940{ 3984{
3941 int i; 3985 int i;
3942 u32 val;
3943 u16 status_idx; 3986 u16 status_idx;
3944 3987
3945 if (!netif_running(bp->dev)) 3988 if (!netif_running(bp->dev))
@@ -3948,8 +3991,7 @@ bnx2_test_intr(struct bnx2 *bp)
3948 status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff; 3991 status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;
3949 3992
3950 /* This register is not touched during run-time. */ 3993 /* This register is not touched during run-time. */
3951 val = REG_RD(bp, BNX2_HC_COMMAND); 3994 REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
3952 REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW);
3953 REG_RD(bp, BNX2_HC_COMMAND); 3995 REG_RD(bp, BNX2_HC_COMMAND);
3954 3996
3955 for (i = 0; i < 10; i++) { 3997 for (i = 0; i < 10; i++) {
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h
index fd4b7f2eb477..b87925f6a228 100644
--- a/drivers/net/bnx2.h
+++ b/drivers/net/bnx2.h
@@ -13,46 +13,6 @@
13#ifndef BNX2_H 13#ifndef BNX2_H
14#define BNX2_H 14#define BNX2_H
15 15
16#include <linux/config.h>
17
18#include <linux/module.h>
19#include <linux/moduleparam.h>
20
21#include <linux/kernel.h>
22#include <linux/timer.h>
23#include <linux/errno.h>
24#include <linux/ioport.h>
25#include <linux/slab.h>
26#include <linux/vmalloc.h>
27#include <linux/interrupt.h>
28#include <linux/pci.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/skbuff.h>
33#include <linux/dma-mapping.h>
34#include <asm/bitops.h>
35#include <asm/io.h>
36#include <asm/irq.h>
37#include <linux/delay.h>
38#include <asm/byteorder.h>
39#include <linux/time.h>
40#include <linux/ethtool.h>
41#include <linux/mii.h>
42#ifdef NETIF_F_HW_VLAN_TX
43#include <linux/if_vlan.h>
44#define BCM_VLAN 1
45#endif
46#ifdef NETIF_F_TSO
47#include <net/ip.h>
48#include <net/tcp.h>
49#include <net/checksum.h>
50#define BCM_TSO 1
51#endif
52#include <linux/workqueue.h>
53#include <linux/crc32.h>
54#include <linux/prefetch.h>
55
56/* Hardware data structures and register definitions automatically 16/* Hardware data structures and register definitions automatically
57 * generated from RTL code. Do not modify. 17 * generated from RTL code. Do not modify.
58 */ 18 */
@@ -3917,15 +3877,17 @@ struct bnx2 {
3917#define USING_MSI_FLAG 0x20 3877#define USING_MSI_FLAG 0x20
3918#define ASF_ENABLE_FLAG 0x40 3878#define ASF_ENABLE_FLAG 0x40
3919 3879
3920 struct tx_bd *tx_desc_ring; 3880 /* Put tx producer and consumer fields in separate cache lines. */
3921 struct sw_bd *tx_buf_ring;
3922 u32 tx_prod_bseq;
3923 u16 tx_prod;
3924 u16 tx_cons;
3925 int tx_ring_size;
3926 3881
3927 u16 hw_tx_cons; 3882 u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES)));
3928 u16 hw_rx_cons; 3883 u16 tx_prod;
3884
3885 struct tx_bd *tx_desc_ring;
3886 struct sw_bd *tx_buf_ring;
3887 int tx_ring_size;
3888
3889 u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES)));
3890 u16 hw_tx_cons;
3929 3891
3930#ifdef BCM_VLAN 3892#ifdef BCM_VLAN
3931 struct vlan_group *vlgrp; 3893 struct vlan_group *vlgrp;
@@ -3939,6 +3901,7 @@ struct bnx2 {
3939 u32 rx_prod_bseq; 3901 u32 rx_prod_bseq;
3940 u16 rx_prod; 3902 u16 rx_prod;
3941 u16 rx_cons; 3903 u16 rx_cons;
3904 u16 hw_rx_cons;
3942 3905
3943 u32 rx_csum; 3906 u32 rx_csum;
3944 3907
@@ -4038,6 +4001,7 @@ struct bnx2 {
4038 struct statistics_block *stats_blk; 4001 struct statistics_block *stats_blk;
4039 dma_addr_t stats_blk_mapping; 4002 dma_addr_t stats_blk_mapping;
4040 4003
4004 u32 hc_cmd;
4041 u32 rx_mode; 4005 u32 rx_mode;
4042 4006
4043 u16 req_line_speed; 4007 u16 req_line_speed;
@@ -4082,6 +4046,8 @@ struct bnx2 {
4082 4046
4083 struct flash_spec *flash_info; 4047 struct flash_spec *flash_info;
4084 u32 flash_size; 4048 u32 flash_size;
4049
4050 int status_stats_size;
4085}; 4051};
4086 4052
4087static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset); 4053static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset);
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 88829eb9568e..b5473325bff4 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -69,8 +69,8 @@
69 69
70#define DRV_MODULE_NAME "tg3" 70#define DRV_MODULE_NAME "tg3"
71#define PFX DRV_MODULE_NAME ": " 71#define PFX DRV_MODULE_NAME ": "
72#define DRV_MODULE_VERSION "3.53" 72#define DRV_MODULE_VERSION "3.54"
73#define DRV_MODULE_RELDATE "Mar 22, 2006" 73#define DRV_MODULE_RELDATE "Mar 23, 2006"
74 74
75#define TG3_DEF_MAC_MODE 0 75#define TG3_DEF_MAC_MODE 0
76#define TG3_DEF_RX_MODE 0 76#define TG3_DEF_RX_MODE 0
@@ -225,6 +225,10 @@ static struct pci_device_id tg3_pci_tbl[] = {
225 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 225 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
226 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M, 226 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M,
227 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 227 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
228 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755,
229 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
230 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M,
231 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
228 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787, 232 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787,
229 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 233 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
230 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M, 234 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M,
@@ -4557,6 +4561,7 @@ static int tg3_chip_reset(struct tg3 *tp)
4557 } 4561 }
4558 4562
4559 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || 4563 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
4564 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
4560 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 4565 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
4561 tw32(GRC_FASTBOOT_PC, 0); 4566 tw32(GRC_FASTBOOT_PC, 0);
4562 4567
@@ -6152,6 +6157,9 @@ static int tg3_reset_hw(struct tg3 *tp)
6152 gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | 6157 gpio_mask |= GRC_LCLCTRL_GPIO_OE3 |
6153 GRC_LCLCTRL_GPIO_OUTPUT3; 6158 GRC_LCLCTRL_GPIO_OUTPUT3;
6154 6159
6160 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
6161 gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL;
6162
6155 tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; 6163 tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask;
6156 6164
6157 /* GPIO1 must be driven high for eeprom write protect */ 6165 /* GPIO1 must be driven high for eeprom write protect */
@@ -6191,7 +6199,8 @@ static int tg3_reset_hw(struct tg3 *tp)
6191 } 6199 }
6192 6200
6193 /* Enable host coalescing bug fix */ 6201 /* Enable host coalescing bug fix */
6194 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 6202 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ||
6203 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787))
6195 val |= (1 << 29); 6204 val |= (1 << 29);
6196 6205
6197 tw32_f(WDMAC_MODE, val); 6206 tw32_f(WDMAC_MODE, val);
@@ -6249,6 +6258,9 @@ static int tg3_reset_hw(struct tg3 *tp)
6249 udelay(100); 6258 udelay(100);
6250 6259
6251 tp->rx_mode = RX_MODE_ENABLE; 6260 tp->rx_mode = RX_MODE_ENABLE;
6261 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
6262 tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE;
6263
6252 tw32_f(MAC_RX_MODE, tp->rx_mode); 6264 tw32_f(MAC_RX_MODE, tp->rx_mode);
6253 udelay(10); 6265 udelay(10);
6254 6266
@@ -7907,7 +7919,8 @@ static int tg3_set_tx_csum(struct net_device *dev, u32 data)
7907 return 0; 7919 return 0;
7908 } 7920 }
7909 7921
7910 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 7922 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
7923 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
7911 ethtool_op_set_tx_hw_csum(dev, data); 7924 ethtool_op_set_tx_hw_csum(dev, data);
7912 else 7925 else
7913 ethtool_op_set_tx_csum(dev, data); 7926 ethtool_op_set_tx_csum(dev, data);
@@ -8332,7 +8345,8 @@ static int tg3_test_memory(struct tg3 *tp)
8332 int i; 8345 int i;
8333 8346
8334 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { 8347 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
8335 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 8348 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
8349 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
8336 mem_tbl = mem_tbl_5755; 8350 mem_tbl = mem_tbl_5755;
8337 else 8351 else
8338 mem_tbl = mem_tbl_5705; 8352 mem_tbl = mem_tbl_5705;
@@ -8924,6 +8938,47 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp)
8924 } 8938 }
8925} 8939}
8926 8940
8941static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp)
8942{
8943 u32 nvcfg1;
8944
8945 nvcfg1 = tr32(NVRAM_CFG1);
8946
8947 /* NVRAM protection for TPM */
8948 if (nvcfg1 & (1 << 27))
8949 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
8950
8951 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
8952 case FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ:
8953 case FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ:
8954 tp->nvram_jedecnum = JEDEC_ATMEL;
8955 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
8956 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
8957
8958 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
8959 tw32(NVRAM_CFG1, nvcfg1);
8960 break;
8961 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
8962 case FLASH_5755VENDOR_ATMEL_FLASH_1:
8963 case FLASH_5755VENDOR_ATMEL_FLASH_2:
8964 case FLASH_5755VENDOR_ATMEL_FLASH_3:
8965 case FLASH_5755VENDOR_ATMEL_FLASH_4:
8966 tp->nvram_jedecnum = JEDEC_ATMEL;
8967 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
8968 tp->tg3_flags2 |= TG3_FLG2_FLASH;
8969 tp->nvram_pagesize = 264;
8970 break;
8971 case FLASH_5752VENDOR_ST_M45PE10:
8972 case FLASH_5752VENDOR_ST_M45PE20:
8973 case FLASH_5752VENDOR_ST_M45PE40:
8974 tp->nvram_jedecnum = JEDEC_ST;
8975 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
8976 tp->tg3_flags2 |= TG3_FLG2_FLASH;
8977 tp->nvram_pagesize = 256;
8978 break;
8979 }
8980}
8981
8927static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) 8982static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)
8928{ 8983{
8929 u32 nvcfg1; 8984 u32 nvcfg1;
@@ -8997,6 +9052,8 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
8997 9052
8998 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) 9053 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
8999 tg3_get_5752_nvram_info(tp); 9054 tg3_get_5752_nvram_info(tp);
9055 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
9056 tg3_get_5755_nvram_info(tp);
9000 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 9057 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
9001 tg3_get_5787_nvram_info(tp); 9058 tg3_get_5787_nvram_info(tp);
9002 else 9059 else
@@ -9310,6 +9367,7 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
9310 nvram_cmd |= NVRAM_CMD_LAST; 9367 nvram_cmd |= NVRAM_CMD_LAST;
9311 9368
9312 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) && 9369 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) &&
9370 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
9313 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) && 9371 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) &&
9314 (tp->nvram_jedecnum == JEDEC_ST) && 9372 (tp->nvram_jedecnum == JEDEC_ST) &&
9315 (nvram_cmd & NVRAM_CMD_FIRST)) { 9373 (nvram_cmd & NVRAM_CMD_FIRST)) {
@@ -10044,6 +10102,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10044 10102
10045 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || 10103 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
10046 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || 10104 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
10105 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10047 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || 10106 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
10048 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) 10107 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
10049 tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; 10108 tp->tg3_flags2 |= TG3_FLG2_5750_PLUS;
@@ -10053,7 +10112,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10053 tp->tg3_flags2 |= TG3_FLG2_5705_PLUS; 10112 tp->tg3_flags2 |= TG3_FLG2_5705_PLUS;
10054 10113
10055 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { 10114 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
10056 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) { 10115 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10116 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
10057 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; 10117 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2;
10058 tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; 10118 tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
10059 } else 10119 } else
@@ -10063,6 +10123,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10063 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && 10123 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
10064 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 && 10124 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 &&
10065 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 && 10125 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
10126 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 &&
10066 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) 10127 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787)
10067 tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; 10128 tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE;
10068 10129
@@ -10219,6 +10280,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10219 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) 10280 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
10220 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; 10281 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
10221 10282
10283 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
10284 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
10285
10222 /* Force the chip into D0. */ 10286 /* Force the chip into D0. */
10223 err = tg3_set_power_state(tp, PCI_D0); 10287 err = tg3_set_power_state(tp, PCI_D0);
10224 if (err) { 10288 if (err) {
@@ -10274,6 +10338,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10274 tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG; 10338 tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
10275 10339
10276 if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && 10340 if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
10341 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
10277 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787)) 10342 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787))
10278 tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; 10343 tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
10279 10344
@@ -10413,7 +10478,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
10413 /* All chips before 5787 can get confused if TX buffers 10478 /* All chips before 5787 can get confused if TX buffers
10414 * straddle the 4GB address boundary in some cases. 10479 * straddle the 4GB address boundary in some cases.
10415 */ 10480 */
10416 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 10481 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10482 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
10417 tp->dev->hard_start_xmit = tg3_start_xmit; 10483 tp->dev->hard_start_xmit = tg3_start_xmit;
10418 else 10484 else
10419 tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; 10485 tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug;
@@ -11002,6 +11068,7 @@ static char * __devinit tg3_phy_string(struct tg3 *tp)
11002 case PHY_ID_BCM5752: return "5752"; 11068 case PHY_ID_BCM5752: return "5752";
11003 case PHY_ID_BCM5714: return "5714"; 11069 case PHY_ID_BCM5714: return "5714";
11004 case PHY_ID_BCM5780: return "5780"; 11070 case PHY_ID_BCM5780: return "5780";
11071 case PHY_ID_BCM5755: return "5755";
11005 case PHY_ID_BCM5787: return "5787"; 11072 case PHY_ID_BCM5787: return "5787";
11006 case PHY_ID_BCM8002: return "8002/serdes"; 11073 case PHY_ID_BCM8002: return "8002/serdes";
11007 case 0: return "serdes"; 11074 case 0: return "serdes";
@@ -11350,7 +11417,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
11350 * checksumming. 11417 * checksumming.
11351 */ 11418 */
11352 if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) { 11419 if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) {
11353 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) 11420 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
11421 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
11354 dev->features |= NETIF_F_HW_CSUM; 11422 dev->features |= NETIF_F_HW_CSUM;
11355 else 11423 else
11356 dev->features |= NETIF_F_IP_CSUM; 11424 dev->features |= NETIF_F_IP_CSUM;
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
index baa34c4721db..c43cc3264202 100644
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -138,6 +138,7 @@
138#define ASIC_REV_5752 0x06 138#define ASIC_REV_5752 0x06
139#define ASIC_REV_5780 0x08 139#define ASIC_REV_5780 0x08
140#define ASIC_REV_5714 0x09 140#define ASIC_REV_5714 0x09
141#define ASIC_REV_5755 0x0a
141#define ASIC_REV_5787 0x0b 142#define ASIC_REV_5787 0x0b
142#define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) 143#define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8)
143#define CHIPREV_5700_AX 0x70 144#define CHIPREV_5700_AX 0x70
@@ -456,6 +457,7 @@
456#define RX_MODE_PROMISC 0x00000100 457#define RX_MODE_PROMISC 0x00000100
457#define RX_MODE_NO_CRC_CHECK 0x00000200 458#define RX_MODE_NO_CRC_CHECK 0x00000200
458#define RX_MODE_KEEP_VLAN_TAG 0x00000400 459#define RX_MODE_KEEP_VLAN_TAG 0x00000400
460#define RX_MODE_IPV6_CSUM_ENABLE 0x01000000
459#define MAC_RX_STATUS 0x0000046c 461#define MAC_RX_STATUS 0x0000046c
460#define RX_STATUS_REMOTE_TX_XOFFED 0x00000001 462#define RX_STATUS_REMOTE_TX_XOFFED 0x00000001
461#define RX_STATUS_XOFF_RCVD 0x00000002 463#define RX_STATUS_XOFF_RCVD 0x00000002
@@ -1340,6 +1342,7 @@
1340#define GRC_LCLCTRL_CLEARINT 0x00000002 1342#define GRC_LCLCTRL_CLEARINT 0x00000002
1341#define GRC_LCLCTRL_SETINT 0x00000004 1343#define GRC_LCLCTRL_SETINT 0x00000004
1342#define GRC_LCLCTRL_INT_ON_ATTN 0x00000008 1344#define GRC_LCLCTRL_INT_ON_ATTN 0x00000008
1345#define GRC_LCLCTRL_GPIO_UART_SEL 0x00000010 /* 5755 only */
1343#define GRC_LCLCTRL_USE_SIG_DETECT 0x00000010 /* 5714/5780 only */ 1346#define GRC_LCLCTRL_USE_SIG_DETECT 0x00000010 /* 5714/5780 only */
1344#define GRC_LCLCTRL_USE_EXT_SIG_DETECT 0x00000020 /* 5714/5780 only */ 1347#define GRC_LCLCTRL_USE_EXT_SIG_DETECT 0x00000020 /* 5714/5780 only */
1345#define GRC_LCLCTRL_GPIO_INPUT3 0x00000020 1348#define GRC_LCLCTRL_GPIO_INPUT3 0x00000020
@@ -1441,6 +1444,9 @@
1441#define FLASH_5755VENDOR_ATMEL_FLASH_1 0x03400001 1444#define FLASH_5755VENDOR_ATMEL_FLASH_1 0x03400001
1442#define FLASH_5755VENDOR_ATMEL_FLASH_2 0x03400002 1445#define FLASH_5755VENDOR_ATMEL_FLASH_2 0x03400002
1443#define FLASH_5755VENDOR_ATMEL_FLASH_3 0x03400000 1446#define FLASH_5755VENDOR_ATMEL_FLASH_3 0x03400000
1447#define FLASH_5755VENDOR_ATMEL_FLASH_4 0x00000003
1448#define FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ 0x03c00003
1449#define FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ 0x03c00002
1444#define FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ 0x03000003 1450#define FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ 0x03000003
1445#define FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ 0x03000002 1451#define FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ 0x03000002
1446#define FLASH_5787VENDOR_MICRO_EEPROM_64KHZ 0x03000000 1452#define FLASH_5787VENDOR_MICRO_EEPROM_64KHZ 0x03000000
@@ -2259,6 +2265,7 @@ struct tg3 {
2259#define PHY_ID_BCM5752 0x60008100 2265#define PHY_ID_BCM5752 0x60008100
2260#define PHY_ID_BCM5714 0x60008340 2266#define PHY_ID_BCM5714 0x60008340
2261#define PHY_ID_BCM5780 0x60008350 2267#define PHY_ID_BCM5780 0x60008350
2268#define PHY_ID_BCM5755 0xbc050cc0
2262#define PHY_ID_BCM5787 0xbc050ce0 2269#define PHY_ID_BCM5787 0xbc050ce0
2263#define PHY_ID_BCM8002 0x60010140 2270#define PHY_ID_BCM8002 0x60010140
2264#define PHY_ID_INVALID 0xffffffff 2271#define PHY_ID_INVALID 0xffffffff
@@ -2286,7 +2293,7 @@ struct tg3 {
2286 (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \ 2293 (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \
2287 (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \ 2294 (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \
2288 (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \ 2295 (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \
2289 (X) == PHY_ID_BCM8002) 2296 (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM8002)
2290 2297
2291 struct tg3_hw_stats *hw_stats; 2298 struct tg3_hw_stats *hw_stats;
2292 dma_addr_t stats_mapping; 2299 dma_addr_t stats_mapping;
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index ec3c32932620..989a9d00dec1 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1864,11 +1864,13 @@
1864#define PCI_DEVICE_ID_TIGON3_5780S 0x166b 1864#define PCI_DEVICE_ID_TIGON3_5780S 0x166b
1865#define PCI_DEVICE_ID_TIGON3_5705F 0x166e 1865#define PCI_DEVICE_ID_TIGON3_5705F 0x166e
1866#define PCI_DEVICE_ID_TIGON3_5754M 0x1672 1866#define PCI_DEVICE_ID_TIGON3_5754M 0x1672
1867#define PCI_DEVICE_ID_TIGON3_5755M 0x1673
1867#define PCI_DEVICE_ID_TIGON3_5750 0x1676 1868#define PCI_DEVICE_ID_TIGON3_5750 0x1676
1868#define PCI_DEVICE_ID_TIGON3_5751 0x1677 1869#define PCI_DEVICE_ID_TIGON3_5751 0x1677
1869#define PCI_DEVICE_ID_TIGON3_5715 0x1678 1870#define PCI_DEVICE_ID_TIGON3_5715 0x1678
1870#define PCI_DEVICE_ID_TIGON3_5715S 0x1679 1871#define PCI_DEVICE_ID_TIGON3_5715S 0x1679
1871#define PCI_DEVICE_ID_TIGON3_5754 0x167a 1872#define PCI_DEVICE_ID_TIGON3_5754 0x167a
1873#define PCI_DEVICE_ID_TIGON3_5755 0x167b
1872#define PCI_DEVICE_ID_TIGON3_5750M 0x167c 1874#define PCI_DEVICE_ID_TIGON3_5750M 0x167c
1873#define PCI_DEVICE_ID_TIGON3_5751M 0x167d 1875#define PCI_DEVICE_ID_TIGON3_5751M 0x167d
1874#define PCI_DEVICE_ID_TIGON3_5751F 0x167e 1876#define PCI_DEVICE_ID_TIGON3_5751F 0x167e
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index d572d5376319..df0cdd41085c 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -839,6 +839,7 @@ enum
839#define RTMGRP_IPV4_IFADDR 0x10 839#define RTMGRP_IPV4_IFADDR 0x10
840#define RTMGRP_IPV4_MROUTE 0x20 840#define RTMGRP_IPV4_MROUTE 0x20
841#define RTMGRP_IPV4_ROUTE 0x40 841#define RTMGRP_IPV4_ROUTE 0x40
842#define RTMGRP_IPV4_RULE 0x80
842 843
843#define RTMGRP_IPV6_IFADDR 0x100 844#define RTMGRP_IPV6_IFADDR 0x100
844#define RTMGRP_IPV6_MROUTE 0x200 845#define RTMGRP_IPV6_MROUTE 0x200
@@ -869,7 +870,8 @@ enum rtnetlink_groups {
869#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE 870#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE
870 RTNLGRP_IPV4_ROUTE, 871 RTNLGRP_IPV4_ROUTE,
871#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE 872#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE
872 RTNLGRP_NOP1, 873 RTNLGRP_IPV4_RULE,
874#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE
873 RTNLGRP_IPV6_IFADDR, 875 RTNLGRP_IPV6_IFADDR,
874#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR 876#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR
875 RTNLGRP_IPV6_MROUTE, 877 RTNLGRP_IPV6_MROUTE,
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 8eedaedba743..c23e9c06ee23 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -106,6 +106,9 @@
106 * 106 *
107 * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com> 107 * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com>
108 * 050103 108 * 050103
109 *
110 * MPLS support by Steven Whitehouse <steve@chygwyn.com>
111 *
109 */ 112 */
110#include <linux/sys.h> 113#include <linux/sys.h>
111#include <linux/types.h> 114#include <linux/types.h>
@@ -154,7 +157,7 @@
154#include <asm/div64.h> /* do_div */ 157#include <asm/div64.h> /* do_div */
155#include <asm/timex.h> 158#include <asm/timex.h>
156 159
157#define VERSION "pktgen v2.66: Packet Generator for packet performance testing.\n" 160#define VERSION "pktgen v2.67: Packet Generator for packet performance testing.\n"
158 161
159/* #define PG_DEBUG(a) a */ 162/* #define PG_DEBUG(a) a */
160#define PG_DEBUG(a) 163#define PG_DEBUG(a)
@@ -162,6 +165,8 @@
162/* The buckets are exponential in 'width' */ 165/* The buckets are exponential in 'width' */
163#define LAT_BUCKETS_MAX 32 166#define LAT_BUCKETS_MAX 32
164#define IP_NAME_SZ 32 167#define IP_NAME_SZ 32
168#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
169#define MPLS_STACK_BOTTOM __constant_htonl(0x00000100)
165 170
166/* Device flag bits */ 171/* Device flag bits */
167#define F_IPSRC_RND (1<<0) /* IP-Src Random */ 172#define F_IPSRC_RND (1<<0) /* IP-Src Random */
@@ -172,6 +177,7 @@
172#define F_MACDST_RND (1<<5) /* MAC-Dst Random */ 177#define F_MACDST_RND (1<<5) /* MAC-Dst Random */
173#define F_TXSIZE_RND (1<<6) /* Transmit size is random */ 178#define F_TXSIZE_RND (1<<6) /* Transmit size is random */
174#define F_IPV6 (1<<7) /* Interface in IPV6 Mode */ 179#define F_IPV6 (1<<7) /* Interface in IPV6 Mode */
180#define F_MPLS_RND (1<<8) /* Random MPLS labels */
175 181
176/* Thread control flag bits */ 182/* Thread control flag bits */
177#define T_TERMINATE (1<<0) 183#define T_TERMINATE (1<<0)
@@ -278,6 +284,10 @@ struct pktgen_dev {
278 __u16 udp_dst_min; /* inclusive, dest UDP port */ 284 __u16 udp_dst_min; /* inclusive, dest UDP port */
279 __u16 udp_dst_max; /* exclusive, dest UDP port */ 285 __u16 udp_dst_max; /* exclusive, dest UDP port */
280 286
287 /* MPLS */
288 unsigned nr_labels; /* Depth of stack, 0 = no MPLS */
289 __be32 labels[MAX_MPLS_LABELS];
290
281 __u32 src_mac_count; /* How many MACs to iterate through */ 291 __u32 src_mac_count; /* How many MACs to iterate through */
282 __u32 dst_mac_count; /* How many MACs to iterate through */ 292 __u32 dst_mac_count; /* How many MACs to iterate through */
283 293
@@ -623,9 +633,19 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
623 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); 633 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max);
624 634
625 seq_printf(seq, 635 seq_printf(seq,
626 " src_mac_count: %d dst_mac_count: %d \n Flags: ", 636 " src_mac_count: %d dst_mac_count: %d\n",
627 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); 637 pkt_dev->src_mac_count, pkt_dev->dst_mac_count);
628 638
639 if (pkt_dev->nr_labels) {
640 unsigned i;
641 seq_printf(seq, " mpls: ");
642 for(i = 0; i < pkt_dev->nr_labels; i++)
643 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]),
644 i == pkt_dev->nr_labels-1 ? "\n" : ", ");
645 }
646
647 seq_printf(seq, " Flags: ");
648
629 if (pkt_dev->flags & F_IPV6) 649 if (pkt_dev->flags & F_IPV6)
630 seq_printf(seq, "IPV6 "); 650 seq_printf(seq, "IPV6 ");
631 651
@@ -644,6 +664,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
644 if (pkt_dev->flags & F_UDPDST_RND) 664 if (pkt_dev->flags & F_UDPDST_RND)
645 seq_printf(seq, "UDPDST_RND "); 665 seq_printf(seq, "UDPDST_RND ");
646 666
667 if (pkt_dev->flags & F_MPLS_RND)
668 seq_printf(seq, "MPLS_RND ");
669
647 if (pkt_dev->flags & F_MACSRC_RND) 670 if (pkt_dev->flags & F_MACSRC_RND)
648 seq_printf(seq, "MACSRC_RND "); 671 seq_printf(seq, "MACSRC_RND ");
649 672
@@ -691,6 +714,29 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
691 return 0; 714 return 0;
692} 715}
693 716
717
718static int hex32_arg(const char __user *user_buffer, __u32 *num)
719{
720 int i = 0;
721 *num = 0;
722
723 for(; i < 8; i++) {
724 char c;
725 *num <<= 4;
726 if (get_user(c, &user_buffer[i]))
727 return -EFAULT;
728 if ((c >= '0') && (c <= '9'))
729 *num |= c - '0';
730 else if ((c >= 'a') && (c <= 'f'))
731 *num |= c - 'a' + 10;
732 else if ((c >= 'A') && (c <= 'F'))
733 *num |= c - 'A' + 10;
734 else
735 break;
736 }
737 return i;
738}
739
694static int count_trail_chars(const char __user * user_buffer, 740static int count_trail_chars(const char __user * user_buffer,
695 unsigned int maxlen) 741 unsigned int maxlen)
696{ 742{
@@ -759,6 +805,35 @@ done_str:
759 return i; 805 return i;
760} 806}
761 807
808static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev)
809{
810 unsigned n = 0;
811 char c;
812 ssize_t i = 0;
813 int len;
814
815 pkt_dev->nr_labels = 0;
816 do {
817 __u32 tmp;
818 len = hex32_arg(&buffer[i], &tmp);
819 if (len <= 0)
820 return len;
821 pkt_dev->labels[n] = htonl(tmp);
822 if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM)
823 pkt_dev->flags |= F_MPLS_RND;
824 i += len;
825 if (get_user(c, &buffer[i]))
826 return -EFAULT;
827 i++;
828 n++;
829 if (n >= MAX_MPLS_LABELS)
830 return -E2BIG;
831 } while(c == ',');
832
833 pkt_dev->nr_labels = n;
834 return i;
835}
836
762static ssize_t pktgen_if_write(struct file *file, 837static ssize_t pktgen_if_write(struct file *file,
763 const char __user * user_buffer, size_t count, 838 const char __user * user_buffer, size_t count,
764 loff_t * offset) 839 loff_t * offset)
@@ -1059,6 +1134,12 @@ static ssize_t pktgen_if_write(struct file *file,
1059 else if (strcmp(f, "!MACDST_RND") == 0) 1134 else if (strcmp(f, "!MACDST_RND") == 0)
1060 pkt_dev->flags &= ~F_MACDST_RND; 1135 pkt_dev->flags &= ~F_MACDST_RND;
1061 1136
1137 else if (strcmp(f, "MPLS_RND") == 0)
1138 pkt_dev->flags |= F_MPLS_RND;
1139
1140 else if (strcmp(f, "!MPLS_RND") == 0)
1141 pkt_dev->flags &= ~F_MPLS_RND;
1142
1062 else { 1143 else {
1063 sprintf(pg_result, 1144 sprintf(pg_result,
1064 "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s", 1145 "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
@@ -1354,6 +1435,19 @@ static ssize_t pktgen_if_write(struct file *file,
1354 return count; 1435 return count;
1355 } 1436 }
1356 1437
1438 if (!strcmp(name, "mpls")) {
1439 unsigned n, offset;
1440 len = get_labels(&user_buffer[i], pkt_dev);
1441 if (len < 0) { return len; }
1442 i += len;
1443 offset = sprintf(pg_result, "OK: mpls=");
1444 for(n = 0; n < pkt_dev->nr_labels; n++)
1445 offset += sprintf(pg_result + offset,
1446 "%08x%s", ntohl(pkt_dev->labels[n]),
1447 n == pkt_dev->nr_labels-1 ? "" : ",");
1448 return count;
1449 }
1450
1357 sprintf(pkt_dev->result, "No such parameter \"%s\"", name); 1451 sprintf(pkt_dev->result, "No such parameter \"%s\"", name);
1358 return -EINVAL; 1452 return -EINVAL;
1359} 1453}
@@ -1846,6 +1940,15 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
1846 pkt_dev->hh[1] = tmp; 1940 pkt_dev->hh[1] = tmp;
1847 } 1941 }
1848 1942
1943 if (pkt_dev->flags & F_MPLS_RND) {
1944 unsigned i;
1945 for(i = 0; i < pkt_dev->nr_labels; i++)
1946 if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM)
1947 pkt_dev->labels[i] = MPLS_STACK_BOTTOM |
1948 (pktgen_random() &
1949 htonl(0x000fffff));
1950 }
1951
1849 if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { 1952 if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) {
1850 if (pkt_dev->flags & F_UDPSRC_RND) 1953 if (pkt_dev->flags & F_UDPSRC_RND)
1851 pkt_dev->cur_udp_src = 1954 pkt_dev->cur_udp_src =
@@ -1968,6 +2071,16 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev)
1968 pkt_dev->flows[flow].count++; 2071 pkt_dev->flows[flow].count++;
1969} 2072}
1970 2073
2074static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev)
2075{
2076 unsigned i;
2077 for(i = 0; i < pkt_dev->nr_labels; i++) {
2078 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM;
2079 }
2080 mpls--;
2081 *mpls |= MPLS_STACK_BOTTOM;
2082}
2083
1971static struct sk_buff *fill_packet_ipv4(struct net_device *odev, 2084static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
1972 struct pktgen_dev *pkt_dev) 2085 struct pktgen_dev *pkt_dev)
1973{ 2086{
@@ -1977,6 +2090,11 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
1977 int datalen, iplen; 2090 int datalen, iplen;
1978 struct iphdr *iph; 2091 struct iphdr *iph;
1979 struct pktgen_hdr *pgh = NULL; 2092 struct pktgen_hdr *pgh = NULL;
2093 __be16 protocol = __constant_htons(ETH_P_IP);
2094 __be32 *mpls;
2095
2096 if (pkt_dev->nr_labels)
2097 protocol = __constant_htons(ETH_P_MPLS_UC);
1980 2098
1981 /* Update any of the values, used when we're incrementing various 2099 /* Update any of the values, used when we're incrementing various
1982 * fields. 2100 * fields.
@@ -1984,7 +2102,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
1984 mod_cur_headers(pkt_dev); 2102 mod_cur_headers(pkt_dev);
1985 2103
1986 datalen = (odev->hard_header_len + 16) & ~0xf; 2104 datalen = (odev->hard_header_len + 16) & ~0xf;
1987 skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + datalen, GFP_ATOMIC); 2105 skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + datalen +
2106 pkt_dev->nr_labels*sizeof(u32), GFP_ATOMIC);
1988 if (!skb) { 2107 if (!skb) {
1989 sprintf(pkt_dev->result, "No memory"); 2108 sprintf(pkt_dev->result, "No memory");
1990 return NULL; 2109 return NULL;
@@ -1994,13 +2113,18 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
1994 2113
1995 /* Reserve for ethernet and IP header */ 2114 /* Reserve for ethernet and IP header */
1996 eth = (__u8 *) skb_push(skb, 14); 2115 eth = (__u8 *) skb_push(skb, 14);
2116 mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32));
2117 if (pkt_dev->nr_labels)
2118 mpls_push(mpls, pkt_dev);
1997 iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); 2119 iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr));
1998 udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); 2120 udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr));
1999 2121
2000 memcpy(eth, pkt_dev->hh, 12); 2122 memcpy(eth, pkt_dev->hh, 12);
2001 *(u16 *) & eth[12] = __constant_htons(ETH_P_IP); 2123 *(u16 *) & eth[12] = protocol;
2002 2124
2003 datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8; /* Eth + IPh + UDPh */ 2125 /* Eth + IPh + UDPh + mpls */
2126 datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 -
2127 pkt_dev->nr_labels*sizeof(u32);
2004 if (datalen < sizeof(struct pktgen_hdr)) 2128 if (datalen < sizeof(struct pktgen_hdr))
2005 datalen = sizeof(struct pktgen_hdr); 2129 datalen = sizeof(struct pktgen_hdr);
2006 2130
@@ -2021,8 +2145,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
2021 iph->tot_len = htons(iplen); 2145 iph->tot_len = htons(iplen);
2022 iph->check = 0; 2146 iph->check = 0;
2023 iph->check = ip_fast_csum((void *)iph, iph->ihl); 2147 iph->check = ip_fast_csum((void *)iph, iph->ihl);
2024 skb->protocol = __constant_htons(ETH_P_IP); 2148 skb->protocol = protocol;
2025 skb->mac.raw = ((u8 *) iph) - 14; 2149 skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32);
2026 skb->dev = odev; 2150 skb->dev = odev;
2027 skb->pkt_type = PACKET_HOST; 2151 skb->pkt_type = PACKET_HOST;
2028 2152
@@ -2274,13 +2398,19 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2274 int datalen; 2398 int datalen;
2275 struct ipv6hdr *iph; 2399 struct ipv6hdr *iph;
2276 struct pktgen_hdr *pgh = NULL; 2400 struct pktgen_hdr *pgh = NULL;
2401 __be16 protocol = __constant_htons(ETH_P_IPV6);
2402 __be32 *mpls;
2403
2404 if (pkt_dev->nr_labels)
2405 protocol = __constant_htons(ETH_P_MPLS_UC);
2277 2406
2278 /* Update any of the values, used when we're incrementing various 2407 /* Update any of the values, used when we're incrementing various
2279 * fields. 2408 * fields.
2280 */ 2409 */
2281 mod_cur_headers(pkt_dev); 2410 mod_cur_headers(pkt_dev);
2282 2411
2283 skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16, GFP_ATOMIC); 2412 skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16 +
2413 pkt_dev->nr_labels*sizeof(u32), GFP_ATOMIC);
2284 if (!skb) { 2414 if (!skb) {
2285 sprintf(pkt_dev->result, "No memory"); 2415 sprintf(pkt_dev->result, "No memory");
2286 return NULL; 2416 return NULL;
@@ -2290,13 +2420,19 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2290 2420
2291 /* Reserve for ethernet and IP header */ 2421 /* Reserve for ethernet and IP header */
2292 eth = (__u8 *) skb_push(skb, 14); 2422 eth = (__u8 *) skb_push(skb, 14);
2423 mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32));
2424 if (pkt_dev->nr_labels)
2425 mpls_push(mpls, pkt_dev);
2293 iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr)); 2426 iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr));
2294 udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); 2427 udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr));
2295 2428
2296 memcpy(eth, pkt_dev->hh, 12); 2429 memcpy(eth, pkt_dev->hh, 12);
2297 *(u16 *) & eth[12] = __constant_htons(ETH_P_IPV6); 2430 *(u16 *) & eth[12] = __constant_htons(ETH_P_IPV6);
2298 2431
2299 datalen = pkt_dev->cur_pkt_size - 14 - sizeof(struct ipv6hdr) - sizeof(struct udphdr); /* Eth + IPh + UDPh */ 2432 /* Eth + IPh + UDPh + mpls */
2433 datalen = pkt_dev->cur_pkt_size - 14 -
2434 sizeof(struct ipv6hdr) - sizeof(struct udphdr) -
2435 pkt_dev->nr_labels*sizeof(u32);
2300 2436
2301 if (datalen < sizeof(struct pktgen_hdr)) { 2437 if (datalen < sizeof(struct pktgen_hdr)) {
2302 datalen = sizeof(struct pktgen_hdr); 2438 datalen = sizeof(struct pktgen_hdr);
@@ -2320,8 +2456,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
2320 ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr); 2456 ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr);
2321 ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr); 2457 ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr);
2322 2458
2323 skb->mac.raw = ((u8 *) iph) - 14; 2459 skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32);
2324 skb->protocol = __constant_htons(ETH_P_IPV6); 2460 skb->protocol = protocol;
2325 skb->dev = odev; 2461 skb->dev = odev;
2326 skb->pkt_type = PACKET_HOST; 2462 skb->pkt_type = PACKET_HOST;
2327 2463
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c
index 768e8f5d7daa..ec566f3e66c7 100644
--- a/net/ipv4/fib_rules.c
+++ b/net/ipv4/fib_rules.c
@@ -104,6 +104,8 @@ static struct hlist_head fib_rules;
104 104
105/* writer func called from netlink -- rtnl_sem hold*/ 105/* writer func called from netlink -- rtnl_sem hold*/
106 106
107static void rtmsg_rule(int, struct fib_rule *);
108
107int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) 109int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
108{ 110{
109 struct rtattr **rta = arg; 111 struct rtattr **rta = arg;
@@ -131,6 +133,7 @@ int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
131 133
132 hlist_del_rcu(&r->hlist); 134 hlist_del_rcu(&r->hlist);
133 r->r_dead = 1; 135 r->r_dead = 1;
136 rtmsg_rule(RTM_DELRULE, r);
134 fib_rule_put(r); 137 fib_rule_put(r);
135 err = 0; 138 err = 0;
136 break; 139 break;
@@ -253,6 +256,7 @@ int inet_rtm_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
253 else 256 else
254 hlist_add_before_rcu(&new_r->hlist, &r->hlist); 257 hlist_add_before_rcu(&new_r->hlist, &r->hlist);
255 258
259 rtmsg_rule(RTM_NEWRULE, new_r);
256 return 0; 260 return 0;
257} 261}
258 262
@@ -382,14 +386,14 @@ static struct notifier_block fib_rules_notifier = {
382 386
383static __inline__ int inet_fill_rule(struct sk_buff *skb, 387static __inline__ int inet_fill_rule(struct sk_buff *skb,
384 struct fib_rule *r, 388 struct fib_rule *r,
385 struct netlink_callback *cb, 389 u32 pid, u32 seq, int event,
386 unsigned int flags) 390 unsigned int flags)
387{ 391{
388 struct rtmsg *rtm; 392 struct rtmsg *rtm;
389 struct nlmsghdr *nlh; 393 struct nlmsghdr *nlh;
390 unsigned char *b = skb->tail; 394 unsigned char *b = skb->tail;
391 395
392 nlh = NLMSG_NEW_ANSWER(skb, cb, RTM_NEWRULE, sizeof(*rtm), flags); 396 nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*rtm), flags);
393 rtm = NLMSG_DATA(nlh); 397 rtm = NLMSG_DATA(nlh);
394 rtm->rtm_family = AF_INET; 398 rtm->rtm_family = AF_INET;
395 rtm->rtm_dst_len = r->r_dst_len; 399 rtm->rtm_dst_len = r->r_dst_len;
@@ -430,6 +434,21 @@ rtattr_failure:
430 434
431/* callers should hold rtnl semaphore */ 435/* callers should hold rtnl semaphore */
432 436
437static void rtmsg_rule(int event, struct fib_rule *r)
438{
439 int size = NLMSG_SPACE(sizeof(struct rtmsg) + 128);
440 struct sk_buff *skb = alloc_skb(size, GFP_KERNEL);
441
442 if (!skb)
443 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_RULE, ENOBUFS);
444 else if (inet_fill_rule(skb, r, 0, 0, event, 0) < 0) {
445 kfree_skb(skb);
446 netlink_set_err(rtnl, 0, RTNLGRP_IPV4_RULE, EINVAL);
447 } else {
448 netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_RULE, GFP_KERNEL);
449 }
450}
451
433int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) 452int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb)
434{ 453{
435 int idx = 0; 454 int idx = 0;
@@ -442,7 +461,9 @@ int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb)
442 461
443 if (idx < s_idx) 462 if (idx < s_idx)
444 continue; 463 continue;
445 if (inet_fill_rule(skb, r, cb, NLM_F_MULTI) < 0) 464 if (inet_fill_rule(skb, r, NETLINK_CB(cb->skb).pid,
465 cb->nlh->nlmsg_seq,
466 RTM_NEWRULE, NLM_F_MULTI) < 0)
446 break; 467 break;
447 idx++; 468 idx++;
448 } 469 }
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 4fbc40b13f19..e46048974f37 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -161,7 +161,7 @@ int ip6_output(struct sk_buff *skb)
161int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, 161int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
162 struct ipv6_txoptions *opt, int ipfragok) 162 struct ipv6_txoptions *opt, int ipfragok)
163{ 163{
164 struct ipv6_pinfo *np = sk ? inet6_sk(sk) : NULL; 164 struct ipv6_pinfo *np = inet6_sk(sk);
165 struct in6_addr *first_hop = &fl->fl6_dst; 165 struct in6_addr *first_hop = &fl->fl6_dst;
166 struct dst_entry *dst = skb->dst; 166 struct dst_entry *dst = skb->dst;
167 struct ipv6hdr *hdr; 167 struct ipv6hdr *hdr;
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index 2b670479dde1..78e052591fa9 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -347,8 +347,7 @@ static int u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n)
347 if (n->ht_down) 347 if (n->ht_down)
348 n->ht_down->refcnt--; 348 n->ht_down->refcnt--;
349#ifdef CONFIG_CLS_U32_PERF 349#ifdef CONFIG_CLS_U32_PERF
350 if (n) 350 kfree(n->pf);
351 kfree(n->pf);
352#endif 351#endif
353 kfree(n); 352 kfree(n);
354 return 0; 353 return 0;
@@ -680,8 +679,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
680 return 0; 679 return 0;
681 } 680 }
682#ifdef CONFIG_CLS_U32_PERF 681#ifdef CONFIG_CLS_U32_PERF
683 if (n) 682 kfree(n->pf);
684 kfree(n->pf);
685#endif 683#endif
686 kfree(n); 684 kfree(n);
687 return err; 685 return err;