Переглянути джерело

[infiniband] Provide ib_get_hca_info() as a commonly-available function

tags/v0.9.8
Michael Brown 15 роки тому
джерело
коміт
7ba33f7826

+ 3
- 3
src/include/gpxe/ib_mad.h Переглянути файл

@@ -75,9 +75,9 @@ struct ib_node_info {
75 75
 	uint8_t class_version;
76 76
 	uint8_t node_type;
77 77
 	uint8_t num_ports;
78
-	uint8_t sys_guid[8];
79
-	uint8_t node_guid[8];
80
-	uint8_t port_guid[8];
78
+	struct ib_gid_half sys_guid;
79
+	struct ib_gid_half node_guid;
80
+	struct ib_gid_half port_guid;
81 81
 	uint16_t partition_cap;
82 82
 	uint16_t device_id;
83 83
 	uint32_t revision;

+ 2
- 0
src/include/gpxe/infiniband.h Переглянути файл

@@ -374,6 +374,8 @@ extern int ib_mcast_attach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
374 374
 			     struct ib_gid *gid );
375 375
 extern void ib_mcast_detach ( struct ib_device *ibdev,
376 376
 			      struct ib_queue_pair *qp, struct ib_gid *gid );
377
+extern int ib_get_hca_info ( struct ib_device *ibdev,
378
+			     struct ib_gid_half *hca_guid );
377 379
 extern struct ib_device * alloc_ibdev ( size_t priv_size );
378 380
 extern int register_ibdev ( struct ib_device *ibdev );
379 381
 extern void unregister_ibdev ( struct ib_device *ibdev );

+ 26
- 0
src/net/infiniband.c Переглянути файл

@@ -488,6 +488,32 @@ void ib_mcast_detach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
488 488
 	}
489 489
 }
490 490
 
491
+/**
492
+ * Get Infiniband HCA information
493
+ *
494
+ * @v ibdev		Infiniband device
495
+ * @ret hca_guid	HCA GUID
496
+ * @ret num_ports	Number of ports
497
+ */
498
+int ib_get_hca_info ( struct ib_device *ibdev,
499
+		      struct ib_gid_half *hca_guid ) {
500
+	struct ib_device *tmp;
501
+	int num_ports = 0;
502
+
503
+	/* Search for IB devices with the same physical device to
504
+	 * identify port count and a suitable Node GUID.
505
+	 */
506
+	for_each_ibdev ( tmp ) {
507
+		if ( tmp->dev != ibdev->dev )
508
+			continue;
509
+		if ( num_ports == 0 ) {
510
+			memcpy ( hca_guid, &tmp->gid.u.half[1],
511
+				 sizeof ( *hca_guid ) );
512
+		}
513
+		num_ports++;
514
+	}
515
+	return num_ports;
516
+}
491 517
 
492 518
 /***************************************************************************
493 519
  *

+ 4
- 16
src/net/infiniband/ib_sma.c Переглянути файл

@@ -47,27 +47,15 @@ static void ib_sma_get_node_info ( struct ib_sma *sma,
47 47
 				   union ib_smp_data *get ) {
48 48
 	struct ib_device *ibdev = sma->ibdev;
49 49
 	struct ib_node_info *node_info = &get->node_info;
50
-	struct ib_device *tmp;
51 50
 
52 51
 	memset ( node_info, 0, sizeof ( *node_info ) );
53 52
 	node_info->base_version = IB_MGMT_BASE_VERSION;
54 53
 	node_info->class_version = IB_SMP_CLASS_VERSION;
55 54
 	node_info->node_type = IB_NODE_TYPE_HCA;
56
-	/* Search for IB devices with the same physical device to
57
-	 * identify port count and a suitable Node GUID.
58
-	 */
59
-	for_each_ibdev ( tmp ) {
60
-		if ( tmp->dev != ibdev->dev )
61
-			continue;
62
-		if ( node_info->num_ports == 0 ) {
63
-			memcpy ( node_info->sys_guid, &tmp->gid.u.half[1],
64
-				 sizeof ( node_info->sys_guid ) );
65
-			memcpy ( node_info->node_guid, &tmp->gid.u.half[1],
66
-				 sizeof ( node_info->node_guid ) );
67
-		}
68
-		node_info->num_ports++;
69
-	}
70
-	memcpy ( node_info->port_guid, &ibdev->gid.u.half[1],
55
+	node_info->num_ports = ib_get_hca_info ( ibdev, &node_info->sys_guid );
56
+	memcpy ( &node_info->node_guid, &node_info->sys_guid,
57
+		 sizeof ( node_info->node_guid ) );
58
+	memcpy ( &node_info->port_guid, &ibdev->gid.u.half[1],
71 59
 		 sizeof ( node_info->port_guid ) );
72 60
 	node_info->partition_cap = htons ( 1 );
73 61
 	node_info->local_port_num = ibdev->port;

Завантаження…
Відмінити
Зберегти