pata_sis: Clean up using cable_detect methods
This changeset revolves around the fact that all the SiS controllers have the same enable bits, but differing cable detection methods. Previously that meant each type had its own error_handler methods. Instead we can now implement different ->cable_detect methods and share a single error_handler which does the filtering by enable bits. In addition we had some auto const arrays that should be static const. I'm not sure if gcc already treats them intelligently but adding the static will make sure. Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
307c6054ad
commit
2e413f510f
1 changed files with 60 additions and 111 deletions
|
@ -35,7 +35,7 @@
|
|||
#include "sis.h"
|
||||
|
||||
#define DRV_NAME "pata_sis"
|
||||
#define DRV_VERSION "0.5.0"
|
||||
#define DRV_VERSION "0.5.1"
|
||||
|
||||
struct sis_chipset {
|
||||
u16 device; /* PCI host ID */
|
||||
|
@ -86,14 +86,55 @@ static int sis_port_base(struct ata_device *adev)
|
|||
}
|
||||
|
||||
/**
|
||||
* sis_133_pre_reset - check for 40/80 pin
|
||||
* sis_133_cable_detect - check for 40/80 pin
|
||||
* @ap: Port
|
||||
*
|
||||
* Perform cable detection for the later UDMA133 capable
|
||||
* SiS chipset.
|
||||
*/
|
||||
|
||||
static int sis_133_pre_reset(struct ata_port *ap)
|
||||
static int sis_133_cable_detect(struct ata_port *ap)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u16 tmp;
|
||||
|
||||
/* The top bit of this register is the cable detect bit */
|
||||
pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
|
||||
if ((tmp & 0x8000) && !sis_short_ata40(pdev))
|
||||
return ATA_CBL_PATA40;
|
||||
return ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
/**
|
||||
* sis_66_cable_detect - check for 40/80 pin
|
||||
* @ap: Port
|
||||
*
|
||||
* Perform cable detection on the UDMA66, UDMA100 and early UDMA133
|
||||
* SiS IDE controllers.
|
||||
*/
|
||||
|
||||
static int sis_66_cable_detect(struct ata_port *ap)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u8 tmp;
|
||||
|
||||
/* Older chips keep cable detect in bits 4/5 of reg 0x48 */
|
||||
pci_read_config_byte(pdev, 0x48, &tmp);
|
||||
tmp >>= ap->port_no;
|
||||
if ((tmp & 0x10) && !sis_short_ata40(pdev))
|
||||
return ATA_CBL_PATA40;
|
||||
return ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sis_pre_reset - probe begin
|
||||
* @ap: ATA port
|
||||
*
|
||||
* Set up cable type and use generic probe init
|
||||
*/
|
||||
|
||||
static int sis_pre_reset(struct ata_port *ap)
|
||||
{
|
||||
static const struct pci_bits sis_enable_bits[] = {
|
||||
{ 0x4aU, 1U, 0x02UL, 0x02UL }, /* port 0 */
|
||||
|
@ -101,21 +142,13 @@ static int sis_133_pre_reset(struct ata_port *ap)
|
|||
};
|
||||
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u16 tmp;
|
||||
|
||||
if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no]))
|
||||
return -ENOENT;
|
||||
|
||||
/* The top bit of this register is the cable detect bit */
|
||||
pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
|
||||
if ((tmp & 0x8000) && !sis_short_ata40(pdev))
|
||||
ap->cbl = ATA_CBL_PATA40;
|
||||
else
|
||||
ap->cbl = ATA_CBL_PATA80;
|
||||
|
||||
return ata_std_prereset(ap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sis_error_handler - Probe specified port on PATA host controller
|
||||
* @ap: Port to probe
|
||||
|
@ -124,97 +157,9 @@ static int sis_133_pre_reset(struct ata_port *ap)
|
|||
* None (inherited from caller).
|
||||
*/
|
||||
|
||||
static void sis_133_error_handler(struct ata_port *ap)
|
||||
static void sis_error_handler(struct ata_port *ap)
|
||||
{
|
||||
ata_bmdma_drive_eh(ap, sis_133_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sis_66_pre_reset - check for 40/80 pin
|
||||
* @ap: Port
|
||||
*
|
||||
* Perform cable detection on the UDMA66, UDMA100 and early UDMA133
|
||||
* SiS IDE controllers.
|
||||
*/
|
||||
|
||||
static int sis_66_pre_reset(struct ata_port *ap)
|
||||
{
|
||||
static const struct pci_bits sis_enable_bits[] = {
|
||||
{ 0x4aU, 1U, 0x02UL, 0x02UL }, /* port 0 */
|
||||
{ 0x4aU, 1U, 0x04UL, 0x04UL }, /* port 1 */
|
||||
};
|
||||
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
u8 tmp;
|
||||
|
||||
if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no])) {
|
||||
ata_port_disable(ap);
|
||||
ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n");
|
||||
return 0;
|
||||
}
|
||||
/* Older chips keep cable detect in bits 4/5 of reg 0x48 */
|
||||
pci_read_config_byte(pdev, 0x48, &tmp);
|
||||
tmp >>= ap->port_no;
|
||||
if ((tmp & 0x10) && !sis_short_ata40(pdev))
|
||||
ap->cbl = ATA_CBL_PATA40;
|
||||
else
|
||||
ap->cbl = ATA_CBL_PATA80;
|
||||
|
||||
return ata_std_prereset(ap);
|
||||
}
|
||||
|
||||
/**
|
||||
* sis_66_error_handler - Probe specified port on PATA host controller
|
||||
* @ap: Port to probe
|
||||
* @classes:
|
||||
*
|
||||
* LOCKING:
|
||||
* None (inherited from caller).
|
||||
*/
|
||||
|
||||
static void sis_66_error_handler(struct ata_port *ap)
|
||||
{
|
||||
ata_bmdma_drive_eh(ap, sis_66_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
|
||||
}
|
||||
|
||||
/**
|
||||
* sis_old_pre_reset - probe begin
|
||||
* @ap: ATA port
|
||||
*
|
||||
* Set up cable type and use generic probe init
|
||||
*/
|
||||
|
||||
static int sis_old_pre_reset(struct ata_port *ap)
|
||||
{
|
||||
static const struct pci_bits sis_enable_bits[] = {
|
||||
{ 0x4aU, 1U, 0x02UL, 0x02UL }, /* port 0 */
|
||||
{ 0x4aU, 1U, 0x04UL, 0x04UL }, /* port 1 */
|
||||
};
|
||||
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
|
||||
if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no])) {
|
||||
ata_port_disable(ap);
|
||||
ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n");
|
||||
return 0;
|
||||
}
|
||||
ap->cbl = ATA_CBL_PATA40;
|
||||
return ata_std_prereset(ap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sis_old_error_handler - Probe specified port on PATA host controller
|
||||
* @ap: Port to probe
|
||||
*
|
||||
* LOCKING:
|
||||
* None (inherited from caller).
|
||||
*/
|
||||
|
||||
static void sis_old_error_handler(struct ata_port *ap)
|
||||
{
|
||||
ata_bmdma_drive_eh(ap, sis_old_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
|
||||
ata_bmdma_drive_eh(ap, sis_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -494,7 +439,7 @@ static void sis_133_early_set_dmamode (struct ata_port *ap, struct ata_device *a
|
|||
int drive_pci = sis_port_base(adev);
|
||||
u16 timing;
|
||||
|
||||
const u16 udma_bits[] = { 0x8F00, 0x8A00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100};
|
||||
static const u16 udma_bits[] = { 0x8F00, 0x8A00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100};
|
||||
|
||||
pci_read_config_word(pdev, drive_pci, &timing);
|
||||
|
||||
|
@ -531,8 +476,8 @@ static void sis_133_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
|||
u32 reg54;
|
||||
|
||||
/* bits 4- cycle time 8 - cvs time */
|
||||
const u32 timing_u100[] = { 0x6B0, 0x470, 0x350, 0x140, 0x120, 0x110, 0x000 };
|
||||
const u32 timing_u133[] = { 0x9F0, 0x6A0, 0x470, 0x250, 0x230, 0x220, 0x210 };
|
||||
static const u32 timing_u100[] = { 0x6B0, 0x470, 0x350, 0x140, 0x120, 0x110, 0x000 };
|
||||
static const u32 timing_u133[] = { 0x9F0, 0x6A0, 0x470, 0x250, 0x230, 0x220, 0x210 };
|
||||
|
||||
/* If bit 14 is set then the registers are mapped at 0x70 not 0x40 */
|
||||
pci_read_config_dword(pdev, 0x54, ®54);
|
||||
|
@ -595,8 +540,9 @@ static const struct ata_port_operations sis_133_ops = {
|
|||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = sis_133_error_handler,
|
||||
.error_handler = sis_error_handler,
|
||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||
.cable_detect = sis_133_cable_detect,
|
||||
|
||||
.bmdma_setup = ata_bmdma_setup,
|
||||
.bmdma_start = ata_bmdma_start,
|
||||
|
@ -628,8 +574,9 @@ static const struct ata_port_operations sis_133_early_ops = {
|
|||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = sis_66_error_handler,
|
||||
.error_handler = sis_error_handler,
|
||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||
.cable_detect = sis_66_cable_detect,
|
||||
|
||||
.bmdma_setup = ata_bmdma_setup,
|
||||
.bmdma_start = ata_bmdma_start,
|
||||
|
@ -661,9 +608,9 @@ static const struct ata_port_operations sis_100_ops = {
|
|||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = sis_66_error_handler,
|
||||
.error_handler = sis_error_handler,
|
||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||
|
||||
.cable_detect = sis_66_cable_detect,
|
||||
|
||||
.bmdma_setup = ata_bmdma_setup,
|
||||
.bmdma_start = ata_bmdma_start,
|
||||
|
@ -692,10 +639,11 @@ static const struct ata_port_operations sis_66_ops = {
|
|||
.check_status = ata_check_status,
|
||||
.exec_command = ata_exec_command,
|
||||
.dev_select = ata_std_dev_select,
|
||||
.cable_detect = sis_66_cable_detect,
|
||||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = sis_66_error_handler,
|
||||
.error_handler = sis_error_handler,
|
||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||
|
||||
.bmdma_setup = ata_bmdma_setup,
|
||||
|
@ -728,8 +676,9 @@ static const struct ata_port_operations sis_old_ops = {
|
|||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
.error_handler = sis_old_error_handler,
|
||||
.error_handler = sis_error_handler,
|
||||
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
||||
.cable_detect = ata_cable_40wire,
|
||||
|
||||
.bmdma_setup = ata_bmdma_setup,
|
||||
.bmdma_start = ata_bmdma_start,
|
||||
|
|
Loading…
Reference in a new issue