Bläddra i källkod

Restructured bits of initialisation (not testable at present)

tags/v0.9.3
Michael Brown 16 år sedan
förälder
incheckning
c818d47e25
2 ändrade filer med 116 tillägg och 42 borttagningar
  1. 13
    5
      src/drivers/net/mlx_ipoib/arbel.h
  2. 103
    37
      src/drivers/net/mlx_ipoib/mt25218.c

+ 13
- 5
src/drivers/net/mlx_ipoib/arbel.h Visa fil

@@ -156,12 +156,20 @@ union arbelprm_mad {
156 156
 
157 157
 /** Arbel device limits */
158 158
 struct arbel_dev_limits {
159
-	/** Number of reserver UARs */
160
-	unsigned long reserved_uars;
161
-	/** Number of reserved CQs */
162
-	unsigned long reserved_cqs;
163 159
 	/** Number of reserved QPs */
164
-	unsigned long reserved_qps;
160
+	unsigned int reserved_qps;
161
+	/** Number of reserved EEs */
162
+	unsigned int reserved_ees;
163
+	/** Number of reserved MPTs */
164
+	unsigned int reserved_mpts;
165
+	/** Number of reserved MTTs */
166
+	unsigned int reserved_mtts;
167
+	/** Number of reserved CQs */
168
+	unsigned int reserved_cqs;
169
+	/** Number of reserved SRQs */
170
+	unsigned int reserved_srqs;
171
+	/** Number of reserver UARs */
172
+	unsigned int reserved_uars;
165 173
 };
166 174
 
167 175
 /** Alignment of Arbel send work queue entries */

+ 103
- 37
src/drivers/net/mlx_ipoib/mt25218.c Visa fil

@@ -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 );

Laddar…
Avbryt
Spara