From patchwork Mon Jul 30 12:45:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 950893 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="nOn+q/0u"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 41fKGh6X8rz9ryt for ; Mon, 30 Jul 2018 22:52:28 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 5F364C21FDC; Mon, 30 Jul 2018 12:51:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D5522C21FCB; Mon, 30 Jul 2018 12:46:30 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 96B92C21FF1; Mon, 30 Jul 2018 12:46:10 +0000 (UTC) Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by lists.denx.de (Postfix) with ESMTPS id D1B58C2200C for ; Mon, 30 Jul 2018 12:46:03 +0000 (UTC) Received: by mail-pf1-f193.google.com with SMTP id y10-v6so4489252pfn.8 for ; Mon, 30 Jul 2018 05:46:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WrntaLeQt8fhRJog8oaLQ/TRlu9ZXbdWp4EPAokwcHM=; b=nOn+q/0uzjdXpwzP9s2t4IzIQO4ynNZzm3uMCBEgaeqm7JM1KptWXgVu6qYzAqiKeM lyvbW4pdMQF/f5TjqjxE7otVXzi8h9Uat6BlbHjMnF3euwWcQniN9MBkJ0mVQgo0Nm7O FKO//81eZzX27acy/2tb2ThKUEBdkLTjqEcG0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WrntaLeQt8fhRJog8oaLQ/TRlu9ZXbdWp4EPAokwcHM=; b=KRTFMnoDoO7bJoRQ9zNGec/dFr8YX/dMFRQrt8zIqazuy6uOrl3oT3zwRAGwUezEDZ bIeyHCN7MyCOgbHEaKM5GI/+VocuBMe/ln+bNJ4KmcBvOzzkz42CrAunBEXKrzdcZsaQ hXF+lVRj3H0yVwJcH65pHifUcK2Nu81kQzQ7F93yTmkEy41LQmJPtgCRoKcNfin873ck fIXjOJe18yP3HVW8h3OAA1OmUP6GNfu9deEXv/EajCWloWlEJgKxlIJIELXJiVJpMSUy OVCde+VdbtXKuK8BUBoiG5bCUnkM6Mpm5GL32xHP6hwk1QMFIsMchPDI056C5R1TbfVi /BaQ== X-Gm-Message-State: AOUpUlEEpU76L+WjEn/KbVRSNp6w4s5Xxlu57ugqHov3NGXv/MbvHxJu 8kb1i8vhkBDdfSPXo9eTlWkpXPqRdPI= X-Google-Smtp-Source: AAOMgpcHc5G/WSEsielMsiORHPtoGWQg1rRNz+Xu1nI1J9KCGY5+sBe4nqp2Xk0O42cH0tFjnYvK3A== X-Received: by 2002:a63:6604:: with SMTP id a4-v6mr16010503pgc.404.1532954762401; Mon, 30 Jul 2018 05:46:02 -0700 (PDT) Received: from localhost.localdomain ([49.206.202.146]) by smtp.gmail.com with ESMTPSA id s3-v6sm30885964pfg.2.2018.07.30.05.45.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Jul 2018 05:46:01 -0700 (PDT) From: Jagan Teki To: Stefano Babic , Fabio Estevam , Peng Fan , Joe Hershberger Date: Mon, 30 Jul 2018 18:15:09 +0530 Message-Id: <20180730124509.13063-11-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.18.0.321.gffc6fa0e3 In-Reply-To: <20180730124509.13063-1-jagan@amarulasolutions.com> References: <20180730124509.13063-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Cc: u-boot@lists.denx.de Subject: [U-Boot] [PATCH 10/10] net: fec: Setup common eth_ops code for dm and non-dm X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Setting up common code for dm and non-dm will easy and understandable for adding new features, debugging in both the code area. Signed-off-by: Jagan Teki Acked-by: Joe Hershberger --- drivers/net/fec_mxc.c | 225 ++++++++++++++++++++---------------------- drivers/net/fec_mxc.h | 3 + 2 files changed, 108 insertions(+), 120 deletions(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 0fdad5c5bf..3640ee3471 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -345,21 +345,8 @@ static int fec_get_hwaddr(int dev_id, unsigned char *mac) return !is_valid_ethaddr(mac); } -#ifdef CONFIG_DM_ETH -static int fecmxc_set_hwaddr(struct udevice *dev) -#else -static int fec_set_hwaddr(struct eth_device *dev) -#endif +static int _fec_set_hwaddr(struct fec_priv *fec, u8 *mac) { -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); - struct eth_pdata *pdata = dev_get_platdata(dev); - uchar *mac = pdata->enetaddr; -#else - uchar *mac = dev->enetaddr; - struct fec_priv *fec = (struct fec_priv *)dev->priv; -#endif - writel(0, &fec->eth->iaddr1); writel(0, &fec->eth->iaddr2); writel(0, &fec->eth->gaddr1); @@ -402,17 +389,8 @@ static void fec_reg_setup(struct fec_priv *fec) * Start the FEC engine * @param[in] dev Our device to handle */ -#ifdef CONFIG_DM_ETH -static int fec_open(struct udevice *dev) -#else -static int fec_open(struct eth_device *edev) -#endif +static int fec_open(struct fec_priv *fec) { -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); -#else - struct fec_priv *fec = (struct fec_priv *)edev->priv; -#endif int speed; ulong addr, size; int i; @@ -487,9 +465,9 @@ static int fec_open(struct eth_device *edev) #elif CONFIG_FEC_FIXED_SPEED speed = CONFIG_FEC_FIXED_SPEED; #else - miiphy_wait_aneg(edev); - speed = miiphy_speed(edev->name, fec->phy_id); - miiphy_duplex(edev->name, fec->phy_id); + miiphy_wait_aneg(fec->edev); + speed = miiphy_speed(fec->edev->name, fec->phy_id); + miiphy_duplex(fec->edev->name, fec->phy_id); #endif #ifdef FEC_QUIRK_ENET_MAC @@ -513,27 +491,13 @@ static int fec_open(struct eth_device *edev) return 0; } -#ifdef CONFIG_DM_ETH -static int fecmxc_init(struct udevice *dev) -#else -static int fec_init(struct eth_device *dev, bd_t *bd) -#endif +static int _fec_init(struct fec_priv *fec, u8 *enetaddr) { -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); -#else - struct fec_priv *fec = (struct fec_priv *)dev->priv; -#endif u8 *mib_ptr = (uint8_t *)&fec->eth->rmon_t_drop; u8 *i; ulong addr; - /* Initialize MAC address */ -#ifdef CONFIG_DM_ETH - fecmxc_set_hwaddr(dev); -#else - fec_set_hwaddr(dev); -#endif + _fec_set_hwaddr(fec, enetaddr); /* Setup transmit descriptors, there are two in total. */ fec_tbd_init(fec); @@ -575,9 +539,9 @@ static int fec_init(struct eth_device *dev, bd_t *bd) #ifndef CONFIG_PHYLIB if (fec->xcv_type != PHY_INTERFACE_MODE_SEVENWIRE) - miiphy_restart_aneg(dev); + miiphy_restart_aneg(fec->edev); #endif - fec_open(dev); + fec_open(fec); return 0; } @@ -585,17 +549,8 @@ static int fec_init(struct eth_device *dev, bd_t *bd) * Halt the FEC engine * @param[in] dev Our device to handle */ -#ifdef CONFIG_DM_ETH -static void fecmxc_halt(struct udevice *dev) -#else -static void fec_halt(struct eth_device *dev) -#endif +static void _fec_halt(struct fec_priv *fec) { -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); -#else - struct fec_priv *fec = (struct fec_priv *)dev->priv; -#endif int counter = 0xffff; /* issue graceful stop command to the FEC transmitter if necessary */ @@ -629,11 +584,7 @@ static void fec_halt(struct eth_device *dev) * @param[in] length Data count in bytes * @return 0 on success */ -#ifdef CONFIG_DM_ETH -static int fecmxc_send(struct udevice *dev, void *packet, int length) -#else -static int fec_send(struct eth_device *dev, void *packet, int length) -#endif +static int _fec_send(struct fec_priv *fec, void *packet, int length) { unsigned int status; u32 size; @@ -645,12 +596,6 @@ static int fec_send(struct eth_device *dev, void *packet, int length) * This routine transmits one frame. This routine only accepts * 6-byte Ethernet addresses. */ -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); -#else - struct fec_priv *fec = (struct fec_priv *)dev->priv; -#endif - /* * Check for valid length of data. */ @@ -780,17 +725,8 @@ out: * @param[in] dev Our ethernet device to handle * @return Length of packet read */ -#ifdef CONFIG_DM_ETH -static int fecmxc_recv(struct udevice *dev, int flags, uchar **packetp) -#else -static int fec_recv(struct eth_device *dev) -#endif +static int _fec_recv(struct fec_priv *fec, uchar **packetp, u8 *enetaddr) { -#ifdef CONFIG_DM_ETH - struct fec_priv *fec = dev_get_priv(dev); -#else - struct fec_priv *fec = (struct fec_priv *)dev->priv; -#endif struct fec_bd *rbd = &fec->rbd_base[fec->rbd_index]; unsigned long ievent; int frame_length, len = 0; @@ -798,28 +734,13 @@ static int fec_recv(struct eth_device *dev) ulong addr, size, end; int i; -#ifdef CONFIG_DM_ETH - *packetp = memalign(ARCH_DMA_MINALIGN, FEC_MAX_PKT_SIZE); - if (*packetp == 0) { - printf("%s: error allocating packetp\n", __func__); - return -ENOMEM; - } -#else - ALLOC_CACHE_ALIGN_BUFFER(uchar, buff, FEC_MAX_PKT_SIZE); -#endif - /* Check if any critical events have happened */ ievent = readl(&fec->eth->ievent); writel(ievent, &fec->eth->ievent); debug("fec_recv: ievent 0x%lx\n", ievent); if (ievent & FEC_IEVENT_BABR) { -#ifdef CONFIG_DM_ETH - fecmxc_halt(dev); - fecmxc_init(dev); -#else - fec_halt(dev); - fec_init(dev, fec->bd); -#endif + _fec_halt(fec); + _fec_init(fec, enetaddr); printf("some error: 0x%08lx\n", ievent); return 0; } @@ -831,18 +752,10 @@ static int fec_recv(struct eth_device *dev) if (ievent & FEC_IEVENT_GRA) { /* Graceful stop complete */ if (readl(&fec->eth->x_cntrl) & 0x00000001) { -#ifdef CONFIG_DM_ETH - fecmxc_halt(dev); -#else - fec_halt(dev); -#endif + _fec_halt(fec); writel(~0x00000001 & readl(&fec->eth->x_cntrl), &fec->eth->x_cntrl); -#ifdef CONFIG_DM_ETH - fecmxc_init(dev); -#else - fec_init(dev, fec->bd); -#endif + _fec_init(fec, enetaddr); } } @@ -882,13 +795,7 @@ static int fec_recv(struct eth_device *dev) #ifdef CONFIG_FEC_MXC_SWAP_PACKET swap_packet((uint32_t *)addr, frame_length); #endif - -#ifdef CONFIG_DM_ETH memcpy(*packetp, (char *)addr, frame_length); -#else - memcpy(buff, (char *)addr, frame_length); - net_process_received_packet(buff, frame_length); -#endif len = frame_length; } else { if (bd_status & FEC_RBD_ERR) @@ -998,6 +905,39 @@ static void fec_free_descs(struct fec_priv *fec) } #ifndef CONFIG_DM_ETH +static int fec_set_hwaddr(struct eth_device *dev) +{ + return _fec_set_hwaddr(dev->priv, dev->enetaddr); +} + +static void fec_halt(struct eth_device *dev) +{ + _fec_halt(dev->priv); +} + +static int fec_recv(struct eth_device *dev) +{ + ALLOC_CACHE_ALIGN_BUFFER(uchar, packet, FEC_MAX_PKT_SIZE); + int length; + + length = _fec_recv(dev->priv, &packet, dev->enetaddr); + if (length == -EAGAIN) + return 0; + net_process_received_packet(packet, length); + + return 0; +} + +static int fec_send(struct eth_device *dev, void *packet, int length) +{ + return _fec_send(dev->priv, packet, length); +} + +static int fec_init(struct eth_device *dev, bd_t *bd) +{ + return _fec_init(dev->priv, dev->enetaddr); +} + static int fec_mdio_read(struct mii_dev *bus, int addr, int devad, int reg) { return _fec_mdio_read(bus->priv, addr, reg); @@ -1084,6 +1024,7 @@ static int fec_probe(bd_t *bd, int dev_id, uint32_t base_addr, edev->halt = fec_halt; edev->write_hwaddr = fec_set_hwaddr; + fec->edev = edev; fec->eth = (struct ethernet_regs *)(ulong)base_addr; fec->bd = bd; @@ -1199,7 +1140,7 @@ int fecmxc_register_mii_postcall(struct eth_device *dev, int (*cb)(int)) #else -static int fecmxc_read_rom_hwaddr(struct udevice *dev) +static int fec_read_rom_hwaddr(struct udevice *dev) { struct fec_priv *priv = dev_get_priv(dev); struct eth_pdata *pdata = dev_get_platdata(dev); @@ -1207,7 +1148,22 @@ static int fecmxc_read_rom_hwaddr(struct udevice *dev) return fec_get_hwaddr(priv->dev_id, pdata->enetaddr); } -static int fecmxc_free_pkt(struct udevice *dev, uchar *packet, int length) +static int fec_set_hwaddr(struct udevice *dev) +{ + struct fec_priv *priv = dev_get_priv(dev); + struct eth_pdata *pdata = dev_get_platdata(dev); + + return _fec_set_hwaddr(priv, pdata->enetaddr); +} + +static void fec_halt(struct udevice *dev) +{ + struct fec_priv *priv = dev_get_priv(dev); + + _fec_halt(priv); +} + +static int fec_free_pkt(struct udevice *dev, uchar *packet, int length) { if (packet) free(packet); @@ -1215,14 +1171,43 @@ static int fecmxc_free_pkt(struct udevice *dev, uchar *packet, int length) return 0; } -static const struct eth_ops fecmxc_ops = { - .start = fecmxc_init, - .send = fecmxc_send, - .recv = fecmxc_recv, - .free_pkt = fecmxc_free_pkt, - .stop = fecmxc_halt, - .write_hwaddr = fecmxc_set_hwaddr, - .read_rom_hwaddr = fecmxc_read_rom_hwaddr, +static int fec_recv(struct udevice *dev, int flags, uchar **packetp) +{ + struct fec_priv *priv = dev_get_priv(dev); + struct eth_pdata *pdata = dev_get_platdata(dev); + + *packetp = memalign(ARCH_DMA_MINALIGN, FEC_MAX_PKT_SIZE); + if (*packetp == 0) { + printf("%s: error allocating packetp\n", __func__); + return -ENOMEM; + } + + return _fec_recv(priv, packetp, pdata->enetaddr); +} + +static int fec_send(struct udevice *dev, void *packet, int length) +{ + struct fec_priv *priv = dev_get_priv(dev); + + return _fec_send(priv, packet, length); +} + +static int fec_start(struct udevice *dev) +{ + struct fec_priv *priv = dev_get_priv(dev); + struct eth_pdata *pdata = dev_get_platdata(dev); + + return _fec_init(priv, pdata->enetaddr); +} + +static const struct eth_ops fec_ops = { + .start = fec_start, + .send = fec_send, + .recv = fec_recv, + .free_pkt = fec_free_pkt, + .stop = fec_halt, + .write_hwaddr = fec_set_hwaddr, + .read_rom_hwaddr = fec_read_rom_hwaddr, }; static int fec_phy_init(struct udevice *dev) @@ -1441,7 +1426,7 @@ U_BOOT_DRIVER(fecmxc_gem) = { .ofdata_to_platdata = fecmxc_ofdata_to_platdata, .probe = fecmxc_probe, .remove = fecmxc_remove, - .ops = &fecmxc_ops, + .ops = &fec_ops, .priv_auto_alloc_size = sizeof(struct fec_priv), .platdata_auto_alloc_size = sizeof(struct eth_pdata), }; diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h index ab5935bb83..6cf2a8b3cc 100644 --- a/drivers/net/fec_mxc.h +++ b/drivers/net/fec_mxc.h @@ -235,6 +235,9 @@ struct fec_priv { uint8_t *tdb_ptr; int dev_id; struct mii_dev *bus; +#ifndef CONFIG_DM_ETH + struct eth_device *edev; +#endif #ifdef CONFIG_PHYLIB struct phy_device *phydev; #else