Re: [PATCH] Add support for USB Keyboard attached to UHCI

Jay Lan <[email protected]>
Newsgroups gmane.linux.kernel.debugging
Message-ID <[email protected]>
Hi Konstantin,

Thanks for your patch. It is in my queue.

In addition, there are other USB keyboard/mouse problems in
current KDB code:
1) uhci and ohci keyboard would not work if connected through
   a USB 2.0 hub,
2) hotplug USB keyboard does not work correctly.

Aaron Young is working to fix these problems and provide
ehci support for KDB.

Thanks,
 - jay


Konstantin Baydarov wrote:
> Patch adds support of USB keyboard attached to UHCI in KDB.
> Whole UHCI irq handler(uhci_irq) is called
> periodically by KDB poll code when irqs are disabled.
> I've tested patch with em64t pentiumd. USB keyboard attached to UHCI
> works OK except there is 1 issue: auto reply of pressed key doesn't
> work, but I don't think that is a critical issue.
> 
> Patch against 2.6.23-rc8.
> 
> Signed-off-by: Konstantin Baydarov <[email protected]>
> 
>  arch/i386/Kconfig.debug     |    4 ++--
>  drivers/char/keyboard.c     |   11 +++++++++++
>  drivers/usb/host/uhci-hcd.c |   36 ++++++++++++++++++++++++++++++++++++
>  include/linux/kdb.h         |    1 +
>  kdb/kdbmain.c               |    1 +
>  5 files changed, 51 insertions(+), 2 deletions(-)
> 
> Index: linux-2.6.23-rc8/drivers/usb/host/uhci-hcd.c
> ===================================================================
> --- linux-2.6.23-rc8.orig/drivers/usb/host/uhci-hcd.c
> +++ linux-2.6.23-rc8/drivers/usb/host/uhci-hcd.c
> @@ -41,6 +41,10 @@
>  #include <linux/bitops.h>
>  #include <linux/dmi.h>
>  
> +#ifdef	CONFIG_KDB_USB
> +#include <linux/kdb.h>
> +#endif
> +
>  #include <asm/uaccess.h>
>  #include <asm/io.h>
>  #include <asm/irq.h>
> @@ -427,9 +431,37 @@ static irqreturn_t uhci_irq(struct usb_h
>  		spin_unlock_irqrestore(&uhci->lock, flags);
>  	}
>  
> +#ifdef CONFIG_KDB_USB
> +	if (kdb_kbd_delay_enter){
> +		kdb_kbd_delay_enter = 0;
> +#ifndef CONFIG_PREEMPT_HARDIRQS
> +		kdb(KDB_REASON_KEYBOARD, 0, get_irq_regs());
> +#else
> +		KDB_ENTER();
> +#endif
> +	}
> +#endif
> +
>  	return IRQ_HANDLED;
>  }
>  
> +#ifdef	CONFIG_KDB_USB
> +void
> +uhci_kdb_poll (void * __uhci, struct urb *urb)
> +{
> +	/*
> +	 * NOTE - we use the uhci_hcd from the urb rather than the
> +	 * __uhci parameter (which is NULL anyway). This ensures
> +	 * that we will process the proper controller for the urb.
> +	 */
> +
> +	if (!urb) /* can happen if no keyboard attached */
> +		return;
> +
> +	uhci_irq(bus_to_hcd(urb->dev->bus));
> +}
> +#endif /* CONFIG_KDB_USB */
> +
>  /*
>   * Store the current frame number in uhci->frame_number if the controller
>   * is runnning.  Expand from 11 bits (of which we use only 10) to a
> @@ -661,6 +693,10 @@ static int uhci_start(struct usb_hcd *hc
>  	configure_hc(uhci);
>  	uhci->is_initialized = 1;
>  	start_rh(uhci);
> +#ifdef	CONFIG_KDB_USB
> +	kdb_usb_infos.poll_func = uhci_kdb_poll;
> +	kdb_usb_infos.uhci = NULL; /* not used */
> +#endif
>  	return 0;
>  
>  /*
> Index: linux-2.6.23-rc8/drivers/char/keyboard.c
> ===================================================================
> --- linux-2.6.23-rc8.orig/drivers/char/keyboard.c
> +++ linux-2.6.23-rc8/drivers/char/keyboard.c
> @@ -43,6 +43,7 @@
>  #include <linux/reboot.h>
>  #ifdef	CONFIG_KDB
>  #include <linux/kdb.h>
> +void uhci_kdb_poll (void * __uhci, struct urb *urb);
>  #endif	/* CONFIG_KDB */
>  
>  extern void ctrl_alt_del(void);
> @@ -1149,6 +1150,16 @@ static void kbd_keycode(unsigned int key
>  
>  #ifdef	CONFIG_KDB
>  	if (down && !rep && keycode == KEY_PAUSE && kdb_on == 1) {
> +#ifdef	CONFIG_KDB_USB
> +		/* Is this USB keyboard attached to UHCI ? */
> +		if ((kdb_usb_infos.poll_func == uhci_kdb_poll)
> +				&& kdb_usb_infos.urb)
> +			/* uhci_irq should be completed before kernel
> +			 * enters KDB
> +			 */
> +			kdb_kbd_delay_enter = 1;
> +		else
> +#endif
>  		kdb(KDB_REASON_KEYBOARD, 0, get_irq_regs());
>  		return;
>  	}
> Index: linux-2.6.23-rc8/include/linux/kdb.h
> ===================================================================
> --- linux-2.6.23-rc8.orig/include/linux/kdb.h
> +++ linux-2.6.23-rc8/include/linux/kdb.h
> @@ -162,5 +162,6 @@ int kdb_process_cpu(const struct task_st
>  }
>  
>  extern const char kdb_serial_str[];
> +extern int kdb_kbd_delay_enter;
>  
>  #endif	/* !_KDB_H */
> Index: linux-2.6.23-rc8/kdb/kdbmain.c
> ===================================================================
> --- linux-2.6.23-rc8.orig/kdb/kdbmain.c
> +++ linux-2.6.23-rc8/kdb/kdbmain.c
> @@ -53,6 +53,7 @@
>  volatile int kdb_flags;
>  atomic_t kdb_event;
>  atomic_t kdb_8250;
> +int kdb_kbd_delay_enter = 0;
>  
>  /*
>   * kdb_lock protects updates to kdb_initial_cpu.  Used to
> Index: linux-2.6.23-rc8/arch/i386/Kconfig.debug
> ===================================================================
> --- linux-2.6.23-rc8.orig/arch/i386/Kconfig.debug
> +++ linux-2.6.23-rc8/arch/i386/Kconfig.debug
> @@ -156,8 +156,8 @@ config KDB_CONTINUE_CATASTROPHIC
>  	  setting to 2.
>  
>  config KDB_USB
> -	bool "Support for USB Keyboard in KDB (OHCI only)"
> -	depends on KDB && USB_OHCI_HCD
> +	bool "Support for USB Keyboard in KDB (OHCI and UHCI only)"
> +	depends on KDB && (USB_OHCI_HCD || USB_UHCI_HCD)
>  	help
>  	  If you want to use kdb from a OHCI USB keyboard then say Y here.  If you
>  	  say N then kdb can only be used from a PC (AT) keyboard or a serial
> ---------------------------
> Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.

---------------------------
Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.