Skip to contentSkip to conversation

net: add calxeda xgmac ethernet driver

PATCH Superseded Rob Herring 2 participants 2 messages Oct 30, 2011 – Oct 31, 2011

Subsystems (3)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 net: add calxeda xgmac ethernet driver

From: Rob Herring <[email protected]>

Add support for the XGMAC 10Gb ethernet device in the Calxeda Highbank SOC.

---
v2:
- use __le32 for descriptor fields and cpu_to_le32/le32_to_cpu to access
- use u32 instead of dma_addr_t for descriptor phys addresses
- improve allocation error handling for descriptor ring allocations
- converted all prints to netdev_XXX
- rebase to current Linus master
- move into drivers/net/ethernet

 .../devicetree/bindings/net/calxeda-xgmac.txt      |   16 +
 drivers/net/ethernet/Kconfig                       |    1 +
 drivers/net/ethernet/Makefile                      |    1 +
 drivers/net/ethernet/calxeda/Kconfig               |    7 +
 drivers/net/ethernet/calxeda/Makefile              |    2 +
 drivers/net/ethernet/calxeda/xgmac.c               | 1928 ++++++++++++++++++++
 6 files changed, 1955 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/calxeda-xgmac.txt
 create mode 100644 drivers/net/ethernet/calxeda/Kconfig
 create mode 100644 drivers/net/ethernet/calxeda/Makefile
 create mode 100644 drivers/net/ethernet/calxeda/xgmac.c
Documentation/devicetree/bindings/net/calxeda-xgmac.txt new file +16 -0
new file mode 100644
index 0000000..c03a7bc
@@ -0,0 +1,16 @@
+* Calxeda Highbank 10Gb XGMAC Ethernet
+
+Required properties:
+- compatible : Should be "calxeda,hb-xgmac"
+- reg : Address and length of the register set for the device
+- interrupts : Should contain 3 xgmac interrupts. The 1st is main interrupt.
+  The 2nd is pwr mgt interrupt. The 3rd is low power state interrupt.
+
+Example:
+
+ethernet@fff50000 {
+        compatible = "calxeda,hb-xgmac";
+        reg = <0xfff50000 0x1000>;
+        interrupts = <0 77 4  0 78 4  0 79 4>;
+};
+
drivers/net/ethernet/Kconfig +1 -0
index 6dff5a0..57e3fda 100644
@@ -28,6 +28,7 @@ source "drivers/net/ethernet/cadence/Kconfig"
 source "drivers/net/ethernet/adi/Kconfig"
 source "drivers/net/ethernet/broadcom/Kconfig"
 source "drivers/net/ethernet/brocade/Kconfig"
+source "drivers/net/ethernet/calxeda/Kconfig"
 source "drivers/net/ethernet/chelsio/Kconfig"
 source "drivers/net/ethernet/cirrus/Kconfig"
 source "drivers/net/ethernet/cisco/Kconfig"
drivers/net/ethernet/Makefile +1 -0
index c53ad3a..683aeb6 100644
@@ -14,6 +14,7 @@ obj-$(CONFIG_NET_ATMEL) += cadence/
 obj-$(CONFIG_NET_BFIN) += adi/
 obj-$(CONFIG_NET_VENDOR_BROADCOM) += broadcom/
 obj-$(CONFIG_NET_VENDOR_BROCADE) += brocade/
+obj-$(CONFIG_NET_CALXEDA_XGMAC) += calxeda/
 obj-$(CONFIG_NET_VENDOR_CHELSIO) += chelsio/
 obj-$(CONFIG_NET_VENDOR_CIRRUS) += cirrus/
 obj-$(CONFIG_NET_VENDOR_CISCO) += cisco/
drivers/net/ethernet/calxeda/Kconfig new file +7 -0
new file mode 100644
index 0000000..a52e725
@@ -0,0 +1,7 @@
+config NET_CALXEDA_XGMAC
+	tristate "Calxeda 1G/10G XGMAC Ethernet driver"
+
+	select CRC32
+	help
+	  This is the driver for the XGMAC Ethernet IP block found on Calxeda
+	  Highbank platforms.
drivers/net/ethernet/calxeda/Makefile new file +2 -0
new file mode 100644
index 0000000..5057cd2
@@ -0,0 +1,2 @@
+obj-$(CONFIG_NET_CALXEDA_XGMAC) += xgmac.o
+
drivers/net/ethernet/calxeda/xgmac.c new file +1928 -0

1,928 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#1 lore raw
Quoted 1 line · Rob Herring

From: Rob Herring <[email protected]>

Hi Rob, one more comment

Quoted 18 lines
drivers/net/ethernet/calxeda/xgmac.c new file +15 -0
+static void xgmac_tx_complete(struct xgmac_priv *priv)
+{
+       void __iomem *ioaddr = priv->base;
+
+
+       writel(DMA_STATUS_TU | DMA_STATUS_NIS, ioaddr + XGMAC_DMA_STATUS);
+
+       while (dma_ring_cnt(priv->tx_head, priv->tx_tail, DMA_TX_RING_SZ)) {
+               unsigned int entry = priv->tx_tail;
+               struct sk_buff *skb = priv->tx_skbuff[entry];
+               struct xgmac_dma_desc *p = priv->dma_tx + entry;
+
+               /* Check if the descriptor is owned by the DMA. */
+               if (desc_get_owner(p))
+                       break;

drivers/net/ethernet/calxeda/xgmac.c line 862

Quoted 10 lines
drivers/net/ethernet/calxeda/xgmac.c new file +10 -0
+
+               /* Verify tx error by looking at the last segment */
+               if (desc_get_tx_ls(p))
+                       desc_get_tx_status(priv, p);
+
+               netdev_dbg(priv->dev, "tx ring: curr %d, dirty %d\n",
+                       priv->tx_head, priv->tx_tail);
+
+               dma_unmap_single(priv->device, desc_get_buf_addr(p),
+                                desc_get_buf_len(p), DMA_TO_DEVICE);

I think you missed to do dma_unmap_page for the skp frags page. saeed