Przeglądaj źródła

qcacmn: Create new interrupt mask for msi

Created a new interrupt mask for msi chipsets so that both ahb
and pci chipsets can work together.

Change-Id: I78d1b9641e58f07d1582152c691c5ae29e6ddb03
Nandha Kishore Easwaran 5 lat temu
rodzic
commit
bd98e6205e
4 zmienionych plików z 175 dodań i 49 usunięć
  1. 3 2
      dp/wifi3.0/dp_main.c
  2. 3 3
      dp/wifi3.0/dp_types.h
  3. 157 43
      wlan_cfg/wlan_cfg.c
  4. 12 1
      wlan_cfg/wlan_cfg.h

+ 3 - 2
dp/wifi3.0/dp_main.c

@@ -1696,7 +1696,7 @@ static void dp_soc_set_interrupt_mode(struct dp_soc *soc)
 	uint32_t msi_base_data, msi_vector_start;
 	int msi_vector_count, ret;
 
-	soc->intr_mode = DP_INTR_LEGACY;
+	soc->intr_mode = DP_INTR_INTEGRATED;
 
 	if (!(soc->wlan_cfg_ctx->napi_enabled) ||
 	    (soc->cdp_soc.ol_ops->get_con_mode &&
@@ -1784,7 +1784,7 @@ static void dp_soc_interrupt_map_calculate_integrated(struct dp_soc *soc,
 	int host2rxdma_mon_ring_mask = wlan_cfg_get_host2rxdma_mon_ring_mask(
 					soc->wlan_cfg_ctx, intr_ctx_num);
 
-	soc->intr_mode = DP_INTR_LEGACY;
+	soc->intr_mode = DP_INTR_INTEGRATED;
 
 	for (j = 0; j < HIF_MAX_GRP_IRQ; j++) {
 
@@ -10606,6 +10606,7 @@ void *dp_soc_init(struct dp_soc *dpsoc, HTC_HANDLE htc_handle,
 	}
 
 	dp_soc_set_interrupt_mode(soc);
+	wlan_cfg_fill_interrupt_mask(soc->wlan_cfg_ctx, soc->intr_mode);
 	wlan_cfg_set_rx_hash(soc->wlan_cfg_ctx,
 			     cfg_get(soc->ctrl_psoc, CFG_DP_RX_HASH));
 	soc->cce_disable = false;

+ 3 - 3
dp/wifi3.0/dp_types.h

@@ -200,12 +200,12 @@ enum dp_fl_ctrl_threshold {
 
 /**
  * enum dp_intr_mode
- * @DP_INTR_LEGACY: Legacy/Line interrupts, for WIN
- * @DP_INTR_MSI: MSI interrupts, for MCL
+ * @DP_INTR_INTEGRATED: Line interrupts
+ * @DP_INTR_MSI: MSI interrupts
  * @DP_INTR_POLL: Polling
  */
 enum dp_intr_mode {
-	DP_INTR_LEGACY = 0,
+	DP_INTR_INTEGRATED = 0,
 	DP_INTR_MSI,
 	DP_INTR_POLL,
 };

+ 157 - 43
wlan_cfg/wlan_cfg.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -28,6 +28,7 @@
 #include "wlan_cfg.h"
 #include "cfg_ucfg_api.h"
 #include "hal_api.h"
+#include "dp_types.h"
 
 /*
  * FIX THIS -
@@ -91,48 +92,129 @@
 #define WLAN_CFG_HOST2RXDMA_RING_MASK_3 0x0
 
 #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
-static const int tx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	WLAN_CFG_TX_RING_MASK_0, 0, 0, 0, 0, 0, 0};
 
 #ifndef IPA_OFFLOAD
-static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1, WLAN_CFG_RX_RING_MASK_2, WLAN_CFG_RX_RING_MASK_3, 0, 0};
 #else
-static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1, WLAN_CFG_RX_RING_MASK_2, 0, 0, 0};
 #endif
 
-static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, WLAN_CFG_RX_MON_RING_MASK_0, WLAN_CFG_RX_MON_RING_MASK_1, 0, 0, 0, 0};
 
-static const int host2rxdma_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int host2rxdma_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, 0};
 
-static const int rxdma2host_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, WLAN_CFG_RXDMA2HOST_RING_MASK_0, WLAN_CFG_RXDMA2HOST_RING_MASK_1};
 
-static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int host2rxdma_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, 0};
 
-static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rxdma2host_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, 0};
 
-static const int rx_err_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_err_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, WLAN_CFG_RX_ERR_RING_MASK_0};
 
-static const int rx_wbm_rel_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_wbm_rel_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, WLAN_CFG_RX_WBM_REL_RING_MASK_0};
 
-static const int reo_status_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 	0, 0, 0, 0, 0, 0, WLAN_CFG_REO_STATUS_RING_MASK_0};
+
+static const int tx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rx_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int host2rxdma_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rxdma2host_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int host2rxdma_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rxdma2host_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rx_err_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int rx_wbm_rel_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
+static const int reo_status_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+	0, 0, 0, 0, 0, 0, 0};
+
 #else
-static const int tx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+
+static const int tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
 						WLAN_CFG_TX_RING_MASK_0,
 						WLAN_CFG_TX_RING_MASK_1,
 						WLAN_CFG_TX_RING_MASK_2,
 						WLAN_CFG_TX_RING_MASK_3};
 
-static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_RX_RING_MASK_0,
+					WLAN_CFG_RX_RING_MASK_1,
+					WLAN_CFG_RX_RING_MASK_2,
+					WLAN_CFG_RX_RING_MASK_3};
+
+static const int rx_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					0, 0, 0};
+
+static const int host2rxdma_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					0, 0, 0, 0};
+
+static const int rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					0, 0, 0, 0};
+
+static const int host2rxdma_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_HOST2RXDMA_MON_RING_MASK_0,
+					WLAN_CFG_HOST2RXDMA_MON_RING_MASK_1,
+					WLAN_CFG_HOST2RXDMA_MON_RING_MASK_2};
+
+static const int rxdma2host_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_RXDMA2HOST_MON_RING_MASK_0,
+					WLAN_CFG_RXDMA2HOST_MON_RING_MASK_1,
+					WLAN_CFG_RXDMA2HOST_MON_RING_MASK_2};
+
+static const int rx_err_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_RX_ERR_RING_MASK_0,
+					WLAN_CFG_RX_ERR_RING_MASK_1,
+					WLAN_CFG_RX_ERR_RING_MASK_2,
+					WLAN_CFG_RX_ERR_RING_MASK_3};
+
+static const int rx_wbm_rel_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_RX_WBM_REL_RING_MASK_0,
+					WLAN_CFG_RX_WBM_REL_RING_MASK_1,
+					WLAN_CFG_RX_WBM_REL_RING_MASK_2,
+					WLAN_CFG_RX_WBM_REL_RING_MASK_3};
+
+static const int reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
+					WLAN_CFG_REO_STATUS_RING_MASK_0,
+					WLAN_CFG_REO_STATUS_RING_MASK_1,
+					WLAN_CFG_REO_STATUS_RING_MASK_2,
+					WLAN_CFG_REO_STATUS_RING_MASK_3};
+
+static const int tx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
+						WLAN_CFG_TX_RING_MASK_0,
+						WLAN_CFG_TX_RING_MASK_1,
+						WLAN_CFG_TX_RING_MASK_2,
+						WLAN_CFG_TX_RING_MASK_3};
+
+static const int rx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					0,
 					0,
 					0,
@@ -145,7 +227,7 @@ static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RX_RING_MASK_2,
 					WLAN_CFG_RX_RING_MASK_3};
 
-static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					0,
 					0,
 					0,
@@ -154,19 +236,19 @@ static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RX_MON_RING_MASK_1,
 					WLAN_CFG_RX_MON_RING_MASK_2};
 
-static const int host2rxdma_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int host2rxdma_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_HOST2RXDMA_RING_MASK_0,
 					WLAN_CFG_HOST2RXDMA_RING_MASK_1,
 					WLAN_CFG_HOST2RXDMA_RING_MASK_2,
 					WLAN_CFG_HOST2RXDMA_RING_MASK_3};
 
-static const int rxdma2host_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rxdma2host_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RXDMA2HOST_RING_MASK_0,
 					WLAN_CFG_RXDMA2HOST_RING_MASK_1,
 					WLAN_CFG_RXDMA2HOST_RING_MASK_2,
 					WLAN_CFG_RXDMA2HOST_RING_MASK_3};
 
-static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int host2rxdma_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					0,
 					0,
 					0,
@@ -175,7 +257,7 @@ static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_HOST2RXDMA_MON_RING_MASK_1,
 					WLAN_CFG_HOST2RXDMA_MON_RING_MASK_2};
 
-static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rxdma2host_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					0,
 					0,
 					0,
@@ -184,19 +266,19 @@ static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RXDMA2HOST_MON_RING_MASK_1,
 					WLAN_CFG_RXDMA2HOST_MON_RING_MASK_2};
 
-static const int rx_err_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_err_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RX_ERR_RING_MASK_0,
 					WLAN_CFG_RX_ERR_RING_MASK_1,
 					WLAN_CFG_RX_ERR_RING_MASK_2,
 					WLAN_CFG_RX_ERR_RING_MASK_3};
 
-static const int rx_wbm_rel_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int rx_wbm_rel_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_RX_WBM_REL_RING_MASK_0,
 					WLAN_CFG_RX_WBM_REL_RING_MASK_1,
 					WLAN_CFG_RX_WBM_REL_RING_MASK_2,
 					WLAN_CFG_RX_WBM_REL_RING_MASK_3};
 
-static const int reo_status_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = {
+static const int reo_status_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = {
 					WLAN_CFG_REO_STATUS_RING_MASK_0,
 					WLAN_CFG_REO_STATUS_RING_MASK_1,
 					WLAN_CFG_REO_STATUS_RING_MASK_2,
@@ -287,6 +369,59 @@ static const uint8_t rx_fst_toeplitz_key[WLAN_CFG_RX_FST_TOEPLITZ_KEYLEN] = {
 	0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
 };
 
+void wlan_cfg_fill_interrupt_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
+				     int interrupt_mode) {
+	int i = 0;
+
+	if (interrupt_mode == DP_INTR_INTEGRATED) {
+		for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
+			wlan_cfg_ctx->int_tx_ring_mask[i] =
+					tx_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rx_ring_mask[i] =
+					rx_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rx_mon_ring_mask[i] =
+				rx_mon_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rx_err_ring_mask[i] =
+				rx_err_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] =
+					rx_wbm_rel_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_reo_status_ring_mask[i] =
+					reo_status_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rxdma2host_ring_mask[i] =
+				rxdma2host_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_host2rxdma_ring_mask[i] =
+				host2rxdma_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] =
+				host2rxdma_mon_ring_mask_integrated[i];
+			wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] =
+				rxdma2host_mon_ring_mask_integrated[i];
+		}
+	} else if (interrupt_mode == DP_INTR_MSI){
+		for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
+			wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rx_ring_mask[i] = rx_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rx_mon_ring_mask[i] =
+				rx_mon_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rx_err_ring_mask[i] =
+				rx_err_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] =
+						rx_wbm_rel_ring_mask_msi[i];
+			wlan_cfg_ctx->int_reo_status_ring_mask[i] =
+						reo_status_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rxdma2host_ring_mask[i] =
+				rxdma2host_ring_mask_msi[i];
+			wlan_cfg_ctx->int_host2rxdma_ring_mask[i] =
+				host2rxdma_ring_mask_msi[i];
+			wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] =
+				host2rxdma_mon_ring_mask_msi[i];
+			wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] =
+				rxdma2host_mon_ring_mask_msi[i];
+		}
+	} else {
+		qdf_err("Interrupt mode %d", interrupt_mode);
+	}
+}
+
 /**
  * wlan_cfg_soc_attach() - Allocate and prepare SoC configuration
  * @psoc - Object manager psoc
@@ -295,8 +430,6 @@ static const uint8_t rx_fst_toeplitz_key[WLAN_CFG_RX_FST_TOEPLITZ_KEYLEN] = {
 struct wlan_cfg_dp_soc_ctxt *
 wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
 {
-	int i = 0;
-
 	struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx =
 		qdf_mem_malloc(sizeof(struct wlan_cfg_dp_soc_ctxt));
 
@@ -341,25 +474,6 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
 	wlan_cfg_ctx->int_timer_threshold_other =
 		cfg_get(psoc, CFG_DP_INT_TIMER_THRESHOLD_OTHER);
 
-	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
-		wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_mask[i];
-		wlan_cfg_ctx->int_rx_ring_mask[i] = rx_ring_mask[i];
-		wlan_cfg_ctx->int_rx_mon_ring_mask[i] = rx_mon_ring_mask[i];
-		wlan_cfg_ctx->int_rx_err_ring_mask[i] = rx_err_ring_mask[i];
-		wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] =
-					rx_wbm_rel_ring_mask[i];
-		wlan_cfg_ctx->int_reo_status_ring_mask[i] =
-					reo_status_ring_mask[i];
-		wlan_cfg_ctx->int_rxdma2host_ring_mask[i] =
-			rxdma2host_ring_mask[i];
-		wlan_cfg_ctx->int_host2rxdma_ring_mask[i] =
-			host2rxdma_ring_mask[i];
-		wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] =
-			host2rxdma_mon_ring_mask[i];
-		wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] =
-			rxdma2host_mon_ring_mask[i];
-	}
-
 	/* This is default mapping and can be overridden by HW config
 	 * received from FW */
 	wlan_cfg_set_hw_macid(wlan_cfg_ctx, 0, 1);

+ 12 - 1
wlan_cfg/wlan_cfg.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -1230,4 +1230,15 @@ wlan_cfg_set_rx_mon_protocol_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg,
  */
 bool
 wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg);
+
+/**
+ * wlan_cfg_fill_interrupt_mask() - set interrupt mask
+ *
+ * @wlan_cfg_dp_soc_ctxt: soc configuration context
+ * @interrupt_mode: interrupt_mode: MSI/LEGACY
+ *
+ * Return: void
+ */
+void wlan_cfg_fill_interrupt_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
+				  int interrupt_mode);
 #endif