1 // SPDX-License-Identifier: GPL-2.0-only
3 * MAC commands interface
5 * Copyright 2007-2012 Siemens AG
8 * Sergey Lapin <slapin@ossfans.org>
9 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
10 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
13 #include <linux/skbuff.h>
14 #include <linux/if_arp.h>
15 #include <linux/ieee802154.h>
17 #include <net/ieee802154_netdev.h>
18 #include <net/cfg802154.h>
19 #include <net/mac802154.h>
21 #include "ieee802154_i.h"
22 #include "driver-ops.h"
24 static int mac802154_mlme_start_req(struct net_device
*dev
,
25 struct ieee802154_addr
*addr
,
27 u8 bcn_ord
, u8 sf_ord
,
31 struct ieee802154_llsec_params params
;
36 BUG_ON(addr
->mode
!= IEEE802154_ADDR_SHORT
);
38 dev
->ieee802154_ptr
->pan_id
= addr
->pan_id
;
39 dev
->ieee802154_ptr
->short_addr
= addr
->short_addr
;
40 mac802154_dev_set_page_channel(dev
, page
, channel
);
42 params
.pan_id
= addr
->pan_id
;
43 changed
|= IEEE802154_LLSEC_PARAM_PAN_ID
;
45 params
.hwaddr
= ieee802154_devaddr_from_raw(dev
->dev_addr
);
46 changed
|= IEEE802154_LLSEC_PARAM_HWADDR
;
48 params
.coord_hwaddr
= params
.hwaddr
;
49 changed
|= IEEE802154_LLSEC_PARAM_COORD_HWADDR
;
51 params
.coord_shortaddr
= addr
->short_addr
;
52 changed
|= IEEE802154_LLSEC_PARAM_COORD_SHORTADDR
;
54 return mac802154_set_params(dev
, ¶ms
, changed
);
57 static int mac802154_set_mac_params(struct net_device
*dev
,
58 const struct ieee802154_mac_params
*params
)
60 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
61 struct ieee802154_local
*local
= sdata
->local
;
62 struct wpan_dev
*wpan_dev
= &sdata
->wpan_dev
;
68 wpan_dev
->wpan_phy
->transmit_power
= params
->transmit_power
;
69 wpan_dev
->wpan_phy
->cca
= params
->cca
;
70 wpan_dev
->wpan_phy
->cca_ed_level
= params
->cca_ed_level
;
73 wpan_dev
->min_be
= params
->min_be
;
74 wpan_dev
->max_be
= params
->max_be
;
75 wpan_dev
->csma_retries
= params
->csma_retries
;
76 wpan_dev
->frame_retries
= params
->frame_retries
;
77 wpan_dev
->lbt
= params
->lbt
;
79 if (local
->hw
.phy
->flags
& WPAN_PHY_FLAG_TXPOWER
) {
80 ret
= drv_set_tx_power(local
, params
->transmit_power
);
85 if (local
->hw
.phy
->flags
& WPAN_PHY_FLAG_CCA_MODE
) {
86 ret
= drv_set_cca_mode(local
, ¶ms
->cca
);
91 if (local
->hw
.phy
->flags
& WPAN_PHY_FLAG_CCA_ED_LEVEL
) {
92 ret
= drv_set_cca_ed_level(local
, params
->cca_ed_level
);
100 static void mac802154_get_mac_params(struct net_device
*dev
,
101 struct ieee802154_mac_params
*params
)
103 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
104 struct wpan_dev
*wpan_dev
= &sdata
->wpan_dev
;
109 params
->transmit_power
= wpan_dev
->wpan_phy
->transmit_power
;
110 params
->cca
= wpan_dev
->wpan_phy
->cca
;
111 params
->cca_ed_level
= wpan_dev
->wpan_phy
->cca_ed_level
;
114 params
->min_be
= wpan_dev
->min_be
;
115 params
->max_be
= wpan_dev
->max_be
;
116 params
->csma_retries
= wpan_dev
->csma_retries
;
117 params
->frame_retries
= wpan_dev
->frame_retries
;
118 params
->lbt
= wpan_dev
->lbt
;
121 static const struct ieee802154_llsec_ops mac802154_llsec_ops
= {
122 .get_params
= mac802154_get_params
,
123 .set_params
= mac802154_set_params
,
124 .add_key
= mac802154_add_key
,
125 .del_key
= mac802154_del_key
,
126 .add_dev
= mac802154_add_dev
,
127 .del_dev
= mac802154_del_dev
,
128 .add_devkey
= mac802154_add_devkey
,
129 .del_devkey
= mac802154_del_devkey
,
130 .add_seclevel
= mac802154_add_seclevel
,
131 .del_seclevel
= mac802154_del_seclevel
,
132 .lock_table
= mac802154_lock_table
,
133 .get_table
= mac802154_get_table
,
134 .unlock_table
= mac802154_unlock_table
,
137 struct ieee802154_mlme_ops mac802154_mlme_wpan
= {
138 .start_req
= mac802154_mlme_start_req
,
140 .llsec
= &mac802154_llsec_ops
,
142 .set_mac_params
= mac802154_set_mac_params
,
143 .get_mac_params
= mac802154_get_mac_params
,