Lines Matching refs:atusb

3  * atusb.c - Driver for the ATUSB IEEE 802.15.4 dongle
37 #include "atusb.h"
45 struct atusb {
77 static int atusb_write_subreg(struct atusb *atusb, u8 reg, u8 mask,
80 struct usb_device *usb_dev = atusb->usb_dev;
104 static int atusb_read_subreg(struct atusb *lp,
120 static int atusb_get_and_clear_error(struct atusb *atusb)
122 int err = atusb->err;
124 atusb->err = 0;
133 #define SKB_ATUSB(skb) (*(struct atusb **)(skb)->cb)
137 static int atusb_submit_rx_urb(struct atusb *atusb, struct urb *urb)
139 struct usb_device *usb_dev = atusb->usb_dev;
151 SKB_ATUSB(skb) = atusb;
156 usb_anchor_urb(urb, &atusb->rx_urbs);
169 struct atusb *atusb =
170 container_of(to_delayed_work(work), struct atusb, work);
171 struct usb_device *usb_dev = atusb->usb_dev;
175 if (atusb->shutdown)
179 urb = usb_get_from_anchor(&atusb->idle_urbs);
182 ret = atusb_submit_rx_urb(atusb, urb);
185 usb_anchor_urb(urb, &atusb->idle_urbs);
188 schedule_delayed_work(&atusb->work,
194 static void atusb_tx_done(struct atusb *atusb, u8 seq, int reason)
196 struct usb_device *usb_dev = atusb->usb_dev;
197 u8 expect = atusb->tx_ack_seq;
203 ieee802154_xmit_complete(atusb->hw, atusb->tx_skb, false);
205 ieee802154_xmit_error(atusb->hw, atusb->tx_skb, reason);
207 /* TODO I experience this case when atusb has a tx complete
212 ieee802154_xmit_hw_error(atusb->hw, atusb->tx_skb);
220 struct atusb *atusb = SKB_ATUSB(skb);
251 atusb_tx_done(atusb, len, result);
270 ieee802154_rx_irqsafe(atusb->hw, skb, lqi);
278 struct atusb *atusb = SKB_ATUSB(skb);
293 usb_anchor_urb(urb, &atusb->idle_urbs);
294 if (!atusb->shutdown)
295 schedule_delayed_work(&atusb->work, 0);
300 static void atusb_free_urbs(struct atusb *atusb)
305 urb = usb_get_from_anchor(&atusb->idle_urbs);
313 static int atusb_alloc_urbs(struct atusb *atusb, int n)
320 atusb_free_urbs(atusb);
323 usb_anchor_urb(urb, &atusb->idle_urbs);
339 struct atusb *atusb = hw->priv;
340 struct usb_device *usb_dev = atusb->usb_dev;
344 atusb->tx_skb = skb;
345 atusb->tx_ack_seq++;
346 atusb->tx_dr.wIndex = cpu_to_le16(atusb->tx_ack_seq);
347 atusb->tx_dr.wLength = cpu_to_le16(skb->len);
349 usb_fill_control_urb(atusb->tx_urb, usb_dev,
351 (unsigned char *)&atusb->tx_dr, skb->data,
353 ret = usb_submit_urb(atusb->tx_urb, GFP_ATOMIC);
369 struct atusb *atusb = hw->priv;
370 struct device *dev = &atusb->usb_dev->dev;
376 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
379 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
387 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
390 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
400 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
408 atusb_write_subreg(atusb, SR_AACK_I_AM_COORD, 1);
410 atusb_write_subreg(atusb, SR_AACK_I_AM_COORD, 0);
413 return atusb_get_and_clear_error(atusb);
418 struct atusb *atusb = hw->priv;
419 struct usb_device *usb_dev = atusb->usb_dev;
423 schedule_delayed_work(&atusb->work, 0);
424 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_RX_MODE, ATUSB_REQ_TO_DEV, 1, 0,
426 ret = atusb_get_and_clear_error(atusb);
428 usb_kill_anchored_urbs(&atusb->idle_urbs);
434 struct atusb *atusb = hw->priv;
435 struct usb_device *usb_dev = atusb->usb_dev;
438 usb_kill_anchored_urbs(&atusb->idle_urbs);
439 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_RX_MODE, ATUSB_REQ_TO_DEV, 0, 0,
441 atusb_get_and_clear_error(atusb);
453 struct atusb *atusb = hw->priv;
455 if (atusb->data)
456 return atusb->data->set_txpower(hw, mbm);
464 struct atusb *atusb = hw->priv;
469 return atusb_write_subreg(atusb, SR_TX_PWR_23X, i);
515 struct atusb *atusb = hw->priv;
542 return atusb_write_subreg(atusb, SR_CCA_MODE, val);
545 static int hulusb_set_cca_ed_level(struct atusb *lp, int rssi_base_val)
574 struct atusb *atusb = hw->priv;
579 return atusb_write_subreg(atusb, SR_CCA_ED_THRES, i);
587 struct atusb *atusb = hw->priv;
590 if (atusb->data) {
591 ret = atusb->data->set_channel(hw, page, channel);
593 msleep(atusb->data->t_channel_switch);
601 struct atusb *atusb = hw->priv;
604 ret = atusb_write_subreg(atusb, SR_CHANNEL, channel);
615 struct atusb *lp = hw->priv;
644 struct atusb *atusb = hw->priv;
647 ret = atusb_write_subreg(atusb, SR_MIN_BE, min_be);
651 ret = atusb_write_subreg(atusb, SR_MAX_BE, max_be);
655 return atusb_write_subreg(atusb, SR_MAX_CSMA_RETRIES, retries);
661 struct atusb *atusb = hw->priv;
663 return atusb_write_subreg(atusb, SR_CSMA_LBT_MODE, on);
669 struct atusb *atusb = hw->priv;
671 return atusb_write_subreg(atusb, SR_MAX_FRAME_RETRIES, retries);
677 struct atusb *atusb = hw->priv;
681 ret = atusb_write_subreg(atusb, SR_AACK_DIS_ACK, 1);
685 ret = atusb_write_subreg(atusb, SR_AACK_PROM_MODE, 1);
689 ret = atusb_write_subreg(atusb, SR_AACK_PROM_MODE, 0);
693 ret = atusb_write_subreg(atusb, SR_AACK_DIS_ACK, 0);
734 static int atusb_get_and_show_revision(struct atusb *atusb)
736 struct usb_device *usb_dev = atusb->usb_dev;
742 ret = usb_control_msg_recv(atusb->usb_dev, 0, ATUSB_ID, ATUSB_REQ_FROM_DEV, 0, 0,
745 atusb->fw_ver_maj = buffer[0];
746 atusb->fw_ver_min = buffer[1];
747 atusb->fw_hw_type = buffer[2];
749 switch (atusb->fw_hw_type) {
754 atusb->data = &atusb_chip_data;
758 atusb->data = &atusb_chip_data;
762 atusb->data = &hulusb_chip_data;
766 atusb->err = -ENOTSUPP;
773 atusb->fw_ver_maj, atusb->fw_ver_min, hw_name,
774 atusb->fw_hw_type);
776 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 2) {
779 atusb->fw_ver_maj, atusb->fw_ver_min);
786 static int atusb_get_and_show_build(struct atusb *atusb)
788 struct usb_device *usb_dev = atusb->usb_dev;
796 ret = usb_control_msg(atusb->usb_dev, usb_rcvctrlpipe(usb_dev, 0), ATUSB_BUILD,
807 static int atusb_get_and_conf_chip(struct atusb *atusb)
809 struct usb_device *usb_dev = atusb->usb_dev;
812 struct ieee802154_hw *hw = atusb->hw;
861 atusb->hw->phy->supported.channels[0] = 0x7FFF800;
862 atusb->hw->phy->current_channel = 11; /* reset default */
863 atusb->hw->phy->supported.tx_powers = atusb_powers;
864 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers);
870 atusb->hw->phy->supported.channels[0] = 0x7FFF800;
871 atusb->hw->phy->current_channel = 11; /* reset default */
872 atusb->hw->phy->supported.tx_powers = atusb_powers;
873 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(atusb_powers);
879 atusb->hw->flags |= IEEE802154_HW_LBT;
880 atusb->hw->phy->supported.channels[0] = 0x00007FF;
881 atusb->hw->phy->supported.channels[2] = 0x00007FF;
882 atusb->hw->phy->current_channel = 5;
883 atusb->hw->phy->supported.lbt = NL802154_SUPPORTED_BOOL_BOTH;
884 atusb->hw->phy->supported.tx_powers = at86rf212_powers;
885 atusb->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf212_powers);
886 atusb->hw->phy->supported.cca_ed_levels = at86rf212_ed_levels_100;
887 atusb->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf212_ed_levels_100);
904 atusb->err = -ENODEV;
908 static int atusb_set_extended_addr(struct atusb *atusb)
910 struct usb_device *usb_dev = atusb->usb_dev;
919 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) {
920 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr);
925 ret = usb_control_msg_recv(atusb->usb_dev, 0, ATUSB_EUI64_READ, ATUSB_REQ_FROM_DEV, 0, 0,
929 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr);
937 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr);
939 atusb->hw->phy->perm_extended_addr = extended_addr;
940 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr);
955 struct atusb *atusb = NULL;
958 hw = ieee802154_alloc_hw(sizeof(struct atusb), &atusb_ops);
962 atusb = hw->priv;
963 atusb->hw = hw;
964 atusb->usb_dev = usb_get_dev(usb_dev);
965 usb_set_intfdata(interface, atusb);
967 atusb->shutdown = 0;
968 atusb->err = 0;
969 INIT_DELAYED_WORK(&atusb->work, atusb_work_urbs);
970 init_usb_anchor(&atusb->idle_urbs);
971 init_usb_anchor(&atusb->rx_urbs);
973 if (atusb_alloc_urbs(atusb, ATUSB_NUM_RX_URBS))
976 atusb->tx_dr.bRequestType = ATUSB_REQ_TO_DEV;
977 atusb->tx_dr.bRequest = ATUSB_TX;
978 atusb->tx_dr.wValue = cpu_to_le16(0);
980 atusb->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
981 if (!atusb->tx_urb)
986 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_RF_RESET, ATUSB_REQ_TO_DEV, 0, 0,
988 atusb_get_and_conf_chip(atusb);
989 atusb_get_and_show_revision(atusb);
990 atusb_get_and_show_build(atusb);
991 atusb_set_extended_addr(atusb);
993 if ((atusb->fw_ver_maj == 0 && atusb->fw_ver_min >= 3) || atusb->fw_ver_maj > 0)
996 ret = atusb_get_and_clear_error(atusb);
998 dev_err(&atusb->usb_dev->dev,
1012 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
1029 * reduced by interrupt latency in the atusb firmware.
1031 * atusb currently needs about 500 us to retrieve a maximum-sized
1040 atusb_write_subreg(atusb, SR_RX_SAFE_MODE, 1);
1042 usb_control_msg_send(atusb->usb_dev, 0, ATUSB_REG_WRITE, ATUSB_REQ_TO_DEV,
1045 ret = atusb_get_and_clear_error(atusb);
1049 dev_err(&atusb->usb_dev->dev,
1055 atusb_free_urbs(atusb);
1056 usb_kill_urb(atusb->tx_urb);
1057 usb_free_urb(atusb->tx_urb);
1065 struct atusb *atusb = usb_get_intfdata(interface);
1067 dev_dbg(&atusb->usb_dev->dev, "%s\n", __func__);
1069 atusb->shutdown = 1;
1070 cancel_delayed_work_sync(&atusb->work);
1072 usb_kill_anchored_urbs(&atusb->rx_urbs);
1073 atusb_free_urbs(atusb);
1074 usb_kill_urb(atusb->tx_urb);
1075 usb_free_urb(atusb->tx_urb);
1077 ieee802154_unregister_hw(atusb->hw);
1079 usb_put_dev(atusb->usb_dev);
1081 ieee802154_free_hw(atusb->hw);
1103 .name = "atusb",