Commit 9135f190 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (95 commits)
  ide-tape: remove idetape_config_t typedef
  ide-tape: remove mtio.h related comments
  ide-tape: make function name more accurate
  ide-tape: remove unused sense packet commands.
  ide-tape: use generic byteorder macros
  ide-tape: remove EXPERIMENTAL driver status
  ide-tape: use generic scsi commands
  ide-tape: remove struct idetape_block_size_page_t
  ide-tape: remove structs os_partition_t, os_dat_entry_t, os_dat_t
  ide-tape: remove struct idetape_parameter_block_descriptor_t
  ide-tape: remove struct idetape_medium_partition_page_t
  ide-tape: remove struct idetape_data_compression_page_t
  ide-tape: remove struct idetape_inquiry_result_t
  ide-tape: remove struct idetape_capabilities_page_t
  ide-tape: remove IDETAPE_DEBUG_BUGS
  ide-tape: remove IDETAPE_DEBUG_INFO
  ide-tape: dump gcw fields on error in idetape_identify_device()
  ide-tape: remove struct idetape_mode_parameter_header_t
  ide-tape: remove struct idetape_request_sense_result_t
  ide-tape: remove dead code
  ...
parents 124d3b70 d59823fa
This diff is collapsed.
/*
* IDE ATAPI streaming tape driver.
*
* This driver is a part of the Linux ide driver.
*
* The driver, in co-operation with ide.c, basically traverses the
* request-list for the block device interface. The character device
* interface, on the other hand, creates new requests, adds them
* to the request-list of the block device, and waits for their completion.
*
* Pipelined operation mode is now supported on both reads and writes.
*
* The block device major and minor numbers are determined from the
* tape's relative position in the ide interfaces, as explained in ide.c.
*
* The character device interface consists of the following devices:
*
* ht0 major 37, minor 0 first IDE tape, rewind on close.
* ht1 major 37, minor 1 second IDE tape, rewind on close.
* ...
* nht0 major 37, minor 128 first IDE tape, no rewind on close.
* nht1 major 37, minor 129 second IDE tape, no rewind on close.
* ...
*
* The general magnetic tape commands compatible interface, as defined by
* include/linux/mtio.h, is accessible through the character device.
*
* General ide driver configuration options, such as the interrupt-unmask
* flag, can be configured by issuing an ioctl to the block device interface,
* as any other ide device.
*
* Our own ide-tape ioctl's can be issued to either the block device or
* the character device interface.
*
* Maximal throughput with minimal bus load will usually be achieved in the
* following scenario:
*
* 1. ide-tape is operating in the pipelined operation mode.
* 2. No buffering is performed by the user backup program.
*
* Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive.
*
* Here are some words from the first releases of hd.c, which are quoted
* in ide.c and apply here as well:
*
* | Special care is recommended. Have Fun!
*
*
* An overview of the pipelined operation mode.
*
* In the pipelined write mode, we will usually just add requests to our
* pipeline and return immediately, before we even start to service them. The
* user program will then have enough time to prepare the next request while
* we are still busy servicing previous requests. In the pipelined read mode,
* the situation is similar - we add read-ahead requests into the pipeline,
* before the user even requested them.
*
* The pipeline can be viewed as a "safety net" which will be activated when
* the system load is high and prevents the user backup program from keeping up
* with the current tape speed. At this point, the pipeline will get
* shorter and shorter but the tape will still be streaming at the same speed.
* Assuming we have enough pipeline stages, the system load will hopefully
* decrease before the pipeline is completely empty, and the backup program
* will be able to "catch up" and refill the pipeline again.
*
* When using the pipelined mode, it would be best to disable any type of
* buffering done by the user program, as ide-tape already provides all the
* benefits in the kernel, where it can be done in a more efficient way.
* As we will usually not block the user program on a request, the most
* efficient user code will then be a simple read-write-read-... cycle.
* Any additional logic will usually just slow down the backup process.
*
* Using the pipelined mode, I get a constant over 400 KBps throughput,
* which seems to be the maximum throughput supported by my tape.
*
* However, there are some downfalls:
*
* 1. We use memory (for data buffers) in proportional to the number
* of pipeline stages (each stage is about 26 KB with my tape).
* 2. In the pipelined write mode, we cheat and postpone error codes
* to the user task. In read mode, the actual tape position
* will be a bit further than the last requested block.
*
* Concerning (1):
*
* 1. We allocate stages dynamically only when we need them. When
* we don't need them, we don't consume additional memory. In
* case we can't allocate stages, we just manage without them
* (at the expense of decreased throughput) so when Linux is
* tight in memory, we will not pose additional difficulties.
*
* 2. The maximum number of stages (which is, in fact, the maximum
* amount of memory) which we allocate is limited by the compile
* time parameter IDETAPE_MAX_PIPELINE_STAGES.
*
* 3. The maximum number of stages is a controlled parameter - We
* don't start from the user defined maximum number of stages
* but from the lower IDETAPE_MIN_PIPELINE_STAGES (again, we
* will not even allocate this amount of stages if the user
* program can't handle the speed). We then implement a feedback
* loop which checks if the pipeline is empty, and if it is, we
* increase the maximum number of stages as necessary until we
* reach the optimum value which just manages to keep the tape
* busy with minimum allocated memory or until we reach
* IDETAPE_MAX_PIPELINE_STAGES.
*
* Concerning (2):
*
* In pipelined write mode, ide-tape can not return accurate error codes
* to the user program since we usually just add the request to the
* pipeline without waiting for it to be serviced. In case an error
* occurs, I will report it on the next user request.
*
* In the pipelined read mode, subsequent read requests or forward
* filemark spacing will perform correctly, as we preserve all blocks
* and filemarks which we encountered during our excess read-ahead.
*
* For accurate tape positioning and error reporting, disabling
* pipelined mode might be the best option.
*
* You can enable/disable/tune the pipelined operation mode by adjusting
* the compile time parameters below.
*
*
* Possible improvements.
*
* 1. Support for the ATAPI overlap protocol.
*
* In order to maximize bus throughput, we currently use the DSC
* overlap method which enables ide.c to service requests from the
* other device while the tape is busy executing a command. The
* DSC overlap method involves polling the tape's status register
* for the DSC bit, and servicing the other device while the tape
* isn't ready.
*
* In the current QIC development standard (December 1995),
* it is recommended that new tape drives will *in addition*
* implement the ATAPI overlap protocol, which is used for the
* same purpose - efficient use of the IDE bus, but is interrupt
* driven and thus has much less CPU overhead.
*
* ATAPI overlap is likely to be supported in most new ATAPI
* devices, including new ATAPI cdroms, and thus provides us
* a method by which we can achieve higher throughput when
* sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
*/
...@@ -216,8 +216,7 @@ config BLK_DEV_IDECD_VERBOSE_ERRORS ...@@ -216,8 +216,7 @@ config BLK_DEV_IDECD_VERBOSE_ERRORS
memory, though. memory, though.
config BLK_DEV_IDETAPE config BLK_DEV_IDETAPE
tristate "Include IDE/ATAPI TAPE support (EXPERIMENTAL)" tristate "Include IDE/ATAPI TAPE support"
depends on EXPERIMENTAL
help help
If you have an IDE tape drive using the ATAPI protocol, say Y. If you have an IDE tape drive using the ATAPI protocol, say Y.
ATAPI is a newer protocol used by IDE tape and CD-ROM drives, ATAPI is a newer protocol used by IDE tape and CD-ROM drives,
......
...@@ -28,8 +28,10 @@ static int __init ...@@ -28,8 +28,10 @@ static int __init
bastide_register(unsigned int base, unsigned int aux, int irq, bastide_register(unsigned int base, unsigned int aux, int irq,
ide_hwif_t **hwif) ide_hwif_t **hwif)
{ {
ide_hwif_t *hwif;
hw_regs_t hw; hw_regs_t hw;
int i; int i;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
memset(&hw, 0, sizeof(hw)); memset(&hw, 0, sizeof(hw));
...@@ -44,8 +46,24 @@ bastide_register(unsigned int base, unsigned int aux, int irq, ...@@ -44,8 +46,24 @@ bastide_register(unsigned int base, unsigned int aux, int irq,
hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20); hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
hw.irq = irq; hw.irq = irq;
ide_register_hw(&hw, NULL, hwif); hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif == NULL)
goto out;
i = hwif->index;
if (hwif->present)
ide_unregister(i, 0, 0);
else if (!hwif->hold)
ide_init_port_data(hwif, i);
ide_init_port_hw(hwif, &hw);
hwif->quirkproc = NULL;
idx[0] = i;
ide_device_add(idx, NULL);
out:
return 0; return 0;
} }
......
...@@ -377,9 +377,6 @@ static void icside_dma_lost_irq(ide_drive_t *drive) ...@@ -377,9 +377,6 @@ static void icside_dma_lost_irq(ide_drive_t *drive)
static void icside_dma_init(ide_hwif_t *hwif) static void icside_dma_init(ide_hwif_t *hwif)
{ {
hwif->mwdma_mask = 7; /* MW0..2 */
hwif->swdma_mask = 7; /* SW0..2 */
hwif->dmatable_cpu = NULL; hwif->dmatable_cpu = NULL;
hwif->dmatable_dma = 0; hwif->dmatable_dma = 0;
hwif->set_dma_mode = icside_set_dma_mode; hwif->set_dma_mode = icside_set_dma_mode;
...@@ -459,11 +456,19 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) ...@@ -459,11 +456,19 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, NULL);
return 0; return 0;
} }
static const struct ide_port_info icside_v6_port_info __initdata = {
.host_flags = IDE_HFLAG_SERIALIZE |
IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
IDE_HFLAG_NO_AUTOTUNE,
.mwdma_mask = ATA_MWDMA2,
.swdma_mask = ATA_SWDMA2,
};
static int __init static int __init
icside_register_v6(struct icside_state *state, struct expansion_card *ec) icside_register_v6(struct icside_state *state, struct expansion_card *ec)
{ {
...@@ -472,6 +477,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) ...@@ -472,6 +477,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
unsigned int sel = 0; unsigned int sel = 0;
int ret; int ret;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
struct ide_port_info d = icside_v6_port_info;
ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
if (!ioc_base) { if (!ioc_base) {
...@@ -521,30 +527,25 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) ...@@ -521,30 +527,25 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
state->hwif[1] = mate; state->hwif[1] = mate;
hwif->maskproc = icside_maskproc; hwif->maskproc = icside_maskproc;
hwif->channel = 0;
hwif->hwif_data = state; hwif->hwif_data = state;
hwif->mate = mate;
hwif->serialized = 1;
hwif->config_data = (unsigned long)ioc_base; hwif->config_data = (unsigned long)ioc_base;
hwif->select_data = sel; hwif->select_data = sel;
mate->maskproc = icside_maskproc; mate->maskproc = icside_maskproc;
mate->channel = 1;
mate->hwif_data = state; mate->hwif_data = state;
mate->mate = hwif;
mate->serialized = 1;
mate->config_data = (unsigned long)ioc_base; mate->config_data = (unsigned long)ioc_base;
mate->select_data = sel | 1; mate->select_data = sel | 1;
if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
icside_dma_init(hwif); icside_dma_init(hwif);
icside_dma_init(mate); icside_dma_init(mate);
} } else
d.mwdma_mask = d.swdma_mask = 0;
idx[0] = hwif->index; idx[0] = hwif->index;
idx[1] = mate->index; idx[1] = mate->index;
ide_device_add(idx); ide_device_add(idx, &d);
return 0; return 0;
......
...@@ -39,7 +39,7 @@ static int __init ide_arm_init(void) ...@@ -39,7 +39,7 @@ static int __init ide_arm_init(void)
ide_init_port_hw(hwif, &hw); ide_init_port_hw(hwif, &hw);
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, NULL);
} }
return 0; return 0;
......
...@@ -58,7 +58,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id) ...@@ -58,7 +58,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, NULL);
ecard_set_drvdata(ec, hwif); ecard_set_drvdata(ec, hwif);
goto out; goto out;
...@@ -76,7 +76,7 @@ static void __devexit rapide_remove(struct expansion_card *ec) ...@@ -76,7 +76,7 @@ static void __devexit rapide_remove(struct expansion_card *ec)
ecard_set_drvdata(ec, NULL); ecard_set_drvdata(ec, NULL);
ide_unregister(hwif->index); ide_unregister(hwif->index, 0, 0);
ecard_release_resources(ec); ecard_release_resources(ec);
} }
......
...@@ -753,6 +753,15 @@ static void cris_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -753,6 +753,15 @@ static void cris_set_dma_mode(ide_drive_t *drive, const u8 speed)
cris_ide_set_speed(TYPE_DMA, 0, strobe, hold); cris_ide_set_speed(TYPE_DMA, 0, strobe, hold);
} }
static const struct ide_port_info cris_port_info __initdata = {
.chipset = ide_etrax100,
.host_flags = IDE_HFLAG_NO_ATAPI_DMA |
IDE_HFLAG_NO_DMA, /* no SFF-style DMA */
.pio_mask = ATA_PIO4,
.udma_mask = cris_ultra_mask,
.mwdma_mask = ATA_MWDMA2,
};
static int __init init_e100_ide(void) static int __init init_e100_ide(void)
{ {
hw_regs_t hw; hw_regs_t hw;
...@@ -780,7 +789,6 @@ static int __init init_e100_ide(void) ...@@ -780,7 +789,6 @@ static int __init init_e100_ide(void)
ide_init_port_data(hwif, hwif->index); ide_init_port_data(hwif, hwif->index);
ide_init_port_hw(hwif, &hw); ide_init_port_hw(hwif, &hw);
hwif->mmio = 1; hwif->mmio = 1;
hwif->chipset = ide_etrax100;
hwif->set_pio_mode = &cris_set_pio_mode; hwif->set_pio_mode = &cris_set_pio_mode;
hwif->set_dma_mode = &cris_set_dma_mode; hwif->set_dma_mode = &cris_set_dma_mode;
hwif->ata_input_data = &cris_ide_input_data; hwif->ata_input_data = &cris_ide_input_data;
...@@ -799,12 +807,6 @@ static int __init init_e100_ide(void) ...@@ -799,12 +807,6 @@ static int __init init_e100_ide(void)
hwif->INB = &cris_ide_inb; hwif->INB = &cris_ide_inb;
hwif->INW = &cris_ide_inw; hwif->INW = &cris_ide_inw;
hwif->cbl = ATA_CBL_PATA40; hwif->cbl = ATA_CBL_PATA40;
hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
hwif->pio_mask = ATA_PIO4,
hwif->drives[0].autotune = 1;
hwif->drives[1].autotune = 1;
hwif->ultra_mask = cris_ultra_mask;
hwif->mwdma_mask = 0x07; /* Multiword DMA 0-2 */
idx[h] = hwif->index; idx[h] = hwif->index;
} }
...@@ -820,7 +822,7 @@ static int __init init_e100_ide(void) ...@@ -820,7 +822,7 @@ static int __init init_e100_ide(void)
cris_ide_set_speed(TYPE_DMA, 0, ATA_DMA2_STROBE, ATA_DMA2_HOLD); cris_ide_set_speed(TYPE_DMA, 0, ATA_DMA2_STROBE, ATA_DMA2_HOLD);
cris_ide_set_speed(TYPE_UDMA, ATA_UDMA2_CYC, ATA_UDMA2_DVS, 0); cris_ide_set_speed(TYPE_UDMA, ATA_UDMA2_CYC, ATA_UDMA2_DVS, 0);
ide_device_add(idx); ide_device_add(idx, &cris_port_info);
return 0; return 0;
} }
...@@ -1032,11 +1034,7 @@ static int cris_dma_setup(ide_drive_t *drive) ...@@ -1032,11 +1034,7 @@ static int cris_dma_setup(ide_drive_t *drive)
static void cris_dma_exec_cmd(ide_drive_t *drive, u8 command) static void cris_dma_exec_cmd(ide_drive_t *drive, u8 command)
{ {
/* set the irq handler which will finish the request when DMA is done */ ide_execute_command(drive, command, &cris_dma_intr, WAIT_CMD, NULL);
ide_set_handler(drive, &cris_dma_intr, WAIT_CMD, NULL);
/* issue cmd to drive */
cris_ide_outb(command, IDE_COMMAND_REG);
} }
static void cris_dma_start(ide_drive_t *drive) static void cris_dma_start(ide_drive_t *drive)
......
...@@ -114,7 +114,7 @@ static int __init h8300_ide_init(void) ...@@ -114,7 +114,7 @@ static int __init h8300_ide_init(void)
idx[0] = index; idx[0] = index;
ide_device_add(idx); ide_device_add(idx, NULL);
return 0; return 0;
......
...@@ -39,7 +39,6 @@ struct GTM_buffer { ...@@ -39,7 +39,6 @@ struct GTM_buffer {
}; };
struct ide_acpi_drive_link { struct ide_acpi_drive_link {
ide_drive_t *drive;
acpi_handle obj_handle; acpi_handle obj_handle;
u8 idbuff[512]; u8 idbuff[512];
}; };
...@@ -280,16 +279,6 @@ static int do_drive_get_GTF(ide_drive_t *drive, ...@@ -280,16 +279,6 @@ static int do_drive_get_GTF(ide_drive_t *drive,
port = hwif->channel ? drive->dn - 2: drive->dn; port = hwif->channel ? drive->dn - 2: drive->dn;
if (!drive->acpidata) {
if (port == 0) {
drive->acpidata = &hwif->acpidata->master;
hwif->acpidata->master.drive = drive;
} else {
drive->acpidata = &hwif->acpidata->slave;
hwif->acpidata->slave.drive = drive;
}
}
DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n", DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
hwif->name, dev->bus_id, port, hwif->channel); hwif->name, dev->bus_id, port, hwif->channel);
...@@ -494,7 +483,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive) ...@@ -494,7 +483,6 @@ int ide_acpi_exec_tfs(ide_drive_t *drive)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(ide_acpi_exec_tfs);
/** /**
* ide_acpi_get_timing - get the channel (controller) timings * ide_acpi_get_timing - get the channel (controller) timings
...@@ -580,7 +568,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwif) ...@@ -580,7 +568,6 @@ void ide_acpi_get_timing(ide_hwif_t *hwif)
kfree(output.pointer); kfree(output.pointer);
} }
EXPORT_SYMBOL_GPL(ide_acpi_get_timing);
/** /**
* ide_acpi_push_timing - set the channel (controller) timings * ide_acpi_push_timing - set the channel (controller) timings
...@@ -634,7 +621,6 @@ void ide_acpi_push_timing(ide_hwif_t *hwif) ...@@ -634,7 +621,6 @@ void ide_acpi_push_timing(ide_hwif_t *hwif)
} }
DEBPRINT("_STM status: %d\n", status); DEBPRINT("_STM status: %d\n", status);
} }
EXPORT_SYMBOL_GPL(ide_acpi_push_timing);
/** /**
* ide_acpi_set_state - set the channel power state * ide_acpi_set_state - set the channel power state
...@@ -688,11 +674,6 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on) ...@@ -688,11 +674,6 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on)
*/ */
void ide_acpi_init(ide_hwif_t *hwif) void ide_acpi_init(ide_hwif_t *hwif)
{ {
int unit;
int err;
struct ide_acpi_drive_link *master;
struct ide_acpi_drive_link *slave;
ide_acpi_blacklist(); ide_acpi_blacklist();
hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL); hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL);
...@@ -704,40 +685,38 @@ void ide_acpi_init(ide_hwif_t *hwif) ...@@ -704,40 +685,38 @@ void ide_acpi_init(ide_hwif_t *hwif)
DEBPRINT("no ACPI object for %s found\n", hwif->name); DEBPRINT("no ACPI object for %s found\n", hwif->name);
kfree(hwif->acpidata); kfree(hwif->acpidata);
hwif->acpidata = NULL; hwif->acpidata = NULL;
return;
} }
}
void ide_acpi_port_init_devices(ide_hwif_t *hwif)
{
ide_drive_t *drive;
int i, err;
if (hwif->acpidata == NULL)
return;
/* /*
* The ACPI spec mandates that we send information * The ACPI spec mandates that we send information
* for both drives, regardless whether they are connected * for both drives, regardless whether they are connected
* or not. * or not.
*/ */
hwif->acpidata->master.drive = &hwif->drives[0];
hwif->drives[0].acpidata = &hwif->acpidata->master; hwif->drives[0].acpidata = &hwif->acpidata->master;
master = &hwif->acpidata->master;
hwif->acpidata->slave.drive = &hwif->drives[1];
hwif->drives[1].acpidata = &hwif->acpidata->slave; hwif->drives[1].acpidata = &hwif->acpidata->slave;
slave = &hwif->acpidata->slave;
/* /*
* Send IDENTIFY for each drive * Send IDENTIFY for each drive
*/ */
if (master->drive->present) { for (i = 0; i < MAX_DRIVES; i++) {
err = taskfile_lib_get_identify(master->drive, master->idbuff); drive = &hwif->drives[i];
if (err) {
DEBPRINT("identify device %s failed (%d)\n",
master->drive->name, err);
}
}
if (slave->drive->present) { if (!drive->present)
err = taskfile_lib_get_identify(slave->drive, slave->idbuff); continue;
if (err) {
err = taskfile_lib_get_identify(drive, drive->acpidata->idbuff);
if (err)
DEBPRINT("identify device %s failed (%d)\n", DEBPRINT("identify device %s failed (%d)\n",
slave->drive->name, err); drive->name, err);
}
} }
if (ide_noacpionboot) { if (ide_noacpionboot) {
...@@ -753,13 +732,11 @@ void ide_acpi_init(ide_hwif_t *hwif) ...@@ -753,13 +732,11 @@ void ide_acpi_init(ide_hwif_t *hwif)
ide_acpi_get_timing(hwif); ide_acpi_get_timing(hwif);
ide_acpi_push_timing(hwif); ide_acpi_push_timing(hwif);
for (unit = 0; unit < MAX_DRIVES; ++unit) { for (i = 0; i < MAX_DRIVES; i++) {
ide_drive_t *drive = &hwif->drives[unit]; drive = &hwif->drives[i];
if (drive->present) { if (drive->present)
/* Execute ACPI startup code */ /* Execute ACPI startup code */
ide_acpi_exec_tfs(drive); ide_acpi_exec_tfs(drive);
} }
}
} }
EXPORT_SYMBOL_GPL(ide_acpi_init);
...@@ -604,8 +604,6 @@ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, ...@@ -604,8 +604,6 @@ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
* Block read functions. * Block read functions.
*/ */
typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len) static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
{ {
while (len > 0) { while (len > 0) {
......
...@@ -819,6 +819,26 @@ int ide_set_dma(ide_drive_t *drive) ...@@ -819,6 +819,26 @@ int ide_set_dma(ide_drive_t *drive)
return 0; return 0;
} }
void ide_check_dma_crc(ide_drive_t *drive)
{
u8 mode;
ide_dma_off_quietly(drive);
drive->crc_count = 0;
mode = drive->current_speed;
/*
* Don't try non Ultra-DMA modes without iCRC's. Force the
* device to PIO and make the user enable SWDMA/MWDMA modes.
*/
if (mode > XFER_UDMA_0 && mode <= XFER_UDMA_7)
mode--;
else
mode = XFER_PIO_4;
ide_set_xfer_rate(drive, mode);
if (drive->current_speed >= XFER_SW_DMA_0)
ide_dma_on(drive);
}
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
void ide_dma_lost_irq (ide_drive_t *drive) void ide_dma_lost_irq (ide_drive_t *drive)
{ {
......
This diff is collapsed.
...@@ -23,7 +23,7 @@ static int __init ide_generic_init(void) ...@@ -23,7 +23,7 @@ static int __init ide_generic_init(void)
for (i = 0; i < MAX_HWIFS; i++) for (i = 0; i < MAX_HWIFS; i++)
idx[i] = ide_hwifs[i].present ? 0xff : i; idx[i] = ide_hwifs[i].present ? 0xff : i;
ide_device_add_all(idx); ide_device_add_all(idx, NULL);
if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET]) if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
ide_release_lock(); /* for atari only */ ide_release_lock(); /* for atari only */
......
...@@ -163,8 +163,6 @@ void SELECT_DRIVE (ide_drive_t *drive) ...@@ -163,8 +163,6 @@ void SELECT_DRIVE (ide_drive_t *drive)
HWIF(drive)->OUTB(drive->select.all, IDE_SELECT_REG); HWIF(drive)->OUTB(drive->select.all, IDE_SELECT_REG);
} }
EXPORT_SYMBOL(SELECT_DRIVE);
void SELECT_MASK (ide_drive_t *drive, int mask) void SELECT_MASK (ide_drive_t *drive, int mask)
{ {
if (HWIF(drive)->maskproc) if (HWIF(drive)->maskproc)
...@@ -614,66 +612,6 @@ u8 eighty_ninty_three (ide_drive_t *drive) ...@@ -614,66 +612,6 @@ u8 eighty_ninty_three (ide_drive_t *drive)
return 0; return 0;
} }
int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
{
if (args->tf.command == WIN_SETFEATURES &&
args->tf.nsect > XFER_UDMA_2 &&
args->tf.feature == SETFEATURES_XFER) {
if (eighty_ninty_three(drive) == 0) {
printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
"be set\n", drive->name);
return 1;
}
}
return 0;
}
/*
* Backside of HDIO_DRIVE_CMD call of SETFEATURES_XFER.
* 1 : Safe to update drive->id DMA registers.
* 0 : OOPs not allowed.
*/
int set_transfer (ide_drive_t *drive, ide_task_t *args)
{
if (args->tf.command == WIN_SETFEATURES &&
args->tf.nsect >= XFER_SW_DMA_0 &&
args->tf.feature == SETFEATURES_XFER &&
(drive->id->dma_ultra ||
drive->id->dma_mword ||
drive->id->dma_1word))
return 1;
return 0;
}
#ifdef CONFIG_BLK_DEV_IDEDMA
static u8 ide_auto_reduce_xfer (ide_drive_t *drive)
{
if (!drive->crc_count)
return drive->current_speed;
drive->crc_count = 0;
switch(drive->current_speed) {
case XFER_UDMA_7: return XFER_UDMA_6;
case XFER_UDMA_6: return XFER_UDMA_5;
case XFER_UDMA_5: return XFER_UDMA_4;
case XFER_UDMA_4: return XFER_UDMA_3;
case XFER_UDMA_3: return XFER_UDMA_2;
case XFER_UDMA_2: return XFER_UDMA_1;
case XFER_UDMA_1: return XFER_UDMA_0;
/*
* OOPS we do not goto non Ultra DMA modes
* without iCRC's available we force
* the system to PIO and make the user
* invoke the ATA-1 ATA-2 DMA modes.
*/
case XFER_UDMA_0:
default: return XFER_PIO_4;
}
}
#endif /* CONFIG_BLK_DEV_IDEDMA */
int ide_driveid_update(ide_drive_t *drive) int ide_driveid_update(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
...@@ -884,19 +822,14 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler, ...@@ -884,19 +822,14 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
spin_lock_irqsave(&ide_lock, flags); spin_lock_irqsave(&ide_lock, flags);
BUG_ON(hwgroup->handler); BUG_ON(hwgroup->handler);
hwgroup->handler = handler; __ide_set_handler(drive, handler, timeout, expiry);
hwgroup->expiry = expiry;
hwgroup->timer.expires = jiffies + timeout;
hwgroup->req_gen_timer = hwgroup->req_gen;
add_timer(&hwgroup->timer);
hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG); hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG);
/* Drive takes 400nS to respond, we must avoid the IRQ being /*
serviced before that. * Drive takes 400nS to respond, we must avoid the IRQ being
* serviced before that.
FIXME: we could skip this delay with care on non shared *
devices * FIXME: we could skip this delay with care on non shared devices
*/ */
ndelay(400); ndelay(400);
spin_unlock_irqrestore(&ide_lock, flags); spin_unlock_irqrestore(&ide_lock, flags);
...@@ -1005,19 +938,6 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) ...@@ -1005,19 +938,6 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
return ide_stopped; return ide_stopped;
} }
static void check_dma_crc(ide_drive_t *drive)
{
#ifdef CONFIG_BLK_DEV_IDEDMA
if (drive->crc_count) {
ide_dma_off_quietly(drive);
ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive));
if (drive->current_speed >= XFER_SW_DMA_0)
ide_dma_on(drive);
} else
ide_dma_off(drive);
#endif
}
static void ide_disk_pre_reset(ide_drive_t *drive) static void ide_disk_pre_reset(ide_drive_t *drive)
{ {
int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1; int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
...@@ -1039,17 +959,20 @@ static void pre_reset(ide_drive_t *drive) ...@@ -1039,17 +959,20 @@ static void pre_reset(ide_drive_t *drive)
else else
drive->post_reset = 1; drive->post_reset = 1;
if (!drive->keep_settings) {
if (drive->using_dma) { if (drive->using_dma) {
check_dma_crc(drive); if (drive->crc_count)
} else { ide_check_dma_crc(drive);
else
ide_dma_off(drive);
}
if (!drive->keep_settings) {
if (!drive->using_dma) {
drive->unmask = 0; drive->unmask = 0;
drive->io_32bit = 0; drive->io_32bit = 0;
} }
return; return;
} }
if (drive->using_dma)
check_dma_crc(drive);
if (HWIF(drive)->pre_reset != NULL) if (HWIF(drive)->pre_reset != NULL)
HWIF(drive)->pre_reset(drive); HWIF(drive)->pre_reset(drive);
......
...@@ -49,7 +49,7 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id ...@@ -49,7 +49,7 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
pnp_set_drvdata(dev,hwif); pnp_set_drvdata(dev,hwif);
ide_device_add(idx); ide_device_add(idx, NULL);
return 0; return 0;
} }
...@@ -60,9 +60,10 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id ...@@ -60,9 +60,10 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
static void idepnp_remove(struct pnp_dev * dev) static void idepnp_remove(struct pnp_dev * dev)
{ {
ide_hwif_t *hwif = pnp_get_drvdata(dev); ide_hwif_t *hwif = pnp_get_drvdata(dev);
if (hwif) {
ide_unregister(hwif->index); if (hwif)
} else ide_unregister(hwif->index, 0, 0);
else
printk(KERN_ERR "idepnp: Unable to remove device, please report.\n"); printk(KERN_ERR "idepnp: Unable to remove device, please report.\n");
} }
......
This diff is collapsed.
...@@ -739,7 +739,7 @@ void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver) ...@@ -739,7 +739,7 @@ void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver)
EXPORT_SYMBOL(ide_proc_unregister_driver); EXPORT_SYMBOL(ide_proc_unregister_driver);
static void create_proc_ide_drives(ide_hwif_t *hwif) void ide_proc_port_register_devices(ide_hwif_t *hwif)
{ {
int d; int d;
struct proc_dir_entry *ent; struct proc_dir_entry *ent;
...@@ -793,9 +793,6 @@ static ide_proc_entry_t hwif_entries[] = { ...@@ -793,9 +793,6 @@ static ide_proc_entry_t hwif_entries[] = {
void ide_proc_register_port(ide_hwif_t *hwif) void ide_proc_register_port(ide_hwif_t *hwif)
{ {
if (!hwif->present)
return;
if (!hwif->proc) { if (!hwif->proc) {
hwif->proc = proc_mkdir(hwif->name, proc_ide_root); hwif->proc = proc_mkdir(hwif->name, proc_ide_root);
...@@ -804,8 +801,6 @@ void ide_proc_register_port(ide_hwif_t *hwif) ...@@ -804,8 +801,6 @@ void ide_proc_register_port(ide_hwif_t *hwif)
ide_add_proc_entries(hwif->proc, hwif_entries, hwif); ide_add_proc_entries(hwif->proc, hwif_entries, hwif);
} }
create_proc_ide_drives(hwif);
} }
#ifdef CONFIG_BLK_DEV_IDEPCI #ifdef CONFIG_BLK_DEV_IDEPCI
......
This diff is collapsed.
...@@ -755,6 +755,7 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) ...@@ -755,6 +755,7 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
u8 args[4], xfer_rate = 0; u8 args[4], xfer_rate = 0;
ide_task_t tfargs; ide_task_t tfargs;
struct ide_taskfile *tf = &tfargs.tf; struct ide_taskfile *tf = &tfargs.tf;
struct hd_driveid *id = drive->id;
if (NULL == (void *) arg) { if (NULL == (void *) arg) {
struct request rq; struct request rq;
...@@ -792,11 +793,17 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) ...@@ -792,11 +793,17 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
return -ENOMEM; return -ENOMEM;
} }
if (set_transfer(drive, &tfargs)) { if (tf->command == WIN_SETFEATURES &&
tf->feature == SETFEATURES_XFER &&
tf->nsect >= XFER_SW_DMA_0 &&
(id->dma_ultra || id->dma_mword || id->dma_1word)) {
xfer_rate = args[1]; xfer_rate = args[1];
if (ide_ata66_check(drive, &tfargs)) if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) {
printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
"be set\n", drive->name);
goto abort; goto abort;
} }
}
err = ide_raw_taskfile(drive, &tfargs, buf, args[3]); err = ide_raw_taskfile(drive, &tfargs, buf, args[3]);
......
...@@ -499,6 +499,8 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) ...@@ -499,6 +499,8 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
/** /**
* ide_unregister - free an IDE interface * ide_unregister - free an IDE interface
* @index: index of interface (will change soon to a pointer) * @index: index of interface (will change soon to a pointer)
* @init_default: init default hwif flag
* @restore: restore hwif flag
* *
* Perform the final unregister of an IDE interface. At the moment * Perform the final unregister of an IDE interface. At the moment
* we don't refcount interfaces so this will also get split up. * we don't refcount interfaces so this will also get split up.
...@@ -518,7 +520,7 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) ...@@ -518,7 +520,7 @@ void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
* This is raving bonkers. * This is raving bonkers.
*/ */
void ide_unregister(unsigned int index) void ide_unregister(unsigned int index, int init_default, int restore)
{ {
ide_drive_t *drive; ide_drive_t *drive;
ide_hwif_t *hwif, *g; ide_hwif_t *hwif, *g;
...@@ -602,8 +604,11 @@ void ide_unregister(unsigned int index) ...@@ -602,8 +604,11 @@ void ide_unregister(unsigned int index)
/* restore hwif data to pristine status */ /* restore hwif data to pristine status */
ide_init_port_data(hwif, index); ide_init_port_data(hwif, index);
if (init_default)
init_hwif_default(hwif, index); init_hwif_default(hwif, index);
if (restore)
ide_hwif_restore(hwif, &tmp_hwif); ide_hwif_restore(hwif, &tmp_hwif);
abort: abort:
...@@ -678,6 +683,31 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw) ...@@ -678,6 +683,31 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
} }
EXPORT_SYMBOL_GPL(ide_init_port_hw); EXPORT_SYMBOL_GPL(ide_init_port_hw);
ide_hwif_t *ide_deprecated_find_port(unsigned long base)
{
ide_hwif_t *hwif;
int i;
for (i = 0; i < MAX_HWIFS; i++) {
hwif = &ide_hwifs[i];
if (hwif->io_ports[IDE_DATA_OFFSET] == base)
goto found;
}
for (i = 0; i < MAX_HWIFS; i++) {
hwif = &ide_hwifs[i];
if (hwif->hold)
continue;
if (!hwif->present && hwif->mate == NULL)
goto found;
}
hwif = NULL;
found:
return hwif;
}
EXPORT_SYMBOL_GPL(ide_deprecated_find_port);
/** /**
* ide_register_hw - register IDE interface * ide_register_hw - register IDE interface
* @hw: hardware registers * @hw: hardware registers
...@@ -697,38 +727,26 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), ...@@ -697,38 +727,26 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
do { do {
for (index = 0; index < MAX_HWIFS; ++index) { hwif = ide_deprecated_find_port(hw->io_ports[IDE_DATA_OFFSET]);
hwif = &ide_hwifs[index]; index = hwif->index;
if (hwif->io_ports[IDE_DATA_OFFSET] == hw->io_ports[IDE_DATA_OFFSET]) if (hwif)
goto found;
}
for (index = 0; index < MAX_HWIFS; ++index) {
hwif = &ide_hwifs[index];
if (hwif->hold)
continue;
if (!hwif->present && hwif->mate == NULL)
goto found; goto found;
}
for (index = 0; index < MAX_HWIFS; index++) for (index = 0; index < MAX_HWIFS; index++)
ide_unregister(index); ide_unregister(index, 1, 1);
} while (retry--); } while (retry--);
return -1; return -1;
found: found:
if (hwif->present) if (hwif->present)
ide_unregister(index); ide_unregister(index, 0, 1);
else if (!hwif->hold) { else if (!hwif->hold)
ide_init_port_data(hwif, index); ide_init_port_data(hwif, index);
init_hwif_default(hwif, index);
}
if (hwif->present)
return -1;
ide_init_port_hw(hwif, hw); ide_init_port_hw(hwif, hw);
hwif->quirkproc = quirkproc; hwif->quirkproc = quirkproc;
idx[0] = index; idx[0] = index;
ide_device_add(idx); ide_device_add(idx, NULL);
if (hwifp) if (hwifp)
*hwifp = hwif; *hwifp = hwif;
...@@ -791,10 +809,6 @@ int set_io_32bit(ide_drive_t *drive, int arg) ...@@ -791,10 +809,6 @@ int set_io_32bit(ide_drive_t *drive, int arg)
return -EBUSY; return -EBUSY;
drive->io_32bit = arg; drive->io_32bit = arg;
#ifdef CONFIG_BLK_DEV_DTC2278
if (HWIF(drive)->chipset == ide_dtc2278)
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg;
#endif /* CONFIG_BLK_DEV_DTC2278 */
spin_unlock_irq(&ide_lock); spin_unlock_irq(&ide_lock);
...@@ -1021,11 +1035,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device ...@@ -1021,11 +1035,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
case HDIO_GET_NICE: case HDIO_GET_NICE:
return put_user(drive->dsc_overlap << IDE_NICE_DSC_OVERLAP | return put_user(drive->dsc_overlap << IDE_NICE_DSC_OVERLAP |
drive->atapi_overlap << IDE_NICE_ATAPI_OVERLAP | drive->atapi_overlap << IDE_NICE_ATAPI_OVERLAP |
drive->nice0 << IDE_NICE_0 | drive->nice1 << IDE_NICE_1,
drive->nice1 << IDE_NICE_1 |
drive->nice2 << IDE_NICE_2,
(long __user *) arg); (long __user *) arg);
#ifdef CONFIG_IDE_TASK_IOCTL #ifdef CONFIG_IDE_TASK_IOCTL
case HDIO_DRIVE_TASKFILE: case HDIO_DRIVE_TASKFILE:
if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
...@@ -1066,7 +1077,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device ...@@ -1066,7 +1077,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
case HDIO_UNREGISTER_HWIF: case HDIO_UNREGISTER_HWIF:
if (!capable(CAP_SYS_RAWIO)) return -EACCES; if (!capable(CAP_SYS_RAWIO)) return -EACCES;
/* (arg > MAX_HWIFS) checked in function */ /* (arg > MAX_HWIFS) checked in function */
ide_unregister(arg); ide_unregister(arg, 1, 1);
return 0; return 0;
case HDIO_SET_NICE: case HDIO_SET_NICE:
if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (!capable(CAP_SYS_ADMIN)) return -EACCES;
...@@ -1711,7 +1722,7 @@ void __exit cleanup_module (void) ...@@ -1711,7 +1722,7 @@ void __exit cleanup_module (void)
int index; int index;
for (index = 0; index < MAX_HWIFS; ++index) for (index = 0; index < MAX_HWIFS; ++index)
ide_unregister(index); ide_unregister(index, 0, 0);
proc_ide_destroy(); proc_ide_destroy();
......
...@@ -191,9 +191,14 @@ static int __init initRegisters (void) { ...@@ -191,9 +191,14 @@ static int __init initRegisters (void) {
return t; return t;
} }
static const struct ide_port_info ali14xx_port_info = {
.chipset = ide_ali14xx,
.host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
.pio_mask = ATA_PIO4,
};
static int __init ali14xx_probe(void) static int __init ali14xx_probe(void)
{ {
ide_hwif_t *hwif, *mate;
static u8 idx[4] = { 0, 1, 0xff, 0xff }; static u8 idx[4] = { 0, 1, 0xff, 0xff };
printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n", printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n",
...@@ -205,21 +210,10 @@ static int __init ali14xx_probe(void) ...@@ -205,21 +210,10 @@ static int __init ali14xx_probe(void)
return 1; return 1;
} }
hwif = &ide_hwifs[0]; ide_hwifs[0].set_pio_mode = &ali14xx_set_pio_mode;
mate = &ide_hwifs[1]; ide_hwifs[1].set_pio_mode = &ali14xx_set_pio_mode;
hwif->chipset = ide_ali14xx;
hwif->pio_mask = ATA_PIO4;
hwif->set_pio_mode = &ali14xx_set_pio_mode;
hwif->mate = mate;
mate->chipset = ide_ali14xx;
mate->pio_mask = ATA_PIO4;
mate->set_pio_mode = &ali14xx_set_pio_mode;
mate->mate = hwif;
mate->channel = 1;
ide_device_add(idx); ide_device_add(idx, &ali14xx_port_info);
return 0; return 0;
} }
......
...@@ -232,7 +232,7 @@ static int __init buddha_init(void) ...@@ -232,7 +232,7 @@ static int __init buddha_init(void)
} }
} }
ide_device_add(idx); ide_device_add(idx, NULL);
} }
return 0; return 0;
......
...@@ -84,14 +84,20 @@ static void dtc2278_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -84,14 +84,20 @@ static void dtc2278_set_pio_mode(ide_drive_t *drive, const u8 pio)
/* Actually we do - there is a data sheet available for the /* Actually we do - there is a data sheet available for the
Winbond but does anyone actually care */ Winbond but does anyone actually care */
} }
/*
* 32bit I/O has to be enabled for *both* drives at the same time.
*/
drive->io_32bit = 1;
HWIF(drive)->drives[!drive->select.b.unit].io_32bit = 1;
} }
static const struct ide_port_info dtc2278_port_info __initdata = {
.chipset = ide_dtc2278,
.host_flags = IDE_HFLAG_SERIALIZE |
IDE_HFLAG_NO_UNMASK_IRQS |
IDE_HFLAG_IO_32BIT |
/* disallow ->io_32bit changes */
IDE_HFLAG_NO_IO_32BIT |
IDE_HFLAG_NO_DMA |
IDE_HFLAG_NO_AUTOTUNE,
.pio_mask = ATA_PIO4,
};
static int __init dtc2278_probe(void) static int __init dtc2278_probe(void)
{ {
unsigned long flags; unsigned long flags;
...@@ -122,23 +128,9 @@ static int __init dtc2278_probe(void) ...@@ -122,23 +128,9 @@ static int __init dtc2278_probe(void)
#endif #endif
local_irq_restore(flags); local_irq_restore(flags);
hwif->serialized = 1;
hwif->chipset = ide_dtc2278;
hwif->pio_mask = ATA_PIO4;
hwif->set_pio_mode = &dtc2278_set_pio_mode; hwif->set_pio_mode = &dtc2278_set_pio_mode;
hwif->drives[0].no_unmask = 1;
hwif->drives[1].no_unmask = 1; ide_device_add(idx, &dtc2278_port_info);
hwif->mate = mate;
mate->serialized = 1;
mate->chipset = ide_dtc2278;
mate->pio_mask = ATA_PIO4;
mate->drives[0].no_unmask = 1;
mate->drives[1].no_unmask = 1;
mate->mate = hwif;
mate->channel = 1;
ide_device_add(idx);
return 0; return 0;
} }
......
...@@ -83,7 +83,7 @@ static int __init falconide_init(void) ...@@ -83,7 +83,7 @@ static int __init falconide_init(void)
ide_init_port_data(hwif, index); ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw); ide_init_port_hw(hwif, &hw);
ide_device_add(idx); ide_device_add(idx, NULL);
} }
} }
......
...@@ -186,7 +186,7 @@ static int __init gayle_init(void) ...@@ -186,7 +186,7 @@ static int __init gayle_init(void)
release_mem_region(res_start, res_n); release_mem_region(res_start, res_n);
} }
ide_device_add(idx); ide_device_add(idx, NULL);
return 0; return 0;
} }
......
...@@ -300,16 +300,36 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -300,16 +300,36 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
#endif #endif
} }
static void __init ht6560b_port_init_devs(ide_hwif_t *hwif)
{
/* Setting default configurations for drives. */
int t = (HT_CONFIG_DEFAULT << 8) | HT_TIMING_DEFAULT;
if (hwif->channel)
t |= (HT_SECONDARY_IF << 8);
hwif->drives[0].drive_data = t;
hwif->drives[1].drive_data = t;
}
int probe_ht6560b = 0; int probe_ht6560b = 0;
module_param_named(probe, probe_ht6560b, bool, 0); module_param_named(probe, probe_ht6560b, bool, 0);
MODULE_PARM_DESC(probe, "probe for HT6560B chipset"); MODULE_PARM_DESC(probe, "probe for HT6560B chipset");
static const struct ide_port_info ht6560b_port_info __initdata = {
.chipset = ide_ht6560b,
.host_flags = IDE_HFLAG_SERIALIZE | /* is this needed? */
IDE_HFLAG_NO_DMA |
IDE_HFLAG_NO_AUTOTUNE |
IDE_HFLAG_ABUSE_PREFETCH,
.pio_mask = ATA_PIO5,
};
static int __init ht6560b_init(void) static int __init ht6560b_init(void)
{ {
ide_hwif_t *hwif, *mate; ide_hwif_t *hwif, *mate;
static u8 idx[4] = { 0, 1, 0xff, 0xff }; static u8 idx[4] = { 0, 1, 0xff, 0xff };
int t;
if (probe_ht6560b == 0) if (probe_ht6560b == 0)
return -ENODEV; return -ENODEV;
...@@ -328,36 +348,16 @@ static int __init ht6560b_init(void) ...@@ -328,36 +348,16 @@ static int __init ht6560b_init(void)
goto release_region; goto release_region;
} }
hwif->chipset = ide_ht6560b;
hwif->selectproc = &ht6560b_selectproc; hwif->selectproc = &ht6560b_selectproc;
hwif->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
hwif->pio_mask = ATA_PIO5;
hwif->set_pio_mode = &ht6560b_set_pio_mode; hwif->set_pio_mode = &ht6560b_set_pio_mode;
hwif->serialized = 1; /* is this needed? */
hwif->mate = mate;
mate->chipset = ide_ht6560b;
mate->selectproc = &ht6560b_selectproc; mate->selectproc = &ht6560b_selectproc;
mate->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
mate->pio_mask = ATA_PIO5;
mate->set_pio_mode = &ht6560b_set_pio_mode; mate->set_pio_mode = &ht6560b_set_pio_mode;
mate->serialized = 1; /* is this needed? */
mate->mate = hwif;
mate->channel = 1;
/* hwif->port_init_devs = ht6560b_port_init_devs;
* Setting default configurations for drives mate->port_init_devs = ht6560b_port_init_devs;
*/
t = (HT_CONFIG_DEFAULT << 8);
t |= HT_TIMING_DEFAULT;
hwif->drives[0].drive_data = t;
hwif->drives[1].drive_data = t;
t |= (HT_SECONDARY_IF << 8);
mate->drives[0].drive_data = t;
mate->drives[1].drive_data = t;
ide_device_add(idx); ide_device_add(idx, &ht6560b_port_info);
return 0; return 0;
......
...@@ -145,13 +145,36 @@ static void ide_detach(struct pcmcia_device *link) ...@@ -145,13 +145,36 @@ static void ide_detach(struct pcmcia_device *link)
static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle)
{ {
ide_hwif_t *hwif;
hw_regs_t hw; hw_regs_t hw;
int i;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
memset(&hw, 0, sizeof(hw)); memset(&hw, 0, sizeof(hw));
ide_init_hwif_ports(&hw, io, ctl, NULL); ide_std_init_ports(&hw, io, ctl);
hw.irq = irq; hw.irq = irq;
hw.chipset = ide_pci; hw.chipset = ide_pci;
hw.dev = &handle->dev; hw.dev = &handle->dev;
return ide_register_hw(&hw, &ide_undecoded_slave, NULL);
hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif == NULL)
return -1;
i = hwif->index;
if (hwif->present)
ide_unregister(i, 0, 0);
else if (!hwif->hold)
ide_init_port_data(hwif, i);
ide_init_port_hw(hwif, &hw);
hwif->quirkproc = &ide_undecoded_slave;
idx[0] = i;
ide_device_add(idx, NULL);
return hwif->present ? i : -1;
} }
/*====================================================================== /*======================================================================
...@@ -337,7 +360,7 @@ void ide_release(struct pcmcia_device *link) ...@@ -337,7 +360,7 @@ void ide_release(struct pcmcia_device *link)
if (info->ndev) { if (info->ndev) {
/* FIXME: if this fails we need to queue the cleanup somehow /* FIXME: if this fails we need to queue the cleanup somehow
-- need to investigate the required PCMCIA magic */ -- need to investigate the required PCMCIA magic */
ide_unregister(info->hd); ide_unregister(info->hd, 0, 0);
} }
info->ndev = 0; info->ndev = 0;
......
...@@ -108,7 +108,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) ...@@ -108,7 +108,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, NULL);
platform_set_drvdata(pdev, hwif); platform_set_drvdata(pdev, hwif);
...@@ -122,7 +122,7 @@ static int __devexit plat_ide_remove(struct platform_device *pdev) ...@@ -122,7 +122,7 @@ static int __devexit plat_ide_remove(struct platform_device *pdev)
{ {
ide_hwif_t *hwif = pdev->dev.driver_data; ide_hwif_t *hwif = pdev->dev.driver_data;
ide_unregister(hwif->index); ide_unregister(hwif->index, 0, 0);
return 0; return 0;
} }
......
...@@ -123,19 +123,9 @@ static int __init macide_init(void) ...@@ -123,19 +123,9 @@ static int __init macide_init(void)
ide_init_port_data(hwif, index); ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw); ide_init_port_hw(hwif, &hw);
if (macintosh_config->ide_type == MAC_IDE_BABOON &&
macintosh_config->ident == MAC_MODEL_PB190) {
/* Fix breakage in ide-disk.c: drive capacity */
/* is not initialized for drives without a */
/* hardware ID, and we can't get that without */
/* probing the drive which freezes a 190. */
ide_drive_t *drive = &hwif->drives[0];
drive->capacity64 = drive->cyl*drive->head*drive->sect;
}
hwif->mmio = 1; hwif->mmio = 1;
ide_device_add(idx); ide_device_add(idx, NULL);
} }
return 0; return 0;
......
...@@ -154,7 +154,7 @@ static int __init q40ide_init(void) ...@@ -154,7 +154,7 @@ static int __init q40ide_init(void)
} }
} }
ide_device_add(idx); ide_device_add(idx, NULL);
return 0; return 0;
} }
......
...@@ -305,18 +305,33 @@ static int __init qd_testreg(int port) ...@@ -305,18 +305,33 @@ static int __init qd_testreg(int port)
* called to setup an ata channel : adjusts attributes & links for tuning * called to setup an ata channel : adjusts attributes & links for tuning
*/ */
static void __init qd_setup(ide_hwif_t *hwif, int base, int config, static void __init qd_setup(ide_hwif_t *hwif, int base, int config)
unsigned int data0, unsigned int data1)
{ {
hwif->chipset = ide_qd65xx;
hwif->channel = hwif->index;
hwif->select_data = base; hwif->select_data = base;
hwif->config_data = config; hwif->config_data = config;
hwif->drives[0].drive_data = data0; }
hwif->drives[1].drive_data = data1;
hwif->drives[0].io_32bit = static void __init qd6500_port_init_devs(ide_hwif_t *hwif)
hwif->drives[1].io_32bit = 1; {
hwif->pio_mask = ATA_PIO4; u8 base = hwif->select_data, config = QD_CONFIG(hwif);
hwif->drives[0].drive_data = QD6500_DEF_DATA;
hwif->drives[1].drive_data = QD6500_DEF_DATA;
}
static void __init qd6580_port_init_devs(ide_hwif_t *hwif)
{
u16 t1, t2;
u8 base = hwif->select_data, config = QD_CONFIG(hwif);
if (QD_CONTROL(hwif) & QD_CONTR_SEC_DISABLED) {
t1 = QD6580_DEF_DATA;
t2 = QD6580_DEF_DATA2;
} else
t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA;
hwif->drives[0].drive_data = t1;
hwif->drives[1].drive_data = t2;
} }
/* /*
...@@ -356,6 +371,14 @@ static void __exit qd_unsetup(ide_hwif_t *hwif) ...@@ -356,6 +371,14 @@ static void __exit qd_unsetup(ide_hwif_t *hwif)
} }
*/ */
static const struct ide_port_info qd65xx_port_info __initdata = {
.chipset = ide_qd65xx,
.host_flags = IDE_HFLAG_IO_32BIT |
IDE_HFLAG_NO_DMA |
IDE_HFLAG_NO_AUTOTUNE,
.pio_mask = ATA_PIO4,
};
/* /*
* qd_probe: * qd_probe:
* *
...@@ -393,13 +416,14 @@ static int __init qd_probe(int base) ...@@ -393,13 +416,14 @@ static int __init qd_probe(int base)
return 1; return 1;
} }
qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA); qd_setup(hwif, base, config);
hwif->port_init_devs = qd6500_port_init_devs;
hwif->set_pio_mode = &qd6500_set_pio_mode; hwif->set_pio_mode = &qd6500_set_pio_mode;
idx[0] = unit; idx[unit] = unit;
ide_device_add(idx); ide_device_add(idx, &qd65xx_port_info);
return 1; return 1;
} }
...@@ -426,14 +450,15 @@ static int __init qd_probe(int base) ...@@ -426,14 +450,15 @@ static int __init qd_probe(int base)
hwif = &ide_hwifs[unit]; hwif = &ide_hwifs[unit];
printk(KERN_INFO "%s: qd6580: single IDE board\n", printk(KERN_INFO "%s: qd6580: single IDE board\n",
hwif->name); hwif->name);
qd_setup(hwif, base, config | (control << 8),
QD6580_DEF_DATA, QD6580_DEF_DATA2);
qd_setup(hwif, base, config | (control << 8));
hwif->port_init_devs = qd6580_port_init_devs;
hwif->set_pio_mode = &qd6580_set_pio_mode; hwif->set_pio_mode = &qd6580_set_pio_mode;
idx[0] = unit; idx[unit] = unit;
ide_device_add(idx); ide_device_add(idx, &qd65xx_port_info);
outb(QD_DEF_CONTR, QD_CONTROL_PORT); outb(QD_DEF_CONTR, QD_CONTROL_PORT);
...@@ -447,20 +472,20 @@ static int __init qd_probe(int base) ...@@ -447,20 +472,20 @@ static int __init qd_probe(int base)
printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n", printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n",
hwif->name, mate->name); hwif->name, mate->name);
qd_setup(hwif, base, config | (control << 8), qd_setup(hwif, base, config | (control << 8));
QD6580_DEF_DATA, QD6580_DEF_DATA);
hwif->port_init_devs = qd6580_port_init_devs;
hwif->set_pio_mode = &qd6580_set_pio_mode; hwif->set_pio_mode = &qd6580_set_pio_mode;
qd_setup(mate, base, config | (control << 8), qd_setup(mate, base, config | (control << 8));
QD6580_DEF_DATA2, QD6580_DEF_DATA2);
mate->port_init_devs = qd6580_port_init_devs;
mate->set_pio_mode = &qd6580_set_pio_mode; mate->set_pio_mode = &qd6580_set_pio_mode;
idx[0] = 0; idx[0] = 0;
idx[1] = 1; idx[1] = 1;
ide_device_add(idx); ide_device_add(idx, &qd65xx_port_info);
outb(QD_DEF_CONTR, QD_CONTROL_PORT); outb(QD_DEF_CONTR, QD_CONTROL_PORT);
......
...@@ -120,9 +120,14 @@ static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -120,9 +120,14 @@ static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio)
spin_unlock_irqrestore(&ide_lock, flags); spin_unlock_irqrestore(&ide_lock, flags);
} }
static const struct ide_port_info umc8672_port_info __initdata = {
.chipset = ide_umc8672,
.host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_NO_AUTOTUNE,
.pio_mask = ATA_PIO4,
};
static int __init umc8672_probe(void) static int __init umc8672_probe(void)
{ {
ide_hwif_t *hwif, *mate;
unsigned long flags; unsigned long flags;
static u8 idx[4] = { 0, 1, 0xff, 0xff }; static u8 idx[4] = { 0, 1, 0xff, 0xff };
...@@ -143,21 +148,10 @@ static int __init umc8672_probe(void) ...@@ -143,21 +148,10 @@ static int __init umc8672_probe(void)
umc_set_speeds (current_speeds); umc_set_speeds (current_speeds);
local_irq_restore(flags); local_irq_restore(flags);
hwif = &ide_hwifs[0]; ide_hwifs[0].set_pio_mode = &umc_set_pio_mode;
mate = &ide_hwifs[1]; ide_hwifs[1].set_pio_mode = &umc_set_pio_mode;
hwif->chipset = ide_umc8672;
hwif->pio_mask = ATA_PIO4;
hwif->set_pio_mode = &umc_set_pio_mode;
hwif->mate = mate;
mate->chipset = ide_umc8672;
mate->pio_mask = ATA_PIO4;
mate->set_pio_mode = &umc_set_pio_mode;
mate->mate = hwif;
mate->channel = 1;
ide_device_add(idx); ide_device_add(idx, &umc8672_port_info);
return 0; return 0;
} }
......
...@@ -548,6 +548,17 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif) ...@@ -548,6 +548,17 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
*ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET); *ata_regs = ahwif->regbase + (14 << AU1XXX_ATA_REG_OFFSET);
} }
static const struct ide_port_info au1xxx_port_info = {
.host_flags = IDE_HFLAG_POST_SET_MODE |
IDE_HFLAG_NO_DMA | /* no SFF-style DMA */
IDE_HFLAG_NO_IO_32BIT |
IDE_HFLAG_UNMASK_IRQS,
.pio_mask = ATA_PIO4,
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
.mwdma_mask = ATA_MWDMA2,
#endif
};
static int au_ide_probe(struct device *dev) static int au_ide_probe(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
...@@ -606,21 +617,6 @@ static int au_ide_probe(struct device *dev) ...@@ -606,21 +617,6 @@ static int au_ide_probe(struct device *dev)
hwif->dev = dev; hwif->dev = dev;
hwif->ultra_mask = 0x0; /* Disable Ultra DMA */
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
hwif->mwdma_mask = 0x07; /* Multimode-2 DMA */
hwif->swdma_mask = 0x00;
#else
hwif->mwdma_mask = 0x0;
hwif->swdma_mask = 0x0;
#endif
hwif->pio_mask = ATA_PIO4;
hwif->host_flags = IDE_HFLAG_POST_SET_MODE;
hwif->drives[0].unmask = 1;
hwif->drives[1].unmask = 1;
/* hold should be on in all cases */ /* hold should be on in all cases */
hwif->hold = 1; hwif->hold = 1;
...@@ -651,16 +647,9 @@ static int au_ide_probe(struct device *dev) ...@@ -651,16 +647,9 @@ static int au_ide_probe(struct device *dev)
hwif->ide_dma_test_irq = &auide_dma_test_irq; hwif->ide_dma_test_irq = &auide_dma_test_irq;
hwif->dma_lost_irq = &auide_dma_lost_irq; hwif->dma_lost_irq = &auide_dma_lost_irq;
#endif #endif
hwif->channel = 0;
hwif->select_data = 0; /* no chipset-specific code */ hwif->select_data = 0; /* no chipset-specific code */
hwif->config_data = 0; /* no chipset-specific code */ hwif->config_data = 0; /* no chipset-specific code */
hwif->drives[0].autotune = 1; /* 1=autotune, 2=noautotune, 0=default */
hwif->drives[1].autotune = 1;
hwif->drives[0].no_io_32bit = 1;
hwif->drives[1].no_io_32bit = 1;
auide_hwif.hwif = hwif; auide_hwif.hwif = hwif;
hwif->hwif_data = &auide_hwif; hwif->hwif_data = &auide_hwif;
...@@ -671,7 +660,7 @@ static int au_ide_probe(struct device *dev) ...@@ -671,7 +660,7 @@ static int au_ide_probe(struct device *dev)
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, &au1xxx_port_info);
dev_set_drvdata(dev, hwif); dev_set_drvdata(dev, hwif);
...@@ -688,7 +677,7 @@ static int au_ide_remove(struct device *dev) ...@@ -688,7 +677,7 @@ static int au_ide_remove(struct device *dev)
ide_hwif_t *hwif = dev_get_drvdata(dev); ide_hwif_t *hwif = dev_get_drvdata(dev);
_auide_hwif *ahwif = &auide_hwif; _auide_hwif *ahwif = &auide_hwif;
ide_unregister(hwif->index); ide_unregister(hwif->index, 0, 0);
iounmap((void *)ahwif->regbase); iounmap((void *)ahwif->regbase);
......
...@@ -129,7 +129,7 @@ static int __devinit swarm_ide_probe(struct device *dev) ...@@ -129,7 +129,7 @@ static int __devinit swarm_ide_probe(struct device *dev)
idx[0] = hwif->index; idx[0] = hwif->index;
ide_device_add(idx); ide_device_add(idx, NULL);
dev_set_drvdata(dev, hwif); dev_set_drvdata(dev, hwif);
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -166,6 +165,16 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch ...@@ -166,6 +165,16 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch
return dev->irq; return dev->irq;
} }
static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
{
struct pci_dev *dev = to_pci_dev(hwif->dev);
u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
pci_read_config_byte(dev, 0x49, &ata66);
return (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
}
static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev); struct pci_dev *dev = to_pci_dev(hwif->dev);
...@@ -174,21 +183,10 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) ...@@ -174,21 +183,10 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
hwif->set_dma_mode = &aec6210_set_mode; hwif->set_dma_mode = &aec6210_set_mode;
else else {
hwif->set_dma_mode = &aec6260_set_mode; hwif->set_dma_mode = &aec6260_set_mode;
if (hwif->dma_base == 0) hwif->cable_detect = atp86x_cable_detect;
return;
if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
return;
if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
pci_read_config_byte(dev, 0x49, &ata66);
hwif->cbl = (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
} }
} }
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -666,13 +665,12 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) ...@@ -666,13 +665,12 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)
hwif->set_dma_mode = &ali_set_dma_mode; hwif->set_dma_mode = &ali_set_dma_mode;
hwif->udma_filter = &ali_udma_filter; hwif->udma_filter = &ali_udma_filter;
hwif->cable_detect = ata66_ali15x3;
if (hwif->dma_base == 0) if (hwif->dma_base == 0)
return; return;
hwif->dma_setup = &ali15x3_dma_setup; hwif->dma_setup = &ali15x3_dma_setup;
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = ata66_ali15x3(hwif);
} }
/** /**
......
...@@ -17,12 +17,9 @@ ...@@ -17,12 +17,9 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <asm/io.h>
#include "ide-timing.h" #include "ide-timing.h"
...@@ -199,6 +196,14 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, ...@@ -199,6 +196,14 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev,
return dev->irq; return dev->irq;
} }
static u8 __devinit amd_cable_detect(ide_hwif_t *hwif)
{
if ((amd_80w >> hwif->channel) & 1)
return ATA_CBL_PATA80;
else
return ATA_CBL_PATA40;
}
static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev); struct pci_dev *dev = to_pci_dev(hwif->dev);
...@@ -209,15 +214,7 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) ...@@ -209,15 +214,7 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
hwif->set_pio_mode = &amd_set_pio_mode; hwif->set_pio_mode = &amd_set_pio_mode;
hwif->set_dma_mode = &amd_set_drive; hwif->set_dma_mode = &amd_set_drive;
if (!hwif->dma_base) hwif->cable_detect = amd_cable_detect;
return;
if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
if ((amd_80w >> hwif->channel) & 1)
hwif->cbl = ATA_CBL_PATA80;
else
hwif->cbl = ATA_CBL_PATA40;
}
} }
#define IDE_HFLAGS_AMD \ #define IDE_HFLAGS_AMD \
......
...@@ -6,15 +6,11 @@ ...@@ -6,15 +6,11 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/io.h>
#define ATIIXP_IDE_PIO_TIMING 0x40 #define ATIIXP_IDE_PIO_TIMING 0x40
#define ATIIXP_IDE_MDMA_TIMING 0x44 #define ATIIXP_IDE_MDMA_TIMING 0x44
#define ATIIXP_IDE_PIO_CONTROL 0x48 #define ATIIXP_IDE_PIO_CONTROL 0x48
...@@ -121,6 +117,19 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -121,6 +117,19 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
spin_unlock_irqrestore(&atiixp_lock, flags); spin_unlock_irqrestore(&atiixp_lock, flags);
} }
static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif)
{
struct pci_dev *pdev = to_pci_dev(hwif->dev);
u8 udma_mode = 0, ch = hwif->channel;
pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode);
if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40)
return ATA_CBL_PATA80;
else
return ATA_CBL_PATA40;
}
/** /**
* init_hwif_atiixp - fill in the hwif for the ATIIXP * init_hwif_atiixp - fill in the hwif for the ATIIXP
* @hwif: IDE interface * @hwif: IDE interface
...@@ -131,21 +140,10 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -131,21 +140,10 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
static void __devinit init_hwif_atiixp(ide_hwif_t *hwif) static void __devinit init_hwif_atiixp(ide_hwif_t *hwif)
{ {
struct pci_dev *pdev = to_pci_dev(hwif->dev);
u8 udma_mode = 0, ch = hwif->channel;
hwif->set_pio_mode = &atiixp_set_pio_mode; hwif->set_pio_mode = &atiixp_set_pio_mode;
hwif->set_dma_mode = &atiixp_set_dma_mode; hwif->set_dma_mode = &atiixp_set_dma_mode;
if (!hwif->dma_base) hwif->cable_detect = atiixp_cable_detect;
return;
pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode);
if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40)
hwif->cbl = ATA_CBL_PATA80;
else
hwif->cbl = ATA_CBL_PATA40;
} }
static const struct ide_port_info atiixp_pci_info[] __devinitdata = { static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
......
...@@ -103,10 +103,6 @@ ...@@ -103,10 +103,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -703,6 +699,18 @@ static int pci_conf2(void) ...@@ -703,6 +699,18 @@ static int pci_conf2(void)
return 0; return 0;
} }
static const struct ide_port_info cmd640_port_info __initdata = {
.chipset = ide_cmd640,
.host_flags = IDE_HFLAG_SERIALIZE |
IDE_HFLAG_NO_DMA |
IDE_HFLAG_NO_AUTOTUNE |
IDE_HFLAG_ABUSE_PREFETCH |
IDE_HFLAG_ABUSE_FAST_DEVSEL,
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
.pio_mask = ATA_PIO5,
#endif
};
/* /*
* Probe for a cmd640 chipset, and initialize it if found. * Probe for a cmd640 chipset, and initialize it if found.
*/ */
...@@ -760,11 +768,7 @@ static int __init cmd640x_init(void) ...@@ -760,11 +768,7 @@ static int __init cmd640x_init(void)
setup_device_ptrs (); setup_device_ptrs ();
printk("%s: buggy cmd640%c interface on %s, config=0x%02x\n", printk("%s: buggy cmd640%c interface on %s, config=0x%02x\n",
cmd_hwif0->name, 'a' + cmd640_chip_version - 1, bus_type, cfr); cmd_hwif0->name, 'a' + cmd640_chip_version - 1, bus_type, cfr);
cmd_hwif0->chipset = ide_cmd640;
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
cmd_hwif0->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
IDE_HFLAG_ABUSE_FAST_DEVSEL;
cmd_hwif0->pio_mask = ATA_PIO5;
cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode; cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
...@@ -815,23 +819,14 @@ static int __init cmd640x_init(void) ...@@ -815,23 +819,14 @@ static int __init cmd640x_init(void)
* Initialize data for secondary cmd640 port, if enabled * Initialize data for secondary cmd640 port, if enabled
*/ */
if (second_port_cmd640) { if (second_port_cmd640) {
cmd_hwif0->serialized = 1;
cmd_hwif1->serialized = 1;
cmd_hwif1->chipset = ide_cmd640;
cmd_hwif0->mate = cmd_hwif1;
cmd_hwif1->mate = cmd_hwif0;
cmd_hwif1->channel = 1;
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
cmd_hwif1->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
IDE_HFLAG_ABUSE_FAST_DEVSEL;
cmd_hwif1->pio_mask = ATA_PIO5;
cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode; cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
idx[1] = cmd_hwif1->index; idx[1] = cmd_hwif1->index;
} }
printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name, printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name,
cmd_hwif0->serialized ? "" : "not ", port2); second_port_cmd640 ? "" : "not ", port2);
/* /*
* Establish initial timings/prefetch for all drives. * Establish initial timings/prefetch for all drives.
...@@ -876,7 +871,7 @@ static int __init cmd640x_init(void) ...@@ -876,7 +871,7 @@ static int __init cmd640x_init(void)
cmd640_dump_regs(); cmd640_dump_regs();
#endif #endif
ide_device_add(idx); ide_device_add(idx, &cmd640_port_info);
return 1; return 1;
} }
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -393,6 +392,8 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) ...@@ -393,6 +392,8 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)
hwif->set_pio_mode = &cmd64x_set_pio_mode; hwif->set_pio_mode = &cmd64x_set_pio_mode;
hwif->set_dma_mode = &cmd64x_set_dma_mode; hwif->set_dma_mode = &cmd64x_set_dma_mode;
hwif->cable_detect = ata66_cmd64x;
if (!hwif->dma_base) if (!hwif->dma_base)
return; return;
...@@ -411,9 +412,6 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) ...@@ -411,9 +412,6 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)
if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5) if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5)
hwif->ultra_mask = 0x00; hwif->ultra_mask = 0x00;
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = ata66_cmd64x(hwif);
switch (dev->device) { switch (dev->device) {
case PCI_DEVICE_ID_CMD_648: case PCI_DEVICE_ID_CMD_648:
case PCI_DEVICE_ID_CMD_649: case PCI_DEVICE_ID_CMD_649:
......
...@@ -35,22 +35,12 @@ ...@@ -35,22 +35,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/io.h>
#include <asm/irq.h>
struct pio_clocks struct pio_clocks
{ {
int address; int address;
...@@ -180,7 +170,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic ...@@ -180,7 +170,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
ide_pci_setup_ports(dev, d, 14, &idx[0]); ide_pci_setup_ports(dev, d, 14, &idx[0]);
ide_device_add(idx); ide_device_add(idx, d);
return 0; return 0;
} }
......
...@@ -15,18 +15,12 @@ ...@@ -15,18 +15,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h>
/* /*
* Here are the standard PIO mode 0-4 timings for each "format". * Here are the standard PIO mode 0-4 timings for each "format".
......
...@@ -155,8 +155,9 @@ static void cs5535_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -155,8 +155,9 @@ static void cs5535_set_pio_mode(ide_drive_t *drive, const u8 pio)
cs5535_set_speed(drive, XFER_PIO_0 + pio); cs5535_set_speed(drive, XFER_PIO_0 + pio);
} }
static u8 __devinit cs5535_cable_detect(struct pci_dev *dev) static u8 __devinit cs5535_cable_detect(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev);
u8 bit; u8 bit;
/* if a 80 wire cable was detected */ /* if a 80 wire cable was detected */
...@@ -175,15 +176,10 @@ static u8 __devinit cs5535_cable_detect(struct pci_dev *dev) ...@@ -175,15 +176,10 @@ static u8 __devinit cs5535_cable_detect(struct pci_dev *dev)
*/ */
static void __devinit init_hwif_cs5535(ide_hwif_t *hwif) static void __devinit init_hwif_cs5535(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev);
hwif->set_pio_mode = &cs5535_set_pio_mode; hwif->set_pio_mode = &cs5535_set_pio_mode;
hwif->set_dma_mode = &cs5535_set_dma_mode; hwif->set_dma_mode = &cs5535_set_dma_mode;
if (hwif->dma_base == 0) hwif->cable_detect = cs5535_cable_detect;
return;
hwif->cbl = cs5535_cable_detect(dev);
} }
static const struct ide_port_info cs5535_chipset __devinitdata = { static const struct ide_port_info cs5535_chipset __devinitdata = {
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -16,15 +16,14 @@ ...@@ -16,15 +16,14 @@
* License. See the file COPYING in the main directory of this archive for * License. See the file COPYING in the main directory of this archive for
* more details. * more details.
*/ */
#include <linux/autoconf.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mm.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <asm/io.h> #include <asm/io.h>
/* /*
...@@ -52,6 +51,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) ...@@ -52,6 +51,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
ide_hwif_t *hwif = NULL; ide_hwif_t *hwif = NULL;
ide_drive_t *drive; ide_drive_t *drive;
int i, rc; int i, rc;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
rc = pci_enable_device(dev); rc = pci_enable_device(dev);
if (rc) { if (rc) {
...@@ -78,12 +78,27 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) ...@@ -78,12 +78,27 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
hw.irq = dev->irq; hw.irq = dev->irq;
hw.chipset = ide_pci; /* this enables IRQ sharing */ hw.chipset = ide_pci; /* this enables IRQ sharing */
rc = ide_register_hw(&hw, &ide_undecoded_slave, &hwif); hwif = ide_deprecated_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (rc < 0) { if (hwif == NULL)
printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc); goto out_disable;
pci_disable_device(dev);
return -ENODEV; i = hwif->index;
}
if (hwif->present)
ide_unregister(i, 0, 0);
else if (!hwif->hold)
ide_init_port_data(hwif, i);
ide_init_port_hw(hwif, &hw);
hwif->quirkproc = &ide_undecoded_slave;
idx[0] = i;
ide_device_add(idx, NULL);
if (!hwif->present)
goto out_disable;
pci_set_drvdata(dev, hwif); pci_set_drvdata(dev, hwif);
hwif->dev = &dev->dev; hwif->dev = &dev->dev;
drive = &hwif->drives[0]; drive = &hwif->drives[0];
...@@ -92,6 +107,11 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) ...@@ -92,6 +107,11 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
drive->unmask = 1; drive->unmask = 1;
} }
return 0; return 0;
out_disable:
printk(KERN_ERR "delkin_cb: no IDE devices found\n");
pci_disable_device(dev);
return -ENODEV;
} }
static void static void
...@@ -100,7 +120,8 @@ delkin_cb_remove (struct pci_dev *dev) ...@@ -100,7 +120,8 @@ delkin_cb_remove (struct pci_dev *dev)
ide_hwif_t *hwif = pci_get_drvdata(dev); ide_hwif_t *hwif = pci_get_drvdata(dev);
if (hwif) if (hwif)
ide_unregister(hwif->index); ide_unregister(hwif->index, 0, 0);
pci_disable_device(dev); pci_disable_device(dev);
} }
......
...@@ -22,18 +22,11 @@ ...@@ -22,18 +22,11 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/io.h>
static int ide_generic_all; /* Set to claim all devices */ static int ide_generic_all; /* Set to claim all devices */
/* /*
......
...@@ -26,20 +26,13 @@ ...@@ -26,20 +26,13 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <asm/io.h>
#include <asm/irq.h>
#define HPT343_DEBUG_DRIVE_INFO 0 #define HPT343_DEBUG_DRIVE_INFO 0
static void hpt34x_set_mode(ide_drive_t *drive, const u8 speed) static void hpt34x_set_mode(ide_drive_t *drive, const u8 speed)
......
...@@ -121,12 +121,8 @@ ...@@ -121,12 +121,8 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -134,7 +130,6 @@ ...@@ -134,7 +130,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h>
/* various tuning parameters */ /* various tuning parameters */
#define HPT_RESET_STATE_ENGINE #define HPT_RESET_STATE_ENGINE
...@@ -1279,12 +1274,55 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha ...@@ -1279,12 +1274,55 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha
return dev->irq; return dev->irq;
} }
static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif)
{
struct pci_dev *dev = to_pci_dev(hwif->dev);
struct hpt_info *info = pci_get_drvdata(dev);
u8 chip_type = info->chip_type;
u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02;
/*
* The HPT37x uses the CBLID pins as outputs for MA15/MA16
* address lines to access an external EEPROM. To read valid
* cable detect state the pins must be enabled as inputs.
*/
if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
/*
* HPT374 PCI function 1
* - set bit 15 of reg 0x52 to enable TCBLID as input
* - set bit 15 of reg 0x56 to enable FCBLID as input
*/
u8 mcr_addr = hwif->select_data + 2;
u16 mcr;
pci_read_config_word(dev, mcr_addr, &mcr);
pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
/* now read cable id register */
pci_read_config_byte(dev, 0x5a, &scr1);
pci_write_config_word(dev, mcr_addr, mcr);
} else if (chip_type >= HPT370) {
/*
* HPT370/372 and 374 pcifn 0
* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
*/
u8 scr2 = 0;
pci_read_config_byte(dev, 0x5b, &scr2);
pci_write_config_byte(dev, 0x5b, (scr2 & ~1));
/* now read cable id register */
pci_read_config_byte(dev, 0x5a, &scr1);
pci_write_config_byte(dev, 0x5b, scr2);
} else
pci_read_config_byte(dev, 0x5a, &scr1);
return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
}
static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev); struct pci_dev *dev = to_pci_dev(hwif->dev);
struct hpt_info *info = pci_get_drvdata(dev); struct hpt_info *info = pci_get_drvdata(dev);
int serialize = HPT_SERIALIZE_IO; int serialize = HPT_SERIALIZE_IO;
u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02;
u8 chip_type = info->chip_type; u8 chip_type = info->chip_type;
u8 new_mcr, old_mcr = 0; u8 new_mcr, old_mcr = 0;
...@@ -1301,6 +1339,8 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) ...@@ -1301,6 +1339,8 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
hwif->udma_filter = &hpt3xx_udma_filter; hwif->udma_filter = &hpt3xx_udma_filter;
hwif->mdma_filter = &hpt3xx_mdma_filter; hwif->mdma_filter = &hpt3xx_mdma_filter;
hwif->cable_detect = hpt3xx_cable_detect;
/* /*
* HPT3xxN chips have some complications: * HPT3xxN chips have some complications:
* *
...@@ -1346,43 +1386,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) ...@@ -1346,43 +1386,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
if (hwif->dma_base == 0) if (hwif->dma_base == 0)
return; return;
/*
* The HPT37x uses the CBLID pins as outputs for MA15/MA16
* address lines to access an external EEPROM. To read valid
* cable detect state the pins must be enabled as inputs.
*/
if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
/*
* HPT374 PCI function 1
* - set bit 15 of reg 0x52 to enable TCBLID as input
* - set bit 15 of reg 0x56 to enable FCBLID as input
*/
u8 mcr_addr = hwif->select_data + 2;
u16 mcr;
pci_read_config_word (dev, mcr_addr, &mcr);
pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
/* now read cable id register */
pci_read_config_byte (dev, 0x5a, &scr1);
pci_write_config_word(dev, mcr_addr, mcr);
} else if (chip_type >= HPT370) {
/*
* HPT370/372 and 374 pcifn 0
* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
*/
u8 scr2 = 0;
pci_read_config_byte (dev, 0x5b, &scr2);
pci_write_config_byte(dev, 0x5b, (scr2 & ~1));
/* now read cable id register */
pci_read_config_byte (dev, 0x5a, &scr1);
pci_write_config_byte(dev, 0x5b, scr2);
} else
pci_read_config_byte (dev, 0x5a, &scr1);
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
if (chip_type >= HPT374) { if (chip_type >= HPT374) {
hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq; hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq;
hwif->ide_dma_end = &hpt374_ide_dma_end; hwif->ide_dma_end = &hpt374_ide_dma_end;
......
...@@ -10,13 +10,10 @@ ...@@ -10,13 +10,10 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/io.h>
/** /**
* it8213_set_pio_mode - set host controller for PIO mode * it8213_set_pio_mode - set host controller for PIO mode
* @drive: drive * @drive: drive
...@@ -143,6 +140,16 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -143,6 +140,16 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed)
} }
} }
static u8 __devinit it8213_cable_detect(ide_hwif_t *hwif)
{
struct pci_dev *dev = to_pci_dev(hwif->dev);
u8 reg42h = 0;
pci_read_config_byte(dev, 0x42, &reg42h);
return (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
}
/** /**
* init_hwif_it8213 - set up hwif structs * init_hwif_it8213 - set up hwif structs
* @hwif: interface to set up * @hwif: interface to set up
...@@ -152,19 +159,10 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -152,19 +159,10 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed)
static void __devinit init_hwif_it8213(ide_hwif_t *hwif) static void __devinit init_hwif_it8213(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev);
u8 reg42h = 0;
hwif->set_dma_mode = &it8213_set_dma_mode; hwif->set_dma_mode = &it8213_set_dma_mode;
hwif->set_pio_mode = &it8213_set_pio_mode; hwif->set_pio_mode = &it8213_set_pio_mode;
if (!hwif->dma_base) hwif->cable_detect = it8213_cable_detect;
return;
pci_read_config_byte(dev, 0x42, &reg42h);
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
} }
......
...@@ -63,13 +63,10 @@ ...@@ -63,13 +63,10 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/io.h>
struct it821x_dev struct it821x_dev
{ {
unsigned int smart:1, /* Are we in smart raid mode */ unsigned int smart:1, /* Are we in smart raid mode */
...@@ -579,14 +576,13 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif) ...@@ -579,14 +576,13 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
} else } else
hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; hwif->host_flags |= IDE_HFLAG_NO_SET_MODE;
hwif->cable_detect = ata66_it821x;
if (hwif->dma_base == 0) if (hwif->dma_base == 0)
return; return;
hwif->ultra_mask = ATA_UDMA6; hwif->ultra_mask = ATA_UDMA6;
hwif->mwdma_mask = ATA_MWDMA2; hwif->mwdma_mask = ATA_MWDMA2;
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = ata66_it821x(hwif);
} }
static void __devinit it8212_disable_raid(struct pci_dev *dev) static void __devinit it8212_disable_raid(struct pci_dev *dev)
......
...@@ -8,13 +8,10 @@ ...@@ -8,13 +8,10 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/io.h>
typedef enum { typedef enum {
PORT_PATA0 = 0, PORT_PATA0 = 0,
PORT_PATA1 = 1, PORT_PATA1 = 1,
...@@ -111,11 +108,7 @@ static void __devinit init_hwif_jmicron(ide_hwif_t *hwif) ...@@ -111,11 +108,7 @@ static void __devinit init_hwif_jmicron(ide_hwif_t *hwif)
hwif->set_pio_mode = &jmicron_set_pio_mode; hwif->set_pio_mode = &jmicron_set_pio_mode;
hwif->set_dma_mode = &jmicron_set_dma_mode; hwif->set_dma_mode = &jmicron_set_dma_mode;
if (hwif->dma_base == 0) hwif->cable_detect = ata66_jmicron;
return;
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = ata66_jmicron(hwif);
} }
static const struct ide_port_info jmicron_chipset __devinitdata = { static const struct ide_port_info jmicron_chipset __devinitdata = {
......
...@@ -10,11 +10,7 @@ ...@@ -10,11 +10,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -87,11 +87,6 @@ ...@@ -87,11 +87,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/ide.h> #include <linux/ide.h>
...@@ -320,14 +315,18 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -320,14 +315,18 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio)
spin_unlock_irqrestore(&opti621_lock, flags); spin_unlock_irqrestore(&opti621_lock, flags);
} }
static void __devinit opti621_port_init_devs(ide_hwif_t *hwif)
{
hwif->drives[0].drive_data = PIO_DONT_KNOW;
hwif->drives[1].drive_data = PIO_DONT_KNOW;
}
/* /*
* init_hwif_opti621() is called once for each hwif found at boot. * init_hwif_opti621() is called once for each hwif found at boot.
*/ */
static void __devinit init_hwif_opti621 (ide_hwif_t *hwif) static void __devinit init_hwif_opti621 (ide_hwif_t *hwif)
{ {
hwif->drives[0].drive_data = PIO_DONT_KNOW; hwif->port_init_devs = opti621_port_init_devs;
hwif->drives[1].drive_data = PIO_DONT_KNOW;
hwif->set_pio_mode = &opti621_set_pio_mode; hwif->set_pio_mode = &opti621_set_pio_mode;
} }
......
...@@ -19,18 +19,12 @@ ...@@ -19,18 +19,12 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h>
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
#include <asm/prom.h> #include <asm/prom.h>
...@@ -197,7 +191,7 @@ static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -197,7 +191,7 @@ static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio)
} }
} }
static u8 pdcnew_cable_detect(ide_hwif_t *hwif) static u8 __devinit pdcnew_cable_detect(ide_hwif_t *hwif)
{ {
if (get_indexed_reg(hwif, 0x0b) & 0x04) if (get_indexed_reg(hwif, 0x0b) & 0x04)
return ATA_CBL_PATA40; return ATA_CBL_PATA40;
...@@ -456,11 +450,7 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) ...@@ -456,11 +450,7 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
hwif->quirkproc = &pdcnew_quirkproc; hwif->quirkproc = &pdcnew_quirkproc;
hwif->resetproc = &pdcnew_reset; hwif->resetproc = &pdcnew_reset;
if (hwif->dma_base == 0) hwif->cable_detect = pdcnew_cable_detect;
return;
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = pdcnew_cable_detect(hwif);
} }
static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev) static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev)
......
...@@ -32,18 +32,13 @@ ...@@ -32,18 +32,13 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h>
#define PDC202XX_DEBUG_DRIVE_INFO 0 #define PDC202XX_DEBUG_DRIVE_INFO 0
...@@ -140,10 +135,10 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio) ...@@ -140,10 +135,10 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
pdc202xx_set_mode(drive, XFER_PIO_0 + pio); pdc202xx_set_mode(drive, XFER_PIO_0 + pio);
} }
static u8 pdc202xx_old_cable_detect (ide_hwif_t *hwif) static u8 __devinit pdc2026x_old_cable_detect(ide_hwif_t *hwif)
{ {
struct pci_dev *dev = to_pci_dev(hwif->dev); struct pci_dev *dev = to_pci_dev(hwif->dev);
u16 CIS = 0, mask = (hwif->channel) ? (1<<11) : (1<<10); u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10);
pci_read_config_word(dev, 0x50, &CIS); pci_read_config_word(dev, 0x50, &CIS);
...@@ -311,9 +306,12 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) ...@@ -311,9 +306,12 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
hwif->quirkproc = &pdc202xx_quirkproc; hwif->quirkproc = &pdc202xx_quirkproc;
if (dev->device != PCI_DEVICE_ID_PROMISE_20246) if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
hwif->resetproc = &pdc202xx_reset; hwif->resetproc = &pdc202xx_reset;
hwif->cable_detect = pdc2026x_old_cable_detect;
}
if (hwif->dma_base == 0) if (hwif->dma_base == 0)
return; return;
...@@ -321,9 +319,6 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) ...@@ -321,9 +319,6 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
hwif->dma_timeout = &pdc202xx_dma_timeout; hwif->dma_timeout = &pdc202xx_dma_timeout;
if (dev->device != PCI_DEVICE_ID_PROMISE_20246) { if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
if (hwif->cbl != ATA_CBL_PATA40_SHORT)
hwif->cbl = pdc202xx_old_cable_detect(hwif);
hwif->dma_start = &pdc202xx_old_ide_dma_start; hwif->dma_start = &pdc202xx_old_ide_dma_start;
hwif->ide_dma_end = &pdc202xx_old_ide_dma_end; hwif->ide_dma_end = &pdc202xx_old_ide_dma_end;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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