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:
@@ -192,22 +192,20 @@ typedef unsigned char byte; /* used everywhere */
|
||||
struct hwif_s;
|
||||
typedef int (ide_ack_intr_t)(struct hwif_s *);
|
||||
|
||||
#ifndef NO_DMA
|
||||
#define NO_DMA 255
|
||||
#endif
|
||||
|
||||
/*
|
||||
* hwif_chipset_t is used to keep track of the specific hardware
|
||||
* chipset used by each IDE interface, if known.
|
||||
*/
|
||||
typedef enum { ide_unknown, ide_generic, ide_pci,
|
||||
enum { ide_unknown, ide_generic, ide_pci,
|
||||
ide_cmd640, ide_dtc2278, ide_ali14xx,
|
||||
ide_qd65xx, ide_umc8672, ide_ht6560b,
|
||||
ide_rz1000, ide_trm290,
|
||||
ide_cmd646, ide_cy82c693, ide_4drives,
|
||||
ide_pmac, ide_etrax100, ide_acorn,
|
||||
ide_au1xxx, ide_forced
|
||||
} hwif_chipset_t;
|
||||
};
|
||||
|
||||
typedef u8 hwif_chipset_t;
|
||||
|
||||
/*
|
||||
* Structure to hold all information about the location of this port
|
||||
@@ -215,22 +213,16 @@ typedef enum { ide_unknown, ide_generic, ide_pci,
|
||||
typedef struct hw_regs_s {
|
||||
unsigned long io_ports[IDE_NR_PORTS]; /* task file registers */
|
||||
int irq; /* our irq number */
|
||||
int dma; /* our dma entry */
|
||||
ide_ack_intr_t *ack_intr; /* acknowledge interrupt */
|
||||
hwif_chipset_t chipset;
|
||||
struct device *dev;
|
||||
} hw_regs_t;
|
||||
|
||||
/*
|
||||
* Register new hardware with ide
|
||||
*/
|
||||
int ide_register_hw(hw_regs_t *, int, struct hwif_s **);
|
||||
int ide_register_hw_with_fixup(hw_regs_t *, int, struct hwif_s **,
|
||||
void (*)(struct hwif_s *));
|
||||
struct hwif_s * ide_find_port(unsigned long);
|
||||
|
||||
int ide_register_hw(hw_regs_t *, void (*)(struct hwif_s *), int,
|
||||
struct hwif_s **);
|
||||
|
||||
/*
|
||||
* Set up hw_regs_t structure before calling ide_register_hw (optional)
|
||||
*/
|
||||
void ide_setup_ports( hw_regs_t *hw,
|
||||
unsigned long base,
|
||||
int *offsets,
|
||||
@@ -268,11 +260,7 @@ static inline void ide_std_init_ports(hw_regs_t *hw,
|
||||
# define ide_init_default_irq(base) (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ide_init_hwif_ports() is OBSOLETE and will be removed in 2.7 series.
|
||||
* New ports shouldn't define IDE_ARCH_OBSOLETE_INIT in <asm/ide.h>.
|
||||
*/
|
||||
#ifdef IDE_ARCH_OBSOLETE_INIT
|
||||
#ifdef CONFIG_IDE_ARCH_OBSOLETE_INIT
|
||||
static inline void ide_init_hwif_ports(hw_regs_t *hw,
|
||||
unsigned long io_addr,
|
||||
unsigned long ctl_addr,
|
||||
@@ -302,7 +290,7 @@ static inline void ide_init_hwif_ports(hw_regs_t *hw,
|
||||
if (io_addr || ctl_addr)
|
||||
printk(KERN_WARNING "%s: must not be called\n", __FUNCTION__);
|
||||
}
|
||||
#endif /* IDE_ARCH_OBSOLETE_INIT */
|
||||
#endif /* CONFIG_IDE_ARCH_OBSOLETE_INIT */
|
||||
|
||||
/* Currently only m68k, apus and m8xx need it */
|
||||
#ifndef IDE_ARCH_ACK_INTR
|
||||
@@ -363,7 +351,6 @@ typedef union {
|
||||
* ATA DATA Register Special.
|
||||
* ATA NSECTOR Count Register().
|
||||
* ATAPI Byte Count Register.
|
||||
* Channel index ordering pairs.
|
||||
*/
|
||||
typedef union {
|
||||
unsigned all :16;
|
||||
@@ -378,7 +365,7 @@ typedef union {
|
||||
#error "Please fix <asm/byteorder.h>"
|
||||
#endif
|
||||
} b;
|
||||
} ata_nsector_t, ata_data_t, atapi_bcount_t, ata_index_t;
|
||||
} ata_nsector_t, ata_data_t, atapi_bcount_t;
|
||||
|
||||
/*
|
||||
* ATA-IDE Select Register, aka Device-Head
|
||||
@@ -657,7 +644,7 @@ typedef struct ide_drive_s {
|
||||
((1<<ide_pci)|(1<<ide_cmd646)|(1<<ide_ali14xx))
|
||||
#define IDE_CHIPSET_IS_PCI(c) ((IDE_CHIPSET_PCI_MASK >> (c)) & 1)
|
||||
|
||||
struct ide_pci_device_s;
|
||||
struct ide_port_info;
|
||||
|
||||
typedef struct hwif_s {
|
||||
struct hwif_s *next; /* for linked-list in ide_hwgroup_t */
|
||||
@@ -672,7 +659,6 @@ typedef struct hwif_s {
|
||||
unsigned long sata_scr[SATA_NR_PORTS];
|
||||
unsigned long sata_misc[SATA_NR_PORTS];
|
||||
|
||||
hw_regs_t hw; /* Hardware info */
|
||||
ide_drive_t drives[MAX_DRIVES]; /* drive info */
|
||||
|
||||
u8 major; /* our major number */
|
||||
@@ -694,7 +680,9 @@ typedef struct hwif_s {
|
||||
hwif_chipset_t chipset; /* sub-module for tuning.. */
|
||||
|
||||
struct pci_dev *pci_dev; /* for pci chipsets */
|
||||
struct ide_pci_device_s *cds; /* chipset device struct */
|
||||
const struct ide_port_info *cds; /* chipset device struct */
|
||||
|
||||
ide_ack_intr_t *ack_intr;
|
||||
|
||||
void (*rw_disk)(ide_drive_t *, struct request *);
|
||||
|
||||
@@ -725,6 +713,8 @@ typedef struct hwif_s {
|
||||
u8 (*mdma_filter)(ide_drive_t *);
|
||||
u8 (*udma_filter)(ide_drive_t *);
|
||||
|
||||
void (*fixup)(struct hwif_s *);
|
||||
|
||||
void (*ata_input_data)(ide_drive_t *, void *, u32);
|
||||
void (*ata_output_data)(ide_drive_t *, void *, u32);
|
||||
|
||||
@@ -841,8 +831,6 @@ typedef struct hwgroup_s {
|
||||
|
||||
/* for pci chipsets */
|
||||
struct pci_dev *pci_dev;
|
||||
/* chipset device struct */
|
||||
struct ide_pci_device_s *cds;
|
||||
|
||||
/* current request */
|
||||
struct request *rq;
|
||||
@@ -1030,36 +1018,16 @@ extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs);
|
||||
int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq,
|
||||
int uptodate, int nr_sectors);
|
||||
|
||||
/*
|
||||
* This is used on exit from the driver to designate the next irq handler
|
||||
* and also to start the safety timer.
|
||||
*/
|
||||
extern void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry);
|
||||
|
||||
/*
|
||||
* This is used on exit from the driver to designate the next irq handler
|
||||
* and start the safety time safely and atomically from the IRQ handler
|
||||
* with respect to the command issue (which it also does)
|
||||
*/
|
||||
extern void ide_execute_command(ide_drive_t *, task_ioreg_t cmd, ide_handler_t *, unsigned int, ide_expiry_t *);
|
||||
|
||||
ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8);
|
||||
|
||||
/*
|
||||
* ide_error() takes action based on the error returned by the controller.
|
||||
* The caller should return immediately after invoking this.
|
||||
*
|
||||
* (drive, msg, status)
|
||||
*/
|
||||
ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat);
|
||||
|
||||
ide_startstop_t __ide_abort(ide_drive_t *, struct request *);
|
||||
|
||||
/*
|
||||
* Abort a running command on the controller triggering the abort
|
||||
* from a host side, non error situation
|
||||
* (drive, msg)
|
||||
*/
|
||||
extern ide_startstop_t ide_abort(ide_drive_t *, const char *);
|
||||
|
||||
extern void ide_fix_driveid(struct hd_driveid *);
|
||||
@@ -1075,15 +1043,8 @@ extern void ide_fixstring(u8 *, const int, const int);
|
||||
|
||||
int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long);
|
||||
|
||||
/*
|
||||
* Start a reset operation for an IDE interface.
|
||||
* The caller should return immediately after invoking this.
|
||||
*/
|
||||
extern ide_startstop_t ide_do_reset (ide_drive_t *);
|
||||
|
||||
/*
|
||||
* This function is intended to be used prior to invoking ide_do_drive_cmd().
|
||||
*/
|
||||
extern void ide_init_drive_cmd (struct request *rq);
|
||||
|
||||
/*
|
||||
@@ -1098,13 +1059,6 @@ typedef enum {
|
||||
|
||||
extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t);
|
||||
|
||||
/*
|
||||
* Clean up after success/failure of an explicit drive cmd.
|
||||
* stat/err are used only when (HWGROUP(drive)->rq->cmd == IDE_DRIVE_CMD).
|
||||
* stat/err are used only when (HWGROUP(drive)->rq->cmd == IDE_DRIVE_TASK_MASK).
|
||||
*
|
||||
* (ide_drive_t *drive, u8 stat, u8 err)
|
||||
*/
|
||||
extern void ide_end_drive_cmd(ide_drive_t *, u8, u8);
|
||||
|
||||
/*
|
||||
@@ -1177,10 +1131,6 @@ extern int taskfile_lib_get_identify(ide_drive_t *drive, u8 *);
|
||||
|
||||
extern int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout);
|
||||
|
||||
/*
|
||||
* ide_stall_queue() can be used by a drive to give excess bandwidth back
|
||||
* to the hwgroup by sleeping for timeout jiffies.
|
||||
*/
|
||||
extern void ide_stall_queue(ide_drive_t *drive, unsigned long timeout);
|
||||
|
||||
extern int ide_spin_wait_hwgroup(ide_drive_t *);
|
||||
@@ -1200,8 +1150,8 @@ extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *o
|
||||
#define ide_pci_register_driver(d) pci_register_driver(d)
|
||||
#endif
|
||||
|
||||
void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
|
||||
extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
|
||||
void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, u8 *);
|
||||
void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *);
|
||||
|
||||
extern void default_hwif_iops(ide_hwif_t *);
|
||||
extern void default_hwif_mmiops(ide_hwif_t *);
|
||||
@@ -1261,6 +1211,14 @@ enum {
|
||||
IDE_HFLAG_SERIALIZE = (1 << 20),
|
||||
/* use legacy IRQs */
|
||||
IDE_HFLAG_LEGACY_IRQS = (1 << 21),
|
||||
/* force use of legacy IRQs */
|
||||
IDE_HFLAG_FORCE_LEGACY_IRQS = (1 << 22),
|
||||
/* limit LBA48 requests to 256 sectors */
|
||||
IDE_HFLAG_RQSIZE_256 = (1 << 23),
|
||||
/* use 32-bit I/O ops */
|
||||
IDE_HFLAG_IO_32BIT = (1 << 24),
|
||||
/* unmask IRQs */
|
||||
IDE_HFLAG_UNMASK_IRQS = (1 << 25),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_OFFBOARD
|
||||
@@ -1269,7 +1227,7 @@ enum {
|
||||
# define IDE_HFLAG_OFF_BOARD 0
|
||||
#endif
|
||||
|
||||
typedef struct ide_pci_device_s {
|
||||
struct ide_port_info {
|
||||
char *name;
|
||||
unsigned int (*init_chipset)(struct pci_dev *, const char *);
|
||||
void (*init_iops)(ide_hwif_t *);
|
||||
@@ -1277,17 +1235,17 @@ typedef struct ide_pci_device_s {
|
||||
void (*init_dma)(ide_hwif_t *, unsigned long);
|
||||
void (*fixup)(ide_hwif_t *);
|
||||
ide_pci_enablebit_t enablebits[2];
|
||||
hwif_chipset_t chipset;
|
||||
unsigned int extra;
|
||||
struct ide_pci_device_s *next;
|
||||
u32 host_flags;
|
||||
u8 pio_mask;
|
||||
u8 swdma_mask;
|
||||
u8 mwdma_mask;
|
||||
u8 udma_mask;
|
||||
} ide_pci_device_t;
|
||||
};
|
||||
|
||||
extern int ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *);
|
||||
extern int ide_setup_pci_devices(struct pci_dev *, struct pci_dev *, ide_pci_device_t *);
|
||||
int ide_setup_pci_device(struct pci_dev *, const struct ide_port_info *);
|
||||
int ide_setup_pci_devices(struct pci_dev *, struct pci_dev *, const struct ide_port_info *);
|
||||
|
||||
void ide_map_sg(ide_drive_t *, struct request *);
|
||||
void ide_init_sg_cmd(ide_drive_t *, struct request *);
|
||||
@@ -1370,8 +1328,7 @@ void ide_unregister_region(struct gendisk *);
|
||||
|
||||
void ide_undecoded_slave(ide_hwif_t *);
|
||||
|
||||
int probe_hwif_init_with_fixup(ide_hwif_t *, void (*)(ide_hwif_t *));
|
||||
extern int probe_hwif_init(ide_hwif_t *);
|
||||
int ide_device_add(u8 idx[4]);
|
||||
|
||||
static inline void *ide_get_hwifdata (ide_hwif_t * hwif)
|
||||
{
|
||||
|
Reference in New Issue
Block a user