Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18137207 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: fix UDMA/MWDMA/SWDMA masks (v3)



* use 0x00 instead of 0x80 to disable ->{ultra,mwdma,swdma}_mask
* add udma_mask field to ide_pci_device_t and use it to initialize
  ->ultra_mask in aec62xx, cmd64x, pdc202xx_{new,old} and piix drivers
* fix UDMA masks to match with chipset specific *_ratemask()
  (alim15x3, hpt366, serverworks and siimage drivers need UDMA mask
   filtering method - done in the next patch)

v2:
* piix: fix cable detection for 82801AA_1 and 82372FB_1
  [ Noticed by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ]
* cmd64x: use hwif->cds->udma_mask
  [ Suggested by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ]
* aec62xx: fix newly introduced bug - check DMA status not command register
  [ Noticed by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ]

v3:
* piix: use hwif->cds->udma_mask
  [ Suggested by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ]

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent de372ecd
Loading
Loading
Loading
Loading
+0 −3
Original line number Original line Diff line number Diff line
@@ -216,9 +216,6 @@ static void init_hwif_data(ide_hwif_t *hwif, unsigned int index)
	hwif->bus_state	= BUSSTATE_ON;
	hwif->bus_state	= BUSSTATE_ON;


	hwif->atapi_dma = 0;		/* disable all atapi dma */ 
	hwif->atapi_dma = 0;		/* disable all atapi dma */ 
	hwif->ultra_mask = 0x80;	/* disable all ultra */
	hwif->mwdma_mask = 0x80;	/* disable all mwdma */
	hwif->swdma_mask = 0x80;	/* disable all swdma */


	init_completion(&hwif->gendev_rel_comp);
	init_completion(&hwif->gendev_rel_comp);


+17 −2
Original line number Original line Diff line number Diff line
@@ -261,11 +261,13 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch


static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
{
{
	struct pci_dev *dev = hwif->pci_dev;

	hwif->autodma = 0;
	hwif->autodma = 0;
	hwif->tuneproc = &aec62xx_tune_drive;
	hwif->tuneproc = &aec62xx_tune_drive;
	hwif->speedproc = &aec62xx_tune_chipset;
	hwif->speedproc = &aec62xx_tune_chipset;


	if (hwif->pci_dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
	if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
		hwif->serialized = hwif->channel;
		hwif->serialized = hwif->channel;


	if (hwif->mate)
	if (hwif->mate)
@@ -277,7 +279,15 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
		return;
		return;
	}
	}


	hwif->ultra_mask = 0x7f;
	hwif->ultra_mask = hwif->cds->udma_mask;

	/* atp865 and atp865r */
	if (hwif->ultra_mask == 0x3f) {
		/* check bit 0x10 of DMA status register */
		if (inb(pci_resource_start(dev, 4) + 2) & 0x10)
 			hwif->ultra_mask = 0x7f; /* udma0-6 */
	}

	hwif->mwdma_mask = 0x07;
	hwif->mwdma_mask = 0x07;


	hwif->ide_dma_check	= &aec62xx_config_drive_xfer_rate;
	hwif->ide_dma_check	= &aec62xx_config_drive_xfer_rate;
@@ -344,6 +354,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x07, /* udma0-2 */
	},{	/* 1 */
	},{	/* 1 */
		.name		= "AEC6260",
		.name		= "AEC6260",
		.init_setup	= init_setup_aec62xx,
		.init_setup	= init_setup_aec62xx,
@@ -353,6 +364,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= NOAUTODMA,
		.autodma	= NOAUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x1f, /* udma0-4 */
	},{	/* 2 */
	},{	/* 2 */
		.name		= "AEC6260R",
		.name		= "AEC6260R",
		.init_setup	= init_setup_aec62xx,
		.init_setup	= init_setup_aec62xx,
@@ -363,6 +375,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.bootable	= NEVER_BOARD,
		.bootable	= NEVER_BOARD,
		.udma_mask	= 0x1f, /* udma0-4 */
	},{	/* 3 */
	},{	/* 3 */
		.name		= "AEC6X80",
		.name		= "AEC6X80",
		.init_setup	= init_setup_aec6x80,
		.init_setup	= init_setup_aec6x80,
@@ -372,6 +385,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x3f, /* udma0-5 */
	},{	/* 4 */
	},{	/* 4 */
		.name		= "AEC6X80R",
		.name		= "AEC6X80R",
		.init_setup	= init_setup_aec6x80,
		.init_setup	= init_setup_aec6x80,
@@ -382,6 +396,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.enablebits	= {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x3f, /* udma0-5 */
	}
	}
};
};


+11 −2
Original line number Original line Diff line number Diff line
@@ -783,8 +783,17 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)


	hwif->atapi_dma = 1;
	hwif->atapi_dma = 1;


	if (m5229_revision > 0x20)
	if (m5229_revision <= 0x20)
		hwif->ultra_mask = 0x7f;
		hwif->ultra_mask = 0x00; /* no udma */
	else if (m5229_revision < 0xC2)
		hwif->ultra_mask = 0x07; /* udma0-2 */
	else if (m5229_revision == 0xC2 || m5229_revision == 0xC3)
		hwif->ultra_mask = 0x1f; /* udma0-4 */
	else if (m5229_revision == 0xC4)
		hwif->ultra_mask = 0x3f; /* udma0-5 */
	else
		hwif->ultra_mask = 0x7f; /* udma0-6 */

	hwif->mwdma_mask = 0x07;
	hwif->mwdma_mask = 0x07;
	hwif->swdma_mask = 0x07;
	hwif->swdma_mask = 0x07;


