📄 auide.patch
字号:
+ 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 + -