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_mac.h" 171bd4fe43Sopenharmony_ci#include "ctrl.h" 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_civoid HiethMacCoreInit(void) 201bd4fe43Sopenharmony_ci{ 211bd4fe43Sopenharmony_ci uint32_t v; 221bd4fe43Sopenharmony_ci 231bd4fe43Sopenharmony_ci READ_UINT32(v, HIETH_CRG_IOBASE); 241bd4fe43Sopenharmony_ci v |= ETH_CORE_CLK_SELECT_54M; 251bd4fe43Sopenharmony_ci v |= (0x1 << 1); /* enable clk */ 261bd4fe43Sopenharmony_ci WRITE_UINT32(v, HIETH_CRG_IOBASE); 271bd4fe43Sopenharmony_ci 281bd4fe43Sopenharmony_ci /* set reset bit */ 291bd4fe43Sopenharmony_ci READ_UINT32(v, HIETH_CRG_IOBASE); 301bd4fe43Sopenharmony_ci v |= 0x1; 311bd4fe43Sopenharmony_ci WRITE_UINT32(v, HIETH_CRG_IOBASE); 321bd4fe43Sopenharmony_ci 331bd4fe43Sopenharmony_ci LOS_Udelay(DELAY_TIME_MEDIUM); 341bd4fe43Sopenharmony_ci 351bd4fe43Sopenharmony_ci /* clear reset bit */ 361bd4fe43Sopenharmony_ci READ_UINT32(v, HIETH_CRG_IOBASE); 371bd4fe43Sopenharmony_ci v &= ~(0x1); 381bd4fe43Sopenharmony_ci WRITE_UINT32(v, HIETH_CRG_IOBASE); 391bd4fe43Sopenharmony_ci} 401bd4fe43Sopenharmony_ci 411bd4fe43Sopenharmony_ciint32_t HiethPortReset(struct EthDevice *ethDevice) 421bd4fe43Sopenharmony_ci{ 431bd4fe43Sopenharmony_ci struct HiethNetdevLocal *ld = GetHiethNetDevLocal(ethDevice); 441bd4fe43Sopenharmony_ci if (ld == NULL) { 451bd4fe43Sopenharmony_ci HDF_LOGE("%s: get ld fail!", __func__); 461bd4fe43Sopenharmony_ci return HDF_FAILURE; 471bd4fe43Sopenharmony_ci } 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci /* soft reset: sf ip need reset twice */ 501bd4fe43Sopenharmony_ci if (ld->port == UP_PORT) { 511bd4fe43Sopenharmony_ci /* Note: sf ip need reset twice */ 521bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_ALL); 531bd4fe43Sopenharmony_ci msleep(1); 541bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_ALL); 551bd4fe43Sopenharmony_ci msleep(1); 561bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_ALL); 571bd4fe43Sopenharmony_ci msleep(1); 581bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_ALL); 591bd4fe43Sopenharmony_ci } else if (ld->port == DOWN_PORT) { 601bd4fe43Sopenharmony_ci /* Note: sf ip need reset twice */ 611bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_DOWN); 621bd4fe43Sopenharmony_ci msleep(1); 631bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_DOWN); 641bd4fe43Sopenharmony_ci msleep(1); 651bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_DOWN); 661bd4fe43Sopenharmony_ci msleep(1); 671bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_SOFT_RESET, BITS_ETH_SOFT_RESET_DOWN); 681bd4fe43Sopenharmony_ci } 691bd4fe43Sopenharmony_ci return HDF_SUCCESS; 701bd4fe43Sopenharmony_ci} 711bd4fe43Sopenharmony_ci 721bd4fe43Sopenharmony_ciint32_t HiethPortInit(struct EthDevice *ethDevice) 731bd4fe43Sopenharmony_ci{ 741bd4fe43Sopenharmony_ci struct HiethNetdevLocal *ld = GetHiethNetDevLocal(ethDevice); 751bd4fe43Sopenharmony_ci if (ld == NULL) { 761bd4fe43Sopenharmony_ci HDF_LOGE("%s: get ld fail!", __func__); 771bd4fe43Sopenharmony_ci return HDF_FAILURE; 781bd4fe43Sopenharmony_ci } 791bd4fe43Sopenharmony_ci 801bd4fe43Sopenharmony_ci HiethSetEndianMode(ld, HIETH_LITTLE_ENDIAN); 811bd4fe43Sopenharmony_ci HiethSetLinkStat(ld, 0); 821bd4fe43Sopenharmony_ci HiethSetNegMode(ld, HIETH_NEGMODE_CPUSET); 831bd4fe43Sopenharmony_ci /* clear all interrupt status */ 841bd4fe43Sopenharmony_ci HiethClearIrqstatus(ld, UD_BIT_NAME(BITS_IRQS_MASK)); 851bd4fe43Sopenharmony_ci /* disable interrupts */ 861bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_RW_IRQ_ENA, UD_BIT_NAME(BITS_IRQS_ENA)); 871bd4fe43Sopenharmony_ci HiethIrqDisable(ld, UD_BIT_NAME(BITS_IRQS_MASK)); 881bd4fe43Sopenharmony_ci 891bd4fe43Sopenharmony_ci#ifdef HIETH_TSO_SUPPORTED 901bd4fe43Sopenharmony_ci /* enable TSO debug for error handle */ 911bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, UD_REG_NAME(GLB_TSO_DBG_EN), BITS_TSO_DBG_EN); 921bd4fe43Sopenharmony_ci#endif 931bd4fe43Sopenharmony_ci 941bd4fe43Sopenharmony_ci /* disable vlan func */ 951bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_FWCTRL, BITS_VLAN_ENABLE); 961bd4fe43Sopenharmony_ci /* enable UpEther<->CPU */ 971bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_FWCTRL, UD_BIT(ld->port, BITS_FW2CPU_ENA)); 981bd4fe43Sopenharmony_ci HiethWritelBits(ld, 0, GLB_FWCTRL, UD_BIT(ld->port, BITS_FWALL2CPU)); 991bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_MACTCTRL, UD_BIT(ld->port, BITS_BROAD2CPU)); 1001bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_MACTCTRL, UD_BIT(ld->port, BITS_MACT_ENA)); 1011bd4fe43Sopenharmony_ci HiethWritelBits(ld, 1, GLB_MACTCTRL, UD_BIT(ld->port, BITS_MULTI2CPU)); 1021bd4fe43Sopenharmony_ci 1031bd4fe43Sopenharmony_ci HiethSetMacLeadcodeCntLimit(ld, 0); 1041bd4fe43Sopenharmony_ci HiethSetRcvLenMax(ld, HIETH_MAX_RCV_LEN); 1051bd4fe43Sopenharmony_ci RegisterHiethData(ethDevice); 1061bd4fe43Sopenharmony_ci 1071bd4fe43Sopenharmony_ci return HDF_SUCCESS; 1081bd4fe43Sopenharmony_ci} 1091bd4fe43Sopenharmony_ci 1101bd4fe43Sopenharmony_cistatic struct EthMacOps g_macOps = { 1111bd4fe43Sopenharmony_ci .MacInit = HiethMacCoreInit, 1121bd4fe43Sopenharmony_ci .PortReset = HiethPortReset, 1131bd4fe43Sopenharmony_ci .PortInit = HiethPortInit, 1141bd4fe43Sopenharmony_ci}; 1151bd4fe43Sopenharmony_ci 1161bd4fe43Sopenharmony_cistruct HdfEthMacChipDriver *BuildHisiMacDriver(void) 1171bd4fe43Sopenharmony_ci{ 1181bd4fe43Sopenharmony_ci struct HdfEthMacChipDriver *macChipDriver = (struct HdfEthMacChipDriver *)OsalMemCalloc( 1191bd4fe43Sopenharmony_ci sizeof(struct HdfEthMacChipDriver)); 1201bd4fe43Sopenharmony_ci if (macChipDriver == NULL) { 1211bd4fe43Sopenharmony_ci HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__); 1221bd4fe43Sopenharmony_ci return NULL; 1231bd4fe43Sopenharmony_ci } 1241bd4fe43Sopenharmony_ci macChipDriver->ethMacOps = &g_macOps; 1251bd4fe43Sopenharmony_ci return macChipDriver; 1261bd4fe43Sopenharmony_ci} 1271bd4fe43Sopenharmony_ci 1281bd4fe43Sopenharmony_civoid ReleaseHisiMacDriver(struct HdfEthMacChipDriver *chipDriver) 1291bd4fe43Sopenharmony_ci{ 1301bd4fe43Sopenharmony_ci if (chipDriver == NULL) { 1311bd4fe43Sopenharmony_ci return; 1321bd4fe43Sopenharmony_ci } 1331bd4fe43Sopenharmony_ci OsalMemFree(chipDriver); 1341bd4fe43Sopenharmony_ci} 1351bd4fe43Sopenharmony_ci 1361bd4fe43Sopenharmony_cistruct HdfEthMacChipDriver *GetEthMacChipDriver(const struct NetDevice *netDev) 1371bd4fe43Sopenharmony_ci{ 1381bd4fe43Sopenharmony_ci struct HdfEthNetDeviceData *data = GetEthNetDeviceData(netDev); 1391bd4fe43Sopenharmony_ci if (data != NULL) { 1401bd4fe43Sopenharmony_ci return data->macChipDriver; 1411bd4fe43Sopenharmony_ci } 1421bd4fe43Sopenharmony_ci return NULL; 1431bd4fe43Sopenharmony_ci} 144