Lines Matching +full:supported +full:- +full:hw
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Copyright 2007-2012 Siemens AG
10 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
69 struct ieee802154_hw *hw; member
84 static int hwsim_hw_ed(struct ieee802154_hw *hw, u8 *level) in hwsim_hw_ed() argument
91 static int hwsim_hw_channel(struct ieee802154_hw *hw, u8 page, u8 channel) in hwsim_hw_channel() argument
93 struct hwsim_phy *phy = hw->priv; in hwsim_hw_channel()
98 return -ENOMEM; in hwsim_hw_channel()
100 pib->page = page; in hwsim_hw_channel()
101 pib->channel = channel; in hwsim_hw_channel()
103 pib_old = rtnl_dereference(phy->pib); in hwsim_hw_channel()
104 rcu_assign_pointer(phy->pib, pib); in hwsim_hw_channel()
109 static int hwsim_hw_xmit(struct ieee802154_hw *hw, struct sk_buff *skb) in hwsim_hw_xmit() argument
111 struct hwsim_phy *current_phy = hw->priv; in hwsim_hw_xmit()
116 WARN_ON(current_phy->suspended); in hwsim_hw_xmit()
119 current_pib = rcu_dereference(current_phy->pib); in hwsim_hw_xmit()
120 list_for_each_entry_rcu(e, ¤t_phy->edges, list) { in hwsim_hw_xmit()
126 if (e->endpoint->suspended) in hwsim_hw_xmit()
129 endpoint_pib = rcu_dereference(e->endpoint->pib); in hwsim_hw_xmit()
130 if (current_pib->page == endpoint_pib->page && in hwsim_hw_xmit()
131 current_pib->channel == endpoint_pib->channel) { in hwsim_hw_xmit()
134 einfo = rcu_dereference(e->info); in hwsim_hw_xmit()
136 ieee802154_rx_irqsafe(e->endpoint->hw, newskb, in hwsim_hw_xmit()
137 einfo->lqi); in hwsim_hw_xmit()
142 ieee802154_xmit_complete(hw, skb, false); in hwsim_hw_xmit()
146 static int hwsim_hw_start(struct ieee802154_hw *hw) in hwsim_hw_start() argument
148 struct hwsim_phy *phy = hw->priv; in hwsim_hw_start()
150 phy->suspended = false; in hwsim_hw_start()
154 static void hwsim_hw_stop(struct ieee802154_hw *hw) in hwsim_hw_stop() argument
156 struct hwsim_phy *phy = hw->priv; in hwsim_hw_stop()
158 phy->suspended = true; in hwsim_hw_stop()
162 hwsim_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on) in hwsim_set_promiscuous_mode() argument
179 return hwsim_add_one(info, &mac802154hwsim_dev->dev, false); in hwsim_new_radio_nl()
185 s64 idx = -1; in hwsim_del_radio_nl()
187 if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]) in hwsim_del_radio_nl()
188 return -EINVAL; in hwsim_del_radio_nl()
190 idx = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]); in hwsim_del_radio_nl()
194 if (idx == phy->idx) { in hwsim_del_radio_nl()
202 return -ENODEV; in hwsim_del_radio_nl()
212 ret = nla_put_u32(skb, MAC802154_HWSIM_ATTR_RADIO_ID, phy->idx); in append_radio_msg()
217 if (list_empty(&phy->edges)) { in append_radio_msg()
226 return -ENOBUFS; in append_radio_msg()
229 list_for_each_entry_rcu(e, &phy->edges, list) { in append_radio_msg()
235 return -ENOBUFS; in append_radio_msg()
239 e->endpoint->idx); in append_radio_msg()
247 einfo = rcu_dereference(e->info); in append_radio_msg()
249 einfo->lqi); in append_radio_msg()
276 return -EMSGSIZE; in hwsim_get_radio()
297 int idx, res = -ENODEV; in hwsim_get_radio_nl()
299 if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]) in hwsim_get_radio_nl()
300 return -EINVAL; in hwsim_get_radio_nl()
301 idx = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]); in hwsim_get_radio_nl()
305 if (phy->idx != idx) in hwsim_get_radio_nl()
310 res = -ENOMEM; in hwsim_get_radio_nl()
314 res = hwsim_get_radio(skb, phy, info->snd_portid, in hwsim_get_radio_nl()
315 info->snd_seq, NULL, 0); in hwsim_get_radio_nl()
334 int idx = cb->args[0]; in hwsim_dump_radio_nl()
344 if (phy->idx < idx) in hwsim_dump_radio_nl()
347 res = hwsim_get_radio(skb, phy, NETLINK_CB(cb->skb).portid, in hwsim_dump_radio_nl()
348 cb->nlh->nlmsg_seq, cb, NLM_F_MULTI); in hwsim_dump_radio_nl()
352 idx = phy->idx + 1; in hwsim_dump_radio_nl()
355 cb->args[0] = idx; in hwsim_dump_radio_nl()
359 return skb->len; in hwsim_dump_radio_nl()
368 if (phy->idx == idx) in hwsim_get_radio_by_id()
395 einfo->lqi = 0xff; in hwsim_alloc_edge()
396 rcu_assign_pointer(e->info, einfo); in hwsim_alloc_edge()
397 e->endpoint = endpoint; in hwsim_alloc_edge()
407 einfo = rcu_dereference(e->info); in hwsim_free_edge()
421 if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] || in hwsim_new_edge_nl()
422 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) in hwsim_new_edge_nl()
423 return -EINVAL; in hwsim_new_edge_nl()
425 …if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_H… in hwsim_new_edge_nl()
426 return -EINVAL; in hwsim_new_edge_nl()
429 return -EINVAL; in hwsim_new_edge_nl()
431 v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]); in hwsim_new_edge_nl()
435 return -EINVAL; in hwsim_new_edge_nl()
441 return -ENOENT; in hwsim_new_edge_nl()
447 return -ENOENT; in hwsim_new_edge_nl()
451 list_for_each_entry_rcu(e, &phy_v0->edges, list) { in hwsim_new_edge_nl()
452 if (e->endpoint->idx == v1) { in hwsim_new_edge_nl()
455 return -EEXIST; in hwsim_new_edge_nl()
463 return -ENOMEM; in hwsim_new_edge_nl()
465 list_add_rcu(&e->list, &phy_v0->edges); in hwsim_new_edge_nl()
483 if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] || in hwsim_del_edge_nl()
484 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) in hwsim_del_edge_nl()
485 return -EINVAL; in hwsim_del_edge_nl()
487 …if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_H… in hwsim_del_edge_nl()
488 return -EINVAL; in hwsim_del_edge_nl()
491 return -EINVAL; in hwsim_del_edge_nl()
493 v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]); in hwsim_del_edge_nl()
500 return -ENOENT; in hwsim_del_edge_nl()
504 list_for_each_entry_rcu(e, &phy_v0->edges, list) { in hwsim_del_edge_nl()
505 if (e->endpoint->idx == v1) { in hwsim_del_edge_nl()
507 list_del_rcu(&e->list); in hwsim_del_edge_nl()
509 /* same again - wait until list changes are done */ in hwsim_del_edge_nl()
519 return -ENOENT; in hwsim_del_edge_nl()
531 if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] || in hwsim_set_edge_lqi()
532 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) in hwsim_set_edge_lqi()
533 return -EINVAL; in hwsim_set_edge_lqi()
535 …if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_H… in hwsim_set_edge_lqi()
536 return -EINVAL; in hwsim_set_edge_lqi()
540 return -EINVAL; in hwsim_set_edge_lqi()
542 v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]); in hwsim_set_edge_lqi()
550 return -ENOENT; in hwsim_set_edge_lqi()
556 return -ENOMEM; in hwsim_set_edge_lqi()
560 list_for_each_entry_rcu(e, &phy_v0->edges, list) { in hwsim_set_edge_lqi()
561 if (e->endpoint->idx == v1) { in hwsim_set_edge_lqi()
562 einfo->lqi = lqi; in hwsim_set_edge_lqi()
563 rcu_assign_pointer(e->info, einfo); in hwsim_set_edge_lqi()
574 return -ENOENT; in hwsim_set_edge_lqi()
683 list_for_each_entry_rcu(e, &tmp->edges, list) { in hwsim_edge_unsubscribe_me()
684 if (e->endpoint->idx == phy->idx) { in hwsim_edge_unsubscribe_me()
685 list_del_rcu(&e->list); in hwsim_edge_unsubscribe_me()
705 list_add_rcu(&e->list, &phy->edges); in hwsim_subscribe_all_others()
713 list_add_rcu(&e->list, &sub->edges); in hwsim_subscribe_all_others()
722 list_for_each_entry_rcu(e, &phy->edges, list) { in hwsim_subscribe_all_others()
723 list_del_rcu(&e->list); in hwsim_subscribe_all_others()
727 return -ENOMEM; in hwsim_subscribe_all_others()
733 struct ieee802154_hw *hw; in hwsim_add_one() local
741 hw = ieee802154_alloc_hw(sizeof(*phy), &hwsim_ops); in hwsim_add_one()
742 if (!hw) in hwsim_add_one()
743 return -ENOMEM; in hwsim_add_one()
745 phy = hw->priv; in hwsim_add_one()
746 phy->hw = hw; in hwsim_add_one()
748 /* 868 MHz BPSK 802.15.4-2003 */ in hwsim_add_one()
749 hw->phy->supported.channels[0] |= 1; in hwsim_add_one()
750 /* 915 MHz BPSK 802.15.4-2003 */ in hwsim_add_one()
751 hw->phy->supported.channels[0] |= 0x7fe; in hwsim_add_one()
752 /* 2.4 GHz O-QPSK 802.15.4-2003 */ in hwsim_add_one()
753 hw->phy->supported.channels[0] |= 0x7FFF800; in hwsim_add_one()
754 /* 868 MHz ASK 802.15.4-2006 */ in hwsim_add_one()
755 hw->phy->supported.channels[1] |= 1; in hwsim_add_one()
756 /* 915 MHz ASK 802.15.4-2006 */ in hwsim_add_one()
757 hw->phy->supported.channels[1] |= 0x7fe; in hwsim_add_one()
758 /* 868 MHz O-QPSK 802.15.4-2006 */ in hwsim_add_one()
759 hw->phy->supported.channels[2] |= 1; in hwsim_add_one()
760 /* 915 MHz O-QPSK 802.15.4-2006 */ in hwsim_add_one()
761 hw->phy->supported.channels[2] |= 0x7fe; in hwsim_add_one()
762 /* 2.4 GHz CSS 802.15.4a-2007 */ in hwsim_add_one()
763 hw->phy->supported.channels[3] |= 0x3fff; in hwsim_add_one()
764 /* UWB Sub-gigahertz 802.15.4a-2007 */ in hwsim_add_one()
765 hw->phy->supported.channels[4] |= 1; in hwsim_add_one()
766 /* UWB Low band 802.15.4a-2007 */ in hwsim_add_one()
767 hw->phy->supported.channels[4] |= 0x1e; in hwsim_add_one()
768 /* UWB High band 802.15.4a-2007 */ in hwsim_add_one()
769 hw->phy->supported.channels[4] |= 0xffe0; in hwsim_add_one()
770 /* 750 MHz O-QPSK 802.15.4c-2009 */ in hwsim_add_one()
771 hw->phy->supported.channels[5] |= 0xf; in hwsim_add_one()
772 /* 750 MHz MPSK 802.15.4c-2009 */ in hwsim_add_one()
773 hw->phy->supported.channels[5] |= 0xf0; in hwsim_add_one()
774 /* 950 MHz BPSK 802.15.4d-2009 */ in hwsim_add_one()
775 hw->phy->supported.channels[6] |= 0x3ff; in hwsim_add_one()
776 /* 950 MHz GFSK 802.15.4d-2009 */ in hwsim_add_one()
777 hw->phy->supported.channels[6] |= 0x3ffc00; in hwsim_add_one()
779 ieee802154_random_extended_addr(&hw->phy->perm_extended_addr); in hwsim_add_one()
782 hw->phy->current_channel = 13; in hwsim_add_one()
785 err = -ENOMEM; in hwsim_add_one()
789 rcu_assign_pointer(phy->pib, pib); in hwsim_add_one()
790 phy->idx = idx; in hwsim_add_one()
791 INIT_LIST_HEAD(&phy->edges); in hwsim_add_one()
793 hw->flags = IEEE802154_HW_PROMISCUOUS; in hwsim_add_one()
794 hw->parent = dev; in hwsim_add_one()
796 err = ieee802154_register_hw(hw); in hwsim_add_one()
808 list_add_tail(&phy->list, &hwsim_phys); in hwsim_add_one()
816 ieee802154_unregister_hw(phy->hw); in hwsim_add_one()
820 ieee802154_free_hw(phy->hw); in hwsim_add_one()
831 list_del(&phy->list); in hwsim_del()
834 list_for_each_entry_rcu(e, &phy->edges, list) { in hwsim_del()
835 list_del_rcu(&e->list); in hwsim_del()
838 pib = rcu_dereference(phy->pib); in hwsim_del()
843 ieee802154_unregister_hw(phy->hw); in hwsim_del()
844 ieee802154_free_hw(phy->hw); in hwsim_del()
853 err = hwsim_add_one(NULL, &pdev->dev, true); in hwsim_probe()
858 dev_info(&pdev->dev, "Added 2 mac802154 hwsim hardware radios\n"); in hwsim_probe()
898 -1, NULL, 0); in hwsim_init_module()