Merge remote-tracking branch 'djwong/ocfs2-vfs-reflink-6' into for-linus
This commit is contained in:
commit
3c55d6bcfe
8
CREDITS
8
CREDITS
|
@ -9,7 +9,7 @@
|
|||
Linus
|
||||
----------
|
||||
|
||||
M: Matt Mackal
|
||||
N: Matt Mackal
|
||||
E: mpm@selenic.com
|
||||
D: SLOB slab allocator
|
||||
|
||||
|
@ -1910,7 +1910,7 @@ S: Ra'annana, Israel
|
|||
|
||||
N: Andi Kleen
|
||||
E: andi@firstfloor.org
|
||||
U: http://www.halobates.de
|
||||
W: http://www.halobates.de
|
||||
D: network, x86, NUMA, various hacks
|
||||
S: Schwalbenstr. 96
|
||||
S: 85551 Ottobrunn
|
||||
|
@ -2089,8 +2089,8 @@ D: ST Microelectronics SPEAr13xx PCI host bridge driver
|
|||
D: Synopsys Designware PCI host bridge driver
|
||||
|
||||
N: Gabor Kuti
|
||||
M: seasons@falcon.sch.bme.hu
|
||||
M: seasons@makosteszta.sote.hu
|
||||
E: seasons@falcon.sch.bme.hu
|
||||
E: seasons@makosteszta.sote.hu
|
||||
D: Original author of software suspend
|
||||
|
||||
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-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
|
||||
the maximum frame size (there's contradiction in ePAPR).
|
||||
- phy-mode: string, operation mode of the PHY interface; supported values are
|
||||
"mii", "gmii", "sgmii", "qsgmii", "tbi", "rev-mii", "rmii", "rgmii", "rgmii-id",
|
||||
"rgmii-rxid", "rgmii-txid", "rtbi", "smii", "xgmii", "trgmii"; this is now a
|
||||
de-facto standard property;
|
||||
- phy-mode: string, operation mode of the PHY interface. This is now a de-facto
|
||||
standard property; supported values are:
|
||||
* "mii"
|
||||
* "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-handle: phandle, specifies a reference to a node representing a PHY
|
||||
device; this property is described in ePAPR and so preferred;
|
||||
|
|
|
@ -62,10 +62,13 @@ nf_conntrack_generic_timeout - INTEGER (seconds)
|
|||
protocols.
|
||||
|
||||
nf_conntrack_helper - BOOLEAN
|
||||
0 - disabled
|
||||
not 0 - enabled (default)
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
|
||||
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)
|
||||
default 30
|
||||
|
|
13
MAINTAINERS
13
MAINTAINERS
|
@ -9257,11 +9257,12 @@ S: Maintained
|
|||
F: drivers/pci/host/*layerscape*
|
||||
|
||||
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>
|
||||
L: linux-pci@vger.kernel.org
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
|
||||
F: drivers/pci/host/*imx6*
|
||||
|
||||
PCI DRIVER FOR TI KEYSTONE
|
||||
|
@ -9320,17 +9321,11 @@ F: drivers/pci/host/pci-exynos.c
|
|||
|
||||
PCI DRIVER FOR SYNOPSIS DESIGNWARE
|
||||
M: Jingoo Han <jingoohan1@gmail.com>
|
||||
M: Pratyush Anand <pratyush.anand@gmail.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>
|
||||
M: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
S: Maintained
|
||||
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
|
||||
M: Will Deacon <will.deacon@arm.com>
|
||||
|
|
13
Makefile
13
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION = -rc8
|
||||
NAME = Psychotic Stoned Sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -607,6 +607,13 @@ else
|
|||
include/config/auto.conf: ;
|
||||
endif # $(dot-config)
|
||||
|
||||
# For the kernel to actually contain only the needed exported symbols,
|
||||
# we have to build modules as well to determine what those symbols are.
|
||||
# (this can be evaluated only once include/config/auto.conf has been included)
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
KBUILD_MODULES := 1
|
||||
endif
|
||||
|
||||
# The all: target is the default when no target is given on the
|
||||
# command line.
|
||||
# This allow a user to issue only 'make' to build a kernel including modules
|
||||
|
@ -944,7 +951,7 @@ ifdef CONFIG_GDB_SCRIPTS
|
|||
endif
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||
"$(MAKE) KBUILD_MODULES=1 -f $(srctree)/Makefile vmlinux_prereq"
|
||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
||||
endif
|
||||
|
||||
# standalone target for easier testing
|
||||
|
@ -1019,8 +1026,6 @@ prepare2: prepare3 prepare-compiler-check outputmakefile asm-generic
|
|||
prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
|
||||
include/config/auto.conf
|
||||
$(cmd_crmodverdir)
|
||||
$(Q)test -e include/generated/autoksyms.h || \
|
||||
touch include/generated/autoksyms.h
|
||||
|
||||
archprepare: archheaders archscripts prepare1 scripts_basic
|
||||
|
||||
|
|
|
@ -22,10 +22,11 @@
|
|||
static inline void __delay(unsigned long loops)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
" lp 1f \n"
|
||||
" nop \n"
|
||||
"1: \n"
|
||||
: "+l"(loops));
|
||||
" mov lp_count, %0 \n"
|
||||
" lp 1f \n"
|
||||
" nop \n"
|
||||
"1: \n"
|
||||
: : "r"(loops));
|
||||
}
|
||||
|
||||
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 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*/
|
||||
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
static int l2_line_sz;
|
||||
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_end = 0xFFFFFFFF; /* legacy value */
|
||||
|
||||
|
|
|
@ -745,7 +745,6 @@ dtb-$(CONFIG_MACH_SUN4I) += \
|
|||
sun4i-a10-pcduino2.dtb \
|
||||
sun4i-a10-pov-protab2-ips9.dtb
|
||||
dtb-$(CONFIG_MACH_SUN5I) += \
|
||||
ntc-gr8-evb.dtb \
|
||||
sun5i-a10s-auxtek-t003.dtb \
|
||||
sun5i-a10s-auxtek-t004.dtb \
|
||||
sun5i-a10s-mk802.dtb \
|
||||
|
@ -761,6 +760,7 @@ dtb-$(CONFIG_MACH_SUN5I) += \
|
|||
sun5i-a13-olinuxino-micro.dtb \
|
||||
sun5i-a13-q8-tablet.dtb \
|
||||
sun5i-a13-utoo-p66.dtb \
|
||||
sun5i-gr8-evb.dtb \
|
||||
sun5i-r8-chip.dtb
|
||||
dtb-$(CONFIG_MACH_SUN6I) += \
|
||||
sun6i-a31-app4-evb1.dtb \
|
||||
|
|
|
@ -283,6 +283,8 @@ i2c@9840000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c0_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -296,6 +298,8 @@ i2c@9841000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -309,6 +313,8 @@ i2c@9842000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -322,6 +328,8 @@ i2c@9843000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -335,6 +343,8 @@ i2c@9844000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c4_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -348,6 +358,8 @@ i2c@9845000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c5_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -363,6 +375,8 @@ i2c@9540000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c10_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -376,6 +390,8 @@ i2c@9541000 {
|
|||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c11_default>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "ntc-gr8.dtsi"
|
||||
#include "sun5i-gr8.dtsi"
|
||||
#include "sunxi-common-regulators.dtsi"
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
|
@ -393,7 +393,7 @@ pcie_ctlr: pcie-controller@40000000 {
|
|||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
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>,
|
||||
<0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>;
|
||||
#interrupt-cells = <1>;
|
||||
|
|
|
@ -76,7 +76,7 @@ CLUSTER_SLEEP_0: cluster-sleep-0 {
|
|||
compatible = "arm,idle-state";
|
||||
arm,psci-suspend-param = <0x1010000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <300>;
|
||||
entry-latency-us = <400>;
|
||||
exit-latency-us = <1200>;
|
||||
min-residency-us = <2500>;
|
||||
};
|
||||
|
|
|
@ -76,7 +76,7 @@ CLUSTER_SLEEP_0: cluster-sleep-0 {
|
|||
compatible = "arm,idle-state";
|
||||
arm,psci-suspend-param = <0x1010000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <300>;
|
||||
entry-latency-us = <400>;
|
||||
exit-latency-us = <1200>;
|
||||
min-residency-us = <2500>;
|
||||
};
|
||||
|
|
|
@ -76,7 +76,7 @@ CLUSTER_SLEEP_0: cluster-sleep-0 {
|
|||
compatible = "arm,idle-state";
|
||||
arm,psci-suspend-param = <0x1010000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <300>;
|
||||
entry-latency-us = <400>;
|
||||
exit-latency-us = <1200>;
|
||||
min-residency-us = <2500>;
|
||||
};
|
||||
|
|
|
@ -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");
|
||||
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[2] = tf->device;
|
||||
desc[3] = tf->nsect;
|
||||
desc[0] = 0;
|
||||
desc[7] = 0;
|
||||
if (tf->flags & ATA_TFLAG_LBA48) {
|
||||
desc[8] |= 0x80;
|
||||
if (tf->hob_nsect)
|
||||
|
|
|
@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class,
|
|||
zram = idr_find(&zram_index_idr, dev_id);
|
||||
if (zram) {
|
||||
ret = zram_remove(zram);
|
||||
idr_remove(&zram_index_idr, dev_id);
|
||||
if (!ret)
|
||||
idr_remove(&zram_index_idr, dev_id);
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ config CLK_BCM_KONA
|
|||
|
||||
config COMMON_CLK_IPROC
|
||||
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
|
||||
default ARCH_BCM_IPROC
|
||||
help
|
||||
|
|
|
@ -143,7 +143,7 @@ static SUNXI_CCU_NKM_WITH_MUX_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
|||
4, 2, /* K */
|
||||
0, 4, /* M */
|
||||
21, 0, /* mux */
|
||||
BIT(31), /* gate */
|
||||
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||
BIT(28), /* lock */
|
||||
CLK_SET_RATE_UNGATE);
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
|||
8, 4, /* N */
|
||||
4, 2, /* K */
|
||||
0, 4, /* M */
|
||||
BIT(31), /* gate */
|
||||
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||
BIT(28), /* lock */
|
||||
CLK_SET_RATE_UNGATE);
|
||||
|
||||
|
|
|
@ -485,7 +485,6 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id,
|
|||
*/
|
||||
static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
|
||||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
|
@ -500,7 +499,6 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
|
|||
}
|
||||
amdgpu_atpx_priv.dhandle = dhandle;
|
||||
amdgpu_atpx_priv.atpx.handle = atpx_handle;
|
||||
amdgpu_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -562,17 +560,25 @@ static bool amdgpu_atpx_detect(void)
|
|||
struct pci_dev *pdev = NULL;
|
||||
bool has_atpx = false;
|
||||
int vga_count = 0;
|
||||
bool d3_supported = false;
|
||||
struct pci_dev *parent_pdev;
|
||||
|
||||
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
|
||||
vga_count++;
|
||||
|
||||
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
|
||||
|
||||
parent_pdev = pci_upstream_bridge(pdev);
|
||||
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
||||
}
|
||||
|
||||
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
|
||||
vga_count++;
|
||||
|
||||
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
|
||||
|
||||
parent_pdev = pci_upstream_bridge(pdev);
|
||||
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
||||
}
|
||||
|
||||
if (has_atpx && vga_count == 2) {
|
||||
|
@ -580,6 +586,7 @@ static bool amdgpu_atpx_detect(void)
|
|||
printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
|
||||
acpi_method_name);
|
||||
amdgpu_atpx_priv.atpx_detected = true;
|
||||
amdgpu_atpx_priv.bridge_pm_usable = d3_supported;
|
||||
amdgpu_atpx_init();
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -2214,6 +2214,7 @@ uint32_t polaris10_get_mac_definition(uint32_t value)
|
|||
int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
uint32_t tmp;
|
||||
int result;
|
||||
bool error = false;
|
||||
|
@ -2233,8 +2234,10 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
|
|||
offsetof(SMU74_Firmware_Header, SoftRegisters),
|
||||
&tmp, SMC_RAM_END);
|
||||
|
||||
if (!result)
|
||||
if (!result) {
|
||||
data->soft_regs_start = tmp;
|
||||
smu_data->smu7_data.soft_regs_start = tmp;
|
||||
}
|
||||
|
||||
error |= (0 != result);
|
||||
|
||||
|
|
|
@ -375,7 +375,6 @@ static int hdlcd_drm_bind(struct device *dev)
|
|||
|
||||
err_fbdev:
|
||||
drm_kms_helper_poll_fini(drm);
|
||||
drm_mode_config_cleanup(drm);
|
||||
drm_vblank_cleanup(drm);
|
||||
err_vblank:
|
||||
pm_runtime_disable(drm->dev);
|
||||
|
@ -387,6 +386,7 @@ static int hdlcd_drm_bind(struct device *dev)
|
|||
drm_irq_uninstall(drm);
|
||||
of_reserved_mem_device_release(drm->dev);
|
||||
err_free:
|
||||
drm_mode_config_cleanup(drm);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
drm_dev_unref(drm);
|
||||
|
||||
|
|
|
@ -254,10 +254,12 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
|
|||
req->value = dev->mode_config.async_page_flip;
|
||||
break;
|
||||
case DRM_CAP_PAGE_FLIP_TARGET:
|
||||
req->value = 1;
|
||||
drm_for_each_crtc(crtc, dev) {
|
||||
if (!crtc->funcs->page_flip_target)
|
||||
req->value = 0;
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
req->value = 1;
|
||||
drm_for_each_crtc(crtc, dev) {
|
||||
if (!crtc->funcs->page_flip_target)
|
||||
req->value = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DRM_CAP_CURSOR_WIDTH:
|
||||
|
|
|
@ -2268,7 +2268,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
|
|||
page = shmem_read_mapping_page(mapping, i);
|
||||
if (IS_ERR(page)) {
|
||||
ret = PTR_ERR(page);
|
||||
goto err_pages;
|
||||
goto err_sg;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
|
@ -2311,8 +2311,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
|
|||
|
||||
return 0;
|
||||
|
||||
err_pages:
|
||||
err_sg:
|
||||
sg_mark_end(sg);
|
||||
err_pages:
|
||||
for_each_sgt_page(page, sgt_iter, st)
|
||||
put_page(page);
|
||||
sg_free_table(st);
|
||||
|
|
|
@ -12260,7 +12260,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
|||
intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error);
|
||||
if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) {
|
||||
ret = -EIO;
|
||||
goto cleanup;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
atomic_inc(&intel_crtc->unpin_work_count);
|
||||
|
@ -12352,6 +12352,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
|||
intel_unpin_fb_obj(fb, crtc->primary->state->rotation);
|
||||
cleanup_pending:
|
||||
atomic_dec(&intel_crtc->unpin_work_count);
|
||||
unlock:
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
cleanup:
|
||||
crtc->primary->fb = old_fb;
|
||||
|
|
|
@ -479,7 +479,6 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id,
|
|||
*/
|
||||
static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
|
||||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
|
@ -493,7 +492,6 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
|||
|
||||
radeon_atpx_priv.dhandle = dhandle;
|
||||
radeon_atpx_priv.atpx.handle = atpx_handle;
|
||||
radeon_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -555,11 +553,16 @@ static bool radeon_atpx_detect(void)
|
|||
struct pci_dev *pdev = NULL;
|
||||
bool has_atpx = false;
|
||||
int vga_count = 0;
|
||||
bool d3_supported = false;
|
||||
struct pci_dev *parent_pdev;
|
||||
|
||||
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
|
||||
vga_count++;
|
||||
|
||||
has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
|
||||
|
||||
parent_pdev = pci_upstream_bridge(pdev);
|
||||
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
||||
}
|
||||
|
||||
/* some newer PX laptops mark the dGPU as a non-VGA display device */
|
||||
|
@ -567,6 +570,9 @@ static bool radeon_atpx_detect(void)
|
|||
vga_count++;
|
||||
|
||||
has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
|
||||
|
||||
parent_pdev = pci_upstream_bridge(pdev);
|
||||
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
||||
}
|
||||
|
||||
if (has_atpx && vga_count == 2) {
|
||||
|
@ -574,6 +580,7 @@ static bool radeon_atpx_detect(void)
|
|||
printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
|
||||
acpi_method_name);
|
||||
radeon_atpx_priv.atpx_detected = true;
|
||||
radeon_atpx_priv.bridge_pm_usable = d3_supported;
|
||||
radeon_atpx_init();
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -381,9 +381,7 @@ static int octeon_i2c_read(struct octeon_i2c *i2c, int target,
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
data[i] = octeon_i2c_data_read(i2c, &result);
|
||||
if (result)
|
||||
return result;
|
||||
data[i] = octeon_i2c_data_read(i2c);
|
||||
if (recv_len && i == 0) {
|
||||
if (data[i] > I2C_SMBUS_BLOCK_MAX + 1)
|
||||
return -EPROTO;
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-smbus.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/kernel.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;
|
||||
|
||||
__raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI(i2c));
|
||||
|
||||
readq_poll_timeout(i2c->twsi_base + SW_TWSI(i2c), tmp, tmp & SW_TWSI_V,
|
||||
I2C_OCTEON_EVENT_WAIT, i2c->adap.timeout);
|
||||
do {
|
||||
tmp = __raw_readq(i2c->twsi_base + SW_TWSI(i2c));
|
||||
} while ((tmp & SW_TWSI_V) != 0);
|
||||
}
|
||||
|
||||
#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.
|
||||
*/
|
||||
static inline int octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg,
|
||||
int *error)
|
||||
static inline u8 octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg)
|
||||
{
|
||||
u64 tmp;
|
||||
int ret;
|
||||
|
||||
__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;
|
||||
}
|
||||
|
||||
#define octeon_i2c_ctl_read(i2c) \
|
||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL, NULL)
|
||||
#define octeon_i2c_data_read(i2c, error) \
|
||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA, error)
|
||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL)
|
||||
#define octeon_i2c_data_read(i2c) \
|
||||
octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA)
|
||||
#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
|
||||
|
|
|
@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
|||
if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
|
||||
&max_proto, set_properties, true))
|
||||
return PSMOUSE_TOUCHKIT_PS2;
|
||||
|
||||
if (psmouse_try_protocol(psmouse, PSMOUSE_BYD,
|
||||
&max_proto, set_properties, true))
|
||||
return PSMOUSE_BYD;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -43,11 +43,22 @@ struct __packed pucan_command {
|
|||
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 */
|
||||
#define PUCAN_TSLOW_SJW_T(s, t) (((s) & 0xf) | ((!!(t)) << 7))
|
||||
#define PUCAN_TSLOW_TSEG2(t) ((t) & 0xf)
|
||||
#define PUCAN_TSLOW_TSEG1(t) ((t) & 0x3f)
|
||||
#define PUCAN_TSLOW_BRP(b) ((b) & 0x3ff)
|
||||
#define PUCAN_TSLOW_SJW_T(s, t) (((s) & PUCAN_TSLOW_SJW_MASK) | \
|
||||
((!!(t)) << 7))
|
||||
#define PUCAN_TSLOW_TSEG2(t) ((t) & PUCAN_TSLOW_TSEG2_MASK)
|
||||
#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 {
|
||||
__le16 opcode_channel;
|
||||
|
@ -60,11 +71,21 @@ struct __packed pucan_timing_slow {
|
|||
__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 */
|
||||
#define PUCAN_TFAST_SJW(s) ((s) & 0x3)
|
||||
#define PUCAN_TFAST_TSEG2(t) ((t) & 0x7)
|
||||
#define PUCAN_TFAST_TSEG1(t) ((t) & 0xf)
|
||||
#define PUCAN_TFAST_BRP(b) ((b) & 0x3ff)
|
||||
#define PUCAN_TFAST_SJW(s) ((s) & PUCAN_TFAST_SJW_MASK)
|
||||
#define PUCAN_TFAST_TSEG2(t) ((t) & PUCAN_TFAST_TSEG2_MASK)
|
||||
#define PUCAN_TFAST_TSEG1(t) ((t) & PUCAN_TFAST_TSEG1_MASK)
|
||||
#define PUCAN_TFAST_BRP(b) ((b) & PUCAN_TFAST_BRP_MASK)
|
||||
|
||||
struct __packed pucan_timing_fast {
|
||||
__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_USBFD_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)},
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
||||
|
@ -50,6 +51,7 @@ static const struct peak_usb_adapter *const peak_usb_adapters_list[] = {
|
|||
&pcan_usb_pro,
|
||||
&pcan_usb_fd,
|
||||
&pcan_usb_pro_fd,
|
||||
&pcan_usb_x6,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#define PCAN_USBPRO_PRODUCT_ID 0x000d
|
||||
#define PCAN_USBPROFD_PRODUCT_ID 0x0011
|
||||
#define PCAN_USBFD_PRODUCT_ID 0x0012
|
||||
#define PCAN_USBX6_PRODUCT_ID 0x0014
|
||||
|
||||
#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_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 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 = {
|
||||
.name = "pcan_usb_fd",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 64,
|
||||
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 16,
|
||||
.sjw_max = 16,
|
||||
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = 1024,
|
||||
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const pcan_usb_fd_data_const = {
|
||||
.name = "pcan_usb_fd",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 16,
|
||||
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 8,
|
||||
.sjw_max = 4,
|
||||
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = 1024,
|
||||
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||
.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 = {
|
||||
.name = "pcan_usb_pro_fd",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 64,
|
||||
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 16,
|
||||
.sjw_max = 16,
|
||||
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = 1024,
|
||||
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
|
||||
.name = "pcan_usb_pro_fd",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 16,
|
||||
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 8,
|
||||
.sjw_max = 4,
|
||||
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = 1024,
|
||||
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||
.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,
|
||||
};
|
||||
|
||||
/* 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,
|
||||
};
|
||||
|
|
|
@ -400,12 +400,6 @@ static int tse_rx(struct altera_tse_private *priv, int limit)
|
|||
|
||||
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,
|
||||
priv->rx_ring[entry].len, DMA_FROM_DEVICE);
|
||||
|
||||
|
@ -469,7 +463,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
|
|||
|
||||
if (unlikely(netif_queue_stopped(priv->dev) &&
|
||||
tse_tx_avail(priv) > TSE_TX_THRESH(priv))) {
|
||||
netif_tx_lock(priv->dev);
|
||||
if (netif_queue_stopped(priv->dev) &&
|
||||
tse_tx_avail(priv) > TSE_TX_THRESH(priv)) {
|
||||
if (netif_msg_tx_done(priv))
|
||||
|
@ -477,7 +470,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
|
|||
__func__);
|
||||
netif_wake_queue(priv->dev);
|
||||
}
|
||||
netif_tx_unlock(priv->dev);
|
||||
}
|
||||
|
||||
spin_unlock(&priv->tx_lock);
|
||||
|
@ -592,10 +584,6 @@ static int tse_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
buffer->dma_addr = dma_addr;
|
||||
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);
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
|
@ -819,6 +807,8 @@ static int init_phy(struct net_device *dev)
|
|||
|
||||
if (!phydev) {
|
||||
netdev_err(dev, "Could not find the PHY\n");
|
||||
if (fixed_link)
|
||||
of_phy_deregister_fixed_link(priv->device->of_node);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -1545,10 +1535,15 @@ static int altera_tse_probe(struct platform_device *pdev)
|
|||
static int altera_tse_remove(struct platform_device *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);
|
||||
|
||||
if (of_phy_is_fixed_link(priv->device->of_node))
|
||||
of_phy_deregister_fixed_link(priv->device->of_node);
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
altera_tse_mdio_destroy(ndev);
|
||||
unregister_netdev(ndev);
|
||||
|
|
|
@ -829,7 +829,7 @@ static int xgbe_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int xgbe_suspend(struct device *dev)
|
||||
{
|
||||
struct net_device *netdev = dev_get_drvdata(dev);
|
||||
|
@ -874,7 +874,7 @@ static int xgbe_resume(struct device *dev)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id xgbe_acpi_match[] = {
|
||||
|
|
|
@ -1466,12 +1466,12 @@ static int nb8800_probe(struct platform_device *pdev)
|
|||
|
||||
ret = nb8800_hw_init(dev);
|
||||
if (ret)
|
||||
goto err_free_bus;
|
||||
goto err_deregister_fixed_link;
|
||||
|
||||
if (ops && ops->init) {
|
||||
ret = ops->init(dev);
|
||||
if (ret)
|
||||
goto err_free_bus;
|
||||
goto err_deregister_fixed_link;
|
||||
}
|
||||
|
||||
dev->netdev_ops = &nb8800_netdev_ops;
|
||||
|
@ -1504,6 +1504,9 @@ static int nb8800_probe(struct platform_device *pdev)
|
|||
|
||||
err_free_dma:
|
||||
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:
|
||||
of_node_put(priv->phy_node);
|
||||
mdiobus_unregister(bus);
|
||||
|
@ -1521,6 +1524,8 @@ static int nb8800_remove(struct platform_device *pdev)
|
|||
struct nb8800_priv *priv = netdev_priv(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);
|
||||
|
||||
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) {
|
||||
dev_err(&pdev->dev, "invalid interrupts\n");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
priv->base = devm_ioremap_resource(&pdev->dev, r);
|
||||
if (IS_ERR(priv->base)) {
|
||||
ret = PTR_ERR(priv->base);
|
||||
goto err;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
priv->netdev = dev;
|
||||
|
@ -1779,7 +1779,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
ret = of_phy_register_fixed_link(dn);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register fixed PHY\n");
|
||||
goto err;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
priv->phy_dn = dn;
|
||||
|
@ -1821,7 +1821,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
ret = register_netdev(dev);
|
||||
if (ret) {
|
||||
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;
|
||||
|
@ -1832,7 +1832,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
priv->base, priv->irq0, priv->irq1, txq, rxq);
|
||||
|
||||
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);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1840,11 +1844,14 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
static int bcm_sysport_remove(struct platform_device *pdev)
|
||||
{
|
||||
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
|
||||
* and we use managed allocations
|
||||
*/
|
||||
unregister_netdev(dev);
|
||||
if (of_phy_is_fixed_link(dn))
|
||||
of_phy_deregister_fixed_link(dn);
|
||||
free_netdev(dev);
|
||||
dev_set_drvdata(&pdev->dev, NULL);
|
||||
|
||||
|
|
|
@ -1172,6 +1172,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
|||
struct bcmgenet_tx_ring *ring)
|
||||
{
|
||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||
struct device *kdev = &priv->pdev->dev;
|
||||
struct enet_cb *tx_cb_ptr;
|
||||
struct netdev_queue *txq;
|
||||
unsigned int pkts_compl = 0;
|
||||
|
@ -1199,13 +1200,13 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
|||
if (tx_cb_ptr->skb) {
|
||||
pkts_compl++;
|
||||
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_len(tx_cb_ptr, dma_len),
|
||||
DMA_TO_DEVICE);
|
||||
bcmgenet_free_cb(tx_cb_ptr);
|
||||
} 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_len(tx_cb_ptr, dma_len),
|
||||
DMA_TO_DEVICE);
|
||||
|
@ -1775,6 +1776,7 @@ static int bcmgenet_alloc_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;
|
||||
int i;
|
||||
|
||||
|
@ -1782,7 +1784,7 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
|
|||
cb = &priv->rx_cbs[i];
|
||||
|
||||
if (dma_unmap_addr(cb, dma_addr)) {
|
||||
dma_unmap_single(&priv->dev->dev,
|
||||
dma_unmap_single(kdev,
|
||||
dma_unmap_addr(cb, dma_addr),
|
||||
priv->rx_buf_len, DMA_FROM_DEVICE);
|
||||
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 */
|
||||
if (phy_mode == PHY_INTERFACE_MODE_MOCA) {
|
||||
phydev = of_phy_find_device(dn);
|
||||
if (phydev)
|
||||
if (phydev) {
|
||||
phydev->link = 0;
|
||||
put_device(&phydev->mdio.dev);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -625,6 +627,7 @@ static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv)
|
|||
int bcmgenet_mii_init(struct net_device *dev)
|
||||
{
|
||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||
struct device_node *dn = priv->pdev->dev.of_node;
|
||||
int ret;
|
||||
|
||||
ret = bcmgenet_mii_alloc(priv);
|
||||
|
@ -638,6 +641,8 @@ int bcmgenet_mii_init(struct net_device *dev)
|
|||
return 0;
|
||||
|
||||
out:
|
||||
if (of_phy_is_fixed_link(dn))
|
||||
of_phy_deregister_fixed_link(dn);
|
||||
of_node_put(priv->phy_dn);
|
||||
mdiobus_unregister(priv->mii_bus);
|
||||
mdiobus_free(priv->mii_bus);
|
||||
|
@ -647,7 +652,10 @@ int bcmgenet_mii_init(struct net_device *dev)
|
|||
void bcmgenet_mii_exit(struct net_device *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);
|
||||
mdiobus_unregister(priv->mii_bus);
|
||||
mdiobus_free(priv->mii_bus);
|
||||
|
|
|
@ -975,6 +975,7 @@ static inline void macb_init_rx_ring(struct macb *bp)
|
|||
addr += bp->rx_buffer_size;
|
||||
}
|
||||
bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP);
|
||||
bp->rx_tail = 0;
|
||||
}
|
||||
|
||||
static int macb_rx(struct macb *bp, int budget)
|
||||
|
@ -1156,6 +1157,7 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
|||
if (status & MACB_BIT(RXUBR)) {
|
||||
ctrl = macb_readl(bp, NCR);
|
||||
macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE));
|
||||
wmb();
|
||||
macb_writel(bp, NCR, ctrl | MACB_BIT(RE));
|
||||
|
||||
if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
|
||||
|
@ -1616,8 +1618,6 @@ static void macb_init_rings(struct macb *bp)
|
|||
bp->queues[0].tx_head = 0;
|
||||
bp->queues[0].tx_tail = 0;
|
||||
bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
|
||||
|
||||
bp->rx_tail = 0;
|
||||
}
|
||||
|
||||
static void macb_reset_hw(struct macb *bp)
|
||||
|
@ -2770,6 +2770,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
|
|||
if (intstatus & MACB_BIT(RXUBR)) {
|
||||
ctl = macb_readl(lp, NCR);
|
||||
macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
|
||||
wmb();
|
||||
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(0x509b), /* Custom T540-CR LOM */
|
||||
CH_PCI_ID_TABLE_FENTRY(0x509c), /* Custom T520-CR*/
|
||||
CH_PCI_ID_TABLE_FENTRY(0x509d), /* Custom T540-CR*/
|
||||
|
||||
/* T6 adapters:
|
||||
*/
|
||||
|
|
|
@ -574,6 +574,8 @@ struct fec_enet_private {
|
|||
unsigned int reload_period;
|
||||
int pps_enable;
|
||||
unsigned int next_counter;
|
||||
|
||||
u64 ethtool_stats[0];
|
||||
};
|
||||
|
||||
void fec_ptp_init(struct platform_device *pdev);
|
||||
|
|
|
@ -2313,14 +2313,24 @@ static const struct fec_stat {
|
|||
{ "IEEE_rx_octets_ok", IEEE_R_OCTETS_OK },
|
||||
};
|
||||
|
||||
static void fec_enet_get_ethtool_stats(struct net_device *dev,
|
||||
struct ethtool_stats *stats, u64 *data)
|
||||
static void fec_enet_update_ethtool_stats(struct net_device *dev)
|
||||
{
|
||||
struct fec_enet_private *fep = netdev_priv(dev);
|
||||
int 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,
|
||||
|
@ -2874,6 +2884,8 @@ fec_enet_close(struct net_device *ndev)
|
|||
if (fep->quirks & FEC_QUIRK_ERR006687)
|
||||
imx6q_cpuidle_fec_irqs_unused();
|
||||
|
||||
fec_enet_update_ethtool_stats(ndev);
|
||||
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
||||
pm_runtime_mark_last_busy(&fep->pdev->dev);
|
||||
|
@ -3180,6 +3192,8 @@ static int fec_enet_init(struct net_device *ndev)
|
|||
|
||||
fec_restart(ndev);
|
||||
|
||||
fec_enet_update_ethtool_stats(ndev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3278,7 +3292,8 @@ fec_probe(struct platform_device *pdev)
|
|||
fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
|
||||
|
||||
/* 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);
|
||||
if (!ndev)
|
||||
return -ENOMEM;
|
||||
|
@ -3475,6 +3490,8 @@ fec_probe(struct platform_device *pdev)
|
|||
failed_clk_ipg:
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
failed_clk:
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
failed_phy:
|
||||
of_node_put(phy_node);
|
||||
failed_ioremap:
|
||||
|
@ -3488,6 +3505,7 @@ fec_drv_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
||||
cancel_work_sync(&fep->tx_timeout_work);
|
||||
fec_ptp_stop(pdev);
|
||||
|
@ -3495,6 +3513,8 @@ fec_drv_remove(struct platform_device *pdev)
|
|||
fec_enet_mii_remove(fep);
|
||||
if (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);
|
||||
free_netdev(ndev);
|
||||
|
||||
|
|
|
@ -1107,6 +1107,9 @@ int memac_free(struct fman_mac *memac)
|
|||
{
|
||||
free_init_resources(memac);
|
||||
|
||||
if (memac->pcsphy)
|
||||
put_device(&memac->pcsphy->mdio.dev);
|
||||
|
||||
kfree(memac->memac_drv_param);
|
||||
kfree(memac);
|
||||
|
||||
|
|
|
@ -892,6 +892,8 @@ static int mac_probe(struct platform_device *_of_dev)
|
|||
priv->fixed_link->duplex = phy->duplex;
|
||||
priv->fixed_link->pause = phy->pause;
|
||||
priv->fixed_link->asym_pause = phy->asym_pause;
|
||||
|
||||
put_device(&phy->mdio.dev);
|
||||
}
|
||||
|
||||
err = mac_dev->init(mac_dev);
|
||||
|
|
|
@ -980,7 +980,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
|
|||
err = clk_prepare_enable(clk);
|
||||
if (err) {
|
||||
ret = err;
|
||||
goto out_free_fpi;
|
||||
goto out_deregister_fixed_link;
|
||||
}
|
||||
fpi->clk_per = clk;
|
||||
}
|
||||
|
@ -1061,6 +1061,9 @@ static int fs_enet_probe(struct platform_device *ofdev)
|
|||
of_node_put(fpi->phy_node);
|
||||
if (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:
|
||||
kfree(fpi);
|
||||
return ret;
|
||||
|
@ -1079,6 +1082,8 @@ static int fs_enet_remove(struct platform_device *ofdev)
|
|||
of_node_put(fep->fpi->phy_node);
|
||||
if (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);
|
||||
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)
|
||||
{
|
||||
struct device_node *np = ofdev->dev.of_node;
|
||||
struct net_device *dev = NULL;
|
||||
struct gfar_private *priv = NULL;
|
||||
int err = 0, i;
|
||||
|
@ -1462,6 +1463,8 @@ static int gfar_probe(struct platform_device *ofdev)
|
|||
return 0;
|
||||
|
||||
register_fail:
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
unmap_group_regs(priv);
|
||||
gfar_free_rx_queues(priv);
|
||||
gfar_free_tx_queues(priv);
|
||||
|
@ -1474,11 +1477,16 @@ static int gfar_probe(struct platform_device *ofdev)
|
|||
static int gfar_remove(struct platform_device *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->tbi_node);
|
||||
|
||||
unregister_netdev(priv->ndev);
|
||||
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
|
||||
unmap_group_regs(priv);
|
||||
gfar_free_rx_queues(priv);
|
||||
gfar_free_tx_queues(priv);
|
||||
|
|
|
@ -3868,9 +3868,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|||
dev = alloc_etherdev(sizeof(*ugeth));
|
||||
|
||||
if (dev == NULL) {
|
||||
of_node_put(ug_info->tbi_node);
|
||||
of_node_put(ug_info->phy_node);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto err_deregister_fixed_link;
|
||||
}
|
||||
|
||||
ugeth = netdev_priv(dev);
|
||||
|
@ -3907,10 +3906,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|||
if (netif_msg_probe(ugeth))
|
||||
pr_err("%s: Cannot register net device, aborting\n",
|
||||
dev->name);
|
||||
free_netdev(dev);
|
||||
of_node_put(ug_info->tbi_node);
|
||||
of_node_put(ug_info->phy_node);
|
||||
return err;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
|
@ -3923,16 +3919,29 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|||
ugeth->node = np;
|
||||
|
||||
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)
|
||||
{
|
||||
struct net_device *dev = platform_get_drvdata(ofdev);
|
||||
struct ucc_geth_private *ugeth = netdev_priv(dev);
|
||||
struct device_node *np = ofdev->dev.of_node;
|
||||
|
||||
unregister_netdev(dev);
|
||||
free_netdev(dev);
|
||||
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->phy_node);
|
||||
|
||||
|
|
|
@ -4931,11 +4931,15 @@ static int igb_tso(struct igb_ring *tx_ring,
|
|||
|
||||
/* initialize outer IP header fields */
|
||||
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
|
||||
* is not a part of the outer IP header
|
||||
*/
|
||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
||||
csum_unfold(l4.tcp->check)));
|
||||
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||
csum_start - trans_start,
|
||||
0));
|
||||
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||
|
||||
ip.v4->tot_len = 0;
|
||||
|
|
|
@ -1965,11 +1965,15 @@ static int igbvf_tso(struct igbvf_ring *tx_ring,
|
|||
|
||||
/* initialize outer IP header fields */
|
||||
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
|
||||
* is not a part of the outer IP header
|
||||
*/
|
||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
||||
csum_unfold(l4.tcp->check)));
|
||||
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||
csum_start - trans_start,
|
||||
0));
|
||||
type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||
|
||||
ip.v4->tot_len = 0;
|
||||
|
|
|
@ -7277,11 +7277,15 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
|
|||
|
||||
/* initialize outer IP header fields */
|
||||
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
|
||||
* is not a part of the outer IP header
|
||||
*/
|
||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
||||
csum_unfold(l4.tcp->check)));
|
||||
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||
csum_start - trans_start,
|
||||
0));
|
||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||
|
||||
ip.v4->tot_len = 0;
|
||||
|
|
|
@ -3329,11 +3329,15 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
|
|||
|
||||
/* initialize outer IP header fields */
|
||||
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
|
||||
* is not a part of the outer IP header
|
||||
*/
|
||||
ip.v4->check = csum_fold(csum_add(lco_csum(skb),
|
||||
csum_unfold(l4.tcp->check)));
|
||||
ip.v4->check = csum_fold(csum_partial(trans_start,
|
||||
csum_start - trans_start,
|
||||
0));
|
||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||
|
||||
ip.v4->tot_len = 0;
|
||||
|
|
|
@ -4191,6 +4191,8 @@ static int mvneta_probe(struct platform_device *pdev)
|
|||
clk_disable_unprepare(pp->clk);
|
||||
err_put_phy_node:
|
||||
of_node_put(phy_node);
|
||||
if (of_phy_is_fixed_link(dn))
|
||||
of_phy_deregister_fixed_link(dn);
|
||||
err_free_irq:
|
||||
irq_dispose_mapping(dev->irq);
|
||||
err_free_netdev:
|
||||
|
@ -4202,6 +4204,7 @@ static int mvneta_probe(struct platform_device *pdev)
|
|||
static int mvneta_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev = platform_get_drvdata(pdev);
|
||||
struct device_node *dn = pdev->dev.of_node;
|
||||
struct mvneta_port *pp = netdev_priv(dev);
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
@ -4209,6 +4212,8 @@ static int mvneta_remove(struct platform_device *pdev)
|
|||
clk_disable_unprepare(pp->clk);
|
||||
free_percpu(pp->ports);
|
||||
free_percpu(pp->stats);
|
||||
if (of_phy_is_fixed_link(dn))
|
||||
of_phy_deregister_fixed_link(dn);
|
||||
irq_dispose_mapping(dev->irq);
|
||||
of_node_put(pp->phy_node);
|
||||
free_netdev(dev);
|
||||
|
|
|
@ -318,6 +318,8 @@ static int mtk_phy_connect(struct net_device *dev)
|
|||
return 0;
|
||||
|
||||
err_phy:
|
||||
if (of_phy_is_fixed_link(mac->of_node))
|
||||
of_phy_deregister_fixed_link(mac->of_node);
|
||||
of_node_put(np);
|
||||
dev_err(eth->dev, "%s: invalid phy\n", __func__);
|
||||
return -EINVAL;
|
||||
|
@ -1923,6 +1925,8 @@ static void mtk_uninit(struct net_device *dev)
|
|||
struct mtk_eth *eth = mac->hw;
|
||||
|
||||
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_PDMA_INT_MASK, ~0);
|
||||
}
|
||||
|
|
|
@ -2079,13 +2079,6 @@ static int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
|
|||
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,
|
||||
struct mlx4_en_priv *src,
|
||||
|
@ -2162,8 +2155,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
|||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
bool shutdown = mdev->dev->persist->interface_state &
|
||||
MLX4_INTERFACE_STATE_SHUTDOWN;
|
||||
|
||||
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
|
||||
|
||||
|
@ -2171,10 +2162,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
|||
if (priv->registered) {
|
||||
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
|
||||
priv->port));
|
||||
if (shutdown)
|
||||
mlx4_en_shutdown(dev);
|
||||
else
|
||||
unregister_netdev(dev);
|
||||
unregister_netdev(dev);
|
||||
}
|
||||
|
||||
if (priv->allocated)
|
||||
|
@ -2203,8 +2191,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
|
|||
kfree(priv->tx_ring);
|
||||
kfree(priv->tx_cq);
|
||||
|
||||
if (!shutdown)
|
||||
free_netdev(dev);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
|
||||
|
|
|
@ -4147,11 +4147,8 @@ static void mlx4_shutdown(struct pci_dev *pdev)
|
|||
|
||||
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
|
||||
mutex_lock(&persist->interface_state_mutex);
|
||||
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;
|
||||
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
|
||||
mlx4_unload_one(pdev);
|
||||
}
|
||||
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,
|
||||
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;
|
||||
|
||||
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);
|
||||
adpt->phydev = of_phy_find_device(phy_np);
|
||||
of_node_put(phy_np);
|
||||
}
|
||||
|
||||
if (!adpt->phydev) {
|
||||
|
|
|
@ -711,6 +711,8 @@ static int emac_probe(struct platform_device *pdev)
|
|||
err_undo_napi:
|
||||
netif_napi_del(&adpt->rx_q.napi);
|
||||
err_undo_mdiobus:
|
||||
if (!has_acpi_companion(&pdev->dev))
|
||||
put_device(&adpt->phydev->mdio.dev);
|
||||
mdiobus_unregister(adpt->mii_bus);
|
||||
err_undo_clocks:
|
||||
emac_clks_teardown(adpt);
|
||||
|
@ -730,6 +732,8 @@ static int emac_remove(struct platform_device *pdev)
|
|||
|
||||
emac_clks_teardown(adpt);
|
||||
|
||||
if (!has_acpi_companion(&pdev->dev))
|
||||
put_device(&adpt->phydev->mdio.dev);
|
||||
mdiobus_unregister(adpt->mii_bus);
|
||||
free_netdev(netdev);
|
||||
|
||||
|
|
|
@ -1008,20 +1008,18 @@ static int ravb_phy_init(struct net_device *ndev)
|
|||
of_node_put(pn);
|
||||
if (!phydev) {
|
||||
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
|
||||
* at this time.
|
||||
*/
|
||||
if (priv->chip_id == RCAR_GEN3) {
|
||||
int err;
|
||||
|
||||
err = phy_set_max_speed(phydev, SPEED_100);
|
||||
if (err) {
|
||||
netdev_err(ndev, "failed to limit PHY to 100Mbit/s\n");
|
||||
phy_disconnect(phydev);
|
||||
return err;
|
||||
goto err_phy_disconnect;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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 */
|
||||
|
@ -1634,6 +1640,7 @@ static void ravb_set_rx_mode(struct net_device *ndev)
|
|||
/* Device close function for Ethernet AVB */
|
||||
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_tstamp_skb *ts_skb, *ts_skb2;
|
||||
|
||||
|
@ -1663,6 +1670,8 @@ static int ravb_close(struct net_device *ndev)
|
|||
if (ndev->phydev) {
|
||||
phy_stop(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) {
|
||||
|
|
|
@ -518,7 +518,7 @@ static struct sh_eth_cpu_data r7s72100_data = {
|
|||
|
||||
.ecsr_value = ECSR_ICD,
|
||||
.ecsipr_value = ECSIPR_ICDIP,
|
||||
.eesipr_value = 0xff7f009f,
|
||||
.eesipr_value = 0xe77f009f,
|
||||
|
||||
.tx_check = EESR_TC1 | EESR_FTC,
|
||||
.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) {
|
||||
ret = plat_dat->init(pdev, plat_dat->bsp_priv);
|
||||
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[] = {
|
||||
|
|
|
@ -271,15 +271,17 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
||||
if (!gmac)
|
||||
return -ENOMEM;
|
||||
if (!gmac) {
|
||||
err = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
gmac->pdev = pdev;
|
||||
|
||||
err = ipq806x_gmac_of_parse(gmac);
|
||||
if (err) {
|
||||
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,
|
||||
|
@ -300,7 +302,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
|||
default:
|
||||
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
||||
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);
|
||||
|
||||
|
@ -319,7 +322,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
|||
default:
|
||||
dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
|
||||
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);
|
||||
|
||||
|
@ -346,7 +350,16 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
|||
plat_dat->bsp_priv = gmac;
|
||||
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[] = {
|
||||
|
|
|
@ -46,7 +46,8 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
|
|||
reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg");
|
||||
if (IS_ERR(reg)) {
|
||||
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) {
|
||||
|
@ -55,13 +56,23 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
|
|||
ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII;
|
||||
} else {
|
||||
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,
|
||||
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[] = {
|
||||
|
|
|
@ -64,18 +64,31 @@ static int meson6_dwmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
if (!dwmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dwmac->reg))
|
||||
return PTR_ERR(dwmac->reg);
|
||||
if (IS_ERR(dwmac->reg)) {
|
||||
ret = PTR_ERR(dwmac->reg);
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
plat_dat->bsp_priv = dwmac;
|
||||
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[] = {
|
||||
|
|
|
@ -264,32 +264,48 @@ static int meson8b_dwmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
if (!dwmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
dwmac->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dwmac->regs))
|
||||
return PTR_ERR(dwmac->regs);
|
||||
if (IS_ERR(dwmac->regs)) {
|
||||
ret = PTR_ERR(dwmac->regs);
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
dwmac->pdev = pdev;
|
||||
dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node);
|
||||
if (dwmac->phy_mode < 0) {
|
||||
dev_err(&pdev->dev, "missing phy-mode property\n");
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
ret = meson8b_init_clk(dwmac);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
|
||||
ret = meson8b_init_prg_eth(dwmac);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
|
||||
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)
|
||||
|
|
|
@ -981,14 +981,27 @@ static int rk_gmac_probe(struct platform_device *pdev)
|
|||
plat_dat->resume = rk_gmac_resume;
|
||||
|
||||
plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
|
||||
if (IS_ERR(plat_dat->bsp_priv))
|
||||
return PTR_ERR(plat_dat->bsp_priv);
|
||||
if (IS_ERR(plat_dat->bsp_priv)) {
|
||||
ret = PTR_ERR(plat_dat->bsp_priv);
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
ret = rk_gmac_init(pdev, plat_dat->bsp_priv);
|
||||
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_exit;
|
||||
|
||||
return 0;
|
||||
|
||||
err_gmac_exit:
|
||||
rk_gmac_exit(pdev, plat_dat->bsp_priv);
|
||||
err_remove_config_dt:
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id rk_gmac_dwmac_match[] = {
|
||||
|
|
|
@ -304,6 +304,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
|||
struct device *dev = &pdev->dev;
|
||||
int ret;
|
||||
struct socfpga_dwmac *dwmac;
|
||||
struct net_device *ndev;
|
||||
struct stmmac_priv *stpriv;
|
||||
|
||||
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
|
||||
if (ret)
|
||||
|
@ -314,32 +316,43 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
dwmac = devm_kzalloc(dev, sizeof(*dwmac), GFP_KERNEL);
|
||||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
if (!dwmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
ret = socfpga_dwmac_parse_data(dwmac, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Unable to parse OF data\n");
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
plat_dat->bsp_priv = dwmac;
|
||||
plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret)
|
||||
goto err_remove_config_dt;
|
||||
|
||||
if (!ret) {
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct stmmac_priv *stpriv = netdev_priv(ndev);
|
||||
ndev = platform_get_drvdata(pdev);
|
||||
stpriv = netdev_priv(ndev);
|
||||
|
||||
/* The socfpga driver needs to control the stmmac reset to
|
||||
* set the phy mode. Create a copy of the core reset handel
|
||||
* so it can be used by the driver later.
|
||||
*/
|
||||
dwmac->stmmac_rst = stpriv->stmmac_rst;
|
||||
/* The socfpga driver needs to control the stmmac reset to set the phy
|
||||
* mode. Create a copy of the core reset handle so it can be used by
|
||||
* the driver later.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -345,13 +345,15 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
if (!dwmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
ret = sti_dwmac_parse_data(dwmac, pdev);
|
||||
if (ret) {
|
||||
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;
|
||||
|
@ -363,9 +365,20 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
|||
|
||||
ret = sti_dwmac_init(pdev, plat_dat->bsp_priv);
|
||||
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_dwmac_exit;
|
||||
|
||||
return 0;
|
||||
|
||||
err_dwmac_exit:
|
||||
sti_dwmac_exit(pdev, plat_dat->bsp_priv);
|
||||
err_remove_config_dt:
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct sti_dwmac_of_data stih4xx_dwmac_data = {
|
||||
|
|
|
@ -107,24 +107,33 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
|
||||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
if (!dwmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
ret = stm32_dwmac_parse_data(dwmac, &pdev->dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Unable to parse OF data\n");
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
plat_dat->bsp_priv = dwmac;
|
||||
|
||||
ret = stm32_dwmac_init(plat_dat);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret)
|
||||
stm32_dwmac_clk_disable(dwmac);
|
||||
goto err_clk_disable;
|
||||
|
||||
return 0;
|
||||
|
||||
err_clk_disable:
|
||||
stm32_dwmac_clk_disable(dwmac);
|
||||
err_remove_config_dt:
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -120,22 +120,27 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(plat_dat);
|
||||
|
||||
gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
|
||||
if (!gmac)
|
||||
return -ENOMEM;
|
||||
if (!gmac) {
|
||||
ret = -ENOMEM;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
|
||||
gmac->interface = of_get_phy_mode(dev->of_node);
|
||||
|
||||
gmac->tx_clk = devm_clk_get(dev, "allwinner_gmac_tx");
|
||||
if (IS_ERR(gmac->tx_clk)) {
|
||||
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 */
|
||||
gmac->regulator = devm_regulator_get_optional(dev, "phy");
|
||||
if (IS_ERR(gmac->regulator)) {
|
||||
if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err_remove_config_dt;
|
||||
}
|
||||
dev_info(dev, "no regulator found\n");
|
||||
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);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret)
|
||||
sun7i_gmac_exit(pdev, plat_dat->bsp_priv);
|
||||
goto err_gmac_exit;
|
||||
|
||||
return 0;
|
||||
|
||||
err_gmac_exit:
|
||||
sun7i_gmac_exit(pdev, plat_dat->bsp_priv);
|
||||
err_remove_config_dt:
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -3416,7 +3416,6 @@ int stmmac_dvr_remove(struct device *dev)
|
|||
stmmac_set_mac(priv->ioaddr, false);
|
||||
netif_carrier_off(ndev);
|
||||
unregister_netdev(ndev);
|
||||
of_node_put(priv->plat->phy_node);
|
||||
if (priv->stmmac_rst)
|
||||
reset_control_assert(priv->stmmac_rst);
|
||||
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
|
||||
* @pdev: platform_device structure
|
||||
* @plat: driver data platform structure
|
||||
* @mac: MAC address to use
|
||||
* Description:
|
||||
* 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),
|
||||
GFP_KERNEL);
|
||||
if (!dma_cfg) {
|
||||
of_node_put(plat->phy_node);
|
||||
stmmac_remove_config_dt(pdev, plat);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
plat->dma_cfg = dma_cfg;
|
||||
|
@ -329,14 +328,37 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
|||
|
||||
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
|
||||
struct plat_stmmacenet_data *
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
void stmmac_remove_config_dt(struct platform_device *pdev,
|
||||
struct plat_stmmacenet_data *plat)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_OF */
|
||||
EXPORT_SYMBOL_GPL(stmmac_probe_config_dt);
|
||||
EXPORT_SYMBOL_GPL(stmmac_remove_config_dt);
|
||||
|
||||
int stmmac_get_platform_resources(struct platform_device *pdev,
|
||||
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 stmmac_priv *priv = netdev_priv(ndev);
|
||||
struct plat_stmmacenet_data *plat = priv->plat;
|
||||
int ret = stmmac_dvr_remove(&pdev->dev);
|
||||
|
||||
if (priv->plat->exit)
|
||||
priv->plat->exit(pdev, priv->plat->bsp_priv);
|
||||
if (plat->exit)
|
||||
plat->exit(pdev, plat->bsp_priv);
|
||||
|
||||
stmmac_remove_config_dt(pdev, plat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
struct plat_stmmacenet_data *
|
||||
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,
|
||||
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);
|
||||
if (ret < 0) {
|
||||
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;
|
||||
|
@ -2889,14 +2889,14 @@ static int dwceqos_probe(struct platform_device *pdev)
|
|||
ret = dwceqos_mii_init(lp);
|
||||
if (ret) {
|
||||
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);
|
||||
if (ret != 0) {
|
||||
netdev_err(ndev, "mii_probe fail.\n");
|
||||
ret = -ENXIO;
|
||||
goto err_out_clk_dis_phy;
|
||||
goto err_out_deregister_fixed_link;
|
||||
}
|
||||
|
||||
dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0);
|
||||
|
@ -2914,7 +2914,7 @@ static int dwceqos_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n",
|
||||
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",
|
||||
pdev->id, ndev->base_addr, ndev->irq);
|
||||
|
@ -2924,7 +2924,7 @@ static int dwceqos_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n",
|
||||
ndev->irq, ret);
|
||||
goto err_out_clk_dis_phy;
|
||||
goto err_out_deregister_fixed_link;
|
||||
}
|
||||
|
||||
if (netif_msg_probe(lp))
|
||||
|
@ -2935,11 +2935,14 @@ static int dwceqos_probe(struct platform_device *pdev)
|
|||
ret = register_netdev(ndev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
|
||||
goto err_out_clk_dis_phy;
|
||||
goto err_out_deregister_fixed_link;
|
||||
}
|
||||
|
||||
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:
|
||||
clk_disable_unprepare(lp->phy_ref_clk);
|
||||
err_out_clk_dis_aper:
|
||||
|
@ -2959,8 +2962,11 @@ static int dwceqos_remove(struct platform_device *pdev)
|
|||
if (ndev) {
|
||||
lp = netdev_priv(ndev);
|
||||
|
||||
if (ndev->phydev)
|
||||
if (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_free(lp->mii_bus);
|
||||
|
||||
|
|
|
@ -2459,20 +2459,8 @@ static void cpsw_remove_dt(struct platform_device *pdev)
|
|||
if (strcmp(slave_node->name, "slave"))
|
||||
continue;
|
||||
|
||||
if (of_phy_is_fixed_link(slave_node)) {
|
||||
struct phy_device *phydev;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
if (of_phy_is_fixed_link(slave_node))
|
||||
of_phy_deregister_fixed_link(slave_node);
|
||||
|
||||
of_node_put(slave_data->phy_node);
|
||||
|
||||
|
@ -2942,6 +2930,8 @@ static int cpsw_resume(struct device *dev)
|
|||
/* Select default pin state */
|
||||
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) {
|
||||
int i;
|
||||
|
||||
|
@ -2953,6 +2943,8 @@ static int cpsw_resume(struct device *dev)
|
|||
if (netif_running(ndev))
|
||||
cpsw_ndo_open(ndev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#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)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int rc = 0;
|
||||
struct resource *res, *res_ctrl;
|
||||
struct net_device *ndev;
|
||||
|
@ -1805,7 +1806,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "no platform data\n");
|
||||
rc = -ENODEV;
|
||||
goto no_pdata;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
/* MAC addr and PHY mask , RMII enable info from platform_data */
|
||||
|
@ -1941,6 +1942,10 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||
cpdma_chan_destroy(priv->rxchan);
|
||||
cpdma_ctlr_destroy(priv->dma);
|
||||
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);
|
||||
return rc;
|
||||
}
|
||||
|
@ -1956,6 +1961,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
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");
|
||||
|
||||
|
@ -1968,6 +1974,8 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
|||
unregister_netdev(ndev);
|
||||
of_node_put(priv->phy_node);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
free_netdev(ndev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -859,7 +859,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
struct geneve_dev *geneve = netdev_priv(dev);
|
||||
struct geneve_sock *gs4;
|
||||
struct rtable *rt = NULL;
|
||||
const struct iphdr *iip; /* interior IP header */
|
||||
int err = -EINVAL;
|
||||
struct flowi4 fl4;
|
||||
__u8 tos, ttl;
|
||||
|
@ -890,8 +889,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
iip = ip_hdr(skb);
|
||||
|
||||
if (info) {
|
||||
const struct ip_tunnel_key *key = &info->key;
|
||||
u8 *opts = NULL;
|
||||
|
@ -911,7 +908,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
if (unlikely(err))
|
||||
goto tx_error;
|
||||
|
||||
tos = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
||||
tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
|
||||
ttl = key->ttl;
|
||||
df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
|
||||
} else {
|
||||
|
@ -920,7 +917,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
if (unlikely(err))
|
||||
goto tx_error;
|
||||
|
||||
tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb);
|
||||
tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, ip_hdr(skb), skb);
|
||||
ttl = geneve->ttl;
|
||||
if (!ttl && IN_MULTICAST(ntohl(fl4.daddr)))
|
||||
ttl = 1;
|
||||
|
@ -952,7 +949,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
{
|
||||
struct geneve_dev *geneve = netdev_priv(dev);
|
||||
struct dst_entry *dst = NULL;
|
||||
const struct iphdr *iip; /* interior IP header */
|
||||
struct geneve_sock *gs6;
|
||||
int err = -EINVAL;
|
||||
struct flowi6 fl6;
|
||||
|
@ -982,8 +978,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
iip = ip_hdr(skb);
|
||||
|
||||
if (info) {
|
||||
const struct ip_tunnel_key *key = &info->key;
|
||||
u8 *opts = NULL;
|
||||
|
@ -1004,7 +998,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
if (unlikely(err))
|
||||
goto tx_error;
|
||||
|
||||
prio = ip_tunnel_ecn_encap(key->tos, iip, skb);
|
||||
prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
|
||||
ttl = key->ttl;
|
||||
label = info->key.label;
|
||||
} else {
|
||||
|
@ -1014,7 +1008,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
goto tx_error;
|
||||
|
||||
prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
|
||||
iip, skb);
|
||||
ip_hdr(skb), skb);
|
||||
ttl = geneve->ttl;
|
||||
if (!ttl && ipv6_addr_is_multicast(&fl6.daddr))
|
||||
ttl = 1;
|
||||
|
|
|
@ -497,6 +497,7 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
|||
struct net_device *phy_dev;
|
||||
int err;
|
||||
u16 mode = IPVLAN_MODE_L3;
|
||||
bool create = false;
|
||||
|
||||
if (!tb[IFLA_LINK])
|
||||
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);
|
||||
if (err < 0)
|
||||
return err;
|
||||
create = true;
|
||||
}
|
||||
|
||||
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);
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto destroy_ipvlan_port;
|
||||
|
||||
err = netdev_upper_dev_link(phy_dev, dev);
|
||||
if (err) {
|
||||
unregister_netdevice(dev);
|
||||
return err;
|
||||
goto unregister_netdev;
|
||||
}
|
||||
err = ipvlan_set_port_mode(port, mode);
|
||||
if (err) {
|
||||
unregister_netdevice(dev);
|
||||
return err;
|
||||
goto unregister_netdev;
|
||||
}
|
||||
|
||||
list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
|
||||
netif_stacked_transfer_operstate(phy_dev, dev);
|
||||
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)
|
||||
|
|
|
@ -518,7 +518,9 @@ static netdev_tx_t w83977af_hard_xmit(struct sk_buff *skb,
|
|||
|
||||
mtt = irda_get_mtt(skb);
|
||||
pr_debug("%s(%ld), mtt=%d\n", __func__ , jiffies, mtt);
|
||||
if (mtt)
|
||||
if (mtt > 1000)
|
||||
mdelay(mtt/1000);
|
||||
else if (mtt)
|
||||
udelay(mtt);
|
||||
|
||||
/* 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
|
||||
* 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,
|
||||
|
@ -736,13 +742,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
|||
|
||||
if (zerocopy)
|
||||
err = zerocopy_sg_from_iter(skb, from);
|
||||
else {
|
||||
else
|
||||
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)
|
||||
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)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
||||
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) {
|
||||
skb->dev = vlan->dev;
|
||||
dev_queue_xmit(skb);
|
||||
|
|
|
@ -102,15 +102,19 @@ static int rtl8211f_config_init(struct phy_device *phydev)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (phydev->interface == PHY_INTERFACE_MODE_RGMII) {
|
||||
/* enable TXDLY */
|
||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08);
|
||||
reg = phy_read(phydev, 0x11);
|
||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08);
|
||||
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;
|
||||
phy_write(phydev, 0x11, reg);
|
||||
/* restore to default page 0 */
|
||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0);
|
||||
}
|
||||
else
|
||||
reg &= ~RTL8211F_TX_DELAY;
|
||||
|
||||
phy_write(phydev, 0x11, reg);
|
||||
/* restore to default page 0 */
|
||||
phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1246,13 +1246,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|||
|
||||
if (zerocopy)
|
||||
err = zerocopy_sg_from_iter(skb, from);
|
||||
else {
|
||||
else
|
||||
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) {
|
||||
this_cpu_inc(tun->pcpu_stats->rx_dropped);
|
||||
|
@ -1298,6 +1293,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)->tx_flags |= SKBTX_DEV_ZEROCOPY;
|
||||
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);
|
||||
|
|
|
@ -603,12 +603,12 @@ static void ax88772_suspend(struct usbnet *dev)
|
|||
u16 medium;
|
||||
|
||||
/* Stop MAC operation */
|
||||
medium = asix_read_medium_status(dev, 0);
|
||||
medium = asix_read_medium_status(dev, 1);
|
||||
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",
|
||||
asix_read_medium_status(dev, 0));
|
||||
asix_read_medium_status(dev, 1));
|
||||
|
||||
/* Preserve BMCR for restoring */
|
||||
priv->presvd_phy_bmcr =
|
||||
|
|
|
@ -388,12 +388,6 @@ void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
|
|||
case USB_CDC_NOTIFY_NETWORK_CONNECTION:
|
||||
netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
|
||||
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);
|
||||
break;
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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 = {
|
||||
.description = "CDC Ethernet Device",
|
||||
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
||||
|
@ -481,7 +505,7 @@ static const struct driver_info zte_cdc_info = {
|
|||
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
|
||||
.bind = usbnet_cdc_zte_bind,
|
||||
.unbind = usbnet_cdc_unbind,
|
||||
.status = usbnet_cdc_status,
|
||||
.status = usbnet_cdc_zte_status,
|
||||
.set_rx_mode = usbnet_cdc_update_filter,
|
||||
.manage_power = usbnet_manage_power,
|
||||
.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(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
||||
{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, 0x1201, 2)}, /* Telit LE920 */
|
||||
{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_fdb *f;
|
||||
int notify = 0;
|
||||
int rc;
|
||||
|
||||
f = __vxlan_find_mac(vxlan, mac);
|
||||
if (f) {
|
||||
|
@ -641,8 +642,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
|
|||
if ((flags & NLM_F_APPEND) &&
|
||||
(is_multicast_ether_addr(f->eth_addr) ||
|
||||
is_zero_ether_addr(f->eth_addr))) {
|
||||
int rc = vxlan_fdb_append(f, ip, port, vni, ifindex,
|
||||
&rd);
|
||||
rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
|
||||
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
@ -673,7 +673,11 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
|
|||
INIT_LIST_HEAD(&f->remotes);
|
||||
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;
|
||||
hlist_add_head_rcu(&f->hlist,
|
||||
|
|
|
@ -2222,8 +2222,9 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len,
|
|||
is_scanning_required = 1;
|
||||
} else {
|
||||
mwifiex_dbg(priv->adapter, MSG,
|
||||
"info: trying to associate to '%s' bssid %pM\n",
|
||||
(char *)req_ssid.ssid, bss->bssid);
|
||||
"info: trying to associate to '%.*s' bssid %pM\n",
|
||||
req_ssid.ssid_len, (char *)req_ssid.ssid,
|
||||
bss->bssid);
|
||||
memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
|
||||
break;
|
||||
}
|
||||
|
@ -2283,8 +2284,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
|||
}
|
||||
|
||||
mwifiex_dbg(adapter, INFO,
|
||||
"info: Trying to associate to %s and bssid %pM\n",
|
||||
(char *)sme->ssid, sme->bssid);
|
||||
"info: Trying to associate to %.*s and bssid %pM\n",
|
||||
(int)sme->ssid_len, (char *)sme->ssid, sme->bssid);
|
||||
|
||||
if (!mwifiex_stop_bg_scan(priv))
|
||||
cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy);
|
||||
|
@ -2417,8 +2418,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
|||
}
|
||||
|
||||
mwifiex_dbg(priv->adapter, MSG,
|
||||
"info: trying to join to %s and bssid %pM\n",
|
||||
(char *)params->ssid, params->bssid);
|
||||
"info: trying to join to %.*s and bssid %pM\n",
|
||||
params->ssid_len, (char *)params->ssid, params->bssid);
|
||||
|
||||
mwifiex_set_ibss_params(priv, params);
|
||||
|
||||
|
|
|
@ -490,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np)
|
|||
return -ENODEV;
|
||||
}
|
||||
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)
|
||||
*
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
|
|
@ -307,20 +307,6 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus)
|
|||
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)
|
||||
{
|
||||
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");
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
/* 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,
|
||||
~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or);
|
||||
}
|
||||
|
||||
/* Find Advanced Error Reporting Enhanced Capability */
|
||||
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))
|
||||
return PTR_ERR(meson->base);
|
||||
|
||||
spin_lock_init(&meson->lock);
|
||||
meson->chip.dev = &pdev->dev;
|
||||
meson->chip.ops = &meson_pwm_ops;
|
||||
meson->chip.base = -1;
|
||||
|
|
|
@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
|||
if (test_bit(PWMF_EXPORTED, &pwm->flags))
|
||||
pwm_unexport_child(parent, pwm);
|
||||
}
|
||||
|
||||
put_device(parent);
|
||||
}
|
||||
|
||||
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->size = sizeof(*resp);
|
||||
nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
|
||||
sizeof(nonemb_cmd->size),
|
||||
nonemb_cmd->size,
|
||||
&nonemb_cmd->dma);
|
||||
if (!nonemb_cmd->va) {
|
||||
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)
|
||||
{
|
||||
struct hpsa_scsi_dev_t *sd;
|
||||
struct hpsa_scsi_dev_t *sd = NULL;
|
||||
unsigned long flags;
|
||||
struct ctlr_info *h;
|
||||
|
||||
|
@ -2026,7 +2026,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
|
|||
sd->target = sdev_id(sdev);
|
||||
sd->lun = sdev->lun;
|
||||
}
|
||||
} else
|
||||
}
|
||||
if (!sd)
|
||||
sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
|
||||
sdev_id(sdev), sdev->lun);
|
||||
|
||||
|
@ -3840,6 +3841,7 @@ static int hpsa_update_device_info(struct ctlr_info *h,
|
|||
sizeof(this_device->vendor));
|
||||
memcpy(this_device->model, &inq_buff[16],
|
||||
sizeof(this_device->model));
|
||||
this_device->rev = inq_buff[2];
|
||||
memset(this_device->device_id, 0,
|
||||
sizeof(this_device->device_id));
|
||||
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)) {
|
||||
/* 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_HBA_BUS, 0, lunid & 0x3fff);
|
||||
else
|
||||
bus, 0, lunid & 0x3fff);
|
||||
} else
|
||||
/* defer target, lun assignment for physical devices */
|
||||
hpsa_set_bus_target_lun(device,
|
||||
HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
|
||||
|
|
|
@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t {
|
|||
u64 sas_address;
|
||||
unsigned char vendor[8]; /* bytes 8-15 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 volume_offline; /* discovered via TUR or VPD */
|
||||
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_EXTERNAL_RAID_VOLUME_BUS 2
|
||||
#define HPSA_HBA_BUS 0
|
||||
#define HPSA_LEGACY_HBA_BUS 3
|
||||
|
||||
/*
|
||||
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