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, ¶) != 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