ahci: Introduce ahci_set_em_messages()
Factor out some ahci_em_messages handling code from ahci_init_one(). We would like to reuse it for non-PCI devices. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
committed by
Jeff Garzik
parent
439fcaec10
commit
0cbb0e774b
@@ -3270,6 +3270,29 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host)
|
|||||||
{}
|
{}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void ahci_set_em_messages(struct ahci_host_priv *hpriv,
|
||||||
|
struct ata_port_info *pi)
|
||||||
|
{
|
||||||
|
u8 messages;
|
||||||
|
void __iomem *mmio = hpriv->mmio;
|
||||||
|
u32 em_loc = readl(mmio + HOST_EM_LOC);
|
||||||
|
u32 em_ctl = readl(mmio + HOST_EM_CTL);
|
||||||
|
|
||||||
|
if (!ahci_em_messages || !(hpriv->cap & HOST_CAP_EMS))
|
||||||
|
return;
|
||||||
|
|
||||||
|
messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16;
|
||||||
|
|
||||||
|
/* we only support LED message type right now */
|
||||||
|
if ((messages & 0x01) && (ahci_em_messages == 1)) {
|
||||||
|
/* store em_loc */
|
||||||
|
hpriv->em_loc = ((em_loc >> 16) * 4);
|
||||||
|
pi->flags |= ATA_FLAG_EM;
|
||||||
|
if (!(em_ctl & EM_CTL_ALHD))
|
||||||
|
pi->flags |= ATA_FLAG_SW_ACTIVITY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
{
|
{
|
||||||
static int printed_version;
|
static int printed_version;
|
||||||
@@ -3373,23 +3396,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
if (hpriv->cap & HOST_CAP_PMP)
|
if (hpriv->cap & HOST_CAP_PMP)
|
||||||
pi.flags |= ATA_FLAG_PMP;
|
pi.flags |= ATA_FLAG_PMP;
|
||||||
|
|
||||||
if (ahci_em_messages && (hpriv->cap & HOST_CAP_EMS)) {
|
ahci_set_em_messages(hpriv, &pi);
|
||||||
u8 messages;
|
|
||||||
void __iomem *mmio = hpriv->mmio;
|
|
||||||
u32 em_loc = readl(mmio + HOST_EM_LOC);
|
|
||||||
u32 em_ctl = readl(mmio + HOST_EM_CTL);
|
|
||||||
|
|
||||||
messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16;
|
|
||||||
|
|
||||||
/* we only support LED message type right now */
|
|
||||||
if ((messages & 0x01) && (ahci_em_messages == 1)) {
|
|
||||||
/* store em_loc */
|
|
||||||
hpriv->em_loc = ((em_loc >> 16) * 4);
|
|
||||||
pi.flags |= ATA_FLAG_EM;
|
|
||||||
if (!(em_ctl & EM_CTL_ALHD))
|
|
||||||
pi.flags |= ATA_FLAG_SW_ACTIVITY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ahci_broken_system_poweroff(pdev)) {
|
if (ahci_broken_system_poweroff(pdev)) {
|
||||||
pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
|
pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
|
||||||
|
Reference in New Issue
Block a user