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