summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch
diff options
context:
space:
mode:
authorRoman Yeryomin <roman@advem.lv>2013-05-17 20:40:24 +0300
committerRoman Yeryomin <roman@advem.lv>2013-05-17 20:40:24 +0300
commite6d87036412b952cb083eff2dc716aee97a771f2 (patch)
tree273dd3daaa85553832d3cc6d48276229dc7fbe09 /target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch
parenta18fec42221baa52fff4c5ffd45ec8f32e3add36 (diff)
Move to rsdk 3.2.4. Compiles cleanly.
Signed-off-by: Roman Yeryomin <roman@advem.lv>
Diffstat (limited to 'target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch')
-rw-r--r--target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch7495
1 files changed, 7495 insertions, 0 deletions
diff --git a/target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch b/target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch
new file mode 100644
index 000000000..09f0f8d8d
--- /dev/null
+++ b/target/linux/realtek/patches-2.6.30/0002-rsdk-drivers-nonewfiles.patch
@@ -0,0 +1,7495 @@
+--- linux-2.6.30.9/drivers/char/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/char/Makefile 2013-05-02 01:47:50.410227327 +0300
+@@ -8,6 +8,7 @@
+ FONTMAPFILE = cp437.uni
+
+ obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o
++EXTRA_CFLAGS += -I.
+
+ obj-$(CONFIG_LEGACY_PTYS) += pty.o
+ obj-$(CONFIG_UNIX98_PTYS) += pty.o
+@@ -97,6 +98,9 @@ obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio
+ obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o
+ obj-$(CONFIG_GPIO_TB0219) += tb0219.o
+ obj-$(CONFIG_TELCLOCK) += tlclk.o
++obj-$(CONFIG_RTL_819X) += rtl_gpio.o
++obj-$(CONFIG_RTL_NFBI_MDIO) += rtl_mdio/
++obj-$(CONFIG_NFBI_HOST) += rtl_nfbi/
+
+ obj-$(CONFIG_MWAVE) += mwave/
+ obj-$(CONFIG_AGP) += agp/
+--- linux-2.6.30.9/drivers/char/pty.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/char/pty.c 2013-05-02 01:47:50.487227320 +0300
+@@ -27,6 +27,7 @@
+ #include <linux/uaccess.h>
+ #include <linux/bitops.h>
+ #include <linux/devpts_fs.h>
++#include <linux/smp_lock.h>
+
+ #include <asm/system.h>
+
+--- linux-2.6.30.9/drivers/crypto/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/crypto/Kconfig 2013-05-02 01:47:50.559227314 +0300
+@@ -209,4 +209,26 @@ config CRYPTO_DEV_PPC4XX
+ help
+ This option allows you to have support for AMCC crypto acceleration.
+
++config CRYPTO_DEV_REALTEK
++ tristate "Driver Realtek Crypto Engine"
++ select CRYPTO_HASH
++ select CRYPTO_ALGAPI
++ select CRYPTO_BLKCIPHER
++ select CRYPTO_CBC
++ select CRYPTO_CTR
++ select CRYPTO_ECB
++ select CRYPTO_MD5
++ select CRYPTO_SHA1
++ select CRYPTO_AES
++ select CRYPTO_DES
++ help
++ This option allows you to have support for Realtek Crypto Engine.
++
++config CRYPTO_DEV_REALTEK_TEST
++ tristate "Driver Realtek Crypto Engine Test"
++ select CRYPTO_TEST
++ depends on CRYPTO_DEV_REALTEK
++ help
++ This option for Realtek Crypto Engine Internal Test.
++
+ endif # CRYPTO_HW
+--- linux-2.6.30.9/drivers/crypto/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/crypto/Makefile 2013-05-02 01:47:50.559227314 +0300
+@@ -5,3 +5,4 @@ obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hi
+ obj-$(CONFIG_CRYPTO_DEV_TALITOS) += talitos.o
+ obj-$(CONFIG_CRYPTO_DEV_IXP4XX) += ixp4xx_crypto.o
+ obj-$(CONFIG_CRYPTO_DEV_PPC4XX) += amcc/
++obj-$(CONFIG_CRYPTO_DEV_REALTEK) += realtek/
+--- linux-2.6.30.9/drivers/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/Makefile 2013-05-02 01:47:49.674227386 +0300
+@@ -24,7 +24,7 @@ obj-$(CONFIG_REGULATOR) += regulator/
+ # char/ comes before serial/ etc so that the VT console is the boot-time
+ # default.
+ obj-y += char/
+-
++obj-$(CONFIG_STAGING) += staging/
+ # gpu/ comes after char for AGP vs DRM startup
+ obj-y += gpu/
+
+@@ -65,7 +65,7 @@ obj-$(CONFIG_USB_OTG_UTILS) += usb/otg/
+ obj-$(CONFIG_USB) += usb/
+ obj-$(CONFIG_USB_MUSB_HDRC) += usb/musb/
+ obj-$(CONFIG_PCI) += usb/
+-obj-$(CONFIG_USB_GADGET) += usb/gadget/
++## obj-$(CONFIG_USB_GADGET) += usb/gadget/
+ obj-$(CONFIG_SERIO) += input/serio/
+ obj-$(CONFIG_GAMEPORT) += input/gameport/
+ obj-$(CONFIG_INPUT) += input/
+@@ -105,5 +105,5 @@ obj-$(CONFIG_PPC_PS3) += ps3/
+ obj-$(CONFIG_OF) += of/
+ obj-$(CONFIG_SSB) += ssb/
+ obj-$(CONFIG_VIRTIO) += virtio/
+-obj-$(CONFIG_STAGING) += staging/
++
+ obj-y += platform/
+--- linux-2.6.30.9/drivers/media/video/uvc/uvc_video.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/media/video/uvc/uvc_video.c 2013-05-02 01:47:52.326227171 +0300
+@@ -531,6 +531,14 @@ static void uvc_video_decode_isoc(struct
+ if (urb->iso_frame_desc[i].status < 0) {
+ uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame "
+ "lost (%d).\n", urb->iso_frame_desc[i].status);
++
++ //Start to avoid to flicking images with isochronous by jason
++ if (buf) {
++ buf->state = UVC_BUF_STATE_QUEUED;
++ buf->buf.bytesused = 0;
++ i = urb->number_of_packets;
++ }
++ //End to avoid to flicking images with isochronous by jason
+ continue;
+ }
+
+--- linux-2.6.30.9/drivers/mtd/chips/cfi_cmdset_0001.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/chips/cfi_cmdset_0001.c 2013-05-02 01:47:52.621227148 +0300
+@@ -1,20 +1,10 @@
+ /*
+- * Common Flash Interface support:
+- * Intel Extended Vendor Command Set (ID 0x0001)
+ *
+- * (C) 2000 Red Hat. GPL'd
++ * Copyright (c) 2011 Realtek Semiconductor Corp.
+ *
+- *
+- * 10/10/2000 Nicolas Pitre <nico@cam.org>
+- * - completely revamped method functions so they are aware and
+- * independent of the flash geometry (buswidth, interleave, etc.)
+- * - scalability vs code size is completely set at compile-time
+- * (see include/linux/mtd/cfi.h for selection)
+- * - optimized write buffer method
+- * 02/05/2002 Christopher Hoover <ch@hpl.hp.com>/<ch@murgatroid.com>
+- * - reworked lock/unlock/erase support for var size flash
+- * 21/03/2007 Rodolfo Giometti <giometti@linux.it>
+- * - auto unlock sectors on resume for auto locking flash on power up
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
+ */
+
+ #include <linux/module.h>
+--- linux-2.6.30.9/drivers/mtd/chips/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/chips/Kconfig 2013-05-02 01:47:52.620227148 +0300
+@@ -240,6 +240,12 @@ config MTD_XIP
+ This allows MTD support to work with flash memory which is also
+ used for XIP purposes. If you're not sure what this is all about
+ then say N.
++config RTL819X_SPI_FLASH
++ bool "RTL819x SPI flash support"
++ depends on MTD
++ help
++ Support SPI flash for MX25L,SST series
++
+
+ endmenu
+
+--- linux-2.6.30.9/drivers/mtd/chips/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/chips/Makefile 2013-05-02 01:47:52.620227148 +0300
+@@ -13,3 +13,4 @@ obj-$(CONFIG_MTD_JEDECPROBE) += jedec_pr
+ obj-$(CONFIG_MTD_RAM) += map_ram.o
+ obj-$(CONFIG_MTD_ROM) += map_rom.o
+ obj-$(CONFIG_MTD_ABSENT) += map_absent.o
++obj-$(CONFIG_RTL819X_SPI_FLASH) += rtl819x/
+--- linux-2.6.30.9/drivers/mtd/devices/doc2001.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/devices/doc2001.c 2013-05-02 01:47:52.629227147 +0300
+@@ -10,8 +10,11 @@
+ #include <asm/errno.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
++#include <linux/miscdevice.h>
++#include <linux/pci.h>
+ #include <linux/delay.h>
+ #include <linux/slab.h>
++#include <linux/sched.h>
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/bitops.h>
+@@ -20,6 +23,48 @@
+ #include <linux/mtd/nand.h>
+ #include <linux/mtd/doc2000.h>
+
++#ifdef CONFIG_RTL_819X
++/*porting for RTL865xC-RTL8190 SDK by alva_zhang@2007.11*/
++#include <linux/config.h>
++#include <linux/mtd/partitions.h>
++
++#define CALL_APP_TO_LOAD_DEFAULT // call user program to load default
++extern int flash_hw_start;
++#define noCONFIG_MTD_DEBUG
++#define CONFIG_MTD_DEBUG_VERBOSE 3
++extern int flash_hw_start, flash_hw_len, flash_ds_start, flash_ds_len, flash_write_flag;
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++#define RTL_BOOTCODE_END (0x6000)
++static struct mtd_partition rtl8196_partitions[ ] = {
++ {
++ name: "boot+cfg+linux",
++ size: (CONFIG_RTL_ROOT_IMAGE_OFFSET-0),
++ offset: 0x00000000,
++ },
++ {
++ name: "root fs",
++ size: (CONFIG_RTL_FLASH_SIZE-CONFIG_RTL_ROOT_IMAGE_OFFSET),
++ offset: (CONFIG_RTL_ROOT_IMAGE_OFFSET),
++ }
++};
++#else
++static struct mtd_partition rtl8196_partitions[ ] = {
++ {
++ name: "boot+cfg+linux",
++ size: 0xF0000,
++ offset: 0x00000000,
++ },
++ {
++ name: "root fs",
++ size: 0x110000,
++ offset: 0xF0000,
++ }
++};
++#endif
++#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
++#endif /*#ifdef CONFIG_RTL_819X */
++
++
+ /* #define ECC_DEBUG */
+
+ /* I have no idea why some DoC chips can not use memcop_form|to_io().
+@@ -32,12 +77,29 @@ static int doc_read(struct mtd_info *mtd
+ size_t *retlen, u_char *buf);
+ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len,
+ size_t *retlen, const u_char *buf);
++
++#ifdef CONFIG_RTL_819X
++/* Do nothing here*/
++#else
+ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs,
+ struct mtd_oob_ops *ops);
+ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs,
+ struct mtd_oob_ops *ops);
++#endif
++
+ static int doc_erase (struct mtd_info *mtd, struct erase_info *instr);
+
++#ifdef CONFIG_RTL_819X
++/*porting for RTL865xC-RTL8190 SDK by alva_zhang@2007.11*/
++static int erase_one_block(struct DiskOnChip *this, __u32 addr, __u32 len);
++#endif
++
++#ifdef CONFIG_RTL_819X
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++int find_section_boundary(struct mtd_info *mtd,unsigned int start, unsigned int end, unsigned int *rstart, unsigned *rend);
++#endif
++#endif
++
+ static struct mtd_info *docmillist = NULL;
+
+ /* Perform the required delay cycles by reading from the NOP register */
+@@ -149,6 +211,10 @@ static inline void DoC_Address(void __io
+ DoC_Delay(docptr, 4);
+ }
+
++#ifdef CONFIG_RTL_819X
++/*porting for RTL865xC-RTL8190 SDK by alva_zhang@2007.11*/
++/* Do nothing here*/
++#else
+ /* DoC_SelectChip: Select a given flash chip within the current floor */
+ static int DoC_SelectChip(void __iomem * docptr, int chip)
+ {
+@@ -281,6 +347,7 @@ static void DoC_ScanChips(struct DiskOnC
+ printk(KERN_INFO "%d flash chips found. Total DiskOnChip size: %ld MiB\n",
+ this->numchips ,this->totlen >> 20);
+ }
++#endif /*#ifdef CONFIG_RTL_819X */
+
+ static int DoCMil_is_alias(struct DiskOnChip *doc1, struct DiskOnChip *doc2)
+ {
+@@ -318,9 +385,16 @@ static int DoCMil_is_alias(struct DiskOn
+ void DoCMil_init(struct mtd_info *mtd)
+ {
+ struct DiskOnChip *this = mtd->priv;
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ struct DiskOnChip *old = NULL;
++#endif
+
+ /* We must avoid being called twice for the same device. */
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ if (docmillist)
+ old = docmillist->priv;
+
+@@ -337,17 +411,31 @@ void DoCMil_init(struct mtd_info *mtd)
+ else
+ old = NULL;
+ }
++#endif /*CONFIG_RTL_819X*/
+
+ mtd->name = "DiskOnChip Millennium";
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ printk(KERN_NOTICE "DiskOnChip Millennium found at address 0x%lX\n",
+ this->physadr);
++#endif
++
++ mtd->type = MTD_NORFLASH;
++ mtd->flags = MTD_CAP_NORFLASH;
++#ifdef CONFIG_RTL_819X
++#else
++ mtd->ecctype = MTD_ECC_RS_DiskOnChip;
++#endif
+
+- mtd->type = MTD_NANDFLASH;
+- mtd->flags = MTD_CAP_NANDFLASH;
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ mtd->size = 0;
+
+ /* FIXME: erase size is not always 8KiB */
+ mtd->erasesize = 0x2000;
++#endif
+
+ mtd->writesize = 512;
+ mtd->oobsize = 16;
+@@ -357,10 +445,19 @@ void DoCMil_init(struct mtd_info *mtd)
+ mtd->unpoint = NULL;
+ mtd->read = doc_read;
+ mtd->write = doc_write;
++
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ mtd->read_oob = doc_read_oob;
+ mtd->write_oob = doc_write_oob;
++#endif
++
+ mtd->sync = NULL;
+
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ this->totlen = 0;
+ this->numchips = 0;
+ this->curfloor = -1;
+@@ -368,6 +465,7 @@ void DoCMil_init(struct mtd_info *mtd)
+
+ /* Ident all the chips present. */
+ DoC_ScanChips(this);
++#endif
+
+ if (!this->totlen) {
+ kfree(mtd);
+@@ -376,15 +474,199 @@ void DoCMil_init(struct mtd_info *mtd)
+ this->nextdoc = docmillist;
+ docmillist = mtd;
+ mtd->size = this->totlen;
++//#ifdef CONFIG_RTK_MTD_ROOT
++#ifdef CONFIG_RTL_819X
++ add_mtd_partitions(mtd, rtl8196_partitions, NB_OF(rtl8196_partitions));
++#else
+ add_mtd_device(mtd);
++#endif
+ return;
+ }
+ }
+ EXPORT_SYMBOL_GPL(DoCMil_init);
+
++#ifdef CONFIG_RTL_819X
++static int doc_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
++ size_t *retlen, const u_char *buf, u_char *eccbuf)
++{
++ int i,ret;
++ struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
++ unsigned long docptr =(unsigned long) this->virtadr;
++ unsigned int ofs;
++ unsigned short val,val1;
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ unsigned int rstart,rend;
++ unsigned int start,end;
++#endif
++// david ------------
++unsigned long timeo, offset;
++unsigned long flags;
++//-------------------
++
++ /* Don't allow write past end of device */
++ if (to >= this->totlen)
++ {
++// david
++// printk("write to >= total len\n");
++ printk(KERN_WARNING "write to >= total len\n");
++ return -EINVAL;
++ }
++ DEBUG(MTD_DEBUG_LEVEL1,"going to write len=0x%x,to =0x%x\n", (int)len, (int)to);
++
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ start=to;
++ end=0xFFFFFFF;
++ if(flash_write_flag & 1)
++ {
++ if(0 == start)
++ start = CONFIG_RTL_HW_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_HW_SETTING_OFFSET )
++ start = CONFIG_RTL_HW_SETTING_OFFSET;
++ end=CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++ }
++
++ if(flash_write_flag & 2 )
++ {
++ if(0 == start)
++ start = CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_DEFAULT_SETTING_OFFSET )
++ start = CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++
++ end = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++ }
++
++ if( flash_write_flag & 4 )
++ {
++ if(0 == start)
++ start = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_CURRENT_SETTING_OFFSET )
++ start = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++ end = CONFIG_RTL_WEB_PAGES_OFFSET;
++ }
++ find_section_boundary(mtd,start,end,&rstart,&rend);
++
++#endif
++
++ *retlen = len;
++ ofs = docptr + to;
++ for(i=0; i< len; i+=2)
++ {
++// david -----------------------------------------------------
++#if 0
++ val = *(unsigned short *)buf;
++
++ *(volatile unsigned short *)(0xbfc00000 + 0x555 * 2)= 0xaa;
++ *(volatile unsigned short *)(0xbfc00000 + 0x2aa * 2)= 0x55;
++ *(volatile unsigned short *)(0xbfc00000 + 0x555 * 2)= 0xa0;
++ *(volatile unsigned short *)(ofs )= val;
++
++ j=0xfffff1;
++ do{
++ val1=*(volatile unsigned short *)(ofs);
++ if( ((val1^val) & 0x80)==0 )
++ break;
++
++ }while(j--!=1);
++ if (j <= 2)
++ printk("program fails\n");
++#else
++
++// if ( ofs < (docptr+CONFIG_MTD_DOCPROBE_ADDRESS) )
++// goto next_word;
++
++ offset = (to >> this->chipshift)*(1 << this->chipshift);
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ if(ofs <(docptr+rstart))
++ goto next_word;
++ if(ofs >= (docptr+rend))
++ {
++ return 0;
++ }
++#else
++#if !defined(COMPACK_SETTING) && !defined(NO_CHECK_REGION)
++ if ( flash_write_flag != 0x8000
++//#ifdef CONFIG_RTK_MTD_ROOT
++#ifdef CONFIG_RTL_819X
++ || offset < (rtl8196_partitions[0].size+ rtl8196_partitions[0].offset)
++#endif
++ )
++ {
++
++ if ( (flash_write_flag & 1) && (ofs < (docptr+flash_hw_start)) )
++ goto next_word;
++
++ if ( (flash_write_flag & 2) && (ofs < (docptr+flash_ds_start)) )
++ goto next_word;
++
++ if ( (flash_write_flag & 4) && (ofs < (docptr+flash_ds_start+flash_ds_len)) )
++ goto next_word;
++ }
++#endif // COMPACK_SETTING && NO_CHECK_REGION
++#endif //CONFIG_RTL_FLASH_MAPPING_ENABLE
++ val = *(unsigned short *)buf;
++
++ mtd_save_flags(flags);mtd_cli(); // david
++
++ *(volatile unsigned short *)(0xbfc00000 + offset + 0x555 * 2)= 0xaa;
++ *(volatile unsigned short *)(0xbfc00000 + offset + 0x2aa * 2)= 0x55;
++ *(volatile unsigned short *)(0xbfc00000 + offset + 0x555 * 2)= 0xa0;
++ *(volatile unsigned short *)(ofs )= val;
++
++ mtd_restore_flags(flags); // david
++
++ timeo = jiffies + (HZ * 50);
++ do{
++#if 0
++ val1=*(volatile unsigned short *)(ofs);
++ if ( val1 == val )
++ break;
++#endif
++ unsigned short val2;
++
++ val2=*(volatile unsigned short *)(ofs);
++ val1=*(volatile unsigned short *)(ofs);
++
++ if (((val1^val2) & 0x40) != 0)
++ continue;
++ if (((val1^val) & 0x80) != 0)
++ continue;
++ if ( val1 == val )
++ break;
++//--------------
++ } while ( !time_after(jiffies, timeo) );
++
++ if ( time_after(jiffies, timeo)) {
++ printk(KERN_WARNING "program timeout!");
++ printk(KERN_WARNING " write: %x, read:%x, addr: %x\n", val, val1, ofs);
++ return -1;
++ }
++
++#ifndef COMPACK_SETTING
++next_word:
++#endif
++
++#endif
++//---------------------------------------------------------
++ ofs += 2;
++ buf += 2;
++
++ }
++
++ ret = 0 ;
++// printk("in doc_write_ecc ret=%08x\n", ret);
++ return ret;
++}
++#endif /* #ifdef CONFIG_RTL_819X */
++
+ static int doc_read (struct mtd_info *mtd, loff_t from, size_t len,
+ size_t *retlen, u_char *buf)
+ {
++#ifdef CONFIG_RTL_819X
++static int doc_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
++ size_t *retlen, u_char *buf, u_char *eccbuf);
++/* Just a special case of doc_read_ecc */
++ return doc_read_ecc(mtd, from, len, retlen, buf, NULL);
++#else
+ int i, ret;
+ volatile char dummy;
+ unsigned char syndrome[6], eccbuf[6];
+@@ -491,11 +773,49 @@ static int doc_read (struct mtd_info *mt
+ WriteDOC(DOC_ECC_DIS, docptr , ECCConf);
+
+ return ret;
++
++#endif /* #ifdef CONFIG_RTL_819X */
++}
++
++#ifdef CONFIG_RTL_819X
++static int doc_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
++ size_t *retlen, u_char *buf, u_char *eccbuf)
++{
++ int i;
++ unsigned short tmp;
++ struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
++ unsigned long docptr = this->virtadr+from;
++
++ /* Don't allow read past end of device */
++ if (from >= this->totlen)
++ return -EINVAL;
++ for(i=0; i< len; i+=2)
++ {
++ tmp = *(volatile unsigned short *)(docptr);
++ *(unsigned short *)buf = tmp;
++ buf += 2;
++ docptr +=2;
++ }
++ if (len & 0x01)
++ {
++ tmp = *(volatile unsigned long *)(docptr);
++ *(unsigned char *)buf = (tmp >> 8) & 0xff;
++ }
++
++ /* Let the caller know we completed it */
++ *retlen = len;
++
++ return 0;
+ }
++#endif /*#ifdef CONFIG_RTL_819X */
+
+ static int doc_write (struct mtd_info *mtd, loff_t to, size_t len,
+ size_t *retlen, const u_char *buf)
+ {
++#ifdef CONFIG_RTL_819X
++ char eccbuf[6];
++ return doc_write_ecc(mtd, to, len, retlen, buf, eccbuf);
++#else
+ int i,ret = 0;
+ char eccbuf[6];
+ volatile char dummy;
+@@ -617,8 +937,12 @@ static int doc_write (struct mtd_info *m
+ *retlen = len;
+
+ return ret;
++#endif /*#ifdef CONFIG_RTL_819X */
+ }
+
++#ifdef CONFIG_RTL_819X
++/*do nothing here*/
++#else
+ static int doc_read_oob(struct mtd_info *mtd, loff_t ofs,
+ struct mtd_oob_ops *ops)
+ {
+@@ -753,9 +1077,229 @@ static int doc_write_oob(struct mtd_info
+
+ return ret;
+ }
++#endif /*#ifdef CONFIG_RTL_819X */
++
++#ifdef CONFIG_RTL_819X
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++int find_section_boundary(struct mtd_info *mtd,unsigned int start, unsigned int end, unsigned int *rstart, unsigned *rend)
++{
++ int i = 0;
++ int j = 0;
++ struct mtd_erase_region_info *regions = mtd->eraseregions;
++ while ((i < mtd->numeraseregions) &&
++ (start >= regions[i].offset)) {
++ i++;
++ }
++ i--;
++
++ j = 1;
++ while((j <= regions[i].numblocks) &&
++ (start >= (regions[i].offset+regions[i].erasesize*j))) {
++ j++;
++ }
++ *rstart=(regions[i].offset+regions[i].erasesize*(j-1));
++
++ i=0;
++ while ((i < mtd->numeraseregions) &&
++ (end >= regions[i].offset)) {
++ i++;
++ }
++ i--;
++
++ j = 1;
++ while((j <= regions[i].numblocks) &&
++ (end >= (regions[i].offset+regions[i].erasesize*j))) {
++ j++;
++ }
++ *rend=(regions[i].offset+regions[i].erasesize*j);
++
++}
++#endif
++#endif
+
+ int doc_erase (struct mtd_info *mtd, struct erase_info *instr)
+ {
++#ifdef CONFIG_RTL_819X
++
++struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
++ unsigned long adr, len;
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ unsigned int rstart,rend;
++ unsigned int start,end;
++#endif
++ int i;
++ int first;
++ struct mtd_erase_region_info *regions = mtd->eraseregions;
++
++ DEBUG(MTD_DEBUG_LEVEL1, "going to erase sector addr=%08x,len=%08x\n",
++ instr->addr, instr->len);
++
++ if (instr->addr > mtd->size) {
++ printk(KERN_WARNING "Erase addr greater than max size (0x%x > 0x%x)\n",
++ instr->addr, mtd->size );
++ return -EINVAL;
++ }
++
++ if ((instr->len + instr->addr) > mtd->size) {
++ printk(KERN_WARNING "Erase size greater than max size (0x%x + 0x%x > 0x%x)\n",
++ instr->addr, instr->len, mtd->size );
++ return -EINVAL;
++ }
++
++ /* Check that both start and end of the requested erase are
++ * aligned with the erasesize at the appropriate addresses.
++ */
++
++ i = 0;
++
++ /* Skip all erase regions which are ended before the start of
++ the requested erase. Actually, to save on the calculations,
++ we skip to the first erase region which starts after the
++ start of the requested erase, and then go back one.
++ */
++
++ while ((i < mtd->numeraseregions) &&
++ (instr->addr >= regions[i].offset)) {
++ i++;
++ }
++ i--;
++
++ /* OK, now i is pointing at the erase region in which this
++ * erase request starts. Check the start of the requested
++ * erase range is aligned with the erase size which is in
++ * effect here.
++ */
++
++ if (instr->addr & (regions[i].erasesize-1)) {
++ return -EINVAL;
++ }
++
++ /* Remember the erase region we start on. */
++
++ first = i;
++
++ /* Next, check that the end of the requested erase is aligned
++ * with the erase region at that address.
++ */
++
++ while ((i < mtd->numeraseregions) &&
++ ((instr->addr + instr->len) >= regions[i].offset)) {
++ i++;
++ }
++
++ /* As before, drop back one to point at the region in which
++ * the address actually falls.
++ */
++
++ i--;
++
++ if ((instr->addr + instr->len) & (regions[i].erasesize-1)) {
++ return -EINVAL;
++ }
++
++
++ adr = instr->addr;
++ len = instr->len;
++
++ i = first;
++ instr->state = MTD_ERASING;
++
++
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ start=adr;
++ end=0xFFFFFFF;
++ if(flash_write_flag & 1)
++ {
++ if(0 == start)
++ start = CONFIG_RTL_HW_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_HW_SETTING_OFFSET )
++ start = CONFIG_RTL_HW_SETTING_OFFSET;
++ end = CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++ }
++
++ if(flash_write_flag & 2 )
++ {
++ if(0 == start)
++ start = CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_DEFAULT_SETTING_OFFSET )
++ start = CONFIG_RTL_DEFAULT_SETTING_OFFSET;
++ end = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++ }
++
++ if(flash_write_flag & 4 )
++ {
++ if(0 == start)
++ start = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++ else if( start > CONFIG_RTL_CURRENT_SETTING_OFFSET )
++ start = CONFIG_RTL_CURRENT_SETTING_OFFSET;
++
++ end = CONFIG_RTL_WEB_PAGES_OFFSET;
++ }
++
++ find_section_boundary(mtd,start,end,&rstart,&rend);
++
++ //printk("line[%d] rstart 0x%x rend 0x%x\n",__LINE__,rstart,rend);
++
++ /*don't erase bootcode*/
++ if(rstart < RTL_BOOTCODE_END)
++ rstart = RTL_BOOTCODE_END;
++
++ //printk("line[%d] rstart 0x%x rend 0x%x\n",__LINE__,rstart,rend);
++#endif
++
++ while (len) {
++// if (adr >= CONFIG_MTD_DOCPROBE_ADDRESS) {
++
++#if defined(COMPACK_SETTING) || defined(NO_CHECK_REGION)
++ if ( erase_one_block(this, adr, regions[i].erasesize) )
++ return -1;
++
++#else
++
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ if(adr >= rstart)
++#else
++ if ( ((flash_write_flag & 1) && (adr == flash_hw_start)) ||
++ ((flash_write_flag & 2) &&(adr >= flash_ds_start && adr < (flash_ds_start+flash_ds_len)))
++ || ((flash_write_flag & 4) && (adr >= (flash_ds_start+flash_ds_len)))
++//#ifdef CONFIG_RTK_MTD_ROOT
++#ifdef CONFIG_RTL_819X
++ || (adr >= (rtl8196_partitions[0].size+ rtl8196_partitions[0].offset))
++#endif
++ || (flash_write_flag == 0x8000)
++ )
++#endif
++ {
++ if ( erase_one_block(this, adr, regions[i].erasesize) )
++ return -1;
++ }
++
++#endif // COMPACK_SETTING || NO_CHECK_REGION
++
++ adr += regions[i].erasesize;
++ if (len < regions[i].erasesize)
++ len = 0;
++ else
++ len -= regions[i].erasesize;
++
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ if(rend <= adr)
++ {
++ /*no need to erase other block*/
++ len=0;
++ }
++#endif
++ if ( adr >= (regions[i].offset + regions[i].erasesize*regions[i].numblocks))
++ i++;
++ }
++
++ instr->state = MTD_ERASE_DONE;
++ if (instr->callback) {
++ instr->callback(instr);
++ }
++
++ return 0;
++#else
+ volatile char dummy;
+ struct DiskOnChip *this = mtd->priv;
+ __u32 ofs = instr->addr;
+@@ -809,7 +1353,52 @@ int doc_erase (struct mtd_info *mtd, str
+ mtd_erase_callback(instr);
+
+ return 0;
++
++#endif /*#ifdef CONFIG_RTL_819X */
++}
++
++#ifdef CONFIG_RTL_819X
++static int erase_one_block(struct DiskOnChip *this, __u32 addr, __u32 len)
++{
++ unsigned long timeo;
++ unsigned long docptr = this->virtadr;
++ __u32 ofs, offset;
++ unsigned long flags; // david
++
++
++ DEBUG(MTD_DEBUG_LEVEL1, "Erase sector, addr=0x%x, docptr=0x%x, len=0x%x\n",
++ (int)addr, (int)docptr, (int)len);
++
++ // issue erase command!
++ ofs = docptr + addr;
++
++ offset = (addr >> this->chipshift)*(1 << this->chipshift);
++
++ mtd_save_flags(flags);mtd_cli(); // david
++ *(volatile unsigned short *)(docptr + offset + 0x555 * 2) = 0xaa;
++ *(volatile unsigned short *)(docptr + offset + 0x2aa * 2) = 0x55;
++ *(volatile unsigned short *)(docptr + offset + 0x555 * 2) = 0x80;
++ *(volatile unsigned short *)(docptr + offset + 0x555 * 2) = 0xaa;
++ *(volatile unsigned short *)(docptr + offset + 0x2aa * 2) = 0x55;
++ *(volatile unsigned short *)(ofs ) = 0x30;
++ mtd_restore_flags(flags); // david
++
++ timeo = jiffies + (HZ * 40);
++
++ while (1) {
++ if ((*(volatile unsigned short *)(ofs))==0xffff) {
++ DEBUG(MTD_DEBUG_LEVEL1, "Erase success!\n");
++ break;
++ }
++ if (time_after(jiffies, timeo)) {
++ printk(KERN_WARNING "Erase timeout!\n");
++ return -1;
++ }
++ udelay(1);
++ }
++ return 0;
+ }
++#endif /*#ifdef CONFIG_RTL_819X */
+
+ /****************************************************************************
+ *
+--- linux-2.6.30.9/drivers/mtd/devices/docprobe.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/devices/docprobe.c 2013-05-02 01:47:52.630227147 +0300
+@@ -36,7 +36,7 @@
+ <linux-mtd@lists.infradead.org>.
+ */
+ #define DOC_SINGLE_DRIVER
+-
++#include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <asm/errno.h>
+@@ -56,10 +56,68 @@
+ #define CONFIG_MTD_DOCPROBE_ADDRESS 0
+ #endif
+
++#ifdef CONFIG_RTL_819X
++// david ----------------------
++/* MXIC */
++#define MANUFACTURER_MXIC 0x00C2
++#define MX29LV800B 0x225B
++#define MX29LV160AB 0x2249
++#define MX29LV320AB 0x22A8
++#define MX29LV640AB 0x22CB
++
++/*AMD*/
++#define MANUFACTURER_AMD 0x0001
++#define AM29LV800BB 0x225B
++#define AM29LV160DB 0x2249
++#define AM29LV320DB 0x22F9
++
++/*ST*/
++#define MANUFACTURER_ST 0x0020
++#define M29W160DB 0X2249
++
++/* ESMT */
++#define MANUFACTURER_ESMT 0x008C
++#define F49L160BA 0x2249
++
++/* SAMSUNG */
++#define MANUFACTURER_SAMSUNG 0x00EC
++#define K8D1716UBC 0x2277
++
++/* ESI */
++#define MANUFACTURER_ESI 0x004A
++#define ES29LV320D 0x22F9
++
++/* EON */
++#define MANUFACTURER_EON 0x007F
++#define EN29LV160A 0x2249
++
++#ifdef CONFIG_RTL8196B
++#define FLASH_BASE 0xbd000000
++#else
++#define FLASH_BASE 0xbe000000
++#endif
++
++struct flash_info {
++ const __u16 mfr_id;
++ const __u16 dev_id;
++ const char *name;
++ const u_long size;
++ const int shift; // shift number of chip size
++ const int numeraseregions;
++ const struct mtd_erase_region_info regions[4];
++};
++
++static int probeChip(struct DiskOnChip *doc, struct mtd_info *mtd);
++//-----------------------------
++#endif /*#ifdef CONFIG_RTL_819X*/
++
++//static unsigned long doc_config_location = CONFIG_MTD_DOCPROBE_ADDRESS;
++//module_param(doc_config_location, ulong, 0);
++//MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip");
+
+-static unsigned long doc_config_location = CONFIG_MTD_DOCPROBE_ADDRESS;
+-module_param(doc_config_location, ulong, 0);
+-MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip");
++#ifdef CONFIG_RTL_819X
++ /* Do nothing here*/
++#else
+
+ static unsigned long __initdata doc_locations[] = {
+ #if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
+@@ -76,6 +134,13 @@ static unsigned long __initdata doc_loca
+ 0xe0000, 0xe2000, 0xe4000, 0xe6000,
+ 0xe8000, 0xea000, 0xec000, 0xee000,
+ #endif /* CONFIG_MTD_DOCPROBE_HIGH */
++#elif defined(__PPC__)
++ 0xe4000000,
++#elif defined(CONFIG_MOMENCO_OCELOT)
++ 0x2f000000,
++ 0xff000000,
++#elif defined(CONFIG_MOMENCO_OCELOT_G) || defined (CONFIG_MOMENCO_OCELOT_C)
++ 0xff000000,
+ #else
+ #warning Unknown architecture for DiskOnChip. No default probe locations defined
+ #endif
+@@ -217,8 +282,9 @@ static inline int __init doccheck(void _
+ #endif
+ return 0;
+ }
++#endif /*#ifdef CONFIG_RTL_819X*/
+
+-static int docfound;
++//static int docfound;
+
+ extern void DoC2k_init(struct mtd_info *);
+ extern void DoCMil_init(struct mtd_info *);
+@@ -229,11 +295,18 @@ static void __init DoC_Probe(unsigned lo
+ void __iomem *docptr;
+ struct DiskOnChip *this;
+ struct mtd_info *mtd;
+- int ChipID;
++ //int ChipID;
+ char namebuf[15];
+ char *name = namebuf;
++
++
++ char *im_funcname = NULL;
++ char *im_modname = NULL;
++
++
+ void (*initroutine)(struct mtd_info *) = NULL;
+
++#ifndef CONFIG_RTL_819X
+ docptr = ioremap(physadr, DOC_IOREMAP_LEN);
+
+ if (!docptr)
+@@ -302,8 +375,286 @@ static void __init DoC_Probe(unsigned lo
+ kfree(mtd);
+ }
+ iounmap(docptr);
++#else
++ docptr = FLASH_BASE;
++ //-----------------------------
++
++
++ mtd = kmalloc(sizeof(struct DiskOnChip) + sizeof(struct mtd_info), GFP_KERNEL);
++
++ if (!mtd) {
++ printk(KERN_WARNING "Cannot allocate memory for data structures. Dropping.\n");
++ iounmap((void *)docptr);
++ return;
+ }
+
++ this = (struct DiskOnChip *)(&mtd[1]);
++
++ memset((char *)mtd,0, sizeof(struct mtd_info));
++ memset((char *)this, 0, sizeof(struct DiskOnChip));
++
++ mtd->priv = this;
++ this->virtadr = docptr;
++ this->physadr = physadr;
++ this->ChipID = DOC_ChipID_DocMil;
++
++ name="Millennium";
++ im_funcname = "DoCMil_init";
++ im_modname = "doc2001";
++
++ if ( probeChip(this, mtd) == 0) // david added,
++ initroutine = &DoCMil_init;
++
++ if (initroutine) {
++ (*initroutine)(mtd);
++ return;
++ }
++ printk(KERN_NOTICE "Cannot find driver for DiskOnChip %s at 0x%lX\n", name, physadr);
++ iounmap((void *)docptr);
++
++#endif /*#ifdef CONFIG_RTL_819X*/
++}
++
++#ifdef CONFIG_RTL_819X
++// david -------------------------------------------------------------------
++static int probeChip(struct DiskOnChip *doc, struct mtd_info *mtd)
++{
++ /* Keep this table on the stack so that it gets deallocated after the
++ * probe is done.
++ */
++ const struct flash_info table[] = {
++ {
++ mfr_id: MANUFACTURER_MXIC,
++ dev_id: MX29LV800B,
++ name: "MXIC MX29LV800B",
++ size: 0x00100000,
++ shift: 20,
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 15 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_MXIC,
++ dev_id: MX29LV160AB,
++ name: "MXIC MX29LV160AB",
++ size: 0x00200000,
++ shift: 21,
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_MXIC,
++ dev_id: MX29LV320AB,
++ name: "MXIC MX29LV320AB",
++ size: 0x00400000,
++ shift: 22,
++ numeraseregions: 2,
++ regions: {
++ { offset: 0x000000, erasesize: 0x02000, numblocks: 8 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 63 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_AMD,
++ dev_id: AM29LV800BB,
++ name: "AMD AM29LV800BB",
++ size: 0x00100000,
++ shift: 20,
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 15 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_AMD,
++ dev_id: AM29LV160DB,
++ name: "AMD AM29LV160DB",
++ size: 0x00200000,
++ shift: 21,
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_AMD,
++ dev_id: AM29LV320DB,
++ name: "AMD AM29LV320DB",
++ size: 0x00400000,
++ shift: 22,
++ numeraseregions: 2,
++ regions: {
++ { offset: 0x000000, erasesize: 0x02000, numblocks: 8 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 63 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_ST,
++ dev_id: M29W160DB,
++ name: "ST M29W160DB",
++ size: 0x00200000,
++ shift: 21,/*21 bit=> that is 2 MByte size*/
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_MXIC,
++ dev_id: MX29LV640AB,
++ name: "MXIC MX29LV640AB",
++ size: 0x00800000,
++ shift: 23,/*22 bit=> that is 8 MByte size*/
++ numeraseregions: 2,
++ regions: {
++ { offset: 0x000000, erasesize: 0x02000, numblocks: 8 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 127 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_SAMSUNG,
++ dev_id: K8D1716UBC,
++ name: "SAMSUNG K8D1716UBC",
++ size: 0x00200000,
++ shift: 21,/*21 bit=> that is 2 MByte size*/
++ numeraseregions: 2,
++ regions: {
++ { offset: 0x000000, erasesize: 0x02000, numblocks: 8 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_ESMT,
++ dev_id: F49L160BA,
++ name: "ESMT F49L160BA",
++ size: 0x00200000,
++ shift: 21,/*21 bit=> that is 2 MByte size*/
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_ESI,
++ dev_id: ES29LV320D,
++ name: "ESI ES29LV320D",
++ size: 0x00400000,
++ shift: 22,/*22 bit=> that is 4 MByte size*/
++ numeraseregions: 2,
++ regions: {
++ { offset: 0x000000, erasesize: 0x02000, numblocks: 8 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 63 }
++ }
++ },
++ {
++ mfr_id: MANUFACTURER_EON,
++ dev_id: EN29LV160A,
++ name: "EON EN29LV160A",
++ size: 0x00200000,
++ shift: 21,
++ numeraseregions: 4,
++ regions: {
++ { offset: 0x000000, erasesize: 0x04000, numblocks: 1 },
++ { offset: 0x004000, erasesize: 0x02000, numblocks: 2 },
++ { offset: 0x008000, erasesize: 0x08000, numblocks: 1 },
++ { offset: 0x010000, erasesize: 0x10000, numblocks: 31 }
++ }
++ }
++ };
++
++ struct DiskOnChip *this = (struct DiskOnChip *)mtd->priv;
++ unsigned long docptr = this->virtadr;
++ __u16 mfid, devid;
++ int i, j, k, interleave=1, chipsize;
++
++ // issue reset and auto-selection command
++ *(volatile unsigned short *)(FLASH_BASE) = 0xf0;
++
++ *(volatile unsigned short *)(FLASH_BASE + 0x555 * 2) = 0xaa;
++ *(volatile unsigned short *)(FLASH_BASE + 0x2aa * 2) = 0x55;
++ *(volatile unsigned short *)(FLASH_BASE + 0x555 * 2) = 0x90;
++
++ mfid = *((volatile unsigned short *)docptr);
++ devid = *((volatile unsigned short *)(docptr + 1*2));
++
++ *(volatile unsigned short *)(FLASH_BASE) = 0xf0;
++
++ for (i=0; i< sizeof(table)/sizeof(table[0]); i++) {
++ if ( mfid==table[i].mfr_id && devid==table[i].dev_id)
++ break;
++ }
++ if ( i == sizeof(table)/sizeof(table[0]) )
++ return -1;
++
++ // Look for 2nd flash
++ *(volatile unsigned short *)(FLASH_BASE + table[i].size) = 0xf0;
++ *(volatile unsigned short *)(FLASH_BASE + table[i].size + 0x555 * 2) = 0xaa;
++ *(volatile unsigned short *)(FLASH_BASE + table[i].size + 0x2aa * 2) = 0x55;
++ *(volatile unsigned short *)(FLASH_BASE + table[i].size + 0x555 * 2) = 0x90;
++
++ mfid = *((volatile unsigned short *)(docptr + table[i].size));
++ devid = *((volatile unsigned short *)(docptr + table[i].size + 1*2));
++
++ *(volatile unsigned short *)(FLASH_BASE+table[i].size) = 0xf0;
++ if ( mfid==table[i].mfr_id && devid==table[i].dev_id) {
++ interleave++;
++ }
++
++ printk(KERN_NOTICE "Found %d x %ldM Byte %s at 0x%lx\n",
++ interleave, (table[i].size)/(1024*1024), table[i].name, docptr);
++
++ mtd->size = table[i].size*interleave;
++ mtd->numeraseregions = table[i].numeraseregions*interleave;
++
++ mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) *
++ mtd->numeraseregions*interleave, GFP_KERNEL);
++ if (!mtd->eraseregions) {
++ printk(KERN_WARNING "Failed to allocate "
++ "memory for MTD erase region info\n");
++ kfree(mtd);
++ return -1;
++ }
++
++ for (k=0, chipsize=0; interleave>0; interleave--, chipsize+=table[i].size) {
++ for (j=0; j<table[i].numeraseregions; j++, k++) {
++ mtd->eraseregions[k].offset = table[i].regions[j].offset+chipsize;
++ mtd->eraseregions[k].erasesize = table[i].regions[j].erasesize;
++ mtd->eraseregions[k].numblocks = table[i].regions[j].numblocks;
++ if (mtd->erasesize < mtd->eraseregions[k].erasesize)
++ mtd->erasesize = mtd->eraseregions[k].erasesize;
++ }
++ }
++
++ this->totlen = mtd->size;
++ this->numchips = interleave;
++ this->chipshift = table[i].shift;
++
++ return 0;
++}
++//---------------------------------------------------------------------------
++#endif /*#ifdef CONFIG_RTL_819X */
++
+
+ /****************************************************************************
+ *
+@@ -313,6 +664,14 @@ static void __init DoC_Probe(unsigned lo
+
+ static int __init init_doc(void)
+ {
++#ifdef CONFIG_RTL_819X
++ printk(KERN_NOTICE "RealTek E-Flash System Driver. (C) 2002 RealTek Corp.\n");
++ DoC_Probe(CONFIG_MTD_DOCPROBE_ADDRESS);
++ /* So it looks like we've been used and we get unloaded */
++// MOD_INC_USE_COUNT;
++// MOD_DEC_USE_COUNT;
++ return 0;
++#else
+ int i;
+
+ if (doc_config_location) {
+@@ -328,6 +687,7 @@ static int __init init_doc(void)
+ if (!docfound)
+ printk(KERN_INFO "No recognised DiskOnChip devices found\n");
+ return -EAGAIN;
++#endif
+ }
+
+ module_init(init_doc);
+--- linux-2.6.30.9/drivers/mtd/maps/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/maps/Makefile 2013-05-02 01:47:52.636227146 +0300
+@@ -62,3 +62,4 @@ obj-$(CONFIG_MTD_INTEL_VR_NOR) += intel_
+ obj-$(CONFIG_MTD_BFIN_ASYNC) += bfin-async-flash.o
+ obj-$(CONFIG_MTD_RBTX4939) += rbtx4939-flash.o
+ obj-$(CONFIG_MTD_VMU) += vmu-flash.o
++obj-$(CONFIG_RTL819X_SPI_FLASH) += rtl819x_flash.o
+--- linux-2.6.30.9/drivers/mtd/mtdblock.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/mtd/mtdblock.c 2013-05-02 01:47:52.649227145 +0300
+@@ -18,6 +18,26 @@
+ #include <linux/mtd/blktrans.h>
+ #include <linux/mutex.h>
+
++#include <linux/config.h>
++
++#ifdef CONFIG_RTL_819X
++// david ---------------
++//#define CONFIG_MTD_DEBUG
++#define CONFIG_MTD_DEBUG_VERBOSE 3
++
++
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++int flash_write_flag=0; // 1: hw setting 2: default setting, 4: current setting, 8: system image
++#else
++int flash_hw_start=0x6000; // hw setting start address
++int flash_hw_len=0x2000; // hw setting length
++int flash_ds_start=0x8000; // default & current setting start address
++int flash_ds_len=0x8000; // default & current setting length
++
++int flash_write_flag=0; // 1: hw setting 2: default setting, 4: current setting, 8: system image
++#endif
++#endif /*#ifdef CONFIG_RTL_819X */
++
+
+ static struct mtdblk_dev {
+ struct mtd_info *mtd;
+@@ -134,6 +154,58 @@ static int do_cached_write (struct mtdbl
+ DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: write on \"%s\" at 0x%lx, size 0x%x\n",
+ mtd->name, pos, len);
+
++
++#ifdef CONFIG_RTL_819X
++#ifdef CONFIG_RTL_FLASH_MAPPING_ENABLE
++ /*since len is normal 0x200 less than every section*/
++ if(flash_write_flag != 0x8000)
++ {
++ flash_write_flag = 0;
++ if ( pos >= CONFIG_RTL_HW_SETTING_OFFSET && pos < CONFIG_RTL_DEFAULT_SETTING_OFFSET ) {
++ flash_write_flag |= 1;
++ if ((pos+len) > CONFIG_RTL_DEFAULT_SETTING_OFFSET ) {
++ flash_write_flag |= 2;
++ if ((pos+len) > CONFIG_RTL_CURRENT_SETTING_OFFSET )
++ flash_write_flag |= 4;
++ }
++ }
++ if ( pos >= CONFIG_RTL_DEFAULT_SETTING_OFFSET && pos < CONFIG_RTL_CURRENT_SETTING_OFFSET ) {
++ flash_write_flag |= 2;
++ if ((pos+len) > CONFIG_RTL_CURRENT_SETTING_OFFSET ) {
++ flash_write_flag |= 4;
++ }
++ }
++ else if ( pos >= CONFIG_RTL_CURRENT_SETTING_OFFSET && pos < CONFIG_RTL_WEB_PAGES_OFFSET ){
++ flash_write_flag |= 4;
++ }
++ }
++#else
++// david --------------
++ if ( flash_write_flag != 0x8000)
++ {
++ flash_write_flag = 0;
++ if (pos >= flash_hw_start && pos < (flash_hw_start+flash_hw_len) ) {
++ flash_write_flag |= 1;
++ if ((len - flash_hw_len) > 0) {
++ flash_write_flag |= 2;
++ if ((len - flash_ds_len -flash_hw_len) > 0)
++ flash_write_flag |= 4;
++ }
++ }
++ if (pos >= flash_ds_start && pos < (flash_ds_start+flash_ds_len) ) {
++ flash_write_flag |= 2;
++ if ((len - flash_ds_len) > 0) {
++ flash_write_flag |= 4;
++ }
++ }
++ else if ( pos >= (flash_ds_start+flash_ds_len) ){
++ flash_write_flag |= 4;
++ }
++ }
++//---------------------
++#endif //CONFIG_RTL_FLASH_MAPPING_ENABLE
++#endif
++
+ if (!sect_size)
+ return mtd->write(mtd, pos, len, &retlen, buf);
+
+--- linux-2.6.30.9/drivers/net/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/Kconfig 2013-05-02 01:47:52.704227141 +0300
+@@ -27,7 +27,7 @@ menuconfig NETDEVICES
+ if NETDEVICES
+
+ config COMPAT_NET_DEV_OPS
+- default y
++ default n
+ bool "Enable older network device API compatibility"
+ ---help---
+ This option enables kernel compatibility with older network devices
+@@ -2146,6 +2146,22 @@ config R8169_VLAN
+
+ If in doubt, say Y.
+
++config R8168
++ tristate "Realtek 8168 gigabit ethernet support"
++ depends on PCI
++ select CRC32
++ default y
++ ---help---
++ Say Y here if you have a Realtek 8168 PCI Gigabit Ethernet adapter.
++
++ To compile this driver as a module, choose M here: the module
++ will be called r8168. This is recommended.
++
++config R8168_NAPI
++ bool "NAPI support"
++ depends on R8168
++ default y
++
+ config SB1250_MAC
+ tristate "SB1250 Gigabit Ethernet support"
+ depends on SIBYTE_SB1xxx_SOC
+@@ -2987,19 +3003,39 @@ config PPP_BSDCOMP
+ module; it is called bsd_comp and will show up in the directory
+ modules once you have said "make modules". If unsure, say N.
+
+-config PPP_MPPE
+- tristate "PPP MPPE compression (encryption) (EXPERIMENTAL)"
+- depends on PPP && EXPERIMENTAL
+- select CRYPTO
++config PPP_MPPE_MPPC
++ tristate "Microsoft PPP compression/encryption (MPPC/MPPE)"
++ depends on PPP
+ select CRYPTO_SHA1
+ select CRYPTO_ARC4
+- select CRYPTO_ECB
+ ---help---
+- Support for the MPPE Encryption protocol, as employed by the
+- Microsoft Point-to-Point Tunneling Protocol.
++ Support for the Microsoft Point-To-Point Compression (RFC2118) and
++ Microsoft Point-To-Point Encryption (RFC3078). These protocols are
++ supported by Microsoft Windows and wide range of "hardware" access
++ servers. MPPE is common protocol in Virtual Private Networks. According
++ to RFC3078, MPPE supports 40, 56 and 128-bit key lengths. Depending on
++ PPP daemon configuration on both ends of the link, following scenarios
++ are possible:
++ - only compression (MPPC) is used,
++ - only encryption (MPPE) is used,
++ - compression and encryption (MPPC+MPPE) are used.
++
++ Please note that Hi/Fn (http://www.hifn.com) holds patent on MPPC so
++ you should check if this patent is valid in your country in order to
++ avoid legal problems.
+
+- See http://pptpclient.sourceforge.net/ for information on
+- configuring PPTP clients and servers to utilize this method.
++ For more information please visit http://mppe-mppc.alphacron.de
++
++ To compile this driver as a module, choose M here. The module will
++ be called ppp_mppe_mppc.ko.
++
++
++config PPP_IDLE_TIMEOUT_REFINE
++ tristate "PPP idle timeout refine"
++ depends on PPP
++ help
++ skip some kinds of packets from DUT to WAN or WAN to DUT that will cause PPPoE/PPTP/L2TP idle timeout
++ can't work well
+
+ config PPPOE
+ tristate "PPP over Ethernet (EXPERIMENTAL)"
+@@ -3155,4 +3191,22 @@ config VIRTIO_NET
+ This is the virtual network driver for virtio. It can be used with
+ lguest or QEMU based VMMs (like KVM or Xen). Say Y or M.
+
++config R8198EP
++ bool "Realtek 8198 slave pcie support"
++ ---help---
++ Say Y here if you have a Realtek 8198 slave pcie Ethernet adapter.
++
++config R8198EP_HOST
++ tristate "Host site view for slave PCIe RTL8198"
++ depends on R8198EP
++ ---help---
++ Say Y here if you have a Realtek 8198 slave pcie Ethernet adapter.
++config R8198EP_DEVICE
++ tristate "Device site view for salve PCIe RTL8198"
++ depends on R8198EP
++ ---help---
++ Say Y here if you have a Realtek 8198 slave pcie Ethernet adapter.
++
++
++source "drivers/net/rtl819x/Kconfig"
+ endif # NETDEVICES
+--- linux-2.6.30.9/drivers/net/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/Makefile 2013-05-02 01:47:52.705227141 +0300
+@@ -142,7 +142,7 @@ obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
+ obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
+ obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o
+ obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
+-obj-$(CONFIG_PPP_MPPE) += ppp_mppe.o
++obj-$(CONFIG_PPP_MPPE_MPPC) += ppp_mppe_mppc.o
+ obj-$(CONFIG_PPPOE) += pppox.o pppoe.o
+ obj-$(CONFIG_PPPOL2TP) += pppox.o pppol2tp.o
+
+@@ -218,6 +218,7 @@ obj-$(CONFIG_VETH) += veth.o
+ obj-$(CONFIG_NET_NETX) += netx-eth.o
+ obj-$(CONFIG_DL2K) += dl2k.o
+ obj-$(CONFIG_R8169) += r8169.o
++obj-$(CONFIG_R8168) += r8168/
+ obj-$(CONFIG_AMD8111_ETH) += amd8111e.o
+ obj-$(CONFIG_IBMVETH) += ibmveth.o
+ obj-$(CONFIG_S2IO) += s2io.o
+@@ -271,3 +272,12 @@ obj-$(CONFIG_VIRTIO_NET) += virtio_net.o
+ obj-$(CONFIG_SFC) += sfc/
+
+ obj-$(CONFIG_WIMAX) += wimax/
++
++obj-$(CONFIG_RTL_819X_SWCORE) += rtl819x/built-in.o
++subdir-$(CONFIG_RTL_819X_SWCORE) += rtl819x
++
++obj-$(CONFIG_RTK_VLAN_SUPPORT) += rtk_vlan.o
++obj-$(CONFIG_R8198EP) += r8198ep/
++
++#DIR_RTLASIC = $(DIR_LINUX)/drivers/net/rtl819x/
++#EXTRA_CFLAGS += -I$(DIR_RTLASIC)
+--- linux-2.6.30.9/drivers/net/ppp_generic.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/ppp_generic.c 2013-05-02 01:47:53.185227102 +0300
+@@ -42,6 +42,9 @@
+ #include <linux/tcp.h>
+ #include <linux/smp_lock.h>
+ #include <linux/spinlock.h>
++#if defined(CONFIG_PPP_MPPE_MPPC)
++#include <linux/smp_lock.h>
++#endif
+ #include <linux/rwsem.h>
+ #include <linux/stddef.h>
+ #include <linux/device.h>
+@@ -52,6 +55,49 @@
+ #include <linux/nsproxy.h>
+ #include <net/net_namespace.h>
+ #include <net/netns/generic.h>
++#include <linux/icmp.h>
++
++#if defined(CONFIG_RTL_PPPOE_HWACC) || defined (CONFIG_RTL_FAST_PPPOE)
++#include <linux/if_pppox.h>
++#endif
++
++#include <net/rtl/rtl_types.h>
++#if defined(CONFIG_RTL_819X)
++#include <net/rtl/rtl_nic.h>
++#endif
++
++#include <net/rtl/rtl865x_netif.h>
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L3
++#include <net/rtl/rtl865x_ppp.h>
++#endif
++
++#if defined (CONFIG_RTL_HW_QOS_SUPPORT) // sync from voip customer for multiple ppp
++#include <net/rtl/rtl865x_outputQueue.h>
++#endif
++
++#if defined(NAT_SPEEDUP)||defined(CONFIG_RTL_IPTABLES_FAST_PATH)
++ #define FAST_PPTP
++ #define FAST_L2TP
++#endif
++
++#ifdef CONFIG_RTL_LAYERED_DRIVER
++enum SE_TYPE
++{
++ /*1:if_ether, 2:pppoe,3:pptp,4:l2tp*/
++ SE_ETHER = 1,
++ SE_PPPOE = 2,
++ SE_PPTP = 3,
++ SE_L2TP = 4,
++};
++#else
++enum SE_TYPE
++{
++ SE_PPPOE = 1,
++ SE_PPTP = 2,
++ SE_L2TP = 3,
++};
++#endif /*CONFIG_RTL865X_LAYERED_DRIVER*/
++
+
+ #define PPP_VERSION "2.4.2"
+
+@@ -88,10 +134,18 @@ struct ppp_file {
+ int dead; /* unit/channel has been shut down */
+ };
+
++#if defined(CONFIG_PPP_MPPE_MPPC)
++#define PF_TO_X(pf, X) ((X *)((char *)(pf) - offsetof(X, file)))
++#else
+ #define PF_TO_X(pf, X) container_of(pf, X, file)
++#endif
+
+ #define PF_TO_PPP(pf) PF_TO_X(pf, struct ppp)
+ #define PF_TO_CHANNEL(pf) PF_TO_X(pf, struct channel)
++//#if defined(CONFIG_PPP_MPPE_MPPC)
++//#undef ROUNDUP
++//#define ROUNDUP(n, x) (((n) + (x) - 1) / (x))
++//#endif
+
+ /*
+ * Data structure describing one ppp unit.
+@@ -107,6 +161,9 @@ struct ppp {
+ spinlock_t rlock; /* lock for receive side 58 */
+ spinlock_t wlock; /* lock for transmit side 5c */
+ int mru; /* max receive unit 60 */
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ int mru_alloc; /* MAX(1500,MRU) for dev_alloc_skb() */
++#endif
+ unsigned int flags; /* control bits 64 */
+ unsigned int xstate; /* transmit state bits 68 */
+ unsigned int rstate; /* receive state bits 6c */
+@@ -130,6 +187,7 @@ struct ppp {
+ u32 minseq; /* MP: min of most recent seqnos */
+ struct sk_buff_head mrq; /* MP: receive reconstruction queue */
+ #endif /* CONFIG_PPP_MULTILINK */
++ struct net_device_stats stats; /* statistics */
+ #ifdef CONFIG_PPP_FILTER
+ struct sock_filter *pass_filter; /* filter for packets to pass */
+ struct sock_filter *active_filter;/* filter for pkts to reset idle */
+@@ -138,6 +196,67 @@ struct ppp {
+ struct net *ppp_net; /* the net we belong to */
+ };
+
++#ifdef FAST_PPTP
++#define MPPE_CCOUNT(p) ((((p)[2] & 0x0f) << 8) + (p)[3])
++typedef struct {
++ unsigned i;
++ unsigned j;
++ unsigned char S[256];
++} arcfour_context;
++
++
++#define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */ /* reference from ppp_mppe.h*/
++
++
++#if defined(CONFIG_PPP_MPPE_MPPC)
++typedef struct ppp_mppe_state { /* reference from ppp_mppe_mppc.c */
++ struct crypto_tfm *arc4_tfm;
++ u8 master_key[MPPE_MAX_KEY_LEN];
++ u8 session_key[MPPE_MAX_KEY_LEN];
++ u8 mppc; /* do we use compression (MPPC)? */
++ u8 mppe; /* do we use encryption (MPPE)? */
++ u8 keylen; /* key length in bytes */
++ u8 bitkeylen; /* key length in bits */
++ u16 ccount; /* coherency counter */
++ u16 bits; /* MPPC/MPPE control bits */
++ u8 stateless; /* do we use stateless mode? */
++ u8 nextflushed; /* set A bit in the next outgoing packet;
++ used only by compressor*/
++ u8 flushexpected; /* drop packets until A bit is received;
++ used only by decompressor*/
++ u8 *hist; /* MPPC history */
++ u16 *hash; /* Hash table; used only by compressor */
++ u16 histptr; /* history "cursor" */
++ int unit;
++ int debug;
++ int mru;
++ struct compstat stats;
++}ppp_mppe_state;
++#else
++typedef struct ppp_mppe_state { /* reference from ppp_mppe.c */
++ struct crypto_blkcipher *arc4;
++ struct crypto_hash *sha1;
++ unsigned char *sha1_digest;
++ unsigned char master_key[MPPE_MAX_KEY_LEN];
++ unsigned char session_key[MPPE_MAX_KEY_LEN];
++ unsigned keylen; /* key length in bytes */
++ /* NB: 128-bit == 16, 40-bit == 8! */
++ /* If we want to support 56-bit, */
++ /* the unit has to change to bits */
++ unsigned char bits; /* MPPE control bits */
++ unsigned ccount; /* 12-bit coherency count (seqno) */
++ unsigned stateful; /* stateful mode flag */
++ int discard; /* stateful mode packet loss flag */
++ int sanity_errors; /* take down LCP if too many */
++ int unit;
++ int debug;
++ struct compstat stats;
++} ppp_mppe_state;
++#endif
++
++#endif
++
++
+ /*
+ * Bits in flags: SC_NO_TCP_CCID, SC_CCP_OPEN, SC_CCP_UP, SC_LOOP_TRAFFIC,
+ * SC_MULTILINK, SC_MP_SHORTSEQ, SC_MP_XSHORTSEQ, SC_COMP_TCP, SC_REJ_COMP_TCP,
+@@ -145,9 +264,15 @@ struct ppp {
+ * Bits in rstate: SC_DECOMP_RUN, SC_DC_ERROR, SC_DC_FERROR.
+ * Bits in xstate: SC_COMP_RUN
+ */
++#if defined(CONFIG_PPP_MPPE_MPPC)
++#define SC_FLAG_BITS (SC_NO_TCP_CCID|SC_CCP_OPEN|SC_CCP_UP|SC_LOOP_TRAFFIC \
++ |SC_MULTILINK|SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ \
++ |SC_COMP_TCP|SC_REJ_COMP_TCP)
++#else
+ #define SC_FLAG_BITS (SC_NO_TCP_CCID|SC_CCP_OPEN|SC_CCP_UP|SC_LOOP_TRAFFIC \
+ |SC_MULTILINK|SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ \
+ |SC_COMP_TCP|SC_REJ_COMP_TCP|SC_MUST_COMP)
++#endif
+
+ /*
+ * Private data structure for each channel.
+@@ -169,6 +294,12 @@ struct channel {
+ u32 lastseq; /* MP: last sequence # received */
+ int speed; /* speed of the corresponding ppp channel*/
+ #endif /* CONFIG_PPP_MULTILINK */
++#if defined(CONFIG_RTL_PPPOE_HWACC) || defined (CONFIG_RTL_FAST_PPPOE)
++ u8 pppoe;
++ u8 rsv1;
++ u16 rsv2;
++#endif /* CONFIG_RTL865X_HW_TABLES */
++
+ };
+
+ /*
+@@ -235,13 +366,31 @@ struct ppp_net {
+ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf,
+ struct file *file, unsigned int cmd, unsigned long arg);
+ static void ppp_xmit_process(struct ppp *ppp);
++#ifdef FAST_PPTP
++static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb, int is_fast_fw);
++#else
+ static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
++#endif
++
+ static void ppp_push(struct ppp *ppp);
+ static void ppp_channel_push(struct channel *pch);
+ static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
+ struct channel *pch);
+ static void ppp_receive_error(struct ppp *ppp);
++#ifdef FAST_PPTP
++struct sk_buff *ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb, int is_fast_fw);
++#ifdef CONFIG_FAST_PATH_MODULE
++int (*FastPath_hook9)( void )=NULL;
++int (*FastPath_hook10)(struct sk_buff *skb)=NULL;
++EXPORT_SYMBOL(FastPath_hook9);
++EXPORT_SYMBOL(FastPath_hook10);
++EXPORT_SYMBOL(ppp_receive_nonmp_frame);
++#endif
++
++#else
+ static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
++#endif
++
+ static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
+ struct sk_buff *skb);
+ #ifdef CONFIG_PPP_MULTILINK
+@@ -555,10 +704,25 @@ static int get_filter(void __user *arg,
+ }
+ #endif /* CONFIG_PPP_FILTER */
+
++#if defined (CONFIG_RTL_FAST_PPPOE)
++extern int set_pppoe_info(char *ppp_dev, char *wan_dev, unsigned short sid,
++ unsigned int our_ip,unsigned int peer_ip,
++ unsigned char * our_mac, unsigned char *peer_mac);
++
++extern int clear_pppoe_info(char *ppp_dev, char *wan_dev, unsigned short sid,
++ unsigned int our_ip,unsigned int peer_ip,
++ unsigned char * our_mac, unsigned char *peer_mac);
++extern int get_pppoe_last_rx_tx(char * ppp_dev,char * wan_dev,unsigned short sid,
++ unsigned int our_ip,unsigned int peer_ip,
++ unsigned char * our_mac,unsigned char * peer_mac,
++ unsigned long * last_rx,unsigned long * last_tx);
++extern int fast_pppoe_fw;
++
++#endif
+ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+ {
+ struct ppp_file *pf = file->private_data;
+- struct ppp *ppp;
++ struct ppp *ppp = NULL;
+ int err = -EFAULT, val, val2, i;
+ struct ppp_idle idle;
+ struct npioctl npi;
+@@ -611,11 +775,83 @@ static long ppp_ioctl(struct file *file,
+ case PPPIOCCONNECT:
+ if (get_user(unit, p))
+ break;
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L2 // sync from voip customer for multiple ppp
++ #if defined (CONFIG_RTL_HW_QOS_SUPPORT)
++ rtl865x_qosRearrangeRule();
++ #endif
++#endif
+ err = ppp_connect_channel(pch, unit);
++
++#if defined(CONFIG_RTL_PPPOE_HWACC) || defined (CONFIG_RTL_FAST_PPPOE)
++ if(err == 0 && pch->pppoe==TRUE)
++ {
++ struct sock *sk = (struct sock *) pch->chan->private;
++ struct pppox_sock *po = pppox_sk(sk);
++ struct net_device *local_dev = po->pppoe_dev;
++#ifdef CONFIG_RTL_LAYERED_DRIVER
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L3
++ {
++
++
++ rtl865x_attachMasterNetif(pch->ppp->dev->name, local_dev->name);
++ //add the netif mapping table
++ rtl_add_ps_drv_netif_mapping(pch->ppp->dev,pch->ppp->dev->name); // sync from voip customer for multiple ppp
++ }
++ rtl865x_addPpp(pch->ppp->dev->name , (ether_addr_t*)po->pppoe_pa.remote, po->pppoe_pa.sid, SE_PPPOE);
++#endif
++#endif
++#if defined (CONFIG_RTL_FAST_PPPOE)
++ set_pppoe_info(pch->ppp->dev->name, local_dev->name, po->pppoe_pa.sid,
++ 0,0,NULL, (unsigned char *)po->pppoe_pa.remote);
++#endif
++ }
++#endif
++
++
++ #ifdef FAST_PPTP // sync from voip customer for multiple ppp
++ {
++ extern void set_pptp_device(char *ppp_device);
++ extern int fast_pptp_fw;
++ if (err==0 && fast_pptp_fw)
++ set_pptp_device(pch->ppp->dev->name);
++ }
++ #endif
++
++ #ifdef FAST_L2TP // sync from voip customer for multiple ppp
++ {
++ extern void set_l2tp_device(char *ppp_device);
++ if (err==0)
++ set_l2tp_device(pch->ppp->dev->name);
++ }
++ #endif
++
+ break;
+
+ case PPPIOCDISCONN:
+ err = ppp_disconnect_channel(pch);
++#if defined(CONFIG_RTL_PPPOE_HWACC) || defined (CONFIG_RTL_FAST_PPPOE)
++ if (err == 0 && pch->pppoe==TRUE)
++ {
++ pch->pppoe = FALSE;
++
++#ifdef CONFIG_RTL_LAYERED_DRIVER
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L3
++
++ rtl865x_detachMasterNetif(ppp->dev->name);
++ //del the netif mapping table
++ rtl_del_ps_drv_netif_mapping(pch->ppp->dev);
++ rtl865x_delPppbyIfName(ppp->dev->name);
++#endif
++
++#endif
++
++#if defined (CONFIG_RTL_FAST_PPPOE)
++ clear_pppoe_info(pch->ppp->dev->name, NULL, 0,
++ 0,0,NULL, NULL);
++#endif
++ }
++#endif
++
+ break;
+
+ default:
+@@ -642,7 +878,13 @@ static long ppp_ioctl(struct file *file,
+ case PPPIOCSMRU:
+ if (get_user(val, p))
+ break;
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ ppp->mru_alloc = ppp->mru = val;
++ if (ppp->mru_alloc < PPP_MRU)
++ ppp->mru_alloc = PPP_MRU; /* increase for broken peers */
++#else
+ ppp->mru = val;
++#endif
+ err = 0;
+ break;
+
+@@ -689,6 +931,53 @@ static long ppp_ioctl(struct file *file,
+ break;
+
+ case PPPIOCGIDLE:
++#ifdef FAST_L2TP
++ {
++ extern int fast_l2tp_fw;
++ unsigned long get_fast_l2tp_lastxmit(void);
++ unsigned long fastl2tp_lastxmit;
++ if(fast_l2tp_fw)
++ {
++ fastl2tp_lastxmit = get_fast_l2tp_lastxmit();
++ if(ppp->last_xmit < fastl2tp_lastxmit)
++ ppp->last_xmit = fastl2tp_lastxmit;
++ }
++ }
++#endif
++#ifdef FAST_PPTP
++ {
++ extern int fast_pptp_fw;
++ extern unsigned long get_fastpptp_lastxmit(void);
++ unsigned long fastpptp_lastxmit;
++ if(fast_pptp_fw)
++ {
++ fastpptp_lastxmit = get_fastpptp_lastxmit();
++ if(ppp->last_xmit < fastpptp_lastxmit)
++ ppp->last_xmit = fastpptp_lastxmit;
++ }
++ }
++#endif
++#if defined (CONFIG_RTL_FAST_PPPOE)
++ {
++ unsigned long fast_pppoe_last_rx=0;
++ unsigned long fast_pppoe_last_tx=0;
++
++ if(fast_pppoe_fw)
++ {
++ if(ppp->dev!=NULL)
++ {
++ get_pppoe_last_rx_tx(ppp->dev->name,NULL,0,0,0,NULL,NULL,&fast_pppoe_last_rx,&fast_pppoe_last_tx);
++
++ if(ppp->last_xmit < fast_pppoe_last_tx)
++ ppp->last_xmit = fast_pppoe_last_tx;
++
++ if(ppp->last_recv < fast_pppoe_last_rx)
++ ppp->last_xmit = fast_pppoe_last_rx;
++ }
++ }
++ }
++#endif
++
+ idle.xmit_idle = (jiffies - ppp->last_xmit) / HZ;
+ idle.recv_idle = (jiffies - ppp->last_recv) / HZ;
+ if (copy_to_user(argp, &idle, sizeof(idle)))
+@@ -788,6 +1077,15 @@ static long ppp_ioctl(struct file *file,
+ return err;
+ }
+
++struct net_device_stats *get_ppp_stats(struct ppp *ppp)
++{
++ return (&ppp->stats);
++}
++
++#ifdef CONFIG_FAST_PATH_MODULE
++EXPORT_SYMBOL(get_ppp_stats);
++#endif
++
+ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf,
+ struct file *file, unsigned int cmd, unsigned long arg)
+ {
+@@ -951,13 +1249,114 @@ out:
+ /*
+ * Network interface unit routines.
+ */
+-static int
+-ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
++ #if defined(FAST_L2TP)
++extern int fast_l2tp_to_wan(void *skb);
++extern int check_for_fast_l2tp_to_wan(void *skb);
++extern void event_ppp_dev_down(const char * name);
++#endif
++#if defined(FAST_PPTP) || defined(FAST_L2TP)
++int ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
++#else
++static int ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
++#endif
++
+ {
+ struct ppp *ppp = netdev_priv(dev);
+ int npi, proto;
+ unsigned char *pp;
+
++#ifdef FAST_PPTP
++ int is_fast_fw=0;
++ #if defined(CONFIG_RTL_IPTABLES_FAST_PATH)
++ extern int fast_pptp_fw;
++ #ifdef CONFIG_FAST_PATH_MODULE
++ if((FastPath_hook9!=NULL) &&(FastPath_hook10!=NULL))
++ {
++ if (FastPath_hook9()) {
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L')
++ {
++ is_fast_fw=1;
++ memset(skb->cb, '\x0', 3);
++ }
++ else {
++ extern int fast_pptp_to_wan(struct sk_buff *skb);
++ if (FastPath_hook10(skb))
++ return 0;
++ }
++ }
++ }
++ #else
++ if (fast_pptp_fw) {
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L')
++ {
++ is_fast_fw=1;
++ memset(skb->cb, '\x0', 3);
++ }
++ else {
++ extern int is_pptp_device(char *ppp_device); // sync from voip customer for multiple ppp
++ extern int fast_pptp_to_wan(void *skb);
++ if (is_pptp_device(ppp->dev->name) && fast_pptp_to_wan((void*)skb)) // sync from voip customer for multiple ppp
++ return 0;
++ }
++ }
++ #endif
++ #else
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L')
++ is_fast_fw=1;
++ #endif
++#endif
++
++#if 0
++#ifdef FAST_L2TP
++#ifndef FAST_PPTP
++ int is_fast_fw=0;
++#endif
++
++#ifdef CONFIG_RTL_IPTABLES_FAST_PATH
++#if 0//def CONFIG_FAST_PATH_MODULE
++ if((FastPath_hook9!=NULL) &&(FastPath_hook10!=NULL))
++ {
++ if (FastPath_hook9()) {
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L') {
++ is_fast_fw = 1;
++ memset(skb->cb, '\x0', 3);
++ }
++ else {
++ //extern int fast_pptp_to_wan(struct sk_buff *skb);
++#ifdef CONFIG_RTL865X_HW_PPTPL2TP
++ if (!accelerate && FastPath_hook10(skb))
++ return 0;
++#else
++ if (FastPath_hook10(skb))
++ return 0;
++#endif /* CONFIG_RTL865X_HW_PPTPL2TP */
++ }
++ }
++ }
++#else
++ extern int fast_l2tp_fw;
++ if (fast_l2tp_fw) {
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L') {
++ is_fast_fw = 1;
++ memset(skb->cb, '\x0', 3);
++ }
++ else {
++ extern int is_l2tp_device(char *ppp_device);
++ extern int fast_l2tp_to_wan(struct sk_buff *skb);
++ if (is_l2tp_device(ppp->dev->name)&&fast_l2tp_to_wan(skb))
++ return 0;
++ }
++ }
++#endif
++#else
++ if (skb->cb[0]=='R' && skb->cb[1]=='T' && skb->cb[2]=='L') {
++ is_fast_fw = 1;
++ memset(skb->cb, '\x0', 3);
++ }
++#endif
++#endif
++#endif
++
+ npi = ethertype_to_npindex(ntohs(skb->protocol));
+ if (npi < 0)
+ goto outf;
+@@ -985,9 +1384,37 @@ ppp_start_xmit(struct sk_buff *skb, stru
+ pp[0] = proto >> 8;
+ pp[1] = proto;
+
++#ifdef FAST_PPTP
++ if (is_fast_fw)
++ ppp_send_frame(ppp, skb, 1);
++ else {
++#ifdef FAST_L2TP
++ skb_pull(skb,2);
++ extern int is_l2tp_device(char *ppp_device); // sync from voip customer for multiple ppp
++ if (is_l2tp_device(ppp->dev->name) && (check_for_fast_l2tp_to_wan((void*)skb)==1) && (fast_l2tp_to_wan((void*)skb) == 1)) // sync from voip customer for multiple ppp
++ {
++ /* Note: if pkt go here, l2tp dial-on-demand will not be triggered,
++ so some risk exist here! -- 2010/04/25 zj */
++ return 0;
++ }
++ else
++ {
++ pp = skb_push(skb, 2);
++ proto = npindex_to_proto[npi];
++ pp[0] = proto >> 8;
++ pp[1] = proto;
++ }
++#endif
++ netif_stop_queue(dev);
++ skb_queue_tail(&ppp->file.xq, skb);
++ ppp_xmit_process(ppp);
++ }
++#else
+ netif_stop_queue(dev);
+ skb_queue_tail(&ppp->file.xq, skb);
+ ppp_xmit_process(ppp);
++#endif
++
+ return 0;
+
+ outf:
+@@ -1050,7 +1477,11 @@ static void ppp_setup(struct net_device
+ dev->hard_header_len = PPP_HDRLEN;
+ dev->mtu = PPP_MTU;
+ dev->addr_len = 0;
++#if defined(CONFIG_RTL_819X)
++ dev->tx_queue_len = 64;
++#else
+ dev->tx_queue_len = 3;
++#endif
+ dev->type = ARPHRD_PPP;
+ dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
+ dev->features |= NETIF_F_NETNS_LOCAL;
+@@ -1074,7 +1505,12 @@ ppp_xmit_process(struct ppp *ppp)
+ ppp_push(ppp);
+ while (!ppp->xmit_pending
+ && (skb = skb_dequeue(&ppp->file.xq)))
++#ifdef FAST_PPTP
++ ppp_send_frame(ppp, skb, 0);
++#else
+ ppp_send_frame(ppp, skb);
++#endif
++
+ /* If there's no work left to do, tell the core net
+ code that we can accept some more. */
+ if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq))
+@@ -1083,6 +1519,7 @@ ppp_xmit_process(struct ppp *ppp)
+ ppp_xmit_unlock(ppp);
+ }
+
++#if !defined(CONFIG_PPP_MPPE_MPPC)
+ static inline struct sk_buff *
+ pad_compress_skb(struct ppp *ppp, struct sk_buff *skb)
+ {
+@@ -1132,19 +1569,81 @@ pad_compress_skb(struct ppp *ppp, struct
+ }
+ return new_skb;
+ }
++#endif
++
++/*
++ * some kinds of packets from DUT to WAN will cause ppp interface active when lan==>wan traffic is off,
++ * so we skip these packets. otherwise the ppp idletime out can't work well
++ * return value 1 means this packet won't set the ppp to active
++ */
++#if defined(CONFIG_PPP_IDLE_TIMEOUT_REFINE)
++int timeoutCheck_skipp_pkt(struct iphdr *iph)
++{
++
++ if(iph == NULL)
++ {
++ printk("the iphdr for PPP_IDLE_TIMEOUT_REFINE is NULL, is may cause some isses\n");
++ return 0;
++ }
++
++ if(iph->protocol == IPPROTO_ICMP)
++ {
++ struct icmphdr *icmph= (void *)iph + iph->ihl*4;
++ // we don't care dest unreacheable pkts(to wan) while recode last tx time
++ if(icmph->type==ICMP_DEST_UNREACH)
++ {
++ printk("it is ICMP dest unreacheable packet\n");
++ //if(net_ratelimit())printk("skip a icmp dest unreachable pkt from lan to wan\n");
++ return 1;
++ }
++ }
++ else if(iph->protocol == IPPROTO_TCP)
++ {
++ struct tcphdr *tcph;
++ tcph = (void *)iph + iph->ihl*4;
++ // we don't care tcp fin/rst pkts(to wan) while recode last tx time
++ if(tcph->fin || tcph->rst)
++ {
++ //if(net_ratelimit())printk("skip a tcp fin/rst pkt fin: %d rst :%d from lan to wan\n", tcph->fin, tcph->rst);
++ return 1;
++ }
++ }
++ else if(iph->protocol == IPPROTO_IGMP)
++ {
++ // we don't care IGMP packets
++ printk("it is ICMP packet\n");
++ return 1;
++ }
++
++ return 0;
++}
++#else //fastpath assemble code will call this function anyway.
++int timeoutCheck_skipp_pkt(struct iphdr *iph)
++{
++ return 0;
++}
++#endif
+
+ /*
+ * Compress and send a frame.
+ * The caller should have locked the xmit path,
+ * and xmit_pending should be 0.
+ */
+-static void
+-ppp_send_frame(struct ppp *ppp, struct sk_buff *skb)
++#ifdef FAST_PPTP
++static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb, int is_fast_fw)
++#else
++static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb)
++#endif
++
+ {
+ int proto = PPP_PROTO(skb);
+ struct sk_buff *new_skb;
+ int len;
+ unsigned char *cp;
++#if defined(CONFIG_PPP_IDLE_TIMEOUT_REFINE)
++ struct iphdr *iphp;
++ iphp = (struct iphdr *)((unsigned char *)(skb->data+2));
++#endif
+
+ if (proto < 0x8000) {
+ #ifdef CONFIG_PPP_FILTER
+@@ -1168,6 +1667,9 @@ ppp_send_frame(struct ppp *ppp, struct s
+ skb_pull(skb, 2);
+ #else
+ /* for data packets, record the time */
++#if defined(CONFIG_PPP_IDLE_TIMEOUT_REFINE)
++ if(timeoutCheck_skipp_pkt(iphp)!=1)
++#endif
+ ppp->last_xmit = jiffies;
+ #endif /* CONFIG_PPP_FILTER */
+ }
+@@ -1175,6 +1677,13 @@ ppp_send_frame(struct ppp *ppp, struct s
+ ++ppp->dev->stats.tx_packets;
+ ppp->dev->stats.tx_bytes += skb->len - 2;
+
++#if defined(FAST_PPTP) && defined(NAT_SPEEDUP)
++{
++ extern void update_fast_pptp_state(void);
++ update_fast_pptp_state();
++}
++#endif
++
+ switch (proto) {
+ case PPP_IP:
+ if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0)
+@@ -1213,12 +1722,69 @@ ppp_send_frame(struct ppp *ppp, struct s
+ case PPP_CCP:
+ /* peek at outbound CCP frames */
+ ppp_ccp_peek(ppp, skb, 0);
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ if (CCP_CODE(skb->data+2) == CCP_RESETACK
++ && (ppp->xcomp->compress_proto == CI_MPPE
++ || ppp->xcomp->compress_proto == CI_LZS)) {
++ --ppp->dev->stats.tx_packets;
++ ppp->dev->stats.tx_bytes -= skb->len - 2;
++ kfree_skb(skb);
++ return;
++ }
++#endif
+ break;
+ }
+
+ /* try to do packet compression */
+ if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state
+ && proto != PPP_LCP && proto != PPP_CCP) {
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ int comp_ovhd = 0;
++ /*
++ * because of possible data expansion when MPPC or LZS
++ * is used, allocate compressor's buffer 12.5% bigger
++ * than MTU
++ */
++ if (ppp->xcomp->compress_proto == CI_MPPE)
++ comp_ovhd = ((ppp->dev->mtu * 9) / 8) + 1 + MPPE_OVHD;
++ else if (ppp->xcomp->compress_proto == CI_LZS)
++ comp_ovhd = ((ppp->dev->mtu * 9) / 8) + 1 + LZS_OVHD;
++ new_skb = alloc_skb(ppp->dev->mtu + ppp->dev->hard_header_len
++ + comp_ovhd, GFP_ATOMIC);
++ if (new_skb == 0) {
++ printk(KERN_ERR "PPP: no memory (comp pkt)\n");
++ goto drop;
++ }
++ if (ppp->dev->hard_header_len > PPP_HDRLEN)
++ skb_reserve(new_skb,
++ ppp->dev->hard_header_len - PPP_HDRLEN);
++
++ /* compressor still expects A/C bytes in hdr */
++ len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2,
++ new_skb->data, skb->len + 2,
++ ppp->dev->mtu + PPP_HDRLEN);
++ if (len > 0 && (ppp->flags & SC_CCP_UP)) {
++ kfree_skb(skb);
++ skb = new_skb;
++ skb_put(skb, len);
++ skb_pull(skb, 2); /* pull off A/C bytes */
++ } else if (len == 0) {
++ /* didn't compress, or CCP not up yet */
++ kfree_skb(new_skb);
++ } else {
++ /*
++ * (len < 0)
++ * MPPE requires that we do not send unencrypted
++ * frames. The compressor will return -1 if we
++ * should drop the frame. We cannot simply test
++ * the compress_proto because MPPE and MPPC share
++ * the same number.
++ */
++ printk(KERN_ERR "ppp: compressor dropped pkt\n");
++ kfree_skb(new_skb);
++ goto drop;
++ }
++#else
+ if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) {
+ if (net_ratelimit())
+ printk(KERN_ERR "ppp: compression required but down - pkt dropped.\n");
+@@ -1227,6 +1793,7 @@ ppp_send_frame(struct ppp *ppp, struct s
+ skb = pad_compress_skb(ppp, skb);
+ if (!skb)
+ goto drop;
++#endif
+ }
+
+ /*
+@@ -1242,6 +1809,9 @@ ppp_send_frame(struct ppp *ppp, struct s
+ }
+
+ ppp->xmit_pending = skb;
++#ifdef FAST_PPTP
++ if (!is_fast_fw)
++#endif
+ ppp_push(ppp);
+ return;
+
+@@ -1637,7 +2207,11 @@ ppp_receive_frame(struct ppp *ppp, struc
+ ppp_receive_mp_frame(ppp, skb, pch);
+ else
+ #endif /* CONFIG_PPP_MULTILINK */
++#ifdef FAST_PPTP
++ ppp_receive_nonmp_frame(ppp, skb, 0);
++#else
+ ppp_receive_nonmp_frame(ppp, skb);
++#endif
+ return;
+ }
+
+@@ -1657,12 +2231,38 @@ ppp_receive_error(struct ppp *ppp)
+ slhc_toss(ppp->vj);
+ }
+
+-static void
+-ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb)
++#ifdef FAST_PPTP
++struct sk_buff *ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb, int is_fast_fw)
++#else
++static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb)
++#endif
++
+ {
+ struct sk_buff *ns;
+ int proto, len, npi;
+
++//brad add for pptp mppe rx out of order
++#ifdef FAST_PPTP
++ if(is_fast_fw){
++ ppp_mppe_state *state;
++ unsigned int curr_ccount=0;
++ if((skb->data[2] & 0x10) == 0x10){
++ state = (ppp_mppe_state *) ppp->rc_state;
++ curr_ccount = MPPE_CCOUNT(skb->data);
++ if(state->ccount < 4096 && state->ccount != 0 ){
++ if(curr_ccount < state->ccount && curr_ccount > 0){
++ kfree_skb(skb);
++ return NULL;
++ }
++ }else if(curr_ccount == 4095 && state->ccount == 0){
++ kfree_skb(skb);
++ return NULL;
++
++ }
++ }
++ }
++#endif
++
+ /*
+ * Decompress the frame, if compressed.
+ * Note that some decompressors need to see uncompressed frames
+@@ -1672,8 +2272,10 @@ ppp_receive_nonmp_frame(struct ppp *ppp,
+ && (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0)
+ skb = ppp_decompress_frame(ppp, skb);
+
++#if !defined(CONFIG_PPP_MPPE_MPPC)
+ if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR)
+ goto err;
++#endif
+
+ proto = PPP_PROTO(skb);
+ switch (proto) {
+@@ -1737,6 +2339,12 @@ ppp_receive_nonmp_frame(struct ppp *ppp,
+
+ npi = proto_to_npindex(proto);
+ if (npi < 0) {
++#ifdef FAST_PPTP
++ if (is_fast_fw) {
++ kfree_skb(skb);
++ return NULL;
++ }
++#endif
+ /* control or unknown frame - pass it to pppd */
+ skb_queue_tail(&ppp->file.rq, skb);
+ /* limit queue length by dropping old frames */
+@@ -1786,14 +2394,30 @@ ppp_receive_nonmp_frame(struct ppp *ppp,
+ skb->dev = ppp->dev;
+ skb->protocol = htons(npindex_to_ethertype[npi]);
+ skb_reset_mac_header(skb);
++#ifdef FAST_PPTP
++ if (is_fast_fw)
++ return skb;
++ else
++#endif
++#if defined(CONFIG_RTL_819X)&&defined(RX_TASKLET)
++ netif_receive_skb(skb);
++#else
+ netif_rx(skb);
++#endif
+ }
+ }
++#ifdef FAST_PPTP
++ return NULL;
++#else
+ return;
++#endif
+
+ err:
+ kfree_skb(skb);
+ ppp_receive_error(ppp);
++#ifdef FAST_PPTP
++ return NULL;
++#endif
+ }
+
+ static struct sk_buff *
+@@ -1814,10 +2438,18 @@ ppp_decompress_frame(struct ppp *ppp, st
+
+ switch(ppp->rcomp->compress_proto) {
+ case CI_MPPE:
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ obuff_size = ppp->mru_alloc + PPP_HDRLEN + 1;
++#else
+ obuff_size = ppp->mru + PPP_HDRLEN + 1;
++#endif
+ break;
+ default:
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ obuff_size = ppp->mru_alloc + PPP_HDRLEN;
++#else
+ obuff_size = ppp->mru + PPP_HDRLEN;
++#endif
+ break;
+ }
+
+@@ -1854,7 +2486,18 @@ ppp_decompress_frame(struct ppp *ppp, st
+ return skb;
+
+ err:
++ #if defined(CONFIG_PPP_MPPE_MPPC)
++ if (ppp->rcomp->compress_proto != CI_MPPE
++ && ppp->rcomp->compress_proto != CI_LZS) {
++ /*
++ * If decompression protocol isn't MPPE/MPPC or LZS, we set
++ * SC_DC_ERROR flag and wait for CCP_RESETACK
++ */
+ ppp->rstate |= SC_DC_ERROR;
++ }
++ #else
++ ppp->rstate |= SC_DC_ERROR;
++ #endif
+ ppp_receive_error(ppp);
+ return skb;
+ }
+@@ -1943,7 +2586,11 @@ ppp_receive_mp_frame(struct ppp *ppp, st
+
+ /* Pull completed packets off the queue and receive them. */
+ while ((skb = ppp_mp_reconstruct(ppp)))
++#ifdef FAST_PPTP
++ ppp_receive_nonmp_frame(ppp, skb, 0);
++#else
+ ppp_receive_nonmp_frame(ppp, skb);
++#endif
+
+ return;
+
+@@ -2169,6 +2816,19 @@ int ppp_unit_number(struct ppp_channel *
+ return unit;
+ }
+
++#if defined (CONFIG_RTL_PPPOE_HWACC) || defined (CONFIG_RTL_FAST_PPPOE)
++/*
++ * Mark the pppoe type for a channel
++ */
++void ppp_channel_pppoe(struct ppp_channel *chan)
++{
++ struct channel *pch = chan->ppp;
++
++ pch->pppoe = TRUE;
++}
++#endif
++
++
+ /*
+ * Disconnect a channel from the generic layer.
+ * This must be called in process context.
+@@ -2541,6 +3201,9 @@ ppp_create_interface(struct net *net, in
+ ppp = netdev_priv(dev);
+ ppp->dev = dev;
+ ppp->mru = PPP_MRU;
++#if defined(CONFIG_PPP_MPPE_MPPC)
++ ppp->mru_alloc = PPP_MRU;
++#endif
+ init_ppp_file(&ppp->file, INTERFACE);
+ ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */
+ for (i = 0; i < NUM_NP; ++i)
+@@ -2633,7 +3296,15 @@ init_ppp_file(struct ppp_file *pf, int k
+ static void ppp_shutdown_interface(struct ppp *ppp)
+ {
+ struct ppp_net *pn;
+-
++#ifdef CONFIG_RTL_PPPOE_HWACC
++ char dev_name[IFNAMSIZ];
++ memcpy(dev_name, ppp->dev->name, IFNAMSIZ);
++#endif
++
++#if defined (CONFIG_RTL_FAST_PPPOE)
++ clear_pppoe_info(ppp->dev->name, NULL, 0,
++ 0,0,NULL, NULL);
++#endif
+ pn = ppp_pernet(ppp->ppp_net);
+ mutex_lock(&pn->all_ppp_mutex);
+
+@@ -2649,6 +3320,33 @@ static void ppp_shutdown_interface(struc
+ unit_put(&pn->units_idr, ppp->file.index);
+ ppp->file.dead = 1;
+ ppp->owner = NULL;
++
++#if defined(FAST_L2TP)
++ {
++ extern int fast_l2tp_fw;
++ if(fast_l2tp_fw)
++ event_ppp_dev_down(dev_name);
++ }
++#endif
++
++#ifdef CONFIG_RTL_PPPOE_HWACC
++#ifdef CONFIG_RTL_LAYERED_DRIVER
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L3
++#if 1
++ rtl865x_detachMasterNetif(dev_name);
++#endif
++#ifdef CONFIG_RTL_LAYERED_DRIVER_L2 // sync from voip customer for multiple ppp
++ #if defined (CONFIG_RTL_HW_QOS_SUPPORT)
++ rtl865x_qosFlushMarkRuleByDev(dev_name);
++ #endif
++#endif
++ rtl865x_delPppbyIfName(dev_name);
++#endif
++#else
++ rtl865x_delPppSession(dev_name, SE_PPPOE);
++#endif
++#endif
++
+ wake_up_interruptible(&ppp->file.rwait);
+
+ mutex_unlock(&pn->all_ppp_mutex);
+@@ -2892,6 +3590,12 @@ static void *unit_find(struct idr *p, in
+ module_init(ppp_init);
+ module_exit(ppp_cleanup);
+
++#if defined(CONFIG_RTL_IPTABLES_FAST_PATH)
++ #if defined(CONFIG_FAST_PATH_MODULE)
++ EXPORT_SYMBOL(ppp_start_xmit);
++ #endif
++#endif
++
+ EXPORT_SYMBOL(ppp_register_net_channel);
+ EXPORT_SYMBOL(ppp_register_channel);
+ EXPORT_SYMBOL(ppp_unregister_channel);
+--- linux-2.6.30.9/drivers/net/pppoe.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/pppoe.c 2013-05-02 01:47:53.188227102 +0300
+@@ -304,6 +304,11 @@ static void pppoe_flush_dev(struct net_d
+ for (i = 0; i < PPPOE_HASH_SIZE; i++) {
+ struct pppox_sock *po = pn->hash_table[i];
+
++ if(!((unsigned int)po & 0x80000000))
++ {
++ continue;
++ }
++
+ while (po != NULL) {
+ struct sock *sk;
+ if (po->pppoe_dev != dev) {
+@@ -699,6 +704,10 @@ static int pppoe_connect(struct socket *
+ if (error)
+ goto err_put;
+
++#if defined (CONFIG_RTL_PPPOE_HWACC) || defined(CONFIG_RTL_FAST_PPPOE)
++ ppp_channel_pppoe(&po->chan);
++#endif
++
+ sk->sk_state = PPPOX_CONNECTED;
+ }
+
+@@ -908,6 +917,9 @@ end:
+ * xmit function for internal use.
+ *
+ ***********************************************************************/
++ #if defined(CONFIG_NET_SCHED)
++ extern int gQosEnabled;
++ #endif
+ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb)
+ {
+ struct pppox_sock *po = pppox_sk(sk);
+@@ -943,7 +955,17 @@ static int __pppoe_xmit(struct sock *sk,
+ dev_hard_header(skb, dev, ETH_P_PPP_SES,
+ po->pppoe_pa.remote, NULL, data_len);
+
++ /*Improve pppoe wantype throughput when QoS disabled.*/
++#if defined(CONFIG_NET_SCHED)
++ if (gQosEnabled)
++ {
+ dev_queue_xmit(skb);
++ }
++ else
++#endif
++ {
++ skb->dev->netdev_ops->ndo_start_xmit(skb,skb->dev);
++ }
+
+ return 1;
+
+--- linux-2.6.30.9/drivers/net/tg3.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/tg3.c 2013-05-02 01:47:53.528227074 +0300
+@@ -6242,6 +6242,11 @@ static int tg3_chip_reset(struct tg3 *tp
+ PCI_EXP_DEVSTA_URD);
+ }
+
++ /* tonywu */
++ pci_write_config_word(tp->pdev, tp->pcie_cap + PCI_EXP_DEVCTL, 0);
++ pcie_set_readrq(tp->pdev, 128);
++ /* tonywu */
++
+ tg3_restore_pci_state(tp);
+
+ tp->tg3_flags &= ~TG3_FLAG_CHIP_RESETTING;
+--- linux-2.6.30.9/drivers/net/wireless/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/wireless/Kconfig 2013-05-02 01:47:53.615227067 +0300
+@@ -434,6 +434,12 @@ config RTL8187
+
+ Thanks to Realtek for their support!
+
++config RTL8192SE_mac80211
++ tristate "Realtek 8192SE wireless chip support"
++ depends on MAC80211 && WLAN_80211
++ ---help---
++ This is a driver for RTL8192SE that support mac80211
++
+ config ADM8211
+ tristate "ADMtek ADM8211 support"
+ depends on MAC80211 && PCI && WLAN_80211 && EXPERIMENTAL
+@@ -483,17 +489,9 @@ config MWL8K
+ To compile this driver as a module, choose M here: the module
+ will be called mwl8k. If unsure, say N.
+
+-source "drivers/net/wireless/p54/Kconfig"
+-source "drivers/net/wireless/ath5k/Kconfig"
+-source "drivers/net/wireless/ath9k/Kconfig"
+-source "drivers/net/wireless/ar9170/Kconfig"
+-source "drivers/net/wireless/ipw2x00/Kconfig"
+ source "drivers/net/wireless/iwlwifi/Kconfig"
+ source "drivers/net/wireless/hostap/Kconfig"
+-source "drivers/net/wireless/b43/Kconfig"
+-source "drivers/net/wireless/b43legacy/Kconfig"
+-source "drivers/net/wireless/zd1211rw/Kconfig"
+-source "drivers/net/wireless/rt2x00/Kconfig"
+-source "drivers/net/wireless/orinoco/Kconfig"
++source "drivers/net/wireless/rtl8192cd/Kconfig"
++source "drivers/net/wireless/rtl8192e/Kconfig"
+
+ endmenu
+--- linux-2.6.30.9/drivers/net/wireless/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/net/wireless/Makefile 2013-05-02 01:47:53.615227067 +0300
+@@ -2,8 +2,6 @@
+ # Makefile for the Linux Wireless network device drivers.
+ #
+
+-obj-$(CONFIG_IPW2100) += ipw2x00/
+-obj-$(CONFIG_IPW2200) += ipw2x00/
+
+ obj-$(CONFIG_STRIP) += strip.o
+ obj-$(CONFIG_ARLAN) += arlan.o
+@@ -24,16 +22,9 @@ obj-$(CONFIG_ATMEL) += atmel
+ obj-$(CONFIG_PCI_ATMEL) += atmel_pci.o
+ obj-$(CONFIG_PCMCIA_ATMEL) += atmel_cs.o
+
+-obj-$(CONFIG_AT76C50X_USB) += at76c50x-usb.o
+
+-obj-$(CONFIG_PRISM54) += prism54/
+
+ obj-$(CONFIG_HOSTAP) += hostap/
+-obj-$(CONFIG_B43) += b43/
+-obj-$(CONFIG_B43LEGACY) += b43legacy/
+-obj-$(CONFIG_ZD1211RW) += zd1211rw/
+-obj-$(CONFIG_RTL8180) += rtl818x/
+-obj-$(CONFIG_RTL8187) += rtl818x/
+
+ # 16-bit wireless PCMCIA client drivers
+ obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
+@@ -51,12 +42,8 @@ obj-$(CONFIG_ADM8211) += adm8211.o
+ obj-$(CONFIG_MWL8K) += mwl8k.o
+
+ obj-$(CONFIG_IWLWIFI) += iwlwifi/
+-obj-$(CONFIG_RT2X00) += rt2x00/
+
+-obj-$(CONFIG_P54_COMMON) += p54/
+
+-obj-$(CONFIG_ATH5K) += ath5k/
+-obj-$(CONFIG_ATH9K) += ath9k/
+-obj-$(CONFIG_AR9170_USB) += ar9170/
+
+-obj-$(CONFIG_MAC80211_HWSIM) += mac80211_hwsim.o
++obj-$(CONFIG_RTL8192CD) += rtl8192cd/
++obj-$(CONFIG_WLAN_HAL_8192EE) += rtl8192e/
+--- linux-2.6.30.9/drivers/pci/access.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/pci/access.c 2013-05-02 01:47:54.647226984 +0300
+@@ -38,6 +38,46 @@ int pci_bus_read_config_##size \
+ spin_unlock_irqrestore(&pci_lock, flags); \
+ return res; \
+ }
++#ifdef CONFIG_RTL8198_REVISION_B
++int pci_bus_read_config_word
++ (struct pci_bus *bus, unsigned int devfn, int pos, u16 *value)
++{
++ int res;
++ unsigned long flags;
++ u32 data = 0;
++ if (PCI_word_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;
++ spin_lock_irqsave(&pci_lock, flags);
++
++ int swap[4]={0,8,16,24}; int diff = pos&0x3;
++ res = bus->ops->read(bus, devfn, (pos&0xFFFFC), 4, &data);
++ *value =(u16)( (data>>(swap[diff]))&0xffff);
++
++
++
++
++ //*value = (type)data;
++ spin_unlock_irqrestore(&pci_lock, flags);
++ return res;
++}
++int pci_bus_read_config_byte
++ (struct pci_bus *bus, unsigned int devfn, int pos, u8 *value)
++{
++ int res;
++ unsigned long flags;
++ u32 data = 0;
++ if (PCI_word_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;
++ spin_lock_irqsave(&pci_lock, flags);
++
++ int swap[4]={0,8,16,24}; int diff = pos&0x3;
++ res = bus->ops->read(bus, devfn, (pos&0xFFFFC), 4, &data);
++ *value =(u8)( (data>>(swap[diff]))&0xff);
++ //*value = (type)data;
++ spin_unlock_irqrestore(&pci_lock, flags);
++ return res;
++}
++
++#endif
++
+
+ #define PCI_OP_WRITE(size,type,len) \
+ int pci_bus_write_config_##size \
+@@ -52,8 +92,11 @@ int pci_bus_write_config_##size \
+ return res; \
+ }
+
++#ifndef CONFIG_RTL8198_REVISION_B
+ PCI_OP_READ(byte, u8, 1)
++
+ PCI_OP_READ(word, u16, 2)
++#endif
+ PCI_OP_READ(dword, u32, 4)
+ PCI_OP_WRITE(byte, u8, 1)
+ PCI_OP_WRITE(word, u16, 2)
+--- linux-2.6.30.9/drivers/scsi/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/scsi/Kconfig 2013-05-02 01:47:55.017226954 +0300
+@@ -82,6 +82,11 @@ config BLK_DEV_SD
+ In this case, do not compile the driver for your SCSI host adapter
+ (below) as a module either.
+
++config 4KB_HARDDISK_SUPPORT
++ bool "4kb sector size disk support"
++ depends on BLK_DEV_SD
++ default n
++
+ config CHR_DEV_ST
+ tristate "SCSI tape support"
+ depends on SCSI
+--- linux-2.6.30.9/drivers/scsi/scsi_lib.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/scsi/scsi_lib.c 2013-05-02 01:47:55.252226935 +0300
+@@ -1626,7 +1626,7 @@ u64 scsi_calculate_bounce_limit(struct S
+
+ host_dev = scsi_get_device(shost);
+ if (host_dev && host_dev->dma_mask)
+- bounce_limit = *host_dev->dma_mask;
++ bounce_limit = *(host_dev->dma_mask);
+
+ return bounce_limit;
+ }
+--- linux-2.6.30.9/drivers/serial/8250.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/serial/8250.c 2013-05-02 01:47:55.684226900 +0300
+@@ -44,10 +44,6 @@
+
+ #include "8250.h"
+
+-#ifdef CONFIG_SPARC
+-#include "suncore.h"
+-#endif
+-
+ /*
+ * Configuration:
+ * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
+@@ -117,13 +113,6 @@ static const struct old_serial_port old_
+
+ #define UART_NR CONFIG_SERIAL_8250_NR_UARTS
+
+-#ifdef CONFIG_SERIAL_8250_RSA
+-
+-#define PORT_RSA_MAX 4
+-static unsigned long probe_rsa[PORT_RSA_MAX];
+-static unsigned int probe_rsa_count;
+-#endif /* CONFIG_SERIAL_8250_RSA */
+-
+ struct uart_8250_port {
+ struct uart_port port;
+ struct timer_list timer; /* "no irq" timer */
+@@ -181,196 +170,45 @@ static const struct serial8250_config ua
+ .fifo_size = 1,
+ .tx_loadsz = 1,
+ },
+- [PORT_16450] = {
+- .name = "16450",
+- .fifo_size = 1,
+- .tx_loadsz = 1,
+- },
+- [PORT_16550] = {
+- .name = "16550",
+- .fifo_size = 1,
+- .tx_loadsz = 1,
+- },
+- [PORT_16550A] = {
+- .name = "16550A",
+- .fifo_size = 16,
+- .tx_loadsz = 16,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO,
+- },
+- [PORT_CIRRUS] = {
+- .name = "Cirrus",
+- .fifo_size = 1,
+- .tx_loadsz = 1,
+- },
+- [PORT_16650] = {
+- .name = "ST16650",
+- .fifo_size = 1,
+- .tx_loadsz = 1,
+- .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
+- },
+- [PORT_16650V2] = {
+- .name = "ST16650V2",
+- .fifo_size = 32,
+- .tx_loadsz = 16,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
+- UART_FCR_T_TRIG_00,
+- .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
+- },
+- [PORT_16750] = {
+- .name = "TI16750",
+- .fifo_size = 64,
+- .tx_loadsz = 64,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
+- UART_FCR7_64BYTE,
+- .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
+- },
+- [PORT_STARTECH] = {
+- .name = "Startech",
+- .fifo_size = 1,
+- .tx_loadsz = 1,
+- },
+- [PORT_16C950] = {
+- .name = "16C950/954",
+- .fifo_size = 128,
+- .tx_loadsz = 128,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO,
+- },
++#ifdef CONFIG_SERIAL_SC16IS7X0
+ [PORT_16654] = {
+ .name = "ST16654",
++#if 0
+ .fifo_size = 64,
+ .tx_loadsz = 32,
+ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
+ UART_FCR_T_TRIG_10,
+ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
+- },
+- [PORT_16850] = {
+- .name = "XR16850",
+- .fifo_size = 128,
+- .tx_loadsz = 128,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
+- },
+- [PORT_RSA] = {
+- .name = "RSA",
+- .fifo_size = 2048,
+- .tx_loadsz = 2048,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
+- .flags = UART_CAP_FIFO,
+- },
+- [PORT_NS16550A] = {
+- .name = "NS16550A",
++#else
+ .fifo_size = 16,
+ .tx_loadsz = 16,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO | UART_NATSEMI,
++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
++ .flags = UART_CAP_FIFO,
++#endif
+ },
+- [PORT_XSCALE] = {
+- .name = "XScale",
+- .fifo_size = 32,
+- .tx_loadsz = 32,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO | UART_CAP_UUE,
++#endif
++ [PORT_16550] = {
++ .name = "16550",
++ .fifo_size = 1,
++ .tx_loadsz = 1,
+ },
+- [PORT_RM9000] = {
+- .name = "RM9000",
++ [PORT_16550A] = {
++ .name = "16550A",
+ .fifo_size = 16,
+ .tx_loadsz = 16,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+- .flags = UART_CAP_FIFO,
+- },
+- [PORT_OCTEON] = {
+- .name = "OCTEON",
+- .fifo_size = 64,
+- .tx_loadsz = 64,
+- .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
++ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
++#ifdef CONFIG_SERIAL_RTL8198_UART1
++ .flags = UART_CAP_FIFO | UART_CAP_AFE,
++#else
+ .flags = UART_CAP_FIFO,
++#endif
+ },
+ };
+
+-#if defined (CONFIG_SERIAL_8250_AU1X00)
+-
+-/* Au1x00 UART hardware has a weird register layout */
+-static const u8 au_io_in_map[] = {
+- [UART_RX] = 0,
+- [UART_IER] = 2,
+- [UART_IIR] = 3,
+- [UART_LCR] = 5,
+- [UART_MCR] = 6,
+- [UART_LSR] = 7,
+- [UART_MSR] = 8,
+-};
+-
+-static const u8 au_io_out_map[] = {
+- [UART_TX] = 1,
+- [UART_IER] = 2,
+- [UART_FCR] = 4,
+- [UART_LCR] = 5,
+- [UART_MCR] = 6,
+-};
+-
+-/* sane hardware needs no mapping */
+-static inline int map_8250_in_reg(struct uart_port *p, int offset)
+-{
+- if (p->iotype != UPIO_AU)
+- return offset;
+- return au_io_in_map[offset];
+-}
+-
+-static inline int map_8250_out_reg(struct uart_port *p, int offset)
+-{
+- if (p->iotype != UPIO_AU)
+- return offset;
+- return au_io_out_map[offset];
+-}
+-
+-#elif defined(CONFIG_SERIAL_8250_RM9K)
+-
+-static const u8
+- regmap_in[8] = {
+- [UART_RX] = 0x00,
+- [UART_IER] = 0x0c,
+- [UART_IIR] = 0x14,
+- [UART_LCR] = 0x1c,
+- [UART_MCR] = 0x20,
+- [UART_LSR] = 0x24,
+- [UART_MSR] = 0x28,
+- [UART_SCR] = 0x2c
+- },
+- regmap_out[8] = {
+- [UART_TX] = 0x04,
+- [UART_IER] = 0x0c,
+- [UART_FCR] = 0x18,
+- [UART_LCR] = 0x1c,
+- [UART_MCR] = 0x20,
+- [UART_LSR] = 0x24,
+- [UART_MSR] = 0x28,
+- [UART_SCR] = 0x2c
+- };
+-
+-static inline int map_8250_in_reg(struct uart_port *p, int offset)
+-{
+- if (p->iotype != UPIO_RM9000)
+- return offset;
+- return regmap_in[offset];
+-}
+-
+-static inline int map_8250_out_reg(struct uart_port *p, int offset)
+-{
+- if (p->iotype != UPIO_RM9000)
+- return offset;
+- return regmap_out[offset];
+-}
+-
+-#else
+-
+ /* sane hardware needs no mapping */
+ #define map_8250_in_reg(up, offset) (offset)
+ #define map_8250_out_reg(up, offset) (offset)
+
+-#endif
+-
+ static unsigned int hub6_serial_in(struct uart_port *p, int offset)
+ {
+ offset = map_8250_in_reg(p, offset) << p->regshift;
+@@ -409,38 +247,6 @@ static unsigned int mem32_serial_in(stru
+ return readl(p->membase + offset);
+ }
+
+-#ifdef CONFIG_SERIAL_8250_AU1X00
+-static unsigned int au_serial_in(struct uart_port *p, int offset)
+-{
+- offset = map_8250_in_reg(p, offset) << p->regshift;
+- return __raw_readl(p->membase + offset);
+-}
+-
+-static void au_serial_out(struct uart_port *p, int offset, int value)
+-{
+- offset = map_8250_out_reg(p, offset) << p->regshift;
+- __raw_writel(value, p->membase + offset);
+-}
+-#endif
+-
+-static unsigned int tsi_serial_in(struct uart_port *p, int offset)
+-{
+- unsigned int tmp;
+- offset = map_8250_in_reg(p, offset) << p->regshift;
+- if (offset == UART_IIR) {
+- tmp = readl(p->membase + (UART_IIR & ~3));
+- return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */
+- } else
+- return readb(p->membase + offset);
+-}
+-
+-static void tsi_serial_out(struct uart_port *p, int offset, int value)
+-{
+- offset = map_8250_out_reg(p, offset) << p->regshift;
+- if (!((offset == UART_IER) && (value & UART_IER_UUE)))
+- writeb(value, p->membase + offset);
+-}
+-
+ static void dwapb_serial_out(struct uart_port *p, int offset, int value)
+ {
+ int save_offset = offset;
+@@ -451,7 +257,7 @@ static void dwapb_serial_out(struct uart
+ struct uart_8250_port *up = (struct uart_8250_port *)p;
+ up->lcr = value;
+ }
+- writeb(value, p->membase + offset);
++ writel(value, p->membase + offset);
+ /* Read the IER to ensure any interrupt is cleared before
+ * returning from ISR. */
+ if (save_offset == UART_TX || save_offset == UART_IER)
+@@ -470,13 +276,25 @@ static void io_serial_out(struct uart_po
+ outb(value, p->iobase + offset);
+ }
+
++#ifdef CONFIG_SERIAL_SC16IS7X0
++static unsigned int i2c_serial_in(struct uart_port *p, int offset)
++{
++ extern unsigned int serial_in_i2c(unsigned int i2c_addr, int offset);
++ return serial_in_i2c( p ->iobase, offset );
++}
++static void i2c_serial_out(struct uart_port *p, int offset, int value)
++{
++ extern unsigned int serial_out_i2c(unsigned int i2c_addr, int offset, int value);
++ serial_out_i2c( p ->iobase, offset, value );
++}
++#endif
+ static void set_io_from_upio(struct uart_port *p)
+ {
+ struct uart_8250_port *up = (struct uart_8250_port *)p;
+ switch (p->iotype) {
+- case UPIO_HUB6:
+- p->serial_in = hub6_serial_in;
+- p->serial_out = hub6_serial_out;
++ case UPIO_DWAPB:
++ p->serial_in = mem32_serial_in;
++ p->serial_out = dwapb_serial_out;
+ break;
+
+ case UPIO_MEM:
+@@ -484,27 +302,21 @@ static void set_io_from_upio(struct uart
+ p->serial_out = mem_serial_out;
+ break;
+
+- case UPIO_RM9000:
+ case UPIO_MEM32:
+ p->serial_in = mem32_serial_in;
+ p->serial_out = mem32_serial_out;
+ break;
+
+-#ifdef CONFIG_SERIAL_8250_AU1X00
+- case UPIO_AU:
+- p->serial_in = au_serial_in;
+- p->serial_out = au_serial_out;
+- break;
+-#endif
+- case UPIO_TSI:
+- p->serial_in = tsi_serial_in;
+- p->serial_out = tsi_serial_out;
++ case UPIO_HUB6:
++ p->serial_in = hub6_serial_in;
++ p->serial_out = hub6_serial_out;
+ break;
+-
+- case UPIO_DWAPB:
+- p->serial_in = mem_serial_in;
+- p->serial_out = dwapb_serial_out;
++#ifdef CONFIG_SERIAL_SC16IS7X0
++ case UPIO_I2C:
++ p->serial_in = i2c_serial_in;
++ p->serial_out = i2c_serial_out;
+ break;
++#endif
+
+ default:
+ p->serial_in = io_serial_in;
+@@ -520,12 +332,9 @@ serial_out_sync(struct uart_8250_port *u
+ {
+ struct uart_port *p = &up->port;
+ switch (p->iotype) {
++ case UPIO_DWAPB:
+ case UPIO_MEM:
+ case UPIO_MEM32:
+-#ifdef CONFIG_SERIAL_8250_AU1X00
+- case UPIO_AU:
+-#endif
+- case UPIO_DWAPB:
+ p->serial_out(p, offset, value);
+ p->serial_in(p, UART_LCR); /* safe, no side-effects */
+ break;
+@@ -538,88 +347,22 @@ serial_out_sync(struct uart_8250_port *u
+ (up->port.serial_in(&(up)->port, (offset)))
+ #define serial_out(up, offset, value) \
+ (up->port.serial_out(&(up)->port, (offset), (value)))
+-/*
+- * We used to support using pause I/O for certain machines. We
+- * haven't supported this for a while, but just in case it's badly
+- * needed for certain old 386 machines, I've left these #define's
+- * in....
+- */
+-#define serial_inp(up, offset) serial_in(up, offset)
+-#define serial_outp(up, offset, value) serial_out(up, offset, value)
+
+ /* Uart divisor latch read */
+ static inline int _serial_dl_read(struct uart_8250_port *up)
+ {
+- return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8;
++ return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
+ }
+
+ /* Uart divisor latch write */
+ static inline void _serial_dl_write(struct uart_8250_port *up, int value)
+ {
+- serial_outp(up, UART_DLL, value & 0xff);
+- serial_outp(up, UART_DLM, value >> 8 & 0xff);
+-}
+-
+-#if defined(CONFIG_SERIAL_8250_AU1X00)
+-/* Au1x00 haven't got a standard divisor latch */
+-static int serial_dl_read(struct uart_8250_port *up)
+-{
+- if (up->port.iotype == UPIO_AU)
+- return __raw_readl(up->port.membase + 0x28);
+- else
+- return _serial_dl_read(up);
+-}
+-
+-static void serial_dl_write(struct uart_8250_port *up, int value)
+-{
+- if (up->port.iotype == UPIO_AU)
+- __raw_writel(value, up->port.membase + 0x28);
+- else
+- _serial_dl_write(up, value);
+-}
+-#elif defined(CONFIG_SERIAL_8250_RM9K)
+-static int serial_dl_read(struct uart_8250_port *up)
+-{
+- return (up->port.iotype == UPIO_RM9000) ?
+- (((__raw_readl(up->port.membase + 0x10) << 8) |
+- (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
+- _serial_dl_read(up);
++ serial_out(up, UART_DLL, value & 0xff);
++ serial_out(up, UART_DLM, value >> 8 & 0xff);
+ }
+
+-static void serial_dl_write(struct uart_8250_port *up, int value)
+-{
+- if (up->port.iotype == UPIO_RM9000) {
+- __raw_writel(value, up->port.membase + 0x08);
+- __raw_writel(value >> 8, up->port.membase + 0x10);
+- } else {
+- _serial_dl_write(up, value);
+- }
+-}
+-#else
+ #define serial_dl_read(up) _serial_dl_read(up)
+ #define serial_dl_write(up, value) _serial_dl_write(up, value)
+-#endif
+-
+-/*
+- * For the 16C950
+- */
+-static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
+-{
+- serial_out(up, UART_SCR, offset);
+- serial_out(up, UART_ICR, value);
+-}
+-
+-static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
+-{
+- unsigned int value;
+-
+- serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
+- serial_out(up, UART_SCR, offset);
+- value = serial_in(up, UART_ICR);
+- serial_icr_write(up, UART_ACR, up->acr);
+-
+- return value;
+-}
+
+ /*
+ * FIFO support.
+@@ -627,10 +370,10 @@ static unsigned int serial_icr_read(stru
+ static void serial8250_clear_fifos(struct uart_8250_port *p)
+ {
+ if (p->capabilities & UART_CAP_FIFO) {
+- serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO);
+- serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO |
++ serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
++ serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
+ UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
+- serial_outp(p, UART_FCR, 0);
++ serial_out(p, UART_FCR, 0);
+ }
+ }
+
+@@ -643,657 +386,17 @@ static void serial8250_set_sleep(struct
+ {
+ if (p->capabilities & UART_CAP_SLEEP) {
+ if (p->capabilities & UART_CAP_EFR) {
+- serial_outp(p, UART_LCR, 0xBF);
+- serial_outp(p, UART_EFR, UART_EFR_ECB);
+- serial_outp(p, UART_LCR, 0);
++ serial_out(p, UART_LCR, 0xBF);
++ serial_out(p, UART_EFR, UART_EFR_ECB);
++ serial_out(p, UART_LCR, 0);
+ }
+- serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
++ serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
+ if (p->capabilities & UART_CAP_EFR) {
+- serial_outp(p, UART_LCR, 0xBF);
+- serial_outp(p, UART_EFR, 0);
+- serial_outp(p, UART_LCR, 0);
+- }
+- }
+-}
+-
+-#ifdef CONFIG_SERIAL_8250_RSA
+-/*
+- * Attempts to turn on the RSA FIFO. Returns zero on failure.
+- * We set the port uart clock rate if we succeed.
+- */
+-static int __enable_rsa(struct uart_8250_port *up)
+-{
+- unsigned char mode;
+- int result;
+-
+- mode = serial_inp(up, UART_RSA_MSR);
+- result = mode & UART_RSA_MSR_FIFO;
+-
+- if (!result) {
+- serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
+- mode = serial_inp(up, UART_RSA_MSR);
+- result = mode & UART_RSA_MSR_FIFO;
+- }
+-
+- if (result)
+- up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
+-
+- return result;
+-}
+-
+-static void enable_rsa(struct uart_8250_port *up)
+-{
+- if (up->port.type == PORT_RSA) {
+- if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
+- spin_lock_irq(&up->port.lock);
+- __enable_rsa(up);
+- spin_unlock_irq(&up->port.lock);
+- }
+- if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
+- serial_outp(up, UART_RSA_FRR, 0);
+- }
+-}
+-
+-/*
+- * Attempts to turn off the RSA FIFO. Returns zero on failure.
+- * It is unknown why interrupts were disabled in here. However,
+- * the caller is expected to preserve this behaviour by grabbing
+- * the spinlock before calling this function.
+- */
+-static void disable_rsa(struct uart_8250_port *up)
+-{
+- unsigned char mode;
+- int result;
+-
+- if (up->port.type == PORT_RSA &&
+- up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
+- spin_lock_irq(&up->port.lock);
+-
+- mode = serial_inp(up, UART_RSA_MSR);
+- result = !(mode & UART_RSA_MSR_FIFO);
+-
+- if (!result) {
+- serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
+- mode = serial_inp(up, UART_RSA_MSR);
+- result = !(mode & UART_RSA_MSR_FIFO);
+- }
+-
+- if (result)
+- up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
+- spin_unlock_irq(&up->port.lock);
+- }
+-}
+-#endif /* CONFIG_SERIAL_8250_RSA */
+-
+-/*
+- * This is a quickie test to see how big the FIFO is.
+- * It doesn't work at all the time, more's the pity.
+- */
+-static int size_fifo(struct uart_8250_port *up)
+-{
+- unsigned char old_fcr, old_mcr, old_lcr;
+- unsigned short old_dl;
+- int count;
+-
+- old_lcr = serial_inp(up, UART_LCR);
+- serial_outp(up, UART_LCR, 0);
+- old_fcr = serial_inp(up, UART_FCR);
+- old_mcr = serial_inp(up, UART_MCR);
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO |
+- UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
+- serial_outp(up, UART_MCR, UART_MCR_LOOP);
+- serial_outp(up, UART_LCR, UART_LCR_DLAB);
+- old_dl = serial_dl_read(up);
+- serial_dl_write(up, 0x0001);
+- serial_outp(up, UART_LCR, 0x03);
+- for (count = 0; count < 256; count++)
+- serial_outp(up, UART_TX, count);
+- mdelay(20);/* FIXME - schedule_timeout */
+- for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) &&
+- (count < 256); count++)
+- serial_inp(up, UART_RX);
+- serial_outp(up, UART_FCR, old_fcr);
+- serial_outp(up, UART_MCR, old_mcr);
+- serial_outp(up, UART_LCR, UART_LCR_DLAB);
+- serial_dl_write(up, old_dl);
+- serial_outp(up, UART_LCR, old_lcr);
+-
+- return count;
+-}
+-
+-/*
+- * Read UART ID using the divisor method - set DLL and DLM to zero
+- * and the revision will be in DLL and device type in DLM. We
+- * preserve the device state across this.
+- */
+-static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
+-{
+- unsigned char old_dll, old_dlm, old_lcr;
+- unsigned int id;
+-
+- old_lcr = serial_inp(p, UART_LCR);
+- serial_outp(p, UART_LCR, UART_LCR_DLAB);
+-
+- old_dll = serial_inp(p, UART_DLL);
+- old_dlm = serial_inp(p, UART_DLM);
+-
+- serial_outp(p, UART_DLL, 0);
+- serial_outp(p, UART_DLM, 0);
+-
+- id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8;
+-
+- serial_outp(p, UART_DLL, old_dll);
+- serial_outp(p, UART_DLM, old_dlm);
+- serial_outp(p, UART_LCR, old_lcr);
+-
+- return id;
+-}
+-
+-/*
+- * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
+- * When this function is called we know it is at least a StarTech
+- * 16650 V2, but it might be one of several StarTech UARTs, or one of
+- * its clones. (We treat the broken original StarTech 16650 V1 as a
+- * 16550, and why not? Startech doesn't seem to even acknowledge its
+- * existence.)
+- *
+- * What evil have men's minds wrought...
+- */
+-static void autoconfig_has_efr(struct uart_8250_port *up)
+-{
+- unsigned int id1, id2, id3, rev;
+-
+- /*
+- * Everything with an EFR has SLEEP
+- */
+- up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
+-
+- /*
+- * First we check to see if it's an Oxford Semiconductor UART.
+- *
+- * If we have to do this here because some non-National
+- * Semiconductor clone chips lock up if you try writing to the
+- * LSR register (which serial_icr_read does)
+- */
+-
+- /*
+- * Check for Oxford Semiconductor 16C950.
+- *
+- * EFR [4] must be set else this test fails.
+- *
+- * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
+- * claims that it's needed for 952 dual UART's (which are not
+- * recommended for new designs).
+- */
+- up->acr = 0;
+- serial_out(up, UART_LCR, 0xBF);
+- serial_out(up, UART_EFR, UART_EFR_ECB);
+- serial_out(up, UART_LCR, 0x00);
+- id1 = serial_icr_read(up, UART_ID1);
+- id2 = serial_icr_read(up, UART_ID2);
+- id3 = serial_icr_read(up, UART_ID3);
+- rev = serial_icr_read(up, UART_REV);
+-
+- DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
+-
+- if (id1 == 0x16 && id2 == 0xC9 &&
+- (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
+- up->port.type = PORT_16C950;
+-
+- /*
+- * Enable work around for the Oxford Semiconductor 952 rev B
+- * chip which causes it to seriously miscalculate baud rates
+- * when DLL is 0.
+- */
+- if (id3 == 0x52 && rev == 0x01)
+- up->bugs |= UART_BUG_QUOT;
+- return;
+- }
+-
+- /*
+- * We check for a XR16C850 by setting DLL and DLM to 0, and then
+- * reading back DLL and DLM. The chip type depends on the DLM
+- * value read back:
+- * 0x10 - XR16C850 and the DLL contains the chip revision.
+- * 0x12 - XR16C2850.
+- * 0x14 - XR16C854.
+- */
+- id1 = autoconfig_read_divisor_id(up);
+- DEBUG_AUTOCONF("850id=%04x ", id1);
+-
+- id2 = id1 >> 8;
+- if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
+- up->port.type = PORT_16850;
+- return;
+- }
+-
+- /*
+- * It wasn't an XR16C850.
+- *
+- * We distinguish between the '654 and the '650 by counting
+- * how many bytes are in the FIFO. I'm using this for now,
+- * since that's the technique that was sent to me in the
+- * serial driver update, but I'm not convinced this works.
+- * I've had problems doing this in the past. -TYT
+- */
+- if (size_fifo(up) == 64)
+- up->port.type = PORT_16654;
+- else
+- up->port.type = PORT_16650V2;
+-}
+-
+-/*
+- * We detected a chip without a FIFO. Only two fall into
+- * this category - the original 8250 and the 16450. The
+- * 16450 has a scratch register (accessible with LCR=0)
+- */
+-static void autoconfig_8250(struct uart_8250_port *up)
+-{
+- unsigned char scratch, status1, status2;
+-
+- up->port.type = PORT_8250;
+-
+- scratch = serial_in(up, UART_SCR);
+- serial_outp(up, UART_SCR, 0xa5);
+- status1 = serial_in(up, UART_SCR);
+- serial_outp(up, UART_SCR, 0x5a);
+- status2 = serial_in(up, UART_SCR);
+- serial_outp(up, UART_SCR, scratch);
+-
+- if (status1 == 0xa5 && status2 == 0x5a)
+- up->port.type = PORT_16450;
+-}
+-
+-static int broken_efr(struct uart_8250_port *up)
+-{
+- /*
+- * Exar ST16C2550 "A2" devices incorrectly detect as
+- * having an EFR, and report an ID of 0x0201. See
+- * http://www.exar.com/info.php?pdf=dan180_oct2004.pdf
+- */
+- if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
+- return 1;
+-
+- return 0;
+-}
+-
+-/*
+- * We know that the chip has FIFOs. Does it have an EFR? The
+- * EFR is located in the same register position as the IIR and
+- * we know the top two bits of the IIR are currently set. The
+- * EFR should contain zero. Try to read the EFR.
+- */
+-static void autoconfig_16550a(struct uart_8250_port *up)
+-{
+- unsigned char status1, status2;
+- unsigned int iersave;
+-
+- up->port.type = PORT_16550A;
+- up->capabilities |= UART_CAP_FIFO;
+-
+- /*
+- * Check for presence of the EFR when DLAB is set.
+- * Only ST16C650V1 UARTs pass this test.
+- */
+- serial_outp(up, UART_LCR, UART_LCR_DLAB);
+- if (serial_in(up, UART_EFR) == 0) {
+- serial_outp(up, UART_EFR, 0xA8);
+- if (serial_in(up, UART_EFR) != 0) {
+- DEBUG_AUTOCONF("EFRv1 ");
+- up->port.type = PORT_16650;
+- up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
+- } else {
+- DEBUG_AUTOCONF("Motorola 8xxx DUART ");
+- }
+- serial_outp(up, UART_EFR, 0);
+- return;
+- }
+-
+- /*
+- * Maybe it requires 0xbf to be written to the LCR.
+- * (other ST16C650V2 UARTs, TI16C752A, etc)
+- */
+- serial_outp(up, UART_LCR, 0xBF);
+- if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
+- DEBUG_AUTOCONF("EFRv2 ");
+- autoconfig_has_efr(up);
+- return;
++ serial_out(p, UART_LCR, 0xBF);
++ serial_out(p, UART_EFR, 0);
++ serial_out(p, UART_LCR, 0);
+ }
+-
+- /*
+- * Check for a National Semiconductor SuperIO chip.
+- * Attempt to switch to bank 2, read the value of the LOOP bit
+- * from EXCR1. Switch back to bank 0, change it in MCR. Then
+- * switch back to bank 2, read it from EXCR1 again and check
+- * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
+- */
+- serial_outp(up, UART_LCR, 0);
+- status1 = serial_in(up, UART_MCR);
+- serial_outp(up, UART_LCR, 0xE0);
+- status2 = serial_in(up, 0x02); /* EXCR1 */
+-
+- if (!((status2 ^ status1) & UART_MCR_LOOP)) {
+- serial_outp(up, UART_LCR, 0);
+- serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP);
+- serial_outp(up, UART_LCR, 0xE0);
+- status2 = serial_in(up, 0x02); /* EXCR1 */
+- serial_outp(up, UART_LCR, 0);
+- serial_outp(up, UART_MCR, status1);
+-
+- if ((status2 ^ status1) & UART_MCR_LOOP) {
+- unsigned short quot;
+-
+- serial_outp(up, UART_LCR, 0xE0);
+-
+- quot = serial_dl_read(up);
+- quot <<= 3;
+-
+- status1 = serial_in(up, 0x04); /* EXCR2 */
+- status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
+- status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
+- serial_outp(up, 0x04, status1);
+-
+- serial_dl_write(up, quot);
+-
+- serial_outp(up, UART_LCR, 0);
+-
+- up->port.uartclk = 921600*16;
+- up->port.type = PORT_NS16550A;
+- up->capabilities |= UART_NATSEMI;
+- return;
+- }
+- }
+-
+- /*
+- * No EFR. Try to detect a TI16750, which only sets bit 5 of
+- * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
+- * Try setting it with and without DLAB set. Cheap clones
+- * set bit 5 without DLAB set.
+- */
+- serial_outp(up, UART_LCR, 0);
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
+- status1 = serial_in(up, UART_IIR) >> 5;
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
+- serial_outp(up, UART_LCR, UART_LCR_DLAB);
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
+- status2 = serial_in(up, UART_IIR) >> 5;
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
+- serial_outp(up, UART_LCR, 0);
+-
+- DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
+-
+- if (status1 == 6 && status2 == 7) {
+- up->port.type = PORT_16750;
+- up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
+- return;
+- }
+-
+- /*
+- * Try writing and reading the UART_IER_UUE bit (b6).
+- * If it works, this is probably one of the Xscale platform's
+- * internal UARTs.
+- * We're going to explicitly set the UUE bit to 0 before
+- * trying to write and read a 1 just to make sure it's not
+- * already a 1 and maybe locked there before we even start start.
+- */
+- iersave = serial_in(up, UART_IER);
+- serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
+- if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
+- /*
+- * OK it's in a known zero state, try writing and reading
+- * without disturbing the current state of the other bits.
+- */
+- serial_outp(up, UART_IER, iersave | UART_IER_UUE);
+- if (serial_in(up, UART_IER) & UART_IER_UUE) {
+- /*
+- * It's an Xscale.
+- * We'll leave the UART_IER_UUE bit set to 1 (enabled).
+- */
+- DEBUG_AUTOCONF("Xscale ");
+- up->port.type = PORT_XSCALE;
+- up->capabilities |= UART_CAP_UUE;
+- return;
+- }
+- } else {
+- /*
+- * If we got here we couldn't force the IER_UUE bit to 0.
+- * Log it and continue.
+- */
+- DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
+- }
+- serial_outp(up, UART_IER, iersave);
+-}
+-
+-/*
+- * This routine is called by rs_init() to initialize a specific serial
+- * port. It determines what type of UART chip this serial port is
+- * using: 8250, 16450, 16550, 16550A. The important question is
+- * whether or not this UART is a 16550A or not, since this will
+- * determine whether or not we can use its FIFO features or not.
+- */
+-static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
+-{
+- unsigned char status1, scratch, scratch2, scratch3;
+- unsigned char save_lcr, save_mcr;
+- unsigned long flags;
+-
+- if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
+- return;
+-
+- DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%p): ",
+- serial_index(&up->port), up->port.iobase, up->port.membase);
+-
+- /*
+- * We really do need global IRQs disabled here - we're going to
+- * be frobbing the chips IRQ enable register to see if it exists.
+- */
+- spin_lock_irqsave(&up->port.lock, flags);
+-
+- up->capabilities = 0;
+- up->bugs = 0;
+-
+- if (!(up->port.flags & UPF_BUGGY_UART)) {
+- /*
+- * Do a simple existence test first; if we fail this,
+- * there's no point trying anything else.
+- *
+- * 0x80 is used as a nonsense port to prevent against
+- * false positives due to ISA bus float. The
+- * assumption is that 0x80 is a non-existent port;
+- * which should be safe since include/asm/io.h also
+- * makes this assumption.
+- *
+- * Note: this is safe as long as MCR bit 4 is clear
+- * and the device is in "PC" mode.
+- */
+- scratch = serial_inp(up, UART_IER);
+- serial_outp(up, UART_IER, 0);
+-#ifdef __i386__
+- outb(0xff, 0x080);
+-#endif
+- /*
+- * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
+- * 16C754B) allow only to modify them if an EFR bit is set.
+- */
+- scratch2 = serial_inp(up, UART_IER) & 0x0f;
+- serial_outp(up, UART_IER, 0x0F);
+-#ifdef __i386__
+- outb(0, 0x080);
+-#endif
+- scratch3 = serial_inp(up, UART_IER) & 0x0f;
+- serial_outp(up, UART_IER, scratch);
+- if (scratch2 != 0 || scratch3 != 0x0F) {
+- /*
+- * We failed; there's nothing here
+- */
+- DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
+- scratch2, scratch3);
+- goto out;
+- }
+- }
+-
+- save_mcr = serial_in(up, UART_MCR);
+- save_lcr = serial_in(up, UART_LCR);
+-
+- /*
+- * Check to see if a UART is really there. Certain broken
+- * internal modems based on the Rockwell chipset fail this
+- * test, because they apparently don't implement the loopback
+- * test mode. So this test is skipped on the COM 1 through
+- * COM 4 ports. This *should* be safe, since no board
+- * manufacturer would be stupid enough to design a board
+- * that conflicts with COM 1-4 --- we hope!
+- */
+- if (!(up->port.flags & UPF_SKIP_TEST)) {
+- serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A);
+- status1 = serial_inp(up, UART_MSR) & 0xF0;
+- serial_outp(up, UART_MCR, save_mcr);
+- if (status1 != 0x90) {
+- DEBUG_AUTOCONF("LOOP test failed (%02x) ",
+- status1);
+- goto out;
+- }
+- }
+-
+- /*
+- * We're pretty sure there's a port here. Lets find out what
+- * type of port it is. The IIR top two bits allows us to find
+- * out if it's 8250 or 16450, 16550, 16550A or later. This
+- * determines what we test for next.
+- *
+- * We also initialise the EFR (if any) to zero for later. The
+- * EFR occupies the same register location as the FCR and IIR.
+- */
+- serial_outp(up, UART_LCR, 0xBF);
+- serial_outp(up, UART_EFR, 0);
+- serial_outp(up, UART_LCR, 0);
+-
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
+- scratch = serial_in(up, UART_IIR) >> 6;
+-
+- DEBUG_AUTOCONF("iir=%d ", scratch);
+-
+- switch (scratch) {
+- case 0:
+- autoconfig_8250(up);
+- break;
+- case 1:
+- up->port.type = PORT_UNKNOWN;
+- break;
+- case 2:
+- up->port.type = PORT_16550;
+- break;
+- case 3:
+- autoconfig_16550a(up);
+- break;
+- }
+-
+-#ifdef CONFIG_SERIAL_8250_RSA
+- /*
+- * Only probe for RSA ports if we got the region.
+- */
+- if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
+- int i;
+-
+- for (i = 0 ; i < probe_rsa_count; ++i) {
+- if (probe_rsa[i] == up->port.iobase &&
+- __enable_rsa(up)) {
+- up->port.type = PORT_RSA;
+- break;
+- }
+- }
+- }
+-#endif
+-
+-#ifdef CONFIG_SERIAL_8250_AU1X00
+- /* if access method is AU, it is a 16550 with a quirk */
+- if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
+- up->bugs |= UART_BUG_NOMSR;
+-#endif
+-
+- serial_outp(up, UART_LCR, save_lcr);
+-
+- if (up->capabilities != uart_config[up->port.type].flags) {
+- printk(KERN_WARNING
+- "ttyS%d: detected caps %08x should be %08x\n",
+- serial_index(&up->port), up->capabilities,
+- uart_config[up->port.type].flags);
+- }
+-
+- up->port.fifosize = uart_config[up->port.type].fifo_size;
+- up->capabilities = uart_config[up->port.type].flags;
+- up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
+-
+- if (up->port.type == PORT_UNKNOWN)
+- goto out;
+-
+- /*
+- * Reset the UART.
+- */
+-#ifdef CONFIG_SERIAL_8250_RSA
+- if (up->port.type == PORT_RSA)
+- serial_outp(up, UART_RSA_FRR, 0);
+-#endif
+- serial_outp(up, UART_MCR, save_mcr);
+- serial8250_clear_fifos(up);
+- serial_in(up, UART_RX);
+- if (up->capabilities & UART_CAP_UUE)
+- serial_outp(up, UART_IER, UART_IER_UUE);
+- else
+- serial_outp(up, UART_IER, 0);
+-
+- out:
+- spin_unlock_irqrestore(&up->port.lock, flags);
+- DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
+-}
+-
+-static void autoconfig_irq(struct uart_8250_port *up)
+-{
+- unsigned char save_mcr, save_ier;
+- unsigned char save_ICP = 0;
+- unsigned int ICP = 0;
+- unsigned long irqs;
+- int irq;
+-
+- if (up->port.flags & UPF_FOURPORT) {
+- ICP = (up->port.iobase & 0xfe0) | 0x1f;
+- save_ICP = inb_p(ICP);
+- outb_p(0x80, ICP);
+- (void) inb_p(ICP);
+- }
+-
+- /* forget possible initially masked and pending IRQ */
+- probe_irq_off(probe_irq_on());
+- save_mcr = serial_inp(up, UART_MCR);
+- save_ier = serial_inp(up, UART_IER);
+- serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
+-
+- irqs = probe_irq_on();
+- serial_outp(up, UART_MCR, 0);
+- udelay(10);
+- if (up->port.flags & UPF_FOURPORT) {
+- serial_outp(up, UART_MCR,
+- UART_MCR_DTR | UART_MCR_RTS);
+- } else {
+- serial_outp(up, UART_MCR,
+- UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
+ }
+- serial_outp(up, UART_IER, 0x0f); /* enable all intrs */
+- (void)serial_inp(up, UART_LSR);
+- (void)serial_inp(up, UART_RX);
+- (void)serial_inp(up, UART_IIR);
+- (void)serial_inp(up, UART_MSR);
+- serial_outp(up, UART_TX, 0xFF);
+- udelay(20);
+- irq = probe_irq_off(irqs);
+-
+- serial_outp(up, UART_MCR, save_mcr);
+- serial_outp(up, UART_IER, save_ier);
+-
+- if (up->port.flags & UPF_FOURPORT)
+- outb_p(save_ICP, ICP);
+-
+- up->port.irq = (irq > 0) ? irq : 0;
+ }
+
+ static inline void __stop_tx(struct uart_8250_port *p)
+@@ -1309,14 +412,6 @@ static void serial8250_stop_tx(struct ua
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+
+ __stop_tx(up);
+-
+- /*
+- * We really want to stop the transmitter from sending.
+- */
+- if (up->port.type == PORT_16C950) {
+- up->acr |= UART_ACR_TXDIS;
+- serial_icr_write(up, UART_ACR, up->acr);
+- }
+ }
+
+ static void transmit_chars(struct uart_8250_port *up);
+@@ -1341,14 +436,6 @@ static void serial8250_start_tx(struct u
+ transmit_chars(up);
+ }
+ }
+-
+- /*
+- * Re-enable the transmitter if we disabled it.
+- */
+- if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
+- up->acr &= ~UART_ACR_TXDIS;
+- serial_icr_write(up, UART_ACR, up->acr);
+- }
+ }
+
+ static void serial8250_stop_rx(struct uart_port *port)
+@@ -1382,7 +469,7 @@ receive_chars(struct uart_8250_port *up,
+
+ do {
+ if (likely(lsr & UART_LSR_DR))
+- ch = serial_inp(up, UART_RX);
++ ch = serial_in(up, UART_RX);
+ else
+ /*
+ * Intel 82571 has a Serial Over Lan device that will
+@@ -1440,7 +527,7 @@ receive_chars(struct uart_8250_port *up,
+ uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
+
+ ignore_char:
+- lsr = serial_inp(up, UART_LSR);
++ lsr = serial_in(up, UART_LSR);
+ } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
+ spin_unlock(&up->port.lock);
+ tty_flip_buffer_push(tty);
+@@ -1454,7 +541,7 @@ static void transmit_chars(struct uart_8
+ int count;
+
+ if (up->port.x_char) {
+- serial_outp(up, UART_TX, up->port.x_char);
++ serial_out(up, UART_TX, up->port.x_char);
+ up->port.icount.tx++;
+ up->port.x_char = 0;
+ return;
+@@ -1519,7 +606,7 @@ static void serial8250_handle_port(struc
+
+ spin_lock_irqsave(&up->port.lock, flags);
+
+- status = serial_inp(up, UART_LSR);
++ status = serial_in(up, UART_LSR);
+
+ DEBUG_INTR("status = %x...", status);
+
+@@ -1552,6 +639,11 @@ static irqreturn_t serial8250_interrupt(
+ struct list_head *l, *end = NULL;
+ int pass_counter = 0, handled = 0;
+
++#ifdef CONFIG_SERIAL_SC16IS7X0
++ extern int sc16is7x0_clean_interrupt( int irq );
++ if( sc16is7x0_clean_interrupt( irq ) < 0 )
++ return IRQ_RETVAL(handled);
++#endif
+ DEBUG_INTR("serial8250_interrupt(%d)...", irq);
+
+ spin_lock(&i->lock);
+@@ -1635,7 +727,8 @@ static int serial_link_irq_chain(struct
+ struct hlist_head *h;
+ struct hlist_node *n;
+ struct irq_info *i;
+- int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
++// int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
++ int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : IRQF_DISABLED;
+
+ mutex_lock(&hash_mutex);
+
+@@ -1682,7 +775,7 @@ static int serial_link_irq_chain(struct
+
+ static void serial_unlink_irq_chain(struct uart_8250_port *up)
+ {
+- struct irq_info *i;
++ struct irq_info *i=NULL;
+ struct hlist_node *n;
+ struct hlist_head *h;
+
+@@ -1886,12 +979,12 @@ static void wait_for_xmitr(struct uart_8
+ static int serial8250_get_poll_char(struct uart_port *port)
+ {
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+- unsigned char lsr = serial_inp(up, UART_LSR);
++ unsigned char lsr = serial_in(up, UART_LSR);
+
+ while (!(lsr & UART_LSR_DR))
+- lsr = serial_inp(up, UART_LSR);
++ lsr = serial_in(up, UART_LSR);
+
+- return serial_inp(up, UART_RX);
++ return serial_in(up, UART_RX);
+ }
+
+
+@@ -1944,27 +1037,6 @@ static int serial8250_startup(struct uar
+ if (up->port.iotype != up->cur_iotype)
+ set_io_from_upio(port);
+
+- if (up->port.type == PORT_16C950) {
+- /* Wake up and initialize UART */
+- up->acr = 0;
+- serial_outp(up, UART_LCR, 0xBF);
+- serial_outp(up, UART_EFR, UART_EFR_ECB);
+- serial_outp(up, UART_IER, 0);
+- serial_outp(up, UART_LCR, 0);
+- serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
+- serial_outp(up, UART_LCR, 0xBF);
+- serial_outp(up, UART_EFR, UART_EFR_ECB);
+- serial_outp(up, UART_LCR, 0);
+- }
+-
+-#ifdef CONFIG_SERIAL_8250_RSA
+- /*
+- * If this is an RSA port, see if we can kick it up to the
+- * higher speed clock.
+- */
+- enable_rsa(up);
+-#endif
+-
+ /*
+ * Clear the FIFO buffers and disable them.
+ * (they will be reenabled in set_termios())
+@@ -1974,10 +1046,10 @@ static int serial8250_startup(struct uar
+ /*
+ * Clear the interrupt registers.
+ */
+- (void) serial_inp(up, UART_LSR);
+- (void) serial_inp(up, UART_RX);
+- (void) serial_inp(up, UART_IIR);
+- (void) serial_inp(up, UART_MSR);
++ (void) serial_in(up, UART_LSR);
++ (void) serial_in(up, UART_RX);
++ (void) serial_in(up, UART_IIR);
++ (void) serial_in(up, UART_MSR);
+
+ /*
+ * At this point, there's no way the LSR could still be 0xff;
+@@ -1985,29 +1057,12 @@ static int serial8250_startup(struct uar
+ * here.
+ */
+ if (!(up->port.flags & UPF_BUGGY_UART) &&
+- (serial_inp(up, UART_LSR) == 0xff)) {
++ (serial_in(up, UART_LSR) == 0xff)) {
+ printk(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
+ serial_index(&up->port));
+ return -ENODEV;
+ }
+
+- /*
+- * For a XR16C850, we need to set the trigger levels
+- */
+- if (up->port.type == PORT_16850) {
+- unsigned char fctr;
+-
+- serial_outp(up, UART_LCR, 0xbf);
+-
+- fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
+- serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
+- serial_outp(up, UART_TRG, UART_TRG_96);
+- serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
+- serial_outp(up, UART_TRG, UART_TRG_96);
+-
+- serial_outp(up, UART_LCR, 0);
+- }
+-
+ if (is_real_interrupt(up->port.irq)) {
+ unsigned char iir1;
+ /*
+@@ -2075,13 +1130,9 @@ static int serial8250_startup(struct uar
+ /*
+ * Now, initialize the UART
+ */
+- serial_outp(up, UART_LCR, UART_LCR_WLEN8);
++ serial_out(up, UART_LCR, UART_LCR_WLEN8);
+
+ spin_lock_irqsave(&up->port.lock, flags);
+- if (up->port.flags & UPF_FOURPORT) {
+- if (!is_real_interrupt(up->port.irq))
+- up->port.mctrl |= TIOCM_OUT1;
+- } else
+ /*
+ * Most PC uarts need OUT2 raised to enable interrupts.
+ */
+@@ -2108,10 +1159,10 @@ static int serial8250_startup(struct uar
+ * Do a quick test to see if we receive an
+ * interrupt when we enable the TX irq.
+ */
+- serial_outp(up, UART_IER, UART_IER_THRI);
++ serial_out(up, UART_IER, UART_IER_THRI);
+ lsr = serial_in(up, UART_LSR);
+ iir = serial_in(up, UART_IIR);
+- serial_outp(up, UART_IER, 0);
++ serial_out(up, UART_IER, 0);
+
+ if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
+ if (!(up->bugs & UART_BUG_TXEN)) {
+@@ -2131,10 +1182,10 @@ dont_test_tx_en:
+ * saved flags to avoid getting false values from polling
+ * routines or the previous session.
+ */
+- serial_inp(up, UART_LSR);
+- serial_inp(up, UART_RX);
+- serial_inp(up, UART_IIR);
+- serial_inp(up, UART_MSR);
++ serial_in(up, UART_LSR);
++ serial_in(up, UART_RX);
++ serial_in(up, UART_IIR);
++ serial_in(up, UART_MSR);
+ up->lsr_saved_flags = 0;
+ up->msr_saved_flags = 0;
+
+@@ -2144,17 +1195,7 @@ dont_test_tx_en:
+ * anyway, so we don't enable them here.
+ */
+ up->ier = UART_IER_RLSI | UART_IER_RDI;
+- serial_outp(up, UART_IER, up->ier);
+-
+- if (up->port.flags & UPF_FOURPORT) {
+- unsigned int icp;
+- /*
+- * Enable interrupts on the AST Fourport board
+- */
+- icp = (up->port.iobase & 0xfe0) | 0x01f;
+- outb_p(0x80, icp);
+- (void) inb_p(icp);
+- }
++ serial_out(up, UART_IER, up->ier);
+
+ return 0;
+ }
+@@ -2168,14 +1209,9 @@ static void serial8250_shutdown(struct u
+ * Disable interrupts from this port
+ */
+ up->ier = 0;
+- serial_outp(up, UART_IER, 0);
++ serial_out(up, UART_IER, 0);
+
+ spin_lock_irqsave(&up->port.lock, flags);
+- if (up->port.flags & UPF_FOURPORT) {
+- /* reset interrupts on the AST Fourport board */
+- inb((up->port.iobase & 0xfe0) | 0x1f);
+- up->port.mctrl |= TIOCM_OUT1;
+- } else
+ up->port.mctrl &= ~TIOCM_OUT2;
+
+ serial8250_set_mctrl(&up->port, up->port.mctrl);
+@@ -2184,16 +1220,9 @@ static void serial8250_shutdown(struct u
+ /*
+ * Disable break condition and FIFOs
+ */
+- serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
++ serial_out(up, UART_LCR, serial_in(up, UART_LCR) & ~UART_LCR_SBC);
+ serial8250_clear_fifos(up);
+
+-#ifdef CONFIG_SERIAL_8250_RSA
+- /*
+- * Reset the RSA board back to 115kbps compat mode.
+- */
+- disable_rsa(up);
+-#endif
+-
+ /*
+ * Read data port to reset things, and then unlink from
+ * the IRQ chain.
+@@ -2289,7 +1318,11 @@ serial8250_set_termios(struct uart_port
+ * have sufficient FIFO entries for the latency of the remote
+ * UART to respond. IOW, at least 32 bytes of FIFO.
+ */
++#ifdef CONFIG_SERIAL_RTL8198_UART1
++ if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 16) {
++#else
+ if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
++#endif
+ up->mcr &= ~UART_MCR_AFE;
+ if (termios->c_cflag & CRTSCTS)
+ up->mcr |= UART_MCR_AFE;
+@@ -2356,46 +1389,21 @@ serial8250_set_termios(struct uart_port
+ if (termios->c_cflag & CRTSCTS)
+ efr |= UART_EFR_CTS;
+
+- serial_outp(up, UART_LCR, 0xBF);
+- serial_outp(up, UART_EFR, efr);
+- }
+-
+-#ifdef CONFIG_ARCH_OMAP
+- /* Workaround to enable 115200 baud on OMAP1510 internal ports */
+- if (cpu_is_omap1510() && is_omap_port(up)) {
+- if (baud == 115200) {
+- quot = 1;
+- serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
+- } else
+- serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
+- }
+-#endif
+-
+- if (up->capabilities & UART_NATSEMI) {
+- /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
+- serial_outp(up, UART_LCR, 0xe0);
+- } else {
+- serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
++ serial_out(up, UART_LCR, 0xBF);
++ serial_out(up, UART_EFR, efr);
+ }
+
++ serial_out(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
+ serial_dl_write(up, quot);
+
+- /*
+- * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
+- * is written without DLAB set, this mode will be disabled.
+- */
+- if (up->port.type == PORT_16750)
+- serial_outp(up, UART_FCR, fcr);
+-
+- serial_outp(up, UART_LCR, cval); /* reset DLAB */
++ serial_out(up, UART_LCR, cval); /* reset DLAB */
+ up->lcr = cval; /* Save LCR */
+- if (up->port.type != PORT_16750) {
+ if (fcr & UART_FCR_ENABLE_FIFO) {
+ /* emulated UARTs (Lucent Venus 167x) need two steps */
+- serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
+- }
+- serial_outp(up, UART_FCR, fcr); /* set fcr */
++ serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
+ }
++ serial_out(up, UART_FCR, fcr); /* set fcr */
++
+ serial8250_set_mctrl(&up->port, up->port.mctrl);
+ spin_unlock_irqrestore(&up->port.lock, flags);
+ /* Don't rewrite B0 */
+@@ -2417,12 +1425,6 @@ serial8250_pm(struct uart_port *port, un
+
+ static unsigned int serial8250_port_size(struct uart_8250_port *pt)
+ {
+- if (pt->port.iotype == UPIO_AU)
+- return 0x100000;
+-#ifdef CONFIG_ARCH_OMAP
+- if (is_omap_port(pt))
+- return 0x16 << pt->port.regshift;
+-#endif
+ return 8 << pt->port.regshift;
+ }
+
+@@ -2435,8 +1437,6 @@ static int serial8250_request_std_resour
+ int ret = 0;
+
+ switch (up->port.iotype) {
+- case UPIO_AU:
+- case UPIO_TSI:
+ case UPIO_MEM32:
+ case UPIO_MEM:
+ case UPIO_DWAPB:
+@@ -2463,6 +1463,8 @@ static int serial8250_request_std_resour
+ if (!request_region(up->port.iobase, size, "serial"))
+ ret = -EBUSY;
+ break;
++ case UPIO_I2C:
++ break;
+ }
+ return ret;
+ }
+@@ -2472,8 +1474,6 @@ static void serial8250_release_std_resou
+ unsigned int size = serial8250_port_size(up);
+
+ switch (up->port.iotype) {
+- case UPIO_AU:
+- case UPIO_TSI:
+ case UPIO_MEM32:
+ case UPIO_MEM:
+ case UPIO_DWAPB:
+@@ -2492,38 +1492,7 @@ static void serial8250_release_std_resou
+ case UPIO_PORT:
+ release_region(up->port.iobase, size);
+ break;
+- }
+-}
+-
+-static int serial8250_request_rsa_resource(struct uart_8250_port *up)
+-{
+- unsigned long start = UART_RSA_BASE << up->port.regshift;
+- unsigned int size = 8 << up->port.regshift;
+- int ret = -EINVAL;
+-
+- switch (up->port.iotype) {
+- case UPIO_HUB6:
+- case UPIO_PORT:
+- start += up->port.iobase;
+- if (request_region(start, size, "serial-rsa"))
+- ret = 0;
+- else
+- ret = -EBUSY;
+- break;
+- }
+-
+- return ret;
+-}
+-
+-static void serial8250_release_rsa_resource(struct uart_8250_port *up)
+-{
+- unsigned long offset = UART_RSA_BASE << up->port.regshift;
+- unsigned int size = 8 << up->port.regshift;
+-
+- switch (up->port.iotype) {
+- case UPIO_HUB6:
+- case UPIO_PORT:
+- release_region(up->port.iobase + offset, size);
++ case UPIO_I2C:
+ break;
+ }
+ }
+@@ -2533,29 +1502,18 @@ static void serial8250_release_port(stru
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+
+ serial8250_release_std_resource(up);
+- if (up->port.type == PORT_RSA)
+- serial8250_release_rsa_resource(up);
+ }
+
+ static int serial8250_request_port(struct uart_port *port)
+ {
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+- int ret = 0;
+
+- ret = serial8250_request_std_resource(up);
+- if (ret == 0 && up->port.type == PORT_RSA) {
+- ret = serial8250_request_rsa_resource(up);
+- if (ret < 0)
+- serial8250_release_std_resource(up);
+- }
+-
+- return ret;
++ return serial8250_request_std_resource(up);
+ }
+
+ static void serial8250_config_port(struct uart_port *port, int flags)
+ {
+ struct uart_8250_port *up = (struct uart_8250_port *)port;
+- int probeflags = PROBE_ANY;
+ int ret;
+
+ /*
+@@ -2566,20 +1524,9 @@ static void serial8250_config_port(struc
+ if (ret < 0)
+ return;
+
+- ret = serial8250_request_rsa_resource(up);
+- if (ret < 0)
+- probeflags &= ~PROBE_RSA;
+-
+ if (up->port.iotype != up->cur_iotype)
+ set_io_from_upio(port);
+
+- if (flags & UART_CONFIG_TYPE)
+- autoconfig(up, probeflags);
+- if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
+- autoconfig_irq(up);
+-
+- if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
+- serial8250_release_rsa_resource(up);
+ if (up->port.type == PORT_UNKNOWN)
+ serial8250_release_std_resource(up);
+ }
+@@ -2773,6 +1720,14 @@ static int __init serial8250_console_set
+ int parity = 'n';
+ int flow = 'n';
+
++#ifdef CONFIG_SERIAL_SC16IS7X0
++ extern int __init early_sc16is7x0_init_i2c_and_check( void );
++ if( serial8250_ports[co->index].port.iotype == UPIO_I2C &&
++ early_sc16is7x0_init_i2c_and_check() != 0 )
++ {
++ return -ENODEV;
++ }
++#endif
+ /*
+ * Check whether an invalid uart number has been specified, and
+ * if so, search for the first available port that does have
+@@ -2902,19 +1857,6 @@ void serial8250_resume_port(int line)
+ {
+ struct uart_8250_port *up = &serial8250_ports[line];
+
+- if (up->capabilities & UART_NATSEMI) {
+- unsigned char tmp;
+-
+- /* Ensure it's still in high speed mode */
+- serial_outp(up, UART_LCR, 0xE0);
+-
+- tmp = serial_in(up, 0x04); /* EXCR2 */
+- tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
+- tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
+- serial_outp(up, 0x04, tmp);
+-
+- serial_outp(up, UART_LCR, 0);
+- }
+ uart_resume_port(&serial8250_reg, &up->port);
+ }
+
+@@ -3159,12 +2101,8 @@ static int __init serial8250_init(void)
+ "%d ports, IRQ sharing %sabled\n", nr_uarts,
+ share_irqs ? "en" : "dis");
+
+-#ifdef CONFIG_SPARC
+- ret = sunserial_register_minors(&serial8250_reg, UART_NR);
+-#else
+ serial8250_reg.nr = UART_NR;
+ ret = uart_register_driver(&serial8250_reg);
+-#endif
+ if (ret)
+ goto out;
+
+@@ -3189,11 +2127,7 @@ static int __init serial8250_init(void)
+ put_dev:
+ platform_device_put(serial8250_isa_devs);
+ unreg_uart_drv:
+-#ifdef CONFIG_SPARC
+- sunserial_unregister_minors(&serial8250_reg, UART_NR);
+-#else
+ uart_unregister_driver(&serial8250_reg);
+-#endif
+ out:
+ return ret;
+ }
+@@ -3212,11 +2146,7 @@ static void __exit serial8250_exit(void)
+ platform_driver_unregister(&serial8250_isa_driver);
+ platform_device_unregister(isa_dev);
+
+-#ifdef CONFIG_SPARC
+- sunserial_unregister_minors(&serial8250_reg, UART_NR);
+-#else
+ uart_unregister_driver(&serial8250_reg);
+-#endif
+ }
+
+ module_init(serial8250_init);
+@@ -3235,8 +2165,4 @@ MODULE_PARM_DESC(share_irqs, "Share IRQs
+ module_param(nr_uarts, uint, 0644);
+ MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
+
+-#ifdef CONFIG_SERIAL_8250_RSA
+-module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
+-MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
+-#endif
+ MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);
+--- linux-2.6.30.9/drivers/serial/8250.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/serial/8250.h 2013-05-02 01:47:55.684226900 +0300
+@@ -60,20 +60,4 @@ struct serial8250_config {
+ #define SERIAL8250_SHARE_IRQS 0
+ #endif
+
+-#if defined(__alpha__) && !defined(CONFIG_PCI)
+-/*
+- * Digital did something really horribly wrong with the OUT1 and OUT2
+- * lines on at least some ALPHA's. The failure mode is that if either
+- * is cleared, the machine locks up with endless interrupts.
+- */
+-#define ALPHA_KLUDGE_MCR (UART_MCR_OUT2 | UART_MCR_OUT1)
+-#elif defined(CONFIG_SBC8560)
+-/*
+- * WindRiver did something similarly broken on their SBC8560 board. The
+- * UART tristates its IRQ output while OUT2 is clear, but they pulled
+- * the interrupt line _up_ instead of down, so if we register the IRQ
+- * while the UART is in that state, we die in an IRQ storm. */
+-#define ALPHA_KLUDGE_MCR (UART_MCR_OUT2)
+-#else
+ #define ALPHA_KLUDGE_MCR 0
+-#endif
+--- linux-2.6.30.9/drivers/serial/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/serial/Kconfig 2013-05-02 01:47:55.686226899 +0300
+@@ -1,9 +1,10 @@
+ #
+ # Serial device configuration
+ #
++# $Id: Kconfig,v 1.11 2004/03/11 18:08:04 lethal Exp $
++#
+
+ menu "Serial drivers"
+- depends on HAS_IOMEM
+
+ #
+ # The new 8250/16550 serial drivers
+@@ -59,61 +60,6 @@ config SERIAL_8250_CONSOLE
+ kernel will automatically use the first serial line, /dev/ttyS0, as
+ system console.
+
+- You can set that using a kernel command line option such as
+- "console=uart8250,io,0x3f8,9600n8"
+- "console=uart8250,mmio,0xff5e0000,115200n8".
+- and it will switch to normal serial console when the corresponding
+- port is ready.
+- "earlycon=uart8250,io,0x3f8,9600n8"
+- "earlycon=uart8250,mmio,0xff5e0000,115200n8".
+- it will not only setup early console.
+-
+- If unsure, say N.
+-
+-config FIX_EARLYCON_MEM
+- bool
+- depends on X86
+- default y
+-
+-config SERIAL_8250_GSC
+- tristate
+- depends on SERIAL_8250 && GSC
+- default SERIAL_8250
+-
+-config SERIAL_8250_PCI
+- tristate "8250/16550 PCI device support" if EMBEDDED
+- depends on SERIAL_8250 && PCI
+- default SERIAL_8250
+- help
+- This builds standard PCI serial support. You may be able to
+- disable this feature if you only need legacy serial support.
+- Saves about 9K.
+-
+-config SERIAL_8250_PNP
+- tristate "8250/16550 PNP device support" if EMBEDDED
+- depends on SERIAL_8250 && PNP
+- default SERIAL_8250
+- help
+- This builds standard PNP serial support. You may be able to
+- disable this feature if you only need legacy serial support.
+-
+-config SERIAL_8250_HP300
+- tristate
+- depends on SERIAL_8250 && HP300
+- default SERIAL_8250
+-
+-config SERIAL_8250_CS
+- tristate "8250/16550 PCMCIA device support"
+- depends on PCMCIA && SERIAL_8250
+- ---help---
+- Say Y here to enable support for 16-bit PCMCIA serial devices,
+- including serial port cards, modems, and the modem functions of
+- multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
+- credit-card size devices often used with laptops.)
+-
+- To compile this driver as a module, choose M here: the
+- module will be called serial_cs.
+-
+ If unsure, say N.
+
+ config SERIAL_8250_NR_UARTS
+@@ -163,58 +109,6 @@ config SERIAL_8250_MANY_PORTS
+ say N here to save some memory. You can also say Y if you have an
+ "intelligent" multiport card such as Cyclades, Digiboards, etc.
+
+-#
+-# Multi-port serial cards
+-#
+-
+-config SERIAL_8250_FOURPORT
+- tristate "Support Fourport cards"
+- depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+- help
+- Say Y here if you have an AST FourPort serial board.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_fourport.
+-
+-config SERIAL_8250_ACCENT
+- tristate "Support Accent cards"
+- depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+- help
+- Say Y here if you have an Accent Async serial board.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_accent.
+-
+-config SERIAL_8250_BOCA
+- tristate "Support Boca cards"
+- depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+- help
+- Say Y here if you have a Boca serial board. Please read the Boca
+- mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_boca.
+-
+-config SERIAL_8250_EXAR_ST16C554
+- tristate "Support Exar ST16C554/554D Quad UART"
+- depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+- help
+- The Uplogix Envoy TU301 uses this Exar Quad UART. If you are
+- tinkering with your Envoy TU301, or have a machine with this UART,
+- say Y here.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_exar_st16c554.
+-
+-config SERIAL_8250_HUB6
+- tristate "Support Hub6 cards"
+- depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+- help
+- Say Y here if you have a HUB6 serial board.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_hub6.
+-
+ config SERIAL_8250_SHARE_IRQ
+ bool "Support for sharing serial interrupts"
+ depends on SERIAL_8250_EXTENDED
+@@ -223,1214 +117,48 @@ config SERIAL_8250_SHARE_IRQ
+ serial ports on the same board to share a single IRQ. To enable
+ support for this in the serial driver, say Y here.
+
+-config SERIAL_8250_DETECT_IRQ
+- bool "Autodetect IRQ on standard ports (unsafe)"
+- depends on SERIAL_8250_EXTENDED
+- help
+- Say Y here if you want the kernel to try to guess which IRQ
+- to use for your serial port.
+-
+- This is considered unsafe; it is far better to configure the IRQ in
+- a boot script using the setserial command.
+-
+- If unsure, say N.
+-
+-config SERIAL_8250_RSA
+- bool "Support RSA serial ports"
+- depends on SERIAL_8250_EXTENDED
+- help
+- ::: To be written :::
+-
+-config SERIAL_8250_MCA
+- tristate "Support 8250-type ports on MCA buses"
+- depends on SERIAL_8250 != n && MCA
+- help
+- Say Y here if you have a MCA serial ports.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called 8250_mca.
+-
+-config SERIAL_8250_ACORN
+- tristate "Acorn expansion card serial port support"
+- depends on ARCH_ACORN && SERIAL_8250
+- help
+- If you have an Atomwide Serial card or Serial Port card for an Acorn
+- system, say Y to this option. The driver can handle 1, 2, or 3 port
+- cards. If unsure, say N.
+-
+-config SERIAL_8250_AU1X00
+- bool "Au1x00 serial port support"
+- depends on SERIAL_8250 != n && SOC_AU1X00
+- help
+- If you have an Au1x00 SOC based board and want to use the serial port,
+- say Y to this option. The driver can handle up to 4 serial ports,
+- depending on the SOC. If unsure, say N.
+-
+-config SERIAL_8250_RM9K
+- bool "Support for MIPS RM9xxx integrated serial port"
+- depends on SERIAL_8250 != n && SERIAL_RM9000
+- select SERIAL_8250_SHARE_IRQ
+- help
+- Selecting this option will add support for the integrated serial
+- port hardware found on MIPS RM9122 and similar processors.
+- If unsure, say N.
+-
+-comment "Non-8250 serial port support"
+-
+-config SERIAL_AMBA_PL010
+- tristate "ARM AMBA PL010 serial port support"
+- depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE)
+- select SERIAL_CORE
+- help
+- This selects the ARM(R) AMBA(R) PrimeCell PL010 UART. If you have
+- an Integrator/AP or Integrator/PP2 platform, or if you have a
+- Cirrus Logic EP93xx CPU, say Y or M here.
+-
+- If unsure, say N.
+-
+-config SERIAL_AMBA_PL010_CONSOLE
+- bool "Support for console on AMBA serial port"
+- depends on SERIAL_AMBA_PL010=y
+- select SERIAL_CORE_CONSOLE
+- ---help---
+- Say Y here if you wish to use an AMBA PrimeCell UART as the system
+- console (the system console is the device which receives all kernel
+- messages and warnings and which allows logins in single user mode).
+-
+- Even if you say Y here, the currently visible framebuffer console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttyAM0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_AMBA_PL011
+- tristate "ARM AMBA PL011 serial port support"
+- depends on ARM_AMBA
+- select SERIAL_CORE
+- help
+- This selects the ARM(R) AMBA(R) PrimeCell PL011 UART. If you have
+- an Integrator/PP2, Integrator/CP or Versatile platform, say Y or M
+- here.
+-
+- If unsure, say N.
+-
+-config SERIAL_AMBA_PL011_CONSOLE
+- bool "Support for console on AMBA serial port"
+- depends on SERIAL_AMBA_PL011=y
+- select SERIAL_CORE_CONSOLE
+- ---help---
+- Say Y here if you wish to use an AMBA PrimeCell UART as the system
+- console (the system console is the device which receives all kernel
+- messages and warnings and which allows logins in single user mode).
+-
+- Even if you say Y here, the currently visible framebuffer console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttyAMA0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_SB1250_DUART
+- tristate "BCM1xxx on-chip DUART serial support"
+- depends on SIBYTE_SB1xxx_SOC=y
+- select SERIAL_CORE
+- default y
+- ---help---
+- Support for the asynchronous serial interface (DUART) included in
+- the BCM1250 and derived System-On-a-Chip (SOC) devices. Note that
+- the letter D in DUART stands for "dual", which is how the device
+- is implemented. Depending on the SOC configuration there may be
+- one or more DUARTs available of which all are handled.
+-
+- If unsure, say Y. To compile this driver as a module, choose M here:
+- the module will be called sb1250-duart.
+-
+-config SERIAL_SB1250_DUART_CONSOLE
+- bool "Support for console on a BCM1xxx DUART serial port"
+- depends on SERIAL_SB1250_DUART=y
+- select SERIAL_CORE_CONSOLE
+- default y
+- ---help---
+- If you say Y here, it will be possible to use a serial port as the
+- system console (the system console is the device which receives all
+- kernel messages and warnings and which allows logins in single user
+- mode).
+-
+- If unsure, say Y.
+-
+-config SERIAL_ATMEL
+- bool "AT91 / AT32 on-chip serial port support"
+- depends on (ARM && ARCH_AT91) || AVR32
+- select SERIAL_CORE
+- help
+- This enables the driver for the on-chip UARTs of the Atmel
+- AT91 and AT32 processors.
+-
+-config SERIAL_ATMEL_CONSOLE
+- bool "Support for console on AT91 / AT32 serial port"
+- depends on SERIAL_ATMEL=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you wish to use an on-chip UART on a Atmel
+- AT91 or AT32 processor as the system console (the system
+- console is the device which receives all kernel messages and
+- warnings and which allows logins in single user mode).
+-
+-config SERIAL_ATMEL_PDC
+- bool "Support DMA transfers on AT91 / AT32 serial port"
+- depends on SERIAL_ATMEL
+- default y
+- help
+- Say Y here if you wish to use the PDC to do DMA transfers to
+- and from the Atmel AT91 / AT32 serial port. In order to
+- actually use DMA transfers, make sure that the use_dma_tx
+- and use_dma_rx members in the atmel_uart_data struct is set
+- appropriately for each port.
+-
+- Note that break and error handling currently doesn't work
+- properly when DMA is enabled. Make sure that ports where
+- this matters don't use DMA.
+-
+-config SERIAL_ATMEL_TTYAT
+- bool "Install as device ttyATn instead of ttySn"
+- depends on SERIAL_ATMEL=y
+- help
+- Say Y here if you wish to have the internal AT91 / AT32 UARTs
+- appear as /dev/ttyATn (major 204, minor starting at 154)
+- instead of the normal /dev/ttySn (major 4, minor starting at
+- 64). This is necessary if you also want other UARTs, such as
+- external 8250/16C550 compatible UARTs.
+- The ttySn nodes are legally reserved for the 8250 serial driver
+- but are often misused by other serial drivers.
+-
+- To use this, you should create suitable ttyATn device nodes in
+- /dev/, and pass "console=ttyATn" to the kernel.
+-
+- Say Y if you have an external 8250/16C550 UART. If unsure, say N.
+-
+-config SERIAL_KS8695
+- bool "Micrel KS8695 (Centaur) serial port support"
+- depends on ARCH_KS8695
+- select SERIAL_CORE
+- help
+- This selects the Micrel Centaur KS8695 UART. Say Y here.
+-
+-config SERIAL_KS8695_CONSOLE
+- bool "Support for console on KS8695 (Centaur) serial port"
+- depends on SERIAL_KS8695=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you wish to use a KS8695 (Centaur) UART as the
+- system console (the system console is the device which
+- receives all kernel messages and warnings and which allows
+- logins in single user mode).
+-
+-config SERIAL_CLPS711X
+- tristate "CLPS711X serial port support"
+- depends on ARM && ARCH_CLPS711X
+- select SERIAL_CORE
+- help
+- ::: To be written :::
+-
+-config SERIAL_CLPS711X_CONSOLE
+- bool "Support for console on CLPS711X serial port"
+- depends on SERIAL_CLPS711X=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttyCL1". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_SAMSUNG
+- tristate "Samsung SoC serial support"
+- depends on ARM && PLAT_S3C
+- select SERIAL_CORE
+- help
+- Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
+- providing /dev/ttySAC0, 1 and 2 (note, some machines may not
+- provide all of these ports, depending on how the serial port
+- pins are configured.
+-
+-config SERIAL_SAMSUNG_UARTS
+- int
+- depends on ARM && PLAT_S3C
+- default 2 if ARCH_S3C2400
+- default 4 if ARCH_S3C64XX || CPU_S3C2443
+- default 3
+- help
+- Select the number of available UART ports for the Samsung S3C
+- serial driver
+-
+-config SERIAL_SAMSUNG_DEBUG
+- bool "Samsung SoC serial debug"
+- depends on SERIAL_SAMSUNG && DEBUG_LL
+- help
+- Add support for debugging the serial driver. Since this is
+- generally being used as a console, we use our own output
+- routines that go via the low-level debug printascii()
+- function.
+-
+-config SERIAL_SAMSUNG_CONSOLE
+- bool "Support for console on Samsung SoC serial port"
+- depends on SERIAL_SAMSUNG=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Allow selection of the S3C24XX on-board serial ports for use as
+- an virtual console.
+-
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttySACx". (Try "man bootparam" or see the documentation of
+- your boot loader about how to pass options to the kernel at
+- boot time.)
+-
+-config SERIAL_S3C2400
+- tristate "Samsung S3C2410 Serial port support"
+- depends on ARM && SERIAL_SAMSUNG && CPU_S3C2400
+- default y if CPU_S3C2400
+- help
+- Serial port support for the Samsung S3C2400 SoC
+-
+-config SERIAL_S3C2410
+- tristate "Samsung S3C2410 Serial port support"
+- depends on SERIAL_SAMSUNG && CPU_S3C2410
+- default y if CPU_S3C2410
+- help
+- Serial port support for the Samsung S3C2410 SoC
+-
+-config SERIAL_S3C2412
+- tristate "Samsung S3C2412/S3C2413 Serial port support"
+- depends on SERIAL_SAMSUNG && CPU_S3C2412
+- default y if CPU_S3C2412
+- help
+- Serial port support for the Samsung S3C2412 and S3C2413 SoC
+-
+-config SERIAL_S3C2440
+- tristate "Samsung S3C2440/S3C2442 Serial port support"
+- depends on SERIAL_SAMSUNG && (CPU_S3C2440 || CPU_S3C2442)
+- default y if CPU_S3C2440
+- default y if CPU_S3C2442
+- help
+- Serial port support for the Samsung S3C2440 and S3C2442 SoC
+-
+-config SERIAL_S3C24A0
+- tristate "Samsung S3C24A0 Serial port support"
+- depends on SERIAL_SAMSUNG && CPU_S3C24A0
+- default y if CPU_S3C24A0
+- help
+- Serial port support for the Samsung S3C24A0 SoC
+-
+-config SERIAL_S3C6400
+- tristate "Samsung S3C6400/S3C6410 Serial port support"
+- depends on SERIAL_SAMSUNG && (CPU_S3C600 || CPU_S3C6410)
+- default y
+- help
+- Serial port support for the Samsung S3C6400 and S3C6410
+- SoCs
+-
+-config SERIAL_MAX3100
+- tristate "MAX3100 support"
+- depends on SPI
+- select SERIAL_CORE
+- help
+- MAX3100 chip support
+-
+-config SERIAL_DZ
+- bool "DECstation DZ serial driver"
+- depends on MACH_DECSTATION && 32BIT
+- select SERIAL_CORE
+- default y
+- ---help---
+- DZ11-family serial controllers for DECstations and VAXstations,
+- including the DC7085, M7814, and M7819.
+-
+-config SERIAL_DZ_CONSOLE
+- bool "Support console on DECstation DZ serial driver"
+- depends on SERIAL_DZ=y
+- select SERIAL_CORE_CONSOLE
+- default y
+- ---help---
+- If you say Y here, it will be possible to use a serial port as the
+- system console (the system console is the device which receives all
+- kernel messages and warnings and which allows logins in single user
+- mode).
+-
+- Note that the firmware uses ttyS3 as the serial console on
+- DECstations that use this driver.
+-
+- If unsure, say Y.
+-
+-config SERIAL_ZS
+- tristate "DECstation Z85C30 serial support"
+- depends on MACH_DECSTATION
+- select SERIAL_CORE
+- default y
+- ---help---
+- Support for the Zilog 85C350 serial communications controller used
+- for serial ports in newer DECstation systems. These include the
+- DECsystem 5900 and all models of the DECstation and DECsystem 5000
+- systems except from model 200.
+-
+- If unsure, say Y. To compile this driver as a module, choose M here:
+- the module will be called zs.
+-
+-config SERIAL_ZS_CONSOLE
+- bool "Support for console on a DECstation Z85C30 serial port"
+- depends on SERIAL_ZS=y
+- select SERIAL_CORE_CONSOLE
+- default y
+- ---help---
+- If you say Y here, it will be possible to use a serial port as the
+- system console (the system console is the device which receives all
+- kernel messages and warnings and which allows logins in single user
+- mode).
+-
+- Note that the firmware uses ttyS1 as the serial console on the
+- Maxine and ttyS3 on the others using this driver.
+-
+- If unsure, say Y.
+-
+-config SERIAL_21285
+- tristate "DC21285 serial port support"
+- depends on ARM && FOOTBRIDGE
+- select SERIAL_CORE
+- help
+- If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
+- PCI bridge you can enable its onboard serial port by enabling this
+- option.
+-
+-config SERIAL_21285_CONSOLE
+- bool "Console on DC21285 serial port"
+- depends on SERIAL_21285=y
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have enabled the serial port on the 21285 footbridge you can
+- make it the console by answering Y to this option.
+-
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttyFB". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_MPSC
+- bool "Marvell MPSC serial port support"
+- depends on PPC32 && MV64X60
+- select SERIAL_CORE
+- help
+- Say Y here if you want to use the Marvell MPSC serial controller.
+-
+-config SERIAL_MPSC_CONSOLE
+- bool "Support for console on Marvell MPSC serial port"
+- depends on SERIAL_MPSC
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you want to support a serial console on a Marvell MPSC.
+-
+-config SERIAL_PXA
+- bool "PXA serial port support"
+- depends on ARCH_PXA || ARCH_MMP
+- select SERIAL_CORE
+- help
+- If you have a machine based on an Intel XScale PXA2xx CPU you
+- can enable its onboard serial ports by enabling this option.
+-
+-config SERIAL_PXA_CONSOLE
+- bool "Console on PXA serial port"
+- depends on SERIAL_PXA
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have enabled the serial port on the Intel XScale PXA
+- CPU you can make it the console by answering Y to this option.
+-
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttySA0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_SA1100
+- bool "SA1100 serial port support"
+- depends on ARM && ARCH_SA1100
+- select SERIAL_CORE
+- help
+- If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
+- can enable its onboard serial port by enabling this option.
+- Please read <file:Documentation/arm/SA1100/serial_UART> for further
+- info.
+-
+-config SERIAL_SA1100_CONSOLE
+- bool "Console on SA1100 serial port"
+- depends on SERIAL_SA1100
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have enabled the serial port on the SA1100/SA1110 StrongARM
+- CPU you can make it the console by answering Y to this option.
+-
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttySA0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_BFIN
+- tristate "Blackfin serial port support"
+- depends on BLACKFIN
+- select SERIAL_CORE
+- select SERIAL_BFIN_UART0 if (BF531 || BF532 || BF533 || BF561)
+- help
+- Add support for the built-in UARTs on the Blackfin.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called bfin_5xx.
+-
+-config SERIAL_BFIN_CONSOLE
+- bool "Console on Blackfin serial port"
+- depends on SERIAL_BFIN=y
+- select SERIAL_CORE_CONSOLE
+-
+-choice
+- prompt "UART Mode"
+- depends on SERIAL_BFIN
+- default SERIAL_BFIN_DMA
+- help
+- This driver supports the built-in serial ports of the Blackfin family
+- of CPUs
+-
+-config SERIAL_BFIN_DMA
+- bool "DMA mode"
+- depends on !DMA_UNCACHED_NONE && KGDB_SERIAL_CONSOLE=n
+- help
+- This driver works under DMA mode. If this option is selected, the
+- blackfin simple dma driver is also enabled.
+-
+-config SERIAL_BFIN_PIO
+- bool "PIO mode"
+- help
+- This driver works under PIO mode.
+-
+-endchoice
+-
+-config SERIAL_BFIN_UART0
+- bool "Enable UART0"
+- depends on SERIAL_BFIN
+- help
+- Enable UART0
+-
+-config BFIN_UART0_CTSRTS
+- bool "Enable UART0 hardware flow control"
+- depends on SERIAL_BFIN_UART0
+- help
+- Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
+- signal.
+-
+-config UART0_CTS_PIN
+- int "UART0 CTS pin"
+- depends on BFIN_UART0_CTSRTS && !BF548
+- default 23
+- help
+- The default pin is GPIO_GP7.
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config UART0_RTS_PIN
+- int "UART0 RTS pin"
+- depends on BFIN_UART0_CTSRTS && !BF548
+- default 22
+- help
+- The default pin is GPIO_GP6.
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config SERIAL_BFIN_UART1
+- bool "Enable UART1"
+- depends on SERIAL_BFIN && (!BF531 && !BF532 && !BF533 && !BF561)
+- help
+- Enable UART1
+-
+-config BFIN_UART1_CTSRTS
+- bool "Enable UART1 hardware flow control"
+- depends on SERIAL_BFIN_UART1
+- help
+- Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
+- signal.
+-
+-config UART1_CTS_PIN
+- int "UART1 CTS pin"
+- depends on BFIN_UART1_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config UART1_RTS_PIN
+- int "UART1 RTS pin"
+- depends on BFIN_UART1_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config SERIAL_BFIN_UART2
+- bool "Enable UART2"
+- depends on SERIAL_BFIN && (BF54x || BF538 || BF539)
+- help
+- Enable UART2
+-
+-config BFIN_UART2_CTSRTS
+- bool "Enable UART2 hardware flow control"
+- depends on SERIAL_BFIN_UART2
+- help
+- Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
+- signal.
+-
+-config UART2_CTS_PIN
+- int "UART2 CTS pin"
+- depends on BFIN_UART2_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config UART2_RTS_PIN
+- int "UART2 RTS pin"
+- depends on BFIN_UART2_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config SERIAL_BFIN_UART3
+- bool "Enable UART3"
+- depends on SERIAL_BFIN && (BF54x)
+- help
+- Enable UART3
+-
+-config BFIN_UART3_CTSRTS
+- bool "Enable UART3 hardware flow control"
+- depends on SERIAL_BFIN_UART3
+- help
+- Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
+- signal.
+-
+-config UART3_CTS_PIN
+- int "UART3 CTS pin"
+- depends on BFIN_UART3_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config UART3_RTS_PIN
+- int "UART3 RTS pin"
+- depends on BFIN_UART3_CTSRTS && !BF548
+- default -1
+- help
+- Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+-
+-config SERIAL_IMX
+- bool "IMX serial port support"
+- depends on ARM && (ARCH_IMX || ARCH_MXC)
+- select SERIAL_CORE
+- help
+- If you have a machine based on a Motorola IMX CPU you
+- can enable its onboard serial port by enabling this option.
+-
+-config SERIAL_IMX_CONSOLE
+- bool "Console on IMX serial port"
+- depends on SERIAL_IMX
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have enabled the serial port on the Motorola IMX
+- CPU you can make it the console by answering Y to this option.
+-
+- Even if you say Y here, the currently visible virtual console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttySA0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_UARTLITE
+- tristate "Xilinx uartlite serial port support"
+- depends on PPC32 || MICROBLAZE
+- select SERIAL_CORE
+- help
+- Say Y here if you want to use the Xilinx uartlite serial controller.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called uartlite.ko.
+-
+-config SERIAL_UARTLITE_CONSOLE
+- bool "Support for console on Xilinx uartlite serial port"
+- depends on SERIAL_UARTLITE=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you wish to use a Xilinx uartlite as the system
+- console (the system console is the device which receives all kernel
+- messages and warnings and which allows logins in single user mode).
+-
+-config SERIAL_SUNCORE
+- bool
+- depends on SPARC
+- select SERIAL_CORE
+- select SERIAL_CORE_CONSOLE
+- default y
+-
+-config SERIAL_SUNZILOG
+- tristate "Sun Zilog8530 serial support"
+- depends on SPARC
+- help
+- This driver supports the Zilog8530 serial ports found on many Sparc
+- systems. Say Y or M if you want to be able to these serial ports.
+-
+-config SERIAL_SUNZILOG_CONSOLE
+- bool "Console on Sun Zilog8530 serial port"
+- depends on SERIAL_SUNZILOG=y
+- help
+- If you would like to be able to use the Zilog8530 serial port
+- on your Sparc system as the console, you can do so by answering
+- Y to this option.
+-
+-config SERIAL_SUNSU
+- tristate "Sun SU serial support"
+- depends on SPARC && PCI
+- help
+- This driver supports the 8250 serial ports that run the keyboard and
+- mouse on (PCI) UltraSPARC systems. Say Y or M if you want to be able
+- to these serial ports.
+-
+-config SERIAL_SUNSU_CONSOLE
+- bool "Console on Sun SU serial port"
+- depends on SERIAL_SUNSU=y
+- help
+- If you would like to be able to use the SU serial port
+- on your Sparc system as the console, you can do so by answering
+- Y to this option.
+-
+-config SERIAL_MUX
+- tristate "Serial MUX support"
+- depends on GSC
+- select SERIAL_CORE
+- default y
+- ---help---
+- Saying Y here will enable the hardware MUX serial driver for
+- the Nova, K class systems and D class with a 'remote control card'.
+- The hardware MUX is not 8250/16550 compatible therefore the
+- /dev/ttyB0 device is shared between the Serial MUX and the PDC
+- software console. The following steps need to be completed to use
+- the Serial MUX:
+-
+- 1. create the device entry (mknod /dev/ttyB0 c 11 0)
+- 2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
+- 3. Add device ttyB0 to /etc/securetty (if you want to log on as
+- root on this console.)
+- 4. Change the kernel command console parameter to: console=ttyB0
+-
+-config SERIAL_MUX_CONSOLE
+- bool "Support for console on serial MUX"
+- depends on SERIAL_MUX=y
+- select SERIAL_CORE_CONSOLE
+- default y
+-
+-config PDC_CONSOLE
+- bool "PDC software console support"
+- depends on PARISC && !SERIAL_MUX && VT
+- default n
+- help
+- Saying Y here will enable the software based PDC console to be
+- used as the system console. This is useful for machines in
+- which the hardware based console has not been written yet. The
+- following steps must be competed to use the PDC console:
+-
+- 1. create the device entry (mknod /dev/ttyB0 c 11 0)
+- 2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
+- 3. Add device ttyB0 to /etc/securetty (if you want to log on as
+- root on this console.)
+- 4. Change the kernel command console parameter to: console=ttyB0
+-
+-config SERIAL_SUNSAB
+- tristate "Sun Siemens SAB82532 serial support"
+- depends on SPARC && PCI
+- help
+- This driver supports the Siemens SAB82532 DUSCC serial ports on newer
+- (PCI) UltraSPARC systems. Say Y or M if you want to be able to these
+- serial ports.
+-
+-config SERIAL_SUNSAB_CONSOLE
+- bool "Console on Sun Siemens SAB82532 serial port"
+- depends on SERIAL_SUNSAB=y
+- help
+- If you would like to be able to use the SAB82532 serial port
+- on your Sparc system as the console, you can do so by answering
+- Y to this option.
+-
+-config SERIAL_SUNHV
+- bool "Sun4v Hypervisor Console support"
+- depends on SPARC64
+- help
+- This driver supports the console device found on SUN4V Sparc
+- systems. Say Y if you want to be able to use this device.
+-
+-config SERIAL_IP22_ZILOG
+- tristate "SGI Zilog8530 serial support"
+- depends on SGI_HAS_ZILOG
+- select SERIAL_CORE
+- help
+- This driver supports the Zilog8530 serial ports found on SGI
+- systems. Say Y or M if you want to be able to these serial ports.
+-
+-config SERIAL_IP22_ZILOG_CONSOLE
+- bool "Console on SGI Zilog8530 serial port"
+- depends on SERIAL_IP22_ZILOG=y
+- select SERIAL_CORE_CONSOLE
+-
+-config SERIAL_SH_SCI
+- tristate "SuperH SCI(F) serial port support"
+- depends on SUPERH || H8300
+- select SERIAL_CORE
+-
+-config SERIAL_SH_SCI_NR_UARTS
+- int "Maximum number of SCI(F) serial ports"
+- depends on SERIAL_SH_SCI
+- default "2"
+-
+-config SERIAL_SH_SCI_CONSOLE
+- bool "Support for console on SuperH SCI(F)"
+- depends on SERIAL_SH_SCI=y
+- select SERIAL_CORE_CONSOLE
+-
+-config SERIAL_PNX8XXX
+- bool "Enable PNX8XXX SoCs' UART Support"
+- depends on MIPS && (SOC_PNX8550 || SOC_PNX833X)
+- select SERIAL_CORE
+- help
+- If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
+- and you want to use serial ports, say Y. Otherwise, say N.
+-
+-config SERIAL_PNX8XXX_CONSOLE
+- bool "Enable PNX8XX0 serial console"
+- depends on SERIAL_PNX8XXX
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
+- and you want to use serial console, say Y. Otherwise, say N.
+-
+ config SERIAL_CORE
+ tristate
+
+ config SERIAL_CORE_CONSOLE
+ bool
+
+-config CONSOLE_POLL
+- bool
+-
+-config SERIAL_68328
+- bool "68328 serial support"
+- depends on M68328 || M68EZ328 || M68VZ328
+- help
+- This driver supports the built-in serial port of the Motorola 68328
+- (standard, EZ and VZ varieties).
+-
+-config SERIAL_68328_RTS_CTS
+- bool "Support RTS/CTS on 68328 serial port"
+- depends on SERIAL_68328
+-
+-config SERIAL_MCF
+- bool "Coldfire serial support"
+- depends on COLDFIRE
+- select SERIAL_CORE
+- help
+- This serial driver supports the Freescale Coldfire serial ports.
+-
+-config SERIAL_MCF_BAUDRATE
+- int "Default baudrate for Coldfire serial ports"
+- depends on SERIAL_MCF
+- default 19200
+- help
+- This setting lets you define what the default baudrate is for the
+- ColdFire serial ports. The usual default varies from board to board,
+- and this setting is a way of catering for that.
+-
+-config SERIAL_MCF_CONSOLE
+- bool "Coldfire serial console support"
+- depends on SERIAL_MCF
+- select SERIAL_CORE_CONSOLE
+- help
+- Enable a ColdFire internal serial port to be the system console.
+-
+-config SERIAL_68360_SMC
+- bool "68360 SMC uart support"
+- depends on M68360
+- help
+- This driver supports the SMC serial ports of the Motorola 68360 CPU.
+-
+-config SERIAL_68360_SCC
+- bool "68360 SCC uart support"
+- depends on M68360
+- help
+- This driver supports the SCC serial ports of the Motorola 68360 CPU.
+-
+-config SERIAL_68360
+- bool
+- depends on SERIAL_68360_SMC || SERIAL_68360_SCC
+- default y
+-
+-config SERIAL_PMACZILOG
+- tristate "PowerMac z85c30 ESCC support"
+- depends on PPC_OF && PPC_PMAC
+- select SERIAL_CORE
+- help
+- This driver supports the Zilog z85C30 serial ports found on
+- PowerMac machines.
+- Say Y or M if you want to be able to these serial ports.
+-
+-config SERIAL_PMACZILOG_TTYS
+- bool "Use ttySn device nodes for Zilog z85c30"
+- depends on SERIAL_PMACZILOG
+- help
+- The pmac_zilog driver for the z85C30 chip on many powermacs
+- historically used the device numbers for /dev/ttySn. The
+- 8250 serial port driver also uses these numbers, which means
+- the two drivers being unable to coexist; you could not use
+- both z85C30 and 8250 type ports at the same time.
+-
+- If this option is not selected, the pmac_zilog driver will
+- use the device numbers allocated for /dev/ttyPZn. This allows
+- the pmac_zilog and 8250 drivers to co-exist, but may cause
+- existing userspace setups to break. Programs that need to
+- access the built-in serial ports on powermacs will need to
+- be reconfigured to use /dev/ttyPZn instead of /dev/ttySn.
+-
+- If you enable this option, any z85c30 ports in the system will
+- be registered as ttyS0 onwards as in the past, and you will be
+- unable to use the 8250 module for PCMCIA or other 16C550-style
+- UARTs.
+-
+- Say N unless you need the z85c30 ports on your powermac
+- to appear as /dev/ttySn.
+-
+-config SERIAL_PMACZILOG_CONSOLE
+- bool "Console on PowerMac z85c30 serial port"
+- depends on SERIAL_PMACZILOG=y
+- select SERIAL_CORE_CONSOLE
+- help
+- If you would like to be able to use the z85c30 serial port
+- on your PowerMac as the console, you can do so by answering
+- Y to this option.
+-
+-config SERIAL_LH7A40X
+- tristate "Sharp LH7A40X embedded UART support"
+- depends on ARM && ARCH_LH7A40X
+- select SERIAL_CORE
+- help
+- This enables support for the three on-board UARTs of the
+- Sharp LH7A40X series CPUs. Choose Y or M.
+-
+-config SERIAL_LH7A40X_CONSOLE
+- bool "Support for console on Sharp LH7A40X serial port"
+- depends on SERIAL_LH7A40X=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you wish to use one of the serial ports as the
+- system console--the system console is the device which
+- receives all kernel messages and warnings and which allows
+- logins in single user mode.
+-
+- Even if you say Y here, the currently visible framebuffer console
+- (/dev/tty0) will still be used as the default system console, but
+- you can alter that using a kernel command line, for example
+- "console=ttyAM1".
+-
+-config SERIAL_CPM
+- tristate "CPM SCC/SMC serial port support"
+- depends on CPM2 || 8xx
+- select SERIAL_CORE
+- help
+- This driver supports the SCC and SMC serial ports on Motorola
+- embedded PowerPC that contain a CPM1 (8xx) or CPM2 (8xxx)
+-
+-config SERIAL_CPM_CONSOLE
+- bool "Support for console on CPM SCC/SMC serial port"
+- depends on SERIAL_CPM=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you wish to use a SCC or SMC CPM UART as the system
+- console (the system console is the device which receives all kernel
+- messages and warnings and which allows logins in single user mode).
+-
+- Even if you say Y here, the currently visible framebuffer console
+- (/dev/tty0) will still be used as the system console by default, but
+- you can alter that using a kernel command line option such as
+- "console=ttyCPM0". (Try "man bootparam" or see the documentation of
+- your boot loader (lilo or loadlin) about how to pass options to the
+- kernel at boot time.)
+-
+-config SERIAL_SGI_L1_CONSOLE
+- bool "SGI Altix L1 serial console support"
+- depends on IA64_GENERIC || IA64_SGI_SN2
+- select SERIAL_CORE
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have an SGI Altix and you would like to use the system
+- controller serial port as your console (you want this!),
+- say Y. Otherwise, say N.
+-
+-config SERIAL_MPC52xx
+- tristate "Freescale MPC52xx/MPC512x family PSC serial support"
+- depends on PPC_MPC52xx || PPC_MPC512x
+- select SERIAL_CORE
+- help
+- This driver supports MPC52xx and MPC512x PSC serial ports. If you would
+- like to use them, you must answer Y or M to this option. Note that
+- for use as console, it must be included in kernel and not as a
+- module.
+-
+-config SERIAL_MPC52xx_CONSOLE
+- bool "Console on a Freescale MPC52xx/MPC512x family PSC serial port"
+- depends on SERIAL_MPC52xx=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Select this options if you'd like to use one of the PSC serial port
+- of the Freescale MPC52xx family as a console.
+-
+-config SERIAL_MPC52xx_CONSOLE_BAUD
+- int "Freescale MPC52xx/MPC512x family PSC serial port baud"
+- depends on SERIAL_MPC52xx_CONSOLE=y
+- default "9600"
+- help
+- Select the MPC52xx console baud rate.
+- This value is only used if the bootloader doesn't pass in the
+- console baudrate
+-
+-config SERIAL_ICOM
+- tristate "IBM Multiport Serial Adapter"
+- depends on PCI && (PPC_ISERIES || PPC_PSERIES)
+- select SERIAL_CORE
+- select FW_LOADER
+- help
+- This driver is for a family of multiport serial adapters
+- including 2 port RVX, 2 port internal modem, 4 port internal
+- modem and a split 1 port RVX and 1 port internal modem.
+-
+- This driver can also be built as a module. If so, the module
+- will be called icom.
+-
+-config SERIAL_M32R_SIO
+- bool "M32R SIO I/F"
+- depends on M32R
+- default y
+- select SERIAL_CORE
+- help
+- Say Y here if you want to use the M32R serial controller.
+-
+-config SERIAL_M32R_SIO_CONSOLE
+- bool "use SIO console"
+- depends on SERIAL_M32R_SIO=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Say Y here if you want to support a serial console.
+-
+- If you use an M3T-M32700UT or an OPSPUT platform,
+- please say also y for SERIAL_M32R_PLDSIO.
+-
+-config SERIAL_M32R_PLDSIO
+- bool "M32R SIO I/F on a PLD"
+- depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PLAT_USRV || PLAT_M32700UT)
+- default n
+- help
+- Say Y here if you want to use the M32R serial controller
+- on a PLD (Programmable Logic Device).
+-
+- If you use an M3T-M32700UT or an OPSPUT platform,
+- please say Y.
+-
+-config SERIAL_TXX9
+- bool "TMPTX39XX/49XX SIO support"
+- depends on HAS_TXX9_SERIAL
+- select SERIAL_CORE
+- default y
+-
+-config HAS_TXX9_SERIAL
+- bool
+-
+-config SERIAL_TXX9_NR_UARTS
+- int "Maximum number of TMPTX39XX/49XX SIO ports"
+- depends on SERIAL_TXX9
+- default "6"
+-
+-config SERIAL_TXX9_CONSOLE
+- bool "TMPTX39XX/49XX SIO Console support"
+- depends on SERIAL_TXX9=y
+- select SERIAL_CORE_CONSOLE
+-
+-config SERIAL_TXX9_STDSERIAL
+- bool "TX39XX/49XX SIO act as standard serial"
+- depends on !SERIAL_8250 && SERIAL_TXX9
+-
+-config SERIAL_VR41XX
+- tristate "NEC VR4100 series Serial Interface Unit support"
+- depends on CPU_VR41XX
+- select SERIAL_CORE
+- help
+- If you have a NEC VR4100 series processor and you want to use
+- Serial Interface Unit(SIU) or Debug Serial Interface Unit(DSIU)
+- (not include VR4111/VR4121 DSIU), say Y. Otherwise, say N.
+-
+-config SERIAL_VR41XX_CONSOLE
+- bool "Enable NEC VR4100 series Serial Interface Unit console"
+- depends on SERIAL_VR41XX=y
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have a NEC VR4100 series processor and you want to use
+- a console on a serial port, say Y. Otherwise, say N.
+-
+-config SERIAL_JSM
+- tristate "Digi International NEO PCI Support"
+- depends on PCI
+- select SERIAL_CORE
+- help
+- This is a driver for Digi International's Neo series
+- of cards which provide multiple serial ports. You would need
+- something like this to connect more than two modems to your Linux
+- box, for instance in order to become a dial-in server. This driver
+- supports PCI boards only.
+-
+- If you have a card like this, say Y here, otherwise say N.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called jsm.
+-
+-config SERIAL_SGI_IOC4
+- tristate "SGI IOC4 controller serial support"
+- depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC4
+- select SERIAL_CORE
+- help
+- If you have an SGI Altix with an IOC4 based Base IO card
+- and wish to use the serial ports on this card, say Y.
+- Otherwise, say N.
+-
+-config SERIAL_SGI_IOC3
+- tristate "SGI Altix IOC3 serial support"
+- depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC3
+- select SERIAL_CORE
+- help
+- If you have an SGI Altix with an IOC3 serial card,
+- say Y or M. Otherwise, say N.
+-
+-config SERIAL_NETX
+- tristate "NetX serial port support"
+- depends on ARM && ARCH_NETX
+- select SERIAL_CORE
+- help
+- If you have a machine based on a Hilscher NetX SoC you
+- can enable its onboard serial port by enabling this option.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called netx-serial.
+-
+-config SERIAL_NETX_CONSOLE
+- bool "Console on NetX serial port"
+- depends on SERIAL_NETX=y
+- select SERIAL_CORE_CONSOLE
+- help
+- If you have enabled the serial port on the Hilscher NetX SoC
+- you can make it the console by answering Y to this option.
+-
+-config SERIAL_OF_PLATFORM
+- tristate "Serial port on Open Firmware platform bus"
+- depends on PPC_OF || MICROBLAZE
+- depends on SERIAL_8250 || SERIAL_OF_PLATFORM_NWPSERIAL
+- help
+- If you have a PowerPC based system that has serial ports
+- on a platform specific bus, you should enable this option.
+- Currently, only 8250 compatible ports are supported, but
+- others can easily be added.
+-
+-config SERIAL_OF_PLATFORM_NWPSERIAL
+- tristate "NWP serial port driver"
+- depends on PPC_OF && PPC_DCR
+- select SERIAL_OF_PLATFORM
+- select SERIAL_CORE_CONSOLE
+- select SERIAL_CORE
+- help
+- This driver supports the cell network processor nwp serial
+- device.
+-
+-config SERIAL_OF_PLATFORM_NWPSERIAL_CONSOLE
+- bool "Console on NWP serial port"
+- depends on SERIAL_OF_PLATFORM_NWPSERIAL=y
+- select SERIAL_CORE_CONSOLE
+- help
+- Support for Console on the NWP serial ports.
+-
+-config SERIAL_QE
+- tristate "Freescale QUICC Engine serial port support"
+- depends on QUICC_ENGINE
+- select SERIAL_CORE
+- select FW_LOADER
+- default n
+- help
+- This driver supports the QE serial ports on Freescale embedded
+- PowerPC that contain a QUICC Engine.
+-
+-config SERIAL_SC26XX
+- tristate "SC2681/SC2692 serial port support"
+- depends on SNI_RM
+- select SERIAL_CORE
+- help
+- This is a driver for the onboard serial ports of
+- older RM400 machines.
+-
+-config SERIAL_SC26XX_CONSOLE
+- bool "Console on SC2681/SC2692 serial port"
+- depends on SERIAL_SC26XX
+- select SERIAL_CORE_CONSOLE
+- help
+- Support for Console on SC2681/SC2692 serial ports.
+-
+-config SERIAL_BFIN_SPORT
+- tristate "Blackfin SPORT emulate UART (EXPERIMENTAL)"
+- depends on BLACKFIN && EXPERIMENTAL
+- select SERIAL_CORE
++comment "8250 compatible port support"
++config SERIAL_RTL8198_UART1
++ bool "8198 UART1 support"
++ depends on SERIAL_8250 && SERIAL_8250_NR_UARTS >= 2 && SERIAL_8250_RUNTIME_UARTS >= 2
++ help
++ Enable 8198 UART1 support, and this MAY add an uart device to ttyS1.
++ NOTE: We don't provide option for this port to be console.
++
++config SERIAL_SC16IS7X0
++ bool "SC16IS7x0 series (I2C bus) support"
++ depends on SERIAL_8250 && SERIAL_8250_NR_UARTS >= 2 && SERIAL_8250_RUNTIME_UARTS >= 2
+ help
+- Enable SPORT emulate UART on Blackfin series.
+-
+- To compile this driver as a module, choose M here: the
+- module will be called bfin_sport_uart.
+-
++ Enable sc16is7x0 definition is to add an UART device to ttyS1.
++ This is based on standard 8250, and doesn't affect original setting.
+ choice
+- prompt "Baud rate for Blackfin SPORT UART"
+- depends on SERIAL_BFIN_SPORT
+- default SERIAL_SPORT_BAUD_RATE_57600
++ prompt "Crystal for SC16IS7x0 XTAL1"
++ depends on SERIAL_SC16IS7X0
+ help
+- Choose a baud rate for the SPORT UART, other uart settings are
+- 8 bit, 1 stop bit, no parity, no flow control.
+-
+-config SERIAL_SPORT_BAUD_RATE_115200
+- bool "115200"
+-
+-config SERIAL_SPORT_BAUD_RATE_57600
+- bool "57600"
+-
+-config SERIAL_SPORT_BAUD_RATE_38400
+- bool "38400"
+-
+-config SERIAL_SPORT_BAUD_RATE_19200
+- bool "19200"
+-
+-config SERIAL_SPORT_BAUD_RATE_9600
+- bool "9600"
++ Crystal for SC16IS7x0 XTAL1.
++ This is factor of baudrate, so bad parameter will cause UART to be
++ abnormal.
++ config SERIAL_SC16IS7X0_XTAL1_CLK_1843200
++ bool "1.8432 MHZ"
++ config SERIAL_SC16IS7X0_XTAL1_CLK_14746500
++ bool "14.7465 MHZ (NXP demoboard)"
+ endchoice
+-
+-config SPORT_BAUD_RATE
+- int
+- depends on SERIAL_BFIN_SPORT
+- default 115200 if (SERIAL_SPORT_BAUD_RATE_115200)
+- default 57600 if (SERIAL_SPORT_BAUD_RATE_57600)
+- default 38400 if (SERIAL_SPORT_BAUD_RATE_38400)
+- default 19200 if (SERIAL_SPORT_BAUD_RATE_19200)
+- default 9600 if (SERIAL_SPORT_BAUD_RATE_9600)
+-
++config SERIAL_SC16IS7X0_CONSOLE
++ bool "Console on SC16IS7x0 port (ttyS1)"
++ depends on SERIAL_SC16IS7X0 && SERIAL_8250_CONSOLE
++ help
++ If you don't check this option, we will use standard 8250 as console.
++ Here, 8250 and sc16is7x0 occups ttyS0 and ttyS1 respectively.
++ Notice 1:
++ You need add "console=ttyS1" to CONFIG_CMDLINE, or console output will be incorrect.
++ Notice 2:
++ If you want to make user space's stdout to this port,
++ device (major,minor) of /dev/console has to be ttyS1 (4,65)
++ instead of ttyS0 (4,64).
+ endmenu
+--- linux-2.6.30.9/drivers/serial/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/serial/Makefile 2013-05-02 01:47:55.686226899 +0300
+@@ -1,79 +1,35 @@
+ #
+ # Makefile for the kernel serial device drivers.
+ #
++ifeq ($(CONFIG_SERIAL_SC16IS7X0),y)
++ EXTRA_CFLAGS += -DCONFIG_RTK_VOIP_DRIVERS_PCM8972B_FAMILY
++endif
+
++ifeq ($(CONFIG_SND_RTL8197D_SOC_ALC5628),y)
++ EXTRA_CFLAGS += -DCONFIG_RTK_VOIP_DRIVERS_PCM89xxD
++endif
+ obj-$(CONFIG_SERIAL_CORE) += serial_core.o
+-obj-$(CONFIG_SERIAL_21285) += 21285.o
+
+ # These Sparc drivers have to appear before others such as 8250
+ # which share ttySx minor node space. Otherwise console device
+ # names change and other unplesantries.
+-obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o
+-obj-$(CONFIG_SERIAL_SUNHV) += sunhv.o
+-obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o
+-obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o
+-obj-$(CONFIG_SERIAL_SUNSAB) += sunsab.o
+
+ obj-$(CONFIG_SERIAL_8250) += 8250.o
+ obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o
+ obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o
+ obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o
+-obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o
+-obj-$(CONFIG_SERIAL_8250_CS) += serial_cs.o
+-obj-$(CONFIG_SERIAL_8250_ACORN) += 8250_acorn.o
+ obj-$(CONFIG_SERIAL_8250_CONSOLE) += 8250_early.o
+-obj-$(CONFIG_SERIAL_8250_FOURPORT) += 8250_fourport.o
+-obj-$(CONFIG_SERIAL_8250_ACCENT) += 8250_accent.o
+-obj-$(CONFIG_SERIAL_8250_BOCA) += 8250_boca.o
+-obj-$(CONFIG_SERIAL_8250_EXAR_ST16C554) += 8250_exar_st16c554.o
+-obj-$(CONFIG_SERIAL_8250_HUB6) += 8250_hub6.o
+-obj-$(CONFIG_SERIAL_8250_MCA) += 8250_mca.o
+-obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o
+-obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o
+-obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o
+-obj-$(CONFIG_SERIAL_PXA) += pxa.o
+-obj-$(CONFIG_SERIAL_PNX8XXX) += pnx8xxx_uart.o
+-obj-$(CONFIG_SERIAL_SA1100) += sa1100.o
+-obj-$(CONFIG_SERIAL_BFIN) += bfin_5xx.o
+-obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o
+-obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o
+-obj-$(CONFIG_SERIAL_S3C2400) += s3c2400.o
+-obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o
+-obj-$(CONFIG_SERIAL_S3C2412) += s3c2412.o
+-obj-$(CONFIG_SERIAL_S3C2440) += s3c2440.o
+-obj-$(CONFIG_SERIAL_S3C24A0) += s3c24a0.o
+-obj-$(CONFIG_SERIAL_S3C6400) += s3c6400.o
+-obj-$(CONFIG_SERIAL_MAX3100) += max3100.o
+-obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o
+-obj-$(CONFIG_SERIAL_MUX) += mux.o
+-obj-$(CONFIG_SERIAL_68328) += 68328serial.o
+-obj-$(CONFIG_SERIAL_68360) += 68360serial.o
+-obj-$(CONFIG_SERIAL_MCF) += mcf.o
+-obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o
+-obj-$(CONFIG_SERIAL_LH7A40X) += serial_lh7a40x.o
+-obj-$(CONFIG_SERIAL_DZ) += dz.o
+-obj-$(CONFIG_SERIAL_ZS) += zs.o
+-obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
+-obj-$(CONFIG_SERIAL_SGI_L1_CONSOLE) += sn_console.o
+-obj-$(CONFIG_SERIAL_CPM) += cpm_uart/
+-obj-$(CONFIG_SERIAL_IMX) += imx.o
+-obj-$(CONFIG_SERIAL_MPC52xx) += mpc52xx_uart.o
+-obj-$(CONFIG_SERIAL_ICOM) += icom.o
+-obj-$(CONFIG_SERIAL_M32R_SIO) += m32r_sio.o
+-obj-$(CONFIG_SERIAL_MPSC) += mpsc.o
+-obj-$(CONFIG_SERIAL_SB1250_DUART) += sb1250-duart.o
+-obj-$(CONFIG_ETRAX_SERIAL) += crisv10.o
+-obj-$(CONFIG_SERIAL_SC26XX) += sc26xx.o
+-obj-$(CONFIG_SERIAL_JSM) += jsm/
+-obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o
+-obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o
+-obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o
+-obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o
+-obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
+-obj-$(CONFIG_SERIAL_UARTLITE) += uartlite.o
+-obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
+ obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
+ obj-$(CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL) += nwpserial.o
+-obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
+ obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
+-obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
++obj-$(CONFIG_SERIAL_SC16IS7X0) += 8250_sc16is7x0.o
++obj-$(CONFIG_SERIAL_SC16IS7X0) += i2c.o
++obj-$(CONFIG_SERIAL_SC16IS7X0) += gpio_8972b.o
++
++ifneq ($(CONFIG_SERIAL_SC16IS7X0),y)
++ obj-$(CONFIG_SND_RTL8197D_SOC_ALC5628) += i2c.o
++endif
++obj-$(CONFIG_SND_RTL819X_SOC) += gpio_8972d.o
++obj-$(CONFIG_SND_RTL8197D_SOC_ALC5628) += i2c_alc5628.o
++
++EXTRA_CFLAGS += -Iinclude/asm-mips/rtl865x/
+--- linux-2.6.30.9/drivers/serial/serial_core.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/serial/serial_core.c 2013-05-02 01:47:55.689226899 +0300
+@@ -417,7 +417,7 @@ uart_get_divisor(struct uart_port *port,
+ * Old custom speed handling.
+ */
+ if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
+- quot = port->custom_divisor;
++ quot = 3; //port->custom_divisor;
+ else
+ quot = (port->uartclk + (8 * baud)) / (16 * baud);
+
+@@ -2140,12 +2140,14 @@ uart_report_port(struct uart_driver *drv
+ break;
+ case UPIO_MEM:
+ case UPIO_MEM32:
+- case UPIO_AU:
+- case UPIO_TSI:
+ case UPIO_DWAPB:
+ snprintf(address, sizeof(address),
+ "MMIO 0x%llx", (unsigned long long)port->mapbase);
+ break;
++ case UPIO_I2C:
++ snprintf(address, sizeof(address),
++ "I2C 0x%lx", port->iobase);
++ break;
+ default:
+ strlcpy(address, "*unknown*", sizeof(address));
+ break;
+@@ -2349,8 +2351,13 @@ int uart_register_driver(struct uart_dri
+ normal->type = TTY_DRIVER_TYPE_SERIAL;
+ normal->subtype = SERIAL_TYPE_NORMAL;
+ normal->init_termios = tty_std_termios;
++#if defined(CONFIG_SERIAL_SC16IS7X0) || defined(CONFIG_SERIAL_RTL8198_UART1)
++ normal->init_termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
++ normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 38400;
++#else
+ normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+ normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
++#endif
+ normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
+ normal->driver_state = drv;
+ tty_set_operations(normal, &uart_ops);
+@@ -2554,10 +2561,10 @@ int uart_match_port(struct uart_port *po
+ (port1->hub6 == port2->hub6);
+ case UPIO_MEM:
+ case UPIO_MEM32:
+- case UPIO_AU:
+- case UPIO_TSI:
+ case UPIO_DWAPB:
+ return (port1->mapbase == port2->mapbase);
++ case UPIO_I2C:
++ return (port1->iobase == port2->iobase);
+ }
+ return 0;
+ }
+--- linux-2.6.30.9/drivers/staging/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/staging/Kconfig 2013-05-02 01:47:55.708226898 +0300
+@@ -41,6 +41,8 @@ config STAGING_EXCLUDE_BUILD
+
+ if !STAGING_EXCLUDE_BUILD
+
++source "drivers/staging/rtk_uWiFi/Kconfig"
++
+ source "drivers/staging/et131x/Kconfig"
+
+ source "drivers/staging/slicoss/Kconfig"
+@@ -85,6 +87,8 @@ source "drivers/staging/altpciechdma/Kco
+
+ source "drivers/staging/rtl8187se/Kconfig"
+
++source "drivers/staging/rtl8192su/Kconfig"
++
+ source "drivers/staging/rspiusb/Kconfig"
+
+ source "drivers/staging/mimio/Kconfig"
+--- linux-2.6.30.9/drivers/staging/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/staging/Makefile 2013-05-02 01:47:55.708226898 +0300
+@@ -2,7 +2,7 @@
+
+ # fix for build system bug...
+ obj-$(CONFIG_STAGING) += staging.o
+-
++obj-$(CONFIG_USB_UWIFI_HOST) += rtk_uWiFi/
+ obj-$(CONFIG_ET131X) += et131x/
+ obj-$(CONFIG_SLICOSS) += slicoss/
+ obj-$(CONFIG_SXG) += sxg/
+@@ -25,6 +25,7 @@ obj-$(CONFIG_ASUS_OLED) += asus_oled/
+ obj-$(CONFIG_PANEL) += panel/
+ obj-$(CONFIG_ALTERA_PCIE_CHDMA) += altpciechdma/
+ obj-$(CONFIG_RTL8187SE) += rtl8187se/
++obj-$(CONFIG_RTL8192SU) += rtl8192su/
+ obj-$(CONFIG_USB_RSPI) += rspiusb/
+ obj-$(CONFIG_INPUT_MIMIO) += mimio/
+ obj-$(CONFIG_TRANZPORT) += frontier/
+--- linux-2.6.30.9/drivers/usb/c67x00/c67x00-hcd.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/c67x00/c67x00-hcd.h 2013-05-02 01:47:56.720226816 +0300
+@@ -28,7 +28,13 @@
+ #include <linux/spinlock.h>
+ #include <linux/list.h>
+ #include <linux/usb.h>
++
++#if defined(CONFIG_USB_UWIFI_HOST)
++#include "../core_uWiFi/hcd.h"
++#else
+ #include "../core/hcd.h"
++#endif
++
+ #include "c67x00.h"
+
+ /*
+--- linux-2.6.30.9/drivers/usb/core/devio.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/core/devio.c 2013-05-02 01:47:56.726226815 +0300
+@@ -476,6 +476,9 @@ static int releaseintf(struct dev_state
+ else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) {
+ usb_driver_release_interface(&usbfs_driver, intf);
+ err = 0;
++ #if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD)
++ mdelay(100);
++ #endif
+ }
+ return err;
+ }
+--- linux-2.6.30.9/drivers/usb/core/hcd.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/core/hcd.c 2013-05-02 01:47:56.728226815 +0300
+@@ -82,7 +82,7 @@
+ /*-------------------------------------------------------------------------*/
+
+ /* Keep track of which host controller drivers are loaded */
+-unsigned long usb_hcds_loaded;
++unsigned long usb_hcds_loaded=0;
+ EXPORT_SYMBOL_GPL(usb_hcds_loaded);
+
+ /* host controllers we manage */
+@@ -878,7 +878,7 @@ static void usb_deregister_bus (struct u
+ * to register the usb device. It also assigns the root hub's USB address
+ * (always 1).
+ */
+-static int register_root_hub(struct usb_hcd *hcd)
++int register_root_hub(struct usb_hcd *hcd)
+ {
+ struct device *parent_dev = hcd->self.controller;
+ struct usb_device *usb_dev = hcd->self.root_hub;
+@@ -923,6 +923,8 @@ static int register_root_hub(struct usb_
+ return retval;
+ }
+
++EXPORT_SYMBOL(register_root_hub);
++
+
+ /*-------------------------------------------------------------------------*/
+
+--- linux-2.6.30.9/drivers/usb/core/hub.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/core/hub.c 2013-05-02 01:47:56.731226815 +0300
+@@ -30,6 +30,13 @@
+ #include "hcd.h"
+ #include "hub.h"
+
++//#include "rtl865xc_asicregs.h"
++
++#define REG32(reg) (*(volatile unsigned int *)((unsigned int)reg))
++#define PABCD_DIR 0xb8003508
++#define PABCD_DAT 0xb800350C
++#define USB_LED_OFFSET 19
++
+ /* if we are in debug mode, always announce new devices */
+ #ifdef DEBUG
+ #ifndef CONFIG_USB_ANNOUNCE_NEW_DEVICES
+@@ -1432,8 +1439,12 @@ void usb_disconnect(struct usb_device **
+ * this quiesces everyting except pending urbs.
+ */
+ usb_set_device_state(udev, USB_STATE_NOTATTACHED);
++ //RTL_W32(AUTOCFG_LED_DATABASE, (RTL_R32(AUTOCFG_LED_DATABASE) | (1 << EN_USB_LED)));
++ REG32(PABCD_DIR) = REG32(PABCD_DIR) |(0x1<<USB_LED_OFFSET);
++ REG32(PABCD_DAT) = REG32(PABCD_DAT) | (0x1<<USB_LED_OFFSET);
+ dev_info (&udev->dev, "USB disconnect, address %d\n", udev->devnum);
+
++
+ usb_lock_device(udev);
+
+ /* Free up all the children before we remove this device */
+@@ -1775,14 +1786,21 @@ static unsigned hub_is_wusb(struct usb_h
+ return hcd->wireless;
+ }
+
+-
++#ifdef CONFIG_RTL_USB_OTG
+ #define PORT_RESET_TRIES 5
++#else
++#define PORT_RESET_TRIES 20
++#endif
+ #define SET_ADDRESS_TRIES 2
+ #define GET_DESCRIPTOR_TRIES 2
+ #define SET_CONFIG_TRIES (2 * (use_both_schemes + 1))
+ #define USE_NEW_SCHEME(i) ((i) / 2 == old_scheme_first)
+
++#ifdef CONFIG_RTL_USB_OTG
+ #define HUB_ROOT_RESET_TIME 50 /* times are in msec */
++#else
++#define HUB_ROOT_RESET_TIME 500 /* times are in msec */
++#endif
+ #define HUB_SHORT_RESET_TIME 10
+ #define HUB_LONG_RESET_TIME 200
+ #define HUB_RESET_TIMEOUT 500
+@@ -1842,8 +1859,13 @@ static int hub_port_wait_reset(struct us
+ static int hub_port_reset(struct usb_hub *hub, int port1,
+ struct usb_device *udev, unsigned int delay)
+ {
++#ifdef CONFIG_RTL_OTGCTRL
++ //slove the usb phy debonce. close the auto-det interrupt
++ extern unsigned int TurnOn_OTGCtrl_Interrupt(unsigned int); //wei add
++ int old=TurnOn_OTGCtrl_Interrupt(0); //wei add
++#endif
+ int i, status;
+-
++ unsigned char retry=3; //realtek patch, if failed, retry 3 times
+ /* Block EHCI CF initialization during the port reset.
+ * Some companion controllers don't like it when they mix.
+ */
+@@ -1868,12 +1890,19 @@ static int hub_port_reset(struct usb_hub
+ /* return on disconnect or reset */
+ switch (status) {
+ case 0:
++ retry = 0; //realtek patch
+ /* TRSTRCY = 10 ms; plus some extra */
+ msleep(10 + 40);
+ update_address(udev, 0);
+ /* FALL THROUGH */
+ case -ENOTCONN:
+ case -ENODEV:
++//realtek patch
++ if(retry){
++ retry--;
++ continue;
++ }
++////
+ clear_port_feature(hub->hdev,
+ port1, USB_PORT_FEAT_C_RESET);
+ /* FIXME need disconnect() for NOTATTACHED device */
+@@ -1895,6 +1924,10 @@ static int hub_port_reset(struct usb_hub
+
+ done:
+ up_read(&ehci_cf_port_reset_rwsem);
++
++#ifdef CONFIG_RTL_OTGCTRL
++ TurnOn_OTGCtrl_Interrupt(old); //wei add
++#endif
+ return status;
+ }
+
+@@ -2152,15 +2185,31 @@ static int finish_port_resume(struct usb
+ *
+ * Returns 0 on success, else negative errno.
+ */
++ #define RTL_R32(addr) (*(volatile unsigned long *)(addr))
++#define RTL_W32(addr, l) ((*(volatile unsigned long*)(addr)) = (l))
++extern Enable_OTG_Suspend(int sel, int en) ;
+ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
+ {
+ struct usb_hub *hub = hdev_to_hub(udev->parent);
+ int port1 = udev->portnum;
+ int status;
+ u16 portchange, portstatus;
+-
++ unsigned int tmp32=0;
+ /* Skip the initial Clear-Suspend step for a remote wakeup */
+ status = hub_port_status(hub, port1, &portstatus, &portchange);
++#if defined(CONFIG_RTL_8196E) && defined(CONFIG_DWC_OTG)
++ //Notify OTG Host to resume
++ msleep(10);
++ Enable_OTG_Suspend(0,0);
++ msleep(10);
++ tmp32 = 0x41100000;
++ RTL_W32(0xB8030440, tmp32);
++ msleep(10);
++ tmp32 = 0x01100000;
++ RTL_W32(0xB8030440, tmp32);
++ msleep(10);
++ /////////////////////////
++#endif
+ if (status == 0 && !(portstatus & USB_PORT_STAT_SUSPEND))
+ goto SuspendCleared;
+
+@@ -2451,6 +2500,13 @@ hub_port_init (struct usb_hub *hub, stru
+ /* root hub ports have a slightly longer reset period
+ * (from USB 2.0 spec, section 7.1.7.5)
+ */
++
++ //RTL_W32(AUTOCFG_LED_DATABASE, (RTL_R32(AUTOCFG_LED_DATABASE) & 0xffffbfff));
++
++ REG32(PABCD_DIR) = REG32(PABCD_DIR) |(0x1<<USB_LED_OFFSET);
++ REG32(PABCD_DAT) = REG32(PABCD_DAT) &(~ (0x1<<USB_LED_OFFSET));
++
++
+ if (!hdev->parent) {
+ delay = HUB_ROOT_RESET_TIME;
+ if (port1 == hdev->bus->otg_port)
+--- linux-2.6.30.9/drivers/usb/core/urb.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/core/urb.c 2013-05-02 01:47:56.735226815 +0300
+@@ -8,6 +8,12 @@
+ #include <linux/wait.h>
+ #include "hcd.h"
+
++#include "bspchip.h"
++
++#ifndef __IRAM_USB
++#define __IRAM_USB
++#endif
++
+ #define to_urb(d) container_of(d, struct urb, kref)
+
+
+@@ -87,6 +93,7 @@ EXPORT_SYMBOL_GPL(usb_alloc_urb);
+ * Note: The transfer buffer associated with the urb is not freed unless the
+ * URB_FREE_BUFFER transfer flag is set.
+ */
++__IRAM_USB
+ void usb_free_urb(struct urb *urb)
+ {
+ if (urb)
+@@ -104,6 +111,7 @@ EXPORT_SYMBOL_GPL(usb_free_urb);
+ *
+ * A pointer to the urb with the incremented reference counter is returned.
+ */
++__IRAM_USB
+ struct urb *usb_get_urb(struct urb *urb)
+ {
+ if (urb)
+@@ -285,6 +293,7 @@ EXPORT_SYMBOL_GPL(usb_unanchor_urb);
+ * GFP_NOIO, unless b) or c) apply
+ *
+ */
++__IRAM_USB
+ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
+ {
+ int xfertype, max;
+--- linux-2.6.30.9/drivers/usb/core/usb.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/core/usb.c 2013-05-02 01:47:56.736226814 +0300
+@@ -43,6 +43,10 @@
+ #include "hcd.h"
+ #include "usb.h"
+
++#define REG32(reg) (*(volatile unsigned int *)((unsigned int)reg))
++#define PIN_MUX_SEL_2 0xb8000044
++#define PABCD_DIR 0xb8003508
++#define PABCD_DAT 0xb800350C
+
+ const char *usbcore_name = "usbcore";
+
+@@ -1001,6 +1005,16 @@ static struct notifier_block usb_bus_nb
+ .notifier_call = usb_bus_notify,
+ };
+
++
++static void usb_led_init(void)
++{
++ REG32(PIN_MUX_SEL_2) = REG32(PIN_MUX_SEL_2) |(0x7<<21);
++ REG32(PABCD_DIR) = REG32(PABCD_DIR) |(0x1<<19);
++ REG32(PABCD_DAT) = REG32(PABCD_DAT) |(0x1<<19);
++}
++
++
++
+ /*
+ * Init
+ */
+@@ -1011,7 +1025,7 @@ static int __init usb_init(void)
+ pr_info("%s: USB support disabled\n", usbcore_name);
+ return 0;
+ }
+-
++ usb_led_init();
+ retval = ksuspend_usb_init();
+ if (retval)
+ goto out;
+--- linux-2.6.30.9/drivers/usb/gadget/dummy_hcd.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/gadget/dummy_hcd.c 2013-05-02 01:47:56.782226811 +0300
+@@ -55,7 +55,11 @@
+ #include <asm/unaligned.h>
+
+
++#if defined(CONFIG_USB_UWIFI_HOST)
++#include "../core_uWiFi/hcd.h"
++#else
+ #include "../core/hcd.h"
++#endif
+
+
+ #define DRIVER_DESC "USB Host+Gadget Emulator"
+--- linux-2.6.30.9/drivers/usb/host/ehci.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ehci.h 2013-05-02 01:47:56.828226807 +0300
+@@ -36,6 +36,11 @@ typedef __u16 __bitwise __hc16;
+ #define __hc32 __le32
+ #define __hc16 __le16
+ #endif
++#include "bspchip.h"
++
++#ifndef __IRAM_USB
++#define __IRAM_USB
++#endif
+
+ /* statistics can be kept for for tuning/monitoring */
+ struct ehci_stats {
+@@ -602,6 +607,9 @@ ehci_port_speed(struct ehci_hcd *ehci, u
+ static inline unsigned int ehci_readl(const struct ehci_hcd *ehci,
+ __u32 __iomem * regs)
+ {
++#if defined(CONFIG_RTL_819X)
++ return (le32_to_cpu((*(volatile unsigned long *)(regs))));
++#else
+ #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
+ return ehci_big_endian_mmio(ehci) ?
+ readl_be(regs) :
+@@ -609,11 +617,15 @@ static inline unsigned int ehci_readl(co
+ #else
+ return readl(regs);
+ #endif
++#endif
+ }
+
+ static inline void ehci_writel(const struct ehci_hcd *ehci,
+ const unsigned int val, __u32 __iomem *regs)
+ {
++#if defined(CONFIG_RTL_819X)
++ ((*(volatile unsigned long *)(regs))=cpu_to_le32(val));
++#else
+ #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
+ ehci_big_endian_mmio(ehci) ?
+ writel_be(val, regs) :
+@@ -621,6 +633,7 @@ static inline void ehci_writel(const str
+ #else
+ writel(val, regs);
+ #endif
++#endif
+ }
+
+ /*
+--- linux-2.6.30.9/drivers/usb/host/ehci-hcd.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ehci-hcd.c 2013-05-02 01:47:56.825226807 +0300
+@@ -169,10 +169,10 @@ static int handshake (struct ehci_hcd *e
+ u32 result;
+
+ do {
+- result = ehci_readl(ehci, ptr);
++ result = (ehci_readl(ehci, ptr))&0xffff;
+ if (result == ~(u32)0) /* card removed */
+ return -ENODEV;
+- result &= mask;
++ result &= (mask)&0xffff;
+ if (result == done)
+ return 0;
+ udelay (1);
+@@ -429,6 +429,7 @@ static void ehci_port_power (struct ehci
+ * ehci_work is called from some interrupts, timers, and so on.
+ * it calls driver completion functions, after dropping ehci->lock.
+ */
++__IRAM_USB
+ static void ehci_work (struct ehci_hcd *ehci)
+ {
+ timer_action_done (ehci, TIMER_IO_WATCHDOG);
+@@ -677,7 +678,7 @@ static int ehci_run (struct usb_hcd *hcd
+ }
+
+ /*-------------------------------------------------------------------------*/
+-
++__IRAM_USB
+ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
+ {
+ struct ehci_hcd *ehci = hcd_to_ehci (hcd);
+@@ -786,7 +787,19 @@ dead:
+ }
+
+ if (bh)
++ {
++ #if 1
++ __asm__ __volatile__( \
++ ".set push\n\t" \
++ ".set noreorder\n\t" \
++ "nop\n\t" \
++ "nop\n\t" \
++ "nop\n\t" \
++ ".set pop\n\t");
++ #endif
++
+ ehci_work (ehci);
++ }
+ spin_unlock (&ehci->lock);
+ if (pcd_status)
+ usb_hcd_poll_rh_status(hcd);
+@@ -807,6 +820,7 @@ dead:
+ * NOTE: control, bulk, and interrupt share the same code to append TDs
+ * to a (possibly active) QH, and the same QH scanning code.
+ */
++__IRAM_USB
+ static int ehci_urb_enqueue (
+ struct usb_hcd *hcd,
+ struct urb *urb,
+@@ -1040,48 +1054,35 @@ MODULE_DESCRIPTION(DRIVER_DESC);
+ MODULE_AUTHOR (DRIVER_AUTHOR);
+ MODULE_LICENSE ("GPL");
+
+-#ifdef CONFIG_PCI
++#ifdef CONFIG_USB_VIA_PCI
+ #include "ehci-pci.c"
+ #define PCI_DRIVER ehci_pci_driver
+ #endif
+
+-#ifdef CONFIG_USB_EHCI_FSL
+-#include "ehci-fsl.c"
+-#define PLATFORM_DRIVER ehci_fsl_driver
+-#endif
+-
+-#ifdef CONFIG_SOC_AU1200
+-#include "ehci-au1xxx.c"
+-#define PLATFORM_DRIVER ehci_hcd_au1xxx_driver
+-#endif
+-
+-#ifdef CONFIG_PPC_PS3
+-#include "ehci-ps3.c"
+-#define PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver
+-#endif
+-
+-#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
+-#include "ehci-ppc-of.c"
+-#define OF_PLATFORM_DRIVER ehci_hcd_ppc_of_driver
+-#endif
+-
+-#ifdef CONFIG_PLAT_ORION
+-#include "ehci-orion.c"
+-#define PLATFORM_DRIVER ehci_orion_driver
++#if defined(CONFIG_RTL_819X)
++#include "ehci-rtl8652.c"
++#define PLATFORM_DRIVER ehci_rtl8652_driver
+ #endif
+
+-#ifdef CONFIG_ARCH_IXP4XX
+-#include "ehci-ixp4xx.c"
+-#define PLATFORM_DRIVER ixp4xx_ehci_driver
++#ifdef CONFIG_USB_EHCI_DWC
++#include "ehci-dwc.c"
++#define PLATFORM_DRIVER ehci_dwc_driver
+ #endif
+
+-#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
+- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
++#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER)
+ #error "missing bus glue for ehci-hcd"
+ #endif
+
++#if defined(CONFIG_RTL_ULINKER)
++int ehci_hcd_init(void)
++#else
+ static int __init ehci_hcd_init(void)
++#endif
+ {
++ if (test_bit(USB_EHCI_LOADED, &usb_hcds_loaded))
++ { printk("EHCI-HCD: already init \n");
++ return -1;
++ }
+ int retval = 0;
+
+ if (usb_disabled())
+@@ -1099,6 +1100,13 @@ static int __init ehci_hcd_init(void)
+ sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
+ sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
+
++#if defined(CONFIG_RTL_819X)
++ if(ehci_rtl8652_init() !=0)
++ { retval = -1; //wei add
++ goto err_out; //wei add
++ }
++#endif
++
+ #ifdef DEBUG
+ ehci_debug_root = debugfs_create_dir("ehci", NULL);
+ if (!ehci_debug_root) {
+@@ -1119,27 +1127,8 @@ static int __init ehci_hcd_init(void)
+ goto clean1;
+ #endif
+
+-#ifdef PS3_SYSTEM_BUS_DRIVER
+- retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
+- if (retval < 0)
+- goto clean2;
+-#endif
+-
+-#ifdef OF_PLATFORM_DRIVER
+- retval = of_register_platform_driver(&OF_PLATFORM_DRIVER);
+- if (retval < 0)
+- goto clean3;
+-#endif
+ return retval;
+
+-#ifdef OF_PLATFORM_DRIVER
+- /* of_unregister_platform_driver(&OF_PLATFORM_DRIVER); */
+-clean3:
+-#endif
+-#ifdef PS3_SYSTEM_BUS_DRIVER
+- ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
+-clean2:
+-#endif
+ #ifdef PCI_DRIVER
+ pci_unregister_driver(&PCI_DRIVER);
+ clean1:
+@@ -1153,25 +1142,36 @@ clean0:
+ ehci_debug_root = NULL;
+ err_debug:
+ #endif
++err_out:
++
++#if defined(CONFIG_RTL_819X)
++ ehci_rtl8652_cleanup(); //wei add
++#endif
++
+ clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+ return retval;
+ }
+ module_init(ehci_hcd_init);
+-
++//-----------------------------------------------------------
++#if defined(CONFIG_RTL_ULINKER)
++void ehci_hcd_cleanup(void) //wei add
++#else
+ static void __exit ehci_hcd_cleanup(void)
+-{
+-#ifdef OF_PLATFORM_DRIVER
+- of_unregister_platform_driver(&OF_PLATFORM_DRIVER);
+-#endif
+-#ifdef PLATFORM_DRIVER
+- platform_driver_unregister(&PLATFORM_DRIVER);
+ #endif
++{
++ if (!test_bit(USB_EHCI_LOADED, &usb_hcds_loaded))
++ { printk("EHCI-HCD: not init, cannot cleanup \n");
++ return;
++ }
++
+ #ifdef PCI_DRIVER
+ pci_unregister_driver(&PCI_DRIVER);
+ #endif
+-#ifdef PS3_SYSTEM_BUS_DRIVER
+- ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
++
++#ifdef PLATFORM_DRIVER
++ platform_driver_unregister(&PLATFORM_DRIVER);
+ #endif
++
+ #ifdef DEBUG
+ debugfs_remove(ehci_debug_root);
+ #endif
+@@ -1175,6 +1175,10 @@ static void __exit ehci_hcd_cleanup(void
+ #ifdef DEBUG
+ debugfs_remove(ehci_debug_root);
+ #endif
++
++#if defined(CONFIG_RTL_819X)
++ ehci_rtl8652_cleanup(); //wei add
++#endif
+ clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+ }
+ module_exit(ehci_hcd_cleanup);
+--- linux-2.6.30.9/drivers/usb/host/ehci-hub.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ehci-hub.c 2013-05-02 01:47:56.825226807 +0300
+@@ -412,6 +412,16 @@ static int check_reset_complete (
+ u32 __iomem *status_reg,
+ int port_status
+ ) {
++//realtek patch
++#if 1 /* patch for synopsis USB 2.0 */
++ int i;
++ #ifdef CONFIG_DWC_OTG
++ static unsigned char retry=1; //if failed, retry 1 times
++ #else
++ static unsigned char retry=3; //if failed, retry 3 times
++ #endif
++#endif
++////
+ if (!(port_status & PORT_CONNECT))
+ return port_status;
+
+@@ -425,7 +435,12 @@ static int check_reset_complete (
+ index+1);
+ return port_status;
+ }
+-
++ //realtek patch
++ if(--retry) {
++ return port_status;
++ }
++ retry = 3;
++ /////
+ ehci_dbg (ehci, "port %d full speed --> companion\n",
+ index + 1);
+
+@@ -438,6 +453,9 @@ static int check_reset_complete (
+ if (ehci->has_amcc_usb23)
+ set_ohci_hcfs(ehci, 1);
+ } else {
++ //realtek patch
++ retry = 3; //realtek patch
++ ////
+ ehci_dbg (ehci, "port %d high speed\n", index + 1);
+ /* ensure 440EPx ohci controller state is suspended */
+ if (ehci->has_amcc_usb23)
+--- linux-2.6.30.9/drivers/usb/host/ehci-q.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ehci-q.c 2013-05-02 01:47:56.827226807 +0300
+@@ -41,7 +41,7 @@
+ /*-------------------------------------------------------------------------*/
+
+ /* fill a qtd, returning how much of the buffer we were able to queue up */
+-
++__IRAM_USB
+ static int
+ qtd_fill(struct ehci_hcd *ehci, struct ehci_qtd *qtd, dma_addr_t buf,
+ size_t len, int token, int maxpacket)
+@@ -83,7 +83,7 @@ qtd_fill(struct ehci_hcd *ehci, struct e
+ }
+
+ /*-------------------------------------------------------------------------*/
+-
++__IRAM_USB
+ static inline void
+ qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd)
+ {
+@@ -118,6 +118,7 @@ qh_update (struct ehci_hcd *ehci, struct
+ * overlay, so qh->hw_token wrongly becomes inactive/halted), only fault
+ * recovery (including urb dequeue) would need software changes to a QH...
+ */
++__IRAM_USB
+ static void
+ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh)
+ {
+@@ -138,7 +139,7 @@ qh_refresh (struct ehci_hcd *ehci, struc
+ }
+
+ /*-------------------------------------------------------------------------*/
+-
++__IRAM_USB
+ static void qh_link_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
+
+ static void ehci_clear_tt_buffer_complete(struct usb_hcd *hcd,
+@@ -187,7 +188,7 @@ static void ehci_clear_tt_buffer(struct
+ }
+ }
+ }
+-
++__IRAM_USB
+ static int qtd_copy_status (
+ struct ehci_hcd *ehci,
+ struct urb *urb,
+@@ -248,7 +249,7 @@ static int qtd_copy_status (
+
+ return status;
+ }
+-
++__IRAM_USB
+ static void
+ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status)
+ __releases(ehci->lock)
+@@ -570,6 +571,7 @@ static void qtd_list_free (
+ /*
+ * create a list of filled qtds for this URB; won't link into qh.
+ */
++__IRAM_USB
+ static struct list_head *
+ qh_urb_transaction (
+ struct ehci_hcd *ehci,
+@@ -952,6 +954,7 @@ static void qh_link_async (struct ehci_h
+ * Returns null if it can't allocate a QH it needs to.
+ * If the QH has TDs (urbs) already, that's great.
+ */
++__IRAM_USB
+ static struct ehci_qh *qh_append_tds (
+ struct ehci_hcd *ehci,
+ struct urb *urb,
+@@ -1033,6 +1036,7 @@ static struct ehci_qh *qh_append_tds (
+
+ /*-------------------------------------------------------------------------*/
+
++__IRAM_USB
+ static int
+ submit_async (
+ struct ehci_hcd *ehci,
+@@ -1091,6 +1095,7 @@ submit_async (
+
+ /* the async qh for the qtds being reclaimed are now unlinked from the HC */
+
++__IRAM_USB
+ static void end_unlink_async (struct ehci_hcd *ehci)
+ {
+ struct ehci_qh *qh = ehci->reclaim;
+@@ -1132,6 +1137,7 @@ static void end_unlink_async (struct ehc
+ /* makes sure the async qh will become idle */
+ /* caller must own ehci->lock */
+
++__IRAM_USB
+ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
+ {
+ int cmd = ehci_readl(ehci, &ehci->regs->command);
+@@ -1189,6 +1195,7 @@ static void start_unlink_async (struct e
+
+ /*-------------------------------------------------------------------------*/
+
++__IRAM_USB
+ static void scan_async (struct ehci_hcd *ehci)
+ {
+ struct ehci_qh *qh;
+--- linux-2.6.30.9/drivers/usb/host/ehci-sched.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ehci-sched.c 2013-05-02 01:47:56.828226807 +0300
+@@ -33,7 +33,7 @@
+ * It keeps track of every ITD (or SITD) that's linked, and holds enough
+ * pre-calculated schedule data to make appending to the queue be quick.
+ */
+-
++// #define CONFIG_USB_3G_SUPPORT //for specifical dongle
+ static int ehci_get_frame (struct usb_hcd *hcd);
+
+ /*-------------------------------------------------------------------------*/
+@@ -323,7 +323,11 @@ static int tt_available (
+ * already scheduled transactions
+ */
+ if (125 < usecs) {
++#ifdef CONFIG_USB_3G_SUPPORT
++ nt ufs = (usecs / 125) - 1;
++#else
+ int ufs = (usecs / 125);
++#endif
+ int i;
+ for (i = uframe; i < (uframe + ufs) && i < 8; i++)
+ if (0 < tt_usecs[i]) {
+@@ -436,15 +440,23 @@ static int enable_periodic (struct ehci_
+ {
+ u32 cmd;
+ int status;
+-
++#ifndef CONFIG_USB_3G_SUPPORT
+ if (ehci->periodic_sched++)
+ return 0;
++#else
++ udelay(1024);
++#endif
+
+ /* did clearing PSE did take effect yet?
+ * takes effect only at frame boundaries...
+ */
+ status = handshake_on_error_set_halt(ehci, &ehci->regs->status,
+- STS_PSS, 0, 9 * 125);
++ STS_PSS, 0,
++ #ifdef CONFIG_USB_3G_SUPPORT
++ 120000 * 125);
++ #else
++ 9 * 125);
++ #endif
+ if (status)
+ return status;
+
+@@ -471,7 +483,12 @@ static int disable_periodic (struct ehci
+ * takes effect only at frame boundaries...
+ */
+ status = handshake_on_error_set_halt(ehci, &ehci->regs->status,
+- STS_PSS, STS_PSS, 9 * 125);
++ STS_PSS, STS_PSS,
++#ifdef CONFIG_USB_3G_SUPPORT
++ 120000 * 125);
++#else
++ 9 * 125);
++#endif
+ if (status)
+ return status;
+
+@@ -550,7 +567,14 @@ static int qh_link_periodic (struct ehci
+ : (qh->usecs * 8);
+
+ /* maybe enable periodic schedule processing */
++#ifdef CONFIG_USB_3G_SUPPORT
++ if (!ehci->periodic_sched++)
+ return enable_periodic(ehci);
++ return 0;
++
++#else
++ return enable_periodic(ehci);
++#endif
+ }
+
+ static int qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh)
+@@ -589,7 +613,14 @@ static int qh_unlink_periodic(struct ehc
+ qh_put (qh);
+
+ /* maybe turn off periodic schedule */
++ #ifdef CONFIG_USB_3G_SUPPORT
++ ehci->periodic_sched--;
++ if (!ehci->periodic_sched)
++ (void) disable_periodic (ehci);
++
++ #else
+ return disable_periodic(ehci);
++ #endif
+ }
+
+ static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh)
+@@ -606,9 +637,18 @@ static void intr_deschedule (struct ehci
+ if (list_empty (&qh->qtd_list)
+ || (cpu_to_hc32(ehci, QH_CMASK)
+ & qh->hw_info2) != 0)
++#ifdef CONFIG_USB_3G_SUPPORT
++ wait = 55;
++#else
+ wait = 2;
++#endif
+ else
++#ifdef CONFIG_RTL_USB_OTG
+ wait = 55; /* worst case: 3 * 1024 */
++#else
++ //wait = 55; /* worst case: 3 * 1024 */
++ wait = 3 * 1024;
++#endif
+
+ udelay (wait);
+ qh->qh_state = QH_STATE_IDLE;
+@@ -1564,7 +1604,13 @@ itd_link_urb (
+ urb->hcpriv = NULL;
+
+ timer_action (ehci, TIMER_IO_WATCHDOG);
++#ifdef CONFIG_USB_3G_SUPPORT
++ if (unlikely (!ehci->periodic_sched++))
++ return enable_periodic(ehci);
++ return 0;
++#else
+ return enable_periodic(ehci);
++#endif
+ }
+
+ #define ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR)
+@@ -1645,7 +1691,14 @@ itd_complete (
+ ehci_urb_done(ehci, urb, 0);
+ retval = true;
+ urb = NULL;
++#ifdef CONFIG_USB_3G_SUPPORT
++ /* defer stopping schedule; completion can submit */
++ ehci->periodic_sched--;
++ if (unlikely (!ehci->periodic_sched))
++
++#else
+ (void) disable_periodic(ehci);
++#endif
+ ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+
+ if (unlikely(list_is_singular(&stream->td_list))) {
+@@ -1967,7 +2020,13 @@ sitd_link_urb (
+ urb->hcpriv = NULL;
+
+ timer_action (ehci, TIMER_IO_WATCHDOG);
++#ifdef CONFIG_USB_3G_SUPPORT
++ if (!ehci->periodic_sched++)
+ return enable_periodic(ehci);
++ return 0;
++#else
++ return enable_periodic(ehci);
++#endif
+ }
+
+ /*-------------------------------------------------------------------------*/
+@@ -2034,6 +2093,11 @@ sitd_complete (
+ ehci_urb_done(ehci, urb, 0);
+ retval = true;
+ urb = NULL;
++#ifdef CONFIG_USB_3G_SUPPORT
++ /* defer stopping schedule; completion can submit */
++ ehci->periodic_sched--;
++ if (!ehci->periodic_sched)
++#endif
+ (void) disable_periodic(ehci);
+ ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+
+--- linux-2.6.30.9/drivers/usb/host/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/Kconfig 2013-05-02 01:47:56.823226807 +0300
+@@ -78,6 +78,12 @@ config USB_EHCI_BIG_ENDIAN_DESC
+ depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX)
+ default y
+
++#config USB_EHCI_DWC
++# bool "Support for Synopsys DWC EHCI USB controller"
++# depends on USB_EHCI_HCD
++# select USB_EHCI_ROOT_HUB_TT
++# default y
++
+ config USB_EHCI_FSL
+ bool "Support for Freescale on-chip EHCI USB controller"
+ depends on USB_EHCI_HCD && FSL_SOC
+@@ -88,7 +94,6 @@ config USB_EHCI_FSL
+ config USB_EHCI_HCD_PPC_OF
+ bool "EHCI support for PPC USB controller on OF platform bus"
+ depends on USB_EHCI_HCD && PPC_OF
+- default y
+ ---help---
+ Enables support for the USB controller present on the PowerPC
+ OpenFirmware platform bus.
+--- linux-2.6.30.9/drivers/usb/host/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/Makefile 2013-05-02 01:47:56.823226807 +0300
+@@ -6,6 +6,9 @@ ifeq ($(CONFIG_USB_DEBUG),y)
+ EXTRA_CFLAGS += -DDEBUG
+ endif
+
++ifeq ($(CONFIG_RTL_819X),y)
++ EXTRA_CFLAGS += -I$(DIR_BOARD)
++endif
+ isp1760-objs := isp1760-hcd.o isp1760-if.o
+ fhci-objs := fhci-hcd.o fhci-hub.o fhci-q.o fhci-mem.o \
+ fhci-tds.o fhci-sched.o
+--- linux-2.6.30.9/drivers/usb/host/ohci.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ohci.h 2013-05-02 01:47:56.839226806 +0300
+@@ -544,6 +544,9 @@ static inline struct usb_hcd *ohci_to_hc
+ static inline unsigned int _ohci_readl (const struct ohci_hcd *ohci,
+ __hc32 __iomem * regs)
+ {
++#if defined(CONFIG_RTL_819X)
++ return (le32_to_cpu((*(volatile unsigned long *)(regs))));
++#else
+ #ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO
+ return big_endian_mmio(ohci) ?
+ readl_be (regs) :
+@@ -551,11 +554,15 @@ static inline unsigned int _ohci_readl (
+ #else
+ return readl (regs);
+ #endif
++#endif
+ }
+
+ static inline void _ohci_writel (const struct ohci_hcd *ohci,
+ const unsigned int val, __hc32 __iomem *regs)
+ {
++#if defined(CONFIG_RTL_819X)
++ ((*(volatile unsigned long *)(regs))=cpu_to_le32(val));
++#else
+ #ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO
+ big_endian_mmio(ohci) ?
+ writel_be (val, regs) :
+@@ -563,6 +570,7 @@ static inline void _ohci_writel (const s
+ #else
+ writel (val, regs);
+ #endif
++#endif
+ }
+
+ #ifdef CONFIG_ARCH_LH7A404
+--- linux-2.6.30.9/drivers/usb/host/ohci-hcd.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/host/ohci-hcd.c 2013-05-02 01:47:56.835226806 +0300
+@@ -1047,6 +1047,11 @@ MODULE_LICENSE ("GPL");
+ #define PLATFORM_DRIVER usb_hcd_pnx4008_driver
+ #endif
+
++#if defined(CONFIG_RTL_819X)
++#include "ohci-rtl8652.c"
++#define PLATFORM_DRIVER ohci_hcd_rtl8652_driver
++#endif
++
+ #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \
+ defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+ defined(CONFIG_CPU_SUBTYPE_SH7763) || \
+@@ -1092,8 +1097,17 @@ MODULE_LICENSE ("GPL");
+ #error "missing bus glue for ohci-hcd"
+ #endif
+
++#if defined(CONFIG_RTL_ULINKER)
++int ohci_hcd_mod_init(void) //wei add
++#else
+ static int __init ohci_hcd_mod_init(void)
++#endif
+ {
++ if ( test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
++ { printk("OHCI-HCD: already init \n");
++ return -1;
++ }
++
+ int retval = 0;
+
+ if (usb_disabled())
+@@ -1104,6 +1118,13 @@ static int __init ohci_hcd_mod_init(void
+ sizeof (struct ed), sizeof (struct td));
+ set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+
++#if defined(CONFIG_RTL_819X)
++ if(ohci_rtl8652_init() !=0)
++ { retval = -1; //wei add
++ goto err_out; //wei add
++ }
++#endif
++
+ #ifdef DEBUG
+ ohci_debug_root = debugfs_create_dir("ohci", NULL);
+ if (!ohci_debug_root) {
+@@ -1200,14 +1221,26 @@ static int __init ohci_hcd_mod_init(void
+ ohci_debug_root = NULL;
+ error_debug:
+ #endif
+-
++err_out:
++#if defined(CONFIG_RTL_819X)
++ ohci_rtl8652_cleanup(); //wei add
++#endif
+ clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+ return retval;
+ }
+ module_init(ohci_hcd_mod_init);
+-
++//-----------------------------------------------------------
++#if defined(CONFIG_RTL_ULINKER)
++void ohci_hcd_mod_exit(void) //wei add
++#else
+ static void __exit ohci_hcd_mod_exit(void)
++#endif
+ {
++ if (!test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
++ { printk("OHCI-HCD: not init, cannot cleanup \n");
++ return;
++ }
++
+ #ifdef TMIO_OHCI_DRIVER
+ platform_driver_unregister(&TMIO_OHCI_DRIVER);
+ #endif
+@@ -1235,6 +1268,10 @@ static void __exit ohci_hcd_mod_exit(voi
+ #ifdef DEBUG
+ debugfs_remove(ohci_debug_root);
+ #endif
++
++#if defined(CONFIG_RTL_819X) //wei add
++ ohci_rtl8652_cleanup();
++#endif
+ clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+ }
+ module_exit(ohci_hcd_mod_exit);
+--- linux-2.6.30.9/drivers/usb/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/Kconfig 2013-05-09 15:45:47.582603984 +0300
+@@ -19,45 +19,18 @@ config USB_ARCH_HAS_HCD
+ boolean
+ default y if USB_ARCH_HAS_OHCI
+ default y if USB_ARCH_HAS_EHCI
+- default y if PCMCIA && !M32R # sl811_cs
+- default y if ARM # SL-811
+- default y if SUPERH # r8a66597-hcd
+- default PCI
++ default y if RTL_819X
++ default y if SOC_HAS_USB
+
+ # many non-PCI SOC chips embed OHCI
+ config USB_ARCH_HAS_OHCI
+ boolean
+- # ARM:
+- default y if SA1111
+- default y if ARCH_OMAP
+- default y if ARCH_LH7A404
+- default y if ARCH_S3C2410
+- default y if PXA27x
+- default y if PXA3xx
+- default y if ARCH_EP93XX
+- default y if ARCH_AT91
+- default y if ARCH_PNX4008 && I2C
+- default y if MFD_TC6393XB
+- # PPC:
+- default y if STB03xxx
+- default y if PPC_MPC52xx
+- # MIPS:
+- default y if SOC_AU1X00
+- # SH:
+- default y if CPU_SUBTYPE_SH7720
+- default y if CPU_SUBTYPE_SH7721
+- default y if CPU_SUBTYPE_SH7763
+- default y if CPU_SUBTYPE_SH7786
+- # more:
+- default PCI
++ default y if RTL_819X
+
+ # some non-PCI hcds implement EHCI
+ config USB_ARCH_HAS_EHCI
+ boolean
+- default y if PPC_83xx
+- default y if SOC_AU1200
+- default y if ARCH_IXP4XX
+- default PCI
++ default y if RTL_819X
+
+ # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
+ config USB
+@@ -149,8 +122,11 @@ source "drivers/usb/misc/Kconfig"
+
+ source "drivers/usb/atm/Kconfig"
+
+-source "drivers/usb/gadget/Kconfig"
++source "drivers/usb/gadget_cathy/Kconfig"
++#source "drivers/usb/gadget/Kconfig"
+
+ source "drivers/usb/otg/Kconfig"
+
++source "drivers/usb/dwc_otg/Kconfig"
++
+ endif # USB_SUPPORT
+--- linux-2.6.30.9/drivers/usb/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/Makefile 2013-05-02 01:47:56.716226816 +0300
+@@ -4,10 +4,27 @@
+
+ # Object files in subdirectories
+
++ifeq ($(CONFIG_USB_UWIFI_HOST),y)
++obj-$(CONFIG_USB) += core_uWiFi/
++else
+ obj-$(CONFIG_USB) += core/
++endif
+
+ obj-$(CONFIG_USB_MON) += mon/
+
++ifeq ($(CONFIG_USB_UWIFI_HOST),y)
++obj-$(CONFIG_PCI) += host_uWiFi/
++obj-$(CONFIG_USB_EHCI_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_ISP116X_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_OHCI_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_UHCI_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_FHCI_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_SL811_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_U132_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_R8A66597_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_HWA_HCD) += host_uWiFi/
++obj-$(CONFIG_USB_ISP1760_HCD) += host_uWiFi/
++else
+ obj-$(CONFIG_PCI) += host/
+ obj-$(CONFIG_USB_EHCI_HCD) += host/
+ obj-$(CONFIG_USB_ISP116X_HCD) += host/
+@@ -19,6 +36,7 @@ obj-$(CONFIG_USB_U132_HCD) += host/
+ obj-$(CONFIG_USB_R8A66597_HCD) += host/
+ obj-$(CONFIG_USB_HWA_HCD) += host/
+ obj-$(CONFIG_USB_ISP1760_HCD) += host/
++endif
+
+ obj-$(CONFIG_USB_C67X00_HCD) += c67x00/
+
+@@ -29,9 +47,13 @@ obj-$(CONFIG_USB_PRINTER) += class/
+ obj-$(CONFIG_USB_WDM) += class/
+ obj-$(CONFIG_USB_TMC) += class/
+
++ifeq ($(CONFIG_USB_UWIFI_HOST),y)
++obj-$(CONFIG_USB_STORAGE) += storage_uWiFi/
++obj-$(CONFIG_USB) += storage_uWiFi/
++else
+ obj-$(CONFIG_USB_STORAGE) += storage/
+ obj-$(CONFIG_USB) += storage/
+-
++endif
+ obj-$(CONFIG_USB_MDC800) += image/
+ obj-$(CONFIG_USB_MICROTEK) += image/
+
+@@ -41,3 +63,12 @@ obj-$(CONFIG_USB) += misc/
+
+ obj-$(CONFIG_USB_ATM) += atm/
+ obj-$(CONFIG_USB_SPEEDTOUCH) += atm/
++
++obj-$(CONFIG_DWC_OTG) += dwc_otg/
++
++#wei add for otg device mode
++ifeq ($(CONFIG_RTL_USB_OTG),y)
++obj-$(CONFIG_USB_GADGET) += gadget_cathy/
++else
++obj-$(CONFIG_USB_GADGET) += gadget/
++endif
+--- linux-2.6.30.9/drivers/usb/misc/ftdi-elan.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/misc/ftdi-elan.c 2013-05-02 01:47:56.875226803 +0300
+@@ -73,7 +73,12 @@ static struct list_head ftdi_static_list
+ */
+ #include "usb_u132.h"
+ #include <asm/io.h>
++
++#if defined(CONFIG_USB_UWIFI_HOST)
++#include "../core_uWiFi/hcd.h"
++#else
+ #include "../core/hcd.h"
++#endif
+
+ /* FIXME ohci.h is ONLY for internal use by the OHCI driver.
+ * If you're going to try stuff like this, you need to split
+--- linux-2.6.30.9/drivers/usb/misc/Kconfig 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/misc/Kconfig 2013-05-02 01:47:56.873226803 +0300
+@@ -255,4 +255,4 @@ config USB_VST
+ To compile this driver as a module, choose M here: the
+ module will be called vstusb.
+
+-
++#source "drivers/usb/misc/rts51xx/Kconfig"
+--- linux-2.6.30.9/drivers/usb/misc/Makefile 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/misc/Makefile 2013-05-02 01:47:56.873226803 +0300
+@@ -26,6 +26,7 @@ obj-$(CONFIG_USB_SEVSEG) += usbsevseg.o
+ obj-$(CONFIG_USB_VST) += vstusb.o
+
+ obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/
++#obj-$(CONFIG_RTS5139) += rts51xx/
+
+ ifeq ($(CONFIG_USB_DEBUG),y)
+ EXTRA_CFLAGS += -DDEBUG
+--- linux-2.6.30.9/drivers/usb/mon/mon_main.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/mon/mon_main.c 2013-05-02 01:47:56.892226802 +0300
+@@ -13,7 +13,12 @@
+ #include <linux/mutex.h>
+
+ #include "usb_mon.h"
++
++#if defined(CONFIG_USB_UWIFI_HOST)
++#include "../core_uWiFi/hcd.h"
++#else
+ #include "../core/hcd.h"
++#endif
+
+ static void mon_stop(struct mon_bus *mbus);
+ static void mon_dissolve(struct mon_bus *mbus, struct usb_bus *ubus);
+--- linux-2.6.30.9/drivers/usb/musb/musb_core.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/musb/musb_core.h 2013-05-02 01:47:56.895226802 +0300
+@@ -60,7 +60,12 @@ struct musb_ep;
+ #include "musb_regs.h"
+
+ #include "musb_gadget.h"
++
++#if defined(CONFIG_USB_UWIFI_HOST)
++#include "../core_uWiFi/hcd.h"
++#else
+ #include "../core/hcd.h"
++#endif
+ #include "musb_host.h"
+
+
+--- linux-2.6.30.9/drivers/usb/serial/option.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/serial/option.c 2013-05-02 01:47:56.919226800 +0300
+@@ -161,6 +161,7 @@ static int option_resume(struct usb_ser
+ #define HUAWEI_PRODUCT_E143D 0x143D
+ #define HUAWEI_PRODUCT_E143E 0x143E
+ #define HUAWEI_PRODUCT_E143F 0x143F
++#define HUAWEI_PRODUCT_K4505 0x1464
+
+ #define QUANTA_VENDOR_ID 0x0408
+ #define QUANTA_PRODUCT_Q101 0xEA02
+@@ -297,6 +298,8 @@ static int option_resume(struct usb_ser
+ #define ZTE_PRODUCT_MF628 0x0015
+ #define ZTE_PRODUCT_MF626 0x0031
+ #define ZTE_PRODUCT_CDMA_TECH 0xfffe
++#define ZTE_PRODUCT_AC8710 0xfff1
++#define ZTE_PRODUCT_AC2726 0xfff5
+
+ #define BENQ_VENDOR_ID 0x04a5
+ #define BENQ_PRODUCT_H10 0x4068
+@@ -304,6 +307,19 @@ static int option_resume(struct usb_ser
+ #define DLINK_VENDOR_ID 0x1186
+ #define DLINK_PRODUCT_DWM_652 0x3e04
+
++#define QISDA_VENDOR_ID 0x1da5
++#define QISDA_PRODUCT_H21_4512 0x4512
++#define QISDA_PRODUCT_H21_4523 0x4523
++#define QISDA_PRODUCT_H20_4515 0x4515
++#define QISDA_PRODUCT_H20_4519 0x4519
++
++/* SMPS PRODUCTS */
++#define SMPS_VENDOR_ID 0xfeed
++#define SMPS_PRODUCT_TITAN20 0x1234
++
++/* VIBO */
++#define VIBO_VENDOR_ID 0x1c9e
++#define VIBO_PRODUCT_D200 0x9605
+
+ static struct usb_device_id option_ids[] = {
+ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+@@ -522,7 +538,25 @@ static struct usb_device_id option_ids[]
+ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+ { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
+ { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
+- { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
++
++ /* bruce: for qisda */
++ { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) },
++ { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) },
++ { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) },
++ { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) },
++
++ /* bruce: for ZTE */
++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
++
++ /* mobilepeak */
++ { USB_DEVICE_AND_INTERFACE_INFO(SMPS_VENDOR_ID, SMPS_PRODUCT_TITAN20, 0xff, 0xff, 0xff) },
++
++ /* Huawei*/
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff) },
++
++ /* vibo */
++ { USB_DEVICE(VIBO_VENDOR_ID, VIBO_PRODUCT_D200) },
++
+ { } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+@@ -833,8 +867,9 @@ static void option_instat_callback(struc
+ dbg("%s: type %x req %x", __func__,
+ req_pkt->bRequestType, req_pkt->bRequest);
+ }
+- } else
++ } else {/////TODO
+ err("%s: error %d", __func__, status);
++ }
+
+ /* Resubmit urb so we continue receiving IRQ data */
+ if (status != -ESHUTDOWN && status != -ENOENT) {
+--- linux-2.6.30.9/drivers/usb/serial/usb-serial.c 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/serial/usb-serial.c 2013-05-02 01:47:56.923226799 +0300
+@@ -35,6 +35,10 @@
+ #include <linux/usb/serial.h>
+ #include "pl2303.h"
+
++#if CONFIG_USB_SERIAL_OPTION
++#include <linux/smp_lock.h> /* brucehou, 2010/05/21, for lock_kernel & unlock_kernel */
++#endif
++
+ /*
+ * Version Information
+ */
+--- linux-2.6.30.9/drivers/usb/storage/unusual_devs.h 2009-10-05 18:38:08.000000000 +0300
++++ linux-2.6.30.9-rsdk/drivers/usb/storage/unusual_devs.h 2013-05-02 01:47:56.933226799 +0300
+@@ -1865,6 +1865,13 @@ UNUSUAL_DEV( 0xed10, 0x7636, 0x0001, 0x0
+ "Digital MP3 Audio Player",
+ US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
+
++/* brucehou@RTK for AMOI H01 */
++UNUSUAL_DEV( 0x1614, 0x0800, 0x0000, 0x0000,
++ "Amoi",
++ "Mass Storage",
++ US_SC_DEVICE, US_PR_DEVICE, option_ms_init,
++ 0),
++
+ /* Control/Bulk transport for all SubClass values */
+ USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
+ USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR),