Commit 01155446 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] acsi switched to alloc_disk()

That's the last one.  Now we can start doing refcounting...
parent 43410fd0
...@@ -367,7 +367,6 @@ static int acsi_release( struct inode * inode, struct file * file ); ...@@ -367,7 +367,6 @@ static int acsi_release( struct inode * inode, struct file * file );
static void acsi_prevent_removal( int target, int flag ); static void acsi_prevent_removal( int target, int flag );
static int acsi_change_blk_size( int target, int lun); static int acsi_change_blk_size( int target, int lun);
static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd ); static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd );
static void acsi_geninit(void);
static int acsi_revalidate (kdev_t); static int acsi_revalidate (kdev_t);
/************************* End of Prototypes **************************/ /************************* End of Prototypes **************************/
...@@ -974,12 +973,12 @@ static void redo_acsi_request( void ) ...@@ -974,12 +973,12 @@ static void redo_acsi_request( void )
dev = DEVICE_NR(CURRENT->rq_dev); dev = DEVICE_NR(CURRENT->rq_dev);
block = CURRENT->sector; block = CURRENT->sector;
if (dev >= NDevices || if (dev >= NDevices ||
block+CURRENT->nr_sectors >= get_capacity(acsi_gendisk + dev)) { block+CURRENT->nr_sectors >= get_capacity(acsi_gendisk[dev])) {
#ifdef DEBUG #ifdef DEBUG
printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.\n", printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.\n",
dev+'a', dev+'a',
block, block + CURRENT->nr_sectors - 1, block, block + CURRENT->nr_sectors - 1,
get_capacity(acsi_gendisk + dev)); get_capacity(acsi_gendisk[dev]));
#endif #endif
end_request(CURRENT, 0); end_request(CURRENT, 0);
goto repeat; goto repeat;
...@@ -1340,7 +1339,7 @@ static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd ) ...@@ -1340,7 +1339,7 @@ static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd )
extern struct block_device_operations acsi_fops; extern struct block_device_operations acsi_fops;
static struct gendisk acsi_gendisk[MAX_DEV]; static struct gendisk *acsi_gendisk[MAX_DEV];
#define MAX_SCSI_DEVICE_CODE 10 #define MAX_SCSI_DEVICE_CODE 10
...@@ -1607,13 +1606,53 @@ static struct block_device_operations acsi_fops = { ...@@ -1607,13 +1606,53 @@ static struct block_device_operations acsi_fops = {
revalidate: acsi_revalidate, revalidate: acsi_revalidate,
}; };
static void acsi_geninit(void) #ifdef CONFIG_ATARI_SLM_MODULE
/* call attach_slm() for each device that is a printer; needed for init of SLM
* driver as a module, since it's not yet present if acsi.c is inited and thus
* the bus gets scanned. */
void acsi_attach_SLMs( int (*attach_func)( int, int ) )
{
int i, n = 0;
for( i = 0; i < 8; ++i )
if (SLM_devices[i] >= 0)
n += (*attach_func)( i, SLM_devices[i] );
printk( KERN_INFO "Found %d SLM printer(s) total.\n", n );
}
#endif /* CONFIG_ATARI_SLM_MODULE */
int acsi_init( void )
{ {
int err = 0;
int i, target, lun; int i, target, lun;
struct acsi_info_struct *aip; struct acsi_info_struct *aip;
#ifdef CONFIG_ATARI_SLM #ifdef CONFIG_ATARI_SLM
int n_slm = 0; int n_slm = 0;
#endif #endif
if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ACSI))
return 0;
if (register_blkdev( MAJOR_NR, "ad", &acsi_fops )) {
printk( KERN_ERR "Unable to get major %d for ACSI\n", MAJOR_NR );
err = -EBUSY;
goto out1;
}
if (!(acsi_buffer =
(char *)atari_stram_alloc(ACSI_BUFFER_SIZE, "acsi"))) {
err = -ENOMEM;
printk( KERN_ERR "Unable to get ACSI ST-Ram buffer.\n" );
goto out2;
}
phys_acsi_buffer = virt_to_phys( acsi_buffer );
STramMask = ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000 : 0xff000000;
blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_acsi_request, &acsi_lock);
#ifdef CONFIG_ATARI_SLM
err = slm_init();
#endif
if (err)
goto out3;
printk( KERN_INFO "Probing ACSI devices:\n" ); printk( KERN_INFO "Probing ACSI devices:\n" );
NDevices = 0; NDevices = 0;
...@@ -1688,9 +1727,15 @@ static void acsi_geninit(void) ...@@ -1688,9 +1727,15 @@ static void acsi_geninit(void)
printk( KERN_INFO "Found %d ACSI device(s) and %d SLM printer(s) total.\n", printk( KERN_INFO "Found %d ACSI device(s) and %d SLM printer(s) total.\n",
NDevices, n_slm ); NDevices, n_slm );
#endif #endif
err = -ENOMEM;
for( i = 0; i < NDevices; ++i ) {
acsi_gendisk[i] = alloc_disk();
if (!acsi_gendisk[i])
goto out4;
}
for( i = 0; i < NDevices; ++i ) { for( i = 0; i < NDevices; ++i ) {
struct gendisk *disk = acsi_gendisk + i; struct gendisk *disk = acsi_gendisk[i];
sprintf(disk->disk_name, "ad%c", 'a'+i); sprintf(disk->disk_name, "ad%c", 'a'+i);
disk->major = MAJOR_NR; disk->major = MAJOR_NR;
disk->first_minor = i << 4; disk->first_minor = i << 4;
...@@ -1699,49 +1744,16 @@ static void acsi_geninit(void) ...@@ -1699,49 +1744,16 @@ static void acsi_geninit(void)
set_capacity(disk, acsi_info[i].size); set_capacity(disk, acsi_info[i].size);
add_disk(disk); add_disk(disk);
} }
}
#ifdef CONFIG_ATARI_SLM_MODULE
/* call attach_slm() for each device that is a printer; needed for init of SLM
* driver as a module, since it's not yet present if acsi.c is inited and thus
* the bus gets scanned. */
void acsi_attach_SLMs( int (*attach_func)( int, int ) )
{
int i, n = 0;
for( i = 0; i < 8; ++i )
if (SLM_devices[i] >= 0)
n += (*attach_func)( i, SLM_devices[i] );
printk( KERN_INFO "Found %d SLM printer(s) total.\n", n );
}
#endif /* CONFIG_ATARI_SLM_MODULE */
int acsi_init( void )
{
int err = 0;
if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ACSI))
return 0; return 0;
if (register_blkdev( MAJOR_NR, "ad", &acsi_fops )) { out4:
printk( KERN_ERR "Unable to get major %d for ACSI\n", MAJOR_NR ); while (i--)
return -EBUSY; put_disk(acsi_gendisk[i]);
} out3:
if (!(acsi_buffer = blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
(char *)atari_stram_alloc(ACSI_BUFFER_SIZE, "acsi"))) { atari_stram_free( acsi_buffer );
printk( KERN_ERR "Unable to get ACSI ST-Ram buffer.\n" ); out2:
unregister_blkdev( MAJOR_NR, "ad" ); unregister_blkdev( MAJOR_NR, "ad" );
return -ENOMEM; out1:
}
phys_acsi_buffer = virt_to_phys( acsi_buffer );
STramMask = ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000 : 0xff000000;
blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_acsi_request, &acsi_lock);
#ifdef CONFIG_ATARI_SLM
err = slm_init();
#endif
if (!err)
acsi_geninit();
return err; return err;
} }
...@@ -1770,8 +1782,10 @@ void cleanup_module(void) ...@@ -1770,8 +1782,10 @@ void cleanup_module(void)
if (unregister_blkdev( MAJOR_NR, "ad" ) != 0) if (unregister_blkdev( MAJOR_NR, "ad" ) != 0)
printk( KERN_ERR "acsi: cleanup_module failed\n"); printk( KERN_ERR "acsi: cleanup_module failed\n");
for (i = 0; i < NDevices; i++) for (i = 0; i < NDevices; i++) {
del_gendisk(acsi_gendisk + i); del_gendisk(acsi_gendisk[i]);
put_disk(acsi_gendisk[i]);
}
} }
#endif #endif
...@@ -1810,6 +1824,6 @@ static int acsi_revalidate(kdev_t dev) ...@@ -1810,6 +1824,6 @@ static int acsi_revalidate(kdev_t dev)
ENABLE_IRQ(); ENABLE_IRQ();
stdma_release(); stdma_release();
set_capacity(acsi_gendisk + unit, aip->size); set_capacity(acsi_gendisk[unit], aip->size);
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment