• Home
  • Raw
  • Download

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 ret = ret < 0 ? ret : -ENODATA; in atusb_control_msg()
99 atusb->err = ret; in atusb_control_msg()
100 dev_err(&usb_dev->dev, in atusb_control_msg()
109 struct usb_device *usb_dev = atusb->usb_dev; in atusb_command()
111 dev_dbg(&usb_dev->dev, "%s: cmd = 0x%x\n", __func__, cmd); in atusb_command()
118 struct usb_device *usb_dev = atusb->usb_dev; in atusb_write_reg()
120 dev_dbg(&usb_dev->dev, "%s: 0x%02x <- 0x%02x\n", __func__, reg, value); in atusb_write_reg()
128 struct usb_device *usb_dev = atusb->usb_dev; in atusb_read_reg()
135 return -ENOMEM; in atusb_read_reg()
137 dev_dbg(&usb_dev->dev, "%s: reg = 0x%x\n", __func__, reg); in atusb_read_reg()
155 struct usb_device *usb_dev = atusb->usb_dev; in atusb_write_subreg()
159 dev_dbg(&usb_dev->dev, "%s: 0x%02x <- 0x%02x\n", __func__, reg, value); in atusb_write_subreg()
189 int err = atusb->err; in atusb_get_and_clear_error()
191 atusb->err = 0; in atusb_get_and_clear_error()
195 /* ----- skb allocation ---------------------------------------------------- */
200 #define SKB_ATUSB(skb) (*(struct atusb **)(skb)->cb)
206 struct usb_device *usb_dev = atusb->usb_dev; in atusb_submit_rx_urb()
207 struct sk_buff *skb = urb->context; in atusb_submit_rx_urb()
213 dev_warn_ratelimited(&usb_dev->dev, in atusb_submit_rx_urb()
215 return -ENOMEM; in atusb_submit_rx_urb()
222 skb->data, MAX_RX_XFER, atusb_in, skb); in atusb_submit_rx_urb()
223 usb_anchor_urb(urb, &atusb->rx_urbs); in atusb_submit_rx_urb()
229 urb->context = NULL; in atusb_submit_rx_urb()
238 struct usb_device *usb_dev = atusb->usb_dev; in atusb_work_urbs()
242 if (atusb->shutdown) in atusb_work_urbs()
246 urb = usb_get_from_anchor(&atusb->idle_urbs); in atusb_work_urbs()
252 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_work_urbs()
253 dev_warn_ratelimited(&usb_dev->dev, in atusb_work_urbs()
255 schedule_delayed_work(&atusb->work, in atusb_work_urbs()
259 /* ----- Asynchronous USB -------------------------------------------------- */
263 struct usb_device *usb_dev = atusb->usb_dev; in atusb_tx_done()
264 u8 expect = atusb->tx_ack_seq; in atusb_tx_done()
266 dev_dbg(&usb_dev->dev, "%s (0x%02x/0x%02x)\n", __func__, seq, expect); in atusb_tx_done()
269 ieee802154_xmit_complete(atusb->hw, atusb->tx_skb, false); in atusb_tx_done()
276 ieee802154_wake_queue(atusb->hw); in atusb_tx_done()
277 if (atusb->tx_skb) in atusb_tx_done()
278 dev_kfree_skb_irq(atusb->tx_skb); in atusb_tx_done()
284 struct usb_device *usb_dev = urb->dev; in atusb_in_good()
285 struct sk_buff *skb = urb->context; in atusb_in_good()
289 if (!urb->actual_length) { in atusb_in_good()
290 dev_dbg(&usb_dev->dev, "atusb_in: zero-sized URB ?\n"); in atusb_in_good()
294 len = *skb->data; in atusb_in_good()
296 if (urb->actual_length == 1) { in atusb_in_good()
301 if (len + 1 > urb->actual_length - 1) { in atusb_in_good()
302 dev_dbg(&usb_dev->dev, "atusb_in: frame len %d+1 > URB %u-1\n", in atusb_in_good()
303 len, urb->actual_length); in atusb_in_good()
308 dev_dbg(&usb_dev->dev, "atusb_in: frame corrupted\n"); in atusb_in_good()
312 lqi = skb->data[len + 1]; in atusb_in_good()
313 dev_dbg(&usb_dev->dev, "atusb_in: rx len %d lqi 0x%02x\n", len, lqi); in atusb_in_good()
316 ieee802154_rx_irqsafe(atusb->hw, skb, lqi); in atusb_in_good()
317 urb->context = NULL; /* skb is gone */ in atusb_in_good()
322 struct usb_device *usb_dev = urb->dev; in atusb_in()
323 struct sk_buff *skb = urb->context; in atusb_in()
326 dev_dbg(&usb_dev->dev, "%s: status %d len %d\n", __func__, in atusb_in()
327 urb->status, urb->actual_length); in atusb_in()
328 if (urb->status) { in atusb_in()
329 if (urb->status == -ENOENT) { /* being killed */ in atusb_in()
331 urb->context = NULL; in atusb_in()
334 dev_dbg(&usb_dev->dev, "%s: URB error %d\n", __func__, urb->status); in atusb_in()
339 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_in()
340 if (!atusb->shutdown) in atusb_in()
341 schedule_delayed_work(&atusb->work, 0); in atusb_in()
344 /* ----- URB allocation/deallocation --------------------------------------- */
351 urb = usb_get_from_anchor(&atusb->idle_urbs); in atusb_free_urbs()
354 kfree_skb(urb->context); in atusb_free_urbs()
367 return -ENOMEM; in atusb_alloc_urbs()
369 usb_anchor_urb(urb, &atusb->idle_urbs); in atusb_alloc_urbs()
371 n--; in atusb_alloc_urbs()
376 /* ----- IEEE 802.15.4 interface operations -------------------------------- */
380 dev_dbg(&urb->dev->dev, "atusb_xmit urb completed"); in atusb_xmit_complete()
383 static int atusb_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) in atusb_xmit() argument
385 struct atusb *atusb = hw->priv; in atusb_xmit()
386 struct usb_device *usb_dev = atusb->usb_dev; in atusb_xmit()
389 dev_dbg(&usb_dev->dev, "%s (%d)\n", __func__, skb->len); in atusb_xmit()
390 atusb->tx_skb = skb; in atusb_xmit()
391 atusb->tx_ack_seq++; in atusb_xmit()
392 atusb->tx_dr.wIndex = cpu_to_le16(atusb->tx_ack_seq); in atusb_xmit()
393 atusb->tx_dr.wLength = cpu_to_le16(skb->len); in atusb_xmit()
395 usb_fill_control_urb(atusb->tx_urb, usb_dev, in atusb_xmit()
397 (unsigned char *)&atusb->tx_dr, skb->data, in atusb_xmit()
398 skb->len, atusb_xmit_complete, NULL); in atusb_xmit()
399 ret = usb_submit_urb(atusb->tx_urb, GFP_ATOMIC); in atusb_xmit()
400 dev_dbg(&usb_dev->dev, "%s done (%d)\n", __func__, ret); in atusb_xmit()
404 static int atusb_ed(struct ieee802154_hw *hw, u8 *level) in atusb_ed() argument
411 static int atusb_set_hw_addr_filt(struct ieee802154_hw *hw, in atusb_set_hw_addr_filt() argument
415 struct atusb *atusb = hw->priv; in atusb_set_hw_addr_filt()
416 struct device *dev = &atusb->usb_dev->dev; in atusb_set_hw_addr_filt()
419 u16 addr = le16_to_cpu(filt->short_addr); in atusb_set_hw_addr_filt()
427 u16 pan = le16_to_cpu(filt->pan_id); in atusb_set_hw_addr_filt()
437 memcpy(addr, &filt->ieee_addr, IEEE802154_EXTENDED_ADDR_LEN); in atusb_set_hw_addr_filt()
445 if (filt->pan_coord) in atusb_set_hw_addr_filt()
454 static int atusb_start(struct ieee802154_hw *hw) in atusb_start() argument
456 struct atusb *atusb = hw->priv; in atusb_start()
457 struct usb_device *usb_dev = atusb->usb_dev; in atusb_start()
460 dev_dbg(&usb_dev->dev, "%s\n", __func__); in atusb_start()
461 schedule_delayed_work(&atusb->work, 0); in atusb_start()
465 usb_kill_anchored_urbs(&atusb->idle_urbs); in atusb_start()
469 static void atusb_stop(struct ieee802154_hw *hw) in atusb_stop() argument
471 struct atusb *atusb = hw->priv; in atusb_stop()
472 struct usb_device *usb_dev = atusb->usb_dev; in atusb_stop()
474 dev_dbg(&usb_dev->dev, "%s\n", __func__); in atusb_stop()
475 usb_kill_anchored_urbs(&atusb->idle_urbs); in atusb_stop()
482 300, 280, 230, 180, 130, 70, 0, -100, -200, -300, -400, -500, -700,
483 -900, -1200, -1700,
487 atusb_txpower(struct ieee802154_hw *hw, s32 mbm) in atusb_txpower() argument
489 struct atusb *atusb = hw->priv; in atusb_txpower()
491 if (atusb->data) in atusb_txpower()
492 return atusb->data->set_txpower(hw, mbm); in atusb_txpower()
494 return -ENOTSUPP; in atusb_txpower()
498 atusb_set_txpower(struct ieee802154_hw *hw, s32 mbm) in atusb_set_txpower() argument
500 struct atusb *atusb = hw->priv; in atusb_set_txpower()
503 for (i = 0; i < hw->phy->supported.tx_powers_size; i++) { in atusb_set_txpower()
504 if (hw->phy->supported.tx_powers[i] == mbm) in atusb_set_txpower()
508 return -EINVAL; in atusb_set_txpower()
512 hulusb_set_txpower(struct ieee802154_hw *hw, s32 mbm) in hulusb_set_txpower() argument
516 for (i = 0; i < hw->phy->supported.tx_powers_size; i++) { in hulusb_set_txpower()
517 if (hw->phy->supported.tx_powers[i] == mbm) in hulusb_set_txpower()
518 return atusb_write_subreg(hw->priv, SR_TX_PWR_212, i); in hulusb_set_txpower()
521 return -EINVAL; in hulusb_set_txpower()
526 -9100, -8900, -8700, -8500, -8300, -8100, -7900, -7700, -7500, -7300,
527 -7100, -6900, -6700, -6500, -6300, -6100,
532 500, 400, 300, 200, 100, 0, -100, -200, -300, -400, -500, -600, -700,
533 -800, -900, -1000, -1100, -1200, -1300, -1400, -1500, -1600, -1700,
534 -1800, -1900, -2000, -2100, -2200, -2300, -2400, -2500, -2600,
539 -10000, -9800, -9600, -9400, -9200, -9000, -8800, -8600, -8400, -8200,
540 -8000, -7800, -7600, -7400, -7200, -7000,
544 -9800, -9600, -9400, -9200, -9000, -8800, -8600, -8400, -8200, -8000,
545 -7800, -7600, -7400, -7200, -7000, -6800,
549 atusb_set_cca_mode(struct ieee802154_hw *hw, const struct wpan_phy_cca *cca) in atusb_set_cca_mode() argument
551 struct atusb *atusb = hw->priv; in atusb_set_cca_mode()
555 switch (cca->mode) { in atusb_set_cca_mode()
563 switch (cca->opt) { in atusb_set_cca_mode()
571 return -EINVAL; in atusb_set_cca_mode()
575 return -EINVAL; in atusb_set_cca_mode()
588 case -98: in hulusb_set_cca_ed_level()
589 lp->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_98; in hulusb_set_cca_ed_level()
590 lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_98); in hulusb_set_cca_ed_level()
591 lp->hw->phy->cca_ed_level = at86rf212_ed_levels_98[cca_ed_thres]; in hulusb_set_cca_ed_level()
593 case -100: in hulusb_set_cca_ed_level()
594 lp->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_100; in hulusb_set_cca_ed_level()
595 lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_100); in hulusb_set_cca_ed_level()
596 lp->hw->phy->cca_ed_level = at86rf212_ed_levels_100[cca_ed_thres]; in hulusb_set_cca_ed_level()
606 atusb_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm) in atusb_set_cca_ed_level() argument
608 struct atusb *atusb = hw->priv; in atusb_set_cca_ed_level()
611 for (i = 0; i < hw->phy->supported.cca_ed_levels_size; i++) { in atusb_set_cca_ed_level()
612 if (hw->phy->supported.cca_ed_levels[i] == mbm) in atusb_set_cca_ed_level()
616 return -EINVAL; in atusb_set_cca_ed_level()
619 static int atusb_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in atusb_channel() argument
621 struct atusb *atusb = hw->priv; in atusb_channel()
622 int ret = -ENOTSUPP; in atusb_channel()
624 if (atusb->data) { in atusb_channel()
625 ret = atusb->data->set_channel(hw, page, channel); in atusb_channel()
627 msleep(atusb->data->t_channel_switch); in atusb_channel()
633 static int atusb_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in atusb_set_channel() argument
635 struct atusb *atusb = hw->priv; in atusb_set_channel()
644 static int hulusb_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in hulusb_set_channel() argument
649 struct atusb *lp = hw->priv; in hulusb_set_channel()
660 rssi_base_val = -100; in hulusb_set_channel()
663 rssi_base_val = -98; in hulusb_set_channel()
682 /* SUB:0 and BPSK:0 -> BPSK-20 */ in hulusb_set_channel()
683 lp->hw->phy->symbol_duration = 50; in hulusb_set_channel()
685 /* SUB:1 and BPSK:0 -> BPSK-40 */ in hulusb_set_channel()
686 lp->hw->phy->symbol_duration = 25; in hulusb_set_channel()
690 /* SUB:0 and BPSK:1 -> OQPSK-100/200/400 */ in hulusb_set_channel()
691 lp->hw->phy->symbol_duration = 40; in hulusb_set_channel()
693 /* SUB:1 and BPSK:1 -> OQPSK-250/500/1000 */ in hulusb_set_channel()
694 lp->hw->phy->symbol_duration = 16; in hulusb_set_channel()
697 lp->hw->phy->lifs_period = IEEE802154_LIFS_PERIOD * in hulusb_set_channel()
698 lp->hw->phy->symbol_duration; in hulusb_set_channel()
699 lp->hw->phy->sifs_period = IEEE802154_SIFS_PERIOD * in hulusb_set_channel()
700 lp->hw->phy->symbol_duration; in hulusb_set_channel()
706 atusb_set_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be, u8 retries) in atusb_set_csma_params() argument
708 struct atusb *atusb = hw->priv; in atusb_set_csma_params()
723 hulusb_set_lbt(struct ieee802154_hw *hw, bool on) in hulusb_set_lbt() argument
725 struct atusb *atusb = hw->priv; in hulusb_set_lbt()
731 atusb_set_frame_retries(struct ieee802154_hw *hw, s8 retries) in atusb_set_frame_retries() argument
733 struct atusb *atusb = hw->priv; in atusb_set_frame_retries()
739 atusb_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on) in atusb_set_promiscuous_mode() argument
741 struct atusb *atusb = hw->priv; in atusb_set_promiscuous_mode()
767 .rssi_base_val = -91,
774 .rssi_base_val = -100,
796 /* ----- Firmware and chip version information ----------------------------- */
800 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_show_revision()
807 return -ENOMEM; in atusb_get_and_show_revision()
814 atusb->fw_ver_maj = buffer[0]; in atusb_get_and_show_revision()
815 atusb->fw_ver_min = buffer[1]; in atusb_get_and_show_revision()
816 atusb->fw_hw_type = buffer[2]; in atusb_get_and_show_revision()
818 switch (atusb->fw_hw_type) { in atusb_get_and_show_revision()
823 atusb->data = &atusb_chip_data; in atusb_get_and_show_revision()
827 atusb->data = &atusb_chip_data; in atusb_get_and_show_revision()
831 atusb->data = &hulusb_chip_data; in atusb_get_and_show_revision()
835 atusb->err = -ENOTSUPP; in atusb_get_and_show_revision()
836 ret = -ENOTSUPP; in atusb_get_and_show_revision()
840 dev_info(&usb_dev->dev, in atusb_get_and_show_revision()
842 atusb->fw_ver_maj, atusb->fw_ver_min, hw_name, in atusb_get_and_show_revision()
843 atusb->fw_hw_type); in atusb_get_and_show_revision()
845 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 2) { in atusb_get_and_show_revision()
846 dev_info(&usb_dev->dev, in atusb_get_and_show_revision()
848 atusb->fw_ver_maj, atusb->fw_ver_min); in atusb_get_and_show_revision()
849 dev_info(&usb_dev->dev, "Please update to version 0.2 or newer"); in atusb_get_and_show_revision()
858 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_show_build()
864 return -ENOMEM; in atusb_get_and_show_build()
867 ret = usb_control_msg(atusb->usb_dev, usb_rcvctrlpipe(usb_dev, 0), ATUSB_BUILD, in atusb_get_and_show_build()
871 dev_info(&usb_dev->dev, "Firmware: build %s\n", build); in atusb_get_and_show_build()
880 struct usb_device *usb_dev = atusb->usb_dev; in atusb_get_and_conf_chip()
883 struct ieee802154_hw *hw = atusb->hw; in atusb_get_and_conf_chip() local
890 if (atusb->err) in atusb_get_and_conf_chip()
891 return atusb->err; in atusb_get_and_conf_chip()
893 hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT | in atusb_get_and_conf_chip()
896 hw->phy->flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL | in atusb_get_and_conf_chip()
899 hw->phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) | in atusb_get_and_conf_chip()
902 hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND) | in atusb_get_and_conf_chip()
905 hw->phy->cca.mode = NL802154_CCA_ENERGY; in atusb_get_and_conf_chip()
907 hw->phy->current_page = 0; in atusb_get_and_conf_chip()
910 dev_err(&usb_dev->dev, in atusb_get_and_conf_chip()
911 "non-Atmel transceiver xxxx%02x%02x\n", in atusb_get_and_conf_chip()
919 atusb->hw->phy->supported.channels[0] = 0x7FFF800; in atusb_get_and_conf_chip()
920 atusb->hw->phy->current_channel = 11; /* reset default */ in atusb_get_and_conf_chip()
921 atusb->hw->phy->symbol_duration = 16; in atusb_get_and_conf_chip()
922 atusb->hw->phy->supported.tx_powers = atusb_powers; in atusb_get_and_conf_chip()
923 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers); in atusb_get_and_conf_chip()
924 hw->phy->supported.cca_ed_levels = atusb_ed_levels; in atusb_get_and_conf_chip()
925 hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(atusb_ed_levels); in atusb_get_and_conf_chip()
929 atusb->hw->phy->supported.channels[0] = 0x7FFF800; in atusb_get_and_conf_chip()
930 atusb->hw->phy->current_channel = 11; /* reset default */ in atusb_get_and_conf_chip()
931 atusb->hw->phy->symbol_duration = 16; in atusb_get_and_conf_chip()
932 atusb->hw->phy->supported.tx_powers = atusb_powers; in atusb_get_and_conf_chip()
933 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers); in atusb_get_and_conf_chip()
934 hw->phy->supported.cca_ed_levels = atusb_ed_levels; in atusb_get_and_conf_chip()
935 hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(atusb_ed_levels); in atusb_get_and_conf_chip()
939 atusb->hw->flags |= IEEE802154_HW_LBT; in atusb_get_and_conf_chip()
940 atusb->hw->phy->supported.channels[0] = 0x00007FF; in atusb_get_and_conf_chip()
941 atusb->hw->phy->supported.channels[2] = 0x00007FF; in atusb_get_and_conf_chip()
942 atusb->hw->phy->current_channel = 5; in atusb_get_and_conf_chip()
943 atusb->hw->phy->symbol_duration = 25; in atusb_get_and_conf_chip()
944 atusb->hw->phy->supported.lbt = NL802154_SUPPORTED_BOOL_BOTH; in atusb_get_and_conf_chip()
945 atusb->hw->phy->supported.tx_powers = at86rf212_powers; in atusb_get_and_conf_chip()
946 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf212_powers); in atusb_get_and_conf_chip()
947 atusb->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_100; in atusb_get_and_conf_chip()
948 atusb->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_100); in atusb_get_and_conf_chip()
951 dev_err(&usb_dev->dev, in atusb_get_and_conf_chip()
957 hw->phy->transmit_power = hw->phy->supported.tx_powers[0]; in atusb_get_and_conf_chip()
958 hw->phy->cca_ed_level = hw->phy->supported.cca_ed_levels[7]; in atusb_get_and_conf_chip()
960 dev_info(&usb_dev->dev, "ATUSB: %s version %d\n", chip, version_num); in atusb_get_and_conf_chip()
965 atusb->err = -ENODEV; in atusb_get_and_conf_chip()
966 return -ENODEV; in atusb_get_and_conf_chip()
971 struct usb_device *usb_dev = atusb->usb_dev; in atusb_set_extended_addr()
980 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) { in atusb_set_extended_addr()
981 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
987 return -ENOMEM; in atusb_set_extended_addr()
994 dev_err(&usb_dev->dev, "failed to fetch extended address, random address set\n"); in atusb_set_extended_addr()
995 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1003 dev_info(&usb_dev->dev, "no permanent extended address found, random address set\n"); in atusb_set_extended_addr()
1004 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1006 atusb->hw->phy->perm_extended_addr = extended_addr; in atusb_set_extended_addr()
1007 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr); in atusb_set_extended_addr()
1008 dev_info(&usb_dev->dev, "Read permanent extended address %8phC from device\n", in atusb_set_extended_addr()
1016 /* ----- Setup ------------------------------------------------------------- */
1022 struct ieee802154_hw *hw; in atusb_probe() local
1024 int ret = -ENOMEM; in atusb_probe()
1026 hw = ieee802154_alloc_hw(sizeof(struct atusb), &atusb_ops); in atusb_probe()
1027 if (!hw) in atusb_probe()
1028 return -ENOMEM; in atusb_probe()
1030 atusb = hw->priv; in atusb_probe()
1031 atusb->hw = hw; in atusb_probe()
1032 atusb->usb_dev = usb_get_dev(usb_dev); in atusb_probe()
1035 atusb->shutdown = 0; in atusb_probe()
1036 atusb->err = 0; in atusb_probe()
1037 INIT_DELAYED_WORK(&atusb->work, atusb_work_urbs); in atusb_probe()
1038 init_usb_anchor(&atusb->idle_urbs); in atusb_probe()
1039 init_usb_anchor(&atusb->rx_urbs); in atusb_probe()
1044 atusb->tx_dr.bRequestType = ATUSB_REQ_TO_DEV; in atusb_probe()
1045 atusb->tx_dr.bRequest = ATUSB_TX; in atusb_probe()
1046 atusb->tx_dr.wValue = cpu_to_le16(0); in atusb_probe()
1048 atusb->tx_urb = usb_alloc_urb(0, GFP_KERNEL); in atusb_probe()
1049 if (!atusb->tx_urb) in atusb_probe()
1052 hw->parent = &usb_dev->dev; in atusb_probe()
1060 if ((atusb->fw_ver_maj == 0 && atusb->fw_ver_min >= 3) || atusb->fw_ver_maj > 0) in atusb_probe()
1061 hw->flags |= IEEE802154_HW_FRAME_RETRIES; in atusb_probe()
1065 dev_err(&atusb->usb_dev->dev, in atusb_probe()
1071 ret = ieee802154_register_hw(hw); in atusb_probe()
1086 * According to [1], the inter-frame gap is in atusb_probe()
1096 * atusb currently needs about 500 us to retrieve a maximum-sized in atusb_probe()
1100 * [1] "JN-AN-1035 Calculating data rates in an IEEE 802.15.4-based in atusb_probe()
1102 …tp://www.jennic.com/download_file.php?supportFile=JN-AN-1035%20Calculating%20802-15-4%20Data%20Rat… in atusb_probe()
1113 dev_err(&atusb->usb_dev->dev, in atusb_probe()
1117 ieee802154_unregister_hw(hw); in atusb_probe()
1120 usb_kill_urb(atusb->tx_urb); in atusb_probe()
1121 usb_free_urb(atusb->tx_urb); in atusb_probe()
1123 ieee802154_free_hw(hw); in atusb_probe()
1131 dev_dbg(&atusb->usb_dev->dev, "%s\n", __func__); in atusb_disconnect()
1133 atusb->shutdown = 1; in atusb_disconnect()
1134 cancel_delayed_work_sync(&atusb->work); in atusb_disconnect()
1136 usb_kill_anchored_urbs(&atusb->rx_urbs); in atusb_disconnect()
1138 usb_kill_urb(atusb->tx_urb); in atusb_disconnect()
1139 usb_free_urb(atusb->tx_urb); in atusb_disconnect()
1141 ieee802154_unregister_hw(atusb->hw); in atusb_disconnect()
1143 usb_put_dev(atusb->usb_dev); in atusb_disconnect()
1145 ieee802154_free_hw(atusb->hw); in atusb_disconnect()