diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst
index d707a55..2b1edb5 100644
--- a/doc/guides/rel_notes/release_21_11.rst
+++ b/doc/guides/rel_notes/release_21_11.rst
@@ -83,6 +83,8 @@ API Changes
    This section is a comment. Do not overwrite or remove it.
    Also, make sure to start the actual text at the margin.
    =======================================================
+* bbdev: the experimental tag is dropped from the bbdev library, and its
+  interfaces are considered stable as of DPDK 21.11.
 
 
 ABI Changes
diff --git a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h
index 7017124..bff08a8 100644
--- a/lib/bbdev/rte_bbdev.h
+++ b/lib/bbdev/rte_bbdev.h
@@ -10,10 +10,6 @@
  *
  * Wireless base band device abstraction APIs.
  *
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
  * This API allows an application to discover, configure and use a device to
  * process operations. An asynchronous API (enqueue, followed by later dequeue)
  * is used for processing operations.
@@ -55,7 +51,6 @@ enum rte_bbdev_state {
  * @return
  *   The total number of usable devices.
  */
-__rte_experimental
 uint16_t
 rte_bbdev_count(void);
 
@@ -68,7 +63,6 @@ enum rte_bbdev_state {
  * @return
  *   true if device ID is valid and device is attached, false otherwise.
  */
-__rte_experimental
 bool
 rte_bbdev_is_valid(uint16_t dev_id);
 
@@ -82,7 +76,6 @@ enum rte_bbdev_state {
  *   - The next device, or
  *   - RTE_BBDEV_MAX_DEVS if none found
  */
-__rte_experimental
 uint16_t
 rte_bbdev_find_next(uint16_t dev_id);
 
@@ -112,7 +105,6 @@ enum rte_bbdev_state {
  *   - -EBUSY if the identified device has already started
  *   - -ENOMEM if unable to allocate memory
  */
-__rte_experimental
 int
 rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int socket_id);
 
@@ -130,7 +122,6 @@ enum rte_bbdev_state {
  *   - -EBUSY if the identified device has already started
  *   - -ENOTSUP if the interrupts are not supported by the device
  */
-__rte_experimental
 int
 rte_bbdev_intr_enable(uint16_t dev_id);
 
@@ -160,7 +151,6 @@ struct rte_bbdev_queue_conf {
  *   - EINVAL if the identified queue size or priority are invalid
  *   - EBUSY if the identified queue or its device have already started
  */
-__rte_experimental
 int
 rte_bbdev_queue_configure(uint16_t dev_id, uint16_t queue_id,
 		const struct rte_bbdev_queue_conf *conf);
@@ -176,7 +166,6 @@ struct rte_bbdev_queue_conf {
  *   - 0 on success
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_start(uint16_t dev_id);
 
@@ -190,7 +179,6 @@ struct rte_bbdev_queue_conf {
  * @return
  *   - 0 on success
  */
-__rte_experimental
 int
 rte_bbdev_stop(uint16_t dev_id);
 
@@ -204,7 +192,6 @@ struct rte_bbdev_queue_conf {
  * @return
  *   - 0 on success
  */
-__rte_experimental
 int
 rte_bbdev_close(uint16_t dev_id);
 
@@ -222,7 +209,6 @@ struct rte_bbdev_queue_conf {
  *   - 0 on success
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id);
 
@@ -238,7 +224,6 @@ struct rte_bbdev_queue_conf {
  *   - 0 on success
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id);
 
@@ -272,7 +257,6 @@ struct rte_bbdev_stats {
  *   - 0 on success
  *   - EINVAL if invalid parameter pointer is provided
  */
-__rte_experimental
 int
 rte_bbdev_stats_get(uint16_t dev_id, struct rte_bbdev_stats *stats);
 
@@ -284,7 +268,6 @@ struct rte_bbdev_stats {
  * @return
  *   - 0 on success
  */
-__rte_experimental
 int
 rte_bbdev_stats_reset(uint16_t dev_id);
 
@@ -347,7 +330,6 @@ struct rte_bbdev_info {
  *   - 0 on success
  *   - EINVAL if invalid parameter pointer is provided
  */
-__rte_experimental
 int
 rte_bbdev_info_get(uint16_t dev_id, struct rte_bbdev_info *dev_info);
 
@@ -374,7 +356,6 @@ struct rte_bbdev_queue_info {
  *   - 0 on success
  *   - EINVAL if invalid parameter pointer is provided
  */
-__rte_experimental
 int
 rte_bbdev_queue_info_get(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_queue_info *queue_info);
@@ -490,7 +471,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually enqueued (this is the number of processed
  *   entries in the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_enqueue_enc_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
@@ -521,7 +501,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually enqueued (this is the number of processed
  *   entries in the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_enqueue_dec_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
@@ -552,7 +531,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually enqueued (this is the number of processed
  *   entries in the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_enqueue_ldpc_enc_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
@@ -583,7 +561,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually enqueued (this is the number of processed
  *   entries in the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_enqueue_ldpc_dec_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
@@ -616,7 +593,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually dequeued (this is the number of entries
  *   copied into the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_dequeue_enc_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
@@ -649,7 +625,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   copied into the @p ops array).
  */
 
-__rte_experimental
 static inline uint16_t
 rte_bbdev_dequeue_dec_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
@@ -681,7 +656,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually dequeued (this is the number of entries
  *   copied into the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_dequeue_ldpc_enc_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
@@ -712,7 +686,6 @@ struct __rte_cache_aligned rte_bbdev {
  *   The number of operations actually dequeued (this is the number of entries
  *   copied into the @p ops array).
  */
-__rte_experimental
 static inline uint16_t
 rte_bbdev_dequeue_ldpc_dec_ops(uint16_t dev_id, uint16_t queue_id,
 		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
@@ -764,7 +737,6 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
  * @return
  *   Zero on success, negative value on failure.
  */
-__rte_experimental
 int
 rte_bbdev_callback_register(uint16_t dev_id, enum rte_bbdev_event_type event,
 		rte_bbdev_cb_fn cb_fn, void *cb_arg);
@@ -788,7 +760,6 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
  *   - EINVAL if invalid parameter pointer is provided
  *   - EAGAIN if the provided callback pointer does not exist
  */
-__rte_experimental
 int
 rte_bbdev_callback_unregister(uint16_t dev_id, enum rte_bbdev_event_type event,
 		rte_bbdev_cb_fn cb_fn, void *cb_arg);
@@ -809,7 +780,6 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
  *   - 0 on success
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_queue_intr_enable(uint16_t dev_id, uint16_t queue_id);
 
@@ -826,7 +796,6 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
  *   - 0 on success
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_queue_intr_disable(uint16_t dev_id, uint16_t queue_id);
 
@@ -854,7 +823,6 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
  *   - ENOTSUP if interrupts are not supported by the identified device
  *   - negative value on failure - as returned from PMD driver
  */
-__rte_experimental
 int
 rte_bbdev_queue_intr_ctl(uint16_t dev_id, uint16_t queue_id, int epfd, int op,
 		void *data);
diff --git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h
index f946842..ef3ecdb 100644
--- a/lib/bbdev/rte_bbdev_op.h
+++ b/lib/bbdev/rte_bbdev_op.h
@@ -9,9 +9,6 @@
  * @file rte_bbdev_op.h
  *
  * Defines wireless base band layer 1 operations and capabilities
- *
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
  */
 
 #ifdef __cplusplus
@@ -815,7 +812,6 @@ struct rte_bbdev_op_pool_private {
  *   Operation type as string or NULL if op_type is invalid
  *
  */
-__rte_experimental
 const char*
 rte_bbdev_op_type_str(enum rte_bbdev_op_type op_type);
 
@@ -839,7 +835,6 @@ struct rte_bbdev_op_pool_private {
  *   - Pointer to a mempool on success,
  *   - NULL pointer on failure.
  */
-__rte_experimental
 struct rte_mempool *
 rte_bbdev_op_pool_create(const char *name, enum rte_bbdev_op_type type,
 		unsigned int num_elements, unsigned int cache_size,
@@ -859,7 +854,6 @@ struct rte_mempool *
  *   - 0 on success
  *   - EINVAL if invalid mempool is provided
  */
-__rte_experimental
 static inline int
 rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool,
 		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
@@ -896,7 +890,6 @@ struct rte_mempool *
  *   - 0 on success
  *   - EINVAL if invalid mempool is provided
  */
-__rte_experimental
 static inline int
 rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool,
 		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
@@ -929,7 +922,6 @@ struct rte_mempool *
  * @param num_ops
  *   Number of structures
  */
-__rte_experimental
 static inline void
 rte_bbdev_dec_op_free_bulk(struct rte_bbdev_dec_op **ops, unsigned int num_ops)
 {
@@ -947,7 +939,6 @@ struct rte_mempool *
  * @param num_ops
  *   Number of structures
  */
-__rte_experimental
 static inline void
 rte_bbdev_enc_op_free_bulk(struct rte_bbdev_enc_op **ops, unsigned int num_ops)
 {
diff --git a/lib/bbdev/rte_bbdev_pmd.h b/lib/bbdev/rte_bbdev_pmd.h
index 237e336..dd0e359 100644
--- a/lib/bbdev/rte_bbdev_pmd.h
+++ b/lib/bbdev/rte_bbdev_pmd.h
@@ -10,9 +10,6 @@
  *
  * Wireless base band driver-facing APIs.
  *
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
  * This API provides the mechanism for device drivers to register with the
  * bbdev interface. User applications should not use this API.
  */
@@ -43,7 +40,6 @@
  * @return
  *   - Slot in the rte_bbdev array for a new device;
  */
-__rte_experimental
 struct rte_bbdev *
 rte_bbdev_allocate(const char *name);
 
@@ -56,7 +52,6 @@ struct rte_bbdev *
  * @return
  *   - 0 on success, negative on error
  */
-__rte_experimental
 int
 rte_bbdev_release(struct rte_bbdev *bbdev);
 
@@ -71,7 +66,6 @@ struct rte_bbdev *
  *   - NULL otherwise
  *
  */
-__rte_experimental
 struct rte_bbdev *
 rte_bbdev_get_named_dev(const char *name);
 
@@ -190,7 +184,6 @@ struct rte_bbdev_ops {
  * @param ret_param
  *   To pass data back to user application.
  */
-__rte_experimental
 void
 rte_bbdev_pmd_callback_process(struct rte_bbdev *dev,
 	enum rte_bbdev_event_type event, void *ret_param);
diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map
index 3624eb1..cce3f3c 100644
--- a/lib/bbdev/version.map
+++ b/lib/bbdev/version.map
@@ -1,4 +1,4 @@
-EXPERIMENTAL {
+DPDK_22 {
 	global:
 
 	rte_bbdev_allocate;
