| /* |
| * This file is part of the UWB stack for linux. |
| * |
| * Copyright (c) 2020-2021 Qorvo US, Inc. |
| * |
| * This software is provided under the GNU General Public License, version 2 |
| * (GPLv2), as well as under a Qorvo commercial license. |
| * |
| * You may choose to use this software under the terms of the GPLv2 License, |
| * version 2 ("GPLv2"), as published by the Free Software Foundation. |
| * You should have received a copy of the GPLv2 along with this program. If |
| * not, see <http://www.gnu.org/licenses/>. |
| * |
| * This program is distributed under the GPLv2 in the hope that it will be |
| * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GPLv2 for more |
| * details. |
| * |
| * If you cannot meet the requirements of the GPLv2, you may not use this |
| * software for any purpose without first obtaining a commercial license from |
| * Qorvo. Please contact Qorvo to inquire about licensing terms. |
| */ |
| |
| #ifndef NET_MCPS802154_SCHEDULE_H |
| #define NET_MCPS802154_SCHEDULE_H |
| |
| #include <linux/list.h> |
| #include <linux/module.h> |
| #include <linux/skbuff.h> |
| #include <net/genetlink.h> |
| #include <net/netlink.h> |
| |
| #include <net/mcps802154.h> |
| |
| struct mcps802154_nl_ranging_request; |
| |
| /** |
| * MCPS802154_DURATION_NO_CHANGE - Do not change duration. |
| */ |
| #define MCPS802154_DURATION_NO_CHANGE (-1) |
| |
| /** |
| * enum mcps802154_access_method - Method to implement an access. |
| * @MCPS802154_ACCESS_METHOD_NOTHING: |
| * Nothing to do, wait for end of region, or a schedule change. Internal, |
| * region handlers must return a NULL access if no access is possible. |
| * @MCPS802154_ACCESS_METHOD_IDLE: |
| * Nothing to do, wait for end of region, or a schedule change. |
| * Trust the access duration to not get the current time. |
| * @MCPS802154_ACCESS_METHOD_IMMEDIATE_RX: |
| * RX as soon as possible, without timeout, with auto-ack. |
| * @MCPS802154_ACCESS_METHOD_IMMEDIATE_TX: |
| * TX as soon as possible. Could be with or without ack request (AR). |
| * @MCPS802154_ACCESS_METHOD_MULTI: |
| * Multiple frames described in frames table. |
| * @MCPS802154_ACCESS_METHOD_VENDOR: |
| * Route all signals to access callbacks for vendor specific handling. |
| */ |
| enum mcps802154_access_method { |
| MCPS802154_ACCESS_METHOD_NOTHING, |
| MCPS802154_ACCESS_METHOD_IDLE, |
| MCPS802154_ACCESS_METHOD_IMMEDIATE_RX, |
| MCPS802154_ACCESS_METHOD_IMMEDIATE_TX, |
| MCPS802154_ACCESS_METHOD_MULTI, |
| MCPS802154_ACCESS_METHOD_VENDOR, |
| }; |
| |
| /** |
| * enum mcps802154_access_tx_return_reason - Reason of TX buffer return. |
| * @MCPS802154_ACCESS_TX_RETURN_REASON_CONSUMED: |
| * Frame was sent successfully. |
| * @MCPS802154_ACCESS_TX_RETURN_REASON_FAILURE: |
| * An attempt was done to deliver the frame, but it failed. |
| * @MCPS802154_ACCESS_TX_RETURN_REASON_CANCEL: |
| * No attempt was done to deliver the frame, or there was an unexpected |
| * error doing it. |
| */ |
| enum mcps802154_access_tx_return_reason { |
| MCPS802154_ACCESS_TX_RETURN_REASON_CONSUMED, |
| MCPS802154_ACCESS_TX_RETURN_REASON_FAILURE, |
| MCPS802154_ACCESS_TX_RETURN_REASON_CANCEL, |
| MCPS802154_TX_ERROR_HPDWARN, |
| }; |
| |
| /** |
| * struct mcps802154_access_frame - Information for a single frame for multiple |
| * frames method. |
| */ |
| struct mcps802154_access_frame { |
| /** |
| * @is_tx: True if frame is TX, else RX. |
| */ |
| bool is_tx; |
| union { |
| /** |
| * @tx_frame_config: Information for transmitting a frame. Should |
| * have rx_enable_after_tx_dtu == 0. |
| */ |
| struct mcps802154_tx_frame_config tx_frame_config; |
| /** |
| * @rx: Information for receiving a frame. |
| */ |
| struct { |
| /** |
| * @rx.frame_config: Information for enabling the |
| * receiver. |
| */ |
| struct mcps802154_rx_frame_config frame_config; |
| /** |
| * @rx.frame_info_flags_request: Information to request |
| * when a frame is received, see |
| * &enum mcps802154_rx_frame_info_flags. |
| */ |
| u16 frame_info_flags_request; |
| } rx; |
| }; |
| /** |
| * @sts_params: Pointer to STS parameters for this frame and all |
| * following frames. STS is still only used if requested in flags. For |
| * TX, this is read after mcps802154_access::tx_get_frame() is called, |
| * so it can be changed by the callback. For RX, this is read earlier, |
| * so it needs to be valid after mcps802154_access_ops::get_access(), or |
| * after the previous callback. |
| */ |
| const struct mcps802154_sts_params *sts_params; |
| }; |
| |
| /** |
| * struct mcps802154_region_demand - Access information for on demand |
| * schedulers. |
| */ |
| struct mcps802154_region_demand { |
| /** |
| * @timestamp_dtu: Start of the demand. |
| */ |
| u32 timestamp_dtu; |
| /** |
| * @max_duration_dtu: Maximum duration of the demand, 0 for endless. |
| */ |
| int max_duration_dtu; |
| }; |
| |
| /** |
| * struct mcps802154_access - Single medium access. |
| * |
| * This structure gives MCPS all the information needed to perform a single |
| * access. |
| */ |
| struct mcps802154_access { |
| /** |
| * @method: Method of access, see &enum mcps802154_access_method. |
| */ |
| enum mcps802154_access_method method; |
| union { |
| /** |
| * @common_ops: Callbacks to implement the access, common part |
| * to all access methods. |
| */ |
| struct mcps802154_access_common_ops *common_ops; |
| /** |
| * @ops: Callbacks to implement access with frames, unless |
| * a more specific structure is defined. |
| */ |
| struct mcps802154_access_ops *ops; |
| /** |
| * @vendor_ops: Callbacks to implement the vendor specific |
| * access. |
| */ |
| struct mcps802154_access_vendor_ops *vendor_ops; |
| }; |
| /** |
| * @timestamp_dtu: Start of the access, only valid when the access has |
| * a duration. Invalid for immediate accesses. |
| */ |
| u32 timestamp_dtu; |
| /** |
| * @duration_dtu: Duration of the access, or 0 if unknown (this is the |
| * case if the first frame is a RX with no timeout and the frame has not |
| * been received yet). |
| */ |
| int duration_dtu; |
| /** |
| * @n_frames: Number of frames in an access using multiple frames |
| * method. This can be changed by the &mcps802154_access_ops.rx_frame() |
| * callback. |
| */ |
| size_t n_frames; |
| /** |
| * @frames: Table of information for each frames in an access using |
| * multiple frames method. This can be changed by the |
| * &mcps802154_access_ops.rx_frame() callback. |
| */ |
| struct mcps802154_access_frame *frames; |
| /** |
| * @promiscuous: If true, promiscuous mode is activated for this access. |
| */ |
| bool promiscuous; |
| /** |
| * @hw_addr_filt: Hardware address filter parameters. This is used at the |
| * start of multiple frames access to change the filter for this access. |
| * The filter is restored after the access. |
| */ |
| struct ieee802154_hw_addr_filt hw_addr_filt; |
| /** |
| * @hw_addr_filt_changed: Hardware address filter parameters flags, |
| * see &enum ieee802154_hw_addr_filt_flags. |
| */ |
| unsigned long hw_addr_filt_changed; |
| /** |
| * @channel: If not %NULL, channel parameters for this access. This is |
| * set at the start of multiple frames access. Parameters are restored |
| * after the access. If %NULL, use default parameters set through |
| * ieee802154 interface. |
| */ |
| const struct mcps802154_channel *channel; |
| /** |
| * @hrp_uwb_params: If not NULL, parameters for a HRP UWB Phy set at the |
| * start of a multiple frames access. |
| */ |
| const struct mcps802154_hrp_uwb_params *hrp_uwb_params; |
| /** |
| * @error: contain the error from the llhw in order to propagate it to upper regions. |
| */ |
| int error; |
| }; |
| |
| /** |
| * struct mcps802154_access_common_ops - Callbacks to implement an access, |
| * common part to all access methods. |
| */ |
| struct mcps802154_access_common_ops { |
| /** |
| * @access_done: Called when the access is done, successfully or |
| * not, ignored if NULL. |
| * @error: Boolean used to signal internal MAC/driver/config error. |
| */ |
| void (*access_done)(struct mcps802154_access *access, bool error); |
| }; |
| |
| /** |
| * struct mcps802154_access_ops - Callbacks to implement an access. |
| * |
| * This is used for all accesses with frames unless a more specific structure is |
| * defined. |
| */ |
| struct mcps802154_access_ops { |
| /** |
| * @common: Common part of callbacks. |
| */ |
| struct mcps802154_access_common_ops common; |
| /** |
| * @rx_frame: Once a frame is received, it is given to this function. |
| * Buffer ownership is transferred to the callee. |
| * |
| * For multiple frames access method, the error parameter is used to |
| * inform of RX timeout or error. In case of RX timeout, info is NULL. |
| * In case of RX error, info can give some information about the error |
| * frame. |
| * |
| * The skb parameter can be NULL for frame without data. |
| */ |
| void (*rx_frame)(struct mcps802154_access *access, int frame_idx, |
| struct sk_buff *skb, |
| const struct mcps802154_rx_frame_info *info, |
| enum mcps802154_rx_error_type error); |
| /** |
| * @tx_get_frame: Return a frame to send, the buffer is lend to caller |
| * and should be returned with &mcps802154_access_ops.tx_return(). |
| * |
| * The return value can be NULL for frames without data. In this case, |
| * &mcps802154_access_ops.tx_return() will be called anyway, with a NULL |
| * pointer. |
| */ |
| struct sk_buff *(*tx_get_frame)(struct mcps802154_access *access, |
| int frame_idx); |
| /** |
| * @tx_return: Give back an unmodified buffer. |
| */ |
| void (*tx_return)(struct mcps802154_access *access, int frame_idx, |
| struct sk_buff *skb, |
| enum mcps802154_access_tx_return_reason reason); |
| /** |
| * @access_extend: Extend the current access with new frames. |
| * |
| * Current frame index and n_frames are reset before call. |
| * The region can override the frames array to extend the current |
| * access. |
| */ |
| void (*access_extend)(struct mcps802154_access *access); |
| }; |
| |
| /** |
| * struct mcps802154_access_vendor_ops - Callbacks to implement a vendor |
| * specific access. |
| * |
| * Each callback can return 0 to continue the access, 1 to stop it or an error. |
| * |
| * If access is stopped, the &mcps802154_access.timestamp_dtu and |
| * &mcps802154_access.duration_dtu are used to compute the next access, unless |
| * duration is 0, in this case the current date is requested from the driver. |
| * |
| * In case of error, the devices transition to the broken state. |
| * |
| * If the callback is missing this is treated like an error, except for |
| * &mcps802154_access_vendor_ops.handle, |
| * &mcps802154_access_vendor_ops.timer_expired and |
| * &mcps802154_access_vendor_ops.schedule_change which are ignored. |
| */ |
| struct mcps802154_access_vendor_ops { |
| /** |
| * @common: Common part of callbacks. |
| */ |
| struct mcps802154_access_common_ops common; |
| /** |
| * @handle: Called once to start the access, ignored if NULL. |
| */ |
| int (*handle)(struct mcps802154_access *access); |
| /** |
| * @rx_frame: Called when a frame reception is signaled, error if NULL. |
| */ |
| int (*rx_frame)(struct mcps802154_access *access); |
| /** |
| * @rx_timeout: Called when a reception timeout is signaled, error if NULL. |
| */ |
| int (*rx_timeout)(struct mcps802154_access *access); |
| /** |
| * @rx_error: Called when a reception error is signaled, error if NULL. |
| */ |
| int (*rx_error)(struct mcps802154_access *access, |
| enum mcps802154_rx_error_type error); |
| /** |
| * @tx_done: Called when end of transmission is signaled, error if NULL. |
| */ |
| int (*tx_done)(struct mcps802154_access *access); |
| /** |
| * @broken: Called when a unrecoverable error is signaled, error if NULL. |
| */ |
| int (*broken)(struct mcps802154_access *access); |
| /** |
| * @timer_expired: Called when a timer expired event is signaled, |
| * ignored if NULL. |
| */ |
| int (*timer_expired)(struct mcps802154_access *access); |
| /** |
| * @schedule_change: Called to handle schedule change, ignored if NULL. |
| */ |
| int (*schedule_change)(struct mcps802154_access *access); |
| }; |
| |
| /** |
| * struct mcps802154_region - An open region instance. Region handlers can have |
| * private data appended after this structure. |
| */ |
| struct mcps802154_region { |
| /** |
| * @ops: Callbacks for the region. |
| */ |
| const struct mcps802154_region_ops *ops; |
| /** |
| * @ca_entry: Entry in list of CA regions. |
| */ |
| struct list_head ca_entry; |
| /** |
| * @id: Assigned region ID. |
| */ |
| int id; |
| }; |
| |
| /** |
| * struct mcps802154_region_ops - Region callbacks, handle access for a specific |
| * region in schedule. |
| */ |
| struct mcps802154_region_ops { |
| /** |
| * @owner: Module owning this region, should be THIS_MODULE in most |
| * cases. |
| */ |
| struct module *owner; |
| /** |
| * @name: Region name. |
| */ |
| const char *name; |
| /** |
| * @registered_entry: Entry in list of registered regions. |
| */ |
| struct list_head registered_entry; |
| /** |
| * @open: Open an instance of this region, return a new region instance, |
| * or NULL in case of error. |
| */ |
| struct mcps802154_region *(*open)(struct mcps802154_llhw *llhw); |
| /** |
| * @close: Close a region instance. |
| */ |
| void (*close)(struct mcps802154_region *region); |
| /** |
| * @notify_stop: Notify a region that device has been stopped. |
| */ |
| void (*notify_stop)(struct mcps802154_region *region); |
| /** |
| * @set_parameters: Set region parameters, may be NULL. |
| */ |
| int (*set_parameters)(struct mcps802154_region *region, |
| const struct nlattr *attrs, |
| struct netlink_ext_ack *extack); |
| /** |
| * @call: Call region procedure, may be NULL. |
| */ |
| int (*call)(struct mcps802154_region *region, u32 call_id, |
| const struct nlattr *attrs, const struct genl_info *info); |
| /** |
| * @get_demand: Get access demand from a region, may be NULL. |
| */ |
| int (*get_demand)(struct mcps802154_region *region, |
| u32 next_timestamp_dtu, |
| struct mcps802154_region_demand *demand); |
| /** |
| * @get_access: Get access for a given region at the given timestamp. |
| * Access is valid until &mcps802154_access_ops.access_done() callback |
| * is called. Return NULL if access is not possible. |
| */ |
| struct mcps802154_access *(*get_access)( |
| struct mcps802154_region *region, u32 next_timestamp_dtu, |
| int next_in_region_dtu, int region_duration_dtu); |
| /** |
| * @xmit_skb: Transmit buffer. Warning: Bypass the FSM lock mechanism. |
| * Return 1 if the region accepted to transmit the buffer, 0 otherwise. |
| */ |
| int (*xmit_skb)(struct mcps802154_region *region, struct sk_buff *skb); |
| /** |
| * @deferred: Called at the end of event processing on request. See |
| * mcps802154_region_deferred. |
| */ |
| void (*deferred)(struct mcps802154_region *region); |
| }; |
| |
| /** |
| * struct mcps802154_schedule_update - Context valid during a schedule |
| * update. |
| */ |
| struct mcps802154_schedule_update { |
| /** |
| * @expected_start_timestamp_dtu: Expected start timestamp, based on the |
| * current access date and having the new schedule put right after the |
| * old one. |
| */ |
| u32 expected_start_timestamp_dtu; |
| /** |
| * @start_timestamp_dtu: Date of the schedule start, might be too far in |
| * the past for endless schedule. |
| */ |
| u32 start_timestamp_dtu; |
| /** |
| * @duration_dtu: Schedule duration or 0 for endless schedule. This is |
| * also 0 when the schedule is empty. |
| */ |
| int duration_dtu; |
| /** |
| * @n_regions: Number of regions in the schedule. |
| */ |
| size_t n_regions; |
| }; |
| |
| /** |
| * struct mcps802154_scheduler - An open scheduler instance. Schedulers can have |
| * private data appended after this structure. |
| */ |
| struct mcps802154_scheduler { |
| /** |
| * @n_regions: Number of regions possible to add in the scheduler, |
| * zero means infinite number of regions can be added to the scheduler. |
| */ |
| u32 n_regions; |
| /** |
| * @ops: Callbacks for the scheduler. |
| */ |
| const struct mcps802154_scheduler_ops *ops; |
| }; |
| |
| /** |
| * struct mcps802154_scheduler_ops - Callbacks for schedulers. A scheduler |
| * provides a schedule to MCPS and updates it when specific frames are |
| * received or schedule is no longer valid. |
| */ |
| struct mcps802154_scheduler_ops { |
| /** |
| * @owner: Module owning this scheduler, should be THIS_MODULE in most |
| * cases. |
| */ |
| struct module *owner; |
| /** |
| * @name: Scheduler name. |
| */ |
| const char *name; |
| /** |
| * @registered_entry: Entry in list of registered schedulers. |
| */ |
| struct list_head registered_entry; |
| /** |
| * @open: Attach a scheduler to a device. |
| */ |
| struct mcps802154_scheduler *(*open)(struct mcps802154_llhw *llhw); |
| /** |
| * @close: Detach and close a scheduler. |
| */ |
| void (*close)(struct mcps802154_scheduler *scheduler); |
| /** |
| * @notify_stop: Notify a scheduler that device has been stopped. |
| */ |
| void (*notify_stop)(struct mcps802154_scheduler *scheduler); |
| /** |
| * @set_parameters: Configure the scheduler. |
| */ |
| int (*set_parameters)(struct mcps802154_scheduler *scheduler, |
| const struct nlattr *attrs, |
| struct netlink_ext_ack *extack); |
| /** |
| * @call: Call scheduler specific procedure. |
| */ |
| int (*call)(struct mcps802154_scheduler *scheduler, u32 call_id, |
| const struct nlattr *attrs, const struct genl_info *info); |
| /** |
| * @update_schedule: Called to initialize and update the schedule. |
| */ |
| int (*update_schedule)( |
| struct mcps802154_scheduler *scheduler, |
| const struct mcps802154_schedule_update *schedule_update, |
| u32 next_timestamp_dtu); |
| /** |
| * @ranging_setup: Called to configure ranging. This is a temporary |
| * interface. |
| */ |
| int (*ranging_setup)( |
| struct mcps802154_scheduler *scheduler, |
| const struct mcps802154_nl_ranging_request *requests, |
| unsigned int n_requests); |
| /** |
| * @get_next_demands: Called to get an aggregated demand for the specified |
| * region. |
| */ |
| int (*get_next_demands)(struct mcps802154_scheduler *scheduler, |
| const struct mcps802154_region *region, |
| u32 timestamp_dtu, int duration_dtu, |
| int delta_dtu, |
| struct mcps802154_region_demand *demands); |
| }; |
| |
| /** |
| * mcps802154_region_register() - Register a region, to be called when your |
| * module is loaded. |
| * @region_ops: Region to register. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_region_register(struct mcps802154_region_ops *region_ops); |
| |
| /** |
| * mcps802154_region_unregister() - Unregister a region, to be called at module |
| * unloading. |
| * @region_ops: Region to unregister. |
| */ |
| void mcps802154_region_unregister(struct mcps802154_region_ops *region_ops); |
| |
| /** |
| * mcps802154_region_open() - Open a region, and set parameters. |
| * @llhw: Low-level device pointer. |
| * @name: Name of region to open. |
| * @params_attr: Nested attribute containing region parameters, may be NULL. |
| * @extack: Extended ACK report structure. |
| * |
| * Return: The open region or NULL on error. |
| */ |
| struct mcps802154_region * |
| mcps802154_region_open(struct mcps802154_llhw *llhw, const char *name, |
| const struct nlattr *params_attr, |
| struct netlink_ext_ack *extack); |
| |
| /** |
| * mcps802154_region_close() - Close a region. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| */ |
| void mcps802154_region_close(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region); |
| |
| /** |
| * mcps802154_region_notify_stop() - Notify a region that device has been |
| * stopped. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| */ |
| void mcps802154_region_notify_stop(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region); |
| |
| /** |
| * mcps802154_region_set_parameters() - Set parameters of an open region. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @params_attr: Nested attribute containing region parameters, may be NULL. |
| * @extack: Extended ACK report structure. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_region_set_parameters(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| const struct nlattr *params_attr, |
| struct netlink_ext_ack *extack); |
| |
| /** |
| * mcps802154_region_call() - Call specific procedure in this region. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @call_id: Identifier of the procedure, region specific. |
| * @params_attr: Nested attribute containing region parameters, may be NULL. |
| * @info: Request information. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_region_call(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, u32 call_id, |
| const struct nlattr *params_attr, |
| const struct genl_info *info); |
| |
| /** |
| * mcps802154_region_get_demand() - Get access demand from a region in order to |
| * help building a schedule. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @next_timestamp_dtu: Date of next access opportunity. |
| * @demand: Where to write the demand. |
| * |
| * If the region does not implement access demand, this function will request an |
| * endless demand starting at the next access opportunity. |
| * |
| * Return: 1 if data is available, 0 if no demand (do not want access) or error. |
| */ |
| int mcps802154_region_get_demand(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| u32 next_timestamp_dtu, |
| struct mcps802154_region_demand *demand); |
| |
| /** |
| * mcps802154_region_call_alloc_reply_skb() - Allocate buffer to send |
| * a response for a region call. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @call_id: Identifier of the procedure, region specific. |
| * @approx_len: Upper bound of the data to be put into the buffer. |
| * |
| * Return: An allocated and pre-filled buffer, or NULL on error. |
| */ |
| struct sk_buff * |
| mcps802154_region_call_alloc_reply_skb(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| u32 call_id, int approx_len); |
| |
| /** |
| * mcps802154_region_call_reply() - Send a previously allocated and filled |
| * reply buffer. |
| * @llhw: Low-level device pointer. |
| * @skb: Buffer to send. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_region_call_reply(struct mcps802154_llhw *llhw, |
| struct sk_buff *skb); |
| |
| /** |
| * mcps802154_region_event_alloc_skb() - Allocate buffer to send a notification |
| * for a region. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @call_id: Identifier of the procedure, region specific. |
| * @portid: Port identifier of the receiver. |
| * @approx_len: Upper bound of the data to be put into the buffer. |
| * @gfp: Allocation flags. |
| * |
| * Return: An allocated and pre-filled buffer, or NULL on error. |
| */ |
| struct sk_buff * |
| mcps802154_region_event_alloc_skb(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, u32 call_id, |
| u32 portid, int approx_len, gfp_t gfp); |
| |
| /** |
| * mcps802154_region_event() - Send a previously allocated and filled |
| * buffer. |
| * @llhw: Low-level device pointer. |
| * @skb: Buffer to send. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_region_event(struct mcps802154_llhw *llhw, struct sk_buff *skb); |
| |
| /** |
| * mcps802154_region_xmit_resume() - Signal buffer transmit can resume. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @queue_index: Queue index. |
| */ |
| void mcps802154_region_xmit_resume(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| int queue_index); |
| |
| /** |
| * mcps802154_region_xmit_done() - Signal buffer transmit completion. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @skb: Buffer. |
| * @ok: True if the buffer was successfully transmitted. |
| */ |
| void mcps802154_region_xmit_done(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| struct sk_buff *skb, bool ok); |
| |
| /** |
| * mcps802154_region_rx_skb() - Signal the reception of a buffer. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * @skb: Received buffer. |
| * @lqi: Link Quality Indicator (LQI). |
| */ |
| void mcps802154_region_rx_skb(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region, |
| struct sk_buff *skb, u8 lqi); |
| |
| /** |
| * mcps802154_region_deferred() - Request to call the deferred callback at the |
| * end of event processing. |
| * @llhw: Low-level device pointer. |
| * @region: Pointer to the open region. |
| * |
| * Event is coming from the low-level device. The region must be the one which |
| * triggered the event (region must not call this after a get_access). If this |
| * is not respected, this call can return -EINVAL in case two regions request |
| * the deferred callback at the same time. |
| * |
| * Return: 0 or -EINVAL. |
| */ |
| int mcps802154_region_deferred(struct mcps802154_llhw *llhw, |
| struct mcps802154_region *region); |
| |
| /** |
| * mcps802154_scheduler_register() - Register a scheduler, to be called when |
| * your module is loaded. |
| * @scheduler_ops: Scheduler to register. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_scheduler_register( |
| struct mcps802154_scheduler_ops *scheduler_ops); |
| |
| /** |
| * mcps802154_scheduler_unregister() - Unregister a scheduler, to be called at |
| * module unloading. |
| * @scheduler_ops: Scheduler to unregister. |
| */ |
| void mcps802154_scheduler_unregister( |
| struct mcps802154_scheduler_ops *scheduler_ops); |
| |
| /** |
| * mcps802154_schedule_set_start() - Change the currently updated schedule start |
| * timestamp. |
| * @schedule_update: Schedule update context. |
| * @start_timestamp_dtu: New start timestamp. |
| * |
| * Return: 0 or -EINVAL if arguments are garbage. |
| */ |
| int mcps802154_schedule_set_start( |
| const struct mcps802154_schedule_update *schedule_update, |
| u32 start_timestamp_dtu); |
| |
| /** |
| * mcps802154_schedule_recycle() - Purge or recycle the current schedule. |
| * @schedule_update: Schedule update context. |
| * @n_keeps: Number of regions to keep from the previous schedule. |
| * @last_region_duration_dtu: |
| * Duration of the last region, or MCPS802154_DURATION_NO_CHANGE to keep it |
| * unchanged. |
| * |
| * Return: 0 or -EINVAL if arguments are garbage. |
| */ |
| int mcps802154_schedule_recycle( |
| const struct mcps802154_schedule_update *schedule_update, |
| size_t n_keeps, int last_region_duration_dtu); |
| |
| /** |
| * mcps802154_schedule_add_region() - Add a new region to the currently updated |
| * schedule. |
| * @schedule_update: Schedule update context. |
| * @region: Region to add. |
| * @start_dtu: Region start from the start of the schedule. |
| * @duration_dtu: Region duration, or 0 for endless region. |
| * @once: Schedule the region once, ignoring the remaining region duration. |
| * |
| * Return: 0 or error. |
| */ |
| int mcps802154_schedule_add_region( |
| const struct mcps802154_schedule_update *schedule_update, |
| struct mcps802154_region *region, int start_dtu, int duration_dtu, |
| bool once); |
| |
| /** |
| * mcps802154_reschedule() - Request to change access as possible. |
| * @llhw: Low-level device pointer. |
| * |
| * Use this to reevaluate the current access as new data is available. For |
| * example, the device may be sleeping, or waiting to receive a frame, and you |
| * have a fresh frame to send. |
| * |
| * Request may be ignored if the device is busy, in which case the current |
| * access will be done before the new access is examined. |
| */ |
| void mcps802154_reschedule(struct mcps802154_llhw *llhw); |
| |
| /** |
| * mcps802154_schedule_invalidate() - Request to invalidate the schedule. |
| * @llhw: Low-level device pointer. |
| * |
| * FSM mutex should be locked. |
| * |
| * Invalidate the current schedule, which will result on a schedule change. |
| * This API should be called from external modules to force schedule change, |
| * when for example some parameters changed. |
| */ |
| void mcps802154_schedule_invalidate(struct mcps802154_llhw *llhw); |
| |
| /** |
| * mcps802154_schedule_get_regions() - Get opened regions. |
| * @llhw: Low-level device pointer. |
| * @regions: pointer to list of regions. |
| * |
| * FSM mutex should be locked. |
| * |
| * Get the list of current regions opened. |
| * |
| * Return: Number of regions. |
| */ |
| int mcps802154_schedule_get_regions(struct mcps802154_llhw *llhw, |
| struct list_head **regions); |
| |
| /** |
| * mcps802154_schedule_get_next_demands() - Get an aggregated demand for the |
| * specified region. |
| * @llhw: Low-level device pointer. |
| * @region: Region. |
| * @timestamp_dtu: Timestamp from which demands must be computed. |
| * @duration_dtu: Duration for which demands are considered. |
| * @delta_dtu: Maximum gap between two demands. |
| * @demands: Aggregated demand. |
| * |
| * Return: 1 if demand is returned, 0 if no demand or error. |
| */ |
| int mcps802154_schedule_get_next_demands( |
| struct mcps802154_llhw *llhw, const struct mcps802154_region *region, |
| u32 timestamp_dtu, int duration_dtu, int delta_dtu, |
| struct mcps802154_region_demand *demands); |
| |
| #endif /* NET_MCPS802154_SCHEDULE_H */ |