From patchwork Sat Jul 11 12:36:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 241366 List-Id: U-Boot discussion From: marek.vasut at gmail.com (Marek Vasut) Date: Sat, 11 Jul 2020 14:36:07 +0200 Subject: [PATCH 11/12] net: dc2114x: Split common parts of non-DM functions out In-Reply-To: <20200711123608.6541-1-marek.vasut+renesas@gmail.com> References: <20200711123608.6541-1-marek.vasut+renesas@gmail.com> Message-ID: <20200711123608.6541-11-marek.vasut+renesas@gmail.com> Split the common code from the non-DM code, so it can be reused by the DM code later. As always, the recv() function had to be split into the actual receiving part and free_pkt part to fit with the DM. Signed-off-by: Marek Vasut Cc: Joe Hershberger Cc: Ramon Fried --- drivers/net/dc2114x.c | 117 ++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/drivers/net/dc2114x.c b/drivers/net/dc2114x.c index e224d007de..dc202d81de 100644 --- a/drivers/net/dc2114x.c +++ b/drivers/net/dc2114x.c @@ -275,7 +275,7 @@ static int read_srom(struct dc2114x_priv *priv, u_long ioaddr, int index) 3 + ee_addr_size + 16); } -static void send_setup_frame(struct dc2114x_priv *priv, bd_t *bis) +static void send_setup_frame(struct dc2114x_priv *priv) { char setup_frame[SETUP_FRAME_LEN]; char *pa = &setup_frame[0]; @@ -320,10 +320,8 @@ static void send_setup_frame(struct dc2114x_priv *priv, bd_t *bis) priv->tx_new = (priv->tx_new + 1) % NUM_TX_DESC; } -static int dc21x4x_send(struct eth_device *dev, void *packet, int length) +static int dc21x4x_send_common(struct dc2114x_priv *priv, void *packet, int length) { - struct dc2114x_priv *priv = - container_of(dev, struct dc2114x_priv, dev); int status = -1; int i; @@ -395,48 +393,10 @@ static int dc21x4x_recv_check(struct dc2114x_priv *priv) return -EAGAIN; } -static int dc21x4x_recv(struct eth_device *dev) -{ - struct dc2114x_priv *priv = - container_of(dev, struct dc2114x_priv, dev); - int length = 0; - int ret; - - while (true) { - ret = dc21x4x_recv_check(priv); - if (!ret) - break; - - if (ret > 0) { - length = ret; - /* Pass the packet up to the protocol layers */ - net_process_received_packet - (net_rx_packets[priv->rx_new], length - 4); - } - - /* - * Change buffer ownership for this frame, - * back to the adapter. - */ - if (ret != -EAGAIN) - priv->rx_ring[priv->rx_new].status = cpu_to_le32(R_OWN); - - /* Update entry information. */ - priv->rx_new = (priv->rx_new + 1) % priv->rx_ring_size; - } - - return length; -} - -static int dc21x4x_init(struct eth_device *dev, bd_t *bis) +static int dc21x4x_init_common(struct dc2114x_priv *priv) { - struct dc2114x_priv *priv = - container_of(dev, struct dc2114x_priv, dev); int i; - /* Ensure we're not sleeping. */ - pci_write_config_byte(priv->devno, PCI_CFDA_PSM, WAKEUP); - reset_de4x5(priv); if (dc2114x_inl(priv, DE4X5_STS) & (STS_TS | STS_RS)) { @@ -479,20 +439,15 @@ static int dc21x4x_init(struct eth_device *dev, bd_t *bis) priv->tx_new = 0; priv->rx_new = 0; - send_setup_frame(priv, bis); + send_setup_frame(priv); return 0; } -static void dc21x4x_halt(struct eth_device *dev) +static void dc21x4x_halt_common(struct dc2114x_priv *priv) { - struct dc2114x_priv *priv = - container_of(dev, struct dc2114x_priv, dev); - stop_de4x5(priv); dc2114x_outl(priv, 0, DE4X5_SICR); - - pci_write_config_byte(priv->devno, PCI_CFDA_PSM, SLEEP); } static void read_hw_addr(struct dc2114x_priv *priv) @@ -518,6 +473,68 @@ static struct pci_device_id supported[] = { { } }; +static int dc21x4x_init(struct eth_device *dev, bd_t *bis) +{ + struct dc2114x_priv *priv = + container_of(dev, struct dc2114x_priv, dev); + + /* Ensure we're not sleeping. */ + pci_write_config_byte(priv->devno, PCI_CFDA_PSM, WAKEUP); + + return dc21x4x_init_common(priv); +} + +static void dc21x4x_halt(struct eth_device *dev) +{ + struct dc2114x_priv *priv = + container_of(dev, struct dc2114x_priv, dev); + + dc21x4x_halt_common(priv); + + pci_write_config_byte(priv->devno, PCI_CFDA_PSM, SLEEP); +} + +static int dc21x4x_send(struct eth_device *dev, void *packet, int length) +{ + struct dc2114x_priv *priv = + container_of(dev, struct dc2114x_priv, dev); + + return dc21x4x_send_common(priv, packet, length); +} + +static int dc21x4x_recv(struct eth_device *dev) +{ + struct dc2114x_priv *priv = + container_of(dev, struct dc2114x_priv, dev); + int length = 0; + int ret; + + while (true) { + ret = dc21x4x_recv_check(priv); + if (!ret) + break; + + if (ret > 0) { + length = ret; + /* Pass the packet up to the protocol layers */ + net_process_received_packet + (net_rx_packets[priv->rx_new], length - 4); + } + + /* + * Change buffer ownership for this frame, + * back to the adapter. + */ + if (ret != -EAGAIN) + priv->rx_ring[priv->rx_new].status = cpu_to_le32(R_OWN); + + /* Update entry information. */ + priv->rx_new = (priv->rx_new + 1) % priv->rx_ring_size; + } + + return length; +} + int dc21x4x_initialize(bd_t *bis) { struct dc2114x_priv *priv;