On Thu, Oct 14, 2021 at 03:16:27PM +0800, lianzhi chang wrote: > Switching from the desktop environment to the tty environment, > the state of the keyboard led lights and the state of the keyboard > lock are inconsistent. This is because the attribute kb->kbdmode > of the tty bound in the desktop environment (xorg) is set to > VC_OFF, which causes the ledstate and kb->ledflagstate > values of the bound tty to always be 0, which causes the switch > from the desktop When to the tty environment, the LED light > status is inconsistent with the keyboard lock status. ... > +void update_value_ledstate(unsigned int flag, unsigned int value) > +{ > + unsigned int bit; unsigned long bit; (see below why) > + switch (flag) { > + case LED_NUML: > + bit = VC_NUMLOCK; > + break; > + case LED_CAPSL: > + bit = VC_CAPSLOCK; > + break; > + case LED_SCROLLL: > + bit = VC_SCROLLOCK; > + break; > + default: > + WARN_ON_ONCE(1); > + return; > + } > + if (value) > + ledstate |= BIT(bit); > + else > + ledstate &= ~BIT(BIT); NIH assign_bit(). On top of that, what is BIT as parameter does in the else branch? Have you compiled this? > +} ... > unsigned int leds; > unsigned long flags; > + struct kbd_struct *kb = kbd_table + fg_console; Reversed xmas tree order? ... > extern void setledstate(struct kbd_struct *kbd, unsigned int led); > Not sure if wee need this blank line, since both functions are from the same (functional) group. > +extern void update_value_ledstate(int flag, int value); -- With Best Regards, Andy Shevchenko