/** * Stop advertising state machine * * Context: Link Layer task. * * @param advsm */ static void ble_ll_adv_sm_stop(struct ble_ll_adv_sm *advsm) { os_sr_t sr; if (advsm->enabled) { /* Remove any scheduled advertising items */ ble_ll_sched_rmv_elem(&advsm->adv_sch); /* Set to standby if we are no longer advertising */ OS_ENTER_CRITICAL(sr); if (ble_ll_state_get() == BLE_LL_STATE_ADV) { ble_phy_disable(); ble_ll_wfr_disable(); ble_ll_state_set(BLE_LL_STATE_STANDBY); } OS_EXIT_CRITICAL(sr); os_eventq_remove(&g_ble_ll_data.ll_evq, &advsm->adv_txdone_ev); /* If there is an event buf we need to free it */ if (advsm->conn_comp_ev) { ble_hci_trans_buf_free(advsm->conn_comp_ev); advsm->conn_comp_ev = NULL; } /* Disable advertising */ advsm->enabled = 0; } }
int ble_hs_hci_evt_process(uint8_t *data) { const struct ble_hs_hci_evt_dispatch_entry *entry; uint8_t event_code; uint8_t param_len; int event_len; int rc; /* Count events received */ STATS_INC(ble_hs_stats, hci_event); /* Display to console */ ble_hs_dbg_event_disp(data); /* Process the event */ event_code = data[0]; param_len = data[1]; event_len = param_len + 2; entry = ble_hs_hci_evt_dispatch_find(event_code); if (entry == NULL) { STATS_INC(ble_hs_stats, hci_unknown_event); rc = BLE_HS_ENOTSUP; } else { rc = entry->cb(event_code, data, event_len); } ble_hci_trans_buf_free(data); return rc; }