Lines Matching +full:supported +full:- +full:hw

1 // SPDX-License-Identifier: GPL-2.0-only
3 * atusb.c - Driver for the ATUSB IEEE 802.15.4 dongle
7 * Copyright (c) 2015 - 2016 Stefan Schmidt <stefan@datenfreihafen.org>
12 * Written by: Dmitry Eremin-Solenikov <dmitry.baryshkov@siemens.com>
46 struct ieee802154_hw *hw; member
49 int shutdown; /* non-zero if shutting down */
77 /* ----- USB commands without data ----------------------------------------- */
80 * in atusb->err and reject all subsequent requests until the error is cleared.
88 struct usb_device *usb_dev = atusb->usb_dev; in atusb_control_msg()
91 if (atusb->err) in atusb_control_msg()
92 return atusb->err; in atusb_control_msg()
97 atusb->err = ret; in atusb_control_msg()
98 dev_err(&usb_dev->dev, in atusb_control_msg()
107 struct usb_device *usb_dev = atusb->usb_dev; in atusb_command()
109 dev_dbg(&usb_dev->dev, "%s: cmd = 0x%x\n", __func__, cmd); in atusb_command()
116 struct usb_device *usb_dev = atusb->usb_dev; in atusb_write_reg()
118 dev_dbg(&usb_dev->dev, "%s: 0x%02x <- 0x%02x\n", __func__, reg, value); in atusb_write_reg()
126 struct usb_device *usb_dev = atusb->usb_dev; in atusb_read_reg()
133 return -ENOMEM; in atusb_read_reg()
135 dev_dbg(&usb_dev->dev, "%s: reg = 0x%x\n", __func__, reg); in atusb_read_reg()
153 struct usb_device *usb_dev = atusb->usb_dev; in atusb_write_subreg()
157 dev_dbg(&usb_dev->dev, "%s: 0x%02x <- 0x%02x\n", __func__, reg, value); in atusb_write_subreg()
187 int err = atusb->err; in atusb_get_and_clear_error()
189 atusb->err = 0; in atusb_get_and_clear_error()
193 /* ----- skb allocation ---------------------------------------------------- */
198 #define SKB_ATUSB(skb) (*(struct atusb **)(skb)->cb)
204 struct usb_device *usb_dev = atusb->usb_dev; in atusb_submit_rx_urb()
205 struct sk_buff *skb = urb->context; in atusb_submit_rx_urb()
211 dev_warn_ratelimited(&usb_dev->dev, in atusb_submit_rx_urb()
213 return -ENOMEM; in atusb_submit_rx_urb()
220 skb->data, MAX_RX_XFER, atusb_in, skb); in atusb_submit_rx_urb()
221 usb_anchor_urb(urb, &atusb->rx_urbs); in atusb_submit_rx_urb()
227 urb->context = NULL; in atusb_submit_rx_urb()
236 struct usb_device *usb_dev = atusb->usb_dev; in atusb_work_urbs()
240 if (atusb->shutdown) in atusb_work_urbs()
244 urb = usb_get_from_anchor(&atusb->idle_urbs); in atusb_work_urbs()
250 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_work_urbs()
251 dev_warn_ratelimited(&usb_dev->dev, in atusb_work_urbs()
253 schedule_delayed_work(&atusb->work, in atusb_work_urbs()
257 /* ----- Asynchronous USB -------------------------------------------------- */
261 struct usb_device *usb_dev = atusb->usb_dev; in atusb_tx_done()
262 u8 expect = atusb->tx_ack_seq; in atusb_tx_done()
264 dev_dbg(&usb_dev->dev, "%s (0x%02x/0x%02x)\n", __func__, seq, expect); in atusb_tx_done()
267 ieee802154_xmit_complete(atusb->hw, atusb->tx_skb, false); in atusb_tx_done()
274 ieee802154_wake_queue(atusb->hw); in atusb_tx_done()
275 if (atusb->tx_skb) in atusb_tx_done()
276 dev_kfree_skb_irq(atusb->tx_skb); in atusb_tx_done()
282 struct usb_device *usb_dev = urb->dev; in atusb_in_good()
283 struct sk_buff *skb = urb->context; in atusb_in_good()
287 if (!urb->actual_length) { in atusb_in_good()
288 dev_dbg(&usb_dev->dev, "atusb_in: zero-sized URB ?\n"); in atusb_in_good()
292 len = *skb->data; in atusb_in_good()
294 if (urb->actual_length == 1) { in atusb_in_good()
299 if (len + 1 > urb->actual_length - 1) { in atusb_in_good()
300 dev_dbg(&usb_dev->dev, "atusb_in: frame len %d+1 > URB %u-1\n", in atusb_in_good()
301 len, urb->actual_length); in atusb_in_good()
306 dev_dbg(&usb_dev->dev, "atusb_in: frame corrupted\n"); in atusb_in_good()
310 lqi = skb->data[len + 1]; in atusb_in_good()
311 dev_dbg(&usb_dev->dev, "atusb_in: rx len %d lqi 0x%02x\n", len, lqi); in atusb_in_good()
314 ieee802154_rx_irqsafe(atusb->hw, skb, lqi); in atusb_in_good()
315 urb->context = NULL; /* skb is gone */ in atusb_in_good()
320 struct usb_device *usb_dev = urb->dev; in atusb_in()
321 struct sk_buff *skb = urb->context; in atusb_in()
324 dev_dbg(&usb_dev->dev, "%s: status %d len %d\n", __func__, in atusb_in()
325 urb->status, urb->actual_length); in atusb_in()
326 if (urb->status) { in atusb_in()
327 if (urb->status == -ENOENT) { /* being killed */ in atusb_in()
329 urb->context = NULL; in atusb_in()
332 dev_dbg(&usb_dev->dev, "%s: URB error %d\n", __func__, urb->status); in atusb_in()
337 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_in()
338 if (!atusb->shutdown) in atusb_in()
339 schedule_delayed_work(&atusb->work, 0); in atusb_in()
342 /* ----- URB allocation/deallocation --------------------------------------- */
349 urb = usb_get_from_anchor(&atusb->idle_urbs); in atusb_free_urbs()
352 kfree_skb(urb->context); in atusb_free_urbs()
365 return -ENOMEM; in atusb_alloc_urbs()
367 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_alloc_urbs()
369 n--; in atusb_alloc_urbs()
374 /* ----- IEEE 802.15.4 interface operations -------------------------------- */
378 dev_dbg(&urb->dev->dev, "atusb_xmit urb completed"); in atusb_xmit_complete()
381 static int atusb_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) in atusb_xmit() argument
383 struct atusb *atusb = hw->priv; in atusb_xmit()
384 struct usb_device *usb_dev = atusb->usb_dev; in atusb_xmit()
387 dev_dbg(&usb_dev->dev, "%s (%d)\n", __func__, skb->len); in atusb_xmit()
388 atusb->tx_skb = skb; in atusb_xmit()
389 atusb->tx_ack_seq++; in atusb_xmit()
390 atusb->tx_dr.wIndex = cpu_to_le16(atusb->tx_ack_seq); in atusb_xmit()
391 atusb->tx_dr.wLength = cpu_to_le16(skb->len); in atusb_xmit()
393 usb_fill_control_urb(atusb->tx_urb, usb_dev, in atusb_xmit()
395 (unsigned char *)&atusb->tx_dr, skb->data, in atusb_xmit()
396 skb->len, atusb_xmit_complete, NULL); in atusb_xmit()
397 ret = usb_submit_urb(atusb->tx_urb, GFP_ATOMIC); in atusb_xmit()
398 dev_dbg(&usb_dev->dev, "%s done (%d)\n", __func__, ret); in atusb_xmit()
402 static int atusb_ed(struct ieee802154_hw *hw, u8 *level) in atusb_ed() argument
409 static int atusb_set_hw_addr_filt(struct ieee802154_hw *hw, in atusb_set_hw_addr_filt() argument
413 struct atusb *atusb = hw->priv; in atusb_set_hw_addr_filt()
414 struct device *dev = &atusb->usb_dev->dev; in atusb_set_hw_addr_filt()
417 u16 addr = le16_to_cpu(filt->short_addr); in atusb_set_hw_addr_filt()
425 u16 pan = le16_to_cpu(filt->pan_id); in atusb_set_hw_addr_filt()
435 memcpy(addr, &filt->ieee_addr, IEEE802154_EXTENDED_ADDR_LEN); in atusb_set_hw_addr_filt()
443 if (filt->pan_coord) in atusb_set_hw_addr_filt()
452 static int atusb_start(struct ieee802154_hw *hw) in atusb_start() argument
454 struct atusb *atusb = hw->priv; in atusb_start()
455 struct usb_device *usb_dev = atusb->usb_dev; in atusb_start()
458 dev_dbg(&usb_dev->dev, "%s\n", __func__); in atusb_start()
459 schedule_delayed_work(&atusb->work, 0); in atusb_start()
463 usb_kill_anchored_urbs(&atusb->idle_urbs); in atusb_start()
467 static void atusb_stop(struct ieee802154_hw *hw) in atusb_stop() argument
469 struct atusb *atusb = hw->priv; in atusb_stop()
470 struct usb_device *usb_dev = atusb->usb_dev; in atusb_stop()
472 dev_dbg(&usb_dev->dev, "%s\n", __func__); in atusb_stop()
473 usb_kill_anchored_urbs(&atusb->idle_urbs); in atusb_stop()
480 300, 280, 230, 180, 130, 70, 0, -100, -200, -300, -400, -500, -700,
481 -900, -1200, -1700,
485 atusb_txpower(struct ieee802154_hw *hw, s32 mbm) in atusb_txpower() argument
487 struct atusb *atusb = hw->priv; in atusb_txpower()
489 if (atusb->data) in atusb_txpower()
490 return atusb->data->set_txpower(hw, mbm); in atusb_txpower()
492 return -ENOTSUPP; in atusb_txpower()
496 atusb_set_txpower(struct ieee802154_hw *hw, s32 mbm) in atusb_set_txpower() argument
498 struct atusb *atusb = hw->priv; in atusb_set_txpower()
501 for (i = 0; i < hw->phy->supported.tx_powers_size; i++) { in atusb_set_txpower()
502 if (hw->phy->supported.tx_powers[i] == mbm) in atusb_set_txpower()
506 return -EINVAL; in atusb_set_txpower()
510 hulusb_set_txpower(struct ieee802154_hw *hw, s32 mbm) in hulusb_set_txpower() argument
514 for (i = 0; i < hw->phy->supported.tx_powers_size; i++) { in hulusb_set_txpower()
515 if (hw->phy->supported.tx_powers[i] == mbm) in hulusb_set_txpower()
516 return atusb_write_subreg(hw->priv, SR_TX_PWR_212, i); in hulusb_set_txpower()
519 return -EINVAL; in hulusb_set_txpower()
524 -9100, -8900, -8700, -8500, -8300, -8100, -7900, -7700, -7500, -7300,
525 -7100, -6900, -6700, -6500, -6300, -6100,
530 500, 400, 300, 200, 100, 0, -100, -200, -300, -400, -500, -600, -700,
531 -800, -900, -1000, -1100, -1200, -1300, -1400, -1500, -1600, -1700,
532 -1800, -1900, -2000, -2100, -2200, -2300, -2400, -2500, -2600,
537 -10000, -9800, -9600, -9400, -9200, -9000, -8800, -8600, -8400, -8200,
538 -8000, -7800, -7600, -7400, -7200, -7000,
542 -9800, -9600, -9400, -9200, -9000, -8800, -8600, -8400, -8200, -8000,
543 -7800, -7600, -7400, -7200, -7000, -6800,
547 atusb_set_cca_mode(struct ieee802154_hw *hw, const struct wpan_phy_cca *cca) in atusb_set_cca_mode() argument
549 struct atusb *atusb = hw->priv; in atusb_set_cca_mode()
553 switch (cca->mode) { in atusb_set_cca_mode()
561 switch (cca->opt) { in atusb_set_cca_mode()
569 return -EINVAL; in atusb_set_cca_mode()
573 return -EINVAL; in atusb_set_cca_mode()
586 case -98: in hulusb_set_cca_ed_level()
587 lp->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_98; in hulusb_set_cca_ed_level()
588 lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_98); in hulusb_set_cca_ed_level()
589 lp->hw->phy->cca_ed_level = at86rf212_ed_levels_98[cca_ed_thres]; in hulusb_set_cca_ed_level()
591 case -100: in hulusb_set_cca_ed_level()
592 lp->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_100; in hulusb_set_cca_ed_level()
593 lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_100); in hulusb_set_cca_ed_level()
594 lp->hw->phy->cca_ed_level = at86rf212_ed_levels_100[cca_ed_thres]; in hulusb_set_cca_ed_level()
604 atusb_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm) in atusb_set_cca_ed_level() argument
606 struct atusb *atusb = hw->priv; in atusb_set_cca_ed_level()
609 for (i = 0; i < hw->phy->supported.cca_ed_levels_size; i++) { in atusb_set_cca_ed_level()
610 if (hw->phy->supported.cca_ed_levels[i] == mbm) in atusb_set_cca_ed_level()
614 return -EINVAL; in atusb_set_cca_ed_level()
617 static int atusb_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in atusb_channel() argument
619 struct atusb *atusb = hw->priv; in atusb_channel()
620 int ret = -ENOTSUPP; in atusb_channel()
622 if (atusb->data) { in atusb_channel()
623 ret = atusb->data->set_channel(hw, page, channel); in atusb_channel()
625 msleep(atusb->data->t_channel_switch); in atusb_channel()
631 static int atusb_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in atusb_set_channel() argument
633 struct atusb *atusb = hw->priv; in atusb_set_channel()
642 static int hulusb_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in hulusb_set_channel() argument
647 struct atusb *lp = hw->priv; in hulusb_set_channel()
658 rssi_base_val = -100; in hulusb_set_channel()
661 rssi_base_val = -98; in hulusb_set_channel()
680 /* SUB:0 and BPSK:0 -> BPSK-20 */ in hulusb_set_channel()
681 lp->hw->phy->symbol_duration = 50; in hulusb_set_channel()
683 /* SUB:1 and BPSK:0 -> BPSK-40 */ in hulusb_set_channel()
684 lp->hw->phy->symbol_duration = 25; in hulusb_set_channel()
688 /* SUB:0 and BPSK:1 -> OQPSK-100/200/400 */ in hulusb_set_channel()
689 lp->hw->phy->symbol_duration = 40; in hulusb_set_channel()
691 /* SUB:1 and BPSK:1 -> OQPSK-250/500/1000 */ in hulusb_set_channel()
692 lp->hw->phy->symbol_duration = 16; in hulusb_set_channel()
695 lp->hw->phy->lifs_period = IEEE802154_LIFS_PERIOD * in hulusb_set_channel()
696 lp->hw->phy->symbol_duration; in hulusb_set_channel()
697 lp->hw->phy->sifs_period = IEEE802154_SIFS_PERIOD * in hulusb_set_channel()
698 lp->hw->phy->symbol_duration; in hulusb_set_channel()
704 atusb_set_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be, u8 retries) in atusb_set_csma_params() argument
706 struct atusb *atusb = hw->priv; in atusb_set_csma_params()
721 hulusb_set_lbt(struct ieee802154_hw *hw, bool on) in hulusb_set_lbt() argument
723 struct atusb *atusb = hw->priv; in hulusb_set_lbt()
729 atusb_set_frame_retries(struct ieee802154_hw *hw, s8 retries) in atusb_set_frame_retries() argument
731 struct atusb *atusb = hw->priv; in atusb_set_frame_retries()
737 atusb_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on) in atusb_set_promiscuous_mode() argument
739 struct atusb *atusb = hw->priv; in atusb_set_promiscuous_mode()
765 .rssi_base_val = -91,
772 .rssi_base_val = -100,
794 /* ----- Firmware and chip version information ----------------------------- */
798 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_show_revision()
805 return -ENOMEM; in atusb_get_and_show_revision()
812 atusb->fw_ver_maj = buffer[0]; in atusb_get_and_show_revision()
813 atusb->fw_ver_min = buffer[1]; in atusb_get_and_show_revision()
814 atusb->fw_hw_type = buffer[2]; in atusb_get_and_show_revision()
816 switch (atusb->fw_hw_type) { in atusb_get_and_show_revision()
821 atusb->data = &atusb_chip_data; in atusb_get_and_show_revision()
825 atusb->data = &atusb_chip_data; in atusb_get_and_show_revision()
829 atusb->data = &hulusb_chip_data; in atusb_get_and_show_revision()
833 atusb->err = -ENOTSUPP; in atusb_get_and_show_revision()
834 ret = -ENOTSUPP; in atusb_get_and_show_revision()
838 dev_info(&usb_dev->dev, in atusb_get_and_show_revision()
840 atusb->fw_ver_maj, atusb->fw_ver_min, hw_name, in atusb_get_and_show_revision()
841 atusb->fw_hw_type); in atusb_get_and_show_revision()
843 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 2) { in atusb_get_and_show_revision()
844 dev_info(&usb_dev->dev, in atusb_get_and_show_revision()
846 atusb->fw_ver_maj, atusb->fw_ver_min); in atusb_get_and_show_revision()
847 dev_info(&usb_dev->dev, "Please update to version 0.2 or newer"); in atusb_get_and_show_revision()
856 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_show_build()
862 return -ENOMEM; in atusb_get_and_show_build()
869 dev_info(&usb_dev->dev, "Firmware: build %s\n", build); in atusb_get_and_show_build()
878 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_conf_chip()
881 struct ieee802154_hw *hw = atusb->hw; in atusb_get_and_conf_chip() local
888 if (atusb->err) in atusb_get_and_conf_chip()
889 return atusb->err; in atusb_get_and_conf_chip()
891 hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT | in atusb_get_and_conf_chip()
894 hw->phy->flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL | in atusb_get_and_conf_chip()
897 hw->phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) | in atusb_get_and_conf_chip()
900 hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND) | in atusb_get_and_conf_chip()
903 hw->phy->cca.mode = NL802154_CCA_ENERGY; in atusb_get_and_conf_chip()
905 hw->phy->current_page = 0; in atusb_get_and_conf_chip()
908 dev_err(&usb_dev->dev, in atusb_get_and_conf_chip()
909 "non-Atmel transceiver xxxx%02x%02x\n", in atusb_get_and_conf_chip()
917 atusb->hw->phy->supported.channels[0] = 0x7FFF800; in atusb_get_and_conf_chip()
918 atusb->hw->phy->current_channel = 11; /* reset default */ in atusb_get_and_conf_chip()
919 atusb->hw->phy->symbol_duration = 16; in atusb_get_and_conf_chip()
920 atusb->hw->phy->supported.tx_powers = atusb_powers; in atusb_get_and_conf_chip()
921 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers); in atusb_get_and_conf_chip()
922 hw->phy->supported.cca_ed_levels = atusb_ed_levels; in atusb_get_and_conf_chip()
923 hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(atusb_ed_levels); in atusb_get_and_conf_chip()
927 atusb->hw->phy->supported.channels[0] = 0x7FFF800; in atusb_get_and_conf_chip()
928 atusb->hw->phy->current_channel = 11; /* reset default */ in atusb_get_and_conf_chip()
929 atusb->hw->phy->symbol_duration = 16; in atusb_get_and_conf_chip()
930 atusb->hw->phy->supported.tx_powers = atusb_powers; in atusb_get_and_conf_chip()
931 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers); in atusb_get_and_conf_chip()
932 hw->phy->supported.cca_ed_levels = atusb_ed_levels; in atusb_get_and_conf_chip()
933 hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(atusb_ed_levels); in atusb_get_and_conf_chip()
937 atusb->hw->flags |= IEEE802154_HW_LBT; in atusb_get_and_conf_chip()
938 atusb->hw->phy->supported.channels[0] = 0x00007FF; in atusb_get_and_conf_chip()
939 atusb->hw->phy->supported.channels[2] = 0x00007FF; in atusb_get_and_conf_chip()
940 atusb->hw->phy->current_channel = 5; in atusb_get_and_conf_chip()
941 atusb->hw->phy->symbol_duration = 25; in atusb_get_and_conf_chip()
942 atusb->hw->phy->supported.lbt = NL802154_SUPPORTED_BOOL_BOTH; in atusb_get_and_conf_chip()
943 atusb->hw->phy->supported.tx_powers = at86rf212_powers; in atusb_get_and_conf_chip()
944 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf212_powers); in atusb_get_and_conf_chip()
945 atusb->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_100; in atusb_get_and_conf_chip()
946 atusb->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_100); in atusb_get_and_conf_chip()
949 dev_err(&usb_dev->dev, in atusb_get_and_conf_chip()
955 hw->phy->transmit_power = hw->phy->supported.tx_powers[0]; in atusb_get_and_conf_chip()
956 hw->phy->cca_ed_level = hw->phy->supported.cca_ed_levels[7]; in atusb_get_and_conf_chip()
958 dev_info(&usb_dev->dev, "ATUSB: %s version %d\n", chip, version_num); in atusb_get_and_conf_chip()
963 atusb->err = -ENODEV; in atusb_get_and_conf_chip()
964 return -ENODEV; in atusb_get_and_conf_chip()
969 struct usb_device *usb_dev = atusb->usb_dev; in atusb_set_extended_addr()
978 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) { in atusb_set_extended_addr()
979 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
985 return -ENOMEM; in atusb_set_extended_addr()
992 dev_err(&usb_dev->dev, "failed to fetch extended address, random address set\n"); in atusb_set_extended_addr()
993 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1001 dev_info(&usb_dev->dev, "no permanent extended address found, random address set\n"); in atusb_set_extended_addr()
1002 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1004 atusb->hw->phy->perm_extended_addr = extended_addr; in atusb_set_extended_addr()
1005 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1006 dev_info(&usb_dev->dev, "Read permanent extended address %8phC from device\n", in atusb_set_extended_addr()
1014 /* ----- Setup ------------------------------------------------------------- */
1020 struct ieee802154_hw *hw; in atusb_probe() local
1022 int ret = -ENOMEM; in atusb_probe()
1024 hw = ieee802154_alloc_hw(sizeof(struct atusb), &atusb_ops); in atusb_probe()
1025 if (!hw) in atusb_probe()
1026 return -ENOMEM; in atusb_probe()
1028 atusb = hw->priv; in atusb_probe()
1029 atusb->hw = hw; in atusb_probe()
1030 atusb->usb_dev = usb_get_dev(usb_dev); in atusb_probe()
1033 atusb->shutdown = 0; in atusb_probe()
1034 atusb->err = 0; in atusb_probe()
1035 INIT_DELAYED_WORK(&atusb->work, atusb_work_urbs); in atusb_probe()
1036 init_usb_anchor(&atusb->idle_urbs); in atusb_probe()
1037 init_usb_anchor(&atusb->rx_urbs); in atusb_probe()
1042 atusb->tx_dr.bRequestType = ATUSB_REQ_TO_DEV; in atusb_probe()
1043 atusb->tx_dr.bRequest = ATUSB_TX; in atusb_probe()
1044 atusb->tx_dr.wValue = cpu_to_le16(0); in atusb_probe()
1046 atusb->tx_urb = usb_alloc_urb(0, GFP_KERNEL); in atusb_probe()
1047 if (!atusb->tx_urb) in atusb_probe()
1050 hw->parent = &usb_dev->dev; in atusb_probe()
1058 if ((atusb->fw_ver_maj == 0 && atusb->fw_ver_min >= 3) || atusb->fw_ver_maj > 0) in atusb_probe()
1059 hw->flags |= IEEE802154_HW_FRAME_RETRIES; in atusb_probe()
1063 dev_err(&atusb->usb_dev->dev, in atusb_probe()
1069 ret = ieee802154_register_hw(hw); in atusb_probe()
1084 * According to [1], the inter-frame gap is in atusb_probe()
1094 * atusb currently needs about 500 us to retrieve a maximum-sized in atusb_probe()
1098 * [1] "JN-AN-1035 Calculating data rates in an IEEE 802.15.4-based in atusb_probe()
1100 …tp://www.jennic.com/download_file.php?supportFile=JN-AN-1035%20Calculating%20802-15-4%20Data%20Rat… in atusb_probe()
1111 dev_err(&atusb->usb_dev->dev, in atusb_probe()
1115 ieee802154_unregister_hw(hw); in atusb_probe()
1118 usb_kill_urb(atusb->tx_urb); in atusb_probe()
1119 usb_free_urb(atusb->tx_urb); in atusb_probe()
1121 ieee802154_free_hw(hw); in atusb_probe()
1129 dev_dbg(&atusb->usb_dev->dev, "%s\n", __func__); in atusb_disconnect()
1131 atusb->shutdown = 1; in atusb_disconnect()
1132 cancel_delayed_work_sync(&atusb->work); in atusb_disconnect()
1134 usb_kill_anchored_urbs(&atusb->rx_urbs); in atusb_disconnect()
1136 usb_kill_urb(atusb->tx_urb); in atusb_disconnect()
1137 usb_free_urb(atusb->tx_urb); in atusb_disconnect()
1139 ieee802154_unregister_hw(atusb->hw); in atusb_disconnect()
1141 usb_put_dev(atusb->usb_dev); in atusb_disconnect()
1143 ieee802154_free_hw(atusb->hw); in atusb_disconnect()