CF devices are ATA not ATAPI.
Add support for the ALI/ULI M5288 AHCI part
Busmaster DMA address fix in VIA 6421 case
Add support for a few more Serverworks and lookalikes chips
If current_heads or current_sectors in the disk cap page are zero, dont try to use the current_ geometry. This avoids a panic with BIOS'n that sets these to zero.
Format mask lacks one bit.

Approved by: re@
This commit is contained in:
sos 2006-09-30 14:51:49 +00:00
parent 8290450b78
commit 2c92928f9d
5 changed files with 29 additions and 13 deletions

View File

@ -639,7 +639,9 @@ ata_getparam(struct ata_device *atadev, int init)
if (init) {
sprintf(buffer, "%.40s/%.8s", atacap->model, atacap->revision);
device_set_desc_copy(atadev->dev, buffer);
if (atadev->param.config & ATA_PROTO_ATAPI) {
if ((atadev->param.config & ATA_PROTO_ATAPI) &&
(atadev->param.config != ATA_CFA_MAGIC1) &&
(atadev->param.config != ATA_CFA_MAGIC2)) {
if (atapi_dma && ch->dma &&
(atadev->param.config & ATA_DRQ_MASK) != ATA_DRQ_INTR &&
ata_umode(&atadev->param) >= ATA_UDMA2)

View File

@ -985,6 +985,13 @@ ata_ali_chipinit(device_t dev)
ctlr->allocate = ata_ali_sata_allocate;
ctlr->setmode = ata_sata_setmode;
/* if we have a memory resource we can likely do AHCI */
ctlr->r_type2 = SYS_RES_MEMORY;
ctlr->r_rid2 = PCIR_BAR(5);
if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2,
&ctlr->r_rid2, RF_ACTIVE)))
return ata_ahci_chipinit(dev);
/* enable PCI interrupt */
pci_write_config(dev, PCIR_COMMAND,
pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
@ -3952,14 +3959,17 @@ ata_serverworks_ident(device_t dev)
struct ata_pci_controller *ctlr = device_get_softc(dev);
struct ata_chip_id *idx;
static struct ata_chip_id ids[] =
{{ ATA_ROSB4, 0x00, SWKS33, 0x00, ATA_UDMA2, "ROSB4" },
{ ATA_CSB5, 0x92, SWKS100, 0x00, ATA_UDMA5, "CSB5" },
{ ATA_CSB5, 0x00, SWKS66, 0x00, ATA_UDMA4, "CSB5" },
{ ATA_CSB6, 0x00, SWKS100, 0x00, ATA_UDMA5, "CSB6" },
{ ATA_CSB6_1, 0x00, SWKS66, 0x00, ATA_UDMA4, "CSB6" },
{ ATA_HT1000, 0x00, SWKS100, 0x00, ATA_UDMA5, "HT1000" },
{ ATA_HT1000_S1, 0x00, SWKS100, 0x00, ATA_SA150, "HT1000 SATA" },
{ ATA_HT1000_S2, 0x00, SWKSMIO, 0x00, ATA_SA150, "HT1000 SATA mmio" },
{{ ATA_ROSB4, 0x00, SWKS33, 0, ATA_UDMA2, "ROSB4" },
{ ATA_CSB5, 0x92, SWKS100, 0, ATA_UDMA5, "CSB5" },
{ ATA_CSB5, 0x00, SWKS66, 0, ATA_UDMA4, "CSB5" },
{ ATA_CSB6, 0x00, SWKS100, 0, ATA_UDMA5, "CSB6" },
{ ATA_CSB6_1, 0x00, SWKS66, 0, ATA_UDMA4, "CSB6" },
{ ATA_HT1000, 0x00, SWKS100, 0, ATA_UDMA5, "HT1000" },
{ ATA_HT1000_S1, 0x00, SWKS100, 4, ATA_SA150, "HT1000" },
{ ATA_HT1000_S2, 0x00, SWKSMIO, 4, ATA_SA150, "HT1000" },
{ ATA_K2, 0x00, SWKSMIO, 4, ATA_SA150, "K2" },
{ ATA_FRODO4, 0x00, SWKSMIO, 4, ATA_SA150, "Frodo4" },
{ ATA_FRODO8, 0x00, SWKSMIO, 8, ATA_SA150, "Frodo8" },
{ 0, 0, 0, 0, 0, 0}};
char buffer[64];
@ -3989,7 +3999,7 @@ ata_serverworks_chipinit(device_t dev)
&ctlr->r_rid2, RF_ACTIVE)))
return ENXIO;
ctlr->channels = 4;
ctlr->channels = ctlr->chip->cfg2;
ctlr->allocate = ata_serverworks_allocate;
ctlr->setmode = ata_sata_setmode;
return 0;
@ -4866,7 +4876,7 @@ ata_via_allocate(device_t dev)
ata_default_registers(dev);
for (i = ATA_BMCMD_PORT; i <= ATA_BMDTP_PORT; i++) {
ch->r_io[i].res = ctlr->r_res1;
ch->r_io[i].offset = i - ATA_BMCMD_PORT;
ch->r_io[i].offset = (i - ATA_BMCMD_PORT)+(ch->unit * ATA_BMIOSIZE);
}
ata_pci_hw(dev);
}

View File

@ -97,7 +97,8 @@ ad_attach(device_t dev)
}
device_set_ivars(dev, adp);
if (atadev->param.atavalid & ATA_FLAG_54_58) {
if ((atadev->param.atavalid & ATA_FLAG_54_58) &&
atadev->param.current_heads && atadev->param.current_sectors) {
adp->heads = atadev->param.current_heads;
adp->sectors = atadev->param.current_sectors;
adp->total_secs = (u_int32_t)atadev->param.current_size_1 |

View File

@ -266,6 +266,9 @@ struct ata_connect_task {
#define ATA_HT1000 0x02141166
#define ATA_HT1000_S1 0x024b1166
#define ATA_HT1000_S2 0x024a1166
#define ATA_K2 0x02401166
#define ATA_FRODO4 0x02411166
#define ATA_FRODO8 0x02421166
#define ATA_SILICON_IMAGE_ID 0x1095
#define ATA_SII3114 0x31141095

View File

@ -76,7 +76,7 @@ struct ar_softc {
#define AR_F_SII_RAID 0x0800
#define AR_F_SIS_RAID 0x1000
#define AR_F_VIA_RAID 0x2000
#define AR_F_FORMAT_MASK 0x1fff
#define AR_F_FORMAT_MASK 0x3fff
u_int generation;
u_int64_t total_sectors;