diff options
60 files changed, 507 insertions, 347 deletions
diff --git a/arch/arm/crypto/aesbs-core.S_shipped b/arch/arm/crypto/aesbs-core.S_shipped index 64205d453260..71e5fc7cfb18 100644 --- a/arch/arm/crypto/aesbs-core.S_shipped +++ b/arch/arm/crypto/aesbs-core.S_shipped | |||
| @@ -58,7 +58,7 @@ | |||
| 58 | # define VFP_ABI_FRAME 0 | 58 | # define VFP_ABI_FRAME 0 |
| 59 | # define BSAES_ASM_EXTENDED_KEY | 59 | # define BSAES_ASM_EXTENDED_KEY |
| 60 | # define XTS_CHAIN_TWEAK | 60 | # define XTS_CHAIN_TWEAK |
| 61 | # define __ARM_ARCH__ __LINUX_ARM_ARCH__ | 61 | # define __ARM_ARCH__ 7 |
| 62 | #endif | 62 | #endif |
| 63 | 63 | ||
| 64 | #ifdef __thumb__ | 64 | #ifdef __thumb__ |
diff --git a/arch/arm/crypto/bsaes-armv7.pl b/arch/arm/crypto/bsaes-armv7.pl index f3d96d932573..be068db960ee 100644 --- a/arch/arm/crypto/bsaes-armv7.pl +++ b/arch/arm/crypto/bsaes-armv7.pl | |||
| @@ -701,7 +701,7 @@ $code.=<<___; | |||
| 701 | # define VFP_ABI_FRAME 0 | 701 | # define VFP_ABI_FRAME 0 |
| 702 | # define BSAES_ASM_EXTENDED_KEY | 702 | # define BSAES_ASM_EXTENDED_KEY |
| 703 | # define XTS_CHAIN_TWEAK | 703 | # define XTS_CHAIN_TWEAK |
| 704 | # define __ARM_ARCH__ __LINUX_ARM_ARCH__ | 704 | # define __ARM_ARCH__ 7 |
| 705 | #endif | 705 | #endif |
| 706 | 706 | ||
| 707 | #ifdef __thumb__ | 707 | #ifdef __thumb__ |
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 3c597c222ef2..fbeb39c869e9 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
| @@ -329,7 +329,7 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
| 329 | */ | 329 | */ |
| 330 | #define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) | 330 | #define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) |
| 331 | #define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) | 331 | #define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) |
| 332 | #define ioremap_cached(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED) | 332 | #define ioremap_cache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED) |
| 333 | #define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC) | 333 | #define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC) |
| 334 | #define iounmap __arm_iounmap | 334 | #define iounmap __arm_iounmap |
| 335 | 335 | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 6976b03e5213..8756e4bcdba0 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -347,7 +347,8 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
| 347 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 347 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
| 348 | 348 | ||
| 349 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 349 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
| 350 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) | 350 | #define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \ |
| 351 | && pfn_valid(__pa(kaddr) >> PAGE_SHIFT) ) | ||
| 351 | 352 | ||
| 352 | #endif | 353 | #endif |
| 353 | 354 | ||
diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h index 75579a9d6f76..3759cacdd7f8 100644 --- a/arch/arm/include/asm/xen/page.h +++ b/arch/arm/include/asm/xen/page.h | |||
| @@ -117,6 +117,6 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) | |||
| 117 | return __set_phys_to_machine(pfn, mfn); | 117 | return __set_phys_to_machine(pfn, mfn); |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | #define xen_remap(cookie, size) ioremap_cached((cookie), (size)); | 120 | #define xen_remap(cookie, size) ioremap_cache((cookie), (size)); |
| 121 | 121 | ||
| 122 | #endif /* _ASM_ARM_XEN_PAGE_H */ | 122 | #endif /* _ASM_ARM_XEN_PAGE_H */ |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 7940241f0576..6eda3bf85c52 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -36,7 +36,13 @@ | |||
| 36 | #include <asm/system_misc.h> | 36 | #include <asm/system_misc.h> |
| 37 | #include <asm/opcodes.h> | 37 | #include <asm/opcodes.h> |
| 38 | 38 | ||
| 39 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; | 39 | static const char *handler[]= { |
| 40 | "prefetch abort", | ||
| 41 | "data abort", | ||
| 42 | "address exception", | ||
| 43 | "interrupt", | ||
| 44 | "undefined instruction", | ||
| 45 | }; | ||
| 40 | 46 | ||
| 41 | void *vectors_page; | 47 | void *vectors_page; |
| 42 | 48 | ||
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 9ee78f7b4990..782f6c71fa0a 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c | |||
| @@ -96,11 +96,12 @@ static struct irqaction footbridge_timer_irq = { | |||
| 96 | void __init footbridge_timer_init(void) | 96 | void __init footbridge_timer_init(void) |
| 97 | { | 97 | { |
| 98 | struct clock_event_device *ce = &ckevt_dc21285; | 98 | struct clock_event_device *ce = &ckevt_dc21285; |
| 99 | unsigned rate = DIV_ROUND_CLOSEST(mem_fclk_21285, 16); | ||
| 99 | 100 | ||
| 100 | clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16); | 101 | clocksource_register_hz(&cksrc_dc21285, rate); |
| 101 | 102 | ||
| 102 | setup_irq(ce->irq, &footbridge_timer_irq); | 103 | setup_irq(ce->irq, &footbridge_timer_irq); |
| 103 | 104 | ||
| 104 | ce->cpumask = cpumask_of(smp_processor_id()); | 105 | ce->cpumask = cpumask_of(smp_processor_id()); |
| 105 | clockevents_config_and_register(ce, mem_fclk_21285, 0x4, 0xffffff); | 106 | clockevents_config_and_register(ce, rate, 0x4, 0xffffff); |
| 106 | } | 107 | } |
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 6d5ba9afb16a..3387e60e4ea3 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -175,16 +175,16 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page) | |||
| 175 | unsigned long i; | 175 | unsigned long i; |
| 176 | if (cache_is_vipt_nonaliasing()) { | 176 | if (cache_is_vipt_nonaliasing()) { |
| 177 | for (i = 0; i < (1 << compound_order(page)); i++) { | 177 | for (i = 0; i < (1 << compound_order(page)); i++) { |
| 178 | void *addr = kmap_atomic(page); | 178 | void *addr = kmap_atomic(page + i); |
| 179 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 179 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
| 180 | kunmap_atomic(addr); | 180 | kunmap_atomic(addr); |
| 181 | } | 181 | } |
| 182 | } else { | 182 | } else { |
| 183 | for (i = 0; i < (1 << compound_order(page)); i++) { | 183 | for (i = 0; i < (1 << compound_order(page)); i++) { |
| 184 | void *addr = kmap_high_get(page); | 184 | void *addr = kmap_high_get(page + i); |
| 185 | if (addr) { | 185 | if (addr) { |
| 186 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 186 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
| 187 | kunmap_high(page); | 187 | kunmap_high(page + i); |
| 188 | } | 188 | } |
| 189 | } | 189 | } |
| 190 | } | 190 | } |
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index e562d3caee57..ad7e178337f1 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h | |||
| @@ -262,8 +262,8 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long); | |||
| 262 | extern __must_check long strlen_user(const char __user *str); | 262 | extern __must_check long strlen_user(const char __user *str); |
| 263 | extern __must_check long strnlen_user(const char __user *str, long n); | 263 | extern __must_check long strnlen_user(const char __user *str, long n); |
| 264 | 264 | ||
| 265 | #define __copy_to_user_inatomic ___copy_to_user | 265 | #define __copy_to_user_inatomic __copy_to_user |
| 266 | #define __copy_from_user_inatomic ___copy_from_user | 266 | #define __copy_from_user_inatomic __copy_from_user |
| 267 | 267 | ||
| 268 | struct pt_regs; | 268 | struct pt_regs; |
| 269 | extern unsigned long compute_effective_address(struct pt_regs *, | 269 | extern unsigned long compute_effective_address(struct pt_regs *, |
diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 070ed141aac7..76663b019eb5 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c | |||
| @@ -854,7 +854,7 @@ int dma_supported(struct device *dev, u64 device_mask) | |||
| 854 | return 1; | 854 | return 1; |
| 855 | 855 | ||
| 856 | #ifdef CONFIG_PCI | 856 | #ifdef CONFIG_PCI |
| 857 | if (dev->bus == &pci_bus_type) | 857 | if (dev_is_pci(dev)) |
| 858 | return pci64_dma_supported(to_pci_dev(dev), device_mask); | 858 | return pci64_dma_supported(to_pci_dev(dev), device_mask); |
| 859 | #endif | 859 | #endif |
| 860 | 860 | ||
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index 2096468de9b2..e7e215dfa866 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c | |||
| @@ -666,10 +666,9 @@ EXPORT_SYMBOL(dma_ops); | |||
| 666 | */ | 666 | */ |
| 667 | int dma_supported(struct device *dev, u64 mask) | 667 | int dma_supported(struct device *dev, u64 mask) |
| 668 | { | 668 | { |
| 669 | #ifdef CONFIG_PCI | 669 | if (dev_is_pci(dev)) |
| 670 | if (dev->bus == &pci_bus_type) | ||
| 671 | return 1; | 670 | return 1; |
| 672 | #endif | 671 | |
| 673 | return 0; | 672 | return 0; |
| 674 | } | 673 | } |
| 675 | EXPORT_SYMBOL(dma_supported); | 674 | EXPORT_SYMBOL(dma_supported); |
diff --git a/arch/sparc/kernel/kgdb_64.c b/arch/sparc/kernel/kgdb_64.c index 60b19f50c80a..b45fe3fb4d2c 100644 --- a/arch/sparc/kernel/kgdb_64.c +++ b/arch/sparc/kernel/kgdb_64.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/kgdb.h> | 6 | #include <linux/kgdb.h> |
| 7 | #include <linux/kdebug.h> | 7 | #include <linux/kdebug.h> |
| 8 | #include <linux/ftrace.h> | 8 | #include <linux/ftrace.h> |
| 9 | #include <linux/context_tracking.h> | ||
| 9 | 10 | ||
| 10 | #include <asm/cacheflush.h> | 11 | #include <asm/cacheflush.h> |
| 11 | #include <asm/kdebug.h> | 12 | #include <asm/kdebug.h> |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index b66a5338231e..b085311dcd0e 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
| @@ -123,11 +123,12 @@ void smp_callin(void) | |||
| 123 | rmb(); | 123 | rmb(); |
| 124 | 124 | ||
| 125 | set_cpu_online(cpuid, true); | 125 | set_cpu_online(cpuid, true); |
| 126 | local_irq_enable(); | ||
| 127 | 126 | ||
| 128 | /* idle thread is expected to have preempt disabled */ | 127 | /* idle thread is expected to have preempt disabled */ |
| 129 | preempt_disable(); | 128 | preempt_disable(); |
| 130 | 129 | ||
| 130 | local_irq_enable(); | ||
| 131 | |||
| 131 | cpu_startup_entry(CPUHP_ONLINE); | 132 | cpu_startup_entry(CPUHP_ONLINE); |
| 132 | } | 133 | } |
| 133 | 134 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c index c29b5c838833..cdc7df4fdb8a 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | */ | 31 | */ |
| 32 | 32 | ||
| 33 | #include <linux/netdevice.h> | 33 | #include <linux/netdevice.h> |
| 34 | #include <linux/if_arp.h> /* For ARPHRD_xxx */ | ||
| 34 | #include <linux/module.h> | 35 | #include <linux/module.h> |
| 35 | #include <net/rtnetlink.h> | 36 | #include <net/rtnetlink.h> |
| 36 | #include "ipoib.h" | 37 | #include "ipoib.h" |
| @@ -103,7 +104,7 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev, | |||
| 103 | return -EINVAL; | 104 | return -EINVAL; |
| 104 | 105 | ||
| 105 | pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); | 106 | pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); |
| 106 | if (!pdev) | 107 | if (!pdev || pdev->type != ARPHRD_INFINIBAND) |
| 107 | return -ENODEV; | 108 | return -ENODEV; |
| 108 | 109 | ||
| 109 | ppriv = netdev_priv(pdev); | 110 | ppriv = netdev_priv(pdev); |
diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c index 497bd026c237..4a4825528188 100644 --- a/drivers/isdn/hisax/hfc_pci.c +++ b/drivers/isdn/hisax/hfc_pci.c | |||
| @@ -1643,10 +1643,6 @@ setup_hfcpci(struct IsdnCard *card) | |||
| 1643 | int i; | 1643 | int i; |
| 1644 | struct pci_dev *tmp_hfcpci = NULL; | 1644 | struct pci_dev *tmp_hfcpci = NULL; |
| 1645 | 1645 | ||
| 1646 | #ifdef __BIG_ENDIAN | ||
| 1647 | #error "not running on big endian machines now" | ||
| 1648 | #endif | ||
| 1649 | |||
| 1650 | strcpy(tmp, hfcpci_revision); | 1646 | strcpy(tmp, hfcpci_revision); |
| 1651 | printk(KERN_INFO "HiSax: HFC-PCI driver Rev. %s\n", HiSax_getrev(tmp)); | 1647 | printk(KERN_INFO "HiSax: HFC-PCI driver Rev. %s\n", HiSax_getrev(tmp)); |
| 1652 | 1648 | ||
diff --git a/drivers/isdn/hisax/telespci.c b/drivers/isdn/hisax/telespci.c index f6ab63aa6995..33eeb4602c7e 100644 --- a/drivers/isdn/hisax/telespci.c +++ b/drivers/isdn/hisax/telespci.c | |||
| @@ -290,10 +290,6 @@ int setup_telespci(struct IsdnCard *card) | |||
| 290 | struct IsdnCardState *cs = card->cs; | 290 | struct IsdnCardState *cs = card->cs; |
| 291 | char tmp[64]; | 291 | char tmp[64]; |
| 292 | 292 | ||
| 293 | #ifdef __BIG_ENDIAN | ||
| 294 | #error "not running on big endian machines now" | ||
| 295 | #endif | ||
| 296 | |||
| 297 | strcpy(tmp, telespci_revision); | 293 | strcpy(tmp, telespci_revision); |
| 298 | printk(KERN_INFO "HiSax: Teles/PCI driver Rev. %s\n", HiSax_getrev(tmp)); | 294 | printk(KERN_INFO "HiSax: Teles/PCI driver Rev. %s\n", HiSax_getrev(tmp)); |
| 299 | if (cs->typ != ISDN_CTYPE_TELESPCI) | 295 | if (cs->typ != ISDN_CTYPE_TELESPCI) |
diff --git a/drivers/mtd/maps/pxa2xx-flash.c b/drivers/mtd/maps/pxa2xx-flash.c index d210d131fef2..0f55589a56b8 100644 --- a/drivers/mtd/maps/pxa2xx-flash.c +++ b/drivers/mtd/maps/pxa2xx-flash.c | |||
| @@ -73,7 +73,7 @@ static int pxa2xx_flash_probe(struct platform_device *pdev) | |||
| 73 | return -ENOMEM; | 73 | return -ENOMEM; |
| 74 | } | 74 | } |
| 75 | info->map.cached = | 75 | info->map.cached = |
| 76 | ioremap_cached(info->map.phys, info->map.size); | 76 | ioremap_cache(info->map.phys, info->map.size); |
| 77 | if (!info->map.cached) | 77 | if (!info->map.cached) |
| 78 | printk(KERN_WARNING "Failed to ioremap cached %s\n", | 78 | printk(KERN_WARNING "Failed to ioremap cached %s\n", |
| 79 | info->map.name); | 79 | info->map.name); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index a1f66e2c9a86..2d5fce4c9751 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
| @@ -1250,7 +1250,10 @@ struct bnx2x_slowpath { | |||
| 1250 | * Therefore, if they would have been defined in the same union, | 1250 | * Therefore, if they would have been defined in the same union, |
| 1251 | * data can get corrupted. | 1251 | * data can get corrupted. |
| 1252 | */ | 1252 | */ |
| 1253 | struct afex_vif_list_ramrod_data func_afex_rdata; | 1253 | union { |
| 1254 | struct afex_vif_list_ramrod_data viflist_data; | ||
| 1255 | struct function_update_data func_update; | ||
| 1256 | } func_afex_rdata; | ||
| 1254 | 1257 | ||
| 1255 | /* used by dmae command executer */ | 1258 | /* used by dmae command executer */ |
| 1256 | struct dmae_command dmae[MAX_DMAE_C]; | 1259 | struct dmae_command dmae[MAX_DMAE_C]; |
| @@ -2499,4 +2502,6 @@ void bnx2x_set_local_cmng(struct bnx2x *bp); | |||
| 2499 | #define MCPR_SCRATCH_BASE(bp) \ | 2502 | #define MCPR_SCRATCH_BASE(bp) \ |
| 2500 | (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH) | 2503 | (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH) |
| 2501 | 2504 | ||
| 2505 | #define E1H_MAX_MF_SB_COUNT (HC_SB_MAX_SB_E1X/(E1HVN_MAX * PORT_MAX)) | ||
| 2506 | |||
| 2502 | #endif /* bnx2x.h */ | 2507 | #endif /* bnx2x.h */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index 20dcc02431ca..11fc79585491 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
| @@ -3865,6 +3865,19 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
| 3865 | 3865 | ||
| 3866 | bnx2x_warpcore_enable_AN_KR2(phy, params, vars); | 3866 | bnx2x_warpcore_enable_AN_KR2(phy, params, vars); |
| 3867 | } else { | 3867 | } else { |
| 3868 | /* Enable Auto-Detect to support 1G over CL37 as well */ | ||
| 3869 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3870 | MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, 0x10); | ||
| 3871 | |||
| 3872 | /* Force cl48 sync_status LOW to avoid getting stuck in CL73 | ||
| 3873 | * parallel-detect loop when CL73 and CL37 are enabled. | ||
| 3874 | */ | ||
| 3875 | CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, | ||
| 3876 | MDIO_AER_BLOCK_AER_REG, 0); | ||
| 3877 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3878 | MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI, 0x0800); | ||
| 3879 | bnx2x_set_aer_mmd(params, phy); | ||
| 3880 | |||
| 3868 | bnx2x_disable_kr2(params, vars, phy); | 3881 | bnx2x_disable_kr2(params, vars, phy); |
| 3869 | } | 3882 | } |
| 3870 | 3883 | ||
| @@ -8120,17 +8133,20 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy, | |||
| 8120 | *edc_mode = EDC_MODE_ACTIVE_DAC; | 8133 | *edc_mode = EDC_MODE_ACTIVE_DAC; |
| 8121 | else | 8134 | else |
| 8122 | check_limiting_mode = 1; | 8135 | check_limiting_mode = 1; |
| 8123 | } else if (copper_module_type & | 8136 | } else { |
| 8124 | SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { | 8137 | *edc_mode = EDC_MODE_PASSIVE_DAC; |
| 8138 | /* Even in case PASSIVE_DAC indication is not set, | ||
| 8139 | * treat it as a passive DAC cable, since some cables | ||
| 8140 | * don't have this indication. | ||
| 8141 | */ | ||
| 8142 | if (copper_module_type & | ||
| 8143 | SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { | ||
| 8125 | DP(NETIF_MSG_LINK, | 8144 | DP(NETIF_MSG_LINK, |
| 8126 | "Passive Copper cable detected\n"); | 8145 | "Passive Copper cable detected\n"); |
| 8127 | *edc_mode = | 8146 | } else { |
| 8128 | EDC_MODE_PASSIVE_DAC; | 8147 | DP(NETIF_MSG_LINK, |
| 8129 | } else { | 8148 | "Unknown copper-cable-type\n"); |
| 8130 | DP(NETIF_MSG_LINK, | 8149 | } |
| 8131 | "Unknown copper-cable-type 0x%x !!!\n", | ||
| 8132 | copper_module_type); | ||
| 8133 | return -EINVAL; | ||
| 8134 | } | 8150 | } |
| 8135 | break; | 8151 | break; |
| 8136 | } | 8152 | } |
| @@ -10825,9 +10841,9 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy, | |||
| 10825 | (1<<11)); | 10841 | (1<<11)); |
| 10826 | 10842 | ||
| 10827 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | 10843 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && |
| 10828 | (phy->speed_cap_mask & | 10844 | (phy->speed_cap_mask & |
| 10829 | PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || | 10845 | PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || |
| 10830 | (phy->req_line_speed == SPEED_1000)) { | 10846 | (phy->req_line_speed == SPEED_1000)) { |
| 10831 | an_1000_val |= (1<<8); | 10847 | an_1000_val |= (1<<8); |
| 10832 | autoneg_val |= (1<<9 | 1<<12); | 10848 | autoneg_val |= (1<<9 | 1<<12); |
| 10833 | if (phy->req_duplex == DUPLEX_FULL) | 10849 | if (phy->req_duplex == DUPLEX_FULL) |
| @@ -10843,30 +10859,32 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy, | |||
| 10843 | 0x09, | 10859 | 0x09, |
| 10844 | &an_1000_val); | 10860 | &an_1000_val); |
| 10845 | 10861 | ||
| 10846 | /* Set 100 speed advertisement */ | 10862 | /* Advertise 10/100 link speed */ |
| 10847 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | 10863 | if (phy->req_line_speed == SPEED_AUTO_NEG) { |
| 10848 | (phy->speed_cap_mask & | 10864 | if (phy->speed_cap_mask & |
| 10849 | (PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL | | 10865 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF) { |
| 10850 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF)))) { | 10866 | an_10_100_val |= (1<<5); |
| 10851 | an_10_100_val |= (1<<7); | 10867 | autoneg_val |= (1<<9 | 1<<12); |
| 10852 | /* Enable autoneg and restart autoneg for legacy speeds */ | 10868 | DP(NETIF_MSG_LINK, "Advertising 10M-HD\n"); |
| 10853 | autoneg_val |= (1<<9 | 1<<12); | 10869 | } |
| 10854 | 10870 | if (phy->speed_cap_mask & | |
| 10855 | if (phy->req_duplex == DUPLEX_FULL) | 10871 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL) { |
| 10856 | an_10_100_val |= (1<<8); | ||
| 10857 | DP(NETIF_MSG_LINK, "Advertising 100M\n"); | ||
| 10858 | } | ||
| 10859 | |||
| 10860 | /* Set 10 speed advertisement */ | ||
| 10861 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | ||
| 10862 | (phy->speed_cap_mask & | ||
| 10863 | (PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL | | ||
| 10864 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF)))) { | ||
| 10865 | an_10_100_val |= (1<<5); | ||
| 10866 | autoneg_val |= (1<<9 | 1<<12); | ||
| 10867 | if (phy->req_duplex == DUPLEX_FULL) | ||
| 10868 | an_10_100_val |= (1<<6); | 10872 | an_10_100_val |= (1<<6); |
| 10869 | DP(NETIF_MSG_LINK, "Advertising 10M\n"); | 10873 | autoneg_val |= (1<<9 | 1<<12); |
| 10874 | DP(NETIF_MSG_LINK, "Advertising 10M-FD\n"); | ||
| 10875 | } | ||
| 10876 | if (phy->speed_cap_mask & | ||
| 10877 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF) { | ||
| 10878 | an_10_100_val |= (1<<7); | ||
| 10879 | autoneg_val |= (1<<9 | 1<<12); | ||
| 10880 | DP(NETIF_MSG_LINK, "Advertising 100M-HD\n"); | ||
| 10881 | } | ||
| 10882 | if (phy->speed_cap_mask & | ||
| 10883 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL) { | ||
| 10884 | an_10_100_val |= (1<<8); | ||
| 10885 | autoneg_val |= (1<<9 | 1<<12); | ||
| 10886 | DP(NETIF_MSG_LINK, "Advertising 100M-FD\n"); | ||
| 10887 | } | ||
| 10870 | } | 10888 | } |
| 10871 | 10889 | ||
| 10872 | /* Only 10/100 are allowed to work in FORCE mode */ | 10890 | /* Only 10/100 are allowed to work in FORCE mode */ |
| @@ -13342,6 +13360,10 @@ static u8 bnx2x_analyze_link_error(struct link_params *params, | |||
| 13342 | DP(NETIF_MSG_LINK, "Link changed:[%x %x]->%x\n", vars->link_up, | 13360 | DP(NETIF_MSG_LINK, "Link changed:[%x %x]->%x\n", vars->link_up, |
| 13343 | old_status, status); | 13361 | old_status, status); |
| 13344 | 13362 | ||
| 13363 | /* Do not touch the link in case physical link down */ | ||
| 13364 | if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0) | ||
| 13365 | return 1; | ||
| 13366 | |||
| 13345 | /* a. Update shmem->link_status accordingly | 13367 | /* a. Update shmem->link_status accordingly |
| 13346 | * b. Update link_vars->link_up | 13368 | * b. Update link_vars->link_up |
| 13347 | */ | 13369 | */ |
| @@ -13550,7 +13572,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params, | |||
| 13550 | */ | 13572 | */ |
| 13551 | not_kr2_device = (((base_page & 0x8000) == 0) || | 13573 | not_kr2_device = (((base_page & 0x8000) == 0) || |
| 13552 | (((base_page & 0x8000) && | 13574 | (((base_page & 0x8000) && |
| 13553 | ((next_page & 0xe0) == 0x2)))); | 13575 | ((next_page & 0xe0) == 0x20)))); |
| 13554 | 13576 | ||
| 13555 | /* In case KR2 is already disabled, check if we need to re-enable it */ | 13577 | /* In case KR2 is already disabled, check if we need to re-enable it */ |
| 13556 | if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { | 13578 | if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 814d0eca9b33..8b3107b2fcc1 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -11447,9 +11447,9 @@ static int bnx2x_get_hwinfo(struct bnx2x *bp) | |||
| 11447 | } | 11447 | } |
| 11448 | } | 11448 | } |
| 11449 | 11449 | ||
| 11450 | /* adjust igu_sb_cnt to MF for E1x */ | 11450 | /* adjust igu_sb_cnt to MF for E1H */ |
| 11451 | if (CHIP_IS_E1x(bp) && IS_MF(bp)) | 11451 | if (CHIP_IS_E1H(bp) && IS_MF(bp)) |
| 11452 | bp->igu_sb_cnt /= E1HVN_MAX; | 11452 | bp->igu_sb_cnt = min_t(u8, bp->igu_sb_cnt, E1H_MAX_MF_SB_COUNT); |
| 11453 | 11453 | ||
| 11454 | /* port info */ | 11454 | /* port info */ |
| 11455 | bnx2x_get_port_hwinfo(bp); | 11455 | bnx2x_get_port_hwinfo(bp); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index 3efbb35267c8..14ffb6e56e59 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | |||
| @@ -7179,6 +7179,7 @@ Theotherbitsarereservedandshouldbezero*/ | |||
| 7179 | #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca | 7179 | #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca |
| 7180 | #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da | 7180 | #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da |
| 7181 | #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea | 7181 | #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea |
| 7182 | #define MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI 0x80fa | ||
| 7182 | #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 | 7183 | #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 |
| 7183 | #define MDIO_WC_REG_XGXS_STATUS3 0x8129 | 7184 | #define MDIO_WC_REG_XGXS_STATUS3 0x8129 |
| 7184 | #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 | 7185 | #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 32c92abf5094..18438a504d57 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
| @@ -2038,6 +2038,7 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
| 2038 | struct bnx2x_vlan_mac_ramrod_params p; | 2038 | struct bnx2x_vlan_mac_ramrod_params p; |
| 2039 | struct bnx2x_exe_queue_obj *exeq = &o->exe_queue; | 2039 | struct bnx2x_exe_queue_obj *exeq = &o->exe_queue; |
| 2040 | struct bnx2x_exeq_elem *exeq_pos, *exeq_pos_n; | 2040 | struct bnx2x_exeq_elem *exeq_pos, *exeq_pos_n; |
| 2041 | unsigned long flags; | ||
| 2041 | int read_lock; | 2042 | int read_lock; |
| 2042 | int rc = 0; | 2043 | int rc = 0; |
| 2043 | 2044 | ||
| @@ -2046,8 +2047,9 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
| 2046 | spin_lock_bh(&exeq->lock); | 2047 | spin_lock_bh(&exeq->lock); |
| 2047 | 2048 | ||
| 2048 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { | 2049 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { |
| 2049 | if (exeq_pos->cmd_data.vlan_mac.vlan_mac_flags == | 2050 | flags = exeq_pos->cmd_data.vlan_mac.vlan_mac_flags; |
| 2050 | *vlan_mac_flags) { | 2051 | if (BNX2X_VLAN_MAC_CMP_FLAGS(flags) == |
| 2052 | BNX2X_VLAN_MAC_CMP_FLAGS(*vlan_mac_flags)) { | ||
| 2051 | rc = exeq->remove(bp, exeq->owner, exeq_pos); | 2053 | rc = exeq->remove(bp, exeq->owner, exeq_pos); |
| 2052 | if (rc) { | 2054 | if (rc) { |
| 2053 | BNX2X_ERR("Failed to remove command\n"); | 2055 | BNX2X_ERR("Failed to remove command\n"); |
| @@ -2080,7 +2082,9 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
| 2080 | return read_lock; | 2082 | return read_lock; |
| 2081 | 2083 | ||
| 2082 | list_for_each_entry(pos, &o->head, link) { | 2084 | list_for_each_entry(pos, &o->head, link) { |
| 2083 | if (pos->vlan_mac_flags == *vlan_mac_flags) { | 2085 | flags = pos->vlan_mac_flags; |
| 2086 | if (BNX2X_VLAN_MAC_CMP_FLAGS(flags) == | ||
| 2087 | BNX2X_VLAN_MAC_CMP_FLAGS(*vlan_mac_flags)) { | ||
| 2084 | p.user_req.vlan_mac_flags = pos->vlan_mac_flags; | 2088 | p.user_req.vlan_mac_flags = pos->vlan_mac_flags; |
| 2085 | memcpy(&p.user_req.u, &pos->u, sizeof(pos->u)); | 2089 | memcpy(&p.user_req.u, &pos->u, sizeof(pos->u)); |
| 2086 | rc = bnx2x_config_vlan_mac(bp, &p); | 2090 | rc = bnx2x_config_vlan_mac(bp, &p); |
| @@ -4382,8 +4386,11 @@ int bnx2x_config_rss(struct bnx2x *bp, | |||
| 4382 | struct bnx2x_raw_obj *r = &o->raw; | 4386 | struct bnx2x_raw_obj *r = &o->raw; |
| 4383 | 4387 | ||
| 4384 | /* Do nothing if only driver cleanup was requested */ | 4388 | /* Do nothing if only driver cleanup was requested */ |
| 4385 | if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) | 4389 | if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) { |
| 4390 | DP(BNX2X_MSG_SP, "Not configuring RSS ramrod_flags=%lx\n", | ||
| 4391 | p->ramrod_flags); | ||
| 4386 | return 0; | 4392 | return 0; |
| 4393 | } | ||
| 4387 | 4394 | ||
| 4388 | r->set_pending(r); | 4395 | r->set_pending(r); |
| 4389 | 4396 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h index 658f4e33abf9..6a53c15c85a3 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h | |||
| @@ -266,6 +266,13 @@ enum { | |||
| 266 | BNX2X_DONT_CONSUME_CAM_CREDIT, | 266 | BNX2X_DONT_CONSUME_CAM_CREDIT, |
| 267 | BNX2X_DONT_CONSUME_CAM_CREDIT_DEST, | 267 | BNX2X_DONT_CONSUME_CAM_CREDIT_DEST, |
| 268 | }; | 268 | }; |
| 269 | /* When looking for matching filters, some flags are not interesting */ | ||
| 270 | #define BNX2X_VLAN_MAC_CMP_MASK (1 << BNX2X_UC_LIST_MAC | \ | ||
| 271 | 1 << BNX2X_ETH_MAC | \ | ||
| 272 | 1 << BNX2X_ISCSI_ETH_MAC | \ | ||
| 273 | 1 << BNX2X_NETQ_ETH_MAC) | ||
| 274 | #define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \ | ||
| 275 | ((flags) & BNX2X_VLAN_MAC_CMP_MASK) | ||
| 269 | 276 | ||
| 270 | struct bnx2x_vlan_mac_ramrod_params { | 277 | struct bnx2x_vlan_mac_ramrod_params { |
| 271 | /* Object to run the command from */ | 278 | /* Object to run the command from */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c index 2e46c28fc601..e7845e5be1c7 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | |||
| @@ -1209,6 +1209,11 @@ static void bnx2x_vfop_rxmode(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
| 1209 | /* next state */ | 1209 | /* next state */ |
| 1210 | vfop->state = BNX2X_VFOP_RXMODE_DONE; | 1210 | vfop->state = BNX2X_VFOP_RXMODE_DONE; |
| 1211 | 1211 | ||
| 1212 | /* record the accept flags in vfdb so hypervisor can modify them | ||
| 1213 | * if necessary | ||
| 1214 | */ | ||
| 1215 | bnx2x_vfq(vf, ramrod->cl_id - vf->igu_base_id, accept_flags) = | ||
| 1216 | ramrod->rx_accept_flags; | ||
| 1212 | vfop->rc = bnx2x_config_rx_mode(bp, ramrod); | 1217 | vfop->rc = bnx2x_config_rx_mode(bp, ramrod); |
| 1213 | bnx2x_vfop_finalize(vf, vfop->rc, VFOP_DONE); | 1218 | bnx2x_vfop_finalize(vf, vfop->rc, VFOP_DONE); |
| 1214 | op_err: | 1219 | op_err: |
| @@ -1224,39 +1229,43 @@ op_pending: | |||
| 1224 | return; | 1229 | return; |
| 1225 | } | 1230 | } |
| 1226 | 1231 | ||
| 1232 | static void bnx2x_vf_prep_rx_mode(struct bnx2x *bp, u8 qid, | ||
| 1233 | struct bnx2x_rx_mode_ramrod_params *ramrod, | ||
| 1234 | struct bnx2x_virtf *vf, | ||
| 1235 | unsigned long accept_flags) | ||
| 1236 | { | ||
| 1237 | struct bnx2x_vf_queue *vfq = vfq_get(vf, qid); | ||
| 1238 | |||
| 1239 | memset(ramrod, 0, sizeof(*ramrod)); | ||
| 1240 | ramrod->cid = vfq->cid; | ||
| 1241 | ramrod->cl_id = vfq_cl_id(vf, vfq); | ||
| 1242 | ramrod->rx_mode_obj = &bp->rx_mode_obj; | ||
| 1243 | ramrod->func_id = FW_VF_HANDLE(vf->abs_vfid); | ||
| 1244 | ramrod->rx_accept_flags = accept_flags; | ||
| 1245 | ramrod->tx_accept_flags = accept_flags; | ||
| 1246 | ramrod->pstate = &vf->filter_state; | ||
| 1247 | ramrod->state = BNX2X_FILTER_RX_MODE_PENDING; | ||
| 1248 | |||
| 1249 | set_bit(BNX2X_FILTER_RX_MODE_PENDING, &vf->filter_state); | ||
| 1250 | set_bit(RAMROD_RX, &ramrod->ramrod_flags); | ||
| 1251 | set_bit(RAMROD_TX, &ramrod->ramrod_flags); | ||
| 1252 | |||
| 1253 | ramrod->rdata = bnx2x_vf_sp(bp, vf, rx_mode_rdata.e2); | ||
| 1254 | ramrod->rdata_mapping = bnx2x_vf_sp_map(bp, vf, rx_mode_rdata.e2); | ||
| 1255 | } | ||
| 1256 | |||
| 1227 | int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, | 1257 | int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, |
| 1228 | struct bnx2x_virtf *vf, | 1258 | struct bnx2x_virtf *vf, |
| 1229 | struct bnx2x_vfop_cmd *cmd, | 1259 | struct bnx2x_vfop_cmd *cmd, |
| 1230 | int qid, unsigned long accept_flags) | 1260 | int qid, unsigned long accept_flags) |
| 1231 | { | 1261 | { |
| 1232 | struct bnx2x_vf_queue *vfq = vfq_get(vf, qid); | ||
| 1233 | struct bnx2x_vfop *vfop = bnx2x_vfop_add(bp, vf); | 1262 | struct bnx2x_vfop *vfop = bnx2x_vfop_add(bp, vf); |
| 1234 | 1263 | ||
| 1235 | if (vfop) { | 1264 | if (vfop) { |
| 1236 | struct bnx2x_rx_mode_ramrod_params *ramrod = | 1265 | struct bnx2x_rx_mode_ramrod_params *ramrod = |
| 1237 | &vf->op_params.rx_mode; | 1266 | &vf->op_params.rx_mode; |
| 1238 | 1267 | ||
| 1239 | memset(ramrod, 0, sizeof(*ramrod)); | 1268 | bnx2x_vf_prep_rx_mode(bp, qid, ramrod, vf, accept_flags); |
| 1240 | |||
| 1241 | /* Prepare ramrod parameters */ | ||
| 1242 | ramrod->cid = vfq->cid; | ||
| 1243 | ramrod->cl_id = vfq_cl_id(vf, vfq); | ||
| 1244 | ramrod->rx_mode_obj = &bp->rx_mode_obj; | ||
| 1245 | ramrod->func_id = FW_VF_HANDLE(vf->abs_vfid); | ||
| 1246 | |||
| 1247 | ramrod->rx_accept_flags = accept_flags; | ||
| 1248 | ramrod->tx_accept_flags = accept_flags; | ||
| 1249 | ramrod->pstate = &vf->filter_state; | ||
| 1250 | ramrod->state = BNX2X_FILTER_RX_MODE_PENDING; | ||
| 1251 | |||
| 1252 | set_bit(BNX2X_FILTER_RX_MODE_PENDING, &vf->filter_state); | ||
| 1253 | set_bit(RAMROD_RX, &ramrod->ramrod_flags); | ||
| 1254 | set_bit(RAMROD_TX, &ramrod->ramrod_flags); | ||
| 1255 | |||
| 1256 | ramrod->rdata = | ||
| 1257 | bnx2x_vf_sp(bp, vf, rx_mode_rdata.e2); | ||
| 1258 | ramrod->rdata_mapping = | ||
| 1259 | bnx2x_vf_sp_map(bp, vf, rx_mode_rdata.e2); | ||
| 1260 | 1269 | ||
| 1261 | bnx2x_vfop_opset(BNX2X_VFOP_RXMODE_CONFIG, | 1270 | bnx2x_vfop_opset(BNX2X_VFOP_RXMODE_CONFIG, |
| 1262 | bnx2x_vfop_rxmode, cmd->done); | 1271 | bnx2x_vfop_rxmode, cmd->done); |
| @@ -3202,13 +3211,16 @@ int bnx2x_enable_sriov(struct bnx2x *bp) | |||
| 3202 | bnx2x_iov_static_resc(bp, vf); | 3211 | bnx2x_iov_static_resc(bp, vf); |
| 3203 | } | 3212 | } |
| 3204 | 3213 | ||
| 3205 | /* prepare msix vectors in VF configuration space */ | 3214 | /* prepare msix vectors in VF configuration space - the value in the |
| 3215 | * PCI configuration space should be the index of the last entry, | ||
| 3216 | * namely one less than the actual size of the table | ||
| 3217 | */ | ||
| 3206 | for (vf_idx = first_vf; vf_idx < first_vf + req_vfs; vf_idx++) { | 3218 | for (vf_idx = first_vf; vf_idx < first_vf + req_vfs; vf_idx++) { |
| 3207 | bnx2x_pretend_func(bp, HW_VF_HANDLE(bp, vf_idx)); | 3219 | bnx2x_pretend_func(bp, HW_VF_HANDLE(bp, vf_idx)); |
| 3208 | REG_WR(bp, PCICFG_OFFSET + GRC_CONFIG_REG_VF_MSIX_CONTROL, | 3220 | REG_WR(bp, PCICFG_OFFSET + GRC_CONFIG_REG_VF_MSIX_CONTROL, |
| 3209 | num_vf_queues); | 3221 | num_vf_queues - 1); |
| 3210 | DP(BNX2X_MSG_IOV, "set msix vec num in VF %d cfg space to %d\n", | 3222 | DP(BNX2X_MSG_IOV, "set msix vec num in VF %d cfg space to %d\n", |
| 3211 | vf_idx, num_vf_queues); | 3223 | vf_idx, num_vf_queues - 1); |
| 3212 | } | 3224 | } |
| 3213 | bnx2x_pretend_func(bp, BP_ABS_FUNC(bp)); | 3225 | bnx2x_pretend_func(bp, BP_ABS_FUNC(bp)); |
| 3214 | 3226 | ||
| @@ -3436,10 +3448,18 @@ out: | |||
| 3436 | 3448 | ||
| 3437 | int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) | 3449 | int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) |
| 3438 | { | 3450 | { |
| 3451 | struct bnx2x_queue_state_params q_params = {NULL}; | ||
| 3452 | struct bnx2x_vlan_mac_ramrod_params ramrod_param; | ||
| 3453 | struct bnx2x_queue_update_params *update_params; | ||
| 3454 | struct pf_vf_bulletin_content *bulletin = NULL; | ||
| 3455 | struct bnx2x_rx_mode_ramrod_params rx_ramrod; | ||
| 3439 | struct bnx2x *bp = netdev_priv(dev); | 3456 | struct bnx2x *bp = netdev_priv(dev); |
| 3440 | int rc, q_logical_state; | 3457 | struct bnx2x_vlan_mac_obj *vlan_obj; |
| 3458 | unsigned long vlan_mac_flags = 0; | ||
| 3459 | unsigned long ramrod_flags = 0; | ||
| 3441 | struct bnx2x_virtf *vf = NULL; | 3460 | struct bnx2x_virtf *vf = NULL; |
| 3442 | struct pf_vf_bulletin_content *bulletin = NULL; | 3461 | unsigned long accept_flags; |
| 3462 | int rc; | ||
| 3443 | 3463 | ||
| 3444 | /* sanity and init */ | 3464 | /* sanity and init */ |
| 3445 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); | 3465 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); |
| @@ -3457,104 +3477,118 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) | |||
| 3457 | /* update PF's copy of the VF's bulletin. No point in posting the vlan | 3477 | /* update PF's copy of the VF's bulletin. No point in posting the vlan |
| 3458 | * to the VF since it doesn't have anything to do with it. But it useful | 3478 | * to the VF since it doesn't have anything to do with it. But it useful |
| 3459 | * to store it here in case the VF is not up yet and we can only | 3479 | * to store it here in case the VF is not up yet and we can only |
| 3460 | * configure the vlan later when it does. | 3480 | * configure the vlan later when it does. Treat vlan id 0 as remove the |
| 3481 | * Host tag. | ||
| 3461 | */ | 3482 | */ |
| 3462 | bulletin->valid_bitmap |= 1 << VLAN_VALID; | 3483 | if (vlan > 0) |
| 3484 | bulletin->valid_bitmap |= 1 << VLAN_VALID; | ||
| 3485 | else | ||
| 3486 | bulletin->valid_bitmap &= ~(1 << VLAN_VALID); | ||
| 3463 | bulletin->vlan = vlan; | 3487 | bulletin->vlan = vlan; |
| 3464 | 3488 | ||
| 3465 | /* is vf initialized and queue set up? */ | 3489 | /* is vf initialized and queue set up? */ |
| 3466 | q_logical_state = | 3490 | if (vf->state != VF_ENABLED || |
| 3467 | bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)); | 3491 | bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)) != |
| 3468 | if (vf->state == VF_ENABLED && | 3492 | BNX2X_Q_LOGICAL_STATE_ACTIVE) |
| 3469 | q_logical_state == BNX2X_Q_LOGICAL_STATE_ACTIVE) { | 3493 | return rc; |
| 3470 | /* configure the vlan in device on this vf's queue */ | ||
| 3471 | unsigned long ramrod_flags = 0; | ||
| 3472 | unsigned long vlan_mac_flags = 0; | ||
| 3473 | struct bnx2x_vlan_mac_obj *vlan_obj = | ||
| 3474 | &bnx2x_leading_vfq(vf, vlan_obj); | ||
| 3475 | struct bnx2x_vlan_mac_ramrod_params ramrod_param; | ||
| 3476 | struct bnx2x_queue_state_params q_params = {NULL}; | ||
| 3477 | struct bnx2x_queue_update_params *update_params; | ||
| 3478 | 3494 | ||
| 3479 | rc = validate_vlan_mac(bp, &bnx2x_leading_vfq(vf, mac_obj)); | 3495 | /* configure the vlan in device on this vf's queue */ |
| 3480 | if (rc) | 3496 | vlan_obj = &bnx2x_leading_vfq(vf, vlan_obj); |
| 3481 | return rc; | 3497 | rc = validate_vlan_mac(bp, &bnx2x_leading_vfq(vf, mac_obj)); |
| 3482 | memset(&ramrod_param, 0, sizeof(ramrod_param)); | 3498 | if (rc) |
| 3499 | return rc; | ||
| 3483 | 3500 | ||
| 3484 | /* must lock vfpf channel to protect against vf flows */ | 3501 | /* must lock vfpf channel to protect against vf flows */ |
| 3485 | bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); | 3502 | bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); |
| 3486 | 3503 | ||
| 3487 | /* remove existing vlans */ | 3504 | /* remove existing vlans */ |
| 3488 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | 3505 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); |
| 3489 | rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_mac_flags, | 3506 | rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_mac_flags, |
| 3490 | &ramrod_flags); | 3507 | &ramrod_flags); |
| 3491 | if (rc) { | 3508 | if (rc) { |
| 3492 | BNX2X_ERR("failed to delete vlans\n"); | 3509 | BNX2X_ERR("failed to delete vlans\n"); |
| 3493 | rc = -EINVAL; | 3510 | rc = -EINVAL; |
| 3494 | goto out; | 3511 | goto out; |
| 3495 | } | 3512 | } |
| 3513 | |||
| 3514 | /* need to remove/add the VF's accept_any_vlan bit */ | ||
| 3515 | accept_flags = bnx2x_leading_vfq(vf, accept_flags); | ||
| 3516 | if (vlan) | ||
| 3517 | clear_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags); | ||
| 3518 | else | ||
| 3519 | set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags); | ||
| 3520 | |||
| 3521 | bnx2x_vf_prep_rx_mode(bp, LEADING_IDX, &rx_ramrod, vf, | ||
| 3522 | accept_flags); | ||
| 3523 | bnx2x_leading_vfq(vf, accept_flags) = accept_flags; | ||
| 3524 | bnx2x_config_rx_mode(bp, &rx_ramrod); | ||
| 3525 | |||
| 3526 | /* configure the new vlan to device */ | ||
| 3527 | memset(&ramrod_param, 0, sizeof(ramrod_param)); | ||
| 3528 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | ||
| 3529 | ramrod_param.vlan_mac_obj = vlan_obj; | ||
| 3530 | ramrod_param.ramrod_flags = ramrod_flags; | ||
| 3531 | set_bit(BNX2X_DONT_CONSUME_CAM_CREDIT, | ||
| 3532 | &ramrod_param.user_req.vlan_mac_flags); | ||
| 3533 | ramrod_param.user_req.u.vlan.vlan = vlan; | ||
| 3534 | ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD; | ||
| 3535 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); | ||
| 3536 | if (rc) { | ||
| 3537 | BNX2X_ERR("failed to configure vlan\n"); | ||
| 3538 | rc = -EINVAL; | ||
| 3539 | goto out; | ||
| 3540 | } | ||
| 3496 | 3541 | ||
| 3497 | /* send queue update ramrod to configure default vlan and silent | 3542 | /* send queue update ramrod to configure default vlan and silent |
| 3498 | * vlan removal | 3543 | * vlan removal |
| 3544 | */ | ||
| 3545 | __set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags); | ||
| 3546 | q_params.cmd = BNX2X_Q_CMD_UPDATE; | ||
| 3547 | q_params.q_obj = &bnx2x_leading_vfq(vf, sp_obj); | ||
| 3548 | update_params = &q_params.params.update; | ||
| 3549 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG, | ||
| 3550 | &update_params->update_flags); | ||
| 3551 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG, | ||
| 3552 | &update_params->update_flags); | ||
| 3553 | if (vlan == 0) { | ||
| 3554 | /* if vlan is 0 then we want to leave the VF traffic | ||
| 3555 | * untagged, and leave the incoming traffic untouched | ||
| 3556 | * (i.e. do not remove any vlan tags). | ||
| 3499 | */ | 3557 | */ |
| 3500 | __set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags); | 3558 | __clear_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, |
| 3501 | q_params.cmd = BNX2X_Q_CMD_UPDATE; | 3559 | &update_params->update_flags); |
| 3502 | q_params.q_obj = &bnx2x_leading_vfq(vf, sp_obj); | 3560 | __clear_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, |
| 3503 | update_params = &q_params.params.update; | 3561 | &update_params->update_flags); |
| 3504 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG, | 3562 | } else { |
| 3563 | /* configure default vlan to vf queue and set silent | ||
| 3564 | * vlan removal (the vf remains unaware of this vlan). | ||
| 3565 | */ | ||
| 3566 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | ||
| 3505 | &update_params->update_flags); | 3567 | &update_params->update_flags); |
| 3506 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG, | 3568 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, |
| 3507 | &update_params->update_flags); | 3569 | &update_params->update_flags); |
| 3570 | update_params->def_vlan = vlan; | ||
| 3571 | update_params->silent_removal_value = | ||
| 3572 | vlan & VLAN_VID_MASK; | ||
| 3573 | update_params->silent_removal_mask = VLAN_VID_MASK; | ||
| 3574 | } | ||
| 3508 | 3575 | ||
| 3509 | if (vlan == 0) { | 3576 | /* Update the Queue state */ |
| 3510 | /* if vlan is 0 then we want to leave the VF traffic | 3577 | rc = bnx2x_queue_state_change(bp, &q_params); |
| 3511 | * untagged, and leave the incoming traffic untouched | 3578 | if (rc) { |
| 3512 | * (i.e. do not remove any vlan tags). | 3579 | BNX2X_ERR("Failed to configure default VLAN\n"); |
| 3513 | */ | 3580 | goto out; |
| 3514 | __clear_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | 3581 | } |
| 3515 | &update_params->update_flags); | ||
| 3516 | __clear_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, | ||
| 3517 | &update_params->update_flags); | ||
| 3518 | } else { | ||
| 3519 | /* configure the new vlan to device */ | ||
| 3520 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | ||
| 3521 | ramrod_param.vlan_mac_obj = vlan_obj; | ||
| 3522 | ramrod_param.ramrod_flags = ramrod_flags; | ||
| 3523 | ramrod_param.user_req.u.vlan.vlan = vlan; | ||
| 3524 | ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD; | ||
| 3525 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); | ||
| 3526 | if (rc) { | ||
| 3527 | BNX2X_ERR("failed to configure vlan\n"); | ||
| 3528 | rc = -EINVAL; | ||
| 3529 | goto out; | ||
| 3530 | } | ||
| 3531 | |||
| 3532 | /* configure default vlan to vf queue and set silent | ||
| 3533 | * vlan removal (the vf remains unaware of this vlan). | ||
| 3534 | */ | ||
| 3535 | update_params = &q_params.params.update; | ||
| 3536 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | ||
| 3537 | &update_params->update_flags); | ||
| 3538 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, | ||
| 3539 | &update_params->update_flags); | ||
| 3540 | update_params->def_vlan = vlan; | ||
| 3541 | } | ||
| 3542 | 3582 | ||
| 3543 | /* Update the Queue state */ | ||
| 3544 | rc = bnx2x_queue_state_change(bp, &q_params); | ||
| 3545 | if (rc) { | ||
| 3546 | BNX2X_ERR("Failed to configure default VLAN\n"); | ||
| 3547 | goto out; | ||
| 3548 | } | ||
| 3549 | 3583 | ||
| 3550 | /* clear the flag indicating that this VF needs its vlan | 3584 | /* clear the flag indicating that this VF needs its vlan |
| 3551 | * (will only be set if the HV configured the Vlan before vf was | 3585 | * (will only be set if the HV configured the Vlan before vf was |
| 3552 | * up and we were called because the VF came up later | 3586 | * up and we were called because the VF came up later |
| 3553 | */ | 3587 | */ |
| 3554 | out: | 3588 | out: |
| 3555 | vf->cfg_flags &= ~VF_CFG_VLAN; | 3589 | vf->cfg_flags &= ~VF_CFG_VLAN; |
| 3556 | bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); | 3590 | bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); |
| 3557 | } | 3591 | |
| 3558 | return rc; | 3592 | return rc; |
| 3559 | } | 3593 | } |
| 3560 | 3594 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h index 1ff6a9366629..8c213fa52174 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h | |||
| @@ -74,6 +74,7 @@ struct bnx2x_vf_queue { | |||
| 74 | /* VLANs object */ | 74 | /* VLANs object */ |
| 75 | struct bnx2x_vlan_mac_obj vlan_obj; | 75 | struct bnx2x_vlan_mac_obj vlan_obj; |
| 76 | atomic_t vlan_count; /* 0 means vlan-0 is set ~ untagged */ | 76 | atomic_t vlan_count; /* 0 means vlan-0 is set ~ untagged */ |
| 77 | unsigned long accept_flags; /* last accept flags configured */ | ||
| 77 | 78 | ||
| 78 | /* Queue Slow-path State object */ | 79 | /* Queue Slow-path State object */ |
| 79 | struct bnx2x_queue_sp_obj sp_obj; | 80 | struct bnx2x_queue_sp_obj sp_obj; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c index 3dc2537fe91b..0756d7dabdd5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | |||
| @@ -1598,6 +1598,8 @@ static void bnx2x_vfop_mbx_qfilters(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
| 1598 | 1598 | ||
| 1599 | if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) { | 1599 | if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) { |
| 1600 | unsigned long accept = 0; | 1600 | unsigned long accept = 0; |
| 1601 | struct pf_vf_bulletin_content *bulletin = | ||
| 1602 | BP_VF_BULLETIN(bp, vf->index); | ||
| 1601 | 1603 | ||
| 1602 | /* covert VF-PF if mask to bnx2x accept flags */ | 1604 | /* covert VF-PF if mask to bnx2x accept flags */ |
| 1603 | if (msg->rx_mask & VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST) | 1605 | if (msg->rx_mask & VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST) |
| @@ -1617,9 +1619,11 @@ static void bnx2x_vfop_mbx_qfilters(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
| 1617 | __set_bit(BNX2X_ACCEPT_BROADCAST, &accept); | 1619 | __set_bit(BNX2X_ACCEPT_BROADCAST, &accept); |
| 1618 | 1620 | ||
| 1619 | /* A packet arriving the vf's mac should be accepted | 1621 | /* A packet arriving the vf's mac should be accepted |
| 1620 | * with any vlan | 1622 | * with any vlan, unless a vlan has already been |
| 1623 | * configured. | ||
| 1621 | */ | 1624 | */ |
| 1622 | __set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept); | 1625 | if (!(bulletin->valid_bitmap & (1 << VLAN_VALID))) |
| 1626 | __set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept); | ||
| 1623 | 1627 | ||
| 1624 | /* set rx-mode */ | 1628 | /* set rx-mode */ |
| 1625 | rc = bnx2x_vfop_rxmode_cmd(bp, vf, &cmd, | 1629 | rc = bnx2x_vfop_rxmode_cmd(bp, vf, &cmd, |
| @@ -1710,6 +1714,21 @@ static void bnx2x_vf_mbx_set_q_filters(struct bnx2x *bp, | |||
| 1710 | goto response; | 1714 | goto response; |
| 1711 | } | 1715 | } |
| 1712 | } | 1716 | } |
| 1717 | /* if vlan was set by hypervisor we don't allow guest to config vlan */ | ||
| 1718 | if (bulletin->valid_bitmap & 1 << VLAN_VALID) { | ||
| 1719 | int i; | ||
| 1720 | |||
| 1721 | /* search for vlan filters */ | ||
| 1722 | for (i = 0; i < filters->n_mac_vlan_filters; i++) { | ||
| 1723 | if (filters->filters[i].flags & | ||
| 1724 | VFPF_Q_FILTER_VLAN_TAG_VALID) { | ||
| 1725 | BNX2X_ERR("VF[%d] attempted to configure vlan but one was already set by Hypervisor. Aborting request\n", | ||
| 1726 | vf->abs_vfid); | ||
| 1727 | vf->op_rc = -EPERM; | ||
| 1728 | goto response; | ||
| 1729 | } | ||
| 1730 | } | ||
| 1731 | } | ||
| 1713 | 1732 | ||
| 1714 | /* verify vf_qid */ | 1733 | /* verify vf_qid */ |
| 1715 | if (filters->vf_qid > vf_rxq_count(vf)) | 1734 | if (filters->vf_qid > vf_rxq_count(vf)) |
| @@ -1805,6 +1824,9 @@ static void bnx2x_vf_mbx_update_rss(struct bnx2x *bp, struct bnx2x_virtf *vf, | |||
| 1805 | vf_op_params->rss_result_mask = rss_tlv->rss_result_mask; | 1824 | vf_op_params->rss_result_mask = rss_tlv->rss_result_mask; |
| 1806 | 1825 | ||
| 1807 | /* flags handled individually for backward/forward compatability */ | 1826 | /* flags handled individually for backward/forward compatability */ |
| 1827 | vf_op_params->rss_flags = 0; | ||
| 1828 | vf_op_params->ramrod_flags = 0; | ||
| 1829 | |||
| 1808 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_DISABLED) | 1830 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_DISABLED) |
| 1809 | __set_bit(BNX2X_RSS_MODE_DISABLED, &vf_op_params->rss_flags); | 1831 | __set_bit(BNX2X_RSS_MODE_DISABLED, &vf_op_params->rss_flags); |
| 1810 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_REGULAR) | 1832 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_REGULAR) |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index cc380c36e1a8..cc3511a5cd0c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c | |||
| @@ -2581,7 +2581,7 @@ static int t4_sge_init_soft(struct adapter *adap) | |||
| 2581 | #undef READ_FL_BUF | 2581 | #undef READ_FL_BUF |
| 2582 | 2582 | ||
| 2583 | if (fl_small_pg != PAGE_SIZE || | 2583 | if (fl_small_pg != PAGE_SIZE || |
| 2584 | (fl_large_pg != 0 && (fl_large_pg <= fl_small_pg || | 2584 | (fl_large_pg != 0 && (fl_large_pg < fl_small_pg || |
| 2585 | (fl_large_pg & (fl_large_pg-1)) != 0))) { | 2585 | (fl_large_pg & (fl_large_pg-1)) != 0))) { |
| 2586 | dev_err(adap->pdev_dev, "bad SGE FL page buffer sizes [%d, %d]\n", | 2586 | dev_err(adap->pdev_dev, "bad SGE FL page buffer sizes [%d, %d]\n", |
| 2587 | fl_small_pg, fl_large_pg); | 2587 | fl_small_pg, fl_large_pg); |
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 5878df619b53..4ccaf9af6fc9 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
| @@ -104,6 +104,7 @@ static inline char *nic_name(struct pci_dev *pdev) | |||
| 104 | #define BE3_MAX_RSS_QS 16 | 104 | #define BE3_MAX_RSS_QS 16 |
| 105 | #define BE3_MAX_TX_QS 16 | 105 | #define BE3_MAX_TX_QS 16 |
| 106 | #define BE3_MAX_EVT_QS 16 | 106 | #define BE3_MAX_EVT_QS 16 |
| 107 | #define BE3_SRIOV_MAX_EVT_QS 8 | ||
| 107 | 108 | ||
| 108 | #define MAX_RX_QS 32 | 109 | #define MAX_RX_QS 32 |
| 109 | #define MAX_EVT_QS 32 | 110 | #define MAX_EVT_QS 32 |
| @@ -480,7 +481,7 @@ struct be_adapter { | |||
| 480 | struct list_head entry; | 481 | struct list_head entry; |
| 481 | 482 | ||
| 482 | u32 flash_status; | 483 | u32 flash_status; |
| 483 | struct completion flash_compl; | 484 | struct completion et_cmd_compl; |
| 484 | 485 | ||
| 485 | struct be_resources res; /* resources available for the func */ | 486 | struct be_resources res; /* resources available for the func */ |
| 486 | u16 num_vfs; /* Number of VFs provisioned by PF */ | 487 | u16 num_vfs; /* Number of VFs provisioned by PF */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index e0e8bc1ef14c..94c35c8d799d 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
| @@ -141,11 +141,17 @@ static int be_mcc_compl_process(struct be_adapter *adapter, | |||
| 141 | subsystem = resp_hdr->subsystem; | 141 | subsystem = resp_hdr->subsystem; |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST && | ||
| 145 | subsystem == CMD_SUBSYSTEM_LOWLEVEL) { | ||
| 146 | complete(&adapter->et_cmd_compl); | ||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 144 | if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) || | 150 | if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) || |
| 145 | (opcode == OPCODE_COMMON_WRITE_OBJECT)) && | 151 | (opcode == OPCODE_COMMON_WRITE_OBJECT)) && |
| 146 | (subsystem == CMD_SUBSYSTEM_COMMON)) { | 152 | (subsystem == CMD_SUBSYSTEM_COMMON)) { |
| 147 | adapter->flash_status = compl_status; | 153 | adapter->flash_status = compl_status; |
| 148 | complete(&adapter->flash_compl); | 154 | complete(&adapter->et_cmd_compl); |
| 149 | } | 155 | } |
| 150 | 156 | ||
| 151 | if (compl_status == MCC_STATUS_SUCCESS) { | 157 | if (compl_status == MCC_STATUS_SUCCESS) { |
| @@ -2017,6 +2023,9 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, | |||
| 2017 | 0x3ea83c02, 0x4a110304}; | 2023 | 0x3ea83c02, 0x4a110304}; |
| 2018 | int status; | 2024 | int status; |
| 2019 | 2025 | ||
| 2026 | if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS)) | ||
| 2027 | return 0; | ||
| 2028 | |||
| 2020 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 2029 | if (mutex_lock_interruptible(&adapter->mbox_lock)) |
| 2021 | return -1; | 2030 | return -1; |
| 2022 | 2031 | ||
| @@ -2160,7 +2169,7 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd, | |||
| 2160 | be_mcc_notify(adapter); | 2169 | be_mcc_notify(adapter); |
| 2161 | spin_unlock_bh(&adapter->mcc_lock); | 2170 | spin_unlock_bh(&adapter->mcc_lock); |
| 2162 | 2171 | ||
| 2163 | if (!wait_for_completion_timeout(&adapter->flash_compl, | 2172 | if (!wait_for_completion_timeout(&adapter->et_cmd_compl, |
| 2164 | msecs_to_jiffies(60000))) | 2173 | msecs_to_jiffies(60000))) |
| 2165 | status = -1; | 2174 | status = -1; |
| 2166 | else | 2175 | else |
| @@ -2255,8 +2264,8 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, | |||
| 2255 | be_mcc_notify(adapter); | 2264 | be_mcc_notify(adapter); |
| 2256 | spin_unlock_bh(&adapter->mcc_lock); | 2265 | spin_unlock_bh(&adapter->mcc_lock); |
| 2257 | 2266 | ||
| 2258 | if (!wait_for_completion_timeout(&adapter->flash_compl, | 2267 | if (!wait_for_completion_timeout(&adapter->et_cmd_compl, |
| 2259 | msecs_to_jiffies(40000))) | 2268 | msecs_to_jiffies(40000))) |
| 2260 | status = -1; | 2269 | status = -1; |
| 2261 | else | 2270 | else |
| 2262 | status = adapter->flash_status; | 2271 | status = adapter->flash_status; |
| @@ -2367,6 +2376,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
| 2367 | { | 2376 | { |
| 2368 | struct be_mcc_wrb *wrb; | 2377 | struct be_mcc_wrb *wrb; |
| 2369 | struct be_cmd_req_loopback_test *req; | 2378 | struct be_cmd_req_loopback_test *req; |
| 2379 | struct be_cmd_resp_loopback_test *resp; | ||
| 2370 | int status; | 2380 | int status; |
| 2371 | 2381 | ||
| 2372 | spin_lock_bh(&adapter->mcc_lock); | 2382 | spin_lock_bh(&adapter->mcc_lock); |
| @@ -2381,8 +2391,8 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
| 2381 | 2391 | ||
| 2382 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, | 2392 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, |
| 2383 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL); | 2393 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL); |
| 2384 | req->hdr.timeout = cpu_to_le32(4); | ||
| 2385 | 2394 | ||
| 2395 | req->hdr.timeout = cpu_to_le32(15); | ||
| 2386 | req->pattern = cpu_to_le64(pattern); | 2396 | req->pattern = cpu_to_le64(pattern); |
| 2387 | req->src_port = cpu_to_le32(port_num); | 2397 | req->src_port = cpu_to_le32(port_num); |
| 2388 | req->dest_port = cpu_to_le32(port_num); | 2398 | req->dest_port = cpu_to_le32(port_num); |
| @@ -2390,12 +2400,15 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
| 2390 | req->num_pkts = cpu_to_le32(num_pkts); | 2400 | req->num_pkts = cpu_to_le32(num_pkts); |
| 2391 | req->loopback_type = cpu_to_le32(loopback_type); | 2401 | req->loopback_type = cpu_to_le32(loopback_type); |
| 2392 | 2402 | ||
| 2393 | status = be_mcc_notify_wait(adapter); | 2403 | be_mcc_notify(adapter); |
| 2394 | if (!status) { | 2404 | |
| 2395 | struct be_cmd_resp_loopback_test *resp = embedded_payload(wrb); | 2405 | spin_unlock_bh(&adapter->mcc_lock); |
| 2396 | status = le32_to_cpu(resp->status); | ||
| 2397 | } | ||
| 2398 | 2406 | ||
| 2407 | wait_for_completion(&adapter->et_cmd_compl); | ||
| 2408 | resp = embedded_payload(wrb); | ||
| 2409 | status = le32_to_cpu(resp->status); | ||
| 2410 | |||
| 2411 | return status; | ||
| 2399 | err: | 2412 | err: |
| 2400 | spin_unlock_bh(&adapter->mcc_lock); | 2413 | spin_unlock_bh(&adapter->mcc_lock); |
| 2401 | return status; | 2414 | return status; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 0fde69d5cb6a..bf40fdaecfa3 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -2744,13 +2744,16 @@ static int be_rx_qs_create(struct be_adapter *adapter) | |||
| 2744 | if (!BEx_chip(adapter)) | 2744 | if (!BEx_chip(adapter)) |
| 2745 | adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 | | 2745 | adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 | |
| 2746 | RSS_ENABLE_UDP_IPV6; | 2746 | RSS_ENABLE_UDP_IPV6; |
| 2747 | } else { | ||
| 2748 | /* Disable RSS, if only default RX Q is created */ | ||
| 2749 | adapter->rss_flags = RSS_ENABLE_NONE; | ||
| 2750 | } | ||
| 2747 | 2751 | ||
| 2748 | rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags, | 2752 | rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags, |
| 2749 | 128); | 2753 | 128); |
| 2750 | if (rc) { | 2754 | if (rc) { |
| 2751 | adapter->rss_flags = 0; | 2755 | adapter->rss_flags = RSS_ENABLE_NONE; |
| 2752 | return rc; | 2756 | return rc; |
| 2753 | } | ||
| 2754 | } | 2757 | } |
| 2755 | 2758 | ||
| 2756 | /* First time posting */ | 2759 | /* First time posting */ |
| @@ -3124,11 +3127,11 @@ static void BEx_get_resources(struct be_adapter *adapter, | |||
| 3124 | { | 3127 | { |
| 3125 | struct pci_dev *pdev = adapter->pdev; | 3128 | struct pci_dev *pdev = adapter->pdev; |
| 3126 | bool use_sriov = false; | 3129 | bool use_sriov = false; |
| 3130 | int max_vfs; | ||
| 3127 | 3131 | ||
| 3128 | if (BE3_chip(adapter) && sriov_want(adapter)) { | 3132 | max_vfs = pci_sriov_get_totalvfs(pdev); |
| 3129 | int max_vfs; | ||
| 3130 | 3133 | ||
| 3131 | max_vfs = pci_sriov_get_totalvfs(pdev); | 3134 | if (BE3_chip(adapter) && sriov_want(adapter)) { |
| 3132 | res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0; | 3135 | res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0; |
| 3133 | use_sriov = res->max_vfs; | 3136 | use_sriov = res->max_vfs; |
| 3134 | } | 3137 | } |
| @@ -3159,7 +3162,11 @@ static void BEx_get_resources(struct be_adapter *adapter, | |||
| 3159 | BE3_MAX_RSS_QS : BE2_MAX_RSS_QS; | 3162 | BE3_MAX_RSS_QS : BE2_MAX_RSS_QS; |
| 3160 | res->max_rx_qs = res->max_rss_qs + 1; | 3163 | res->max_rx_qs = res->max_rss_qs + 1; |
| 3161 | 3164 | ||
| 3162 | res->max_evt_qs = be_physfn(adapter) ? BE3_MAX_EVT_QS : 1; | 3165 | if (be_physfn(adapter)) |
| 3166 | res->max_evt_qs = (max_vfs > 0) ? | ||
| 3167 | BE3_SRIOV_MAX_EVT_QS : BE3_MAX_EVT_QS; | ||
| 3168 | else | ||
| 3169 | res->max_evt_qs = 1; | ||
| 3163 | 3170 | ||
| 3164 | res->if_cap_flags = BE_IF_CAP_FLAGS_WANT; | 3171 | res->if_cap_flags = BE_IF_CAP_FLAGS_WANT; |
| 3165 | if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) | 3172 | if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) |
| @@ -4205,7 +4212,7 @@ static int be_ctrl_init(struct be_adapter *adapter) | |||
| 4205 | spin_lock_init(&adapter->mcc_lock); | 4212 | spin_lock_init(&adapter->mcc_lock); |
| 4206 | spin_lock_init(&adapter->mcc_cq_lock); | 4213 | spin_lock_init(&adapter->mcc_cq_lock); |
| 4207 | 4214 | ||
| 4208 | init_completion(&adapter->flash_compl); | 4215 | init_completion(&adapter->et_cmd_compl); |
| 4209 | pci_save_state(adapter->pdev); | 4216 | pci_save_state(adapter->pdev); |
| 4210 | return 0; | 4217 | return 0; |
| 4211 | 4218 | ||
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 45b8b22b9987..50bb71c663e2 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -2049,8 +2049,6 @@ static void fec_reset_phy(struct platform_device *pdev) | |||
| 2049 | int err, phy_reset; | 2049 | int err, phy_reset; |
| 2050 | int msec = 1; | 2050 | int msec = 1; |
| 2051 | struct device_node *np = pdev->dev.of_node; | 2051 | struct device_node *np = pdev->dev.of_node; |
| 2052 | enum of_gpio_flags flags; | ||
| 2053 | bool port; | ||
| 2054 | 2052 | ||
| 2055 | if (!np) | 2053 | if (!np) |
| 2056 | return; | 2054 | return; |
| @@ -2060,22 +2058,18 @@ static void fec_reset_phy(struct platform_device *pdev) | |||
| 2060 | if (msec > 1000) | 2058 | if (msec > 1000) |
| 2061 | msec = 1; | 2059 | msec = 1; |
| 2062 | 2060 | ||
| 2063 | phy_reset = of_get_named_gpio_flags(np, "phy-reset-gpios", 0, &flags); | 2061 | phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0); |
| 2064 | if (!gpio_is_valid(phy_reset)) | 2062 | if (!gpio_is_valid(phy_reset)) |
| 2065 | return; | 2063 | return; |
| 2066 | 2064 | ||
| 2067 | if (flags & OF_GPIO_ACTIVE_LOW) | 2065 | err = devm_gpio_request_one(&pdev->dev, phy_reset, |
| 2068 | port = GPIOF_OUT_INIT_LOW; | 2066 | GPIOF_OUT_INIT_LOW, "phy-reset"); |
| 2069 | else | ||
| 2070 | port = GPIOF_OUT_INIT_HIGH; | ||
| 2071 | |||
| 2072 | err = devm_gpio_request_one(&pdev->dev, phy_reset, port, "phy-reset"); | ||
| 2073 | if (err) { | 2067 | if (err) { |
| 2074 | dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err); | 2068 | dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err); |
| 2075 | return; | 2069 | return; |
| 2076 | } | 2070 | } |
| 2077 | msleep(msec); | 2071 | msleep(msec); |
| 2078 | gpio_set_value(phy_reset, !port); | 2072 | gpio_set_value(phy_reset, 1); |
| 2079 | } | 2073 | } |
| 2080 | #else /* CONFIG_OF */ | 2074 | #else /* CONFIG_OF */ |
| 2081 | static void fec_reset_phy(struct platform_device *pdev) | 2075 | static void fec_reset_phy(struct platform_device *pdev) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 631ea0ac1cd8..ff80cd8f6d2b 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
| @@ -487,6 +487,7 @@ struct qlcnic_hardware_context { | |||
| 487 | struct qlcnic_mailbox *mailbox; | 487 | struct qlcnic_mailbox *mailbox; |
| 488 | u8 extend_lb_time; | 488 | u8 extend_lb_time; |
| 489 | u8 phys_port_id[ETH_ALEN]; | 489 | u8 phys_port_id[ETH_ALEN]; |
| 490 | u8 lb_mode; | ||
| 490 | }; | 491 | }; |
| 491 | 492 | ||
| 492 | struct qlcnic_adapter_stats { | 493 | struct qlcnic_adapter_stats { |
| @@ -578,6 +579,8 @@ struct qlcnic_host_tx_ring { | |||
| 578 | dma_addr_t phys_addr; | 579 | dma_addr_t phys_addr; |
| 579 | dma_addr_t hw_cons_phys_addr; | 580 | dma_addr_t hw_cons_phys_addr; |
| 580 | struct netdev_queue *txq; | 581 | struct netdev_queue *txq; |
| 582 | /* Lock to protect Tx descriptors cleanup */ | ||
| 583 | spinlock_t tx_clean_lock; | ||
| 581 | } ____cacheline_internodealigned_in_smp; | 584 | } ____cacheline_internodealigned_in_smp; |
| 582 | 585 | ||
| 583 | /* | 586 | /* |
| @@ -808,6 +811,7 @@ struct qlcnic_mac_list_s { | |||
| 808 | 811 | ||
| 809 | #define QLCNIC_ILB_MODE 0x1 | 812 | #define QLCNIC_ILB_MODE 0x1 |
| 810 | #define QLCNIC_ELB_MODE 0x2 | 813 | #define QLCNIC_ELB_MODE 0x2 |
| 814 | #define QLCNIC_LB_MODE_MASK 0x3 | ||
| 811 | 815 | ||
| 812 | #define QLCNIC_LINKEVENT 0x1 | 816 | #define QLCNIC_LINKEVENT 0x1 |
| 813 | #define QLCNIC_LB_RESPONSE 0x2 | 817 | #define QLCNIC_LB_RESPONSE 0x2 |
| @@ -1093,7 +1097,6 @@ struct qlcnic_adapter { | |||
| 1093 | struct qlcnic_filter_hash rx_fhash; | 1097 | struct qlcnic_filter_hash rx_fhash; |
| 1094 | struct list_head vf_mc_list; | 1098 | struct list_head vf_mc_list; |
| 1095 | 1099 | ||
| 1096 | spinlock_t tx_clean_lock; | ||
| 1097 | spinlock_t mac_learn_lock; | 1100 | spinlock_t mac_learn_lock; |
| 1098 | /* spinlock for catching rcv filters for eswitch traffic */ | 1101 | /* spinlock for catching rcv filters for eswitch traffic */ |
| 1099 | spinlock_t rx_mac_learn_lock; | 1102 | spinlock_t rx_mac_learn_lock; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index 6055d397a29e..f776f99f7915 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -1684,12 +1684,6 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
| 1684 | } | 1684 | } |
| 1685 | } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); | 1685 | } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); |
| 1686 | 1686 | ||
| 1687 | /* Make sure carrier is off and queue is stopped during loopback */ | ||
| 1688 | if (netif_running(netdev)) { | ||
| 1689 | netif_carrier_off(netdev); | ||
| 1690 | netif_tx_stop_all_queues(netdev); | ||
| 1691 | } | ||
| 1692 | |||
| 1693 | ret = qlcnic_do_lb_test(adapter, mode); | 1687 | ret = qlcnic_do_lb_test(adapter, mode); |
| 1694 | 1688 | ||
| 1695 | qlcnic_83xx_clear_lb_mode(adapter, mode); | 1689 | qlcnic_83xx_clear_lb_mode(adapter, mode); |
| @@ -2121,6 +2115,7 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, | |||
| 2121 | ahw->link_autoneg = MSB(MSW(data[3])); | 2115 | ahw->link_autoneg = MSB(MSW(data[3])); |
| 2122 | ahw->module_type = MSB(LSW(data[3])); | 2116 | ahw->module_type = MSB(LSW(data[3])); |
| 2123 | ahw->has_link_events = 1; | 2117 | ahw->has_link_events = 1; |
| 2118 | ahw->lb_mode = data[4] & QLCNIC_LB_MODE_MASK; | ||
| 2124 | qlcnic_advert_link_change(adapter, link_status); | 2119 | qlcnic_advert_link_change(adapter, link_status); |
| 2125 | } | 2120 | } |
| 2126 | 2121 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c index e9c21e5d0ca9..c4262c23ed7c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | |||
| @@ -134,6 +134,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter, | |||
| 134 | struct qlcnic_skb_frag *buffrag; | 134 | struct qlcnic_skb_frag *buffrag; |
| 135 | int i, j; | 135 | int i, j; |
| 136 | 136 | ||
| 137 | spin_lock(&tx_ring->tx_clean_lock); | ||
| 138 | |||
| 137 | cmd_buf = tx_ring->cmd_buf_arr; | 139 | cmd_buf = tx_ring->cmd_buf_arr; |
| 138 | for (i = 0; i < tx_ring->num_desc; i++) { | 140 | for (i = 0; i < tx_ring->num_desc; i++) { |
| 139 | buffrag = cmd_buf->frag_array; | 141 | buffrag = cmd_buf->frag_array; |
| @@ -157,6 +159,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter, | |||
| 157 | } | 159 | } |
| 158 | cmd_buf++; | 160 | cmd_buf++; |
| 159 | } | 161 | } |
| 162 | |||
| 163 | spin_unlock(&tx_ring->tx_clean_lock); | ||
| 160 | } | 164 | } |
| 161 | 165 | ||
| 162 | void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter) | 166 | void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index eda6c691d897..ad1531ae3aa8 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -689,6 +689,10 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
| 689 | adapter->ahw->linkup = 0; | 689 | adapter->ahw->linkup = 0; |
| 690 | netif_carrier_off(netdev); | 690 | netif_carrier_off(netdev); |
| 691 | } else if (!adapter->ahw->linkup && linkup) { | 691 | } else if (!adapter->ahw->linkup && linkup) { |
| 692 | /* Do not advertise Link up if the port is in loopback mode */ | ||
| 693 | if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode) | ||
| 694 | return; | ||
| 695 | |||
| 692 | netdev_info(netdev, "NIC Link is up\n"); | 696 | netdev_info(netdev, "NIC Link is up\n"); |
| 693 | adapter->ahw->linkup = 1; | 697 | adapter->ahw->linkup = 1; |
| 694 | netif_carrier_on(netdev); | 698 | netif_carrier_on(netdev); |
| @@ -778,7 +782,7 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
| 778 | struct net_device *netdev = adapter->netdev; | 782 | struct net_device *netdev = adapter->netdev; |
| 779 | struct qlcnic_skb_frag *frag; | 783 | struct qlcnic_skb_frag *frag; |
| 780 | 784 | ||
| 781 | if (!spin_trylock(&adapter->tx_clean_lock)) | 785 | if (!spin_trylock(&tx_ring->tx_clean_lock)) |
| 782 | return 1; | 786 | return 1; |
| 783 | 787 | ||
| 784 | sw_consumer = tx_ring->sw_consumer; | 788 | sw_consumer = tx_ring->sw_consumer; |
| @@ -807,8 +811,9 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
| 807 | break; | 811 | break; |
| 808 | } | 812 | } |
| 809 | 813 | ||
| 814 | tx_ring->sw_consumer = sw_consumer; | ||
| 815 | |||
| 810 | if (count && netif_running(netdev)) { | 816 | if (count && netif_running(netdev)) { |
| 811 | tx_ring->sw_consumer = sw_consumer; | ||
| 812 | smp_mb(); | 817 | smp_mb(); |
| 813 | if (netif_tx_queue_stopped(tx_ring->txq) && | 818 | if (netif_tx_queue_stopped(tx_ring->txq) && |
| 814 | netif_carrier_ok(netdev)) { | 819 | netif_carrier_ok(netdev)) { |
| @@ -834,7 +839,8 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
| 834 | */ | 839 | */ |
| 835 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 840 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
| 836 | done = (sw_consumer == hw_consumer); | 841 | done = (sw_consumer == hw_consumer); |
| 837 | spin_unlock(&adapter->tx_clean_lock); | 842 | |
| 843 | spin_unlock(&tx_ring->tx_clean_lock); | ||
| 838 | 844 | ||
| 839 | return done; | 845 | return done; |
| 840 | } | 846 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 2c8cac0c6a55..b8a245a79de3 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -1756,7 +1756,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
| 1756 | if (qlcnic_sriov_vf_check(adapter)) | 1756 | if (qlcnic_sriov_vf_check(adapter)) |
| 1757 | qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); | 1757 | qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); |
| 1758 | smp_mb(); | 1758 | smp_mb(); |
| 1759 | spin_lock(&adapter->tx_clean_lock); | ||
| 1760 | netif_carrier_off(netdev); | 1759 | netif_carrier_off(netdev); |
| 1761 | adapter->ahw->linkup = 0; | 1760 | adapter->ahw->linkup = 0; |
| 1762 | netif_tx_disable(netdev); | 1761 | netif_tx_disable(netdev); |
| @@ -1777,7 +1776,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
| 1777 | 1776 | ||
| 1778 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) | 1777 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) |
| 1779 | qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); | 1778 | qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); |
| 1780 | spin_unlock(&adapter->tx_clean_lock); | ||
| 1781 | } | 1779 | } |
| 1782 | 1780 | ||
| 1783 | /* Usage: During suspend and firmware recovery module */ | 1781 | /* Usage: During suspend and firmware recovery module */ |
| @@ -2172,6 +2170,7 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter, | |||
| 2172 | } | 2170 | } |
| 2173 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); | 2171 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); |
| 2174 | tx_ring->cmd_buf_arr = cmd_buf_arr; | 2172 | tx_ring->cmd_buf_arr = cmd_buf_arr; |
| 2173 | spin_lock_init(&tx_ring->tx_clean_lock); | ||
| 2175 | } | 2174 | } |
| 2176 | 2175 | ||
| 2177 | if (qlcnic_83xx_check(adapter) || | 2176 | if (qlcnic_83xx_check(adapter) || |
| @@ -2299,7 +2298,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2299 | rwlock_init(&adapter->ahw->crb_lock); | 2298 | rwlock_init(&adapter->ahw->crb_lock); |
| 2300 | mutex_init(&adapter->ahw->mem_lock); | 2299 | mutex_init(&adapter->ahw->mem_lock); |
| 2301 | 2300 | ||
| 2302 | spin_lock_init(&adapter->tx_clean_lock); | ||
| 2303 | INIT_LIST_HEAD(&adapter->mac_list); | 2301 | INIT_LIST_HEAD(&adapter->mac_list); |
| 2304 | 2302 | ||
| 2305 | qlcnic_register_dcb(adapter); | 2303 | qlcnic_register_dcb(adapter); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 686f460b1502..024f8161d2fe 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
| @@ -75,7 +75,6 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
| 75 | num_vfs = sriov->num_vfs; | 75 | num_vfs = sriov->num_vfs; |
| 76 | max = num_vfs + 1; | 76 | max = num_vfs + 1; |
| 77 | info->bit_offsets = 0xffff; | 77 | info->bit_offsets = 0xffff; |
| 78 | info->max_tx_ques = res->num_tx_queues / max; | ||
| 79 | info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters; | 78 | info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters; |
| 80 | num_vf_macs = QLCNIC_SRIOV_VF_MAX_MAC; | 79 | num_vf_macs = QLCNIC_SRIOV_VF_MAX_MAC; |
| 81 | 80 | ||
| @@ -86,6 +85,7 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
| 86 | info->max_tx_mac_filters = temp; | 85 | info->max_tx_mac_filters = temp; |
| 87 | info->min_tx_bw = 0; | 86 | info->min_tx_bw = 0; |
| 88 | info->max_tx_bw = MAX_BW; | 87 | info->max_tx_bw = MAX_BW; |
| 88 | info->max_tx_ques = res->num_tx_queues - sriov->num_vfs; | ||
| 89 | } else { | 89 | } else { |
| 90 | id = qlcnic_sriov_func_to_index(adapter, func); | 90 | id = qlcnic_sriov_func_to_index(adapter, func); |
| 91 | if (id < 0) | 91 | if (id < 0) |
| @@ -95,6 +95,7 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
| 95 | info->max_tx_bw = vp->max_tx_bw; | 95 | info->max_tx_bw = vp->max_tx_bw; |
| 96 | info->max_rx_ucast_mac_filters = num_vf_macs; | 96 | info->max_rx_ucast_mac_filters = num_vf_macs; |
| 97 | info->max_tx_mac_filters = num_vf_macs; | 97 | info->max_tx_mac_filters = num_vf_macs; |
| 98 | info->max_tx_ques = QLCNIC_SINGLE_RING; | ||
| 98 | } | 99 | } |
| 99 | 100 | ||
| 100 | info->max_rx_ip_addr = res->num_destip / max; | 101 | info->max_rx_ip_addr = res->num_destip / max; |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 86292e6aaf49..1a482344b3f5 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
| @@ -185,7 +185,6 @@ enum rx_ctrl_state{ | |||
| 185 | #define BM_REQUEST_TYPE (0xa1) | 185 | #define BM_REQUEST_TYPE (0xa1) |
| 186 | #define B_NOTIFICATION (0x20) | 186 | #define B_NOTIFICATION (0x20) |
| 187 | #define W_VALUE (0x0) | 187 | #define W_VALUE (0x0) |
| 188 | #define W_INDEX (0x2) | ||
| 189 | #define W_LENGTH (0x2) | 188 | #define W_LENGTH (0x2) |
| 190 | 189 | ||
| 191 | #define B_OVERRUN (0x1<<6) | 190 | #define B_OVERRUN (0x1<<6) |
| @@ -1487,6 +1486,7 @@ static void tiocmget_intr_callback(struct urb *urb) | |||
| 1487 | struct uart_icount *icount; | 1486 | struct uart_icount *icount; |
| 1488 | struct hso_serial_state_notification *serial_state_notification; | 1487 | struct hso_serial_state_notification *serial_state_notification; |
| 1489 | struct usb_device *usb; | 1488 | struct usb_device *usb; |
| 1489 | int if_num; | ||
| 1490 | 1490 | ||
| 1491 | /* Sanity checks */ | 1491 | /* Sanity checks */ |
| 1492 | if (!serial) | 1492 | if (!serial) |
| @@ -1495,15 +1495,24 @@ static void tiocmget_intr_callback(struct urb *urb) | |||
| 1495 | handle_usb_error(status, __func__, serial->parent); | 1495 | handle_usb_error(status, __func__, serial->parent); |
| 1496 | return; | 1496 | return; |
| 1497 | } | 1497 | } |
| 1498 | |||
| 1499 | /* tiocmget is only supported on HSO_PORT_MODEM */ | ||
| 1498 | tiocmget = serial->tiocmget; | 1500 | tiocmget = serial->tiocmget; |
| 1499 | if (!tiocmget) | 1501 | if (!tiocmget) |
| 1500 | return; | 1502 | return; |
| 1503 | BUG_ON((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM); | ||
| 1504 | |||
| 1501 | usb = serial->parent->usb; | 1505 | usb = serial->parent->usb; |
| 1506 | if_num = serial->parent->interface->altsetting->desc.bInterfaceNumber; | ||
| 1507 | |||
| 1508 | /* wIndex should be the USB interface number of the port to which the | ||
| 1509 | * notification applies, which should always be the Modem port. | ||
| 1510 | */ | ||
| 1502 | serial_state_notification = &tiocmget->serial_state_notification; | 1511 | serial_state_notification = &tiocmget->serial_state_notification; |
| 1503 | if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE || | 1512 | if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE || |
| 1504 | serial_state_notification->bNotification != B_NOTIFICATION || | 1513 | serial_state_notification->bNotification != B_NOTIFICATION || |
| 1505 | le16_to_cpu(serial_state_notification->wValue) != W_VALUE || | 1514 | le16_to_cpu(serial_state_notification->wValue) != W_VALUE || |
| 1506 | le16_to_cpu(serial_state_notification->wIndex) != W_INDEX || | 1515 | le16_to_cpu(serial_state_notification->wIndex) != if_num || |
| 1507 | le16_to_cpu(serial_state_notification->wLength) != W_LENGTH) { | 1516 | le16_to_cpu(serial_state_notification->wLength) != W_LENGTH) { |
| 1508 | dev_warn(&usb->dev, | 1517 | dev_warn(&usb->dev, |
| 1509 | "hso received invalid serial state notification\n"); | 1518 | "hso received invalid serial state notification\n"); |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 03832d3780aa..f54637828574 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
| @@ -117,7 +117,6 @@ enum { | |||
| 117 | struct mcs7830_data { | 117 | struct mcs7830_data { |
| 118 | u8 multi_filter[8]; | 118 | u8 multi_filter[8]; |
| 119 | u8 config; | 119 | u8 config; |
| 120 | u8 link_counter; | ||
| 121 | }; | 120 | }; |
| 122 | 121 | ||
| 123 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; | 122 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; |
| @@ -561,26 +560,16 @@ static void mcs7830_status(struct usbnet *dev, struct urb *urb) | |||
| 561 | { | 560 | { |
| 562 | u8 *buf = urb->transfer_buffer; | 561 | u8 *buf = urb->transfer_buffer; |
| 563 | bool link, link_changed; | 562 | bool link, link_changed; |
| 564 | struct mcs7830_data *data = mcs7830_get_data(dev); | ||
| 565 | 563 | ||
| 566 | if (urb->actual_length < 16) | 564 | if (urb->actual_length < 16) |
| 567 | return; | 565 | return; |
| 568 | 566 | ||
| 569 | link = !(buf[1] & 0x20); | 567 | link = !(buf[1] == 0x20); |
| 570 | link_changed = netif_carrier_ok(dev->net) != link; | 568 | link_changed = netif_carrier_ok(dev->net) != link; |
| 571 | if (link_changed) { | 569 | if (link_changed) { |
| 572 | data->link_counter++; | 570 | usbnet_link_change(dev, link, 0); |
| 573 | /* | 571 | netdev_dbg(dev->net, "Link Status is: %d\n", link); |
| 574 | track link state 20 times to guard against erroneous | 572 | } |
| 575 | link state changes reported sometimes by the chip | ||
| 576 | */ | ||
| 577 | if (data->link_counter > 20) { | ||
| 578 | data->link_counter = 0; | ||
| 579 | usbnet_link_change(dev, link, 0); | ||
| 580 | netdev_dbg(dev->net, "Link Status is: %d\n", link); | ||
| 581 | } | ||
| 582 | } else | ||
| 583 | data->link_counter = 0; | ||
| 584 | } | 573 | } |
| 585 | 574 | ||
| 586 | static const struct driver_info moschip_info = { | 575 | static const struct driver_info moschip_info = { |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d208f8604981..5d776447d9c3 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -1797,16 +1797,17 @@ static int virtnet_restore(struct virtio_device *vdev) | |||
| 1797 | if (err) | 1797 | if (err) |
| 1798 | return err; | 1798 | return err; |
| 1799 | 1799 | ||
| 1800 | if (netif_running(vi->dev)) | 1800 | if (netif_running(vi->dev)) { |
| 1801 | for (i = 0; i < vi->curr_queue_pairs; i++) | ||
| 1802 | if (!try_fill_recv(&vi->rq[i], GFP_KERNEL)) | ||
| 1803 | schedule_delayed_work(&vi->refill, 0); | ||
| 1804 | |||
| 1801 | for (i = 0; i < vi->max_queue_pairs; i++) | 1805 | for (i = 0; i < vi->max_queue_pairs; i++) |
| 1802 | virtnet_napi_enable(&vi->rq[i]); | 1806 | virtnet_napi_enable(&vi->rq[i]); |
| 1807 | } | ||
| 1803 | 1808 | ||
| 1804 | netif_device_attach(vi->dev); | 1809 | netif_device_attach(vi->dev); |
| 1805 | 1810 | ||
| 1806 | for (i = 0; i < vi->curr_queue_pairs; i++) | ||
| 1807 | if (!try_fill_recv(&vi->rq[i], GFP_KERNEL)) | ||
| 1808 | schedule_delayed_work(&vi->refill, 0); | ||
| 1809 | |||
| 1810 | mutex_lock(&vi->config_lock); | 1811 | mutex_lock(&vi->config_lock); |
| 1811 | vi->config_enable = true; | 1812 | vi->config_enable = true; |
| 1812 | mutex_unlock(&vi->config_lock); | 1813 | mutex_unlock(&vi->config_lock); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 249e01c5600c..ed384fee76ac 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -2440,7 +2440,8 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 2440 | /* update header length based on lower device */ | 2440 | /* update header length based on lower device */ |
| 2441 | dev->hard_header_len = lowerdev->hard_header_len + | 2441 | dev->hard_header_len = lowerdev->hard_header_len + |
| 2442 | (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM); | 2442 | (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM); |
| 2443 | } | 2443 | } else if (use_ipv6) |
| 2444 | vxlan->flags |= VXLAN_F_IPV6; | ||
| 2444 | 2445 | ||
| 2445 | if (data[IFLA_VXLAN_TOS]) | 2446 | if (data[IFLA_VXLAN_TOS]) |
| 2446 | vxlan->tos = nla_get_u8(data[IFLA_VXLAN_TOS]); | 2447 | vxlan->tos = nla_get_u8(data[IFLA_VXLAN_TOS]); |
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 34ca4e58a43d..fff8cddfed81 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/ethtool.h> | 34 | #include <linux/ethtool.h> |
| 35 | #include <linux/rtnetlink.h> | 35 | #include <linux/rtnetlink.h> |
| 36 | #include <linux/if_vlan.h> | 36 | #include <linux/if_vlan.h> |
| 37 | #include <linux/vmalloc.h> | ||
| 37 | 38 | ||
| 38 | #include <xen/events.h> | 39 | #include <xen/events.h> |
| 39 | #include <asm/xen/hypercall.h> | 40 | #include <asm/xen/hypercall.h> |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 4410cc3d6ee2..3384dc4bed40 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -4218,7 +4218,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | |||
| 4218 | */ | 4218 | */ |
| 4219 | map->m_flags &= ~EXT4_MAP_FROM_CLUSTER; | 4219 | map->m_flags &= ~EXT4_MAP_FROM_CLUSTER; |
| 4220 | newex.ee_block = cpu_to_le32(map->m_lblk); | 4220 | newex.ee_block = cpu_to_le32(map->m_lblk); |
| 4221 | cluster_offset = EXT4_LBLK_CMASK(sbi, map->m_lblk); | 4221 | cluster_offset = EXT4_LBLK_COFF(sbi, map->m_lblk); |
| 4222 | 4222 | ||
| 4223 | /* | 4223 | /* |
| 4224 | * If we are doing bigalloc, check to see if the extent returned | 4224 | * If we are doing bigalloc, check to see if the extent returned |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d9a550bf3e8e..5faaadb0c74f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -1912,6 +1912,15 @@ static inline int dev_parse_header(const struct sk_buff *skb, | |||
| 1912 | return dev->header_ops->parse(skb, haddr); | 1912 | return dev->header_ops->parse(skb, haddr); |
| 1913 | } | 1913 | } |
| 1914 | 1914 | ||
| 1915 | static inline int dev_rebuild_header(struct sk_buff *skb) | ||
| 1916 | { | ||
| 1917 | const struct net_device *dev = skb->dev; | ||
| 1918 | |||
| 1919 | if (!dev->header_ops || !dev->header_ops->rebuild) | ||
| 1920 | return 0; | ||
| 1921 | return dev->header_ops->rebuild(skb); | ||
| 1922 | } | ||
| 1923 | |||
| 1915 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); | 1924 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); |
| 1916 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); | 1925 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); |
| 1917 | static inline int unregister_gifconf(unsigned int family) | 1926 | static inline int unregister_gifconf(unsigned int family) |
| @@ -3008,6 +3017,19 @@ static inline void netif_set_gso_max_size(struct net_device *dev, | |||
| 3008 | dev->gso_max_size = size; | 3017 | dev->gso_max_size = size; |
| 3009 | } | 3018 | } |
| 3010 | 3019 | ||
| 3020 | static inline void skb_gso_error_unwind(struct sk_buff *skb, __be16 protocol, | ||
| 3021 | int pulled_hlen, u16 mac_offset, | ||
| 3022 | int mac_len) | ||
| 3023 | { | ||
| 3024 | skb->protocol = protocol; | ||
| 3025 | skb->encapsulation = 1; | ||
| 3026 | skb_push(skb, pulled_hlen); | ||
| 3027 | skb_reset_transport_header(skb); | ||
| 3028 | skb->mac_header = mac_offset; | ||
| 3029 | skb->network_header = skb->mac_header + mac_len; | ||
| 3030 | skb->mac_len = mac_len; | ||
| 3031 | } | ||
| 3032 | |||
| 3011 | static inline bool netif_is_macvlan(struct net_device *dev) | 3033 | static inline bool netif_is_macvlan(struct net_device *dev) |
| 3012 | { | 3034 | { |
| 3013 | return dev->priv_flags & IFF_MACVLAN; | 3035 | return dev->priv_flags & IFF_MACVLAN; |
diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h index 31e2de7d57c5..c0f0a13ed818 100644 --- a/include/net/llc_pdu.h +++ b/include/net/llc_pdu.h | |||
| @@ -142,7 +142,7 @@ | |||
| 142 | #define LLC_S_PF_IS_1(pdu) ((pdu->ctrl_2 & LLC_S_PF_BIT_MASK) ? 1 : 0) | 142 | #define LLC_S_PF_IS_1(pdu) ((pdu->ctrl_2 & LLC_S_PF_BIT_MASK) ? 1 : 0) |
| 143 | 143 | ||
| 144 | #define PDU_SUPV_GET_Nr(pdu) ((pdu->ctrl_2 & 0xFE) >> 1) | 144 | #define PDU_SUPV_GET_Nr(pdu) ((pdu->ctrl_2 & 0xFE) >> 1) |
| 145 | #define PDU_GET_NEXT_Vr(sn) (++sn & ~LLC_2_SEQ_NBR_MODULO) | 145 | #define PDU_GET_NEXT_Vr(sn) (((sn) + 1) & ~LLC_2_SEQ_NBR_MODULO) |
| 146 | 146 | ||
| 147 | /* FRMR information field macros */ | 147 | /* FRMR information field macros */ |
| 148 | 148 | ||
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 67b5d0068273..0a248b323d87 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -1046,9 +1046,6 @@ struct sctp_outq { | |||
| 1046 | 1046 | ||
| 1047 | /* Corked? */ | 1047 | /* Corked? */ |
| 1048 | char cork; | 1048 | char cork; |
| 1049 | |||
| 1050 | /* Is this structure empty? */ | ||
| 1051 | char empty; | ||
| 1052 | }; | 1049 | }; |
| 1053 | 1050 | ||
| 1054 | void sctp_outq_init(struct sctp_association *, struct sctp_outq *); | 1051 | void sctp_outq_init(struct sctp_association *, struct sctp_outq *); |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 762896ebfcf5..47c908f1f626 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -530,6 +530,23 @@ static const struct header_ops vlan_header_ops = { | |||
| 530 | .parse = eth_header_parse, | 530 | .parse = eth_header_parse, |
| 531 | }; | 531 | }; |
| 532 | 532 | ||
| 533 | static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev, | ||
| 534 | unsigned short type, | ||
| 535 | const void *daddr, const void *saddr, | ||
| 536 | unsigned int len) | ||
| 537 | { | ||
| 538 | struct vlan_dev_priv *vlan = vlan_dev_priv(dev); | ||
| 539 | struct net_device *real_dev = vlan->real_dev; | ||
| 540 | |||
| 541 | return dev_hard_header(skb, real_dev, type, daddr, saddr, len); | ||
| 542 | } | ||
| 543 | |||
| 544 | static const struct header_ops vlan_passthru_header_ops = { | ||
| 545 | .create = vlan_passthru_hard_header, | ||
| 546 | .rebuild = dev_rebuild_header, | ||
| 547 | .parse = eth_header_parse, | ||
| 548 | }; | ||
| 549 | |||
| 533 | static struct device_type vlan_type = { | 550 | static struct device_type vlan_type = { |
| 534 | .name = "vlan", | 551 | .name = "vlan", |
| 535 | }; | 552 | }; |
| @@ -573,7 +590,7 @@ static int vlan_dev_init(struct net_device *dev) | |||
| 573 | 590 | ||
| 574 | dev->needed_headroom = real_dev->needed_headroom; | 591 | dev->needed_headroom = real_dev->needed_headroom; |
| 575 | if (real_dev->features & NETIF_F_HW_VLAN_CTAG_TX) { | 592 | if (real_dev->features & NETIF_F_HW_VLAN_CTAG_TX) { |
| 576 | dev->header_ops = real_dev->header_ops; | 593 | dev->header_ops = &vlan_passthru_header_ops; |
| 577 | dev->hard_header_len = real_dev->hard_header_len; | 594 | dev->hard_header_len = real_dev->hard_header_len; |
| 578 | } else { | 595 | } else { |
| 579 | dev->header_ops = &vlan_header_ops; | 596 | dev->header_ops = &vlan_header_ops; |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 4c214b2b88ef..ef66365b7354 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
| @@ -1998,7 +1998,7 @@ int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) | |||
| 1998 | u32 old; | 1998 | u32 old; |
| 1999 | struct net_bridge_mdb_htable *mdb; | 1999 | struct net_bridge_mdb_htable *mdb; |
| 2000 | 2000 | ||
| 2001 | spin_lock(&br->multicast_lock); | 2001 | spin_lock_bh(&br->multicast_lock); |
| 2002 | if (!netif_running(br->dev)) | 2002 | if (!netif_running(br->dev)) |
| 2003 | goto unlock; | 2003 | goto unlock; |
| 2004 | 2004 | ||
| @@ -2030,7 +2030,7 @@ rollback: | |||
| 2030 | } | 2030 | } |
| 2031 | 2031 | ||
| 2032 | unlock: | 2032 | unlock: |
| 2033 | spin_unlock(&br->multicast_lock); | 2033 | spin_unlock_bh(&br->multicast_lock); |
| 2034 | 2034 | ||
| 2035 | return err; | 2035 | return err; |
| 2036 | } | 2036 | } |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 36b1443f9ae4..932c6d7cf666 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -1275,7 +1275,7 @@ int neigh_compat_output(struct neighbour *neigh, struct sk_buff *skb) | |||
| 1275 | 1275 | ||
| 1276 | if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, | 1276 | if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL, |
| 1277 | skb->len) < 0 && | 1277 | skb->len) < 0 && |
| 1278 | dev->header_ops->rebuild(skb)) | 1278 | dev_rebuild_header(skb)) |
| 1279 | return 0; | 1279 | return 0; |
| 1280 | 1280 | ||
| 1281 | return dev_queue_xmit(skb); | 1281 | return dev_queue_xmit(skb); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 8f971990677c..303097874633 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -386,8 +386,14 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
| 386 | !vlan_hw_offload_capable(netif_skb_features(skb), | 386 | !vlan_hw_offload_capable(netif_skb_features(skb), |
| 387 | skb->vlan_proto)) { | 387 | skb->vlan_proto)) { |
| 388 | skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb)); | 388 | skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb)); |
| 389 | if (unlikely(!skb)) | 389 | if (unlikely(!skb)) { |
| 390 | break; | 390 | /* This is actually a packet drop, but we |
| 391 | * don't want the code at the end of this | ||
| 392 | * function to try and re-queue a NULL skb. | ||
| 393 | */ | ||
| 394 | status = NETDEV_TX_OK; | ||
| 395 | goto unlock_txq; | ||
| 396 | } | ||
| 391 | skb->vlan_tci = 0; | 397 | skb->vlan_tci = 0; |
| 392 | } | 398 | } |
| 393 | 399 | ||
| @@ -395,6 +401,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
| 395 | if (status == NETDEV_TX_OK) | 401 | if (status == NETDEV_TX_OK) |
| 396 | txq_trans_update(txq); | 402 | txq_trans_update(txq); |
| 397 | } | 403 | } |
| 404 | unlock_txq: | ||
| 398 | __netif_tx_unlock(txq); | 405 | __netif_tx_unlock(txq); |
| 399 | 406 | ||
| 400 | if (status == NETDEV_TX_OK) | 407 | if (status == NETDEV_TX_OK) |
diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 459e200c08a4..a2d2456a557a 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c | |||
| @@ -547,7 +547,7 @@ static int lowpan_header_create(struct sk_buff *skb, | |||
| 547 | hc06_ptr += 3; | 547 | hc06_ptr += 3; |
| 548 | } else { | 548 | } else { |
| 549 | /* compress nothing */ | 549 | /* compress nothing */ |
| 550 | memcpy(hc06_ptr, &hdr, 4); | 550 | memcpy(hc06_ptr, hdr, 4); |
| 551 | /* replace the top byte with new ECN | DSCP format */ | 551 | /* replace the top byte with new ECN | DSCP format */ |
| 552 | *hc06_ptr = tmp; | 552 | *hc06_ptr = tmp; |
| 553 | hc06_ptr += 4; | 553 | hc06_ptr += 4; |
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c index e5d436188464..2cd02f32f99f 100644 --- a/net/ipv4/gre_offload.c +++ b/net/ipv4/gre_offload.c | |||
| @@ -28,6 +28,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, | |||
| 28 | netdev_features_t enc_features; | 28 | netdev_features_t enc_features; |
| 29 | int ghl = GRE_HEADER_SECTION; | 29 | int ghl = GRE_HEADER_SECTION; |
| 30 | struct gre_base_hdr *greh; | 30 | struct gre_base_hdr *greh; |
| 31 | u16 mac_offset = skb->mac_header; | ||
| 31 | int mac_len = skb->mac_len; | 32 | int mac_len = skb->mac_len; |
| 32 | __be16 protocol = skb->protocol; | 33 | __be16 protocol = skb->protocol; |
| 33 | int tnl_hlen; | 34 | int tnl_hlen; |
| @@ -58,13 +59,13 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, | |||
| 58 | } else | 59 | } else |
| 59 | csum = false; | 60 | csum = false; |
| 60 | 61 | ||
| 62 | if (unlikely(!pskb_may_pull(skb, ghl))) | ||
| 63 | goto out; | ||
| 64 | |||
| 61 | /* setup inner skb. */ | 65 | /* setup inner skb. */ |
| 62 | skb->protocol = greh->protocol; | 66 | skb->protocol = greh->protocol; |
| 63 | skb->encapsulation = 0; | 67 | skb->encapsulation = 0; |
| 64 | 68 | ||
| 65 | if (unlikely(!pskb_may_pull(skb, ghl))) | ||
| 66 | goto out; | ||
| 67 | |||
| 68 | __skb_pull(skb, ghl); | 69 | __skb_pull(skb, ghl); |
| 69 | skb_reset_mac_header(skb); | 70 | skb_reset_mac_header(skb); |
| 70 | skb_set_network_header(skb, skb_inner_network_offset(skb)); | 71 | skb_set_network_header(skb, skb_inner_network_offset(skb)); |
| @@ -73,8 +74,10 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, | |||
| 73 | /* segment inner packet. */ | 74 | /* segment inner packet. */ |
| 74 | enc_features = skb->dev->hw_enc_features & netif_skb_features(skb); | 75 | enc_features = skb->dev->hw_enc_features & netif_skb_features(skb); |
| 75 | segs = skb_mac_gso_segment(skb, enc_features); | 76 | segs = skb_mac_gso_segment(skb, enc_features); |
| 76 | if (!segs || IS_ERR(segs)) | 77 | if (!segs || IS_ERR(segs)) { |
| 78 | skb_gso_error_unwind(skb, protocol, ghl, mac_offset, mac_len); | ||
| 77 | goto out; | 79 | goto out; |
| 80 | } | ||
| 78 | 81 | ||
| 79 | skb = segs; | 82 | skb = segs; |
| 80 | tnl_hlen = skb_tnl_header_len(skb); | 83 | tnl_hlen = skb_tnl_header_len(skb); |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index f140048334ce..a7e4729e974b 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -2478,6 +2478,7 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, | |||
| 2478 | netdev_features_t features) | 2478 | netdev_features_t features) |
| 2479 | { | 2479 | { |
| 2480 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 2480 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
| 2481 | u16 mac_offset = skb->mac_header; | ||
| 2481 | int mac_len = skb->mac_len; | 2482 | int mac_len = skb->mac_len; |
| 2482 | int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb); | 2483 | int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb); |
| 2483 | __be16 protocol = skb->protocol; | 2484 | __be16 protocol = skb->protocol; |
| @@ -2497,8 +2498,11 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, | |||
| 2497 | /* segment inner packet. */ | 2498 | /* segment inner packet. */ |
| 2498 | enc_features = skb->dev->hw_enc_features & netif_skb_features(skb); | 2499 | enc_features = skb->dev->hw_enc_features & netif_skb_features(skb); |
| 2499 | segs = skb_mac_gso_segment(skb, enc_features); | 2500 | segs = skb_mac_gso_segment(skb, enc_features); |
| 2500 | if (!segs || IS_ERR(segs)) | 2501 | if (!segs || IS_ERR(segs)) { |
| 2502 | skb_gso_error_unwind(skb, protocol, tnl_hlen, mac_offset, | ||
| 2503 | mac_len); | ||
| 2501 | goto out; | 2504 | goto out; |
| 2505 | } | ||
| 2502 | 2506 | ||
| 2503 | outer_hlen = skb_tnl_header_len(skb); | 2507 | outer_hlen = skb_tnl_header_len(skb); |
| 2504 | skb = segs; | 2508 | skb = segs; |
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 83206de2bc76..79c62bdcd3c5 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c | |||
| @@ -41,6 +41,14 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, | |||
| 41 | { | 41 | { |
| 42 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 42 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
| 43 | unsigned int mss; | 43 | unsigned int mss; |
| 44 | int offset; | ||
| 45 | __wsum csum; | ||
| 46 | |||
| 47 | if (skb->encapsulation && | ||
| 48 | skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) { | ||
| 49 | segs = skb_udp_tunnel_segment(skb, features); | ||
| 50 | goto out; | ||
| 51 | } | ||
| 44 | 52 | ||
| 45 | mss = skb_shinfo(skb)->gso_size; | 53 | mss = skb_shinfo(skb)->gso_size; |
| 46 | if (unlikely(skb->len <= mss)) | 54 | if (unlikely(skb->len <= mss)) |
| @@ -63,27 +71,20 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, | |||
| 63 | goto out; | 71 | goto out; |
| 64 | } | 72 | } |
| 65 | 73 | ||
| 74 | /* Do software UFO. Complete and fill in the UDP checksum as | ||
| 75 | * HW cannot do checksum of UDP packets sent as multiple | ||
| 76 | * IP fragments. | ||
| 77 | */ | ||
| 78 | offset = skb_checksum_start_offset(skb); | ||
| 79 | csum = skb_checksum(skb, offset, skb->len - offset, 0); | ||
| 80 | offset += skb->csum_offset; | ||
| 81 | *(__sum16 *)(skb->data + offset) = csum_fold(csum); | ||
| 82 | skb->ip_summed = CHECKSUM_NONE; | ||
| 83 | |||
| 66 | /* Fragment the skb. IP headers of the fragments are updated in | 84 | /* Fragment the skb. IP headers of the fragments are updated in |
| 67 | * inet_gso_segment() | 85 | * inet_gso_segment() |
| 68 | */ | 86 | */ |
| 69 | if (skb->encapsulation && skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) | 87 | segs = skb_segment(skb, features); |
| 70 | segs = skb_udp_tunnel_segment(skb, features); | ||
| 71 | else { | ||
| 72 | int offset; | ||
| 73 | __wsum csum; | ||
| 74 | |||
| 75 | /* Do software UFO. Complete and fill in the UDP checksum as | ||
| 76 | * HW cannot do checksum of UDP packets sent as multiple | ||
| 77 | * IP fragments. | ||
| 78 | */ | ||
| 79 | offset = skb_checksum_start_offset(skb); | ||
| 80 | csum = skb_checksum(skb, offset, skb->len - offset, 0); | ||
| 81 | offset += skb->csum_offset; | ||
| 82 | *(__sum16 *)(skb->data + offset) = csum_fold(csum); | ||
| 83 | skb->ip_summed = CHECKSUM_NONE; | ||
| 84 | |||
| 85 | segs = skb_segment(skb, features); | ||
| 86 | } | ||
| 87 | out: | 88 | out: |
| 88 | return segs; | 89 | return segs; |
| 89 | } | 90 | } |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d5fa5b8c443e..f62c72b59f8e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1671,7 +1671,7 @@ void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) | |||
| 1671 | static void addrconf_join_anycast(struct inet6_ifaddr *ifp) | 1671 | static void addrconf_join_anycast(struct inet6_ifaddr *ifp) |
| 1672 | { | 1672 | { |
| 1673 | struct in6_addr addr; | 1673 | struct in6_addr addr; |
| 1674 | if (ifp->prefix_len == 127) /* RFC 6164 */ | 1674 | if (ifp->prefix_len >= 127) /* RFC 6164 */ |
| 1675 | return; | 1675 | return; |
| 1676 | ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); | 1676 | ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); |
| 1677 | if (ipv6_addr_any(&addr)) | 1677 | if (ipv6_addr_any(&addr)) |
| @@ -1682,7 +1682,7 @@ static void addrconf_join_anycast(struct inet6_ifaddr *ifp) | |||
| 1682 | static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) | 1682 | static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) |
| 1683 | { | 1683 | { |
| 1684 | struct in6_addr addr; | 1684 | struct in6_addr addr; |
| 1685 | if (ifp->prefix_len == 127) /* RFC 6164 */ | 1685 | if (ifp->prefix_len >= 127) /* RFC 6164 */ |
| 1686 | return; | 1686 | return; |
| 1687 | ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); | 1687 | ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); |
| 1688 | if (ipv6_addr_any(&addr)) | 1688 | if (ipv6_addr_any(&addr)) |
| @@ -3456,7 +3456,12 @@ restart: | |||
| 3456 | &inet6_addr_lst[i], addr_lst) { | 3456 | &inet6_addr_lst[i], addr_lst) { |
| 3457 | unsigned long age; | 3457 | unsigned long age; |
| 3458 | 3458 | ||
| 3459 | if (ifp->flags & IFA_F_PERMANENT) | 3459 | /* When setting preferred_lft to a value not zero or |
| 3460 | * infinity, while valid_lft is infinity | ||
| 3461 | * IFA_F_PERMANENT has a non-infinity life time. | ||
| 3462 | */ | ||
| 3463 | if ((ifp->flags & IFA_F_PERMANENT) && | ||
| 3464 | (ifp->prefered_lft == INFINITY_LIFE_TIME)) | ||
| 3460 | continue; | 3465 | continue; |
| 3461 | 3466 | ||
| 3462 | spin_lock(&ifp->lock); | 3467 | spin_lock(&ifp->lock); |
| @@ -3481,7 +3486,8 @@ restart: | |||
| 3481 | ifp->flags |= IFA_F_DEPRECATED; | 3486 | ifp->flags |= IFA_F_DEPRECATED; |
| 3482 | } | 3487 | } |
| 3483 | 3488 | ||
| 3484 | if (time_before(ifp->tstamp + ifp->valid_lft * HZ, next)) | 3489 | if ((ifp->valid_lft != INFINITY_LIFE_TIME) && |
| 3490 | (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) | ||
| 3485 | next = ifp->tstamp + ifp->valid_lft * HZ; | 3491 | next = ifp->tstamp + ifp->valid_lft * HZ; |
| 3486 | 3492 | ||
| 3487 | spin_unlock(&ifp->lock); | 3493 | spin_unlock(&ifp->lock); |
| @@ -3761,7 +3767,8 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, | |||
| 3761 | put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope), | 3767 | put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope), |
| 3762 | ifa->idev->dev->ifindex); | 3768 | ifa->idev->dev->ifindex); |
| 3763 | 3769 | ||
| 3764 | if (!(ifa->flags&IFA_F_PERMANENT)) { | 3770 | if (!((ifa->flags&IFA_F_PERMANENT) && |
| 3771 | (ifa->prefered_lft == INFINITY_LIFE_TIME))) { | ||
| 3765 | preferred = ifa->prefered_lft; | 3772 | preferred = ifa->prefered_lft; |
| 3766 | valid = ifa->valid_lft; | 3773 | valid = ifa->valid_lft; |
| 3767 | if (preferred != INFINITY_LIFE_TIME) { | 3774 | if (preferred != INFINITY_LIFE_TIME) { |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index d6062325db08..7881965a8248 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -103,16 +103,25 @@ struct ip6_tnl_net { | |||
| 103 | 103 | ||
| 104 | static struct net_device_stats *ip6_get_stats(struct net_device *dev) | 104 | static struct net_device_stats *ip6_get_stats(struct net_device *dev) |
| 105 | { | 105 | { |
| 106 | struct pcpu_tstats sum = { 0 }; | 106 | struct pcpu_tstats tmp, sum = { 0 }; |
| 107 | int i; | 107 | int i; |
| 108 | 108 | ||
| 109 | for_each_possible_cpu(i) { | 109 | for_each_possible_cpu(i) { |
| 110 | unsigned int start; | ||
| 110 | const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i); | 111 | const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i); |
| 111 | 112 | ||
| 112 | sum.rx_packets += tstats->rx_packets; | 113 | do { |
| 113 | sum.rx_bytes += tstats->rx_bytes; | 114 | start = u64_stats_fetch_begin_bh(&tstats->syncp); |
| 114 | sum.tx_packets += tstats->tx_packets; | 115 | tmp.rx_packets = tstats->rx_packets; |
| 115 | sum.tx_bytes += tstats->tx_bytes; | 116 | tmp.rx_bytes = tstats->rx_bytes; |
| 117 | tmp.tx_packets = tstats->tx_packets; | ||
| 118 | tmp.tx_bytes = tstats->tx_bytes; | ||
| 119 | } while (u64_stats_fetch_retry_bh(&tstats->syncp, start)); | ||
| 120 | |||
| 121 | sum.rx_packets += tmp.rx_packets; | ||
| 122 | sum.rx_bytes += tmp.rx_bytes; | ||
| 123 | sum.tx_packets += tmp.tx_packets; | ||
| 124 | sum.tx_bytes += tmp.tx_bytes; | ||
| 116 | } | 125 | } |
| 117 | dev->stats.rx_packets = sum.rx_packets; | 126 | dev->stats.rx_packets = sum.rx_packets; |
| 118 | dev->stats.rx_bytes = sum.rx_bytes; | 127 | dev->stats.rx_bytes = sum.rx_bytes; |
| @@ -824,8 +833,10 @@ static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol, | |||
| 824 | } | 833 | } |
| 825 | 834 | ||
| 826 | tstats = this_cpu_ptr(t->dev->tstats); | 835 | tstats = this_cpu_ptr(t->dev->tstats); |
| 836 | u64_stats_update_begin(&tstats->syncp); | ||
| 827 | tstats->rx_packets++; | 837 | tstats->rx_packets++; |
| 828 | tstats->rx_bytes += skb->len; | 838 | tstats->rx_bytes += skb->len; |
| 839 | u64_stats_update_end(&tstats->syncp); | ||
| 829 | 840 | ||
| 830 | netif_rx(skb); | 841 | netif_rx(skb); |
| 831 | 842 | ||
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index ed94ba61dda0..a4564b05c47b 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
| @@ -75,26 +75,6 @@ struct vti6_net { | |||
| 75 | struct ip6_tnl __rcu **tnls[2]; | 75 | struct ip6_tnl __rcu **tnls[2]; |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | static struct net_device_stats *vti6_get_stats(struct net_device *dev) | ||
| 79 | { | ||
| 80 | struct pcpu_tstats sum = { 0 }; | ||
| 81 | int i; | ||
| 82 | |||
| 83 | for_each_possible_cpu(i) { | ||
| 84 | const struct pcpu_tstats *tstats = per_cpu_ptr(dev->tstats, i); | ||
| 85 | |||
| 86 | sum.rx_packets += tstats->rx_packets; | ||
| 87 | sum.rx_bytes += tstats->rx_bytes; | ||
| 88 | sum.tx_packets += tstats->tx_packets; | ||
| 89 | sum.tx_bytes += tstats->tx_bytes; | ||
| 90 | } | ||
| 91 | dev->stats.rx_packets = sum.rx_packets; | ||
| 92 | dev->stats.rx_bytes = sum.rx_bytes; | ||
| 93 | dev->stats.tx_packets = sum.tx_packets; | ||
| 94 | dev->stats.tx_bytes = sum.tx_bytes; | ||
| 95 | return &dev->stats; | ||
| 96 | } | ||
| 97 | |||
| 98 | #define for_each_vti6_tunnel_rcu(start) \ | 78 | #define for_each_vti6_tunnel_rcu(start) \ |
| 99 | for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) | 79 | for (t = rcu_dereference(start); t; t = rcu_dereference(t->next)) |
| 100 | 80 | ||
| @@ -331,8 +311,10 @@ static int vti6_rcv(struct sk_buff *skb) | |||
| 331 | } | 311 | } |
| 332 | 312 | ||
| 333 | tstats = this_cpu_ptr(t->dev->tstats); | 313 | tstats = this_cpu_ptr(t->dev->tstats); |
| 314 | u64_stats_update_begin(&tstats->syncp); | ||
| 334 | tstats->rx_packets++; | 315 | tstats->rx_packets++; |
| 335 | tstats->rx_bytes += skb->len; | 316 | tstats->rx_bytes += skb->len; |
| 317 | u64_stats_update_end(&tstats->syncp); | ||
| 336 | 318 | ||
| 337 | skb->mark = 0; | 319 | skb->mark = 0; |
| 338 | secpath_reset(skb); | 320 | secpath_reset(skb); |
| @@ -716,7 +698,7 @@ static const struct net_device_ops vti6_netdev_ops = { | |||
| 716 | .ndo_start_xmit = vti6_tnl_xmit, | 698 | .ndo_start_xmit = vti6_tnl_xmit, |
| 717 | .ndo_do_ioctl = vti6_ioctl, | 699 | .ndo_do_ioctl = vti6_ioctl, |
| 718 | .ndo_change_mtu = vti6_change_mtu, | 700 | .ndo_change_mtu = vti6_change_mtu, |
| 719 | .ndo_get_stats = vti6_get_stats, | 701 | .ndo_get_stats64 = ip_tunnel_get_stats64, |
| 720 | }; | 702 | }; |
| 721 | 703 | ||
| 722 | /** | 704 | /** |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index c87482252577..d3005b34476a 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -702,8 +702,10 @@ static int ipip6_rcv(struct sk_buff *skb) | |||
| 702 | } | 702 | } |
| 703 | 703 | ||
| 704 | tstats = this_cpu_ptr(tunnel->dev->tstats); | 704 | tstats = this_cpu_ptr(tunnel->dev->tstats); |
| 705 | u64_stats_update_begin(&tstats->syncp); | ||
| 705 | tstats->rx_packets++; | 706 | tstats->rx_packets++; |
| 706 | tstats->rx_bytes += skb->len; | 707 | tstats->rx_bytes += skb->len; |
| 708 | u64_stats_update_end(&tstats->syncp); | ||
| 707 | 709 | ||
| 708 | netif_rx(skb); | 710 | netif_rx(skb); |
| 709 | 711 | ||
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 7b01b9f5846c..c71b699eb555 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
| @@ -715,7 +715,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 715 | unsigned long cpu_flags; | 715 | unsigned long cpu_flags; |
| 716 | size_t copied = 0; | 716 | size_t copied = 0; |
| 717 | u32 peek_seq = 0; | 717 | u32 peek_seq = 0; |
| 718 | u32 *seq; | 718 | u32 *seq, skb_len; |
| 719 | unsigned long used; | 719 | unsigned long used; |
| 720 | int target; /* Read at least this many bytes */ | 720 | int target; /* Read at least this many bytes */ |
| 721 | long timeo; | 721 | long timeo; |
| @@ -812,6 +812,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 812 | } | 812 | } |
| 813 | continue; | 813 | continue; |
| 814 | found_ok_skb: | 814 | found_ok_skb: |
| 815 | skb_len = skb->len; | ||
| 815 | /* Ok so how much can we use? */ | 816 | /* Ok so how much can we use? */ |
| 816 | used = skb->len - offset; | 817 | used = skb->len - offset; |
| 817 | if (len < used) | 818 | if (len < used) |
| @@ -844,7 +845,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 844 | } | 845 | } |
| 845 | 846 | ||
| 846 | /* Partial read */ | 847 | /* Partial read */ |
| 847 | if (used + offset < skb->len) | 848 | if (used + offset < skb_len) |
| 848 | continue; | 849 | continue; |
| 849 | } while (len > 0); | 850 | } while (len > 0); |
| 850 | 851 | ||
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index f51ba985a36e..59268f6e2c36 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
| @@ -208,8 +208,6 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) | |||
| 208 | INIT_LIST_HEAD(&q->retransmit); | 208 | INIT_LIST_HEAD(&q->retransmit); |
| 209 | INIT_LIST_HEAD(&q->sacked); | 209 | INIT_LIST_HEAD(&q->sacked); |
| 210 | INIT_LIST_HEAD(&q->abandoned); | 210 | INIT_LIST_HEAD(&q->abandoned); |
| 211 | |||
| 212 | q->empty = 1; | ||
| 213 | } | 211 | } |
| 214 | 212 | ||
| 215 | /* Free the outqueue structure and any related pending chunks. | 213 | /* Free the outqueue structure and any related pending chunks. |
| @@ -332,7 +330,6 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
| 332 | SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS); | 330 | SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS); |
| 333 | else | 331 | else |
| 334 | SCTP_INC_STATS(net, SCTP_MIB_OUTORDERCHUNKS); | 332 | SCTP_INC_STATS(net, SCTP_MIB_OUTORDERCHUNKS); |
| 335 | q->empty = 0; | ||
| 336 | break; | 333 | break; |
| 337 | } | 334 | } |
| 338 | } else { | 335 | } else { |
| @@ -654,7 +651,6 @@ redo: | |||
| 654 | if (chunk->fast_retransmit == SCTP_NEED_FRTX) | 651 | if (chunk->fast_retransmit == SCTP_NEED_FRTX) |
| 655 | chunk->fast_retransmit = SCTP_DONT_FRTX; | 652 | chunk->fast_retransmit = SCTP_DONT_FRTX; |
| 656 | 653 | ||
| 657 | q->empty = 0; | ||
| 658 | q->asoc->stats.rtxchunks++; | 654 | q->asoc->stats.rtxchunks++; |
| 659 | break; | 655 | break; |
| 660 | } | 656 | } |
| @@ -1065,8 +1061,6 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | |||
| 1065 | 1061 | ||
| 1066 | sctp_transport_reset_timers(transport); | 1062 | sctp_transport_reset_timers(transport); |
| 1067 | 1063 | ||
| 1068 | q->empty = 0; | ||
| 1069 | |||
| 1070 | /* Only let one DATA chunk get bundled with a | 1064 | /* Only let one DATA chunk get bundled with a |
| 1071 | * COOKIE-ECHO chunk. | 1065 | * COOKIE-ECHO chunk. |
| 1072 | */ | 1066 | */ |
| @@ -1275,29 +1269,17 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
| 1275 | "advertised peer ack point:0x%x\n", __func__, asoc, ctsn, | 1269 | "advertised peer ack point:0x%x\n", __func__, asoc, ctsn, |
| 1276 | asoc->adv_peer_ack_point); | 1270 | asoc->adv_peer_ack_point); |
| 1277 | 1271 | ||
| 1278 | /* See if all chunks are acked. | 1272 | return sctp_outq_is_empty(q); |
| 1279 | * Make sure the empty queue handler will get run later. | ||
| 1280 | */ | ||
| 1281 | q->empty = (list_empty(&q->out_chunk_list) && | ||
| 1282 | list_empty(&q->retransmit)); | ||
| 1283 | if (!q->empty) | ||
| 1284 | goto finish; | ||
| 1285 | |||
| 1286 | list_for_each_entry(transport, transport_list, transports) { | ||
| 1287 | q->empty = q->empty && list_empty(&transport->transmitted); | ||
| 1288 | if (!q->empty) | ||
| 1289 | goto finish; | ||
| 1290 | } | ||
| 1291 | |||
| 1292 | pr_debug("%s: sack queue is empty\n", __func__); | ||
| 1293 | finish: | ||
| 1294 | return q->empty; | ||
| 1295 | } | 1273 | } |
| 1296 | 1274 | ||
| 1297 | /* Is the outqueue empty? */ | 1275 | /* Is the outqueue empty? |
| 1276 | * The queue is empty when we have not pending data, no in-flight data | ||
| 1277 | * and nothing pending retransmissions. | ||
| 1278 | */ | ||
| 1298 | int sctp_outq_is_empty(const struct sctp_outq *q) | 1279 | int sctp_outq_is_empty(const struct sctp_outq *q) |
| 1299 | { | 1280 | { |
| 1300 | return q->empty; | 1281 | return q->out_qlen == 0 && q->outstanding_bytes == 0 && |
| 1282 | list_empty(&q->retransmit); | ||
| 1301 | } | 1283 | } |
| 1302 | 1284 | ||
| 1303 | /******************************************************************** | 1285 | /******************************************************************** |
