int i1480u_open(struct net_device *net_dev) { int result; struct i1480u *i1480u = netdev_priv(net_dev); struct wlp *wlp = &i1480u->wlp; struct uwb_rc *rc; struct device *dev = &i1480u->usb_iface->dev; rc = wlp->rc; result = i1480u_rx_setup(i1480u); if (result < 0) goto error_rx_setup; result = uwb_radio_start(&wlp->pal); if (result < 0) goto error_radio_start; netif_wake_queue(net_dev); #ifdef i1480u_FLOW_CONTROL result = usb_submit_urb(i1480u->notif_urb, GFP_KERNEL); if (result < 0) { dev_err(dev, "Can't submit notification URB: %d\n", result); goto error_notif_urb_submit; } #endif result = wlp_wss_setup(net_dev, &wlp->wss); if (result < 0) { dev_err(dev, "Can't create WSS: %d. \n", result); goto error_wss_setup; } return 0; error_wss_setup: #ifdef i1480u_FLOW_CONTROL usb_kill_urb(i1480u->notif_urb); error_notif_urb_submit: #endif uwb_radio_stop(&wlp->pal); error_radio_start: netif_stop_queue(net_dev); i1480u_rx_release(i1480u); error_rx_setup: return result; }
/* * Set/reset/update a new CHID * * Depending on the previous state of the MMCs, start, stop or change * the sent MMC. This effectively switches the host controller on and * off (radio wise). */ int wusbhc_chid_set(struct wusbhc *wusbhc, const struct wusb_ckhdid *chid) { int result = 0; if (memcmp(chid, &wusb_ckhdid_zero, sizeof(*chid)) == 0) chid = NULL; mutex_lock(&wusbhc->mutex); if (chid) { if (wusbhc->active) { mutex_unlock(&wusbhc->mutex); return -EBUSY; } wusbhc->chid = *chid; } mutex_unlock(&wusbhc->mutex); if (chid) result = uwb_radio_start(&wusbhc->pal); else uwb_radio_stop(&wusbhc->pal); return result; }