Lines Matching refs:pv

9 static int hvsi_send_packet(struct hvsi_priv *pv, struct hvsi_header *packet)  in hvsi_send_packet()  argument
11 packet->seqno = cpu_to_be16(atomic_inc_return(&pv->seqno)); in hvsi_send_packet()
14 return pv->put_chars(pv->termno, (char *)packet, packet->len); in hvsi_send_packet()
17 static void hvsi_start_handshake(struct hvsi_priv *pv) in hvsi_start_handshake() argument
22 pv->established = 0; in hvsi_start_handshake()
23 atomic_set(&pv->seqno, 0); in hvsi_start_handshake()
25 pr_devel("HVSI@%x: Handshaking started\n", pv->termno); in hvsi_start_handshake()
31 hvsi_send_packet(pv, &q.hdr); in hvsi_start_handshake()
34 static int hvsi_send_close(struct hvsi_priv *pv) in hvsi_send_close() argument
38 pv->established = 0; in hvsi_send_close()
43 return hvsi_send_packet(pv, &ctrl.hdr); in hvsi_send_close()
46 static void hvsi_cd_change(struct hvsi_priv *pv, int cd) in hvsi_cd_change() argument
49 pv->mctrl |= TIOCM_CD; in hvsi_cd_change()
51 pv->mctrl &= ~TIOCM_CD; in hvsi_cd_change()
59 if (!pv->is_console && pv->opened) { in hvsi_cd_change()
61 pv->termno); in hvsi_cd_change()
62 hvsi_send_close(pv); in hvsi_cd_change()
67 static void hvsi_got_control(struct hvsi_priv *pv) in hvsi_got_control() argument
69 struct hvsi_control *pkt = (struct hvsi_control *)pv->inbuf; in hvsi_got_control()
74 hvsi_start_handshake(pv); in hvsi_got_control()
78 hvsi_cd_change(pv, be32_to_cpu(pkt->word) & HVSI_TSCD); in hvsi_got_control()
83 static void hvsi_got_query(struct hvsi_priv *pv) in hvsi_got_query() argument
85 struct hvsi_query *pkt = (struct hvsi_query *)pv->inbuf; in hvsi_got_query()
93 pv->termno); in hvsi_got_query()
101 hvsi_send_packet(pv, &r.hdr); in hvsi_got_query()
104 pv->established = 1; in hvsi_got_query()
107 static void hvsi_got_response(struct hvsi_priv *pv) in hvsi_got_response() argument
110 (struct hvsi_query_response *)pv->inbuf; in hvsi_got_response()
114 hvsi_cd_change(pv, be32_to_cpu(r->u.mctrl_word) & HVSI_TSCD); in hvsi_got_response()
115 pv->mctrl_update = 1; in hvsi_got_response()
120 static int hvsi_check_packet(struct hvsi_priv *pv) in hvsi_check_packet() argument
127 if (pv->inbuf[0] < 0xfc) { in hvsi_check_packet()
128 pv->inbuf_len = pv->inbuf_pktlen = 0; in hvsi_check_packet()
131 type = pv->inbuf[0]; in hvsi_check_packet()
132 len = pv->inbuf[1]; in hvsi_check_packet()
135 if (pv->inbuf_len < len) in hvsi_check_packet()
139 pv->termno, type, len); in hvsi_check_packet()
144 pv->inbuf_pktlen = len - 4; in hvsi_check_packet()
145 pv->inbuf_cur = 4; in hvsi_check_packet()
148 hvsi_got_control(pv); in hvsi_check_packet()
151 hvsi_got_query(pv); in hvsi_check_packet()
154 hvsi_got_response(pv); in hvsi_check_packet()
159 pv->inbuf_len -= len; in hvsi_check_packet()
160 memmove(pv->inbuf, &pv->inbuf[len], pv->inbuf_len); in hvsi_check_packet()
164 static int hvsi_get_packet(struct hvsi_priv *pv) in hvsi_get_packet() argument
167 if (pv->inbuf_len < HVSI_INBUF_SIZE) in hvsi_get_packet()
168 pv->inbuf_len += pv->get_chars(pv->termno, in hvsi_get_packet()
169 &pv->inbuf[pv->inbuf_len], in hvsi_get_packet()
170 HVSI_INBUF_SIZE - pv->inbuf_len); in hvsi_get_packet()
175 if (pv->inbuf_len >= 4) in hvsi_get_packet()
176 return hvsi_check_packet(pv); in hvsi_get_packet()
180 int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count) in hvsilib_get_chars() argument
184 if (WARN_ON(!pv)) in hvsilib_get_chars()
192 if (!pv->opened) in hvsilib_get_chars()
200 if (pv->inbuf_pktlen) { in hvsilib_get_chars()
201 unsigned int l = min(count, (int)pv->inbuf_pktlen); in hvsilib_get_chars()
202 memcpy(&buf[read], &pv->inbuf[pv->inbuf_cur], l); in hvsilib_get_chars()
203 pv->inbuf_cur += l; in hvsilib_get_chars()
204 pv->inbuf_pktlen -= l; in hvsilib_get_chars()
212 if (pv->inbuf_cur) { in hvsilib_get_chars()
213 pv->inbuf_len -= pv->inbuf_cur; in hvsilib_get_chars()
214 memmove(pv->inbuf, &pv->inbuf[pv->inbuf_cur], in hvsilib_get_chars()
215 pv->inbuf_len); in hvsilib_get_chars()
216 pv->inbuf_cur = 0; in hvsilib_get_chars()
220 if (hvsi_get_packet(pv)) in hvsilib_get_chars()
223 if (!pv->established) { in hvsilib_get_chars()
224 pr_devel("HVSI@%x: returning -EPIPE\n", pv->termno); in hvsilib_get_chars()
230 int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count) in hvsilib_put_chars() argument
235 if (WARN_ON(!pv)) in hvsilib_put_chars()
241 rc = hvsi_send_packet(pv, &dp.hdr); in hvsilib_put_chars()
256 int hvsilib_read_mctrl(struct hvsi_priv *pv) in hvsilib_read_mctrl() argument
262 pv->termno); in hvsilib_read_mctrl()
264 pv->mctrl_update = 0; in hvsilib_read_mctrl()
268 rc = hvsi_send_packet(pv, &q.hdr); in hvsilib_read_mctrl()
270 pr_devel("HVSI@%x: Error %d...\n", pv->termno, rc); in hvsilib_read_mctrl()
276 if (!pv->established) in hvsilib_read_mctrl()
278 if (pv->mctrl_update) in hvsilib_read_mctrl()
280 if (!hvsi_get_packet(pv)) in hvsilib_read_mctrl()
286 int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr) in hvsilib_write_mctrl() argument
291 mctrl = pv->mctrl; in hvsilib_write_mctrl()
296 if (mctrl == pv->mctrl) in hvsilib_write_mctrl()
298 pv->mctrl = mctrl; in hvsilib_write_mctrl()
300 pr_devel("HVSI@%x: %s DTR...\n", pv->termno, in hvsilib_write_mctrl()
308 return hvsi_send_packet(pv, &ctrl.hdr); in hvsilib_write_mctrl()
311 void hvsilib_establish(struct hvsi_priv *pv) in hvsilib_establish() argument
315 pr_devel("HVSI@%x: Establishing...\n", pv->termno); in hvsilib_establish()
321 if (pv->established) in hvsilib_establish()
323 if (!hvsi_get_packet(pv)) in hvsilib_establish()
330 pr_devel("HVSI@%x: ... sending close\n", pv->termno); in hvsilib_establish()
332 hvsi_send_close(pv); in hvsilib_establish()
336 pr_devel("HVSI@%x: ... restarting handshake\n", pv->termno); in hvsilib_establish()
338 hvsi_start_handshake(pv); in hvsilib_establish()
340 pr_devel("HVSI@%x: ... waiting handshake\n", pv->termno); in hvsilib_establish()
344 if (pv->established) in hvsilib_establish()
346 if (!hvsi_get_packet(pv)) in hvsilib_establish()
350 if (!pv->established) { in hvsilib_establish()
352 pv->termno); in hvsilib_establish()
358 pr_devel("HVSI@%x: ... established, reading mctrl\n", pv->termno); in hvsilib_establish()
360 hvsilib_read_mctrl(pv); in hvsilib_establish()
364 pr_devel("HVSI@%x: ... setting mctrl\n", pv->termno); in hvsilib_establish()
366 hvsilib_write_mctrl(pv, 1); in hvsilib_establish()
370 pv->opened = 1; in hvsilib_establish()
373 int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_open() argument
375 pr_devel("HVSI@%x: open !\n", pv->termno); in hvsilib_open()
378 pv->tty = tty_port_tty_get(&hp->port); in hvsilib_open()
380 hvsilib_establish(pv); in hvsilib_open()
385 void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp) in hvsilib_close() argument
389 pr_devel("HVSI@%x: close !\n", pv->termno); in hvsilib_close()
391 if (!pv->is_console) { in hvsilib_close()
393 pv->termno); in hvsilib_close()
397 pv->opened = 0; in hvsilib_close()
401 if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL)) in hvsilib_close()
402 hvsilib_write_mctrl(pv, 0); in hvsilib_close()
405 hvsi_send_close(pv); in hvsilib_close()
408 tty_kref_put(pv->tty); in hvsilib_close()
409 pv->tty = NULL; in hvsilib_close()
412 void hvsilib_init(struct hvsi_priv *pv, in hvsilib_init() argument
418 memset(pv, 0, sizeof(*pv)); in hvsilib_init()
419 pv->get_chars = get_chars; in hvsilib_init()
420 pv->put_chars = put_chars; in hvsilib_init()
421 pv->termno = termno; in hvsilib_init()
422 pv->is_console = is_console; in hvsilib_init()