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, (char *)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 int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count) in hvsilib_get_chars() argument
185 if (WARN_ON(!pv)) in hvsilib_get_chars()
193 if (!pv->opened) in hvsilib_get_chars()
201 if (pv->inbuf_pktlen) { in hvsilib_get_chars()
202 unsigned int l = min(count, (int)pv->inbuf_pktlen); in hvsilib_get_chars()
203 memcpy(&buf[read], &pv->inbuf[pv->inbuf_cur], l); in hvsilib_get_chars()
204 pv->inbuf_cur += l; in hvsilib_get_chars()
205 pv->inbuf_pktlen -= l; in hvsilib_get_chars()
213 if (pv->inbuf_cur) { in hvsilib_get_chars()
214 pv->inbuf_len -= pv->inbuf_cur; in hvsilib_get_chars()
215 memmove(pv->inbuf, &pv->inbuf[pv->inbuf_cur], in hvsilib_get_chars()
216 pv->inbuf_len); in hvsilib_get_chars()
217 pv->inbuf_cur = 0; in hvsilib_get_chars()
221 if (hvsi_get_packet(pv)) in hvsilib_get_chars()
224 if (!pv->established) { in hvsilib_get_chars()
225 pr_devel("HVSI@%x: returning -EPIPE\n", pv->termno); in hvsilib_get_chars()
231 int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count) in hvsilib_put_chars() argument
236 if (WARN_ON(!pv)) in hvsilib_put_chars()
242 rc = hvsi_send_packet(pv, &dp.hdr); in hvsilib_put_chars()
257 int hvsilib_read_mctrl(struct hvsi_priv *pv) in hvsilib_read_mctrl() argument
263 pv->termno); in hvsilib_read_mctrl()
265 pv->mctrl_update = 0; in hvsilib_read_mctrl()
269 rc = hvsi_send_packet(pv, &q.hdr); in hvsilib_read_mctrl()
271 pr_devel("HVSI@%x: Error %d...\n", pv->termno, rc); in hvsilib_read_mctrl()
277 if (!pv->established) in hvsilib_read_mctrl()
279 if (pv->mctrl_update) in hvsilib_read_mctrl()
281 if (!hvsi_get_packet(pv)) in hvsilib_read_mctrl()
287 int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr) in hvsilib_write_mctrl() argument
292 mctrl = pv->mctrl; in hvsilib_write_mctrl()
297 if (mctrl == pv->mctrl) in hvsilib_write_mctrl()
299 pv->mctrl = mctrl; in hvsilib_write_mctrl()
301 pr_devel("HVSI@%x: %s DTR...\n", pv->termno, in hvsilib_write_mctrl()
309 return hvsi_send_packet(pv, &ctrl.hdr); in hvsilib_write_mctrl()
312 void hvsilib_establish(struct hvsi_priv *pv) in hvsilib_establish() argument
316 pr_devel("HVSI@%x: Establishing...\n", pv->termno); in hvsilib_establish()
322 if (pv->established) in hvsilib_establish()
324 if (!hvsi_get_packet(pv)) in hvsilib_establish()
331 pr_devel("HVSI@%x: ... sending close\n", pv->termno); in hvsilib_establish()
333 hvsi_send_close(pv); in hvsilib_establish()
337 pr_devel("HVSI@%x: ... restarting handshake\n", pv->termno); in hvsilib_establish()
339 hvsi_start_handshake(pv); in hvsilib_establish()
341 pr_devel("HVSI@%x: ... waiting handshake\n", pv->termno); in hvsilib_establish()
345 if (pv->established) in hvsilib_establish()
347 if (!hvsi_get_packet(pv)) in hvsilib_establish()
351 if (!pv->established) { in hvsilib_establish()
353 pv->termno); in hvsilib_establish()
359 pr_devel("HVSI@%x: ... established, reading mctrl\n", pv->termno); in hvsilib_establish()
361 hvsilib_read_mctrl(pv); in hvsilib_establish()
365 pr_devel("HVSI@%x: ... setting mctrl\n", pv->termno); in hvsilib_establish()
367 hvsilib_write_mctrl(pv, 1); in hvsilib_establish()
371 pv->opened = 1; in hvsilib_establish()
374 int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_open() argument
376 pr_devel("HVSI@%x: open !\n", pv->termno); in hvsilib_open()
379 pv->tty = tty_port_tty_get(&hp->port); in hvsilib_open()
381 hvsilib_establish(pv); in hvsilib_open()
386 void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_close() argument
390 pr_devel("HVSI@%x: close !\n", pv->termno); in hvsilib_close()
392 if (!pv->is_console) { in hvsilib_close()
394 pv->termno); in hvsilib_close()
398 pv->opened = 0; in hvsilib_close()
402 if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL)) in hvsilib_close()
403 hvsilib_write_mctrl(pv, 0); in hvsilib_close()
406 hvsi_send_close(pv); in hvsilib_close()
409 tty_kref_put(pv->tty); in hvsilib_close()
410 pv->tty = NULL; in hvsilib_close()
413 void hvsilib_init(struct hvsi_priv *pv, in hvsilib_init() argument
419 memset(pv, 0, sizeof(*pv)); in hvsilib_init()
420 pv->get_chars = get_chars; in hvsilib_init()
421 pv->put_chars = put_chars; in hvsilib_init()
422 pv->termno = termno; in hvsilib_init()
423 pv->is_console = is_console; in hvsilib_init()