ahci: Factor out PCI specifics from ahci_save_initial_config()
Make ahci_save_initial_config() a bit more generic by introducing force_port_map and mask_port_map arguments. Move PCI stuff into ahci_pci_save_initial_config(). Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
d89933497d
commit
394d6e535f
|
@ -842,6 +842,8 @@ static ssize_t ahci_show_port_cmd(struct device *dev,
|
||||||
* 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
|
||||||
* @hpriv: host private area to store config values
|
* @hpriv: host private area to store config values
|
||||||
|
* @force_port_map: force port map to a specified value
|
||||||
|
* @mask_port_map: mask out particular bits from port map
|
||||||
*
|
*
|
||||||
* Some registers containing configuration info might be setup by
|
* Some registers containing configuration info might be setup by
|
||||||
* BIOS and might be cleared on reset. This function saves the
|
* BIOS and might be cleared on reset. This function saves the
|
||||||
|
@ -854,12 +856,13 @@ static ssize_t ahci_show_port_cmd(struct device *dev,
|
||||||
* None.
|
* None.
|
||||||
*/
|
*/
|
||||||
static void ahci_save_initial_config(struct pci_dev *pdev,
|
static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
struct ahci_host_priv *hpriv)
|
struct ahci_host_priv *hpriv,
|
||||||
|
unsigned int force_port_map,
|
||||||
|
unsigned int mask_port_map)
|
||||||
{
|
{
|
||||||
void __iomem *mmio = hpriv->mmio;
|
void __iomem *mmio = hpriv->mmio;
|
||||||
u32 cap, cap2, vers, port_map;
|
u32 cap, cap2, vers, port_map;
|
||||||
int i;
|
int i;
|
||||||
int mv;
|
|
||||||
|
|
||||||
/* make sure AHCI mode is enabled before accessing CAP */
|
/* make sure AHCI mode is enabled before accessing CAP */
|
||||||
ahci_enable_ahci(mmio);
|
ahci_enable_ahci(mmio);
|
||||||
|
@ -909,32 +912,19 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
cap &= ~HOST_CAP_SNTF;
|
cap &= ~HOST_CAP_SNTF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361 &&
|
if (force_port_map && port_map != force_port_map) {
|
||||||
port_map != 1) {
|
|
||||||
dev_printk(KERN_INFO, &pdev->dev,
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
"JMB361 has only one port, port_map 0x%x -> 0x%x\n",
|
"forcing port_map 0x%x -> 0x%x\n",
|
||||||
port_map, 1);
|
port_map, force_port_map);
|
||||||
port_map = 1;
|
port_map = force_port_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
if (mask_port_map) {
|
||||||
* Temporary Marvell 6145 hack: PATA port presence
|
|
||||||
* is asserted through the standard AHCI port
|
|
||||||
* presence register, as bit 4 (counting from 0)
|
|
||||||
*/
|
|
||||||
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
|
||||||
if (pdev->device == 0x6121)
|
|
||||||
mv = 0x3;
|
|
||||||
else
|
|
||||||
mv = 0xf;
|
|
||||||
dev_printk(KERN_ERR, &pdev->dev,
|
dev_printk(KERN_ERR, &pdev->dev,
|
||||||
"MV_AHCI HACK: port_map %x -> %x\n",
|
"masking port_map 0x%x -> 0x%x\n",
|
||||||
port_map,
|
port_map,
|
||||||
port_map & mv);
|
port_map & mask_port_map);
|
||||||
dev_printk(KERN_ERR, &pdev->dev,
|
port_map &= mask_port_map;
|
||||||
"Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
|
|
||||||
|
|
||||||
port_map &= mv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cross check port_map and cap.n_ports */
|
/* cross check port_map and cap.n_ports */
|
||||||
|
@ -973,6 +963,34 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
hpriv->port_map = port_map;
|
hpriv->port_map = port_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ahci_pci_save_initial_config(struct pci_dev *pdev,
|
||||||
|
struct ahci_host_priv *hpriv)
|
||||||
|
{
|
||||||
|
unsigned int force_port_map = 0;
|
||||||
|
unsigned int mask_port_map = 0;
|
||||||
|
|
||||||
|
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
|
||||||
|
dev_info(&pdev->dev, "JMB361 has only one port\n");
|
||||||
|
force_port_map = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Temporary Marvell 6145 hack: PATA port presence
|
||||||
|
* is asserted through the standard AHCI port
|
||||||
|
* presence register, as bit 4 (counting from 0)
|
||||||
|
*/
|
||||||
|
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
||||||
|
if (pdev->device == 0x6121)
|
||||||
|
mask_port_map = 0x3;
|
||||||
|
else
|
||||||
|
mask_port_map = 0xf;
|
||||||
|
dev_info(&pdev->dev,
|
||||||
|
"Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
ahci_save_initial_config(pdev, hpriv, force_port_map, mask_port_map);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ahci_restore_initial_config - Restore initial config
|
* ahci_restore_initial_config - Restore initial config
|
||||||
* @host: target ATA host
|
* @host: target ATA host
|
||||||
|
@ -3316,7 +3334,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
hpriv->mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
hpriv->mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
||||||
|
|
||||||
/* save initial config */
|
/* save initial config */
|
||||||
ahci_save_initial_config(pdev, hpriv);
|
ahci_pci_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