__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Architecture specific parts of the Floppy driver
*
* Linux/PA-RISC Project (http://www.parisc-linux.org/)
* Copyright (C) 2000 Matthew Wilcox (willy a debian . org)
* Copyright (C) 2000 Dave Kennedy
*/
#ifndef __ASM_PARISC_FLOPPY_H
#define __ASM_PARISC_FLOPPY_H
#include <linux/vmalloc.h>
/*
* The DMA channel used by the floppy controller cannot access data at
* addresses >= 16MB
*
* Went back to the 1MB limit, as some people had problems with the floppy
* driver otherwise. It doesn't matter much for performance anyway, as most
* floppy accesses go through the track buffer.
*/
#define _CROSS_64KB(a,s,vdma) \
(!(vdma) && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))
#define CROSS_64KB(a,s) _CROSS_64KB(a,s,use_virtual_dma & 1)
#define SW fd_routine[use_virtual_dma&1]
#define CSW fd_routine[can_use_virtual_dma & 1]
#define fd_inb(base, reg) readb((base) + (reg))
#define fd_outb(value, base, reg) writeb(value, (base) + (reg))
#define fd_request_dma() CSW._request_dma(FLOPPY_DMA,"floppy")
#define fd_free_dma() CSW._free_dma(FLOPPY_DMA)
#define fd_enable_irq() enable_irq(FLOPPY_IRQ)
#define fd_disable_irq() disable_irq(FLOPPY_IRQ)
#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL)
#define fd_get_dma_residue() SW._get_dma_residue(FLOPPY_DMA)
#define fd_dma_mem_alloc(size) SW._dma_mem_alloc(size)
#define fd_dma_setup(addr, size, mode, io) SW._dma_setup(addr, size, mode, io)
#define FLOPPY_CAN_FALLBACK_ON_NODMA
static int virtual_dma_count=0;
static int virtual_dma_residue=0;
static char *virtual_dma_addr=0;
static int virtual_dma_mode=0;
static int doing_pdma=0;
static void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
{
register unsigned char st;
#undef TRACE_FLPY_INT
#ifdef TRACE_FLPY_INT
static int calls=0;
static int bytes=0;
static int dma_wait=0;
#endif
if (!doing_pdma) {
floppy_interrupt(irq, dev_id, regs);
return;
}
#ifdef TRACE_FLPY_INT
if(!calls)
bytes = virtual_dma_count;
#endif
{
register int lcount;
register char *lptr = virtual_dma_addr;
for (lcount = virtual_dma_count; lcount; lcount--) {
st = fd_inb(virtual_dma_port, FD_STATUS);
st &= STATUS_DMA | STATUS_READY;
if (st != (STATUS_DMA | STATUS_READY))
break;
if (virtual_dma_mode) {
fd_outb(*lptr, virtual_dma_port, FD_DATA);
} else {
*lptr = fd_inb(virtual_dma_port, FD_DATA);
}
lptr++;
}
virtual_dma_count = lcount;
virtual_dma_addr = lptr;
st = fd_inb(virtual_dma_port, FD_STATUS);
}
#ifdef TRACE_FLPY_INT
calls++;
#endif
if (st == STATUS_DMA)
return;
if (!(st & STATUS_DMA)) {
virtual_dma_residue += virtual_dma_count;
virtual_dma_count = 0;
#ifdef TRACE_FLPY_INT
printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n",
virtual_dma_count, virtual_dma_residue, calls, bytes,
dma_wait);
calls = 0;
dma_wait=0;
#endif
doing_pdma = 0;
floppy_interrupt(irq, dev_id, regs);
return;
}
#ifdef TRACE_FLPY_INT
if (!virtual_dma_count)
dma_wait++;
#endif
}
static void fd_disable_dma(void)
{
if(! (can_use_virtual_dma & 1))
disable_dma(FLOPPY_DMA);
doing_pdma = 0;
virtual_dma_residue += virtual_dma_count;
virtual_dma_count=0;
}
static int vdma_request_dma(unsigned int dmanr, const char * device_id)
{
return 0;
}
static void vdma_nop(unsigned int dummy)
{
}
static int vdma_get_dma_residue(unsigned int dummy)
{
return virtual_dma_count + virtual_dma_residue;
}
static int fd_request_irq(void)
{
if(can_use_virtual_dma)
return request_irq(FLOPPY_IRQ, floppy_hardint,
0, "floppy", NULL);
else
return request_irq(FLOPPY_IRQ, floppy_interrupt,
0, "floppy", NULL);
}
static unsigned long dma_mem_alloc(unsigned long size)
{
return __get_dma_pages(GFP_KERNEL, get_order(size));
}
static unsigned long vdma_mem_alloc(unsigned long size)
{
return (unsigned long) vmalloc(size);
}
#define nodma_mem_alloc(size) vdma_mem_alloc(size)
static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
{
if((unsigned int) addr >= (unsigned int) high_memory)
return vfree((void *)addr);
else
free_pages(addr, get_order(size));
}
#define fd_dma_mem_free(addr, size) _fd_dma_mem_free(addr, size)
static void _fd_chose_dma_mode(char *addr, unsigned long size)
{
if(can_use_virtual_dma == 2) {
if((unsigned int) addr >= (unsigned int) high_memory ||
virt_to_phys(addr) >= 0x1000000 ||
_CROSS_64KB(addr, size, 0))
use_virtual_dma = 1;
else
use_virtual_dma = 0;
} else {
use_virtual_dma = can_use_virtual_dma & 1;
}
}
#define fd_chose_dma_mode(addr, size) _fd_chose_dma_mode(addr, size)
static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
{
doing_pdma = 1;
virtual_dma_port = io;
virtual_dma_mode = (mode == DMA_MODE_WRITE);
virtual_dma_addr = addr;
virtual_dma_count = size;
virtual_dma_residue = 0;
return 0;
}
static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
{
#ifdef FLOPPY_SANITY_CHECK
if (CROSS_64KB(addr, size)) {
printk("DMA crossing 64-K boundary %p-%p\n", addr, addr+size);
return -1;
}
#endif
/* actual, physical DMA */
doing_pdma = 0;
clear_dma_ff(FLOPPY_DMA);
set_dma_mode(FLOPPY_DMA,mode);
set_dma_addr(FLOPPY_DMA,virt_to_phys(addr));
set_dma_count(FLOPPY_DMA,size);
enable_dma(FLOPPY_DMA);
return 0;
}
static struct fd_routine_l {
int (*_request_dma)(unsigned int dmanr, const char * device_id);
void (*_free_dma)(unsigned int dmanr);
int (*_get_dma_residue)(unsigned int dummy);
unsigned long (*_dma_mem_alloc) (unsigned long size);
int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
} fd_routine[] = {
{
request_dma,
free_dma,
get_dma_residue,
dma_mem_alloc,
hard_dma_setup
},
{
vdma_request_dma,
vdma_nop,
vdma_get_dma_residue,
vdma_mem_alloc,
vdma_dma_setup
}
};
static int FDC1 = 0x3f0; /* Lies. Floppy controller is memory mapped, not io mapped */
static int FDC2 = -1;
#define FLOPPY0_TYPE 0
#define FLOPPY1_TYPE 0
#define N_FDC 1
#define N_DRIVE 8
#define EXTRA_FLOPPY_PARAMS
#endif /* __ASM_PARISC_FLOPPY_H */
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| Kbuild | File | 194 B | 0644 |
|
| alternative.h | File | 2.01 KB | 0644 |
|
| asm-offsets.h | File | 35 B | 0644 |
|
| asmregs.h | File | 2.42 KB | 0644 |
|
| assembly.h | File | 13.98 KB | 0644 |
|
| atomic.h | File | 5.97 KB | 0644 |
|
| barrier.h | File | 2.5 KB | 0644 |
|
| bitops.h | File | 5.32 KB | 0644 |
|
| bug.h | File | 2.56 KB | 0644 |
|
| cache.h | File | 2.28 KB | 0644 |
|
| cacheflush.h | File | 3.08 KB | 0644 |
|
| cachetype.h | File | 178 B | 0644 |
|
| checksum.h | File | 4.6 KB | 0644 |
|
| cmpxchg.h | File | 3.67 KB | 0644 |
|
| compat.h | File | 3.3 KB | 0644 |
|
| compat_ucontext.h | File | 591 B | 0644 |
|
| current.h | File | 435 B | 0644 |
|
| delay.h | File | 533 B | 0644 |
|
| dma-mapping.h | File | 996 B | 0644 |
|
| dma.h | File | 5.65 KB | 0644 |
|
| dwarf.h | File | 456 B | 0644 |
|
| eisa_bus.h | File | 492 B | 0644 |
|
| eisa_eeprom.h | File | 4.22 KB | 0644 |
|
| elf.h | File | 14.15 KB | 0644 |
|
| extable.h | File | 2.17 KB | 0644 |
|
| fixmap.h | File | 2.2 KB | 0644 |
|
| floppy.h | File | 6.05 KB | 0644 |
|
| ftrace.h | File | 805 B | 0644 |
|
| futex.h | File | 2.65 KB | 0644 |
|
| grfioctl.h | File | 2.69 KB | 0644 |
|
| hardirq.h | File | 976 B | 0644 |
|
| hardware.h | File | 4.14 KB | 0644 |
|
| hash.h | File | 5.07 KB | 0644 |
|
| hugetlb.h | File | 1004 B | 0644 |
|
| io.h | File | 6.42 KB | 0644 |
|
| irq.h | File | 1.14 KB | 0644 |
|
| irqflags.h | File | 1.22 KB | 0644 |
|
| jump_label.h | File | 1.06 KB | 0644 |
|
| kbdleds.h | File | 477 B | 0644 |
|
| kexec.h | File | 827 B | 0644 |
|
| kfence.h | File | 865 B | 0644 |
|
| kgdb.h | File | 1.32 KB | 0644 |
|
| kprobes.h | File | 1.31 KB | 0644 |
|
| ldcw.h | File | 2.49 KB | 0644 |
|
| led.h | File | 1.18 KB | 0644 |
|
| linkage.h | File | 738 B | 0644 |
|
| mman.h | File | 808 B | 0644 |
|
| mmu.h | File | 199 B | 0644 |
|
| mmu_context.h | File | 2.37 KB | 0644 |
|
| mmzone.h | File | 202 B | 0644 |
|
| module.h | File | 527 B | 0644 |
|
| page.h | File | 5.09 KB | 0644 |
|
| parisc-device.h | File | 1.93 KB | 0644 |
|
| parport.h | File | 358 B | 0644 |
|
| pci.h | File | 5.71 KB | 0644 |
|
| pdc.h | File | 4.39 KB | 0644 |
|
| pdc_chassis.h | File | 14.4 KB | 0644 |
|
| pdcpat.h | File | 16.7 KB | 0644 |
|
| perf.h | File | 1.89 KB | 0644 |
|
| perf_event.h | File | 152 B | 0644 |
|
| pgalloc.h | File | 1.4 KB | 0644 |
|
| pgtable.h | File | 17.18 KB | 0644 |
|
| prefetch.h | File | 1.12 KB | 0644 |
|
| processor.h | File | 10.65 KB | 0644 |
|
| psw.h | File | 2.41 KB | 0644 |
|
| ptrace.h | File | 1.6 KB | 0644 |
|
| ropes.h | File | 9.86 KB | 0644 |
|
| rt_sigframe.h | File | 410 B | 0644 |
|
| runway.h | File | 183 B | 0644 |
|
| seccomp.h | File | 651 B | 0644 |
|
| sections.h | File | 332 B | 0644 |
|
| serial.h | File | 124 B | 0644 |
|
| shmparam.h | File | 968 B | 0644 |
|
| signal.h | File | 348 B | 0644 |
|
| smp.h | File | 1.18 KB | 0644 |
|
| socket.h | File | 310 B | 0644 |
|
| sparsemem.h | File | 345 B | 0644 |
|
| special_insns.h | File | 1.6 KB | 0644 |
|
| spinlock.h | File | 3.4 KB | 0644 |
|
| spinlock_types.h | File | 974 B | 0644 |
|
| string.h | File | 247 B | 0644 |
|
| superio.h | File | 3.25 KB | 0644 |
|
| switch_to.h | File | 332 B | 0644 |
|
| syscall.h | File | 1.44 KB | 0644 |
|
| text-patching.h | File | 445 B | 0644 |
|
| thread_info.h | File | 2.91 KB | 0644 |
|
| timex.h | File | 403 B | 0644 |
|
| tlb.h | File | 288 B | 0644 |
|
| tlbflush.h | File | 1.94 KB | 0644 |
|
| topology.h | File | 402 B | 0644 |
|
| traps.h | File | 666 B | 0644 |
|
| uaccess.h | File | 4.88 KB | 0644 |
|
| ucontext.h | File | 327 B | 0644 |
|
| unistd.h | File | 4.78 KB | 0644 |
|
| unwind.h | File | 2.66 KB | 0644 |
|
| vdso.h | File | 598 B | 0644 |
|
| video.h | File | 328 B | 0644 |
|
| vmalloc.h | File | 96 B | 0644 |
|