11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#include "hieth_phy.h"
171bd4fe43Sopenharmony_ci#include "mdio.h"
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_ci#include "string.h"
201bd4fe43Sopenharmony_ci#include "eth_drv.h"
211bd4fe43Sopenharmony_ci#include "ctrl.h"
221bd4fe43Sopenharmony_ci#include "asm/dma.h"
231bd4fe43Sopenharmony_ci#include "sys/bus.h"
241bd4fe43Sopenharmony_ci
251bd4fe43Sopenharmony_ci#define PHY_ADDR_SET     0x129B5B3
261bd4fe43Sopenharmony_ci#define PHY_ADDR_NOT_SET 0x5a5aa5a5
271bd4fe43Sopenharmony_ci#define INVALID_PHY_ADDR 0x12F358F
281bd4fe43Sopenharmony_ci#define PHY_MODE_SET     0x12B63D0
291bd4fe43Sopenharmony_ci#define PHY_MODE_NOT_SET 0x5a5aa5a5
301bd4fe43Sopenharmony_ci#define INVALID_PHY_MODE 0x12F5D09
311bd4fe43Sopenharmony_ci
321bd4fe43Sopenharmony_ci#define ETH_STACKSIZE 0x20000
331bd4fe43Sopenharmony_ci
341bd4fe43Sopenharmony_ci#define PHY_ID_INVALID(id) (((id & 0x1fffffff) == 0x1fffffff) ||  \
351bd4fe43Sopenharmony_ci                            ((id & 0xfffffff0) == 0xfffffff0) ||  \
361bd4fe43Sopenharmony_ci                            (id == 0) ||  \
371bd4fe43Sopenharmony_ci                            (id == 0xffff0000) ||  \
381bd4fe43Sopenharmony_ci                            (id == 0x0000ffff))
391bd4fe43Sopenharmony_ci
401bd4fe43Sopenharmony_cistatic int32_t g_userSetPhyAddr = PHY_ADDR_NOT_SET;
411bd4fe43Sopenharmony_cistatic int32_t g_phyAddrVal = INVALID_PHY_ADDR;
421bd4fe43Sopenharmony_cistatic int32_t g_userSetPhyMode = PHY_MODE_NOT_SET;
431bd4fe43Sopenharmony_cistatic int32_t g_phyModeVal = INVALID_PHY_MODE;
441bd4fe43Sopenharmony_ci
451bd4fe43Sopenharmony_cistruct HiethPlatformData *g_stHiethPlatformData = NULL;
461bd4fe43Sopenharmony_ciOSAL_DECLARE_SPINLOCK(hiethGlbRegLock);
471bd4fe43Sopenharmony_ciextern unsigned long msecs_to_jiffies(const uint32_t msecs);
481bd4fe43Sopenharmony_ci#define TIME_MEDIUM 100
491bd4fe43Sopenharmony_ci#define TIME_LONG 300
501bd4fe43Sopenharmony_ci#define EXCESS_SIZE 4
511bd4fe43Sopenharmony_ci
521bd4fe43Sopenharmony_cistatic bool IsLinkUp(struct EthDevice *ethDevice)
531bd4fe43Sopenharmony_ci{
541bd4fe43Sopenharmony_ci    NetIfLinkStatus status = NETIF_LINK_DOWN;
551bd4fe43Sopenharmony_ci
561bd4fe43Sopenharmony_ci    if (NetIfGetLinkStatus(ethDevice->netdev, &status) != 0) {
571bd4fe43Sopenharmony_ci        HDF_LOGE("%s: net device is invalid", __func__);
581bd4fe43Sopenharmony_ci        return false;
591bd4fe43Sopenharmony_ci    }
601bd4fe43Sopenharmony_ci    if (status == NETIF_LINK_UP) {
611bd4fe43Sopenharmony_ci        return true;
621bd4fe43Sopenharmony_ci    } else {
631bd4fe43Sopenharmony_ci        return false;
641bd4fe43Sopenharmony_ci    }
651bd4fe43Sopenharmony_ci}
661bd4fe43Sopenharmony_ci
671bd4fe43Sopenharmony_cistatic void RestartTimer(OsalTimer *timer, uint32_t interval, OsalTimerFunc func, uintptr_t arg)
681bd4fe43Sopenharmony_ci{
691bd4fe43Sopenharmony_ci    (void)OsalTimerDelete(timer);
701bd4fe43Sopenharmony_ci    if (OsalTimerCreate(timer, interval, func, arg) != HDF_SUCCESS) {
711bd4fe43Sopenharmony_ci        HDF_LOGE("create timer failed");
721bd4fe43Sopenharmony_ci    } else if (OsalTimerStartOnce(timer) != HDF_SUCCESS) {
731bd4fe43Sopenharmony_ci        HDF_LOGE("%s: start timer failed", __func__);
741bd4fe43Sopenharmony_ci    }
751bd4fe43Sopenharmony_ci}
761bd4fe43Sopenharmony_ci
771bd4fe43Sopenharmony_cistatic void PhyStateMachine(uintptr_t arg)
781bd4fe43Sopenharmony_ci{
791bd4fe43Sopenharmony_ci    struct EthDevice *ethDevice = (struct EthDevice *)arg;
801bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
811bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
821bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
831bd4fe43Sopenharmony_ci    int32_t linkStatus;
841bd4fe43Sopenharmony_ci
851bd4fe43Sopenharmony_ci    linkStatus = MiiphyLink(ld, priv->phy);
861bd4fe43Sopenharmony_ci    if (IsLinkUp(ethDevice) && !linkStatus) {
871bd4fe43Sopenharmony_ci        NetIfSetLinkStatus(ethDevice->netdev, NETIF_LINK_DOWN);
881bd4fe43Sopenharmony_ci    } else if (!IsLinkUp(ethDevice) && linkStatus) {
891bd4fe43Sopenharmony_ci        NetIfSetLinkStatus(ethDevice->netdev, NETIF_LINK_UP);
901bd4fe43Sopenharmony_ci    }
911bd4fe43Sopenharmony_ci}
921bd4fe43Sopenharmony_ci
931bd4fe43Sopenharmony_cistatic void HiethMonitorFunc(uintptr_t arg)
941bd4fe43Sopenharmony_ci{
951bd4fe43Sopenharmony_ci    struct EthDevice *ethDevice = (struct EthDevice *)arg;
961bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
971bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
981bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
991bd4fe43Sopenharmony_ci    int32_t refillCnt;
1001bd4fe43Sopenharmony_ci
1011bd4fe43Sopenharmony_ci    refillCnt = HiethFeedHw(ld, priv);
1021bd4fe43Sopenharmony_ci    if (!refillCnt) {
1031bd4fe43Sopenharmony_ci        RestartTimer(&priv->monitorTimer, HIETH_MONITOR_TIME, HiethMonitorFunc, (uintptr_t)ethDevice);
1041bd4fe43Sopenharmony_ci    }
1051bd4fe43Sopenharmony_ci}
1061bd4fe43Sopenharmony_ci
1071bd4fe43Sopenharmony_cistatic void EthDrvRecv(struct EthDevice *ethDevice, NetBuf *netBuf)
1081bd4fe43Sopenharmony_ci{
1091bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
1101bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
1111bd4fe43Sopenharmony_ci
1121bd4fe43Sopenharmony_ci    priv->rxRelease++;
1131bd4fe43Sopenharmony_ci    if (priv->rxRelease == HIETH_HWQ_RXQ_DEPTH) {
1141bd4fe43Sopenharmony_ci        priv->rxRelease = 0;
1151bd4fe43Sopenharmony_ci    }
1161bd4fe43Sopenharmony_ci    NetDmaCacheInv(NetBufGetAddress(netBuf, E_DATA_BUF), netBuf->len);
1171bd4fe43Sopenharmony_ci    NetBufPush(netBuf, E_DATA_BUF, netBuf->len);
1181bd4fe43Sopenharmony_ci    NetIfRxNi(ethDevice->netdev, netBuf);
1191bd4fe43Sopenharmony_ci}
1201bd4fe43Sopenharmony_ci
1211bd4fe43Sopenharmony_civoid UnRegisterTimerFunction(struct EthDevice *ethDevice)
1221bd4fe43Sopenharmony_ci{
1231bd4fe43Sopenharmony_ci    struct EthDrvSc *drvInfo = (struct EthDrvSc *)(ethDevice->priv);
1241bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvInfo->driverPrivate;
1251bd4fe43Sopenharmony_ci
1261bd4fe43Sopenharmony_ci    (void)OsalTimerDelete(&priv->phyTimer);
1271bd4fe43Sopenharmony_ci    (void)OsalTimerDelete(&priv->monitorTimer);
1281bd4fe43Sopenharmony_ci}
1291bd4fe43Sopenharmony_ci
1301bd4fe43Sopenharmony_civoid NetDmaCacheInv(void *addr, uint32_t size)
1311bd4fe43Sopenharmony_ci{
1321bd4fe43Sopenharmony_ci    uint32_t start = (uintptr_t)addr & ~(CACHE_ALIGNED_SIZE - 1);
1331bd4fe43Sopenharmony_ci    uint32_t end = (uintptr_t)addr + size;
1341bd4fe43Sopenharmony_ci
1351bd4fe43Sopenharmony_ci    end = ALIGN(end, CACHE_ALIGNED_SIZE);
1361bd4fe43Sopenharmony_ci    DCacheInvRange(start, end);
1371bd4fe43Sopenharmony_ci}
1381bd4fe43Sopenharmony_ci
1391bd4fe43Sopenharmony_civoid NetDmaCacheClean(void *addr, uint32_t size)
1401bd4fe43Sopenharmony_ci{
1411bd4fe43Sopenharmony_ci    uint32_t start = (uintptr_t)addr & ~(CACHE_ALIGNED_SIZE - 1);
1421bd4fe43Sopenharmony_ci    uint32_t end = (uintptr_t)addr + size;
1431bd4fe43Sopenharmony_ci
1441bd4fe43Sopenharmony_ci    end = ALIGN(end, CACHE_ALIGNED_SIZE);
1451bd4fe43Sopenharmony_ci    DCacheFlushRange(start, end);
1461bd4fe43Sopenharmony_ci}
1471bd4fe43Sopenharmony_ci
1481bd4fe43Sopenharmony_cistatic uint32_t HisiEthIsr(uint32_t irq, void *data)
1491bd4fe43Sopenharmony_ci{
1501bd4fe43Sopenharmony_ci    (void)irq;
1511bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)data;
1521bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
1531bd4fe43Sopenharmony_ci
1541bd4fe43Sopenharmony_ci    OsalDisableIrq(priv->vector); // 禁止一个irq;
1551bd4fe43Sopenharmony_ci    LOS_EventWrite(&(g_stHiethPlatformData[priv->index].stEvent), EVENT_NET_TX_RX);
1561bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
1571bd4fe43Sopenharmony_ci}
1581bd4fe43Sopenharmony_ci
1591bd4fe43Sopenharmony_cistatic int32_t HisiEthDsr(void *arg)
1601bd4fe43Sopenharmony_ci{
1611bd4fe43Sopenharmony_ci    uint32_t uwRet;
1621bd4fe43Sopenharmony_ci    struct EthDevice *ethDevice = (struct EthDevice *)arg;
1631bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
1641bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
1651bd4fe43Sopenharmony_ci
1661bd4fe43Sopenharmony_ci    while (true) {
1671bd4fe43Sopenharmony_ci        uwRet = LOS_EventRead(&(g_stHiethPlatformData[priv->index].stEvent), EVENT_NET_TX_RX,
1681bd4fe43Sopenharmony_ci                              LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
1691bd4fe43Sopenharmony_ci        if (uwRet & EVENT_NET_TX_RX) {
1701bd4fe43Sopenharmony_ci            (drvSc->funs->deliver)(ethDevice);
1711bd4fe43Sopenharmony_ci        }
1721bd4fe43Sopenharmony_ci    }
1731bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
1741bd4fe43Sopenharmony_ci}
1751bd4fe43Sopenharmony_ci
1761bd4fe43Sopenharmony_cistatic int32_t CreateEthIrqThread(struct EthDevice *ethDevice)
1771bd4fe43Sopenharmony_ci{
1781bd4fe43Sopenharmony_ci    struct OsalThread thread;
1791bd4fe43Sopenharmony_ci    struct OsalThreadParam para = {
1801bd4fe43Sopenharmony_ci        .name = "eth_irq_Task",
1811bd4fe43Sopenharmony_ci        .stackSize = ETH_STACKSIZE,
1821bd4fe43Sopenharmony_ci        .priority = OSAL_THREAD_PRI_HIGHEST,
1831bd4fe43Sopenharmony_ci    };
1841bd4fe43Sopenharmony_ci
1851bd4fe43Sopenharmony_ci    if (OsalThreadCreate(&thread, HisiEthDsr, (void *)ethDevice) != HDF_SUCCESS) {
1861bd4fe43Sopenharmony_ci        HDF_LOGE("create isr thread failed");
1871bd4fe43Sopenharmony_ci        return HDF_FAILURE;
1881bd4fe43Sopenharmony_ci    }
1891bd4fe43Sopenharmony_ci    if (OsalThreadStart(&thread, &para) != HDF_SUCCESS) {
1901bd4fe43Sopenharmony_ci        HDF_LOGE("isr thread start failed");
1911bd4fe43Sopenharmony_ci        return HDF_FAILURE;
1921bd4fe43Sopenharmony_ci    }
1931bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
1941bd4fe43Sopenharmony_ci}
1951bd4fe43Sopenharmony_ci
1961bd4fe43Sopenharmony_cistatic uint32_t ScanPhyId(struct HiethNetdevLocal *ld, int32_t addr)
1971bd4fe43Sopenharmony_ci{
1981bd4fe43Sopenharmony_ci    uint32_t phyId, val;
1991bd4fe43Sopenharmony_ci
2001bd4fe43Sopenharmony_ci    val = (uint32_t)HiethMdioRead(ld, addr, PHY_ID1);
2011bd4fe43Sopenharmony_ci    phyId = val << MAC_ADDR_OFFSET_L16;
2021bd4fe43Sopenharmony_ci    val = (uint32_t)HiethMdioRead(ld, addr, PHY_ID2);
2031bd4fe43Sopenharmony_ci    phyId |= val;
2041bd4fe43Sopenharmony_ci    return phyId;
2051bd4fe43Sopenharmony_ci}
2061bd4fe43Sopenharmony_ci
2071bd4fe43Sopenharmony_cistatic int32_t HiethCanSend(struct EthDevice *ethDevice)
2081bd4fe43Sopenharmony_ci{
2091bd4fe43Sopenharmony_ci    int32_t canSend;
2101bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
2111bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
2121bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
2131bd4fe43Sopenharmony_ci    uint32_t txqHeadNext;
2141bd4fe43Sopenharmony_ci
2151bd4fe43Sopenharmony_ci    if (!TestXmitQueueReady(ld)) {
2161bd4fe43Sopenharmony_ci        HiethXmitReleasePkt(ld, priv);
2171bd4fe43Sopenharmony_ci    }
2181bd4fe43Sopenharmony_ci
2191bd4fe43Sopenharmony_ci    txqHeadNext = ld->txqHead + 1;
2201bd4fe43Sopenharmony_ci    if (txqHeadNext == ld->qSize) {
2211bd4fe43Sopenharmony_ci        txqHeadNext = 0;
2221bd4fe43Sopenharmony_ci    }
2231bd4fe43Sopenharmony_ci
2241bd4fe43Sopenharmony_ci    OsalSpinLockIrq(&(ld->tx_lock));
2251bd4fe43Sopenharmony_ci    if (!TestXmitQueueReady(ld) ||
2261bd4fe43Sopenharmony_ci        txqHeadNext == ld->txqTail) {
2271bd4fe43Sopenharmony_ci        uint32_t uwRet;
2281bd4fe43Sopenharmony_ci        canSend = 0;
2291bd4fe43Sopenharmony_ci        ld->txBusy = 1;
2301bd4fe43Sopenharmony_ci        OsalSpinUnlockIrq(&(ld->tx_lock));
2311bd4fe43Sopenharmony_ci        OsalEnableIrq(priv->vector);
2321bd4fe43Sopenharmony_ci        uwRet = LOS_EventRead(&(g_stHiethPlatformData[priv->index].stEvent),
2331bd4fe43Sopenharmony_ci                              EVENT_NET_CAN_SEND, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, msecs_to_jiffies(40));
2341bd4fe43Sopenharmony_ci        if (uwRet & EVENT_NET_CAN_SEND) {
2351bd4fe43Sopenharmony_ci            canSend = 1;
2361bd4fe43Sopenharmony_ci        }
2371bd4fe43Sopenharmony_ci        OsalDisableIrq(priv->vector);
2381bd4fe43Sopenharmony_ci        OsalSpinLockIrq(&(ld->tx_lock));
2391bd4fe43Sopenharmony_ci    } else {
2401bd4fe43Sopenharmony_ci        canSend = 1;
2411bd4fe43Sopenharmony_ci    }
2421bd4fe43Sopenharmony_ci    OsalSpinUnlockIrq(&(ld->tx_lock));
2431bd4fe43Sopenharmony_ci    return canSend;
2441bd4fe43Sopenharmony_ci}
2451bd4fe43Sopenharmony_ci
2461bd4fe43Sopenharmony_cistatic void HiethSend(struct EthDevice *ethDevice, NetBuf *netBuf)
2471bd4fe43Sopenharmony_ci{
2481bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
2491bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
2501bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
2511bd4fe43Sopenharmony_ci
2521bd4fe43Sopenharmony_ci    OsalSpinLockIrq(&(ld->tx_lock));
2531bd4fe43Sopenharmony_ci    /* TSO supported */
2541bd4fe43Sopenharmony_ci    HiethXmitGso(ld, priv, netBuf);
2551bd4fe43Sopenharmony_ci    ld->txHwCnt++;
2561bd4fe43Sopenharmony_ci    OsalSpinUnlockIrq(&(ld->tx_lock));
2571bd4fe43Sopenharmony_ci}
2581bd4fe43Sopenharmony_ci
2591bd4fe43Sopenharmony_cistatic void HiethDeliver(struct EthDevice *ethDevice)
2601bd4fe43Sopenharmony_ci{
2611bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
2621bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
2631bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
2641bd4fe43Sopenharmony_ci    uint32_t ints;
2651bd4fe43Sopenharmony_ci    int32_t refillCnt;
2661bd4fe43Sopenharmony_ci    uint32_t rxPktInfo;
2671bd4fe43Sopenharmony_ci    uint32_t rlen;
2681bd4fe43Sopenharmony_ci    NetBuf *netBuf = NULL;
2691bd4fe43Sopenharmony_ci
2701bd4fe43Sopenharmony_ci    /* mask the all interrupt */
2711bd4fe43Sopenharmony_ci    /* Add lock for multi-processor */
2721bd4fe43Sopenharmony_ci    OsalSpinLockIrq(&hiethGlbRegLock);
2731bd4fe43Sopenharmony_ci    HiethWritelBits(ld, 0, GLB_RW_IRQ_ENA, BITS_IRQS_ENA_ALLPORT);
2741bd4fe43Sopenharmony_ci    OsalSpinUnlockIrq(&hiethGlbRegLock);
2751bd4fe43Sopenharmony_ci
2761bd4fe43Sopenharmony_ci    HiethXmitReleasePkt(ld, priv);
2771bd4fe43Sopenharmony_ci    HiethClearIrqstatus(ld, UD_BIT_NAME(HIETH_INT_TXQUE_RDY));
2781bd4fe43Sopenharmony_ci
2791bd4fe43Sopenharmony_ci    ints = HiethReadIrqstatus(ld);
2801bd4fe43Sopenharmony_ci    if (ints & BITS_IRQS_MASK_U) {
2811bd4fe43Sopenharmony_ci        if ((ints & UD_BIT_NAME(HIETH_INT_MULTI_RXRDY))) {
2821bd4fe43Sopenharmony_ci            while (IsRecvPacket(ld)) {
2831bd4fe43Sopenharmony_ci                rxPktInfo = HwGetRxpkgInfo(ld);
2841bd4fe43Sopenharmony_ci                rlen = (rxPktInfo >> BITS_RXPKG_LEN_OFFSET)
2851bd4fe43Sopenharmony_ci                       & BITS_RXPKG_LEN_MASK;
2861bd4fe43Sopenharmony_ci                rlen -= EXCESS_SIZE;
2871bd4fe43Sopenharmony_ci                if (rlen > HIETH_MAX_FRAME_SIZE) {
2881bd4fe43Sopenharmony_ci                    HDF_LOGE("ERROR: recv len=%d", rlen);
2891bd4fe43Sopenharmony_ci                }
2901bd4fe43Sopenharmony_ci
2911bd4fe43Sopenharmony_ci                OsalSpinLockIrq(&hiethGlbRegLock);
2921bd4fe43Sopenharmony_ci                HwSetRxpkgFinish(ld);
2931bd4fe43Sopenharmony_ci                OsalSpinUnlockIrq(&hiethGlbRegLock);
2941bd4fe43Sopenharmony_ci
2951bd4fe43Sopenharmony_ci                OsalSpinLockIrq(&(ld->rx_lock));
2961bd4fe43Sopenharmony_ci                netBuf = priv->ram->rxNetbuf[priv->rxRelease];
2971bd4fe43Sopenharmony_ci                netBuf->len = rlen;
2981bd4fe43Sopenharmony_ci                OsalSpinUnlockIrq(&(ld->rx_lock));
2991bd4fe43Sopenharmony_ci                EthDrvRecv(ethDevice, netBuf);
3001bd4fe43Sopenharmony_ci            }
3011bd4fe43Sopenharmony_ci
3021bd4fe43Sopenharmony_ci            refillCnt = HiethFeedHw(ld, priv);
3031bd4fe43Sopenharmony_ci            if (!refillCnt && (priv->rxRelease == priv->rxFeed)) {
3041bd4fe43Sopenharmony_ci                RestartTimer(&priv->monitorTimer, HIETH_MONITOR_TIME, HiethMonitorFunc, (uintptr_t)ethDevice);
3051bd4fe43Sopenharmony_ci            }
3061bd4fe43Sopenharmony_ci        }
3071bd4fe43Sopenharmony_ci        HiethClearIrqstatus(ld, (ints & BITS_IRQS_MASK_U));
3081bd4fe43Sopenharmony_ci        ints &= ~BITS_IRQS_MASK_U;
3091bd4fe43Sopenharmony_ci    }
3101bd4fe43Sopenharmony_ci
3111bd4fe43Sopenharmony_ci    if (ints & HIETH_INT_TX_ERR_U) {
3121bd4fe43Sopenharmony_ci        ints &= ~HIETH_INT_TX_ERR_U;
3131bd4fe43Sopenharmony_ci        HDF_LOGE("HiethDeliver ERROR: HIETH_INT_TX_ERR_U.\n");
3141bd4fe43Sopenharmony_ci    }
3151bd4fe43Sopenharmony_ci
3161bd4fe43Sopenharmony_ci    if (ints) {
3171bd4fe43Sopenharmony_ci        HDF_LOGE("unknown ints=0x%.8x", ints);
3181bd4fe43Sopenharmony_ci        HiethClearIrqstatus(ld, ints);
3191bd4fe43Sopenharmony_ci    }
3201bd4fe43Sopenharmony_ci
3211bd4fe43Sopenharmony_ci    /* unmask the all interrupt */
3221bd4fe43Sopenharmony_ci    OsalSpinLockIrq(&hiethGlbRegLock);
3231bd4fe43Sopenharmony_ci    HiethWritelBits(ld, 1, GLB_RW_IRQ_ENA, BITS_IRQS_ENA_ALLPORT);
3241bd4fe43Sopenharmony_ci    OsalSpinUnlockIrq(&hiethGlbRegLock);
3251bd4fe43Sopenharmony_ci
3261bd4fe43Sopenharmony_ci    OsalEnableIrq(priv->vector);
3271bd4fe43Sopenharmony_ci#ifdef INT_IO_ETH_INT_SUPPORT_REQUIRED
3281bd4fe43Sopenharmony_ci    drv_interrupt_unmask(priv->vector);
3291bd4fe43Sopenharmony_ci#endif
3301bd4fe43Sopenharmony_ci}
3311bd4fe43Sopenharmony_ci
3321bd4fe43Sopenharmony_cistatic int32_t HiethIntVector(struct EthDevice *ethDevice)
3331bd4fe43Sopenharmony_ci{
3341bd4fe43Sopenharmony_ci    return NUM_HAL_INTERRUPT_ETH;
3351bd4fe43Sopenharmony_ci}
3361bd4fe43Sopenharmony_ci
3371bd4fe43Sopenharmony_civoid EthDrvSend(struct EthDevice *ethDevice, NetBuf *netBuf)
3381bd4fe43Sopenharmony_ci{
3391bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
3401bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
3411bd4fe43Sopenharmony_ci
3421bd4fe43Sopenharmony_ci    OsalDisableIrq(priv->vector);
3431bd4fe43Sopenharmony_ci    if (!(drvSc->funs->canSend)(ethDevice)) {
3441bd4fe43Sopenharmony_ci        OsalEnableIrq(priv->vector);
3451bd4fe43Sopenharmony_ci        return;
3461bd4fe43Sopenharmony_ci    }
3471bd4fe43Sopenharmony_ci    (drvSc->funs->send)(ethDevice, netBuf);
3481bd4fe43Sopenharmony_ci    OsalEnableIrq(priv->vector);
3491bd4fe43Sopenharmony_ci}
3501bd4fe43Sopenharmony_ci
3511bd4fe43Sopenharmony_cistatic const char *GetPhySpeedString(int32_t speed)
3521bd4fe43Sopenharmony_ci{
3531bd4fe43Sopenharmony_ci    switch (speed) {
3541bd4fe43Sopenharmony_ci        case PHY_SPEED_10:
3551bd4fe43Sopenharmony_ci            return "10Mbps";
3561bd4fe43Sopenharmony_ci        case PHY_SPEED_100:
3571bd4fe43Sopenharmony_ci            return "100Mbps";
3581bd4fe43Sopenharmony_ci        case PHY_SPEED_1000:
3591bd4fe43Sopenharmony_ci            return "1Gbps";
3601bd4fe43Sopenharmony_ci        case PHY_SPEED_UNKNOWN:
3611bd4fe43Sopenharmony_ci            return "Unknown";
3621bd4fe43Sopenharmony_ci        default:
3631bd4fe43Sopenharmony_ci            return "Unsupported";
3641bd4fe43Sopenharmony_ci    }
3651bd4fe43Sopenharmony_ci}
3661bd4fe43Sopenharmony_ci
3671bd4fe43Sopenharmony_civoid HiethLinkStatusChanged(struct EthDevice *ethDevice)
3681bd4fe43Sopenharmony_ci{
3691bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
3701bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
3711bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
3721bd4fe43Sopenharmony_ci    unsigned long val = 0;
3731bd4fe43Sopenharmony_ci    int32_t phyMode = 0;
3741bd4fe43Sopenharmony_ci    int32_t duplex;
3751bd4fe43Sopenharmony_ci    int32_t speed;
3761bd4fe43Sopenharmony_ci
3771bd4fe43Sopenharmony_ci    duplex = MiiphyDuplex(ld, priv->phy);
3781bd4fe43Sopenharmony_ci    speed = MiiphySpeed(ld, priv->phy);
3791bd4fe43Sopenharmony_ci
3801bd4fe43Sopenharmony_ci    if (IsLinkUp(ethDevice)) {
3811bd4fe43Sopenharmony_ci        val |= HIETH_LINKED;
3821bd4fe43Sopenharmony_ci    }
3831bd4fe43Sopenharmony_ci
3841bd4fe43Sopenharmony_ci    if (duplex) {
3851bd4fe43Sopenharmony_ci        val |= HIETH_DUP_FULL;
3861bd4fe43Sopenharmony_ci    }
3871bd4fe43Sopenharmony_ci
3881bd4fe43Sopenharmony_ci    if (speed == PHY_SPEED_100) {
3891bd4fe43Sopenharmony_ci        val |= HIETH_SPD_100M;
3901bd4fe43Sopenharmony_ci    }
3911bd4fe43Sopenharmony_ci
3921bd4fe43Sopenharmony_ci    switch (priv->phy->phyMode) {
3931bd4fe43Sopenharmony_ci        case PHY_INTERFACE_MODE_MII:
3941bd4fe43Sopenharmony_ci            phyMode = HIETH_PHY_MII_MODE;
3951bd4fe43Sopenharmony_ci            break;
3961bd4fe43Sopenharmony_ci        case PHY_INTERFACE_MODE_RMII:
3971bd4fe43Sopenharmony_ci            phyMode = HIETH_PHY_RMII_MODE;
3981bd4fe43Sopenharmony_ci            break;
3991bd4fe43Sopenharmony_ci        default:
4001bd4fe43Sopenharmony_ci            HDF_LOGE("not supported mode: %d", priv->phy->phyMode);
4011bd4fe43Sopenharmony_ci            break;
4021bd4fe43Sopenharmony_ci    }
4031bd4fe43Sopenharmony_ci
4041bd4fe43Sopenharmony_ci    HiethSetLinkStat(ld, val);
4051bd4fe43Sopenharmony_ci    HiethSetMiiMode(ld, phyMode);
4061bd4fe43Sopenharmony_ci
4071bd4fe43Sopenharmony_ci    if (IsLinkUp(ethDevice)) {
4081bd4fe43Sopenharmony_ci        PRINTK("Link is Up - %s/%s\n", GetPhySpeedString(speed), (PHY_DUPLEX_FULL == duplex) ? "Full" : "Half");
4091bd4fe43Sopenharmony_ci    } else {
4101bd4fe43Sopenharmony_ci        PRINTK("Link is Down\n");
4111bd4fe43Sopenharmony_ci    }
4121bd4fe43Sopenharmony_ci}
4131bd4fe43Sopenharmony_ci
4141bd4fe43Sopenharmony_ciuint8_t HiethSetHwaddr(struct EthDevice *ethDevice, uint8_t *addr, uint8_t len)
4151bd4fe43Sopenharmony_ci{
4161bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)((struct EthDrvSc *)ethDevice->priv)->driverPrivate;
4171bd4fe43Sopenharmony_ci
4181bd4fe43Sopenharmony_ci    if (IsMulticastEtherAddr(addr)) {
4191bd4fe43Sopenharmony_ci        HDF_LOGE("WARN: config a muticast mac address, please check!");
4201bd4fe43Sopenharmony_ci        return HDF_FAILURE;
4211bd4fe43Sopenharmony_ci    }
4221bd4fe43Sopenharmony_ci
4231bd4fe43Sopenharmony_ci    if (len != ETHER_ADDR_LEN) {
4241bd4fe43Sopenharmony_ci        HDF_LOGE("WARN: config wrong mac address len=%u", len);
4251bd4fe43Sopenharmony_ci        return HDF_FAILURE;
4261bd4fe43Sopenharmony_ci    }
4271bd4fe43Sopenharmony_ci
4281bd4fe43Sopenharmony_ci    HiethHwSetMacAddress(&(g_stHiethPlatformData[priv->index].stNetdevLocal), 1, addr);
4291bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
4301bd4fe43Sopenharmony_ci}
4311bd4fe43Sopenharmony_ci
4321bd4fe43Sopenharmony_ciint32_t HisiEthSetPhyMode(const char *phyMode)
4331bd4fe43Sopenharmony_ci{
4341bd4fe43Sopenharmony_ci    int32_t i;
4351bd4fe43Sopenharmony_ci
4361bd4fe43Sopenharmony_ci    for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++) {
4371bd4fe43Sopenharmony_ci        if (!strcasecmp(phyMode, PhyModes(i))) {
4381bd4fe43Sopenharmony_ci            g_userSetPhyMode = PHY_MODE_SET;
4391bd4fe43Sopenharmony_ci            g_phyModeVal = i;
4401bd4fe43Sopenharmony_ci            return HDF_SUCCESS;
4411bd4fe43Sopenharmony_ci        }
4421bd4fe43Sopenharmony_ci    }
4431bd4fe43Sopenharmony_ci    return HDF_FAILURE;
4441bd4fe43Sopenharmony_ci}
4451bd4fe43Sopenharmony_ci
4461bd4fe43Sopenharmony_cibool HiethHwInit(struct EthDevice *ethDevice)
4471bd4fe43Sopenharmony_ci{
4481bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
4491bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
4501bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
4511bd4fe43Sopenharmony_ci    uint32_t phyState = 0;
4521bd4fe43Sopenharmony_ci    uint32_t id;
4531bd4fe43Sopenharmony_ci    int32_t addr;
4541bd4fe43Sopenharmony_ci
4551bd4fe43Sopenharmony_ci    OsalSpinInit(&hiethGlbRegLock);
4561bd4fe43Sopenharmony_ci
4571bd4fe43Sopenharmony_ci    ld->txq = priv->ram->txqInfo;
4581bd4fe43Sopenharmony_ci    ld->iobase = (char *)((uintptr_t)priv->base);
4591bd4fe43Sopenharmony_ci
4601bd4fe43Sopenharmony_ci    HiethHwMacCoreInit(ld);
4611bd4fe43Sopenharmony_ci
4621bd4fe43Sopenharmony_ci    if (g_userSetPhyMode == PHY_MODE_SET) {
4631bd4fe43Sopenharmony_ci        priv->phy->phyMode = g_phyModeVal;
4641bd4fe43Sopenharmony_ci        HDF_LOGE("hisi_eth: User set phy mode=%s", PhyModes(priv->phy->phyMode));
4651bd4fe43Sopenharmony_ci    } else {
4661bd4fe43Sopenharmony_ci        priv->phy->phyMode = ld->phyMode;
4671bd4fe43Sopenharmony_ci        HDF_LOGE("hisi_eth: User did not set phy mode, use default=%s", PhyModes(priv->phy->phyMode));
4681bd4fe43Sopenharmony_ci    }
4691bd4fe43Sopenharmony_ci
4701bd4fe43Sopenharmony_ci    if (!priv->phy->initDone) {
4711bd4fe43Sopenharmony_ci        HiethHwExternalPhyReset();
4721bd4fe43Sopenharmony_ci        mdelay(TIME_LONG);
4731bd4fe43Sopenharmony_ci        priv->phy->initDone = true;
4741bd4fe43Sopenharmony_ci
4751bd4fe43Sopenharmony_ci        if (g_userSetPhyAddr == PHY_ADDR_SET) {
4761bd4fe43Sopenharmony_ci            priv->phy->phyAddr = g_phyAddrVal;
4771bd4fe43Sopenharmony_ci            HDF_LOGE("hisi_eth: User set phy addr=%d", priv->phy->phyAddr);
4781bd4fe43Sopenharmony_ci
4791bd4fe43Sopenharmony_ci            id = ScanPhyId(ld, priv->phy->phyAddr);
4801bd4fe43Sopenharmony_ci            if (PHY_ID_INVALID(id)) {
4811bd4fe43Sopenharmony_ci                HDF_LOGE("Can't find PHY device - id: %x", id);
4821bd4fe43Sopenharmony_ci                priv->phy->initDone = false;
4831bd4fe43Sopenharmony_ci                goto ERR_OUT;
4841bd4fe43Sopenharmony_ci            }
4851bd4fe43Sopenharmony_ci        } else {
4861bd4fe43Sopenharmony_ci            HDF_LOGE("hisi_eth: User did not set phy addr, auto scan...");
4871bd4fe43Sopenharmony_ci
4881bd4fe43Sopenharmony_ci            for (addr = MAX_PHY_ADDR; addr >= 0; addr--) {
4891bd4fe43Sopenharmony_ci                id = ScanPhyId(ld, addr);
4901bd4fe43Sopenharmony_ci                if (PHY_ID_INVALID(id)) {
4911bd4fe43Sopenharmony_ci                    continue;
4921bd4fe43Sopenharmony_ci                }
4931bd4fe43Sopenharmony_ci                break;
4941bd4fe43Sopenharmony_ci            }
4951bd4fe43Sopenharmony_ci
4961bd4fe43Sopenharmony_ci            if (addr < 0) {
4971bd4fe43Sopenharmony_ci                HDF_LOGE("Can't find PHY device - id: %x", id);
4981bd4fe43Sopenharmony_ci                priv->phy->initDone = false;
4991bd4fe43Sopenharmony_ci                goto ERR_OUT;
5001bd4fe43Sopenharmony_ci            }
5011bd4fe43Sopenharmony_ci
5021bd4fe43Sopenharmony_ci            priv->phy->phyAddr = addr;
5031bd4fe43Sopenharmony_ci        }
5041bd4fe43Sopenharmony_ci        ld->phyId = id;
5051bd4fe43Sopenharmony_ci    }
5061bd4fe43Sopenharmony_ci
5071bd4fe43Sopenharmony_ci    HiethHwExternalPhyReset();
5081bd4fe43Sopenharmony_ci    mdelay(TIME_MEDIUM);
5091bd4fe43Sopenharmony_ci    HiethFephyTrim(ld, priv->phy);
5101bd4fe43Sopenharmony_ci    HDF_LOGE("Detected phy addr %d, phyid: 0x%x.", priv->phy->phyAddr, ld->phyId);
5111bd4fe43Sopenharmony_ci
5121bd4fe43Sopenharmony_ci    if (!priv->phy->initDone) {
5131bd4fe43Sopenharmony_ci        goto ERR_OUT;
5141bd4fe43Sopenharmony_ci    }
5151bd4fe43Sopenharmony_ci
5161bd4fe43Sopenharmony_ci    HiethGetPhyStat(ld, priv->phy, &phyState);
5171bd4fe43Sopenharmony_ci
5181bd4fe43Sopenharmony_ci    if (OsalRegisterIrq(priv->vector, OSAL_IRQF_TRIGGER_NONE, HisiEthIsr, "ETH", (void *)drvSc) != HDF_SUCCESS) {
5191bd4fe43Sopenharmony_ci        HDF_LOGE("register irq failed");
5201bd4fe43Sopenharmony_ci        goto ERR_OUT;
5211bd4fe43Sopenharmony_ci    }
5221bd4fe43Sopenharmony_ci    OsalEnableIrq(priv->vector);
5231bd4fe43Sopenharmony_ci    return true;
5241bd4fe43Sopenharmony_ciERR_OUT:
5251bd4fe43Sopenharmony_ci    return false;
5261bd4fe43Sopenharmony_ci}
5271bd4fe43Sopenharmony_ci
5281bd4fe43Sopenharmony_civoid RegisterHiethData(struct EthDevice *ethDevice)
5291bd4fe43Sopenharmony_ci{
5301bd4fe43Sopenharmony_ci    int32_t ret;
5311bd4fe43Sopenharmony_ci    uint32_t data;
5321bd4fe43Sopenharmony_ci
5331bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
5341bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
5351bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
5361bd4fe43Sopenharmony_ci    ret = CreateEthIrqThread(ethDevice);
5371bd4fe43Sopenharmony_ci    if (ret != HDF_SUCCESS) {
5381bd4fe43Sopenharmony_ci        HDF_LOGE("create eth thread failed");
5391bd4fe43Sopenharmony_ci        return;
5401bd4fe43Sopenharmony_ci    }
5411bd4fe43Sopenharmony_ci    /* clear all interrupts */
5421bd4fe43Sopenharmony_ci    HiethClearIrqstatus(ld, UD_BIT_NAME(BITS_IRQS_MASK));
5431bd4fe43Sopenharmony_ci    priv->rxFeed = 0;
5441bd4fe43Sopenharmony_ci    priv->rxRelease = 0;
5451bd4fe43Sopenharmony_ci    HiethFeedHw(ld, priv);
5461bd4fe43Sopenharmony_ci
5471bd4fe43Sopenharmony_ci    if (OsalTimerCreate(&priv->phyTimer, PHY_STATE_TIME, PhyStateMachine, (uintptr_t)ethDevice) != HDF_SUCCESS) {
5481bd4fe43Sopenharmony_ci        HDF_LOGE("create phy state machine timer failed");
5491bd4fe43Sopenharmony_ci        return;
5501bd4fe43Sopenharmony_ci    }
5511bd4fe43Sopenharmony_ci    if (OsalTimerStartLoop(&priv->phyTimer) != HDF_SUCCESS) {
5521bd4fe43Sopenharmony_ci        HDF_LOGE("start phy state machine timer failed");
5531bd4fe43Sopenharmony_ci        return;
5541bd4fe43Sopenharmony_ci    }
5551bd4fe43Sopenharmony_ci
5561bd4fe43Sopenharmony_ci    HiethIrqEnable(ld, UD_BIT_NAME(HIETH_INT_MULTI_RXRDY) | UD_BIT_NAME(HIETH_INT_TXQUE_RDY));
5571bd4fe43Sopenharmony_ci    HiethWritelBits(ld, 1, GLB_RW_IRQ_ENA, UD_BIT_NAME(BITS_IRQS_ENA));
5581bd4fe43Sopenharmony_ci    HiethWritelBits(ld, 1, GLB_RW_IRQ_ENA, BITS_IRQS_ENA_ALLPORT);
5591bd4fe43Sopenharmony_ci#ifdef HIETH_TSO_SUPPORTED
5601bd4fe43Sopenharmony_ci    HiethIrqEnable(ld, UD_BIT_NAME(HIETH_INT_TX_ERR));
5611bd4fe43Sopenharmony_ci#endif
5621bd4fe43Sopenharmony_ci
5631bd4fe43Sopenharmony_ci    data = readl(ld->iobase + 0x210);
5641bd4fe43Sopenharmony_ci    data |= 0x40000000; /* do CRC check in mac */
5651bd4fe43Sopenharmony_ci    writel(data, ld->iobase + 0x210);
5661bd4fe43Sopenharmony_ci}
5671bd4fe43Sopenharmony_ci
5681bd4fe43Sopenharmony_cistatic struct EthHwrFuns g_stEthnetDrvFun = {
5691bd4fe43Sopenharmony_ci    .canSend = HiethCanSend,
5701bd4fe43Sopenharmony_ci    .send = HiethSend,
5711bd4fe43Sopenharmony_ci    .deliver = HiethDeliver,
5721bd4fe43Sopenharmony_ci    .intVector = HiethIntVector,
5731bd4fe43Sopenharmony_ci};
5741bd4fe43Sopenharmony_ci
5751bd4fe43Sopenharmony_civoid InitEthnetDrvFun(struct EthDrvSc *drvFun)
5761bd4fe43Sopenharmony_ci{
5771bd4fe43Sopenharmony_ci    if (drvFun == NULL) {
5781bd4fe43Sopenharmony_ci        HDF_LOGE("%s: input is NULL!", __func__);
5791bd4fe43Sopenharmony_ci        return;
5801bd4fe43Sopenharmony_ci    }
5811bd4fe43Sopenharmony_ci    drvFun->funs = &g_stEthnetDrvFun;
5821bd4fe43Sopenharmony_ci}
5831bd4fe43Sopenharmony_ci
5841bd4fe43Sopenharmony_ciint32_t HiethInit(struct EthDevice *ethDevice)
5851bd4fe43Sopenharmony_ci{
5861bd4fe43Sopenharmony_ci    if (ethDevice == NULL) {
5871bd4fe43Sopenharmony_ci        HDF_LOGE("%s input is NULL!", __func__);
5881bd4fe43Sopenharmony_ci        return HDF_FAILURE;
5891bd4fe43Sopenharmony_ci    }
5901bd4fe43Sopenharmony_ci
5911bd4fe43Sopenharmony_ci    g_stHiethPlatformData = (struct HiethPlatformData *)OsalMemCalloc(sizeof(struct HiethPlatformData));
5921bd4fe43Sopenharmony_ci    if (!g_stHiethPlatformData) {
5931bd4fe43Sopenharmony_ci        HDF_LOGE("EthDrvSc OsalMemCalloc HiethPlatformData error!");
5941bd4fe43Sopenharmony_ci        return HDF_FAILURE;
5951bd4fe43Sopenharmony_ci    }
5961bd4fe43Sopenharmony_ci    OsalSpinInit(&(g_stHiethPlatformData[0].stNetdevLocal.tx_lock));
5971bd4fe43Sopenharmony_ci    OsalSpinInit(&(g_stHiethPlatformData[0].stNetdevLocal.rx_lock));
5981bd4fe43Sopenharmony_ci
5991bd4fe43Sopenharmony_ci    struct ConfigEthDevList *config = ethDevice->config;
6001bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.port = config->port;
6011bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.depth.hwXmitq = config->hwXmitq;
6021bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.qSize = config->qSize;
6031bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.mdioFrqdiv = config->ethMac.mdioFrqDiv;
6041bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.txBusy = config->ethMac.txBusy;
6051bd4fe43Sopenharmony_ci    g_stHiethPlatformData[0].stNetdevLocal.phyMode = config->ethPhy.phyMode;
6061bd4fe43Sopenharmony_ci    (void)LOS_EventInit(&(g_stHiethPlatformData[0].stEvent));
6071bd4fe43Sopenharmony_ci
6081bd4fe43Sopenharmony_ci    HiethHwInit(ethDevice);
6091bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
6101bd4fe43Sopenharmony_ci}
6111bd4fe43Sopenharmony_ci
6121bd4fe43Sopenharmony_cistruct HiethPlatformData *GetHiethPlatformData(void)
6131bd4fe43Sopenharmony_ci{
6141bd4fe43Sopenharmony_ci    return g_stHiethPlatformData;
6151bd4fe43Sopenharmony_ci}
6161bd4fe43Sopenharmony_ci
6171bd4fe43Sopenharmony_cistruct HiethNetdevLocal *GetHiethNetDevLocal(struct EthDevice *ethDevice)
6181bd4fe43Sopenharmony_ci{
6191bd4fe43Sopenharmony_ci    struct HiethNetdevLocal *ld = NULL;
6201bd4fe43Sopenharmony_ci    if (ethDevice == NULL) {
6211bd4fe43Sopenharmony_ci        HDF_LOGE("%s input is NULL", __func__);
6221bd4fe43Sopenharmony_ci        return NULL;
6231bd4fe43Sopenharmony_ci    }
6241bd4fe43Sopenharmony_ci    struct EthDrvSc *drvSc = (struct EthDrvSc *)ethDevice->priv;
6251bd4fe43Sopenharmony_ci    HiethPriv *priv = (HiethPriv *)drvSc->driverPrivate;
6261bd4fe43Sopenharmony_ci    ld = &(g_stHiethPlatformData[priv->index].stNetdevLocal);
6271bd4fe43Sopenharmony_ci    if (ld == NULL) {
6281bd4fe43Sopenharmony_ci        HDF_LOGE("%s get HiethNetdevLocal fail", __func__);
6291bd4fe43Sopenharmony_ci        return NULL;
6301bd4fe43Sopenharmony_ci    }
6311bd4fe43Sopenharmony_ci    return ld;
6321bd4fe43Sopenharmony_ci}
6331bd4fe43Sopenharmony_ci
6341bd4fe43Sopenharmony_ciint ethnet_hieth_init(struct EthDevice *ethDevice)
6351bd4fe43Sopenharmony_ci{
6361bd4fe43Sopenharmony_ci    return HDF_SUCCESS;
6371bd4fe43Sopenharmony_ci}
6381bd4fe43Sopenharmony_ci
6391bd4fe43Sopenharmony_civoid get_defaultNetif(struct netif **pnetif, struct EthDrvSc *drvSc)
6401bd4fe43Sopenharmony_ci{
6411bd4fe43Sopenharmony_ci    (void)pnetif;
6421bd4fe43Sopenharmony_ci    (void)drvSc;
6431bd4fe43Sopenharmony_ci}
644