Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev: (50 commits) [libata] Delete pata_it8172 driver [PATCH] libata: improve handling of diagostic fail (and hardware that misreports it) [PATCH] libata: fix non-uniform ports handling Fix libata resource conflict for legacy mode [libata] ata_piix: build fix [PATCH] pata_amd: Check enable bits on Nvidia [PATCH] Update SiS PATA [libata] Add pata_jmicron driver to Kconfig, Makefile [libata #pata-drivers] Trim trailing whitespace. [libata] Trim trailing whitespace. [libata] Add a bunch of PATA drivers. Rename libata-bmdma.c to libata-sff.c. libata: Grand renaming. Clean up drivers/ata/Kconfig a bit. [PATCH] CONFIG_PM=n slim: drivers/scsi/sata_sil* [PATCH] sata_via: Add SATA support for vt8237a [PATCH] libata: change path to libata in libata.tmpl [PATCH] libata: s/CONFIG_SCSI_SATA/CONFIG_[S]ATA/g in pci/quirks.c libata: Make sure drivers/ata is a separate Kconfig menu [libata] ata_piix: add missing kfree() ...
This commit is contained in:
commit
a68aa1cc6f
77 changed files with 19870 additions and 1299 deletions
|
@ -40,6 +40,8 @@ enum {
|
|||
ATA_MAX_DEVICES = 2, /* per bus/port */
|
||||
ATA_MAX_PRD = 256, /* we could make these 256/256 */
|
||||
ATA_SECT_SIZE = 512,
|
||||
ATA_MAX_SECTORS = 256,
|
||||
ATA_MAX_SECTORS_LBA48 = 65535,/* TODO: 65536? */
|
||||
|
||||
ATA_ID_WORDS = 256,
|
||||
ATA_ID_SERNO_OFS = 10,
|
||||
|
@ -168,12 +170,16 @@ enum {
|
|||
XFER_UDMA_2 = 0x42,
|
||||
XFER_UDMA_1 = 0x41,
|
||||
XFER_UDMA_0 = 0x40,
|
||||
XFER_MW_DMA_4 = 0x24, /* CFA only */
|
||||
XFER_MW_DMA_3 = 0x23, /* CFA only */
|
||||
XFER_MW_DMA_2 = 0x22,
|
||||
XFER_MW_DMA_1 = 0x21,
|
||||
XFER_MW_DMA_0 = 0x20,
|
||||
XFER_SW_DMA_2 = 0x12,
|
||||
XFER_SW_DMA_1 = 0x11,
|
||||
XFER_SW_DMA_0 = 0x10,
|
||||
XFER_PIO_6 = 0x0E, /* CFA only */
|
||||
XFER_PIO_5 = 0x0D, /* CFA only */
|
||||
XFER_PIO_4 = 0x0C,
|
||||
XFER_PIO_3 = 0x0B,
|
||||
XFER_PIO_2 = 0x0A,
|
||||
|
@ -272,7 +278,6 @@ struct ata_taskfile {
|
|||
};
|
||||
|
||||
#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0)
|
||||
#define ata_id_is_cfa(id) ((id)[0] == 0x848A)
|
||||
#define ata_id_is_sata(id) ((id)[93] == 0)
|
||||
#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
|
||||
#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
|
||||
|
@ -304,6 +309,9 @@ static inline unsigned int ata_id_major_version(const u16 *id)
|
|||
{
|
||||
unsigned int mver;
|
||||
|
||||
if (id[ATA_ID_MAJOR_VER] == 0xFFFF)
|
||||
return 0;
|
||||
|
||||
for (mver = 14; mver >= 1; mver--)
|
||||
if (id[ATA_ID_MAJOR_VER] & (1 << mver))
|
||||
break;
|
||||
|
@ -312,8 +320,8 @@ static inline unsigned int ata_id_major_version(const u16 *id)
|
|||
|
||||
static inline int ata_id_current_chs_valid(const u16 *id)
|
||||
{
|
||||
/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
|
||||
has not been issued to the device then the values of
|
||||
/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
|
||||
has not been issued to the device then the values of
|
||||
id[54] to id[56] are vendor specific. */
|
||||
return (id[53] & 0x01) && /* Current translation valid */
|
||||
id[54] && /* cylinders in current translation */
|
||||
|
@ -322,6 +330,18 @@ static inline int ata_id_current_chs_valid(const u16 *id)
|
|||
id[56]; /* sectors in current translation */
|
||||
}
|
||||
|
||||
static inline int ata_id_is_cfa(const u16 *id)
|
||||
{
|
||||
u16 v = id[0];
|
||||
if (v == 0x848A) /* Standard CF */
|
||||
return 1;
|
||||
/* Could be CF hiding as standard ATA */
|
||||
if (ata_id_major_version(id) >= 3 && id[82] != 0xFFFF &&
|
||||
(id[82] & ( 1 << 2)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int atapi_cdb_len(const u16 *dev_id)
|
||||
{
|
||||
u16 tmp = dev_id[0] & 0x3;
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#include <asm/libata-portmap.h>
|
||||
|
||||
/*
|
||||
* compile-time options: to be removed as soon as all the drivers are
|
||||
* converted to the new debugging mechanism
|
||||
|
@ -44,7 +46,7 @@
|
|||
#undef ATA_VERBOSE_DEBUG /* yet more debugging output */
|
||||
#undef ATA_IRQ_TRAP /* define to ack screaming irqs */
|
||||
#undef ATA_NDEBUG /* define to disable quick runtime checks */
|
||||
#undef ATA_ENABLE_PATA /* define to enable PATA support in some
|
||||
#define ATA_ENABLE_PATA /* define to enable PATA support in some
|
||||
* low-level drivers */
|
||||
|
||||
|
||||
|
@ -112,8 +114,6 @@ enum {
|
|||
/* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
|
||||
ATA_MAX_QUEUE = 32,
|
||||
ATA_TAG_INTERNAL = ATA_MAX_QUEUE - 1,
|
||||
ATA_MAX_SECTORS = 200, /* FIXME */
|
||||
ATA_MAX_SECTORS_LBA48 = 65535,
|
||||
ATA_MAX_BUS = 2,
|
||||
ATA_DEF_BUSY_WAIT = 10000,
|
||||
ATA_SHORT_PAUSE = (HZ >> 6) + 1,
|
||||
|
@ -197,8 +197,8 @@ enum {
|
|||
ATA_QCFLAG_EH_SCHEDULED = (1 << 18), /* EH scheduled (obsolete) */
|
||||
|
||||
/* host set flags */
|
||||
ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host_set only */
|
||||
|
||||
ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */
|
||||
|
||||
/* various lengths of time */
|
||||
ATA_TMOUT_BOOT = 30 * HZ, /* heuristic */
|
||||
ATA_TMOUT_BOOT_QUICK = 7 * HZ, /* heuristic */
|
||||
|
@ -225,8 +225,8 @@ enum {
|
|||
/* encoding various smaller bitmaps into a single
|
||||
* unsigned int bitmap
|
||||
*/
|
||||
ATA_BITS_PIO = 5,
|
||||
ATA_BITS_MWDMA = 3,
|
||||
ATA_BITS_PIO = 7,
|
||||
ATA_BITS_MWDMA = 5,
|
||||
ATA_BITS_UDMA = 8,
|
||||
|
||||
ATA_SHIFT_PIO = 0,
|
||||
|
@ -289,6 +289,11 @@ enum {
|
|||
* most devices.
|
||||
*/
|
||||
ATA_SPINUP_WAIT = 8000,
|
||||
|
||||
/* Horkage types. May be set by libata or controller on drives
|
||||
(some horkage may be drive/controller pair dependant */
|
||||
|
||||
ATA_HORKAGE_DIAGNOSTIC = (1 << 0), /* Failed boot diag */
|
||||
};
|
||||
|
||||
enum hsm_task_states {
|
||||
|
@ -350,23 +355,32 @@ struct ata_probe_ent {
|
|||
struct scsi_host_template *sht;
|
||||
struct ata_ioports port[ATA_MAX_PORTS];
|
||||
unsigned int n_ports;
|
||||
unsigned int hard_port_no;
|
||||
unsigned int dummy_port_mask;
|
||||
unsigned int pio_mask;
|
||||
unsigned int mwdma_mask;
|
||||
unsigned int udma_mask;
|
||||
unsigned int legacy_mode;
|
||||
unsigned long irq;
|
||||
unsigned long irq2;
|
||||
unsigned int irq_flags;
|
||||
unsigned long host_flags;
|
||||
unsigned long host_set_flags;
|
||||
unsigned long port_flags;
|
||||
unsigned long _host_flags;
|
||||
void __iomem *mmio_base;
|
||||
void *private_data;
|
||||
|
||||
/* port_info for the secondary port. Together with irq2, it's
|
||||
* used to implement non-uniform secondary port. Currently,
|
||||
* the only user is ata_piix combined mode. This workaround
|
||||
* will be removed together with ata_probe_ent when init model
|
||||
* is updated.
|
||||
*/
|
||||
const struct ata_port_info *pinfo2;
|
||||
};
|
||||
|
||||
struct ata_host_set {
|
||||
struct ata_host {
|
||||
spinlock_t lock;
|
||||
struct device *dev;
|
||||
unsigned long irq;
|
||||
unsigned long irq2;
|
||||
void __iomem *mmio_base;
|
||||
unsigned int n_ports;
|
||||
void *private_data;
|
||||
|
@ -374,7 +388,6 @@ struct ata_host_set {
|
|||
unsigned long flags;
|
||||
int simplex_claimed; /* Keep seperate in case we
|
||||
ever need to do this locked */
|
||||
struct ata_host_set *next; /* for legacy mode */
|
||||
struct ata_port *ports[0];
|
||||
};
|
||||
|
||||
|
@ -420,7 +433,7 @@ struct ata_queued_cmd {
|
|||
void *private_data;
|
||||
};
|
||||
|
||||
struct ata_host_stats {
|
||||
struct ata_port_stats {
|
||||
unsigned long unhandled_irq;
|
||||
unsigned long idle_irq;
|
||||
unsigned long rw_reqbuf;
|
||||
|
@ -468,6 +481,7 @@ struct ata_device {
|
|||
|
||||
/* error history */
|
||||
struct ata_ering ering;
|
||||
unsigned int horkage; /* List of broken features */
|
||||
};
|
||||
|
||||
/* Offset into struct ata_device. Fields above it are maintained
|
||||
|
@ -498,14 +512,13 @@ struct ata_eh_context {
|
|||
};
|
||||
|
||||
struct ata_port {
|
||||
struct Scsi_Host *host; /* our co-allocated scsi host */
|
||||
struct Scsi_Host *scsi_host; /* our co-allocated scsi host */
|
||||
const struct ata_port_operations *ops;
|
||||
spinlock_t *lock;
|
||||
unsigned long flags; /* ATA_FLAG_xxx */
|
||||
unsigned int pflags; /* ATA_PFLAG_xxx */
|
||||
unsigned int id; /* unique id req'd by scsi midlyr */
|
||||
unsigned int port_no; /* unique port #; from zero */
|
||||
unsigned int hard_port_no; /* hardware port #; from zero */
|
||||
|
||||
struct ata_prd *prd; /* our SG list */
|
||||
dma_addr_t prd_dma; /* and its DMA mapping */
|
||||
|
@ -524,7 +537,7 @@ struct ata_port {
|
|||
unsigned int hw_sata_spd_limit;
|
||||
unsigned int sata_spd_limit; /* SATA PHY speed limit */
|
||||
|
||||
/* record runtime error info, protected by host_set lock */
|
||||
/* record runtime error info, protected by host lock */
|
||||
struct ata_eh_info eh_info;
|
||||
/* EH context owned by EH */
|
||||
struct ata_eh_context eh_context;
|
||||
|
@ -538,8 +551,8 @@ struct ata_port {
|
|||
unsigned int active_tag;
|
||||
u32 sactive;
|
||||
|
||||
struct ata_host_stats stats;
|
||||
struct ata_host_set *host_set;
|
||||
struct ata_port_stats stats;
|
||||
struct ata_host *host;
|
||||
struct device *dev;
|
||||
|
||||
struct work_struct port_task;
|
||||
|
@ -615,7 +628,7 @@ struct ata_port_operations {
|
|||
int (*port_start) (struct ata_port *ap);
|
||||
void (*port_stop) (struct ata_port *ap);
|
||||
|
||||
void (*host_stop) (struct ata_host_set *host_set);
|
||||
void (*host_stop) (struct ata_host *host);
|
||||
|
||||
void (*bmdma_stop) (struct ata_queued_cmd *qc);
|
||||
u8 (*bmdma_status) (struct ata_port *ap);
|
||||
|
@ -623,7 +636,7 @@ struct ata_port_operations {
|
|||
|
||||
struct ata_port_info {
|
||||
struct scsi_host_template *sht;
|
||||
unsigned long host_flags;
|
||||
unsigned long flags;
|
||||
unsigned long pio_mask;
|
||||
unsigned long mwdma_mask;
|
||||
unsigned long udma_mask;
|
||||
|
@ -649,6 +662,8 @@ extern const unsigned long sata_deb_timing_normal[];
|
|||
extern const unsigned long sata_deb_timing_hotplug[];
|
||||
extern const unsigned long sata_deb_timing_long[];
|
||||
|
||||
extern const struct ata_port_operations ata_dummy_port_ops;
|
||||
|
||||
static inline const unsigned long *
|
||||
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
||||
{
|
||||
|
@ -658,6 +673,11 @@ sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
|||
return sata_deb_timing_normal;
|
||||
}
|
||||
|
||||
static inline int ata_port_is_dummy(struct ata_port *ap)
|
||||
{
|
||||
return ap->ops == &ata_dummy_port_ops;
|
||||
}
|
||||
|
||||
extern void ata_port_probe(struct ata_port *);
|
||||
extern void __sata_phy_reset(struct ata_port *ap);
|
||||
extern void sata_phy_reset(struct ata_port *ap);
|
||||
|
@ -676,19 +696,30 @@ extern void ata_std_ports(struct ata_ioports *ioaddr);
|
|||
extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
|
||||
unsigned int n_ports);
|
||||
extern void ata_pci_remove_one (struct pci_dev *pdev);
|
||||
extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);
|
||||
extern void ata_pci_device_do_resume(struct pci_dev *pdev);
|
||||
extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
|
||||
extern int ata_pci_device_resume(struct pci_dev *pdev);
|
||||
extern int ata_pci_clear_simplex(struct pci_dev *pdev);
|
||||
#endif /* CONFIG_PCI */
|
||||
extern int ata_device_add(const struct ata_probe_ent *ent);
|
||||
extern void ata_port_detach(struct ata_port *ap);
|
||||
extern void ata_host_set_remove(struct ata_host_set *host_set);
|
||||
extern void ata_host_init(struct ata_host *, struct device *,
|
||||
unsigned long, const struct ata_port_operations *);
|
||||
extern void ata_host_remove(struct ata_host *host);
|
||||
extern int ata_scsi_detect(struct scsi_host_template *sht);
|
||||
extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
|
||||
extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
|
||||
extern int ata_scsi_release(struct Scsi_Host *host);
|
||||
extern void ata_sas_port_destroy(struct ata_port *);
|
||||
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
||||
struct ata_port_info *, struct Scsi_Host *);
|
||||
extern int ata_sas_port_init(struct ata_port *);
|
||||
extern int ata_sas_port_start(struct ata_port *ap);
|
||||
extern void ata_sas_port_stop(struct ata_port *ap);
|
||||
extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
|
||||
extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
|
||||
struct ata_port *ap);
|
||||
extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
|
||||
extern int sata_scr_valid(struct ata_port *ap);
|
||||
extern int sata_scr_read(struct ata_port *ap, int reg, u32 *val);
|
||||
|
@ -697,10 +728,9 @@ extern int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val);
|
|||
extern int ata_port_online(struct ata_port *ap);
|
||||
extern int ata_port_offline(struct ata_port *ap);
|
||||
extern int ata_scsi_device_resume(struct scsi_device *);
|
||||
extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t state);
|
||||
extern int ata_host_set_suspend(struct ata_host_set *host_set,
|
||||
pm_message_t mesg);
|
||||
extern void ata_host_set_resume(struct ata_host_set *host_set);
|
||||
extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t mesg);
|
||||
extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg);
|
||||
extern void ata_host_resume(struct ata_host *host);
|
||||
extern int ata_ratelimit(void);
|
||||
extern unsigned int ata_busy_sleep(struct ata_port *ap,
|
||||
unsigned long timeout_pat,
|
||||
|
@ -725,7 +755,7 @@ extern u8 ata_altstatus(struct ata_port *ap);
|
|||
extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
extern int ata_port_start (struct ata_port *ap);
|
||||
extern void ata_port_stop (struct ata_port *ap);
|
||||
extern void ata_host_stop (struct ata_host_set *host_set);
|
||||
extern void ata_host_stop (struct ata_host *host);
|
||||
extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
|
||||
extern void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
|
||||
unsigned int buflen, int write_data);
|
||||
|
@ -811,7 +841,7 @@ struct pci_bits {
|
|||
unsigned long val;
|
||||
};
|
||||
|
||||
extern void ata_pci_host_stop (struct ata_host_set *host_set);
|
||||
extern void ata_pci_host_stop (struct ata_host *host);
|
||||
extern struct ata_probe_ent *
|
||||
ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int portmask);
|
||||
extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue