Lines Matching refs:ldcp

71 void i_ldc_reset(ldc_chan_t *ldcp, boolean_t force_reset);
73 static int i_ldc_txq_reconf(ldc_chan_t *ldcp);
74 static int i_ldc_rxq_reconf(ldc_chan_t *ldcp, boolean_t force_reset);
75 static void i_ldc_rxq_drain(ldc_chan_t *ldcp);
76 static void i_ldc_reset_state(ldc_chan_t *ldcp);
79 static int i_ldc_get_tx_tail(ldc_chan_t *ldcp, uint64_t *tail);
80 static void i_ldc_get_tx_head(ldc_chan_t *ldcp, uint64_t *head);
81 static int i_ldc_set_tx_tail(ldc_chan_t *ldcp, uint64_t tail);
82 static int i_ldc_set_rx_head(ldc_chan_t *ldcp, uint64_t head);
83 static int i_ldc_send_pkt(ldc_chan_t *ldcp, uint8_t pkttype, uint8_t subtype,
86 static int i_ldc_set_rxdq_head(ldc_chan_t *ldcp, uint64_t head);
87 static void i_ldc_rxdq_copy(ldc_chan_t *ldcp, uint64_t *head);
88 static uint64_t i_ldc_dq_rx_get_state(ldc_chan_t *ldcp, uint64_t *head,
90 static uint64_t i_ldc_hvq_rx_get_state(ldc_chan_t *ldcp, uint64_t *head,
92 static int i_ldc_rx_ackpeek(ldc_chan_t *ldcp, uint64_t rx_head,
94 static uint_t i_ldc_chkq(ldc_chan_t *ldcp);
99 static uint_t i_ldc_rx_process_hvq(ldc_chan_t *ldcp, boolean_t *notify_client,
101 static void i_ldc_clear_intr(ldc_chan_t *ldcp, cnex_intrtype_t itype);
104 static int i_ldc_read_raw(ldc_chan_t *ldcp, caddr_t target_bufp, size_t *sizep);
105 static int i_ldc_read_packet(ldc_chan_t *ldcp, caddr_t target_bufp,
107 static int i_ldc_read_stream(ldc_chan_t *ldcp, caddr_t target_bufp,
111 static int i_ldc_write_raw(ldc_chan_t *ldcp, caddr_t target_bufp,
113 static int i_ldc_write_packet(ldc_chan_t *ldcp, caddr_t target_bufp,
115 static int i_ldc_write_stream(ldc_chan_t *ldcp, caddr_t target_bufp,
119 static int i_ldc_check_seqid(ldc_chan_t *ldcp, ldc_msg_t *ldcmsg);
120 static int i_ldc_ctrlmsg(ldc_chan_t *ldcp, ldc_msg_t *ldcmsg);
121 static int i_ldc_process_VER(ldc_chan_t *ldcp, ldc_msg_t *msg);
122 static int i_ldc_process_RTS(ldc_chan_t *ldcp, ldc_msg_t *msg);
123 static int i_ldc_process_RTR(ldc_chan_t *ldcp, ldc_msg_t *msg);
124 static int i_ldc_process_RDX(ldc_chan_t *ldcp, ldc_msg_t *msg);
125 static int i_ldc_process_data_ACK(ldc_chan_t *ldcp, ldc_msg_t *msg);
277 ldc_inject_error(ldc_chan_t *ldcp, uint64_t error) in ldc_inject_error() argument
279 if ((ldcdbgchan != DBG_ALL_LDCS) && (ldcdbgchan != ldcp->id)) in ldc_inject_error()
334 extern void i_ldc_mem_inject_dring_clear(ldc_chan_t *ldcp);
359 #define TRACE_RXDQ_LENGTH(ldcp) \ argument
361 uint64_t, ldcp->id, \
362 uint64_t, ldcp->rx_dq_head, \
363 uint64_t, ldcp->rx_dq_tail, \
364 uint64_t, ldcp->rx_dq_entries)
366 #define TRACE_RXHVQ_LENGTH(ldcp, head, tail) \ argument
368 uint64_t, ldcp->id, \
371 uint64_t, ldcp->rx_q_entries)
374 #define TRACE_RXDQ_COPY(ldcp, bytes) \ argument
375 DTRACE_PROBE2(rxdq__copy, uint64_t, ldcp->id, uint64_t, bytes) \
465 ldc_chan_t *tmp_ldcp, *ldcp; in _fini() local
502 ldcp = ldcssp->chan_list; in _fini()
503 while (ldcp != NULL) { in _fini()
504 tmp_ldcp = ldcp->next; in _fini()
506 (void) ldc_close((ldc_handle_t)ldcp); in _fini()
507 (void) ldc_fini((ldc_handle_t)ldcp); in _fini()
509 ldcp = tmp_ldcp; in _fini()
583 i_ldc_txq_reconf(ldc_chan_t *ldcp) in i_ldc_txq_reconf() argument
587 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_txq_reconf()
588 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_txq_reconf()
590 rv = hv_ldc_tx_qconf(ldcp->id, ldcp->tx_q_ra, ldcp->tx_q_entries); in i_ldc_txq_reconf()
593 "i_ldc_txq_reconf: (0x%lx) cannot set qconf", ldcp->id); in i_ldc_txq_reconf()
596 rv = hv_ldc_tx_get_state(ldcp->id, &(ldcp->tx_head), in i_ldc_txq_reconf()
597 &(ldcp->tx_tail), &(ldcp->link_state)); in i_ldc_txq_reconf()
600 "i_ldc_txq_reconf: (0x%lx) cannot get qptrs", ldcp->id); in i_ldc_txq_reconf()
603 D1(ldcp->id, "i_ldc_txq_reconf: (0x%llx) h=0x%llx,t=0x%llx," in i_ldc_txq_reconf()
604 "s=0x%llx\n", ldcp->id, ldcp->tx_head, ldcp->tx_tail, in i_ldc_txq_reconf()
605 ldcp->link_state); in i_ldc_txq_reconf()
614 i_ldc_rxq_reconf(ldc_chan_t *ldcp, boolean_t force_reset) in i_ldc_rxq_reconf() argument
619 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_rxq_reconf()
620 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in i_ldc_rxq_reconf()
621 &(ldcp->link_state)); in i_ldc_rxq_reconf()
625 ldcp->id); in i_ldc_rxq_reconf()
629 if (force_reset || (ldcp->tstate & ~TS_IN_RESET) == TS_UP) { in i_ldc_rxq_reconf()
630 rv = hv_ldc_rx_qconf(ldcp->id, ldcp->rx_q_ra, in i_ldc_rxq_reconf()
631 ldcp->rx_q_entries); in i_ldc_rxq_reconf()
635 ldcp->id); in i_ldc_rxq_reconf()
638 D1(ldcp->id, "i_ldc_rxq_reconf: (0x%llx) completed q reconf", in i_ldc_rxq_reconf()
639 ldcp->id); in i_ldc_rxq_reconf()
650 i_ldc_rxq_drain(ldc_chan_t *ldcp) in i_ldc_rxq_drain() argument
656 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_rxq_drain()
657 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in i_ldc_rxq_drain()
658 &(ldcp->link_state)); in i_ldc_rxq_drain()
661 "rv = 0x%x", ldcp->id, rv); in i_ldc_rxq_drain()
675 if ((rv = hv_ldc_rx_set_qhead(ldcp->id, rx_tail)) == 0) in i_ldc_rxq_drain()
680 if ((rv = hv_ldc_rx_set_qhead(ldcp->id, rx_tail)) == 0) in i_ldc_rxq_drain()
685 "rv = 0x%x", ldcp->id, rx_tail, rv); in i_ldc_rxq_drain()
693 i_ldc_reset_state(ldc_chan_t *ldcp) in i_ldc_reset_state() argument
695 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_reset_state()
696 ldcp->last_msg_snt = LDC_INIT_SEQID; in i_ldc_reset_state()
697 ldcp->last_ack_rcd = 0; in i_ldc_reset_state()
698 ldcp->last_msg_rcd = 0; in i_ldc_reset_state()
699 ldcp->tx_ackd_head = ldcp->tx_head; in i_ldc_reset_state()
700 ldcp->stream_remains = 0; in i_ldc_reset_state()
701 ldcp->next_vidx = 0; in i_ldc_reset_state()
702 ldcp->hstate = 0; in i_ldc_reset_state()
703 ldcp->tstate = TS_OPEN; in i_ldc_reset_state()
704 ldcp->status = LDC_OPEN; in i_ldc_reset_state()
705 ldcp->rx_ack_head = ACKPEEK_HEAD_INVALID; in i_ldc_reset_state()
706 ldcp->rx_dq_head = 0; in i_ldc_reset_state()
707 ldcp->rx_dq_tail = 0; in i_ldc_reset_state()
709 if (ldcp->link_state == LDC_CHANNEL_UP || in i_ldc_reset_state()
710 ldcp->link_state == LDC_CHANNEL_RESET) { in i_ldc_reset_state()
712 if (ldcp->mode == LDC_MODE_RAW) { in i_ldc_reset_state()
713 ldcp->status = LDC_UP; in i_ldc_reset_state()
714 ldcp->tstate = TS_UP; in i_ldc_reset_state()
716 ldcp->status = LDC_READY; in i_ldc_reset_state()
717 ldcp->tstate |= TS_LINK_READY; in i_ldc_reset_state()
726 i_ldc_reset(ldc_chan_t *ldcp, boolean_t force_reset) in i_ldc_reset() argument
728 DWARN(ldcp->id, "i_ldc_reset: (0x%llx) channel reset\n", ldcp->id); in i_ldc_reset()
730 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_reset()
731 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_reset()
734 (void) i_ldc_txq_reconf(ldcp); in i_ldc_reset()
735 (void) i_ldc_rxq_reconf(ldcp, force_reset); in i_ldc_reset()
738 (void) i_ldc_clear_intr(ldcp, CNEX_TX_INTR); in i_ldc_reset()
739 (void) i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in i_ldc_reset()
742 i_ldc_reset_state(ldcp); in i_ldc_reset()
745 ldcp->tstate |= TS_IN_RESET; in i_ldc_reset()
757 ldc_chan_t *ldcp; in i_ldc_debug_enter() local
759 ldcp = ldcssp->chan_list; in i_ldc_debug_enter()
760 while (ldcp != NULL) { in i_ldc_debug_enter()
761 if (((ldcp->tstate & TS_QCONF_RDY) == TS_QCONF_RDY) && in i_ldc_debug_enter()
762 (LDC_DEVCLASS_PROM_RESET(ldcp->devclass) != 0)) { in i_ldc_debug_enter()
763 (void) hv_ldc_rx_qconf(ldcp->id, ldcp->rx_q_ra, in i_ldc_debug_enter()
764 ldcp->rx_q_entries); in i_ldc_debug_enter()
766 ldcp = ldcp->next; in i_ldc_debug_enter()
774 i_ldc_clear_intr(ldc_chan_t *ldcp, cnex_intrtype_t itype) in i_ldc_clear_intr() argument
778 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_clear_intr()
784 if (ldcp->tx_intr_state) in i_ldc_clear_intr()
785 ldcp->tx_intr_state = LDC_INTR_NONE; in i_ldc_clear_intr()
792 if (ldcp->rx_intr_state) in i_ldc_clear_intr()
793 ldcp->rx_intr_state = LDC_INTR_NONE; in i_ldc_clear_intr()
799 (void) cinfo->clr_intr(cinfo->dip, ldcp->id, itype); in i_ldc_clear_intr()
800 D2(ldcp->id, in i_ldc_clear_intr()
802 ldcp->id, itype); in i_ldc_clear_intr()
810 i_ldc_set_rx_head(ldc_chan_t *ldcp, uint64_t head) in i_ldc_set_rx_head() argument
815 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_set_rx_head()
818 if ((rv = hv_ldc_rx_set_qhead(ldcp->id, head)) == 0) in i_ldc_set_rx_head()
829 "rv = 0x%x", ldcp->id, head, rv); in i_ldc_set_rx_head()
830 mutex_enter(&ldcp->tx_lock); in i_ldc_set_rx_head()
831 i_ldc_reset(ldcp, B_TRUE); in i_ldc_set_rx_head()
832 mutex_exit(&ldcp->tx_lock); in i_ldc_set_rx_head()
841 i_ldc_get_tx_head(ldc_chan_t *ldcp, uint64_t *head) in i_ldc_get_tx_head() argument
845 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_get_tx_head()
848 *head = ldcp->tx_head; in i_ldc_get_tx_head()
856 if (ldcp->mode == LDC_MODE_RELIABLE) { in i_ldc_get_tx_head()
857 while (ldcp->tx_ackd_head != ldcp->tx_head) { in i_ldc_get_tx_head()
858 pkt = (ldc_msg_t *)(ldcp->tx_q_va + ldcp->tx_ackd_head); in i_ldc_get_tx_head()
863 ldcp->tx_ackd_head = in i_ldc_get_tx_head()
864 (ldcp->tx_ackd_head + LDC_PACKET_SIZE) % in i_ldc_get_tx_head()
865 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_get_tx_head()
867 *head = ldcp->tx_ackd_head; in i_ldc_get_tx_head()
877 i_ldc_get_tx_tail(ldc_chan_t *ldcp, uint64_t *tail) in i_ldc_get_tx_tail() argument
882 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_get_tx_tail()
884 rv = hv_ldc_tx_get_state(ldcp->id, in i_ldc_get_tx_tail()
885 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in i_ldc_get_tx_tail()
889 ldcp->id); in i_ldc_get_tx_tail()
892 if (ldcp->link_state == LDC_CHANNEL_DOWN) { in i_ldc_get_tx_tail()
893 D1(ldcp->id, "i_ldc_get_tx_tail: (0x%llx) channel not ready\n", in i_ldc_get_tx_tail()
894 ldcp->id); in i_ldc_get_tx_tail()
898 i_ldc_get_tx_head(ldcp, &current_head); in i_ldc_get_tx_tail()
901 new_tail = (ldcp->tx_tail + LDC_PACKET_SIZE) % in i_ldc_get_tx_tail()
902 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_get_tx_tail()
905 DWARN(ldcp->id, in i_ldc_get_tx_tail()
907 ldcp->id); in i_ldc_get_tx_tail()
911 D2(ldcp->id, "i_ldc_get_tx_tail: (0x%llx) head=0x%llx, tail=0x%llx\n", in i_ldc_get_tx_tail()
912 ldcp->id, ldcp->tx_head, ldcp->tx_tail); in i_ldc_get_tx_tail()
914 *tail = ldcp->tx_tail; in i_ldc_get_tx_tail()
924 i_ldc_set_tx_tail(ldc_chan_t *ldcp, uint64_t tail) in i_ldc_set_tx_tail() argument
929 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_set_tx_tail()
932 if ((rv = hv_ldc_tx_set_qtail(ldcp->id, tail)) == 0) { in i_ldc_set_tx_tail()
937 DWARN(ldcp->id, "i_ldc_set_tx_tail: (0x%llx) set " in i_ldc_set_tx_tail()
938 "qtail=0x%llx failed, rv=%d\n", ldcp->id, tail, rv); in i_ldc_set_tx_tail()
959 i_ldc_rxdq_copy(ldc_chan_t *ldcp, uint64_t *head) in i_ldc_rxdq_copy() argument
963 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_rxdq_copy()
965 q_size = ldcp->rx_q_entries << LDC_PACKET_SHIFT; in i_ldc_rxdq_copy()
966 dq_size = ldcp->rx_dq_entries << LDC_PACKET_SHIFT; in i_ldc_rxdq_copy()
968 ASSERT(Q_CONTIG_SPACE(ldcp->rx_dq_head, ldcp->rx_dq_tail, in i_ldc_rxdq_copy()
971 bcopy((void *)(ldcp->rx_q_va + *head), in i_ldc_rxdq_copy()
972 (void *)(ldcp->rx_dq_va + ldcp->rx_dq_tail), LDC_PACKET_SIZE); in i_ldc_rxdq_copy()
973 TRACE_RXDQ_COPY(ldcp, LDC_PACKET_SIZE); in i_ldc_rxdq_copy()
979 ldcp->rx_dq_tail = (ldcp->rx_dq_tail + LDC_PACKET_SIZE) % dq_size; in i_ldc_rxdq_copy()
986 i_ldc_set_rxdq_head(ldc_chan_t *ldcp, uint64_t head) in i_ldc_set_rxdq_head() argument
988 ldcp->rx_dq_head = head; in i_ldc_set_rxdq_head()
996 i_ldc_dq_rx_get_state(ldc_chan_t *ldcp, uint64_t *head, uint64_t *tail, in i_ldc_dq_rx_get_state() argument
1000 *head = ldcp->rx_dq_head; in i_ldc_dq_rx_get_state()
1001 *tail = ldcp->rx_dq_tail; in i_ldc_dq_rx_get_state()
1010 i_ldc_hvq_rx_get_state(ldc_chan_t *ldcp, uint64_t *head, uint64_t *tail, in i_ldc_hvq_rx_get_state() argument
1013 return (i_ldc_h2v_error(hv_ldc_rx_get_state(ldcp->id, head, tail, in i_ldc_hvq_rx_get_state()
1027 ldc_chan_t *ldcp; in i_ldc_rx_hdlr()
1038 ldcp = (ldc_chan_t *)arg1; in i_ldc_rx_hdlr()
1040 D1(ldcp->id, "i_ldc_rx_hdlr: (0x%llx) Received intr, ldcp=0x%p\n", in i_ldc_rx_hdlr()
1041 ldcp->id, ldcp); in i_ldc_rx_hdlr()
1042 D1(ldcp->id, "i_ldc_rx_hdlr: (%llx) USR%lx/TS%lx/HS%lx, LSTATE=%lx\n", in i_ldc_rx_hdlr()
1043 ldcp->id, ldcp->status, ldcp->tstate, ldcp->hstate, in i_ldc_rx_hdlr()
1044 ldcp->link_state); in i_ldc_rx_hdlr()
1047 mutex_enter(&ldcp->lock); in i_ldc_rx_hdlr()
1050 ldcp->rx_intr_state = LDC_INTR_ACTIVE; in i_ldc_rx_hdlr()
1052 status = i_ldc_rx_process_hvq(ldcp, &notify, &event); in i_ldc_rx_hdlr()
1054 if (ldcp->mode != LDC_MODE_RELIABLE) { in i_ldc_rx_hdlr()
1063 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in i_ldc_rx_hdlr()
1065 ldcp->rx_intr_state = LDC_INTR_PEND; in i_ldc_rx_hdlr()
1070 if (notify && ldcp->cb_enabled) { in i_ldc_rx_hdlr()
1071 ldcp->cb_inprogress = B_TRUE; in i_ldc_rx_hdlr()
1072 mutex_exit(&ldcp->lock); in i_ldc_rx_hdlr()
1073 rv = ldcp->cb(event, ldcp->cb_arg); in i_ldc_rx_hdlr()
1075 DWARN(ldcp->id, in i_ldc_rx_hdlr()
1077 ldcp->id); in i_ldc_rx_hdlr()
1079 mutex_enter(&ldcp->lock); in i_ldc_rx_hdlr()
1080 ldcp->cb_inprogress = B_FALSE; in i_ldc_rx_hdlr()
1083 if (ldcp->mode == LDC_MODE_RELIABLE) { in i_ldc_rx_hdlr()
1093 ldcp->rx_intr_state = LDC_INTR_PEND; in i_ldc_rx_hdlr()
1100 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in i_ldc_rx_hdlr()
1104 mutex_exit(&ldcp->lock); in i_ldc_rx_hdlr()
1106 D1(ldcp->id, "i_ldc_rx_hdlr: (0x%llx) exiting handler", ldcp->id); in i_ldc_rx_hdlr()
1118 i_ldc_chkq(ldc_chan_t *ldcp) in i_ldc_chkq() argument
1123 return (i_ldc_rx_process_hvq(ldcp, &notify, &event)); in i_ldc_chkq()
1130 i_ldc_send_pkt(ldc_chan_t *ldcp, uint8_t pkttype, uint8_t subtype, in i_ldc_send_pkt() argument
1139 mutex_enter(&ldcp->tx_lock); in i_ldc_send_pkt()
1141 curr_seqid = ldcp->last_msg_snt; in i_ldc_send_pkt()
1144 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in i_ldc_send_pkt()
1146 DWARN(ldcp->id, in i_ldc_send_pkt()
1149 ldcp->id, pkttype, subtype, ctrlmsg); in i_ldc_send_pkt()
1150 mutex_exit(&ldcp->tx_lock); in i_ldc_send_pkt()
1154 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_send_pkt()
1166 if (ldcp->mode != LDC_MODE_RAW) { in i_ldc_send_pkt()
1168 pkt->ackid = ldcp->last_msg_rcd; in i_ldc_send_pkt()
1171 DUMP_LDC_PKT(ldcp, "i_ldc_send_pkt", (uint64_t)pkt); in i_ldc_send_pkt()
1175 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_send_pkt()
1177 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_send_pkt()
1179 DWARN(ldcp->id, in i_ldc_send_pkt()
1182 ldcp->id, pkttype, subtype, ctrlmsg); in i_ldc_send_pkt()
1183 mutex_exit(&ldcp->tx_lock); in i_ldc_send_pkt()
1187 ldcp->last_msg_snt = curr_seqid; in i_ldc_send_pkt()
1188 ldcp->tx_tail = tx_tail; in i_ldc_send_pkt()
1190 mutex_exit(&ldcp->tx_lock); in i_ldc_send_pkt()
1200 i_ldc_check_seqid(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_check_seqid() argument
1203 if (ldcp->mode == LDC_MODE_RAW) in i_ldc_check_seqid()
1213 if (msg->seqid != (ldcp->last_msg_rcd + 1)) { in i_ldc_check_seqid()
1214 DWARN(ldcp->id, in i_ldc_check_seqid()
1216 "expecting 0x%x\n", ldcp->id, msg->seqid, in i_ldc_check_seqid()
1217 (ldcp->last_msg_rcd + 1)); in i_ldc_check_seqid()
1222 if (LDC_INJECT_PKTLOSS(ldcp)) { in i_ldc_check_seqid()
1223 DWARN(ldcp->id, in i_ldc_check_seqid()
1224 "i_ldc_check_seqid: (0x%llx) inject pkt loss\n", ldcp->id); in i_ldc_check_seqid()
1237 i_ldc_process_VER(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_process_VER() argument
1239 int rv = 0, idx = ldcp->next_vidx; in i_ldc_process_VER()
1247 D2(ldcp->id, "i_ldc_process_VER: (0x%llx) received VER v%u.%u\n", in i_ldc_process_VER()
1248 ldcp->id, rcvd_ver->major, rcvd_ver->minor); in i_ldc_process_VER()
1251 mutex_enter(&ldcp->tx_lock); in i_ldc_process_VER()
1256 if ((ldcp->tstate & ~TS_IN_RESET) == TS_VREADY) { in i_ldc_process_VER()
1257 (void) i_ldc_txq_reconf(ldcp); in i_ldc_process_VER()
1258 i_ldc_reset_state(ldcp); in i_ldc_process_VER()
1259 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1264 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in i_ldc_process_VER()
1266 DWARN(ldcp->id, in i_ldc_process_VER()
1268 "version ACK/NACK\n", ldcp->id); in i_ldc_process_VER()
1269 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1270 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1274 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_process_VER()
1283 D1(ldcp->id, "i_ldc_process_VER: got %u.%u chk %u.%u\n", in i_ldc_process_VER()
1305 D1(ldcp->id, "i_ldc_process_VER: using next" in i_ldc_process_VER()
1314 ldcp->next_vidx = idx; in i_ldc_process_VER()
1321 D1(ldcp->id, "i_ldc_process_VER: inc idx %x\n", idx); in i_ldc_process_VER()
1327 ldcp->next_vidx = 0; in i_ldc_process_VER()
1334 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_process_VER()
1336 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_process_VER()
1338 ldcp->tx_tail = tx_tail; in i_ldc_process_VER()
1340 D2(ldcp->id, "i_ldc_process_VER: (0x%llx) sent" in i_ldc_process_VER()
1341 " version ACK\n", ldcp->id); in i_ldc_process_VER()
1343 ldcp->version.major = rcvd_ver->major; in i_ldc_process_VER()
1344 ldcp->version.minor = rcvd_ver->minor; in i_ldc_process_VER()
1345 ldcp->hstate |= TS_RCVD_VER; in i_ldc_process_VER()
1346 ldcp->tstate |= TS_VER_DONE; in i_ldc_process_VER()
1350 ldcp->id, rcvd_ver->major, rcvd_ver->minor); in i_ldc_process_VER()
1353 DWARN(ldcp->id, in i_ldc_process_VER()
1355 "ACK/NACK\n", ldcp->id); in i_ldc_process_VER()
1356 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1357 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1364 if ((ldcp->tstate & ~TS_IN_RESET) == TS_VREADY) { in i_ldc_process_VER()
1365 if (ldcp->version.major != rcvd_ver->major || in i_ldc_process_VER()
1366 ldcp->version.minor != rcvd_ver->minor) { in i_ldc_process_VER()
1369 DWARN(ldcp->id, in i_ldc_process_VER()
1371 " ACK ver != sent ACK ver\n", ldcp->id); in i_ldc_process_VER()
1372 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1373 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1378 ldcp->version.major = rcvd_ver->major; in i_ldc_process_VER()
1379 ldcp->version.minor = rcvd_ver->minor; in i_ldc_process_VER()
1380 ldcp->tstate |= TS_VER_DONE; in i_ldc_process_VER()
1383 D1(ldcp->id, "(0x%llx) Got ACK, Agreed on version v%u.%u\n", in i_ldc_process_VER()
1384 ldcp->id, rcvd_ver->major, rcvd_ver->minor); in i_ldc_process_VER()
1387 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in i_ldc_process_VER()
1389 DWARN(ldcp->id, in i_ldc_process_VER()
1391 ldcp->id); in i_ldc_process_VER()
1392 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1393 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1397 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_process_VER()
1403 pkt->env = ldcp->mode; in i_ldc_process_VER()
1404 if (ldcp->mode != LDC_MODE_RAW) in i_ldc_process_VER()
1407 ldcp->last_msg_rcd = LDC_INIT_SEQID; in i_ldc_process_VER()
1409 DUMP_LDC_PKT(ldcp, "i_ldc_process_VER snd rts", (uint64_t)pkt); in i_ldc_process_VER()
1413 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_process_VER()
1415 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_process_VER()
1417 D2(ldcp->id, in i_ldc_process_VER()
1419 ldcp->id); in i_ldc_process_VER()
1420 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1421 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1425 ldcp->tx_tail = tx_tail; in i_ldc_process_VER()
1426 ldcp->hstate |= TS_SENT_RTS; in i_ldc_process_VER()
1436 ldcp->id); in i_ldc_process_VER()
1437 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1438 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1443 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in i_ldc_process_VER()
1447 "version ACK/NACK\n", ldcp->id); in i_ldc_process_VER()
1448 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1449 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1453 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_process_VER()
1478 D1(ldcp->id, "i_ldc_process_VER: using next" in i_ldc_process_VER()
1486 ldcp->next_vidx = idx; in i_ldc_process_VER()
1493 D1(ldcp->id, "i_ldc_process_VER: inc idx %x\n", idx); in i_ldc_process_VER()
1497 ldcp->next_vidx = 0; in i_ldc_process_VER()
1498 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1505 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_process_VER()
1507 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_process_VER()
1509 D2(ldcp->id, "i_ldc_process_VER: (0x%llx) sent version" in i_ldc_process_VER()
1510 "INFO v%u.%u\n", ldcp->id, ldc_versions[idx].major, in i_ldc_process_VER()
1512 ldcp->tx_tail = tx_tail; in i_ldc_process_VER()
1516 "INFO\n", ldcp->id); in i_ldc_process_VER()
1517 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_VER()
1518 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1525 mutex_exit(&ldcp->tx_lock); in i_ldc_process_VER()
1534 i_ldc_process_RTS(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_process_RTS() argument
1541 D2(ldcp->id, "i_ldc_process_RTS: (0x%llx) received RTS\n", ldcp->id); in i_ldc_process_RTS()
1545 DWARN(ldcp->id, in i_ldc_process_RTS()
1547 ldcp->id); in i_ldc_process_RTS()
1550 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTS()
1551 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTS()
1552 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1559 if (ldcp->mode != (ldc_mode_t)msg->env) { in i_ldc_process_RTS()
1562 ldcp->id); in i_ldc_process_RTS()
1567 rv = i_ldc_send_pkt(ldcp, LDC_CTRL, LDC_NACK, LDC_RTS); in i_ldc_process_RTS()
1570 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTS()
1571 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTS()
1572 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1580 DWARN(ldcp->id, "i_ldc_process_RTS: (0x%llx) unexp ACK\n", in i_ldc_process_RTS()
1581 ldcp->id); in i_ldc_process_RTS()
1582 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTS()
1583 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTS()
1584 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1599 ldcp->hstate |= TS_RCVD_RTS; in i_ldc_process_RTS()
1602 ldcp->last_msg_snt = msg->seqid; in i_ldc_process_RTS()
1605 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTS()
1608 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in i_ldc_process_RTS()
1612 ldcp->id); in i_ldc_process_RTS()
1613 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTS()
1614 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1618 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_process_RTS()
1625 pkt->env = ldcp->mode; in i_ldc_process_RTS()
1626 if (ldcp->mode != LDC_MODE_RAW) in i_ldc_process_RTS()
1629 ldcp->last_msg_rcd = msg->seqid; in i_ldc_process_RTS()
1633 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_process_RTS()
1635 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_process_RTS()
1637 D2(ldcp->id, in i_ldc_process_RTS()
1638 "i_ldc_process_RTS: (0x%llx) sent RTR\n", ldcp->id); in i_ldc_process_RTS()
1639 DUMP_LDC_PKT(ldcp, "i_ldc_process_RTS sent rtr", (uint64_t)pkt); in i_ldc_process_RTS()
1641 ldcp->tx_tail = tx_tail; in i_ldc_process_RTS()
1642 ldcp->hstate |= TS_SENT_RTR; in i_ldc_process_RTS()
1647 ldcp->id); in i_ldc_process_RTS()
1648 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTS()
1649 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1653 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTS()
1661 i_ldc_process_RTR(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_process_RTR() argument
1666 D2(ldcp->id, "i_ldc_process_RTR: (0x%llx) received RTR\n", ldcp->id); in i_ldc_process_RTR()
1671 DWARN(ldcp->id, in i_ldc_process_RTR()
1673 ldcp->id); in i_ldc_process_RTR()
1676 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTR()
1677 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTR()
1678 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTR()
1686 if (ldcp->mode != (ldc_mode_t)msg->env) { in i_ldc_process_RTR()
1687 DWARN(ldcp->id, in i_ldc_process_RTR()
1690 ldcp->id, ldcp->mode, (ldc_mode_t)msg->env); in i_ldc_process_RTR()
1695 rv = i_ldc_send_pkt(ldcp, LDC_CTRL, LDC_NACK, LDC_RTR); in i_ldc_process_RTR()
1698 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTR()
1699 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTR()
1700 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTR()
1709 DWARN(ldcp->id, "i_ldc_process_RTR: (0x%llx) unexp ACK\n", in i_ldc_process_RTR()
1710 ldcp->id); in i_ldc_process_RTR()
1713 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTR()
1714 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTR()
1715 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTR()
1729 ldcp->last_msg_snt = msg->seqid; in i_ldc_process_RTR()
1730 ldcp->hstate |= TS_RCVD_RTR; in i_ldc_process_RTR()
1732 rv = i_ldc_send_pkt(ldcp, LDC_CTRL, LDC_INFO, LDC_RDX); in i_ldc_process_RTR()
1736 ldcp->id); in i_ldc_process_RTR()
1737 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RTR()
1738 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RTR()
1739 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RTR()
1742 D2(ldcp->id, in i_ldc_process_RTR()
1743 "i_ldc_process_RTR: (0x%llx) sent RDX\n", ldcp->id); in i_ldc_process_RTR()
1745 ldcp->hstate |= TS_SENT_RDX; in i_ldc_process_RTR()
1746 ldcp->tstate |= TS_HSHAKE_DONE; in i_ldc_process_RTR()
1747 if ((ldcp->tstate & TS_IN_RESET) == 0) in i_ldc_process_RTR()
1748 ldcp->status = LDC_UP; in i_ldc_process_RTR()
1750 D1(ldcp->id, "(0x%llx) Handshake Complete\n", ldcp->id); in i_ldc_process_RTR()
1760 i_ldc_process_RDX(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_process_RDX() argument
1764 D2(ldcp->id, "i_ldc_process_RDX: (0x%llx) received RDX\n", ldcp->id); in i_ldc_process_RDX()
1769 DWARN(ldcp->id, in i_ldc_process_RDX()
1771 ldcp->id); in i_ldc_process_RDX()
1774 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RDX()
1775 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RDX()
1776 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RDX()
1787 if ((ldcp->tstate == TS_UP) && (ldcp->hstate & TS_RCVD_RDX)) { in i_ldc_process_RDX()
1790 " - LDC reset\n", ldcp->id); in i_ldc_process_RDX()
1791 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RDX()
1792 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RDX()
1793 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RDX()
1797 ldcp->hstate |= TS_RCVD_RDX; in i_ldc_process_RDX()
1798 ldcp->tstate |= TS_HSHAKE_DONE; in i_ldc_process_RDX()
1799 if ((ldcp->tstate & TS_IN_RESET) == 0) in i_ldc_process_RDX()
1800 ldcp->status = LDC_UP; in i_ldc_process_RDX()
1802 D1(DBG_ALL_LDCS, "(0x%llx) Handshake Complete\n", ldcp->id); in i_ldc_process_RDX()
1806 DWARN(ldcp->id, "i_ldc_process_RDX: (0x%llx) unexp ACK\n", in i_ldc_process_RDX()
1807 ldcp->id); in i_ldc_process_RDX()
1810 mutex_enter(&ldcp->tx_lock); in i_ldc_process_RDX()
1811 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_RDX()
1812 mutex_exit(&ldcp->tx_lock); in i_ldc_process_RDX()
1824 i_ldc_process_data_ACK(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_process_data_ACK() argument
1831 mutex_enter(&ldcp->tx_lock); in i_ldc_process_data_ACK()
1836 rv = hv_ldc_tx_get_state(ldcp->id, in i_ldc_process_data_ACK()
1837 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in i_ldc_process_data_ACK()
1841 ldcp->id); in i_ldc_process_data_ACK()
1844 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_data_ACK()
1845 mutex_exit(&ldcp->tx_lock); in i_ldc_process_data_ACK()
1855 tx_head = ldcp->tx_ackd_head; in i_ldc_process_data_ACK()
1857 pkt = (ldc_msg_t *)(ldcp->tx_q_va + tx_head); in i_ldc_process_data_ACK()
1859 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_process_data_ACK()
1862 D2(ldcp->id, in i_ldc_process_data_ACK()
1864 ldcp->id); in i_ldc_process_data_ACK()
1865 ldcp->last_ack_rcd = msg->ackid; in i_ldc_process_data_ACK()
1866 ldcp->tx_ackd_head = tx_head; in i_ldc_process_data_ACK()
1869 if (tx_head == ldcp->tx_head) { in i_ldc_process_data_ACK()
1871 DWARN(ldcp->id, in i_ldc_process_data_ACK()
1873 ldcp->id); in i_ldc_process_data_ACK()
1876 i_ldc_reset(ldcp, B_TRUE); in i_ldc_process_data_ACK()
1877 mutex_exit(&ldcp->tx_lock); in i_ldc_process_data_ACK()
1882 mutex_exit(&ldcp->tx_lock); in i_ldc_process_data_ACK()
1893 i_ldc_ctrlmsg(ldc_chan_t *ldcp, ldc_msg_t *msg) in i_ldc_ctrlmsg() argument
1897 D1(ldcp->id, "i_ldc_ctrlmsg: (%llx) tstate = %lx, hstate = %lx\n", in i_ldc_ctrlmsg()
1898 ldcp->id, ldcp->tstate, ldcp->hstate); in i_ldc_ctrlmsg()
1900 switch (ldcp->tstate & ~TS_IN_RESET) { in i_ldc_ctrlmsg()
1908 rv = i_ldc_process_VER(ldcp, msg); in i_ldc_ctrlmsg()
1911 DWARN(ldcp->id, in i_ldc_ctrlmsg()
1913 "tstate=0x%x\n", ldcp->id, in i_ldc_ctrlmsg()
1914 (msg->ctrl & LDC_CTRL_MASK), ldcp->tstate); in i_ldc_ctrlmsg()
1925 rv = i_ldc_process_VER(ldcp, msg); in i_ldc_ctrlmsg()
1929 rv = i_ldc_process_RTS(ldcp, msg); in i_ldc_ctrlmsg()
1933 rv = i_ldc_process_RTR(ldcp, msg); in i_ldc_ctrlmsg()
1937 rv = i_ldc_process_RDX(ldcp, msg); in i_ldc_ctrlmsg()
1940 DWARN(ldcp->id, in i_ldc_ctrlmsg()
1942 "tstate=0x%x\n", ldcp->id, in i_ldc_ctrlmsg()
1943 (msg->ctrl & LDC_CTRL_MASK), ldcp->tstate); in i_ldc_ctrlmsg()
1953 DWARN(ldcp->id, in i_ldc_ctrlmsg()
1955 "- LDC reset\n", ldcp->id); in i_ldc_ctrlmsg()
1957 mutex_enter(&ldcp->tx_lock); in i_ldc_ctrlmsg()
1958 (void) i_ldc_txq_reconf(ldcp); in i_ldc_ctrlmsg()
1959 i_ldc_reset_state(ldcp); in i_ldc_ctrlmsg()
1960 mutex_exit(&ldcp->tx_lock); in i_ldc_ctrlmsg()
1966 rv = i_ldc_process_RDX(ldcp, msg); in i_ldc_ctrlmsg()
1970 DWARN(ldcp->id, in i_ldc_ctrlmsg()
1972 "tstate=0x%x\n", ldcp->id, in i_ldc_ctrlmsg()
1973 (msg->ctrl & LDC_CTRL_MASK), ldcp->tstate); in i_ldc_ctrlmsg()
1985 i_ldc_register_channel(ldc_chan_t *ldcp) in i_ldc_register_channel() argument
1991 DWARN(ldcp->id, in i_ldc_register_channel()
1996 rv = cinfo->reg_chan(cinfo->dip, ldcp->id, ldcp->devclass); in i_ldc_register_channel()
1998 DWARN(ldcp->id, in i_ldc_register_channel()
2003 rv = cinfo->add_intr(cinfo->dip, ldcp->id, CNEX_TX_INTR, in i_ldc_register_channel()
2004 i_ldc_tx_hdlr, ldcp, NULL); in i_ldc_register_channel()
2006 DWARN(ldcp->id, in i_ldc_register_channel()
2008 (void) cinfo->unreg_chan(cinfo->dip, ldcp->id); in i_ldc_register_channel()
2012 rv = cinfo->add_intr(cinfo->dip, ldcp->id, CNEX_RX_INTR, in i_ldc_register_channel()
2013 i_ldc_rx_hdlr, ldcp, NULL); in i_ldc_register_channel()
2015 DWARN(ldcp->id, in i_ldc_register_channel()
2017 (void) cinfo->rem_intr(cinfo->dip, ldcp->id, CNEX_TX_INTR); in i_ldc_register_channel()
2018 (void) cinfo->unreg_chan(cinfo->dip, ldcp->id); in i_ldc_register_channel()
2022 ldcp->tstate |= TS_CNEX_RDY; in i_ldc_register_channel()
2031 i_ldc_unregister_channel(ldc_chan_t *ldcp) in i_ldc_unregister_channel() argument
2037 DWARN(ldcp->id, in i_ldc_unregister_channel()
2042 if (ldcp->tstate & TS_CNEX_RDY) { in i_ldc_unregister_channel()
2045 rv = cinfo->rem_intr(cinfo->dip, ldcp->id, CNEX_RX_INTR); in i_ldc_unregister_channel()
2048 DWARN(ldcp->id, in i_ldc_unregister_channel()
2059 if (ldcp->rx_intr_state != LDC_INTR_PEND) in i_ldc_unregister_channel()
2062 (void) i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in i_ldc_unregister_channel()
2063 rv = cinfo->rem_intr(cinfo->dip, ldcp->id, in i_ldc_unregister_channel()
2066 DWARN(ldcp->id, "i_ldc_unregister_channel: " in i_ldc_unregister_channel()
2073 rv = cinfo->rem_intr(cinfo->dip, ldcp->id, CNEX_TX_INTR); in i_ldc_unregister_channel()
2075 DWARN(ldcp->id, in i_ldc_unregister_channel()
2081 rv = cinfo->unreg_chan(ldcssp->cinfo.dip, ldcp->id); in i_ldc_unregister_channel()
2083 DWARN(ldcp->id, in i_ldc_unregister_channel()
2088 ldcp->tstate &= ~TS_CNEX_RDY; in i_ldc_unregister_channel()
2106 ldc_chan_t *ldcp; in i_ldc_tx_hdlr() local
2112 ldcp = (ldc_chan_t *)arg1; in i_ldc_tx_hdlr()
2114 D1(ldcp->id, "i_ldc_tx_hdlr: (0x%llx) Received intr, ldcp=0x%p\n", in i_ldc_tx_hdlr()
2115 ldcp->id, ldcp); in i_ldc_tx_hdlr()
2118 mutex_enter(&ldcp->lock); in i_ldc_tx_hdlr()
2121 mutex_enter(&ldcp->tx_lock); in i_ldc_tx_hdlr()
2124 ldcp->tx_intr_state = LDC_INTR_ACTIVE; in i_ldc_tx_hdlr()
2127 link_state = ldcp->link_state; in i_ldc_tx_hdlr()
2129 rv = hv_ldc_tx_get_state(ldcp->id, &ldcp->tx_head, &ldcp->tx_tail, in i_ldc_tx_hdlr()
2130 &ldcp->link_state); in i_ldc_tx_hdlr()
2134 ldcp->id, rv); in i_ldc_tx_hdlr()
2135 i_ldc_clear_intr(ldcp, CNEX_TX_INTR); in i_ldc_tx_hdlr()
2136 mutex_exit(&ldcp->tx_lock); in i_ldc_tx_hdlr()
2137 mutex_exit(&ldcp->lock); in i_ldc_tx_hdlr()
2146 if (link_state != ldcp->link_state && in i_ldc_tx_hdlr()
2147 ldcp->link_state == LDC_CHANNEL_DOWN) { in i_ldc_tx_hdlr()
2148 D1(ldcp->id, "i_ldc_tx_hdlr: channel link down\n", ldcp->id); in i_ldc_tx_hdlr()
2149 i_ldc_reset(ldcp, B_FALSE); in i_ldc_tx_hdlr()
2154 if (link_state != ldcp->link_state && in i_ldc_tx_hdlr()
2155 ldcp->link_state == LDC_CHANNEL_RESET) { in i_ldc_tx_hdlr()
2156 D1(ldcp->id, "i_ldc_tx_hdlr: channel link reset\n", ldcp->id); in i_ldc_tx_hdlr()
2157 i_ldc_reset(ldcp, B_FALSE); in i_ldc_tx_hdlr()
2162 if (link_state != ldcp->link_state && in i_ldc_tx_hdlr()
2163 (ldcp->tstate & ~TS_IN_RESET) == TS_OPEN && in i_ldc_tx_hdlr()
2164 ldcp->link_state == LDC_CHANNEL_UP) { in i_ldc_tx_hdlr()
2165 D1(ldcp->id, "i_ldc_tx_hdlr: channel link up\n", ldcp->id); in i_ldc_tx_hdlr()
2168 ldcp->tstate |= TS_LINK_READY; in i_ldc_tx_hdlr()
2169 ldcp->status = LDC_READY; in i_ldc_tx_hdlr()
2173 if (!ldcp->cb_enabled) in i_ldc_tx_hdlr()
2176 i_ldc_clear_intr(ldcp, CNEX_TX_INTR); in i_ldc_tx_hdlr()
2177 mutex_exit(&ldcp->tx_lock); in i_ldc_tx_hdlr()
2180 ldcp->cb_inprogress = B_TRUE; in i_ldc_tx_hdlr()
2181 mutex_exit(&ldcp->lock); in i_ldc_tx_hdlr()
2182 rv = ldcp->cb(notify_event, ldcp->cb_arg); in i_ldc_tx_hdlr()
2184 DWARN(ldcp->id, "i_ldc_tx_hdlr: (0x%llx) callback " in i_ldc_tx_hdlr()
2185 "failure", ldcp->id); in i_ldc_tx_hdlr()
2187 mutex_enter(&ldcp->lock); in i_ldc_tx_hdlr()
2188 ldcp->cb_inprogress = B_FALSE; in i_ldc_tx_hdlr()
2191 mutex_exit(&ldcp->lock); in i_ldc_tx_hdlr()
2193 D1(ldcp->id, "i_ldc_tx_hdlr: (0x%llx) exiting handler", ldcp->id); in i_ldc_tx_hdlr()
2226 i_ldc_rx_process_hvq(ldc_chan_t *ldcp, boolean_t *notify_client, in i_ldc_rx_process_hvq() argument
2235 ASSERT(MUTEX_HELD(&ldcp->lock)); in i_ldc_rx_process_hvq()
2244 link_state = ldcp->link_state; in i_ldc_rx_process_hvq()
2245 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in i_ldc_rx_process_hvq()
2246 &ldcp->link_state); in i_ldc_rx_process_hvq()
2250 "queue ptrs, rv=0x%d\n", ldcp->id, rv); in i_ldc_rx_process_hvq()
2251 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in i_ldc_rx_process_hvq()
2261 if (link_state != ldcp->link_state) { in i_ldc_rx_process_hvq()
2263 switch (ldcp->link_state) { in i_ldc_rx_process_hvq()
2265 D1(ldcp->id, "i_ldc_rx_process_hvq: channel " in i_ldc_rx_process_hvq()
2266 "link down\n", ldcp->id); in i_ldc_rx_process_hvq()
2267 mutex_enter(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2268 i_ldc_reset(ldcp, B_FALSE); in i_ldc_rx_process_hvq()
2269 mutex_exit(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2275 D1(ldcp->id, "i_ldc_rx_process_hvq: " in i_ldc_rx_process_hvq()
2276 "channel link up\n", ldcp->id); in i_ldc_rx_process_hvq()
2278 if ((ldcp->tstate & ~TS_IN_RESET) == TS_OPEN) { in i_ldc_rx_process_hvq()
2281 ldcp->tstate |= TS_LINK_READY; in i_ldc_rx_process_hvq()
2282 ldcp->status = LDC_READY; in i_ldc_rx_process_hvq()
2291 D1(ldcp->id, "i_ldc_rx_process_hvq: channel " in i_ldc_rx_process_hvq()
2292 "link reset\n", ldcp->id); in i_ldc_rx_process_hvq()
2293 mutex_enter(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2294 i_ldc_reset(ldcp, B_FALSE); in i_ldc_rx_process_hvq()
2295 mutex_exit(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2303 if (LDC_INJECT_RESET(ldcp)) in i_ldc_rx_process_hvq()
2305 if (LDC_INJECT_DRNGCLEAR(ldcp)) in i_ldc_rx_process_hvq()
2306 i_ldc_mem_inject_dring_clear(ldcp); in i_ldc_rx_process_hvq()
2309 TRACE_RXHVQ_LENGTH(ldcp, rx_head, rx_tail); in i_ldc_rx_process_hvq()
2314 D2(ldcp->id, "i_ldc_rx_process_hvq: (0x%llx) " in i_ldc_rx_process_hvq()
2315 "No packets\n", ldcp->id); in i_ldc_rx_process_hvq()
2319 D2(ldcp->id, "i_ldc_rx_process_hvq: head=0x%llx, " in i_ldc_rx_process_hvq()
2321 DUMP_LDC_PKT(ldcp, "i_ldc_rx_process_hvq rcd", in i_ldc_rx_process_hvq()
2322 ldcp->rx_q_va + rx_head); in i_ldc_rx_process_hvq()
2325 msg = (ldc_msg_t *)(ldcp->rx_q_va + rx_head); in i_ldc_rx_process_hvq()
2328 if (ldcp->mode == LDC_MODE_RAW) { in i_ldc_rx_process_hvq()
2337 if ((ldcp->tstate & ~TS_IN_RESET) != TS_UP) { in i_ldc_rx_process_hvq()
2341 (ldcp->rx_q_entries << LDC_PACKET_SHIFT); in i_ldc_rx_process_hvq()
2343 if (rv = i_ldc_set_rx_head(ldcp, rx_head)) in i_ldc_rx_process_hvq()
2351 if (ldcp->mode != LDC_MODE_RELIABLE) { in i_ldc_rx_process_hvq()
2352 if ((ldcp->tstate & TS_IN_RESET) == 0) in i_ldc_rx_process_hvq()
2359 (void) i_ldc_dq_rx_get_state(ldcp, &dq_head, in i_ldc_rx_process_hvq()
2362 (ldcp->rx_dq_entries << LDC_PACKET_SHIFT); in i_ldc_rx_process_hvq()
2364 LDC_INJECT_DQFULL(ldcp)) { in i_ldc_rx_process_hvq()
2372 rv = i_ldc_check_seqid(ldcp, msg); in i_ldc_rx_process_hvq()
2375 DWARN(ldcp->id, "i_ldc_rx_process_hvq: (0x%llx) " in i_ldc_rx_process_hvq()
2376 "seqid error, q_ptrs=0x%lx,0x%lx", ldcp->id, in i_ldc_rx_process_hvq()
2381 ldcp->last_msg_rcd = first_fragment - 1; in i_ldc_rx_process_hvq()
2388 rv = i_ldc_send_pkt(ldcp, msg->type, LDC_NACK, in i_ldc_rx_process_hvq()
2394 ldcp->id); in i_ldc_rx_process_hvq()
2397 mutex_enter(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2398 i_ldc_reset(ldcp, B_TRUE); in i_ldc_rx_process_hvq()
2399 mutex_exit(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2407 (void) i_ldc_set_rx_head(ldcp, rx_tail); in i_ldc_rx_process_hvq()
2412 ldcp->last_msg_rcd = msg->seqid; in i_ldc_rx_process_hvq()
2417 uint64_t tstate = ldcp->tstate; in i_ldc_rx_process_hvq()
2419 rv = i_ldc_ctrlmsg(ldcp, msg); in i_ldc_rx_process_hvq()
2434 if (rv == 0 && ldcp->tstate == TS_UP && in i_ldc_rx_process_hvq()
2436 (ldcp->tstate & ~TS_IN_RESET)) { in i_ldc_rx_process_hvq()
2444 DWARN(ldcp->id, in i_ldc_rx_process_hvq()
2446 ldcp->id); in i_ldc_rx_process_hvq()
2447 mutex_enter(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2448 i_ldc_reset(ldcp, B_TRUE); in i_ldc_rx_process_hvq()
2449 mutex_exit(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2457 if (rv = i_ldc_process_data_ACK(ldcp, msg)) { in i_ldc_rx_process_hvq()
2465 ASSERT(ldcp->mode == LDC_MODE_RELIABLE); in i_ldc_rx_process_hvq()
2471 i_ldc_rxdq_copy(ldcp, &rx_head); in i_ldc_rx_process_hvq()
2473 if ((ldcp->tstate & TS_IN_RESET) == 0) in i_ldc_rx_process_hvq()
2478 (ldcp->rx_q_entries << LDC_PACKET_SHIFT); in i_ldc_rx_process_hvq()
2482 if (rv = i_ldc_set_rx_head(ldcp, rx_head)) { in i_ldc_rx_process_hvq()
2492 if (ldcp->mode == LDC_MODE_RELIABLE) { in i_ldc_rx_process_hvq()
2497 ack_rv = i_ldc_send_pkt(ldcp, LDC_DATA, LDC_ACK, 0); in i_ldc_rx_process_hvq()
2501 "send ACK\n", ldcp->id); in i_ldc_rx_process_hvq()
2503 mutex_enter(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2504 i_ldc_reset(ldcp, B_FALSE); in i_ldc_rx_process_hvq()
2505 mutex_exit(&ldcp->tx_lock); in i_ldc_rx_process_hvq()
2518 if (i_ldc_rx_ackpeek(ldcp, rx_head, rx_tail) != 0) { in i_ldc_rx_process_hvq()
2519 ldcp->rx_ack_head = ACKPEEK_HEAD_INVALID; in i_ldc_rx_process_hvq()
2525 ldcp->rx_ack_head = ACKPEEK_HEAD_INVALID; in i_ldc_rx_process_hvq()
2546 i_ldc_rx_ackpeek(ldc_chan_t *ldcp, uint64_t rx_head, uint64_t rx_tail) in i_ldc_rx_ackpeek() argument
2551 if (ldcp->rx_ack_head == ACKPEEK_HEAD_INVALID) in i_ldc_rx_ackpeek()
2552 ldcp->rx_ack_head = rx_head; in i_ldc_rx_ackpeek()
2554 while (ldcp->rx_ack_head != rx_tail) { in i_ldc_rx_ackpeek()
2555 msg = (ldc_msg_t *)(ldcp->rx_q_va + ldcp->rx_ack_head); in i_ldc_rx_ackpeek()
2558 if (rv = i_ldc_process_data_ACK(ldcp, msg)) in i_ldc_rx_ackpeek()
2563 ldcp->rx_ack_head = in i_ldc_rx_ackpeek()
2564 (ldcp->rx_ack_head + LDC_PACKET_SIZE) % in i_ldc_rx_ackpeek()
2565 (ldcp->rx_q_entries << LDC_PACKET_SHIFT); in i_ldc_rx_ackpeek()
2583 ldc_chan_t *ldcp; in ldc_init() local
2608 ldcp = ldcssp->chan_list; in ldc_init()
2609 while (ldcp != NULL) { in ldc_init()
2610 if (ldcp->id == id) { in ldc_init()
2616 ldcp = ldcp->next; in ldc_init()
2620 ASSERT(ldcp == NULL); in ldc_init()
2625 ldcp = kmem_zalloc(sizeof (ldc_chan_t), KM_SLEEP); in ldc_init()
2643 mutex_init(&ldcp->lock, NULL, MUTEX_DRIVER, NULL); in ldc_init()
2644 mutex_init(&ldcp->tx_lock, NULL, MUTEX_DRIVER, NULL); in ldc_init()
2647 ldcp->id = id; in ldc_init()
2648 ldcp->cb = NULL; in ldc_init()
2649 ldcp->cb_arg = NULL; in ldc_init()
2650 ldcp->cb_inprogress = B_FALSE; in ldc_init()
2651 ldcp->cb_enabled = B_FALSE; in ldc_init()
2652 ldcp->next = NULL; in ldc_init()
2655 ldcp->mode = attr->mode; in ldc_init()
2656 ldcp->devclass = attr->devclass; in ldc_init()
2657 ldcp->devinst = attr->instance; in ldc_init()
2658 ldcp->mtu = (attr->mtu > 0) ? attr->mtu : LDC_DEFAULT_MTU; in ldc_init()
2660 D1(ldcp->id, in ldc_init()
2663 ldcp->id, ldcp->devclass, ldcp->devinst, ldcp->mode, ldcp->mtu); in ldc_init()
2665 ldcp->next_vidx = 0; in ldc_init()
2666 ldcp->tstate = TS_IN_RESET; in ldc_init()
2667 ldcp->hstate = 0; in ldc_init()
2668 ldcp->last_msg_snt = LDC_INIT_SEQID; in ldc_init()
2669 ldcp->last_ack_rcd = 0; in ldc_init()
2670 ldcp->last_msg_rcd = 0; in ldc_init()
2671 ldcp->rx_ack_head = ACKPEEK_HEAD_INVALID; in ldc_init()
2673 ldcp->stream_bufferp = NULL; in ldc_init()
2674 ldcp->exp_dring_list = NULL; in ldc_init()
2675 ldcp->imp_dring_list = NULL; in ldc_init()
2676 ldcp->mhdl_list = NULL; in ldc_init()
2678 ldcp->tx_intr_state = LDC_INTR_NONE; in ldc_init()
2679 ldcp->rx_intr_state = LDC_INTR_NONE; in ldc_init()
2682 switch (ldcp->mode) { in ldc_init()
2684 ldcp->pkt_payload = LDC_PAYLOAD_SIZE_RAW; in ldc_init()
2685 ldcp->read_p = i_ldc_read_raw; in ldc_init()
2686 ldcp->write_p = i_ldc_write_raw; in ldc_init()
2689 ldcp->pkt_payload = LDC_PAYLOAD_SIZE_UNRELIABLE; in ldc_init()
2690 ldcp->read_p = i_ldc_read_packet; in ldc_init()
2691 ldcp->write_p = i_ldc_write_packet; in ldc_init()
2694 ldcp->pkt_payload = LDC_PAYLOAD_SIZE_RELIABLE; in ldc_init()
2696 ldcp->stream_remains = 0; in ldc_init()
2697 ldcp->stream_offset = 0; in ldc_init()
2698 ldcp->stream_bufferp = kmem_alloc(ldcp->mtu, KM_SLEEP); in ldc_init()
2699 ldcp->read_p = i_ldc_read_stream; in ldc_init()
2700 ldcp->write_p = i_ldc_write_stream; in ldc_init()
2713 qlen = (ldcp->mtu * ldc_mtu_msgs) / ldcp->pkt_payload; in ldc_init()
2722 ldcp->rx_q_entries = in ldc_init()
2724 ldcp->tx_q_entries = ldcp->rx_q_entries; in ldc_init()
2726 D1(ldcp->id, "ldc_init: queue length = 0x%llx\n", ldcp->rx_q_entries); in ldc_init()
2729 ldcp->tx_q_va = (uint64_t) in ldc_init()
2730 contig_mem_alloc(ldcp->tx_q_entries << LDC_PACKET_SHIFT); in ldc_init()
2731 if (ldcp->tx_q_va == NULL) { in ldc_init()
2734 ldcp->id); in ldc_init()
2738 ldcp->tx_q_ra = va_to_pa((caddr_t)ldcp->tx_q_va); in ldc_init()
2740 D2(ldcp->id, "ldc_init: txq_va=0x%llx, txq_ra=0x%llx, entries=0x%llx\n", in ldc_init()
2741 ldcp->tx_q_va, ldcp->tx_q_ra, ldcp->tx_q_entries); in ldc_init()
2743 ldcp->tstate |= TS_TXQ_RDY; in ldc_init()
2746 ldcp->rx_q_va = (uint64_t) in ldc_init()
2747 contig_mem_alloc(ldcp->rx_q_entries << LDC_PACKET_SHIFT); in ldc_init()
2748 if (ldcp->rx_q_va == NULL) { in ldc_init()
2751 ldcp->id); in ldc_init()
2755 ldcp->rx_q_ra = va_to_pa((caddr_t)ldcp->rx_q_va); in ldc_init()
2757 D2(ldcp->id, "ldc_init: rxq_va=0x%llx, rxq_ra=0x%llx, entries=0x%llx\n", in ldc_init()
2758 ldcp->rx_q_va, ldcp->rx_q_ra, ldcp->rx_q_entries); in ldc_init()
2760 ldcp->tstate |= TS_RXQ_RDY; in ldc_init()
2763 if (ldcp->mode == LDC_MODE_RELIABLE) { in ldc_init()
2764 ldcp->readq_get_state = i_ldc_dq_rx_get_state; in ldc_init()
2765 ldcp->readq_set_head = i_ldc_set_rxdq_head; in ldc_init()
2769 D1(ldcp->id, "ldc_init: (0x%llx) ldc_rxdq_multiplier " in ldc_init()
2770 "not a power of 2, resetting", ldcp->id); in ldc_init()
2774 ldcp->rx_dq_entries = ldc_rxdq_multiplier * ldcp->rx_q_entries; in ldc_init()
2775 ldcp->rx_dq_va = (uint64_t) in ldc_init()
2776 kmem_alloc(ldcp->rx_dq_entries << LDC_PACKET_SHIFT, in ldc_init()
2778 if (ldcp->rx_dq_va == NULL) { in ldc_init()
2781 "allocation failed\n", ldcp->id); in ldc_init()
2786 ldcp->rx_dq_head = ldcp->rx_dq_tail = 0; in ldc_init()
2788 D2(ldcp->id, "ldc_init: rx_dq_va=0x%llx, " in ldc_init()
2789 "rx_dq_entries=0x%llx\n", ldcp->rx_dq_va, in ldc_init()
2790 ldcp->rx_dq_entries); in ldc_init()
2792 ldcp->readq_get_state = i_ldc_hvq_rx_get_state; in ldc_init()
2793 ldcp->readq_set_head = i_ldc_set_rx_head; in ldc_init()
2797 mutex_init(&ldcp->exp_dlist_lock, NULL, MUTEX_DRIVER, NULL); in ldc_init()
2798 mutex_init(&ldcp->imp_dlist_lock, NULL, MUTEX_DRIVER, NULL); in ldc_init()
2799 mutex_init(&ldcp->mlist_lock, NULL, MUTEX_DRIVER, NULL); in ldc_init()
2802 ldcp->status = LDC_INIT; in ldc_init()
2806 ldcp->next = ldcssp->chan_list; in ldc_init()
2807 ldcssp->chan_list = ldcp; in ldc_init()
2812 *handle = (ldc_handle_t)ldcp; in ldc_init()
2814 D1(ldcp->id, "ldc_init: (0x%llx) channel initialized\n", ldcp->id); in ldc_init()
2820 if (ldcp->mode == LDC_MODE_RELIABLE && ldcp->stream_bufferp) in ldc_init()
2821 kmem_free(ldcp->stream_bufferp, ldcp->mtu); in ldc_init()
2823 if (ldcp->tstate & TS_TXQ_RDY) in ldc_init()
2824 contig_mem_free((caddr_t)ldcp->tx_q_va, in ldc_init()
2825 (ldcp->tx_q_entries << LDC_PACKET_SHIFT)); in ldc_init()
2827 if (ldcp->tstate & TS_RXQ_RDY) in ldc_init()
2828 contig_mem_free((caddr_t)ldcp->rx_q_va, in ldc_init()
2829 (ldcp->rx_q_entries << LDC_PACKET_SHIFT)); in ldc_init()
2831 mutex_destroy(&ldcp->tx_lock); in ldc_init()
2832 mutex_destroy(&ldcp->lock); in ldc_init()
2834 if (ldcp) in ldc_init()
2835 kmem_free(ldcp, sizeof (ldc_chan_t)); in ldc_init()
2849 ldc_chan_t *ldcp; in ldc_fini() local
2857 ldcp = (ldc_chan_t *)handle; in ldc_fini()
2858 id = ldcp->id; in ldc_fini()
2860 mutex_enter(&ldcp->lock); in ldc_fini()
2862 if ((ldcp->tstate & ~TS_IN_RESET) > TS_INIT) { in ldc_fini()
2863 DWARN(ldcp->id, "ldc_fini: (0x%llx) channel is open\n", in ldc_fini()
2864 ldcp->id); in ldc_fini()
2865 mutex_exit(&ldcp->lock); in ldc_fini()
2872 if (tmp_ldcp == ldcp) { in ldc_fini()
2873 ldcssp->chan_list = ldcp->next; in ldc_fini()
2874 ldcp->next = NULL; in ldc_fini()
2877 if (tmp_ldcp->next == ldcp) { in ldc_fini()
2878 tmp_ldcp->next = ldcp->next; in ldc_fini()
2879 ldcp->next = NULL; in ldc_fini()
2887 mutex_exit(&ldcp->lock); in ldc_fini()
2897 if (ldcp->mtbl) { in ldc_fini()
2898 (void) hv_ldc_set_map_table(ldcp->id, NULL, NULL); in ldc_fini()
2899 if (ldcp->mtbl->contigmem) in ldc_fini()
2900 contig_mem_free(ldcp->mtbl->table, ldcp->mtbl->size); in ldc_fini()
2902 kmem_free(ldcp->mtbl->table, ldcp->mtbl->size); in ldc_fini()
2903 mutex_destroy(&ldcp->mtbl->lock); in ldc_fini()
2904 kmem_free(ldcp->mtbl, sizeof (ldc_mtbl_t)); in ldc_fini()
2908 mutex_destroy(&ldcp->exp_dlist_lock); in ldc_fini()
2909 mutex_destroy(&ldcp->imp_dlist_lock); in ldc_fini()
2910 mutex_destroy(&ldcp->mlist_lock); in ldc_fini()
2913 if (ldcp->mode == LDC_MODE_RELIABLE && ldcp->stream_bufferp) in ldc_fini()
2914 kmem_free(ldcp->stream_bufferp, ldcp->mtu); in ldc_fini()
2917 contig_mem_free((caddr_t)ldcp->rx_q_va, in ldc_fini()
2918 (ldcp->rx_q_entries << LDC_PACKET_SHIFT)); in ldc_fini()
2919 ldcp->tstate &= ~TS_RXQ_RDY; in ldc_fini()
2922 if (ldcp->mode == LDC_MODE_RELIABLE) { in ldc_fini()
2923 kmem_free((caddr_t)ldcp->rx_dq_va, in ldc_fini()
2924 (ldcp->rx_dq_entries << LDC_PACKET_SHIFT)); in ldc_fini()
2928 contig_mem_free((caddr_t)ldcp->tx_q_va, in ldc_fini()
2929 (ldcp->tx_q_entries << LDC_PACKET_SHIFT)); in ldc_fini()
2930 ldcp->tstate &= ~TS_TXQ_RDY; in ldc_fini()
2932 mutex_exit(&ldcp->lock); in ldc_fini()
2935 mutex_destroy(&ldcp->tx_lock); in ldc_fini()
2936 mutex_destroy(&ldcp->lock); in ldc_fini()
2939 kmem_free(ldcp, sizeof (ldc_chan_t)); in ldc_fini()
2954 ldc_chan_t *ldcp; in ldc_open() local
2962 ldcp = (ldc_chan_t *)handle; in ldc_open()
2964 mutex_enter(&ldcp->lock); in ldc_open()
2966 if (ldcp->tstate < TS_INIT) { in ldc_open()
2967 DWARN(ldcp->id, in ldc_open()
2968 "ldc_open: (0x%llx) channel not initialized\n", ldcp->id); in ldc_open()
2969 mutex_exit(&ldcp->lock); in ldc_open()
2972 if ((ldcp->tstate & ~TS_IN_RESET) >= TS_OPEN) { in ldc_open()
2973 DWARN(ldcp->id, in ldc_open()
2974 "ldc_open: (0x%llx) channel is already open\n", ldcp->id); in ldc_open()
2975 mutex_exit(&ldcp->lock); in ldc_open()
2982 rv = hv_ldc_tx_qconf(ldcp->id, NULL, NULL); in ldc_open()
2986 ldcp->id); in ldc_open()
2987 mutex_exit(&ldcp->lock); in ldc_open()
2991 rv = hv_ldc_tx_qconf(ldcp->id, ldcp->tx_q_ra, ldcp->tx_q_entries); in ldc_open()
2995 ldcp->id); in ldc_open()
2996 mutex_exit(&ldcp->lock); in ldc_open()
3000 D2(ldcp->id, "ldc_open: (0x%llx) registered tx queue with LDC\n", in ldc_open()
3001 ldcp->id); in ldc_open()
3006 rv = hv_ldc_rx_qconf(ldcp->id, NULL, NULL); in ldc_open()
3010 ldcp->id); in ldc_open()
3011 mutex_exit(&ldcp->lock); in ldc_open()
3015 rv = hv_ldc_rx_qconf(ldcp->id, ldcp->rx_q_ra, ldcp->rx_q_entries); in ldc_open()
3019 ldcp->id); in ldc_open()
3020 mutex_exit(&ldcp->lock); in ldc_open()
3024 D2(ldcp->id, "ldc_open: (0x%llx) registered rx queue with LDC\n", in ldc_open()
3025 ldcp->id); in ldc_open()
3027 ldcp->tstate |= TS_QCONF_RDY; in ldc_open()
3030 rv = i_ldc_register_channel(ldcp); in ldc_open()
3033 "ldc_open: (0x%lx) channel register failed\n", ldcp->id); in ldc_open()
3034 ldcp->tstate &= ~TS_QCONF_RDY; in ldc_open()
3035 (void) hv_ldc_tx_qconf(ldcp->id, NULL, NULL); in ldc_open()
3036 (void) hv_ldc_rx_qconf(ldcp->id, NULL, NULL); in ldc_open()
3037 mutex_exit(&ldcp->lock); in ldc_open()
3042 ldcp->status = LDC_OPEN; in ldc_open()
3045 rv = hv_ldc_tx_get_state(ldcp->id, in ldc_open()
3046 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in ldc_open()
3050 ldcp->id); in ldc_open()
3051 (void) i_ldc_unregister_channel(ldcp); in ldc_open()
3052 ldcp->tstate &= ~TS_QCONF_RDY; in ldc_open()
3053 (void) hv_ldc_tx_qconf(ldcp->id, NULL, NULL); in ldc_open()
3054 (void) hv_ldc_rx_qconf(ldcp->id, NULL, NULL); in ldc_open()
3055 mutex_exit(&ldcp->lock); in ldc_open()
3062 ldcp->tx_ackd_head = ldcp->tx_head; in ldc_open()
3065 if (ldcp->link_state == LDC_CHANNEL_UP || in ldc_open()
3066 ldcp->link_state == LDC_CHANNEL_RESET) { in ldc_open()
3067 ldcp->tstate |= TS_LINK_READY; in ldc_open()
3068 ldcp->status = LDC_READY; in ldc_open()
3075 if (ldcp->mode == LDC_MODE_RAW) { in ldc_open()
3076 ldcp->tstate = TS_UP; /* set bits associated with LDC UP */ in ldc_open()
3077 ldcp->status = LDC_UP; in ldc_open()
3080 mutex_exit(&ldcp->lock); in ldc_open()
3089 D1(ldcp->id, in ldc_open()
3092 ldcp->id, ldcp, ldcp->tstate, ldcp->status); in ldc_open()
3105 ldc_chan_t *ldcp; in ldc_close() local
3113 ldcp = (ldc_chan_t *)handle; in ldc_close()
3115 mutex_enter(&ldcp->lock); in ldc_close()
3118 if ((ldcp->tstate & ~TS_IN_RESET) < TS_OPEN) { in ldc_close()
3119 DWARN(ldcp->id, in ldc_close()
3120 "ldc_close: (0x%llx) channel is not open\n", ldcp->id); in ldc_close()
3121 mutex_exit(&ldcp->lock); in ldc_close()
3126 if (ldcp->mhdl_list != NULL) { in ldc_close()
3127 DWARN(ldcp->id, in ldc_close()
3129 ldcp->id); in ldc_close()
3130 mutex_exit(&ldcp->lock); in ldc_close()
3133 if (ldcp->exp_dring_list != NULL) { in ldc_close()
3134 DWARN(ldcp->id, in ldc_close()
3136 ldcp->id); in ldc_close()
3137 mutex_exit(&ldcp->lock); in ldc_close()
3140 if (ldcp->imp_dring_list != NULL) { in ldc_close()
3141 DWARN(ldcp->id, in ldc_close()
3143 ldcp->id); in ldc_close()
3144 mutex_exit(&ldcp->lock); in ldc_close()
3148 if (ldcp->cb_inprogress) { in ldc_close()
3149 DWARN(ldcp->id, "ldc_close: (0x%llx) callback active\n", in ldc_close()
3150 ldcp->id); in ldc_close()
3151 mutex_exit(&ldcp->lock); in ldc_close()
3156 mutex_enter(&ldcp->tx_lock); in ldc_close()
3164 rv = hv_ldc_tx_get_state(ldcp->id, in ldc_close()
3165 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in ldc_close()
3168 "ldc_close: (0x%lx) cannot read qptrs\n", ldcp->id); in ldc_close()
3169 mutex_exit(&ldcp->tx_lock); in ldc_close()
3170 mutex_exit(&ldcp->lock); in ldc_close()
3174 if (ldcp->tx_head == ldcp->tx_tail || in ldc_close()
3175 ldcp->link_state != LDC_CHANNEL_UP) { in ldc_close()
3180 DWARN(ldcp->id, in ldc_close()
3182 ldcp->id); in ldc_close()
3199 (void) i_ldc_txq_reconf(ldcp); in ldc_close()
3200 i_ldc_rxq_drain(ldcp); in ldc_close()
3205 while ((rv = i_ldc_unregister_channel(ldcp)) != 0) { in ldc_close()
3207 mutex_exit(&ldcp->tx_lock); in ldc_close()
3208 mutex_exit(&ldcp->lock); in ldc_close()
3214 ldcp->id, rv); in ldc_close()
3223 mutex_enter(&ldcp->lock); in ldc_close()
3224 mutex_enter(&ldcp->tx_lock); in ldc_close()
3228 ldcp->tstate &= ~TS_QCONF_RDY; in ldc_close()
3233 rv = hv_ldc_tx_qconf(ldcp->id, NULL, NULL); in ldc_close()
3237 ldcp->id); in ldc_close()
3238 mutex_exit(&ldcp->tx_lock); in ldc_close()
3239 mutex_exit(&ldcp->lock); in ldc_close()
3242 rv = hv_ldc_rx_qconf(ldcp->id, NULL, NULL); in ldc_close()
3246 ldcp->id); in ldc_close()
3247 mutex_exit(&ldcp->tx_lock); in ldc_close()
3248 mutex_exit(&ldcp->lock); in ldc_close()
3253 i_ldc_reset_state(ldcp); in ldc_close()
3256 ldcp->tx_ackd_head = 0; in ldc_close()
3257 ldcp->tx_head = 0; in ldc_close()
3258 ldcp->tstate = TS_IN_RESET|TS_INIT; in ldc_close()
3259 ldcp->status = LDC_INIT; in ldc_close()
3261 mutex_exit(&ldcp->tx_lock); in ldc_close()
3262 mutex_exit(&ldcp->lock); in ldc_close()
3269 D1(ldcp->id, "ldc_close: (0x%llx) channel closed\n", ldcp->id); in ldc_close()
3281 ldc_chan_t *ldcp; in ldc_reg_callback() local
3292 ldcp = (ldc_chan_t *)handle; in ldc_reg_callback()
3294 mutex_enter(&ldcp->lock); in ldc_reg_callback()
3296 if (ldcp->cb) { in ldc_reg_callback()
3297 DWARN(ldcp->id, "ldc_reg_callback: (0x%llx) callback exists\n", in ldc_reg_callback()
3298 ldcp->id); in ldc_reg_callback()
3299 mutex_exit(&ldcp->lock); in ldc_reg_callback()
3302 if (ldcp->cb_inprogress) { in ldc_reg_callback()
3303 DWARN(ldcp->id, "ldc_reg_callback: (0x%llx) callback active\n", in ldc_reg_callback()
3304 ldcp->id); in ldc_reg_callback()
3305 mutex_exit(&ldcp->lock); in ldc_reg_callback()
3309 ldcp->cb = cb; in ldc_reg_callback()
3310 ldcp->cb_arg = arg; in ldc_reg_callback()
3311 ldcp->cb_enabled = B_TRUE; in ldc_reg_callback()
3313 D1(ldcp->id, in ldc_reg_callback()
3315 ldcp->id); in ldc_reg_callback()
3317 mutex_exit(&ldcp->lock); in ldc_reg_callback()
3328 ldc_chan_t *ldcp; in ldc_unreg_callback() local
3335 ldcp = (ldc_chan_t *)handle; in ldc_unreg_callback()
3337 mutex_enter(&ldcp->lock); in ldc_unreg_callback()
3339 if (ldcp->cb == NULL) { in ldc_unreg_callback()
3340 DWARN(ldcp->id, in ldc_unreg_callback()
3342 ldcp->id); in ldc_unreg_callback()
3343 mutex_exit(&ldcp->lock); in ldc_unreg_callback()
3346 if (ldcp->cb_inprogress) { in ldc_unreg_callback()
3347 DWARN(ldcp->id, in ldc_unreg_callback()
3349 ldcp->id); in ldc_unreg_callback()
3350 mutex_exit(&ldcp->lock); in ldc_unreg_callback()
3354 ldcp->cb = NULL; in ldc_unreg_callback()
3355 ldcp->cb_arg = NULL; in ldc_unreg_callback()
3356 ldcp->cb_enabled = B_FALSE; in ldc_unreg_callback()
3358 D1(ldcp->id, in ldc_unreg_callback()
3360 ldcp->id); in ldc_unreg_callback()
3362 mutex_exit(&ldcp->lock); in ldc_unreg_callback()
3377 ldc_chan_t *ldcp; in ldc_up() local
3385 ldcp = (ldc_chan_t *)handle; in ldc_up()
3387 mutex_enter(&ldcp->lock); in ldc_up()
3389 D1(ldcp->id, "ldc_up: (0x%llx) doing channel UP\n", ldcp->id); in ldc_up()
3392 tstate = ldcp->tstate; in ldc_up()
3393 ldcp->tstate &= ~TS_IN_RESET; in ldc_up()
3395 if (ldcp->tstate == TS_UP) { in ldc_up()
3396 DWARN(ldcp->id, in ldc_up()
3398 ldcp->id); in ldc_up()
3401 ldcp->status = LDC_UP; in ldc_up()
3410 ldcp->rx_intr_state == LDC_INTR_PEND) { in ldc_up()
3411 D1(ldcp->id, in ldc_up()
3413 "clearing interrupt\n", ldcp->id); in ldc_up()
3414 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in ldc_up()
3417 mutex_exit(&ldcp->lock); in ldc_up()
3422 if (ldcp->mode == LDC_MODE_RAW && ldcp->tstate >= TS_READY) { in ldc_up()
3423 ldcp->tstate = TS_UP; in ldc_up()
3424 mutex_exit(&ldcp->lock); in ldc_up()
3429 if (ldcp->hstate) { in ldc_up()
3430 D1(ldcp->id, in ldc_up()
3432 ldcp->id); in ldc_up()
3433 mutex_exit(&ldcp->lock); in ldc_up()
3437 mutex_enter(&ldcp->tx_lock); in ldc_up()
3440 link_state = ldcp->link_state; in ldc_up()
3443 rv = i_ldc_get_tx_tail(ldcp, &tx_tail); in ldc_up()
3445 D1(ldcp->id, "ldc_up: (0x%llx) cannot initiate handshake\n", in ldc_up()
3446 ldcp->id); in ldc_up()
3447 mutex_exit(&ldcp->tx_lock); in ldc_up()
3448 mutex_exit(&ldcp->lock); in ldc_up()
3458 (link_state != ldcp->link_state)) { in ldc_up()
3460 ASSERT((ldcp->link_state == LDC_CHANNEL_RESET) || in ldc_up()
3461 (ldcp->link_state == LDC_CHANNEL_UP)); in ldc_up()
3463 if (ldcp->mode == LDC_MODE_RAW) { in ldc_up()
3464 ldcp->status = LDC_UP; in ldc_up()
3465 ldcp->tstate = TS_UP; in ldc_up()
3466 mutex_exit(&ldcp->tx_lock); in ldc_up()
3467 mutex_exit(&ldcp->lock); in ldc_up()
3470 ldcp->status = LDC_READY; in ldc_up()
3471 ldcp->tstate |= TS_LINK_READY; in ldc_up()
3476 ldcmsg = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in ldc_up()
3482 ldcp->next_vidx = 0; in ldc_up()
3485 DUMP_LDC_PKT(ldcp, "ldc_up snd ver", (uint64_t)ldcmsg); in ldc_up()
3489 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in ldc_up()
3491 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in ldc_up()
3493 DWARN(ldcp->id, in ldc_up()
3495 ldcp->id, rv); in ldc_up()
3496 mutex_exit(&ldcp->tx_lock); in ldc_up()
3497 mutex_exit(&ldcp->lock); in ldc_up()
3501 ldcp->hstate |= TS_SENT_VER; in ldc_up()
3502 ldcp->tx_tail = tx_tail; in ldc_up()
3503 D1(ldcp->id, "ldc_up: (0x%llx) channel up initiated\n", ldcp->id); in ldc_up()
3505 mutex_exit(&ldcp->tx_lock); in ldc_up()
3506 mutex_exit(&ldcp->lock); in ldc_up()
3518 ldc_chan_t *ldcp; in ldc_down() local
3524 ldcp = (ldc_chan_t *)handle; in ldc_down()
3525 mutex_enter(&ldcp->lock); in ldc_down()
3526 mutex_enter(&ldcp->tx_lock); in ldc_down()
3527 i_ldc_reset(ldcp, B_TRUE); in ldc_down()
3528 mutex_exit(&ldcp->tx_lock); in ldc_down()
3529 mutex_exit(&ldcp->lock); in ldc_down()
3540 ldc_chan_t *ldcp; in ldc_status() local
3546 ldcp = (ldc_chan_t *)handle; in ldc_status()
3550 D1(ldcp->id, in ldc_status()
3551 "ldc_status: (0x%llx) returned status %d\n", ldcp->id, *status); in ldc_status()
3562 ldc_chan_t *ldcp; in ldc_set_cb_mode() local
3569 ldcp = (ldc_chan_t *)handle; in ldc_set_cb_mode()
3574 mutex_enter(&ldcp->lock); in ldc_set_cb_mode()
3578 if (!ldcp->cb_enabled) { in ldc_set_cb_mode()
3579 DWARN(ldcp->id, in ldc_set_cb_mode()
3581 ldcp->id); in ldc_set_cb_mode()
3584 ldcp->cb_enabled = B_FALSE; in ldc_set_cb_mode()
3586 D1(ldcp->id, "ldc_set_cb_mode: (0x%llx) disabled callbacks\n", in ldc_set_cb_mode()
3587 ldcp->id); in ldc_set_cb_mode()
3591 if (ldcp->cb_enabled) { in ldc_set_cb_mode()
3592 DWARN(ldcp->id, in ldc_set_cb_mode()
3594 ldcp->id); in ldc_set_cb_mode()
3597 ldcp->cb_enabled = B_TRUE; in ldc_set_cb_mode()
3599 D1(ldcp->id, "ldc_set_cb_mode: (0x%llx) enabled callbacks\n", in ldc_set_cb_mode()
3600 ldcp->id); in ldc_set_cb_mode()
3604 mutex_exit(&ldcp->lock); in ldc_set_cb_mode()
3618 ldc_chan_t *ldcp; in ldc_chkq() local
3624 ldcp = (ldc_chan_t *)handle; in ldc_chkq()
3628 mutex_enter(&ldcp->lock); in ldc_chkq()
3630 if (ldcp->tstate != TS_UP) { in ldc_chkq()
3631 D1(ldcp->id, in ldc_chkq()
3632 "ldc_chkq: (0x%llx) channel is not up\n", ldcp->id); in ldc_chkq()
3633 mutex_exit(&ldcp->lock); in ldc_chkq()
3638 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in ldc_chkq()
3639 &ldcp->link_state); in ldc_chkq()
3642 "ldc_chkq: (0x%lx) unable to read queue ptrs", ldcp->id); in ldc_chkq()
3643 mutex_exit(&ldcp->lock); in ldc_chkq()
3648 if (ldcp->link_state == LDC_CHANNEL_DOWN || in ldc_chkq()
3649 ldcp->link_state == LDC_CHANNEL_RESET) { in ldc_chkq()
3650 mutex_enter(&ldcp->tx_lock); in ldc_chkq()
3651 i_ldc_reset(ldcp, B_FALSE); in ldc_chkq()
3652 mutex_exit(&ldcp->tx_lock); in ldc_chkq()
3653 mutex_exit(&ldcp->lock); in ldc_chkq()
3657 switch (ldcp->mode) { in ldc_chkq()
3673 *hasdata = (i_ldc_chkq(ldcp) == 0); in ldc_chkq()
3683 ldcp->rx_intr_state == LDC_INTR_PEND) { in ldc_chkq()
3684 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in ldc_chkq()
3695 if (ldcp->stream_remains > 0) in ldc_chkq()
3698 *hasdata = (ldcp->rx_dq_head != ldcp->rx_dq_tail); in ldc_chkq()
3703 "(0x%x)", ldcp->id, ldcp->mode); in ldc_chkq()
3704 mutex_exit(&ldcp->lock); in ldc_chkq()
3708 mutex_exit(&ldcp->lock); in ldc_chkq()
3723 ldc_chan_t *ldcp; in ldc_read() local
3732 ldcp = (ldc_chan_t *)handle; in ldc_read()
3735 mutex_enter(&ldcp->lock); in ldc_read()
3737 if (ldcp->tstate != TS_UP) { in ldc_read()
3738 DWARN(ldcp->id, in ldc_read()
3740 ldcp->id); in ldc_read()
3742 } else if (ldcp->mode == LDC_MODE_RELIABLE) { in ldc_read()
3743 TRACE_RXDQ_LENGTH(ldcp); in ldc_read()
3744 exit_val = ldcp->read_p(ldcp, bufp, sizep); in ldc_read()
3755 if (ldcp->rx_intr_state == LDC_INTR_PEND && in ldc_read()
3756 Q_CONTIG_SPACE(ldcp->rx_dq_head, ldcp->rx_dq_tail, in ldc_read()
3757 ldcp->rx_dq_entries << LDC_PACKET_SHIFT) >= in ldc_read()
3760 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in ldc_read()
3763 mutex_exit(&ldcp->lock); in ldc_read()
3766 exit_val = ldcp->read_p(ldcp, bufp, sizep); in ldc_read()
3772 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in ldc_read()
3773 &ldcp->link_state); in ldc_read()
3776 ldcp->id); in ldc_read()
3777 mutex_enter(&ldcp->tx_lock); in ldc_read()
3778 i_ldc_reset(ldcp, B_TRUE); in ldc_read()
3779 mutex_exit(&ldcp->tx_lock); in ldc_read()
3780 mutex_exit(&ldcp->lock); in ldc_read()
3785 if (ldcp->link_state == LDC_CHANNEL_DOWN || in ldc_read()
3786 ldcp->link_state == LDC_CHANNEL_RESET) { in ldc_read()
3787 mutex_enter(&ldcp->tx_lock); in ldc_read()
3788 i_ldc_reset(ldcp, B_FALSE); in ldc_read()
3790 mutex_exit(&ldcp->tx_lock); in ldc_read()
3793 (ldcp->rx_intr_state == LDC_INTR_PEND) && in ldc_read()
3795 i_ldc_clear_intr(ldcp, CNEX_RX_INTR); in ldc_read()
3799 mutex_exit(&ldcp->lock); in ldc_read()
3810 i_ldc_read_raw(ldc_chan_t *ldcp, caddr_t target_bufp, size_t *sizep) in i_ldc_read_raw() argument
3823 ASSERT(mutex_owned(&ldcp->lock)); in i_ldc_read_raw()
3826 q_size_mask = (ldcp->rx_q_entries-1)<<LDC_PACKET_SHIFT; in i_ldc_read_raw()
3831 rv = hv_ldc_rx_get_state(ldcp->id, &rx_head, &rx_tail, in i_ldc_read_raw()
3832 &ldcp->link_state); in i_ldc_read_raw()
3836 ldcp->id); in i_ldc_read_raw()
3839 D1(ldcp->id, "ldc_read_raw: (0x%llx) rxh=0x%llx," in i_ldc_read_raw()
3841 ldcp->id, rx_head, rx_tail, ldcp->link_state); in i_ldc_read_raw()
3844 if (ldcp->link_state == LDC_CHANNEL_DOWN || in i_ldc_read_raw()
3845 ldcp->link_state == LDC_CHANNEL_RESET) { in i_ldc_read_raw()
3846 mutex_enter(&ldcp->tx_lock); in i_ldc_read_raw()
3847 i_ldc_reset(ldcp, B_FALSE); in i_ldc_read_raw()
3848 mutex_exit(&ldcp->tx_lock); in i_ldc_read_raw()
3861 msgp = (ldc_msg_t *)(ldcp->rx_q_va + rx_head); in i_ldc_read_raw()
3868 DUMP_PAYLOAD(ldcp->id, msgbufp); in i_ldc_read_raw()
3873 rv = i_ldc_set_rx_head(ldcp, rx_head); in i_ldc_read_raw()
3885 i_ldc_read_packet(ldc_chan_t *ldcp, caddr_t target_bufp, size_t *sizep) in i_ldc_read_packet() argument
3899 ASSERT(mutex_owned(&ldcp->lock)); in i_ldc_read_packet()
3903 DWARN(ldcp->id, "ldc_read: (0x%llx) invalid buffer/size\n", in i_ldc_read_packet()
3904 ldcp->id); in i_ldc_read_packet()
3909 if (ldcp->mode == LDC_MODE_RELIABLE) { in i_ldc_read_packet()
3910 q_va = ldcp->rx_dq_va; in i_ldc_read_packet()
3911 q_size_mask = (ldcp->rx_dq_entries-1)<<LDC_PACKET_SHIFT; in i_ldc_read_packet()
3913 q_va = ldcp->rx_q_va; in i_ldc_read_packet()
3914 q_size_mask = (ldcp->rx_q_entries-1)<<LDC_PACKET_SHIFT; in i_ldc_read_packet()
3920 rv = ldcp->readq_get_state(ldcp, &curr_head, &rx_tail, in i_ldc_read_packet()
3921 &ldcp->link_state); in i_ldc_read_packet()
3924 ldcp->id); in i_ldc_read_packet()
3925 mutex_enter(&ldcp->tx_lock); in i_ldc_read_packet()
3926 i_ldc_reset(ldcp, B_TRUE); in i_ldc_read_packet()
3927 mutex_exit(&ldcp->tx_lock); in i_ldc_read_packet()
3930 D1(ldcp->id, "ldc_read: (0x%llx) chd=0x%llx, tl=0x%llx, st=0x%llx\n", in i_ldc_read_packet()
3931 ldcp->id, curr_head, rx_tail, ldcp->link_state); in i_ldc_read_packet()
3934 if (ldcp->link_state != LDC_CHANNEL_UP) in i_ldc_read_packet()
3945 if (ldcp->mode == LDC_MODE_RELIABLE) in i_ldc_read_packet()
3946 (void) i_ldc_chkq(ldcp); in i_ldc_read_packet()
3948 rv = ldcp->readq_get_state(ldcp, in i_ldc_read_packet()
3949 &rx_head, &rx_tail, &ldcp->link_state); in i_ldc_read_packet()
3953 ldcp->id); in i_ldc_read_packet()
3954 mutex_enter(&ldcp->tx_lock); in i_ldc_read_packet()
3955 i_ldc_reset(ldcp, B_TRUE); in i_ldc_read_packet()
3956 mutex_exit(&ldcp->tx_lock); in i_ldc_read_packet()
3960 if (ldcp->link_state != LDC_CHANNEL_UP) in i_ldc_read_packet()
3975 if (ldcp->mode != LDC_MODE_RELIABLE) in i_ldc_read_packet()
3976 ldcp->last_msg_rcd = in i_ldc_read_packet()
3979 "(0x%llx) read timeout", ldcp->id); in i_ldc_read_packet()
3988 D2(ldcp->id, in i_ldc_read_packet()
3990 ldcp->id, curr_head, rx_head, rx_tail); in i_ldc_read_packet()
3995 DUMP_LDC_PKT(ldcp, "ldc_read received pkt", in i_ldc_read_packet()
3996 ldcp->rx_q_va + curr_head); in i_ldc_read_packet()
3999 if (ldcp->mode != LDC_MODE_RELIABLE) { in i_ldc_read_packet()
4000 if ((rv = i_ldc_check_seqid(ldcp, msg)) != 0) { in i_ldc_read_packet()
4002 DWARN(ldcp->id, "ldc_read: (0x%llx) seqid " in i_ldc_read_packet()
4004 ldcp->id, rx_head, rx_tail); in i_ldc_read_packet()
4011 ldcp->last_msg_rcd = first_fragment - 1; in i_ldc_read_packet()
4018 rv = i_ldc_send_pkt(ldcp, msg->type, LDC_NACK, in i_ldc_read_packet()
4023 "NACK msg\n", ldcp->id); in i_ldc_read_packet()
4026 mutex_enter(&ldcp->tx_lock); in i_ldc_read_packet()
4027 i_ldc_reset(ldcp, B_FALSE); in i_ldc_read_packet()
4028 mutex_exit(&ldcp->tx_lock); in i_ldc_read_packet()
4034 rv = i_ldc_set_rx_head(ldcp, rx_tail); in i_ldc_read_packet()
4048 if (rv = i_ldc_ctrlmsg(ldcp, msg)) { in i_ldc_read_packet()
4051 rv = i_ldc_set_rx_head(ldcp, rx_tail); in i_ldc_read_packet()
4060 if (rv = i_ldc_process_data_ACK(ldcp, msg)) { in i_ldc_read_packet()
4069 DWARN(ldcp->id, in i_ldc_read_packet()
4071 ldcp->id); in i_ldc_read_packet()
4072 mutex_enter(&ldcp->tx_lock); in i_ldc_read_packet()
4073 i_ldc_reset(ldcp, B_TRUE); in i_ldc_read_packet()
4074 mutex_exit(&ldcp->tx_lock); in i_ldc_read_packet()
4083 (ldcp->mode == LDC_MODE_RELIABLE) ? in i_ldc_read_packet()
4086 D2(ldcp->id, in i_ldc_read_packet()
4087 "ldc_read: (0x%llx) received data msg\n", ldcp->id); in i_ldc_read_packet()
4112 "frag=%x\n", ldcp->id, in i_ldc_read_packet()
4121 if (rv = ldcp->readq_set_head(ldcp, in i_ldc_read_packet()
4136 ldcp->id, msg->env&LDC_FRAG_MASK, in i_ldc_read_packet()
4137 bytes_read, ldcp->last_msg_rcd, in i_ldc_read_packet()
4145 if (rv = ldcp->readq_set_head(ldcp, in i_ldc_read_packet()
4164 "head=0x%lx, expect=%d, got=%d\n", ldcp->id, in i_ldc_read_packet()
4172 if (rv = ldcp->readq_set_head(ldcp, curr_head)) in i_ldc_read_packet()
4181 if (ldcp->mode != LDC_MODE_RELIABLE) in i_ldc_read_packet()
4182 ldcp->last_msg_rcd = msg->seqid; in i_ldc_read_packet()
4196 if (rv = ldcp->readq_set_head(ldcp, curr_head)) in i_ldc_read_packet()
4209 if (rv = ldcp->readq_set_head(ldcp, curr_head)) { in i_ldc_read_packet()
4214 D2(ldcp->id, "ldc_read: (0x%llx) set ACK qhead 0x%llx", in i_ldc_read_packet()
4215 ldcp->id, curr_head); in i_ldc_read_packet()
4220 D2(ldcp->id, "ldc_read: (0x%llx) end size=%d", ldcp->id, *sizep); in i_ldc_read_packet()
4225 mutex_enter(&ldcp->tx_lock); in i_ldc_read_packet()
4226 i_ldc_reset(ldcp, B_FALSE); in i_ldc_read_packet()
4227 mutex_exit(&ldcp->tx_lock); in i_ldc_read_packet()
4238 i_ldc_read_stream(ldc_chan_t *ldcp, caddr_t target_bufp, size_t *sizep) in i_ldc_read_stream() argument
4243 ASSERT(mutex_owned(&ldcp->lock)); in i_ldc_read_stream()
4245 D2(ldcp->id, "i_ldc_read_stream: (0x%llx) buffer size=%d", in i_ldc_read_stream()
4246 ldcp->id, *sizep); in i_ldc_read_stream()
4248 if (ldcp->stream_remains == 0) { in i_ldc_read_stream()
4249 size = ldcp->mtu; in i_ldc_read_stream()
4250 rv = i_ldc_read_packet(ldcp, in i_ldc_read_stream()
4251 (caddr_t)ldcp->stream_bufferp, &size); in i_ldc_read_stream()
4252 D2(ldcp->id, "i_ldc_read_stream: read packet (0x%llx) size=%d", in i_ldc_read_stream()
4253 ldcp->id, size); in i_ldc_read_stream()
4258 ldcp->stream_remains = size; in i_ldc_read_stream()
4259 ldcp->stream_offset = 0; in i_ldc_read_stream()
4262 size = MIN(ldcp->stream_remains, *sizep); in i_ldc_read_stream()
4264 bcopy(ldcp->stream_bufferp + ldcp->stream_offset, target_bufp, size); in i_ldc_read_stream()
4265 ldcp->stream_offset += size; in i_ldc_read_stream()
4266 ldcp->stream_remains -= size; in i_ldc_read_stream()
4268 D2(ldcp->id, "i_ldc_read_stream: (0x%llx) fill from buffer size=%d", in i_ldc_read_stream()
4269 ldcp->id, size); in i_ldc_read_stream()
4286 ldc_chan_t *ldcp; in ldc_write() local
4293 ldcp = (ldc_chan_t *)handle; in ldc_write()
4295 mutex_enter(&ldcp->tx_lock); in ldc_write()
4299 DWARN(ldcp->id, "ldc_write: (0x%llx) invalid data write\n", in ldc_write()
4300 ldcp->id); in ldc_write()
4301 mutex_exit(&ldcp->tx_lock); in ldc_write()
4306 DWARN(ldcp->id, "ldc_write: (0x%llx) write size of zero\n", in ldc_write()
4307 ldcp->id); in ldc_write()
4308 mutex_exit(&ldcp->tx_lock); in ldc_write()
4313 if (ldcp->tstate != TS_UP) { in ldc_write()
4314 DWARN(ldcp->id, in ldc_write()
4316 ldcp->id); in ldc_write()
4320 rv = ldcp->write_p(ldcp, buf, sizep); in ldc_write()
4323 mutex_exit(&ldcp->tx_lock); in ldc_write()
4333 i_ldc_write_raw(ldc_chan_t *ldcp, caddr_t buf, size_t *sizep) in i_ldc_write_raw() argument
4340 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_write_raw()
4341 ASSERT(ldcp->mode == LDC_MODE_RAW); in i_ldc_write_raw()
4349 if (size > ldcp->pkt_payload) { in i_ldc_write_raw()
4350 DWARN(ldcp->id, in i_ldc_write_raw()
4352 ldcp->id, *sizep); in i_ldc_write_raw()
4358 rv = hv_ldc_tx_get_state(ldcp->id, in i_ldc_write_raw()
4359 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in i_ldc_write_raw()
4362 "ldc_write: (0x%lx) cannot read queue ptrs\n", ldcp->id); in i_ldc_write_raw()
4367 if (ldcp->link_state == LDC_CHANNEL_DOWN || in i_ldc_write_raw()
4368 ldcp->link_state == LDC_CHANNEL_RESET) { in i_ldc_write_raw()
4369 DWARN(ldcp->id, in i_ldc_write_raw()
4370 "ldc_write: (0x%llx) channel down/reset\n", ldcp->id); in i_ldc_write_raw()
4373 if (mutex_tryenter(&ldcp->lock)) { in i_ldc_write_raw()
4374 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_raw()
4375 mutex_exit(&ldcp->lock); in i_ldc_write_raw()
4381 mutex_exit(&ldcp->tx_lock); in i_ldc_write_raw()
4382 mutex_enter(&ldcp->lock); in i_ldc_write_raw()
4383 mutex_enter(&ldcp->tx_lock); in i_ldc_write_raw()
4384 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_raw()
4385 mutex_exit(&ldcp->lock); in i_ldc_write_raw()
4390 tx_tail = ldcp->tx_tail; in i_ldc_write_raw()
4391 tx_head = ldcp->tx_head; in i_ldc_write_raw()
4393 ((ldcp->tx_q_entries-1) << LDC_PACKET_SHIFT); in i_ldc_write_raw()
4397 "ldc_write: (0x%llx) TX queue is full\n", ldcp->id); in i_ldc_write_raw()
4402 D2(ldcp->id, "ldc_write: (0x%llx) start xfer size=%d", in i_ldc_write_raw()
4403 ldcp->id, size); in i_ldc_write_raw()
4406 ldcmsg = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_write_raw()
4418 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_write_raw()
4421 DWARN(ldcp->id, "ldc_write: (0x%llx) write timed out\n", in i_ldc_write_raw()
4422 ldcp->id); in i_ldc_write_raw()
4428 if (mutex_tryenter(&ldcp->lock)) { in i_ldc_write_raw()
4429 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_raw()
4430 mutex_exit(&ldcp->lock); in i_ldc_write_raw()
4436 mutex_exit(&ldcp->tx_lock); in i_ldc_write_raw()
4437 mutex_enter(&ldcp->lock); in i_ldc_write_raw()
4438 mutex_enter(&ldcp->tx_lock); in i_ldc_write_raw()
4439 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_raw()
4440 mutex_exit(&ldcp->lock); in i_ldc_write_raw()
4445 ldcp->tx_tail = tx_tail; in i_ldc_write_raw()
4448 D2(ldcp->id, "ldc_write: (0x%llx) end xfer size=%d", ldcp->id, size); in i_ldc_write_raw()
4464 i_ldc_write_packet(ldc_chan_t *ldcp, caddr_t buf, size_t *size) in i_ldc_write_packet() argument
4474 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_write_packet()
4476 ASSERT(ldcp->mode == LDC_MODE_RELIABLE || in i_ldc_write_packet()
4477 ldcp->mode == LDC_MODE_UNRELIABLE); in i_ldc_write_packet()
4480 txq_size_mask = (ldcp->tx_q_entries - 1) << LDC_PACKET_SHIFT; in i_ldc_write_packet()
4483 rv = hv_ldc_tx_get_state(ldcp->id, in i_ldc_write_packet()
4484 &ldcp->tx_head, &ldcp->tx_tail, &ldcp->link_state); in i_ldc_write_packet()
4487 "ldc_write: (0x%lx) cannot read queue ptrs\n", ldcp->id); in i_ldc_write_packet()
4492 if (ldcp->link_state == LDC_CHANNEL_DOWN || in i_ldc_write_packet()
4493 ldcp->link_state == LDC_CHANNEL_RESET) { in i_ldc_write_packet()
4494 DWARN(ldcp->id, in i_ldc_write_packet()
4495 "ldc_write: (0x%llx) channel down/reset\n", ldcp->id); in i_ldc_write_packet()
4497 if (mutex_tryenter(&ldcp->lock)) { in i_ldc_write_packet()
4498 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_packet()
4499 mutex_exit(&ldcp->lock); in i_ldc_write_packet()
4505 mutex_exit(&ldcp->tx_lock); in i_ldc_write_packet()
4506 mutex_enter(&ldcp->lock); in i_ldc_write_packet()
4507 mutex_enter(&ldcp->tx_lock); in i_ldc_write_packet()
4508 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_packet()
4509 mutex_exit(&ldcp->lock); in i_ldc_write_packet()
4514 tx_tail = ldcp->tx_tail; in i_ldc_write_packet()
4516 (ldcp->tx_q_entries << LDC_PACKET_SHIFT); in i_ldc_write_packet()
4522 i_ldc_get_tx_head(ldcp, &tx_head); in i_ldc_write_packet()
4526 "ldc_write: (0x%llx) TX queue is full\n", ldcp->id); in i_ldc_write_packet()
4535 + ldcp->tx_q_entries - 1; in i_ldc_write_packet()
4536 numavail %= ldcp->tx_q_entries; in i_ldc_write_packet()
4538 if (*size > (numavail * ldcp->pkt_payload)) { in i_ldc_write_packet()
4540 "ldc_write: (0x%llx) TX queue has no space\n", ldcp->id); in i_ldc_write_packet()
4544 D2(ldcp->id, "ldc_write: (0x%llx) start xfer size=%d", in i_ldc_write_packet()
4545 ldcp->id, *size); in i_ldc_write_packet()
4549 curr_seqid = ldcp->last_msg_snt; in i_ldc_write_packet()
4554 ldcmsg = (ldc_msg_t *)(ldcp->tx_q_va + tx_tail); in i_ldc_write_packet()
4556 msgbuf = (uint8_t *)((ldcp->mode == LDC_MODE_RELIABLE) ? in i_ldc_write_packet()
4564 len = min(ldcp->pkt_payload, remaining); in i_ldc_write_packet()
4584 ldcmsg = (ldc_msg_t *)(ldcp->tx_q_va + start); in i_ldc_write_packet()
4591 rv = i_ldc_set_tx_tail(ldcp, tx_tail); in i_ldc_write_packet()
4593 ldcp->tx_tail = tx_tail; in i_ldc_write_packet()
4594 ldcp->last_msg_snt = curr_seqid; in i_ldc_write_packet()
4601 if (mutex_tryenter(&ldcp->lock)) { in i_ldc_write_packet()
4602 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_packet()
4603 mutex_exit(&ldcp->lock); in i_ldc_write_packet()
4609 mutex_exit(&ldcp->tx_lock); in i_ldc_write_packet()
4610 mutex_enter(&ldcp->lock); in i_ldc_write_packet()
4611 mutex_enter(&ldcp->tx_lock); in i_ldc_write_packet()
4612 i_ldc_reset(ldcp, B_FALSE); in i_ldc_write_packet()
4613 mutex_exit(&ldcp->lock); in i_ldc_write_packet()
4618 D1(ldcp->id, "hv_tx_set_tail returns 0x%x (head 0x%x, " in i_ldc_write_packet()
4620 rv, ldcp->tx_head, ldcp->tx_tail, tx_tail, in i_ldc_write_packet()
4621 (ldcp->tx_q_entries << LDC_PACKET_SHIFT)); in i_ldc_write_packet()
4623 rv2 = hv_ldc_tx_get_state(ldcp->id, in i_ldc_write_packet()
4624 &tx_head, &tx_tail, &ldcp->link_state); in i_ldc_write_packet()
4626 D1(ldcp->id, "hv_ldc_tx_get_state returns 0x%x " in i_ldc_write_packet()
4628 rv2, tx_head, tx_tail, ldcp->link_state); in i_ldc_write_packet()
4633 D2(ldcp->id, "ldc_write: (0x%llx) end xfer size=%d", ldcp->id, *size); in i_ldc_write_packet()
4648 i_ldc_write_stream(ldc_chan_t *ldcp, caddr_t buf, size_t *sizep) in i_ldc_write_stream() argument
4650 ASSERT(MUTEX_HELD(&ldcp->tx_lock)); in i_ldc_write_stream()
4651 ASSERT(ldcp->mode == LDC_MODE_RELIABLE); in i_ldc_write_stream()
4654 if (*sizep > ldcp->mtu) *sizep = ldcp->mtu; in i_ldc_write_stream()
4655 return (i_ldc_write_packet(ldcp, buf, sizep)); in i_ldc_write_stream()
4667 ldc_chan_t *ldcp; in ldc_register() local
4689 ldcp = ldcssp->chan_list; in ldc_register()
4690 while (ldcp) { in ldc_register()
4691 if ((ldcp->tstate & TS_QCONF_RDY) && in ldc_register()
4692 (ldcp->tstate & TS_CNEX_RDY) == 0) in ldc_register()
4693 (void) i_ldc_register_channel(ldcp); in ldc_register()
4695 ldcp = ldcp->next; in ldc_register()
4735 ldc_chan_t *ldcp; in ldc_info() local
4743 ldcp = (ldc_chan_t *)handle; in ldc_info()
4745 mutex_enter(&ldcp->lock); in ldc_info()
4748 if ((ldcp->tstate & ~TS_IN_RESET) < TS_INIT) { in ldc_info()
4749 DWARN(ldcp->id, in ldc_info()
4751 ldcp->id); in ldc_info()
4752 mutex_exit(&ldcp->lock); in ldc_info()
4756 mutex_exit(&ldcp->lock); in ldc_info()