aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch263
1 files changed, 0 insertions, 263 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch b/target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch
deleted file mode 100644
index 7d18504070..0000000000
--- a/target/linux/layerscape/patches-5.4/701-net-0201-dpaa2-eth-Enable-Tx-PFC.patch
+++ /dev/null
@@ -1,263 +0,0 @@
-From 07fb72fb5b3d2faeeb742ae573aa54a4a1eeee12 Mon Sep 17 00:00:00 2001
-From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
-Date: Tue, 17 Sep 2019 20:36:08 +0300
-Subject: [PATCH] dpaa2-eth: Enable Tx PFC
-
-Configure the hardware to generate PFC frames based on Rx congestion
-notifications. When a certain number of frames accumulate in the
-ingress queues corresponding to a traffic class, priority flow control
-frames are generated for that TC.
-
-Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
----
- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 49 ++++++++++++++++++++-
- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 11 +++++
- drivers/net/ethernet/freescale/dpaa2/dpni-cmd.h | 25 +++++++++++
- drivers/net/ethernet/freescale/dpaa2/dpni.c | 46 +++++++++++++++++++
- drivers/net/ethernet/freescale/dpaa2/dpni.h | 56 ++++++++++++++++++++++++
- 5 files changed, 186 insertions(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
-+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
-@@ -3629,6 +3629,47 @@ static int dpaa2_eth_dcbnl_ieee_getpfc(s
- return 0;
- }
-
-+static inline bool is_prio_enabled(u8 pfc_en, u8 tc)
-+{
-+ return !!(pfc_en & (1 << tc));
-+}
-+
-+static int set_pfc_cn(struct dpaa2_eth_priv *priv, u8 pfc_en)
-+{
-+ struct dpni_congestion_notification_cfg cfg = {0};
-+ int i, err;
-+
-+ cfg.notification_mode = DPNI_CONG_OPT_FLOW_CONTROL;
-+ cfg.units = DPNI_CONGESTION_UNIT_FRAMES;
-+ cfg.message_iova = 0ULL;
-+ cfg.message_ctx = 0ULL;
-+
-+ for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
-+ if (is_prio_enabled(pfc_en, i)) {
-+ cfg.threshold_entry = DPAA2_ETH_CN_THRESH_ENTRY(priv);
-+ cfg.threshold_exit = DPAA2_ETH_CN_THRESH_EXIT(priv);
-+ } else {
-+ /* For priorities not set in the pfc_en mask, we leave
-+ * the congestion thresholds at zero, which effectively
-+ * disables generation of PFC frames for them
-+ */
-+ cfg.threshold_entry = 0;
-+ cfg.threshold_exit = 0;
-+ }
-+
-+ err = dpni_set_congestion_notification(priv->mc_io, 0,
-+ priv->mc_token,
-+ DPNI_QUEUE_RX, i, &cfg);
-+ if (err) {
-+ netdev_err(priv->net_dev,
-+ "dpni_set_congestion_notification failed\n");
-+ return err;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
- static int dpaa2_eth_dcbnl_ieee_setpfc(struct net_device *net_dev,
- struct ieee_pfc *pfc)
- {
-@@ -3646,7 +3687,8 @@ static int dpaa2_eth_dcbnl_ieee_setpfc(s
- /* We allow PFC configuration even if it won't have any effect until
- * general pause frames are enabled
- */
-- if (!dpaa2_eth_rx_pause_enabled(priv->link_state.options))
-+ if (!dpaa2_eth_rx_pause_enabled(priv->link_state.options) ||
-+ !dpaa2_eth_tx_pause_enabled(priv->link_state.options))
- netdev_warn(net_dev, "Pause support must be enabled in order for PFC to work!\n");
-
- link_cfg.rate = priv->link_state.rate;
-@@ -3661,6 +3703,11 @@ static int dpaa2_eth_dcbnl_ieee_setpfc(s
- return err;
- }
-
-+ /* Configure congestion notifications for the enabled priorities */
-+ err = set_pfc_cn(priv, pfc->pfc_en);
-+ if (err)
-+ return err;
-+
- memcpy(&priv->pfc, pfc, sizeof(priv->pfc));
-
- return 0;
---- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
-+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h
-@@ -65,6 +65,17 @@
- #define DPAA2_ETH_CG_TAILDROP_THRESH(priv) \
- (1024 * dpaa2_eth_queue_count(priv) / dpaa2_eth_tc_count(priv))
-
-+/* Congestion group notification threshold: when this many frames accumulate
-+ * on the Rx queues belonging to the same TC, the MAC is instructed to send
-+ * PFC frames for that TC.
-+ * When number of pending frames drops below exit threshold transmission of
-+ * PFC frames is stopped.
-+ */
-+#define DPAA2_ETH_CN_THRESH_ENTRY(priv) \
-+ (DPAA2_ETH_CG_TAILDROP_THRESH(priv) / 2)
-+#define DPAA2_ETH_CN_THRESH_EXIT(priv) \
-+ (DPAA2_ETH_CN_THRESH_ENTRY(priv) * 3 / 4)
-+
- /* Maximum number of buffers that can be acquired/released through a single
- * QBMan command
- */
---- a/drivers/net/ethernet/freescale/dpaa2/dpni-cmd.h
-+++ b/drivers/net/ethernet/freescale/dpaa2/dpni-cmd.h
-@@ -601,4 +601,29 @@ struct dpni_cmd_remove_qos_entry {
- __le64 mask_iova;
- };
-
-+#define DPNI_DEST_TYPE_SHIFT 0
-+#define DPNI_DEST_TYPE_SIZE 4
-+#define DPNI_CONG_UNITS_SHIFT 4
-+#define DPNI_CONG_UNITS_SIZE 2
-+
-+struct dpni_cmd_set_congestion_notification {
-+ /* cmd word 0 */
-+ u8 qtype;
-+ u8 tc;
-+ u8 pad[6];
-+ /* cmd word 1 */
-+ __le32 dest_id;
-+ __le16 notification_mode;
-+ u8 dest_priority;
-+ /* from LSB: dest_type: 4 units:2 */
-+ u8 type_units;
-+ /* cmd word 2 */
-+ __le64 message_iova;
-+ /* cmd word 3 */
-+ __le64 message_ctx;
-+ /* cmd word 4 */
-+ __le32 threshold_entry;
-+ __le32 threshold_exit;
-+};
-+
- #endif /* _FSL_DPNI_CMD_H */
---- a/drivers/net/ethernet/freescale/dpaa2/dpni.c
-+++ b/drivers/net/ethernet/freescale/dpaa2/dpni.c
-@@ -1355,6 +1355,52 @@ int dpni_set_rx_tc_dist(struct fsl_mc_io
- }
-
- /**
-+ * dpni_set_congestion_notification() - Set traffic class congestion
-+ * notification configuration
-+ * @mc_io: Pointer to MC portal's I/O object
-+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
-+ * @token: Token of DPNI object
-+ * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported
-+ * @tc_id: Traffic class selection (0-7)
-+ * @cfg: Congestion notification configuration
-+ *
-+ * Return: '0' on Success; error code otherwise.
-+ */
-+int dpni_set_congestion_notification(
-+ struct fsl_mc_io *mc_io,
-+ u32 cmd_flags,
-+ u16 token,
-+ enum dpni_queue_type qtype,
-+ u8 tc_id,
-+ const struct dpni_congestion_notification_cfg *cfg)
-+{
-+ struct dpni_cmd_set_congestion_notification *cmd_params;
-+ struct fsl_mc_command cmd = { 0 };
-+
-+ /* prepare command */
-+ cmd.header =
-+ mc_encode_cmd_header(DPNI_CMDID_SET_CONGESTION_NOTIFICATION,
-+ cmd_flags,
-+ token);
-+ cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
-+ cmd_params->qtype = qtype;
-+ cmd_params->tc = tc_id;
-+ cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
-+ cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
-+ cmd_params->dest_priority = cfg->dest_cfg.priority;
-+ dpni_set_field(cmd_params->type_units, DEST_TYPE,
-+ cfg->dest_cfg.dest_type);
-+ dpni_set_field(cmd_params->type_units, CONG_UNITS, cfg->units);
-+ cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
-+ cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
-+ cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
-+ cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
-+
-+ /* send command to mc*/
-+ return mc_send_command(mc_io, &cmd);
-+}
-+
-+/**
- * dpni_set_queue() - Set queue parameters
- * @mc_io: Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
---- a/drivers/net/ethernet/freescale/dpaa2/dpni.h
-+++ b/drivers/net/ethernet/freescale/dpaa2/dpni.h
-@@ -883,6 +883,62 @@ enum dpni_congestion_point {
- };
-
- /**
-+ * struct dpni_dest_cfg - Structure representing DPNI destination parameters
-+ * @dest_type: Destination type
-+ * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
-+ * @priority: Priority selection within the DPIO or DPCON channel; valid
-+ * values are 0-1 or 0-7, depending on the number of priorities
-+ * in that channel; not relevant for 'DPNI_DEST_NONE' option
-+ */
-+struct dpni_dest_cfg {
-+ enum dpni_dest dest_type;
-+ int dest_id;
-+ u8 priority;
-+};
-+
-+/* DPNI congestion options */
-+
-+/**
-+ * This congestion will trigger flow control or priority flow control.
-+ * This will have effect only if flow control is enabled with
-+ * dpni_set_link_cfg().
-+ */
-+#define DPNI_CONG_OPT_FLOW_CONTROL 0x00000040
-+
-+/**
-+ * struct dpni_congestion_notification_cfg - congestion notification
-+ * configuration
-+ * @units: Units type
-+ * @threshold_entry: Above this threshold we enter a congestion state.
-+ * set it to '0' to disable it
-+ * @threshold_exit: Below this threshold we exit the congestion state.
-+ * @message_ctx: The context that will be part of the CSCN message
-+ * @message_iova: I/O virtual address (must be in DMA-able memory),
-+ * must be 16B aligned; valid only if 'DPNI_CONG_OPT_WRITE_MEM_<X>'
-+ * is contained in 'options'
-+ * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel
-+ * @notification_mode: Mask of available options; use 'DPNI_CONG_OPT_<X>' values
-+ */
-+
-+struct dpni_congestion_notification_cfg {
-+ enum dpni_congestion_unit units;
-+ u32 threshold_entry;
-+ u32 threshold_exit;
-+ u64 message_ctx;
-+ u64 message_iova;
-+ struct dpni_dest_cfg dest_cfg;
-+ u16 notification_mode;
-+};
-+
-+int dpni_set_congestion_notification(
-+ struct fsl_mc_io *mc_io,
-+ u32 cmd_flags,
-+ u16 token,
-+ enum dpni_queue_type qtype,
-+ u8 tc_id,
-+ const struct dpni_congestion_notification_cfg *cfg);
-+
-+/**
- * struct dpni_taildrop - Structure representing the taildrop
- * @enable: Indicates whether the taildrop is active or not.
- * @units: Indicates the unit of THRESHOLD. Queue taildrop only supports