diff options
author | Cristian Bercaru <cristian.bercaru@freescale.com> | 2014-03-28 18:46:02 (GMT) |
---|---|---|
committer | Jose Rivera <German.Rivera@freescale.com> | 2014-03-31 19:55:28 (GMT) |
commit | 1877f35001b018bc7ad0f7b8ef41bdea04311b54 (patch) | |
tree | 37df0c76fe330453da6e8fbc8345261d190ed8a2 /drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c | |
parent | 642ff687a348d96f1d6ed0ffc8fed321fb9b95d5 (diff) | |
download | linux-fsl-qoriq-1877f35001b018bc7ad0f7b8ef41bdea04311b54.tar.xz |
FMD: add PFC support for FMan v3 platforms
Configure up to 4 PFC priorities each with its PAUSE quanta.
Each PFC priority controls a Work Queue on a FMan port.
When the private interfaces' buffer pool depletes, there are issued
PFC frames for the number of all configured priorities.
Signed-off-by: Cristian Bercaru <cristian.bercaru@freescale.com>
Change-Id: I8a6102f4a77b44d07973a38b98493226e9b69bbd
Reviewed-on: http://git.am.freescale.net:8181/9767
Reviewed-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com>
Tested-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com>
Reviewed-by: Cristian-Constantin Sovaiala <Cristian.Sovaiala@freescale.com>
Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c')
-rwxr-xr-x | drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c | 83 |
1 files changed, 70 insertions, 13 deletions
diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c index d30f2ed..4ea2885 100755 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.c @@ -110,10 +110,9 @@ extern struct device_node *GetFmPortAdvArgsDevTreeNode (struct device_node *fm_n #define FSL_FM_RX_EXTRA_HEADROOM_MIN 16 #define FSL_FM_RX_EXTRA_HEADROOM_MAX 384 -#define TX_PAUSE_PRIO_DEFAULT 0xff -#define TX_PAUSE_TIME_ENABLE 0xf000 -#define TX_PAUSE_TIME_DISABLE 0 -#define TX_PAUSE_THRESH_DEFAULT 0 +#define FSL_FM_PAUSE_TIME_ENABLE 0xf000 +#define FSL_FM_PAUSE_TIME_DISABLE 0 +#define FSL_FM_PAUSE_THRESH_DEFAULT 0 /* * Max frame size, across all interfaces. @@ -140,6 +139,15 @@ int fsl_fm_max_frm = CONFIG_FSL_FM_MAX_FRAME_SIZE; */ int fsl_fm_rx_extra_headroom = CONFIG_FSL_FM_RX_EXTRA_HEADROOM; +#ifdef CONFIG_FMAN_PFC +static int fsl_fm_pfc_quanta[] = { + CONFIG_FMAN_PFC_QUANTA_0, + CONFIG_FMAN_PFC_QUANTA_1, + CONFIG_FMAN_PFC_QUANTA_2, + CONFIG_FMAN_PFC_QUANTA_3 +}; +#endif + static t_LnxWrpFm lnxWrpFm; int fm_get_max_frm() @@ -1410,6 +1418,25 @@ bool fm_port_is_in_auto_res_mode(struct fm_port *port) } EXPORT_SYMBOL(fm_port_is_in_auto_res_mode); +#ifdef CONFIG_FMAN_PFC +int fm_port_set_pfc_priorities_mapping_to_qman_wq(struct fm_port *port, + uint8_t prio, uint8_t wq) +{ + t_LnxWrpFmPortDev *p_LnxWrpFmPortDev = (t_LnxWrpFmPortDev *)port; + int err; + int _errno; + + err = FM_PORT_SetPfcPrioritiesMappingToQmanWQ(p_LnxWrpFmPortDev->h_Dev, + prio, wq); + _errno = -GET_ERROR_TYPE(err); + if (unlikely(_errno < 0)) + pr_err("FM_PORT_SetPfcPrioritiesMappingToQmanWQ() = 0x%08x\n", err); + + return _errno; +} +EXPORT_SYMBOL(fm_port_set_pfc_priorities_mapping_to_qman_wq); +#endif + int fm_mac_set_exception(struct fm_mac_dev *fm_mac_dev, e_FmMacExceptions exception, bool enable) { @@ -1695,6 +1722,39 @@ int fm_mac_set_rx_pause_frames( } EXPORT_SYMBOL(fm_mac_set_rx_pause_frames); +#ifdef CONFIG_FMAN_PFC +int fm_mac_set_tx_pause_frames(struct fm_mac_dev *fm_mac_dev, + bool en) +{ + int _errno, i; + t_Error err; + + if (en) + for (i = 0; i < CONFIG_FMAN_PFC_COS_COUNT; i++) { + err = FM_MAC_SetTxPauseFrames(fm_mac_dev, + i, fsl_fm_pfc_quanta[i], + FSL_FM_PAUSE_THRESH_DEFAULT); + _errno = -GET_ERROR_TYPE(err); + if (_errno < 0) { + pr_err("FM_MAC_SetTxPauseFrames() = 0x%08x\n", err); + return _errno; + } + } + else + for (i = 0; i < CONFIG_FMAN_PFC_COS_COUNT; i++) { + err = FM_MAC_SetTxPauseFrames(fm_mac_dev, + i, FSL_FM_PAUSE_TIME_DISABLE, + FSL_FM_PAUSE_THRESH_DEFAULT); + _errno = -GET_ERROR_TYPE(err); + if (_errno < 0) { + pr_err("FM_MAC_SetTxPauseFrames() = 0x%08x\n", err); + return _errno; + } + } + + return _errno; +} +#else int fm_mac_set_tx_pause_frames(struct fm_mac_dev *fm_mac_dev, bool en) { @@ -1702,22 +1762,19 @@ int fm_mac_set_tx_pause_frames(struct fm_mac_dev *fm_mac_dev, t_Error err; if (en) - err = FM_MAC_SetTxPauseFrames(fm_mac_dev, - TX_PAUSE_PRIO_DEFAULT, - TX_PAUSE_TIME_ENABLE, - TX_PAUSE_THRESH_DEFAULT); + err = FM_MAC_SetTxAutoPauseFrames(fm_mac_dev, + FSL_FM_PAUSE_TIME_ENABLE); else - err = FM_MAC_SetTxPauseFrames(fm_mac_dev, - TX_PAUSE_PRIO_DEFAULT, - TX_PAUSE_TIME_DISABLE, - TX_PAUSE_THRESH_DEFAULT); + err = FM_MAC_SetTxAutoPauseFrames(fm_mac_dev, + FSL_FM_PAUSE_TIME_DISABLE); _errno = -GET_ERROR_TYPE(err); if (_errno < 0) - pr_err("FM_MAC_SetTxPauseFrames() = 0x%08x\n", err); + pr_err("FM_MAC_SetTxAutoPauseFrames() = 0x%08x\n", err); return _errno; } +#endif EXPORT_SYMBOL(fm_mac_set_tx_pause_frames); int fm_rtc_enable(struct fm *fm_dev) |