6 #include <linux/kernel.h>
7 #include <linux/export.h>
8 #include <linux/string.h>
10 #include <linux/sched.h>
11 #include <linux/slab.h>
23 if (!err || (err != -
EAGAIN))
52 memset(&pkt, 0,
sizeof(pkt));
58 viodbg(HS,
"SEND VERSION INFO maj[%u] min[%u] devclass[%u]\n",
61 return send_ctrl(vio, &pkt.tag,
sizeof(pkt));
68 viodbg(HS,
"START HANDSHAKE\n");
72 err = send_version(vio,
95 memset(dr, 0,
sizeof(*dr));
118 start_handshake(vio);
142 viodbg(HS,
"HANDSHAKE FAILURE\n");
148 memset(dr, 0,
sizeof(*dr));
163 viodbg(HS,
"UNKNOWN CONTROL [%02x:%02x:%04x:%08x]\n",
167 vio->
vdev->channel_id);
187 u.pkt.dring_ident = 0;
193 viodbg(HS,
"SEND DRING_REG INFO ndesc[%u] dsz[%u] opt[0x%x] "
195 u.pkt.num_descr,
u.pkt.descr_size,
u.pkt.options,
198 for (i = 0; i < dr->
ncookies; i++) {
201 viodbg(HS,
"DRING COOKIE(%d) [%016llx:%016llx]\n",
203 (
unsigned long long)
u.pkt.cookies[i].cookie_addr,
204 (
unsigned long long)
u.pkt.cookies[i].cookie_size);
207 return send_ctrl(vio, &
u.pkt.tag,
sizeof(
u));
214 memset(&pkt, 0,
sizeof(pkt));
218 viodbg(HS,
"SEND RDX INFO\n");
220 return send_ctrl(vio, &pkt.tag,
sizeof(pkt));
225 return vio->
ops->send_attr(vio);
236 if (v->
major <= major) {
250 viodbg(HS,
"GOT VERSION INFO maj[%u] min[%u] devclass[%u]\n",
259 vap = find_by_major(vio, pkt->
major);
267 viodbg(HS,
"SEND VERSION NACK maj[0] min[0]\n");
268 err = send_ctrl(vio, &pkt->
tag,
sizeof(*pkt));
273 viodbg(HS,
"SEND VERSION NACK maj[%u] min[%u]\n",
275 err = send_ctrl(vio, &pkt->
tag,
sizeof(*pkt));
285 viodbg(HS,
"SEND VERSION ACK maj[%u] min[%u]\n",
287 err = send_ctrl(vio, &pkt->
tag,
sizeof(*pkt));
294 return handshake_failure(vio);
302 viodbg(HS,
"GOT VERSION ACK maj[%u] min[%u] devclass[%u]\n",
309 (
void) send_ctrl(vio, &pkt->
tag,
sizeof(*pkt));
310 return handshake_failure(vio);
321 if (send_attr(vio) < 0)
322 return handshake_failure(vio);
337 viodbg(HS,
"GOT VERSION NACK maj[%u] min[%u] devclass[%u]\n",
341 return handshake_failure(vio);
342 nver = find_by_major(vio, pkt->
major);
344 return handshake_failure(vio);
346 if (send_version(vio, nver->
major, nver->
minor) < 0)
347 return handshake_failure(vio);
354 switch (pkt->
tag.stype) {
356 return process_ver_info(vio, pkt);
359 return process_ver_ack(vio, pkt);
362 return process_ver_nack(vio, pkt);
365 return handshake_failure(vio);
374 return handshake_failure(vio);
376 err = vio->
ops->handle_attr(vio, pkt);
378 return handshake_failure(vio);
384 if (send_dreg(vio) < 0)
385 return handshake_failure(vio);
395 int need_rx, need_tx;
417 viodbg(HS,
"GOT DRING_REG INFO ident[%llx] "
418 "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
442 for (i = 0; i < dr->
ncookies; i++) {
445 viodbg(HS,
"DRING COOKIE(%d) [%016llx:%016llx]\n",
456 viodbg(HS,
"SEND DRING_REG ACK ident[%llx]\n",
459 len = (
sizeof(*pkt) +
461 if (send_ctrl(vio, &pkt->
tag, len) < 0)
470 viodbg(HS,
"SEND DRING_REG NACK\n");
471 (
void) send_ctrl(vio, &pkt->
tag,
sizeof(*pkt));
473 return handshake_failure(vio);
481 viodbg(HS,
"GOT DRING_REG ACK ident[%llx] "
482 "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
490 return handshake_failure(vio);
495 if (all_drings_registered(vio)) {
496 if (send_rdx(vio) < 0)
497 return handshake_failure(vio);
506 viodbg(HS,
"GOT DRING_REG NACK ident[%llx] "
507 "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
512 return handshake_failure(vio);
519 return handshake_failure(vio);
521 switch (pkt->
tag.stype) {
523 return process_dreg_info(vio, pkt);
526 return process_dreg_ack(vio, pkt);
529 return process_dreg_nack(vio, pkt);
532 return handshake_failure(vio);
541 viodbg(HS,
"GOT DRING_UNREG\n");
548 memset(dr, 0,
sizeof(*dr));
559 viodbg(HS,
"GOT RDX INFO\n");
562 viodbg(HS,
"SEND RDX ACK\n");
563 if (send_ctrl(vio, &pkt->
tag,
sizeof(*pkt)) < 0)
564 return handshake_failure(vio);
572 viodbg(HS,
"GOT RDX ACK\n");
575 return handshake_failure(vio);
583 viodbg(HS,
"GOT RDX NACK\n");
585 return handshake_failure(vio);
590 if (!all_drings_registered(vio))
591 handshake_failure(vio);
593 switch (pkt->
tag.stype) {
595 return process_rdx_info(vio, pkt);
598 return process_rdx_ack(vio, pkt);
601 return process_rdx_nack(vio, pkt);
604 return handshake_failure(vio);
616 err = process_ver(vio, pkt);
620 err = process_attr(vio, pkt);
624 err = process_dreg(vio, pkt);
628 err = process_dunreg(vio, pkt);
632 err = process_rdx(vio, pkt);
636 err = process_unknown(vio, pkt);
642 vio->
ops->handshake_complete(vio);
686 viodbg(
DATA,
"BAD SID tag->sid[%08x] peer_sid[%08x] local_sid[%08x]\n",
753 vio->
name, vio->
vdev->channel_id, err);
761 vio->
name, vio->
vdev->channel_id, err);
770 spin_unlock_irqrestore(&vio->
lock, flags);
774 static void vio_port_timer(
unsigned long _arg)
802 if (!ver_table || ver_table_size < 0)