gk7205v200-uboot/drivers/net/femac/mac.c
2025-08-07 17:13:54 +08:00

118 lines
2.6 KiB
C
Executable File

/*
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
*/
#define BSPETH_FEMAC
#include "bspeth.h"
#include "mac.h"
static u32 _set_linkstat(struct bspeth_netdev_local *ld, u32 mode)
{
u32 old;
old = bspeth_readl_bits(ld, ud_reg_name(MAC_PORTSET), BITS_MACSTAT);
bspeth_writel_bits(ld, mode, ud_reg_name(MAC_PORTSET), BITS_MACSTAT);
return old;
}
static u32 _set_negmode(struct bspeth_netdev_local *ld, u32 mode)
{
u32 old;
old = bspeth_readl_bits(ld, ud_reg_name(MAC_PORTSEL), BITS_NEGMODE);
bspeth_writel_bits(ld, mode, ud_reg_name(MAC_PORTSEL), BITS_NEGMODE);
return old;
}
static u32 _get_negmode(struct bspeth_netdev_local *ld)
{
u32 val;
val = bspeth_readl_bits(ld, ud_reg_name(MAC_PORTSEL), BITS_NEGMODE);
return val;
}
void bspeth_set_linkstat(struct bspeth_netdev_local *ld, u32 mode)
{
local_lock(ld);
(void)_set_linkstat(ld, mode);
local_unlock(ld);
}
u32 bspeth_get_linkstat(struct bspeth_netdev_local *ld)
{
u32 val;
local_lock(ld);
val = bspeth_readl_bits(ld, ud_reg_name(MAC_RO_STAT), BITS_MACSTAT);
local_unlock(ld);
return val;
}
void bspeth_set_mac_leadcode_cnt_limit(struct bspeth_netdev_local *ld, u32 cnt)
{
local_lock(ld);
(void)bspeth_readl_bits(ld, ud_reg_name(MAC_TX_IPGCTRL),
BITS_PRE_CNT_LIMIT);
bspeth_writel_bits(ld, cnt, ud_reg_name(MAC_TX_IPGCTRL),
BITS_PRE_CNT_LIMIT);
local_unlock(ld);
}
void bspeth_set_mac_trans_interval_bits(struct bspeth_netdev_local *ld, u32 nbits)
{
u32 linkstat, negmode;
local_lock(ld);
negmode = _set_negmode(ld, BSPETH_NEGMODE_CPUSET);
linkstat = _set_linkstat(ld, 0);
mdelay(1);
(void)bspeth_readl_bits(ld, ud_reg_name(MAC_TX_IPGCTRL), BITS_IPG);
bspeth_writel_bits(ld, nbits, ud_reg_name(MAC_TX_IPGCTRL), BITS_IPG);
udelay(100); /* delay 100us */
_set_negmode(ld, negmode);
_set_linkstat(ld, linkstat);
local_unlock(ld);
}
void bspeth_set_mac_fc_interval(struct bspeth_netdev_local *ld, u32 para)
{
local_lock(ld);
(void)bspeth_readl_bits(ld, ud_reg_name(MAC_TX_IPGCTRL), BITS_FC_INTER);
bspeth_writel_bits(ld, para, ud_reg_name(MAC_TX_IPGCTRL), BITS_FC_INTER);
local_unlock(ld);
}
void bspeth_set_negmode(struct bspeth_netdev_local *ld, u32 mode)
{
local_lock(ld);
_set_negmode(ld, mode);
local_unlock(ld);
}
u32 bspeth_get_negmode(struct bspeth_netdev_local *ld)
{
u32 val;
local_lock(ld);
val = _get_negmode(ld);
local_unlock(ld);
return val;
}
void bspeth_set_mii_mode(struct bspeth_netdev_local *ld, u32 mode)
{
local_lock(ld);
(void)bspeth_readl_bits(ld, ud_reg_name(MAC_PORTSEL), BITS_MII_MODE);
bspeth_writel_bits(ld, mode, ud_reg_name(MAC_PORTSEL), BITS_MII_MODE);
local_unlock(ld);
}