Commit 34bfff40 authored by Lendacky, Thomas's avatar Lendacky, Thomas Committed by David S. Miller

amd-xgbe: Support defining PHY resources in ETH device node

Simplify the device tree support of the amd-xgbe driver by defining
the PHY-related resources within the ethernet device node. The support
provides backwards compatibility with the original way.

Update the driver version to 1.0.2.
Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7c12aa08
* AMD 10GbE driver (amd-xgbe) * AMD 10GbE driver (amd-xgbe)
Required properties (ethernet device): Required properties:
- compatible: Should be "amd,xgbe-seattle-v1a" - compatible: Should be "amd,xgbe-seattle-v1a"
- reg: Address and length of the register sets for the device - reg: Address and length of the register sets for the device
- MAC registers - MAC registers
- PCS registers - PCS registers
- SerDes Rx/Tx registers
- SerDes integration registers (1/2)
- SerDes integration registers (2/2)
- interrupt-parent: Should be the phandle for the interrupt controller - interrupt-parent: Should be the phandle for the interrupt controller
that services interrupts for this device that services interrupts for this device
- interrupts: Should contain the amd-xgbe interrupt(s). The first interrupt - interrupts: Should contain the amd-xgbe interrupt(s). The first interrupt
listed is required and is the general device interrupt. If the optional listed is required and is the general device interrupt. If the optional
amd,per-channel-interrupt property is specified, then one additional amd,per-channel-interrupt property is specified, then one additional
interrupt for each DMA channel supported by the device should be specified interrupt for each DMA channel supported by the device should be specified.
The last interrupt listed should be the PCS auto-negotiation interrupt.
- clocks: - clocks:
- DMA clock for the amd-xgbe device (used for calculating the - DMA clock for the amd-xgbe device (used for calculating the
correct Rx interrupt watchdog timer value on a DMA channel correct Rx interrupt watchdog timer value on a DMA channel
...@@ -19,28 +23,15 @@ Required properties (ethernet device): ...@@ -19,28 +23,15 @@ Required properties (ethernet device):
- clock-names: Should be the names of the clocks - clock-names: Should be the names of the clocks
- "dma_clk" for the DMA clock - "dma_clk" for the DMA clock
- "ptp_clk" for the PTP clock - "ptp_clk" for the PTP clock
- phy-handle: See ethernet.txt file in the same directory
- phy-mode: See ethernet.txt file in the same directory - phy-mode: See ethernet.txt file in the same directory
Optional properties (ethernet device): Optional properties:
- mac-address: mac address to be assigned to the device. Can be overridden - mac-address: mac address to be assigned to the device. Can be overridden
by UEFI. by UEFI.
- dma-coherent: Present if dma operations are coherent - dma-coherent: Present if dma operations are coherent
- amd,per-channel-interrupt: Indicates that Rx and Tx complete will generate - amd,per-channel-interrupt: Indicates that Rx and Tx complete will generate
a unique interrupt for each DMA channel - this requires an additional a unique interrupt for each DMA channel - this requires an additional
interrupt be configured for each DMA channel interrupt be configured for each DMA channel
Required properties (phy device):
- compatible: Should be "amd,xgbe-phy-seattle-v1a"
- reg: Address and length of the register sets for the device
- SerDes Rx/Tx registers
- SerDes integration registers (1/2)
- SerDes integration registers (2/2)
- interrupt-parent: Should be the phandle for the interrupt controller
that services interrupts for this device
- interrupts: Should contain the amd-xgbe-phy interrupt.
Optional properties (phy device):
- amd,speed-set: Speed capabilities of the device - amd,speed-set: Speed capabilities of the device
0 - 1GbE and 10GbE (default) 0 - 1GbE and 10GbE (default)
1 - 2.5GbE and 10GbE 1 - 2.5GbE and 10GbE
...@@ -63,25 +54,19 @@ Example: ...@@ -63,25 +54,19 @@ Example:
xgbe@e0700000 { xgbe@e0700000 {
compatible = "amd,xgbe-seattle-v1a"; compatible = "amd,xgbe-seattle-v1a";
reg = <0 0xe0700000 0 0x80000>, reg = <0 0xe0700000 0 0x80000>,
<0 0xe0780000 0 0x80000>; <0 0xe0780000 0 0x80000>,
<0 0xe1240800 0 0x00400>,
<0 0xe1250000 0 0x00060>,
<0 0xe1250080 0 0x00004>;
interrupt-parent = <&gic>; interrupt-parent = <&gic>;
interrupts = <0 325 4>, interrupts = <0 325 4>,
<0 326 1>, <0 327 1>, <0 328 1>, <0 329 1>; <0 326 1>, <0 327 1>, <0 328 1>, <0 329 1>,
<0 323 4>;
amd,per-channel-interrupt; amd,per-channel-interrupt;
clocks = <&xgbe_dma_clk>, <&xgbe_ptp_clk>; clocks = <&xgbe_dma_clk>, <&xgbe_ptp_clk>;
clock-names = "dma_clk", "ptp_clk"; clock-names = "dma_clk", "ptp_clk";
phy-handle = <&xgbe_phy>;
phy-mode = "xgmii"; phy-mode = "xgmii";
mac-address = [ 02 a1 a2 a3 a4 a5 ]; mac-address = [ 02 a1 a2 a3 a4 a5 ];
};
xgbe_phy@e1240800 {
compatible = "amd,xgbe-phy-seattle-v1a";
reg = <0 0xe1240800 0 0x00400>,
<0 0xe1250000 0 0x00060>,
<0 0xe1250080 0 0x00004>;
interrupt-parent = <&gic>;
interrupts = <0 323 4>;
amd,speed-set = <0>; amd,speed-set = <0>;
amd,serdes-blwc = <1>, <1>, <0>; amd,serdes-blwc = <1>, <1>, <0>;
amd,serdes-cdr-rate = <2>, <2>, <7>; amd,serdes-cdr-rate = <2>, <2>, <7>;
......
...@@ -300,14 +300,21 @@ static struct platform_device *xgbe_of_get_phy_pdev(struct xgbe_prv_data *pdata) ...@@ -300,14 +300,21 @@ static struct platform_device *xgbe_of_get_phy_pdev(struct xgbe_prv_data *pdata)
struct platform_device *phy_pdev; struct platform_device *phy_pdev;
phy_node = of_parse_phandle(dev->of_node, "phy-handle", 0); phy_node = of_parse_phandle(dev->of_node, "phy-handle", 0);
if (!phy_node) { if (phy_node) {
dev_err(dev, "unable to locate phy device\n"); /* Old style device tree:
return NULL; * The XGBE and PHY resources are separate
*/
phy_pdev = of_find_device_by_node(phy_node);
of_node_put(phy_node);
} else {
/* New style device tree:
* The XGBE and PHY resources are grouped together with
* the PHY resources listed last
*/
get_device(dev);
phy_pdev = pdata->pdev;
} }
phy_pdev = of_find_device_by_node(phy_node);
of_node_put(phy_node);
return phy_pdev; return phy_pdev;
} }
#else /* CONFIG_OF */ #else /* CONFIG_OF */
...@@ -401,14 +408,14 @@ static int xgbe_probe(struct platform_device *pdev) ...@@ -401,14 +408,14 @@ static int xgbe_probe(struct platform_device *pdev)
phy_dev = &phy_pdev->dev; phy_dev = &phy_pdev->dev;
if (pdev == phy_pdev) { if (pdev == phy_pdev) {
/* ACPI: /* New style device tree or ACPI:
* The XGBE and PHY resources are grouped together with * The XGBE and PHY resources are grouped together with
* the PHY resources listed last * the PHY resources listed last
*/ */
phy_memnum = xgbe_resource_count(pdev, IORESOURCE_MEM) - 3; phy_memnum = xgbe_resource_count(pdev, IORESOURCE_MEM) - 3;
phy_irqnum = xgbe_resource_count(pdev, IORESOURCE_IRQ) - 1; phy_irqnum = xgbe_resource_count(pdev, IORESOURCE_IRQ) - 1;
} else { } else {
/* Device tree: /* Old style device tree:
* The XGBE and PHY resources are separate * The XGBE and PHY resources are separate
*/ */
phy_memnum = 0; phy_memnum = 0;
......
...@@ -129,7 +129,7 @@ ...@@ -129,7 +129,7 @@
#include <net/dcbnl.h> #include <net/dcbnl.h>
#define XGBE_DRV_NAME "amd-xgbe" #define XGBE_DRV_NAME "amd-xgbe"
#define XGBE_DRV_VERSION "1.0.1" #define XGBE_DRV_VERSION "1.0.2"
#define XGBE_DRV_DESC "AMD 10 Gigabit Ethernet Driver" #define XGBE_DRV_DESC "AMD 10 Gigabit Ethernet Driver"
/* Descriptor related defines */ /* Descriptor related defines */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment