X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fxilinx_emaclite.c;h=564205df83d39532f378bd0d5f32ad4e2c632b04;hb=a2477924cd302cfae730ebefb431814eb99ad861;hp=bb4fb01a55a380de25dc4dd2d79cd6c018fa9374;hpb=5ac83801f9bba1b51846c0223a019c82cd411d9a;p=oweals%2Fu-boot.git diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index bb4fb01a55..564205df83 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -4,23 +4,7 @@ * * Michal SIMEK * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -28,6 +12,7 @@ #include #include #include +#include #undef DEBUG @@ -199,7 +184,7 @@ static int xemaclite_txbufferavailable(struct eth_device *dev) return !(txpingbusy && txpongbusy); } -static int emaclite_send(struct eth_device *dev, volatile void *ptr, int len) +static int emaclite_send(struct eth_device *dev, void *ptr, int len) { u32 reg; u32 baseaddress; @@ -240,7 +225,7 @@ static int emaclite_send(struct eth_device *dev, volatile void *ptr, int len) debug("Send packet from 0x%x\n", baseaddress); /* Write the frame to the buffer */ - xemaclite_alignedwrite((void *) ptr, baseaddress, len); + xemaclite_alignedwrite(ptr, baseaddress, len); out_be32 (baseaddress + XEL_TPLR_OFFSET,(len & (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO))); reg = in_be32 (baseaddress + XEL_TSR_OFFSET); @@ -261,7 +246,7 @@ static int emaclite_send(struct eth_device *dev, volatile void *ptr, int len) & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) { debug("Send packet from 0x%x\n", baseaddress); /* Write the frame to the buffer */ - xemaclite_alignedwrite((void *) ptr, baseaddress, len); + xemaclite_alignedwrite(ptr, baseaddress, len); out_be32 (baseaddress + XEL_TPLR_OFFSET, (len & (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO))); @@ -337,12 +322,13 @@ static int emaclite_recv(struct eth_device *dev) out_be32 (baseaddress + XEL_RSR_OFFSET, reg); debug("Packet receive from 0x%x, length %dB\n", baseaddress, length); - NetReceive((uchar *) etherrxbuff, length); + net_process_received_packet((uchar *)etherrxbuff, length); return length; } -int xilinx_emaclite_initialize (bd_t *bis, int base_addr) +int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr, + int txpp, int rxpp) { struct eth_device *dev; struct xemaclite *emaclite; @@ -359,14 +345,10 @@ int xilinx_emaclite_initialize (bd_t *bis, int base_addr) dev->priv = emaclite; -#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG - emaclite->txpp = 1; -#endif -#ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG - emaclite->rxpp = 1; -#endif + emaclite->txpp = txpp; + emaclite->rxpp = rxpp; - sprintf(dev->name, "Xelite.%x", base_addr); + sprintf(dev->name, "Xelite.%lx", base_addr); dev->iobase = base_addr; dev->init = emaclite_init; @@ -378,3 +360,33 @@ int xilinx_emaclite_initialize (bd_t *bis, int base_addr) return 1; } + +#if CONFIG_IS_ENABLED(OF_CONTROL) +int xilinx_emaclite_of_init(const void *blob) +{ + int offset = 0; + u32 ret = 0; + u32 reg; + + do { + offset = fdt_node_offset_by_compatible(blob, offset, + "xlnx,xps-ethernetlite-1.00.a"); + if (offset != -1) { + reg = fdtdec_get_addr(blob, offset, "reg"); + if (reg != FDT_ADDR_T_NONE) { + u32 rxpp = fdtdec_get_int(blob, offset, + "xlnx,rx-ping-pong", 0); + u32 txpp = fdtdec_get_int(blob, offset, + "xlnx,tx-ping-pong", 0); + ret |= xilinx_emaclite_initialize(NULL, reg, + txpp, rxpp); + } else { + debug("EMACLITE: Can't get base address\n"); + return -1; + } + } + } while (offset != -1); + + return ret; +} +#endif