diff -ruN ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/ChangeLog ecos/ecos/packages/devs/serial/generic/16x5x/current/ChangeLog
--- ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/ChangeLog	2007-11-20 22:22:08.000000000 +0100
+++ ecos/ecos/packages/devs/serial/generic/16x5x/current/ChangeLog	2008-07-08 07:48:52.000000000 +0200
@@ -1,3 +1,17 @@
+2008-07-08  Uwe Kindler <uwe_kindler@web.de>
+
+	* cdl/ser_generic_16x5x.cdl
+	(CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO): New interface
+	for devices that support per channel interrupt priorities.
+	
+	* src/ser_16x5x.c Added data field int_prio to pc_serial_info
+	type, serial_config_port(): uses macro
+	CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() to get the 
+	baud devisor from platform if device suppports per channel
+	baudrate clocks, pc_serial_init(): Use interrupt priority from
+	int_prio data field if device implements 
+	CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
+
 2007-06-22  Alexander Aganichev  <aaganichev@gmail.com>
 
 	* cdl/ser_generic_16x5x.cdl
diff -ruN ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl ecos/ecos/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl
--- ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl	2007-11-20 22:22:08.000000000 +0100
+++ ecos/ecos/packages/devs/serial/generic/16x5x/current/cdl/ser_generic_16x5x.cdl	2008-07-08 07:37:01.000000000 +0200
@@ -76,6 +76,16 @@
         puts $::cdl_header "#include <pkgconf/system.h>";
         puts $::cdl_header "#include CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG";
     }
+    
+    cdl_interface CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO {
+            display     "Per channel interrupt priority support"
+            flavor      bool
+            description "
+                A platform should implement this interface if it supports
+                per channel interrupt priorities. If a platform implements
+                this interface it needs to provide an interrupt priority
+                value for each UART channel it supports."
+    }
 
     cdl_option CYGPKG_IO_SERIAL_GENERIC_16X5X_XMIT_REQUIRE_PRIME {
         display       "Transmission require priming"
diff -ruN ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c ecos/ecos/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c
--- ecos_web_cvs/ecos/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c	2007-11-20 22:22:08.000000000 +0100
+++ ecos/ecos/packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c	2008-07-08 07:40:56.000000000 +0200
@@ -182,6 +182,9 @@
 typedef struct pc_serial_info {
     cyg_addrword_t base;
     int            int_num;
+#ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
+    int            int_prio;
+#endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
     cyg_interrupt  serial_interrupt;
     cyg_handle_t   serial_interrupt_handle;
 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO
@@ -235,7 +238,17 @@
 {
     pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv;
     cyg_addrword_t base = ser_chan->base;
+    //
+    // If the device supports a dynamic per channel baudrate generator
+    // then we call the CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() 
+    // macro to get the baud divisor. The macro takes the serial channel data 
+    // pointer and the baudrate as parameters and returns the baud divisior
+    //
+#ifdef CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR
+    unsigned short baud_divisor = CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(ser_chan, new_config->baud);
+#else
     unsigned short baud_divisor = select_baud[new_config->baud];
+#endif
     unsigned char _lcr, _ier;
     if (baud_divisor == 0) return false;  // Invalid configuration
 
@@ -372,10 +385,21 @@
 #endif
     // Really only required for interrupt driven devices
     (chan->callbacks->serial_init)(chan);
-
+    //
+    // If the device supports per channel interrupt priorities then
+    // we take the priority from the serial channel data. If it does
+    // not support per channel interrupt priority we fall back to
+    // the old method and use CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY
+    // to define the priority
+    //
+#ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
+    cyg_priority_t intprio = ser_chan->int_prio;
+#else 
+    cyg_priority_t intprio = CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY;
+#endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO
     if (chan->out_cbuf.len != 0) {
         cyg_drv_interrupt_create(ser_chan->int_num,
-                                 CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY,
+                                 intprio,
                                  (cyg_addrword_t)chan,
                                  pc_serial_ISR,
                                  pc_serial_DSR,
