118 lines
2.6 KiB
C
Executable File
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);
|
|
}
|