|
@@ -31,7 +31,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
31
|
31
|
#include <ipxe/if_arp.h>
|
32
|
32
|
#include <ipxe/netdevice.h>
|
33
|
33
|
#include <ipxe/iobuf.h>
|
34
|
|
-#include <ipxe/ipoib.h>
|
35
|
34
|
#include <ipxe/process.h>
|
36
|
35
|
#include <ipxe/infiniband.h>
|
37
|
36
|
#include <ipxe/ib_mi.h>
|
|
@@ -538,6 +537,64 @@ void ib_refill_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp ) {
|
538
|
537
|
***************************************************************************
|
539
|
538
|
*/
|
540
|
539
|
|
|
540
|
+/**
|
|
541
|
+ * Get link state
|
|
542
|
+ *
|
|
543
|
+ * @v ibdev Infiniband device
|
|
544
|
+ * @ret rc Link status code
|
|
545
|
+ */
|
|
546
|
+int ib_link_rc ( struct ib_device *ibdev ) {
|
|
547
|
+ switch ( ibdev->port_state ) {
|
|
548
|
+ case IB_PORT_STATE_DOWN: return -ENOTCONN;
|
|
549
|
+ case IB_PORT_STATE_INIT: return -EINPROGRESS_INIT;
|
|
550
|
+ case IB_PORT_STATE_ARMED: return -EINPROGRESS_ARMED;
|
|
551
|
+ case IB_PORT_STATE_ACTIVE: return 0;
|
|
552
|
+ default: return -EINVAL;
|
|
553
|
+ }
|
|
554
|
+}
|
|
555
|
+
|
|
556
|
+/**
|
|
557
|
+ * Textual representation of Infiniband link state
|
|
558
|
+ *
|
|
559
|
+ * @v ibdev Infiniband device
|
|
560
|
+ * @ret link_text Link state text
|
|
561
|
+ */
|
|
562
|
+static const char * ib_link_state_text ( struct ib_device *ibdev ) {
|
|
563
|
+ switch ( ibdev->port_state ) {
|
|
564
|
+ case IB_PORT_STATE_DOWN: return "DOWN";
|
|
565
|
+ case IB_PORT_STATE_INIT: return "INIT";
|
|
566
|
+ case IB_PORT_STATE_ARMED: return "ARMED";
|
|
567
|
+ case IB_PORT_STATE_ACTIVE: return "ACTIVE";
|
|
568
|
+ default: return "UNKNOWN";
|
|
569
|
+ }
|
|
570
|
+}
|
|
571
|
+
|
|
572
|
+/**
|
|
573
|
+ * Notify drivers of Infiniband device or link state change
|
|
574
|
+ *
|
|
575
|
+ * @v ibdev Infiniband device
|
|
576
|
+ */
|
|
577
|
+static void ib_notify ( struct ib_device *ibdev ) {
|
|
578
|
+ struct ib_driver *driver;
|
|
579
|
+
|
|
580
|
+ for_each_table_entry ( driver, IB_DRIVERS )
|
|
581
|
+ driver->notify ( ibdev );
|
|
582
|
+}
|
|
583
|
+
|
|
584
|
+/**
|
|
585
|
+ * Notify of Infiniband link state change
|
|
586
|
+ *
|
|
587
|
+ * @v ibdev Infiniband device
|
|
588
|
+ */
|
|
589
|
+void ib_link_state_changed ( struct ib_device *ibdev ) {
|
|
590
|
+
|
|
591
|
+ DBGC ( ibdev, "IBDEV %p link state is %s\n",
|
|
592
|
+ ibdev, ib_link_state_text ( ibdev ) );
|
|
593
|
+
|
|
594
|
+ /* Notify drivers of link state change */
|
|
595
|
+ ib_notify ( ibdev );
|
|
596
|
+}
|
|
597
|
+
|
541
|
598
|
/**
|
542
|
599
|
* Open port
|
543
|
600
|
*
|
|
@@ -586,6 +643,9 @@ int ib_open ( struct ib_device *ibdev ) {
|
586
|
643
|
/* Add to head of open devices list */
|
587
|
644
|
list_add ( &ibdev->open_list, &open_ib_devices );
|
588
|
645
|
|
|
646
|
+ /* Notify drivers of device state change */
|
|
647
|
+ ib_notify ( ibdev );
|
|
648
|
+
|
589
|
649
|
assert ( ibdev->open_count == 1 );
|
590
|
650
|
return 0;
|
591
|
651
|
|
|
@@ -614,6 +674,7 @@ void ib_close ( struct ib_device *ibdev ) {
|
614
|
674
|
|
615
|
675
|
/* Close device if this was the last remaining requested opening */
|
616
|
676
|
if ( ibdev->open_count == 0 ) {
|
|
677
|
+ ib_notify ( ibdev );
|
617
|
678
|
list_del ( &ibdev->open_list );
|
618
|
679
|
ib_destroy_mi ( ibdev, ibdev->gsi );
|
619
|
680
|
ib_destroy_sma ( ibdev, ibdev->smi );
|
|
@@ -622,22 +683,6 @@ void ib_close ( struct ib_device *ibdev ) {
|
622
|
683
|
}
|
623
|
684
|
}
|
624
|
685
|
|
625
|
|
-/**
|
626
|
|
- * Get link state
|
627
|
|
- *
|
628
|
|
- * @v ibdev Infiniband device
|
629
|
|
- * @ret rc Link status code
|
630
|
|
- */
|
631
|
|
-int ib_link_rc ( struct ib_device *ibdev ) {
|
632
|
|
- switch ( ibdev->port_state ) {
|
633
|
|
- case IB_PORT_STATE_DOWN: return -ENOTCONN;
|
634
|
|
- case IB_PORT_STATE_INIT: return -EINPROGRESS_INIT;
|
635
|
|
- case IB_PORT_STATE_ARMED: return -EINPROGRESS_ARMED;
|
636
|
|
- case IB_PORT_STATE_ACTIVE: return 0;
|
637
|
|
- default: return -EINVAL;
|
638
|
|
- }
|
639
|
|
-}
|
640
|
|
-
|
641
|
686
|
/***************************************************************************
|
642
|
687
|
*
|
643
|
688
|
* Multicast
|
|
@@ -799,17 +844,6 @@ int ib_set_pkey_table ( struct ib_device *ibdev, union ib_mad *mad ) {
|
799
|
844
|
***************************************************************************
|
800
|
845
|
*/
|
801
|
846
|
|
802
|
|
-/**
|
803
|
|
- * Handle Infiniband link state change
|
804
|
|
- *
|
805
|
|
- * @v ibdev Infiniband device
|
806
|
|
- */
|
807
|
|
-void ib_link_state_changed ( struct ib_device *ibdev ) {
|
808
|
|
-
|
809
|
|
- /* Notify IPoIB of link state change */
|
810
|
|
- ipoib_link_state_changed ( ibdev );
|
811
|
|
-}
|
812
|
|
-
|
813
|
847
|
/**
|
814
|
848
|
* Poll event queue
|
815
|
849
|
*
|
|
@@ -883,24 +917,29 @@ struct ib_device * alloc_ibdev ( size_t priv_size ) {
|
883
|
917
|
* @ret rc Return status code
|
884
|
918
|
*/
|
885
|
919
|
int register_ibdev ( struct ib_device *ibdev ) {
|
|
920
|
+ struct ib_driver *driver;
|
886
|
921
|
int rc;
|
887
|
922
|
|
888
|
923
|
/* Add to device list */
|
889
|
924
|
ibdev_get ( ibdev );
|
890
|
925
|
list_add_tail ( &ibdev->list, &ib_devices );
|
|
926
|
+ DBGC ( ibdev, "IBDEV %p registered (phys %s)\n", ibdev,
|
|
927
|
+ ibdev->dev->name );
|
891
|
928
|
|
892
|
|
- /* Add IPoIB device */
|
893
|
|
- if ( ( rc = ipoib_probe ( ibdev ) ) != 0 ) {
|
894
|
|
- DBGC ( ibdev, "IBDEV %p could not add IPoIB device: %s\n",
|
895
|
|
- ibdev, strerror ( rc ) );
|
896
|
|
- goto err_ipoib_probe;
|
|
929
|
+ /* Probe device */
|
|
930
|
+ for_each_table_entry ( driver, IB_DRIVERS ) {
|
|
931
|
+ if ( ( rc = driver->probe ( ibdev ) ) != 0 ) {
|
|
932
|
+ DBGC ( ibdev, "IBDEV %p could not add %s device: %s\n",
|
|
933
|
+ ibdev, driver->name, strerror ( rc ) );
|
|
934
|
+ goto err_probe;
|
|
935
|
+ }
|
897
|
936
|
}
|
898
|
937
|
|
899
|
|
- DBGC ( ibdev, "IBDEV %p registered (phys %s)\n", ibdev,
|
900
|
|
- ibdev->dev->name );
|
901
|
938
|
return 0;
|
902
|
939
|
|
903
|
|
- err_ipoib_probe:
|
|
940
|
+ err_probe:
|
|
941
|
+ for_each_table_entry_continue_reverse ( driver, IB_DRIVERS )
|
|
942
|
+ driver->remove ( ibdev );
|
904
|
943
|
list_del ( &ibdev->list );
|
905
|
944
|
ibdev_put ( ibdev );
|
906
|
945
|
return rc;
|
|
@@ -912,9 +951,11 @@ int register_ibdev ( struct ib_device *ibdev ) {
|
912
|
951
|
* @v ibdev Infiniband device
|
913
|
952
|
*/
|
914
|
953
|
void unregister_ibdev ( struct ib_device *ibdev ) {
|
|
954
|
+ struct ib_driver *driver;
|
915
|
955
|
|
916
|
|
- /* Close device */
|
917
|
|
- ipoib_remove ( ibdev );
|
|
956
|
+ /* Remove device */
|
|
957
|
+ for_each_table_entry_reverse ( driver, IB_DRIVERS )
|
|
958
|
+ driver->remove ( ibdev );
|
918
|
959
|
|
919
|
960
|
/* Remove from device list */
|
920
|
961
|
list_del ( &ibdev->list );
|
|
@@ -953,3 +994,6 @@ struct ib_device * last_opened_ibdev ( void ) {
|
953
|
994
|
|
954
|
995
|
return NULL;
|
955
|
996
|
}
|
|
997
|
+
|
|
998
|
+/* Drag in IPoIB */
|
|
999
|
+REQUIRE_OBJECT ( ipoib );
|