You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6: (50 commits)
ide: remove inclusion of non-existent io_trace.h
ide-disk: add get_smart_data() helper
ide: fix ->data_phase in taskfile_load_raw()
ide: check drive->using_dma in flagged_taskfile()
ide: check ->dma_setup() return value in flagged_taskfile()
dtc2278: note on docs
qd65xx: remove pointless qd_{read,write}_reg() (take 2)
ide: PCI BMDMA initialization fixes (take 2)
ide: remove stale comments from ide-taskfile.c
ide: remove dead code from ide_driveid_update()
ide: use __ide_end_request() in ide_end_dequeued_request()
ide: enhance ide_setup_pci_noise()
cs5530: remove needless ide_lock taking
ide: take ide_lock for prefetch disable/enable in do_special()
ht6560b: fix deadlock on error handling
cmd640: fix deadlock on error handling
slc90e66: fix deadlock on error handling
opti621: fix deadlock on error handling
qd65xx: fix deadlock on error handling
dtc2278: fix deadlock on error handling
...
This commit is contained in:
@@ -1056,6 +1056,9 @@ endif
|
||||
config BLK_DEV_IDEDMA
|
||||
def_bool BLK_DEV_IDEDMA_PCI || BLK_DEV_IDEDMA_PMAC || BLK_DEV_IDEDMA_ICS || BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||
|
||||
config IDE_ARCH_OBSOLETE_INIT
|
||||
def_bool ALPHA || (ARM && !ARCH_L7200) || BLACKFIN || X86 || IA64 || M32R || MIPS || PARISC || PPC || (SUPERH64 && BLK_DEV_IDEPCI) || SPARC
|
||||
|
||||
endif
|
||||
|
||||
config BLK_DEV_HD_ONLY
|
||||
|
||||
@@ -45,7 +45,7 @@ bastide_register(unsigned int base, unsigned int aux, int irq,
|
||||
hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
|
||||
hw.irq = irq;
|
||||
|
||||
ide_register_hw(&hw, 0, hwif);
|
||||
ide_register_hw(&hw, NULL, 0, hwif);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+18
-44
@@ -316,27 +316,29 @@ static int icside_dma_end(ide_drive_t *drive)
|
||||
|
||||
drive->waiting_for_dma = 0;
|
||||
|
||||
disable_dma(hwif->hw.dma);
|
||||
disable_dma(state->dev->dma);
|
||||
|
||||
/* Teardown mappings after DMA has completed. */
|
||||
dma_unmap_sg(state->dev, hwif->sg_table, hwif->sg_nents,
|
||||
hwif->sg_dma_direction);
|
||||
|
||||
return get_dma_residue(hwif->hw.dma) != 0;
|
||||
return get_dma_residue(state->dev->dma) != 0;
|
||||
}
|
||||
|
||||
static void icside_dma_start(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
struct icside_state *state = hwif->hwif_data;
|
||||
|
||||
/* We can not enable DMA on both channels simultaneously. */
|
||||
BUG_ON(dma_channel_active(hwif->hw.dma));
|
||||
enable_dma(hwif->hw.dma);
|
||||
BUG_ON(dma_channel_active(state->dev->dma));
|
||||
enable_dma(state->dev->dma);
|
||||
}
|
||||
|
||||
static int icside_dma_setup(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
struct icside_state *state = hwif->hwif_data;
|
||||
struct request *rq = hwif->hwgroup->rq;
|
||||
unsigned int dma_mode;
|
||||
|
||||
@@ -348,7 +350,7 @@ static int icside_dma_setup(ide_drive_t *drive)
|
||||
/*
|
||||
* We can not enable DMA on both channels.
|
||||
*/
|
||||
BUG_ON(dma_channel_active(hwif->hw.dma));
|
||||
BUG_ON(dma_channel_active(state->dev->dma));
|
||||
|
||||
icside_build_sglist(drive, rq);
|
||||
|
||||
@@ -365,14 +367,14 @@ static int icside_dma_setup(ide_drive_t *drive)
|
||||
/*
|
||||
* Select the correct timing for this drive.
|
||||
*/
|
||||
set_dma_speed(hwif->hw.dma, drive->drive_data);
|
||||
set_dma_speed(state->dev->dma, drive->drive_data);
|
||||
|
||||
/*
|
||||
* Tell the DMA engine about the SG table and
|
||||
* data direction.
|
||||
*/
|
||||
set_dma_sg(hwif->hw.dma, hwif->sg_table, hwif->sg_nents);
|
||||
set_dma_mode(hwif->hw.dma, dma_mode);
|
||||
set_dma_sg(state->dev->dma, hwif->sg_table, hwif->sg_nents);
|
||||
set_dma_mode(state->dev->dma, dma_mode);
|
||||
|
||||
drive->waiting_for_dma = 1;
|
||||
|
||||
@@ -438,40 +440,16 @@ static void icside_dma_init(ide_hwif_t *hwif)
|
||||
#define icside_dma_init(hwif) (0)
|
||||
#endif
|
||||
|
||||
static ide_hwif_t *icside_find_hwif(unsigned long dataport)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
int index;
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = &ide_hwifs[index];
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == dataport)
|
||||
goto found;
|
||||
}
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = &ide_hwifs[index];
|
||||
if (!hwif->io_ports[IDE_DATA_OFFSET])
|
||||
goto found;
|
||||
}
|
||||
|
||||
hwif = NULL;
|
||||
found:
|
||||
return hwif;
|
||||
}
|
||||
|
||||
static ide_hwif_t *
|
||||
icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *ec)
|
||||
{
|
||||
unsigned long port = (unsigned long)base + info->dataoffset;
|
||||
ide_hwif_t *hwif;
|
||||
|
||||
hwif = icside_find_hwif(port);
|
||||
hwif = ide_find_port(port);
|
||||
if (hwif) {
|
||||
int i;
|
||||
|
||||
memset(&hwif->hw, 0, sizeof(hw_regs_t));
|
||||
|
||||
/*
|
||||
* Ensure we're using MMIO
|
||||
*/
|
||||
@@ -479,13 +457,10 @@ icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *e
|
||||
hwif->mmio = 1;
|
||||
|
||||
for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
|
||||
hwif->hw.io_ports[i] = port;
|
||||
hwif->io_ports[i] = port;
|
||||
port += 1 << info->stepping;
|
||||
}
|
||||
hwif->hw.io_ports[IDE_CONTROL_OFFSET] = (unsigned long)base + info->ctrloffset;
|
||||
hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)base + info->ctrloffset;
|
||||
hwif->hw.irq = ec->irq;
|
||||
hwif->irq = ec->irq;
|
||||
hwif->noprobe = 0;
|
||||
hwif->chipset = ide_acorn;
|
||||
@@ -500,6 +475,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
void __iomem *base;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
|
||||
if (!base)
|
||||
@@ -523,9 +499,9 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
|
||||
|
||||
state->hwif[0] = hwif;
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
ide_device_add(idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -537,6 +513,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
||||
void __iomem *ioc_base, *easi_base;
|
||||
unsigned int sel = 0;
|
||||
int ret;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
|
||||
if (!ioc_base) {
|
||||
@@ -592,7 +569,6 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
||||
hwif->serialized = 1;
|
||||
hwif->config_data = (unsigned long)ioc_base;
|
||||
hwif->select_data = sel;
|
||||
hwif->hw.dma = ec->dma;
|
||||
|
||||
mate->maskproc = icside_maskproc;
|
||||
mate->channel = 1;
|
||||
@@ -601,18 +577,16 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
||||
mate->serialized = 1;
|
||||
mate->config_data = (unsigned long)ioc_base;
|
||||
mate->select_data = sel | 1;
|
||||
mate->hw.dma = ec->dma;
|
||||
|
||||
if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
|
||||
icside_dma_init(hwif);
|
||||
icside_dma_init(mate);
|
||||
}
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
probe_hwif_init(mate);
|
||||
idx[0] = hwif->index;
|
||||
idx[1] = mate->index;
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
ide_proc_register_port(mate);
|
||||
ide_device_add(idx);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -31,5 +31,5 @@ void __init ide_arm_init(void)
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
|
||||
hw.irq = IDE_ARM_IRQ;
|
||||
ide_register_hw(&hw, 1, NULL);
|
||||
ide_register_hw(&hw, NULL, 1, NULL);
|
||||
}
|
||||
|
||||
+12
-25
@@ -13,42 +13,25 @@
|
||||
|
||||
#include <asm/ecard.h>
|
||||
|
||||
/*
|
||||
* Something like this really should be in generic code, but isn't.
|
||||
*/
|
||||
static ide_hwif_t *
|
||||
rapide_locate_hwif(void __iomem *base, void __iomem *ctrl, unsigned int sz, int irq)
|
||||
{
|
||||
unsigned long port = (unsigned long)base;
|
||||
ide_hwif_t *hwif;
|
||||
int index, i;
|
||||
ide_hwif_t *hwif = ide_find_port(port);
|
||||
int i;
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = ide_hwifs + index;
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == port)
|
||||
goto found;
|
||||
}
|
||||
if (hwif == NULL)
|
||||
goto out;
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = ide_hwifs + index;
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == 0)
|
||||
goto found;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
found:
|
||||
for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
|
||||
hwif->hw.io_ports[i] = port;
|
||||
hwif->io_ports[i] = port;
|
||||
port += sz;
|
||||
}
|
||||
hwif->hw.io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
|
||||
hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
|
||||
hwif->hw.irq = hwif->irq = irq;
|
||||
hwif->irq = irq;
|
||||
hwif->mmio = 1;
|
||||
default_hwif_mmiops(hwif);
|
||||
|
||||
out:
|
||||
return hwif;
|
||||
}
|
||||
|
||||
@@ -58,6 +41,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
|
||||
ide_hwif_t *hwif;
|
||||
void __iomem *base;
|
||||
int ret;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
ret = ecard_request_resources(ec);
|
||||
if (ret)
|
||||
@@ -74,8 +58,11 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
|
||||
hwif->hwif_data = base;
|
||||
hwif->gendev.parent = &ec->dev;
|
||||
hwif->noprobe = 0;
|
||||
probe_hwif_init(hwif);
|
||||
ide_proc_register_port(hwif);
|
||||
|
||||
idx[0] = hwif->index;
|
||||
|
||||
ide_device_add(idx);
|
||||
|
||||
ecard_set_drvdata(ec, hwif);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -782,7 +782,7 @@ init_e100_ide (void)
|
||||
ide_offsets,
|
||||
0, 0, cris_ide_ack_intr,
|
||||
ide_default_irq(0));
|
||||
ide_register_hw(&hw, 1, &hwif);
|
||||
ide_register_hw(&hw, NULL, 1, &hwif);
|
||||
hwif->mmio = 1;
|
||||
hwif->chipset = ide_etrax100;
|
||||
hwif->set_pio_mode = &cris_set_pio_mode;
|
||||
|
||||
@@ -68,7 +68,6 @@ static inline void hw_setup(hw_regs_t *hw)
|
||||
hw->io_ports[i] = CONFIG_H8300_IDE_BASE + H8300_IDE_GAP*i;
|
||||
hw->io_ports[IDE_CONTROL_OFFSET] = CONFIG_H8300_IDE_ALT;
|
||||
hw->irq = EXT_IRQ0 + CONFIG_H8300_IDE_IRQ;
|
||||
hw->dma = NO_DMA;
|
||||
hw->chipset = ide_generic;
|
||||
}
|
||||
|
||||
@@ -101,7 +100,7 @@ void __init h8300_ide_init(void)
|
||||
hw_setup(&hw);
|
||||
|
||||
/* register if */
|
||||
idx = ide_register_hw(&hw, 1, &hwif);
|
||||
idx = ide_register_hw(&hw, NULL, 1, &hwif);
|
||||
if (idx == -1) {
|
||||
printk(KERN_ERR "ide-h8300: IDE I/F register failed\n");
|
||||
return;
|
||||
|
||||
@@ -350,7 +350,7 @@ static int taskfile_load_raw(ide_drive_t *drive,
|
||||
|
||||
memset(&args, 0, sizeof(ide_task_t));
|
||||
args.command_type = IDE_DRIVE_TASK_NO_DATA;
|
||||
args.data_phase = TASKFILE_IN;
|
||||
args.data_phase = TASKFILE_NO_DATA;
|
||||
args.handler = &task_no_data_intr;
|
||||
|
||||
/* convert gtf to IDE Taskfile */
|
||||
|
||||
+4
-20
@@ -593,28 +593,12 @@ static int smart_enable(ide_drive_t *drive)
|
||||
return ide_raw_taskfile(drive, &args, NULL);
|
||||
}
|
||||
|
||||
static int get_smart_values(ide_drive_t *drive, u8 *buf)
|
||||
static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd)
|
||||
{
|
||||
ide_task_t args;
|
||||
|
||||
memset(&args, 0, sizeof(ide_task_t));
|
||||
args.tfRegister[IDE_FEATURE_OFFSET] = SMART_READ_VALUES;
|
||||
args.tfRegister[IDE_NSECTOR_OFFSET] = 0x01;
|
||||
args.tfRegister[IDE_LCYL_OFFSET] = SMART_LCYL_PASS;
|
||||
args.tfRegister[IDE_HCYL_OFFSET] = SMART_HCYL_PASS;
|
||||
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SMART;
|
||||
args.command_type = IDE_DRIVE_TASK_IN;
|
||||
args.data_phase = TASKFILE_IN;
|
||||
args.handler = &task_in_intr;
|
||||
(void) smart_enable(drive);
|
||||
return ide_raw_taskfile(drive, &args, buf);
|
||||
}
|
||||
|
||||
static int get_smart_thresholds(ide_drive_t *drive, u8 *buf)
|
||||
{
|
||||
ide_task_t args;
|
||||
memset(&args, 0, sizeof(ide_task_t));
|
||||
args.tfRegister[IDE_FEATURE_OFFSET] = SMART_READ_THRESHOLDS;
|
||||
args.tfRegister[IDE_FEATURE_OFFSET] = sub_cmd;
|
||||
args.tfRegister[IDE_NSECTOR_OFFSET] = 0x01;
|
||||
args.tfRegister[IDE_LCYL_OFFSET] = SMART_LCYL_PASS;
|
||||
args.tfRegister[IDE_HCYL_OFFSET] = SMART_HCYL_PASS;
|
||||
@@ -656,7 +640,7 @@ static int proc_idedisk_read_smart_thresholds
|
||||
ide_drive_t *drive = (ide_drive_t *)data;
|
||||
int len = 0, i = 0;
|
||||
|
||||
if (!get_smart_thresholds(drive, page)) {
|
||||
if (get_smart_data(drive, page, SMART_READ_THRESHOLDS) == 0) {
|
||||
unsigned short *val = (unsigned short *) page;
|
||||
char *out = ((char *)val) + (SECTOR_WORDS * 4);
|
||||
page = out;
|
||||
@@ -675,7 +659,7 @@ static int proc_idedisk_read_smart_values
|
||||
ide_drive_t *drive = (ide_drive_t *)data;
|
||||
int len = 0, i = 0;
|
||||
|
||||
if (!get_smart_values(drive, page)) {
|
||||
if (get_smart_data(drive, page, SMART_READ_VALUES) == 0) {
|
||||
unsigned short *val = (unsigned short *) page;
|
||||
char *out = ((char *)val) + (SECTOR_WORDS * 4);
|
||||
page = out;
|
||||
|
||||
+10
-22
@@ -901,10 +901,7 @@ void ide_dma_timeout (ide_drive_t *drive)
|
||||
|
||||
EXPORT_SYMBOL(ide_dma_timeout);
|
||||
|
||||
/*
|
||||
* Needed for allowing full modular support of ide-driver
|
||||
*/
|
||||
static int ide_release_dma_engine(ide_hwif_t *hwif)
|
||||
static void ide_release_dma_engine(ide_hwif_t *hwif)
|
||||
{
|
||||
if (hwif->dmatable_cpu) {
|
||||
pci_free_consistent(hwif->pci_dev,
|
||||
@@ -913,7 +910,6 @@ static int ide_release_dma_engine(ide_hwif_t *hwif)
|
||||
hwif->dmatable_dma);
|
||||
hwif->dmatable_cpu = NULL;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ide_release_iomio_dma(ide_hwif_t *hwif)
|
||||
@@ -956,12 +952,6 @@ static int ide_mapped_mmio_dma(ide_hwif_t *hwif, unsigned long base, unsigned in
|
||||
{
|
||||
printk(KERN_INFO " %s: MMIO-DMA ", hwif->name);
|
||||
|
||||
hwif->dma_base = base;
|
||||
|
||||
if(hwif->mate)
|
||||
hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
|
||||
else
|
||||
hwif->dma_master = base;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -975,8 +965,6 @@ static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base, unsigned int port
|
||||
return 1;
|
||||
}
|
||||
|
||||
hwif->dma_base = base;
|
||||
|
||||
if (hwif->cds->extra) {
|
||||
hwif->extra_base = base + (hwif->channel ? 8 : 16);
|
||||
|
||||
@@ -991,10 +979,6 @@ static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base, unsigned int port
|
||||
}
|
||||
}
|
||||
|
||||
if(hwif->mate)
|
||||
hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base:base;
|
||||
else
|
||||
hwif->dma_master = base;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1006,12 +990,9 @@ static int ide_dma_iobase(ide_hwif_t *hwif, unsigned long base, unsigned int por
|
||||
return ide_iomio_dma(hwif, base, ports);
|
||||
}
|
||||
|
||||
/*
|
||||
* This can be called for a dynamically installed interface. Don't __init it
|
||||
*/
|
||||
void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_ports)
|
||||
void ide_setup_dma(ide_hwif_t *hwif, unsigned long base, unsigned num_ports)
|
||||
{
|
||||
if (ide_dma_iobase(hwif, dma_base, num_ports))
|
||||
if (ide_dma_iobase(hwif, base, num_ports))
|
||||
return;
|
||||
|
||||
if (ide_allocate_dma_engine(hwif)) {
|
||||
@@ -1019,6 +1000,13 @@ void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_p
|
||||
return;
|
||||
}
|
||||
|
||||
hwif->dma_base = base;
|
||||
|
||||
if (hwif->mate)
|
||||
hwif->dma_master = hwif->channel ? hwif->mate->dma_base : base;
|
||||
else
|
||||
hwif->dma_master = base;
|
||||
|
||||
if (!(hwif->dma_command))
|
||||
hwif->dma_command = hwif->dma_base;
|
||||
if (!(hwif->dma_vendor1))
|
||||
|
||||
+24
-35
@@ -55,7 +55,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
static int __ide_end_request(ide_drive_t *drive, struct request *rq,
|
||||
int uptodate, unsigned int nr_bytes)
|
||||
int uptodate, unsigned int nr_bytes, int dequeue)
|
||||
{
|
||||
int ret = 1;
|
||||
|
||||
@@ -80,9 +80,11 @@ static int __ide_end_request(ide_drive_t *drive, struct request *rq,
|
||||
|
||||
if (!end_that_request_chunk(rq, uptodate, nr_bytes)) {
|
||||
add_disk_randomness(rq->rq_disk);
|
||||
if (!list_empty(&rq->queuelist))
|
||||
blkdev_dequeue_request(rq);
|
||||
HWGROUP(drive)->rq = NULL;
|
||||
if (dequeue) {
|
||||
if (!list_empty(&rq->queuelist))
|
||||
blkdev_dequeue_request(rq);
|
||||
HWGROUP(drive)->rq = NULL;
|
||||
}
|
||||
end_that_request_last(rq, uptodate);
|
||||
ret = 0;
|
||||
}
|
||||
@@ -122,7 +124,7 @@ int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors)
|
||||
nr_bytes = rq->hard_cur_sectors << 9;
|
||||
}
|
||||
|
||||
ret = __ide_end_request(drive, rq, uptodate, nr_bytes);
|
||||
ret = __ide_end_request(drive, rq, uptodate, nr_bytes, 1);
|
||||
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
return ret;
|
||||
@@ -255,39 +257,13 @@ int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq,
|
||||
int uptodate, int nr_sectors)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret = 1;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
|
||||
BUG_ON(!blk_rq_started(rq));
|
||||
|
||||
/*
|
||||
* if failfast is set on a request, override number of sectors and
|
||||
* complete the whole request right now
|
||||
*/
|
||||
if (blk_noretry_request(rq) && end_io_error(uptodate))
|
||||
nr_sectors = rq->hard_nr_sectors;
|
||||
|
||||
if (!blk_fs_request(rq) && end_io_error(uptodate) && !rq->errors)
|
||||
rq->errors = -EIO;
|
||||
|
||||
/*
|
||||
* decide whether to reenable DMA -- 3 is a random magic for now,
|
||||
* if we DMA timeout more than 3 times, just stay in PIO
|
||||
*/
|
||||
if (drive->state == DMA_PIO_RETRY && drive->retry_pio <= 3) {
|
||||
drive->state = 0;
|
||||
HWGROUP(drive)->hwif->ide_dma_on(drive);
|
||||
}
|
||||
|
||||
if (!end_that_request_first(rq, uptodate, nr_sectors)) {
|
||||
add_disk_randomness(rq->rq_disk);
|
||||
if (blk_rq_tagged(rq))
|
||||
blk_queue_end_tag(drive->queue, rq);
|
||||
end_that_request_last(rq, uptodate);
|
||||
ret = 0;
|
||||
}
|
||||
ret = __ide_end_request(drive, rq, uptodate, nr_sectors << 9, 0);
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_end_dequeued_request);
|
||||
@@ -800,7 +776,20 @@ static ide_startstop_t do_special (ide_drive_t *drive)
|
||||
s->b.set_tune = 0;
|
||||
|
||||
if (set_pio_mode_abuse(drive->hwif, req_pio)) {
|
||||
if (hwif->set_pio_mode)
|
||||
|
||||
if (hwif->set_pio_mode == NULL)
|
||||
return ide_stopped;
|
||||
|
||||
/*
|
||||
* take ide_lock for drive->[no_]unmask/[no_]io_32bit
|
||||
*/
|
||||
if (req_pio == 8 || req_pio == 9) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
hwif->set_pio_mode(drive, req_pio);
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
} else
|
||||
hwif->set_pio_mode(drive, req_pio);
|
||||
} else {
|
||||
int keep_dma = drive->using_dma;
|
||||
|
||||
+3
-23
@@ -693,35 +693,16 @@ static u8 ide_auto_reduce_xfer (ide_drive_t *drive)
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_IDEDMA */
|
||||
|
||||
/*
|
||||
* Update the
|
||||
*/
|
||||
int ide_driveid_update (ide_drive_t *drive)
|
||||
int ide_driveid_update(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
struct hd_driveid *id;
|
||||
#if 0
|
||||
id = kmalloc(SECTOR_WORDS*4, GFP_ATOMIC);
|
||||
if (!id)
|
||||
return 0;
|
||||
unsigned long timeout, flags;
|
||||
|
||||
taskfile_lib_get_identify(drive, (char *)&id);
|
||||
|
||||
ide_fix_driveid(id);
|
||||
if (id) {
|
||||
drive->id->dma_ultra = id->dma_ultra;
|
||||
drive->id->dma_mword = id->dma_mword;
|
||||
drive->id->dma_1word = id->dma_1word;
|
||||
/* anything more ? */
|
||||
kfree(id);
|
||||
}
|
||||
return 1;
|
||||
#else
|
||||
/*
|
||||
* Re-read drive->id for possible DMA mode
|
||||
* change (copied from ide-probe.c)
|
||||
*/
|
||||
unsigned long timeout, flags;
|
||||
|
||||
SELECT_MASK(drive, 1);
|
||||
if (IDE_CONTROL_REG)
|
||||
@@ -763,7 +744,6 @@ int ide_driveid_update (ide_drive_t *drive)
|
||||
}
|
||||
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
|
||||
|
||||
@@ -40,9 +40,8 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
|
||||
ide_std_init_ports(&hw, pnp_port_start(dev, 0),
|
||||
pnp_port_start(dev, 1));
|
||||
hw.irq = pnp_irq(dev, 0);
|
||||
hw.dma = NO_DMA;
|
||||
|
||||
index = ide_register_hw(&hw, 1, &hwif);
|
||||
index = ide_register_hw(&hw, NULL, 1, &hwif);
|
||||
|
||||
if (index != -1) {
|
||||
printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
|
||||
|
||||
+47
-40
@@ -717,7 +717,7 @@ EXPORT_SYMBOL_GPL(ide_undecoded_slave);
|
||||
* This routine only knows how to look for drive units 0 and 1
|
||||
* on an interface, so any setting of MAX_DRIVES > 2 won't work here.
|
||||
*/
|
||||
static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
|
||||
static void probe_hwif(ide_hwif_t *hwif)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int irqd;
|
||||
@@ -819,8 +819,8 @@ static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
|
||||
return;
|
||||
}
|
||||
|
||||
if (fixup)
|
||||
fixup(hwif);
|
||||
if (hwif->fixup)
|
||||
hwif->fixup(hwif);
|
||||
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit) {
|
||||
ide_drive_t *drive = &hwif->drives[unit];
|
||||
@@ -859,10 +859,11 @@ static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
|
||||
}
|
||||
|
||||
static int hwif_init(ide_hwif_t *hwif);
|
||||
static void hwif_register_devices(ide_hwif_t *hwif);
|
||||
|
||||
int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
|
||||
static int probe_hwif_init(ide_hwif_t *hwif)
|
||||
{
|
||||
probe_hwif(hwif, fixup);
|
||||
probe_hwif(hwif);
|
||||
|
||||
if (!hwif_init(hwif)) {
|
||||
printk(KERN_INFO "%s: failed to initialize IDE interface\n",
|
||||
@@ -870,34 +871,12 @@ int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (hwif->present) {
|
||||
u16 unit = 0;
|
||||
int ret;
|
||||
if (hwif->present)
|
||||
hwif_register_devices(hwif);
|
||||
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit) {
|
||||
ide_drive_t *drive = &hwif->drives[unit];
|
||||
/* For now don't attach absent drives, we may
|
||||
want them on default or a new "empty" class
|
||||
for hotplug reprobing ? */
|
||||
if (drive->present) {
|
||||
ret = device_register(&drive->gendev);
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "IDE: %s: "
|
||||
"device_register error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int probe_hwif_init(ide_hwif_t *hwif)
|
||||
{
|
||||
return probe_hwif_init_with_fixup(hwif, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(probe_hwif_init);
|
||||
|
||||
#if MAX_HWIFS > 1
|
||||
/*
|
||||
* save_match() is used to simplify logic in init_irq() below.
|
||||
@@ -1379,6 +1358,24 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hwif_register_devices(ide_hwif_t *hwif)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < MAX_DRIVES; i++) {
|
||||
ide_drive_t *drive = &hwif->drives[i];
|
||||
|
||||
if (drive->present) {
|
||||
int ret = device_register(&drive->gendev);
|
||||
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "IDE: %s: "
|
||||
"device_register error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ideprobe_init (void)
|
||||
{
|
||||
unsigned int index;
|
||||
@@ -1390,27 +1387,18 @@ int ideprobe_init (void)
|
||||
|
||||
for (index = 0; index < MAX_HWIFS; ++index)
|
||||
if (probe[index])
|
||||
probe_hwif(&ide_hwifs[index], NULL);
|
||||
probe_hwif(&ide_hwifs[index]);
|
||||
for (index = 0; index < MAX_HWIFS; ++index)
|
||||
if (probe[index])
|
||||
hwif_init(&ide_hwifs[index]);
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
if (probe[index]) {
|
||||
ide_hwif_t *hwif = &ide_hwifs[index];
|
||||
int unit;
|
||||
if (!hwif->present)
|
||||
continue;
|
||||
if (hwif->chipset == ide_unknown || hwif->chipset == ide_forced)
|
||||
hwif->chipset = ide_generic;
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit)
|
||||
if (hwif->drives[unit].present) {
|
||||
int ret = device_register(
|
||||
&hwif->drives[unit].gendev);
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "IDE: %s: "
|
||||
"device_register error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
}
|
||||
hwif_register_devices(hwif);
|
||||
}
|
||||
}
|
||||
for (index = 0; index < MAX_HWIFS; ++index)
|
||||
@@ -1420,3 +1408,22 @@ int ideprobe_init (void)
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ideprobe_init);
|
||||
|
||||
int ide_device_add(u8 idx[4])
|
||||
{
|
||||
int i, rc = 0;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (idx[i] != 0xff)
|
||||
rc |= probe_hwif_init(&ide_hwifs[idx[i]]);
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (idx[i] != 0xff)
|
||||
ide_proc_register_port(&ide_hwifs[idx[i]]);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ide_device_add);
|
||||
|
||||
@@ -804,8 +804,6 @@ void ide_proc_register_port(ide_hwif_t *hwif)
|
||||
create_proc_ide_drives(hwif);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ide_proc_register_port);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEPCI
|
||||
void ide_pci_create_host_proc(const char *name, get_info_t *get_info)
|
||||
{
|
||||
|
||||
@@ -621,7 +621,6 @@ typedef struct os_dat_s {
|
||||
*/
|
||||
#define USE_IOTRACE 0
|
||||
#if USE_IOTRACE
|
||||
#include <linux/io_trace.h>
|
||||
#define IO_IDETAPE_FIFO 500
|
||||
#endif
|
||||
|
||||
|
||||
+10
-27
@@ -8,23 +8,6 @@
|
||||
* Copyright (C) 2003-2004 Bartlomiej Zolnierkiewicz
|
||||
*
|
||||
* The big the bad and the ugly.
|
||||
*
|
||||
* Problems to be fixed because of BH interface or the lack therefore.
|
||||
*
|
||||
* Fill me in stupid !!!
|
||||
*
|
||||
* HOST:
|
||||
* General refers to the Controller and Driver "pair".
|
||||
* DATA HANDLER:
|
||||
* Under the context of Linux it generally refers to an interrupt handler.
|
||||
* However, it correctly describes the 'HOST'
|
||||
* DATA BLOCK:
|
||||
* The amount of data needed to be transfered as predefined in the
|
||||
* setup of the device.
|
||||
* STORAGE ATOMIC:
|
||||
* The 'DATA BLOCK' associated to the 'DATA HANDLER', and can be as
|
||||
* small as a single sector or as large as the entire command block
|
||||
* request.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -695,9 +678,6 @@ int ide_wait_cmd (ide_drive_t *drive, u8 cmd, u8 nsect, u8 feature, u8 sectors,
|
||||
return ide_do_drive_cmd(drive, &rq, ide_wait);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME : this needs to map into at taskfile. <andre@linux-ide.org>
|
||||
*/
|
||||
int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int err = 0;
|
||||
@@ -761,9 +741,6 @@ static int ide_wait_cmd_task(ide_drive_t *drive, u8 *buf)
|
||||
return ide_do_drive_cmd(drive, &rq, ide_wait);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME : this needs to map into at taskfile. <andre@linux-ide.org>
|
||||
*/
|
||||
int ide_task_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
void __user *p = (void __user *)arg;
|
||||
@@ -860,9 +837,14 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
|
||||
case TASKFILE_OUT_DMA:
|
||||
case TASKFILE_IN_DMAQ:
|
||||
case TASKFILE_IN_DMA:
|
||||
hwif->dma_setup(drive);
|
||||
hwif->dma_exec_cmd(drive, taskfile->command);
|
||||
hwif->dma_start(drive);
|
||||
if (!drive->using_dma)
|
||||
break;
|
||||
|
||||
if (!hwif->dma_setup(drive)) {
|
||||
hwif->dma_exec_cmd(drive, taskfile->command);
|
||||
hwif->dma_start(drive);
|
||||
return ide_started;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -876,7 +858,8 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
|
||||
return task->prehandler(drive, task->rq);
|
||||
}
|
||||
ide_execute_command(drive, taskfile->command, task->handler, WAIT_WORSTCASE, NULL);
|
||||
return ide_started;
|
||||
}
|
||||
|
||||
return ide_started;
|
||||
return ide_stopped;
|
||||
}
|
||||
|
||||
+47
-26
@@ -168,7 +168,6 @@ static void init_hwif_default(ide_hwif_t *hwif, unsigned int index)
|
||||
|
||||
ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, &hwif->irq);
|
||||
|
||||
memcpy(&hwif->hw, &hw, sizeof(hw));
|
||||
memcpy(hwif->io_ports, hw.io_ports, sizeof(hw.io_ports));
|
||||
|
||||
hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
|
||||
@@ -214,7 +213,7 @@ static void __init init_ide_data (void)
|
||||
init_hwif_data(hwif, index);
|
||||
init_hwif_default(hwif, index);
|
||||
#if !defined(CONFIG_PPC32) || !defined(CONFIG_PCI)
|
||||
hwif->irq = hwif->hw.irq =
|
||||
hwif->irq =
|
||||
ide_init_default_irq(hwif->io_ports[IDE_DATA_OFFSET]);
|
||||
#endif
|
||||
}
|
||||
@@ -265,6 +264,30 @@ static int ide_system_bus_speed(void)
|
||||
return system_bus_speed;
|
||||
}
|
||||
|
||||
ide_hwif_t * ide_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->io_ports[IDE_DATA_OFFSET] == 0)
|
||||
goto found;
|
||||
}
|
||||
|
||||
hwif = NULL;
|
||||
found:
|
||||
return hwif;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(ide_find_port);
|
||||
|
||||
static struct resource* hwif_request_region(ide_hwif_t *hwif,
|
||||
unsigned long addr, int num)
|
||||
{
|
||||
@@ -391,6 +414,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
|
||||
hwif->cds = tmp_hwif->cds;
|
||||
#endif
|
||||
|
||||
hwif->fixup = tmp_hwif->fixup;
|
||||
|
||||
hwif->set_pio_mode = tmp_hwif->set_pio_mode;
|
||||
hwif->set_dma_mode = tmp_hwif->set_dma_mode;
|
||||
hwif->mdma_filter = tmp_hwif->mdma_filter;
|
||||
@@ -652,7 +677,6 @@ void ide_setup_ports ( hw_regs_t *hw,
|
||||
}
|
||||
}
|
||||
hw->irq = irq;
|
||||
hw->dma = NO_DMA;
|
||||
hw->ack_intr = ack_intr;
|
||||
/*
|
||||
* hw->iops = iops;
|
||||
@@ -660,11 +684,11 @@ void ide_setup_ports ( hw_regs_t *hw,
|
||||
}
|
||||
|
||||
/**
|
||||
* ide_register_hw_with_fixup - register IDE interface
|
||||
* ide_register_hw - register IDE interface
|
||||
* @hw: hardware registers
|
||||
* @fixup: fixup function
|
||||
* @initializing: set while initializing built-in drivers
|
||||
* @hwifp: pointer to returned hwif
|
||||
* @fixup: fixup function
|
||||
*
|
||||
* Register an IDE interface, specifying exactly the registers etc.
|
||||
* Set init=1 iff calling before probes have taken place.
|
||||
@@ -672,9 +696,8 @@ void ide_setup_ports ( hw_regs_t *hw,
|
||||
* Returns -1 on error.
|
||||
*/
|
||||
|
||||
int ide_register_hw_with_fixup(hw_regs_t *hw, int initializing,
|
||||
ide_hwif_t **hwifp,
|
||||
void(*fixup)(ide_hwif_t *hwif))
|
||||
int ide_register_hw(hw_regs_t *hw, void (*fixup)(ide_hwif_t *),
|
||||
int initializing, ide_hwif_t **hwifp)
|
||||
{
|
||||
int index, retry = 1;
|
||||
ide_hwif_t *hwif;
|
||||
@@ -682,7 +705,7 @@ int ide_register_hw_with_fixup(hw_regs_t *hw, int initializing,
|
||||
do {
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
hwif = &ide_hwifs[index];
|
||||
if (hwif->hw.io_ports[IDE_DATA_OFFSET] == hw->io_ports[IDE_DATA_OFFSET])
|
||||
if (hwif->io_ports[IDE_DATA_OFFSET] == hw->io_ports[IDE_DATA_OFFSET])
|
||||
goto found;
|
||||
}
|
||||
for (index = 0; index < MAX_HWIFS; ++index) {
|
||||
@@ -690,7 +713,7 @@ int ide_register_hw_with_fixup(hw_regs_t *hw, int initializing,
|
||||
if (hwif->hold)
|
||||
continue;
|
||||
if ((!hwif->present && !hwif->mate && !initializing) ||
|
||||
(!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing))
|
||||
(!hwif->io_ports[IDE_DATA_OFFSET] && initializing))
|
||||
goto found;
|
||||
}
|
||||
for (index = 0; index < MAX_HWIFS; index++)
|
||||
@@ -706,16 +729,18 @@ found:
|
||||
}
|
||||
if (hwif->present)
|
||||
return -1;
|
||||
memcpy(&hwif->hw, hw, sizeof(*hw));
|
||||
memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->hw.io_ports));
|
||||
memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
|
||||
hwif->irq = hw->irq;
|
||||
hwif->noprobe = 0;
|
||||
hwif->fixup = fixup;
|
||||
hwif->chipset = hw->chipset;
|
||||
hwif->gendev.parent = hw->dev;
|
||||
hwif->ack_intr = hw->ack_intr;
|
||||
|
||||
if (!initializing) {
|
||||
probe_hwif_init_with_fixup(hwif, fixup);
|
||||
ide_proc_register_port(hwif);
|
||||
if (initializing == 0) {
|
||||
u8 idx[4] = { index, 0xff, 0xff, 0xff };
|
||||
|
||||
ide_device_add(idx);
|
||||
}
|
||||
|
||||
if (hwifp)
|
||||
@@ -724,13 +749,6 @@ found:
|
||||
return (initializing || hwif->present) ? index : -1;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ide_register_hw_with_fixup);
|
||||
|
||||
int ide_register_hw(hw_regs_t *hw, int initializing, ide_hwif_t **hwifp)
|
||||
{
|
||||
return ide_register_hw_with_fixup(hw, initializing, hwifp, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ide_register_hw);
|
||||
|
||||
/*
|
||||
@@ -1046,7 +1064,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
||||
ide_init_hwif_ports(&hw, (unsigned long) args[0],
|
||||
(unsigned long) args[1], NULL);
|
||||
hw.irq = args[2];
|
||||
if (ide_register_hw(&hw, 0, NULL) == -1)
|
||||
if (ide_register_hw(&hw, NULL, 0, NULL) == -1)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
@@ -1397,6 +1415,9 @@ static int __init ide_setup(char *s)
|
||||
"reset", "minus6", "ata66", "minus8", "minus9",
|
||||
"minus10", "four", "qd65xx", "ht6560b", "cmd640_vlb",
|
||||
"dtc2278", "umc8672", "ali14xx", NULL };
|
||||
|
||||
hw_regs_t hwregs;
|
||||
|
||||
hw = s[3] - '0';
|
||||
hwif = &ide_hwifs[hw];
|
||||
i = match_parm(&s[4], ide_words, vals, 3);
|
||||
@@ -1506,9 +1527,9 @@ static int __init ide_setup(char *s)
|
||||
case 2: /* base,ctl */
|
||||
vals[2] = 0; /* default irq = probe for it */
|
||||
case 3: /* base,ctl,irq */
|
||||
hwif->hw.irq = vals[2];
|
||||
ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long) vals[1], &hwif->irq);
|
||||
memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
|
||||
memset(&hwregs, 0, sizeof(hwregs));
|
||||
ide_init_hwif_ports(&hwregs, vals[0], vals[1], &hwif->irq);
|
||||
memcpy(hwif->io_ports, hwregs.io_ports, sizeof(hwif->io_ports));
|
||||
hwif->irq = vals[2];
|
||||
hwif->noprobe = 0;
|
||||
hwif->chipset = ide_forced;
|
||||
|
||||
@@ -102,6 +102,8 @@ static void outReg (u8 data, u8 reg)
|
||||
outb_p(data, dataPort);
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(ali14xx_lock);
|
||||
|
||||
/*
|
||||
* Set PIO mode for the specified drive.
|
||||
* This function computes timing parameters
|
||||
@@ -129,14 +131,14 @@ static void ali14xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
|
||||
/* stuff timing parameters into controller registers */
|
||||
driveNum = (HWIF(drive)->index << 1) + drive->select.b.unit;
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
spin_lock_irqsave(&ali14xx_lock, flags);
|
||||
outb_p(regOn, basePort);
|
||||
outReg(param1, regTab[driveNum].reg1);
|
||||
outReg(param2, regTab[driveNum].reg2);
|
||||
outReg(param3, regTab[driveNum].reg3);
|
||||
outReg(param4, regTab[driveNum].reg4);
|
||||
outb_p(regOff, basePort);
|
||||
spin_unlock_irqrestore(&ide_lock, flags);
|
||||
spin_unlock_irqrestore(&ali14xx_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -193,6 +195,7 @@ static int __init initRegisters (void) {
|
||||
static int __init ali14xx_probe(void)
|
||||
{
|
||||
ide_hwif_t *hwif, *mate;
|
||||
static u8 idx[4] = { 0, 1, 0xff, 0xff };
|
||||
|
||||
printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n",
|
||||
basePort, regOn);
|
||||
@@ -217,11 +220,7 @@ static int __init ali14xx_probe(void)
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
probe_hwif_init(mate);
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
ide_proc_register_port(mate);
|
||||
ide_device_add(idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -212,8 +212,8 @@ fail_base2:
|
||||
// xsurf_iops,
|
||||
IRQ_AMIGA_PORTS);
|
||||
}
|
||||
|
||||
index = ide_register_hw(&hw, 1, &hwif);
|
||||
|
||||
index = ide_register_hw(&hw, NULL, 1, &hwif);
|
||||
if (index != -1) {
|
||||
hwif->mmio = 1;
|
||||
printk("ide%d: ", index);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user