提交 c961922b 编写于 作者: A Alan Cox 提交者: Jeff Garzik

[PATCH] libata-eh: Remove layering violation and duplication when handling absent ports

This removes the layering violation where drivers have to fiddle
directly with EH flags. Instead we now recognize -ENOENT means "no port"
and do the handling in the core code.

This also removes an instance of a call to disable the port, and an
identical printk from each driver doing this. Even better - future rule
changes will be in one place only.
Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NJeff Garzik <jeff@garzik.org>
上级 4735ebed
...@@ -643,11 +643,9 @@ static int piix_pata_prereset(struct ata_port *ap) ...@@ -643,11 +643,9 @@ static int piix_pata_prereset(struct ata_port *ap)
{ {
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no]))
ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n"); return -ENOENT;
ap->eh_context.i.action &= ~ATA_EH_RESET_MASK;
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -1515,7 +1515,11 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1515,7 +1515,11 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
if (prereset) { if (prereset) {
rc = prereset(ap); rc = prereset(ap);
if (rc) { if (rc) {
ata_port_printk(ap, KERN_ERR, if (rc == -ENOENT) {
ata_port_printk(ap, KERN_DEBUG, "port disabled. ignoring.\n");
ap->eh_context.i.action &= ~ATA_EH_RESET_MASK;
} else
ata_port_printk(ap, KERN_ERR,
"prereset failed (errno=%d)\n", rc); "prereset failed (errno=%d)\n", rc);
return rc; return rc;
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_amd" #define DRV_NAME "pata_amd"
#define DRV_VERSION "0.2.3" #define DRV_VERSION "0.2.4"
/** /**
* timing_setup - shared timing computation and load * timing_setup - shared timing computation and load
...@@ -137,11 +137,8 @@ static int amd_pre_reset(struct ata_port *ap) ...@@ -137,11 +137,8 @@ static int amd_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u8 ata66; u8 ata66;
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
pci_read_config_byte(pdev, 0x42, &ata66); pci_read_config_byte(pdev, 0x42, &ata66);
if (ata66 & bitmask[ap->port_no]) if (ata66 & bitmask[ap->port_no])
...@@ -167,11 +164,9 @@ static int amd_early_pre_reset(struct ata_port *ap) ...@@ -167,11 +164,9 @@ static int amd_early_pre_reset(struct ata_port *ap)
{ 0x40, 1, 0x01, 0x01 } { 0x40, 1, 0x01, 0x01 }
}; };
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
/* No host side cable detection */ /* No host side cable detection */
ap->cbl = ATA_CBL_PATA80; ap->cbl = ATA_CBL_PATA80;
return ata_std_prereset(ap); return ata_std_prereset(ap);
...@@ -262,12 +257,8 @@ static int nv_pre_reset(struct ata_port *ap) { ...@@ -262,12 +257,8 @@ static int nv_pre_reset(struct ata_port *ap) {
u8 ata66; u8 ata66;
u16 udma; u16 udma;
if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
pci_read_config_byte(pdev, 0x52, &ata66); pci_read_config_byte(pdev, 0x52, &ata66);
if (ata66 & bitmask[ap->port_no]) if (ata66 & bitmask[ap->port_no])
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <linux/ata.h> #include <linux/ata.h>
#define DRV_NAME "pata_artop" #define DRV_NAME "pata_artop"
#define DRV_VERSION "0.4.1" #define DRV_VERSION "0.4.2"
/* /*
* The ARTOP has 33 Mhz and "over clocked" timing tables. Until we * The ARTOP has 33 Mhz and "over clocked" timing tables. Until we
...@@ -47,11 +47,9 @@ static int artop6210_pre_reset(struct ata_port *ap) ...@@ -47,11 +47,9 @@ static int artop6210_pre_reset(struct ata_port *ap)
{ 0x4AU, 1U, 0x04UL, 0x04UL }, /* port 1 */ { 0x4AU, 1U, 0x04UL, 0x04UL }, /* port 1 */
}; };
if (!pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
...@@ -90,11 +88,9 @@ static int artop6260_pre_reset(struct ata_port *ap) ...@@ -90,11 +88,9 @@ static int artop6260_pre_reset(struct ata_port *ap)
u8 tmp; u8 tmp;
/* Odd numbered device ids are the units with enable bits (the -R cards) */ /* Odd numbered device ids are the units with enable bits (the -R cards) */
if (pdev->device % 1 && !pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no])) { if (pdev->device % 1 && !pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
pci_read_config_byte(pdev, 0x49, &tmp); pci_read_config_byte(pdev, 0x49, &tmp);
if (tmp & (1 >> ap->port_no)) if (tmp & (1 >> ap->port_no))
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_atiixp" #define DRV_NAME "pata_atiixp"
#define DRV_VERSION "0.4.2" #define DRV_VERSION "0.4.3"
enum { enum {
ATIIXP_IDE_PIO_TIMING = 0x40, ATIIXP_IDE_PIO_TIMING = 0x40,
...@@ -41,11 +41,9 @@ static int atiixp_pre_reset(struct ata_port *ap) ...@@ -41,11 +41,9 @@ static int atiixp_pre_reset(struct ata_port *ap)
{ 0x48, 1, 0x08, 0x00 } { 0x48, 1, 0x08, 0x00 }
}; };
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA80; ap->cbl = ATA_CBL_PATA80;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <linux/ata.h> #include <linux/ata.h>
#define DRV_NAME "pata_efar" #define DRV_NAME "pata_efar"
#define DRV_VERSION "0.4.1" #define DRV_VERSION "0.4.2"
/** /**
* efar_pre_reset - check for 40/80 pin * efar_pre_reset - check for 40/80 pin
...@@ -42,11 +42,9 @@ static int efar_pre_reset(struct ata_port *ap) ...@@ -42,11 +42,9 @@ static int efar_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u8 tmp; u8 tmp;
if (!pci_test_config_bits(pdev, &efar_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &efar_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
pci_read_config_byte(pdev, 0x47, &tmp); pci_read_config_byte(pdev, 0x47, &tmp);
if (tmp & (2 >> ap->port_no)) if (tmp & (2 >> ap->port_no))
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
......
...@@ -51,7 +51,7 @@ static int jmicron_pre_reset(struct ata_port *ap) ...@@ -51,7 +51,7 @@ static int jmicron_pre_reset(struct ata_port *ap)
/* Check if our port is enabled */ /* Check if our port is enabled */
pci_read_config_dword(pdev, 0x40, &control); pci_read_config_dword(pdev, 0x40, &control);
if ((control & port_mask) == 0) if ((control & port_mask) == 0)
return 0; return -ENOENT;
/* There are two basic mappings. One has the two SATA ports merged /* There are two basic mappings. One has the two SATA ports merged
as master/slave and the secondary as PATA, the other has only the as master/slave and the secondary as PATA, the other has only the
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* The driver conciously keeps this logic internally to avoid pushing quirky * The driver conciously keeps this logic internally to avoid pushing quirky
* PATA history into the clean libata layer. * PATA history into the clean libata layer.
* *
* Thinkpad specific note: If you boot an MPIIX using thinkpad with a PCMCIA * Thinkpad specific note: If you boot an MPIIX using a thinkpad with a PCMCIA
* hard disk present this driver will not detect it. This is not a bug. In this * hard disk present this driver will not detect it. This is not a bug. In this
* configuration the secondary port of the MPIIX is disabled and the addresses * configuration the secondary port of the MPIIX is disabled and the addresses
* are decoded by the PCMCIA bridge and therefore are for a generic IDE driver * are decoded by the PCMCIA bridge and therefore are for a generic IDE driver
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_mpiix" #define DRV_NAME "pata_mpiix"
#define DRV_VERSION "0.7.1" #define DRV_VERSION "0.7.2"
enum { enum {
IDETIM = 0x6C, /* IDE control register */ IDETIM = 0x6C, /* IDE control register */
...@@ -54,11 +54,8 @@ static int mpiix_pre_reset(struct ata_port *ap) ...@@ -54,11 +54,8 @@ static int mpiix_pre_reset(struct ata_port *ap)
{ 0x6F, 1, 0x80, 0x80 } { 0x6F, 1, 0x80, 0x80 }
}; };
if (!pci_test_config_bits(pdev, &mpiix_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &mpiix_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -45,11 +45,8 @@ static int ns87410_pre_reset(struct ata_port *ap) ...@@ -45,11 +45,8 @@ static int ns87410_pre_reset(struct ata_port *ap)
{ 0x47, 1, 0x08, 0x08 } { 0x47, 1, 0x08, 0x08 }
}; };
if (!pci_test_config_bits(pdev, &ns87410_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &ns87410_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/ata.h> #include <linux/ata.h>
#define DRV_NAME "pata_oldpiix" #define DRV_NAME "pata_oldpiix"
#define DRV_VERSION "0.5.1" #define DRV_VERSION "0.5.2"
/** /**
* oldpiix_pre_reset - probe begin * oldpiix_pre_reset - probe begin
...@@ -42,11 +42,8 @@ static int oldpiix_pre_reset(struct ata_port *ap) ...@@ -42,11 +42,8 @@ static int oldpiix_pre_reset(struct ata_port *ap)
{ 0x43U, 1U, 0x80UL, 0x80UL }, /* port 1 */ { 0x43U, 1U, 0x80UL, 0x80UL }, /* port 1 */
}; };
if (!pci_test_config_bits(pdev, &oldpiix_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &oldpiix_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_opti" #define DRV_NAME "pata_opti"
#define DRV_VERSION "0.2.4" #define DRV_VERSION "0.2.5"
enum { enum {
READ_REG = 0, /* index of Read cycle timing register */ READ_REG = 0, /* index of Read cycle timing register */
...@@ -59,11 +59,9 @@ static int opti_pre_reset(struct ata_port *ap) ...@@ -59,11 +59,9 @@ static int opti_pre_reset(struct ata_port *ap)
{ 0x40, 1, 0x08, 0x00 } { 0x40, 1, 0x08, 0x00 }
}; };
if (!pci_test_config_bits(pdev, &opti_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &opti_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_optidma" #define DRV_NAME "pata_optidma"
#define DRV_VERSION "0.2.1" #define DRV_VERSION "0.2.2"
enum { enum {
READ_REG = 0, /* index of Read cycle timing register */ READ_REG = 0, /* index of Read cycle timing register */
...@@ -59,11 +59,9 @@ static int optidma_pre_reset(struct ata_port *ap) ...@@ -59,11 +59,9 @@ static int optidma_pre_reset(struct ata_port *ap)
0x40, 1, 0x08, 0x00 0x40, 1, 0x08, 0x00
}; };
if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits)) { if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "pata_pdc2027x" #define DRV_NAME "pata_pdc2027x"
#define DRV_VERSION "0.74-ac3" #define DRV_VERSION "0.74-ac5"
#undef PDC_DEBUG #undef PDC_DEBUG
#ifdef PDC_DEBUG #ifdef PDC_DEBUG
...@@ -311,10 +311,8 @@ static inline int pdc2027x_port_enabled(struct ata_port *ap) ...@@ -311,10 +311,8 @@ static inline int pdc2027x_port_enabled(struct ata_port *ap)
static int pdc2027x_prereset(struct ata_port *ap) static int pdc2027x_prereset(struct ata_port *ap)
{ {
/* Check whether port enabled */ /* Check whether port enabled */
if (!pdc2027x_port_enabled(ap)) { if (!pdc2027x_port_enabled(ap))
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id); return -ENOENT;
return 0;
}
pdc2027x_cbl_detect(ap); pdc2027x_cbl_detect(ap);
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include <linux/ata.h> #include <linux/ata.h>
#define DRV_NAME "pata_sis" #define DRV_NAME "pata_sis"
#define DRV_VERSION "0.4.3" #define DRV_VERSION "0.4.4"
struct sis_chipset { struct sis_chipset {
u16 device; /* PCI host ID */ u16 device; /* PCI host ID */
...@@ -74,11 +74,9 @@ static int sis_133_pre_reset(struct ata_port *ap) ...@@ -74,11 +74,9 @@ static int sis_133_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u16 tmp; u16 tmp;
if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
/* The top bit of this register is the cable detect bit */ /* The top bit of this register is the cable detect bit */
pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp); pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
if (tmp & 0x8000) if (tmp & 0x8000)
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_sl82c105" #define DRV_NAME "pata_sl82c105"
#define DRV_VERSION "0.2.2" #define DRV_VERSION "0.2.3"
enum { enum {
/* /*
...@@ -49,11 +49,8 @@ static int sl82c105_pre_reset(struct ata_port *ap) ...@@ -49,11 +49,8 @@ static int sl82c105_pre_reset(struct ata_port *ap)
}; };
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
if (ap->port_no && !pci_test_config_bits(pdev, &sl82c105_enable_bits[ap->port_no])) { if (ap->port_no && !pci_test_config_bits(pdev, &sl82c105_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
dev_printk(KERN_INFO, &pdev->dev, "port disabled. ignoring.\n");
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
......
...@@ -46,13 +46,13 @@ ...@@ -46,13 +46,13 @@
#define DRV_VERSION "0.2.5" #define DRV_VERSION "0.2.5"
/** /**
* triflex_probe_init - probe begin * triflex_prereset - probe begin
* @ap: ATA port * @ap: ATA port
* *
* Set up cable type and use generic probe init * Set up cable type and use generic probe init
*/ */
static int triflex_probe_init(struct ata_port *ap) static int triflex_prereset(struct ata_port *ap)
{ {
static const struct pci_bits triflex_enable_bits[] = { static const struct pci_bits triflex_enable_bits[] = {
{ 0x80, 1, 0x01, 0x01 }, { 0x80, 1, 0x01, 0x01 },
...@@ -61,11 +61,8 @@ static int triflex_probe_init(struct ata_port *ap) ...@@ -61,11 +61,8 @@ static int triflex_probe_init(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
if (!pci_test_config_bits(pdev, &triflex_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &triflex_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
ap->cbl = ATA_CBL_PATA40; ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap); return ata_std_prereset(ap);
} }
...@@ -74,7 +71,7 @@ static int triflex_probe_init(struct ata_port *ap) ...@@ -74,7 +71,7 @@ static int triflex_probe_init(struct ata_port *ap)
static void triflex_error_handler(struct ata_port *ap) static void triflex_error_handler(struct ata_port *ap)
{ {
ata_bmdma_drive_eh(ap, triflex_probe_init, ata_std_softreset, NULL, ata_std_postreset); ata_bmdma_drive_eh(ap, triflex_prereset, ata_std_softreset, NULL, ata_std_postreset);
} }
/** /**
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "pata_via" #define DRV_NAME "pata_via"
#define DRV_VERSION "0.1.13" #define DRV_VERSION "0.1.14"
/* /*
* The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx * The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx
...@@ -155,11 +155,8 @@ static int via_pre_reset(struct ata_port *ap) ...@@ -155,11 +155,8 @@ static int via_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
if (!pci_test_config_bits(pdev, &via_enable_bits[ap->port_no])) { if (!pci_test_config_bits(pdev, &via_enable_bits[ap->port_no]))
ata_port_disable(ap); return -ENOENT;
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
} }
if ((config->flags & VIA_UDMA) >= VIA_UDMA_66) if ((config->flags & VIA_UDMA) >= VIA_UDMA_66)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册