Annotation of Gnu-Mach/linux/src/include/asm-i386/floppy.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Architecture specific parts of the Floppy driver
                      3:  *
                      4:  * This file is subject to the terms and conditions of the GNU General Public
                      5:  * License.  See the file "COPYING" in the main directory of this archive
                      6:  * for more details.
                      7:  *
                      8:  * Copyright (C) 1995
                      9:  */
                     10: #ifndef __ASM_I386_FLOPPY_H
                     11: #define __ASM_I386_FLOPPY_H
                     12: 
                     13: 
                     14: #define SW fd_routine[use_virtual_dma&1]
                     15: 
                     16: 
                     17: #define fd_inb(port)                   inb_p(port)
                     18: #define fd_outb(port,value)            outb_p(port,value)
                     19: 
                     20: #define fd_enable_dma()         SW._enable_dma(FLOPPY_DMA)
                     21: #define fd_disable_dma()        SW._disable_dma(FLOPPY_DMA)
                     22: #define fd_request_dma()        SW._request_dma(FLOPPY_DMA,"floppy")
                     23: #define fd_free_dma()           SW._free_dma(FLOPPY_DMA)
                     24: #define fd_clear_dma_ff()       SW._clear_dma_ff(FLOPPY_DMA)
                     25: #define fd_set_dma_mode(mode)   SW._set_dma_mode(FLOPPY_DMA,mode)
                     26: #define fd_set_dma_addr(addr)   SW._set_dma_addr(FLOPPY_DMA,addr)
                     27: #define fd_set_dma_count(count) SW._set_dma_count(FLOPPY_DMA,count)
                     28: #define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
                     29: #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
                     30: #define fd_cacheflush(addr,size) /* nothing */
                     31: #define fd_request_irq()        SW._request_irq(FLOPPY_IRQ, floppy_interrupt, \
                     32:                                               SA_INTERRUPT|SA_SAMPLE_RANDOM, \
                     33:                                               "floppy", NULL)
                     34: #define fd_free_irq()          free_irq(FLOPPY_IRQ, NULL)
                     35: #define fd_get_dma_residue()    SW._get_dma_residue(FLOPPY_DMA)
                     36: #define fd_dma_mem_alloc(size) SW._dma_mem_alloc(size)
                     37: #define fd_dma_mem_free(addr,size)     SW._dma_mem_free(addr,size)
                     38: 
                     39: static int virtual_dma_count=0;
                     40: static int virtual_dma_residue=0;
                     41: static unsigned long virtual_dma_addr=0;
                     42: static int virtual_dma_mode=0;
                     43: static int doing_pdma=0;
                     44: 
                     45: static void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
                     46: {
                     47:        register unsigned char st;
                     48: 
                     49: #undef TRACE_FLPY_INT
                     50: #undef NO_FLOPPY_ASSEMBLER
                     51: 
                     52: #ifdef TRACE_FLPY_INT
                     53:        static int calls=0;
                     54:        static int bytes=0;
                     55:        static int dma_wait=0;
                     56: #endif
                     57:        if(!doing_pdma) {
                     58:                floppy_interrupt(irq, dev_id, regs);
                     59:                return;
                     60:        }
                     61: 
                     62: #ifdef TRACE_FLPY_INT
                     63:        if(!calls)
                     64:                bytes = virtual_dma_count;
                     65: #endif
                     66: 
                     67: #ifndef NO_FLOPPY_ASSEMBLER
                     68:        __asm__ (
                     69:        "testl %1,%1
                     70:        je 3f
                     71: 1:     inb %w4,%b0
                     72:        andb $160,%b0
                     73:        cmpb $160,%b0
                     74:        jne 2f
                     75:        incw %w4
                     76:        testl %3,%3
                     77:        jne 4f
                     78:        inb %w4,%b0
                     79:        movb %0,(%2)
                     80:        jmp 5f
                     81: 4:             movb (%2),%0
                     82:        outb %b0,%w4
                     83: 5:     decw %w4
                     84:        outb %0,$0x80
                     85:        decl %1
                     86:        incl %2
                     87:        testl %1,%1
                     88:        jne 1b
                     89: 3:     inb %w4,%b0
                     90: 2:     "
                     91:        : "=a" ((char) st), 
                     92:        "=c" ((long) virtual_dma_count), 
                     93:        "=S" ((long) virtual_dma_addr)
                     94:        : "b" ((long) virtual_dma_mode),
                     95:        "d" ((short) virtual_dma_port+4), 
                     96:        "1" ((long) virtual_dma_count),
                     97:        "2" ((long) virtual_dma_addr));
                     98: #else  
                     99:        {
                    100:                register int lcount;
                    101:                register char *lptr;
                    102: 
                    103:                st = 1;
                    104:                for(lcount=virtual_dma_count, lptr=(char *)virtual_dma_addr; 
                    105:                    lcount; lcount--, lptr++) {
                    106:                        st=inb(virtual_dma_port+4) & 0xa0 ;
                    107:                        if(st != 0xa0) 
                    108:                                break;
                    109:                        if(virtual_dma_mode)
                    110:                                outb_p(*lptr, virtual_dma_port+5);
                    111:                        else
                    112:                                *lptr = inb_p(virtual_dma_port+5);
                    113:                        st = inb(virtual_dma_port+4);
                    114:                }
                    115:                virtual_dma_count = lcount;
                    116:                virtual_dma_addr = (int) lptr;
                    117:        }
                    118: #endif
                    119: 
                    120: #ifdef TRACE_FLPY_INT
                    121:        calls++;
                    122: #endif
                    123:        if(st == 0x20)
                    124:                return;
                    125:        if(!(st & 0x20)) {
                    126:                virtual_dma_residue += virtual_dma_count;
                    127:                virtual_dma_count=0;
                    128: #ifdef TRACE_FLPY_INT
                    129:                printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n", 
                    130:                       virtual_dma_count, virtual_dma_residue, calls, bytes,
                    131:                       dma_wait);
                    132:                calls = 0;
                    133:                dma_wait=0;
                    134: #endif
                    135:                doing_pdma = 0;
                    136:                floppy_interrupt(irq, dev_id, regs);
                    137:                return;
                    138:        }
                    139: #ifdef TRACE_FLPY_INT
                    140:        if(!virtual_dma_count)
                    141:                dma_wait++;
                    142: #endif
                    143: }
                    144: 
                    145: static void vdma_enable_dma(unsigned int dummy)
                    146: {
                    147:        doing_pdma = 1;
                    148: }
                    149: 
                    150: static void vdma_disable_dma(unsigned int dummy)
                    151: {
                    152:        doing_pdma = 0;
                    153:        virtual_dma_residue += virtual_dma_count;
                    154:        virtual_dma_count=0;            
                    155: }
                    156: 
                    157: static int vdma_request_dma(unsigned int dmanr, const char * device_id)
                    158: {
                    159:        return 0;
                    160: }
                    161: 
                    162: static void vdma_nop(unsigned int dummy)
                    163: {
                    164: }
                    165: 
                    166: static void vdma_set_dma_mode(unsigned int dummy,char mode)
                    167: {
                    168:        virtual_dma_mode = (mode  == DMA_MODE_WRITE);
                    169: }
                    170: 
                    171: static void vdma_set_dma_addr(unsigned int dummy,unsigned int addr)
                    172: {
                    173:        virtual_dma_addr = addr;
                    174: }
                    175: 
                    176: static void vdma_set_dma_count(unsigned int dummy,unsigned int count)
                    177: {
                    178:        virtual_dma_count = count;
                    179:        virtual_dma_residue = 0;
                    180: }
                    181: 
                    182: static int vdma_get_dma_residue(unsigned int dummy)
                    183: {
                    184:        return virtual_dma_count + virtual_dma_residue;
                    185: }
                    186: 
                    187: 
                    188: static int vdma_request_irq(unsigned int irq,
                    189:                            void (*handler)(int, void *, struct pt_regs *),
                    190:                            unsigned long flags, 
                    191:                            const char *device,
                    192:                            void *dev_id)
                    193: {
                    194:        return request_irq(irq, floppy_hardint,SA_INTERRUPT,device, dev_id);
                    195: 
                    196: }
                    197: 
                    198: static unsigned long dma_mem_alloc(unsigned long size)
                    199: {
                    200:        return __get_dma_pages(GFP_KERNEL,__get_order(size));
                    201: }
                    202: 
                    203: static void dma_mem_free(unsigned long addr, unsigned long size)
                    204: {
                    205:        free_pages(addr, __get_order(size));
                    206: }
                    207: 
                    208: static unsigned long vdma_mem_alloc(unsigned long size)
                    209: {
                    210:        return (unsigned long) vmalloc(size);
                    211: }
                    212: 
                    213: static void vdma_mem_free(unsigned long addr, unsigned long size)
                    214: {
                    215:        return vfree((void *)addr);
                    216: }
                    217: 
                    218: struct fd_routine_l {
                    219:        void (*_enable_dma)(unsigned int dummy);
                    220:        void (*_disable_dma)(unsigned int dummy);
                    221:        int (*_request_dma)(unsigned int dmanr, const char * device_id);
                    222:        void (*_free_dma)(unsigned int dmanr);
                    223:        void (*_clear_dma_ff)(unsigned int dummy);
                    224:        void (*_set_dma_mode)(unsigned int dummy, char mode);
                    225:        void (*_set_dma_addr)(unsigned int dummy, unsigned int addr);
                    226:        void (*_set_dma_count)(unsigned int dummy, unsigned int count);
                    227:        int (*_get_dma_residue)(unsigned int dummy);
                    228:        int (*_request_irq)(unsigned int irq,
                    229:                           void (*handler)(int, void *, struct pt_regs *),
                    230:                           unsigned long flags, 
                    231:                           const char *device,
                    232:                           void *dev_id);
                    233:        unsigned long (*_dma_mem_alloc) (unsigned long size);
                    234:        void (*_dma_mem_free)(unsigned long addr, unsigned long size);
                    235: } fd_routine[] = {
                    236:        {
                    237:                enable_dma,
                    238:                disable_dma,
                    239:                request_dma,
                    240:                free_dma,
                    241:                clear_dma_ff,
                    242:                set_dma_mode,
                    243:                set_dma_addr,
                    244:                set_dma_count,
                    245:                get_dma_residue,
                    246:                request_irq,
                    247:                dma_mem_alloc,
                    248:                dma_mem_free
                    249:        },
                    250:        {
                    251:                vdma_enable_dma,
                    252:                vdma_disable_dma,
                    253:                vdma_request_dma,
                    254:                vdma_nop,
                    255:                vdma_nop,
                    256:                vdma_set_dma_mode,
                    257:                vdma_set_dma_addr,
                    258:                vdma_set_dma_count,
                    259:                vdma_get_dma_residue,
                    260:                vdma_request_irq,
                    261:                vdma_mem_alloc,
                    262:                vdma_mem_free
                    263:        }
                    264: };
                    265: 
                    266: __inline__ void virtual_dma_init(void)
                    267: {
                    268:        /* Nothing to do on an i386 */
                    269: }
                    270: 
                    271: static int FDC1 = 0x3f0;
                    272: static int FDC2 = -1;
                    273: 
                    274: #define FLOPPY0_TYPE   ((CMOS_READ(0x10) >> 4) & 15)
                    275: #define FLOPPY1_TYPE   (CMOS_READ(0x10) & 15)
                    276: 
                    277: #define N_FDC 2
                    278: #define N_DRIVE 8
                    279: 
                    280: /*
                    281:  * The DMA channel used by the floppy controller cannot access data at
                    282:  * addresses >= 16MB
                    283:  *
                    284:  * Went back to the 1MB limit, as some people had problems with the floppy
                    285:  * driver otherwise. It doesn't matter much for performance anyway, as most
                    286:  * floppy accesses go through the track buffer.
                    287:  */
                    288: #define CROSS_64KB(a,s) (((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64) && ! (use_virtual_dma & 1))
                    289: 
                    290: #endif /* __ASM_I386_FLOPPY_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.