Lines Matching refs:cm

212 	struct cm_dev *cm;  member
235 static int riocm_post_send(struct cm_dev *cm, struct rio_dev *rdev,
309 static void *riocm_rx_get_msg(struct cm_dev *cm) in riocm_rx_get_msg() argument
314 msg = rio_get_inb_message(cm->mport, cmbox); in riocm_rx_get_msg()
317 if (cm->rx_buf[i] == msg) { in riocm_rx_get_msg()
318 cm->rx_buf[i] = NULL; in riocm_rx_get_msg()
319 cm->rx_slots++; in riocm_rx_get_msg()
338 static void riocm_rx_fill(struct cm_dev *cm, int nent) in riocm_rx_fill() argument
342 if (cm->rx_slots == 0) in riocm_rx_fill()
345 for (i = 0; i < RIOCM_RX_RING_SIZE && cm->rx_slots && nent; i++) { in riocm_rx_fill()
346 if (cm->rx_buf[i] == NULL) { in riocm_rx_fill()
347 cm->rx_buf[i] = kmalloc(RIO_MAX_MSG_SIZE, GFP_KERNEL); in riocm_rx_fill()
348 if (cm->rx_buf[i] == NULL) in riocm_rx_fill()
350 rio_add_inb_buffer(cm->mport, cmbox, cm->rx_buf[i]); in riocm_rx_fill()
351 cm->rx_slots--; in riocm_rx_fill()
363 static void riocm_rx_free(struct cm_dev *cm) in riocm_rx_free() argument
368 if (cm->rx_buf[i] != NULL) { in riocm_rx_free()
369 kfree(cm->rx_buf[i]); in riocm_rx_free()
370 cm->rx_buf[i] = NULL; in riocm_rx_free()
385 static int riocm_req_handler(struct cm_dev *cm, void *req_data) in riocm_req_handler() argument
413 req->cmdev = cm; in riocm_req_handler()
495 static void rio_cm_handler(struct cm_dev *cm, void *data) in rio_cm_handler() argument
499 if (!rio_mport_is_running(cm->mport)) in rio_cm_handler()
509 riocm_req_handler(cm, data); in rio_cm_handler()
535 static int rio_rx_data_handler(struct cm_dev *cm, void *buf) in rio_rx_data_handler() argument
591 struct cm_dev *cm = container_of(work, struct cm_dev, rx_work); in rio_ibmsg_handler() local
595 if (!rio_mport_is_running(cm->mport)) in rio_ibmsg_handler()
599 mutex_lock(&cm->rx_lock); in rio_ibmsg_handler()
600 data = riocm_rx_get_msg(cm); in rio_ibmsg_handler()
602 riocm_rx_fill(cm, 1); in rio_ibmsg_handler()
603 mutex_unlock(&cm->rx_lock); in rio_ibmsg_handler()
620 rio_rx_data_handler(cm, data); in rio_ibmsg_handler()
622 rio_cm_handler(cm, data); in rio_ibmsg_handler()
629 struct cm_dev *cm = dev_id; in riocm_inb_msg_event() local
631 if (rio_mport_is_running(cm->mport) && !work_pending(&cm->rx_work)) in riocm_inb_msg_event()
632 queue_work(cm->rx_wq, &cm->rx_work); in riocm_inb_msg_event()
644 static void rio_txcq_handler(struct cm_dev *cm, int slot) in rio_txcq_handler() argument
653 cm->mport->id, slot, cm->tx_cnt); in rio_txcq_handler()
655 spin_lock(&cm->tx_lock); in rio_txcq_handler()
656 ack_slot = cm->tx_ack_slot; in rio_txcq_handler()
661 while (cm->tx_cnt && ((ack_slot != slot) || in rio_txcq_handler()
662 (cm->tx_cnt == RIOCM_TX_RING_SIZE))) { in rio_txcq_handler()
664 cm->tx_buf[ack_slot] = NULL; in rio_txcq_handler()
667 cm->tx_cnt--; in rio_txcq_handler()
670 if (cm->tx_cnt < 0 || cm->tx_cnt > RIOCM_TX_RING_SIZE) in rio_txcq_handler()
671 riocm_error("tx_cnt %d out of sync", cm->tx_cnt); in rio_txcq_handler()
673 WARN_ON((cm->tx_cnt < 0) || (cm->tx_cnt > RIOCM_TX_RING_SIZE)); in rio_txcq_handler()
675 cm->tx_ack_slot = ack_slot; in rio_txcq_handler()
680 if (!list_empty(&cm->tx_reqs) && (cm->tx_cnt < RIOCM_TX_RING_SIZE)) { in rio_txcq_handler()
684 list_for_each_entry_safe(req, _req, &cm->tx_reqs, node) { in rio_txcq_handler()
686 cm->tx_buf[cm->tx_slot] = req->buffer; in rio_txcq_handler()
687 rc = rio_add_outb_message(cm->mport, req->rdev, cmbox, in rio_txcq_handler()
692 ++cm->tx_cnt; in rio_txcq_handler()
693 ++cm->tx_slot; in rio_txcq_handler()
694 cm->tx_slot &= (RIOCM_TX_RING_SIZE - 1); in rio_txcq_handler()
695 if (cm->tx_cnt == RIOCM_TX_RING_SIZE) in rio_txcq_handler()
700 spin_unlock(&cm->tx_lock); in rio_txcq_handler()
706 struct cm_dev *cm = dev_id; in riocm_outb_msg_event() local
708 if (cm && rio_mport_is_running(cm->mport)) in riocm_outb_msg_event()
709 rio_txcq_handler(cm, slot); in riocm_outb_msg_event()
712 static int riocm_queue_req(struct cm_dev *cm, struct rio_dev *rdev, in riocm_queue_req() argument
726 spin_lock_irqsave(&cm->tx_lock, flags); in riocm_queue_req()
727 list_add_tail(&treq->node, &cm->tx_reqs); in riocm_queue_req()
728 spin_unlock_irqrestore(&cm->tx_lock, flags); in riocm_queue_req()
742 static int riocm_post_send(struct cm_dev *cm, struct rio_dev *rdev, in riocm_post_send() argument
748 spin_lock_irqsave(&cm->tx_lock, flags); in riocm_post_send()
750 if (cm->mport == NULL) { in riocm_post_send()
755 if (cm->tx_cnt == RIOCM_TX_RING_SIZE) { in riocm_post_send()
761 cm->tx_buf[cm->tx_slot] = buffer; in riocm_post_send()
762 rc = rio_add_outb_message(cm->mport, rdev, cmbox, buffer, len); in riocm_post_send()
765 buffer, rdev->destid, cm->tx_slot, cm->tx_cnt); in riocm_post_send()
767 ++cm->tx_cnt; in riocm_post_send()
768 ++cm->tx_slot; in riocm_post_send()
769 cm->tx_slot &= (RIOCM_TX_RING_SIZE - 1); in riocm_post_send()
772 spin_unlock_irqrestore(&cm->tx_lock, flags); in riocm_post_send()
951 static int riocm_ch_connect(u16 loc_ch, struct cm_dev *cm, in riocm_ch_connect() argument
968 ch->cmdev = cm; in riocm_ch_connect()
971 ch->loc_destid = cm->mport->host_deviceid; in riocm_ch_connect()
998 ret = riocm_post_send(cm, peer->rdev, hdr, sizeof(*hdr)); in riocm_ch_connect()
1003 ret = riocm_queue_req(cm, peer->rdev, hdr, sizeof(*hdr)); in riocm_ch_connect()
1238 struct cm_dev *cm; in riocm_ch_bind() local
1245 list_for_each_entry(cm, &cm_dev_list, list) { in riocm_ch_bind()
1246 if ((cm->mport->id == mport_id) && in riocm_ch_bind()
1247 rio_mport_is_running(cm->mport)) { in riocm_ch_bind()
1269 ch->cmdev = cm; in riocm_ch_bind()
1270 ch->loc_destid = cm->mport->host_deviceid; in riocm_ch_bind()
1541 struct cm_dev *cm; in cm_ep_get_list_size() local
1550 list_for_each_entry(cm, &cm_dev_list, list) { in cm_ep_get_list_size()
1551 if (cm->mport->id == mport_id) { in cm_ep_get_list_size()
1552 count = cm->npeers; in cm_ep_get_list_size()
1569 struct cm_dev *cm; in cm_ep_get_list() local
1586 list_for_each_entry(cm, &cm_dev_list, list) in cm_ep_get_list()
1587 if (cm->mport->id == (u8)info[1]) in cm_ep_get_list()
1594 nent = min(info[0], cm->npeers); in cm_ep_get_list()
1603 list_for_each_entry(peer, &cm->peers, node) { in cm_ep_get_list()
1628 struct cm_dev *cm; in cm_mport_get_list() local
1643 list_for_each_entry(cm, &cm_dev_list, list) { in cm_mport_get_list()
1645 *entry_ptr = (cm->mport->id << 16) | in cm_mport_get_list()
1646 cm->mport->host_deviceid; in cm_mport_get_list()
1788 struct cm_dev *cm; in cm_chan_connect() local
1800 list_for_each_entry(cm, &cm_dev_list, list) { in cm_chan_connect()
1801 if (cm->mport->id == chan.mport_id) { in cm_chan_connect()
1810 if (chan.remote_destid >= RIO_ANY_DESTID(cm->mport->sys_size)) { in cm_chan_connect()
1818 list_for_each_entry(peer, &cm->peers, node) { in cm_chan_connect()
1830 return riocm_ch_connect(chan.id, cm, peer, chan.remote_channel); in cm_chan_connect()
1955 struct cm_dev *cm; in riocm_add_dev() local
1969 list_for_each_entry(cm, &cm_dev_list, list) { in riocm_add_dev()
1970 if (cm->mport == rdev->net->hport) in riocm_add_dev()
1980 list_add_tail(&peer->node, &cm->peers); in riocm_add_dev()
1981 cm->npeers++; in riocm_add_dev()
1998 struct cm_dev *cm; in riocm_remove_dev() local
2013 list_for_each_entry(cm, &cm_dev_list, list) { in riocm_remove_dev()
2014 if (cm->mport == rdev->net->hport) { in riocm_remove_dev()
2027 list_for_each_entry(peer, &cm->peers, node) { in riocm_remove_dev()
2032 cm->npeers--; in riocm_remove_dev()
2107 struct cm_dev *cm; in riocm_add_mport() local
2112 cm = kzalloc(sizeof(*cm), GFP_KERNEL); in riocm_add_mport()
2113 if (!cm) in riocm_add_mport()
2116 cm->mport = mport; in riocm_add_mport()
2118 rc = rio_request_outb_mbox(mport, cm, cmbox, in riocm_add_mport()
2123 kfree(cm); in riocm_add_mport()
2127 rc = rio_request_inb_mbox(mport, cm, cmbox, in riocm_add_mport()
2133 kfree(cm); in riocm_add_mport()
2142 cm->rx_buf[i] = NULL; in riocm_add_mport()
2144 cm->rx_slots = RIOCM_RX_RING_SIZE; in riocm_add_mport()
2145 mutex_init(&cm->rx_lock); in riocm_add_mport()
2146 riocm_rx_fill(cm, RIOCM_RX_RING_SIZE); in riocm_add_mport()
2147 cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); in riocm_add_mport()
2148 INIT_WORK(&cm->rx_work, rio_ibmsg_handler); in riocm_add_mport()
2150 cm->tx_slot = 0; in riocm_add_mport()
2151 cm->tx_cnt = 0; in riocm_add_mport()
2152 cm->tx_ack_slot = 0; in riocm_add_mport()
2153 spin_lock_init(&cm->tx_lock); in riocm_add_mport()
2155 INIT_LIST_HEAD(&cm->peers); in riocm_add_mport()
2156 cm->npeers = 0; in riocm_add_mport()
2157 INIT_LIST_HEAD(&cm->tx_reqs); in riocm_add_mport()
2160 list_add_tail(&cm->list, &cm_dev_list); in riocm_add_mport()
2179 struct cm_dev *cm; in riocm_remove_mport() local
2190 list_for_each_entry(cm, &cm_dev_list, list) { in riocm_remove_mport()
2191 if (cm->mport == mport) { in riocm_remove_mport()
2192 list_del(&cm->list); in riocm_remove_mport()
2201 flush_workqueue(cm->rx_wq); in riocm_remove_mport()
2202 destroy_workqueue(cm->rx_wq); in riocm_remove_mport()
2207 if (ch->cmdev == cm) { in riocm_remove_mport()
2227 if (!list_empty(&cm->peers)) in riocm_remove_mport()
2229 list_for_each_entry_safe(peer, temp, &cm->peers, node) { in riocm_remove_mport()
2235 riocm_rx_free(cm); in riocm_remove_mport()
2236 kfree(cm); in riocm_remove_mport()