![]() |
|
|||
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 */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |