mirror of
https://github.com/torvalds/linux.git
synced 2024-12-31 23:31:29 +00:00
ahci: move host flags over to pi.private_data
Private pi.flags area is full and we need more private flags. Move host private flags over to pi.private_data. During initialization, these flags are copied to hpriv->flags. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
7d50b60b5e
commit
417a1a6d3d
@ -169,14 +169,16 @@ enum {
|
|||||||
PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
|
PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
|
||||||
PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
|
PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
|
||||||
|
|
||||||
|
/* hpriv->flags bits */
|
||||||
|
AHCI_HFLAG_NO_NCQ = (1 << 0),
|
||||||
|
AHCI_HFLAG_IGN_IRQ_IF_ERR = (1 << 1), /* ignore IRQ_IF_ERR */
|
||||||
|
AHCI_HFLAG_IGN_SERR_INTERNAL = (1 << 2), /* ignore SERR_INTERNAL */
|
||||||
|
AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */
|
||||||
|
AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */
|
||||||
|
AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */
|
||||||
|
|
||||||
/* ap->flags bits */
|
/* ap->flags bits */
|
||||||
AHCI_FLAG_NO_NCQ = (1 << 24),
|
AHCI_FLAG_NO_HOTPLUG = (1 << 24), /* ignore PxSERR.DIAG.N */
|
||||||
AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */
|
|
||||||
AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */
|
|
||||||
AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */
|
|
||||||
AHCI_FLAG_MV_PATA = (1 << 29), /* PATA port */
|
|
||||||
AHCI_FLAG_NO_MSI = (1 << 30), /* no PCI MSI */
|
|
||||||
AHCI_FLAG_NO_HOTPLUG = (1 << 31), /* ignore PxSERR.DIAG.N */
|
|
||||||
|
|
||||||
AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
||||||
@ -200,6 +202,7 @@ struct ahci_sg {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ahci_host_priv {
|
struct ahci_host_priv {
|
||||||
|
unsigned int flags; /* AHCI_HFLAG_* */
|
||||||
u32 cap; /* cap to use */
|
u32 cap; /* cap to use */
|
||||||
u32 port_map; /* port map to use */
|
u32 port_map; /* port map to use */
|
||||||
u32 saved_cap; /* saved initial cap */
|
u32 saved_cap; /* saved initial cap */
|
||||||
@ -341,6 +344,8 @@ static const struct ata_port_operations ahci_vt8251_ops = {
|
|||||||
.port_stop = ahci_port_stop,
|
.port_stop = ahci_port_stop,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
|
||||||
|
|
||||||
static const struct ata_port_info ahci_port_info[] = {
|
static const struct ata_port_info ahci_port_info[] = {
|
||||||
/* board_ahci */
|
/* board_ahci */
|
||||||
{
|
{
|
||||||
@ -352,7 +357,8 @@ static const struct ata_port_info ahci_port_info[] = {
|
|||||||
},
|
},
|
||||||
/* board_ahci_vt8251 */
|
/* board_ahci_vt8251 */
|
||||||
{
|
{
|
||||||
.flags = AHCI_FLAG_COMMON | AHCI_FLAG_NO_NCQ,
|
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ),
|
||||||
|
.flags = AHCI_FLAG_COMMON,
|
||||||
.link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME,
|
.link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
@ -360,7 +366,8 @@ static const struct ata_port_info ahci_port_info[] = {
|
|||||||
},
|
},
|
||||||
/* board_ahci_ign_iferr */
|
/* board_ahci_ign_iferr */
|
||||||
{
|
{
|
||||||
.flags = AHCI_FLAG_COMMON | AHCI_FLAG_IGN_IRQ_IF_ERR,
|
AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
|
||||||
|
.flags = AHCI_FLAG_COMMON,
|
||||||
.link_flags = AHCI_LFLAG_COMMON,
|
.link_flags = AHCI_LFLAG_COMMON,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
@ -368,9 +375,9 @@ static const struct ata_port_info ahci_port_info[] = {
|
|||||||
},
|
},
|
||||||
/* board_ahci_sb600 */
|
/* board_ahci_sb600 */
|
||||||
{
|
{
|
||||||
.flags = AHCI_FLAG_COMMON |
|
AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
|
||||||
AHCI_FLAG_IGN_SERR_INTERNAL |
|
AHCI_HFLAG_32BIT_ONLY),
|
||||||
AHCI_FLAG_32BIT_ONLY,
|
.flags = AHCI_FLAG_COMMON,
|
||||||
.link_flags = AHCI_LFLAG_COMMON,
|
.link_flags = AHCI_LFLAG_COMMON,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
@ -378,11 +385,10 @@ static const struct ata_port_info ahci_port_info[] = {
|
|||||||
},
|
},
|
||||||
/* board_ahci_mv */
|
/* board_ahci_mv */
|
||||||
{
|
{
|
||||||
.sht = &ahci_sht,
|
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
|
||||||
|
AHCI_HFLAG_MV_PATA),
|
||||||
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
|
||||||
AHCI_FLAG_NO_NCQ | AHCI_FLAG_NO_MSI |
|
|
||||||
AHCI_FLAG_MV_PATA,
|
|
||||||
.link_flags = AHCI_LFLAG_COMMON,
|
.link_flags = AHCI_LFLAG_COMMON,
|
||||||
.pio_mask = 0x1f, /* pio0-4 */
|
.pio_mask = 0x1f, /* pio0-4 */
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
@ -534,7 +540,6 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
|
|||||||
/**
|
/**
|
||||||
* ahci_save_initial_config - Save and fixup initial config values
|
* ahci_save_initial_config - Save and fixup initial config values
|
||||||
* @pdev: target PCI device
|
* @pdev: target PCI device
|
||||||
* @pi: associated ATA port info
|
|
||||||
* @hpriv: host private area to store config values
|
* @hpriv: host private area to store config values
|
||||||
*
|
*
|
||||||
* Some registers containing configuration info might be setup by
|
* Some registers containing configuration info might be setup by
|
||||||
@ -548,7 +553,6 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
|
|||||||
* None.
|
* None.
|
||||||
*/
|
*/
|
||||||
static void ahci_save_initial_config(struct pci_dev *pdev,
|
static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
const struct ata_port_info *pi,
|
|
||||||
struct ahci_host_priv *hpriv)
|
struct ahci_host_priv *hpriv)
|
||||||
{
|
{
|
||||||
void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
||||||
@ -562,13 +566,13 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
|||||||
hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
|
hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
|
||||||
|
|
||||||
/* some chips have errata preventing 64bit use */
|
/* some chips have errata preventing 64bit use */
|
||||||
if ((cap & HOST_CAP_64) && (pi->flags & AHCI_FLAG_32BIT_ONLY)) {
|
if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) {
|
||||||
dev_printk(KERN_INFO, &pdev->dev,
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
"controller can't do 64bit DMA, forcing 32bit\n");
|
"controller can't do 64bit DMA, forcing 32bit\n");
|
||||||
cap &= ~HOST_CAP_64;
|
cap &= ~HOST_CAP_64;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cap & HOST_CAP_NCQ) && (pi->flags & AHCI_FLAG_NO_NCQ)) {
|
if ((cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_NO_NCQ)) {
|
||||||
dev_printk(KERN_INFO, &pdev->dev,
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
"controller can't do NCQ, turning off CAP_NCQ\n");
|
"controller can't do NCQ, turning off CAP_NCQ\n");
|
||||||
cap &= ~HOST_CAP_NCQ;
|
cap &= ~HOST_CAP_NCQ;
|
||||||
@ -579,7 +583,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
|||||||
* is asserted through the standard AHCI port
|
* is asserted through the standard AHCI port
|
||||||
* presence register, as bit 4 (counting from 0)
|
* presence register, as bit 4 (counting from 0)
|
||||||
*/
|
*/
|
||||||
if (pi->flags & AHCI_FLAG_MV_PATA) {
|
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
||||||
dev_printk(KERN_ERR, &pdev->dev,
|
dev_printk(KERN_ERR, &pdev->dev,
|
||||||
"MV_AHCI HACK: port_map %x -> %x\n",
|
"MV_AHCI HACK: port_map %x -> %x\n",
|
||||||
hpriv->port_map,
|
hpriv->port_map,
|
||||||
@ -919,13 +923,14 @@ static void ahci_port_init(struct pci_dev *pdev, struct ata_port *ap,
|
|||||||
|
|
||||||
static void ahci_init_controller(struct ata_host *host)
|
static void ahci_init_controller(struct ata_host *host)
|
||||||
{
|
{
|
||||||
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
struct pci_dev *pdev = to_pci_dev(host->dev);
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
||||||
void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
|
void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
|
||||||
int i;
|
int i;
|
||||||
void __iomem *port_mmio;
|
void __iomem *port_mmio;
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
if (host->ports[0]->flags & AHCI_FLAG_MV_PATA) {
|
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
||||||
port_mmio = __ahci_port_base(host, 4);
|
port_mmio = __ahci_port_base(host, 4);
|
||||||
|
|
||||||
writel(0, port_mmio + PORT_IRQ_MASK);
|
writel(0, port_mmio + PORT_IRQ_MASK);
|
||||||
@ -1307,6 +1312,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
|||||||
|
|
||||||
static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
||||||
{
|
{
|
||||||
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
struct ahci_port_priv *pp = ap->private_data;
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
struct ata_eh_info *host_ehi = &ap->link.eh_info;
|
struct ata_eh_info *host_ehi = &ap->link.eh_info;
|
||||||
struct ata_link *link = NULL;
|
struct ata_link *link = NULL;
|
||||||
@ -1334,7 +1340,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
|||||||
host_ehi->serror |= serror;
|
host_ehi->serror |= serror;
|
||||||
|
|
||||||
/* some controllers set IRQ_IF_ERR on device errors, ignore it */
|
/* some controllers set IRQ_IF_ERR on device errors, ignore it */
|
||||||
if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR)
|
if (hpriv->flags & AHCI_HFLAG_IGN_IRQ_IF_ERR)
|
||||||
irq_stat &= ~PORT_IRQ_IF_ERR;
|
irq_stat &= ~PORT_IRQ_IF_ERR;
|
||||||
|
|
||||||
if (irq_stat & PORT_IRQ_TF_ERR) {
|
if (irq_stat & PORT_IRQ_TF_ERR) {
|
||||||
@ -1347,7 +1353,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
|||||||
else
|
else
|
||||||
active_ehi->err_mask |= AC_ERR_DEV;
|
active_ehi->err_mask |= AC_ERR_DEV;
|
||||||
|
|
||||||
if (ap->flags & AHCI_FLAG_IGN_SERR_INTERNAL)
|
if (hpriv->flags & AHCI_HFLAG_IGN_SERR_INTERNAL)
|
||||||
host_ehi->serror &= ~SERR_INTERNAL;
|
host_ehi->serror &= ~SERR_INTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1977,15 +1983,16 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if ((pi.flags & AHCI_FLAG_NO_MSI) || pci_enable_msi(pdev))
|
|
||||||
pci_intx(pdev, 1);
|
|
||||||
|
|
||||||
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
|
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
|
||||||
if (!hpriv)
|
if (!hpriv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
hpriv->flags |= (unsigned long)pi.private_data;
|
||||||
|
|
||||||
|
if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev))
|
||||||
|
pci_intx(pdev, 1);
|
||||||
|
|
||||||
/* save initial config */
|
/* save initial config */
|
||||||
ahci_save_initial_config(pdev, &pi, hpriv);
|
ahci_save_initial_config(pdev, hpriv);
|
||||||
|
|
||||||
/* prepare host */
|
/* prepare host */
|
||||||
if (hpriv->cap & HOST_CAP_NCQ)
|
if (hpriv->cap & HOST_CAP_NCQ)
|
||||||
|
Loading…
Reference in New Issue
Block a user