⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auide.patch

📁 patches for linux-2.6.
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+        ide_hwif_t *hwif;+        hw_regs_t hw;+        int i = 0;++#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)+        char *mode = "MWDMA2";+#elif defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)+        char *mode = "PIO+DDMA(offload)";+#endif++        if (!auide_base || !auide_len || (auide_irq <= 0))+                return -ENODEV;++        if (!request_mem_region (auide_base, auide_len, "Au1xxx IDE")) {+                printk (KERN_ERR "controller already in use");+                return -EBUSY;+        }++#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)+        memset(&auide_hwif, 0, sizeof(_auide_hwif));+        auide_hwif.dev                  = 0;+#endif+        memset(&hw, 0, sizeof(hw));+        auide_setup_ports(&hw);++        /* register hwif */+        if ((i = ide_register_hw(&hw, NULL)) < 0)+        {+                printk(KERN_DEBUG "%s could not register ide i/f\n", __FUNCTION__);+                return -ENODEV;+        }+        hwif                            = &ide_hwifs[i];++        hwif->irq                       = auide_irq;+        hwif->chipset                   = ide_au1xxx;++#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ+        hwif->rqsize = CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ;+        hwif->rqsize                    = ((hwif->rqsize > AU1XXX_ATA_RQSIZE) +                                        || (hwif->rqsize < 32)) ? AU1XXX_ATA_RQSIZE : hwif->rqsize;+#else /* if kernel config is not set */+        hwif->rqsize                    = AU1XXX_ATA_RQSIZE;+#endif++        hwif->ultra_mask                = 0x0;  /* Disable Ultra DMA */+#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA+        hwif->mwdma_mask                = 0x07; /* Multimode-2 DMA  */+        hwif->swdma_mask                = 0x07;+#else+        hwif->mwdma_mask                = 0x0;+        hwif->swdma_mask                = 0x0;+#endif+        hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];+        hwif->drives[0].unmask          = 1;+        hwif->drives[1].unmask          = 1;++        /* hold should be on in all cases */+        hwif->hold                      = 1;+        hwif->mmio                      = 2;++        /* set up local I/O function entry points */+        hwif->INB                       = auide_inb;+        hwif->INW                       = auide_inw;+        hwif->INL                       = auide_inl;+        hwif->INSW                      = auide_insw;+        hwif->INSL                      = auide_insl;+        hwif->OUTB                      = auide_outb;+        hwif->OUTBSYNC                  = auide_outbsync;+        hwif->OUTW                      = auide_outw;+        hwif->OUTL                      = auide_outl;+        hwif->OUTSW                     = auide_outsw;+        hwif->OUTSL                     = auide_outsl;++        hwif->tuneproc                  = &auide_tune_drive;+        hwif->speedproc                 = &auide_tune_chipset;++#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA+        hwif->ide_dma_off_quietly       = &auide_dma_off_quietly;+        hwif->ide_dma_timeout           = &auide_dma_timeout;++        hwif->ide_dma_check             = &auide_dma_check;+        hwif->dma_exec_cmd              = &auide_dma_exec_cmd;+        hwif->dma_start                 = &auide_dma_start;+        hwif->ide_dma_end               = &auide_dma_end;+        hwif->dma_setup                 = &auide_dma_setup;+        hwif->ide_dma_test_irq          = &auide_dma_test_irq;+        hwif->ide_dma_host_off          = &auide_dma_host_off;+        hwif->ide_dma_host_on           = &auide_dma_host_on;+        hwif->ide_dma_lostirq           = &auide_dma_lostirq;+        hwif->ide_dma_on                = &auide_dma_on;++        hwif->autodma                   = 1;+        hwif->drives[0].autodma         = hwif->autodma;+        hwif->drives[1].autodma         = hwif->autodma;+        hwif->atapi_dma                 = 1;+        hwif->drives[0].using_dma       = 1;+        hwif->drives[1].using_dma       = 1;+#else /* !CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */+        hwif->autodma                   = 0;+        hwif->channel                   = 0;+        hwif->hold                      = 1;+        hwif->select_data               = 0;    /* no chipset-specific code */+        hwif->config_data               = 0;    /* no chipset-specific code */++        hwif->drives[0].autodma         = 0;+        hwif->drives[0].drive_data      = 0;    /* no drive data */+        hwif->drives[0].using_dma       = 0;+        hwif->drives[0].waiting_for_dma = 0;+        hwif->drives[0].autotune        = 1;    /* 1=autotune, 2=noautotune, 0=default */+        /* secondary hdd not supported */+        hwif->drives[1].autodma         = 0;++        hwif->drives[1].drive_data      = 0;+        hwif->drives[1].using_dma       = 0;+        hwif->drives[1].waiting_for_dma = 0;+        hwif->drives[1].autotune        = 2;   /* 1=autotune, 2=noautotune, 0=default */+#endif+        hwif->drives[0].io_32bit        = 0;   /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */+        hwif->drives[1].io_32bit        = 0;   /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */++        /*Register Driver with PM Framework*/+#ifdef CONFIG_PM+        auide_hwif.pm.lock    = SPIN_LOCK_UNLOCKED;+        auide_hwif.pm.stopped = 0;++        auide_hwif.pm.dev = new_au1xxx_power_device( "ide",+                                                &au1200ide_pm_callback,+                                                NULL);+        if ( auide_hwif.pm.dev == NULL )+                printk(KERN_INFO "Unable to create a power management \+                                device entry for the au1200-IDE.\n");+        else+                printk(KERN_INFO "Power management device entry for the \+                                au1200-IDE loaded.\n");+#endif++        auide_hwif.hwif                 = hwif;+        hwif->hwif_data                 = &auide_hwif;++#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA           +        auide_ddma_init(&auide_hwif);+        dbdma_init_done = 1;+#endif++        printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode );++        return 0;+}++static int __init auide_setup (char* options)+{+//        printk("%s\n", __FUNCTION__);++        char* this_opt;++        if (!options || !*options)+                return 0;++        for(this_opt=strsep(&options,",");this_opt;this_opt=strsep(NULL,",")) {++                printk("this_opt : %s\n", this_opt);++                if (!strncmp(this_opt, "base:", 5)) {+                        auide_base = simple_strtoul(this_opt+5, NULL, 0);+                } else if (!strncmp(this_opt, "len:", 4)) {+                        auide_len = simple_strtoul(this_opt+4, NULL, 0);+                } else if (!strncmp(this_opt, "irq:", 4)) {+                        auide_irq = simple_strtoul(this_opt+4, NULL, 0);+                }+        }++        return 0;+}+__setup("auide=", auide_setup);+++#ifdef CONFIG_PM+int au1200ide_pm_callback( au1xxx_power_dev_t *dev,\+                        au1xxx_request_t request, void *data) {+//        printk("%s\n", __FUNCTION__);++        unsigned int d, err = 0;+        unsigned long flags;++        spin_lock_irqsave(auide_hwif.pm.lock, flags);++        switch (request){+                case AU1XXX_PM_SLEEP:+                        err = au1xxxide_pm_sleep(dev);+                        break;+                case AU1XXX_PM_WAKEUP:+                        d = *((unsigned int*)data);+                        if ( d > 0 && d <= 99) {+                                err = au1xxxide_pm_standby(dev);+                        }+                        else {+                                err = au1xxxide_pm_resume(dev);+                        }+                        break;+                case AU1XXX_PM_GETSTATUS:+                        err = au1xxxide_pm_getstatus(dev);+                        break;+                case AU1XXX_PM_ACCESS:+                        err = au1xxxide_pm_access(dev);+                        break;+                case AU1XXX_PM_IDLE:+                        err = au1xxxide_pm_idle(dev);+                        break;+                case AU1XXX_PM_CLEANUP:+                        err = au1xxxide_pm_cleanup(dev);+                        break;+                default:+                        err = -1;+                        break;+        }++        spin_unlock_irqrestore(auide_hwif.pm.lock, flags);++        return err;	+}++static int au1xxxide_pm_standby( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__);+        return 0; +}++static int au1xxxide_pm_sleep( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );++        int retval;+        ide_hwif_t *hwif = auide_hwif.hwif;+        struct request rq;+        struct request_pm_state rqpm;+        ide_task_t args;++        if(auide_hwif.pm.stopped)+                return -1;++        /* +         * wait until hard disc is ready+         */+        if ( wait_for_ready(&hwif->drives[0], 35000) ) {+                printk("Wait for drive sleep timeout!\n");+                retval = -1;+        }++        /*+         * sequenz to tell the high level ide driver that pm is resuming+         */+        memset(&rq, 0, sizeof(rq));+        memset(&rqpm, 0, sizeof(rqpm));+        memset(&args, 0, sizeof(args));+        rq.flags = REQ_PM_SUSPEND;+        rq.special = &args;+        rq.pm = &rqpm;+        rqpm.pm_step = ide_pm_state_start_suspend;+        rqpm.pm_state = PMSG_SUSPEND;++        retval = ide_do_drive_cmd(&hwif->drives[0], &rq, ide_wait);++        if (wait_for_ready (&hwif->drives[0], 35000)) {+                printk("Wait for drive sleep timeout!\n");+                retval = -1;+        }++        /*+         * stop dbdma channels+         */+        au1xxx_dbdma_reset(auide_hwif.tx_chan);+        au1xxx_dbdma_reset(auide_hwif.rx_chan);++        auide_hwif.pm.stopped = 1;++        return retval;+}++static int au1xxxide_pm_resume( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );++        int retval;+        ide_hwif_t *hwif = auide_hwif.hwif;+        struct request rq;+        struct request_pm_state rqpm;+        ide_task_t args;++        if(!auide_hwif.pm.stopped)+                return -1;++        /*+         * start dbdma channels+         */	+        au1xxx_dbdma_start(auide_hwif.tx_chan);+        au1xxx_dbdma_start(auide_hwif.rx_chan);++        /*+         * wait until hard disc is ready+         */+        if (wait_for_ready ( &hwif->drives[0], 35000)) {+                printk("Wait for drive wake up timeout!\n");+                retval = -1;+        }++        /*+         * sequenz to tell the high level ide driver that pm is resuming+         */+        memset(&rq, 0, sizeof(rq));+        memset(&rqpm, 0, sizeof(rqpm));+        memset(&args, 0, sizeof(args));+        rq.flags = REQ_PM_RESUME;+        rq.special = &args;+        rq.pm = &rqpm;+        rqpm.pm_step = ide_pm_state_start_resume;+        rqpm.pm_state = PMSG_ON;++        retval = ide_do_drive_cmd(&hwif->drives[0], &rq, ide_head_wait);++        /*+        * wait for hard disc+        */+        if ( wait_for_ready(&hwif->drives[0], 35000) ) {+                printk("Wait for drive wake up timeout!\n");+                retval = -1;+        }++        auide_hwif.pm.stopped = 0;++        return retval;+}++static int au1xxxide_pm_getstatus( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );+        return dev->cur_state;+}++static int au1xxxide_pm_access( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );+        if (dev->cur_state != AWAKE_STATE)+                return 0;+        else+                return -1;+}++static int au1xxxide_pm_idle( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );+        return 0;+}++static int au1xxxide_pm_cleanup( au1xxx_power_dev_t *dev ) {+//        printk("%s\n", __FUNCTION__ );+        return 0;+}+#endif /* CONFIG_PM */+diff -Naur linux26-cvs/include/linux/ide.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -