Commit 3c136f29 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  libata: ahci enclosure management bit mask
  libata: ahci enclosure management led sync
  pata_ninja32: suspend/resume support
  libata: Fix LBA48 on pata_it821x RAID volumes.
  libata: clear saved xfer_mode and ncq_enabled on device detach
  sata_sil24: configure max read request size to 4k
  libata: add missing kernel-doc
  libata: fix device iteration bugs
  ahci: Add support for Promise PDC42819
  ata: Switch all my stuff to a common address
parents 49fdf678 87943acf
...@@ -49,6 +49,17 @@ ...@@ -49,6 +49,17 @@
#define DRV_NAME "ahci" #define DRV_NAME "ahci"
#define DRV_VERSION "3.0" #define DRV_VERSION "3.0"
/* Enclosure Management Control */
#define EM_CTRL_MSG_TYPE 0x000f0000
/* Enclosure Management LED Message Type */
#define EM_MSG_LED_HBA_PORT 0x0000000f
#define EM_MSG_LED_PMP_SLOT 0x0000ff00
#define EM_MSG_LED_VALUE 0xffff0000
#define EM_MSG_LED_VALUE_ACTIVITY 0x00070000
#define EM_MSG_LED_VALUE_OFF 0xfff80000
#define EM_MSG_LED_VALUE_ON 0x00010000
static int ahci_skip_host_reset; static int ahci_skip_host_reset;
module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444); module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)"); MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
...@@ -588,6 +599,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { ...@@ -588,6 +599,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */ { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
/* Promise */
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
/* Generic, PCI class code for AHCI */ /* Generic, PCI class code for AHCI */
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci }, PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
...@@ -1220,18 +1234,20 @@ static void ahci_sw_activity_blink(unsigned long arg) ...@@ -1220,18 +1234,20 @@ static void ahci_sw_activity_blink(unsigned long arg)
struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
unsigned long led_message = emp->led_state; unsigned long led_message = emp->led_state;
u32 activity_led_state; u32 activity_led_state;
unsigned long flags;
led_message &= 0xffff0000; led_message &= EM_MSG_LED_VALUE;
led_message |= ap->port_no | (link->pmp << 8); led_message |= ap->port_no | (link->pmp << 8);
/* check to see if we've had activity. If so, /* check to see if we've had activity. If so,
* toggle state of LED and reset timer. If not, * toggle state of LED and reset timer. If not,
* turn LED to desired idle state. * turn LED to desired idle state.
*/ */
spin_lock_irqsave(ap->lock, flags);
if (emp->saved_activity != emp->activity) { if (emp->saved_activity != emp->activity) {
emp->saved_activity = emp->activity; emp->saved_activity = emp->activity;
/* get the current LED state */ /* get the current LED state */
activity_led_state = led_message & 0x00010000; activity_led_state = led_message & EM_MSG_LED_VALUE_ON;
if (activity_led_state) if (activity_led_state)
activity_led_state = 0; activity_led_state = 0;
...@@ -1239,17 +1255,18 @@ static void ahci_sw_activity_blink(unsigned long arg) ...@@ -1239,17 +1255,18 @@ static void ahci_sw_activity_blink(unsigned long arg)
activity_led_state = 1; activity_led_state = 1;
/* clear old state */ /* clear old state */
led_message &= 0xfff8ffff; led_message &= ~EM_MSG_LED_VALUE_ACTIVITY;
/* toggle state */ /* toggle state */
led_message |= (activity_led_state << 16); led_message |= (activity_led_state << 16);
mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100)); mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100));
} else { } else {
/* switch to idle */ /* switch to idle */
led_message &= 0xfff8ffff; led_message &= ~EM_MSG_LED_VALUE_ACTIVITY;
if (emp->blink_policy == BLINK_OFF) if (emp->blink_policy == BLINK_OFF)
led_message |= (1 << 16); led_message |= (1 << 16);
} }
spin_unlock_irqrestore(ap->lock, flags);
ahci_transmit_led_message(ap, led_message, 4); ahci_transmit_led_message(ap, led_message, 4);
} }
...@@ -1294,7 +1311,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state, ...@@ -1294,7 +1311,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
struct ahci_em_priv *emp; struct ahci_em_priv *emp;
/* get the slot number from the message */ /* get the slot number from the message */
pmp = (state & 0x0000ff00) >> 8; pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
if (pmp < MAX_SLOTS) if (pmp < MAX_SLOTS)
emp = &pp->em_priv[pmp]; emp = &pp->em_priv[pmp];
else else
...@@ -1319,7 +1336,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state, ...@@ -1319,7 +1336,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
message[0] |= (4 << 8); message[0] |= (4 << 8);
/* ignore 0:4 of byte zero, fill in port info yourself */ /* ignore 0:4 of byte zero, fill in port info yourself */
message[1] = ((state & 0xfffffff0) | ap->port_no); message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no);
/* write message to EM_LOC */ /* write message to EM_LOC */
writel(message[0], mmio + hpriv->em_loc); writel(message[0], mmio + hpriv->em_loc);
...@@ -1362,7 +1379,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf, ...@@ -1362,7 +1379,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
state = simple_strtoul(buf, NULL, 0); state = simple_strtoul(buf, NULL, 0);
/* get the slot number from the message */ /* get the slot number from the message */
pmp = (state & 0x0000ff00) >> 8; pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
if (pmp < MAX_SLOTS) if (pmp < MAX_SLOTS)
emp = &pp->em_priv[pmp]; emp = &pp->em_priv[pmp];
else else
...@@ -1373,7 +1390,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf, ...@@ -1373,7 +1390,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
* activity led through em_message * activity led through em_message
*/ */
if (emp->blink_policy) if (emp->blink_policy)
state &= 0xfff8ffff; state &= ~EM_MSG_LED_VALUE_ACTIVITY;
return ahci_transmit_led_message(ap, state, size); return ahci_transmit_led_message(ap, state, size);
} }
...@@ -1392,16 +1409,16 @@ static ssize_t ahci_activity_store(struct ata_device *dev, enum sw_activity val) ...@@ -1392,16 +1409,16 @@ static ssize_t ahci_activity_store(struct ata_device *dev, enum sw_activity val)
link->flags &= ~(ATA_LFLAG_SW_ACTIVITY); link->flags &= ~(ATA_LFLAG_SW_ACTIVITY);
/* set the LED to OFF */ /* set the LED to OFF */
port_led_state &= 0xfff80000; port_led_state &= EM_MSG_LED_VALUE_OFF;
port_led_state |= (ap->port_no | (link->pmp << 8)); port_led_state |= (ap->port_no | (link->pmp << 8));
ahci_transmit_led_message(ap, port_led_state, 4); ahci_transmit_led_message(ap, port_led_state, 4);
} else { } else {
link->flags |= ATA_LFLAG_SW_ACTIVITY; link->flags |= ATA_LFLAG_SW_ACTIVITY;
if (val == BLINK_OFF) { if (val == BLINK_OFF) {
/* set LED to ON for idle */ /* set LED to ON for idle */
port_led_state &= 0xfff80000; port_led_state &= EM_MSG_LED_VALUE_OFF;
port_led_state |= (ap->port_no | (link->pmp << 8)); port_led_state |= (ap->port_no | (link->pmp << 8));
port_led_state |= 0x00010000; /* check this */ port_led_state |= EM_MSG_LED_VALUE_ON; /* check this */
ahci_transmit_led_message(ap, port_led_state, 4); ahci_transmit_led_message(ap, port_led_state, 4);
} }
} }
...@@ -2612,7 +2629,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2612,7 +2629,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
u32 em_loc = readl(mmio + HOST_EM_LOC); u32 em_loc = readl(mmio + HOST_EM_LOC);
u32 em_ctl = readl(mmio + HOST_EM_CTL); u32 em_ctl = readl(mmio + HOST_EM_CTL);
messages = (em_ctl & 0x000f0000) >> 16; messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16;
/* we only support LED message type right now */ /* we only support LED message type right now */
if ((messages & 0x01) && (ahci_em_messages == 1)) { if ((messages & 0x01) && (ahci_em_messages == 1)) {
......
/* /*
* ata_generic.c - Generic PATA/SATA controller driver. * ata_generic.c - Generic PATA/SATA controller driver.
* Copyright 2005 Red Hat Inc <alan@redhat.com>, all rights reserved. * Copyright 2005 Red Hat Inc, all rights reserved.
* *
* Elements from ide/pci/generic.c * Elements from ide/pci/generic.c
* Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* *
* Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
* Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2003 Red Hat Inc <alan@redhat.com> * Copyright (C) 2003 Red Hat Inc
* *
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
......
...@@ -4156,29 +4156,33 @@ static int cable_is_40wire(struct ata_port *ap) ...@@ -4156,29 +4156,33 @@ static int cable_is_40wire(struct ata_port *ap)
struct ata_link *link; struct ata_link *link;
struct ata_device *dev; struct ata_device *dev;
/* If the controller thinks we are 40 wire, we are */ /* If the controller thinks we are 40 wire, we are. */
if (ap->cbl == ATA_CBL_PATA40) if (ap->cbl == ATA_CBL_PATA40)
return 1; return 1;
/* If the controller thinks we are 80 wire, we are */
/* If the controller thinks we are 80 wire, we are. */
if (ap->cbl == ATA_CBL_PATA80 || ap->cbl == ATA_CBL_SATA) if (ap->cbl == ATA_CBL_PATA80 || ap->cbl == ATA_CBL_SATA)
return 0; return 0;
/* If the system is known to be 40 wire short cable (eg laptop),
then we allow 80 wire modes even if the drive isn't sure */ /* If the system is known to be 40 wire short cable (eg
* laptop), then we allow 80 wire modes even if the drive
* isn't sure.
*/
if (ap->cbl == ATA_CBL_PATA40_SHORT) if (ap->cbl == ATA_CBL_PATA40_SHORT)
return 0; return 0;
/* If the controller doesn't know we scan
- Note: We look for all 40 wire detects at this point. /* If the controller doesn't know, we scan.
Any 80 wire detect is taken to be 80 wire cable *
because * Note: We look for all 40 wire detects at this point. Any
- In many setups only the one drive (slave if present) * 80 wire detect is taken to be 80 wire cable because
will give a valid detect * - in many setups only the one drive (slave if present) will
- If you have a non detect capable drive you don't * give a valid detect
want it to colour the choice * - if you have a non detect capable drive you don't want it
* to colour the choice
*/ */
ata_port_for_each_link(link, ap) { ata_port_for_each_link(link, ap) {
ata_link_for_each_dev(dev, link) { ata_link_for_each_dev(dev, link) {
if (!ata_is_40wire(dev)) if (ata_dev_enabled(dev) && !ata_is_40wire(dev))
return 0; return 0;
} }
} }
...@@ -4553,6 +4557,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) ...@@ -4553,6 +4557,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
/** /**
* ata_qc_new_init - Request an available ATA command, and initialize it * ata_qc_new_init - Request an available ATA command, and initialize it
* @dev: Device from whom we request an available command structure * @dev: Device from whom we request an available command structure
* @tag: command tag
* *
* LOCKING: * LOCKING:
* None. * None.
......
...@@ -603,6 +603,9 @@ void ata_scsi_error(struct Scsi_Host *host) ...@@ -603,6 +603,9 @@ void ata_scsi_error(struct Scsi_Host *host)
ata_link_for_each_dev(dev, link) { ata_link_for_each_dev(dev, link) {
int devno = dev->devno; int devno = dev->devno;
if (!ata_dev_enabled(dev))
continue;
ehc->saved_xfer_mode[devno] = dev->xfer_mode; ehc->saved_xfer_mode[devno] = dev->xfer_mode;
if (ata_ncq_enabled(dev)) if (ata_ncq_enabled(dev))
ehc->saved_ncq_enabled |= 1 << devno; ehc->saved_ncq_enabled |= 1 << devno;
...@@ -1161,6 +1164,7 @@ void ata_eh_detach_dev(struct ata_device *dev) ...@@ -1161,6 +1164,7 @@ void ata_eh_detach_dev(struct ata_device *dev)
{ {
struct ata_link *link = dev->link; struct ata_link *link = dev->link;
struct ata_port *ap = link->ap; struct ata_port *ap = link->ap;
struct ata_eh_context *ehc = &link->eh_context;
unsigned long flags; unsigned long flags;
ata_dev_disable(dev); ata_dev_disable(dev);
...@@ -1174,9 +1178,11 @@ void ata_eh_detach_dev(struct ata_device *dev) ...@@ -1174,9 +1178,11 @@ void ata_eh_detach_dev(struct ata_device *dev)
ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
} }
/* clear per-dev EH actions */ /* clear per-dev EH info */
ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK); ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK);
ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK); ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK);
ehc->saved_xfer_mode[dev->devno] = 0;
ehc->saved_ncq_enabled &= ~(1 << dev->devno);
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
} }
...@@ -2787,6 +2793,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) ...@@ -2787,6 +2793,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
/* if data transfer is verified, clear DUBIOUS_XFER on ering top */ /* if data transfer is verified, clear DUBIOUS_XFER on ering top */
ata_link_for_each_dev(dev, link) { ata_link_for_each_dev(dev, link) {
if (!ata_dev_enabled(dev))
continue;
if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) { if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) {
struct ata_ering_entry *ent; struct ata_ering_entry *ent;
...@@ -2808,6 +2817,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) ...@@ -2808,6 +2817,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno]; u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno];
u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno)); u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno));
if (!ata_dev_enabled(dev))
continue;
if (dev->xfer_mode != saved_xfer_mode || if (dev->xfer_mode != saved_xfer_mode ||
ata_ncq_enabled(dev) != saved_ncq) ata_ncq_enabled(dev) != saved_ncq)
dev->flags |= ATA_DFLAG_DUBIOUS_XFER; dev->flags |= ATA_DFLAG_DUBIOUS_XFER;
......
/* /*
* ACPI PATA driver * ACPI PATA driver
* *
* (c) 2007 Red Hat <alan@redhat.com> * (c) 2007 Red Hat
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* pata_ali.c - ALI 15x3 PATA for new ATA layer * pata_ali.c - ALI 15x3 PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* based in part upon * based in part upon
* linux/drivers/ide/pci/alim15x3.c Version 0.17 2003/01/02 * linux/drivers/ide/pci/alim15x3.c Version 0.17 2003/01/02
......
/* /*
* pata_amd.c - AMD PATA for new ATA layer * pata_amd.c - AMD PATA for new ATA layer
* (C) 2005-2006 Red Hat Inc * (C) 2005-2006 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Based on pata-sil680. Errata information is taken from data sheets * Based on pata-sil680. Errata information is taken from data sheets
* and the amd74xx.c driver by Vojtech Pavlik. Nvidia SATA devices are * and the amd74xx.c driver by Vojtech Pavlik. Nvidia SATA devices are
......
/* /*
* pata_artop.c - ARTOP ATA controller driver * pata_artop.c - ARTOP ATA controller driver
* *
* (C) 2006 Red Hat <alan@redhat.com> * (C) 2006 Red Hat
* (C) 2007 Bartlomiej Zolnierkiewicz * (C) 2007 Bartlomiej Zolnierkiewicz
* *
* Based in part on drivers/ide/pci/aec62xx.c * Based in part on drivers/ide/pci/aec62xx.c
......
/* /*
* pata_atiixp.c - ATI PATA for new ATA layer * pata_atiixp.c - ATI PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Based on * Based on
* *
......
/* /*
* pata_cmd640.c - CMD640 PCI PATA for new ATA layer * pata_cmd640.c - CMD640 PCI PATA for new ATA layer
* (C) 2007 Red Hat Inc * (C) 2007 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Based upon * Based upon
* linux/drivers/ide/pci/cmd640.c Version 1.02 Sep 01, 1996 * linux/drivers/ide/pci/cmd640.c Version 1.02 Sep 01, 1996
......
/* /*
* pata_cmd64x.c - CMD64x PATA for new ATA layer * pata_cmd64x.c - CMD64x PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* Based upon * Based upon
* linux/drivers/ide/pci/cmd64x.c Version 1.30 Sept 10, 2002 * linux/drivers/ide/pci/cmd64x.c Version 1.30 Sept 10, 2002
......
/* /*
* pata-cs5530.c - CS5530 PATA for new ATA layer * pata-cs5530.c - CS5530 PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* based upon cs5530.c by Mark Lord. * based upon cs5530.c by Mark Lord.
* *
......
/* /*
* pata-cs5535.c - CS5535 PATA for new ATA layer * pata-cs5535.c - CS5535 PATA for new ATA layer
* (C) 2005-2006 Red Hat Inc * (C) 2005-2006 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* based upon cs5535.c from AMD <Jens.Altmann@amd.com> as cleaned up and * based upon cs5535.c from AMD <Jens.Altmann@amd.com> as cleaned up and
* made readable and Linux style by Wolfgang Zuleger <wolfgang.zuleger@gmx.de * made readable and Linux style by Wolfgang Zuleger <wolfgang.zuleger@gmx.de
......
/* /*
* pata_cypress.c - Cypress PATA for new ATA layer * pata_cypress.c - Cypress PATA for new ATA layer
* (C) 2006 Red Hat Inc * (C) 2006 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox
* *
* Based heavily on * Based heavily on
* linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002 * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002
......
/* /*
* pata_efar.c - EFAR PIIX clone controller driver * pata_efar.c - EFAR PIIX clone controller driver
* *
* (C) 2005 Red Hat <alan@redhat.com> * (C) 2005 Red Hat
* *
* Some parts based on ata_piix.c by Jeff Garzik and others. * Some parts based on ata_piix.c by Jeff Garzik and others.
* *
......
/* /*
* pata-isapnp.c - ISA PnP PATA controller driver. * pata-isapnp.c - ISA PnP PATA controller driver.
* Copyright 2005/2006 Red Hat Inc <alan@redhat.com>, all rights reserved. * Copyright 2005/2006 Red Hat Inc, all rights reserved.
* *
* Based in part on ide-pnp.c by Andrey Panin <pazke@donpac.ru> * Based in part on ide-pnp.c by Andrey Panin <pazke@donpac.ru>
*/ */
......
/* /*
* pata_it821x.c - IT821x PATA for new ATA layer * pata_it821x.c - IT821x PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* (C) 2007 Bartlomiej Zolnierkiewicz * (C) 2007 Bartlomiej Zolnierkiewicz
* *
* based upon * based upon
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* linux/drivers/ide/pci/it821x.c Version 0.09 December 2004 * linux/drivers/ide/pci/it821x.c Version 0.09 December 2004
* *
* Copyright (C) 2004 Red Hat <alan@redhat.com> * Copyright (C) 2004 Red Hat
* *
* May be copied or modified under the terms of the GNU General Public License * May be copied or modified under the terms of the GNU General Public License
* Based in part on the ITE vendor provided SCSI driver. * Based in part on the ITE vendor provided SCSI driver.
...@@ -557,9 +557,8 @@ static unsigned int it821x_read_id(struct ata_device *adev, ...@@ -557,9 +557,8 @@ static unsigned int it821x_read_id(struct ata_device *adev,
if (strstr(model_num, "Integrated Technology Express")) { if (strstr(model_num, "Integrated Technology Express")) {
/* Set feature bits the firmware neglects */ /* Set feature bits the firmware neglects */
id[49] |= 0x0300; /* LBA, DMA */ id[49] |= 0x0300; /* LBA, DMA */
id[82] |= 0x0400; /* LBA48 */
id[83] &= 0x7FFF; id[83] &= 0x7FFF;
id[83] |= 0x4000; /* Word 83 is valid */ id[83] |= 0x4400; /* Word 83 is valid and LBA48 */
id[86] |= 0x0400; /* LBA48 on */ id[86] |= 0x0400; /* LBA48 on */
id[ATA_ID_MAJOR_VER] |= 0x1F; id[ATA_ID_MAJOR_VER] |= 0x1F;
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* driven by AHCI in the usual configuration although * driven by AHCI in the usual configuration although
* this driver can handle other setups if we need it. * this driver can handle other setups if we need it.
* *
* (c) 2006 Red Hat <alan@redhat.com> * (c) 2006 Red Hat
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* pata-legacy.c - Legacy port PATA/SATA controller driver. * pata-legacy.c - Legacy port PATA/SATA controller driver.
* Copyright 2005/2006 Red Hat <alan@redhat.com>, all rights reserved. * Copyright 2005/2006 Red Hat, all rights reserved.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* isn't making full use of the device functionality but it is * isn't making full use of the device functionality but it is
* easy to get working. * easy to get working.
* *
* (c) 2006 Red Hat <alan@redhat.com> * (c) 2006 Red Hat
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* pata_mpiix.c - Intel MPIIX PATA for new ATA layer * pata_mpiix.c - Intel MPIIX PATA for new ATA layer
* (C) 2005-2006 Red Hat Inc * (C) 2005-2006 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* The MPIIX is different enough to the PIIX4 and friends that we give it * The MPIIX is different enough to the PIIX4 and friends that we give it
* a separate driver. The old ide/pci code handles this by just not tuning * a separate driver. The old ide/pci code handles this by just not tuning
......
/* /*
* pata_netcell.c - Netcell PATA driver * pata_netcell.c - Netcell PATA driver
* *
* (c) 2006 Red Hat <alan@redhat.com> * (c) 2006 Red Hat
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* pata_ninja32.c - Ninja32 PATA for new ATA layer * pata_ninja32.c - Ninja32 PATA for new ATA layer
* (C) 2007 Red Hat Inc * (C) 2007 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Note: The controller like many controllers has shared timings for * Note: The controller like many controllers has shared timings for
* PIO and DMA. We thus flip to the DMA timings in dma_start and flip back * PIO and DMA. We thus flip to the DMA timings in dma_start and flip back
...@@ -45,7 +44,7 @@ ...@@ -45,7 +44,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_ninja32" #define DRV_NAME "pata_ninja32"
#define DRV_VERSION "0.0.1" #define DRV_VERSION "0.1.1"
/** /**
...@@ -89,6 +88,17 @@ static struct ata_port_operations ninja32_port_ops = { ...@@ -89,6 +88,17 @@ static struct ata_port_operations ninja32_port_ops = {
.set_piomode = ninja32_set_piomode, .set_piomode = ninja32_set_piomode,
}; };
static void ninja32_program(void __iomem *base)
{
iowrite8(0x05, base + 0x01); /* Enable interrupt lines */
iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */
iowrite8(0x01, base + 0x03); /* Unknown */
iowrite8(0x20, base + 0x04); /* WAIT0 */
iowrite8(0x8f, base + 0x05); /* Unknown */
iowrite8(0xa4, base + 0x1c); /* Unknown */
iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */
}
static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
struct ata_host *host; struct ata_host *host;
...@@ -134,18 +144,28 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -134,18 +144,28 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
ap->ioaddr.bmdma_addr = base; ap->ioaddr.bmdma_addr = base;
ata_sff_std_ports(&ap->ioaddr); ata_sff_std_ports(&ap->ioaddr);
iowrite8(0x05, base + 0x01); /* Enable interrupt lines */ ninja32_program(base);
iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */
iowrite8(0x01, base + 0x03); /* Unknown */
iowrite8(0x20, base + 0x04); /* WAIT0 */
iowrite8(0x8f, base + 0x05); /* Unknown */
iowrite8(0xa4, base + 0x1c); /* Unknown */
iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */
/* FIXME: Should we disable them at remove ? */ /* FIXME: Should we disable them at remove ? */
return ata_host_activate(host, dev->irq, ata_sff_interrupt, return ata_host_activate(host, dev->irq, ata_sff_interrupt,
IRQF_SHARED, &ninja32_sht); IRQF_SHARED, &ninja32_sht);
} }
#ifdef CONFIG_PM
static int ninja32_reinit_one(struct pci_dev *pdev)
{
struct ata_host *host = dev_get_drvdata(&pdev->dev);
int rc;
rc = ata_pci_device_do_resume(pdev);
if (rc)
return rc;
ninja32_program(host->iomap[0]);
ata_host_resume(host);
return 0;
}
#endif
static const struct pci_device_id ninja32[] = { static const struct pci_device_id ninja32[] = {
{ 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
...@@ -156,7 +176,11 @@ static struct pci_driver ninja32_pci_driver = { ...@@ -156,7 +176,11 @@ static struct pci_driver ninja32_pci_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.id_table = ninja32, .id_table = ninja32,
.probe = ninja32_init_one, .probe = ninja32_init_one,
.remove = ata_pci_remove_one .remove = ata_pci_remove_one,
#ifdef CONFIG_PM
.suspend = ata_pci_device_suspend,
.resume = ninja32_reinit_one,
#endif
}; };
static int __init ninja32_init(void) static int __init ninja32_init(void)
......
/* /*
* pata_ns87410.c - National Semiconductor 87410 PATA for new ATA layer * pata_ns87410.c - National Semiconductor 87410 PATA for new ATA layer
* (C) 2006 Red Hat Inc * (C) 2006 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
......
/* /*
* pata_ns87415.c - NS87415 (non PARISC) PATA * pata_ns87415.c - NS87415 (non PARISC) PATA
* *
* (C) 2005 Red Hat <alan@redhat.com> * (C) 2005 Red Hat <alan@lxorguk.ukuu.org.uk>
* *
* This is a fairly generic MWDMA controller. It has some limitations * This is a fairly generic MWDMA controller. It has some limitations
* as it requires timing reloads on PIO/DMA transitions but it is otherwise * as it requires timing reloads on PIO/DMA transitions but it is otherwise
......
/* /*
* pata_oldpiix.c - Intel PATA/SATA controllers * pata_oldpiix.c - Intel PATA/SATA controllers
* *
* (C) 2005 Red Hat <alan@redhat.com> * (C) 2005 Red Hat
* *
* Some parts based on ata_piix.c by Jeff Garzik and others. * Some parts based on ata_piix.c by Jeff Garzik and others.
* *
......
/* /*
* pata_opti.c - ATI PATA for new ATA layer * pata_opti.c - ATI PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Based on * Based on
* linux/drivers/ide/pci/opti621.c Version 0.7 Sept 10, 2002 * linux/drivers/ide/pci/opti621.c Version 0.7 Sept 10, 2002
......
/* /*
* pata_optidma.c - Opti DMA PATA for new ATA layer * pata_optidma.c - Opti DMA PATA for new ATA layer
* (C) 2006 Red Hat Inc * (C) 2006 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* The Opti DMA controllers are related to the older PIO PCI controllers * The Opti DMA controllers are related to the older PIO PCI controllers
* and indeed the VLB ones. The main differences are that the timing * and indeed the VLB ones. The main differences are that the timing
......
/* /*
* pata_pcmcia.c - PCMCIA PATA controller driver. * pata_pcmcia.c - PCMCIA PATA controller driver.
* Copyright 2005-2006 Red Hat Inc <alan@redhat.com>, all rights reserved. * Copyright 2005-2006 Red Hat Inc, all rights reserved.
* PCMCIA ident update Copyright 2006 Marcin Juszkiewicz * PCMCIA ident update Copyright 2006 Marcin Juszkiewicz
* <openembedded@hrw.one.pl> * <openembedded@hrw.one.pl>
* *
......
/* /*
* pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer * pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* (C) 2007 Bartlomiej Zolnierkiewicz * (C) 2007 Bartlomiej Zolnierkiewicz
* *
* Based in part on linux/drivers/ide/pci/pdc202xx_old.c * Based in part on linux/drivers/ide/pci/pdc202xx_old.c
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Based on pata_pcmcia: * Based on pata_pcmcia:
* *
* Copyright 2005-2006 Red Hat Inc <alan@redhat.com>, all rights reserved. * Copyright 2005-2006 Red Hat Inc, all rights reserved.
* *
* This file is subject to the terms and conditions of the GNU General Public * This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive * License. See the file "COPYING" in the main directory of this archive
......
/* /*
* pata_qdi.c - QDI VLB ATA controllers * pata_qdi.c - QDI VLB ATA controllers
* (C) 2006 Red Hat <alan@redhat.com> * (C) 2006 Red Hat
* *
* This driver mostly exists as a proof of concept for non PCI devices under * This driver mostly exists as a proof of concept for non PCI devices under
* libata. While the QDI6580 was 'neat' in 1993 it is no longer terribly * libata. While the QDI6580 was 'neat' in 1993 it is no longer terribly
......
/* /*
* pata_radisys.c - Intel PATA/SATA controllers * pata_radisys.c - Intel PATA/SATA controllers
* *
* (C) 2006 Red Hat <alan@redhat.com> * (C) 2006 Red Hat <alan@lxorguk.ukuu.org.uk>
* *
* Some parts based on ata_piix.c by Jeff Garzik and others. * Some parts based on ata_piix.c by Jeff Garzik and others.
* *
......
/* /*
* New ATA layer SC1200 driver Alan Cox <alan@redhat.com> * New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* TODO: Mode selection filtering * TODO: Mode selection filtering
* TODO: Can't enable second channel until ATA core has serialize * TODO: Can't enable second channel until ATA core has serialize
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Copyright 2003-2005 Jeff Garzik * Copyright 2003-2005 Jeff Garzik
* Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
* Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2003 Red Hat Inc <alan@redhat.com> * Copyright (C) 2003 Red Hat Inc
* *
* and drivers/ata/ahci.c: * and drivers/ata/ahci.c:
* Copyright 2004-2005 Red Hat, Inc. * Copyright 2004-2005 Red Hat, Inc.
......
/* /*
* pata_serverworks.c - Serverworks PATA for new ATA layer * pata_serverworks.c - Serverworks PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* based upon * based upon
* *
......
/* /*
* pata_sil680.c - SIL680 PATA for new ATA layer * pata_sil680.c - SIL680 PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* based upon * based upon
* *
......
/* /*
* pata_sis.c - SiS ATA driver * pata_sis.c - SiS ATA driver
* *
* (C) 2005 Red Hat <alan@redhat.com> * (C) 2005 Red Hat
* (C) 2007 Bartlomiej Zolnierkiewicz * (C) 2007 Bartlomiej Zolnierkiewicz
* *
* Based upon linux/drivers/ide/pci/sis5513.c * Based upon linux/drivers/ide/pci/sis5513.c
......
/* /*
* pata_sl82c105.c - SL82C105 PATA for new ATA layer * pata_sl82c105.c - SL82C105 PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Based in part on linux/drivers/ide/pci/sl82c105.c * Based in part on linux/drivers/ide/pci/sl82c105.c
* SL82C105/Winbond 553 IDE driver * SL82C105/Winbond 553 IDE driver
......
/* /*
* pata_triflex.c - Compaq PATA for new ATA layer * pata_triflex.c - Compaq PATA for new ATA layer
* (C) 2005 Red Hat Inc * (C) 2005 Red Hat Inc
* Alan Cox <alan@redhat.com> * Alan Cox <alan@lxorguk.ukuu.org.uk>
* *
* based upon * based upon
* *
......
/* /*
* pata_via.c - VIA PATA for new ATA layer * pata_via.c - VIA PATA for new ATA layer
* (C) 2005-2006 Red Hat Inc * (C) 2005-2006 Red Hat Inc
* Alan Cox <alan@redhat.com>
* *
* Documentation * Documentation
* Most chipset documentation available under NDA only * Most chipset documentation available under NDA only
......
/* /*
* pata_winbond.c - Winbond VLB ATA controllers * pata_winbond.c - Winbond VLB ATA controllers
* (C) 2006 Red Hat <alan@redhat.com> * (C) 2006 Red Hat
* *
* Support for the Winbond 83759A when operating in advanced mode. * Support for the Winbond 83759A when operating in advanced mode.
* Multichip mode is not currently supported. * Multichip mode is not currently supported.
......
...@@ -1329,6 +1329,11 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1329,6 +1329,11 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
} }
/* Set max read request size to 4096. This slightly increases
* write throughput for pci-e variants.
*/
pcie_set_readrq(pdev, 4096);
sil24_init_controller(host); sil24_init_controller(host);
pci_set_master(pdev); pci_set_master(pdev);
......
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