summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorJames Simmons <jsimmons@maxwell.earthlink.net>2002-07-21 20:42:48 -0700
committerJames Simmons <jsimmons@maxwell.earthlink.net>2002-07-21 20:42:48 -0700
commit975f679b6b9e7321503694de9ea739280374f741 (patch)
tree36b1f6247ba050ad7406166d0ff1ca499344cfd6 /drivers/block
parent9a56acef9e6203b444a956d7e45a49a91cefbfb0 (diff)
parent4872eaccd9c1926c2e047abd761a1076eb7c4d11 (diff)
Merge http://linus.bkbits.net/linux-2.5
into maxwell.earthlink.net:/tmp/linus-2.5
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/DAC960.c37
-rw-r--r--drivers/block/acsi.c46
-rw-r--r--drivers/block/ataflop.c6
-rw-r--r--drivers/block/blkpg.c66
-rw-r--r--drivers/block/cciss.c37
-rw-r--r--drivers/block/cpqarray.c15
-rw-r--r--drivers/block/floppy.c6
-rw-r--r--drivers/block/genhd.c26
-rw-r--r--drivers/block/ll_rw_blk.c11
-rw-r--r--drivers/block/loop.c4
-rw-r--r--drivers/block/paride/Makefile16
-rw-r--r--drivers/block/paride/aten.c53
-rw-r--r--drivers/block/paride/bpck.c55
-rw-r--r--drivers/block/paride/bpck6.c71
-rw-r--r--drivers/block/paride/comm.c53
-rw-r--r--drivers/block/paride/dstr.c53
-rw-r--r--drivers/block/paride/epat.c54
-rw-r--r--drivers/block/paride/epia.c55
-rw-r--r--drivers/block/paride/fit2.c53
-rw-r--r--drivers/block/paride/fit3.c53
-rw-r--r--drivers/block/paride/friq.c54
-rw-r--r--drivers/block/paride/frpw.c54
-rw-r--r--drivers/block/paride/kbic.c92
-rw-r--r--drivers/block/paride/ktti.c53
-rw-r--r--drivers/block/paride/on20.c53
-rw-r--r--drivers/block/paride/on26.c55
-rw-r--r--drivers/block/paride/paride.c133
-rw-r--r--drivers/block/paride/pcd.c124
-rw-r--r--drivers/block/paride/pd.c251
-rw-r--r--drivers/block/paride/pf.c110
-rw-r--r--drivers/block/paride/pg.c107
-rw-r--r--drivers/block/paride/pt.c116
-rw-r--r--drivers/block/ps2esdi.c67
-rw-r--r--drivers/block/rd.c6
-rw-r--r--drivers/block/umem.c91
-rw-r--r--drivers/block/xd.c64
-rw-r--r--drivers/block/xd.h1
37 files changed, 791 insertions, 1410 deletions
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c
index 210449ad1715..dc372aa4dbb1 100644
--- a/drivers/block/DAC960.c
+++ b/drivers/block/DAC960.c
@@ -2055,29 +2055,20 @@ static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
static void DAC960_RegisterDisk(DAC960_Controller_T *Controller,
int LogicalDriveNumber)
{
- if (Controller->FirmwareType == DAC960_V1_Controller)
- {
+ long size;
+ if (Controller->FirmwareType == DAC960_V1_Controller) {
if (LogicalDriveNumber > Controller->LogicalDriveCount - 1) return;
- register_disk(&Controller->GenericDiskInfo,
- DAC960_KernelDevice(Controller->ControllerNumber,
- LogicalDriveNumber, 0),
- DAC960_MaxPartitions,
- &DAC960_BlockDeviceOperations,
- Controller->V1.LogicalDriveInformation
- [LogicalDriveNumber].LogicalDriveSize);
- }
- else
- {
+ size = Controller->V1.LogicalDriveInformation
+ [LogicalDriveNumber].LogicalDriveSize;
+ } else {
DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
if (LogicalDeviceInfo == NULL) return;
- register_disk(&Controller->GenericDiskInfo,
- DAC960_KernelDevice(Controller->ControllerNumber,
- LogicalDriveNumber, 0),
- DAC960_MaxPartitions,
- &DAC960_BlockDeviceOperations,
- LogicalDeviceInfo->ConfigurableDeviceSize);
- }
+ size = LogicalDeviceInfo->ConfigurableDeviceSize;
+ }
+ register_disk(&Controller->GenericDiskInfo,
+ DAC960_KernelDevice(Controller->ControllerNumber, LogicalDriveNumber, 0),
+ DAC960_MaxPartitions, &DAC960_BlockDeviceOperations, size);
}
@@ -5399,15 +5390,9 @@ static int DAC960_IOCTL(Inode_T *Inode, File_T *File,
LogicalDeviceInfo->ConfigurableDeviceSize
/ (Geometry.heads * Geometry.sectors);
}
- Geometry.start = get_start_sect(Inode->i_rdev);
+ Geometry.start = get_start_sect(Inode->i_bdev);
return (copy_to_user(UserGeometry, &Geometry,
sizeof(DiskGeometry_T)) ? -EFAULT : 0);
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKFLSBUF:
- case BLKBSZGET:
- case BLKBSZSET:
- return blk_ioctl(Inode->i_bdev, Request, Argument);
case BLKRRPART:
/* Re-Read Partition Table. */
diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c
index c35ef7f77e40..f616f01847b7 100644
--- a/drivers/block/acsi.c
+++ b/drivers/block/acsi.c
@@ -248,8 +248,6 @@ static int NDevices = 0;
static int acsi_sizes[MAX_DEV<<4] = { 0, };
static struct hd_struct acsi_part[MAX_DEV<<4] = { {0,0}, };
static int access_count[MAX_DEV] = { 0, };
-static char busy[MAX_DEV] = { 0, };
-static DECLARE_WAIT_QUEUE_HEAD(busy_wait);
static int CurrentNReq;
static int CurrentNSect;
@@ -1107,7 +1105,7 @@ static int acsi_ioctl( struct inode *inode, struct file *file,
put_user( 64, &geo->heads );
put_user( 32, &geo->sectors );
put_user( acsi_info[dev].size >> 11, &geo->cylinders );
- put_user(get_start_sect(inode->i_rdev), &geo->start);
+ put_user(get_start_sect(inode->i_bdev), &geo->start);
return 0;
}
@@ -1118,14 +1116,6 @@ static int acsi_ioctl( struct inode *inode, struct file *file,
put_user( 0, &((Scsi_Idlun *) arg)->host_unique_id );
return 0;
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
-
case BLKRRPART: /* Re-read partition tables */
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
@@ -1161,8 +1151,6 @@ static int acsi_open( struct inode * inode, struct file * filp )
if (device >= NDevices)
return -ENXIO;
aip = &acsi_info[device];
- while (busy[device])
- sleep_on(&busy_wait);
if (access_count[device] == 0 && aip->removable) {
#if 0
@@ -1803,10 +1791,6 @@ void cleanup_module(void)
}
#endif
-#define DEVICE_BUSY busy[device]
-#define USAGE access_count[device]
-#define GENDISK_STRUCT acsi_gendisk
-
/*
* This routine is called to flush all partitions and partition tables
* for a changed scsi disk, and then re-read the new partition table.
@@ -1828,24 +1812,15 @@ void cleanup_module(void)
static int revalidate_acsidisk( int dev, int maxusage )
{
- int device;
- struct gendisk * gdev;
- int res;
- struct acsi_info_struct *aip;
-
- device = DEVICE_NR(minor(dev));
- aip = &acsi_info[device];
- gdev = &GENDISK_STRUCT;
+ int unit = DEVICE_NR(minor(dev));
+ struct acsi_info_struct *aip = &acsi_info[unit];
+ kdev_t device = mk_kdev(MAJOR_NR, unit<<4);
+ int res = dev_lock_part(device);
- cli();
- if (DEVICE_BUSY || USAGE > maxusage) {
- sti();
- return -EBUSY;
- };
- DEVICE_BUSY = 1;
- sti();
+ if (res < 0)
+ return res;
- res = wipe_partitions(dev);
+ res = wipe_partitions(device);
stdma_lock( NULL, NULL );
@@ -1862,10 +1837,9 @@ static int revalidate_acsidisk( int dev, int maxusage )
stdma_release();
if (!res)
- grok_partitions(dev, aip->size);
+ grok_partitions(device, aip->size);
- DEVICE_BUSY = 0;
- wake_up(&busy_wait);
+ dev_unlock_part(device);
return res;
}
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index af8f966f4eb3..04a8ce00c6a7 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -1559,12 +1559,6 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
struct floppy_struct setprm;
device = inode->i_rdev;
- switch (cmd) {
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- return blk_ioctl(inode->i_bdev, cmd, param);
- }
drive = minor (device);
type = drive >> 2;
drive &= 3;
diff --git a/drivers/block/blkpg.c b/drivers/block/blkpg.c
index 37e244777963..83826af84b6a 100644
--- a/drivers/block/blkpg.c
+++ b/drivers/block/blkpg.c
@@ -69,8 +69,9 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p)
struct gendisk *g;
long long ppstart, pplength;
long pstart, plength;
- int i, drive, first_minor, end_minor, minor;
+ int i;
kdev_t dev = to_kdev_t(bdev->bd_dev);
+ struct hd_struct *part;
/* convert bytes to sectors, check for fit in a hd_struct */
ppstart = (p->start >> 9);
@@ -85,37 +86,32 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p)
g = get_gendisk(dev);
if (!g)
return -ENXIO;
+ part = g->part + minor(dev);
/* existing drive? */
- drive = (minor(dev) >> g->minor_shift);
- first_minor = (drive << g->minor_shift);
- end_minor = first_minor + (1 << g->minor_shift);
- if (drive >= g->nr_real)
- return -ENXIO;
/* drive and partition number OK? */
- if (first_minor != minor(dev))
+ if (bdev != bdev->bd_contains)
return -EINVAL;
if (p->pno <= 0 || p->pno >= (1 << g->minor_shift))
return -EINVAL;
/* partition number in use? */
- minor = first_minor + p->pno;
- if (g->part[minor].nr_sects != 0)
+ if (part[p->pno].nr_sects != 0)
return -EBUSY;
/* overlap? */
- for (i=first_minor+1; i<end_minor; i++)
- if (!(pstart+plength <= g->part[i].start_sect ||
- pstart >= g->part[i].start_sect + g->part[i].nr_sects))
+ for (i = 1; i < (1<<g->minor_shift); i++)
+ if (!(pstart+plength <= part[i].start_sect ||
+ pstart >= part[i].start_sect + part[i].nr_sects))
return -EBUSY;
/* all seems OK */
- g->part[minor].start_sect = pstart;
- g->part[minor].nr_sects = plength;
+ part[p->pno].start_sect = pstart;
+ part[p->pno].nr_sects = plength;
if (g->sizes)
- g->sizes[minor] = (plength >> (BLOCK_SIZE_BITS - 9));
- devfs_register_partitions (g, first_minor, 0);
+ g->sizes[minor(dev)+p->pno] = (plength >> (BLOCK_SIZE_BITS-9));
+ devfs_register_partitions (g, minor(dev), 0);
return 0;
}
@@ -133,33 +129,27 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p)
{
kdev_t dev = to_kdev_t(bdev->bd_dev);
struct gendisk *g;
- kdev_t devp;
struct block_device *bdevp;
- int drive, first_minor, minor;
+ struct hd_struct *part;
int holder;
/* find the drive major */
g = get_gendisk(dev);
if (!g)
return -ENXIO;
+ part = g->part + minor(dev);
- /* drive and partition number OK? */
- drive = (minor(dev) >> g->minor_shift);
- first_minor = (drive << g->minor_shift);
-
- if (first_minor != minor(dev))
+ if (bdev != bdev->bd_contains)
return -EINVAL;
if (p->pno <= 0 || p->pno >= (1 << g->minor_shift))
return -EINVAL;
/* existing drive and partition? */
- minor = first_minor + p->pno;
- if (drive >= g->nr_real || g->part[minor].nr_sects == 0)
+ if (part[p->pno].nr_sects == 0)
return -ENXIO;
/* partition in use? Incomplete check for now. */
- devp = mk_kdev(major(dev), minor);
- bdevp = bdget(kdev_t_to_nr(devp));
+ bdevp = bdget(MKDEV(major(dev), minor(dev) + p->pno));
if (!bdevp)
return -ENOMEM;
if (bd_claim(bdevp, &holder) < 0) {
@@ -171,11 +161,11 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p)
fsync_bdev(bdevp);
invalidate_bdev(bdevp, 0);
- g->part[minor].start_sect = 0;
- g->part[minor].nr_sects = 0;
+ part[p->pno].start_sect = 0;
+ part[p->pno].nr_sects = 0;
if (g->sizes)
- g->sizes[minor] = 0;
- devfs_register_partitions (g, first_minor, 0);
+ g->sizes[minor(dev) + p->pno] = 0;
+ devfs_register_partitions (g, minor(dev), 0);
bd_release(bdevp);
bdput(bdevp);
@@ -223,10 +213,6 @@ int blk_ioctl(struct block_device *bdev, unsigned int cmd, unsigned long arg)
int holder;
struct backing_dev_info *bdi;
- intval = block_ioctl(bdev, cmd, arg);
- if (intval != -ENOTTY)
- return intval;
-
switch (cmd) {
case BLKROSET:
if (!capable(CAP_SYS_ADMIN))
@@ -296,14 +282,6 @@ int blk_ioctl(struct block_device *bdev, unsigned int cmd, unsigned long arg)
case BLKPG:
return blkpg_ioctl(bdev, (struct blkpg_ioctl_arg *) arg);
-
- /*
- * deprecated, use the /proc/iosched interface instead
- */
- case BLKELVGET:
- case BLKELVSET:
- return -ENOTTY;
-
case BLKBSZGET:
/* get the logical block size (cf. BLKSSZGET) */
intval = block_size(bdev);
@@ -330,5 +308,3 @@ int blk_ioctl(struct block_device *bdev, unsigned int cmd, unsigned long arg)
return -EINVAL;
}
}
-
-EXPORT_SYMBOL(blk_ioctl);
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index e06fd274b653..939d70269415 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -440,15 +440,6 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
case BLKRRPART:
return revalidate_logvol(inode->i_rdev, 1);
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKFLSBUF:
- case BLKBSZSET:
- case BLKBSZGET:
- case BLKROSET:
- case BLKROGET:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
case CCISS_GETPCIINFO:
{
cciss_pci_info_struct pciinfo;
@@ -735,6 +726,10 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
}
/* Borrowed and adapted from sd.c */
+/*
+ * FIXME: we are missing the exclusion with ->open() here - it can happen
+ * just as we are rereading partition tables.
+ */
static int revalidate_logvol(kdev_t dev, int maxusage)
{
int ctlr, target;
@@ -860,18 +855,9 @@ static int deregister_disk(int ctlr, int logvol)
/* invalidate the devices and deregister the disk */
max_p = 1 << gdev->minor_shift;
start = logvol << gdev->minor_shift;
+ wipe_partitions(mk_kdev(MAJOR_NR+ctlr, start));
for (i=max_p-1; i>=0; i--)
- {
- int minor = start+i;
- kdev_t kdev = mk_kdev(MAJOR_NR+ctlr, minor);
- // printk("invalidating( %d %d)\n", ctlr, minor);
- invalidate_device(kdev, 1);
- /* so open will now fail */
- h->sizes[minor] = 0;
- /* so it will no longer appear in /proc/partitions */
- gdev->part[minor].start_sect = 0;
- gdev->part[minor].nr_sects = 0;
- }
+ h->sizes[start + i] = 0;
/* check to see if it was the last disk */
if (logvol == h->highest_lun)
{
@@ -1313,19 +1299,12 @@ static int register_new_disk(kdev_t dev, int ctlr)
hba[ctlr]->drv[logvol].usage_count = 0;
max_p = 1 << gdev->minor_shift;
start = logvol<< gdev->minor_shift;
+ kdev = mk_kdev(MAJOR_NR + ctlr, logvol<< gdev->minor_shift);
- for(i=max_p-1; i>=0; i--) {
- int minor = start+i;
- kdev = mk_kdev(MAJOR_NR + ctlr, minor);
- invalidate_device(kdev, 1);
- gdev->part[minor].start_sect = 0;
- gdev->part[minor].nr_sects = 0;
- }
-
+ wipe_partitions(kdev);
++hba[ctlr]->num_luns;
gdev->nr_real = hba[ctlr]->highest_lun + 1;
/* setup partitions per disk */
- kdev = mk_kdev(MAJOR_NR + ctlr, logvol<< gdev->minor_shift);
grok_partitions(kdev, hba[ctlr]->drv[logvol].nr_blocks);
kfree(ld_buff);
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index fccef1bb792c..31276ef0e87c 100644
--- a/drivers/block/cpqarray.c
+++ b/drivers/block/cpqarray.c
@@ -1116,7 +1116,7 @@ static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
put_user(diskinfo[0], &geo->heads);
put_user(diskinfo[1], &geo->sectors);
put_user(diskinfo[2], &geo->cylinders);
- put_user(get_start_sect(inode->i_rdev), &geo->start);
+ put_user(get_start_sect(inode->i_bdev), &geo->start);
return 0;
case IDAGETDRVINFO:
if (copy_to_user(&io->c.drv, &hba[ctlr]->drv[dsk],
@@ -1157,16 +1157,6 @@ static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
return(0);
}
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKFLSBUF:
- case BLKBSZSET:
- case BLKBSZGET:
- case BLKROSET:
- case BLKROGET:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
-
default:
return -EINVAL;
}
@@ -1533,6 +1523,9 @@ static int revalidate_allvol(kdev_t dev)
}
/* Borrowed and adapted from sd.c */
+/*
+ * FIXME: exclusion with ->open()
+ */
static int revalidate_logvol(kdev_t dev, int maxusage)
{
int ctlr, target;
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index aff8acff0ef3..fdc6e904464a 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -3468,12 +3468,6 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
const char *outparam; /* parameters passed back to user space */
device = inode->i_rdev;
- switch (cmd) {
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- return blk_ioctl(inode->i_bdev, cmd, param);
- }
type = TYPE(device);
drive = DRIVE(device);
diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c
index 7c30fbe37c16..0fc011f610d1 100644
--- a/drivers/block/genhd.c
+++ b/drivers/block/genhd.c
@@ -117,31 +117,6 @@ get_gendisk(kdev_t dev)
EXPORT_SYMBOL(get_gendisk);
-
-unsigned long
-get_start_sect(kdev_t dev)
-{
- struct gendisk *gp;
-
- gp = get_gendisk(dev);
- if (gp)
- return gp->part[minor(dev)].start_sect;
- return 0;
-}
-
-EXPORT_SYMBOL(get_start_sect);
-
-unsigned long
-get_nr_sects(kdev_t dev)
-{
- struct gendisk *gp;
-
- gp = get_gendisk(dev);
- if (gp)
- return gp->part[minor(dev)].nr_sects;
- return 0;
-}
-
#ifdef CONFIG_PROC_FS
/* iterator */
static void *part_start(struct seq_file *part, loff_t *pos)
@@ -209,7 +184,6 @@ int __init device_init(void)
{
rwlock_init(&gendisk_lock);
blk_dev_init();
- sti();
#ifdef CONFIG_I2O
i2o_init();
#endif
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index 48616f94f5ee..c23f57a0ed16 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -1573,16 +1573,10 @@ end_io:
static inline void blk_partition_remap(struct bio *bio)
{
struct block_device *bdev = bio->bi_bdev;
- struct gendisk *g;
-
if (bdev == bdev->bd_contains)
return;
- g = get_gendisk(to_kdev_t(bdev->bd_dev));
- if (!g)
- BUG();
-
- bio->bi_sector += g->part[minor(to_kdev_t((bdev->bd_dev)))].start_sect;
+ bio->bi_sector += bdev->bd_offset;
bio->bi_bdev = bdev->bd_contains;
/* lots of checks are possible */
}
@@ -2047,9 +2041,6 @@ int __init blk_dev_init(void)
#if defined(CONFIG_IDE) && defined(CONFIG_BLK_DEV_HD)
hd_init();
#endif
-#if defined(__i386__) /* Do we even need this? */
- outb_p(0xc, 0x3f2);
-#endif
return 0;
};
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 982604ff6bfd..50c1052cae74 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -912,10 +912,6 @@ static int lo_ioctl(struct inode * inode, struct file * file,
}
err = put_user((u64)loop_sizes[lo->lo_number] << 10, (u64*)arg);
break;
- case BLKBSZGET:
- case BLKBSZSET:
- err = blk_ioctl(inode->i_bdev, cmd, arg);
- break;
default:
err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL;
}
diff --git a/drivers/block/paride/Makefile b/drivers/block/paride/Makefile
index d62c39cb9b55..b1294e64f414 100644
--- a/drivers/block/paride/Makefile
+++ b/drivers/block/paride/Makefile
@@ -5,14 +5,9 @@
# Rewritten to use lists instead of if-statements.
#
-export-objs := paride.o bpck6.o
+export-objs := paride.o
obj-$(CONFIG_PARIDE) += paride.o
-obj-$(CONFIG_PARIDE_PD) += pd.o
-obj-$(CONFIG_PARIDE_PCD) += pcd.o
-obj-$(CONFIG_PARIDE_PF) += pf.o
-obj-$(CONFIG_PARIDE_PT) += pt.o
-obj-$(CONFIG_PARIDE_PG) += pg.o
obj-$(CONFIG_PARIDE_ATEN) += aten.o
obj-$(CONFIG_PARIDE_BPCK) += bpck.o
obj-$(CONFIG_PARIDE_COMM) += comm.o
@@ -20,13 +15,18 @@ obj-$(CONFIG_PARIDE_DSTR) += dstr.o
obj-$(CONFIG_PARIDE_KBIC) += kbic.o
obj-$(CONFIG_PARIDE_EPAT) += epat.o
obj-$(CONFIG_PARIDE_EPIA) += epia.o
-obj-$(CONFIG_PARIDE_FIT2) += fit2.o
-obj-$(CONFIG_PARIDE_FIT3) += fit3.o
obj-$(CONFIG_PARIDE_FRPW) += frpw.o
obj-$(CONFIG_PARIDE_FRIQ) += friq.o
+obj-$(CONFIG_PARIDE_FIT2) += fit2.o
+obj-$(CONFIG_PARIDE_FIT3) += fit3.o
obj-$(CONFIG_PARIDE_ON20) += on20.o
obj-$(CONFIG_PARIDE_ON26) += on26.o
obj-$(CONFIG_PARIDE_KTTI) += ktti.o
obj-$(CONFIG_PARIDE_BPCK6) += bpck6.o
+obj-$(CONFIG_PARIDE_PD) += pd.o
+obj-$(CONFIG_PARIDE_PCD) += pcd.o
+obj-$(CONFIG_PARIDE_PF) += pf.o
+obj-$(CONFIG_PARIDE_PT) += pt.o
+obj-$(CONFIG_PARIDE_PG) += pg.o
include $(TOPDIR)/Rules.make
diff --git a/drivers/block/paride/aten.c b/drivers/block/paride/aten.c
index b22d34da348a..763fc50d7f76 100644
--- a/drivers/block/paride/aten.c
+++ b/drivers/block/paride/aten.c
@@ -18,6 +18,7 @@
#define ATEN_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/wait.h>
@@ -140,35 +141,33 @@ static void aten_release_proto( PIA *pi )
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol aten = {"aten",0,2,2,1,1,
- aten_write_regr,
- aten_read_regr,
- aten_write_block,
- aten_read_block,
- aten_connect,
- aten_disconnect,
- 0,
- 0,
- 0,
- aten_log_adapter,
- aten_init_proto,
- aten_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &aten ) - 1;
+static struct pi_protocol aten = {
+ .name = "aten",
+ .max_mode = 2,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = aten_write_regr,
+ .read_regr = aten_read_regr,
+ .write_block = aten_write_block,
+ .read_block = aten_read_block,
+ .connect = aten_connect,
+ .disconnect = aten_disconnect,
+ .log_adapter = aten_log_adapter,
+ .init_proto = aten_init_proto,
+ .release_proto = aten_release_proto,
+};
+
+static int __init aten_init(void)
+{
+ return pi_register(&aten)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &aten );
+static void __exit aten_exit(void)
+{
+ pi_unregister( &aten );
}
-#endif
-
-/* end of aten.c */
MODULE_LICENSE("GPL");
+module_init(aten_init)
+module_exit(aten_exit)
diff --git a/drivers/block/paride/bpck.c b/drivers/block/paride/bpck.c
index 3e20e6b7054a..b15ff97fe7af 100644
--- a/drivers/block/paride/bpck.c
+++ b/drivers/block/paride/bpck.c
@@ -17,6 +17,7 @@
#define BPCK_VERSION "1.02"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -452,34 +453,36 @@ static void bpck_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol bpck = { "bpck",0,5,2,4,256,
- bpck_write_regr,
- bpck_read_regr,
- bpck_write_block,
- bpck_read_block,
- bpck_connect,
- bpck_disconnect,
- bpck_test_port,
- bpck_probe_unit,
- bpck_test_proto,
- bpck_log_adapter,
- bpck_init_proto,
- bpck_release_proto
- };
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register(&bpck) - 1;
+static struct pi_protocol bpck = {
+ .name = "bpck",
+ .max_mode = 5,
+ .epp_first = 2,
+ .default_delay = 4,
+ .max_units = 255,
+ .write_regr = bpck_write_regr,
+ .read_regr = bpck_read_regr,
+ .write_block = bpck_write_block,
+ .read_block = bpck_read_block,
+ .connect = bpck_connect,
+ .disconnect = bpck_disconnect,
+ .test_port = bpck_test_port,
+ .probe_unit = bpck_probe_unit,
+ .test_proto = bpck_test_proto,
+ .log_adapter = bpck_log_adapter,
+ .init_proto = bpck_init_proto,
+ .release_proto = bpck_release_proto,
+};
+
+static int __init bpck_init(void)
+{
+ return pi_register(&bpck)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister(&bpck);
+static void __exit bpck_exit(void)
+{
+ pi_unregister(&bpck);
}
-#endif
-
-/* end of bpck.c */
MODULE_LICENSE("GPL");
+module_init(bpck_init)
+module_exit(bpck_exit)
diff --git a/drivers/block/paride/bpck6.c b/drivers/block/paride/bpck6.c
index f2febfcfd268..c1fcdd9f4e94 100644
--- a/drivers/block/paride/bpck6.c
+++ b/drivers/block/paride/bpck6.c
@@ -26,6 +26,7 @@ int verbose=0; /* set this to 1 to see debugging messages and whatnot */
#define BACKPACK_VERSION "2.0.2"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
@@ -252,65 +253,41 @@ static void bpck6_release_proto(PIA *pi)
kfree((void *)(pi->private));
}
-struct pi_protocol bpck6 = { "bpck6", /* name for proto*/
- 0, /* index into proto table */
- 5, /* max mode =5 */
- 2, /* 2-5 use epp (need 8 ports) */
- 0, /* no delay (not used anyway) */
- 255, /* we can have units up to 255 */
- bpck6_write_regr,
- bpck6_read_regr,
- bpck6_write_block,
- bpck6_read_block,
- bpck6_connect,
- bpck6_disconnect,
- bpck6_test_port,
- bpck6_probe_unit,
- 0,
- bpck6_log_adapter,
- bpck6_init_proto,
- bpck6_release_proto
- };
-
-
-EXPORT_SYMBOL(bpck6_write_regr);
-EXPORT_SYMBOL(bpck6_read_regr);
-EXPORT_SYMBOL(bpck6_write_block);
-EXPORT_SYMBOL(bpck6_read_block);
-EXPORT_SYMBOL(bpck6_connect);
-EXPORT_SYMBOL(bpck6_disconnect);
-EXPORT_SYMBOL(bpck6_test_port);
-EXPORT_SYMBOL(bpck6_probe_unit);
-EXPORT_SYMBOL(bpck6_log_adapter);
-EXPORT_SYMBOL(bpck6_init_proto);
-EXPORT_SYMBOL(bpck6_release_proto);
-
-/*---------------------------MODULE STUFF-----------------------*/
-
-#ifdef MODULE
-/*module information*/
-
-static int init_module(void)
+static struct pi_protocol bpck6 = {
+ .name = "bpck6",
+ .max_mode = 5,
+ .epp_first = 2, /* 2-5 use epp (need 8 ports) */
+ .max_units = 255,
+ .write_regr = bpck6_write_regr,
+ .read_regr = bpck6_read_regr,
+ .write_block = bpck6_write_block,
+ .read_block = bpck6_read_block,
+ .connect = bpck6_connect,
+ .disconnect = bpck6_disconnect,
+ .test_port = bpck6_test_port,
+ .probe_unit = bpck6_probe_unit,
+ .log_adapter = bpck6_log_adapter,
+ .init_proto = bpck6_init_proto,
+ .release_proto = bpck6_release_proto,
+};
+
+static int __init bpck6_init(void)
{
printk(KERN_INFO "bpck6: BACKPACK Protocol Driver V"BACKPACK_VERSION"\n");
printk(KERN_INFO "bpck6: Copyright 2001 by Micro Solutions, Inc., DeKalb IL. USA\n");
-
if(verbose)
- {
printk(KERN_DEBUG "bpck6: verbose debug enabled.\n");
- }
-
return pi_register(&bpck6) - 1;
}
-void cleanup_module(void)
+static void __exit bpck6_exit(void)
{
pi_unregister(&bpck6);
}
+MODULE_LICENSE("GPL");
MODULE_AUTHOR("Micro Solutions Inc.");
MODULE_DESCRIPTION("BACKPACK Protocol module, compatible with PARIDE");
MODULE_PARM(verbose,"i");
-
-#endif
-
+module_init(bpck6_init)
+module_exit(bpck6_exit)
diff --git a/drivers/block/paride/comm.c b/drivers/block/paride/comm.c
index 058a7d68572c..f3010d6fc73b 100644
--- a/drivers/block/paride/comm.c
+++ b/drivers/block/paride/comm.c
@@ -17,6 +17,7 @@
#define COMM_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -196,35 +197,33 @@ static void comm_release_proto(PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol comm = {"comm",0,5,2,1,1,
- comm_write_regr,
- comm_read_regr,
- comm_write_block,
- comm_read_block,
- comm_connect,
- comm_disconnect,
- 0,
- 0,
- 0,
- comm_log_adapter,
- comm_init_proto,
- comm_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &comm ) - 1;
+static struct pi_protocol comm = {
+ .name = "comm",
+ .max_mode = 5,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = comm_write_regr,
+ .read_regr = comm_read_regr,
+ .write_block = comm_write_block,
+ .read_block = comm_read_block,
+ .connect = comm_connect,
+ .disconnect = comm_disconnect,
+ .log_adapter = comm_log_adapter,
+ .init_proto = comm_init_proto,
+ .release_proto = comm_release_proto,
+};
+
+static int __init comm_init(void)
+{
+ return pi_register(&comm)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &comm );
+static void __exit comm_exit(void)
+{
+ pi_unregister(&comm);
}
-#endif
-
-/* end of comm.c */
MODULE_LICENSE("GPL");
+module_init(comm_init)
+module_exit(comm_exit)
diff --git a/drivers/block/paride/dstr.c b/drivers/block/paride/dstr.c
index 438735b6ce10..204fe75df233 100644
--- a/drivers/block/paride/dstr.c
+++ b/drivers/block/paride/dstr.c
@@ -16,6 +16,7 @@
#define DSTR_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -211,35 +212,33 @@ static void dstr_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol dstr = {"dstr",0,5,2,1,1,
- dstr_write_regr,
- dstr_read_regr,
- dstr_write_block,
- dstr_read_block,
- dstr_connect,
- dstr_disconnect,
- 0,
- 0,
- 0,
- dstr_log_adapter,
- dstr_init_proto,
- dstr_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &dstr ) - 1;
+static struct pi_protocol dstr = {
+ .name = "dstr",
+ .max_mode = 5,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = dstr_write_regr,
+ .read_regr = dstr_read_regr,
+ .write_block = dstr_write_block,
+ .read_block = dstr_read_block,
+ .connect = dstr_connect,
+ .disconnect = dstr_disconnect,
+ .log_adapter = dstr_log_adapter,
+ .init_proto = dstr_init_proto,
+ .release_proto = dstr_release_proto,
+};
+
+static int __init dstr_init(void)
+{
+ return pi_register(&dstr)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &dstr );
+static void __exit dstr_exit(void)
+{
+ pi_unregister(&dstr);
}
-#endif
-
-/* end of dstr.c */
MODULE_LICENSE("GPL");
+module_init(dstr_init)
+module_exit(dstr_exit)
diff --git a/drivers/block/paride/epat.c b/drivers/block/paride/epat.c
index 624a5ba32cfd..0a7126756371 100644
--- a/drivers/block/paride/epat.c
+++ b/drivers/block/paride/epat.c
@@ -19,6 +19,7 @@
#define EPAT_VERSION "1.02"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -311,35 +312,34 @@ static void epat_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol epat = {"epat",0,6,3,1,1,
- epat_write_regr,
- epat_read_regr,
- epat_write_block,
- epat_read_block,
- epat_connect,
- epat_disconnect,
- 0,
- 0,
- epat_test_proto,
- epat_log_adapter,
- epat_init_proto,
- epat_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &epat) - 1;
+static struct pi_protocol epat = {
+ .name = "epat",
+ .max_mode = 6,
+ .epp_first = 3,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = epat_write_regr,
+ .read_regr = epat_read_regr,
+ .write_block = epat_write_block,
+ .read_block = epat_read_block,
+ .connect = epat_connect,
+ .disconnect = epat_disconnect,
+ .test_proto = epat_test_proto,
+ .log_adapter = epat_log_adapter,
+ .init_proto = epat_init_proto,
+ .release_proto = epat_release_proto,
+};
+
+static int __init epat_init(void)
+{
+ return pi_register(&epat)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &epat);
+static void __exit epat_exit(void)
+{
+ pi_unregister(&epat);
}
-#endif
-
-/* end of epat.c */
MODULE_LICENSE("GPL");
+module_init(epat_init)
+module_exit(epat_exit)
diff --git a/drivers/block/paride/epia.c b/drivers/block/paride/epia.c
index c27edd64ecc1..c2728af843dd 100644
--- a/drivers/block/paride/epia.c
+++ b/drivers/block/paride/epia.c
@@ -20,6 +20,7 @@
#define EPIA_VERSION "1.02"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -293,36 +294,34 @@ static void epia_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol epia = {"epia",0,6,3,1,1,
- epia_write_regr,
- epia_read_regr,
- epia_write_block,
- epia_read_block,
- epia_connect,
- epia_disconnect,
- 0,
- 0,
- epia_test_proto,
- epia_log_adapter,
- epia_init_proto,
- epia_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &epia ) - 1;
+static struct pi_protocol epia = {
+ .name = "epia",
+ .max_mode = 6,
+ .epp_first = 3,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = epia_write_regr,
+ .read_regr = epia_read_regr,
+ .write_block = epia_write_block,
+ .read_block = epia_read_block,
+ .connect = epia_connect,
+ .disconnect = epia_disconnect,
+ .test_proto = epia_test_proto,
+ .log_adapter = epia_log_adapter,
+ .init_proto = epia_init_proto,
+ .release_proto = epia_release_proto,
+};
+
+static int __init epia_init(void)
+{
+ return pi_register(&epia)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &epia );
+static void __exit epia_exit(void)
+{
+ pi_unregister(&epia);
}
-#endif
-
-/* end of epia.c */
-
MODULE_LICENSE("GPL");
+module_init(epia_init)
+module_exit(epia_exit)
diff --git a/drivers/block/paride/fit2.c b/drivers/block/paride/fit2.c
index 7f45529c80b1..42b2880a82ac 100644
--- a/drivers/block/paride/fit2.c
+++ b/drivers/block/paride/fit2.c
@@ -16,6 +16,7 @@
#define FIT2_VERSION "1.0"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -129,35 +130,33 @@ static void fit2_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol fit2 = {"fit2",0,1,2,1,1,
- fit2_write_regr,
- fit2_read_regr,
- fit2_write_block,
- fit2_read_block,
- fit2_connect,
- fit2_disconnect,
- 0,
- 0,
- 0,
- fit2_log_adapter,
- fit2_init_proto,
- fit2_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &fit2 ) - 1;
+static struct pi_protocol fit2 = {
+ .name = "fit2",
+ .max_mode = 1,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = fit2_write_regr,
+ .read_regr = fit2_read_regr,
+ .write_block = fit2_write_block,
+ .read_block = fit2_read_block,
+ .connect = fit2_connect,
+ .disconnect = fit2_disconnect,
+ .log_adapter = fit2_log_adapter,
+ .init_proto = fit2_init_proto,
+ .release_proto = fit2_release_proto,
+};
+
+static int __init fit2_init(void)
+{
+ return pi_register(&fit2)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &fit2 );
+static void __exit fit2_exit(void)
+{
+ pi_unregister(&fit2);
}
-#endif
-
-/* end of fit2.c */
MODULE_LICENSE("GPL");
+module_init(fit2_init)
+module_exit(fit2_exit)
diff --git a/drivers/block/paride/fit3.c b/drivers/block/paride/fit3.c
index 8b5ad4bd5ad0..4d9286562c3c 100644
--- a/drivers/block/paride/fit3.c
+++ b/drivers/block/paride/fit3.c
@@ -20,6 +20,7 @@
#define FIT3_VERSION "1.0"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -189,35 +190,33 @@ static void fit3_release_proto(PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol fit3 = {"fit3",0,3,2,1,1,
- fit3_write_regr,
- fit3_read_regr,
- fit3_write_block,
- fit3_read_block,
- fit3_connect,
- fit3_disconnect,
- 0,
- 0,
- 0,
- fit3_log_adapter,
- fit3_init_proto,
- fit3_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &fit3 ) - 1;
+static struct pi_protocol fit3 = {
+ .name = "fit3",
+ .max_mode = 3,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = fit3_write_regr,
+ .read_regr = fit3_read_regr,
+ .write_block = fit3_write_block,
+ .read_block = fit3_read_block,
+ .connect = fit3_connect,
+ .disconnect = fit3_disconnect,
+ .log_adapter = fit3_log_adapter,
+ .init_proto = fit3_init_proto,
+ .release_proto = fit3_release_proto,
+};
+
+static int __init fit3_init(void)
+{
+ return pi_register(&fit3)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &fit3 );
+static void __exit fit3_exit(void)
+{
+ pi_unregister(&fit3);
}
-#endif
-
-/* end of fit3.c */
MODULE_LICENSE("GPL");
+module_init(fit3_init)
+module_exit(fit3_exit)
diff --git a/drivers/block/paride/friq.c b/drivers/block/paride/friq.c
index 74b2eaab1c19..10b994a456da 100644
--- a/drivers/block/paride/friq.c
+++ b/drivers/block/paride/friq.c
@@ -28,6 +28,7 @@
#define FRIQ_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -250,35 +251,34 @@ static void friq_release_proto( PIA *pi)
MOD_DEC_USE_COUNT;
}
-struct pi_protocol friq = {"friq",0,5,2,1,1,
- friq_write_regr,
- friq_read_regr,
- friq_write_block,
- friq_read_block,
- friq_connect,
- friq_disconnect,
- 0,
- 0,
- friq_test_proto,
- friq_log_adapter,
- friq_init_proto,
- friq_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &friq ) - 1;
+static struct pi_protocol friq = {
+ .name = "friq",
+ .max_mode = 5,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = friq_write_regr,
+ .read_regr = friq_read_regr,
+ .write_block = friq_write_block,
+ .read_block = friq_read_block,
+ .connect = friq_connect,
+ .disconnect = friq_disconnect,
+ .test_proto = friq_test_proto,
+ .log_adapter = friq_log_adapter,
+ .init_proto = friq_init_proto,
+ .release_proto = friq_release_proto,
+};
+
+static int __init friq_init(void)
+{
+ return pi_register(&friq)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &friq );
+static void __exit friq_exit(void)
+{
+ pi_unregister(&friq);
}
-#endif
-
-/* end of friq.c */
MODULE_LICENSE("GPL");
+module_init(friq_init)
+module_exit(friq_exit)
diff --git a/drivers/block/paride/frpw.c b/drivers/block/paride/frpw.c
index 817004a3f7dc..ee0cad3807a1 100644
--- a/drivers/block/paride/frpw.c
+++ b/drivers/block/paride/frpw.c
@@ -26,6 +26,7 @@
#define FRPW_VERSION "1.03"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -291,35 +292,34 @@ static void frpw_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol frpw = {"frpw",0,6,2,2,1,
- frpw_write_regr,
- frpw_read_regr,
- frpw_write_block,
- frpw_read_block,
- frpw_connect,
- frpw_disconnect,
- 0,
- 0,
- frpw_test_proto,
- frpw_log_adapter,
- frpw_init_proto,
- frpw_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &frpw ) - 1;
+static struct pi_protocol frpw = {
+ .name = "frpw",
+ .max_mode = 6,
+ .epp_first = 2,
+ .default_delay = 2,
+ .max_units = 1,
+ .write_regr = frpw_write_regr,
+ .read_regr = frpw_read_regr,
+ .write_block = frpw_write_block,
+ .read_block = frpw_read_block,
+ .connect = frpw_connect,
+ .disconnect = frpw_disconnect,
+ .test_proto = frpw_test_proto,
+ .log_adapter = frpw_log_adapter,
+ .init_proto = frpw_init_proto,
+ .release_proto = frpw_release_proto,
+};
+
+static int __init frpw_init(void)
+{
+ return pi_register(&frpw)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &frpw );
+static void __exit frpw_exit(void)
+{
+ pi_unregister(&frpw);
}
-#endif
-
-/* end of frpw.c */
MODULE_LICENSE("GPL");
+module_init(frpw_init)
+module_exit(frpw_exit)
diff --git a/drivers/block/paride/kbic.c b/drivers/block/paride/kbic.c
index 2f20c9b0fa4e..f97233b39b7b 100644
--- a/drivers/block/paride/kbic.c
+++ b/drivers/block/paride/kbic.c
@@ -21,6 +21,7 @@
#define KBIC_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -258,56 +259,51 @@ static void kbic_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol k951 = {"k951",0,6,3,1,1,
- kbic_write_regr,
- kbic_read_regr,
- kbic_write_block,
- kbic_read_block,
- k951_connect,
- k951_disconnect,
- 0,
- 0,
- 0,
- k951_log_adapter,
- kbic_init_proto,
- kbic_release_proto
- };
-
-
-struct pi_protocol k971 = {"k971",0,6,3,1,1,
- kbic_write_regr,
- kbic_read_regr,
- kbic_write_block,
- kbic_read_block,
- k971_connect,
- k971_disconnect,
- 0,
- 0,
- 0,
- k971_log_adapter,
- kbic_init_proto,
- kbic_release_proto
- };
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ int s5,s7;
-
- s5 = pi_register(&k951);
- s7 = pi_register(&k971);
-
- return (s5 || s7) - 1;
+static struct pi_protocol k951 = {
+ .name = "k951",
+ .max_mode = 6,
+ .epp_first = 3,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = kbic_write_regr,
+ .read_regr = kbic_read_regr,
+ .write_block = kbic_write_block,
+ .read_block = kbic_read_block,
+ .connect = k951_connect,
+ .disconnect = k951_disconnect,
+ .log_adapter = k951_log_adapter,
+ .init_proto = kbic_init_proto,
+ .release_proto = kbic_release_proto
+};
+
+static struct pi_protocol k971 = {
+ .name = "k971",
+ .max_mode = 6,
+ .epp_first = 3,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = kbic_write_regr,
+ .read_regr = kbic_read_regr,
+ .write_block = kbic_write_block,
+ .read_block = kbic_read_block,
+ .connect = k971_connect,
+ .disconnect = k971_disconnect,
+ .log_adapter = k971_log_adapter,
+ .init_proto = kbic_init_proto,
+ .release_proto = kbic_release_proto
+};
+
+static int __init kbic_init(void)
+{
+ return (pi_register(&k951)||pi_register(&k971))-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &k951 );
- pi_unregister( &k971 );
+static void __exit kbic_exit(void)
+{
+ pi_unregister(&k951);
+ pi_unregister(&k971);
}
-#endif
-
-/* end of kbic.c */
MODULE_LICENSE("GPL");
+module_init(kbic_init)
+module_exit(kbic_exit)
diff --git a/drivers/block/paride/ktti.c b/drivers/block/paride/ktti.c
index 60778192e0c1..bee083b4da9c 100644
--- a/drivers/block/paride/ktti.c
+++ b/drivers/block/paride/ktti.c
@@ -12,6 +12,7 @@
#define KTTI_VERSION "1.0"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -106,35 +107,33 @@ static void ktti_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol ktti = {"ktti",0,1,2,1,1,
- ktti_write_regr,
- ktti_read_regr,
- ktti_write_block,
- ktti_read_block,
- ktti_connect,
- ktti_disconnect,
- 0,
- 0,
- 0,
- ktti_log_adapter,
- ktti_init_proto,
- ktti_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &ktti ) - 1;
+static struct pi_protocol ktti = {
+ .name = "ktti",
+ .max_mode = 1,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = ktti_write_regr,
+ .read_regr = ktti_read_regr,
+ .write_block = ktti_write_block,
+ .read_block = ktti_read_block,
+ .connect = ktti_connect,
+ .disconnect = ktti_disconnect,
+ .log_adapter = ktti_log_adapter,
+ .init_proto = ktti_init_proto,
+ .release_proto = ktti_release_proto,
+};
+
+static int __init ktti_init(void)
+{
+ return pi_register(&ktti)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &ktti );
+static void __exit ktti_exit(void)
+{
+ pi_unregister(&ktti);
}
-#endif
-
-/* end of ktti.c */
MODULE_LICENSE("GPL");
+module_init(ktti_init)
+module_exit(ktti_exit)
diff --git a/drivers/block/paride/on20.c b/drivers/block/paride/on20.c
index b3c8d3d325e0..8528e0212591 100644
--- a/drivers/block/paride/on20.c
+++ b/drivers/block/paride/on20.c
@@ -15,6 +15,7 @@
#define ON20_VERSION "1.01"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -131,35 +132,33 @@ static void on20_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol on20 = {"on20",0,2,2,1,1,
- on20_write_regr,
- on20_read_regr,
- on20_write_block,
- on20_read_block,
- on20_connect,
- on20_disconnect,
- 0,
- 0,
- 0,
- on20_log_adapter,
- on20_init_proto,
- on20_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &on20 ) - 1;
+static struct pi_protocol on20 = {
+ .name = "on20",
+ .max_mode = 2,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = on20_write_regr,
+ .read_regr = on20_read_regr,
+ .write_block = on20_write_block,
+ .read_block = on20_read_block,
+ .connect = on20_connect,
+ .disconnect = on20_disconnect,
+ .log_adapter = on20_log_adapter,
+ .init_proto = on20_init_proto,
+ .release_proto = on20_release_proto,
+};
+
+static int __init on20_init(void)
+{
+ return pi_register(&on20)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &on20 );
+static void __exit on20_exit(void)
+{
+ pi_unregister(&on20);
}
-#endif
-
-/* end of on20.c */
MODULE_LICENSE("GPL");
+module_init(on20_init)
+module_exit(on20_exit)
diff --git a/drivers/block/paride/on26.c b/drivers/block/paride/on26.c
index 0688c6317972..c08111db5a21 100644
--- a/drivers/block/paride/on26.c
+++ b/drivers/block/paride/on26.c
@@ -19,6 +19,7 @@
#define ON26_VERSION "1.04"
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/types.h>
@@ -296,36 +297,34 @@ static void on26_release_proto( PIA *pi)
{ MOD_DEC_USE_COUNT;
}
-struct pi_protocol on26 = {"on26",0,5,2,1,1,
- on26_write_regr,
- on26_read_regr,
- on26_write_block,
- on26_read_block,
- on26_connect,
- on26_disconnect,
- on26_test_port,
- 0,
- 0,
- on26_log_adapter,
- on26_init_proto,
- on26_release_proto
- };
-
-
-#ifdef MODULE
-
-int init_module(void)
-
-{ return pi_register( &on26 ) - 1;
+static struct pi_protocol on26 = {
+ .name = "on26",
+ .max_mode = 5,
+ .epp_first = 2,
+ .default_delay = 1,
+ .max_units = 1,
+ .write_regr = on26_write_regr,
+ .read_regr = on26_read_regr,
+ .write_block = on26_write_block,
+ .read_block = on26_read_block,
+ .connect = on26_connect,
+ .disconnect = on26_disconnect,
+ .test_port = on26_test_port,
+ .log_adapter = on26_log_adapter,
+ .init_proto = on26_init_proto,
+ .release_proto = on26_release_proto,
+};
+
+static int __init on26_init(void)
+{
+ return pi_register(&on26)-1;
}
-void cleanup_module(void)
-
-{ pi_unregister( &on26 );
+static void __exit on26_exit(void)
+{
+ pi_unregister(&on26);
}
-#endif
-
-/* end of on26.c */
-
MODULE_LICENSE("GPL");
+module_init(on26_init)
+module_exit(on26_exit)
diff --git a/drivers/block/paride/paride.c b/drivers/block/paride/paride.c
index e3a6150acff6..18bd7892269c 100644
--- a/drivers/block/paride/paride.c
+++ b/drivers/block/paride/paride.c
@@ -431,136 +431,3 @@ int pi_init(PIA *pi, int autoprobe, int port, int mode,
}
EXPORT_SYMBOL(pi_init);
-
-#ifdef MODULE
-
-int init_module(void)
-
-{
- int k;
- const char *indicate_pp = "";
-#ifdef CONFIG_PARPORT
- indicate_pp = " (parport)";
-#endif
-
- for (k=0;k<MAX_PROTOS;k++) protocols[k] = 0;
-
- printk("paride: version %s installed%s\n",PI_VERSION,indicate_pp);
- return 0;
-}
-
-void cleanup_module(void)
-
-{
-}
-
-#else
-
-void paride_init( void )
-
-{
-
-#ifdef CONFIG_PARIDE_ATEN
- { extern struct pi_protocol aten;
- pi_register(&aten);
- };
-#endif
-#ifdef CONFIG_PARIDE_BPCK
- { extern struct pi_protocol bpck;
- pi_register(&bpck);
- };
-#endif
-#ifdef CONFIG_PARIDE_COMM
- { extern struct pi_protocol comm;
- pi_register(&comm);
- };
-#endif
-#ifdef CONFIG_PARIDE_DSTR
- { extern struct pi_protocol dstr;
- pi_register(&dstr);
- };
-#endif
-#ifdef CONFIG_PARIDE_EPAT
- { extern struct pi_protocol epat;
- pi_register(&epat);
- };
-#endif
-#ifdef CONFIG_PARIDE_EPIA
- { extern struct pi_protocol epia;
- pi_register(&epia);
- };
-#endif
-#ifdef CONFIG_PARIDE_FRPW
- { extern struct pi_protocol frpw;
- pi_register(&frpw);
- };
-#endif
-#ifdef CONFIG_PARIDE_FRIQ
- { extern struct pi_protocol friq;
- pi_register(&friq);
- };
-#endif
-#ifdef CONFIG_PARIDE_FIT2
- { extern struct pi_protocol fit2;
- pi_register(&fit2);
- };
-#endif
-#ifdef CONFIG_PARIDE_FIT3
- { extern struct pi_protocol fit3;
- pi_register(&fit3);
- };
-#endif
-#ifdef CONFIG_PARIDE_KBIC
- { extern struct pi_protocol k951;
- extern struct pi_protocol k971;
- pi_register(&k951);
- pi_register(&k971);
- };
-#endif
-#ifdef CONFIG_PARIDE_KTTI
- { extern struct pi_protocol ktti;
- pi_register(&ktti);
- };
-#endif
-#ifdef CONFIG_PARIDE_ON20
- { extern struct pi_protocol on20;
- pi_register(&on20);
- };
-#endif
-#ifdef CONFIG_PARIDE_ON26
- { extern struct pi_protocol on26;
- pi_register(&on26);
- };
-#endif
-
-#ifdef CONFIG_PARIDE_PD
- { extern int pd_init(void);
- pd_init();
- };
-#endif
-#ifdef CONFIG_PARIDE_PCD
- { extern int pcd_init(void);
- pcd_init();
- };
-#endif
-#ifdef CONFIG_PARIDE_PF
- { extern int pf_init(void);
- pf_init();
- };
-#endif
-#ifdef CONFIG_PARIDE_PT
- { extern int pt_init(void);
- pt_init();
- };
-#endif
-#ifdef CONFIG_PARIDE_PG
- { extern int pg_init(void);
- pg_init();
- };
-#endif
-}
-
-#endif
-
-/* end of paride.c */
-MODULE_LICENSE("GPL");
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c
index e9839726b20e..25273d4ba1b8 100644
--- a/drivers/block/paride/pcd.c
+++ b/drivers/block/paride/pcd.c
@@ -137,6 +137,7 @@ static int pcd_drive_count;
/* end of parameters */
#include <linux/module.h>
+#include <linux/init.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
@@ -200,9 +201,6 @@ MODULE_PARM(drive3,"1-6i");
#define IDE_READY 0x40
#define IDE_BUSY 0x80
-int pcd_init(void);
-void cleanup_module( void );
-
static int pcd_open(struct cdrom_device_info *cdi, int purpose);
static void pcd_release(struct cdrom_device_info *cdi);
static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr);
@@ -327,84 +325,18 @@ static void pcd_init_units( void )
}
}
-int pcd_init (void) /* preliminary initialisation */
-{
- int unit;
-
- if (disable) return -1;
-
- pcd_init_units();
-
- if (pcd_detect()) return -1;
-
- /* get the atapi capabilities page */
- pcd_probe_capabilities();
-
- if (register_blkdev(MAJOR_NR,name,&pcd_bdops)) {
- printk("pcd: unable to get major number %d\n",MAJOR_NR);
- return -1;
- }
-
- for (unit=0;unit<PCD_UNITS;unit++) {
- if (PCD.present) {
- register_cdrom(&PCD.info);
- devfs_plain_cdrom(&PCD.info, &pcd_bdops);
- }
- }
-
- blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_pcd_request, &pcd_lock);
-
- return 0;
-}
-
static int pcd_open(struct cdrom_device_info *cdi, int purpose)
-
-{ int unit = DEVICE_NR(cdi->dev);
-
- if ((unit >= PCD_UNITS) || (!PCD.present)) return -ENODEV;
-
+{
+ int unit = DEVICE_NR(cdi->dev);
+ if ((unit >= PCD_UNITS) || (!PCD.present))
+ return -ENODEV;
return 0;
}
static void pcd_release(struct cdrom_device_info *cdi)
-
{
}
-#ifdef MODULE
-
-/* Glue for modules ... */
-
-int init_module(void)
-
-{ int err;
-
-#ifdef PARIDE_JUMBO
- { extern paride_init();
- paride_init();
- }
-#endif
-
- err = pcd_init();
-
- return err;
-}
-
-void cleanup_module(void)
-
-{ int unit;
-
- for (unit=0;unit<PCD_UNITS;unit++)
- if (PCD.present) {
- pi_release(PI);
- unregister_cdrom(&PCD.info);
- }
-
- unregister_blkdev(MAJOR_NR,name);
-}
-
-#endif
-
#define WR(c,r,v) pi_write_regr(PI,c,r,v)
#define RR(c,r) (pi_read_regr(PI,c,r))
@@ -950,6 +882,50 @@ static int pcd_get_mcn (struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
return 0;
}
-/* end of pcd.c */
+
+static int __init pcd_init(void)
+{
+ int unit;
+
+ if (disable)
+ return -1;
+
+ pcd_init_units();
+
+ if (pcd_detect())
+ return -1;
+
+ /* get the atapi capabilities page */
+ pcd_probe_capabilities();
+
+ if (register_blkdev(MAJOR_NR,name,&pcd_bdops)) {
+ printk("pcd: unable to get major number %d\n",MAJOR_NR);
+ return -1;
+ }
+
+ for (unit=0;unit<PCD_UNITS;unit++) {
+ if (PCD.present) {
+ register_cdrom(&PCD.info);
+ devfs_plain_cdrom(&PCD.info, &pcd_bdops);
+ }
+ }
+
+ blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_pcd_request, &pcd_lock);
+
+ return 0;
+}
+
+static void __exit pcd_exit(void)
+{
+ int unit;
+ for (unit=0;unit<PCD_UNITS;unit++)
+ if (PCD.present) {
+ pi_release(PI);
+ unregister_cdrom(&PCD.info);
+ }
+ unregister_blkdev(MAJOR_NR,name);
+}
MODULE_LICENSE("GPL");
+module_init(pcd_init)
+module_exit(pcd_exit)
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c
index cb10da16d136..f9b681ac6b86 100644
--- a/drivers/block/paride/pd.c
+++ b/drivers/block/paride/pd.c
@@ -153,16 +153,12 @@ static int pd_drive_count;
/* end of parameters */
+#include <linux/init.h>
#include <linux/module.h>
-#include <linux/errno.h>
#include <linux/fs.h>
-#include <linux/devfs_fs_kernel.h>
-#include <linux/kernel.h>
#include <linux/delay.h>
-#include <linux/genhd.h>
#include <linux/hdreg.h>
#include <linux/cdrom.h> /* for the eject ioctl */
-#include <linux/spinlock.h>
#include <asm/uaccess.h>
@@ -181,8 +177,8 @@ static STT pd_stt[7] = {{"drive0",8,drive0},
{"nice",1,&nice}};
void pd_setup( char *str, int *ints)
-
-{ generic_setup(pd_stt,7,str);
+{
+ generic_setup(pd_stt,7,str);
}
#endif
@@ -199,19 +195,15 @@ MODULE_PARM(drive3,"1-8i");
#include "paride.h"
-#define PD_BITS 4
-
-/* set up defines for blk.h, why don't all drivers do it this way ? */
-
#define MAJOR_NR major
-#define DEVICE_NR(device) (minor(device)>>PD_BITS)
-#define DEVICE_OFF(device)
#include <linux/blk.h>
#include <linux/blkpg.h>
#include "pseudo.h"
+#define PD_BITS 4
+#define DEVICE_NR(device) (minor(device)>>PD_BITS)
#define PD_PARTNS (1<<PD_BITS)
#define PD_DEVS PD_PARTNS*PD_UNITS
@@ -258,11 +250,7 @@ MODULE_PARM(drive3,"1-8i");
#define IDE_IDENTIFY 0xec
#define IDE_EJECT 0xed
-int pd_init(void);
void pd_setup(char * str, int * ints);
-#ifdef MODULE
-void cleanup_module( void );
-#endif
static int pd_open(struct inode *inode, struct file *file);
static void do_pd_request(request_queue_t * q);
static int pd_ioctl(struct inode *inode,struct file *file,
@@ -296,6 +284,7 @@ struct pd_unit {
int heads; /* physical geometry */
int sectors;
int cylinders;
+ int can_lba;
int drive; /* master=0 slave=1 */
int changed; /* Have we seen a disk change ? */
int removable; /* removable media device ? */
@@ -303,7 +292,7 @@ struct pd_unit {
int alt_geom;
int present;
char name[PD_NAMELEN]; /* pda, pdb, etc ... */
- };
+};
struct pd_unit pd[PD_UNITS];
@@ -312,7 +301,6 @@ struct pd_unit pd[PD_UNITS];
#define PD pd[unit]
#define PI PD.pi
-static int pd_valid = 1; /* serialise partition checks */
static char pd_scratch[512]; /* scratch block buffer */
/* the variables below are used mainly in the I/O request engine, which
@@ -379,47 +367,12 @@ void pd_init_units( void )
}
}
-int pd_init (void)
-{
- request_queue_t * q;
-
- if (disable) return -1;
- if (devfs_register_blkdev(MAJOR_NR,name,&pd_fops)) {
- printk("%s: unable to get major number %d\n",
- name,major);
- return -1;
- }
- q = BLK_DEFAULT_QUEUE(MAJOR_NR);
- blk_init_queue(q, do_pd_request, &pd_lock);
- blk_queue_max_sectors(q, cluster);
-
- pd_gendisk.major = major;
- pd_gendisk.major_name = name;
- add_gendisk(&pd_gendisk);
-
- printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
- name,name,PD_VERSION,major,cluster,nice);
- pd_init_units();
- pd_valid = 0;
- pd_gendisk.nr_real = pd_detect();
- pd_valid = 1;
-
-#ifdef MODULE
- if (!pd_gendisk.nr_real) {
- cleanup_module();
- return -1;
- }
-#endif
- return 0;
-}
-
static int pd_open (struct inode *inode, struct file *file)
+{
+ int unit = DEVICE_NR(inode->i_rdev);
-{ int unit = DEVICE_NR(inode->i_rdev);
-
- if ((unit >= PD_UNITS) || (!PD.present)) return -ENODEV;
-
- wait_event (pd_wait_open, pd_valid);
+ if ((unit >= PD_UNITS) || (!PD.present))
+ return -ENODEV;
PD.access++;
@@ -434,11 +387,8 @@ static int pd_ioctl(struct inode *inode,struct file *file,
unsigned int cmd, unsigned long arg)
{
struct hd_geometry *geo = (struct hd_geometry *) arg;
- int err, unit;
+ int err, unit = DEVICE_NR(inode->i_rdev);
- if (!inode || kdev_none(inode->i_rdev))
- return -EINVAL;
- unit = DEVICE_NR(inode->i_rdev);
if (!PD.present)
return -ENODEV;
@@ -461,50 +411,34 @@ static int pd_ioctl(struct inode *inode,struct file *file,
put_user(PD.heads, (char *) &geo->heads);
put_user(PD.sectors, (char *) &geo->sectors);
}
- put_user(get_start_sect(inode->i_rdev), (long *)&geo->start);
+ put_user(get_start_sect(inode->i_bdev), (long *)&geo->start);
return 0;
case BLKRRPART:
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
return pd_revalidate(inode->i_rdev);
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
default:
return -EINVAL;
}
}
static int pd_release (struct inode *inode, struct file *file)
+{
+ int unit = DEVICE_NR(inode->i_rdev);
-{ kdev_t devp;
- int unit;
-
- devp = inode->i_rdev;
- unit = DEVICE_NR(devp);
-
- if ((unit >= PD_UNITS) || (PD.access <= 0))
- return -EINVAL;
-
- PD.access--;
-
- if (!PD.access && PD.removable)
+ if (!--PD.access && PD.removable)
pd_doorlock(unit,IDE_DOORUNLOCK);
return 0;
}
static int pd_check_media( kdev_t dev)
-
-{ int r, unit;
-
- unit = DEVICE_NR(dev);
- if ((unit >= PD_UNITS) || (!PD.present)) return -ENODEV;
- if (!PD.removable) return 0;
+{
+ int r, unit = DEVICE_NR(dev);
+ if ((unit >= PD_UNITS) || (!PD.present))
+ return -ENODEV;
+ if (!PD.removable)
+ return 0;
pd_media_check(unit);
r = PD.changed;
PD.changed = 0;
@@ -513,64 +447,26 @@ static int pd_check_media( kdev_t dev)
static int pd_revalidate(kdev_t dev)
{
- int unit, res;
- long flags;
+ int unit = DEVICE_NR(dev);
+ kdev_t device = mk_kdev(MAJOR_NR, unit << PD_BITS);
+ int res;
- unit = DEVICE_NR(dev);
if ((unit >= PD_UNITS) || !PD.present)
return -ENODEV;
- save_flags(flags);
- cli();
- if (PD.access > 1) {
- restore_flags(flags);
- return -EBUSY;
- }
- pd_valid = 0;
- restore_flags(flags);
-
- res = wipe_partitions(dev);
+ res = dev_lock_part(device);
+ if (res < 0)
+ return res;
+ res = wipe_partitions(device);
if (res == 0 && pd_identify(unit))
- grok_partitions(dev, PD.capacity);
+ grok_partitions(device, PD.capacity);
- pd_valid = 1;
- wake_up(&pd_wait_open);
+ dev_unlock_part(device);
return res;
}
-#ifdef MODULE
-
-/* Glue for modules ... */
-
-void cleanup_module(void);
-
-int init_module(void)
-
-{
-
-#ifdef PARIDE_JUMBO
- { extern paride_init();
- paride_init();
- }
-#endif
- return pd_init();
-}
-
-void cleanup_module(void)
-{
- int unit;
-
- devfs_unregister_blkdev(MAJOR_NR, name);
- del_gendisk(&pd_gendisk);
-
- for (unit=0; unit<PD_UNITS; unit++)
- if (PD.present)
- pi_release(PI);
-}
-#endif
-
#define WR(c,r,v) pi_write_regr(PI,c,r,v)
#define RR(c,r) (pi_read_regr(PI,c,r))
@@ -619,7 +515,6 @@ static int pd_wait_for( int unit, int w, char * msg ) /* polled wait */
static void pd_send_command( int unit, int n, int s, int h,
int c0, int c1, int func )
-
{
WR(0,6,DRIVE+h);
WR(0,1,0); /* the IDE task file */
@@ -633,16 +528,20 @@ static void pd_send_command( int unit, int n, int s, int h,
}
static void pd_ide_command( int unit, int func, int block, int count )
-
-/* Don't use this call if the capacity is zero. */
-
-{ int c1, c0, h, s;
-
- s = ( block % PD.sectors) + 1;
- h = ( block / PD.sectors) % PD.heads;
- c0 = ( block / (PD.sectors*PD.heads)) % 256;
- c1 = ( block / (PD.sectors*PD.heads*256));
-
+{
+ int c1, c0, h, s;
+
+ if (PD.can_lba) {
+ s = block & 255;
+ c0 = (block >>= 8) & 255;
+ c1 = (block >>= 8) & 255;
+ h = ((block >>= 8) & 15) + 0x40;
+ } else {
+ s = ( block % PD.sectors) + 1;
+ h = ( block /= PD.sectors) % PD.heads;
+ c0 = ( block /= PD.heads) % 256;
+ c1 = (block >>= 8);
+ }
pd_send_command(unit,count,s,h,c0,c1,func);
}
@@ -742,10 +641,14 @@ static int pd_identify( int unit )
}
pi_read_block(PI,pd_scratch,512);
pi_disconnect(PI);
- PD.sectors = word_val(6);
- PD.heads = word_val(3);
- PD.cylinders = word_val(1);
- PD.capacity = PD.sectors*PD.heads*PD.cylinders;
+ PD.can_lba = pd_scratch[99] & 2;
+ PD.sectors = le16_to_cpu(*(u16*)(pd_scratch+12));
+ PD.heads = le16_to_cpu(*(u16*)(pd_scratch+6));
+ PD.cylinders = le16_to_cpu(*(u16*)(pd_scratch+2));
+ if (PD.can_lba)
+ PD.capacity = le32_to_cpu(*(u32*)(pd_scratch + 120));
+ else
+ PD.capacity = PD.sectors*PD.heads*PD.cylinders;
for(j=0;j<PD_ID_LEN;j++) id[j^1] = pd_scratch[j+PD_ID_OFF];
j = PD_ID_LEN-1;
@@ -763,7 +666,7 @@ static int pd_identify( int unit )
if (PD.capacity) pd_init_dev_parms(unit);
if (!PD.standby) pd_standby_off(unit);
-
+
return 1;
}
@@ -1031,6 +934,50 @@ static void do_pd_write_done( void )
spin_unlock_irqrestore(&pd_lock,saved_flags);
}
-/* end of pd.c */
+static int __init pd_init(void)
+{
+ request_queue_t * q;
+ int unit;
+
+ if (disable) return -1;
+ if (devfs_register_blkdev(MAJOR_NR,name,&pd_fops)) {
+ printk("%s: unable to get major number %d\n",
+ name,major);
+ return -1;
+ }
+ q = BLK_DEFAULT_QUEUE(MAJOR_NR);
+ blk_init_queue(q, do_pd_request, &pd_lock);
+ blk_queue_max_sectors(q, cluster);
+
+ pd_gendisk.major = major;
+ pd_gendisk.major_name = name;
+ add_gendisk(&pd_gendisk);
+
+ printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
+ name,name,PD_VERSION,major,cluster,nice);
+ pd_init_units();
+ pd_gendisk.nr_real = pd_detect();
+ if (!pd_gendisk.nr_real) {
+ devfs_unregister_blkdev(MAJOR_NR, name);
+ del_gendisk(&pd_gendisk);
+ for (unit=0; unit<PD_UNITS; unit++)
+ if (PD.present)
+ pi_release(PI);
+ return -1;
+ }
+ return 0;
+}
+
+static void __exit pd_exit(void)
+{
+ int unit;
+ devfs_unregister_blkdev(MAJOR_NR, name);
+ del_gendisk(&pd_gendisk);
+ for (unit=0; unit<PD_UNITS; unit++)
+ if (PD.present)
+ pi_release(PI);
+}
MODULE_LICENSE("GPL");
+module_init(pd_init)
+module_exit(pd_exit)
diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c
index 578feaadbb38..a117aa6df61a 100644
--- a/drivers/block/paride/pf.c
+++ b/drivers/block/paride/pf.c
@@ -153,11 +153,9 @@ static int pf_drive_count;
#include <linux/module.h>
-#include <linux/errno.h>
+#include <linux/init.h>
#include <linux/fs.h>
-#include <linux/kernel.h>
#include <linux/delay.h>
-#include <linux/genhd.h>
#include <linux/hdreg.h>
#include <linux/cdrom.h>
#include <linux/spinlock.h>
@@ -240,7 +238,6 @@ MODULE_PARM(drive3,"1-7i");
#define ATAPI_READ_10 0x28
#define ATAPI_WRITE_10 0x2a
-int pf_init(void);
#ifdef MODULE
void cleanup_module( void );
#endif
@@ -337,34 +334,6 @@ void pf_init_units( void )
}
}
-int pf_init (void) /* preliminary initialisation */
-
-{ int i;
- request_queue_t * q;
-
- if (disable) return -1;
-
- pf_init_units();
-
- if (pf_detect()) return -1;
- pf_busy = 0;
-
- if (register_blkdev(MAJOR_NR,name,&pf_fops)) {
- printk("pf_init: unable to get major number %d\n",
- major);
- return -1;
- }
- q = BLK_DEFAULT_QUEUE(MAJOR_NR);
- blk_init_queue(q, do_pf_request, &pf_spin_lock);
- blk_queue_max_phys_segments(q, cluster);
- blk_queue_max_hw_segments(q, cluster);
-
- for (i=0;i<PF_UNITS;i++)
- register_disk(NULL, mk_kdev(MAJOR_NR, i), 1, &pf_fops, 0);
-
- return 0;
-}
-
static int pf_open (struct inode *inode, struct file *file)
{ int unit = DEVICE_NR(inode->i_rdev);
@@ -423,10 +392,6 @@ static int pf_ioctl(struct inode *inode,struct file *file,
return put_user(PF.capacity,(long *) arg);
case BLKGETSIZE64:
return put_user((u64)PF.capacity << 9,(u64 *)arg);
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- return blk_ioctl(inode->i_bdev, cmd, arg);
default:
return -EINVAL;
}
@@ -458,39 +423,6 @@ static int pf_check_media( kdev_t dev)
{ return 1;
}
-#ifdef MODULE
-
-/* Glue for modules ... */
-
-void cleanup_module(void);
-
-int init_module(void)
-
-{ int err;
-
-#ifdef PARIDE_JUMBO
- { extern paride_init();
- paride_init();
- }
-#endif
-
- err = pf_init();
-
- return err;
-}
-
-void cleanup_module(void)
-
-{ int unit;
-
- unregister_blkdev(MAJOR_NR,name);
-
- for (unit=0;unit<PF_UNITS;unit++)
- if (PF.present) pi_release(PI);
-}
-
-#endif
-
#define WR(c,r,v) pi_write_regr(PI,c,r,v)
#define RR(c,r) (pi_read_regr(PI,c,r))
@@ -1040,6 +972,44 @@ static void do_pf_write_done( void )
spin_unlock_irqrestore(&pf_spin_lock,saved_flags);
}
-/* end of pf.c */
+static int __init pf_init(void) /* preliminary initialisation */
+{
+ int i;
+ request_queue_t * q;
+
+ if (disable)
+ return -1;
+
+ pf_init_units();
+
+ if (pf_detect())
+ return -1;
+ pf_busy = 0;
+
+ if (register_blkdev(MAJOR_NR,name,&pf_fops)) {
+ printk("pf_init: unable to get major number %d\n", major);
+ return -1;
+ }
+ q = BLK_DEFAULT_QUEUE(MAJOR_NR);
+ blk_init_queue(q, do_pf_request, &pf_spin_lock);
+ blk_queue_max_phys_segments(q, cluster);
+ blk_queue_max_hw_segments(q, cluster);
+
+ for (i=0;i<PF_UNITS;i++)
+ register_disk(NULL, mk_kdev(MAJOR_NR, i), 1, &pf_fops, 0);
+ return 0;
+}
+
+static void __exit pf_exit(void)
+{
+ int unit;
+ unregister_blkdev(MAJOR_NR,name);
+ for (unit=0;unit<PF_UNITS;unit++)
+ if (PF.present)
+ pi_release(PI);
+}
+
MODULE_LICENSE("GPL");
+module_init(pf_init)
+module_exit(pf_exit)
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c
index 5f5af68fc86c..0a43b4a5d61b 100644
--- a/drivers/block/paride/pg.c
+++ b/drivers/block/paride/pg.c
@@ -162,16 +162,13 @@ static int pg_drive_count;
#include <linux/module.h>
-#include <linux/errno.h>
+#include <linux/init.h>
#include <linux/fs.h>
#include <linux/devfs_fs_kernel.h>
-#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/mtio.h>
#include <linux/pg.h>
-#include <linux/wait.h>
-#include <linux/smp_lock.h>
#include <asm/uaccess.h>
@@ -218,11 +215,6 @@ MODULE_PARM(drive3,"1-6i");
#define ATAPI_IDENTIFY 0x12
-int pg_init(void);
-#ifdef MODULE
-void cleanup_module( void );
-#endif
-
static int pg_open(struct inode *inode, struct file *file);
static int pg_release (struct inode *inode, struct file *file);
static ssize_t pg_read(struct file * filp, char * buf,
@@ -291,64 +283,6 @@ void pg_init_units( void )
static devfs_handle_t devfs_handle;
-int pg_init (void) /* preliminary initialisation */
-
-{ int unit;
-
- if (disable) return -1;
-
- pg_init_units();
-
- if (pg_detect()) return -1;
-
- if (devfs_register_chrdev(major,name,&pg_fops)) {
- printk("pg_init: unable to get major number %d\n",
- major);
- for (unit=0;unit<PG_UNITS;unit++)
- if (PG.present) pi_release(PI);
- return -1;
- }
- devfs_handle = devfs_mk_dir (NULL, "pg", NULL);
- devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
- major, 0, S_IFCHR | S_IRUSR | S_IWUSR,
- &pg_fops, NULL);
- return 0;
-}
-
-#ifdef MODULE
-
-/* Glue for modules ... */
-
-void cleanup_module(void);
-
-int init_module(void)
-
-{ int err;
-
-#ifdef PARIDE_JUMBO
- { extern paride_init();
- paride_init();
- }
-#endif
-
- err = pg_init();
-
- return err;
-}
-
-void cleanup_module(void)
-
-{ int unit;
-
- devfs_unregister (devfs_handle);
- devfs_unregister_chrdev(major,name);
-
- for (unit=0;unit<PG_UNITS;unit++)
- if (PG.present) pi_release(PI);
-}
-
-#endif
-
#define WR(c,r,v) pi_write_regr(PI,c,r,v)
#define RR(c,r) (pi_read_regr(PI,c,r))
@@ -691,6 +625,43 @@ static ssize_t pg_read(struct file * filp, char * buf,
return copy+hs;
}
-/* end of pg.c */
+static int __init pg_init(void)
+{
+ int unit;
+
+ if (disable)
+ return -1;
+
+ pg_init_units();
+
+ if (pg_detect())
+ return -1;
+
+ if (devfs_register_chrdev(major,name,&pg_fops)) {
+ printk("pg_init: unable to get major number %d\n",
+ major);
+ for (unit=0;unit<PG_UNITS;unit++)
+ if (PG.present) pi_release(PI);
+ return -1;
+ }
+ devfs_handle = devfs_mk_dir (NULL, "pg", NULL);
+ devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
+ major, 0, S_IFCHR | S_IRUSR | S_IWUSR,
+ &pg_fops, NULL);
+ return 0;
+}
+
+static void __exit pg_exit(void)
+{
+ int unit;
+
+ devfs_unregister (devfs_handle);
+ devfs_unregister_chrdev(major,name);
+
+ for (unit=0;unit<PG_UNITS;unit++)
+ if (PG.present) pi_release(PI);
+}
MODULE_LICENSE("GPL");
+module_init(pg_init)
+module_exit(pg_exit)
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c
index ccf3db7b1463..bc987791fd32 100644
--- a/drivers/block/paride/pt.c
+++ b/drivers/block/paride/pt.c
@@ -141,15 +141,12 @@ static int pt_drive_count;
#include <linux/module.h>
-#include <linux/errno.h>
+#include <linux/init.h>
#include <linux/fs.h>
#include <linux/devfs_fs_kernel.h>
-#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/mtio.h>
-#include <linux/wait.h>
-#include <linux/smp_lock.h>
#include <asm/uaccess.h>
@@ -209,11 +206,6 @@ MODULE_PARM(drive3,"1-6i");
#define ATAPI_MODE_SENSE 0x1a
#define ATAPI_LOG_SENSE 0x4d
-int pt_init(void);
-#ifdef MODULE
-void cleanup_module( void );
-#endif
-
static int pt_open(struct inode *inode, struct file *file);
static int pt_ioctl(struct inode *inode,struct file *file,
unsigned int cmd, unsigned long arg);
@@ -291,71 +283,9 @@ void pt_init_units( void )
PT.name[j] = 0;
if (DU[D_PRT]) pt_drive_count++;
}
-}
-
-static devfs_handle_t devfs_handle;
-
-int pt_init (void) /* preliminary initialisation */
-
-{ int unit;
-
- if (disable) return -1;
-
- pt_init_units();
-
- if (pt_detect()) return -1;
-
- if (devfs_register_chrdev(major,name,&pt_fops)) {
- printk("pt_init: unable to get major number %d\n",
- major);
- for (unit=0;unit<PT_UNITS;unit++)
- if (PT.present) pi_release(PI);
- return -1;
- }
-
- devfs_handle = devfs_mk_dir (NULL, "pt", NULL);
- devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
- major, 0, S_IFCHR | S_IRUSR | S_IWUSR,
- &pt_fops, NULL);
- devfs_register_series (devfs_handle, "%un", 4, DEVFS_FL_DEFAULT,
- major, 128, S_IFCHR | S_IRUSR | S_IWUSR,
- &pt_fops, NULL);
- return 0;
}
-#ifdef MODULE
-
-/* Glue for modules ... */
-
-void cleanup_module(void);
-
-int init_module(void)
-
-{ int err;
-
-#ifdef PARIDE_JUMBO
- { extern paride_init();
- paride_init();
- }
-#endif
-
- err = pt_init();
-
- return err;
-}
-
-void cleanup_module(void)
-
-{ int unit;
-
- devfs_unregister (devfs_handle);
- devfs_unregister_chrdev(major,name);
-
- for (unit=0;unit<PT_UNITS;unit++)
- if (PT.present) pi_release(PI);
-}
-
-#endif
+static devfs_handle_t devfs_handle;
#define WR(c,r,v) pi_write_regr(PI,c,r,v)
#define RR(c,r) (pi_read_regr(PI,c,r))
@@ -965,6 +895,46 @@ static ssize_t pt_write(struct file * filp, const char * buf,
return t;
}
-/* end of pt.c */
+static int __init pt_init(void)
+{
+ int unit;
+
+ if (disable)
+ return -1;
+
+ pt_init_units();
+
+ if (pt_detect())
+ return -1;
+
+ if (devfs_register_chrdev(major,name,&pt_fops)) {
+ printk("pt_init: unable to get major number %d\n",
+ major);
+ for (unit=0;unit<PT_UNITS;unit++)
+ if (PT.present) pi_release(PI);
+ return -1;
+ }
+
+ devfs_handle = devfs_mk_dir (NULL, "pt", NULL);
+ devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
+ major, 0, S_IFCHR | S_IRUSR | S_IWUSR,
+ &pt_fops, NULL);
+ devfs_register_series (devfs_handle, "%un", 4, DEVFS_FL_DEFAULT,
+ major, 128, S_IFCHR | S_IRUSR | S_IWUSR,
+ &pt_fops, NULL);
+ return 0;
+}
+
+static void __exit pt_exit(void)
+{
+ int unit;
+ devfs_unregister (devfs_handle);
+ devfs_unregister_chrdev(major,name);
+ for (unit=0;unit<PT_UNITS;unit++)
+ if (PT.present)
+ pi_release(PI);
+}
MODULE_LICENSE("GPL");
+module_init(pt_init)
+module_exit(pt_exit)
diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c
index bd604cee4663..1d734f15cab2 100644
--- a/drivers/block/ps2esdi.c
+++ b/drivers/block/ps2esdi.c
@@ -93,8 +93,6 @@ static void ps2esdi_geometry_int_handler(u_int);
static int ps2esdi_open(struct inode *inode, struct file *file);
-static int ps2esdi_release(struct inode *inode, struct file *file);
-
static int ps2esdi_ioctl(struct inode *inode, struct file *file,
u_int cmd, u_long arg);
@@ -111,11 +109,8 @@ static void ps2esdi_reset_timer(unsigned long unused);
static u_int dma_arb_level; /* DMA arbitration level */
static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_int);
-static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_wait_open);
static int no_int_yet;
-static int access_count[MAX_HD];
-static char ps2esdi_valid[MAX_HD];
static int ps2esdi_sizes[MAX_HD << 6];
static int ps2esdi_drives;
static struct hd_struct ps2esdi[MAX_HD << 6];
@@ -152,7 +147,6 @@ static struct block_device_operations ps2esdi_fops =
{
owner: THIS_MODULE,
open: ps2esdi_open,
- release: ps2esdi_release,
ioctl: ps2esdi_ioctl,
};
@@ -441,13 +435,11 @@ static int __init ps2esdi_geninit(void)
}
blk_queue_max_sectors(BLK_DEFAULT_QUEUE(MAJOR_NR), 128);
- for (i = 0; i < ps2esdi_drives; i++) {
+ for (i = 0; i < ps2esdi_drives; i++)
register_disk(&ps2esdi_gendisk,mk_kdev(MAJOR_NR,i<<6),1<<6,
&ps2esdi_fops,
ps2esdi_info[i].head * ps2esdi_info[i].sect *
ps2esdi_info[i].cyl);
- ps2esdi_valid[i] = 1;
- }
return 0;
err_out3:
@@ -1083,32 +1075,11 @@ static void dump_cmd_complete_status(u_int int_ret_code)
static int ps2esdi_open(struct inode *inode, struct file *file)
{
int dev = DEVICE_NR(inode->i_rdev);
-
- if (dev < ps2esdi_drives) {
- while (!ps2esdi_valid[dev])
- sleep_on(&ps2esdi_wait_open);
-
- access_count[dev]++;
-
- return (0);
- } else
- return (-ENODEV);
-}
-
-
-
-static int ps2esdi_release(struct inode *inode, struct file *file)
-{
- int dev = DEVICE_NR(inode->i_rdev);
-
- if (dev < ps2esdi_drives) {
- access_count[dev]--;
- }
+ if (dev >= ps2esdi_drives)
+ return -ENODEV;
return 0;
}
-
-
static int ps2esdi_ioctl(struct inode *inode,
struct file *file, u_int cmd, u_long arg)
{
@@ -1125,7 +1096,7 @@ static int ps2esdi_ioctl(struct inode *inode,
put_user(ps2esdi_info[dev].head, (char *) &geometry->heads);
put_user(ps2esdi_info[dev].sect, (char *) &geometry->sectors);
put_user(ps2esdi_info[dev].cyl, (short *) &geometry->cylinders);
- put_user(get_start_sect(inode->i_rdev),
+ put_user(get_start_sect(inode->b_rdev),
(long *) &geometry->start);
return 0;
@@ -1136,16 +1107,6 @@ static int ps2esdi_ioctl(struct inode *inode,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
return (ps2esdi_reread_partitions(inode->i_rdev));
-
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKROSET:
- case BLKROGET:
- case BLKFLSBUF:
- case BLKBSZGET:
- case BLKBSZSET:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
}
return (-EINVAL);
}
@@ -1155,24 +1116,20 @@ static int ps2esdi_ioctl(struct inode *inode,
static int ps2esdi_reread_partitions(kdev_t dev)
{
int target = DEVICE_NR(dev);
- int res;
+ kdev_t device = mk_kdev(MAJOR_NR, target << 6);
+ int res = dev_lock_part(device);
- cli();
- ps2esdi_valid[target] = (access_count[target] != 1);
- sti();
- if (ps2esdi_valid[target])
- return (-EBUSY);
+ if (res < 0)
+ return res;
- res = wipe_partitions(dev);
+ res = wipe_partitions(device);
if (res == 0)
- grok_partitions(dev, ps2esdi_info[target].head
+ grok_partitions(device, ps2esdi_info[target].head
* ps2esdi_info[target].cyl
* ps2esdi_info[target].sect);
- ps2esdi_valid[target] = 1;
- wake_up(&ps2esdi_wait_open);
-
- return (res);
+ dev_unlock_part(device);
+ return res;
}
static void ps2esdi_reset_timer(unsigned long unused)
diff --git a/drivers/block/rd.c b/drivers/block/rd.c
index 7b60e75d5584..662020429ba6 100644
--- a/drivers/block/rd.c
+++ b/drivers/block/rd.c
@@ -303,12 +303,6 @@ static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
}
up(&inode->i_bdev->bd_sem);
break;
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKROSET:
- case BLKROGET:
- case BLKSSZGET:
- error = blk_ioctl(inode->i_bdev, cmd, arg);
}
out:
return error;
diff --git a/drivers/block/umem.c b/drivers/block/umem.c
index e046885bb67b..a1575eb830b0 100644
--- a/drivers/block/umem.c
+++ b/drivers/block/umem.c
@@ -65,7 +65,7 @@
#define MM_BLKSIZE 1024 /* 1k blocks */
#define MM_HARDSECT 512 /* 512-byte hardware sectors */
#define MM_SHIFT 6 /* max 64 partitions on 4 cards */
-#define DEVICE_NR(device) (MINOR(device)>>MM_SHIFT)
+#define DEVICE_NR(device) (minor(device)>>MM_SHIFT)
/*
* Version Information
@@ -150,7 +150,6 @@ struct cardinfo {
unsigned long last_change;
} battery[2];
- atomic_t usage;
spinlock_t lock;
int check_batteries;
@@ -813,31 +812,21 @@ static void del_battery_timer(void)
* Note no locks taken out here. In a worst case scenario, we could drop
* a chunk of system memory. But that should never happen, since validation
* happens at open or mount time, when locks are held.
+ *
+ * That's crap, since doing that while some partitions are opened
+ * or mounted will give you really nasty results.
*/
static int mm_revalidate(kdev_t i_rdev)
{
- int i;
-
- int card_number = DEVICE_NR(kdev_val(i_rdev));
- /* first partition, # of partitions */
- int part1 = (card_number << MM_SHIFT) + 1;
- int npart = (1 << MM_SHIFT) -1;
-
- /* first clear old partition information */
- for (i=0; i<npart ;i++) {
- mm_gendisk.sizes[part1+i]=0;
- mm_gendisk.part[part1+i].start_sect = 0;
- mm_gendisk.part[part1+i].nr_sects = 0;
- }
-
- mm_gendisk.part[card_number << MM_SHIFT].nr_sects =
- cards[card_number].mm_size << 1;
-
-
- /* then fill new info */
+ int card_number = DEVICE_NR(i_rdev);
+ kdev_t device = mk_mdev(MAJOR_NR, card_number << MM_SHIFT);
+ int res = dev_lock_part(device);
+ if (res < 0)
+ return res;
+ wipe_partitions(device);
printk(KERN_INFO "mm partition check: (%d)\n", card_number);
- grok_partitions(mk_kdev(major_nr,part1-1),
- mm_gendisk.sizes[card_number<<MM_SHIFT]);
+ grok_partitions(device, cards[card_number].mm_size << 1);
+ dev_unlock_part(device);
return 0;
}
/*
@@ -859,16 +848,6 @@ static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned
switch(cmd) {
-
- case BLKGETSIZE:
- /* Return the device size, expressed in sectors */
- err = ! access_ok (VERIFY_WRITE, arg, sizeof(long));
- if (err) return -EFAULT;
- size = mm_gendisk.part[minor].nr_sects;
- if (copy_to_user((long *) arg, &size, sizeof (long)))
- return -EFAULT;
- return 0;
-
case BLKRRPART:
return (mm_revalidate(i->i_rdev));
@@ -883,16 +862,15 @@ static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned
size = cards[card_number].mm_size * (1024 / MM_HARDSECT);
geo.heads = 64;
geo.sectors = 32;
- geo.start = mm_gendisk.part[minor].start_sect;
+ geo.start = get_start_sect(inode->i_bdev);
geo.cylinders = size / (geo.heads * geo.sectors);
if (copy_to_user((void *) arg, &geo, sizeof(geo)))
return -EFAULT;
return 0;
-
default:
- return blk_ioctl(i->i_bdev, cmd, arg);
+ return -EINVAL;
}
return -ENOTTY; /* unknown command */
@@ -905,7 +883,7 @@ static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned
*/
static int mm_check_change(kdev_t i_rdev)
{
- int card_number = DEVICE_NR(kdev_val(i_rdev));
+ int card_number = DEVICE_NR(i_rdev);
/* struct cardinfo *dev = cards + card_number; */
if (card_number >= num_cards) /* paranoid */
return 0;
@@ -920,38 +898,8 @@ static int mm_check_change(kdev_t i_rdev)
*/
static int mm_open(struct inode *i, struct file *filp)
{
- int num;
- struct cardinfo *card;
-
- num = DEVICE_NR(kdev_val(i->i_rdev));
- if (num >= num_cards)
+ if (DEVICE_NR(i->i_rdev) >= num_cards)
return -ENXIO;
-
- card = cards + num;
-
- atomic_inc(&card->usage);
- MOD_INC_USE_COUNT;
-
- return 0;
-}
-/*
------------------------------------------------------------------------------------
--- mm_do_release
------------------------------------------------------------------------------------
-*/
-static int mm_do_release(struct inode *i, struct file *filp)
-{
- int num;
- struct cardinfo *card;
-
- num = DEVICE_NR(kdev_val(i->i_rdev));
-
- card = cards + num;
-
- if (atomic_dec_and_test(&card->usage))
- invalidate_device(i->i_rdev, 1);
-
- MOD_DEC_USE_COUNT;
return 0;
}
/*
@@ -962,7 +910,6 @@ static int mm_do_release(struct inode *i, struct file *filp)
static struct block_device_operations mm_fops = {
owner: THIS_MODULE,
open: mm_open,
- release: mm_do_release,
ioctl: mm_ioctl,
revalidate: mm_revalidate,
check_media_change: mm_check_change,
@@ -1243,7 +1190,7 @@ static struct pci_driver mm_pci_driver = {
static request_queue_t * mm_queue_proc(kdev_t dev)
{
- int c = DEVICE_NR(kdev_val(dev));
+ int c = DEVICE_NR(dev);
if (c < MM_MAXCARDS)
return &cards[c].queue;
@@ -1293,7 +1240,6 @@ int __init mm_init(void)
blk_dev[MAJOR_NR].queue = mm_queue_proc;
add_gendisk(&mm_gendisk);
- blk_size[MAJOR_NR] = mm_gendisk.sizes;
for (i = 0; i < num_cards; i++) {
register_disk(&mm_gendisk, mk_kdev(MAJOR_NR, i<<MM_SHIFT), MM_SHIFT,
&mm_fops, cards[i].mm_size << 1);
@@ -1325,9 +1271,6 @@ void __exit mm_cleanup(void)
unregister_blkdev(MAJOR_NR, "umem");
- for (i = 0; i < (num_cards << MM_SHIFT); i++)
- invalidate_device (mk_kdev(MAJOR_NR,i), 1);
-
blk_size [MAJOR_NR] = NULL;
/*
diff --git a/drivers/block/xd.c b/drivers/block/xd.c
index bca8cd457e0e..a1166a4e1394 100644
--- a/drivers/block/xd.c
+++ b/drivers/block/xd.c
@@ -122,7 +122,7 @@ static unsigned int xd_bases[] __initdata =
};
static struct hd_struct xd_struct[XD_MAXDRIVES << 6];
-static int xd_sizes[XD_MAXDRIVES << 6], xd_access[XD_MAXDRIVES];
+static int xd_sizes[XD_MAXDRIVES << 6];
static spinlock_t xd_lock = SPIN_LOCK_UNLOCKED;
@@ -140,12 +140,9 @@ static struct gendisk xd_gendisk = {
static struct block_device_operations xd_fops = {
owner: THIS_MODULE,
open: xd_open,
- release: xd_release,
ioctl: xd_ioctl,
};
static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
-static DECLARE_WAIT_QUEUE_HEAD(xd_wait_open);
-static u_char xd_valid[XD_MAXDRIVES] = { 0,0 };
static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors;
static u_char xd_override __initdata = 0, xd_type __initdata = 0;
static u_short xd_iobase = 0x320;
@@ -244,14 +241,11 @@ static void __init xd_geninit (void)
/* xd_maxsectors depends on controller - so set after detection */
blk_queue_max_sectors(BLK_DEFAULT_QUEUE(MAJOR_NR), xd_maxsectors);
- for (i = 0; i < xd_drives; i++) {
- xd_valid[i] = 1;
+ for (i = 0; i < xd_drives; i++)
register_disk(&xd_gendisk, mk_kdev(MAJOR_NR,i<<6), 1<<6,
&xd_fops,
xd_info[i].heads * xd_info[i].cylinders *
xd_info[i].sectors);
- }
-
xd_gendisk.nr_real = xd_drives;
}
@@ -259,17 +253,9 @@ static void __init xd_geninit (void)
static int xd_open (struct inode *inode,struct file *file)
{
int dev = DEVICE_NR(inode->i_rdev);
-
- if (dev < xd_drives) {
- while (!xd_valid[dev])
- sleep_on(&xd_wait_open);
-
- xd_access[dev]++;
-
- return (0);
- }
-
- return -ENXIO;
+ if (dev >= xd_drives)
+ return -ENXIO;
+ return 0;
}
/* do_xd_request: handle an incoming request */
@@ -329,7 +315,7 @@ static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg)
g.heads = xd_info[dev].heads;
g.sectors = xd_info[dev].sectors;
g.cylinders = xd_info[dev].cylinders;
- g.start = get_start_sect(inode->i_rdev);
+ g.start = get_start_sect(inode->i_bdev);
return copy_to_user(geometry, &g, sizeof g) ? -EFAULT : 0;
}
case HDIO_SET_DMA:
@@ -351,50 +337,28 @@ static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg)
return -EACCES;
return xd_reread_partitions(inode->i_rdev);
- case BLKGETSIZE:
- case BLKGETSIZE64:
- case BLKFLSBUF:
- case BLKROSET:
- case BLKROGET:
- case BLKPG:
- return blk_ioctl(inode->i_bdev, cmd, arg);
-
default:
return -EINVAL;
}
}
-/* xd_release: release the device */
-static int xd_release (struct inode *inode, struct file *file)
-{
- int target = DEVICE_NR(inode->i_rdev);
- if (target < xd_drives)
- xd_access[target]--;
- return 0;
-}
-
/* xd_reread_partitions: rereads the partition table from a drive */
static int xd_reread_partitions(kdev_t dev)
{
- int target;
- int res;
+ int target = DEVICE_NR(dev);
+ kdev_t device = mk_kdev(MAJOR_NR, target << 6);
+ int res = dev_lock_part(device);
- target = DEVICE_NR(dev);
-
- cli();
- xd_valid[target] = (xd_access[target] != 1);
- sti();
- if (xd_valid[target])
- return -EBUSY;
+ if (res < 0)
+ return 0;
- res = wipe_partitions(dev);
+ res = wipe_partitions(device);
if (!res)
- grok_partitions(dev, xd_info[target].heads
+ grok_partitions(device, xd_info[target].heads
* xd_info[target].cylinders
* xd_info[target].sectors);
- xd_valid[target] = 1;
- wake_up(&xd_wait_open);
+ dev_unlock_part(device);
return res;
}
diff --git a/drivers/block/xd.h b/drivers/block/xd.h
index 7babb59b96d0..3df2d4e98410 100644
--- a/drivers/block/xd.h
+++ b/drivers/block/xd.h
@@ -113,7 +113,6 @@ static void xd_geninit (void);
static int xd_open (struct inode *inode,struct file *file);
static void do_xd_request (request_queue_t * q);
static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
-static int xd_release (struct inode *inode,struct file *file);
static int xd_reread_partitions (kdev_t dev);
static int xd_readwrite (u_char operation,u_char drive,char *buffer,u_int block,u_int count);
static void xd_recalibrate (u_char drive);