mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 00:24:12 +08:00
net: fman: Move initialization to mac-specific files
This moves mac-specific initialization to mac-specific files. This will make it easier to work with individual macs. It will also make it easier to refactor the initialization to simplify the control flow. No functional change intended. Signed-off-by: Sean Anderson <sean.anderson@seco.com> Acked-by: Camelia Groza <camelia.groza@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
36f9b47457
commit
302376feec
@ -7,6 +7,7 @@
|
||||
|
||||
#include "fman_dtsec.h"
|
||||
#include "fman.h"
|
||||
#include "mac.h"
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/bitrev.h>
|
||||
@ -1247,6 +1248,28 @@ int dtsec_restart_autoneg(struct fman_mac *dtsec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adjust_link_dtsec(struct mac_device *mac_dev)
|
||||
{
|
||||
struct phy_device *phy_dev = mac_dev->phy_dev;
|
||||
struct fman_mac *fman_mac;
|
||||
bool rx_pause, tx_pause;
|
||||
int err;
|
||||
|
||||
fman_mac = mac_dev->fman_mac;
|
||||
if (!phy_dev->link) {
|
||||
dtsec_restart_autoneg(fman_mac);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
dtsec_adjust_link(fman_mac, phy_dev->speed);
|
||||
fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
|
||||
err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
|
||||
if (err < 0)
|
||||
dev_err(mac_dev->dev, "fman_set_mac_active_pause() = %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version)
|
||||
{
|
||||
struct dtsec_regs __iomem *regs = dtsec->regs;
|
||||
@ -1492,3 +1515,68 @@ err_dtsec:
|
||||
kfree(dtsec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int dtsec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
u32 version;
|
||||
|
||||
mac_dev->set_promisc = dtsec_set_promiscuous;
|
||||
mac_dev->change_addr = dtsec_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = dtsec_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = dtsec_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = dtsec_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = dtsec_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = dtsec_set_exception;
|
||||
mac_dev->set_allmulti = dtsec_set_allmulti;
|
||||
mac_dev->set_tstamp = dtsec_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_dtsec;
|
||||
mac_dev->enable = dtsec_enable;
|
||||
mac_dev->disable = dtsec_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
params.internal_phy_node = of_parse_phandle(mac_node, "tbi-handle", 0);
|
||||
|
||||
mac_dev->fman_mac = dtsec_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = dtsec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_cfg_pad_and_crc(mac_dev->fman_mac, true);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
/* For 1G MAC, disable by default the MIB counters overflow interrupt */
|
||||
err = mac_dev->set_exception(mac_dev->fman_mac,
|
||||
FM_MAC_EX_1G_RX_MIB_CNT_OVFL, false);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_get_version(mac_dev->fman_mac, &version);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
dev_info(mac_dev->dev, "FMan dTSEC version: 0x%08x\n", version);
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fm_mac_free:
|
||||
dtsec_free(mac_dev->fman_mac);
|
||||
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
@ -8,27 +8,9 @@
|
||||
|
||||
#include "fman_mac.h"
|
||||
|
||||
struct fman_mac *dtsec_config(struct fman_mac_params *params);
|
||||
int dtsec_set_promiscuous(struct fman_mac *dtsec, bool new_val);
|
||||
int dtsec_modify_mac_address(struct fman_mac *dtsec, const enet_addr_t *enet_addr);
|
||||
int dtsec_adjust_link(struct fman_mac *dtsec,
|
||||
u16 speed);
|
||||
int dtsec_restart_autoneg(struct fman_mac *dtsec);
|
||||
int dtsec_cfg_max_frame_len(struct fman_mac *dtsec, u16 new_val);
|
||||
int dtsec_cfg_pad_and_crc(struct fman_mac *dtsec, bool new_val);
|
||||
int dtsec_enable(struct fman_mac *dtsec);
|
||||
int dtsec_disable(struct fman_mac *dtsec);
|
||||
int dtsec_init(struct fman_mac *dtsec);
|
||||
int dtsec_free(struct fman_mac *dtsec);
|
||||
int dtsec_accept_rx_pause_frames(struct fman_mac *dtsec, bool en);
|
||||
int dtsec_set_tx_pause_frames(struct fman_mac *dtsec, u8 priority,
|
||||
u16 pause_time, u16 thresh_time);
|
||||
int dtsec_set_exception(struct fman_mac *dtsec,
|
||||
enum fman_mac_exceptions exception, bool enable);
|
||||
int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
|
||||
int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
|
||||
int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version);
|
||||
int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable);
|
||||
int dtsec_set_tstamp(struct fman_mac *dtsec, bool enable);
|
||||
struct mac_device;
|
||||
|
||||
int dtsec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node);
|
||||
|
||||
#endif /* __DTSEC_H */
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include "fman_memac.h"
|
||||
#include "fman.h"
|
||||
#include "mac.h"
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
@ -774,6 +775,23 @@ int memac_adjust_link(struct fman_mac *memac, u16 speed)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adjust_link_memac(struct mac_device *mac_dev)
|
||||
{
|
||||
struct phy_device *phy_dev = mac_dev->phy_dev;
|
||||
struct fman_mac *fman_mac;
|
||||
bool rx_pause, tx_pause;
|
||||
int err;
|
||||
|
||||
fman_mac = mac_dev->fman_mac;
|
||||
memac_adjust_link(fman_mac, phy_dev->speed);
|
||||
|
||||
fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
|
||||
err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
|
||||
if (err < 0)
|
||||
dev_err(mac_dev->dev, "fman_set_mac_active_pause() = %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
int memac_cfg_max_frame_len(struct fman_mac *memac, u16 new_val)
|
||||
{
|
||||
if (is_init_done(memac->memac_drv_param))
|
||||
@ -995,7 +1013,7 @@ int memac_init(struct fman_mac *memac)
|
||||
u8 i;
|
||||
enet_addr_t eth_addr;
|
||||
bool slow_10g_if = false;
|
||||
struct fixed_phy_status *fixed_link;
|
||||
struct fixed_phy_status *fixed_link = NULL;
|
||||
int err;
|
||||
u32 reg32 = 0;
|
||||
|
||||
@ -1178,3 +1196,96 @@ struct fman_mac *memac_config(struct fman_mac_params *params)
|
||||
|
||||
return memac;
|
||||
}
|
||||
|
||||
int memac_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
struct fixed_phy_status *fixed_link;
|
||||
|
||||
mac_dev->set_promisc = memac_set_promiscuous;
|
||||
mac_dev->change_addr = memac_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = memac_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = memac_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = memac_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = memac_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = memac_set_exception;
|
||||
mac_dev->set_allmulti = memac_set_allmulti;
|
||||
mac_dev->set_tstamp = memac_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_memac;
|
||||
mac_dev->enable = memac_enable;
|
||||
mac_dev->disable = memac_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
params.internal_phy_node = of_parse_phandle(mac_node, "pcsphy-handle", 0);
|
||||
|
||||
if (params.max_speed == SPEED_10000)
|
||||
params.phy_if = PHY_INTERFACE_MODE_XGMII;
|
||||
|
||||
mac_dev->fman_mac = memac_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = memac_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = memac_cfg_reset_on_init(mac_dev->fman_mac, true);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
if (!mac_dev->phy_node && of_phy_is_fixed_link(mac_node)) {
|
||||
struct phy_device *phy;
|
||||
|
||||
err = of_phy_register_fixed_link(mac_node);
|
||||
if (err)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
fixed_link = kzalloc(sizeof(*fixed_link), GFP_KERNEL);
|
||||
if (!fixed_link) {
|
||||
err = -ENOMEM;
|
||||
goto _return_fm_mac_free;
|
||||
}
|
||||
|
||||
mac_dev->phy_node = of_node_get(mac_node);
|
||||
phy = of_phy_find_device(mac_dev->phy_node);
|
||||
if (!phy) {
|
||||
err = -EINVAL;
|
||||
of_node_put(mac_dev->phy_node);
|
||||
goto _return_fixed_link_free;
|
||||
}
|
||||
|
||||
fixed_link->link = phy->link;
|
||||
fixed_link->speed = phy->speed;
|
||||
fixed_link->duplex = phy->duplex;
|
||||
fixed_link->pause = phy->pause;
|
||||
fixed_link->asym_pause = phy->asym_pause;
|
||||
|
||||
put_device(&phy->mdio.dev);
|
||||
|
||||
err = memac_cfg_fixed_link(mac_dev->fman_mac, fixed_link);
|
||||
if (err < 0)
|
||||
goto _return_fixed_link_free;
|
||||
}
|
||||
|
||||
err = memac_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fixed_link_free;
|
||||
|
||||
dev_info(mac_dev->dev, "FMan MEMAC\n");
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fixed_link_free:
|
||||
kfree(fixed_link);
|
||||
_return_fm_mac_free:
|
||||
memac_free(mac_dev->fman_mac);
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
@ -11,26 +11,9 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/phy_fixed.h>
|
||||
|
||||
struct fman_mac *memac_config(struct fman_mac_params *params);
|
||||
int memac_set_promiscuous(struct fman_mac *memac, bool new_val);
|
||||
int memac_modify_mac_address(struct fman_mac *memac, const enet_addr_t *enet_addr);
|
||||
int memac_adjust_link(struct fman_mac *memac, u16 speed);
|
||||
int memac_cfg_max_frame_len(struct fman_mac *memac, u16 new_val);
|
||||
int memac_cfg_reset_on_init(struct fman_mac *memac, bool enable);
|
||||
int memac_cfg_fixed_link(struct fman_mac *memac,
|
||||
struct fixed_phy_status *fixed_link);
|
||||
int memac_enable(struct fman_mac *memac);
|
||||
int memac_disable(struct fman_mac *memac);
|
||||
int memac_init(struct fman_mac *memac);
|
||||
int memac_free(struct fman_mac *memac);
|
||||
int memac_accept_rx_pause_frames(struct fman_mac *memac, bool en);
|
||||
int memac_set_tx_pause_frames(struct fman_mac *memac, u8 priority,
|
||||
u16 pause_time, u16 thresh_time);
|
||||
int memac_set_exception(struct fman_mac *memac,
|
||||
enum fman_mac_exceptions exception, bool enable);
|
||||
int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
|
||||
int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
|
||||
int memac_set_allmulti(struct fman_mac *memac, bool enable);
|
||||
int memac_set_tstamp(struct fman_mac *memac, bool enable);
|
||||
struct mac_device;
|
||||
|
||||
int memac_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node);
|
||||
|
||||
#endif /* __MEMAC_H */
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include "fman_tgec.h"
|
||||
#include "fman.h"
|
||||
#include "mac.h"
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/bitrev.h>
|
||||
@ -609,6 +610,10 @@ int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adjust_link_void(struct mac_device *mac_dev)
|
||||
{
|
||||
}
|
||||
|
||||
int tgec_get_version(struct fman_mac *tgec, u32 *mac_version)
|
||||
{
|
||||
struct tgec_regs __iomem *regs = tgec->regs;
|
||||
@ -794,3 +799,63 @@ struct fman_mac *tgec_config(struct fman_mac_params *params)
|
||||
|
||||
return tgec;
|
||||
}
|
||||
|
||||
int tgec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
u32 version;
|
||||
|
||||
mac_dev->set_promisc = tgec_set_promiscuous;
|
||||
mac_dev->change_addr = tgec_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = tgec_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = tgec_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = tgec_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = tgec_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = tgec_set_exception;
|
||||
mac_dev->set_allmulti = tgec_set_allmulti;
|
||||
mac_dev->set_tstamp = tgec_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_void;
|
||||
mac_dev->enable = tgec_enable;
|
||||
mac_dev->disable = tgec_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
|
||||
mac_dev->fman_mac = tgec_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = tgec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = tgec_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
/* For 10G MAC, disable Tx ECC exception */
|
||||
err = mac_dev->set_exception(mac_dev->fman_mac,
|
||||
FM_MAC_EX_10G_TX_ECC_ER, false);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = tgec_get_version(mac_dev->fman_mac, &version);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
pr_info("FMan XGEC version: 0x%08x\n", version);
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fm_mac_free:
|
||||
tgec_free(mac_dev->fman_mac);
|
||||
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
@ -8,23 +8,9 @@
|
||||
|
||||
#include "fman_mac.h"
|
||||
|
||||
struct fman_mac *tgec_config(struct fman_mac_params *params);
|
||||
int tgec_set_promiscuous(struct fman_mac *tgec, bool new_val);
|
||||
int tgec_modify_mac_address(struct fman_mac *tgec, const enet_addr_t *enet_addr);
|
||||
int tgec_cfg_max_frame_len(struct fman_mac *tgec, u16 new_val);
|
||||
int tgec_enable(struct fman_mac *tgec);
|
||||
int tgec_disable(struct fman_mac *tgec);
|
||||
int tgec_init(struct fman_mac *tgec);
|
||||
int tgec_free(struct fman_mac *tgec);
|
||||
int tgec_accept_rx_pause_frames(struct fman_mac *tgec, bool en);
|
||||
int tgec_set_tx_pause_frames(struct fman_mac *tgec, u8 priority,
|
||||
u16 pause_time, u16 thresh_time);
|
||||
int tgec_set_exception(struct fman_mac *tgec,
|
||||
enum fman_mac_exceptions exception, bool enable);
|
||||
int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
|
||||
int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
|
||||
int tgec_get_version(struct fman_mac *tgec, u32 *mac_version);
|
||||
int tgec_set_allmulti(struct fman_mac *tgec, bool enable);
|
||||
int tgec_set_tstamp(struct fman_mac *tgec, bool enable);
|
||||
struct mac_device;
|
||||
|
||||
int tgec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node);
|
||||
|
||||
#endif /* __TGEC_H */
|
||||
|
@ -216,267 +216,6 @@ void fman_get_pause_cfg(struct mac_device *mac_dev, bool *rx_pause,
|
||||
}
|
||||
EXPORT_SYMBOL(fman_get_pause_cfg);
|
||||
|
||||
static void adjust_link_void(struct mac_device *mac_dev)
|
||||
{
|
||||
}
|
||||
|
||||
static void adjust_link_dtsec(struct mac_device *mac_dev)
|
||||
{
|
||||
struct phy_device *phy_dev = mac_dev->phy_dev;
|
||||
struct fman_mac *fman_mac;
|
||||
bool rx_pause, tx_pause;
|
||||
int err;
|
||||
|
||||
fman_mac = mac_dev->fman_mac;
|
||||
if (!phy_dev->link) {
|
||||
dtsec_restart_autoneg(fman_mac);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
dtsec_adjust_link(fman_mac, phy_dev->speed);
|
||||
fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
|
||||
err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
|
||||
if (err < 0)
|
||||
dev_err(mac_dev->dev, "fman_set_mac_active_pause() = %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
static void adjust_link_memac(struct mac_device *mac_dev)
|
||||
{
|
||||
struct phy_device *phy_dev = mac_dev->phy_dev;
|
||||
struct fman_mac *fman_mac;
|
||||
bool rx_pause, tx_pause;
|
||||
int err;
|
||||
|
||||
fman_mac = mac_dev->fman_mac;
|
||||
memac_adjust_link(fman_mac, phy_dev->speed);
|
||||
|
||||
fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
|
||||
err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
|
||||
if (err < 0)
|
||||
dev_err(mac_dev->dev, "fman_set_mac_active_pause() = %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
static int tgec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
u32 version;
|
||||
|
||||
mac_dev->set_promisc = tgec_set_promiscuous;
|
||||
mac_dev->change_addr = tgec_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = tgec_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = tgec_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = tgec_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = tgec_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = tgec_set_exception;
|
||||
mac_dev->set_allmulti = tgec_set_allmulti;
|
||||
mac_dev->set_tstamp = tgec_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_void;
|
||||
mac_dev->enable = tgec_enable;
|
||||
mac_dev->disable = tgec_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
|
||||
mac_dev->fman_mac = tgec_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = tgec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = tgec_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
/* For 10G MAC, disable Tx ECC exception */
|
||||
err = mac_dev->set_exception(mac_dev->fman_mac,
|
||||
FM_MAC_EX_10G_TX_ECC_ER, false);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = tgec_get_version(mac_dev->fman_mac, &version);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
dev_info(mac_dev->dev, "FMan XGEC version: 0x%08x\n", version);
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fm_mac_free:
|
||||
tgec_free(mac_dev->fman_mac);
|
||||
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int dtsec_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
u32 version;
|
||||
|
||||
mac_dev->set_promisc = dtsec_set_promiscuous;
|
||||
mac_dev->change_addr = dtsec_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = dtsec_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = dtsec_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = dtsec_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = dtsec_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = dtsec_set_exception;
|
||||
mac_dev->set_allmulti = dtsec_set_allmulti;
|
||||
mac_dev->set_tstamp = dtsec_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_dtsec;
|
||||
mac_dev->enable = dtsec_enable;
|
||||
mac_dev->disable = dtsec_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
params.internal_phy_node = of_parse_phandle(mac_node, "tbi-handle", 0);
|
||||
|
||||
mac_dev->fman_mac = dtsec_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = dtsec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_cfg_pad_and_crc(mac_dev->fman_mac, true);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
/* For 1G MAC, disable by default the MIB counters overflow interrupt */
|
||||
err = mac_dev->set_exception(mac_dev->fman_mac,
|
||||
FM_MAC_EX_1G_RX_MIB_CNT_OVFL, false);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = dtsec_get_version(mac_dev->fman_mac, &version);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
dev_info(mac_dev->dev, "FMan dTSEC version: 0x%08x\n", version);
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fm_mac_free:
|
||||
dtsec_free(mac_dev->fman_mac);
|
||||
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int memac_initialization(struct mac_device *mac_dev,
|
||||
struct device_node *mac_node)
|
||||
{
|
||||
int err;
|
||||
struct fman_mac_params params;
|
||||
struct fixed_phy_status *fixed_link = NULL;
|
||||
|
||||
mac_dev->set_promisc = memac_set_promiscuous;
|
||||
mac_dev->change_addr = memac_modify_mac_address;
|
||||
mac_dev->add_hash_mac_addr = memac_add_hash_mac_address;
|
||||
mac_dev->remove_hash_mac_addr = memac_del_hash_mac_address;
|
||||
mac_dev->set_tx_pause = memac_set_tx_pause_frames;
|
||||
mac_dev->set_rx_pause = memac_accept_rx_pause_frames;
|
||||
mac_dev->set_exception = memac_set_exception;
|
||||
mac_dev->set_allmulti = memac_set_allmulti;
|
||||
mac_dev->set_tstamp = memac_set_tstamp;
|
||||
mac_dev->set_multi = fman_set_multi;
|
||||
mac_dev->adjust_link = adjust_link_memac;
|
||||
mac_dev->enable = memac_enable;
|
||||
mac_dev->disable = memac_disable;
|
||||
|
||||
err = set_fman_mac_params(mac_dev, ¶ms);
|
||||
if (err)
|
||||
goto _return;
|
||||
params.internal_phy_node = of_parse_phandle(mac_node, "pcsphy-handle", 0);
|
||||
|
||||
if (params.max_speed == SPEED_10000)
|
||||
params.phy_if = PHY_INTERFACE_MODE_XGMII;
|
||||
|
||||
mac_dev->fman_mac = memac_config(¶ms);
|
||||
if (!mac_dev->fman_mac) {
|
||||
err = -EINVAL;
|
||||
goto _return;
|
||||
}
|
||||
|
||||
err = memac_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
err = memac_cfg_reset_on_init(mac_dev->fman_mac, true);
|
||||
if (err < 0)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
if (!mac_dev->phy_node && of_phy_is_fixed_link(mac_node)) {
|
||||
struct phy_device *phy;
|
||||
|
||||
err = of_phy_register_fixed_link(mac_node);
|
||||
if (err)
|
||||
goto _return_fm_mac_free;
|
||||
|
||||
fixed_link = kzalloc(sizeof(*fixed_link), GFP_KERNEL);
|
||||
if (!fixed_link) {
|
||||
err = -ENOMEM;
|
||||
goto _return_fm_mac_free;
|
||||
}
|
||||
|
||||
mac_dev->phy_node = of_node_get(mac_node);
|
||||
phy = of_phy_find_device(mac_dev->phy_node);
|
||||
if (!phy) {
|
||||
err = -EINVAL;
|
||||
of_node_put(mac_dev->phy_node);
|
||||
goto _return_fixed_link_free;
|
||||
}
|
||||
|
||||
fixed_link->link = phy->link;
|
||||
fixed_link->speed = phy->speed;
|
||||
fixed_link->duplex = phy->duplex;
|
||||
fixed_link->pause = phy->pause;
|
||||
fixed_link->asym_pause = phy->asym_pause;
|
||||
|
||||
put_device(&phy->mdio.dev);
|
||||
|
||||
err = memac_cfg_fixed_link(mac_dev->fman_mac, fixed_link);
|
||||
if (err < 0)
|
||||
goto _return_fixed_link_free;
|
||||
}
|
||||
|
||||
err = memac_init(mac_dev->fman_mac);
|
||||
if (err < 0)
|
||||
goto _return_fixed_link_free;
|
||||
|
||||
dev_info(mac_dev->dev, "FMan MEMAC\n");
|
||||
|
||||
goto _return;
|
||||
|
||||
_return_fixed_link_free:
|
||||
kfree(fixed_link);
|
||||
_return_fm_mac_free:
|
||||
memac_free(mac_dev->fman_mac);
|
||||
_return:
|
||||
return err;
|
||||
}
|
||||
|
||||
#define DTSEC_SUPPORTED \
|
||||
(SUPPORTED_10baseT_Half \
|
||||
| SUPPORTED_10baseT_Full \
|
||||
|
Loading…
Reference in New Issue
Block a user