| 230 | } |
| 231 | |
| 232 | int |
| 233 | rte_bbdev_release(struct rte_bbdev *bbdev) |
| 234 | { |
| 235 | uint16_t dev_id; |
| 236 | struct rte_bbdev_callback *cb, *next; |
| 237 | |
| 238 | if (bbdev == NULL) { |
| 239 | rte_bbdev_log(ERR, "NULL bbdev"); |
| 240 | return -ENODEV; |
| 241 | } |
| 242 | dev_id = bbdev->data->dev_id; |
| 243 | |
| 244 | /* free all callbacks from the device's list */ |
| 245 | for (cb = TAILQ_FIRST(&bbdev->list_cbs); cb != NULL; cb = next) { |
| 246 | |
| 247 | next = TAILQ_NEXT(cb, next); |
| 248 | TAILQ_REMOVE(&(bbdev->list_cbs), cb, next); |
| 249 | rte_free(cb); |
| 250 | } |
| 251 | |
| 252 | /* clear shared BBDev Data if no process is using the device anymore */ |
| 253 | if (rte_atomic_fetch_sub_explicit(&bbdev->data->process_cnt, 1, |
| 254 | rte_memory_order_relaxed) - 1 == 0) |
| 255 | memset(bbdev->data, 0, sizeof(*bbdev->data)); |
| 256 | |
| 257 | memset(bbdev, 0, sizeof(*bbdev)); |
| 258 | num_devs--; |
| 259 | bbdev->state = RTE_BBDEV_UNUSED; |
| 260 | |
| 261 | rte_bbdev_log_debug( |
| 262 | "Un-initialised device id = %u. Num devices = %u", |
| 263 | dev_id, num_devs); |
| 264 | return 0; |
| 265 | } |
| 266 | |
| 267 | struct rte_bbdev * |
| 268 | rte_bbdev_get_named_dev(const char *name) |