12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /*
- * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- FILE_LICENCE ( GPL2_OR_LATER );
-
- #include <errno.h>
- #include <string.h>
- #include <gpxe/iobuf.h>
- #include <gpxe/infiniband.h>
- #include <gpxe/ib_qset.h>
-
- /**
- * @file
- *
- * Infiniband queue sets
- *
- */
-
- /**
- * Create queue set
- *
- * @v ibdev Infiniband device
- * @v qset Queue set
- * @v num_cqes Number of completion queue entries
- * @v cq_op Completion queue operations
- * @v num_send_wqes Number of send work queue entries
- * @v num_recv_wqes Number of receive work queue entries
- * @v qkey Queue key
- * @ret rc Return status code
- */
- int ib_create_qset ( struct ib_device *ibdev, struct ib_queue_set *qset,
- unsigned int num_cqes,
- struct ib_completion_queue_operations *cq_op,
- unsigned int num_send_wqes, unsigned int num_recv_wqes,
- unsigned long qkey ) {
- int rc;
-
- /* Sanity check */
- assert ( qset->cq == NULL );
- assert ( qset->qp == NULL );
-
- /* Allocate completion queue */
- qset->cq = ib_create_cq ( ibdev, num_cqes, cq_op );
- if ( ! qset->cq ) {
- DBGC ( ibdev, "IBDEV %p could not allocate completion queue\n",
- ibdev );
- rc = -ENOMEM;
- goto err;
- }
-
- /* Allocate queue pair */
- qset->qp = ib_create_qp ( ibdev, num_send_wqes, qset->cq,
- num_recv_wqes, qset->cq, qkey );
- if ( ! qset->qp ) {
- DBGC ( ibdev, "IBDEV %p could not allocate queue pair\n",
- ibdev );
- rc = -ENOMEM;
- goto err;
- }
-
- return 0;
-
- err:
- ib_destroy_qset ( ibdev, qset );
- return rc;
- }
-
- /**
- * Destroy queue set
- *
- * @v ibdev Infiniband device
- * @v qset Queue set
- */
- void ib_destroy_qset ( struct ib_device *ibdev,
- struct ib_queue_set *qset ) {
-
- if ( qset->qp )
- ib_destroy_qp ( ibdev, qset->qp );
- if ( qset->cq )
- ib_destroy_cq ( ibdev, qset->cq );
- memset ( qset, 0, sizeof ( *qset ) );
- }
|