Lines Matching refs:pv

10 static int hvsi_send_packet(struct hvsi_priv *pv, struct hvsi_header *packet)  in hvsi_send_packet()  argument
12 packet->seqno = cpu_to_be16(atomic_inc_return(&pv->seqno)); in hvsi_send_packet()
15 return pv->put_chars(pv->termno, (u8 *)packet, packet->len); in hvsi_send_packet()
18 static void hvsi_start_handshake(struct hvsi_priv *pv) in hvsi_start_handshake() argument
23 pv->established = 0; in hvsi_start_handshake()
24 atomic_set(&pv->seqno, 0); in hvsi_start_handshake()
26 pr_devel("HVSI@%x: Handshaking started\n", pv->termno); in hvsi_start_handshake()
32 hvsi_send_packet(pv, &q.hdr); in hvsi_start_handshake()
35 static int hvsi_send_close(struct hvsi_priv *pv) in hvsi_send_close() argument
39 pv->established = 0; in hvsi_send_close()
44 return hvsi_send_packet(pv, &ctrl.hdr); in hvsi_send_close()
47 static void hvsi_cd_change(struct hvsi_priv *pv, int cd) in hvsi_cd_change() argument
50 pv->mctrl |= TIOCM_CD; in hvsi_cd_change()
52 pv->mctrl &= ~TIOCM_CD; in hvsi_cd_change()
60 if (!pv->is_console && pv->opened) { in hvsi_cd_change()
62 pv->termno); in hvsi_cd_change()
63 hvsi_send_close(pv); in hvsi_cd_change()
68 static void hvsi_got_control(struct hvsi_priv *pv) in hvsi_got_control() argument
70 struct hvsi_control *pkt = (struct hvsi_control *)pv->inbuf; in hvsi_got_control()
75 hvsi_start_handshake(pv); in hvsi_got_control()
79 hvsi_cd_change(pv, be32_to_cpu(pkt->word) & HVSI_TSCD); in hvsi_got_control()
84 static void hvsi_got_query(struct hvsi_priv *pv) in hvsi_got_query() argument
86 struct hvsi_query *pkt = (struct hvsi_query *)pv->inbuf; in hvsi_got_query()
94 pv->termno); in hvsi_got_query()
102 hvsi_send_packet(pv, &r.hdr); in hvsi_got_query()
105 pv->established = 1; in hvsi_got_query()
108 static void hvsi_got_response(struct hvsi_priv *pv) in hvsi_got_response() argument
111 (struct hvsi_query_response *)pv->inbuf; in hvsi_got_response()
115 hvsi_cd_change(pv, be32_to_cpu(r->u.mctrl_word) & HVSI_TSCD); in hvsi_got_response()
116 pv->mctrl_update = 1; in hvsi_got_response()
121 static int hvsi_check_packet(struct hvsi_priv *pv) in hvsi_check_packet() argument
128 if (pv->inbuf[0] < 0xfc) { in hvsi_check_packet()
129 pv->inbuf_len = pv->inbuf_pktlen = 0; in hvsi_check_packet()
132 type = pv->inbuf[0]; in hvsi_check_packet()
133 len = pv->inbuf[1]; in hvsi_check_packet()
136 if (pv->inbuf_len < len) in hvsi_check_packet()
140 pv->termno, type, len); in hvsi_check_packet()
145 pv->inbuf_pktlen = len - 4; in hvsi_check_packet()
146 pv->inbuf_cur = 4; in hvsi_check_packet()
149 hvsi_got_control(pv); in hvsi_check_packet()
152 hvsi_got_query(pv); in hvsi_check_packet()
155 hvsi_got_response(pv); in hvsi_check_packet()
160 pv->inbuf_len -= len; in hvsi_check_packet()
161 memmove(pv->inbuf, &pv->inbuf[len], pv->inbuf_len); in hvsi_check_packet()
165 static int hvsi_get_packet(struct hvsi_priv *pv) in hvsi_get_packet() argument
168 if (pv->inbuf_len < HVSI_INBUF_SIZE) in hvsi_get_packet()
169 pv->inbuf_len += pv->get_chars(pv->termno, in hvsi_get_packet()
170 &pv->inbuf[pv->inbuf_len], in hvsi_get_packet()
171 HVSI_INBUF_SIZE - pv->inbuf_len); in hvsi_get_packet()
176 if (pv->inbuf_len >= 4) in hvsi_get_packet()
177 return hvsi_check_packet(pv); in hvsi_get_packet()
181 ssize_t hvsilib_get_chars(struct hvsi_priv *pv, u8 *buf, size_t count) in hvsilib_get_chars() argument
186 if (WARN_ON(!pv)) in hvsilib_get_chars()
194 if (!pv->opened) in hvsilib_get_chars()
202 if (pv->inbuf_pktlen) { in hvsilib_get_chars()
203 size_t l = min(count, pv->inbuf_pktlen); in hvsilib_get_chars()
204 memcpy(&buf[read], &pv->inbuf[pv->inbuf_cur], l); in hvsilib_get_chars()
205 pv->inbuf_cur += l; in hvsilib_get_chars()
206 pv->inbuf_pktlen -= l; in hvsilib_get_chars()
214 if (pv->inbuf_cur) { in hvsilib_get_chars()
215 pv->inbuf_len -= pv->inbuf_cur; in hvsilib_get_chars()
216 memmove(pv->inbuf, &pv->inbuf[pv->inbuf_cur], in hvsilib_get_chars()
217 pv->inbuf_len); in hvsilib_get_chars()
218 pv->inbuf_cur = 0; in hvsilib_get_chars()
222 if (hvsi_get_packet(pv)) in hvsilib_get_chars()
225 if (!pv->established) { in hvsilib_get_chars()
226 pr_devel("HVSI@%x: returning -EPIPE\n", pv->termno); in hvsilib_get_chars()
232 ssize_t hvsilib_put_chars(struct hvsi_priv *pv, const u8 *buf, size_t count) in hvsilib_put_chars() argument
238 if (WARN_ON(!pv)) in hvsilib_put_chars()
244 rc = hvsi_send_packet(pv, &dp.hdr); in hvsilib_put_chars()
259 int hvsilib_read_mctrl(struct hvsi_priv *pv) in hvsilib_read_mctrl() argument
265 pv->termno); in hvsilib_read_mctrl()
267 pv->mctrl_update = 0; in hvsilib_read_mctrl()
271 rc = hvsi_send_packet(pv, &q.hdr); in hvsilib_read_mctrl()
273 pr_devel("HVSI@%x: Error %d...\n", pv->termno, rc); in hvsilib_read_mctrl()
279 if (!pv->established) in hvsilib_read_mctrl()
281 if (pv->mctrl_update) in hvsilib_read_mctrl()
283 if (!hvsi_get_packet(pv)) in hvsilib_read_mctrl()
289 int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr) in hvsilib_write_mctrl() argument
294 mctrl = pv->mctrl; in hvsilib_write_mctrl()
299 if (mctrl == pv->mctrl) in hvsilib_write_mctrl()
301 pv->mctrl = mctrl; in hvsilib_write_mctrl()
303 pr_devel("HVSI@%x: %s DTR...\n", pv->termno, in hvsilib_write_mctrl()
311 return hvsi_send_packet(pv, &ctrl.hdr); in hvsilib_write_mctrl()
314 void hvsilib_establish(struct hvsi_priv *pv) in hvsilib_establish() argument
318 pr_devel("HVSI@%x: Establishing...\n", pv->termno); in hvsilib_establish()
324 if (pv->established) in hvsilib_establish()
326 if (!hvsi_get_packet(pv)) in hvsilib_establish()
333 pr_devel("HVSI@%x: ... sending close\n", pv->termno); in hvsilib_establish()
335 hvsi_send_close(pv); in hvsilib_establish()
339 pr_devel("HVSI@%x: ... restarting handshake\n", pv->termno); in hvsilib_establish()
341 hvsi_start_handshake(pv); in hvsilib_establish()
343 pr_devel("HVSI@%x: ... waiting handshake\n", pv->termno); in hvsilib_establish()
347 if (pv->established) in hvsilib_establish()
349 if (!hvsi_get_packet(pv)) in hvsilib_establish()
353 if (!pv->established) { in hvsilib_establish()
355 pv->termno); in hvsilib_establish()
361 pr_devel("HVSI@%x: ... established, reading mctrl\n", pv->termno); in hvsilib_establish()
363 hvsilib_read_mctrl(pv); in hvsilib_establish()
367 pr_devel("HVSI@%x: ... setting mctrl\n", pv->termno); in hvsilib_establish()
369 hvsilib_write_mctrl(pv, 1); in hvsilib_establish()
373 pv->opened = 1; in hvsilib_establish()
376 int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_open() argument
378 pr_devel("HVSI@%x: open !\n", pv->termno); in hvsilib_open()
381 pv->tty = tty_port_tty_get(&hp->port); in hvsilib_open()
383 hvsilib_establish(pv); in hvsilib_open()
388 void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_close() argument
392 pr_devel("HVSI@%x: close !\n", pv->termno); in hvsilib_close()
394 if (!pv->is_console) { in hvsilib_close()
396 pv->termno); in hvsilib_close()
400 pv->opened = 0; in hvsilib_close()
404 if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL)) in hvsilib_close()
405 hvsilib_write_mctrl(pv, 0); in hvsilib_close()
408 hvsi_send_close(pv); in hvsilib_close()
411 tty_kref_put(pv->tty); in hvsilib_close()
412 pv->tty = NULL; in hvsilib_close()
415 void hvsilib_init(struct hvsi_priv *pv, in hvsilib_init() argument
421 memset(pv, 0, sizeof(*pv)); in hvsilib_init()
422 pv->get_chars = get_chars; in hvsilib_init()
423 pv->put_chars = put_chars; in hvsilib_init()
424 pv->termno = termno; in hvsilib_init()
425 pv->is_console = is_console; in hvsilib_init()