Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Couple conflicts resolved here: 1) In the MACB driver, a bug fix to properly initialize the RX tail pointer properly overlapped with some changes to support variable sized rings. 2) In XGBE we had a "CONFIG_PM" --> "CONFIG_PM_SLEEP" fix overlapping with a reorganization of the driver to support ACPI, OF, as well as PCI variants of the chip. 3) In 'net' we had several probe error path bug fixes to the stmmac driver, meanwhile a lot of this code was cleaned up and reorganized in 'net-next'. 4) The cls_flower classifier obtained a helper function in 'net-next' called __fl_delete() and this overlapped with Daniel Borkamann's bug fix to use RCU for object destruction in 'net'. It also overlapped with Jiri's change to guard the rhashtable_remove_fast() call with a check against tc_skip_sw(). 5) In mlx4, a revert bug fix in 'net' overlapped with some unrelated changes in 'net-next'. 6) In geneve, a stale header pointer after pskb_expand_head() bug fix in 'net' overlapped with a large reorganization of the same code in 'net-next'. Since the 'net-next' code no longer had the bug in question, there was nothing to do other than to simply take the 'net-next' hunks. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
2745529ac7
8
CREDITS
8
CREDITS
|
@ -9,7 +9,7 @@
|
||||||
Linus
|
Linus
|
||||||
----------
|
----------
|
||||||
|
|
||||||
M: Matt Mackal
|
N: Matt Mackal
|
||||||
E: mpm@selenic.com
|
E: mpm@selenic.com
|
||||||
D: SLOB slab allocator
|
D: SLOB slab allocator
|
||||||
|
|
||||||
|
@ -1910,7 +1910,7 @@ S: Ra'annana, Israel
|
||||||
|
|
||||||
N: Andi Kleen
|
N: Andi Kleen
|
||||||
E: andi@firstfloor.org
|
E: andi@firstfloor.org
|
||||||
U: http://www.halobates.de
|
W: http://www.halobates.de
|
||||||
D: network, x86, NUMA, various hacks
|
D: network, x86, NUMA, various hacks
|
||||||
S: Schwalbenstr. 96
|
S: Schwalbenstr. 96
|
||||||
S: 85551 Ottobrunn
|
S: 85551 Ottobrunn
|
||||||
|
@ -2089,8 +2089,8 @@ D: ST Microelectronics SPEAr13xx PCI host bridge driver
|
||||||
D: Synopsys Designware PCI host bridge driver
|
D: Synopsys Designware PCI host bridge driver
|
||||||
|
|
||||||
N: Gabor Kuti
|
N: Gabor Kuti
|
||||||
M: seasons@falcon.sch.bme.hu
|
E: seasons@falcon.sch.bme.hu
|
||||||
M: seasons@makosteszta.sote.hu
|
E: seasons@makosteszta.sote.hu
|
||||||
D: Original author of software suspend
|
D: Original author of software suspend
|
||||||
|
|
||||||
N: Jaroslav Kysela
|
N: Jaroslav Kysela
|
||||||
|
|
|
@ -9,10 +9,26 @@ The following properties are common to the Ethernet controllers:
|
||||||
- max-speed: number, specifies maximum speed in Mbit/s supported by the device;
|
- max-speed: number, specifies maximum speed in Mbit/s supported by the device;
|
||||||
- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
|
- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
|
||||||
the maximum frame size (there's contradiction in ePAPR).
|
the maximum frame size (there's contradiction in ePAPR).
|
||||||
- phy-mode: string, operation mode of the PHY interface; supported values are
|
- phy-mode: string, operation mode of the PHY interface. This is now a de-facto
|
||||||
"mii", "gmii", "sgmii", "qsgmii", "tbi", "rev-mii", "rmii", "rgmii", "rgmii-id",
|
standard property; supported values are:
|
||||||
"rgmii-rxid", "rgmii-txid", "rtbi", "smii", "xgmii", "trgmii"; this is now a
|
* "mii"
|
||||||
de-facto standard property;
|
* "gmii"
|
||||||
|
* "sgmii"
|
||||||
|
* "qsgmii"
|
||||||
|
* "tbi"
|
||||||
|
* "rev-mii"
|
||||||
|
* "rmii"
|
||||||
|
* "rgmii" (RX and TX delays are added by the MAC when required)
|
||||||
|
* "rgmii-id" (RGMII with internal RX and TX delays provided by the PHY, the
|
||||||
|
MAC should not add the RX or TX delays in this case)
|
||||||
|
* "rgmii-rxid" (RGMII with internal RX delay provided by the PHY, the MAC
|
||||||
|
should not add an RX delay in this case)
|
||||||
|
* "rgmii-txid" (RGMII with internal TX delay provided by the PHY, the MAC
|
||||||
|
should not add an TX delay in this case)
|
||||||
|
* "rtbi"
|
||||||
|
* "smii"
|
||||||
|
* "xgmii"
|
||||||
|
* "trgmii"
|
||||||
- phy-connection-type: the same as "phy-mode" property but described in ePAPR;
|
- phy-connection-type: the same as "phy-mode" property but described in ePAPR;
|
||||||
- phy-handle: phandle, specifies a reference to a node representing a PHY
|
- phy-handle: phandle, specifies a reference to a node representing a PHY
|
||||||
device; this property is described in ePAPR and so preferred;
|
device; this property is described in ePAPR and so preferred;
|
||||||
|
|
|
@ -62,10 +62,13 @@ nf_conntrack_generic_timeout - INTEGER (seconds)
|
||||||
protocols.
|
protocols.
|
||||||
|
|
||||||
nf_conntrack_helper - BOOLEAN
|
nf_conntrack_helper - BOOLEAN
|
||||||
0 - disabled
|
0 - disabled (default)
|
||||||
not 0 - enabled (default)
|
not 0 - enabled
|
||||||
|
|
||||||
Enable automatic conntrack helper assignment.
|
Enable automatic conntrack helper assignment.
|
||||||
|
If disabled it is required to set up iptables rules to assign
|
||||||
|
helpers to connections. See the CT target description in the
|
||||||
|
iptables-extensions(8) man page for further information.
|
||||||
|
|
||||||
nf_conntrack_icmp_timeout - INTEGER (seconds)
|
nf_conntrack_icmp_timeout - INTEGER (seconds)
|
||||||
default 30
|
default 30
|
||||||
|
|
13
MAINTAINERS
13
MAINTAINERS
|
@ -9260,11 +9260,12 @@ S: Maintained
|
||||||
F: drivers/pci/host/*layerscape*
|
F: drivers/pci/host/*layerscape*
|
||||||
|
|
||||||
PCI DRIVER FOR IMX6
|
PCI DRIVER FOR IMX6
|
||||||
M: Richard Zhu <Richard.Zhu@freescale.com>
|
M: Richard Zhu <hongxing.zhu@nxp.com>
|
||||||
M: Lucas Stach <l.stach@pengutronix.de>
|
M: Lucas Stach <l.stach@pengutronix.de>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
|
||||||
F: drivers/pci/host/*imx6*
|
F: drivers/pci/host/*imx6*
|
||||||
|
|
||||||
PCI DRIVER FOR TI KEYSTONE
|
PCI DRIVER FOR TI KEYSTONE
|
||||||
|
@ -9323,17 +9324,11 @@ F: drivers/pci/host/pci-exynos.c
|
||||||
|
|
||||||
PCI DRIVER FOR SYNOPSIS DESIGNWARE
|
PCI DRIVER FOR SYNOPSIS DESIGNWARE
|
||||||
M: Jingoo Han <jingoohan1@gmail.com>
|
M: Jingoo Han <jingoohan1@gmail.com>
|
||||||
M: Pratyush Anand <pratyush.anand@gmail.com>
|
M: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||||
L: linux-pci@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/pci/host/*designware*
|
|
||||||
|
|
||||||
PCI DRIVER FOR SYNOPSYS PROTOTYPING DEVICE
|
|
||||||
M: Jose Abreu <Jose.Abreu@synopsys.com>
|
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/pci/designware-pcie.txt
|
F: Documentation/devicetree/bindings/pci/designware-pcie.txt
|
||||||
F: drivers/pci/host/pcie-designware-plat.c
|
F: drivers/pci/host/*designware*
|
||||||
|
|
||||||
PCI DRIVER FOR GENERIC OF HOSTS
|
PCI DRIVER FOR GENERIC OF HOSTS
|
||||||
M: Will Deacon <will.deacon@arm.com>
|
M: Will Deacon <will.deacon@arm.com>
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc7
|
||||||
NAME = Psychotic Stoned Sheep
|
NAME = Psychotic Stoned Sheep
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -1019,8 +1019,6 @@ prepare2: prepare3 prepare-compiler-check outputmakefile asm-generic
|
||||||
prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
|
prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
|
||||||
include/config/auto.conf
|
include/config/auto.conf
|
||||||
$(cmd_crmodverdir)
|
$(cmd_crmodverdir)
|
||||||
$(Q)test -e include/generated/autoksyms.h || \
|
|
||||||
touch include/generated/autoksyms.h
|
|
||||||
|
|
||||||
archprepare: archheaders archscripts prepare1 scripts_basic
|
archprepare: archheaders archscripts prepare1 scripts_basic
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,11 @@
|
||||||
static inline void __delay(unsigned long loops)
|
static inline void __delay(unsigned long loops)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
" mov lp_count, %0 \n"
|
||||||
" lp 1f \n"
|
" lp 1f \n"
|
||||||
" nop \n"
|
" nop \n"
|
||||||
"1: \n"
|
"1: \n"
|
||||||
: "+l"(loops));
|
: : "r"(loops));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void __bad_udelay(void);
|
extern void __bad_udelay(void);
|
||||||
|
|
|
@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
|
||||||
|
|
||||||
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||||
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
||||||
#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
|
#define pfn_pte(pfn, prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot))
|
||||||
|
|
||||||
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
||||||
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
static int l2_line_sz;
|
static int l2_line_sz;
|
||||||
static int ioc_exists;
|
static int ioc_exists;
|
||||||
int slc_enable = 1, ioc_enable = 1;
|
int slc_enable = 1, ioc_enable = 0;
|
||||||
unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
|
unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
|
||||||
unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
|
unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
|
||||||
|
|
||||||
|
|
|
@ -745,7 +745,6 @@ dtb-$(CONFIG_MACH_SUN4I) += \
|
||||||
sun4i-a10-pcduino2.dtb \
|
sun4i-a10-pcduino2.dtb \
|
||||||
sun4i-a10-pov-protab2-ips9.dtb
|
sun4i-a10-pov-protab2-ips9.dtb
|
||||||
dtb-$(CONFIG_MACH_SUN5I) += \
|
dtb-$(CONFIG_MACH_SUN5I) += \
|
||||||
ntc-gr8-evb.dtb \
|
|
||||||
sun5i-a10s-auxtek-t003.dtb \
|
sun5i-a10s-auxtek-t003.dtb \
|
||||||
sun5i-a10s-auxtek-t004.dtb \
|
sun5i-a10s-auxtek-t004.dtb \
|
||||||
sun5i-a10s-mk802.dtb \
|
sun5i-a10s-mk802.dtb \
|
||||||
|
@ -761,6 +760,7 @@ dtb-$(CONFIG_MACH_SUN5I) += \
|
||||||
sun5i-a13-olinuxino-micro.dtb \
|
sun5i-a13-olinuxino-micro.dtb \
|
||||||
sun5i-a13-q8-tablet.dtb \
|
sun5i-a13-q8-tablet.dtb \
|
||||||
sun5i-a13-utoo-p66.dtb \
|
sun5i-a13-utoo-p66.dtb \
|
||||||
|
sun5i-gr8-evb.dtb \
|
||||||
sun5i-r8-chip.dtb
|
sun5i-r8-chip.dtb
|
||||||
dtb-$(CONFIG_MACH_SUN6I) += \
|
dtb-$(CONFIG_MACH_SUN6I) += \
|
||||||
sun6i-a31-app4-evb1.dtb \
|
sun6i-a31-app4-evb1.dtb \
|
||||||
|
|
|
@ -283,6 +283,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c0_default>;
|
pinctrl-0 = <&pinctrl_i2c0_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -296,6 +298,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c1_default>;
|
pinctrl-0 = <&pinctrl_i2c1_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -309,6 +313,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c2_default>;
|
pinctrl-0 = <&pinctrl_i2c2_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -322,6 +328,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c3_default>;
|
pinctrl-0 = <&pinctrl_i2c3_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -335,6 +343,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c4_default>;
|
pinctrl-0 = <&pinctrl_i2c4_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -348,6 +358,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c5_default>;
|
pinctrl-0 = <&pinctrl_i2c5_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -363,6 +375,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c10_default>;
|
pinctrl-0 = <&pinctrl_i2c10_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -376,6 +390,8 @@
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_i2c11_default>;
|
pinctrl-0 = <&pinctrl_i2c11_default>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "ntc-gr8.dtsi"
|
#include "sun5i-gr8.dtsi"
|
||||||
#include "sunxi-common-regulators.dtsi"
|
#include "sunxi-common-regulators.dtsi"
|
||||||
|
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
|
@ -393,7 +393,7 @@
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
ranges = <0x01000000 0x00 0x5f800000 0x00 0x5f800000 0x0 0x00800000>,
|
ranges = <0x01000000 0x00 0x00000000 0x00 0x5f800000 0x0 0x00800000>,
|
||||||
<0x02000000 0x00 0x50000000 0x00 0x50000000 0x0 0x08000000>,
|
<0x02000000 0x00 0x50000000 0x00 0x50000000 0x0 0x08000000>,
|
||||||
<0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>;
|
<0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
compatible = "arm,idle-state";
|
compatible = "arm,idle-state";
|
||||||
arm,psci-suspend-param = <0x1010000>;
|
arm,psci-suspend-param = <0x1010000>;
|
||||||
local-timer-stop;
|
local-timer-stop;
|
||||||
entry-latency-us = <300>;
|
entry-latency-us = <400>;
|
||||||
exit-latency-us = <1200>;
|
exit-latency-us = <1200>;
|
||||||
min-residency-us = <2500>;
|
min-residency-us = <2500>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
compatible = "arm,idle-state";
|
compatible = "arm,idle-state";
|
||||||
arm,psci-suspend-param = <0x1010000>;
|
arm,psci-suspend-param = <0x1010000>;
|
||||||
local-timer-stop;
|
local-timer-stop;
|
||||||
entry-latency-us = <300>;
|
entry-latency-us = <400>;
|
||||||
exit-latency-us = <1200>;
|
exit-latency-us = <1200>;
|
||||||
min-residency-us = <2500>;
|
min-residency-us = <2500>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
compatible = "arm,idle-state";
|
compatible = "arm,idle-state";
|
||||||
arm,psci-suspend-param = <0x1010000>;
|
arm,psci-suspend-param = <0x1010000>;
|
||||||
local-timer-stop;
|
local-timer-stop;
|
||||||
entry-latency-us = <300>;
|
entry-latency-us = <400>;
|
||||||
exit-latency-us = <1200>;
|
exit-latency-us = <1200>;
|
||||||
min-residency-us = <2500>;
|
min-residency-us = <2500>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -214,6 +214,12 @@
|
||||||
#error Bad page size configuration for hugetlbfs!
|
#error Bad page size configuration for hugetlbfs!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wired register bits
|
||||||
|
*/
|
||||||
|
#define MIPSR6_WIRED_LIMIT (_ULCAST_(0xffff) << 16)
|
||||||
|
#define MIPSR6_WIRED_WIRED (_ULCAST_(0xffff) << 0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Values used for computation of new tlb entries
|
* Values used for computation of new tlb entries
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef __ASM_TLB_H
|
#ifndef __ASM_TLB_H
|
||||||
#define __ASM_TLB_H
|
#define __ASM_TLB_H
|
||||||
|
|
||||||
|
#include <asm/cpu-features.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MIPS doesn't need any special per-pte or per-vma handling, except
|
* MIPS doesn't need any special per-pte or per-vma handling, except
|
||||||
* we need to flush cache for area to be unmapped.
|
* we need to flush cache for area to be unmapped.
|
||||||
|
@ -22,6 +25,16 @@
|
||||||
((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \
|
((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \
|
||||||
(cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0))
|
(cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0))
|
||||||
|
|
||||||
|
static inline unsigned int num_wired_entries(void)
|
||||||
|
{
|
||||||
|
unsigned int wired = read_c0_wired();
|
||||||
|
|
||||||
|
if (cpu_has_mips_r6)
|
||||||
|
wired &= MIPSR6_WIRED_WIRED;
|
||||||
|
|
||||||
|
return wired;
|
||||||
|
}
|
||||||
|
|
||||||
#include <asm-generic/tlb.h>
|
#include <asm-generic/tlb.h>
|
||||||
|
|
||||||
#endif /* __ASM_TLB_H */
|
#endif /* __ASM_TLB_H */
|
||||||
|
|
|
@ -209,17 +209,18 @@ bad_area_nosemaphore:
|
||||||
if (show_unhandled_signals &&
|
if (show_unhandled_signals &&
|
||||||
unhandled_signal(tsk, SIGSEGV) &&
|
unhandled_signal(tsk, SIGSEGV) &&
|
||||||
__ratelimit(&ratelimit_state)) {
|
__ratelimit(&ratelimit_state)) {
|
||||||
pr_info("\ndo_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx",
|
pr_info("do_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx\n",
|
||||||
tsk->comm,
|
tsk->comm,
|
||||||
write ? "write access to" : "read access from",
|
write ? "write access to" : "read access from",
|
||||||
field, address);
|
field, address);
|
||||||
pr_info("epc = %0*lx in", field,
|
pr_info("epc = %0*lx in", field,
|
||||||
(unsigned long) regs->cp0_epc);
|
(unsigned long) regs->cp0_epc);
|
||||||
print_vma_addr(" ", regs->cp0_epc);
|
print_vma_addr(KERN_CONT " ", regs->cp0_epc);
|
||||||
|
pr_cont("\n");
|
||||||
pr_info("ra = %0*lx in", field,
|
pr_info("ra = %0*lx in", field,
|
||||||
(unsigned long) regs->regs[31]);
|
(unsigned long) regs->regs[31]);
|
||||||
print_vma_addr(" ", regs->regs[31]);
|
print_vma_addr(KERN_CONT " ", regs->regs[31]);
|
||||||
pr_info("\n");
|
pr_cont("\n");
|
||||||
}
|
}
|
||||||
current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f;
|
current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f;
|
||||||
info.si_signo = SIGSEGV;
|
info.si_signo = SIGSEGV;
|
||||||
|
|
|
@ -118,7 +118,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot)
|
||||||
writex_c0_entrylo1(entrylo);
|
writex_c0_entrylo1(entrylo);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
tlbidx = read_c0_wired();
|
tlbidx = num_wired_entries();
|
||||||
write_c0_wired(tlbidx + 1);
|
write_c0_wired(tlbidx + 1);
|
||||||
write_c0_index(tlbidx);
|
write_c0_index(tlbidx);
|
||||||
mtc0_tlbw_hazard();
|
mtc0_tlbw_hazard();
|
||||||
|
@ -147,7 +147,7 @@ void kunmap_coherent(void)
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
old_ctx = read_c0_entryhi();
|
old_ctx = read_c0_entryhi();
|
||||||
wired = read_c0_wired() - 1;
|
wired = num_wired_entries() - 1;
|
||||||
write_c0_wired(wired);
|
write_c0_wired(wired);
|
||||||
write_c0_index(wired);
|
write_c0_index(wired);
|
||||||
write_c0_entryhi(UNIQUE_ENTRYHI(wired));
|
write_c0_entryhi(UNIQUE_ENTRYHI(wired));
|
||||||
|
|
|
@ -65,7 +65,7 @@ void local_flush_tlb_all(void)
|
||||||
write_c0_entrylo0(0);
|
write_c0_entrylo0(0);
|
||||||
write_c0_entrylo1(0);
|
write_c0_entrylo1(0);
|
||||||
|
|
||||||
entry = read_c0_wired();
|
entry = num_wired_entries();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Blast 'em all away.
|
* Blast 'em all away.
|
||||||
|
@ -385,7 +385,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||||
old_ctx = read_c0_entryhi();
|
old_ctx = read_c0_entryhi();
|
||||||
htw_stop();
|
htw_stop();
|
||||||
old_pagemask = read_c0_pagemask();
|
old_pagemask = read_c0_pagemask();
|
||||||
wired = read_c0_wired();
|
wired = num_wired_entries();
|
||||||
write_c0_wired(wired + 1);
|
write_c0_wired(wired + 1);
|
||||||
write_c0_index(wired);
|
write_c0_index(wired);
|
||||||
tlbw_use_hazard(); /* What is the hazard here? */
|
tlbw_use_hazard(); /* What is the hazard here? */
|
||||||
|
@ -449,7 +449,7 @@ __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||||
htw_stop();
|
htw_stop();
|
||||||
old_ctx = read_c0_entryhi();
|
old_ctx = read_c0_entryhi();
|
||||||
old_pagemask = read_c0_pagemask();
|
old_pagemask = read_c0_pagemask();
|
||||||
wired = read_c0_wired();
|
wired = num_wired_entries();
|
||||||
if (--temp_tlb_entry < wired) {
|
if (--temp_tlb_entry < wired) {
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"No TLB space left for add_temporary_entry\n");
|
"No TLB space left for add_temporary_entry\n");
|
||||||
|
|
|
@ -1436,13 +1436,6 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
|
||||||
"ahci: MRSM is on, fallback to single MSI\n");
|
"ahci: MRSM is on, fallback to single MSI\n");
|
||||||
pci_free_irq_vectors(pdev);
|
pci_free_irq_vectors(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* -ENOSPC indicated we don't have enough vectors. Don't bother
|
|
||||||
* trying a single vectors for any other error:
|
|
||||||
*/
|
|
||||||
if (nvec < 0 && nvec != -ENOSPC)
|
|
||||||
return nvec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||||
desc[1] = tf->command; /* status */
|
desc[1] = tf->command; /* status */
|
||||||
desc[2] = tf->device;
|
desc[2] = tf->device;
|
||||||
desc[3] = tf->nsect;
|
desc[3] = tf->nsect;
|
||||||
desc[0] = 0;
|
desc[7] = 0;
|
||||||
if (tf->flags & ATA_TFLAG_LBA48) {
|
if (tf->flags & ATA_TFLAG_LBA48) {
|
||||||
desc[8] |= 0x80;
|
desc[8] |= 0x80;
|
||||||
if (tf->hob_nsect)
|
if (tf->hob_nsect)
|
||||||
|
|
|
@ -1403,6 +1403,7 @@ static ssize_t hot_remove_store(struct class *class,
|
||||||
zram = idr_find(&zram_index_idr, dev_id);
|
zram = idr_find(&zram_index_idr, dev_id);
|
||||||
if (zram) {
|
if (zram) {
|
||||||
ret = zram_remove(zram);
|
ret = zram_remove(zram);
|
||||||
|
if (!ret)
|
||||||
idr_remove(&zram_index_idr, dev_id);
|
idr_remove(&zram_index_idr, dev_id);
|
||||||
} else {
|
} else {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
|
|
|
@ -20,7 +20,7 @@ config CLK_BCM_KONA
|
||||||
|
|
||||||
config COMMON_CLK_IPROC
|
config COMMON_CLK_IPROC
|
||||||
bool "Broadcom iProc clock support"
|
bool "Broadcom iProc clock support"
|
||||||
depends on ARCH_BCM_IPROC || COMPILE_TEST
|
depends on ARCH_BCM_IPROC || ARCH_BCM_63XX || COMPILE_TEST
|
||||||
depends on COMMON_CLK
|
depends on COMMON_CLK
|
||||||
default ARCH_BCM_IPROC
|
default ARCH_BCM_IPROC
|
||||||
help
|
help
|
||||||
|
|
|
@ -143,7 +143,7 @@ static SUNXI_CCU_NKM_WITH_MUX_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
||||||
4, 2, /* K */
|
4, 2, /* K */
|
||||||
0, 4, /* M */
|
0, 4, /* M */
|
||||||
21, 0, /* mux */
|
21, 0, /* mux */
|
||||||
BIT(31), /* gate */
|
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||||
BIT(28), /* lock */
|
BIT(28), /* lock */
|
||||||
CLK_SET_RATE_UNGATE);
|
CLK_SET_RATE_UNGATE);
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,7 @@ static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
||||||
8, 4, /* N */
|
8, 4, /* N */
|
||||||
4, 2, /* K */
|
4, 2, /* K */
|
||||||
0, 4, /* M */
|
0, 4, /* M */
|
||||||
BIT(31), /* gate */
|
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||||
BIT(28), /* lock */
|
BIT(28), /* lock */
|
||||||
CLK_SET_RATE_UNGATE);
|
CLK_SET_RATE_UNGATE);
|
||||||
|
|
||||||
|
|
|
@ -381,9 +381,7 @@ static int octeon_i2c_read(struct octeon_i2c *i2c, int target,
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
data[i] = octeon_i2c_data_read(i2c, &result);
|
data[i] = octeon_i2c_data_read(i2c);
|
||||||
if (result)
|
|
||||||
return result;
|
|
||||||
if (recv_len && i == 0) {
|
if (recv_len && i == 0) {
|
||||||
if (data[i] > I2C_SMBUS_BLOCK_MAX + 1)
|
if (data[i] > I2C_SMBUS_BLOCK_MAX + 1)
|
||||||
return -EPROTO;
|
return -EPROTO;
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/i2c-smbus.h>
|
#include <linux/i2c-smbus.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/iopoll.h>
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
|
||||||
|
@ -145,9 +144,9 @@ static inline void octeon_i2c_reg_write(struct octeon_i2c *i2c, u64 eop_reg, u8
|
||||||
u64 tmp;
|
u64 tmp;
|
||||||
|
|
||||||
__raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI(i2c));
|
__raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI(i2c));
|
||||||
|
do {
|
||||||
readq_poll_timeout(i2c->twsi_base + SW_TWSI(i2c), tmp, tmp & SW_TWSI_V,
|
tmp = __raw_readq(i2c->twsi_base + SW_TWSI(i2c));
|
||||||
I2C_OCTEON_EVENT_WAIT, i2c->adap.timeout);
|
} while ((tmp & SW_TWSI_V) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define octeon_i2c_ctl_write(i2c, val) \
|
#define octeon_i2c_ctl_write(i2c, val) \
|
||||||
|
@ -164,28 +163,24 @@ static inline void octeon_i2c_reg_write(struct octeon_i2c *i2c, u64 eop_reg, u8
|
||||||
*
|
*
|
||||||
* The I2C core registers are accessed indirectly via the SW_TWSI CSR.
|
* The I2C core registers are accessed indirectly via the SW_TWSI CSR.
|
||||||
*/
|
*/
|
||||||
static inline int octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg,
|
static inline u8 octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg)
|
||||||
int *error)
|
|
||||||
{
|
{
|
||||||
u64 tmp;
|
u64 tmp;
|
||||||
int ret;
|
|
||||||
|
|
||||||
__raw_writeq(SW_TWSI_V | eop_reg | SW_TWSI_R, i2c->twsi_base + SW_TWSI(i2c));
|
__raw_writeq(SW_TWSI_V | eop_reg | SW_TWSI_R, i2c->twsi_base + SW_TWSI(i2c));
|
||||||
|
do {
|
||||||
|
tmp = __raw_readq(i2c->twsi_base + SW_TWSI(i2c));
|
||||||
|
} while ((tmp & SW_TWSI_V) != 0);
|
||||||
|
|
||||||
ret = readq_poll_timeout(i2c->twsi_base + SW_TWSI(i2c), tmp,
|
|
||||||
tmp & SW_TWSI_V, I2C_OCTEON_EVENT_WAIT,
|
|
||||||
i2c->adap.timeout);
|
|
||||||
if (error)
|
|
||||||
*error = ret;
|
|
||||||
return tmp & 0xFF;
|
return tmp & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define octeon_i2c_ctl_read(i2c) \
|
#define octeon_i2c_ctl_read(i2c) \
|
||||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL, NULL)
|
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL)
|
||||||
#define octeon_i2c_data_read(i2c, error) \
|
#define octeon_i2c_data_read(i2c) \
|
||||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA, error)
|
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA)
|
||||||
#define octeon_i2c_stat_read(i2c) \
|
#define octeon_i2c_stat_read(i2c) \
|
||||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_STAT, NULL)
|
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_STAT)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* octeon_i2c_read_int - read the TWSI_INT register
|
* octeon_i2c_read_int - read the TWSI_INT register
|
||||||
|
|
|
@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
||||||
if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
|
if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
|
||||||
&max_proto, set_properties, true))
|
&max_proto, set_properties, true))
|
||||||
return PSMOUSE_TOUCHKIT_PS2;
|
return PSMOUSE_TOUCHKIT_PS2;
|
||||||
|
|
||||||
if (psmouse_try_protocol(psmouse, PSMOUSE_BYD,
|
|
||||||
&max_proto, set_properties, true))
|
|
||||||
return PSMOUSE_BYD;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -338,7 +338,9 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb,
|
||||||
struct pci_dev *pdev = to_pci_dev(data);
|
struct pci_dev *pdev = to_pci_dev(data);
|
||||||
struct dmar_pci_notify_info *info;
|
struct dmar_pci_notify_info *info;
|
||||||
|
|
||||||
/* Only care about add/remove events for physical functions */
|
/* Only care about add/remove events for physical functions.
|
||||||
|
* For VFs we actually do the lookup based on the corresponding
|
||||||
|
* PF in device_to_iommu() anyway. */
|
||||||
if (pdev->is_virtfn)
|
if (pdev->is_virtfn)
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
if (action != BUS_NOTIFY_ADD_DEVICE &&
|
if (action != BUS_NOTIFY_ADD_DEVICE &&
|
||||||
|
|
|
@ -892,7 +892,13 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (dev_is_pci(dev)) {
|
if (dev_is_pci(dev)) {
|
||||||
|
struct pci_dev *pf_pdev;
|
||||||
|
|
||||||
pdev = to_pci_dev(dev);
|
pdev = to_pci_dev(dev);
|
||||||
|
/* VFs aren't listed in scope tables; we need to look up
|
||||||
|
* the PF instead to find the IOMMU. */
|
||||||
|
pf_pdev = pci_physfn(pdev);
|
||||||
|
dev = &pf_pdev->dev;
|
||||||
segment = pci_domain_nr(pdev->bus);
|
segment = pci_domain_nr(pdev->bus);
|
||||||
} else if (has_acpi_companion(dev))
|
} else if (has_acpi_companion(dev))
|
||||||
dev = &ACPI_COMPANION(dev)->dev;
|
dev = &ACPI_COMPANION(dev)->dev;
|
||||||
|
@ -905,6 +911,13 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
|
||||||
for_each_active_dev_scope(drhd->devices,
|
for_each_active_dev_scope(drhd->devices,
|
||||||
drhd->devices_cnt, i, tmp) {
|
drhd->devices_cnt, i, tmp) {
|
||||||
if (tmp == dev) {
|
if (tmp == dev) {
|
||||||
|
/* For a VF use its original BDF# not that of the PF
|
||||||
|
* which we used for the IOMMU lookup. Strictly speaking
|
||||||
|
* we could do this for all PCI devices; we only need to
|
||||||
|
* get the BDF# from the scope table for ACPI matches. */
|
||||||
|
if (pdev->is_virtfn)
|
||||||
|
goto got_pdev;
|
||||||
|
|
||||||
*bus = drhd->devices[i].bus;
|
*bus = drhd->devices[i].bus;
|
||||||
*devfn = drhd->devices[i].devfn;
|
*devfn = drhd->devices[i].devfn;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -39,10 +39,18 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
|
||||||
struct page *pages;
|
struct page *pages;
|
||||||
int order;
|
int order;
|
||||||
|
|
||||||
order = ecap_pss(iommu->ecap) + 7 - PAGE_SHIFT;
|
/* Start at 2 because it's defined as 2^(1+PSS) */
|
||||||
if (order < 0)
|
iommu->pasid_max = 2 << ecap_pss(iommu->ecap);
|
||||||
order = 0;
|
|
||||||
|
|
||||||
|
/* Eventually I'm promised we will get a multi-level PASID table
|
||||||
|
* and it won't have to be physically contiguous. Until then,
|
||||||
|
* limit the size because 8MiB contiguous allocations can be hard
|
||||||
|
* to come by. The limit of 0x20000, which is 1MiB for each of
|
||||||
|
* the PASID and PASID-state tables, is somewhat arbitrary. */
|
||||||
|
if (iommu->pasid_max > 0x20000)
|
||||||
|
iommu->pasid_max = 0x20000;
|
||||||
|
|
||||||
|
order = get_order(sizeof(struct pasid_entry) * iommu->pasid_max);
|
||||||
pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
|
pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
|
||||||
if (!pages) {
|
if (!pages) {
|
||||||
pr_warn("IOMMU: %s: Failed to allocate PASID table\n",
|
pr_warn("IOMMU: %s: Failed to allocate PASID table\n",
|
||||||
|
@ -53,6 +61,8 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
|
||||||
pr_info("%s: Allocated order %d PASID table.\n", iommu->name, order);
|
pr_info("%s: Allocated order %d PASID table.\n", iommu->name, order);
|
||||||
|
|
||||||
if (ecap_dis(iommu->ecap)) {
|
if (ecap_dis(iommu->ecap)) {
|
||||||
|
/* Just making it explicit... */
|
||||||
|
BUILD_BUG_ON(sizeof(struct pasid_entry) != sizeof(struct pasid_state_entry));
|
||||||
pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
|
pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
|
||||||
if (pages)
|
if (pages)
|
||||||
iommu->pasid_state_table = page_address(pages);
|
iommu->pasid_state_table = page_address(pages);
|
||||||
|
@ -68,11 +78,7 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
|
||||||
|
|
||||||
int intel_svm_free_pasid_tables(struct intel_iommu *iommu)
|
int intel_svm_free_pasid_tables(struct intel_iommu *iommu)
|
||||||
{
|
{
|
||||||
int order;
|
int order = get_order(sizeof(struct pasid_entry) * iommu->pasid_max);
|
||||||
|
|
||||||
order = ecap_pss(iommu->ecap) + 7 - PAGE_SHIFT;
|
|
||||||
if (order < 0)
|
|
||||||
order = 0;
|
|
||||||
|
|
||||||
if (iommu->pasid_table) {
|
if (iommu->pasid_table) {
|
||||||
free_pages((unsigned long)iommu->pasid_table, order);
|
free_pages((unsigned long)iommu->pasid_table, order);
|
||||||
|
@ -371,8 +377,8 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_
|
||||||
}
|
}
|
||||||
svm->iommu = iommu;
|
svm->iommu = iommu;
|
||||||
|
|
||||||
if (pasid_max > 2 << ecap_pss(iommu->ecap))
|
if (pasid_max > iommu->pasid_max)
|
||||||
pasid_max = 2 << ecap_pss(iommu->ecap);
|
pasid_max = iommu->pasid_max;
|
||||||
|
|
||||||
/* Do not use PASID 0 in caching mode (virtualised IOMMU) */
|
/* Do not use PASID 0 in caching mode (virtualised IOMMU) */
|
||||||
ret = idr_alloc(&iommu->pasid_idr, svm,
|
ret = idr_alloc(&iommu->pasid_idr, svm,
|
||||||
|
|
|
@ -43,11 +43,22 @@ struct __packed pucan_command {
|
||||||
u16 args[3];
|
u16 args[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PUCAN_TSLOW_BRP_BITS 10
|
||||||
|
#define PUCAN_TSLOW_TSGEG1_BITS 8
|
||||||
|
#define PUCAN_TSLOW_TSGEG2_BITS 7
|
||||||
|
#define PUCAN_TSLOW_SJW_BITS 7
|
||||||
|
|
||||||
|
#define PUCAN_TSLOW_BRP_MASK ((1 << PUCAN_TSLOW_BRP_BITS) - 1)
|
||||||
|
#define PUCAN_TSLOW_TSEG1_MASK ((1 << PUCAN_TSLOW_TSGEG1_BITS) - 1)
|
||||||
|
#define PUCAN_TSLOW_TSEG2_MASK ((1 << PUCAN_TSLOW_TSGEG2_BITS) - 1)
|
||||||
|
#define PUCAN_TSLOW_SJW_MASK ((1 << PUCAN_TSLOW_SJW_BITS) - 1)
|
||||||
|
|
||||||
/* uCAN TIMING_SLOW command fields */
|
/* uCAN TIMING_SLOW command fields */
|
||||||
#define PUCAN_TSLOW_SJW_T(s, t) (((s) & 0xf) | ((!!(t)) << 7))
|
#define PUCAN_TSLOW_SJW_T(s, t) (((s) & PUCAN_TSLOW_SJW_MASK) | \
|
||||||
#define PUCAN_TSLOW_TSEG2(t) ((t) & 0xf)
|
((!!(t)) << 7))
|
||||||
#define PUCAN_TSLOW_TSEG1(t) ((t) & 0x3f)
|
#define PUCAN_TSLOW_TSEG2(t) ((t) & PUCAN_TSLOW_TSEG2_MASK)
|
||||||
#define PUCAN_TSLOW_BRP(b) ((b) & 0x3ff)
|
#define PUCAN_TSLOW_TSEG1(t) ((t) & PUCAN_TSLOW_TSEG1_MASK)
|
||||||
|
#define PUCAN_TSLOW_BRP(b) ((b) & PUCAN_TSLOW_BRP_MASK)
|
||||||
|
|
||||||
struct __packed pucan_timing_slow {
|
struct __packed pucan_timing_slow {
|
||||||
__le16 opcode_channel;
|
__le16 opcode_channel;
|
||||||
|
@ -60,11 +71,21 @@ struct __packed pucan_timing_slow {
|
||||||
__le16 brp; /* BaudRate Prescaler */
|
__le16 brp; /* BaudRate Prescaler */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PUCAN_TFAST_BRP_BITS 10
|
||||||
|
#define PUCAN_TFAST_TSGEG1_BITS 5
|
||||||
|
#define PUCAN_TFAST_TSGEG2_BITS 4
|
||||||
|
#define PUCAN_TFAST_SJW_BITS 4
|
||||||
|
|
||||||
|
#define PUCAN_TFAST_BRP_MASK ((1 << PUCAN_TFAST_BRP_BITS) - 1)
|
||||||
|
#define PUCAN_TFAST_TSEG1_MASK ((1 << PUCAN_TFAST_TSGEG1_BITS) - 1)
|
||||||
|
#define PUCAN_TFAST_TSEG2_MASK ((1 << PUCAN_TFAST_TSGEG2_BITS) - 1)
|
||||||
|
#define PUCAN_TFAST_SJW_MASK ((1 << PUCAN_TFAST_SJW_BITS) - 1)
|
||||||
|
|
||||||
/* uCAN TIMING_FAST command fields */
|
/* uCAN TIMING_FAST command fields */
|
||||||
#define PUCAN_TFAST_SJW(s) ((s) & 0x3)
|
#define PUCAN_TFAST_SJW(s) ((s) & PUCAN_TFAST_SJW_MASK)
|
||||||
#define PUCAN_TFAST_TSEG2(t) ((t) & 0x7)
|
#define PUCAN_TFAST_TSEG2(t) ((t) & PUCAN_TFAST_TSEG2_MASK)
|
||||||
#define PUCAN_TFAST_TSEG1(t) ((t) & 0xf)
|
#define PUCAN_TFAST_TSEG1(t) ((t) & PUCAN_TFAST_TSEG1_MASK)
|
||||||
#define PUCAN_TFAST_BRP(b) ((b) & 0x3ff)
|
#define PUCAN_TFAST_BRP(b) ((b) & PUCAN_TFAST_BRP_MASK)
|
||||||
|
|
||||||
struct __packed pucan_timing_fast {
|
struct __packed pucan_timing_fast {
|
||||||
__le16 opcode_channel;
|
__le16 opcode_channel;
|
||||||
|
|
|
@ -39,6 +39,7 @@ static struct usb_device_id peak_usb_table[] = {
|
||||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)},
|
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)},
|
||||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)},
|
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)},
|
||||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)},
|
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)},
|
||||||
|
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)},
|
||||||
{} /* Terminating entry */
|
{} /* Terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -50,6 +51,7 @@ static const struct peak_usb_adapter *const peak_usb_adapters_list[] = {
|
||||||
&pcan_usb_pro,
|
&pcan_usb_pro,
|
||||||
&pcan_usb_fd,
|
&pcan_usb_fd,
|
||||||
&pcan_usb_pro_fd,
|
&pcan_usb_pro_fd,
|
||||||
|
&pcan_usb_x6,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#define PCAN_USBPRO_PRODUCT_ID 0x000d
|
#define PCAN_USBPRO_PRODUCT_ID 0x000d
|
||||||
#define PCAN_USBPROFD_PRODUCT_ID 0x0011
|
#define PCAN_USBPROFD_PRODUCT_ID 0x0011
|
||||||
#define PCAN_USBFD_PRODUCT_ID 0x0012
|
#define PCAN_USBFD_PRODUCT_ID 0x0012
|
||||||
|
#define PCAN_USBX6_PRODUCT_ID 0x0014
|
||||||
|
|
||||||
#define PCAN_USB_DRIVER_NAME "peak_usb"
|
#define PCAN_USB_DRIVER_NAME "peak_usb"
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ extern const struct peak_usb_adapter pcan_usb;
|
||||||
extern const struct peak_usb_adapter pcan_usb_pro;
|
extern const struct peak_usb_adapter pcan_usb_pro;
|
||||||
extern const struct peak_usb_adapter pcan_usb_fd;
|
extern const struct peak_usb_adapter pcan_usb_fd;
|
||||||
extern const struct peak_usb_adapter pcan_usb_pro_fd;
|
extern const struct peak_usb_adapter pcan_usb_pro_fd;
|
||||||
|
extern const struct peak_usb_adapter pcan_usb_x6;
|
||||||
|
|
||||||
struct peak_time_ref {
|
struct peak_time_ref {
|
||||||
struct timeval tv_host_0, tv_host;
|
struct timeval tv_host_0, tv_host;
|
||||||
|
|
|
@ -993,24 +993,24 @@ static void pcan_usb_fd_free(struct peak_usb_device *dev)
|
||||||
static const struct can_bittiming_const pcan_usb_fd_const = {
|
static const struct can_bittiming_const pcan_usb_fd_const = {
|
||||||
.name = "pcan_usb_fd",
|
.name = "pcan_usb_fd",
|
||||||
.tseg1_min = 1,
|
.tseg1_min = 1,
|
||||||
.tseg1_max = 64,
|
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 16,
|
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||||
.sjw_max = 16,
|
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||||
.brp_min = 1,
|
.brp_min = 1,
|
||||||
.brp_max = 1024,
|
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct can_bittiming_const pcan_usb_fd_data_const = {
|
static const struct can_bittiming_const pcan_usb_fd_data_const = {
|
||||||
.name = "pcan_usb_fd",
|
.name = "pcan_usb_fd",
|
||||||
.tseg1_min = 1,
|
.tseg1_min = 1,
|
||||||
.tseg1_max = 16,
|
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 8,
|
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||||
.sjw_max = 4,
|
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||||
.brp_min = 1,
|
.brp_min = 1,
|
||||||
.brp_max = 1024,
|
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1065,24 +1065,24 @@ const struct peak_usb_adapter pcan_usb_fd = {
|
||||||
static const struct can_bittiming_const pcan_usb_pro_fd_const = {
|
static const struct can_bittiming_const pcan_usb_pro_fd_const = {
|
||||||
.name = "pcan_usb_pro_fd",
|
.name = "pcan_usb_pro_fd",
|
||||||
.tseg1_min = 1,
|
.tseg1_min = 1,
|
||||||
.tseg1_max = 64,
|
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 16,
|
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||||
.sjw_max = 16,
|
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||||
.brp_min = 1,
|
.brp_min = 1,
|
||||||
.brp_max = 1024,
|
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
|
static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
|
||||||
.name = "pcan_usb_pro_fd",
|
.name = "pcan_usb_pro_fd",
|
||||||
.tseg1_min = 1,
|
.tseg1_min = 1,
|
||||||
.tseg1_max = 16,
|
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 8,
|
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||||
.sjw_max = 4,
|
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||||
.brp_min = 1,
|
.brp_min = 1,
|
||||||
.brp_max = 1024,
|
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1132,3 +1132,75 @@ const struct peak_usb_adapter pcan_usb_pro_fd = {
|
||||||
|
|
||||||
.do_get_berr_counter = pcan_usb_fd_get_berr_counter,
|
.do_get_berr_counter = pcan_usb_fd_get_berr_counter,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* describes the PCAN-USB X6 adapter */
|
||||||
|
static const struct can_bittiming_const pcan_usb_x6_const = {
|
||||||
|
.name = "pcan_usb_x6",
|
||||||
|
.tseg1_min = 1,
|
||||||
|
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||||
|
.tseg2_min = 1,
|
||||||
|
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||||
|
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||||
|
.brp_min = 1,
|
||||||
|
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||||
|
.brp_inc = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct can_bittiming_const pcan_usb_x6_data_const = {
|
||||||
|
.name = "pcan_usb_x6",
|
||||||
|
.tseg1_min = 1,
|
||||||
|
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||||
|
.tseg2_min = 1,
|
||||||
|
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||||
|
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||||
|
.brp_min = 1,
|
||||||
|
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||||
|
.brp_inc = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct peak_usb_adapter pcan_usb_x6 = {
|
||||||
|
.name = "PCAN-USB X6",
|
||||||
|
.device_id = PCAN_USBX6_PRODUCT_ID,
|
||||||
|
.ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
|
||||||
|
.ctrlmode_supported = CAN_CTRLMODE_FD |
|
||||||
|
CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY,
|
||||||
|
.clock = {
|
||||||
|
.freq = PCAN_UFD_CRYSTAL_HZ,
|
||||||
|
},
|
||||||
|
.bittiming_const = &pcan_usb_x6_const,
|
||||||
|
.data_bittiming_const = &pcan_usb_x6_data_const,
|
||||||
|
|
||||||
|
/* size of device private data */
|
||||||
|
.sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
|
||||||
|
|
||||||
|
/* timestamps usage */
|
||||||
|
.ts_used_bits = 32,
|
||||||
|
.ts_period = 1000000, /* calibration period in ts. */
|
||||||
|
.us_per_ts_scale = 1, /* us = (ts * scale) >> shift */
|
||||||
|
.us_per_ts_shift = 0,
|
||||||
|
|
||||||
|
/* give here messages in/out endpoints */
|
||||||
|
.ep_msg_in = PCAN_USBPRO_EP_MSGIN,
|
||||||
|
.ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1},
|
||||||
|
|
||||||
|
/* size of rx/tx usb buffers */
|
||||||
|
.rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
|
||||||
|
.tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
|
||||||
|
|
||||||
|
/* device callbacks */
|
||||||
|
.intf_probe = pcan_usb_pro_probe, /* same as PCAN-USB Pro */
|
||||||
|
.dev_init = pcan_usb_fd_init,
|
||||||
|
|
||||||
|
.dev_exit = pcan_usb_fd_exit,
|
||||||
|
.dev_free = pcan_usb_fd_free,
|
||||||
|
.dev_set_bus = pcan_usb_fd_set_bus,
|
||||||
|
.dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
|
||||||
|
.dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
|
||||||
|
.dev_decode_buf = pcan_usb_fd_decode_buf,
|
||||||
|
.dev_start = pcan_usb_fd_start,
|
||||||
|
.dev_stop = pcan_usb_fd_stop,
|
||||||
|
.dev_restart_async = pcan_usb_fd_restart_async,
|
||||||
|
.dev_encode_msg = pcan_usb_fd_encode_msg,
|
||||||
|
|
||||||
|
.do_get_berr_counter = pcan_usb_fd_get_berr_counter,
|
||||||
|
};
|
||||||
|
|
|
@ -422,12 +422,6 @@ static int tse_rx(struct altera_tse_private *priv, int limit)
|
||||||
|
|
||||||
skb_put(skb, pktlength);
|
skb_put(skb, pktlength);
|
||||||
|
|
||||||
/* make cache consistent with receive packet buffer */
|
|
||||||
dma_sync_single_for_cpu(priv->device,
|
|
||||||
priv->rx_ring[entry].dma_addr,
|
|
||||||
priv->rx_ring[entry].len,
|
|
||||||
DMA_FROM_DEVICE);
|
|
||||||
|
|
||||||
dma_unmap_single(priv->device, priv->rx_ring[entry].dma_addr,
|
dma_unmap_single(priv->device, priv->rx_ring[entry].dma_addr,
|
||||||
priv->rx_ring[entry].len, DMA_FROM_DEVICE);
|
priv->rx_ring[entry].len, DMA_FROM_DEVICE);
|
||||||
|
|
||||||
|
@ -491,7 +485,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
|
||||||
|
|
||||||
if (unlikely(netif_queue_stopped(priv->dev) &&
|
if (unlikely(netif_queue_stopped(priv->dev) &&
|
||||||
tse_tx_avail(priv) > TSE_TX_THRESH(priv))) {
|
tse_tx_avail(priv) > TSE_TX_THRESH(priv))) {
|
||||||
netif_tx_lock(priv->dev);
|
|
||||||
if (netif_queue_stopped(priv->dev) &&
|
if (netif_queue_stopped(priv->dev) &&
|
||||||
tse_tx_avail(priv) > TSE_TX_THRESH(priv)) {
|
tse_tx_avail(priv) > TSE_TX_THRESH(priv)) {
|
||||||
if (netif_msg_tx_done(priv))
|
if (netif_msg_tx_done(priv))
|
||||||
|
@ -499,7 +492,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
|
||||||
__func__);
|
__func__);
|
||||||
netif_wake_queue(priv->dev);
|
netif_wake_queue(priv->dev);
|
||||||
}
|
}
|
||||||
netif_tx_unlock(priv->dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&priv->tx_lock);
|
spin_unlock(&priv->tx_lock);
|
||||||
|
@ -614,10 +606,6 @@ static int tse_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
buffer->dma_addr = dma_addr;
|
buffer->dma_addr = dma_addr;
|
||||||
buffer->len = nopaged_len;
|
buffer->len = nopaged_len;
|
||||||
|
|
||||||
/* Push data out of the cache hierarchy into main memory */
|
|
||||||
dma_sync_single_for_device(priv->device, buffer->dma_addr,
|
|
||||||
buffer->len, DMA_TO_DEVICE);
|
|
||||||
|
|
||||||
priv->dmaops->tx_buffer(priv, buffer);
|
priv->dmaops->tx_buffer(priv, buffer);
|
||||||
|
|
||||||
skb_tx_timestamp(skb);
|
skb_tx_timestamp(skb);
|
||||||
|
@ -841,6 +829,8 @@ static int init_phy(struct net_device *dev)
|
||||||
|
|
||||||
if (!phydev) {
|
if (!phydev) {
|
||||||
netdev_err(dev, "Could not find the PHY\n");
|
netdev_err(dev, "Could not find the PHY\n");
|
||||||
|
if (fixed_link)
|
||||||
|
of_phy_deregister_fixed_link(priv->device->of_node);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1630,10 +1620,15 @@ err_free_netdev:
|
||||||
static int altera_tse_remove(struct platform_device *pdev)
|
static int altera_tse_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||||
|
struct altera_tse_private *priv = netdev_priv(ndev);
|
||||||
|
|
||||||
if (ndev->phydev)
|
if (ndev->phydev) {
|
||||||
phy_disconnect(ndev->phydev);
|
phy_disconnect(ndev->phydev);
|
||||||
|
|
||||||
|
if (of_phy_is_fixed_link(priv->device->of_node))
|
||||||
|
of_phy_deregister_fixed_link(priv->device->of_node);
|
||||||
|
}
|
||||||
|
|
||||||
platform_set_drvdata(pdev, NULL);
|
platform_set_drvdata(pdev, NULL);
|
||||||
altera_tse_mdio_destroy(ndev);
|
altera_tse_mdio_destroy(ndev);
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
|
|
|
@ -538,7 +538,7 @@ static int xgbe_platform_remove(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int xgbe_platform_suspend(struct device *dev)
|
static int xgbe_platform_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
|
struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
|
||||||
|
@ -583,7 +583,7 @@ static int xgbe_platform_resume(struct device *dev)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM_SLEEP */
|
||||||
|
|
||||||
static const struct xgbe_version_data xgbe_v1 = {
|
static const struct xgbe_version_data xgbe_v1 = {
|
||||||
.init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v1,
|
.init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v1,
|
||||||
|
|
|
@ -1457,12 +1457,12 @@ static int nb8800_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = nb8800_hw_init(dev);
|
ret = nb8800_hw_init(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_free_bus;
|
goto err_deregister_fixed_link;
|
||||||
|
|
||||||
if (ops && ops->init) {
|
if (ops && ops->init) {
|
||||||
ret = ops->init(dev);
|
ret = ops->init(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_free_bus;
|
goto err_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->netdev_ops = &nb8800_netdev_ops;
|
dev->netdev_ops = &nb8800_netdev_ops;
|
||||||
|
@ -1495,6 +1495,9 @@ static int nb8800_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
err_free_dma:
|
err_free_dma:
|
||||||
nb8800_dma_free(dev);
|
nb8800_dma_free(dev);
|
||||||
|
err_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(pdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(pdev->dev.of_node);
|
||||||
err_free_bus:
|
err_free_bus:
|
||||||
of_node_put(priv->phy_node);
|
of_node_put(priv->phy_node);
|
||||||
mdiobus_unregister(bus);
|
mdiobus_unregister(bus);
|
||||||
|
@ -1512,6 +1515,8 @@ static int nb8800_remove(struct platform_device *pdev)
|
||||||
struct nb8800_priv *priv = netdev_priv(ndev);
|
struct nb8800_priv *priv = netdev_priv(ndev);
|
||||||
|
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
|
if (of_phy_is_fixed_link(pdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(pdev->dev.of_node);
|
||||||
of_node_put(priv->phy_node);
|
of_node_put(priv->phy_node);
|
||||||
|
|
||||||
mdiobus_unregister(priv->mii_bus);
|
mdiobus_unregister(priv->mii_bus);
|
||||||
|
|
|
@ -1755,13 +1755,13 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
||||||
if (priv->irq0 <= 0 || priv->irq1 <= 0) {
|
if (priv->irq0 <= 0 || priv->irq1 <= 0) {
|
||||||
dev_err(&pdev->dev, "invalid interrupts\n");
|
dev_err(&pdev->dev, "invalid interrupts\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err;
|
goto err_free_netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->base = devm_ioremap_resource(&pdev->dev, r);
|
priv->base = devm_ioremap_resource(&pdev->dev, r);
|
||||||
if (IS_ERR(priv->base)) {
|
if (IS_ERR(priv->base)) {
|
||||||
ret = PTR_ERR(priv->base);
|
ret = PTR_ERR(priv->base);
|
||||||
goto err;
|
goto err_free_netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->netdev = dev;
|
priv->netdev = dev;
|
||||||
|
@ -1779,7 +1779,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
||||||
ret = of_phy_register_fixed_link(dn);
|
ret = of_phy_register_fixed_link(dn);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to register fixed PHY\n");
|
dev_err(&pdev->dev, "failed to register fixed PHY\n");
|
||||||
goto err;
|
goto err_free_netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->phy_dn = dn;
|
priv->phy_dn = dn;
|
||||||
|
@ -1821,7 +1821,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
||||||
ret = register_netdev(dev);
|
ret = register_netdev(dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to register net_device\n");
|
dev_err(&pdev->dev, "failed to register net_device\n");
|
||||||
goto err;
|
goto err_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
|
priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
|
||||||
|
@ -1832,7 +1832,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
||||||
priv->base, priv->irq0, priv->irq1, txq, rxq);
|
priv->base, priv->irq0, priv->irq1, txq, rxq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
|
||||||
|
err_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
|
err_free_netdev:
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1840,11 +1844,14 @@ err:
|
||||||
static int bcm_sysport_remove(struct platform_device *pdev)
|
static int bcm_sysport_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *dev = dev_get_drvdata(&pdev->dev);
|
struct net_device *dev = dev_get_drvdata(&pdev->dev);
|
||||||
|
struct device_node *dn = pdev->dev.of_node;
|
||||||
|
|
||||||
/* Not much to do, ndo_close has been called
|
/* Not much to do, ndo_close has been called
|
||||||
* and we use managed allocations
|
* and we use managed allocations
|
||||||
*/
|
*/
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
dev_set_drvdata(&pdev->dev, NULL);
|
dev_set_drvdata(&pdev->dev, NULL);
|
||||||
|
|
||||||
|
|
|
@ -1165,6 +1165,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
||||||
struct bcmgenet_tx_ring *ring)
|
struct bcmgenet_tx_ring *ring)
|
||||||
{
|
{
|
||||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||||
|
struct device *kdev = &priv->pdev->dev;
|
||||||
struct enet_cb *tx_cb_ptr;
|
struct enet_cb *tx_cb_ptr;
|
||||||
struct netdev_queue *txq;
|
struct netdev_queue *txq;
|
||||||
unsigned int pkts_compl = 0;
|
unsigned int pkts_compl = 0;
|
||||||
|
@ -1192,13 +1193,13 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
||||||
if (tx_cb_ptr->skb) {
|
if (tx_cb_ptr->skb) {
|
||||||
pkts_compl++;
|
pkts_compl++;
|
||||||
bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent;
|
bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent;
|
||||||
dma_unmap_single(&dev->dev,
|
dma_unmap_single(kdev,
|
||||||
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
||||||
dma_unmap_len(tx_cb_ptr, dma_len),
|
dma_unmap_len(tx_cb_ptr, dma_len),
|
||||||
DMA_TO_DEVICE);
|
DMA_TO_DEVICE);
|
||||||
bcmgenet_free_cb(tx_cb_ptr);
|
bcmgenet_free_cb(tx_cb_ptr);
|
||||||
} else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
|
} else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
|
||||||
dma_unmap_page(&dev->dev,
|
dma_unmap_page(kdev,
|
||||||
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
dma_unmap_addr(tx_cb_ptr, dma_addr),
|
||||||
dma_unmap_len(tx_cb_ptr, dma_len),
|
dma_unmap_len(tx_cb_ptr, dma_len),
|
||||||
DMA_TO_DEVICE);
|
DMA_TO_DEVICE);
|
||||||
|
@ -1768,6 +1769,7 @@ static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv,
|
||||||
|
|
||||||
static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
|
static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
|
||||||
{
|
{
|
||||||
|
struct device *kdev = &priv->pdev->dev;
|
||||||
struct enet_cb *cb;
|
struct enet_cb *cb;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1775,7 +1777,7 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
|
||||||
cb = &priv->rx_cbs[i];
|
cb = &priv->rx_cbs[i];
|
||||||
|
|
||||||
if (dma_unmap_addr(cb, dma_addr)) {
|
if (dma_unmap_addr(cb, dma_addr)) {
|
||||||
dma_unmap_single(&priv->dev->dev,
|
dma_unmap_single(kdev,
|
||||||
dma_unmap_addr(cb, dma_addr),
|
dma_unmap_addr(cb, dma_addr),
|
||||||
priv->rx_buf_len, DMA_FROM_DEVICE);
|
priv->rx_buf_len, DMA_FROM_DEVICE);
|
||||||
dma_unmap_addr_set(cb, dma_addr, 0);
|
dma_unmap_addr_set(cb, dma_addr, 0);
|
||||||
|
|
|
@ -542,8 +542,10 @@ static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
|
||||||
/* Make sure we initialize MoCA PHYs with a link down */
|
/* Make sure we initialize MoCA PHYs with a link down */
|
||||||
if (phy_mode == PHY_INTERFACE_MODE_MOCA) {
|
if (phy_mode == PHY_INTERFACE_MODE_MOCA) {
|
||||||
phydev = of_phy_find_device(dn);
|
phydev = of_phy_find_device(dn);
|
||||||
if (phydev)
|
if (phydev) {
|
||||||
phydev->link = 0;
|
phydev->link = 0;
|
||||||
|
put_device(&phydev->mdio.dev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -625,6 +627,7 @@ static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv)
|
||||||
int bcmgenet_mii_init(struct net_device *dev)
|
int bcmgenet_mii_init(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||||
|
struct device_node *dn = priv->pdev->dev.of_node;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = bcmgenet_mii_alloc(priv);
|
ret = bcmgenet_mii_alloc(priv);
|
||||||
|
@ -638,6 +641,8 @@ int bcmgenet_mii_init(struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
of_node_put(priv->phy_dn);
|
of_node_put(priv->phy_dn);
|
||||||
mdiobus_unregister(priv->mii_bus);
|
mdiobus_unregister(priv->mii_bus);
|
||||||
mdiobus_free(priv->mii_bus);
|
mdiobus_free(priv->mii_bus);
|
||||||
|
@ -647,7 +652,10 @@ out:
|
||||||
void bcmgenet_mii_exit(struct net_device *dev)
|
void bcmgenet_mii_exit(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||||
|
struct device_node *dn = priv->pdev->dev.of_node;
|
||||||
|
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
of_node_put(priv->phy_dn);
|
of_node_put(priv->phy_dn);
|
||||||
mdiobus_unregister(priv->mii_bus);
|
mdiobus_unregister(priv->mii_bus);
|
||||||
mdiobus_free(priv->mii_bus);
|
mdiobus_free(priv->mii_bus);
|
||||||
|
|
|
@ -991,6 +991,7 @@ static inline void macb_init_rx_ring(struct macb *bp)
|
||||||
addr += bp->rx_buffer_size;
|
addr += bp->rx_buffer_size;
|
||||||
}
|
}
|
||||||
bp->rx_ring[bp->rx_ring_size - 1].addr |= MACB_BIT(RX_WRAP);
|
bp->rx_ring[bp->rx_ring_size - 1].addr |= MACB_BIT(RX_WRAP);
|
||||||
|
bp->rx_tail = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int macb_rx(struct macb *bp, int budget)
|
static int macb_rx(struct macb *bp, int budget)
|
||||||
|
@ -1172,6 +1173,7 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
||||||
if (status & MACB_BIT(RXUBR)) {
|
if (status & MACB_BIT(RXUBR)) {
|
||||||
ctrl = macb_readl(bp, NCR);
|
ctrl = macb_readl(bp, NCR);
|
||||||
macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE));
|
macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE));
|
||||||
|
wmb();
|
||||||
macb_writel(bp, NCR, ctrl | MACB_BIT(RE));
|
macb_writel(bp, NCR, ctrl | MACB_BIT(RE));
|
||||||
|
|
||||||
if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
|
if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
|
||||||
|
@ -1736,8 +1738,6 @@ static void macb_init_rings(struct macb *bp)
|
||||||
bp->queues[0].tx_head = 0;
|
bp->queues[0].tx_head = 0;
|
||||||
bp->queues[0].tx_tail = 0;
|
bp->queues[0].tx_tail = 0;
|
||||||
bp->queues[0].tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP);
|
bp->queues[0].tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP);
|
||||||
|
|
||||||
bp->rx_tail = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void macb_reset_hw(struct macb *bp)
|
static void macb_reset_hw(struct macb *bp)
|
||||||
|
@ -2943,6 +2943,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
|
||||||
if (intstatus & MACB_BIT(RXUBR)) {
|
if (intstatus & MACB_BIT(RXUBR)) {
|
||||||
ctl = macb_readl(lp, NCR);
|
ctl = macb_readl(lp, NCR);
|
||||||
macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
|
macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
|
||||||
|
wmb();
|
||||||
macb_writel(lp, NCR, ctl | MACB_BIT(RE));
|
macb_writel(lp, NCR, ctl | MACB_BIT(RE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,6 +168,7 @@ CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN
|
||||||
CH_PCI_ID_TABLE_FENTRY(0x509a), /* Custom T520-CR */
|
CH_PCI_ID_TABLE_FENTRY(0x509a), /* Custom T520-CR */
|
||||||
CH_PCI_ID_TABLE_FENTRY(0x509b), /* Custom T540-CR LOM */
|
CH_PCI_ID_TABLE_FENTRY(0x509b), /* Custom T540-CR LOM */
|
||||||
CH_PCI_ID_TABLE_FENTRY(0x509c), /* Custom T520-CR*/
|
CH_PCI_ID_TABLE_FENTRY(0x509c), /* Custom T520-CR*/
|
||||||
|
CH_PCI_ID_TABLE_FENTRY(0x509d), /* Custom T540-CR*/
|
||||||
|
|
||||||
/* T6 adapters:
|
/* T6 adapters:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -574,6 +574,8 @@ struct fec_enet_private {
|
||||||
unsigned int reload_period;
|
unsigned int reload_period;
|
||||||
int pps_enable;
|
int pps_enable;
|
||||||
unsigned int next_counter;
|
unsigned int next_counter;
|
||||||
|
|
||||||
|
u64 ethtool_stats[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
void fec_ptp_init(struct platform_device *pdev);
|
void fec_ptp_init(struct platform_device *pdev);
|
||||||
|
|
|
@ -2310,14 +2310,24 @@ static const struct fec_stat {
|
||||||
{ "IEEE_rx_octets_ok", IEEE_R_OCTETS_OK },
|
{ "IEEE_rx_octets_ok", IEEE_R_OCTETS_OK },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void fec_enet_get_ethtool_stats(struct net_device *dev,
|
static void fec_enet_update_ethtool_stats(struct net_device *dev)
|
||||||
struct ethtool_stats *stats, u64 *data)
|
|
||||||
{
|
{
|
||||||
struct fec_enet_private *fep = netdev_priv(dev);
|
struct fec_enet_private *fep = netdev_priv(dev);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(fec_stats); i++)
|
for (i = 0; i < ARRAY_SIZE(fec_stats); i++)
|
||||||
data[i] = readl(fep->hwp + fec_stats[i].offset);
|
fep->ethtool_stats[i] = readl(fep->hwp + fec_stats[i].offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fec_enet_get_ethtool_stats(struct net_device *dev,
|
||||||
|
struct ethtool_stats *stats, u64 *data)
|
||||||
|
{
|
||||||
|
struct fec_enet_private *fep = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (netif_running(dev))
|
||||||
|
fec_enet_update_ethtool_stats(dev);
|
||||||
|
|
||||||
|
memcpy(data, fep->ethtool_stats, ARRAY_SIZE(fec_stats) * sizeof(u64));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fec_enet_get_strings(struct net_device *netdev,
|
static void fec_enet_get_strings(struct net_device *netdev,
|
||||||
|
@ -2861,6 +2871,8 @@ fec_enet_close(struct net_device *ndev)
|
||||||
if (fep->quirks & FEC_QUIRK_ERR006687)
|
if (fep->quirks & FEC_QUIRK_ERR006687)
|
||||||
imx6q_cpuidle_fec_irqs_unused();
|
imx6q_cpuidle_fec_irqs_unused();
|
||||||
|
|
||||||
|
fec_enet_update_ethtool_stats(ndev);
|
||||||
|
|
||||||
fec_enet_clk_enable(ndev, false);
|
fec_enet_clk_enable(ndev, false);
|
||||||
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
||||||
pm_runtime_mark_last_busy(&fep->pdev->dev);
|
pm_runtime_mark_last_busy(&fep->pdev->dev);
|
||||||
|
@ -3166,6 +3178,8 @@ static int fec_enet_init(struct net_device *ndev)
|
||||||
|
|
||||||
fec_restart(ndev);
|
fec_restart(ndev);
|
||||||
|
|
||||||
|
fec_enet_update_ethtool_stats(ndev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3264,7 +3278,8 @@ fec_probe(struct platform_device *pdev)
|
||||||
fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
|
fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
|
||||||
|
|
||||||
/* Init network device */
|
/* Init network device */
|
||||||
ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private),
|
ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private) +
|
||||||
|
ARRAY_SIZE(fec_stats) * sizeof(u64),
|
||||||
num_tx_qs, num_rx_qs);
|
num_tx_qs, num_rx_qs);
|
||||||
if (!ndev)
|
if (!ndev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -3461,6 +3476,8 @@ failed_regulator:
|
||||||
failed_clk_ipg:
|
failed_clk_ipg:
|
||||||
fec_enet_clk_enable(ndev, false);
|
fec_enet_clk_enable(ndev, false);
|
||||||
failed_clk:
|
failed_clk:
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
failed_phy:
|
failed_phy:
|
||||||
of_node_put(phy_node);
|
of_node_put(phy_node);
|
||||||
failed_ioremap:
|
failed_ioremap:
|
||||||
|
@ -3474,6 +3491,7 @@ fec_drv_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||||
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
|
||||||
cancel_work_sync(&fep->tx_timeout_work);
|
cancel_work_sync(&fep->tx_timeout_work);
|
||||||
fec_ptp_stop(pdev);
|
fec_ptp_stop(pdev);
|
||||||
|
@ -3481,6 +3499,8 @@ fec_drv_remove(struct platform_device *pdev)
|
||||||
fec_enet_mii_remove(fep);
|
fec_enet_mii_remove(fep);
|
||||||
if (fep->reg_phy)
|
if (fep->reg_phy)
|
||||||
regulator_disable(fep->reg_phy);
|
regulator_disable(fep->reg_phy);
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
of_node_put(fep->phy_node);
|
of_node_put(fep->phy_node);
|
||||||
free_netdev(ndev);
|
free_netdev(ndev);
|
||||||
|
|
||||||
|
|
|
@ -1107,6 +1107,9 @@ int memac_free(struct fman_mac *memac)
|
||||||
{
|
{
|
||||||
free_init_resources(memac);
|
free_init_resources(memac);
|
||||||
|
|
||||||
|
if (memac->pcsphy)
|
||||||
|
put_device(&memac->pcsphy->mdio.dev);
|
||||||
|
|
||||||
kfree(memac->memac_drv_param);
|
kfree(memac->memac_drv_param);
|
||||||
kfree(memac);
|
kfree(memac);
|
||||||
|
|
||||||
|
|
|
@ -896,6 +896,8 @@ static int mac_probe(struct platform_device *_of_dev)
|
||||||
priv->fixed_link->duplex = phy->duplex;
|
priv->fixed_link->duplex = phy->duplex;
|
||||||
priv->fixed_link->pause = phy->pause;
|
priv->fixed_link->pause = phy->pause;
|
||||||
priv->fixed_link->asym_pause = phy->asym_pause;
|
priv->fixed_link->asym_pause = phy->asym_pause;
|
||||||
|
|
||||||
|
put_device(&phy->mdio.dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mac_dev->init(mac_dev);
|
err = mac_dev->init(mac_dev);
|
||||||
|
|
|
@ -967,7 +967,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
|
||||||
err = clk_prepare_enable(clk);
|
err = clk_prepare_enable(clk);
|
||||||
if (err) {
|
if (err) {
|
||||||
ret = err;
|
ret = err;
|
||||||
goto out_free_fpi;
|
goto out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
fpi->clk_per = clk;
|
fpi->clk_per = clk;
|
||||||
}
|
}
|
||||||
|
@ -1048,6 +1048,9 @@ out_put:
|
||||||
of_node_put(fpi->phy_node);
|
of_node_put(fpi->phy_node);
|
||||||
if (fpi->clk_per)
|
if (fpi->clk_per)
|
||||||
clk_disable_unprepare(fpi->clk_per);
|
clk_disable_unprepare(fpi->clk_per);
|
||||||
|
out_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(ofdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(ofdev->dev.of_node);
|
||||||
out_free_fpi:
|
out_free_fpi:
|
||||||
kfree(fpi);
|
kfree(fpi);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1066,6 +1069,8 @@ static int fs_enet_remove(struct platform_device *ofdev)
|
||||||
of_node_put(fep->fpi->phy_node);
|
of_node_put(fep->fpi->phy_node);
|
||||||
if (fep->fpi->clk_per)
|
if (fep->fpi->clk_per)
|
||||||
clk_disable_unprepare(fep->fpi->clk_per);
|
clk_disable_unprepare(fep->fpi->clk_per);
|
||||||
|
if (of_phy_is_fixed_link(ofdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(ofdev->dev.of_node);
|
||||||
free_netdev(ndev);
|
free_netdev(ndev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1312,6 +1312,7 @@ static void gfar_init_addr_hash_table(struct gfar_private *priv)
|
||||||
*/
|
*/
|
||||||
static int gfar_probe(struct platform_device *ofdev)
|
static int gfar_probe(struct platform_device *ofdev)
|
||||||
{
|
{
|
||||||
|
struct device_node *np = ofdev->dev.of_node;
|
||||||
struct net_device *dev = NULL;
|
struct net_device *dev = NULL;
|
||||||
struct gfar_private *priv = NULL;
|
struct gfar_private *priv = NULL;
|
||||||
int err = 0, i;
|
int err = 0, i;
|
||||||
|
@ -1465,6 +1466,8 @@ static int gfar_probe(struct platform_device *ofdev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
register_fail:
|
register_fail:
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
unmap_group_regs(priv);
|
unmap_group_regs(priv);
|
||||||
gfar_free_rx_queues(priv);
|
gfar_free_rx_queues(priv);
|
||||||
gfar_free_tx_queues(priv);
|
gfar_free_tx_queues(priv);
|
||||||
|
@ -1477,11 +1480,16 @@ register_fail:
|
||||||
static int gfar_remove(struct platform_device *ofdev)
|
static int gfar_remove(struct platform_device *ofdev)
|
||||||
{
|
{
|
||||||
struct gfar_private *priv = platform_get_drvdata(ofdev);
|
struct gfar_private *priv = platform_get_drvdata(ofdev);
|
||||||
|
struct device_node *np = ofdev->dev.of_node;
|
||||||
|
|
||||||
of_node_put(priv->phy_node);
|
of_node_put(priv->phy_node);
|
||||||
of_node_put(priv->tbi_node);
|
of_node_put(priv->tbi_node);
|
||||||
|
|
||||||
unregister_netdev(priv->ndev);
|
unregister_netdev(priv->ndev);
|
||||||
|
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
|
|
||||||
unmap_group_regs(priv);
|
unmap_group_regs(priv);
|
||||||
gfar_free_rx_queues(priv);
|
gfar_free_rx_queues(priv);
|
||||||
gfar_free_tx_queues(priv);
|
gfar_free_tx_queues(priv);
|
||||||
|
|
|
@ -3867,9 +3867,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
||||||
dev = alloc_etherdev(sizeof(*ugeth));
|
dev = alloc_etherdev(sizeof(*ugeth));
|
||||||
|
|
||||||
if (dev == NULL) {
|
if (dev == NULL) {
|
||||||
of_node_put(ug_info->tbi_node);
|
err = -ENOMEM;
|
||||||
of_node_put(ug_info->phy_node);
|
goto err_deregister_fixed_link;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ugeth = netdev_priv(dev);
|
ugeth = netdev_priv(dev);
|
||||||
|
@ -3906,10 +3905,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
||||||
if (netif_msg_probe(ugeth))
|
if (netif_msg_probe(ugeth))
|
||||||
pr_err("%s: Cannot register net device, aborting\n",
|
pr_err("%s: Cannot register net device, aborting\n",
|
||||||
dev->name);
|
dev->name);
|
||||||
free_netdev(dev);
|
goto err_free_netdev;
|
||||||
of_node_put(ug_info->tbi_node);
|
|
||||||
of_node_put(ug_info->phy_node);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mac_addr = of_get_mac_address(np);
|
mac_addr = of_get_mac_address(np);
|
||||||
|
@ -3922,16 +3918,29 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
||||||
ugeth->node = np;
|
ugeth->node = np;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_free_netdev:
|
||||||
|
free_netdev(dev);
|
||||||
|
err_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
|
of_node_put(ug_info->tbi_node);
|
||||||
|
of_node_put(ug_info->phy_node);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ucc_geth_remove(struct platform_device* ofdev)
|
static int ucc_geth_remove(struct platform_device* ofdev)
|
||||||
{
|
{
|
||||||
struct net_device *dev = platform_get_drvdata(ofdev);
|
struct net_device *dev = platform_get_drvdata(ofdev);
|
||||||
struct ucc_geth_private *ugeth = netdev_priv(dev);
|
struct ucc_geth_private *ugeth = netdev_priv(dev);
|
||||||
|
struct device_node *np = ofdev->dev.of_node;
|
||||||
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
ucc_geth_memclean(ugeth);
|
ucc_geth_memclean(ugeth);
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
of_node_put(ugeth->ug_info->tbi_node);
|
of_node_put(ugeth->ug_info->tbi_node);
|
||||||
of_node_put(ugeth->ug_info->phy_node);
|
of_node_put(ugeth->ug_info->phy_node);
|
||||||
|
|
||||||
|
|
|
@ -4935,11 +4935,15 @@ static int igb_tso(struct igb_ring *tx_ring,
|
||||||
|
|
||||||
/* initialize outer IP header fields */
|
/* initialize outer IP header fields */
|
||||||
if (ip.v4->version == 4) {
|
if (ip.v4->version == 4) {
|
||||||
|
unsigned char *csum_start = skb_checksum_start(skb);
|
||||||
|
unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
|
||||||
|
|
||||||
/* IP header will have to cancel out any data that
|
/* IP header will have to cancel out any data that
|
||||||
* is not a part of the outer IP header
|
* is not a part of the outer IP header
|
||||||
*/
|
*/
|
||||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||||
csum_unfold(l4.tcp->check)));
|
csum_start - trans_start,
|
||||||
|
0));
|
||||||
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||||
|
|
||||||
ip.v4->tot_len = 0;
|
ip.v4->tot_len = 0;
|
||||||
|
|
|
@ -1965,11 +1965,15 @@ static int igbvf_tso(struct igbvf_ring *tx_ring,
|
||||||
|
|
||||||
/* initialize outer IP header fields */
|
/* initialize outer IP header fields */
|
||||||
if (ip.v4->version == 4) {
|
if (ip.v4->version == 4) {
|
||||||
|
unsigned char *csum_start = skb_checksum_start(skb);
|
||||||
|
unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
|
||||||
|
|
||||||
/* IP header will have to cancel out any data that
|
/* IP header will have to cancel out any data that
|
||||||
* is not a part of the outer IP header
|
* is not a part of the outer IP header
|
||||||
*/
|
*/
|
||||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||||
csum_unfold(l4.tcp->check)));
|
csum_start - trans_start,
|
||||||
|
0));
|
||||||
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||||
|
|
||||||
ip.v4->tot_len = 0;
|
ip.v4->tot_len = 0;
|
||||||
|
|
|
@ -7287,11 +7287,15 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
|
||||||
|
|
||||||
/* initialize outer IP header fields */
|
/* initialize outer IP header fields */
|
||||||
if (ip.v4->version == 4) {
|
if (ip.v4->version == 4) {
|
||||||
|
unsigned char *csum_start = skb_checksum_start(skb);
|
||||||
|
unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
|
||||||
|
|
||||||
/* IP header will have to cancel out any data that
|
/* IP header will have to cancel out any data that
|
||||||
* is not a part of the outer IP header
|
* is not a part of the outer IP header
|
||||||
*/
|
*/
|
||||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||||
csum_unfold(l4.tcp->check)));
|
csum_start - trans_start,
|
||||||
|
0));
|
||||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||||
|
|
||||||
ip.v4->tot_len = 0;
|
ip.v4->tot_len = 0;
|
||||||
|
|
|
@ -3335,11 +3335,15 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
|
||||||
|
|
||||||
/* initialize outer IP header fields */
|
/* initialize outer IP header fields */
|
||||||
if (ip.v4->version == 4) {
|
if (ip.v4->version == 4) {
|
||||||
|
unsigned char *csum_start = skb_checksum_start(skb);
|
||||||
|
unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
|
||||||
|
|
||||||
/* IP header will have to cancel out any data that
|
/* IP header will have to cancel out any data that
|
||||||
* is not a part of the outer IP header
|
* is not a part of the outer IP header
|
||||||
*/
|
*/
|
||||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||||
csum_unfold(l4.tcp->check)));
|
csum_start - trans_start,
|
||||||
|
0));
|
||||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||||
|
|
||||||
ip.v4->tot_len = 0;
|
ip.v4->tot_len = 0;
|
||||||
|
|
|
@ -4327,6 +4327,8 @@ err_clk:
|
||||||
clk_disable_unprepare(pp->clk);
|
clk_disable_unprepare(pp->clk);
|
||||||
err_put_phy_node:
|
err_put_phy_node:
|
||||||
of_node_put(phy_node);
|
of_node_put(phy_node);
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
err_free_irq:
|
err_free_irq:
|
||||||
irq_dispose_mapping(dev->irq);
|
irq_dispose_mapping(dev->irq);
|
||||||
err_free_netdev:
|
err_free_netdev:
|
||||||
|
@ -4338,6 +4340,7 @@ err_free_netdev:
|
||||||
static int mvneta_remove(struct platform_device *pdev)
|
static int mvneta_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *dev = platform_get_drvdata(pdev);
|
struct net_device *dev = platform_get_drvdata(pdev);
|
||||||
|
struct device_node *dn = pdev->dev.of_node;
|
||||||
struct mvneta_port *pp = netdev_priv(dev);
|
struct mvneta_port *pp = netdev_priv(dev);
|
||||||
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
@ -4345,6 +4348,8 @@ static int mvneta_remove(struct platform_device *pdev)
|
||||||
clk_disable_unprepare(pp->clk);
|
clk_disable_unprepare(pp->clk);
|
||||||
free_percpu(pp->ports);
|
free_percpu(pp->ports);
|
||||||
free_percpu(pp->stats);
|
free_percpu(pp->stats);
|
||||||
|
if (of_phy_is_fixed_link(dn))
|
||||||
|
of_phy_deregister_fixed_link(dn);
|
||||||
irq_dispose_mapping(dev->irq);
|
irq_dispose_mapping(dev->irq);
|
||||||
of_node_put(pp->phy_node);
|
of_node_put(pp->phy_node);
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
|
|
|
@ -318,6 +318,8 @@ static int mtk_phy_connect(struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_phy:
|
err_phy:
|
||||||
|
if (of_phy_is_fixed_link(mac->of_node))
|
||||||
|
of_phy_deregister_fixed_link(mac->of_node);
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
dev_err(eth->dev, "%s: invalid phy\n", __func__);
|
dev_err(eth->dev, "%s: invalid phy\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1923,6 +1925,8 @@ static void mtk_uninit(struct net_device *dev)
|
||||||
struct mtk_eth *eth = mac->hw;
|
struct mtk_eth *eth = mac->hw;
|
||||||
|
|
||||||
phy_disconnect(dev->phydev);
|
phy_disconnect(dev->phydev);
|
||||||
|
if (of_phy_is_fixed_link(mac->of_node))
|
||||||
|
of_phy_deregister_fixed_link(mac->of_node);
|
||||||
mtk_irq_disable(eth, MTK_QDMA_INT_MASK, ~0);
|
mtk_irq_disable(eth, MTK_QDMA_INT_MASK, ~0);
|
||||||
mtk_irq_disable(eth, MTK_PDMA_INT_MASK, ~0);
|
mtk_irq_disable(eth, MTK_PDMA_INT_MASK, ~0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2109,13 +2109,6 @@ err:
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mlx4_en_shutdown(struct net_device *dev)
|
|
||||||
{
|
|
||||||
rtnl_lock();
|
|
||||||
netif_device_detach(dev);
|
|
||||||
mlx4_en_close(dev);
|
|
||||||
rtnl_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
|
static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
|
||||||
struct mlx4_en_priv *src,
|
struct mlx4_en_priv *src,
|
||||||
|
@ -2214,8 +2207,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||||
struct mlx4_en_dev *mdev = priv->mdev;
|
struct mlx4_en_dev *mdev = priv->mdev;
|
||||||
bool shutdown = mdev->dev->persist->interface_state &
|
|
||||||
MLX4_INTERFACE_STATE_SHUTDOWN;
|
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
|
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
|
||||||
|
@ -2224,9 +2215,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
||||||
if (priv->registered) {
|
if (priv->registered) {
|
||||||
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
|
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
|
||||||
priv->port));
|
priv->port));
|
||||||
if (shutdown)
|
|
||||||
mlx4_en_shutdown(dev);
|
|
||||||
else
|
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2258,7 +2246,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
||||||
kfree(priv->tx_cq[t]);
|
kfree(priv->tx_cq[t]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!shutdown)
|
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4147,11 +4147,8 @@ static void mlx4_shutdown(struct pci_dev *pdev)
|
||||||
|
|
||||||
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
|
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
|
||||||
mutex_lock(&persist->interface_state_mutex);
|
mutex_lock(&persist->interface_state_mutex);
|
||||||
if (persist->interface_state & MLX4_INTERFACE_STATE_UP) {
|
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
|
||||||
/* Notify mlx4 clients that the kernel is being shut down */
|
|
||||||
persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN;
|
|
||||||
mlx4_unload_one(pdev);
|
mlx4_unload_one(pdev);
|
||||||
}
|
|
||||||
mutex_unlock(&persist->interface_state_mutex);
|
mutex_unlock(&persist->interface_state_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1457,7 +1457,12 @@ EXPORT_SYMBOL_GPL(mlx4_multicast_detach);
|
||||||
int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
|
int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
|
||||||
u32 qpn, enum mlx4_net_trans_promisc_mode mode)
|
u32 qpn, enum mlx4_net_trans_promisc_mode mode)
|
||||||
{
|
{
|
||||||
struct mlx4_net_trans_rule rule;
|
struct mlx4_net_trans_rule rule = {
|
||||||
|
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
|
||||||
|
.exclusive = 0,
|
||||||
|
.allow_loopback = 1,
|
||||||
|
};
|
||||||
|
|
||||||
u64 *regid_p;
|
u64 *regid_p;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
|
|
@ -212,6 +212,7 @@ int emac_phy_config(struct platform_device *pdev, struct emac_adapter *adpt)
|
||||||
|
|
||||||
phy_np = of_parse_phandle(np, "phy-handle", 0);
|
phy_np = of_parse_phandle(np, "phy-handle", 0);
|
||||||
adpt->phydev = of_phy_find_device(phy_np);
|
adpt->phydev = of_phy_find_device(phy_np);
|
||||||
|
of_node_put(phy_np);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!adpt->phydev) {
|
if (!adpt->phydev) {
|
||||||
|
|
|
@ -710,6 +710,8 @@ static int emac_probe(struct platform_device *pdev)
|
||||||
err_undo_napi:
|
err_undo_napi:
|
||||||
netif_napi_del(&adpt->rx_q.napi);
|
netif_napi_del(&adpt->rx_q.napi);
|
||||||
err_undo_mdiobus:
|
err_undo_mdiobus:
|
||||||
|
if (!has_acpi_companion(&pdev->dev))
|
||||||
|
put_device(&adpt->phydev->mdio.dev);
|
||||||
mdiobus_unregister(adpt->mii_bus);
|
mdiobus_unregister(adpt->mii_bus);
|
||||||
err_undo_clocks:
|
err_undo_clocks:
|
||||||
emac_clks_teardown(adpt);
|
emac_clks_teardown(adpt);
|
||||||
|
@ -729,6 +731,8 @@ static int emac_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
emac_clks_teardown(adpt);
|
emac_clks_teardown(adpt);
|
||||||
|
|
||||||
|
if (!has_acpi_companion(&pdev->dev))
|
||||||
|
put_device(&adpt->phydev->mdio.dev);
|
||||||
mdiobus_unregister(adpt->mii_bus);
|
mdiobus_unregister(adpt->mii_bus);
|
||||||
free_netdev(netdev);
|
free_netdev(netdev);
|
||||||
|
|
||||||
|
|
|
@ -1008,20 +1008,18 @@ static int ravb_phy_init(struct net_device *ndev)
|
||||||
of_node_put(pn);
|
of_node_put(pn);
|
||||||
if (!phydev) {
|
if (!phydev) {
|
||||||
netdev_err(ndev, "failed to connect PHY\n");
|
netdev_err(ndev, "failed to connect PHY\n");
|
||||||
return -ENOENT;
|
err = -ENOENT;
|
||||||
|
goto err_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This driver only support 10/100Mbit speeds on Gen3
|
/* This driver only support 10/100Mbit speeds on Gen3
|
||||||
* at this time.
|
* at this time.
|
||||||
*/
|
*/
|
||||||
if (priv->chip_id == RCAR_GEN3) {
|
if (priv->chip_id == RCAR_GEN3) {
|
||||||
int err;
|
|
||||||
|
|
||||||
err = phy_set_max_speed(phydev, SPEED_100);
|
err = phy_set_max_speed(phydev, SPEED_100);
|
||||||
if (err) {
|
if (err) {
|
||||||
netdev_err(ndev, "failed to limit PHY to 100Mbit/s\n");
|
netdev_err(ndev, "failed to limit PHY to 100Mbit/s\n");
|
||||||
phy_disconnect(phydev);
|
goto err_phy_disconnect;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev_info(ndev, "limited PHY to 100Mbit/s\n");
|
netdev_info(ndev, "limited PHY to 100Mbit/s\n");
|
||||||
|
@ -1033,6 +1031,14 @@ static int ravb_phy_init(struct net_device *ndev)
|
||||||
phy_attached_info(phydev);
|
phy_attached_info(phydev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_phy_disconnect:
|
||||||
|
phy_disconnect(phydev);
|
||||||
|
err_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PHY control start function */
|
/* PHY control start function */
|
||||||
|
@ -1634,6 +1640,7 @@ static void ravb_set_rx_mode(struct net_device *ndev)
|
||||||
/* Device close function for Ethernet AVB */
|
/* Device close function for Ethernet AVB */
|
||||||
static int ravb_close(struct net_device *ndev)
|
static int ravb_close(struct net_device *ndev)
|
||||||
{
|
{
|
||||||
|
struct device_node *np = ndev->dev.parent->of_node;
|
||||||
struct ravb_private *priv = netdev_priv(ndev);
|
struct ravb_private *priv = netdev_priv(ndev);
|
||||||
struct ravb_tstamp_skb *ts_skb, *ts_skb2;
|
struct ravb_tstamp_skb *ts_skb, *ts_skb2;
|
||||||
|
|
||||||
|
@ -1663,6 +1670,8 @@ static int ravb_close(struct net_device *ndev)
|
||||||
if (ndev->phydev) {
|
if (ndev->phydev) {
|
||||||
phy_stop(ndev->phydev);
|
phy_stop(ndev->phydev);
|
||||||
phy_disconnect(ndev->phydev);
|
phy_disconnect(ndev->phydev);
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->chip_id != RCAR_GEN2) {
|
if (priv->chip_id != RCAR_GEN2) {
|
||||||
|
|
|
@ -518,7 +518,7 @@ static struct sh_eth_cpu_data r7s72100_data = {
|
||||||
|
|
||||||
.ecsr_value = ECSR_ICD,
|
.ecsr_value = ECSR_ICD,
|
||||||
.ecsipr_value = ECSIPR_ICDIP,
|
.ecsipr_value = ECSIPR_ICDIP,
|
||||||
.eesipr_value = 0xff7f009f,
|
.eesipr_value = 0xe77f009f,
|
||||||
|
|
||||||
.tx_check = EESR_TC1 | EESR_FTC,
|
.tx_check = EESR_TC1 | EESR_FTC,
|
||||||
.eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
|
.eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
|
||||||
|
|
|
@ -50,10 +50,23 @@ static int dwmac_generic_probe(struct platform_device *pdev)
|
||||||
if (plat_dat->init) {
|
if (plat_dat->init) {
|
||||||
ret = plat_dat->init(pdev, plat_dat->bsp_priv);
|
ret = plat_dat->init(pdev, plat_dat->bsp_priv);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_exit;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_exit:
|
||||||
|
if (plat_dat->exit)
|
||||||
|
plat_dat->exit(pdev, plat_dat->bsp_priv);
|
||||||
|
err_remove_config_dt:
|
||||||
|
if (pdev->dev.of_node)
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id dwmac_generic_match[] = {
|
static const struct of_device_id dwmac_generic_match[] = {
|
||||||
|
|
|
@ -271,15 +271,17 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
||||||
if (!gmac)
|
if (!gmac) {
|
||||||
return -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
gmac->pdev = pdev;
|
gmac->pdev = pdev;
|
||||||
|
|
||||||
err = ipq806x_gmac_of_parse(gmac);
|
err = ipq806x_gmac_of_parse(gmac);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(dev, "device tree parsing error\n");
|
dev_err(dev, "device tree parsing error\n");
|
||||||
return err;
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL,
|
regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL,
|
||||||
|
@ -300,7 +302,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
||||||
default:
|
default:
|
||||||
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
||||||
phy_modes(gmac->phy_mode));
|
phy_modes(gmac->phy_mode));
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
|
regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
|
||||||
|
|
||||||
|
@ -319,7 +322,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
||||||
default:
|
default:
|
||||||
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
||||||
phy_modes(gmac->phy_mode));
|
phy_modes(gmac->phy_mode));
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
|
regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
|
||||||
|
|
||||||
|
@ -346,7 +350,16 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
||||||
plat_dat->bsp_priv = gmac;
|
plat_dat->bsp_priv = gmac;
|
||||||
plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed;
|
plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed;
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
err = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (err)
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id ipq806x_gmac_dwmac_match[] = {
|
static const struct of_device_id ipq806x_gmac_dwmac_match[] = {
|
||||||
|
|
|
@ -46,7 +46,8 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
|
||||||
reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg");
|
reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg");
|
||||||
if (IS_ERR(reg)) {
|
if (IS_ERR(reg)) {
|
||||||
dev_err(&pdev->dev, "syscon lookup failed\n");
|
dev_err(&pdev->dev, "syscon lookup failed\n");
|
||||||
return PTR_ERR(reg);
|
ret = PTR_ERR(reg);
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plat_dat->interface == PHY_INTERFACE_MODE_MII) {
|
if (plat_dat->interface == PHY_INTERFACE_MODE_MII) {
|
||||||
|
@ -55,13 +56,23 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
|
||||||
ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII;
|
ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII;
|
||||||
} else {
|
} else {
|
||||||
dev_err(&pdev->dev, "Only MII and RMII mode supported\n");
|
dev_err(&pdev->dev, "Only MII and RMII mode supported\n");
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
regmap_update_bits(reg, LPC18XX_CREG_CREG6,
|
regmap_update_bits(reg, LPC18XX_CREG_CREG6,
|
||||||
LPC18XX_CREG_CREG6_ETHMODE_MASK, ethmode);
|
LPC18XX_CREG_CREG6_ETHMODE_MASK, ethmode);
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id lpc18xx_dwmac_match[] = {
|
static const struct of_device_id lpc18xx_dwmac_match[] = {
|
||||||
|
|
|
@ -64,18 +64,31 @@ static int meson6_dwmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||||
if (!dwmac)
|
if (!dwmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
|
dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
|
||||||
if (IS_ERR(dwmac->reg))
|
if (IS_ERR(dwmac->reg)) {
|
||||||
return PTR_ERR(dwmac->reg);
|
ret = PTR_ERR(dwmac->reg);
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
plat_dat->bsp_priv = dwmac;
|
plat_dat->bsp_priv = dwmac;
|
||||||
plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;
|
plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id meson6_dwmac_match[] = {
|
static const struct of_device_id meson6_dwmac_match[] = {
|
||||||
|
|
|
@ -264,32 +264,48 @@ static int meson8b_dwmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||||
if (!dwmac)
|
if (!dwmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
dwmac->regs = devm_ioremap_resource(&pdev->dev, res);
|
dwmac->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||||
if (IS_ERR(dwmac->regs))
|
if (IS_ERR(dwmac->regs)) {
|
||||||
return PTR_ERR(dwmac->regs);
|
ret = PTR_ERR(dwmac->regs);
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
dwmac->pdev = pdev;
|
dwmac->pdev = pdev;
|
||||||
dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node);
|
dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node);
|
||||||
if (dwmac->phy_mode < 0) {
|
if (dwmac->phy_mode < 0) {
|
||||||
dev_err(&pdev->dev, "missing phy-mode property\n");
|
dev_err(&pdev->dev, "missing phy-mode property\n");
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = meson8b_init_clk(dwmac);
|
ret = meson8b_init_clk(dwmac);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
ret = meson8b_init_prg_eth(dwmac);
|
ret = meson8b_init_prg_eth(dwmac);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
plat_dat->bsp_priv = dwmac;
|
plat_dat->bsp_priv = dwmac;
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_clk_disable;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_clk_disable:
|
||||||
|
clk_disable_unprepare(dwmac->m25_div_clk);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int meson8b_dwmac_remove(struct platform_device *pdev)
|
static int meson8b_dwmac_remove(struct platform_device *pdev)
|
||||||
|
|
|
@ -939,14 +939,27 @@ static int rk_gmac_probe(struct platform_device *pdev)
|
||||||
plat_dat->fix_mac_speed = rk_fix_speed;
|
plat_dat->fix_mac_speed = rk_fix_speed;
|
||||||
|
|
||||||
plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
|
plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
|
||||||
if (IS_ERR(plat_dat->bsp_priv))
|
if (IS_ERR(plat_dat->bsp_priv)) {
|
||||||
return PTR_ERR(plat_dat->bsp_priv);
|
ret = PTR_ERR(plat_dat->bsp_priv);
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
ret = rk_gmac_powerup(plat_dat->bsp_priv);
|
ret = rk_gmac_powerup(plat_dat->bsp_priv);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_gmac_powerdown;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_gmac_powerdown:
|
||||||
|
rk_gmac_powerdown(plat_dat->bsp_priv);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rk_gmac_remove(struct platform_device *pdev)
|
static int rk_gmac_remove(struct platform_device *pdev)
|
||||||
|
|
|
@ -304,6 +304,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
int ret;
|
int ret;
|
||||||
struct socfpga_dwmac *dwmac;
|
struct socfpga_dwmac *dwmac;
|
||||||
|
struct net_device *ndev;
|
||||||
|
struct stmmac_priv *stpriv;
|
||||||
|
|
||||||
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
|
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -314,32 +316,43 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
dwmac = devm_kzalloc(dev, sizeof(*dwmac), GFP_KERNEL);
|
dwmac = devm_kzalloc(dev, sizeof(*dwmac), GFP_KERNEL);
|
||||||
if (!dwmac)
|
if (!dwmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
ret = socfpga_dwmac_parse_data(dwmac, dev);
|
ret = socfpga_dwmac_parse_data(dwmac, dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "Unable to parse OF data\n");
|
dev_err(dev, "Unable to parse OF data\n");
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
plat_dat->bsp_priv = dwmac;
|
plat_dat->bsp_priv = dwmac;
|
||||||
plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed;
|
plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed;
|
||||||
|
|
||||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
|
if (ret)
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
if (!ret) {
|
ndev = platform_get_drvdata(pdev);
|
||||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
stpriv = netdev_priv(ndev);
|
||||||
struct stmmac_priv *stpriv = netdev_priv(ndev);
|
|
||||||
|
|
||||||
/* The socfpga driver needs to control the stmmac reset to
|
/* The socfpga driver needs to control the stmmac reset to set the phy
|
||||||
* set the phy mode. Create a copy of the core reset handel
|
* mode. Create a copy of the core reset handle so it can be used by
|
||||||
* so it can be used by the driver later.
|
* the driver later.
|
||||||
*/
|
*/
|
||||||
dwmac->stmmac_rst = stpriv->stmmac_rst;
|
dwmac->stmmac_rst = stpriv->stmmac_rst;
|
||||||
|
|
||||||
ret = socfpga_dwmac_set_phy_mode(dwmac);
|
ret = socfpga_dwmac_set_phy_mode(dwmac);
|
||||||
}
|
if (ret)
|
||||||
|
goto err_dvr_remove;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_dvr_remove:
|
||||||
|
stmmac_dvr_remove(&pdev->dev);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -329,13 +329,15 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||||
if (!dwmac)
|
if (!dwmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
ret = sti_dwmac_parse_data(dwmac, pdev);
|
ret = sti_dwmac_parse_data(dwmac, pdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "Unable to parse OF data\n");
|
dev_err(&pdev->dev, "Unable to parse OF data\n");
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
dwmac->fix_retime_src = data->fix_retime_src;
|
dwmac->fix_retime_src = data->fix_retime_src;
|
||||||
|
@ -345,7 +347,7 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = clk_prepare_enable(dwmac->clk);
|
ret = clk_prepare_enable(dwmac->clk);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
ret = sti_dwmac_set_mode(dwmac);
|
ret = sti_dwmac_set_mode(dwmac);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -359,6 +361,9 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
disable_clk:
|
disable_clk:
|
||||||
clk_disable_unprepare(dwmac->clk);
|
clk_disable_unprepare(dwmac->clk);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,24 +107,33 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||||
if (!dwmac)
|
if (!dwmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
ret = stm32_dwmac_parse_data(dwmac, &pdev->dev);
|
ret = stm32_dwmac_parse_data(dwmac, &pdev->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "Unable to parse OF data\n");
|
dev_err(&pdev->dev, "Unable to parse OF data\n");
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
plat_dat->bsp_priv = dwmac;
|
plat_dat->bsp_priv = dwmac;
|
||||||
|
|
||||||
ret = stm32_dwmac_init(plat_dat);
|
ret = stm32_dwmac_init(plat_dat);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
goto err_clk_disable;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_clk_disable:
|
||||||
stm32_dwmac_clk_disable(dwmac);
|
stm32_dwmac_clk_disable(dwmac);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,22 +120,27 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(plat_dat);
|
return PTR_ERR(plat_dat);
|
||||||
|
|
||||||
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
||||||
if (!gmac)
|
if (!gmac) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
|
|
||||||
gmac->interface = of_get_phy_mode(dev->of_node);
|
gmac->interface = of_get_phy_mode(dev->of_node);
|
||||||
|
|
||||||
gmac->tx_clk = devm_clk_get(dev, "allwinner_gmac_tx");
|
gmac->tx_clk = devm_clk_get(dev, "allwinner_gmac_tx");
|
||||||
if (IS_ERR(gmac->tx_clk)) {
|
if (IS_ERR(gmac->tx_clk)) {
|
||||||
dev_err(dev, "could not get tx clock\n");
|
dev_err(dev, "could not get tx clock\n");
|
||||||
return PTR_ERR(gmac->tx_clk);
|
ret = PTR_ERR(gmac->tx_clk);
|
||||||
|
goto err_remove_config_dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optional regulator for PHY */
|
/* Optional regulator for PHY */
|
||||||
gmac->regulator = devm_regulator_get_optional(dev, "phy");
|
gmac->regulator = devm_regulator_get_optional(dev, "phy");
|
||||||
if (IS_ERR(gmac->regulator)) {
|
if (IS_ERR(gmac->regulator)) {
|
||||||
if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER)
|
if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER) {
|
||||||
return -EPROBE_DEFER;
|
ret = -EPROBE_DEFER;
|
||||||
|
goto err_remove_config_dt;
|
||||||
|
}
|
||||||
dev_info(dev, "no regulator found\n");
|
dev_info(dev, "no regulator found\n");
|
||||||
gmac->regulator = NULL;
|
gmac->regulator = NULL;
|
||||||
}
|
}
|
||||||
|
@ -151,11 +156,18 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv);
|
ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_remove_config_dt;
|
||||||
|
|
||||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
goto err_gmac_exit;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_gmac_exit:
|
||||||
sun7i_gmac_exit(pdev, plat_dat->bsp_priv);
|
sun7i_gmac_exit(pdev, plat_dat->bsp_priv);
|
||||||
|
err_remove_config_dt:
|
||||||
|
stmmac_remove_config_dt(pdev, plat_dat);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3428,7 +3428,6 @@ int stmmac_dvr_remove(struct device *dev)
|
||||||
stmmac_set_mac(priv->ioaddr, false);
|
stmmac_set_mac(priv->ioaddr, false);
|
||||||
netif_carrier_off(ndev);
|
netif_carrier_off(ndev);
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
of_node_put(priv->plat->phy_node);
|
|
||||||
if (priv->stmmac_rst)
|
if (priv->stmmac_rst)
|
||||||
reset_control_assert(priv->stmmac_rst);
|
reset_control_assert(priv->stmmac_rst);
|
||||||
clk_disable_unprepare(priv->pclk);
|
clk_disable_unprepare(priv->pclk);
|
||||||
|
|
|
@ -200,7 +200,6 @@ static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
|
||||||
/**
|
/**
|
||||||
* stmmac_probe_config_dt - parse device-tree driver parameters
|
* stmmac_probe_config_dt - parse device-tree driver parameters
|
||||||
* @pdev: platform_device structure
|
* @pdev: platform_device structure
|
||||||
* @plat: driver data platform structure
|
|
||||||
* @mac: MAC address to use
|
* @mac: MAC address to use
|
||||||
* Description:
|
* Description:
|
||||||
* this function is to read the driver parameters from device-tree and
|
* this function is to read the driver parameters from device-tree and
|
||||||
|
@ -306,7 +305,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||||
dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
|
dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!dma_cfg) {
|
if (!dma_cfg) {
|
||||||
of_node_put(plat->phy_node);
|
stmmac_remove_config_dt(pdev, plat);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
plat->dma_cfg = dma_cfg;
|
plat->dma_cfg = dma_cfg;
|
||||||
|
@ -329,14 +328,37 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||||
|
|
||||||
return plat;
|
return plat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stmmac_remove_config_dt - undo the effects of stmmac_probe_config_dt()
|
||||||
|
* @pdev: platform_device structure
|
||||||
|
* @plat: driver data platform structure
|
||||||
|
*
|
||||||
|
* Release resources claimed by stmmac_probe_config_dt().
|
||||||
|
*/
|
||||||
|
void stmmac_remove_config_dt(struct platform_device *pdev,
|
||||||
|
struct plat_stmmacenet_data *plat)
|
||||||
|
{
|
||||||
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
|
of_node_put(plat->phy_node);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
struct plat_stmmacenet_data *
|
struct plat_stmmacenet_data *
|
||||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||||
{
|
{
|
||||||
return ERR_PTR(-ENOSYS);
|
return ERR_PTR(-ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void stmmac_remove_config_dt(struct platform_device *pdev,
|
||||||
|
struct plat_stmmacenet_data *plat)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif /* CONFIG_OF */
|
#endif /* CONFIG_OF */
|
||||||
EXPORT_SYMBOL_GPL(stmmac_probe_config_dt);
|
EXPORT_SYMBOL_GPL(stmmac_probe_config_dt);
|
||||||
|
EXPORT_SYMBOL_GPL(stmmac_remove_config_dt);
|
||||||
|
|
||||||
int stmmac_get_platform_resources(struct platform_device *pdev,
|
int stmmac_get_platform_resources(struct platform_device *pdev,
|
||||||
struct stmmac_resources *stmmac_res)
|
struct stmmac_resources *stmmac_res)
|
||||||
|
@ -392,10 +414,13 @@ int stmmac_pltfr_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||||
struct stmmac_priv *priv = netdev_priv(ndev);
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
||||||
|
struct plat_stmmacenet_data *plat = priv->plat;
|
||||||
int ret = stmmac_dvr_remove(&pdev->dev);
|
int ret = stmmac_dvr_remove(&pdev->dev);
|
||||||
|
|
||||||
if (priv->plat->exit)
|
if (plat->exit)
|
||||||
priv->plat->exit(pdev, priv->plat->bsp_priv);
|
plat->exit(pdev, plat->bsp_priv);
|
||||||
|
|
||||||
|
stmmac_remove_config_dt(pdev, plat);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
struct plat_stmmacenet_data *
|
struct plat_stmmacenet_data *
|
||||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
|
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
|
||||||
|
void stmmac_remove_config_dt(struct platform_device *pdev,
|
||||||
|
struct plat_stmmacenet_data *plat);
|
||||||
|
|
||||||
int stmmac_get_platform_resources(struct platform_device *pdev,
|
int stmmac_get_platform_resources(struct platform_device *pdev,
|
||||||
struct stmmac_resources *stmmac_res);
|
struct stmmac_resources *stmmac_res);
|
||||||
|
|
|
@ -2881,7 +2881,7 @@ static int dwceqos_probe(struct platform_device *pdev)
|
||||||
ret = of_get_phy_mode(lp->pdev->dev.of_node);
|
ret = of_get_phy_mode(lp->pdev->dev.of_node);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&lp->pdev->dev, "error in getting phy i/f\n");
|
dev_err(&lp->pdev->dev, "error in getting phy i/f\n");
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
lp->phy_interface = ret;
|
lp->phy_interface = ret;
|
||||||
|
@ -2889,14 +2889,14 @@ static int dwceqos_probe(struct platform_device *pdev)
|
||||||
ret = dwceqos_mii_init(lp);
|
ret = dwceqos_mii_init(lp);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n");
|
dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n");
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dwceqos_mii_probe(ndev);
|
ret = dwceqos_mii_probe(ndev);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
netdev_err(ndev, "mii_probe fail.\n");
|
netdev_err(ndev, "mii_probe fail.\n");
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0);
|
dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0);
|
||||||
|
@ -2914,7 +2914,7 @@ static int dwceqos_probe(struct platform_device *pdev)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n",
|
dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n",
|
||||||
ret);
|
ret);
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n",
|
dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n",
|
||||||
pdev->id, ndev->base_addr, ndev->irq);
|
pdev->id, ndev->base_addr, ndev->irq);
|
||||||
|
@ -2924,7 +2924,7 @@ static int dwceqos_probe(struct platform_device *pdev)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n",
|
dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n",
|
||||||
ndev->irq, ret);
|
ndev->irq, ret);
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (netif_msg_probe(lp))
|
if (netif_msg_probe(lp))
|
||||||
|
@ -2935,11 +2935,14 @@ static int dwceqos_probe(struct platform_device *pdev)
|
||||||
ret = register_netdev(ndev);
|
ret = register_netdev(ndev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
|
dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
|
||||||
goto err_out_clk_dis_phy;
|
goto err_out_deregister_fixed_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_out_deregister_fixed_link:
|
||||||
|
if (of_phy_is_fixed_link(pdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(pdev->dev.of_node);
|
||||||
err_out_clk_dis_phy:
|
err_out_clk_dis_phy:
|
||||||
clk_disable_unprepare(lp->phy_ref_clk);
|
clk_disable_unprepare(lp->phy_ref_clk);
|
||||||
err_out_clk_dis_aper:
|
err_out_clk_dis_aper:
|
||||||
|
@ -2959,8 +2962,11 @@ static int dwceqos_remove(struct platform_device *pdev)
|
||||||
if (ndev) {
|
if (ndev) {
|
||||||
lp = netdev_priv(ndev);
|
lp = netdev_priv(ndev);
|
||||||
|
|
||||||
if (ndev->phydev)
|
if (ndev->phydev) {
|
||||||
phy_disconnect(ndev->phydev);
|
phy_disconnect(ndev->phydev);
|
||||||
|
if (of_phy_is_fixed_link(pdev->dev.of_node))
|
||||||
|
of_phy_deregister_fixed_link(pdev->dev.of_node);
|
||||||
|
}
|
||||||
mdiobus_unregister(lp->mii_bus);
|
mdiobus_unregister(lp->mii_bus);
|
||||||
mdiobus_free(lp->mii_bus);
|
mdiobus_free(lp->mii_bus);
|
||||||
|
|
||||||
|
|
|
@ -2671,20 +2671,8 @@ static void cpsw_remove_dt(struct platform_device *pdev)
|
||||||
if (strcmp(slave_node->name, "slave"))
|
if (strcmp(slave_node->name, "slave"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (of_phy_is_fixed_link(slave_node)) {
|
if (of_phy_is_fixed_link(slave_node))
|
||||||
struct phy_device *phydev;
|
of_phy_deregister_fixed_link(slave_node);
|
||||||
|
|
||||||
phydev = of_phy_find_device(slave_node);
|
|
||||||
if (phydev) {
|
|
||||||
fixed_phy_unregister(phydev);
|
|
||||||
/* Put references taken by
|
|
||||||
* of_phy_find_device() and
|
|
||||||
* of_phy_register_fixed_link().
|
|
||||||
*/
|
|
||||||
phy_device_free(phydev);
|
|
||||||
phy_device_free(phydev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
of_node_put(slave_data->phy_node);
|
of_node_put(slave_data->phy_node);
|
||||||
|
|
||||||
|
@ -3155,6 +3143,8 @@ static int cpsw_resume(struct device *dev)
|
||||||
/* Select default pin state */
|
/* Select default pin state */
|
||||||
pinctrl_pm_select_default_state(dev);
|
pinctrl_pm_select_default_state(dev);
|
||||||
|
|
||||||
|
/* shut up ASSERT_RTNL() warning in netif_set_real_num_tx/rx_queues */
|
||||||
|
rtnl_lock();
|
||||||
if (cpsw->data.dual_emac) {
|
if (cpsw->data.dual_emac) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -3166,6 +3156,8 @@ static int cpsw_resume(struct device *dev)
|
||||||
if (netif_running(ndev))
|
if (netif_running(ndev))
|
||||||
cpsw_ndo_open(ndev);
|
cpsw_ndo_open(ndev);
|
||||||
}
|
}
|
||||||
|
rtnl_unlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1767,6 +1767,7 @@ static int davinci_emac_try_get_mac(struct platform_device *pdev,
|
||||||
*/
|
*/
|
||||||
static int davinci_emac_probe(struct platform_device *pdev)
|
static int davinci_emac_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct device_node *np = pdev->dev.of_node;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct resource *res, *res_ctrl;
|
struct resource *res, *res_ctrl;
|
||||||
struct net_device *ndev;
|
struct net_device *ndev;
|
||||||
|
@ -1805,7 +1806,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
||||||
if (!pdata) {
|
if (!pdata) {
|
||||||
dev_err(&pdev->dev, "no platform data\n");
|
dev_err(&pdev->dev, "no platform data\n");
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
goto no_pdata;
|
goto err_free_netdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MAC addr and PHY mask , RMII enable info from platform_data */
|
/* MAC addr and PHY mask , RMII enable info from platform_data */
|
||||||
|
@ -1941,6 +1942,10 @@ no_cpdma_chan:
|
||||||
cpdma_chan_destroy(priv->rxchan);
|
cpdma_chan_destroy(priv->rxchan);
|
||||||
cpdma_ctlr_destroy(priv->dma);
|
cpdma_ctlr_destroy(priv->dma);
|
||||||
no_pdata:
|
no_pdata:
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
|
of_node_put(priv->phy_node);
|
||||||
|
err_free_netdev:
|
||||||
free_netdev(ndev);
|
free_netdev(ndev);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -1956,6 +1961,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||||
struct emac_priv *priv = netdev_priv(ndev);
|
struct emac_priv *priv = netdev_priv(ndev);
|
||||||
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
|
||||||
dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
|
dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
|
||||||
|
|
||||||
|
@ -1968,6 +1974,8 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
of_node_put(priv->phy_node);
|
of_node_put(priv->phy_node);
|
||||||
pm_runtime_disable(&pdev->dev);
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
if (of_phy_is_fixed_link(np))
|
||||||
|
of_phy_deregister_fixed_link(np);
|
||||||
free_netdev(ndev);
|
free_netdev(ndev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -497,6 +497,7 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
||||||
struct net_device *phy_dev;
|
struct net_device *phy_dev;
|
||||||
int err;
|
int err;
|
||||||
u16 mode = IPVLAN_MODE_L3;
|
u16 mode = IPVLAN_MODE_L3;
|
||||||
|
bool create = false;
|
||||||
|
|
||||||
if (!tb[IFLA_LINK])
|
if (!tb[IFLA_LINK])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -513,6 +514,7 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
||||||
err = ipvlan_port_create(phy_dev);
|
err = ipvlan_port_create(phy_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
create = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data && data[IFLA_IPVLAN_MODE])
|
if (data && data[IFLA_IPVLAN_MODE])
|
||||||
|
@ -536,22 +538,27 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
||||||
|
|
||||||
err = register_netdevice(dev);
|
err = register_netdevice(dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
goto destroy_ipvlan_port;
|
||||||
|
|
||||||
err = netdev_upper_dev_link(phy_dev, dev);
|
err = netdev_upper_dev_link(phy_dev, dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
unregister_netdevice(dev);
|
goto unregister_netdev;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
err = ipvlan_set_port_mode(port, mode);
|
err = ipvlan_set_port_mode(port, mode);
|
||||||
if (err) {
|
if (err) {
|
||||||
unregister_netdevice(dev);
|
goto unregister_netdev;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
|
list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
|
||||||
netif_stacked_transfer_operstate(phy_dev, dev);
|
netif_stacked_transfer_operstate(phy_dev, dev);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
unregister_netdev:
|
||||||
|
unregister_netdevice(dev);
|
||||||
|
destroy_ipvlan_port:
|
||||||
|
if (create)
|
||||||
|
ipvlan_port_destroy(phy_dev);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
|
static void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
|
||||||
|
|
|
@ -518,7 +518,9 @@ static netdev_tx_t w83977af_hard_xmit(struct sk_buff *skb,
|
||||||
|
|
||||||
mtt = irda_get_mtt(skb);
|
mtt = irda_get_mtt(skb);
|
||||||
pr_debug("%s(%ld), mtt=%d\n", __func__ , jiffies, mtt);
|
pr_debug("%s(%ld), mtt=%d\n", __func__ , jiffies, mtt);
|
||||||
if (mtt)
|
if (mtt > 1000)
|
||||||
|
mdelay(mtt/1000);
|
||||||
|
else if (mtt)
|
||||||
udelay(mtt);
|
udelay(mtt);
|
||||||
|
|
||||||
/* Enable DMA interrupt */
|
/* Enable DMA interrupt */
|
||||||
|
|
|
@ -491,7 +491,13 @@ static int macvtap_newlink(struct net *src_net,
|
||||||
/* Don't put anything that may fail after macvlan_common_newlink
|
/* Don't put anything that may fail after macvlan_common_newlink
|
||||||
* because we can't undo what it does.
|
* because we can't undo what it does.
|
||||||
*/
|
*/
|
||||||
return macvlan_common_newlink(src_net, dev, tb, data);
|
err = macvlan_common_newlink(src_net, dev, tb, data);
|
||||||
|
if (err) {
|
||||||
|
netdev_rx_handler_unregister(dev);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void macvtap_dellink(struct net_device *dev,
|
static void macvtap_dellink(struct net_device *dev,
|
||||||
|
@ -736,13 +742,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||||
|
|
||||||
if (zerocopy)
|
if (zerocopy)
|
||||||
err = zerocopy_sg_from_iter(skb, from);
|
err = zerocopy_sg_from_iter(skb, from);
|
||||||
else {
|
else
|
||||||
err = skb_copy_datagram_from_iter(skb, 0, from, len);
|
err = skb_copy_datagram_from_iter(skb, 0, from, len);
|
||||||
if (!err && m && m->msg_control) {
|
|
||||||
struct ubuf_info *uarg = m->msg_control;
|
|
||||||
uarg->callback(uarg, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
goto err_kfree;
|
goto err_kfree;
|
||||||
|
@ -773,7 +774,11 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||||
skb_shinfo(skb)->destructor_arg = m->msg_control;
|
skb_shinfo(skb)->destructor_arg = m->msg_control;
|
||||||
skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
||||||
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
||||||
|
} else if (m && m->msg_control) {
|
||||||
|
struct ubuf_info *uarg = m->msg_control;
|
||||||
|
uarg->callback(uarg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vlan) {
|
if (vlan) {
|
||||||
skb->dev = vlan->dev;
|
skb->dev = vlan->dev;
|
||||||
dev_queue_xmit(skb);
|
dev_queue_xmit(skb);
|
||||||
|
|
|
@ -102,15 +102,19 @@ static int rtl8211f_config_init(struct phy_device *phydev)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (phydev->interface == PHY_INTERFACE_MODE_RGMII) {
|
|
||||||
/* enable TXDLY */
|
|
||||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08);
|
phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08);
|
||||||
reg = phy_read(phydev, 0x11);
|
reg = phy_read(phydev, 0x11);
|
||||||
|
|
||||||
|
/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
|
||||||
|
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||||
|
phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||||
reg |= RTL8211F_TX_DELAY;
|
reg |= RTL8211F_TX_DELAY;
|
||||||
|
else
|
||||||
|
reg &= ~RTL8211F_TX_DELAY;
|
||||||
|
|
||||||
phy_write(phydev, 0x11, reg);
|
phy_write(phydev, 0x11, reg);
|
||||||
/* restore to default page 0 */
|
/* restore to default page 0 */
|
||||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0);
|
phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1231,13 +1231,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||||
|
|
||||||
if (zerocopy)
|
if (zerocopy)
|
||||||
err = zerocopy_sg_from_iter(skb, from);
|
err = zerocopy_sg_from_iter(skb, from);
|
||||||
else {
|
else
|
||||||
err = skb_copy_datagram_from_iter(skb, 0, from, len);
|
err = skb_copy_datagram_from_iter(skb, 0, from, len);
|
||||||
if (!err && msg_control) {
|
|
||||||
struct ubuf_info *uarg = msg_control;
|
|
||||||
uarg->callback(uarg, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
this_cpu_inc(tun->pcpu_stats->rx_dropped);
|
this_cpu_inc(tun->pcpu_stats->rx_dropped);
|
||||||
|
@ -1282,6 +1277,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||||
skb_shinfo(skb)->destructor_arg = msg_control;
|
skb_shinfo(skb)->destructor_arg = msg_control;
|
||||||
skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
||||||
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
||||||
|
} else if (msg_control) {
|
||||||
|
struct ubuf_info *uarg = msg_control;
|
||||||
|
uarg->callback(uarg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_reset_network_header(skb);
|
skb_reset_network_header(skb);
|
||||||
|
|
|
@ -603,12 +603,12 @@ static void ax88772_suspend(struct usbnet *dev)
|
||||||
u16 medium;
|
u16 medium;
|
||||||
|
|
||||||
/* Stop MAC operation */
|
/* Stop MAC operation */
|
||||||
medium = asix_read_medium_status(dev, 0);
|
medium = asix_read_medium_status(dev, 1);
|
||||||
medium &= ~AX_MEDIUM_RE;
|
medium &= ~AX_MEDIUM_RE;
|
||||||
asix_write_medium_mode(dev, medium, 0);
|
asix_write_medium_mode(dev, medium, 1);
|
||||||
|
|
||||||
netdev_dbg(dev->net, "ax88772_suspend: medium=0x%04x\n",
|
netdev_dbg(dev->net, "ax88772_suspend: medium=0x%04x\n",
|
||||||
asix_read_medium_status(dev, 0));
|
asix_read_medium_status(dev, 1));
|
||||||
|
|
||||||
/* Preserve BMCR for restoring */
|
/* Preserve BMCR for restoring */
|
||||||
priv->presvd_phy_bmcr =
|
priv->presvd_phy_bmcr =
|
||||||
|
|
|
@ -388,12 +388,6 @@ void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
|
||||||
case USB_CDC_NOTIFY_NETWORK_CONNECTION:
|
case USB_CDC_NOTIFY_NETWORK_CONNECTION:
|
||||||
netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
|
netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
|
||||||
event->wValue ? "on" : "off");
|
event->wValue ? "on" : "off");
|
||||||
|
|
||||||
/* Work-around for devices with broken off-notifications */
|
|
||||||
if (event->wValue &&
|
|
||||||
!test_bit(__LINK_STATE_NOCARRIER, &dev->net->state))
|
|
||||||
usbnet_link_change(dev, 0, 0);
|
|
||||||
|
|
||||||
usbnet_link_change(dev, !!event->wValue, 0);
|
usbnet_link_change(dev, !!event->wValue, 0);
|
||||||
break;
|
break;
|
||||||
case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
|
case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
|
||||||
|
@ -466,6 +460,36 @@ static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Ensure correct link state
|
||||||
|
*
|
||||||
|
* Some devices (ZTE MF823/831/910) export two carrier on notifications when
|
||||||
|
* connected. This causes the link state to be incorrect. Work around this by
|
||||||
|
* always setting the state to off, then on.
|
||||||
|
*/
|
||||||
|
void usbnet_cdc_zte_status(struct usbnet *dev, struct urb *urb)
|
||||||
|
{
|
||||||
|
struct usb_cdc_notification *event;
|
||||||
|
|
||||||
|
if (urb->actual_length < sizeof(*event))
|
||||||
|
return;
|
||||||
|
|
||||||
|
event = urb->transfer_buffer;
|
||||||
|
|
||||||
|
if (event->bNotificationType != USB_CDC_NOTIFY_NETWORK_CONNECTION) {
|
||||||
|
usbnet_cdc_status(dev, urb);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
|
||||||
|
event->wValue ? "on" : "off");
|
||||||
|
|
||||||
|
if (event->wValue &&
|
||||||
|
netif_carrier_ok(dev->net))
|
||||||
|
netif_carrier_off(dev->net);
|
||||||
|
|
||||||
|
usbnet_link_change(dev, !!event->wValue, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct driver_info cdc_info = {
|
static const struct driver_info cdc_info = {
|
||||||
.description = "CDC Ethernet Device",
|
.description = "CDC Ethernet Device",
|
||||||
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
||||||
|
@ -481,7 +505,7 @@ static const struct driver_info zte_cdc_info = {
|
||||||
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
||||||
.bind = usbnet_cdc_zte_bind,
|
.bind = usbnet_cdc_zte_bind,
|
||||||
.unbind = usbnet_cdc_unbind,
|
.unbind = usbnet_cdc_unbind,
|
||||||
.status = usbnet_cdc_status,
|
.status = usbnet_cdc_zte_status,
|
||||||
.set_rx_mode = usbnet_cdc_update_filter,
|
.set_rx_mode = usbnet_cdc_update_filter,
|
||||||
.manage_power = usbnet_manage_power,
|
.manage_power = usbnet_manage_power,
|
||||||
.rx_fixup = usbnet_cdc_zte_rx_fixup,
|
.rx_fixup = usbnet_cdc_zte_rx_fixup,
|
||||||
|
|
|
@ -894,6 +894,7 @@ static const struct usb_device_id products[] = {
|
||||||
{QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */
|
{QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */
|
||||||
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
||||||
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
||||||
|
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
|
||||||
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
||||||
{QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */
|
{QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */
|
||||||
{QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
|
{QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
|
||||||
|
|
|
@ -611,6 +611,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
|
||||||
struct vxlan_rdst *rd = NULL;
|
struct vxlan_rdst *rd = NULL;
|
||||||
struct vxlan_fdb *f;
|
struct vxlan_fdb *f;
|
||||||
int notify = 0;
|
int notify = 0;
|
||||||
|
int rc;
|
||||||
|
|
||||||
f = __vxlan_find_mac(vxlan, mac);
|
f = __vxlan_find_mac(vxlan, mac);
|
||||||
if (f) {
|
if (f) {
|
||||||
|
@ -641,8 +642,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
|
||||||
if ((flags & NLM_F_APPEND) &&
|
if ((flags & NLM_F_APPEND) &&
|
||||||
(is_multicast_ether_addr(f->eth_addr) ||
|
(is_multicast_ether_addr(f->eth_addr) ||
|
||||||
is_zero_ether_addr(f->eth_addr))) {
|
is_zero_ether_addr(f->eth_addr))) {
|
||||||
int rc = vxlan_fdb_append(f, ip, port, vni, ifindex,
|
rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
|
||||||
&rd);
|
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -673,7 +673,11 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
|
||||||
INIT_LIST_HEAD(&f->remotes);
|
INIT_LIST_HEAD(&f->remotes);
|
||||||
memcpy(f->eth_addr, mac, ETH_ALEN);
|
memcpy(f->eth_addr, mac, ETH_ALEN);
|
||||||
|
|
||||||
vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
|
rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
|
||||||
|
if (rc < 0) {
|
||||||
|
kfree(f);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
++vxlan->addrcnt;
|
++vxlan->addrcnt;
|
||||||
hlist_add_head_rcu(&f->hlist,
|
hlist_add_head_rcu(&f->hlist,
|
||||||
|
|
|
@ -2238,8 +2238,9 @@ done:
|
||||||
is_scanning_required = 1;
|
is_scanning_required = 1;
|
||||||
} else {
|
} else {
|
||||||
mwifiex_dbg(priv->adapter, MSG,
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
"info: trying to associate to '%s' bssid %pM\n",
|
"info: trying to associate to '%.*s' bssid %pM\n",
|
||||||
(char *)req_ssid.ssid, bss->bssid);
|
req_ssid.ssid_len, (char *)req_ssid.ssid,
|
||||||
|
bss->bssid);
|
||||||
memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
|
memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2299,8 +2300,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
mwifiex_dbg(adapter, INFO,
|
mwifiex_dbg(adapter, INFO,
|
||||||
"info: Trying to associate to %s and bssid %pM\n",
|
"info: Trying to associate to %.*s and bssid %pM\n",
|
||||||
(char *)sme->ssid, sme->bssid);
|
(int)sme->ssid_len, (char *)sme->ssid, sme->bssid);
|
||||||
|
|
||||||
if (!mwifiex_stop_bg_scan(priv))
|
if (!mwifiex_stop_bg_scan(priv))
|
||||||
cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy);
|
cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy);
|
||||||
|
@ -2433,8 +2434,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
mwifiex_dbg(priv->adapter, MSG,
|
mwifiex_dbg(priv->adapter, MSG,
|
||||||
"info: trying to join to %s and bssid %pM\n",
|
"info: trying to join to %.*s and bssid %pM\n",
|
||||||
(char *)params->ssid, params->bssid);
|
params->ssid_len, (char *)params->ssid, params->bssid);
|
||||||
|
|
||||||
mwifiex_set_ibss_params(priv, params);
|
mwifiex_set_ibss_params(priv, params);
|
||||||
|
|
||||||
|
|
|
@ -490,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_phy_register_fixed_link);
|
EXPORT_SYMBOL(of_phy_register_fixed_link);
|
||||||
|
|
||||||
|
void of_phy_deregister_fixed_link(struct device_node *np)
|
||||||
|
{
|
||||||
|
struct phy_device *phydev;
|
||||||
|
|
||||||
|
phydev = of_phy_find_device(np);
|
||||||
|
if (!phydev)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fixed_phy_unregister(phydev);
|
||||||
|
|
||||||
|
put_device(&phydev->mdio.dev); /* of_phy_find_device() */
|
||||||
|
phy_device_free(phydev); /* fixed_phy_register() */
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(of_phy_deregister_fixed_link);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
|
* Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
|
||||||
*
|
*
|
||||||
* Authors: Joao Pinto <jpmpinto@gmail.com>
|
* Authors: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
|
|
@ -307,20 +307,6 @@ out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
|
|
||||||
{
|
|
||||||
while (1) {
|
|
||||||
if (!pci_is_pcie(dev))
|
|
||||||
break;
|
|
||||||
if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
|
|
||||||
return dev;
|
|
||||||
if (!dev->bus->self)
|
|
||||||
break;
|
|
||||||
dev = dev->bus->self;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int find_aer_device_iter(struct device *device, void *data)
|
static int find_aer_device_iter(struct device *device, void *data)
|
||||||
{
|
{
|
||||||
struct pcie_device **result = data;
|
struct pcie_device **result = data;
|
||||||
|
|
|
@ -1439,6 +1439,21 @@ static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp)
|
||||||
dev_warn(&dev->dev, "PCI-X settings not supported\n");
|
dev_warn(&dev->dev, "PCI-X settings not supported\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool pcie_root_rcb_set(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
struct pci_dev *rp = pcie_find_root_port(dev);
|
||||||
|
u16 lnkctl;
|
||||||
|
|
||||||
|
if (!rp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl);
|
||||||
|
if (lnkctl & PCI_EXP_LNKCTL_RCB)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
|
static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
|
||||||
{
|
{
|
||||||
int pos;
|
int pos;
|
||||||
|
@ -1468,9 +1483,20 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
|
||||||
~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or);
|
~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or);
|
||||||
|
|
||||||
/* Initialize Link Control Register */
|
/* Initialize Link Control Register */
|
||||||
if (pcie_cap_has_lnkctl(dev))
|
if (pcie_cap_has_lnkctl(dev)) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the Root Port supports Read Completion Boundary of
|
||||||
|
* 128, set RCB to 128. Otherwise, clear it.
|
||||||
|
*/
|
||||||
|
hpp->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB;
|
||||||
|
hpp->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB;
|
||||||
|
if (pcie_root_rcb_set(dev))
|
||||||
|
hpp->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB;
|
||||||
|
|
||||||
pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL,
|
pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL,
|
||||||
~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or);
|
~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or);
|
||||||
|
}
|
||||||
|
|
||||||
/* Find Advanced Error Reporting Enhanced Capability */
|
/* Find Advanced Error Reporting Enhanced Capability */
|
||||||
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
|
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
|
||||||
|
|
|
@ -474,6 +474,7 @@ static int meson_pwm_probe(struct platform_device *pdev)
|
||||||
if (IS_ERR(meson->base))
|
if (IS_ERR(meson->base))
|
||||||
return PTR_ERR(meson->base);
|
return PTR_ERR(meson->base);
|
||||||
|
|
||||||
|
spin_lock_init(&meson->lock);
|
||||||
meson->chip.dev = &pdev->dev;
|
meson->chip.dev = &pdev->dev;
|
||||||
meson->chip.ops = &meson_pwm_ops;
|
meson->chip.ops = &meson_pwm_ops;
|
||||||
meson->chip.base = -1;
|
meson->chip.base = -1;
|
||||||
|
|
|
@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
||||||
if (test_bit(PWMF_EXPORTED, &pwm->flags))
|
if (test_bit(PWMF_EXPORTED, &pwm->flags))
|
||||||
pwm_unexport_child(parent, pwm);
|
pwm_unexport_child(parent, pwm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_device(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init pwm_sysfs_init(void)
|
static int __init pwm_sysfs_init(void)
|
||||||
|
|
|
@ -1083,7 +1083,7 @@ unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba)
|
||||||
nonemb_cmd = &phba->boot_struct.nonemb_cmd;
|
nonemb_cmd = &phba->boot_struct.nonemb_cmd;
|
||||||
nonemb_cmd->size = sizeof(*resp);
|
nonemb_cmd->size = sizeof(*resp);
|
||||||
nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
|
nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
|
||||||
sizeof(nonemb_cmd->size),
|
nonemb_cmd->size,
|
||||||
&nonemb_cmd->dma);
|
&nonemb_cmd->dma);
|
||||||
if (!nonemb_cmd->va) {
|
if (!nonemb_cmd->va) {
|
||||||
mutex_unlock(&ctrl->mbox_lock);
|
mutex_unlock(&ctrl->mbox_lock);
|
||||||
|
|
|
@ -2009,7 +2009,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h,
|
||||||
|
|
||||||
static int hpsa_slave_alloc(struct scsi_device *sdev)
|
static int hpsa_slave_alloc(struct scsi_device *sdev)
|
||||||
{
|
{
|
||||||
struct hpsa_scsi_dev_t *sd;
|
struct hpsa_scsi_dev_t *sd = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct ctlr_info *h;
|
struct ctlr_info *h;
|
||||||
|
|
||||||
|
@ -2026,7 +2026,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
|
||||||
sd->target = sdev_id(sdev);
|
sd->target = sdev_id(sdev);
|
||||||
sd->lun = sdev->lun;
|
sd->lun = sdev->lun;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
|
if (!sd)
|
||||||
sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
|
sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
|
||||||
sdev_id(sdev), sdev->lun);
|
sdev_id(sdev), sdev->lun);
|
||||||
|
|
||||||
|
@ -3840,6 +3841,7 @@ static int hpsa_update_device_info(struct ctlr_info *h,
|
||||||
sizeof(this_device->vendor));
|
sizeof(this_device->vendor));
|
||||||
memcpy(this_device->model, &inq_buff[16],
|
memcpy(this_device->model, &inq_buff[16],
|
||||||
sizeof(this_device->model));
|
sizeof(this_device->model));
|
||||||
|
this_device->rev = inq_buff[2];
|
||||||
memset(this_device->device_id, 0,
|
memset(this_device->device_id, 0,
|
||||||
sizeof(this_device->device_id));
|
sizeof(this_device->device_id));
|
||||||
if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
|
if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
|
||||||
|
@ -3929,10 +3931,14 @@ static void figure_bus_target_lun(struct ctlr_info *h,
|
||||||
|
|
||||||
if (!is_logical_dev_addr_mode(lunaddrbytes)) {
|
if (!is_logical_dev_addr_mode(lunaddrbytes)) {
|
||||||
/* physical device, target and lun filled in later */
|
/* physical device, target and lun filled in later */
|
||||||
if (is_hba_lunid(lunaddrbytes))
|
if (is_hba_lunid(lunaddrbytes)) {
|
||||||
|
int bus = HPSA_HBA_BUS;
|
||||||
|
|
||||||
|
if (!device->rev)
|
||||||
|
bus = HPSA_LEGACY_HBA_BUS;
|
||||||
hpsa_set_bus_target_lun(device,
|
hpsa_set_bus_target_lun(device,
|
||||||
HPSA_HBA_BUS, 0, lunid & 0x3fff);
|
bus, 0, lunid & 0x3fff);
|
||||||
else
|
} else
|
||||||
/* defer target, lun assignment for physical devices */
|
/* defer target, lun assignment for physical devices */
|
||||||
hpsa_set_bus_target_lun(device,
|
hpsa_set_bus_target_lun(device,
|
||||||
HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
|
HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t {
|
||||||
u64 sas_address;
|
u64 sas_address;
|
||||||
unsigned char vendor[8]; /* bytes 8-15 of inquiry data */
|
unsigned char vendor[8]; /* bytes 8-15 of inquiry data */
|
||||||
unsigned char model[16]; /* bytes 16-31 of inquiry data */
|
unsigned char model[16]; /* bytes 16-31 of inquiry data */
|
||||||
|
unsigned char rev; /* byte 2 of inquiry data */
|
||||||
unsigned char raid_level; /* from inquiry page 0xC1 */
|
unsigned char raid_level; /* from inquiry page 0xC1 */
|
||||||
unsigned char volume_offline; /* discovered via TUR or VPD */
|
unsigned char volume_offline; /* discovered via TUR or VPD */
|
||||||
u16 queue_depth; /* max queue_depth for this device */
|
u16 queue_depth; /* max queue_depth for this device */
|
||||||
|
@ -402,6 +403,7 @@ struct offline_device_entry {
|
||||||
#define HPSA_RAID_VOLUME_BUS 1
|
#define HPSA_RAID_VOLUME_BUS 1
|
||||||
#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2
|
#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2
|
||||||
#define HPSA_HBA_BUS 0
|
#define HPSA_HBA_BUS 0
|
||||||
|
#define HPSA_LEGACY_HBA_BUS 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send the command to the hardware
|
Send the command to the hardware
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue