result = i1480u_rx_setup(i1480u);               /* Alloc RX stuff */
        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);;
                goto error_notif_urb_submit;
        }
 #endif
-       i1480u->uwb_notifs_handler.cb = i1480u_uwb_notifs_cb;
-       i1480u->uwb_notifs_handler.data = i1480u;
-       if (uwb_bg_joined(rc))
-               netif_carrier_on(net_dev);
-       else
-               netif_carrier_off(net_dev);
-       uwb_notifs_register(rc, &i1480u->uwb_notifs_handler);
        /* Interface is up with an address, now we can create WSS */
        result = wlp_wss_setup(net_dev, &wlp->wss);
        if (result < 0) {
                dev_err(dev, "Can't create WSS: %d. \n", result);
-               goto error_notif_deregister;
+               goto error_wss_setup;
        }
        return 0;
-error_notif_deregister:
-       uwb_notifs_deregister(rc, &i1480u->uwb_notifs_handler);
+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:
 {
        struct i1480u *i1480u = netdev_priv(net_dev);
        struct wlp *wlp = &i1480u->wlp;
-       struct uwb_rc *rc = wlp->rc;
 
        BUG_ON(wlp->rc == NULL);
        wlp_wss_remove(&wlp->wss);
-       uwb_notifs_deregister(rc, &i1480u->uwb_notifs_handler);
        netif_carrier_off(net_dev);
 #ifdef i1480u_FLOW_CONTROL
        usb_kill_urb(i1480u->notif_urb);
 #endif
        netif_stop_queue(net_dev);
+       uwb_radio_stop(&wlp->pal);
        i1480u_rx_release(i1480u);
        i1480u_tx_release(i1480u);
        return 0;
        return 0;
 }
 
-
-/**
- * Callback function to handle events from UWB
- * When we see other devices we know the carrier is ok,
- * if we are the only device in the beacon group we set the carrier
- * state to off.
- * */
-void i1480u_uwb_notifs_cb(void *data, struct uwb_dev *uwb_dev,
-                         enum uwb_notifs event)
-{
-       struct i1480u *i1480u = data;
-       struct net_device *net_dev = i1480u->net_dev;
-       struct device *dev = &i1480u->usb_iface->dev;
-       switch (event) {
-       case UWB_NOTIF_BG_JOIN:
-               netif_carrier_on(net_dev);
-               dev_info(dev, "Link is up\n");
-               break;
-       case UWB_NOTIF_BG_LEAVE:
-               netif_carrier_off(net_dev);
-               dev_info(dev, "Link is down\n");
-               break;
-       default:
-               dev_err(dev, "don't know how to handle event %d from uwb\n",
-                               event);
-       }
-}
-
 /**
  * Stop the network queue
  *
 
        }
 }
 
-int wlp_setup(struct wlp *wlp, struct uwb_rc *rc)
+static void wlp_channel_changed(struct uwb_pal *pal, int channel)
+{
+       struct wlp *wlp = container_of(pal, struct wlp, pal);
+
+       if (channel < 0)
+               netif_carrier_off(wlp->ndev);
+       else
+               netif_carrier_on(wlp->ndev);
+}
+
+int wlp_setup(struct wlp *wlp, struct uwb_rc *rc, struct net_device *ndev)
 {
        struct device *dev = &rc->uwb_dev.dev;
        int result;
        BUG_ON(wlp->stop_queue == NULL);
        BUG_ON(wlp->start_queue == NULL);
        wlp->rc = rc;
+       wlp->ndev = ndev;
        wlp_eda_init(&wlp->eda);/* Set up address cache */
        wlp->uwb_notifs_handler.cb = wlp_uwb_notifs_cb;
        wlp->uwb_notifs_handler.data = wlp;
 
        uwb_pal_init(&wlp->pal);
        wlp->pal.rc = rc;
+       wlp->pal.channel_changed = wlp_channel_changed;
        result = uwb_pal_register(&wlp->pal);
        if (result < 0)
                uwb_notifs_deregister(wlp->rc, &wlp->uwb_notifs_handler);
 
 struct wlp {
        struct mutex mutex;
        struct uwb_rc *rc;              /* UWB radio controller */
+       struct net_device *ndev;
        struct uwb_pal pal;
        struct wlp_eda eda;
        struct wlp_uuid uuid;
 static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode,        \
                                                          _show, _store)
 
-extern int wlp_setup(struct wlp *, struct uwb_rc *);
+extern int wlp_setup(struct wlp *, struct uwb_rc *, struct net_device *ndev);
 extern void wlp_remove(struct wlp *);
 extern ssize_t wlp_neighborhood_show(struct wlp *, char *);
 extern int wlp_wss_setup(struct net_device *, struct wlp_wss *);