Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  * Surface Serial Hub (SSH) protocol and communication interface.
0004  *
0005  * Lower-level communication layers and SSH protocol definitions for the
0006  * Surface System Aggregator Module (SSAM). Provides the interface for basic
0007  * packet- and request-based communication with the SSAM EC via SSH.
0008  *
0009  * Copyright (C) 2019-2021 Maximilian Luz <luzmaximilian@gmail.com>
0010  */
0011 
0012 #ifndef _LINUX_SURFACE_AGGREGATOR_SERIAL_HUB_H
0013 #define _LINUX_SURFACE_AGGREGATOR_SERIAL_HUB_H
0014 
0015 #include <linux/crc-ccitt.h>
0016 #include <linux/kref.h>
0017 #include <linux/ktime.h>
0018 #include <linux/list.h>
0019 #include <linux/types.h>
0020 
0021 
0022 /* -- Data structures for SAM-over-SSH communication. ----------------------- */
0023 
0024 /**
0025  * enum ssh_frame_type - Frame types for SSH frames.
0026  *
0027  * @SSH_FRAME_TYPE_DATA_SEQ:
0028  *  Indicates a data frame, followed by a payload with the length specified
0029  *  in the ``struct ssh_frame.len`` field. This frame is sequenced, meaning
0030  *  that an ACK is required.
0031  *
0032  * @SSH_FRAME_TYPE_DATA_NSQ:
0033  *  Same as %SSH_FRAME_TYPE_DATA_SEQ, but unsequenced, meaning that the
0034  *  message does not have to be ACKed.
0035  *
0036  * @SSH_FRAME_TYPE_ACK:
0037  *  Indicates an ACK message.
0038  *
0039  * @SSH_FRAME_TYPE_NAK:
0040  *  Indicates an error response for previously sent frame. In general, this
0041  *  means that the frame and/or payload is malformed, e.g. a CRC is wrong.
0042  *  For command-type payloads, this can also mean that the command is
0043  *  invalid.
0044  */
0045 enum ssh_frame_type {
0046     SSH_FRAME_TYPE_DATA_SEQ = 0x80,
0047     SSH_FRAME_TYPE_DATA_NSQ = 0x00,
0048     SSH_FRAME_TYPE_ACK      = 0x40,
0049     SSH_FRAME_TYPE_NAK      = 0x04,
0050 };
0051 
0052 /**
0053  * struct ssh_frame - SSH communication frame.
0054  * @type: The type of the frame. See &enum ssh_frame_type.
0055  * @len:  The length of the frame payload directly following the CRC for this
0056  *        frame. Does not include the final CRC for that payload.
0057  * @seq:  The sequence number for this message/exchange.
0058  */
0059 struct ssh_frame {
0060     u8 type;
0061     __le16 len;
0062     u8 seq;
0063 } __packed;
0064 
0065 static_assert(sizeof(struct ssh_frame) == 4);
0066 
0067 /*
0068  * SSH_FRAME_MAX_PAYLOAD_SIZE - Maximum SSH frame payload length in bytes.
0069  *
0070  * This is the physical maximum length of the protocol. Implementations may
0071  * set a more constrained limit.
0072  */
0073 #define SSH_FRAME_MAX_PAYLOAD_SIZE  U16_MAX
0074 
0075 /**
0076  * enum ssh_payload_type - Type indicator for the SSH payload.
0077  * @SSH_PLD_TYPE_CMD: The payload is a command structure with optional command
0078  *                    payload.
0079  */
0080 enum ssh_payload_type {
0081     SSH_PLD_TYPE_CMD = 0x80,
0082 };
0083 
0084 /**
0085  * struct ssh_command - Payload of a command-type frame.
0086  * @type:    The type of the payload. See &enum ssh_payload_type. Should be
0087  *           SSH_PLD_TYPE_CMD for this struct.
0088  * @tc:      Command target category.
0089  * @tid_out: Output target ID. Should be zero if this an incoming (EC to host)
0090  *           message.
0091  * @tid_in:  Input target ID. Should be zero if this is an outgoing (host to
0092  *           EC) message.
0093  * @iid:     Instance ID.
0094  * @rqid:    Request ID. Used to match requests with responses and differentiate
0095  *           between responses and events.
0096  * @cid:     Command ID.
0097  */
0098 struct ssh_command {
0099     u8 type;
0100     u8 tc;
0101     u8 tid_out;
0102     u8 tid_in;
0103     u8 iid;
0104     __le16 rqid;
0105     u8 cid;
0106 } __packed;
0107 
0108 static_assert(sizeof(struct ssh_command) == 8);
0109 
0110 /*
0111  * SSH_COMMAND_MAX_PAYLOAD_SIZE - Maximum SSH command payload length in bytes.
0112  *
0113  * This is the physical maximum length of the protocol. Implementations may
0114  * set a more constrained limit.
0115  */
0116 #define SSH_COMMAND_MAX_PAYLOAD_SIZE \
0117     (SSH_FRAME_MAX_PAYLOAD_SIZE - sizeof(struct ssh_command))
0118 
0119 /*
0120  * SSH_MSG_LEN_BASE - Base-length of a SSH message.
0121  *
0122  * This is the minimum number of bytes required to form a message. The actual
0123  * message length is SSH_MSG_LEN_BASE plus the length of the frame payload.
0124  */
0125 #define SSH_MSG_LEN_BASE    (sizeof(struct ssh_frame) + 3ull * sizeof(u16))
0126 
0127 /*
0128  * SSH_MSG_LEN_CTRL - Length of a SSH control message.
0129  *
0130  * This is the length of a SSH control message, which is equal to a SSH
0131  * message without any payload.
0132  */
0133 #define SSH_MSG_LEN_CTRL    SSH_MSG_LEN_BASE
0134 
0135 /**
0136  * SSH_MESSAGE_LENGTH() - Compute length of SSH message.
0137  * @payload_size: Length of the payload inside the SSH frame.
0138  *
0139  * Return: Returns the length of a SSH message with payload of specified size.
0140  */
0141 #define SSH_MESSAGE_LENGTH(payload_size) (SSH_MSG_LEN_BASE + (payload_size))
0142 
0143 /**
0144  * SSH_COMMAND_MESSAGE_LENGTH() - Compute length of SSH command message.
0145  * @payload_size: Length of the command payload.
0146  *
0147  * Return: Returns the length of a SSH command message with command payload of
0148  * specified size.
0149  */
0150 #define SSH_COMMAND_MESSAGE_LENGTH(payload_size) \
0151     SSH_MESSAGE_LENGTH(sizeof(struct ssh_command) + (payload_size))
0152 
0153 /**
0154  * SSH_MSGOFFSET_FRAME() - Compute offset in SSH message to specified field in
0155  * frame.
0156  * @field: The field for which the offset should be computed.
0157  *
0158  * Return: Returns the offset of the specified &struct ssh_frame field in the
0159  * raw SSH message data as. Takes SYN bytes (u16) preceding the frame into
0160  * account.
0161  */
0162 #define SSH_MSGOFFSET_FRAME(field) \
0163     (sizeof(u16) + offsetof(struct ssh_frame, field))
0164 
0165 /**
0166  * SSH_MSGOFFSET_COMMAND() - Compute offset in SSH message to specified field
0167  * in command.
0168  * @field: The field for which the offset should be computed.
0169  *
0170  * Return: Returns the offset of the specified &struct ssh_command field in
0171  * the raw SSH message data. Takes SYN bytes (u16) preceding the frame and the
0172  * frame CRC (u16) between frame and command into account.
0173  */
0174 #define SSH_MSGOFFSET_COMMAND(field) \
0175     (2ull * sizeof(u16) + sizeof(struct ssh_frame) \
0176         + offsetof(struct ssh_command, field))
0177 
0178 /*
0179  * SSH_MSG_SYN - SSH message synchronization (SYN) bytes as u16.
0180  */
0181 #define SSH_MSG_SYN     ((u16)0x55aa)
0182 
0183 /**
0184  * ssh_crc() - Compute CRC for SSH messages.
0185  * @buf: The pointer pointing to the data for which the CRC should be computed.
0186  * @len: The length of the data for which the CRC should be computed.
0187  *
0188  * Return: Returns the CRC computed on the provided data, as used for SSH
0189  * messages.
0190  */
0191 static inline u16 ssh_crc(const u8 *buf, size_t len)
0192 {
0193     return crc_ccitt_false(0xffff, buf, len);
0194 }
0195 
0196 /*
0197  * SSH_NUM_EVENTS - The number of reserved event IDs.
0198  *
0199  * The number of reserved event IDs, used for registering an SSH event
0200  * handler. Valid event IDs are numbers below or equal to this value, with
0201  * exception of zero, which is not an event ID. Thus, this is also the
0202  * absolute maximum number of event handlers that can be registered.
0203  */
0204 #define SSH_NUM_EVENTS      38
0205 
0206 /*
0207  * SSH_NUM_TARGETS - The number of communication targets used in the protocol.
0208  */
0209 #define SSH_NUM_TARGETS     2
0210 
0211 /**
0212  * ssh_rqid_next_valid() - Return the next valid request ID.
0213  * @rqid: The current request ID.
0214  *
0215  * Return: Returns the next valid request ID, following the current request ID
0216  * provided to this function. This function skips any request IDs reserved for
0217  * events.
0218  */
0219 static inline u16 ssh_rqid_next_valid(u16 rqid)
0220 {
0221     return rqid > 0 ? rqid + 1u : rqid + SSH_NUM_EVENTS + 1u;
0222 }
0223 
0224 /**
0225  * ssh_rqid_to_event() - Convert request ID to its corresponding event ID.
0226  * @rqid: The request ID to convert.
0227  */
0228 static inline u16 ssh_rqid_to_event(u16 rqid)
0229 {
0230     return rqid - 1u;
0231 }
0232 
0233 /**
0234  * ssh_rqid_is_event() - Check if given request ID is a valid event ID.
0235  * @rqid: The request ID to check.
0236  */
0237 static inline bool ssh_rqid_is_event(u16 rqid)
0238 {
0239     return ssh_rqid_to_event(rqid) < SSH_NUM_EVENTS;
0240 }
0241 
0242 /**
0243  * ssh_tc_to_rqid() - Convert target category to its corresponding request ID.
0244  * @tc: The target category to convert.
0245  */
0246 static inline u16 ssh_tc_to_rqid(u8 tc)
0247 {
0248     return tc;
0249 }
0250 
0251 /**
0252  * ssh_tid_to_index() - Convert target ID to its corresponding target index.
0253  * @tid: The target ID to convert.
0254  */
0255 static inline u8 ssh_tid_to_index(u8 tid)
0256 {
0257     return tid - 1u;
0258 }
0259 
0260 /**
0261  * ssh_tid_is_valid() - Check if target ID is valid/supported.
0262  * @tid: The target ID to check.
0263  */
0264 static inline bool ssh_tid_is_valid(u8 tid)
0265 {
0266     return ssh_tid_to_index(tid) < SSH_NUM_TARGETS;
0267 }
0268 
0269 /**
0270  * struct ssam_span - Reference to a buffer region.
0271  * @ptr: Pointer to the buffer region.
0272  * @len: Length of the buffer region.
0273  *
0274  * A reference to a (non-owned) buffer segment, consisting of pointer and
0275  * length. Use of this struct indicates non-owned data, i.e. data of which the
0276  * life-time is managed (i.e. it is allocated/freed) via another pointer.
0277  */
0278 struct ssam_span {
0279     u8    *ptr;
0280     size_t len;
0281 };
0282 
0283 /*
0284  * Known SSH/EC target categories.
0285  *
0286  * List of currently known target category values; "Known" as in we know they
0287  * exist and are valid on at least some device/model. Detailed functionality
0288  * or the full category name is only known for some of these categories and
0289  * is detailed in the respective comment below.
0290  *
0291  * These values and abbreviations have been extracted from strings inside the
0292  * Windows driver.
0293  */
0294 enum ssam_ssh_tc {
0295                   /* Category 0x00 is invalid for EC use. */
0296     SSAM_SSH_TC_SAM  = 0x01,  /* Generic system functionality, real-time clock. */
0297     SSAM_SSH_TC_BAT  = 0x02,  /* Battery/power subsystem. */
0298     SSAM_SSH_TC_TMP  = 0x03,  /* Thermal subsystem. */
0299     SSAM_SSH_TC_PMC  = 0x04,
0300     SSAM_SSH_TC_FAN  = 0x05,
0301     SSAM_SSH_TC_PoM  = 0x06,
0302     SSAM_SSH_TC_DBG  = 0x07,
0303     SSAM_SSH_TC_KBD  = 0x08,  /* Legacy keyboard (Laptop 1/2). */
0304     SSAM_SSH_TC_FWU  = 0x09,
0305     SSAM_SSH_TC_UNI  = 0x0a,
0306     SSAM_SSH_TC_LPC  = 0x0b,
0307     SSAM_SSH_TC_TCL  = 0x0c,
0308     SSAM_SSH_TC_SFL  = 0x0d,
0309     SSAM_SSH_TC_KIP  = 0x0e,  /* Manages detachable peripherals (Pro X/8 keyboard cover) */
0310     SSAM_SSH_TC_EXT  = 0x0f,
0311     SSAM_SSH_TC_BLD  = 0x10,
0312     SSAM_SSH_TC_BAS  = 0x11,  /* Detachment system (Surface Book 2/3). */
0313     SSAM_SSH_TC_SEN  = 0x12,
0314     SSAM_SSH_TC_SRQ  = 0x13,
0315     SSAM_SSH_TC_MCU  = 0x14,
0316     SSAM_SSH_TC_HID  = 0x15,  /* Generic HID input subsystem. */
0317     SSAM_SSH_TC_TCH  = 0x16,
0318     SSAM_SSH_TC_BKL  = 0x17,
0319     SSAM_SSH_TC_TAM  = 0x18,
0320     SSAM_SSH_TC_ACC0 = 0x19,
0321     SSAM_SSH_TC_UFI  = 0x1a,
0322     SSAM_SSH_TC_USC  = 0x1b,
0323     SSAM_SSH_TC_PEN  = 0x1c,
0324     SSAM_SSH_TC_VID  = 0x1d,
0325     SSAM_SSH_TC_AUD  = 0x1e,
0326     SSAM_SSH_TC_SMC  = 0x1f,
0327     SSAM_SSH_TC_KPD  = 0x20,
0328     SSAM_SSH_TC_REG  = 0x21,  /* Extended event registry. */
0329     SSAM_SSH_TC_SPT  = 0x22,
0330     SSAM_SSH_TC_SYS  = 0x23,
0331     SSAM_SSH_TC_ACC1 = 0x24,
0332     SSAM_SSH_TC_SHB  = 0x25,
0333     SSAM_SSH_TC_POS  = 0x26,  /* For obtaining Laptop Studio screen position. */
0334 };
0335 
0336 
0337 /* -- Packet transport layer (ptl). ----------------------------------------- */
0338 
0339 /**
0340  * enum ssh_packet_base_priority - Base priorities for &struct ssh_packet.
0341  * @SSH_PACKET_PRIORITY_FLUSH: Base priority for flush packets.
0342  * @SSH_PACKET_PRIORITY_DATA:  Base priority for normal data packets.
0343  * @SSH_PACKET_PRIORITY_NAK:   Base priority for NAK packets.
0344  * @SSH_PACKET_PRIORITY_ACK:   Base priority for ACK packets.
0345  */
0346 enum ssh_packet_base_priority {
0347     SSH_PACKET_PRIORITY_FLUSH = 0,  /* same as DATA to sequence flush */
0348     SSH_PACKET_PRIORITY_DATA  = 0,
0349     SSH_PACKET_PRIORITY_NAK   = 1,
0350     SSH_PACKET_PRIORITY_ACK   = 2,
0351 };
0352 
0353 /*
0354  * Same as SSH_PACKET_PRIORITY() below, only with actual values.
0355  */
0356 #define __SSH_PACKET_PRIORITY(base, try) \
0357     (((base) << 4) | ((try) & 0x0f))
0358 
0359 /**
0360  * SSH_PACKET_PRIORITY() - Compute packet priority from base priority and
0361  * number of tries.
0362  * @base: The base priority as suffix of &enum ssh_packet_base_priority, e.g.
0363  *        ``FLUSH``, ``DATA``, ``ACK``, or ``NAK``.
0364  * @try:  The number of tries (must be less than 16).
0365  *
0366  * Compute the combined packet priority. The combined priority is dominated by
0367  * the base priority, whereas the number of (re-)tries decides the precedence
0368  * of packets with the same base priority, giving higher priority to packets
0369  * that already have more tries.
0370  *
0371  * Return: Returns the computed priority as value fitting inside a &u8. A
0372  * higher number means a higher priority.
0373  */
0374 #define SSH_PACKET_PRIORITY(base, try) \
0375     __SSH_PACKET_PRIORITY(SSH_PACKET_PRIORITY_##base, (try))
0376 
0377 /**
0378  * ssh_packet_priority_get_try() - Get number of tries from packet priority.
0379  * @priority: The packet priority.
0380  *
0381  * Return: Returns the number of tries encoded in the specified packet
0382  * priority.
0383  */
0384 static inline u8 ssh_packet_priority_get_try(u8 priority)
0385 {
0386     return priority & 0x0f;
0387 }
0388 
0389 /**
0390  * ssh_packet_priority_get_base - Get base priority from packet priority.
0391  * @priority: The packet priority.
0392  *
0393  * Return: Returns the base priority encoded in the given packet priority.
0394  */
0395 static inline u8 ssh_packet_priority_get_base(u8 priority)
0396 {
0397     return (priority & 0xf0) >> 4;
0398 }
0399 
0400 enum ssh_packet_flags {
0401     /* state flags */
0402     SSH_PACKET_SF_LOCKED_BIT,
0403     SSH_PACKET_SF_QUEUED_BIT,
0404     SSH_PACKET_SF_PENDING_BIT,
0405     SSH_PACKET_SF_TRANSMITTING_BIT,
0406     SSH_PACKET_SF_TRANSMITTED_BIT,
0407     SSH_PACKET_SF_ACKED_BIT,
0408     SSH_PACKET_SF_CANCELED_BIT,
0409     SSH_PACKET_SF_COMPLETED_BIT,
0410 
0411     /* type flags */
0412     SSH_PACKET_TY_FLUSH_BIT,
0413     SSH_PACKET_TY_SEQUENCED_BIT,
0414     SSH_PACKET_TY_BLOCKING_BIT,
0415 
0416     /* mask for state flags */
0417     SSH_PACKET_FLAGS_SF_MASK =
0418           BIT(SSH_PACKET_SF_LOCKED_BIT)
0419         | BIT(SSH_PACKET_SF_QUEUED_BIT)
0420         | BIT(SSH_PACKET_SF_PENDING_BIT)
0421         | BIT(SSH_PACKET_SF_TRANSMITTING_BIT)
0422         | BIT(SSH_PACKET_SF_TRANSMITTED_BIT)
0423         | BIT(SSH_PACKET_SF_ACKED_BIT)
0424         | BIT(SSH_PACKET_SF_CANCELED_BIT)
0425         | BIT(SSH_PACKET_SF_COMPLETED_BIT),
0426 
0427     /* mask for type flags */
0428     SSH_PACKET_FLAGS_TY_MASK =
0429           BIT(SSH_PACKET_TY_FLUSH_BIT)
0430         | BIT(SSH_PACKET_TY_SEQUENCED_BIT)
0431         | BIT(SSH_PACKET_TY_BLOCKING_BIT),
0432 };
0433 
0434 struct ssh_ptl;
0435 struct ssh_packet;
0436 
0437 /**
0438  * struct ssh_packet_ops - Callback operations for a SSH packet.
0439  * @release:  Function called when the packet reference count reaches zero.
0440  *            This callback must be relied upon to ensure that the packet has
0441  *            left the transport system(s).
0442  * @complete: Function called when the packet is completed, either with
0443  *            success or failure. In case of failure, the reason for the
0444  *            failure is indicated by the value of the provided status code
0445  *            argument. This value will be zero in case of success. Note that
0446  *            a call to this callback does not guarantee that the packet is
0447  *            not in use by the transport system any more.
0448  */
0449 struct ssh_packet_ops {
0450     void (*release)(struct ssh_packet *p);
0451     void (*complete)(struct ssh_packet *p, int status);
0452 };
0453 
0454 /**
0455  * struct ssh_packet - SSH transport packet.
0456  * @ptl:      Pointer to the packet transport layer. May be %NULL if the packet
0457  *            (or enclosing request) has not been submitted yet.
0458  * @refcnt:   Reference count of the packet.
0459  * @priority: Priority of the packet. Must be computed via
0460  *            SSH_PACKET_PRIORITY(). Must only be accessed while holding the
0461  *            queue lock after first submission.
0462  * @data:     Raw message data.
0463  * @data.len: Length of the raw message data.
0464  * @data.ptr: Pointer to the raw message data buffer.
0465  * @state:    State and type flags describing current packet state (dynamic)
0466  *            and type (static). See &enum ssh_packet_flags for possible
0467  *            options.
0468  * @timestamp: Timestamp specifying when the latest transmission of a
0469  *            currently pending packet has been started. May be %KTIME_MAX
0470  *            before or in-between transmission attempts. Used for the packet
0471  *            timeout implementation. Must only be accessed while holding the
0472  *            pending lock after first submission.
0473  * @queue_node: The list node for the packet queue.
0474  * @pending_node: The list node for the set of pending packets.
0475  * @ops:      Packet operations.
0476  */
0477 struct ssh_packet {
0478     struct ssh_ptl *ptl;
0479     struct kref refcnt;
0480 
0481     u8 priority;
0482 
0483     struct {
0484         size_t len;
0485         u8 *ptr;
0486     } data;
0487 
0488     unsigned long state;
0489     ktime_t timestamp;
0490 
0491     struct list_head queue_node;
0492     struct list_head pending_node;
0493 
0494     const struct ssh_packet_ops *ops;
0495 };
0496 
0497 struct ssh_packet *ssh_packet_get(struct ssh_packet *p);
0498 void ssh_packet_put(struct ssh_packet *p);
0499 
0500 /**
0501  * ssh_packet_set_data() - Set raw message data of packet.
0502  * @p:   The packet for which the message data should be set.
0503  * @ptr: Pointer to the memory holding the message data.
0504  * @len: Length of the message data.
0505  *
0506  * Sets the raw message data buffer of the packet to the provided memory. The
0507  * memory is not copied. Instead, the caller is responsible for management
0508  * (i.e. allocation and deallocation) of the memory. The caller must ensure
0509  * that the provided memory is valid and contains a valid SSH message,
0510  * starting from the time of submission of the packet until the ``release``
0511  * callback has been called. During this time, the memory may not be altered
0512  * in any way.
0513  */
0514 static inline void ssh_packet_set_data(struct ssh_packet *p, u8 *ptr, size_t len)
0515 {
0516     p->data.ptr = ptr;
0517     p->data.len = len;
0518 }
0519 
0520 
0521 /* -- Request transport layer (rtl). ---------------------------------------- */
0522 
0523 enum ssh_request_flags {
0524     /* state flags */
0525     SSH_REQUEST_SF_LOCKED_BIT,
0526     SSH_REQUEST_SF_QUEUED_BIT,
0527     SSH_REQUEST_SF_PENDING_BIT,
0528     SSH_REQUEST_SF_TRANSMITTING_BIT,
0529     SSH_REQUEST_SF_TRANSMITTED_BIT,
0530     SSH_REQUEST_SF_RSPRCVD_BIT,
0531     SSH_REQUEST_SF_CANCELED_BIT,
0532     SSH_REQUEST_SF_COMPLETED_BIT,
0533 
0534     /* type flags */
0535     SSH_REQUEST_TY_FLUSH_BIT,
0536     SSH_REQUEST_TY_HAS_RESPONSE_BIT,
0537 
0538     /* mask for state flags */
0539     SSH_REQUEST_FLAGS_SF_MASK =
0540           BIT(SSH_REQUEST_SF_LOCKED_BIT)
0541         | BIT(SSH_REQUEST_SF_QUEUED_BIT)
0542         | BIT(SSH_REQUEST_SF_PENDING_BIT)
0543         | BIT(SSH_REQUEST_SF_TRANSMITTING_BIT)
0544         | BIT(SSH_REQUEST_SF_TRANSMITTED_BIT)
0545         | BIT(SSH_REQUEST_SF_RSPRCVD_BIT)
0546         | BIT(SSH_REQUEST_SF_CANCELED_BIT)
0547         | BIT(SSH_REQUEST_SF_COMPLETED_BIT),
0548 
0549     /* mask for type flags */
0550     SSH_REQUEST_FLAGS_TY_MASK =
0551           BIT(SSH_REQUEST_TY_FLUSH_BIT)
0552         | BIT(SSH_REQUEST_TY_HAS_RESPONSE_BIT),
0553 };
0554 
0555 struct ssh_rtl;
0556 struct ssh_request;
0557 
0558 /**
0559  * struct ssh_request_ops - Callback operations for a SSH request.
0560  * @release:  Function called when the request's reference count reaches zero.
0561  *            This callback must be relied upon to ensure that the request has
0562  *            left the transport systems (both, packet an request systems).
0563  * @complete: Function called when the request is completed, either with
0564  *            success or failure. The command data for the request response
0565  *            is provided via the &struct ssh_command parameter (``cmd``),
0566  *            the command payload of the request response via the &struct
0567  *            ssh_span parameter (``data``).
0568  *
0569  *            If the request does not have any response or has not been
0570  *            completed with success, both ``cmd`` and ``data`` parameters will
0571  *            be NULL. If the request response does not have any command
0572  *            payload, the ``data`` span will be an empty (zero-length) span.
0573  *
0574  *            In case of failure, the reason for the failure is indicated by
0575  *            the value of the provided status code argument (``status``). This
0576  *            value will be zero in case of success and a regular errno
0577  *            otherwise.
0578  *
0579  *            Note that a call to this callback does not guarantee that the
0580  *            request is not in use by the transport systems any more.
0581  */
0582 struct ssh_request_ops {
0583     void (*release)(struct ssh_request *rqst);
0584     void (*complete)(struct ssh_request *rqst,
0585              const struct ssh_command *cmd,
0586              const struct ssam_span *data, int status);
0587 };
0588 
0589 /**
0590  * struct ssh_request - SSH transport request.
0591  * @packet: The underlying SSH transport packet.
0592  * @node:   List node for the request queue and pending set.
0593  * @state:  State and type flags describing current request state (dynamic)
0594  *          and type (static). See &enum ssh_request_flags for possible
0595  *          options.
0596  * @timestamp: Timestamp specifying when we start waiting on the response of
0597  *          the request. This is set once the underlying packet has been
0598  *          completed and may be %KTIME_MAX before that, or when the request
0599  *          does not expect a response. Used for the request timeout
0600  *          implementation.
0601  * @ops:    Request Operations.
0602  */
0603 struct ssh_request {
0604     struct ssh_packet packet;
0605     struct list_head node;
0606 
0607     unsigned long state;
0608     ktime_t timestamp;
0609 
0610     const struct ssh_request_ops *ops;
0611 };
0612 
0613 /**
0614  * to_ssh_request() - Cast a SSH packet to its enclosing SSH request.
0615  * @p: The packet to cast.
0616  *
0617  * Casts the given &struct ssh_packet to its enclosing &struct ssh_request.
0618  * The caller is responsible for making sure that the packet is actually
0619  * wrapped in a &struct ssh_request.
0620  *
0621  * Return: Returns the &struct ssh_request wrapping the provided packet.
0622  */
0623 static inline struct ssh_request *to_ssh_request(struct ssh_packet *p)
0624 {
0625     return container_of(p, struct ssh_request, packet);
0626 }
0627 
0628 /**
0629  * ssh_request_get() - Increment reference count of request.
0630  * @r: The request to increment the reference count of.
0631  *
0632  * Increments the reference count of the given request by incrementing the
0633  * reference count of the underlying &struct ssh_packet, enclosed in it.
0634  *
0635  * See also ssh_request_put(), ssh_packet_get().
0636  *
0637  * Return: Returns the request provided as input.
0638  */
0639 static inline struct ssh_request *ssh_request_get(struct ssh_request *r)
0640 {
0641     return r ? to_ssh_request(ssh_packet_get(&r->packet)) : NULL;
0642 }
0643 
0644 /**
0645  * ssh_request_put() - Decrement reference count of request.
0646  * @r: The request to decrement the reference count of.
0647  *
0648  * Decrements the reference count of the given request by decrementing the
0649  * reference count of the underlying &struct ssh_packet, enclosed in it. If
0650  * the reference count reaches zero, the ``release`` callback specified in the
0651  * request's &struct ssh_request_ops, i.e. ``r->ops->release``, will be
0652  * called.
0653  *
0654  * See also ssh_request_get(), ssh_packet_put().
0655  */
0656 static inline void ssh_request_put(struct ssh_request *r)
0657 {
0658     if (r)
0659         ssh_packet_put(&r->packet);
0660 }
0661 
0662 /**
0663  * ssh_request_set_data() - Set raw message data of request.
0664  * @r:   The request for which the message data should be set.
0665  * @ptr: Pointer to the memory holding the message data.
0666  * @len: Length of the message data.
0667  *
0668  * Sets the raw message data buffer of the underlying packet to the specified
0669  * buffer. Does not copy the actual message data, just sets the buffer pointer
0670  * and length. Refer to ssh_packet_set_data() for more details.
0671  */
0672 static inline void ssh_request_set_data(struct ssh_request *r, u8 *ptr, size_t len)
0673 {
0674     ssh_packet_set_data(&r->packet, ptr, len);
0675 }
0676 
0677 #endif /* _LINUX_SURFACE_AGGREGATOR_SERIAL_HUB_H */