diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-23 18:29:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-23 18:29:27 -0500 |
commit | 554f593d6c411e717a71ffdcb0cfb46bb2394502 (patch) | |
tree | 338e1629408a66cfc84d199c18deb22c6e682c22 | |
parent | debf798b1ed82053689d900670eb27fb2f1b4bd3 (diff) | |
parent | 95381c893dd71a534ab56f09b12a4e2118aa0f32 (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.txt | 20 | ||||
-rw-r--r-- | drivers/net/bnx2.c | 108 | ||||
-rw-r--r-- | drivers/net/bnx2.h | 62 | ||||
-rw-r--r-- | drivers/net/tg3.c | 84 | ||||
-rw-r--r-- | drivers/net/tg3.h | 9 | ||||
-rw-r--r-- | include/linux/pci_ids.h | 2 | ||||
-rw-r--r-- | include/linux/rtnetlink.h | 4 | ||||
-rw-r--r-- | net/core/pktgen.c | 158 | ||||
-rw-r--r-- | net/ipv4/fib_rules.c | 27 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
-rw-r--r-- | net/sched/cls_u32.c | 6 |
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 | |||
167 | min_pkt_size | 183 | min_pkt_size |
168 | max_pkt_size | 184 | max_pkt_size |
169 | 185 | ||
186 | mpls | ||
187 | |||
170 | udp_src_min | 188 | udp_src_min |
171 | udp_src_max | 189 | udp_src_max |
172 | 190 | ||
@@ -211,4 +229,4 @@ Grant Grundler for testing on IA-64 and parisc, Harald Welte, Lennert Buytenhek | |||
211 | Stephen Hemminger, Andi Kleen, Dave Miller and many others. | 229 | Stephen Hemminger, Andi Kleen, Dave Miller and many others. |
212 | 230 | ||
213 | 231 | ||
214 | Good luck with the linux net-development. \ No newline at end of file | 232 | Good 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) | |||
313 | static void | 354 | static void |
314 | bnx2_enable_int(struct bnx2 *bp) | 355 | bnx2_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 | ||
329 | static void | 367 | static 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) | |||
395 | static int | 429 | static int |
396 | bnx2_alloc_mem(struct bnx2 *bp) | 430 | bnx2_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 | |||
3939 | bnx2_test_intr(struct bnx2 *bp) | 3983 | bnx2_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 | ||
4087 | static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset); | 4053 | static 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 | ||
8941 | static 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 | |||
8927 | static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) | 8982 | static 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 | |||
718 | static 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 | |||
694 | static int count_trail_chars(const char __user * user_buffer, | 740 | static 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 | ||
808 | static 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 | |||
762 | static ssize_t pktgen_if_write(struct file *file, | 837 | static 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 | ||
2074 | static 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 | |||
1971 | static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | 2084 | static 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 | ||
107 | static void rtmsg_rule(int, struct fib_rule *); | ||
108 | |||
107 | int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | 109 | int 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 | ||
383 | static __inline__ int inet_fill_rule(struct sk_buff *skb, | 387 | static __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 | ||
437 | static 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 | |||
433 | int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) | 452 | int 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) | |||
161 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | 161 | int 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; |