Forráskód Böngészése

Split - Avoid race condition during matrix_init_quantum (#8235)

* Avoid race condition during matrix_init_quantum

* spelling is hard
Joel Challis 5 éve
szülő
commit
f6111d49bb

+ 3 - 1
quantum/split_common/matrix.c

@@ -190,7 +190,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
 #endif
 #endif
 
 
 void matrix_init(void) {
 void matrix_init(void) {
-    keyboard_split_setup();
+    split_pre_init();
 
 
     // Set pinout for right half if pinout for that half is defined
     // Set pinout for right half if pinout for that half is defined
     if (!isLeftHand) {
     if (!isLeftHand) {
@@ -231,6 +231,8 @@ void matrix_init(void) {
     debounce_init(ROWS_PER_HAND);
     debounce_init(ROWS_PER_HAND);
 
 
     matrix_init_quantum();
     matrix_init_quantum();
+
+    split_post_init();
 }
 }
 
 
 void matrix_post_scan(void) {
 void matrix_post_scan(void) {

+ 14 - 15
quantum/split_common/split_util.c

@@ -81,19 +81,8 @@ __attribute__((weak)) bool is_keyboard_master(void) {
     return (usbstate == MASTER);
     return (usbstate == MASTER);
 }
 }
 
 
-static void keyboard_master_setup(void) {
-#if defined(USE_I2C)
-#    ifdef SSD1306OLED
-    matrix_master_OLED_init();
-#    endif
-#endif
-    transport_master_init();
-}
-
-static void keyboard_slave_setup(void) { transport_slave_init(); }
-
 // this code runs before the keyboard is fully initialized
 // this code runs before the keyboard is fully initialized
-void keyboard_split_setup(void) {
+void split_pre_init(void) {
     isLeftHand = is_keyboard_left();
     isLeftHand = is_keyboard_left();
 
 
 #if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
 #if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
@@ -106,8 +95,18 @@ void keyboard_split_setup(void) {
 #endif
 #endif
 
 
     if (is_keyboard_master()) {
     if (is_keyboard_master()) {
-        keyboard_master_setup();
-    } else {
-        keyboard_slave_setup();
+#if defined(USE_I2C) && defined(SSD1306OLED)
+        matrix_master_OLED_init();
+#endif
+        transport_master_init();
+    }
+}
+
+// this code runs after the keyboard is fully initialized
+//   - avoids race condition during matrix_init_quantum where slave can start
+//     receiving before the init process has completed
+void split_post_init(void) {
+    if (!is_keyboard_master()) {
+        transport_slave_init();
     }
     }
 }
 }

+ 2 - 1
quantum/split_common/split_util.h

@@ -8,4 +8,5 @@
 extern volatile bool isLeftHand;
 extern volatile bool isLeftHand;
 
 
 void matrix_master_OLED_init(void);
 void matrix_master_OLED_init(void);
-void keyboard_split_setup(void);
+void split_pre_init(void);
+void split_post_init(void);