Lines Matching refs:wusbhc
45 int wusbhc_mmcie_create(struct wusbhc *wusbhc) in wusbhc_mmcie_create() argument
47 u8 mmcies = wusbhc->mmcies_max; in wusbhc_mmcie_create()
48 wusbhc->mmcie = kcalloc(mmcies, sizeof(wusbhc->mmcie[0]), GFP_KERNEL); in wusbhc_mmcie_create()
49 if (wusbhc->mmcie == NULL) in wusbhc_mmcie_create()
51 mutex_init(&wusbhc->mmcie_mutex); in wusbhc_mmcie_create()
56 void wusbhc_mmcie_destroy(struct wusbhc *wusbhc) in wusbhc_mmcie_destroy() argument
58 kfree(wusbhc->mmcie); in wusbhc_mmcie_destroy()
94 int wusbhc_mmcie_set(struct wusbhc *wusbhc, u8 interval, u8 repeat_cnt, in wusbhc_mmcie_set() argument
101 mutex_lock(&wusbhc->mmcie_mutex); in wusbhc_mmcie_set()
105 handle = wusbhc->mmcies_max - 1; in wusbhc_mmcie_set()
108 dev_err(wusbhc->dev, "Special ordering case for WUIE ID 0x%x " in wusbhc_mmcie_set()
115 for (itr = 0; itr < wusbhc->mmcies_max - 1; itr++) { in wusbhc_mmcie_set()
116 if (wusbhc->mmcie[itr] == wuie) { in wusbhc_mmcie_set()
120 if (wusbhc->mmcie[itr] == NULL) in wusbhc_mmcie_set()
126 result = (wusbhc->mmcie_add)(wusbhc, interval, repeat_cnt, handle, in wusbhc_mmcie_set()
129 wusbhc->mmcie[handle] = wuie; in wusbhc_mmcie_set()
131 mutex_unlock(&wusbhc->mmcie_mutex); in wusbhc_mmcie_set()
141 void wusbhc_mmcie_rm(struct wusbhc *wusbhc, struct wuie_hdr *wuie) in wusbhc_mmcie_rm() argument
146 mutex_lock(&wusbhc->mmcie_mutex); in wusbhc_mmcie_rm()
147 for (itr = 0; itr < wusbhc->mmcies_max; itr++) { in wusbhc_mmcie_rm()
148 if (wusbhc->mmcie[itr] == wuie) { in wusbhc_mmcie_rm()
153 mutex_unlock(&wusbhc->mmcie_mutex); in wusbhc_mmcie_rm()
157 result = (wusbhc->mmcie_rm)(wusbhc, handle); in wusbhc_mmcie_rm()
159 wusbhc->mmcie[itr] = NULL; in wusbhc_mmcie_rm()
160 mutex_unlock(&wusbhc->mmcie_mutex); in wusbhc_mmcie_rm()
164 static int wusbhc_mmc_start(struct wusbhc *wusbhc) in wusbhc_mmc_start() argument
168 mutex_lock(&wusbhc->mutex); in wusbhc_mmc_start()
169 ret = wusbhc->start(wusbhc); in wusbhc_mmc_start()
171 wusbhc->active = 1; in wusbhc_mmc_start()
172 mutex_unlock(&wusbhc->mutex); in wusbhc_mmc_start()
177 static void wusbhc_mmc_stop(struct wusbhc *wusbhc) in wusbhc_mmc_stop() argument
179 mutex_lock(&wusbhc->mutex); in wusbhc_mmc_stop()
180 wusbhc->active = 0; in wusbhc_mmc_stop()
181 wusbhc->stop(wusbhc, WUSB_CHANNEL_STOP_DELAY_MS); in wusbhc_mmc_stop()
182 mutex_unlock(&wusbhc->mutex); in wusbhc_mmc_stop()
192 int wusbhc_start(struct wusbhc *wusbhc) in wusbhc_start() argument
195 struct device *dev = wusbhc->dev; in wusbhc_start()
197 WARN_ON(wusbhc->wuie_host_info != NULL); in wusbhc_start()
198 BUG_ON(wusbhc->uwb_rc == NULL); in wusbhc_start()
200 result = wusbhc_rsv_establish(wusbhc); in wusbhc_start()
207 result = wusbhc_devconnect_start(wusbhc); in wusbhc_start()
214 result = wusbhc_sec_start(wusbhc); in wusbhc_start()
221 result = wusbhc->set_num_dnts(wusbhc, wusbhc->dnts_interval, in wusbhc_start()
222 wusbhc->dnts_num_slots); in wusbhc_start()
227 result = wusbhc_mmc_start(wusbhc); in wusbhc_start()
236 wusbhc_sec_stop(wusbhc); in wusbhc_start()
239 wusbhc_devconnect_stop(wusbhc); in wusbhc_start()
241 wusbhc_rsv_terminate(wusbhc); in wusbhc_start()
252 void wusbhc_stop(struct wusbhc *wusbhc) in wusbhc_stop() argument
254 wusbhc_mmc_stop(wusbhc); in wusbhc_stop()
255 wusbhc_sec_stop(wusbhc); in wusbhc_stop()
256 wusbhc_devconnect_stop(wusbhc); in wusbhc_stop()
257 wusbhc_rsv_terminate(wusbhc); in wusbhc_stop()
267 int wusbhc_chid_set(struct wusbhc *wusbhc, const struct wusb_ckhdid *chid) in wusbhc_chid_set() argument
274 mutex_lock(&wusbhc->mutex); in wusbhc_chid_set()
276 if (wusbhc->active) { in wusbhc_chid_set()
277 mutex_unlock(&wusbhc->mutex); in wusbhc_chid_set()
280 wusbhc->chid = *chid; in wusbhc_chid_set()
285 if ((chid) && (wusbhc->uwb_rc == NULL)) { in wusbhc_chid_set()
286 wusbhc->uwb_rc = uwb_rc_get_by_grandpa(wusbhc->dev->parent); in wusbhc_chid_set()
287 if (wusbhc->uwb_rc == NULL) { in wusbhc_chid_set()
289 dev_err(wusbhc->dev, in wusbhc_chid_set()
294 result = wusbhc_pal_register(wusbhc); in wusbhc_chid_set()
296 dev_err(wusbhc->dev, "Cannot register as a UWB PAL\n"); in wusbhc_chid_set()
300 mutex_unlock(&wusbhc->mutex); in wusbhc_chid_set()
303 result = uwb_radio_start(&wusbhc->pal); in wusbhc_chid_set()
304 else if (wusbhc->uwb_rc) in wusbhc_chid_set()
305 uwb_radio_stop(&wusbhc->pal); in wusbhc_chid_set()
310 uwb_rc_put(wusbhc->uwb_rc); in wusbhc_chid_set()
311 wusbhc->uwb_rc = NULL; in wusbhc_chid_set()
313 mutex_unlock(&wusbhc->mutex); in wusbhc_chid_set()