|
@@ -1330,6 +1330,40 @@ static int arbel_get_pkey ( struct arbel *arbel, unsigned int *pkey ) {
|
1330
|
1330
|
return 0;
|
1331
|
1331
|
}
|
1332
|
1332
|
|
|
1333
|
+/**
|
|
1334
|
+ * Get MAD parameters
|
|
1335
|
+ *
|
|
1336
|
+ * @v arbel Arbel device
|
|
1337
|
+ * @ret rc Return status code
|
|
1338
|
+ */
|
|
1339
|
+static int arbel_get_mad_params ( struct ib_device *ibdev ) {
|
|
1340
|
+ struct arbel *arbel = ibdev->dev_priv;
|
|
1341
|
+ int rc;
|
|
1342
|
+
|
|
1343
|
+ /* Get subnet manager LID */
|
|
1344
|
+ if ( ( rc = arbel_get_sm_lid ( arbel, &ibdev->sm_lid ) ) != 0 ) {
|
|
1345
|
+ DBGC ( arbel, "Arbel %p could not determine subnet manager "
|
|
1346
|
+ "LID: %s\n", arbel, strerror ( rc ) );
|
|
1347
|
+ return rc;
|
|
1348
|
+ }
|
|
1349
|
+
|
|
1350
|
+ /* Get port GID */
|
|
1351
|
+ if ( ( rc = arbel_get_port_gid ( arbel, &ibdev->port_gid ) ) != 0 ) {
|
|
1352
|
+ DBGC ( arbel, "Arbel %p could not determine port GID: %s\n",
|
|
1353
|
+ arbel, strerror ( rc ) );
|
|
1354
|
+ return rc;
|
|
1355
|
+ }
|
|
1356
|
+
|
|
1357
|
+ /* Get partition key */
|
|
1358
|
+ if ( ( rc = arbel_get_pkey ( arbel, &ibdev->pkey ) ) != 0 ) {
|
|
1359
|
+ DBGC ( arbel, "Arbel %p could not determine partition key: "
|
|
1360
|
+ "%s\n", arbel, strerror ( rc ) );
|
|
1361
|
+ return rc;
|
|
1362
|
+ }
|
|
1363
|
+
|
|
1364
|
+ return 0;
|
|
1365
|
+}
|
|
1366
|
+
|
1333
|
1367
|
/***************************************************************************
|
1334
|
1368
|
*
|
1335
|
1369
|
* Firmware control
|
|
@@ -1426,6 +1460,62 @@ static void arbel_stop_firmware ( struct arbel *arbel ) {
|
1426
|
1460
|
arbel->firmware_area = UNULL;
|
1427
|
1461
|
}
|
1428
|
1462
|
|
|
1463
|
+/***************************************************************************
|
|
1464
|
+ *
|
|
1465
|
+ * Infinihost Context Memory management
|
|
1466
|
+ *
|
|
1467
|
+ ***************************************************************************
|
|
1468
|
+ */
|
|
1469
|
+
|
|
1470
|
+/**
|
|
1471
|
+ * Get device limits
|
|
1472
|
+ *
|
|
1473
|
+ * @v arbel Arbel device
|
|
1474
|
+ * @ret rc Return status code
|
|
1475
|
+ */
|
|
1476
|
+static int arbel_get_limits ( struct arbel *arbel ) {
|
|
1477
|
+ struct arbelprm_query_dev_lim dev_lim;
|
|
1478
|
+ int rc;
|
|
1479
|
+
|
|
1480
|
+ if ( ( rc = arbel_cmd_query_dev_lim ( arbel, &dev_lim ) ) != 0 ) {
|
|
1481
|
+ DBGC ( arbel, "Arbel %p could not get device limits: %s\n",
|
|
1482
|
+ arbel, strerror ( rc ) );
|
|
1483
|
+ return rc;
|
|
1484
|
+ }
|
|
1485
|
+
|
|
1486
|
+ arbel->limits.reserved_qps =
|
|
1487
|
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_qps ) );
|
|
1488
|
+ arbel->limits.reserved_ees =
|
|
1489
|
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_ees ) );
|
|
1490
|
+ arbel->limits.reserved_mtts =
|
|
1491
|
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_mtts ) );
|
|
1492
|
+ arbel->limits.reserved_cqs =
|
|
1493
|
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_cqs ) );
|
|
1494
|
+ arbel->limits.reserved_srqs =
|
|
1495
|
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_srqs ) );
|
|
1496
|
+ arbel->limits.reserved_uars = MLX_GET ( &dev_lim, num_rsvd_uars );
|
|
1497
|
+
|
|
1498
|
+ return 0;
|
|
1499
|
+}
|
|
1500
|
+
|
|
1501
|
+/**
|
|
1502
|
+ * Allocate ICM areas
|
|
1503
|
+ *
|
|
1504
|
+ * @v arbel Arbel device
|
|
1505
|
+ * @ret rc Return status code
|
|
1506
|
+ */
|
|
1507
|
+static int arbel_alloc_icm ( struct arbel *arbel ) {
|
|
1508
|
+
|
|
1509
|
+ return 0;
|
|
1510
|
+}
|
|
1511
|
+
|
|
1512
|
+/***************************************************************************
|
|
1513
|
+ *
|
|
1514
|
+ * PCI interface
|
|
1515
|
+ *
|
|
1516
|
+ ***************************************************************************
|
|
1517
|
+ */
|
|
1518
|
+
|
1429
|
1519
|
/**
|
1430
|
1520
|
* Probe PCI device
|
1431
|
1521
|
*
|
|
@@ -1436,9 +1526,7 @@ static void arbel_stop_firmware ( struct arbel *arbel ) {
|
1436
|
1526
|
static int arbel_probe ( struct pci_device *pci,
|
1437
|
1527
|
const struct pci_device_id *id __unused ) {
|
1438
|
1528
|
struct ib_device *ibdev;
|
1439
|
|
- struct arbelprm_query_dev_lim dev_lim;
|
1440
|
1529
|
struct arbel *arbel;
|
1441
|
|
- udqp_t qph;
|
1442
|
1530
|
int rc;
|
1443
|
1531
|
|
1444
|
1532
|
/* Allocate Infiniband device */
|
|
@@ -1479,15 +1567,19 @@ static int arbel_probe ( struct pci_device *pci,
|
1479
|
1567
|
if ( ( rc = arbel_start_firmware ( arbel ) ) != 0 )
|
1480
|
1568
|
goto err_start_firmware;
|
1481
|
1569
|
|
|
1570
|
+ /* Get device limits */
|
|
1571
|
+ if ( ( rc = arbel_get_limits ( arbel ) ) != 0 )
|
|
1572
|
+ goto err_get_limits;
|
1482
|
1573
|
|
1483
|
1574
|
while ( 1 ) {}
|
1484
|
1575
|
|
|
1576
|
+#if 0
|
1485
|
1577
|
/* Initialise hardware */
|
1486
|
1578
|
if ( ( rc = ib_driver_init ( pci, &qph ) ) != 0 )
|
1487
|
1579
|
goto err_ib_driver_init;
|
1488
|
1580
|
|
1489
|
1581
|
/* Hack up IB structures */
|
1490
|
|
-#if 0
|
|
1582
|
+
|
1491
|
1583
|
arbel->config = memfree_pci_dev.cr_space;
|
1492
|
1584
|
arbel->uar = memfree_pci_dev.uar;
|
1493
|
1585
|
arbel->mailbox_in = dev_buffers_p->inprm_buf;
|
|
@@ -1497,38 +1589,11 @@ static int arbel_probe ( struct pci_device *pci,
|
1497
|
1589
|
arbel->reserved_lkey = dev_ib_data.mkey;
|
1498
|
1590
|
arbel->eqn = dev_ib_data.eq.eqn;
|
1499
|
1591
|
|
1500
|
|
- /* Get device limits */
|
1501
|
|
- if ( ( rc = arbel_cmd_query_dev_lim ( arbel, &dev_lim ) ) != 0 ) {
|
1502
|
|
- DBGC ( arbel, "Arbel %p could not get device limits: %s\n",
|
1503
|
|
- arbel, strerror ( rc ) );
|
1504
|
|
- goto err_query_dev_lim;
|
1505
|
|
- }
|
1506
|
|
- arbel->limits.reserved_uars = MLX_GET ( &dev_lim, num_rsvd_uars );
|
1507
|
|
- arbel->limits.reserved_cqs =
|
1508
|
|
- ( 1 << MLX_GET ( &dev_lim, log2_rsvd_cqs ) );
|
1509
|
|
- arbel->limits.reserved_qps =
|
1510
|
|
- ( 1 << MLX_GET ( &dev_lim, log2_rsvd_qps ) );
|
1511
|
|
-
|
1512
|
|
- /* Get subnet manager LID */
|
1513
|
|
- if ( ( rc = arbel_get_sm_lid ( arbel, &ibdev->sm_lid ) ) != 0 ) {
|
1514
|
|
- DBGC ( arbel, "Arbel %p could not determine subnet manager "
|
1515
|
|
- "LID: %s\n", arbel, strerror ( rc ) );
|
1516
|
|
- goto err_get_sm_lid;
|
1517
|
|
- }
|
1518
|
1592
|
|
1519
|
|
- /* Get port GID */
|
1520
|
|
- if ( ( rc = arbel_get_port_gid ( arbel, &ibdev->port_gid ) ) != 0 ) {
|
1521
|
|
- DBGC ( arbel, "Arbel %p could not determine port GID: %s\n",
|
1522
|
|
- arbel, strerror ( rc ) );
|
1523
|
|
- goto err_get_port_gid;
|
1524
|
|
- }
|
|
1593
|
+ /* Get MAD parameters */
|
|
1594
|
+ if ( ( rc = arbel_get_mad_params ( ibdev ) ) != 0 )
|
|
1595
|
+ goto err_get_mad_params;
|
1525
|
1596
|
|
1526
|
|
- /* Get partition key */
|
1527
|
|
- if ( ( rc = arbel_get_pkey ( arbel, &ibdev->pkey ) ) != 0 ) {
|
1528
|
|
- DBGC ( arbel, "Arbel %p could not determine partition key: "
|
1529
|
|
- "%s\n", arbel, strerror ( rc ) );
|
1530
|
|
- goto err_get_pkey;
|
1531
|
|
- }
|
1532
|
1597
|
|
1533
|
1598
|
/* Add IPoIB device */
|
1534
|
1599
|
if ( ( rc = ipoib_probe ( ibdev ) ) != 0 ) {
|
|
@@ -1540,13 +1605,12 @@ static int arbel_probe ( struct pci_device *pci,
|
1540
|
1605
|
return 0;
|
1541
|
1606
|
|
1542
|
1607
|
err_ipoib_probe:
|
1543
|
|
- err_get_pkey:
|
1544
|
|
- err_get_port_gid:
|
1545
|
|
- err_get_sm_lid:
|
1546
|
|
- err_query_dev_lim:
|
|
1608
|
+ err_get_mad_params:
|
1547
|
1609
|
ib_driver_close ( 0 );
|
1548
|
1610
|
err_ib_driver_init:
|
1549
|
1611
|
|
|
1612
|
+
|
|
1613
|
+ err_get_limits:
|
1550
|
1614
|
arbel_stop_firmware ( arbel );
|
1551
|
1615
|
err_start_firmware:
|
1552
|
1616
|
free_dma ( arbel->mailbox_out, ARBEL_MBOX_SIZE );
|
|
@@ -1567,6 +1631,8 @@ static void arbel_remove ( struct pci_device *pci ) {
|
1567
|
1631
|
struct ib_device *ibdev = pci_get_drvdata ( pci );
|
1568
|
1632
|
struct arbel *arbel = ibdev->dev_priv;
|
1569
|
1633
|
|
|
1634
|
+
|
|
1635
|
+#warning "check error sequence for probe()"
|
1570
|
1636
|
ipoib_remove ( ibdev );
|
1571
|
1637
|
ib_driver_close ( 0 );
|
1572
|
1638
|
arbel_stop_firmware ( arbel );
|