* 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.
Unified · Split
| @@ -109,6 +109,22 @@ Examples: · 108 unmodified lines | ||
| 109 | 109 | cycle through the port range. |
| 110 | 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 | 128 | pgset stop aborts injection. Also, ^C aborts generator. |
| 113 | 129 | |
| 114 | 130 | |
| @@ -167,6 +183,8 @@ pkt_size · 52 unmodified lines | ||
| 167 | 183 | min_pkt_size |
| 168 | 184 | max_pkt_size |
| 169 | 185 | |
| 186 | +mpls | |
| 187 | + | |
| 170 | 188 | udp_src_min |
| 171 | 189 | udp_src_max |
| 172 | 190 | |
| @@ -211,4 +229,4 @@ Grant Grundler for testing on IA-64 and parisc, Harald Welte, Lennert Buytenhek · 38 unmodified lines | ||
| 211 | 229 | Stephen Hemminger, Andi Kleen, Dave Miller and many others. |
| 212 | 230 | |
| 213 | 231 | |
| 214 | −Good luck with the linux net-development. | |
| 232 | +Good luck with the linux net-development. | |
| @@ -9,13 +9,54 @@ · 8 unmodified lines | ||
| 9 | 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 | 53 | #include "bnx2.h" |
| 13 | 54 | #include "bnx2_fw.h" |
| 14 | 55 | |
| 15 | 56 | #define DRV_MODULE_NAME "bnx2" |
| 16 | 57 | #define PFX DRV_MODULE_NAME ": " |
| 17 | −#define DRV_MODULE_VERSION "1.4.38" | |
| 18 | −#define DRV_MODULE_RELDATE "February 10, 2006" | |
| 58 | +#define DRV_MODULE_VERSION "1.4.39" | |
| 59 | +#define DRV_MODULE_RELDATE "March 22, 2006" | |
| 19 | 60 | |
| 20 | 61 | #define RUN_AT(x) (jiffies + (x)) |
| 21 | 62 | |
| @@ -313,8 +354,6 @@ bnx2_disable_int(struct bnx2 *bp) · 291 unmodified lines | ||
| 313 | 354 | static void |
| 314 | 355 | bnx2_enable_int(struct bnx2 *bp) |
| 315 | 356 | { |
| 316 | − u32 val; | |
| 317 | − | |
| 318 | 357 | REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, |
| 319 | 358 | BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | |
| 320 | 359 | BNX2_PCICFG_INT_ACK_CMD_MASK_INT | bp->last_status_idx); |
| @@ -322,8 +361,7 @@ bnx2_enable_int(struct bnx2 *bp) · 1 unmodified line | ||
| 322 | 361 | REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, |
| 323 | 362 | BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx); |
| 324 | 363 | |
| 325 | − val = REG_RD(bp, BNX2_HC_COMMAND); | |
| 326 | − REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW); | |
| 364 | + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); | |
| 327 | 365 | } |
| 328 | 366 | |
| 329 | 367 | static void |
| @@ -362,15 +400,11 @@ bnx2_free_mem(struct bnx2 *bp) · 32 unmodified lines | ||
| 362 | 400 | { |
| 363 | 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 | 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 | 405 | bp->status_blk, bp->status_blk_mapping); |
| 373 | 406 | bp->status_blk = NULL; |
| 407 | + bp->stats_blk = NULL; | |
| 374 | 408 | } |
| 375 | 409 | if (bp->tx_desc_ring) { |
| 376 | 410 | pci_free_consistent(bp->pdev, |
| @@ -395,14 +429,13 @@ bnx2_free_mem(struct bnx2 *bp) · 18 unmodified lines | ||
| 395 | 429 | static int |
| 396 | 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, | |
| 401 | − GFP_KERNEL); | |
| 434 | + bp->tx_buf_ring = kzalloc(sizeof(struct sw_bd) * TX_DESC_CNT, | |
| 435 | + GFP_KERNEL); | |
| 402 | 436 | if (bp->tx_buf_ring == NULL) |
| 403 | 437 | return -ENOMEM; |
| 404 | 438 | |
| 405 | − memset(bp->tx_buf_ring, 0, sizeof(struct sw_bd) * TX_DESC_CNT); | |
| 406 | 439 | bp->tx_desc_ring = pci_alloc_consistent(bp->pdev, |
| 407 | 440 | sizeof(struct tx_bd) * |
| 408 | 441 | TX_DESC_CNT, |
| @@ -428,21 +461,22 @@ bnx2_alloc_mem(struct bnx2 *bp) · 19 unmodified lines | ||
| 428 | 461 | |
| 429 | 462 | } |
| 430 | 463 | |
| 431 | − bp->status_blk = pci_alloc_consistent(bp->pdev, | |
| 432 | − sizeof(struct status_block), | |
| 464 | + /* Combine status and statistics blocks into one allocation. */ | |
| 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 | 470 | &bp->status_blk_mapping); |
| 434 | 471 | if (bp->status_blk == NULL) |
| 435 | 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, | |
| 440 | − sizeof(struct statistics_block), | |
| 441 | − &bp->stats_blk_mapping); | |
| 442 | − if (bp->stats_blk == NULL) | |
| 443 | − goto alloc_mem_err; | |
| 476 | + bp->stats_blk = (void *) ((unsigned long) bp->status_blk + | |
| 477 | + status_blk_size); | |
| 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 | 481 | return 0; |
| 448 | 482 | |
| @@ -1926,6 +1960,13 @@ bnx2_poll(struct net_device *dev, int *budget) · 1477 unmodified lines | ||
| 1926 | 1960 | spin_lock(&bp->phy_lock); |
| 1927 | 1961 | bnx2_phy_int(bp); |
| 1928 | 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 | 1972 | if (bp->status_blk->status_tx_quick_consumer_index0 != bp->hw_tx_cons) |
| @@ -3307,6 +3348,8 @@ bnx2_init_chip(struct bnx2 *bp) · 1375 unmodified lines | ||
| 3307 | 3348 | |
| 3308 | 3349 | udelay(20); |
| 3309 | 3350 | |
| 3351 | + bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND); | |
| 3352 | + | |
| 3310 | 3353 | return rc; |
| 3311 | 3354 | } |
| 3312 | 3355 | |
| @@ -3746,7 +3789,6 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) · 433 unmodified lines | ||
| 3746 | 3789 | struct sk_buff *skb, *rx_skb; |
| 3747 | 3790 | unsigned char *packet; |
| 3748 | 3791 | u16 rx_start_idx, rx_idx; |
| 3749 | − u32 val; | |
| 3750 | 3792 | dma_addr_t map; |
| 3751 | 3793 | struct tx_bd *txbd; |
| 3752 | 3794 | struct sw_bd *rx_buf; |
| @@ -3777,8 +3819,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) · 24 unmodified lines | ||
| 3777 | 3819 | map = pci_map_single(bp->pdev, skb->data, pkt_size, |
| 3778 | 3820 | PCI_DMA_TODEVICE); |
| 3779 | 3821 | |
| 3780 | − val = REG_RD(bp, BNX2_HC_COMMAND); | |
| 3781 | − REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); | |
| 3822 | + REG_WR(bp, BNX2_HC_COMMAND, | |
| 3823 | + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); | |
| 3824 | + | |
| 3782 | 3825 | REG_RD(bp, BNX2_HC_COMMAND); |
| 3783 | 3826 | |
| 3784 | 3827 | udelay(5); |
| @@ -3802,8 +3845,9 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) · 17 unmodified lines | ||
| 3802 | 3845 | |
| 3803 | 3846 | udelay(100); |
| 3804 | 3847 | |
| 3805 | − val = REG_RD(bp, BNX2_HC_COMMAND); | |
| 3806 | − REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW_WO_INT); | |
| 3848 | + REG_WR(bp, BNX2_HC_COMMAND, | |
| 3849 | + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); | |
| 3850 | + | |
| 3807 | 3851 | REG_RD(bp, BNX2_HC_COMMAND); |
| 3808 | 3852 | |
| 3809 | 3853 | udelay(5); |
| @@ -3939,7 +3983,6 @@ static int · 129 unmodified lines | ||
| 3939 | 3983 | bnx2_test_intr(struct bnx2 *bp) |
| 3940 | 3984 | { |
| 3941 | 3985 | int i; |
| 3942 | − u32 val; | |
| 3943 | 3986 | u16 status_idx; |
| 3944 | 3987 | |
| 3945 | 3988 | if (!netif_running(bp->dev)) |
| @@ -3948,8 +3991,7 @@ bnx2_test_intr(struct bnx2 *bp) · 2 unmodified lines | ||
| 3948 | 3991 | status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff; |
| 3949 | 3992 | |
| 3950 | 3993 | /* This register is not touched during run-time. */ |
| 3951 | − val = REG_RD(bp, BNX2_HC_COMMAND); | |
| 3952 | − REG_WR(bp, BNX2_HC_COMMAND, val | BNX2_HC_COMMAND_COAL_NOW); | |
| 3994 | + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); | |
| 3953 | 3995 | REG_RD(bp, BNX2_HC_COMMAND); |
| 3954 | 3996 | |
| 3955 | 3997 | for (i = 0; i < 10; i++) { |
| @@ -13,46 +13,6 @@ · 12 unmodified lines | ||
| 13 | 13 | #ifndef BNX2_H |
| 14 | 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 | 16 | /* Hardware data structures and register definitions automatically |
| 57 | 17 | * generated from RTL code. Do not modify. |
| 58 | 18 | */ |
| @@ -3917,15 +3877,17 @@ struct bnx2 { · 3858 unmodified lines | ||
| 3917 | 3877 | #define USING_MSI_FLAG 0x20 |
| 3918 | 3878 | #define ASF_ENABLE_FLAG 0x40 |
| 3919 | 3879 | |
| 3920 | − struct tx_bd *tx_desc_ring; | |
| 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; | |
| 3880 | + /* Put tx producer and consumer fields in separate cache lines. */ | |
| 3926 | 3881 | |
| 3927 | − u16 hw_tx_cons; | |
| 3928 | − u16 hw_rx_cons; | |
| 3882 | + u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES))); | |
| 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 | 3892 | #ifdef BCM_VLAN |
| 3931 | 3893 | struct vlan_group *vlgrp; |
| @@ -3939,6 +3901,7 @@ struct bnx2 { · 7 unmodified lines | ||
| 3939 | 3901 | u32 rx_prod_bseq; |
| 3940 | 3902 | u16 rx_prod; |
| 3941 | 3903 | u16 rx_cons; |
| 3904 | + u16 hw_rx_cons; | |
| 3942 | 3905 | |
| 3943 | 3906 | u32 rx_csum; |
| 3944 | 3907 | |
| @@ -4038,6 +4001,7 @@ struct bnx2 { · 93 unmodified lines | ||
| 4038 | 4001 | struct statistics_block *stats_blk; |
| 4039 | 4002 | dma_addr_t stats_blk_mapping; |
| 4040 | 4003 | |
| 4004 | + u32 hc_cmd; | |
| 4041 | 4005 | u32 rx_mode; |
| 4042 | 4006 | |
| 4043 | 4007 | u16 req_line_speed; |
| @@ -4082,6 +4046,8 @@ struct bnx2 { · 38 unmodified lines | ||
| 4082 | 4046 | |
| 4083 | 4047 | struct flash_spec *flash_info; |
| 4084 | 4048 | u32 flash_size; |
| 4049 | + | |
| 4050 | + int status_stats_size; | |
| 4085 | 4051 | }; |
| 4086 | 4052 | |
| 4087 | 4053 | static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset); |
| @@ -69,8 +69,8 @@ · 68 unmodified lines | ||
| 69 | 69 | |
| 70 | 70 | #define DRV_MODULE_NAME "tg3" |
| 71 | 71 | #define PFX DRV_MODULE_NAME ": " |
| 72 | −#define DRV_MODULE_VERSION "3.53" | |
| 73 | −#define DRV_MODULE_RELDATE "Mar 22, 2006" | |
| 72 | +#define DRV_MODULE_VERSION "3.54" | |
| 73 | +#define DRV_MODULE_RELDATE "Mar 23, 2006" | |
| 74 | 74 | |
| 75 | 75 | #define TG3_DEF_MAC_MODE 0 |
| 76 | 76 | #define TG3_DEF_RX_MODE 0 |
| @@ -225,6 +225,10 @@ static struct pci_device_id tg3_pci_tbl[] = { · 148 unmodified lines | ||
| 225 | 225 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, |
| 226 | 226 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M, |
| 227 | 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 | 232 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787, |
| 229 | 233 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, |
| 230 | 234 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M, |
| @@ -4557,6 +4561,7 @@ static int tg3_chip_reset(struct tg3 *tp) · 4326 unmodified lines | ||
| 4557 | 4561 | } |
| 4558 | 4562 | |
| 4559 | 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 | 4565 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) |
| 4561 | 4566 | tw32(GRC_FASTBOOT_PC, 0); |
| 4562 | 4567 | |
| @@ -6152,6 +6157,9 @@ static int tg3_reset_hw(struct tg3 *tp) · 1589 unmodified lines | ||
| 6152 | 6157 | gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | |
| 6153 | 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 | 6163 | tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; |
| 6156 | 6164 | |
| 6157 | 6165 | /* GPIO1 must be driven high for eeprom write protect */ |
| @@ -6191,7 +6199,8 @@ static int tg3_reset_hw(struct tg3 *tp) · 33 unmodified lines | ||
| 6191 | 6199 | } |
| 6192 | 6200 | |
| 6193 | 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 | 6204 | val |= (1 << 29); |
| 6196 | 6205 | |
| 6197 | 6206 | tw32_f(WDMAC_MODE, val); |
| @@ -6249,6 +6258,9 @@ static int tg3_reset_hw(struct tg3 *tp) · 51 unmodified lines | ||
| 6249 | 6258 | udelay(100); |
| 6250 | 6259 | |
| 6251 | 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 | 6264 | tw32_f(MAC_RX_MODE, tp->rx_mode); |
| 6253 | 6265 | udelay(10); |
| 6254 | 6266 | |
| @@ -7907,7 +7919,8 @@ static int tg3_set_tx_csum(struct net_device *dev, u32 data) · 1652 unmodified lines | ||
| 7907 | 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 | 7924 | ethtool_op_set_tx_hw_csum(dev, data); |
| 7912 | 7925 | else |
| 7913 | 7926 | ethtool_op_set_tx_csum(dev, data); |
| @@ -8332,7 +8345,8 @@ static int tg3_test_memory(struct tg3 *tp) · 418 unmodified lines | ||
| 8332 | 8345 | int i; |
| 8333 | 8346 | |
| 8334 | 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 | 8350 | mem_tbl = mem_tbl_5755; |
| 8337 | 8351 | else |
| 8338 | 8352 | mem_tbl = mem_tbl_5705; |
| @@ -8924,6 +8938,47 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp) · 585 unmodified lines | ||
| 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 | 8982 | static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) |
| 8928 | 8983 | { |
| 8929 | 8984 | u32 nvcfg1; |
| @@ -8997,6 +9052,8 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) · 67 unmodified lines | ||
| 8997 | 9052 | |
| 8998 | 9053 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) |
| 8999 | 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 | 9057 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) |
| 9001 | 9058 | tg3_get_5787_nvram_info(tp); |
| 9002 | 9059 | else |
| @@ -9310,6 +9367,7 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len, · 307 unmodified lines | ||
| 9310 | 9367 | nvram_cmd |= NVRAM_CMD_LAST; |
| 9311 | 9368 | |
| 9312 | 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 | 9371 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) && |
| 9314 | 9372 | (tp->nvram_jedecnum == JEDEC_ST) && |
| 9315 | 9373 | (nvram_cmd & NVRAM_CMD_FIRST)) { |
| @@ -10044,6 +10102,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 728 unmodified lines | ||
| 10044 | 10102 | |
| 10045 | 10103 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || |
| 10046 | 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 | 10106 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || |
| 10048 | 10107 | (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) |
| 10049 | 10108 | tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; |
| @@ -10053,7 +10112,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 3 unmodified lines | ||
| 10053 | 10112 | tp->tg3_flags2 |= TG3_FLG2_5705_PLUS; |
| 10054 | 10113 | |
| 10055 | 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 | 10117 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; |
| 10058 | 10118 | tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; |
| 10059 | 10119 | } else |
| @@ -10063,6 +10123,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 3 unmodified lines | ||
| 10063 | 10123 | if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && |
| 10064 | 10124 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 && |
| 10065 | 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 | 10127 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) |
| 10067 | 10128 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; |
| 10068 | 10129 | |
| @@ -10219,6 +10280,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 150 unmodified lines | ||
| 10219 | 10280 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) |
| 10220 | 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 | 10286 | /* Force the chip into D0. */ |
| 10223 | 10287 | err = tg3_set_power_state(tp, PCI_D0); |
| 10224 | 10288 | if (err) { |
| @@ -10274,6 +10338,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 49 unmodified lines | ||
| 10274 | 10338 | tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG; |
| 10275 | 10339 | |
| 10276 | 10340 | if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && |
| 10341 | + (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) && | |
| 10277 | 10342 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787)) |
| 10278 | 10343 | tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; |
| 10279 | 10344 | |
| @@ -10413,7 +10478,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) · 133 unmodified lines | ||
| 10413 | 10478 | /* All chips before 5787 can get confused if TX buffers |
| 10414 | 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 | 10483 | tp->dev->hard_start_xmit = tg3_start_xmit; |
| 10418 | 10484 | else |
| 10419 | 10485 | tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; |
| @@ -11002,6 +11068,7 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) · 582 unmodified lines | ||
| 11002 | 11068 | case PHY_ID_BCM5752: return "5752"; |
| 11003 | 11069 | case PHY_ID_BCM5714: return "5714"; |
| 11004 | 11070 | case PHY_ID_BCM5780: return "5780"; |
| 11071 | + case PHY_ID_BCM5755: return "5755"; | |
| 11005 | 11072 | case PHY_ID_BCM5787: return "5787"; |
| 11006 | 11073 | case PHY_ID_BCM8002: return "8002/serdes"; |
| 11007 | 11074 | case 0: return "serdes"; |
| @@ -11350,7 +11417,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, · 342 unmodified lines | ||
| 11350 | 11417 | * checksumming. |
| 11351 | 11418 | */ |
| 11352 | 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 | 11422 | dev->features |= NETIF_F_HW_CSUM; |
| 11355 | 11423 | else |
| 11356 | 11424 | dev->features |= NETIF_F_IP_CSUM; |
| @@ -138,6 +138,7 @@ · 137 unmodified lines | ||
| 138 | 138 | #define ASIC_REV_5752 0x06 |
| 139 | 139 | #define ASIC_REV_5780 0x08 |
| 140 | 140 | #define ASIC_REV_5714 0x09 |
| 141 | +#define ASIC_REV_5755 0x0a | |
| 141 | 142 | #define ASIC_REV_5787 0x0b |
| 142 | 143 | #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) |
| 143 | 144 | #define CHIPREV_5700_AX 0x70 |
| @@ -456,6 +457,7 @@ · 312 unmodified lines | ||
| 456 | 457 | #define RX_MODE_PROMISC 0x00000100 |
| 457 | 458 | #define RX_MODE_NO_CRC_CHECK 0x00000200 |
| 458 | 459 | #define RX_MODE_KEEP_VLAN_TAG 0x00000400 |
| 460 | +#define RX_MODE_IPV6_CSUM_ENABLE 0x01000000 | |
| 459 | 461 | #define MAC_RX_STATUS 0x0000046c |
| 460 | 462 | #define RX_STATUS_REMOTE_TX_XOFFED 0x00000001 |
| 461 | 463 | #define RX_STATUS_XOFF_RCVD 0x00000002 |
| @@ -1340,6 +1342,7 @@ · 878 unmodified lines | ||
| 1340 | 1342 | #define GRC_LCLCTRL_CLEARINT 0x00000002 |
| 1341 | 1343 | #define GRC_LCLCTRL_SETINT 0x00000004 |
| 1342 | 1344 | #define GRC_LCLCTRL_INT_ON_ATTN 0x00000008 |
| 1345 | +#define GRC_LCLCTRL_GPIO_UART_SEL 0x00000010 /* 5755 only */ | |
| 1343 | 1346 | #define GRC_LCLCTRL_USE_SIG_DETECT 0x00000010 /* 5714/5780 only */ |
| 1344 | 1347 | #define GRC_LCLCTRL_USE_EXT_SIG_DETECT 0x00000020 /* 5714/5780 only */ |
| 1345 | 1348 | #define GRC_LCLCTRL_GPIO_INPUT3 0x00000020 |
| @@ -1441,6 +1444,9 @@ · 95 unmodified lines | ||
| 1441 | 1444 | #define FLASH_5755VENDOR_ATMEL_FLASH_1 0x03400001 |
| 1442 | 1445 | #define FLASH_5755VENDOR_ATMEL_FLASH_2 0x03400002 |
| 1443 | 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 | 1450 | #define FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ 0x03000003 |
| 1445 | 1451 | #define FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ 0x03000002 |
| 1446 | 1452 | #define FLASH_5787VENDOR_MICRO_EEPROM_64KHZ 0x03000000 |
| @@ -2259,6 +2265,7 @@ struct tg3 { · 812 unmodified lines | ||
| 2259 | 2265 | #define PHY_ID_BCM5752 0x60008100 |
| 2260 | 2266 | #define PHY_ID_BCM5714 0x60008340 |
| 2261 | 2267 | #define PHY_ID_BCM5780 0x60008350 |
| 2268 | +#define PHY_ID_BCM5755 0xbc050cc0 | |
| 2262 | 2269 | #define PHY_ID_BCM5787 0xbc050ce0 |
| 2263 | 2270 | #define PHY_ID_BCM8002 0x60010140 |
| 2264 | 2271 | #define PHY_ID_INVALID 0xffffffff |
| @@ -2286,7 +2293,7 @@ struct tg3 { · 21 unmodified lines | ||
| 2286 | 2293 | (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \ |
| 2287 | 2294 | (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \ |
| 2288 | 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 | 2298 | struct tg3_hw_stats *hw_stats; |
| 2292 | 2299 | dma_addr_t stats_mapping; |
| @@ -1864,11 +1864,13 @@ · 1863 unmodified lines | ||
| 1864 | 1864 | #define PCI_DEVICE_ID_TIGON3_5780S 0x166b |
| 1865 | 1865 | #define PCI_DEVICE_ID_TIGON3_5705F 0x166e |
| 1866 | 1866 | #define PCI_DEVICE_ID_TIGON3_5754M 0x1672 |
| 1867 | +#define PCI_DEVICE_ID_TIGON3_5755M 0x1673 | |
| 1867 | 1868 | #define PCI_DEVICE_ID_TIGON3_5750 0x1676 |
| 1868 | 1869 | #define PCI_DEVICE_ID_TIGON3_5751 0x1677 |
| 1869 | 1870 | #define PCI_DEVICE_ID_TIGON3_5715 0x1678 |
| 1870 | 1871 | #define PCI_DEVICE_ID_TIGON3_5715S 0x1679 |
| 1871 | 1872 | #define PCI_DEVICE_ID_TIGON3_5754 0x167a |
| 1873 | +#define PCI_DEVICE_ID_TIGON3_5755 0x167b | |
| 1872 | 1874 | #define PCI_DEVICE_ID_TIGON3_5750M 0x167c |
| 1873 | 1875 | #define PCI_DEVICE_ID_TIGON3_5751M 0x167d |
| 1874 | 1876 | #define PCI_DEVICE_ID_TIGON3_5751F 0x167e |
| @@ -839,6 +839,7 @@ enum · 838 unmodified lines | ||
| 839 | 839 | #define RTMGRP_IPV4_IFADDR 0x10 |
| 840 | 840 | #define RTMGRP_IPV4_MROUTE 0x20 |
| 841 | 841 | #define RTMGRP_IPV4_ROUTE 0x40 |
| 842 | +#define RTMGRP_IPV4_RULE 0x80 | |
| 842 | 843 | |
| 843 | 844 | #define RTMGRP_IPV6_IFADDR 0x100 |
| 844 | 845 | #define RTMGRP_IPV6_MROUTE 0x200 |
| @@ -869,7 +870,8 @@ enum rtnetlink_groups { · 24 unmodified lines | ||
| 869 | 870 | #define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE |
| 870 | 871 | RTNLGRP_IPV4_ROUTE, |
| 871 | 872 | #define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE |
| 872 | − RTNLGRP_NOP1, | |
| 873 | + RTNLGRP_IPV4_RULE, | |
| 874 | +#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE | |
| 873 | 875 | RTNLGRP_IPV6_IFADDR, |
| 874 | 876 | #define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR |
| 875 | 877 | RTNLGRP_IPV6_MROUTE, |
| @@ -106,6 +106,9 @@ · 105 unmodified lines | ||
| 106 | 106 | * |
| 107 | 107 | * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com> |
| 108 | 108 | * 050103 |
| 109 | + * | |
| 110 | + * MPLS support by Steven Whitehouse <steve@chygwyn.com> | |
| 111 | + * | |
| 109 | 112 | */ |
| 110 | 113 | #include <linux/sys.h> |
| 111 | 114 | #include <linux/types.h> |
| @@ -154,7 +157,7 @@ · 42 unmodified lines | ||
| 154 | 157 | #include <asm/div64.h> /* do_div */ |
| 155 | 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 | 162 | /* #define PG_DEBUG(a) a */ |
| 160 | 163 | #define PG_DEBUG(a) |
| @@ -162,6 +165,8 @@ · 1 unmodified line | ||
| 162 | 165 | /* The buckets are exponential in 'width' */ |
| 163 | 166 | #define LAT_BUCKETS_MAX 32 |
| 164 | 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 | 171 | /* Device flag bits */ |
| 167 | 172 | #define F_IPSRC_RND (1<<0) /* IP-Src Random */ |
| @@ -172,6 +177,7 @@ · 4 unmodified lines | ||
| 172 | 177 | #define F_MACDST_RND (1<<5) /* MAC-Dst Random */ |
| 173 | 178 | #define F_TXSIZE_RND (1<<6) /* Transmit size is random */ |
| 174 | 179 | #define F_IPV6 (1<<7) /* Interface in IPV6 Mode */ |
| 180 | +#define F_MPLS_RND (1<<8) /* Random MPLS labels */ | |
| 175 | 181 | |
| 176 | 182 | /* Thread control flag bits */ |
| 177 | 183 | #define T_TERMINATE (1<<0) |
| @@ -278,6 +284,10 @@ struct pktgen_dev { · 100 unmodified lines | ||
| 278 | 284 | __u16 udp_dst_min; /* inclusive, dest UDP port */ |
| 279 | 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 | 291 | __u32 src_mac_count; /* How many MACs to iterate through */ |
| 282 | 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) · 339 unmodified lines | ||
| 623 | 633 | pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); |
| 624 | 634 | |
| 625 | 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 | 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 | 649 | if (pkt_dev->flags & F_IPV6) |
| 630 | 650 | seq_printf(seq, "IPV6 "); |
| 631 | 651 | |
| @@ -644,6 +664,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v) · 12 unmodified lines | ||
| 644 | 664 | if (pkt_dev->flags & F_UDPDST_RND) |
| 645 | 665 | seq_printf(seq, "UDPDST_RND "); |
| 646 | 666 | |
| 667 | + if (pkt_dev->flags & F_MPLS_RND) | |
| 668 | + seq_printf(seq, "MPLS_RND "); | |
| 669 | + | |
| 647 | 670 | if (pkt_dev->flags & F_MACSRC_RND) |
| 648 | 671 | seq_printf(seq, "MACSRC_RND "); |
| 649 | 672 | |
| @@ -691,6 +714,29 @@ static int pktgen_if_show(struct seq_file *seq, void *v) · 41 unmodified lines | ||
| 691 | 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 | 740 | static int count_trail_chars(const char __user * user_buffer, |
| 695 | 741 | unsigned int maxlen) |
| 696 | 742 | { |
| @@ -759,6 +805,35 @@ done_str: · 62 unmodified lines | ||
| 759 | 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 | 837 | static ssize_t pktgen_if_write(struct file *file, |
| 763 | 838 | const char __user * user_buffer, size_t count, |
| 764 | 839 | loff_t * offset) |
| @@ -1059,6 +1134,12 @@ static ssize_t pktgen_if_write(struct file *file, · 294 unmodified lines | ||
| 1059 | 1134 | else if (strcmp(f, "!MACDST_RND") == 0) |
| 1060 | 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 | 1143 | else { |
| 1063 | 1144 | sprintf(pg_result, |
| 1064 | 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, · 289 unmodified lines | ||
| 1354 | 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 | 1451 | sprintf(pkt_dev->result, "No such parameter \"%s\"", name); |
| 1358 | 1452 | return -EINVAL; |
| 1359 | 1453 | } |
| @@ -1846,6 +1940,15 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) · 486 unmodified lines | ||
| 1846 | 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 | 1952 | if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { |
| 1850 | 1953 | if (pkt_dev->flags & F_UDPSRC_RND) |
| 1851 | 1954 | pkt_dev->cur_udp_src = |
| @@ -1968,6 +2071,16 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) · 116 unmodified lines | ||
| 1968 | 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 | 2084 | static struct sk_buff *fill_packet_ipv4(struct net_device *odev, |
| 1972 | 2085 | struct pktgen_dev *pkt_dev) |
| 1973 | 2086 | { |
| @@ -1977,6 +2090,11 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, · 3 unmodified lines | ||
| 1977 | 2090 | int datalen, iplen; |
| 1978 | 2091 | struct iphdr *iph; |
| 1979 | 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 | 2099 | /* Update any of the values, used when we're incrementing various |
| 1982 | 2100 | * fields. |
| @@ -1984,7 +2102,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, · 1 unmodified line | ||
| 1984 | 2102 | mod_cur_headers(pkt_dev); |
| 1985 | 2103 | |
| 1986 | 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 | 2107 | if (!skb) { |
| 1989 | 2108 | sprintf(pkt_dev->result, "No memory"); |
| 1990 | 2109 | return NULL; |
| @@ -1994,13 +2113,18 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, · 3 unmodified lines | ||
| 1994 | 2113 | |
| 1995 | 2114 | /* Reserve for ethernet and IP header */ |
| 1996 | 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 | 2119 | iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); |
| 1998 | 2120 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); |
| 1999 | 2121 | |
| 2000 | 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 | 2128 | if (datalen < sizeof(struct pktgen_hdr)) |
| 2005 | 2129 | datalen = sizeof(struct pktgen_hdr); |
| 2006 | 2130 | |
| @@ -2021,8 +2145,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, · 14 unmodified lines | ||
| 2021 | 2145 | iph->tot_len = htons(iplen); |
| 2022 | 2146 | iph->check = 0; |
| 2023 | 2147 | iph->check = ip_fast_csum((void *)iph, iph->ihl); |
| 2024 | − skb->protocol = __constant_htons(ETH_P_IP); | |
| 2025 | − skb->mac.raw = ((u8 *) iph) - 14; | |
| 2148 | + skb->protocol = protocol; | |
| 2149 | + skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32); | |
| 2026 | 2150 | skb->dev = odev; |
| 2027 | 2151 | skb->pkt_type = PACKET_HOST; |
| 2028 | 2152 | |
| @@ -2274,13 +2398,19 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, · 245 unmodified lines | ||
| 2274 | 2398 | int datalen; |
| 2275 | 2399 | struct ipv6hdr *iph; |
| 2276 | 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 | 2407 | /* Update any of the values, used when we're incrementing various |
| 2279 | 2408 | * fields. |
| 2280 | 2409 | */ |
| 2281 | 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 | 2414 | if (!skb) { |
| 2285 | 2415 | sprintf(pkt_dev->result, "No memory"); |
| 2286 | 2416 | return NULL; |
| @@ -2290,13 +2420,19 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, · 3 unmodified lines | ||
| 2290 | 2420 | |
| 2291 | 2421 | /* Reserve for ethernet and IP header */ |
| 2292 | 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 | 2426 | iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr)); |
| 2294 | 2427 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); |
| 2295 | 2428 | |
| 2296 | 2429 | memcpy(eth, pkt_dev->hh, 12); |
| 2297 | 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 | 2437 | if (datalen < sizeof(struct pktgen_hdr)) { |
| 2302 | 2438 | datalen = sizeof(struct pktgen_hdr); |
| @@ -2320,8 +2456,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, · 17 unmodified lines | ||
| 2320 | 2456 | ipv6_addr_copy(&iph->daddr, &pkt_dev->cur_in6_daddr); |
| 2321 | 2457 | ipv6_addr_copy(&iph->saddr, &pkt_dev->cur_in6_saddr); |
| 2322 | 2458 | |
| 2323 | − skb->mac.raw = ((u8 *) iph) - 14; | |
| 2324 | − skb->protocol = __constant_htons(ETH_P_IPV6); | |
| 2459 | + skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32); | |
| 2460 | + skb->protocol = protocol; | |
| 2325 | 2461 | skb->dev = odev; |
| 2326 | 2462 | skb->pkt_type = PACKET_HOST; |
| 2327 | 2463 | |
| @@ -104,6 +104,8 @@ static struct hlist_head fib_rules; · 103 unmodified lines | ||
| 104 | 104 | |
| 105 | 105 | /* writer func called from netlink -- rtnl_sem hold*/ |
| 106 | 106 | |
| 107 | +static void rtmsg_rule(int, struct fib_rule *); | |
| 108 | + | |
| 107 | 109 | int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) |
| 108 | 110 | { |
| 109 | 111 | struct rtattr **rta = arg; |
| @@ -131,6 +133,7 @@ int inet_rtm_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) · 21 unmodified lines | ||
| 131 | 133 | |
| 132 | 134 | hlist_del_rcu(&r->hlist); |
| 133 | 135 | r->r_dead = 1; |
| 136 | + rtmsg_rule(RTM_DELRULE, r); | |
| 134 | 137 | fib_rule_put(r); |
| 135 | 138 | err = 0; |
| 136 | 139 | break; |
| @@ -253,6 +256,7 @@ int inet_rtm_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) · 116 unmodified lines | ||
| 253 | 256 | else |
| 254 | 257 | hlist_add_before_rcu(&new_r->hlist, &r->hlist); |
| 255 | 258 | |
| 259 | + rtmsg_rule(RTM_NEWRULE, new_r); | |
| 256 | 260 | return 0; |
| 257 | 261 | } |
| 258 | 262 | |
| @@ -382,14 +386,14 @@ static struct notifier_block fib_rules_notifier = { · 123 unmodified lines | ||
| 382 | 386 | |
| 383 | 387 | static __inline__ int inet_fill_rule(struct sk_buff *skb, |
| 384 | 388 | struct fib_rule *r, |
| 385 | − struct netlink_callback *cb, | |
| 389 | + u32 pid, u32 seq, int event, | |
| 386 | 390 | unsigned int flags) |
| 387 | 391 | { |
| 388 | 392 | struct rtmsg *rtm; |
| 389 | 393 | struct nlmsghdr *nlh; |
| 390 | 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 | 397 | rtm = NLMSG_DATA(nlh); |
| 394 | 398 | rtm->rtm_family = AF_INET; |
| 395 | 399 | rtm->rtm_dst_len = r->r_dst_len; |
| @@ -430,6 +434,21 @@ rtattr_failure: · 34 unmodified lines | ||
| 430 | 434 | |
| 431 | 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 | 452 | int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) |
| 434 | 453 | { |
| 435 | 454 | int idx = 0; |
| @@ -442,7 +461,9 @@ int inet_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) · 6 unmodified lines | ||
| 442 | 461 | |
| 443 | 462 | if (idx < s_idx) |
| 444 | 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 | 467 | break; |
| 447 | 468 | idx++; |
| 448 | 469 | } |
| @@ -161,7 +161,7 @@ int ip6_output(struct sk_buff *skb) · 160 unmodified lines | ||
| 161 | 161 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, |
| 162 | 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 | 165 | struct in6_addr *first_hop = &fl->fl6_dst; |
| 166 | 166 | struct dst_entry *dst = skb->dst; |
| 167 | 167 | struct ipv6hdr *hdr; |
| @@ -347,8 +347,7 @@ static int u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n) · 346 unmodified lines | ||
| 347 | 347 | if (n->ht_down) |
| 348 | 348 | n->ht_down->refcnt--; |
| 349 | 349 | #ifdef CONFIG_CLS_U32_PERF |
| 350 | − if (n) | |
| 351 | − kfree(n->pf); | |
| 350 | + kfree(n->pf); | |
| 352 | 351 | #endif |
| 353 | 352 | kfree(n); |
| 354 | 353 | return 0; |
| @@ -680,8 +679,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, · 325 unmodified lines | ||
| 680 | 679 | return 0; |
| 681 | 680 | } |
| 682 | 681 | #ifdef CONFIG_CLS_U32_PERF |
| 683 | − if (n) | |
| 684 | − kfree(n->pf); | |
| 682 | + kfree(n->pf); | |
| 685 | 683 | #endif |
| 686 | 684 | kfree(n); |
| 687 | 685 | return err; |