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; |
