in rio_cm.c [2095:2164]
static int riocm_add_mport(struct device *dev,
struct class_interface *class_intf)
{
int rc;
int i;
struct cm_dev *cm;
struct rio_mport *mport = to_rio_mport(dev);
riocm_debug(MPORT, "add mport %s", mport->name);
cm = kzalloc(sizeof(*cm), GFP_KERNEL);
if (!cm)
return -ENOMEM;
cm->mport = mport;
rc = rio_request_outb_mbox(mport, cm, cmbox,
RIOCM_TX_RING_SIZE, riocm_outb_msg_event);
if (rc) {
riocm_error("failed to allocate OBMBOX_%d on %s",
cmbox, mport->name);
kfree(cm);
return -ENODEV;
}
rc = rio_request_inb_mbox(mport, cm, cmbox,
RIOCM_RX_RING_SIZE, riocm_inb_msg_event);
if (rc) {
riocm_error("failed to allocate IBMBOX_%d on %s",
cmbox, mport->name);
rio_release_outb_mbox(mport, cmbox);
kfree(cm);
return -ENODEV;
}
cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
if (!cm->rx_wq) {
rio_release_inb_mbox(mport, cmbox);
rio_release_outb_mbox(mport, cmbox);
kfree(cm);
return -ENOMEM;
}
/*
* Allocate and register inbound messaging buffers to be ready
* to receive channel and system management requests
*/
for (i = 0; i < RIOCM_RX_RING_SIZE; i++)
cm->rx_buf[i] = NULL;
cm->rx_slots = RIOCM_RX_RING_SIZE;
mutex_init(&cm->rx_lock);
riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
cm->tx_slot = 0;
cm->tx_cnt = 0;
cm->tx_ack_slot = 0;
spin_lock_init(&cm->tx_lock);
INIT_LIST_HEAD(&cm->peers);
cm->npeers = 0;
INIT_LIST_HEAD(&cm->tx_reqs);
down_write(&rdev_sem);
list_add_tail(&cm->list, &cm_dev_list);
up_write(&rdev_sem);
return 0;
}