+9 −8
Original line number Original line Diff line number Diff line
@@ -644,15 +644,12 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)


	hwif->atapi_dma = 1;
	hwif->atapi_dma = 1;


	hwif->ultra_mask = 0x3f;
	hwif->ultra_mask = hwif->cds->udma_mask;
	hwif->mwdma_mask = 0x07;

	if (dev->device == PCI_DEVICE_ID_CMD_646 && class_rev < 5)
		hwif->ultra_mask = 0x00;


	if (dev->device == PCI_DEVICE_ID_CMD_643)
	hwif->mwdma_mask = 0x07;
		hwif->ultra_mask = 0x80;
	if (dev->device == PCI_DEVICE_ID_CMD_646)
		hwif->ultra_mask = (class_rev > 0x04) ? 0x07 : 0x80;
	if (dev->device == PCI_DEVICE_ID_CMD_648)
		hwif->ultra_mask = 0x1f;


	hwif->ide_dma_check = &cmd64x_config_drive_for_dma;
	hwif->ide_dma_check = &cmd64x_config_drive_for_dma;
	if (!(hwif->udma_four))
	if (!(hwif->udma_four))
@@ -716,6 +713,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x00,0x00,0x00}, {0x51,0x08,0x08}},
		.enablebits	= {{0x00,0x00,0x00}, {0x51,0x08,0x08}},
		.bootable	= ON_BOARD,
		.bootable	= ON_BOARD,
		.udma_mask	= 0x00, /* no udma */
	},{	/* 1 */
	},{	/* 1 */
		.name		= "CMD646",
		.name		= "CMD646",
		.init_setup	= init_setup_cmd646,
		.init_setup	= init_setup_cmd646,
@@ -725,6 +723,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.bootable	= ON_BOARD,
		.bootable	= ON_BOARD,
		.udma_mask	= 0x07, /* udma0-2 */
	},{	/* 2 */
	},{	/* 2 */
		.name		= "CMD648",
		.name		= "CMD648",
		.init_setup	= init_setup_cmd64x,
		.init_setup	= init_setup_cmd64x,
@@ -734,6 +733,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.bootable	= ON_BOARD,
		.bootable	= ON_BOARD,
		.udma_mask	= 0x1f, /* udma0-4 */
	},{	/* 3 */
	},{	/* 3 */
		.name		= "CMD649",
		.name		= "CMD649",
		.init_setup	= init_setup_cmd64x,
		.init_setup	= init_setup_cmd64x,
@@ -743,6 +743,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.enablebits	= {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
		.bootable	= ON_BOARD,
		.bootable	= ON_BOARD,
		.udma_mask	= 0x3f, /* udma0-5 */
	}
	}
};
};


+9 −1
Original line number Original line Diff line number Diff line
@@ -543,7 +543,8 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;


	hwif->atapi_dma  = 1;
	hwif->atapi_dma  = 1;
	hwif->ultra_mask = 0x7f;

	hwif->ultra_mask = hwif->cds->udma_mask;
	hwif->mwdma_mask = 0x07;
	hwif->mwdma_mask = 0x07;


	hwif->err_stops_fifo = 1;
	hwif->err_stops_fifo = 1;
@@ -619,6 +620,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x3f, /* udma0-5 */
	},{	/* 1 */
	},{	/* 1 */
		.name		= "PDC20269",
		.name		= "PDC20269",
		.init_setup	= init_setup_pdcnew,
		.init_setup	= init_setup_pdcnew,
@@ -627,6 +629,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x7f, /* udma0-6*/
	},{	/* 2 */
	},{	/* 2 */
		.name		= "PDC20270",
		.name		= "PDC20270",
		.init_setup	= init_setup_pdc20270,
		.init_setup	= init_setup_pdc20270,
@@ -635,6 +638,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x3f, /* udma0-5 */
	},{	/* 3 */
	},{	/* 3 */
		.name		= "PDC20271",
		.name		= "PDC20271",
		.init_setup	= init_setup_pdcnew,
		.init_setup	= init_setup_pdcnew,
@@ -643,6 +647,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x7f, /* udma0-6*/
	},{	/* 4 */
	},{	/* 4 */
		.name		= "PDC20275",
		.name		= "PDC20275",
		.init_setup	= init_setup_pdcnew,
		.init_setup	= init_setup_pdcnew,
@@ -651,6 +656,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x7f, /* udma0-6*/
	},{	/* 5 */
	},{	/* 5 */
		.name		= "PDC20276",
		.name		= "PDC20276",
		.init_setup	= init_setup_pdc20276,
		.init_setup	= init_setup_pdc20276,
@@ -659,6 +665,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x7f, /* udma0-6*/
	},{	/* 6 */
	},{	/* 6 */
		.name		= "PDC20277",
		.name		= "PDC20277",
		.init_setup	= init_setup_pdcnew,
		.init_setup	= init_setup_pdcnew,
@@ -667,6 +674,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
		.channels	= 2,
		.channels	= 2,
		.autodma	= AUTODMA,
		.autodma	= AUTODMA,
		.bootable	= OFF_BOARD,
		.bootable	= OFF_BOARD,
		.udma_mask	= 0x7f, /* udma0-6*/
	}
	}
};
};


Loading