From: Andy P. <at...@us...> - 2002-04-09 15:08:26
|
Update of /cvsroot/linux-vax/kernel-2.4/drivers/acorn/block In directory usw-pr-cvs1:/tmp/cvs-serv12544/acorn/block Modified Files: fd1772.c mfmhd.c Log Message: synch 2.4.15 commit 16 Index: fd1772.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/acorn/block/fd1772.c,v retrieving revision 1.1.1.2 retrieving revision 1.2 diff -u -r1.1.1.2 -r1.2 --- fd1772.c 25 Feb 2001 23:15:12 -0000 1.1.1.2 +++ fd1772.c 9 Apr 2002 14:00:57 -0000 1.2 @@ -3,7 +3,7 @@ * Based on ataflop.c in the m68k Linux * Copyright (C) 1993 Greg Harp * Atari Support by Bjoern Brauel, Roman Hodek - * Archimedes Support by Dave Gilbert (gil...@cs...) + * Archimedes Support by Dave Gilbert (li...@tr...) * * Big cleanup Sep 11..14 1994 Roman Hodek: * - Driver now works interrupt driven @@ -117,12 +117,17 @@ * * DAG 30/01/99 - Started frobbing for 2.2.1 * DAG 20/06/99 - A little more frobbing: - * Included include/asm/uaccess.h for get_user/put_user + * Included include/asm/uaccess.h for get_user/put_user + * + * DAG 1/09/00 - Dusted off for 2.4.0-test7 + * MAX_SECTORS was name clashing so it is now FD1772_... + * Minor parameter, name layouts for 2.4.x differences */ #include <linux/sched.h> #include <linux/fs.h> #include <linux/fcntl.h> +#include <linux/slab.h> #include <linux/kernel.h> #include <linux/interrupt.h> #include <linux/timer.h> @@ -135,16 +140,15 @@ #include <linux/mm.h> #include <asm/arch/oldlatches.h> -#include <asm/system.h> #include <asm/bitops.h> #include <asm/dma.h> #include <asm/hardware.h> +#include <asm/hardware/ioc.h> #include <asm/io.h> -#include <asm/ioc.h> #include <asm/irq.h> #include <asm/mach-types.h> #include <asm/pgtable.h> -#include <asm/segment.h> +#include <asm/system.h> #include <asm/uaccess.h> @@ -242,7 +246,7 @@ outb(val, (reg / 2) + FDC1772BASE); }; -#define MAX_SECTORS 22 +#define FD1772_MAX_SECTORS 22 unsigned char *DMABuffer; /* buffer for writes */ /*static unsigned long PhysDMABuffer; *//* physical address */ @@ -276,6 +280,7 @@ static volatile int fdc_busy = 0; static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); + /* long req'd for set_bit --RR */ static unsigned long changed_floppies = 0xff, fake_change = 0; #define CHECK_CHANGE_DELAY HZ/2 @@ -287,31 +292,29 @@ #define FLOPPY_TIMEOUT (6*HZ) #define RECALIBRATE_ERRORS 4 /* After this many errors the drive * will be recalibrated. */ -#define MAX_ERRORS 8 /* After this many errors the driver - * will give up. */ - -static struct timer_list fd_timer; +#define MAX_ERRORS 8 /* After this many errors the driver + * will give up. */ -#define START_MOTOR_OFF_TIMER(delay) \ - do { \ - motor_off_timer.expires = jiffies + (delay); \ - add_timer( &motor_off_timer ); \ - MotorOffTrys = 0; \ +#define START_MOTOR_OFF_TIMER(delay) \ + do { \ + motor_off_timer.expires = jiffies + (delay); \ + add_timer( &motor_off_timer ); \ + MotorOffTrys = 0; \ } while(0) #define START_CHECK_CHANGE_TIMER(delay) \ - do { \ - mod_timer(&fd_timer, jiffies + (delay)); \ + do { \ + mod_timer(&fd_timer, jiffies + (delay)); \ } while(0) -#define START_TIMEOUT() \ - do { \ - mod_timer(&timeout_timer, jiffies+FLOPPY_TIMEOUT); \ +#define START_TIMEOUT() \ + do { \ + mod_timer(&timeout_timer, jiffies+FLOPPY_TIMEOUT); \ } while(0) -#define STOP_TIMEOUT() \ - do { \ - del_timer( &timeout_timer ); \ +#define STOP_TIMEOUT() \ + do { \ + del_timer( &timeout_timer ); \ } while(0) #define ENABLE_IRQ() enable_irq(FIQ_FD1772+64); @@ -369,18 +372,27 @@ static int fd_test_drive_present(int drive); static void config_types(void); static int floppy_open(struct inode *inode, struct file *filp); -static void floppy_release(struct inode *inode, struct file *filp); +static int floppy_release(struct inode *inode, struct file *filp); /************************* End of Prototypes **************************/ -static struct timer_list motor_off_timer = -{NULL, NULL, 0, 0, fd_motor_off_timer}; +static struct timer_list motor_off_timer = { + function: fd_motor_off_timer, +}; + #ifdef TRACKBUFFER -static struct timer_list readtrack_timer = - { NULL, NULL, 0, 0, fd_readtrack_check }; +static struct timer_list readtrack_timer = { + function: fd_readtrack_check, +}; #endif -static struct timer_list timeout_timer = -{NULL, NULL, 0, 0, fd_times_out}; + +static struct timer_list timeout_timer = { + function: fd_times_out, +}; + +static struct timer_list fd_timer = { + function: check_change, +}; /* DAG: Haven't got a clue what this is? */ int stdma_islocked(void) @@ -392,13 +404,7 @@ static void fd_select_side(int side) { - unsigned long flags; - - save_flags(flags); - cli(); - oldlatch_aupdate(LATCHA_SIDESEL, side ? 0 : LATCHA_SIDESEL); - restore_flags(flags); } @@ -407,8 +413,6 @@ static void fd_select_drive(int drive) { - unsigned long flags; - #ifdef DEBUG printk("fd_select_drive:%d\n", drive); #endif @@ -418,10 +422,7 @@ if (drive == SelectedDrive) return; - save_flags(flags); - cli(); oldlatch_aupdate(LATCHA_FDSELALL, 0xf - (1 << drive)); - restore_flags(flags); /* restore track register to saved value */ FDC1772_WRITE(FDC1772REG_TRACK, unit[drive].track); @@ -439,10 +440,7 @@ DPRINT(("fd_deselect\n")); - save_flags(flags); - cli(); oldlatch_aupdate(LATCHA_FDSELALL | LATCHA_MOTOR | LATCHA_INUSE, 0xf | LATCHA_MOTOR | LATCHA_INUSE); - restore_flags(flags); SelectedDrive = -1; } @@ -474,9 +472,12 @@ status = FDC1772_READ(FDC1772REG_STATUS); if (!(status & 0x80)) { - /* motor already turned off by FDC1772 -> deselect drives */ - /* In actual fact its this deselection which turns the motor off on the - Arc, since the motor control is actually on Latch A */ + /* + * motor already turned off by FDC1772 -> deselect drives + * In actual fact its this deselection which turns the motor + * off on the Arc, since the motor control is actually on + * Latch A + */ DPRINT(("fdc1772: deselecting in fd_motor_off_timer\n")); fd_deselect(); MotorOn = 0; @@ -485,7 +486,7 @@ } /* not yet off, try again */ - retry: +retry: restore_flags(flags); /* Test again later; if tested too often, it seems there is no disk * in the drive and the FDC1772 will leave the motor on forever (or, @@ -623,31 +624,29 @@ DPRINT(("do_fd_action unit[drive].track=%d\n", unit[drive].track)); #ifdef TRACKBUFFER - repeat: +repeat: - if (IS_BUFFERED( drive, ReqSide, ReqTrack )) { - if (ReqCmd == READ) { - copy_buffer( SECTOR_BUFFER(ReqSector), ReqData ); - if (++ReqCnt < CURRENT->current_nr_sectors) { - /* read next sector */ - setup_req_params( drive ); - goto repeat; - } - else { - /* all sectors finished */ - CURRENT->nr_sectors -= CURRENT->current_nr_sectors; - CURRENT->sector += CURRENT->current_nr_sectors; - end_request( 1 ); - redo_fd_request(); - return; - } - } - else { - /* cmd == WRITE, pay attention to track buffer - * consistency! */ - copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) ); - } - } + if (IS_BUFFERED( drive, ReqSide, ReqTrack )) { + if (ReqCmd == READ) { + copy_buffer( SECTOR_BUFFER(ReqSector), ReqData ); + if (++ReqCnt < CURRENT->current_nr_sectors) { + /* read next sector */ + setup_req_params( drive ); + goto repeat; + } else { + /* all sectors finished */ + CURRENT->nr_sectors -= CURRENT->current_nr_sectors; + CURRENT->sector += CURRENT->current_nr_sectors; + end_request( 1 ); + redo_fd_request(); + return; + } + } else { + /* cmd == WRITE, pay attention to track buffer + * consistency! */ + copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) ); + } + } #endif if (SelectedDrive != drive) { @@ -708,7 +707,7 @@ static void fd_seek(void) { - unsigned long flags; + unsigned long flags; DPRINT(("fd_seek() to track %d (unit[SelectedDrive].track=%d)\n", ReqTrack, unit[SelectedDrive].track)); if (unit[SelectedDrive].track == ReqTrack << @@ -719,14 +718,14 @@ FDC1772_WRITE(FDC1772REG_DATA, ReqTrack << unit[SelectedDrive].disktype->stretch); udelay(25); - save_flags(flags); - cliIF(); + save_flags(flags); + clf(); SET_IRQ_HANDLER(fd_seek_done); FDC1772_WRITE(FDC1772REG_CMD, FDC1772CMD_SEEK | unit[SelectedDrive].steprate | /* DAG */ (MotorOn?FDC1772CMDADD_H:0)); - restore_flags(flags); + restore_flags(flags); MotorOn = 1; set_head_settle_flag(); START_TIMEOUT(); @@ -776,13 +775,10 @@ paddr = (unsigned long) ReqData; rwflag = 0x100; } else { + paddr = (unsigned long) PhysDMABuffer; #ifdef TRACKBUFFER - if (read_track) - paddr = (unsigned long)PhysTrackBuffer; - else - paddr =(unsigned long)PhysDMABuffer; -#else - paddr = (unsigned long)PhysDMABuffer; + if (read_track) + paddr = (unsigned long)PhysTrackBuffer; #endif rwflag = 0; } @@ -794,9 +790,9 @@ /*DPRINT(("fd_rwsec() before start sector \n")); */ /* Start sector of this operation */ #ifdef TRACKBUFFER - FDC1772_WRITE( FDC1772REG_SECTOR, !read_track ? ReqSector : 1 ); + FDC1772_WRITE( FDC1772REG_SECTOR, !read_track ? ReqSector : 1 ); #else - FDC1772_WRITE( FDC1772REG_SECTOR, ReqSector ); + FDC1772_WRITE( FDC1772REG_SECTOR, ReqSector ); #endif /* Cheat for track if stretch != 0 */ @@ -810,12 +806,12 @@ DPRINT(("fd_rwsec() before setup DMA \n")); /* Setup DMA - Heavily modified by DAG */ save_flags(flags); - cliIF(); + clf(); disable_dma(FLOPPY_DMA); set_dma_mode(FLOPPY_DMA, rwflag ? DMA_MODE_WRITE : DMA_MODE_READ); set_dma_addr(FLOPPY_DMA, (long) paddr); /* DAG - changed from Atari specific */ #ifdef TRACKBUFFER - set_dma_count(FLOPPY_DMA,(!read_track ? 1 : unit[SelectedDrive].disktype->spt)*512); + set_dma_count(FLOPPY_DMA,(!read_track ? 1 : unit[SelectedDrive].disktype->spt)*512); #else set_dma_count(FLOPPY_DMA, 512); /* Block/sector size - going to have to change */ #endif @@ -825,14 +821,14 @@ /* Now give it something to do */ FDC1772_WRITE(FDC1772REG_CMD, (rwflag ? (FDC1772CMD_WRSEC | FDC1772CMDADD_P) : #ifdef TRACKBUFFER - (FDC1772CMD_RDSEC | (read_track ? FDC1772CMDADD_M : 0) | + (FDC1772CMD_RDSEC | (read_track ? FDC1772CMDADD_M : 0) | /* Hmm - the idea here is to stop the FDC spinning the disc up when we know that we already still have it spinning */ (MotorOn?FDC1772CMDADD_H:0)) #else - FDC1772CMD_RDSEC + FDC1772CMD_RDSEC #endif - )); + )); restore_flags(flags); DPRINT(("fd_rwsec() after DMA setup flags=0x%08x\n", flags)); @@ -845,20 +841,19 @@ /* wait for interrupt */ #ifdef TRACKBUFFER - if (read_track) { - /* If reading a whole track, wait about one disk rotation and - * then check if all sectors are read. The FDC will even - * search for the first non-existant sector and need 1 sec to - * recognise that it isn't present :-( - */ - del_timer( &readtrack_timer ); - readtrack_timer.function = fd_readtrack_check; - readtrack_timer.expires = jiffies + HZ/5 + (old_motoron ? 0 : HZ); - /* 1 rot. + 5 rot.s if motor was off */ - DPRINT(("Setting readtrack_timer to %d @ %d\n",readtrack_timer.expires,jiffies)); - add_timer( &readtrack_timer ); - MultReadInProgress = 1; - } + if (read_track) { + /* + * If reading a whole track, wait about one disk rotation and + * then check if all sectors are read. The FDC will even + * search for the first non-existant sector and need 1 sec to + * recognise that it isn't present :-( + */ + /* 1 rot. + 5 rot.s if motor was off */ + mod_timer(&readtrack_timer, jiffies + HZ/5 + (old_motoron ? 0 : HZ)); + DPRINT(("Setting readtrack_timer to %d @ %d\n", + readtrack_timer.expires,jiffies)); + MultReadInProgress = 1; + } #endif /*DPRINT(("fd_rwsec() before START_TIMEOUT \n")); */ @@ -869,55 +864,54 @@ #ifdef TRACKBUFFER -static void fd_readtrack_check( unsigned long dummy ) +static void fd_readtrack_check(unsigned long dummy) +{ + unsigned long flags, addr; + extern unsigned char *fdc1772_dataaddr; + + DPRINT(("fd_readtrack_check @ %d\n",jiffies)); + + save_flags(flags); + clf(); -{ unsigned long flags, addr; - extern unsigned char *fdc1772_dataaddr; + del_timer( &readtrack_timer ); + + if (!MultReadInProgress) { + /* This prevents a race condition that could arise if the + * interrupt is triggered while the calling of this timer + * callback function takes place. The IRQ function then has + * already cleared 'MultReadInProgress' when control flow + * gets here. + */ + restore_flags(flags); + return; + } - DPRINT(("fd_readtrack_check @ %d\n",jiffies)); + /* get the current DMA address */ + addr=(unsigned long)fdc1772_dataaddr; /* DAG - ? */ + DPRINT(("fd_readtrack_check: addr=%x PhysTrackBuffer=%x\n",addr,PhysTrackBuffer)); + + if (addr >= (unsigned int)PhysTrackBuffer + unit[SelectedDrive].disktype->spt*512) { + /* already read enough data, force an FDC interrupt to stop + * the read operation + */ + SET_IRQ_HANDLER( NULL ); + restore_flags(flags); + DPRINT(("fd_readtrack_check(): done\n")); + FDC1772_WRITE( FDC1772REG_CMD, FDC1772CMD_FORCI ); + udelay(25); - save_flags(flags); - cliIF(); - - del_timer( &readtrack_timer ); - - if (!MultReadInProgress) { - /* This prevents a race condition that could arise if the - * interrupt is triggered while the calling of this timer - * callback function takes place. The IRQ function then has - * already cleared 'MultReadInProgress' when control flow - * gets here. - */ - restore_flags(flags); - return; - } - - /* get the current DMA address */ - addr=fdc1772_dataaddr; /* DAG - ? */ - DPRINT(("fd_readtrack_check: addr=%x PhysTrackBuffer=%x\n",addr,PhysTrackBuffer)); - - if (addr >= PhysTrackBuffer + unit[SelectedDrive].disktype->spt*512) { - /* already read enough data, force an FDC interrupt to stop - * the read operation - */ - SET_IRQ_HANDLER( NULL ); - restore_flags(flags); - DPRINT(("fd_readtrack_check(): done\n")); - FDC1772_WRITE( FDC1772REG_CMD, FDC1772CMD_FORCI ); - udelay(25); - - /* No error until now -- the FDC would have interrupted - * otherwise! - */ - fd_rwsec_done( 0 ); - } - else { - /* not yet finished, wait another tenth rotation */ - restore_flags(flags); - DPRINT(("fd_readtrack_check(): not yet finished\n")); - readtrack_timer.expires = jiffies + HZ/5/10; - add_timer( &readtrack_timer ); - } + /* No error until now -- the FDC would have interrupted + * otherwise! + */ + fd_rwsec_done( 0 ); + } else { + /* not yet finished, wait another tenth rotation */ + restore_flags(flags); + DPRINT(("fd_readtrack_check(): not yet finished\n")); + readtrack_timer.expires = jiffies + HZ/5/10; + add_timer( &readtrack_timer ); + } } #endif @@ -929,13 +923,15 @@ DPRINT(("fd_rwsec_done() status=%d @ %d\n", status,jiffies)); #ifdef TRACKBUFFER - if (read_track && !MultReadInProgress) return; - MultReadInProgress = 0; + if (read_track && !MultReadInProgress) + return; + + MultReadInProgress = 0; - STOP_TIMEOUT(); + STOP_TIMEOUT(); - if (read_track) - del_timer( &readtrack_timer ); + if (read_track) + del_timer( &readtrack_timer ); #endif @@ -951,13 +947,13 @@ } if ((status & FDC1772STAT_RECNF) #ifdef TRACKBUFFER - /* RECNF is no error after a multiple read when the FDC - * searched for a non-existant sector! - */ - && !(read_track && - FDC1772_READ(FDC1772REG_SECTOR) > unit[SelectedDrive].disktype->spt) + /* RECNF is no error after a multiple read when the FDC + * searched for a non-existant sector! + */ + && !(read_track && + FDC1772_READ(FDC1772REG_SECTOR) > unit[SelectedDrive].disktype->spt) #endif - ) { + ) { if (Probing) { if (unit[SelectedDrive].disktype > disk_type) { /* try another disk type */ @@ -978,7 +974,7 @@ if (Probing) { setup_req_params(SelectedDrive); #ifdef TRACKBUFFER - BufferDrive = -1; + BufferDrive = -1; #endif do_fd_action(SelectedDrive); return; @@ -1001,19 +997,16 @@ if (ReqCmd == READ) { #ifdef TRACKBUFFER - if (!read_track) - { - /*cache_clear (PhysDMABuffer, 512);*/ - copy_buffer (DMABuffer, ReqData); - } - else - { - /*cache_clear (PhysTrackBuffer, MAX_SECTORS * 512);*/ - BufferDrive = SelectedDrive; - BufferSide = ReqSide; - BufferTrack = ReqTrack; - copy_buffer (SECTOR_BUFFER (ReqSector), ReqData); - } + if (!read_track) { + /*cache_clear (PhysDMABuffer, 512);*/ + copy_buffer (DMABuffer, ReqData); + } else { + /*cache_clear (PhysTrackBuffer, FD1772_MAX_SECTORS * 512);*/ + BufferDrive = SelectedDrive; + BufferSide = ReqSide; + BufferTrack = ReqTrack; + copy_buffer (SECTOR_BUFFER (ReqSector), ReqData); + } #else /*cache_clear( PhysDMABuffer, 512 ); */ copy_buffer(DMABuffer, ReqData); @@ -1032,9 +1025,9 @@ } return; - err_end: +err_end: #ifdef TRACKBUFFER - BufferDrive = -1; + BufferDrive = -1; #endif fd_error(); @@ -1118,10 +1111,8 @@ /* Prevent "aliased" accesses. */ -static fd_ref[4] = -{0, 0, 0, 0}; -static fd_device[4] = -{0, 0, 0, 0}; +static int fd_ref[4]; +static int fd_device[4]; /* * Current device number. Taken either from the block header or from the @@ -1182,7 +1173,7 @@ if (test_bit(drive, &changed_floppies) || test_bit(drive, &fake_change) || unit[drive].disktype == 0) { #ifdef TRACKBUFFER - BufferDrive = -1; + BufferDrive = -1; #endif clear_bit(drive, &fake_change); clear_bit(drive, &changed_floppies); @@ -1214,7 +1205,7 @@ ReqData = ReqBuffer + 512 * ReqCnt; #ifdef TRACKBUFFER - read_track = (ReqCmd == READ && CURRENT_ERRORS == 0); + read_track = (ReqCmd == READ && CURRENT_ERRORS == 0); #endif DPRINT(("Request params: Si=%d Tr=%d Se=%d Data=%08lx\n", ReqSide, @@ -1234,7 +1225,7 @@ if (!QUEUE_EMPTY && CURRENT->rq_status == RQ_INACTIVE) goto the_end; - repeat: +repeat: if (QUEUE_EMPTY) goto the_end; @@ -1293,25 +1284,25 @@ return; - the_end: +the_end: finish_fdc(); } static void fd1772_checkint(void) { - extern int fdc1772_bytestogo; + extern int fdc1772_bytestogo; - /*printk("fd1772_checkint %d\n",fdc1772_fdc_int_done);*/ - if (fdc1772_fdc_int_done) - floppy_irqconsequencehandler(); - if ((MultReadInProgress) && (fdc1772_bytestogo==0)) fd_readtrack_check(0); - if (fdc_busy) { - queue_task(&fd1772_tq,&tq_immediate); - mark_bh(IMMEDIATE_BH); - }; -}; + /*printk("fd1772_checkint %d\n",fdc1772_fdc_int_done);*/ + if (fdc1772_fdc_int_done) + floppy_irqconsequencehandler(); + if ((MultReadInProgress) && (fdc1772_bytestogo==0)) fd_readtrack_check(0); + if (fdc_busy) { + queue_task(&fd1772_tq,&tq_immediate); + mark_bh(IMMEDIATE_BH); + } +} -void do_fd_request(void) +void do_fd_request(request_queue_t* q) { unsigned long flags; @@ -1329,8 +1320,8 @@ redo_fd_request(); - queue_task(&fd1772_tq,&tq_immediate); - mark_bh(IMMEDIATE_BH); + queue_task(&fd1772_tq,&tq_immediate); + mark_bh(IMMEDIATE_BH); } @@ -1338,7 +1329,7 @@ { /* invalidate the buffer track to force a reread */ #ifdef TRACKBUFFER - BufferDrive = -1; + BufferDrive = -1; #endif set_bit(rdev & 3, &fake_change); @@ -1352,9 +1343,6 @@ int drive, device; device = inode->i_rdev; - switch (cmd) { - RO_IOCTLS(inode->i_rdev, param); - } drive = MINOR(device); switch (cmd) { case FDFMTBEG: @@ -1428,7 +1416,7 @@ /* if (!(mfp.par_dt_reg & 0x20)) break; */ /* Well this is my nearest guess - quit when we get an FDC interrupt */ - if (IOC_FIQSTAT & 2) + if (ioc_readb(IOC_FIQSTAT) & 2) break; } @@ -1451,7 +1439,7 @@ FDC1772_WRITE(FDC1772REG_CMD, FDC1772CMD_SEEK); printk("fd_test_drive_present: just before wait for int\n"); /* DAG: Guess means wait for interrupt */ - while (!(IOC_FIQSTAT & 2)); + while (!(ioc_readb(IOC_FIQSTAT) & 2)); printk("fd_test_drive_present: just after wait for int\n"); status = FDC1772_READ(FDC1772REG_STATUS); } @@ -1553,7 +1541,7 @@ } -static void floppy_release(struct inode *inode, struct file *filp) +static int floppy_release(struct inode *inode, struct file *filp) { int drive = MINOR(inode->i_rdev) & 3; @@ -1563,11 +1551,12 @@ printk("floppy_release with fd_ref == 0"); fd_ref[drive] = 0; } + + return 0; } static struct block_device_operations floppy_fops = { - owner: THIS_MODULE, open: floppy_open, release: floppy_release, ioctl: fd_ioctl, @@ -1580,7 +1569,7 @@ { int i; - if (!machine_is_arc()) + if (!machine_is_archimedes()) return 0; if (register_blkdev(MAJOR_NR, "fd", &floppy_fops)) { @@ -1603,25 +1592,15 @@ /* initialize variables */ SelectedDrive = -1; #ifdef TRACKBUFFER - BufferDrive = -1; -#endif - - /* initialize check_change timer */ - init_timer(&fd_timer); - fd_timer.function = check_change; -} - -#ifdef TRACKBUFFER - DMABuffer = (char *)kmalloc((MAX_SECTORS+1)*512,GFP_KERNEL); /* Atari uses 512 - I want to eventually cope with 1K sectors */ - TrackBuffer = DMABuffer + 512; + BufferDrive = BufferSide = BufferTrack = -1; + /* Atari uses 512 - I want to eventually cope with 1K sectors */ + DMABuffer = (char *)kmalloc((FD1772_MAX_SECTORS+1)*512,GFP_KERNEL); + TrackBuffer = DMABuffer + 512; #else /* Allocate memory for the DMAbuffer - on the Atari this takes it out of some special memory... */ DMABuffer = (char *) kmalloc(2048); /* Copes with pretty large sectors */ #endif -#ifdef TRACKBUFFER - BufferDrive = BufferSide = BufferTrack = -1; -#endif for (i = 0; i < FD_MAX_UNITS; i++) { unit[i].track = -1; @@ -1635,17 +1614,13 @@ blk_size[MAJOR_NR] = floppy_sizes; blksize_size[MAJOR_NR] = floppy_blocksizes; - blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; + blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST); config_types(); return 0; } -/* Just a dummy at the moment */ -void floppy_setup(char *str, int *ints) +void floppy_eject(void) { -} - -void floppy_eject(void) { } Index: mfmhd.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/acorn/block/mfmhd.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- mfmhd.c 14 Jan 2001 18:59:31 -0000 1.1.1.1 +++ mfmhd.c 9 Apr 2002 14:00:57 -0000 1.2 @@ -560,7 +560,7 @@ }; }; /* Result read */ - /*console_printf ("mfm_rw_intr nearexit [%02X]\n", inb(mfm_IRQPollLoc)); */ + /*console_printf ("mfm_rw_intr nearexit [%02X]\n", __raw_readb(mfm_IRQPollLoc)); */ /* If end of command move on */ if (mfm_status & (STAT_CED)) { @@ -1208,9 +1208,6 @@ return -EFAULT; return 0; - case BLKGETSIZE: - return put_user (mfm[minor].nr_sects, (long *)arg); - case BLKFRASET: if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -1228,6 +1225,8 @@ return -EACCES; return mfm_reread_partitions(dev); + case BLKGETSIZE: + case BLKGETSIZE64: case BLKFLSBUF: case BLKROSET: case BLKROGET: @@ -1248,7 +1247,6 @@ if (dev >= mfm_drives) return -ENODEV; - MOD_INC_USE_COUNT; while (mfm_info[dev].busy) sleep_on (&mfm_wait_open); @@ -1263,7 +1261,6 @@ static int mfm_release(struct inode *inode, struct file *file) { mfm_info[DEVICE_NR(MINOR(inode->i_rdev))].access_count--; - MOD_DEC_USE_COUNT; return 0; } @@ -1311,19 +1308,18 @@ } static struct gendisk mfm_gendisk = { - MAJOR_NR, /* Major number */ - "mfm", /* Major name */ - 6, /* Bits to shift to get real from partition */ - 1 << 6, /* Number of partitions per real */ - mfm, /* hd struct */ - mfm_sizes, /* block sizes */ - 0, /* number */ - (void *) mfm_info, /* internal */ - NULL /* next */ + major: MAJOR_NR, + major_name: "mfm", + minor_shift: 6, + max_p: 1 << 6, + part: mfm, + sizes: mfm_sizes, + real_devices: (void *)mfm_info, }; static struct block_device_operations mfm_fops = { + owner: THIS_MODULE, open: mfm_open, release: mfm_release, ioctl: mfm_ioctl, @@ -1425,7 +1421,7 @@ } mfm_addr = ecard_address(ecs, ECARD_IOC, ECARD_MEDIUM) + 0x800; - mfm_IRQPollLoc = mfm_addr + 0x400; + mfm_IRQPollLoc = ioaddr(mfm_addr + 0x400); mfm_irqenable = mfm_IRQPollLoc; mfm_irq = ecs->irq; irqmask = 0x08; @@ -1444,16 +1440,13 @@ /* Stuff for the assembler routines to get to */ hdc63463_baseaddress = ioaddr(mfm_addr); - hdc63463_irqpolladdress = ioaddr(mfm_IRQPollLoc); + hdc63463_irqpolladdress = mfm_IRQPollLoc; hdc63463_irqpollmask = irqmask; blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST); read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB?) read ahread */ -#ifndef MODULE - mfm_gendisk.next = gendisk_head; - gendisk_head = &mfm_gendisk; -#endif + add_gendisk(&mfm_gendisk); Busy = 0; lastspecifieddrive = -1; @@ -1485,14 +1478,7 @@ for (i = maxp - 1; i >= 0; i--) { int minor = start + i; - kdev_t devi = MKDEV(MAJOR_NR, minor); - struct super_block *sb = get_super(devi); - - sync_dev (devi); - if (sb) - invalidate_inodes (sb); - invalidate_buffers (devi); - + invalidate_device (MKDEV(MAJOR_NR, minor), 1); mfm_gendisk.part[minor].start_sect = 0; mfm_gendisk.part[minor].nr_sects = 0; } @@ -1508,6 +1494,10 @@ } #ifdef MODULE + +EXPORT_NO_SYMBOLS; +MODULE_LICENSE("GPL"); + int init_module(void) { return mfm_init(); @@ -1519,6 +1509,7 @@ outw (0, mfm_irqenable); /* Required to enable IRQs from MFM podule */ free_irq(mfm_irq, NULL); unregister_blkdev(MAJOR_NR, "mfm"); + del_gendisk(&mfm_gendisk); if (ecs) ecard_release(ecs); if (mfm_addr) |