| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef _HVSI_H |
| #define _HVSI_H |
| |
| #define VS_DATA_PACKET_HEADER 0xff |
| #define VS_CONTROL_PACKET_HEADER 0xfe |
| #define VS_QUERY_PACKET_HEADER 0xfd |
| #define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc |
| |
| /* control verbs */ |
| #define VSV_SET_MODEM_CTL 1 /* to service processor only */ |
| #define VSV_MODEM_CTL_UPDATE 2 /* from service processor only */ |
| #define VSV_CLOSE_PROTOCOL 3 |
| |
| /* query verbs */ |
| #define VSV_SEND_VERSION_NUMBER 1 |
| #define VSV_SEND_MODEM_CTL_STATUS 2 |
| |
| /* yes, these masks are not consecutive. */ |
| #define HVSI_TSDTR 0x01 |
| #define HVSI_TSCD 0x20 |
| |
| #define HVSI_MAX_OUTGOING_DATA 12 |
| #define HVSI_VERSION 1 |
| |
| struct hvsi_header { |
| uint8_t type; |
| uint8_t len; |
| __be16 seqno; |
| } __attribute__((packed)); |
| |
| struct hvsi_data { |
| struct hvsi_header hdr; |
| uint8_t data[HVSI_MAX_OUTGOING_DATA]; |
| } __attribute__((packed)); |
| |
| struct hvsi_control { |
| struct hvsi_header hdr; |
| __be16 verb; |
| /* optional depending on verb: */ |
| __be32 word; |
| __be32 mask; |
| } __attribute__((packed)); |
| |
| struct hvsi_query { |
| struct hvsi_header hdr; |
| __be16 verb; |
| } __attribute__((packed)); |
| |
| struct hvsi_query_response { |
| struct hvsi_header hdr; |
| __be16 verb; |
| __be16 query_seqno; |
| union { |
| uint8_t version; |
| __be32 mctrl_word; |
| } u; |
| } __attribute__((packed)); |
| |
| /* hvsi lib struct definitions */ |
| #define HVSI_INBUF_SIZE 255 |
| struct tty_struct; |
| struct hvsi_priv { |
| unsigned int inbuf_len; /* data in input buffer */ |
| unsigned char inbuf[HVSI_INBUF_SIZE]; |
| unsigned int inbuf_cur; /* Cursor in input buffer */ |
| unsigned int inbuf_pktlen; /* packet lenght from cursor */ |
| atomic_t seqno; /* packet sequence number */ |
| unsigned int opened:1; /* driver opened */ |
| unsigned int established:1; /* protocol established */ |
| unsigned int is_console:1; /* used as a kernel console device */ |
| unsigned int mctrl_update:1; /* modem control updated */ |
| unsigned short mctrl; /* modem control */ |
| struct tty_struct *tty; /* tty structure */ |
| int (*get_chars)(uint32_t termno, char *buf, int count); |
| int (*put_chars)(uint32_t termno, const char *buf, int count); |
| uint32_t termno; |
| }; |
| |
| /* hvsi lib functions */ |
| struct hvc_struct; |
| extern void hvsilib_init(struct hvsi_priv *pv, |
| int (*get_chars)(uint32_t termno, char *buf, int count), |
| int (*put_chars)(uint32_t termno, const char *buf, |
| int count), |
| int termno, int is_console); |
| extern int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp); |
| extern void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp); |
| extern int hvsilib_read_mctrl(struct hvsi_priv *pv); |
| extern int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr); |
| extern void hvsilib_establish(struct hvsi_priv *pv); |
| extern int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count); |
| extern int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count); |
| |
| #endif /* _HVSI_H */ |