Lines Matching +full:- +full:grp
1 // SPDX-License-Identifier: GPL-2.0
80 .xid2_buf_len = (MPC_BUFSIZE_DEFAULT - 35),
126 /*-------------------------------------------------------------------*
129 *--------------------------------------------------------------------*/
170 rm--; in ctcmpc_dumpit()
177 ctcm_pr_debug(" --- %s ---\n", in ctcmpc_dumpit()
192 for ( ; rm > 0; rm--, sw++) { in ctcmpc_dumpit()
203 ctcm_pr_debug(" --- %s ---\n", tdup); in ctcmpc_dumpit()
211 ctcm_pr_debug(" --- %s ---\n", tdup); in ctcmpc_dumpit()
229 * offset Offset relative to skb-data, where to start the dump.
233 __u8 *p = skb->data; in ctcmpc_dump_skb()
236 int bl = skb->len; in ctcmpc_dump_skb()
246 ctcm_pr_debug("skb len=%d \n", skb->len); in ctcmpc_dump_skb()
247 if (skb->len > 2) { in ctcmpc_dump_skb()
248 switch (header->th_ch_flag) { in ctcmpc_dump_skb()
253 if ((header->th_blk_flag == TH_DATA_IS_XID) && in ctcmpc_dump_skb()
254 (header->th_is_xid == 0x01)) in ctcmpc_dump_skb()
265 ctcm_pr_debug("pdu->offset: %d hex: %04x\n", in ctcmpc_dump_skb()
266 pheader->pdu_offset, pheader->pdu_offset); in ctcmpc_dump_skb()
267 ctcm_pr_debug("pdu->flag : %02x\n", pheader->pdu_flag); in ctcmpc_dump_skb()
268 ctcm_pr_debug("pdu->proto : %02x\n", pheader->pdu_proto); in ctcmpc_dump_skb()
269 ctcm_pr_debug("pdu->seq : %02x\n", pheader->pdu_seq); in ctcmpc_dump_skb()
273 ctcm_pr_debug("th->seg : %02x\n", header->th_seg); in ctcmpc_dump_skb()
274 ctcm_pr_debug("th->ch : %02x\n", header->th_ch_flag); in ctcmpc_dump_skb()
275 ctcm_pr_debug("th->blk_flag: %02x\n", header->th_blk_flag); in ctcmpc_dump_skb()
276 ctcm_pr_debug("th->type : %s\n", in ctcmpc_dump_skb()
277 (header->th_is_xid) ? "DATA" : "XID"); in ctcmpc_dump_skb()
278 ctcm_pr_debug("th->seqnum : %04x\n", header->th_seq_num); in ctcmpc_dump_skb()
307 priv = dev->ml_priv; in ctcmpc_get_dev()
310 "%s(%s): dev->ml_priv is NULL", in ctcmpc_get_dev()
314 if (priv->mpcg == NULL) { in ctcmpc_get_dev()
316 "%s(%s): priv->mpcg is NULL", in ctcmpc_get_dev()
333 struct mpc_group *grp; in ctc_mpc_alloc_channel() local
339 priv = dev->ml_priv; in ctc_mpc_alloc_channel()
340 grp = priv->mpcg; in ctc_mpc_alloc_channel()
342 grp->allochanfunc = callback; in ctc_mpc_alloc_channel()
343 grp->port_num = port_num; in ctc_mpc_alloc_channel()
344 grp->port_persist = 1; in ctc_mpc_alloc_channel()
348 CTCM_FUNTAIL, dev->name, fsm_getstate_str(grp->fsm)); in ctc_mpc_alloc_channel()
350 switch (fsm_getstate(grp->fsm)) { in ctc_mpc_alloc_channel()
353 grp->alloc_called = 1; in ctc_mpc_alloc_channel()
360 /*fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW);*/ in ctc_mpc_alloc_channel()
362 grp->send_qllc_disc = 1; in ctc_mpc_alloc_channel()
365 fsm_deltimer(&grp->timer); in ctc_mpc_alloc_channel()
366 grp->outstanding_xid2 = 0; in ctc_mpc_alloc_channel()
367 grp->outstanding_xid7 = 0; in ctc_mpc_alloc_channel()
368 grp->outstanding_xid7_p2 = 0; in ctc_mpc_alloc_channel()
369 grp->saved_xid2 = NULL; in ctc_mpc_alloc_channel()
372 fsm_event(priv->fsm, DEV_EVENT_START, dev); in ctc_mpc_alloc_channel()
378 grp->allocchan_callback_retries++; in ctc_mpc_alloc_channel()
379 if (grp->allocchan_callback_retries < 4) { in ctc_mpc_alloc_channel()
380 if (grp->allochanfunc) in ctc_mpc_alloc_channel()
381 grp->allochanfunc(grp->port_num, in ctc_mpc_alloc_channel()
382 grp->group_max_buflen); in ctc_mpc_alloc_channel()
386 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctc_mpc_alloc_channel()
387 grp->allocchan_callback_retries = 0; in ctc_mpc_alloc_channel()
404 struct mpc_group *grp; in ctc_mpc_establish_connectivity() local
411 priv = dev->ml_priv; in ctc_mpc_establish_connectivity()
412 grp = priv->mpcg; in ctc_mpc_establish_connectivity()
413 rch = priv->channel[CTCM_READ]; in ctc_mpc_establish_connectivity()
414 wch = priv->channel[CTCM_WRITE]; in ctc_mpc_establish_connectivity()
418 CTCM_FUNTAIL, dev->name, fsm_getstate_str(grp->fsm)); in ctc_mpc_establish_connectivity()
420 grp->estconnfunc = callback; in ctc_mpc_establish_connectivity()
421 grp->port_num = port_num; in ctc_mpc_establish_connectivity()
423 switch (fsm_getstate(grp->fsm)) { in ctc_mpc_establish_connectivity()
428 fsm_deltimer(&grp->timer); in ctc_mpc_establish_connectivity()
429 grp->estconn_callback_retries++; in ctc_mpc_establish_connectivity()
430 if (grp->estconn_callback_retries < 4) { in ctc_mpc_establish_connectivity()
431 if (grp->estconnfunc) { in ctc_mpc_establish_connectivity()
432 grp->estconnfunc(grp->port_num, 0, in ctc_mpc_establish_connectivity()
433 grp->group_max_buflen); in ctc_mpc_establish_connectivity()
434 grp->estconnfunc = NULL; in ctc_mpc_establish_connectivity()
438 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctc_mpc_establish_connectivity()
439 grp->estconn_callback_retries = 0; in ctc_mpc_establish_connectivity()
444 /* MPC Group is not ready to start XID - min num of */ in ctc_mpc_establish_connectivity()
448 "%s(%s): REJECTED - inactive channels", in ctc_mpc_establish_connectivity()
449 CTCM_FUNTAIL, dev->name); in ctc_mpc_establish_connectivity()
450 if (grp->estconnfunc) { in ctc_mpc_establish_connectivity()
451 grp->estconnfunc(grp->port_num, -1, 0); in ctc_mpc_establish_connectivity()
452 grp->estconnfunc = NULL; in ctc_mpc_establish_connectivity()
460 if ((fsm_getstate(rch->fsm) > CH_XID0_PENDING) || in ctc_mpc_establish_connectivity()
461 (fsm_getstate(wch->fsm) > CH_XID0_PENDING)) { in ctc_mpc_establish_connectivity()
463 "%s(%s): ABORT - PASSIVE XID", in ctc_mpc_establish_connectivity()
464 CTCM_FUNTAIL, dev->name); in ctc_mpc_establish_connectivity()
467 grp->send_qllc_disc = 1; in ctc_mpc_establish_connectivity()
468 fsm_newstate(grp->fsm, MPCG_STATE_XID0IOWAIT); in ctc_mpc_establish_connectivity()
469 fsm_deltimer(&grp->timer); in ctc_mpc_establish_connectivity()
470 fsm_addtimer(&grp->timer, MPC_XID_TIMEOUT_VALUE, in ctc_mpc_establish_connectivity()
472 grp->outstanding_xid7 = 0; in ctc_mpc_establish_connectivity()
473 grp->outstanding_xid7_p2 = 0; in ctc_mpc_establish_connectivity()
474 grp->saved_xid2 = NULL; in ctc_mpc_establish_connectivity()
475 if ((rch->in_mpcgroup) && in ctc_mpc_establish_connectivity()
476 (fsm_getstate(rch->fsm) == CH_XID0_PENDING)) in ctc_mpc_establish_connectivity()
477 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, rch); in ctc_mpc_establish_connectivity()
480 "%s(%s): RX-%s not ready for ACTIVE XID0", in ctc_mpc_establish_connectivity()
481 CTCM_FUNTAIL, dev->name, rch->id); in ctc_mpc_establish_connectivity()
482 if (grp->estconnfunc) { in ctc_mpc_establish_connectivity()
483 grp->estconnfunc(grp->port_num, -1, 0); in ctc_mpc_establish_connectivity()
484 grp->estconnfunc = NULL; in ctc_mpc_establish_connectivity()
486 fsm_deltimer(&grp->timer); in ctc_mpc_establish_connectivity()
489 if ((wch->in_mpcgroup) && in ctc_mpc_establish_connectivity()
490 (fsm_getstate(wch->fsm) == CH_XID0_PENDING)) in ctc_mpc_establish_connectivity()
491 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, wch); in ctc_mpc_establish_connectivity()
494 "%s(%s): WX-%s not ready for ACTIVE XID0", in ctc_mpc_establish_connectivity()
495 CTCM_FUNTAIL, dev->name, wch->id); in ctc_mpc_establish_connectivity()
496 if (grp->estconnfunc) { in ctc_mpc_establish_connectivity()
497 grp->estconnfunc(grp->port_num, -1, 0); in ctc_mpc_establish_connectivity()
498 grp->estconnfunc = NULL; in ctc_mpc_establish_connectivity()
500 fsm_deltimer(&grp->timer); in ctc_mpc_establish_connectivity()
524 struct mpc_group *grp; in ctc_mpc_dealloc_ch() local
529 priv = dev->ml_priv; in ctc_mpc_dealloc_ch()
530 grp = priv->mpcg; in ctc_mpc_dealloc_ch()
534 CTCM_FUNTAIL, dev->name, netdev_refcnt_read(dev)); in ctc_mpc_dealloc_ch()
536 fsm_deltimer(&priv->restart_timer); in ctc_mpc_dealloc_ch()
537 grp->channels_terminating = 0; in ctc_mpc_dealloc_ch()
538 fsm_deltimer(&grp->timer); in ctc_mpc_dealloc_ch()
539 grp->allochanfunc = NULL; in ctc_mpc_dealloc_ch()
540 grp->estconnfunc = NULL; in ctc_mpc_dealloc_ch()
541 grp->port_persist = 0; in ctc_mpc_dealloc_ch()
542 grp->send_qllc_disc = 0; in ctc_mpc_dealloc_ch()
543 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctc_mpc_dealloc_ch()
557 struct mpc_group *grp; in ctc_mpc_flow_control() local
565 priv = dev->ml_priv; in ctc_mpc_flow_control()
566 grp = priv->mpcg; in ctc_mpc_flow_control()
570 CTCM_FUNTAIL, dev->name, flowc); in ctc_mpc_flow_control()
572 rch = priv->channel[CTCM_READ]; in ctc_mpc_flow_control()
574 mpcg_state = fsm_getstate(grp->fsm); in ctc_mpc_flow_control()
580 if (grp->flow_off_called == 1) in ctc_mpc_flow_control()
581 grp->flow_off_called = 0; in ctc_mpc_flow_control()
583 fsm_newstate(grp->fsm, MPCG_STATE_FLOWC); in ctc_mpc_flow_control()
589 fsm_newstate(grp->fsm, MPCG_STATE_READY); in ctc_mpc_flow_control()
592 tasklet_schedule(&rch->ch_tasklet); in ctc_mpc_flow_control()
596 grp->flow_off_called = 1; in ctc_mpc_flow_control()
612 struct channel *rch = mpcginfo->ch; in mpc_rcvd_sweep_resp()
613 struct net_device *dev = rch->netdev; in mpc_rcvd_sweep_resp()
614 struct ctcm_priv *priv = dev->ml_priv; in mpc_rcvd_sweep_resp()
615 struct mpc_group *grp = priv->mpcg; in mpc_rcvd_sweep_resp() local
616 struct channel *ch = priv->channel[CTCM_WRITE]; in mpc_rcvd_sweep_resp()
618 CTCM_PR_DEBUG("%s: ch=0x%p id=%s\n", __func__, ch, ch->id); in mpc_rcvd_sweep_resp()
619 CTCM_D3_DUMP((char *)mpcginfo->sweep, TH_SWEEP_LENGTH); in mpc_rcvd_sweep_resp()
621 grp->sweep_rsp_pend_num--; in mpc_rcvd_sweep_resp()
623 if ((grp->sweep_req_pend_num == 0) && in mpc_rcvd_sweep_resp()
624 (grp->sweep_rsp_pend_num == 0)) { in mpc_rcvd_sweep_resp()
625 fsm_deltimer(&ch->sweep_timer); in mpc_rcvd_sweep_resp()
626 grp->in_sweep = 0; in mpc_rcvd_sweep_resp()
627 rch->th_seq_num = 0x00; in mpc_rcvd_sweep_resp()
628 ch->th_seq_num = 0x00; in mpc_rcvd_sweep_resp()
642 struct net_device *dev = rch->netdev; in ctcmpc_send_sweep_resp()
643 struct ctcm_priv *priv = dev->ml_priv; in ctcmpc_send_sweep_resp()
644 struct mpc_group *grp = priv->mpcg; in ctcmpc_send_sweep_resp() local
647 struct channel *ch = priv->channel[CTCM_WRITE]; in ctcmpc_send_sweep_resp()
649 CTCM_PR_DEBUG("%s: ch=0x%p id=%s\n", __func__, rch, rch->id); in ctcmpc_send_sweep_resp()
655 CTCM_FUNTAIL, rch->id); in ctcmpc_send_sweep_resp()
660 header->th.th_ch_flag = TH_SWEEP_RESP; in ctcmpc_send_sweep_resp()
661 header->sw.th_last_seq = ch->th_seq_num; in ctcmpc_send_sweep_resp()
664 skb_queue_tail(&ch->sweep_queue, sweep_skb); in ctcmpc_send_sweep_resp()
666 fsm_addtimer(&ch->sweep_timer, 100, CTC_EVENT_RSWEEP_TIMER, ch); in ctcmpc_send_sweep_resp()
671 grp->in_sweep = 0; in ctcmpc_send_sweep_resp()
673 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctcmpc_send_sweep_resp()
683 struct channel *rch = mpcginfo->ch; in mpc_rcvd_sweep_req()
684 struct net_device *dev = rch->netdev; in mpc_rcvd_sweep_req()
685 struct ctcm_priv *priv = dev->ml_priv; in mpc_rcvd_sweep_req()
686 struct mpc_group *grp = priv->mpcg; in mpc_rcvd_sweep_req() local
687 struct channel *ch = priv->channel[CTCM_WRITE]; in mpc_rcvd_sweep_req()
691 " %s(): ch=0x%p id=%s\n", __func__, ch, ch->id); in mpc_rcvd_sweep_req()
693 if (grp->in_sweep == 0) { in mpc_rcvd_sweep_req()
694 grp->in_sweep = 1; in mpc_rcvd_sweep_req()
696 grp->sweep_req_pend_num = grp->active_channels[CTCM_READ]; in mpc_rcvd_sweep_req()
697 grp->sweep_rsp_pend_num = grp->active_channels[CTCM_READ]; in mpc_rcvd_sweep_req()
700 CTCM_D3_DUMP((char *)mpcginfo->sweep, TH_SWEEP_LENGTH); in mpc_rcvd_sweep_req()
702 grp->sweep_req_pend_num--; in mpc_rcvd_sweep_req()
714 [MPCG_EVENT_XID0DO] = "Channel Active - Start XID",
725 [MPCG_STATE_XID2INITW] = "Passive XID- XID0 Pending Start",
726 [MPCG_STATE_XID2INITX] = "Passive XID- XID0 Pending Complete",
727 [MPCG_STATE_XID7INITW] = "Passive XID- XID7 Pending P1 Start",
728 [MPCG_STATE_XID7INITX] = "Passive XID- XID7 Pending P2 Complete",
729 [MPCG_STATE_XID0IOWAIT] = "Active XID- XID0 Pending Start",
730 [MPCG_STATE_XID0IOWAIX] = "Active XID- XID0 Pending Complete",
731 [MPCG_STATE_XID7INITI] = "Active XID- XID7 Pending Start",
732 [MPCG_STATE_XID7INITZ] = "Active XID- XID7 Pending Complete ",
733 [MPCG_STATE_XID7INITF] = "XID - XID7 Complete ",
819 struct ctcm_priv *priv = dev->ml_priv; in mpc_action_go_ready()
820 struct mpc_group *grp = priv->mpcg; in mpc_action_go_ready() local
822 if (grp == NULL) { in mpc_action_go_ready()
825 CTCM_FUNTAIL, dev->name); in mpc_action_go_ready()
829 fsm_deltimer(&grp->timer); in mpc_action_go_ready()
831 if (grp->saved_xid2->xid2_flag2 == 0x40) { in mpc_action_go_ready()
832 priv->xid->xid2_flag2 = 0x00; in mpc_action_go_ready()
833 if (grp->estconnfunc) { in mpc_action_go_ready()
834 grp->estconnfunc(grp->port_num, 1, in mpc_action_go_ready()
835 grp->group_max_buflen); in mpc_action_go_ready()
836 grp->estconnfunc = NULL; in mpc_action_go_ready()
837 } else if (grp->allochanfunc) in mpc_action_go_ready()
838 grp->send_qllc_disc = 1; in mpc_action_go_ready()
840 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in mpc_action_go_ready()
843 CTCM_FUNTAIL, dev->name); in mpc_action_go_ready()
847 grp->port_persist = 1; in mpc_action_go_ready()
848 grp->out_of_sequence = 0; in mpc_action_go_ready()
849 grp->estconn_called = 0; in mpc_action_go_ready()
851 tasklet_hi_schedule(&grp->mpc_tasklet2); in mpc_action_go_ready()
863 struct ctcm_priv *priv = dev->ml_priv; in mpc_group_ready()
864 struct mpc_group *grp = priv->mpcg; in mpc_group_ready() local
867 if (grp == NULL) { in mpc_group_ready()
870 CTCM_FUNTAIL, dev->name); in mpc_group_ready()
876 CTCM_FUNTAIL, dev->name, grp->group_max_buflen); in mpc_group_ready()
878 fsm_newstate(grp->fsm, MPCG_STATE_READY); in mpc_group_ready()
881 ch = priv->channel[CTCM_READ]; in mpc_group_ready()
882 ch->pdu_seq = 0; in mpc_group_ready()
884 __func__, ch->pdu_seq); in mpc_group_ready()
886 ctcmpc_chx_rxidle(ch->fsm, CTC_EVENT_START, ch); in mpc_group_ready()
888 ch = priv->channel[CTCM_WRITE]; in mpc_group_ready()
889 if (ch->collect_len > 0) { in mpc_group_ready()
890 spin_lock(&ch->collect_lock); in mpc_group_ready()
891 ctcm_purge_skb_queue(&ch->collect_queue); in mpc_group_ready()
892 ch->collect_len = 0; in mpc_group_ready()
893 spin_unlock(&ch->collect_lock); in mpc_group_ready()
895 ctcm_chx_txidle(ch->fsm, CTC_EVENT_START, ch); in mpc_group_ready()
898 if (grp->estconnfunc) { in mpc_group_ready()
899 grp->estconnfunc(grp->port_num, 0, in mpc_group_ready()
900 grp->group_max_buflen); in mpc_group_ready()
901 grp->estconnfunc = NULL; in mpc_group_ready()
902 } else if (grp->allochanfunc) { in mpc_group_ready()
903 grp->allochanfunc(grp->port_num, grp->group_max_buflen); in mpc_group_ready()
906 grp->send_qllc_disc = 1; in mpc_group_ready()
907 grp->changed_side = 0; in mpc_group_ready()
919 struct net_device *dev = ch->netdev; in mpc_channel_action()
920 struct ctcm_priv *priv = dev->ml_priv; in mpc_channel_action()
921 struct mpc_group *grp = priv->mpcg; in mpc_channel_action() local
923 if (grp == NULL) { in mpc_channel_action()
926 CTCM_FUNTAIL, dev->name); in mpc_channel_action()
930 CTCM_PR_DEBUG("enter %s: ch=0x%p id=%s\n", __func__, ch, ch->id); in mpc_channel_action()
933 "%s: %i / Grp:%s total_channels=%i, active_channels: " in mpc_channel_action()
935 fsm_getstate_str(grp->fsm), grp->num_channel_paths, in mpc_channel_action()
936 grp->active_channels[CTCM_READ], in mpc_channel_action()
937 grp->active_channels[CTCM_WRITE]); in mpc_channel_action()
939 if ((action == MPC_CHANNEL_ADD) && (ch->in_mpcgroup == 0)) { in mpc_channel_action()
940 grp->num_channel_paths++; in mpc_channel_action()
941 grp->active_channels[direction]++; in mpc_channel_action()
942 grp->outstanding_xid2++; in mpc_channel_action()
943 ch->in_mpcgroup = 1; in mpc_channel_action()
945 if (ch->xid_skb != NULL) in mpc_channel_action()
946 dev_kfree_skb_any(ch->xid_skb); in mpc_channel_action()
948 ch->xid_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, in mpc_channel_action()
950 if (ch->xid_skb == NULL) { in mpc_channel_action()
953 CTCM_FUNTAIL, dev->name); in mpc_channel_action()
954 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in mpc_channel_action()
957 ch->xid_skb_data = ch->xid_skb->data; in mpc_channel_action()
958 ch->xid_th = (struct th_header *)ch->xid_skb->data; in mpc_channel_action()
959 skb_put(ch->xid_skb, TH_HEADER_LENGTH); in mpc_channel_action()
960 ch->xid = (struct xid2 *)skb_tail_pointer(ch->xid_skb); in mpc_channel_action()
961 skb_put(ch->xid_skb, XID2_LENGTH); in mpc_channel_action()
962 ch->xid_id = skb_tail_pointer(ch->xid_skb); in mpc_channel_action()
963 ch->xid_skb->data = ch->xid_skb_data; in mpc_channel_action()
964 skb_reset_tail_pointer(ch->xid_skb); in mpc_channel_action()
965 ch->xid_skb->len = 0; in mpc_channel_action()
967 skb_put_data(ch->xid_skb, grp->xid_skb->data, in mpc_channel_action()
968 grp->xid_skb->len); in mpc_channel_action()
970 ch->xid->xid2_dlc_type = in mpc_channel_action()
971 ((CHANNEL_DIRECTION(ch->flags) == CTCM_READ) in mpc_channel_action()
974 if (CHANNEL_DIRECTION(ch->flags) == CTCM_WRITE) in mpc_channel_action()
975 ch->xid->xid2_buf_len = 0x00; in mpc_channel_action()
977 ch->xid_skb->data = ch->xid_skb_data; in mpc_channel_action()
978 skb_reset_tail_pointer(ch->xid_skb); in mpc_channel_action()
979 ch->xid_skb->len = 0; in mpc_channel_action()
981 fsm_newstate(ch->fsm, CH_XID0_PENDING); in mpc_channel_action()
983 if ((grp->active_channels[CTCM_READ] > 0) && in mpc_channel_action()
984 (grp->active_channels[CTCM_WRITE] > 0) && in mpc_channel_action()
985 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) { in mpc_channel_action()
986 fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW); in mpc_channel_action()
989 __func__, dev->name); in mpc_channel_action()
992 (ch->in_mpcgroup == 1)) { in mpc_channel_action()
993 ch->in_mpcgroup = 0; in mpc_channel_action()
994 grp->num_channel_paths--; in mpc_channel_action()
995 grp->active_channels[direction]--; in mpc_channel_action()
997 if (ch->xid_skb != NULL) in mpc_channel_action()
998 dev_kfree_skb_any(ch->xid_skb); in mpc_channel_action()
999 ch->xid_skb = NULL; in mpc_channel_action()
1001 if (grp->channels_terminating) in mpc_channel_action()
1004 if (((grp->active_channels[CTCM_READ] == 0) && in mpc_channel_action()
1005 (grp->active_channels[CTCM_WRITE] > 0)) in mpc_channel_action()
1006 || ((grp->active_channels[CTCM_WRITE] == 0) && in mpc_channel_action()
1007 (grp->active_channels[CTCM_READ] > 0))) in mpc_channel_action()
1008 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in mpc_channel_action()
1012 "exit %s: %i / Grp:%s total_channels=%i, active_channels: " in mpc_channel_action()
1014 fsm_getstate_str(grp->fsm), grp->num_channel_paths, in mpc_channel_action()
1015 grp->active_channels[CTCM_READ], in mpc_channel_action()
1016 grp->active_channels[CTCM_WRITE]); in mpc_channel_action()
1018 CTCM_PR_DEBUG("exit %s: ch=0x%p id=%s\n", __func__, ch, ch->id); in mpc_channel_action()
1031 struct net_device *dev = ch->netdev; in ctcmpc_unpack_skb()
1032 struct ctcm_priv *priv = dev->ml_priv; in ctcmpc_unpack_skb()
1033 struct mpc_group *grp = priv->mpcg; in ctcmpc_unpack_skb() local
1045 __func__, dev->name, smp_processor_id(), ch->id); in ctcmpc_unpack_skb()
1047 header = (struct th_header *)pskb->data; in ctcmpc_unpack_skb()
1048 if ((header->th_seg == 0) && in ctcmpc_unpack_skb()
1049 (header->th_ch_flag == 0) && in ctcmpc_unpack_skb()
1050 (header->th_blk_flag == 0) && in ctcmpc_unpack_skb()
1051 (header->th_seq_num == 0)) in ctcmpc_unpack_skb()
1056 CTCM_PR_DBGDATA("%s: pskb len: %04x \n", __func__, pskb->len); in ctcmpc_unpack_skb()
1058 pskb->dev = dev; in ctcmpc_unpack_skb()
1059 pskb->ip_summed = CHECKSUM_UNNECESSARY; in ctcmpc_unpack_skb()
1062 if (likely(header->th_ch_flag == TH_HAS_PDU)) { in ctcmpc_unpack_skb()
1064 if ((fsm_getstate(grp->fsm) == MPCG_STATE_FLOWC) || in ctcmpc_unpack_skb()
1065 ((fsm_getstate(grp->fsm) == MPCG_STATE_READY) && in ctcmpc_unpack_skb()
1066 (header->th_seq_num != ch->th_seq_num + 1) && in ctcmpc_unpack_skb()
1067 (ch->th_seq_num != 0))) { in ctcmpc_unpack_skb()
1074 grp->out_of_sequence += 1; in ctcmpc_unpack_skb()
1076 skb_queue_tail(&ch->io_queue, pskb); in ctcmpc_unpack_skb()
1079 ch->th_seq_num + 1, header->th_seq_num); in ctcmpc_unpack_skb()
1083 grp->out_of_sequence = 0; in ctcmpc_unpack_skb()
1084 ch->th_seq_num = header->th_seq_num; in ctcmpc_unpack_skb()
1087 __func__, ch->th_seq_num); in ctcmpc_unpack_skb()
1089 if (unlikely(fsm_getstate(grp->fsm) != MPCG_STATE_READY)) in ctcmpc_unpack_skb()
1091 while ((pskb->len > 0) && !pdu_last_seen) { in ctcmpc_unpack_skb()
1092 curr_pdu = (struct pdu *)pskb->data; in ctcmpc_unpack_skb()
1095 CTCM_D3_DUMP((char *)pskb->data, PDU_HEADER_LENGTH); in ctcmpc_unpack_skb()
1097 __func__, pskb->len); in ctcmpc_unpack_skb()
1101 if (curr_pdu->pdu_flag & PDU_LAST) in ctcmpc_unpack_skb()
1103 if (curr_pdu->pdu_flag & PDU_CNTL) in ctcmpc_unpack_skb()
1104 pskb->protocol = htons(ETH_P_SNAP); in ctcmpc_unpack_skb()
1106 pskb->protocol = htons(ETH_P_SNA_DIX); in ctcmpc_unpack_skb()
1108 if ((pskb->len <= 0) || (pskb->len > ch->max_bufsize)) { in ctcmpc_unpack_skb()
1112 CTCM_FUNTAIL, dev->name, pskb->len); in ctcmpc_unpack_skb()
1114 priv->stats.rx_dropped++; in ctcmpc_unpack_skb()
1115 priv->stats.rx_length_errors++; in ctcmpc_unpack_skb()
1119 new_len = curr_pdu->pdu_offset; in ctcmpc_unpack_skb()
1122 if ((new_len == 0) || (new_len > pskb->len)) { in ctcmpc_unpack_skb()
1128 CTCM_FUNTAIL, dev->name, new_len); in ctcmpc_unpack_skb()
1136 CTCM_FUNTAIL, dev->name); in ctcmpc_unpack_skb()
1137 priv->stats.rx_dropped++; in ctcmpc_unpack_skb()
1138 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctcmpc_unpack_skb()
1141 skb_put_data(skb, pskb->data, new_len); in ctcmpc_unpack_skb()
1144 skb->dev = pskb->dev; in ctcmpc_unpack_skb()
1145 skb->protocol = pskb->protocol; in ctcmpc_unpack_skb()
1146 skb->ip_summed = CHECKSUM_UNNECESSARY; in ctcmpc_unpack_skb()
1147 *((__u32 *) skb_push(skb, 4)) = ch->pdu_seq; in ctcmpc_unpack_skb()
1148 ch->pdu_seq++; in ctcmpc_unpack_skb()
1152 __func__, ch->pdu_seq); in ctcmpc_unpack_skb()
1155 (unsigned long)skb, skb->len); in ctcmpc_unpack_skb()
1158 ctcmpc_dump32((char *)skb->data, skb->len); in ctcmpc_unpack_skb()
1161 skblen = skb->len; in ctcmpc_unpack_skb()
1163 priv->stats.rx_packets++; in ctcmpc_unpack_skb()
1164 priv->stats.rx_bytes += skblen; in ctcmpc_unpack_skb()
1172 mpcginfo->ch = ch; in ctcmpc_unpack_skb()
1173 mpcginfo->th = header; in ctcmpc_unpack_skb()
1174 mpcginfo->skb = pskb; in ctcmpc_unpack_skb()
1175 CTCM_PR_DEBUG("%s: Not PDU - may be control pkt\n", in ctcmpc_unpack_skb()
1178 sweep = (struct th_sweep *)pskb->data; in ctcmpc_unpack_skb()
1179 mpcginfo->sweep = sweep; in ctcmpc_unpack_skb()
1180 if (header->th_ch_flag == TH_SWEEP_REQ) in ctcmpc_unpack_skb()
1182 else if (header->th_ch_flag == TH_SWEEP_RESP) in ctcmpc_unpack_skb()
1184 else if (header->th_blk_flag == TH_DATA_IS_XID) { in ctcmpc_unpack_skb()
1185 struct xid2 *thisxid = (struct xid2 *)pskb->data; in ctcmpc_unpack_skb()
1187 mpcginfo->xid = thisxid; in ctcmpc_unpack_skb()
1188 fsm_event(grp->fsm, MPCG_EVENT_XID2, mpcginfo); in ctcmpc_unpack_skb()
1189 } else if (header->th_blk_flag == TH_DISCONTACT) in ctcmpc_unpack_skb()
1190 fsm_event(grp->fsm, MPCG_EVENT_DISCONC, mpcginfo); in ctcmpc_unpack_skb()
1191 else if (header->th_seq_num != 0) { in ctcmpc_unpack_skb()
1194 CTCM_FUNTAIL, dev->name); in ctcmpc_unpack_skb()
1195 priv->stats.rx_dropped++; in ctcmpc_unpack_skb()
1196 /* mpcginfo only used for non-data transfers */ in ctcmpc_unpack_skb()
1198 ctcmpc_dump_skb(pskb, -8); in ctcmpc_unpack_skb()
1206 dev_warn(&dev->dev, in ctcmpc_unpack_skb()
1209 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctcmpc_unpack_skb()
1213 __func__, dev->name, ch, ch->id); in ctcmpc_unpack_skb()
1228 struct net_device *dev = ch->netdev; in ctcmpc_bh()
1229 struct ctcm_priv *priv = dev->ml_priv; in ctcmpc_bh()
1230 struct mpc_group *grp = priv->mpcg; in ctcmpc_bh() local
1233 dev->name, smp_processor_id(), __func__, ch->id); in ctcmpc_bh()
1235 while ((fsm_getstate(grp->fsm) != MPCG_STATE_FLOWC) && in ctcmpc_bh()
1236 (skb = skb_dequeue(&ch->io_queue))) { in ctcmpc_bh()
1238 if (grp->out_of_sequence > 20) { in ctcmpc_bh()
1242 grp->out_of_sequence = 0; in ctcmpc_bh()
1243 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in ctcmpc_bh()
1246 if (skb == skb_peek(&ch->io_queue)) in ctcmpc_bh()
1250 __func__, dev->name, ch, ch->id); in ctcmpc_bh()
1259 struct mpc_group *grp; in ctcmpc_init_mpc_group() local
1264 grp = kzalloc(sizeof(struct mpc_group), GFP_KERNEL); in ctcmpc_init_mpc_group()
1265 if (grp == NULL) in ctcmpc_init_mpc_group()
1268 grp->fsm = init_fsm("mpcg", mpcg_state_names, mpcg_event_names, in ctcmpc_init_mpc_group()
1271 if (grp->fsm == NULL) { in ctcmpc_init_mpc_group()
1272 kfree(grp); in ctcmpc_init_mpc_group()
1276 fsm_newstate(grp->fsm, MPCG_STATE_RESET); in ctcmpc_init_mpc_group()
1277 fsm_settimer(grp->fsm, &grp->timer); in ctcmpc_init_mpc_group()
1279 grp->xid_skb = in ctcmpc_init_mpc_group()
1281 if (grp->xid_skb == NULL) { in ctcmpc_init_mpc_group()
1282 kfree_fsm(grp->fsm); in ctcmpc_init_mpc_group()
1283 kfree(grp); in ctcmpc_init_mpc_group()
1287 grp->xid_skb_data = grp->xid_skb->data; in ctcmpc_init_mpc_group()
1288 grp->xid_th = (struct th_header *)grp->xid_skb->data; in ctcmpc_init_mpc_group()
1289 skb_put_data(grp->xid_skb, &thnorm, TH_HEADER_LENGTH); in ctcmpc_init_mpc_group()
1291 grp->xid = (struct xid2 *)skb_tail_pointer(grp->xid_skb); in ctcmpc_init_mpc_group()
1292 skb_put_data(grp->xid_skb, &init_xid, XID2_LENGTH); in ctcmpc_init_mpc_group()
1293 grp->xid->xid2_adj_id = jiffies | 0xfff00000; in ctcmpc_init_mpc_group()
1294 grp->xid->xid2_sender_id = jiffies; in ctcmpc_init_mpc_group()
1296 grp->xid_id = skb_tail_pointer(grp->xid_skb); in ctcmpc_init_mpc_group()
1297 skb_put_data(grp->xid_skb, "VTAM", 4); in ctcmpc_init_mpc_group()
1299 grp->rcvd_xid_skb = in ctcmpc_init_mpc_group()
1301 if (grp->rcvd_xid_skb == NULL) { in ctcmpc_init_mpc_group()
1302 kfree_fsm(grp->fsm); in ctcmpc_init_mpc_group()
1303 dev_kfree_skb(grp->xid_skb); in ctcmpc_init_mpc_group()
1304 kfree(grp); in ctcmpc_init_mpc_group()
1307 grp->rcvd_xid_data = grp->rcvd_xid_skb->data; in ctcmpc_init_mpc_group()
1308 grp->rcvd_xid_th = (struct th_header *)grp->rcvd_xid_skb->data; in ctcmpc_init_mpc_group()
1309 skb_put_data(grp->rcvd_xid_skb, &thnorm, TH_HEADER_LENGTH); in ctcmpc_init_mpc_group()
1310 grp->saved_xid2 = NULL; in ctcmpc_init_mpc_group()
1311 priv->xid = grp->xid; in ctcmpc_init_mpc_group()
1312 priv->mpcg = grp; in ctcmpc_init_mpc_group()
1313 return grp; in ctcmpc_init_mpc_group()
1342 struct mpc_group *grp; in mpc_action_go_inop() local
1345 CTCM_PR_DEBUG("Enter %s: %s\n", __func__, dev->name); in mpc_action_go_inop()
1347 priv = dev->ml_priv; in mpc_action_go_inop()
1348 grp = priv->mpcg; in mpc_action_go_inop()
1349 grp->flow_off_called = 0; in mpc_action_go_inop()
1350 fsm_deltimer(&grp->timer); in mpc_action_go_inop()
1351 if (grp->channels_terminating) in mpc_action_go_inop()
1354 grp->channels_terminating = 1; in mpc_action_go_inop()
1355 grp->saved_state = fsm_getstate(grp->fsm); in mpc_action_go_inop()
1356 fsm_newstate(grp->fsm, MPCG_STATE_INOP); in mpc_action_go_inop()
1357 if (grp->saved_state > MPCG_STATE_XID7INITF) in mpc_action_go_inop()
1360 CTCM_FUNTAIL, dev->name); in mpc_action_go_inop()
1361 if ((grp->saved_state != MPCG_STATE_RESET) || in mpc_action_go_inop()
1363 (grp->port_persist == 0)) in mpc_action_go_inop()
1364 fsm_deltimer(&priv->restart_timer); in mpc_action_go_inop()
1366 wch = priv->channel[CTCM_WRITE]; in mpc_action_go_inop()
1368 switch (grp->saved_state) { in mpc_action_go_inop()
1384 tasklet_hi_schedule(&wch->ch_disc_tasklet); in mpc_action_go_inop()
1387 grp->xid2_tgnum = 0; in mpc_action_go_inop()
1388 grp->group_max_buflen = 0; /*min of all received */ in mpc_action_go_inop()
1389 grp->outstanding_xid2 = 0; in mpc_action_go_inop()
1390 grp->outstanding_xid7 = 0; in mpc_action_go_inop()
1391 grp->outstanding_xid7_p2 = 0; in mpc_action_go_inop()
1392 grp->saved_xid2 = NULL; in mpc_action_go_inop()
1393 grp->xidnogood = 0; in mpc_action_go_inop()
1394 grp->changed_side = 0; in mpc_action_go_inop()
1396 grp->rcvd_xid_skb->data = grp->rcvd_xid_data; in mpc_action_go_inop()
1397 skb_reset_tail_pointer(grp->rcvd_xid_skb); in mpc_action_go_inop()
1398 grp->rcvd_xid_skb->len = 0; in mpc_action_go_inop()
1399 grp->rcvd_xid_th = (struct th_header *)grp->rcvd_xid_skb->data; in mpc_action_go_inop()
1400 skb_put_data(grp->rcvd_xid_skb, &thnorm, TH_HEADER_LENGTH); in mpc_action_go_inop()
1402 if (grp->send_qllc_disc == 1) { in mpc_action_go_inop()
1403 grp->send_qllc_disc = 0; in mpc_action_go_inop()
1412 if ((grp->port_persist == 1) || (grp->alloc_called)) { in mpc_action_go_inop()
1413 grp->alloc_called = 0; in mpc_action_go_inop()
1414 fsm_deltimer(&priv->restart_timer); in mpc_action_go_inop()
1415 fsm_addtimer(&priv->restart_timer, 500, DEV_EVENT_RESTART, dev); in mpc_action_go_inop()
1416 fsm_newstate(grp->fsm, MPCG_STATE_RESET); in mpc_action_go_inop()
1417 if (grp->saved_state > MPCG_STATE_XID7INITF) in mpc_action_go_inop()
1420 CTCM_FUNTAIL, dev->name); in mpc_action_go_inop()
1422 fsm_deltimer(&priv->restart_timer); in mpc_action_go_inop()
1423 fsm_addtimer(&priv->restart_timer, 500, DEV_EVENT_STOP, dev); in mpc_action_go_inop()
1424 fsm_newstate(grp->fsm, MPCG_STATE_RESET); in mpc_action_go_inop()
1427 CTCM_FUNTAIL, dev->name); in mpc_action_go_inop()
1444 struct mpc_group *grp; in mpc_action_timeout() local
1448 priv = dev->ml_priv; in mpc_action_timeout()
1449 grp = priv->mpcg; in mpc_action_timeout()
1450 wch = priv->channel[CTCM_WRITE]; in mpc_action_timeout()
1451 rch = priv->channel[CTCM_READ]; in mpc_action_timeout()
1453 switch (fsm_getstate(grp->fsm)) { in mpc_action_timeout()
1458 if ((fsm_getstate(rch->fsm) == CH_XID0_PENDING) && in mpc_action_timeout()
1459 (fsm_getstate(wch->fsm) == CH_XID0_PENDING)) in mpc_action_timeout()
1463 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in mpc_action_timeout()
1468 CTCM_FUNTAIL, dev->name); in mpc_action_timeout()
1479 struct channel *ch = mpcginfo->ch; in mpc_action_discontact()
1482 struct mpc_group *grp; in mpc_action_discontact() local
1485 dev = ch->netdev; in mpc_action_discontact()
1487 priv = dev->ml_priv; in mpc_action_discontact()
1491 CTCM_FUNTAIL, dev->name, ch->id); in mpc_action_discontact()
1492 grp = priv->mpcg; in mpc_action_discontact()
1493 grp->send_qllc_disc = 1; in mpc_action_discontact()
1494 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); in mpc_action_discontact()
1503 * MPC Group Station - not part of FSM
1513 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); in mpc_action_send_discontact()
1514 rc = ccw_device_start(ch->cdev, &ch->ccw[15], 0, 0xff, 0); in mpc_action_send_discontact()
1515 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); in mpc_action_send_discontact()
1532 struct channel *ch = mpcginfo->ch; in mpc_validate_xid()
1533 struct net_device *dev = ch->netdev; in mpc_validate_xid()
1534 struct ctcm_priv *priv = dev->ml_priv; in mpc_validate_xid()
1535 struct mpc_group *grp = priv->mpcg; in mpc_validate_xid() local
1536 struct xid2 *xid = mpcginfo->xid; in mpc_validate_xid()
1549 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1556 if (((CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ? XID2_WRITE_SIDE : in mpc_validate_xid()
1557 XID2_READ_SIDE) != xid->xid2_dlc_type) { in mpc_validate_xid()
1562 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1566 if (xid->xid2_dlc_type == XID2_READ_SIDE) { in mpc_validate_xid()
1568 grp->group_max_buflen, xid->xid2_buf_len); in mpc_validate_xid()
1570 if (grp->group_max_buflen == 0 || grp->group_max_buflen > in mpc_validate_xid()
1571 xid->xid2_buf_len - len) in mpc_validate_xid()
1572 grp->group_max_buflen = xid->xid2_buf_len - len; in mpc_validate_xid()
1575 if (grp->saved_xid2 == NULL) { in mpc_validate_xid()
1576 grp->saved_xid2 = in mpc_validate_xid()
1577 (struct xid2 *)skb_tail_pointer(grp->rcvd_xid_skb); in mpc_validate_xid()
1579 skb_put_data(grp->rcvd_xid_skb, xid, XID2_LENGTH); in mpc_validate_xid()
1580 grp->rcvd_xid_skb->data = grp->rcvd_xid_data; in mpc_validate_xid()
1582 skb_reset_tail_pointer(grp->rcvd_xid_skb); in mpc_validate_xid()
1583 grp->rcvd_xid_skb->len = 0; in mpc_validate_xid()
1586 our_id = (__u64)priv->xid->xid2_adj_id; in mpc_validate_xid()
1588 our_id = our_id + priv->xid->xid2_sender_id; in mpc_validate_xid()
1589 their_id = (__u64)xid->xid2_adj_id; in mpc_validate_xid()
1591 their_id = their_id + xid->xid2_sender_id; in mpc_validate_xid()
1594 grp->roll = XSIDE; in mpc_validate_xid()
1596 "%s(%s): WE HAVE LOW ID - TAKE XSIDE", in mpc_validate_xid()
1597 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1599 grp->roll = YSIDE; in mpc_validate_xid()
1601 "%s(%s): WE HAVE HIGH ID - TAKE YSIDE", in mpc_validate_xid()
1602 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1606 if (xid->xid2_flag4 != grp->saved_xid2->xid2_flag4) { in mpc_validate_xid()
1611 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1613 if (xid->xid2_flag2 == 0x40) { in mpc_validate_xid()
1615 /* XID REJECTED - xid NOGOOD */ in mpc_validate_xid()
1618 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1620 if (xid->xid2_adj_id != grp->saved_xid2->xid2_adj_id) { in mpc_validate_xid()
1622 /* XID REJECTED - Adjacent Station ID Mismatch */ in mpc_validate_xid()
1625 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1627 if (xid->xid2_sender_id != grp->saved_xid2->xid2_sender_id) { in mpc_validate_xid()
1629 /* XID REJECTED - Sender Address Mismatch */ in mpc_validate_xid()
1632 CTCM_FUNTAIL, ch->id); in mpc_validate_xid()
1637 dev_warn(&dev->dev, in mpc_validate_xid()
1640 priv->xid->xid2_flag2 = 0x40; in mpc_validate_xid()
1641 grp->saved_xid2->xid2_flag2 = 0x40; in mpc_validate_xid()
1660 __func__, smp_processor_id(), ch, ch->id); in mpc_action_side_xid()
1666 * skb data-buffer referencing: in mpc_action_side_xid()
1668 ch->trans_skb->data = ch->trans_skb_data; in mpc_action_side_xid()
1669 skb_reset_tail_pointer(ch->trans_skb); in mpc_action_side_xid()
1670 ch->trans_skb->len = 0; in mpc_action_side_xid()
1675 memset(ch->trans_skb->data, 0, 16); in mpc_action_side_xid()
1676 ch->rcvd_xid_th = (struct th_header *)ch->trans_skb_data; in mpc_action_side_xid()
1678 skb_put(ch->trans_skb, TH_HEADER_LENGTH); in mpc_action_side_xid()
1679 ch->rcvd_xid = (struct xid2 *)skb_tail_pointer(ch->trans_skb); in mpc_action_side_xid()
1681 skb_put(ch->trans_skb, XID2_LENGTH); in mpc_action_side_xid()
1682 ch->rcvd_xid_id = skb_tail_pointer(ch->trans_skb); in mpc_action_side_xid()
1684 ch->trans_skb->data = ch->trans_skb_data; in mpc_action_side_xid()
1685 skb_reset_tail_pointer(ch->trans_skb); in mpc_action_side_xid()
1686 ch->trans_skb->len = 0; in mpc_action_side_xid()
1688 /* non-checking rewrite of above skb data-buffer referencing: */ in mpc_action_side_xid()
1690 memset(ch->trans_skb->data, 0, 16); in mpc_action_side_xid()
1691 ch->rcvd_xid_th = (struct th_header *)ch->trans_skb_data; in mpc_action_side_xid()
1692 ch->rcvd_xid = (struct xid2 *)(ch->trans_skb_data + TH_HEADER_LENGTH); in mpc_action_side_xid()
1693 ch->rcvd_xid_id = ch->trans_skb_data + TH_HEADER_LENGTH + XID2_LENGTH; in mpc_action_side_xid()
1696 ch->ccw[8].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1697 ch->ccw[8].count = 0; in mpc_action_side_xid()
1698 ch->ccw[8].cda = 0x00; in mpc_action_side_xid()
1700 if (!(ch->xid_th && ch->xid && ch->xid_id)) in mpc_action_side_xid()
1703 CTCM_FUNTAIL, ch->id, ch->xid_th, ch->xid, ch->xid_id); in mpc_action_side_xid()
1707 if (ch->xid_th == NULL) in mpc_action_side_xid()
1709 ch->ccw[9].cmd_code = CCW_CMD_WRITE; in mpc_action_side_xid()
1710 ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1711 ch->ccw[9].count = TH_HEADER_LENGTH; in mpc_action_side_xid()
1712 ch->ccw[9].cda = virt_to_dma32(ch->xid_th); in mpc_action_side_xid()
1714 if (ch->xid == NULL) in mpc_action_side_xid()
1716 ch->ccw[10].cmd_code = CCW_CMD_WRITE; in mpc_action_side_xid()
1717 ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1718 ch->ccw[10].count = XID2_LENGTH; in mpc_action_side_xid()
1719 ch->ccw[10].cda = virt_to_dma32(ch->xid); in mpc_action_side_xid()
1721 ch->ccw[11].cmd_code = CCW_CMD_READ; in mpc_action_side_xid()
1722 ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1723 ch->ccw[11].count = TH_HEADER_LENGTH; in mpc_action_side_xid()
1724 ch->ccw[11].cda = virt_to_dma32(ch->rcvd_xid_th); in mpc_action_side_xid()
1726 ch->ccw[12].cmd_code = CCW_CMD_READ; in mpc_action_side_xid()
1727 ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1728 ch->ccw[12].count = XID2_LENGTH; in mpc_action_side_xid()
1729 ch->ccw[12].cda = virt_to_dma32(ch->rcvd_xid); in mpc_action_side_xid()
1731 ch->ccw[13].cmd_code = CCW_CMD_READ; in mpc_action_side_xid()
1732 ch->ccw[13].cda = virt_to_dma32(ch->rcvd_xid_id); in mpc_action_side_xid()
1735 ch->ccw[9].cmd_code = CCW_CMD_READ; in mpc_action_side_xid()
1736 ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1737 ch->ccw[9].count = TH_HEADER_LENGTH; in mpc_action_side_xid()
1738 ch->ccw[9].cda = virt_to_dma32(ch->rcvd_xid_th); in mpc_action_side_xid()
1740 ch->ccw[10].cmd_code = CCW_CMD_READ; in mpc_action_side_xid()
1741 ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1742 ch->ccw[10].count = XID2_LENGTH; in mpc_action_side_xid()
1743 ch->ccw[10].cda = virt_to_dma32(ch->rcvd_xid); in mpc_action_side_xid()
1745 if (ch->xid_th == NULL) in mpc_action_side_xid()
1747 ch->ccw[11].cmd_code = CCW_CMD_WRITE; in mpc_action_side_xid()
1748 ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1749 ch->ccw[11].count = TH_HEADER_LENGTH; in mpc_action_side_xid()
1750 ch->ccw[11].cda = virt_to_dma32(ch->xid_th); in mpc_action_side_xid()
1752 if (ch->xid == NULL) in mpc_action_side_xid()
1754 ch->ccw[12].cmd_code = CCW_CMD_WRITE; in mpc_action_side_xid()
1755 ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1756 ch->ccw[12].count = XID2_LENGTH; in mpc_action_side_xid()
1757 ch->ccw[12].cda = virt_to_dma32(ch->xid); in mpc_action_side_xid()
1759 if (ch->xid_id == NULL) in mpc_action_side_xid()
1761 ch->ccw[13].cmd_code = CCW_CMD_WRITE; in mpc_action_side_xid()
1762 ch->ccw[13].cda = virt_to_dma32(ch->xid_id); in mpc_action_side_xid()
1765 ch->ccw[13].flags = CCW_FLAG_SLI | CCW_FLAG_CC; in mpc_action_side_xid()
1766 ch->ccw[13].count = 4; in mpc_action_side_xid()
1768 ch->ccw[14].cmd_code = CCW_CMD_NOOP; in mpc_action_side_xid()
1769 ch->ccw[14].flags = CCW_FLAG_SLI; in mpc_action_side_xid()
1770 ch->ccw[14].count = 0; in mpc_action_side_xid()
1771 ch->ccw[14].cda = 0; in mpc_action_side_xid()
1773 CTCM_CCW_DUMP((char *)&ch->ccw[8], sizeof(struct ccw1) * 7); in mpc_action_side_xid()
1774 CTCM_D3_DUMP((char *)ch->xid_th, TH_HEADER_LENGTH); in mpc_action_side_xid()
1775 CTCM_D3_DUMP((char *)ch->xid, XID2_LENGTH); in mpc_action_side_xid()
1776 CTCM_D3_DUMP((char *)ch->xid_id, 4); in mpc_action_side_xid()
1782 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); in mpc_action_side_xid()
1786 fsm_addtimer(&ch->timer, 5000 , CTC_EVENT_TIMER, ch); in mpc_action_side_xid()
1787 rc = ccw_device_start(ch->cdev, &ch->ccw[8], 0, 0xff, 0); in mpc_action_side_xid()
1790 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); in mpc_action_side_xid()
1794 (side == XSIDE) ? "x-side XID" : "y-side XID"); in mpc_action_side_xid()
1799 __func__, ch, ch->id); in mpc_action_side_xid()
1829 struct net_device *dev = ch->netdev; in mpc_action_doxid0()
1830 struct ctcm_priv *priv = dev->ml_priv; in mpc_action_doxid0()
1831 struct mpc_group *grp = priv->mpcg; in mpc_action_doxid0() local
1834 __func__, smp_processor_id(), ch, ch->id); in mpc_action_doxid0()
1836 if (ch->xid == NULL) { in mpc_action_doxid0()
1838 "%s(%s): ch->xid == NULL", in mpc_action_doxid0()
1839 CTCM_FUNTAIL, dev->name); in mpc_action_doxid0()
1843 fsm_newstate(ch->fsm, CH_XID0_INPROGRESS); in mpc_action_doxid0()
1845 ch->xid->xid2_option = XID2_0; in mpc_action_doxid0()
1847 switch (fsm_getstate(grp->fsm)) { in mpc_action_doxid0()
1850 ch->ccw[8].cmd_code = CCW_CMD_SENSE_CMD; in mpc_action_doxid0()
1854 ch->ccw[8].cmd_code = CCW_CMD_WRITE_CTL; in mpc_action_doxid0()
1858 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch); in mpc_action_doxid0()
1870 struct ctcm_priv *priv = dev->ml_priv; in mpc_action_doxid7()
1871 struct mpc_group *grp = NULL; in mpc_action_doxid7() local
1876 grp = priv->mpcg; in mpc_action_doxid7()
1877 if (grp == NULL) in mpc_action_doxid7()
1881 struct channel *ch = priv->channel[direction]; in mpc_action_doxid7()
1882 struct xid2 *thisxid = ch->xid; in mpc_action_doxid7()
1883 ch->xid_skb->data = ch->xid_skb_data; in mpc_action_doxid7()
1884 skb_reset_tail_pointer(ch->xid_skb); in mpc_action_doxid7()
1885 ch->xid_skb->len = 0; in mpc_action_doxid7()
1886 thisxid->xid2_option = XID2_7; in mpc_action_doxid7()
1890 if (grp->outstanding_xid7_p2 > 0) { in mpc_action_doxid7()
1891 if (grp->roll == YSIDE) { in mpc_action_doxid7()
1892 if (fsm_getstate(ch->fsm) == CH_XID7_PENDING1) { in mpc_action_doxid7()
1893 fsm_newstate(ch->fsm, CH_XID7_PENDING2); in mpc_action_doxid7()
1894 ch->ccw[8].cmd_code = CCW_CMD_SENSE_CMD; in mpc_action_doxid7()
1895 skb_put_data(ch->xid_skb, &thdummy, in mpc_action_doxid7()
1899 } else if (fsm_getstate(ch->fsm) < CH_XID7_PENDING2) { in mpc_action_doxid7()
1900 fsm_newstate(ch->fsm, CH_XID7_PENDING2); in mpc_action_doxid7()
1901 ch->ccw[8].cmd_code = CCW_CMD_WRITE_CTL; in mpc_action_doxid7()
1902 skb_put_data(ch->xid_skb, &thnorm, in mpc_action_doxid7()
1908 if (grp->roll == YSIDE) { in mpc_action_doxid7()
1909 if (fsm_getstate(ch->fsm) < CH_XID7_PENDING4) { in mpc_action_doxid7()
1910 fsm_newstate(ch->fsm, CH_XID7_PENDING4); in mpc_action_doxid7()
1911 skb_put_data(ch->xid_skb, &thnorm, in mpc_action_doxid7()
1913 ch->ccw[8].cmd_code = CCW_CMD_WRITE_CTL; in mpc_action_doxid7()
1916 } else if (fsm_getstate(ch->fsm) == CH_XID7_PENDING3) { in mpc_action_doxid7()
1917 fsm_newstate(ch->fsm, CH_XID7_PENDING4); in mpc_action_doxid7()
1918 ch->ccw[8].cmd_code = CCW_CMD_SENSE_CMD; in mpc_action_doxid7()
1919 skb_put_data(ch->xid_skb, &thdummy, in mpc_action_doxid7()
1926 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch); in mpc_action_doxid7()
1940 struct channel *ch = mpcginfo->ch; in mpc_action_rcvd_xid0()
1941 struct net_device *dev = ch->netdev; in mpc_action_rcvd_xid0()
1942 struct ctcm_priv *priv = dev->ml_priv; in mpc_action_rcvd_xid0()
1943 struct mpc_group *grp = priv->mpcg; in mpc_action_rcvd_xid0() local
1945 CTCM_PR_DEBUG("%s: ch-id:%s xid2:%i xid7:%i xidt_p2:%i \n", in mpc_action_rcvd_xid0()
1946 __func__, ch->id, grp->outstanding_xid2, in mpc_action_rcvd_xid0()
1947 grp->outstanding_xid7, grp->outstanding_xid7_p2); in mpc_action_rcvd_xid0()
1949 if (fsm_getstate(ch->fsm) < CH_XID7_PENDING) in mpc_action_rcvd_xid0()
1950 fsm_newstate(ch->fsm, CH_XID7_PENDING); in mpc_action_rcvd_xid0()
1952 grp->outstanding_xid2--; in mpc_action_rcvd_xid0()
1953 grp->outstanding_xid7++; in mpc_action_rcvd_xid0()
1954 grp->outstanding_xid7_p2++; in mpc_action_rcvd_xid0()
1958 switch (fsm_getstate(grp->fsm)) { in mpc_action_rcvd_xid0()
1960 fsm_newstate(grp->fsm, MPCG_STATE_XID2INITX); in mpc_action_rcvd_xid0()
1964 fsm_newstate(grp->fsm, MPCG_STATE_XID0IOWAIX); in mpc_action_rcvd_xid0()
1968 if (grp->outstanding_xid2 == 0) { in mpc_action_rcvd_xid0()
1969 fsm_newstate(grp->fsm, MPCG_STATE_XID7INITW); in mpc_action_rcvd_xid0()
1971 fsm_event(grp->fsm, MPCG_EVENT_XID2DONE, dev); in mpc_action_rcvd_xid0()
1975 if (grp->outstanding_xid2 == 0) { in mpc_action_rcvd_xid0()
1976 fsm_newstate(grp->fsm, MPCG_STATE_XID7INITI); in mpc_action_rcvd_xid0()
1978 fsm_event(grp->fsm, MPCG_EVENT_XID2DONE, dev); in mpc_action_rcvd_xid0()
1984 __func__, ch->id, grp->outstanding_xid2, in mpc_action_rcvd_xid0()
1985 grp->outstanding_xid7, grp->outstanding_xid7_p2); in mpc_action_rcvd_xid0()
1987 __func__, ch->id, in mpc_action_rcvd_xid0()
1988 fsm_getstate_str(grp->fsm), fsm_getstate_str(ch->fsm)); in mpc_action_rcvd_xid0()
2001 struct channel *ch = mpcginfo->ch; in mpc_action_rcvd_xid7()
2002 struct net_device *dev = ch->netdev; in mpc_action_rcvd_xid7()
2003 struct ctcm_priv *priv = dev->ml_priv; in mpc_action_rcvd_xid7()
2004 struct mpc_group *grp = priv->mpcg; in mpc_action_rcvd_xid7() local
2007 __func__, smp_processor_id(), ch, ch->id); in mpc_action_rcvd_xid7()
2009 __func__, grp->outstanding_xid7, grp->outstanding_xid7_p2); in mpc_action_rcvd_xid7()
2011 grp->outstanding_xid7--; in mpc_action_rcvd_xid7()
2012 ch->xid_skb->data = ch->xid_skb_data; in mpc_action_rcvd_xid7()
2013 skb_reset_tail_pointer(ch->xid_skb); in mpc_action_rcvd_xid7()
2014 ch->xid_skb->len = 0; in mpc_action_rcvd_xid7()
2016 switch (fsm_getstate(grp->fsm)) { in mpc_action_rcvd_xid7()
2018 fsm_newstate(grp->fsm, MPCG_STATE_XID7INITZ); in mpc_action_rcvd_xid7()
2022 fsm_newstate(grp->fsm, MPCG_STATE_XID7INITX); in mpc_action_rcvd_xid7()
2027 if (grp->outstanding_xid7 == 0) { in mpc_action_rcvd_xid7()
2028 if (grp->outstanding_xid7_p2 > 0) { in mpc_action_rcvd_xid7()
2029 grp->outstanding_xid7 = in mpc_action_rcvd_xid7()
2030 grp->outstanding_xid7_p2; in mpc_action_rcvd_xid7()
2031 grp->outstanding_xid7_p2 = 0; in mpc_action_rcvd_xid7()
2033 fsm_newstate(grp->fsm, MPCG_STATE_XID7INITF); in mpc_action_rcvd_xid7()
2036 fsm_event(grp->fsm, MPCG_EVENT_XID7DONE, dev); in mpc_action_rcvd_xid7()
2053 struct ctcm_priv *priv = dev->ml_priv; in mpc_send_qllc_discontact()
2054 struct mpc_group *grp = priv->mpcg; in mpc_send_qllc_discontact() local
2057 __func__, mpcg_state_names[grp->saved_state]); in mpc_send_qllc_discontact()
2059 switch (grp->saved_state) { in mpc_send_qllc_discontact()
2072 if (grp->estconnfunc) { in mpc_send_qllc_discontact()
2073 grp->estconnfunc(grp->port_num, -1, 0); in mpc_send_qllc_discontact()
2074 grp->estconnfunc = NULL; in mpc_send_qllc_discontact()
2080 grp->send_qllc_disc = 2; in mpc_send_qllc_discontact()
2086 CTCM_FUNTAIL, dev->name); in mpc_send_qllc_discontact()
2087 priv->stats.rx_dropped++; in mpc_send_qllc_discontact()
2088 return -ENOMEM; in mpc_send_qllc_discontact()
2092 qllcptr->qllc_address = 0xcc; in mpc_send_qllc_discontact()
2093 qllcptr->qllc_commands = 0x03; in mpc_send_qllc_discontact()
2098 CTCM_FUNTAIL, dev->name); in mpc_send_qllc_discontact()
2100 return -ENOMEM; in mpc_send_qllc_discontact()
2104 priv->channel[CTCM_READ]->pdu_seq; in mpc_send_qllc_discontact()
2105 priv->channel[CTCM_READ]->pdu_seq++; in mpc_send_qllc_discontact()
2107 __func__, priv->channel[CTCM_READ]->pdu_seq); in mpc_send_qllc_discontact()
2111 priv->channel[CTCM_READ]->pdu_seq = 0x00; in mpc_send_qllc_discontact()
2113 skb->dev = dev; in mpc_send_qllc_discontact()
2114 skb->protocol = htons(ETH_P_SNAP); in mpc_send_qllc_discontact()
2115 skb->ip_summed = CHECKSUM_UNNECESSARY; in mpc_send_qllc_discontact()
2117 CTCM_D3_DUMP(skb->data, (sizeof(struct qllc) + 4)); in mpc_send_qllc_discontact()
2128 /* --- This is the END my friend --- */