Commit 13413379 authored by Linus Torvalds's avatar Linus Torvalds

Merge

parents 6177c8bb ac5bdbb7
...@@ -37,9 +37,27 @@ ...@@ -37,9 +37,27 @@
*** ***
*** Use of the "serialize" option is no longer necessary. *** Use of the "serialize" option is no longer necessary.
This is the multiple IDE interface driver, as evolved from hd.c. It supports ================================================================================
up to 9 IDE interfaces per default, on one or more IRQs (usually 14 & 15). Common pitfalls:
There can be up to two drives per interface, as per the ATA-6 spec.
- 40-conductor IDE cables are capable of transfering data in DMA modes up to
udma2, but no faster.
- If possible devices should be attached to separate channels if they are
available. Typically the disk on the first and CD-ROM on the second.
- If you mix devices on the same cable, please consider using similar devices
in respect of the data transfer mode they support.
- Even better tru to stick to the same vendor and device type on the same
cable.
================================================================================
This is the multiple IDE interface driver, as evolved from hd.c.
It supports up to 9 IDE interfaces per default, on one or more IRQs (usually
14 & 15). There can be up to two drives per interface, as per the ATA-6 spec.
Primary: ide0, port 0x1f0; major=3; hda is minor=0; hdb is minor=64 Primary: ide0, port 0x1f0; major=3; hda is minor=0; hdb is minor=64
Secondary: ide1, port 0x170; major=22; hdc is minor=0; hdd is minor=64 Secondary: ide1, port 0x170; major=22; hdc is minor=0; hdd is minor=64
......
...@@ -192,7 +192,7 @@ unsigned char IN_BYTE(ide_ioreg_t reg) { ...@@ -192,7 +192,7 @@ unsigned char IN_BYTE(ide_ioreg_t reg) {
#define ATA_PIO0_HOLD 4 #define ATA_PIO0_HOLD 4
static int e100_dmaproc(ide_dma_action_t func, struct ata_device *drive, struct request *rq); static int e100_dmaproc(ide_dma_action_t func, struct ata_device *drive, struct request *rq);
static void e100_ideproc (ide_ide_action_t func, ide_drive_t *drive, static void e100_ideproc (ide_ide_action_t func, struct ata_device *drive,
void *buffer, unsigned int length); void *buffer, unsigned int length);
/* /*
...@@ -206,7 +206,7 @@ const char *good_dma_drives[] = {"Micropolis 2112A", ...@@ -206,7 +206,7 @@ const char *good_dma_drives[] = {"Micropolis 2112A",
"CONNER CTT8000-A", "CONNER CTT8000-A",
NULL}; NULL};
static void tune_e100_ide(ide_drive_t *drive, byte pio) static void tune_e100_ide(struct ata_device *drive, byte pio)
{ {
unsigned long flags; unsigned long flags;
...@@ -380,7 +380,7 @@ static etrax_dma_descr mydescr; ...@@ -380,7 +380,7 @@ static etrax_dma_descr mydescr;
* extra byte allocated for the buffer. * extra byte allocated for the buffer.
*/ */
static void static void
e100_atapi_read(ide_drive_t *drive, void *buffer, unsigned int bytecount) e100_atapi_read(struct ata_device *drive, void *buffer, unsigned int bytecount)
{ {
ide_ioreg_t data_reg = IDE_DATA_REG; ide_ioreg_t data_reg = IDE_DATA_REG;
...@@ -459,7 +459,7 @@ e100_atapi_read(ide_drive_t *drive, void *buffer, unsigned int bytecount) ...@@ -459,7 +459,7 @@ e100_atapi_read(ide_drive_t *drive, void *buffer, unsigned int bytecount)
} }
static void static void
e100_atapi_write(ide_drive_t *drive, void *buffer, unsigned int bytecount) e100_atapi_write(struct ata_device *drive, void *buffer, unsigned int bytecount)
{ {
ide_ioreg_t data_reg = IDE_DATA_REG; ide_ioreg_t data_reg = IDE_DATA_REG;
...@@ -546,7 +546,7 @@ e100_atapi_write(ide_drive_t *drive, void *buffer, unsigned int bytecount) ...@@ -546,7 +546,7 @@ e100_atapi_write(ide_drive_t *drive, void *buffer, unsigned int bytecount)
* This is used for most PIO data transfers *from* the IDE interface * This is used for most PIO data transfers *from* the IDE interface
*/ */
static void static void
e100_ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount) e100_ide_input_data (struct ata_device *drive, void *buffer, unsigned int wcount)
{ {
e100_atapi_read(drive, buffer, wcount << 2); e100_atapi_read(drive, buffer, wcount << 2);
} }
...@@ -555,7 +555,7 @@ e100_ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount) ...@@ -555,7 +555,7 @@ e100_ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
* This is used for most PIO data transfers *to* the IDE interface * This is used for most PIO data transfers *to* the IDE interface
*/ */
static void static void
e100_ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount) e100_ide_output_data (struct ata_device *drive, void *buffer, unsigned int wcount)
{ {
e100_atapi_write(drive, buffer, wcount << 2); e100_atapi_write(drive, buffer, wcount << 2);
} }
...@@ -661,7 +661,7 @@ static int e100_udma_new_table(struct ata_channel *ch, struct request *rq) ...@@ -661,7 +661,7 @@ static int e100_udma_new_table(struct ata_channel *ch, struct request *rq)
return 1; /* let the PIO routines handle this weirdness */ return 1; /* let the PIO routines handle this weirdness */
} }
static int config_drive_for_dma (ide_drive_t *drive) static int config_drive_for_dma (struct ata_device *drive)
{ {
const char **list; const char **list;
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
......
...@@ -131,12 +131,7 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then ...@@ -131,12 +131,7 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
bool ' IGNORE word93 Validation BITS' CONFIG_IDEDMA_IVB bool ' IGNORE word93 Validation BITS' CONFIG_IDEDMA_IVB
fi fi
if [ "$CONFIG_BLK_DEV_IDECD" != "n" -o \ define_bool CONFIG_ATAPI y
"$CONFIG_BLK_DEV_IDETAPE" != "n" -o \
"$CONFIG_BLK_DEV_IDEFLOPPY" != "n" -o \
"$CONFIG_BLK_DEV_IDESCSI" != "n" ]; then
define_bool CONFIG_ATAPI y
fi
else else
bool 'Old hard disk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY bool 'Old hard disk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY
define_bool CONFIG_BLK_DEV_HD $CONFIG_BLK_DEV_HD_ONLY define_bool CONFIG_BLK_DEV_HD $CONFIG_BLK_DEV_HD_ONLY
......
...@@ -21,7 +21,7 @@ obj-$(CONFIG_BLK_DEV_HD) += hd.o ...@@ -21,7 +21,7 @@ obj-$(CONFIG_BLK_DEV_HD) += hd.o
obj-$(CONFIG_BLK_DEV_IDE) += ide-mod.o obj-$(CONFIG_BLK_DEV_IDE) += ide-mod.o
obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o
obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o
obj-$(CONFIG_ATAPI) += atapi.o # obj-$(CONFIG_ATAPI) += atapi.o
obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o
obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o
obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o
...@@ -74,6 +74,6 @@ obj-$(CONFIG_BLK_DEV_ATARAID) += ataraid.o ...@@ -74,6 +74,6 @@ obj-$(CONFIG_BLK_DEV_ATARAID) += ataraid.o
obj-$(CONFIG_BLK_DEV_ATARAID_PDC) += pdcraid.o obj-$(CONFIG_BLK_DEV_ATARAID_PDC) += pdcraid.o
obj-$(CONFIG_BLK_DEV_ATARAID_HPT) += hptraid.o obj-$(CONFIG_BLK_DEV_ATARAID_HPT) += hptraid.o
ide-mod-objs := ide-taskfile.o ide.o ide-probe.o ide-geometry.o ide-features.o ata-timing.o $(ide-obj-y) ide-mod-objs := ide-taskfile.o ide.o ide-probe.o ide-geometry.o ide-features.o ata-timing.o atapi.o $(ide-obj-y)
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
...@@ -607,27 +607,7 @@ static struct ata_pci_device chipsets[] __initdata = { ...@@ -607,27 +607,7 @@ static struct ata_pci_device chipsets[] __initdata = {
enablebits: { {0x00,0x00,0x00}, {0x00,0x00,0x00} }, enablebits: { {0x00,0x00,0x00}, {0x00,0x00,0x00} },
bootable: OFF_BOARD, bootable: OFF_BOARD,
flags: ATA_F_IRQ | ATA_F_DMA flags: ATA_F_IRQ | ATA_F_DMA
}, }
{
vendor: PCI_VENDOR_ID_ARTOP,
device: PCI_DEVICE_ID_ARTOP_ATP865,
init_chipset: aec62xx_init_chipset,
ata66_check: aec62xx_ata66_check,
init_channel: aec62xx_init_channel,
enablebits: { {0x00,0x00,0x00}, {0x00,0x00,0x00} },
bootable: NEVER_BOARD,
flags: ATA_F_IRQ | ATA_F_NOADMA | ATA_F_DMA
},
{
vendor: PCI_VENDOR_ID_ARTOP,
device: PCI_DEVICE_ID_ARTOP_ATP865R,
init_chipset: aec62xx_init_chipset,
ata66_check: aec62xx_ata66_check,
init_channel: aec62xx_init_channel,
enablebits: { {0x4a,0x02,0x02}, {0x4a,0x04,0x04} },
bootable: OFF_BOARD,
flags: ATA_F_IRQ | ATA_F_DMA
},
}; };
int __init init_aec62xx(void) int __init init_aec62xx(void)
......
...@@ -226,9 +226,9 @@ static void amd_set_speed(struct pci_dev *dev, unsigned char dn, struct ata_timi ...@@ -226,9 +226,9 @@ static void amd_set_speed(struct pci_dev *dev, unsigned char dn, struct ata_timi
* by upper layers. * by upper layers.
*/ */
static int amd_set_drive(ide_drive_t *drive, unsigned char speed) static int amd_set_drive(struct ata_device *drive, unsigned char speed)
{ {
ide_drive_t *peer = drive->channel->drives + (~drive->dn & 1); struct ata_device *peer = drive->channel->drives + (~drive->dn & 1);
struct ata_timing t, p; struct ata_timing t, p;
int T, UT; int T, UT;
...@@ -263,7 +263,7 @@ static int amd_set_drive(ide_drive_t *drive, unsigned char speed) ...@@ -263,7 +263,7 @@ static int amd_set_drive(ide_drive_t *drive, unsigned char speed)
* PIO-only tuning. * PIO-only tuning.
*/ */
static void amd74xx_tune_drive(ide_drive_t *drive, unsigned char pio) static void amd74xx_tune_drive(struct ata_device *drive, u8 pio)
{ {
if (!((amd_enabled >> drive->channel->unit) & 1)) if (!((amd_enabled >> drive->channel->unit) & 1))
return; return;
......
...@@ -81,7 +81,7 @@ extern char *ide_xfer_verbose (byte xfer_rate); ...@@ -81,7 +81,7 @@ extern char *ide_xfer_verbose (byte xfer_rate);
/* /*
* Set a new transfer mode at the drive * Set a new transfer mode at the drive
*/ */
int cs5530_set_xfer_mode (ide_drive_t *drive, byte mode) int cs5530_set_xfer_mode(struct ata_device *drive, byte mode)
{ {
int error = 0; int error = 0;
...@@ -113,7 +113,7 @@ static unsigned int cs5530_pio_timings[2][5] = ...@@ -113,7 +113,7 @@ static unsigned int cs5530_pio_timings[2][5] =
* The ide_init_cs5530() routine guarantees that all drives * The ide_init_cs5530() routine guarantees that all drives
* will have valid default PIO timings set up before we get here. * will have valid default PIO timings set up before we get here.
*/ */
static void cs5530_tuneproc (ide_drive_t *drive, byte pio) /* pio=255 means "autotune" */ static void cs5530_tuneproc(struct ata_device *drive, byte pio) /* pio=255 means "autotune" */
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
unsigned int format, basereg = CS5530_BASEREG(hwif); unsigned int format, basereg = CS5530_BASEREG(hwif);
...@@ -134,12 +134,12 @@ static void cs5530_tuneproc (ide_drive_t *drive, byte pio) /* pio=255 means "aut ...@@ -134,12 +134,12 @@ static void cs5530_tuneproc (ide_drive_t *drive, byte pio) /* pio=255 means "aut
* cs5530_config_dma() handles selection/setting of DMA/UDMA modes * cs5530_config_dma() handles selection/setting of DMA/UDMA modes
* for both the chipset and drive. * for both the chipset and drive.
*/ */
static int cs5530_config_dma (ide_drive_t *drive) static int cs5530_config_dma(struct ata_device *drive)
{ {
int udma_ok = 1, mode = 0; int udma_ok = 1, mode = 0;
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
int unit = drive->select.b.unit; int unit = drive->select.b.unit;
ide_drive_t *mate = &hwif->drives[unit^1]; struct ata_device *mate = &hwif->drives[unit^1];
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
unsigned int basereg, reg, timings; unsigned int basereg, reg, timings;
......
...@@ -183,7 +183,7 @@ static void compute_clocks (byte pio, pio_clocks_t *p_pclk) ...@@ -183,7 +183,7 @@ static void compute_clocks (byte pio, pio_clocks_t *p_pclk)
/* /*
* set DMA mode a specific channel for CY82C693 * set DMA mode a specific channel for CY82C693
*/ */
static void cy82c693_dma_enable (ide_drive_t *drive, int mode, int single) static void cy82c693_dma_enable(struct ata_device *drive, int mode, int single)
{ {
byte index; byte index;
byte data; byte data;
...@@ -270,7 +270,7 @@ static int cy82c693_dmaproc(struct ata_device *drive) ...@@ -270,7 +270,7 @@ static int cy82c693_dmaproc(struct ata_device *drive)
/* /*
* tune ide drive - set PIO mode * tune ide drive - set PIO mode
*/ */
static void cy82c693_tune_drive (ide_drive_t *drive, byte pio) static void cy82c693_tune_drive(struct ata_device *drive, byte pio)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
......
...@@ -66,7 +66,7 @@ static void sub22 (char b, char c) ...@@ -66,7 +66,7 @@ static void sub22 (char b, char c)
} }
} }
static void tune_dtc2278 (ide_drive_t *drive, byte pio) static void tune_dtc2278(struct ata_device *drive, byte pio)
{ {
unsigned long flags; unsigned long flags;
......
...@@ -94,9 +94,9 @@ static int hpt34x_get_info (char *buffer, char **addr, off_t offset, int count) ...@@ -94,9 +94,9 @@ static int hpt34x_get_info (char *buffer, char **addr, off_t offset, int count)
byte hpt34x_proc = 0; byte hpt34x_proc = 0;
extern char *ide_xfer_verbose (byte xfer_rate); extern char *ide_xfer_verbose(byte xfer_rate);
static void hpt34x_clear_chipset (ide_drive_t *drive) static void hpt34x_clear_chipset(struct ata_device *drive)
{ {
unsigned int reg1 = 0, tmp1 = 0; unsigned int reg1 = 0, tmp1 = 0;
unsigned int reg2 = 0, tmp2 = 0; unsigned int reg2 = 0, tmp2 = 0;
...@@ -109,7 +109,7 @@ static void hpt34x_clear_chipset (ide_drive_t *drive) ...@@ -109,7 +109,7 @@ static void hpt34x_clear_chipset (ide_drive_t *drive)
pci_write_config_dword(drive->channel->pci_dev, 0x48, tmp2); pci_write_config_dword(drive->channel->pci_dev, 0x48, tmp2);
} }
static int hpt34x_tune_chipset (ide_drive_t *drive, byte speed) static int hpt34x_tune_chipset(struct ata_device *drive, byte speed)
{ {
byte hi_speed, lo_speed; byte hi_speed, lo_speed;
unsigned int reg1 = 0, tmp1 = 0; unsigned int reg1 = 0, tmp1 = 0;
...@@ -145,7 +145,7 @@ static int hpt34x_tune_chipset (ide_drive_t *drive, byte speed) ...@@ -145,7 +145,7 @@ static int hpt34x_tune_chipset (ide_drive_t *drive, byte speed)
return ide_config_drive_speed(drive, speed); return ide_config_drive_speed(drive, speed);
} }
static void config_chipset_for_pio(ide_drive_t *drive) static void config_chipset_for_pio(struct ata_device *drive)
{ {
unsigned short eide_pio_timing[6] = {960, 480, 240, 180, 120, 90}; unsigned short eide_pio_timing[6] = {960, 480, 240, 180, 120, 90};
unsigned short xfer_pio = drive->id->eide_pio_modes; unsigned short xfer_pio = drive->id->eide_pio_modes;
...@@ -182,7 +182,7 @@ static void config_chipset_for_pio(ide_drive_t *drive) ...@@ -182,7 +182,7 @@ static void config_chipset_for_pio(ide_drive_t *drive)
(void) hpt34x_tune_chipset(drive, speed); (void) hpt34x_tune_chipset(drive, speed);
} }
static void hpt34x_tune_drive (ide_drive_t *drive, byte pio) static void hpt34x_tune_drive(struct ata_device *drive, byte pio)
{ {
byte speed; byte speed;
......
This diff is collapsed.
...@@ -230,14 +230,14 @@ static unsigned long maxsectors (int major,int minor) ...@@ -230,14 +230,14 @@ static unsigned long maxsectors (int major,int minor)
{ {
unsigned long lba = 0; unsigned long lba = 0;
kdev_t dev; kdev_t dev;
ide_drive_t *ideinfo; struct ata_device *ideinfo;
dev = mk_kdev(major,minor); dev = mk_kdev(major,minor);
ideinfo = get_info_ptr (dev); ideinfo = get_info_ptr (dev);
if (ideinfo==NULL) if (ideinfo==NULL)
return 0; return 0;
/* first sector of the last cluster */ /* first sector of the last cluster */
if (ideinfo->head==0) if (ideinfo->head==0)
return 0; return 0;
......
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
/* /*
* This routine is invoked from ide.c to prepare for access to a given drive. * This routine is invoked from ide.c to prepare for access to a given drive.
*/ */
static void ht6560b_selectproc (ide_drive_t *drive) static void ht6560b_selectproc(struct ata_device *drive)
{ {
unsigned long flags; unsigned long flags;
static byte current_select = 0; static byte current_select = 0;
...@@ -195,7 +195,7 @@ static int __init try_to_init_ht6560b(void) ...@@ -195,7 +195,7 @@ static int __init try_to_init_ht6560b(void)
return 1; return 1;
} }
static byte ht_pio2timings(ide_drive_t *drive, byte pio) static byte ht_pio2timings(struct ata_device *drive, byte pio)
{ {
int active_time, recovery_time; int active_time, recovery_time;
int active_cycles, recovery_cycles; int active_cycles, recovery_cycles;
...@@ -248,7 +248,7 @@ static byte ht_pio2timings(ide_drive_t *drive, byte pio) ...@@ -248,7 +248,7 @@ static byte ht_pio2timings(ide_drive_t *drive, byte pio)
/* /*
* Enable/Disable so called prefetch mode * Enable/Disable so called prefetch mode
*/ */
static void ht_set_prefetch(ide_drive_t *drive, byte state) static void ht_set_prefetch(struct ata_device *drive, byte state)
{ {
unsigned long flags; unsigned long flags;
int t = HT_PREFETCH_MODE << 8; int t = HT_PREFETCH_MODE << 8;
...@@ -275,7 +275,7 @@ static void ht_set_prefetch(ide_drive_t *drive, byte state) ...@@ -275,7 +275,7 @@ static void ht_set_prefetch(ide_drive_t *drive, byte state)
#endif #endif
} }
static void tune_ht6560b (ide_drive_t *drive, byte pio) static void tune_ht6560b(struct ata_device *drive, byte pio)
{ {
unsigned long flags; unsigned long flags;
byte timing; byte timing;
......
...@@ -2925,8 +2925,11 @@ int ide_cdrom_cleanup(struct ata_device *drive) ...@@ -2925,8 +2925,11 @@ int ide_cdrom_cleanup(struct ata_device *drive)
return 0; return 0;
} }
static void ide_cdrom_attach(struct ata_device *drive);
static struct ata_operations ide_cdrom_driver = { static struct ata_operations ide_cdrom_driver = {
owner: THIS_MODULE, owner: THIS_MODULE,
attach: ide_cdrom_attach,
cleanup: ide_cdrom_cleanup, cleanup: ide_cdrom_cleanup,
standby: NULL, standby: NULL,
do_request: ide_cdrom_do_request, do_request: ide_cdrom_do_request,
...@@ -2942,67 +2945,63 @@ static struct ata_operations ide_cdrom_driver = { ...@@ -2942,67 +2945,63 @@ static struct ata_operations ide_cdrom_driver = {
/* options */ /* options */
static char *ignore = NULL; static char *ignore = NULL;
static void ide_cdrom_attach(struct ata_device *drive)
{
struct cdrom_info *info;
char *req;
struct ata_channel *channel;
int unit;
if (drive->type != ATA_ROM)
return;
req = drive->driver_req;
if (req[0] != '\0' && strcmp(req, "ide-cdrom"))
return;
/* skip drives that we were told to ignore */
if (ignore && !strcmp(ignore, drive->name)) {
printk(KERN_INFO "%s: ignored\n", drive->name);
return;
}
info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
if (!info) {
printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name);
return;
}
if (ide_register_subdriver (drive, &ide_cdrom_driver)) {
printk(KERN_ERR "%s: Failed to register the driver with ide.c\n", drive->name);
kfree (info);
return;
}
memset(info, 0, sizeof (struct cdrom_info));
drive->driver_data = info;
if (ide_cdrom_setup (drive)) {
if (ide_cdrom_cleanup (drive))
printk (KERN_ERR "%s: ide_cdrom_cleanup failed in ide_cdrom_init\n", drive->name);
return;
}
channel = drive->channel;
unit = drive - channel->drives;
ide_revalidate_disk(mk_kdev(channel->major, unit << PARTN_BITS));
}
MODULE_PARM(ignore, "s"); MODULE_PARM(ignore, "s");
MODULE_DESCRIPTION("ATAPI CD-ROM Driver"); MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
static void __exit ide_cdrom_exit(void) static void __exit ide_cdrom_exit(void)
{ {
struct ata_device *drive; unregister_ata_driver(&ide_cdrom_driver);
int failed = 0;
while ((drive = ide_scan_devices(ATA_ROM, "ide-cdrom", &ide_cdrom_driver, failed)) != NULL)
if (ide_cdrom_cleanup (drive)) {
printk ("%s: cleanup_module() called while still busy\n", drive->name);
failed++;
}
} }
int ide_cdrom_init(void) int ide_cdrom_init(void)
{ {
struct ata_device *drive; return ata_driver_module(&ide_cdrom_driver);
struct cdrom_info *info;
int failed = 0;
MOD_INC_USE_COUNT;
while ((drive = ide_scan_devices (ATA_ROM, "ide-cdrom", NULL, failed++)) != NULL) {
/* skip drives that we were told to ignore */
if (ignore != NULL) {
if (strstr(ignore, drive->name)) {
printk("ide-cd: ignoring drive %s\n", drive->name);
continue;
}
}
if (drive->scsi) {
printk("ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name);
continue;
}
info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
if (info == NULL) {
printk ("%s: Can't allocate a cdrom structure\n", drive->name);
continue;
}
if (ide_register_subdriver (drive, &ide_cdrom_driver)) {
printk ("%s: Failed to register the driver with ide.c\n", drive->name);
kfree (info);
continue;
}
memset(info, 0, sizeof (struct cdrom_info));
drive->driver_data = info;
MOD_INC_USE_COUNT;
if (ide_cdrom_setup (drive)) {
MOD_DEC_USE_COUNT;
if (ide_cdrom_cleanup (drive))
printk ("%s: ide_cdrom_cleanup failed in ide_cdrom_init\n", drive->name);
continue;
}
MOD_DEC_USE_COUNT;
failed--;
}
revalidate_drives();
MOD_DEC_USE_COUNT;
return 0;
} }
module_init(ide_cdrom_init); module_init(ide_cdrom_init);
......
...@@ -913,7 +913,7 @@ static void idedisk_setup(struct ata_device *drive) ...@@ -913,7 +913,7 @@ static void idedisk_setup(struct ata_device *drive)
if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) && if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) &&
(!drive->forced_geom) && drive->bios_sect && drive->bios_head) (!drive->forced_geom) && drive->bios_sect && drive->bios_head)
drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head; drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head;
printk(KERN_INFO "%s: %ld sectors", drive->name, capacity); printk(KERN_INFO " %s: %ld sectors", drive->name, capacity);
#if 0 #if 0
...@@ -1149,12 +1149,14 @@ static int idedisk_ioctl(struct ata_device *drive, struct inode *inode, struct f ...@@ -1149,12 +1149,14 @@ static int idedisk_ioctl(struct ata_device *drive, struct inode *inode, struct f
} }
} }
static void idedisk_attach(struct ata_device *drive);
/* /*
* Subdriver functions. * Subdriver functions.
*/ */
static struct ata_operations idedisk_driver = { static struct ata_operations idedisk_driver = {
owner: THIS_MODULE, owner: THIS_MODULE,
attach: idedisk_attach,
cleanup: idedisk_cleanup, cleanup: idedisk_cleanup,
standby: idedisk_standby, standby: idedisk_standby,
do_request: idedisk_do_request, do_request: idedisk_do_request,
...@@ -1167,46 +1169,49 @@ static struct ata_operations idedisk_driver = { ...@@ -1167,46 +1169,49 @@ static struct ata_operations idedisk_driver = {
capacity: idedisk_capacity, capacity: idedisk_capacity,
}; };
MODULE_DESCRIPTION("ATA DISK Driver"); static void idedisk_attach(struct ata_device *drive)
static void __exit idedisk_exit (void)
{ {
struct ata_device *drive; char *req;
int failed = 0; struct ata_channel *channel;
int unit;
while ((drive = ide_scan_devices(ATA_DISK, "ide-disk", &idedisk_driver, failed)) != NULL) { if (drive->type != ATA_DISK)
if (idedisk_cleanup (drive)) { return;
printk(KERN_ERR "%s: cleanup_module() called while still busy\n", drive->name);
++failed; req = drive->driver_req;
} if (req[0] != '\0' && strcmp(req, "ide-disk"))
return;
if (ide_register_subdriver(drive, &idedisk_driver)) {
printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name);
return;
}
idedisk_setup(drive);
if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", drive->name, drive->head);
idedisk_cleanup(drive);
return;
} }
channel = drive->channel;
unit = drive - channel->drives;
ide_revalidate_disk(mk_kdev(channel->major, unit << PARTN_BITS));
} }
int idedisk_init(void) static void __exit idedisk_exit(void)
{ {
struct ata_device *drive; unregister_ata_driver(&idedisk_driver);
int failed = 0; }
MOD_INC_USE_COUNT;
while ((drive = ide_scan_devices(ATA_DISK, "ide-disk", NULL, failed++)) != NULL) {
if (ide_register_subdriver (drive, &idedisk_driver)) {
printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name);
continue;
}
idedisk_setup(drive);
if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", drive->name, drive->head);
idedisk_cleanup(drive);
continue;
}
--failed;
}
revalidate_drives();
MOD_DEC_USE_COUNT;
return 0; int __init idedisk_init(void)
{
return ata_driver_module(&idedisk_driver);
} }
module_init(idedisk_init); module_init(idedisk_init);
module_exit(idedisk_exit); module_exit(idedisk_exit);
MODULE_DESCRIPTION("ATA DISK Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/* /*
* linux/drivers/ide/ide-floppy.c Version 0.99 Feb 24 2002
*
* Copyright (C) 1996 - 1999 Gadi Oxman <gadio@netvision.net.il> * Copyright (C) 1996 - 1999 Gadi Oxman <gadio@netvision.net.il>
* Copyright (C) 2000 - 2002 Paul Bristow <paul@paulbristow.net> * Copyright (C) 2000 - 2002 Paul Bristow <paul@paulbristow.net>
*/ */
...@@ -1977,11 +1975,14 @@ static int idefloppy_cleanup(struct ata_device *drive) ...@@ -1977,11 +1975,14 @@ static int idefloppy_cleanup(struct ata_device *drive)
return 0; return 0;
} }
static void idefloppy_attach(struct ata_device *drive);
/* /*
* IDE subdriver functions, registered with ide.c * IDE subdriver functions, registered with ide.c
*/ */
static struct ata_operations idefloppy_driver = { static struct ata_operations idefloppy_driver = {
owner: THIS_MODULE, owner: THIS_MODULE,
attach: idefloppy_attach,
cleanup: idefloppy_cleanup, cleanup: idefloppy_cleanup,
standby: NULL, standby: NULL,
do_request: idefloppy_do_request, do_request: idefloppy_do_request,
...@@ -1994,59 +1995,60 @@ static struct ata_operations idefloppy_driver = { ...@@ -1994,59 +1995,60 @@ static struct ata_operations idefloppy_driver = {
capacity: idefloppy_capacity, capacity: idefloppy_capacity,
}; };
MODULE_DESCRIPTION("ATAPI FLOPPY Driver"); static void idefloppy_attach(struct ata_device *drive)
static void __exit idefloppy_exit(void)
{ {
struct ata_device *drive; idefloppy_floppy_t *floppy;
int failed = 0; char *req;
struct ata_channel *channel;
int unit;
while ((drive = ide_scan_devices(ATA_FLOPPY, "ide-floppy", &idefloppy_driver, failed)) != NULL) { if (drive->type != ATA_FLOPPY)
if (idefloppy_cleanup(drive)) { return;
printk ("%s: cleanup_module() called while still busy\n", drive->name);
failed++; req = drive->driver_req;
} if (req[0] != '\0' && strcmp(req, "ide-floppy"))
return;
if (!idefloppy_identify_device (drive, drive->id)) {
printk (KERN_ERR "ide-floppy: %s: not supported by this version of driver\n",
drive->name);
return;
}
if (drive->scsi) {
printk(KERN_INFO "ide-floppy: passing drive %s to ide-scsi emulation.\n",
drive->name);
return;
}
if (!(floppy = (idefloppy_floppy_t *) kmalloc (sizeof (idefloppy_floppy_t), GFP_KERNEL))) {
printk(KERN_ERR "ide-floppy: %s: Can't allocate a floppy structure\n",
drive->name);
return;
}
if (ide_register_subdriver(drive, &idefloppy_driver)) {
printk(KERN_ERR "ide-floppy: %s: Failed to register the driver with ide.c\n", drive->name);
kfree (floppy);
return;
} }
idefloppy_setup(drive, floppy);
channel = drive->channel;
unit = drive - channel->drives;
ide_revalidate_disk(mk_kdev(channel->major, unit << PARTN_BITS));
} }
/* MODULE_DESCRIPTION("ATAPI FLOPPY Driver");
* idefloppy_init will register the driver for each floppy.
*/
int idefloppy_init(void)
{
struct ata_device *drive;
idefloppy_floppy_t *floppy;
int failed = 0;
printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); static void __exit idefloppy_exit(void)
MOD_INC_USE_COUNT; {
while ((drive = ide_scan_devices (ATA_FLOPPY, "ide-floppy", NULL, failed++)) != NULL) { unregister_ata_driver(&idefloppy_driver);
if (!idefloppy_identify_device (drive, drive->id)) { }
printk (KERN_ERR "ide-floppy: %s: not supported by this version of ide-floppy\n", drive->name);
continue;
}
if (drive->scsi) {
printk("ide-floppy: passing drive %s to ide-scsi emulation.\n", drive->name);
continue;
}
if ((floppy = (idefloppy_floppy_t *) kmalloc (sizeof (idefloppy_floppy_t), GFP_KERNEL)) == NULL) {
printk (KERN_ERR "ide-floppy: %s: Can't allocate a floppy structure\n", drive->name);
continue;
}
if (ide_register_subdriver (drive, &idefloppy_driver)) {
printk (KERN_ERR "ide-floppy: %s: Failed to register the driver with ide.c\n", drive->name);
kfree (floppy);
continue;
}
MOD_INC_USE_COUNT;
idefloppy_setup (drive, floppy);
MOD_DEC_USE_COUNT;
failed--; int __init idefloppy_init(void)
} {
revalidate_drives(); return ata_driver_module(&idefloppy_driver);
MOD_DEC_USE_COUNT;
return 0;
} }
module_init(idefloppy_init); module_init(idefloppy_init);
......
...@@ -51,7 +51,7 @@ static void print_funcid (int func); ...@@ -51,7 +51,7 @@ static void print_funcid (int func);
static int check_ide_device (unsigned long base); static int check_ide_device (unsigned long base);
static void ide_interrupt_ack (void *dev); static void ide_interrupt_ack (void *dev);
static void m8xx_ide_tuneproc(ide_drive_t *drive, byte pio); static void m8xx_ide_tuneproc(struct ata_device *drive, byte pio);
typedef struct ide_ioport_desc { typedef struct ide_ioport_desc {
unsigned long base_off; /* Offset to PCMCIA memory */ unsigned long base_off; /* Offset to PCMCIA memory */
...@@ -437,7 +437,7 @@ void m8xx_ide_init_hwif_ports (hw_regs_t *hw, ...@@ -437,7 +437,7 @@ void m8xx_ide_init_hwif_ports (hw_regs_t *hw,
/* Calculate PIO timings */ /* Calculate PIO timings */
static void static void
m8xx_ide_tuneproc(ide_drive_t *drive, byte pio) m8xx_ide_tuneproc(struct ata_device *drive, byte pio)
{ {
#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) #if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT)
volatile pcmconf8xx_t *pcmp; volatile pcmconf8xx_t *pcmp;
......
...@@ -207,7 +207,8 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co ...@@ -207,7 +207,8 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co
if ((dev->vendor == PCI_VENDOR_ID_AL && dev->device == PCI_DEVICE_ID_AL_M5219) || if ((dev->vendor == PCI_VENDOR_ID_AL && dev->device == PCI_DEVICE_ID_AL_M5219) ||
(dev->vendor == PCI_VENDOR_ID_AMD && dev->device == PCI_DEVICE_ID_AMD_VIPER_7409) || (dev->vendor == PCI_VENDOR_ID_AMD && dev->device == PCI_DEVICE_ID_AMD_VIPER_7409) ||
(dev->vendor == PCI_VENDOR_ID_CMD && dev->device == PCI_DEVICE_ID_CMD_643)) { (dev->vendor == PCI_VENDOR_ID_CMD && dev->device == PCI_DEVICE_ID_CMD_643) ||
(dev->vendor == PCI_VENDOR_ID_SERVERWORKS && dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE)) {
outb(inb(dma_base + 2) & 0x60, dma_base+2); outb(inb(dma_base + 2) & 0x60, dma_base+2);
if (inb(dma_base + 2) & 0x80) if (inb(dma_base + 2) & 0x80)
printk(KERN_INFO "%s: simplex device: DMA forced\n", name); printk(KERN_INFO "%s: simplex device: DMA forced\n", name);
...@@ -553,14 +554,14 @@ static void __init pdc20270_device_order_fixup (struct pci_dev *dev, struct ata_ ...@@ -553,14 +554,14 @@ static void __init pdc20270_device_order_fixup (struct pci_dev *dev, struct ata_
} }
} }
} }
printk(KERN_INFO "ATA: %s: controller on PCI slot %s dev %02x\n", printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev->name, dev->slot_name, dev->devfn); dev->name, dev->slot_name);
setup_pci_device(dev, d); setup_pci_device(dev, d);
if (!dev2) if (!dev2)
return; return;
d2 = d; d2 = d;
printk(KERN_INFO "ATA: %s: controller on PCI slot %s dev %02x\n", printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev2->name, dev2->slot_name, dev2->devfn); dev2->name, dev2->slot_name);
setup_pci_device(dev2, d2); setup_pci_device(dev2, d2);
} }
...@@ -583,8 +584,8 @@ static void __init hpt374_device_order_fixup (struct pci_dev *dev, struct ata_pc ...@@ -583,8 +584,8 @@ static void __init hpt374_device_order_fixup (struct pci_dev *dev, struct ata_pc
} }
} }
printk(KERN_INFO "ATA: %s: controller on PCI slot %s dev %02x\n", printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev->name, dev->slot_name, dev->devfn); dev->name, dev->slot_name);
setup_pci_device(dev, d); setup_pci_device(dev, d);
if (!dev2) { if (!dev2) {
return; return;
...@@ -600,8 +601,8 @@ static void __init hpt374_device_order_fixup (struct pci_dev *dev, struct ata_pc ...@@ -600,8 +601,8 @@ static void __init hpt374_device_order_fixup (struct pci_dev *dev, struct ata_pc
} }
} }
d2 = d; d2 = d;
printk(KERN_INFO "ATA: %s: controller on PCI slot %s dev %02x\n", printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev2->name, dev2->slot_name, dev2->devfn); dev2->name, dev2->slot_name);
setup_pci_device(dev2, d2); setup_pci_device(dev2, d2);
} }
...@@ -622,7 +623,8 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, struct ata_pc ...@@ -622,7 +623,8 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, struct ata_pc
switch(class_rev) { switch(class_rev) {
case 5: case 5:
case 4: case 4:
case 3: printk(KERN_INFO "ATA: %s: controller on PCI slot %s\n", dev->name, dev->slot_name); case 3: printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev->name, dev->slot_name);
setup_pci_device(dev, d); setup_pci_device(dev, d);
return; return;
default: break; default: break;
...@@ -643,12 +645,14 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, struct ata_pc ...@@ -643,12 +645,14 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, struct ata_pc
break; break;
} }
} }
printk(KERN_INFO "ATA: %s: controller on PCI slot %s\n", dev->name, dev->slot_name); printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev->name, dev->slot_name);
setup_pci_device(dev, d); setup_pci_device(dev, d);
if (!dev2) if (!dev2)
return; return;
d2 = d; d2 = d;
printk(KERN_INFO "ATA: %s: controller on PCI slot %s\n", dev2->name, dev2->slot_name); printk(KERN_INFO "ATA: %s: controller, PCI slot %s\n",
dev2->name, dev2->slot_name);
setup_pci_device(dev2, d2); setup_pci_device(dev2, d2);
} }
...@@ -683,7 +687,7 @@ static void __init scan_pcidev(struct pci_dev *dev) ...@@ -683,7 +687,7 @@ static void __init scan_pcidev(struct pci_dev *dev)
* beeing grabbed by generic drivers. * beeing grabbed by generic drivers.
*/ */
if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) { if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
printk(KERN_INFO "ATA: unknown interface: %s, on PCI slot %s\n", printk(KERN_INFO "ATA: unknown interface: %s, PCI slot %s\n",
dev->name, dev->slot_name); dev->name, dev->slot_name);
} }
return; return;
...@@ -707,8 +711,8 @@ static void __init scan_pcidev(struct pci_dev *dev) ...@@ -707,8 +711,8 @@ static void __init scan_pcidev(struct pci_dev *dev)
} else if (d->vendor == PCI_VENDOR_ID_PROMISE && d->device == PCI_DEVICE_ID_PROMISE_20268R) } else if (d->vendor == PCI_VENDOR_ID_PROMISE && d->device == PCI_DEVICE_ID_PROMISE_20268R)
pdc20270_device_order_fixup(dev, d); pdc20270_device_order_fixup(dev, d);
else { else {
printk(KERN_INFO "ATA: %s (%04x:%04x) on PCI slot %s\n", printk(KERN_INFO "ATA: %s, PCI slot %s\n",
dev->name, vendor, device, dev->slot_name); dev->name, dev->slot_name);
setup_pci_device(dev, d); setup_pci_device(dev, d);
} }
} }
......
/* /*
* linux/drivers/ide/ide-tape.c Version 1.17a Jan, 2001
*
* Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il> * Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il>
* *
* $Header$
*
* This driver was constructed as a student project in the software laboratory * This driver was constructed as a student project in the software laboratory
* of the faculty of electrical engineering in the Technion - Israel's * of the faculty of electrical engineering in the Technion - Israel's
* Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David. * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David.
...@@ -5849,7 +5845,7 @@ static void idetape_get_mode_sense_results(struct ata_device *drive) ...@@ -5849,7 +5845,7 @@ static void idetape_get_mode_sense_results(struct ata_device *drive)
printk (KERN_INFO "ide-tape: Medium Type - %d\n",header->medium_type); printk (KERN_INFO "ide-tape: Medium Type - %d\n",header->medium_type);
printk (KERN_INFO "ide-tape: Device Specific Parameter - %d\n",header->dsp); printk (KERN_INFO "ide-tape: Device Specific Parameter - %d\n",header->dsp);
printk (KERN_INFO "ide-tape: Block Descriptor Length - %d\n",header->bdl); printk (KERN_INFO "ide-tape: Block Descriptor Length - %d\n",header->bdl);
printk (KERN_INFO "ide-tape: Capabilities and Mechanical Status Page:\n"); printk (KERN_INFO "ide-tape: Capabilities and Mechanical Status Page:\n");
printk (KERN_INFO "ide-tape: Page code - %d\n",capabilities->page_code); printk (KERN_INFO "ide-tape: Page code - %d\n",capabilities->page_code);
printk (KERN_INFO "ide-tape: Page length - %d\n",capabilities->page_length); printk (KERN_INFO "ide-tape: Page length - %d\n",capabilities->page_length);
...@@ -5955,7 +5951,7 @@ static void idetape_setup(struct ata_device *drive, idetape_tape_t *tape, int mi ...@@ -5955,7 +5951,7 @@ static void idetape_setup(struct ata_device *drive, idetape_tape_t *tape, int mi
set_bit(IDETAPE_DRQ_INTERRUPT, &tape->flags); set_bit(IDETAPE_DRQ_INTERRUPT, &tape->flags);
tape->min_pipeline = tape->max_pipeline = tape->max_stages = 10; tape->min_pipeline = tape->max_pipeline = tape->max_stages = 10;
idetape_get_inquiry_results(drive); idetape_get_inquiry_results(drive);
idetape_get_mode_sense_results(drive); idetape_get_mode_sense_results(drive);
idetape_get_blocksize_from_block_descriptor(drive); idetape_get_blocksize_from_block_descriptor(drive);
...@@ -6054,11 +6050,11 @@ static void idetape_revalidate(struct ata_device *_dummy) ...@@ -6054,11 +6050,11 @@ static void idetape_revalidate(struct ata_device *_dummy)
*/ */
} }
/* static void idetape_attach(struct ata_device *);
* IDE subdriver functions, registered with ide.c
*/
static struct ata_operations idetape_driver = { static struct ata_operations idetape_driver = {
owner: THIS_MODULE, owner: THIS_MODULE,
attach: idetape_attach,
cleanup: idetape_cleanup, cleanup: idetape_cleanup,
standby: NULL, standby: NULL,
do_request: idetape_do_request, do_request: idetape_do_request,
...@@ -6070,6 +6066,8 @@ static struct ata_operations idetape_driver = { ...@@ -6070,6 +6066,8 @@ static struct ata_operations idetape_driver = {
revalidate: idetape_revalidate, revalidate: idetape_revalidate,
}; };
/* /*
* Our character device supporting functions, passed to register_chrdev. * Our character device supporting functions, passed to register_chrdev.
*/ */
...@@ -6082,104 +6080,93 @@ static struct file_operations idetape_fops = { ...@@ -6082,104 +6080,93 @@ static struct file_operations idetape_fops = {
release: idetape_chrdev_release, release: idetape_chrdev_release,
}; };
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver"); static void idetape_attach(struct ata_device *drive)
MODULE_LICENSE("GPL");
static void __exit idetape_exit(void)
{ {
struct ata_device *drive; idetape_tape_t *tape;
int minor; int minor, supported = 0;
char *req;
struct ata_channel *channel;
int unit;
for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++) { if (drive->type != ATA_TAPE)
drive = idetape_chrdevs[minor].drive; return;
if (drive != NULL && idetape_cleanup (drive))
printk (KERN_ERR "ide-tape: %s: cleanup_module() called while still busy\n", drive->name); req = drive->driver_req;
} if (req[0] != '\0' && strcmp(req, "ide-tape"))
} return;
/*
* idetape_init will register the driver for each tape.
*/
int idetape_init(void)
{
struct ata_device *drive;
idetape_tape_t *tape;
int minor, failed = 0, supported = 0;
/* DRIVER(drive)->busy++; */
MOD_INC_USE_COUNT;
#if ONSTREAM_DEBUG
printk(KERN_INFO "ide-tape: MOD_INC_USE_COUNT in idetape_init\n");
#endif
if (!idetape_chrdev_present) if (!idetape_chrdev_present)
for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++ ) for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++ )
idetape_chrdevs[minor].drive = NULL; idetape_chrdevs[minor].drive = NULL;
if ((drive = ide_scan_devices(ATA_TAPE, "ide-tape", NULL, failed++)) == NULL) {
revalidate_drives();
MOD_DEC_USE_COUNT;
#if ONSTREAM_DEBUG
printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in idetape_init\n");
#endif
return 0;
}
if (!idetape_chrdev_present && if (!idetape_chrdev_present &&
devfs_register_chrdev (IDETAPE_MAJOR, "ht", &idetape_fops)) { devfs_register_chrdev (IDETAPE_MAJOR, "ht", &idetape_fops)) {
printk (KERN_ERR "ide-tape: Failed to register character device interface\n"); printk(KERN_ERR "ide-tape: Failed to register character device interface\n");
MOD_DEC_USE_COUNT; return;
#if ONSTREAM_DEBUG
printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in idetape_init\n");
#endif
return -EBUSY;
} }
do {
if (!idetape_identify_device (drive, drive->id)) { if (!idetape_identify_device (drive, drive->id)) {
printk (KERN_ERR "ide-tape: %s: not supported by this version of ide-tape\n", drive->name); printk(KERN_ERR "ide-tape: %s: not supported by this version of ide-tape\n", drive->name);
continue; return;
} }
if (drive->scsi) { if (drive->scsi) {
if (strstr(drive->id->model, "OnStream DI-")) { if (strstr(drive->id->model, "OnStream DI-")) {
printk("ide-tape: ide-scsi emulation is not supported for %s.\n", drive->id->model); printk(KERN_INFO "ide-tape: ide-scsi emulation is not supported for %s.\n", drive->id->model);
} else { } else {
printk("ide-tape: passing drive %s to ide-scsi emulation.\n", drive->name); printk(KERN_INFO "ide-tape: passing drive %s to ide-scsi emulation.\n", drive->name);
continue; return;
}
}
tape = (idetape_tape_t *) kmalloc (sizeof (idetape_tape_t), GFP_KERNEL);
if (tape == NULL) {
printk (KERN_ERR "ide-tape: %s: Can't allocate a tape structure\n", drive->name);
continue;
}
if (ide_register_subdriver (drive, &idetape_driver)) {
printk (KERN_ERR "ide-tape: %s: Failed to register the driver with ide.c\n", drive->name);
kfree (tape);
continue;
} }
for (minor = 0; idetape_chrdevs[minor].drive != NULL; minor++); }
idetape_setup (drive, tape, minor); tape = (idetape_tape_t *) kmalloc (sizeof (idetape_tape_t), GFP_KERNEL);
idetape_chrdevs[minor].drive = drive; if (!tape) {
tape->de_r = printk (KERN_ERR "ide-tape: %s: Can't allocate a tape structure\n", drive->name);
devfs_register (drive->de, "mt", DEVFS_FL_DEFAULT, return;
drive->channel->major, minor, }
S_IFCHR | S_IRUGO | S_IWUGO, if (ide_register_subdriver (drive, &idetape_driver)) {
&idetape_fops, NULL); printk (KERN_ERR "ide-tape: %s: Failed to register the driver with ide.c\n", drive->name);
tape->de_n = kfree (tape);
devfs_register (drive->de, "mtn", DEVFS_FL_DEFAULT, return;
drive->channel->major, minor + 128, }
S_IFCHR | S_IRUGO | S_IWUGO, for (minor = 0; idetape_chrdevs[minor].drive != NULL; minor++);
&idetape_fops, NULL); idetape_setup (drive, tape, minor);
devfs_register_tape (tape->de_r); idetape_chrdevs[minor].drive = drive;
supported++; failed--; tape->de_r =
} while ((drive = ide_scan_devices(ATA_TAPE, "ide-tape", NULL, failed++)) != NULL); devfs_register (drive->de, "mt", DEVFS_FL_DEFAULT,
drive->channel->major, minor,
S_IFCHR | S_IRUGO | S_IWUGO,
&idetape_fops, NULL);
tape->de_n =
devfs_register (drive->de, "mtn", DEVFS_FL_DEFAULT,
drive->channel->major, minor + 128,
S_IFCHR | S_IRUGO | S_IWUGO,
&idetape_fops, NULL);
devfs_register_tape (tape->de_r);
supported++;
if (!idetape_chrdev_present && !supported) { if (!idetape_chrdev_present && !supported) {
devfs_unregister_chrdev (IDETAPE_MAJOR, "ht"); devfs_unregister_chrdev (IDETAPE_MAJOR, "ht");
} else } else
idetape_chrdev_present = 1; idetape_chrdev_present = 1;
revalidate_drives();
MOD_DEC_USE_COUNT; /* Feel free to use partitions even on tapes... */
#if ONSTREAM_DEBUG
printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in idetape_init\n"); channel = drive->channel;
#endif unit = drive - channel->drives;
return 0;
ide_revalidate_disk(mk_kdev(channel->major, unit << PARTN_BITS));
}
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
MODULE_LICENSE("GPL");
static void __exit idetape_exit(void)
{
unregister_ata_driver(&idetape_driver);
}
int __init idetape_init(void)
{
return ata_driver_module(&idetape_driver);
} }
module_init(idetape_init); module_init(idetape_init);
......
This diff is collapsed.
...@@ -48,17 +48,17 @@ ...@@ -48,17 +48,17 @@
/* /*
* Prototypes * Prototypes
*/ */
static void it8172_tune_drive (ide_drive_t *drive, byte pio); static void it8172_tune_drive (struct ata_device *drive, byte pio);
#if defined(CONFIG_BLK_DEV_IDEDMA) && defined(CONFIG_IT8172_TUNING) #if defined(CONFIG_BLK_DEV_IDEDMA) && defined(CONFIG_IT8172_TUNING)
static byte it8172_dma_2_pio (byte xfer_rate); static byte it8172_dma_2_pio (byte xfer_rate);
static int it8172_tune_chipset (ide_drive_t *drive, byte speed); static int it8172_tune_chipset (struct ata_device *drive, byte speed);
static int it8172_config_chipset_for_dma (ide_drive_t *drive); static int it8172_config_chipset_for_dma (struct ata_device *drive);
static int it8172_dmaproc(ide_dma_action_t func, ide_drive_t *drive); static int it8172_dmaproc(ide_dma_action_t func, struct ata_device *drive);
#endif #endif
void __init ide_init_it8172(struct ata_channel *channel); void __init ide_init_it8172(struct ata_channel *channel);
static void it8172_tune_drive (ide_drive_t *drive, byte pio) static void it8172_tune_drive (struct ata_device *drive, byte pio)
{ {
unsigned long flags; unsigned long flags;
u16 drive_enables; u16 drive_enables;
...@@ -139,7 +139,7 @@ static byte it8172_dma_2_pio (byte xfer_rate) ...@@ -139,7 +139,7 @@ static byte it8172_dma_2_pio (byte xfer_rate)
} }
} }
static int it8172_tune_chipset (ide_drive_t *drive, byte speed) static int it8172_tune_chipset (struct ata_device *drive, byte speed)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
...@@ -194,7 +194,7 @@ static int it8172_tune_chipset (ide_drive_t *drive, byte speed) ...@@ -194,7 +194,7 @@ static int it8172_tune_chipset (ide_drive_t *drive, byte speed)
return err; return err;
} }
static int it8172_config_chipset_for_dma(ide_drive_t *drive) static int it8172_config_chipset_for_dma(struct ata_device *drive)
{ {
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
byte speed; byte speed;
...@@ -210,7 +210,7 @@ static int it8172_config_chipset_for_dma(ide_drive_t *drive) ...@@ -210,7 +210,7 @@ static int it8172_config_chipset_for_dma(ide_drive_t *drive)
ide_dma_off_quietly); ide_dma_off_quietly);
} }
static int it8172_dmaproc(ide_dma_action_t func, ide_drive_t *drive) static int it8172_dmaproc(ide_dma_action_t func, struct ata_device *drive)
{ {
switch (func) { switch (func) {
case ide_dma_check: case ide_dma_check:
......
...@@ -119,7 +119,7 @@ void macide_init(void) ...@@ -119,7 +119,7 @@ void macide_init(void)
/* hardware ID, and we cna't get that without */ /* hardware ID, and we cna't get that without */
/* probing the drive which freezes a 190. */ /* probing the drive which freezes a 190. */
ide_drive_t *drive = &ide_hwifs[index].drives[0]; struct ata_device *drive = &ide_hwifs[index].drives[0];
drive->capacity = drive->cyl*drive->head*drive->sect; drive->capacity = drive->cyl*drive->head*drive->sect;
#ifdef CONFIG_BLK_DEV_MAC_MEDIABAY #ifdef CONFIG_BLK_DEV_MAC_MEDIABAY
......
...@@ -33,7 +33,7 @@ static unsigned int ns87415_count = 0, ns87415_control[MAX_HWIFS] = { 0 }; ...@@ -33,7 +33,7 @@ static unsigned int ns87415_count = 0, ns87415_control[MAX_HWIFS] = { 0 };
* the IRQ associated with the port (drive->channel), * the IRQ associated with the port (drive->channel),
* and selects either PIO or DMA handshaking for the next I/O operation. * and selects either PIO or DMA handshaking for the next I/O operation.
*/ */
static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma) static void ns87415_prepare_drive(struct ata_device *drive, unsigned int use_dma)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
unsigned int bit, other, new, *old = (unsigned int *) hwif->select_data; unsigned int bit, other, new, *old = (unsigned int *) hwif->select_data;
...@@ -78,7 +78,7 @@ static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma) ...@@ -78,7 +78,7 @@ static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
__restore_flags(flags); /* local CPU only */ __restore_flags(flags); /* local CPU only */
} }
static void ns87415_selectproc (ide_drive_t *drive) static void ns87415_selectproc(struct ata_device *drive)
{ {
ns87415_prepare_drive (drive, drive->using_dma); ns87415_prepare_drive (drive, drive->using_dma);
} }
......
...@@ -137,7 +137,7 @@ int reg_base; ...@@ -137,7 +137,7 @@ int reg_base;
/* there are stored pio numbers from other calls of opti621_tune_drive */ /* there are stored pio numbers from other calls of opti621_tune_drive */
static void compute_pios(ide_drive_t *drive, byte pio) static void compute_pios(struct ata_device *drive, byte pio)
/* Store values into drive->drive_data /* Store values into drive->drive_data
* second_contr - 0 for primary controller, 1 for secondary * second_contr - 0 for primary controller, 1 for secondary
* slave_drive - 0 -> pio is for master, 1 -> pio is for slave * slave_drive - 0 -> pio is for master, 1 -> pio is for slave
...@@ -245,7 +245,7 @@ static void compute_clocks(int pio, pio_clocks_t *clks) ...@@ -245,7 +245,7 @@ static void compute_clocks(int pio, pio_clocks_t *clks)
} }
/* Main tune procedure, called from tuneproc. */ /* Main tune procedure, called from tuneproc. */
static void opti621_tune_drive (ide_drive_t *drive, byte pio) static void opti621_tune_drive(struct ata_device *drive, byte pio)
{ {
/* primary and secondary drives share some registers, /* primary and secondary drives share some registers,
* so we have to program both drives * so we have to program both drives
......
This diff is collapsed.
...@@ -377,7 +377,7 @@ static int pdcraid1_make_request (request_queue_t *q, int rw, struct buffer_head ...@@ -377,7 +377,7 @@ static int pdcraid1_make_request (request_queue_t *q, int rw, struct buffer_head
static unsigned long calc_pdcblock_offset(struct block_device *bdev) static unsigned long calc_pdcblock_offset(struct block_device *bdev)
{ {
unsigned long lba = 0; unsigned long lba = 0;
ide_drive_t *ideinfo = get_info_ptr(to_kdev_t(bdev->bd_dev)); struct ata_device *ideinfo = get_info_ptr(to_kdev_t(bdev->bd_dev));
if (ideinfo==NULL) if (ideinfo==NULL)
return 0; return 0;
......
...@@ -112,7 +112,7 @@ byte __init qd_read_reg (byte reg) ...@@ -112,7 +112,7 @@ byte __init qd_read_reg (byte reg)
* This routine is invoked from ide.c to prepare for access to a given drive. * This routine is invoked from ide.c to prepare for access to a given drive.
*/ */
static void qd_select (ide_drive_t *drive) static void qd_select(struct ata_device *drive)
{ {
byte index = (( (QD_TIMREG(drive)) & 0x80 ) >> 7) | byte index = (( (QD_TIMREG(drive)) & 0x80 ) >> 7) |
(QD_TIMREG(drive) & 0x02); (QD_TIMREG(drive) & 0x02);
...@@ -164,7 +164,7 @@ static byte qd6580_compute_timing (int active_time, int recovery_time) ...@@ -164,7 +164,7 @@ static byte qd6580_compute_timing (int active_time, int recovery_time)
* tries to find timing from dos driver's table * tries to find timing from dos driver's table
*/ */
static int qd_find_disk_type (ide_drive_t *drive, static int qd_find_disk_type(struct ata_device *drive,
int *active_time, int *recovery_time) int *active_time, int *recovery_time)
{ {
struct qd65xx_timing_s *p; struct qd65xx_timing_s *p;
...@@ -192,7 +192,7 @@ static int qd_find_disk_type (ide_drive_t *drive, ...@@ -192,7 +192,7 @@ static int qd_find_disk_type (ide_drive_t *drive,
* check whether timings don't conflict * check whether timings don't conflict
*/ */
static int qd_timing_ok (ide_drive_t drives[]) static int qd_timing_ok(struct ata_device drives[])
{ {
return (IDE_IMPLY(drives[0].present && drives[1].present, return (IDE_IMPLY(drives[0].present && drives[1].present,
IDE_IMPLY(QD_TIMREG(drives) == QD_TIMREG(drives+1), IDE_IMPLY(QD_TIMREG(drives) == QD_TIMREG(drives+1),
...@@ -206,7 +206,7 @@ static int qd_timing_ok (ide_drive_t drives[]) ...@@ -206,7 +206,7 @@ static int qd_timing_ok (ide_drive_t drives[])
* records the timing, and enables selectproc as needed * records the timing, and enables selectproc as needed
*/ */
static void qd_set_timing (ide_drive_t *drive, byte timing) static void qd_set_timing(struct ata_device *drive, byte timing)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
...@@ -225,7 +225,7 @@ static void qd_set_timing (ide_drive_t *drive, byte timing) ...@@ -225,7 +225,7 @@ static void qd_set_timing (ide_drive_t *drive, byte timing)
* qd6500_tune_drive * qd6500_tune_drive
*/ */
static void qd6500_tune_drive (ide_drive_t *drive, byte pio) static void qd6500_tune_drive(struct ata_device *drive, byte pio)
{ {
int active_time = 175; int active_time = 175;
int recovery_time = 415; /* worst case values from the dos driver */ int recovery_time = 415; /* worst case values from the dos driver */
...@@ -247,7 +247,7 @@ static void qd6500_tune_drive (ide_drive_t *drive, byte pio) ...@@ -247,7 +247,7 @@ static void qd6500_tune_drive (ide_drive_t *drive, byte pio)
* qd6580_tune_drive * qd6580_tune_drive
*/ */
static void qd6580_tune_drive (ide_drive_t *drive, byte pio) static void qd6580_tune_drive(struct ata_device *drive, byte pio)
{ {
struct ata_timing *t; struct ata_timing *t;
int base = drive->channel->select_data; int base = drive->channel->select_data;
......
...@@ -240,6 +240,26 @@ extern char *ide_xfer_verbose (byte xfer_rate); ...@@ -240,6 +240,26 @@ extern char *ide_xfer_verbose (byte xfer_rate);
static struct pci_dev *isa_dev; static struct pci_dev *isa_dev;
static int svwks_ratemask(struct ata_device *drive)
{
struct pci_dev *dev = drive->channel->pci_dev;
int map = 0;
if (!eighty_ninty_three(drive))
return XFER_UDMA;
switch(dev->device) {
case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE:
if (svwks_revision >= SVWKS_CSB5_REVISION_NEW)
map |= XFER_UDMA_100;
map |= XFER_UDMA_66;
case PCI_DEVICE_ID_SERVERWORKS_OSB4IDE:
map |= XFER_UDMA;
break;
}
return map;
}
static int svwks_tune_chipset(struct ata_device *drive, byte speed) static int svwks_tune_chipset(struct ata_device *drive, byte speed)
{ {
static u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; static u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
...@@ -251,11 +271,6 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed) ...@@ -251,11 +271,6 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed)
byte unit = (drive->select.b.unit & 0x01); byte unit = (drive->select.b.unit & 0x01);
byte csb5 = (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) ? 1 : 0; byte csb5 = (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) ? 1 : 0;
#ifdef CONFIG_BLK_DEV_IDEDMA
unsigned long dma_base = hwif->dma_base;
#endif
int err;
byte drive_pci = 0x00; byte drive_pci = 0x00;
byte drive_pci2 = 0x00; byte drive_pci2 = 0x00;
byte drive_pci3 = hwif->unit ? 0x57 : 0x56; byte drive_pci3 = hwif->unit ? 0x57 : 0x56;
...@@ -338,9 +353,6 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed) ...@@ -338,9 +353,6 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed)
printk("%s: %s drive%d\n", drive->name, ide_xfer_verbose(speed), drive->dn); printk("%s: %s drive%d\n", drive->name, ide_xfer_verbose(speed), drive->dn);
#endif /* SVWKS_DEBUG_DRIVE_INFO */ #endif /* SVWKS_DEBUG_DRIVE_INFO */
if (!drive->init_speed)
drive->init_speed = speed;
pci_write_config_byte(dev, drive_pci, pio_timing); pci_write_config_byte(dev, drive_pci, pio_timing);
if (csb5) if (csb5)
pci_write_config_word(dev, 0x4A, csb5_pio); pci_write_config_word(dev, 0x4A, csb5_pio);
...@@ -349,16 +361,12 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed) ...@@ -349,16 +361,12 @@ static int svwks_tune_chipset(struct ata_device *drive, byte speed)
pci_write_config_byte(dev, drive_pci2, dma_timing); pci_write_config_byte(dev, drive_pci2, dma_timing);
pci_write_config_byte(dev, drive_pci3, ultra_timing); pci_write_config_byte(dev, drive_pci3, ultra_timing);
pci_write_config_byte(dev, 0x54, ultra_enable); pci_write_config_byte(dev, 0x54, ultra_enable);
#endif
if (speed > XFER_PIO_4) if (!drive->init_speed)
outb(inb(dma_base+2)|(1<<(5+unit)), dma_base+2); drive->init_speed = speed;
else
outb(inb(dma_base+2) & ~(1<<(5+unit)), dma_base+2);
#endif /* CONFIG_BLK_DEV_IDEDMA */
err = ide_config_drive_speed(drive, speed);
drive->current_speed = speed; drive->current_speed = speed;
return err;
return ide_config_drive_speed(drive, speed);
} }
static void config_chipset_for_pio(struct ata_device *drive) static void config_chipset_for_pio(struct ata_device *drive)
...@@ -415,23 +423,14 @@ static void svwks_tune_drive(struct ata_device *drive, byte pio) ...@@ -415,23 +423,14 @@ static void svwks_tune_drive(struct ata_device *drive, byte pio)
#ifdef CONFIG_BLK_DEV_IDEDMA #ifdef CONFIG_BLK_DEV_IDEDMA
static int config_chipset_for_dma(struct ata_device *drive) static int config_chipset_for_dma(struct ata_device *drive)
{ {
struct hd_driveid *id = drive->id; int map;
struct pci_dev *dev = drive->channel->pci_dev; byte mode;
byte udma_66 = eighty_ninty_three(drive);
int ultra66 = (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) ? 1 : 0;
int ultra100 = (ultra66 && svwks_revision >= SVWKS_CSB5_REVISION_NEW) ? 1 : 0;
byte speed = ata_timing_mode(drive, XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | XFER_UDMA
| ((udma_66 && ultra66) ? XFER_UDMA_66 : 0)
| ((udma_66 && ultra100) ? XFER_UDMA_100 : 0));
(void) svwks_tune_chipset(drive, speed); /* FIXME: check SWDMA modes --bkz */
map = XFER_MWDMA | svwks_ratemask(drive);
mode = ata_timing_mode(drive, map);
return ((int) ((id->dma_ultra >> 11) & 7) ? 1 : return !svwks_tune_chipset(drive, mode);
((id->dma_ultra >> 8) & 7) ? 1 :
((id->dma_mword >> 8) & 7) ? 1 :
((id->dma_1word >> 8) & 7) ? 1 :
0);
} }
static int config_drive_xfer_rate(struct ata_device *drive) static int config_drive_xfer_rate(struct ata_device *drive)
......
...@@ -71,7 +71,7 @@ static unsigned int get_timing_sl82c105(struct ata_timing *t) ...@@ -71,7 +71,7 @@ static unsigned int get_timing_sl82c105(struct ata_timing *t)
/* /*
* Configure the drive and chipset for PIO * Configure the drive and chipset for PIO
*/ */
static void config_for_pio(ide_drive_t *drive, int pio, int report) static void config_for_pio(struct ata_device *drive, int pio, int report)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
...@@ -109,7 +109,7 @@ static void config_for_pio(ide_drive_t *drive, int pio, int report) ...@@ -109,7 +109,7 @@ static void config_for_pio(ide_drive_t *drive, int pio, int report)
/* /*
* Configure the drive and the chipset for DMA * Configure the drive and the chipset for DMA
*/ */
static int config_for_dma(ide_drive_t *drive) static int config_for_dma(struct ata_device *drive)
{ {
struct ata_channel *hwif = drive->channel; struct ata_channel *hwif = drive->channel;
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
...@@ -131,7 +131,7 @@ static int config_for_dma(ide_drive_t *drive) ...@@ -131,7 +131,7 @@ static int config_for_dma(ide_drive_t *drive)
* Check to see if the drive and * Check to see if the drive and
* chipset is capable of DMA mode * chipset is capable of DMA mode
*/ */
static int sl82c105_check_drive(ide_drive_t *drive) static int sl82c105_check_drive(struct ata_device *drive)
{ {
int on = 0; int on = 0;
...@@ -240,7 +240,7 @@ static void sl82c105_timeout(struct ata_device *drive) ...@@ -240,7 +240,7 @@ static void sl82c105_timeout(struct ata_device *drive)
* This function is called when the IDE timer expires, the drive * This function is called when the IDE timer expires, the drive
* indicates that it is READY, and we were waiting for DMA to complete. * indicates that it is READY, and we were waiting for DMA to complete.
*/ */
static void sl82c105_lostirq(ide_drive_t *drive) static void sl82c105_lostirq(struct ata_device *drive)
{ {
struct ata_channel *ch = drive->channel; struct ata_channel *ch = drive->channel;
struct pci_dev *dev = ch->pci_dev; struct pci_dev *dev = ch->pci_dev;
...@@ -273,7 +273,7 @@ static void sl82c105_lostirq(ide_drive_t *drive) ...@@ -273,7 +273,7 @@ static void sl82c105_lostirq(ide_drive_t *drive)
* We only deal with PIO mode here - DMA mode 'using_dma' is not * We only deal with PIO mode here - DMA mode 'using_dma' is not
* initialised at the point that this function is called. * initialised at the point that this function is called.
*/ */
static void tune_sl82c105(ide_drive_t *drive, byte pio) static void tune_sl82c105(struct ata_device *drive, byte pio)
{ {
config_for_pio(drive, pio, 1); config_for_pio(drive, pio, 1);
......
...@@ -502,11 +502,14 @@ static void idescsi_revalidate(struct ata_device *_dummy) ...@@ -502,11 +502,14 @@ static void idescsi_revalidate(struct ata_device *_dummy)
*/ */
} }
static void idescsi_attach(struct ata_device *drive);
/* /*
* IDE subdriver functions, registered with ide.c * IDE subdriver functions, registered with ide.c
*/ */
static struct ata_operations idescsi_driver = { static struct ata_operations idescsi_driver = {
owner: THIS_MODULE, owner: THIS_MODULE,
attach: idescsi_attach,
cleanup: idescsi_cleanup, cleanup: idescsi_cleanup,
standby: NULL, standby: NULL,
do_request: idescsi_do_request, do_request: idescsi_do_request,
...@@ -519,45 +522,40 @@ static struct ata_operations idescsi_driver = { ...@@ -519,45 +522,40 @@ static struct ata_operations idescsi_driver = {
capacity: NULL, capacity: NULL,
}; };
/* static void idescsi_attach(struct ata_device *drive)
* idescsi_init will register the driver for each scsi.
*/
int idescsi_init(void)
{ {
struct ata_device *drive;
idescsi_scsi_t *scsi; idescsi_scsi_t *scsi;
/* FIXME: The following is just plain wrong, since those are definitely *not* the int i, id;
* media types supported by the ATA layer */ char *req;
byte media[] = {TYPE_DISK, TYPE_TAPE, TYPE_PROCESSOR, TYPE_WORM, TYPE_ROM, TYPE_SCANNER, TYPE_MOD, 255}; struct ata_channel *channel;
int i, failed, id; int unit;
if (idescsi_initialized) if (idescsi_initialized)
return 0; return;
idescsi_initialized = 1; idescsi_initialized = 1;
for (i = 0; i < MAX_HWIFS * MAX_DRIVES; i++) for (i = 0; i < MAX_HWIFS * MAX_DRIVES; i++)
idescsi_drives[i] = NULL; idescsi_drives[i] = NULL;
MOD_INC_USE_COUNT;
for (i = 0; media[i] != 255; i++) {
failed = 0;
while ((drive = ide_scan_devices (media[i], "ide-scsi", NULL, failed++)) != NULL) {
if ((scsi = (idescsi_scsi_t *) kmalloc (sizeof (idescsi_scsi_t), GFP_KERNEL)) == NULL) { req = drive->driver_req;
printk (KERN_ERR "ide-scsi: %s: Can't allocate a scsi structure\n", drive->name); if (req[0] != '\0' && strcmp(req, "ide-scsi"))
continue; return;
}
if (ide_register_subdriver (drive, &idescsi_driver)) { if ((scsi = (idescsi_scsi_t *) kmalloc (sizeof (idescsi_scsi_t), GFP_KERNEL)) == NULL) {
printk (KERN_ERR "ide-scsi: %s: Failed to register the driver with ide.c\n", drive->name); printk(KERN_ERR "ide-scsi: %s: Can't allocate a scsi structure\n", drive->name);
kfree (scsi); return;
continue;
}
for (id = 0; id < MAX_HWIFS * MAX_DRIVES && idescsi_drives[id]; id++);
idescsi_setup (drive, scsi, id);
failed--;
}
} }
revalidate_drives(); if (ide_register_subdriver (drive, &idescsi_driver)) {
MOD_DEC_USE_COUNT; printk(KERN_ERR "ide-scsi: %s: Failed to register the driver with ide.c\n", drive->name);
return 0; kfree (scsi);
return;
}
for (id = 0; id < MAX_HWIFS * MAX_DRIVES && idescsi_drives[id]; id++);
idescsi_setup (drive, scsi, id);
channel = drive->channel;
unit = drive - channel->drives;
ide_revalidate_disk(mk_kdev(channel->major, unit << PARTN_BITS));
} }
int idescsi_detect (Scsi_Host_Template *host_template) int idescsi_detect (Scsi_Host_Template *host_template)
...@@ -805,38 +803,31 @@ static Scsi_Host_Template idescsi_template = { ...@@ -805,38 +803,31 @@ static Scsi_Host_Template idescsi_template = {
emulated: 1, emulated: 1,
}; };
static int __init init_idescsi_module(void)
static int __init idescsi_init(void)
{ {
idescsi_init(); int ret;
ret = ata_driver_module(&idescsi_driver);
scsi_register_host(&idescsi_template); scsi_register_host(&idescsi_template);
return 0; return 0;
} }
static void __exit exit_idescsi_module(void) static void __exit exit_idescsi_module(void)
{ {
struct ata_device *drive;
byte media[] = {TYPE_DISK, TYPE_TAPE, TYPE_PROCESSOR, TYPE_WORM, TYPE_ROM, TYPE_SCANNER, TYPE_MOD, 255};
int i, failed;
scsi_unregister_host(&idescsi_template); scsi_unregister_host(&idescsi_template);
/* FIXME: The media types scanned here have literally nothing to do #if 0
* with the media types used by the overall ATA code! /* FIXME: what about this cleanup stuff here? This all should be done
* * on close time perhaps? */
* This is basically showing us, that there is something wrong with the
* ide_scan_devices function.
*/
for (i = 0; media[i] != 255; i++) { if (idescsi_cleanup (drive)) {
failed = 0; printk ("%s: exit_idescsi_module() called while still busy\n", drive->name);
while ((drive = ide_scan_devices (media[i], "ide-scsi", &idescsi_driver, failed)) != NULL)
if (idescsi_cleanup (drive)) {
printk ("%s: exit_idescsi_module() called while still busy\n", drive->name);
failed++;
}
} }
#endif
unregister_ata_driver(&idescsi_driver);
} }
module_init(init_idescsi_module); module_init(idescsi_init);
module_exit(exit_idescsi_module); module_exit(exit_idescsi_module);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -317,7 +317,6 @@ typedef union { ...@@ -317,7 +317,6 @@ typedef union {
/* /*
* ATA/ATAPI device structure : * ATA/ATAPI device structure :
*/ */
typedef
struct ata_device { struct ata_device {
struct ata_channel * channel; struct ata_channel * channel;
char name[6]; /* device name */ char name[6]; /* device name */
...@@ -409,7 +408,7 @@ struct ata_device { ...@@ -409,7 +408,7 @@ struct ata_device {
unsigned long immed_comp; unsigned long immed_comp;
int max_last_depth; int max_last_depth;
int max_depth; int max_depth;
} ide_drive_t; };
/* /*
* Status returned by various functions. * Status returned by various functions.
...@@ -590,6 +589,7 @@ static inline int ata_can_queue(struct ata_device *drive) ...@@ -590,6 +589,7 @@ static inline int ata_can_queue(struct ata_device *drive)
struct ata_operations { struct ata_operations {
struct module *owner; struct module *owner;
void (*attach) (struct ata_device *);
int (*cleanup)(struct ata_device *); int (*cleanup)(struct ata_device *);
int (*standby)(struct ata_device *); int (*standby)(struct ata_device *);
ide_startstop_t (*do_request)(struct ata_device *, struct request *, sector_t); ide_startstop_t (*do_request)(struct ata_device *, struct request *, sector_t);
...@@ -602,6 +602,9 @@ struct ata_operations { ...@@ -602,6 +602,9 @@ struct ata_operations {
void (*revalidate)(struct ata_device *); void (*revalidate)(struct ata_device *);
sector_t (*capacity)(struct ata_device *); sector_t (*capacity)(struct ata_device *);
/* linked list of rgistered device type drivers */
struct ata_operations *next;
}; };
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */ /* Alas, no aliases. Too much hassle with bringing module.h everywhere */
...@@ -618,11 +621,20 @@ do { \ ...@@ -618,11 +621,20 @@ do { \
extern sector_t ata_capacity(struct ata_device *drive); extern sector_t ata_capacity(struct ata_device *drive);
/* FIXME: Actually implement and use them as soon as possible! to make the extern void unregister_ata_driver(struct ata_operations *driver);
* ide_scan_devices() go away! */ extern int register_ata_driver(struct ata_operations *driver);
static inline int ata_driver_module(struct ata_operations *driver)
extern int unregister_ata_driver(unsigned int type, struct ata_operations *driver); {
extern int register_ata_driver(unsigned int type, struct ata_operations *driver); #ifdef MODULE
if (register_ata_driver(driver) <= 0) {
unregister_ata_driver(driver);
return -ENODEV;
}
#else
register_ata_driver(driver);
#endif
return 0;
}
#define ata_ops(drive) ((drive)->driver) #define ata_ops(drive) ((drive)->driver)
...@@ -797,9 +809,9 @@ extern int idefloppy_init (void); ...@@ -797,9 +809,9 @@ extern int idefloppy_init (void);
extern int idescsi_init (void); extern int idescsi_init (void);
#endif #endif
extern struct ata_device *ide_scan_devices(byte, const char *, struct ata_operations *, int);
extern int ide_register_subdriver(struct ata_device *, struct ata_operations *); extern int ide_register_subdriver(struct ata_device *, struct ata_operations *);
extern int ide_unregister_subdriver(struct ata_device *drive); extern int ide_unregister_subdriver(struct ata_device *drive);
extern int ide_revalidate_disk(kdev_t i_rdev);
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
# define ON_BOARD 0 # define ON_BOARD 0
...@@ -890,6 +902,5 @@ extern spinlock_t ide_lock; ...@@ -890,6 +902,5 @@ extern spinlock_t ide_lock;
#define DRIVE_LOCK(drive) ((drive)->queue.queue_lock) #define DRIVE_LOCK(drive) ((drive)->queue.queue_lock)
extern int drive_is_ready(struct ata_device *drive); extern int drive_is_ready(struct ata_device *drive);
extern void revalidate_drives(void);
#endif #endif
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