Commit 878701db authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6:
  scc_pata: PIO fixes
  piix/slc90e66: fix PIO1 handling in ->speedproc method (take 2)
  jmicron: PIO fixes
  it8213: PIO fixes (take 2)
  cs5535: PIO fixes
  cs5520: fix PIO auto-tuning in ->ide_dma_check method
  drivers/scsi/ide-scsi.c: kmalloc + memset conversion to kzalloc
  drivers/ide/arm/icside.c: kmalloc + memset conversion to kzalloc
  ide: eliminate warnings in ide-tape.c
  ide: fix runtogether printk's in cmd64x IDE driver
  sis5513: Add FSC Amilo A1630 PCI subvendor/dev to laptops
  alim15x3: Correct HP detect
  ide: Fix an overrun found in the CS5535 IDE driver
parents 04668873 3fcece66
...@@ -693,13 +693,12 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id) ...@@ -693,13 +693,12 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id)
if (ret) if (ret)
goto out; goto out;
state = kmalloc(sizeof(struct icside_state), GFP_KERNEL); state = kzalloc(sizeof(struct icside_state), GFP_KERNEL);
if (!state) { if (!state) {
ret = -ENOMEM; ret = -ENOMEM;
goto release; goto release;
} }
memset(state, 0, sizeof(state));
state->type = ICS_TYPE_NOTYPE; state->type = ICS_TYPE_NOTYPE;
state->dev = &ec->dev; state->dev = &ec->dev;
......
...@@ -640,7 +640,7 @@ typedef enum { ...@@ -640,7 +640,7 @@ typedef enum {
} idetape_chrdev_direction_t; } idetape_chrdev_direction_t;
struct idetape_bh { struct idetape_bh {
unsigned short b_size; u32 b_size;
atomic_t b_count; atomic_t b_count;
struct idetape_bh *b_reqnext; struct idetape_bh *b_reqnext;
char *b_data; char *b_data;
......
...@@ -593,7 +593,7 @@ static struct dmi_system_id cable_dmi_table[] = { ...@@ -593,7 +593,7 @@ static struct dmi_system_id cable_dmi_table[] = {
.ident = "HP Pavilion N5430", .ident = "HP Pavilion N5430",
.matches = { .matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
DMI_MATCH(DMI_BOARD_NAME, "OmniBook N32N-736"), DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
}, },
}, },
{ } { }
......
...@@ -475,11 +475,11 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha ...@@ -475,11 +475,11 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha
switch (rev) { switch (rev) {
case 0x07: case 0x07:
case 0x05: case 0x05:
printk("%s: UltraDMA capable", name); printk("%s: UltraDMA capable\n", name);
break; break;
case 0x03: case 0x03:
default: default:
printk("%s: MultiWord DMA force limited", name); printk("%s: MultiWord DMA force limited\n", name);
break; break;
case 0x01: case 0x01:
printk("%s: MultiWord DMA limited, " printk("%s: MultiWord DMA limited, "
......
...@@ -133,7 +133,7 @@ static void cs5520_tune_drive(ide_drive_t *drive, u8 pio) ...@@ -133,7 +133,7 @@ static void cs5520_tune_drive(ide_drive_t *drive, u8 pio)
static int cs5520_config_drive_xfer_rate(ide_drive_t *drive) static int cs5520_config_drive_xfer_rate(ide_drive_t *drive)
{ {
/* Tune the drive for PIO modes up to PIO 4 */ /* Tune the drive for PIO modes up to PIO 4 */
cs5520_tune_drive(drive, 4); cs5520_tune_drive(drive, 255);
/* Then tell the core to use DMA operations */ /* Then tell the core to use DMA operations */
return 0; return 0;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* linux/drivers/ide/pci/cs5535.c * linux/drivers/ide/pci/cs5535.c
* *
* Copyright (C) 2004-2005 Advanced Micro Devices, Inc. * Copyright (C) 2004-2005 Advanced Micro Devices, Inc.
* Copyright (C) 2007 Bartlomiej Zolnierkiewicz
* *
* History: * History:
* 09/20/2005 - Jaya Kumar <jayakumar.ide@gmail.com> * 09/20/2005 - Jaya Kumar <jayakumar.ide@gmail.com>
...@@ -83,14 +84,17 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed) ...@@ -83,14 +84,17 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed)
/* Set the PIO timings */ /* Set the PIO timings */
if ((speed & XFER_MODE) == XFER_PIO) { if ((speed & XFER_MODE) == XFER_PIO) {
u8 pioa; ide_drive_t *pair = &drive->hwif->drives[drive->dn ^ 1];
u8 piob; u8 cmd, pioa;
u8 cmd;
pioa = speed - XFER_PIO_0; cmd = pioa = speed - XFER_PIO_0;
piob = ide_get_best_pio_mode(&(drive->hwif->drives[!unit]),
255, 4); if (pair->present) {
cmd = pioa < piob ? pioa : piob; u8 piob = ide_get_best_pio_mode(pair, 255, 4);
if (piob < cmd)
cmd = piob;
}
/* Write the speed of the current drive */ /* Write the speed of the current drive */
reg = (cs5535_pio_cmd_timings[cmd] << 16) | reg = (cs5535_pio_cmd_timings[cmd] << 16) |
...@@ -116,7 +120,7 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed) ...@@ -116,7 +120,7 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed)
reg &= 0x80000000UL; /* Preserve the PIO format bit */ reg &= 0x80000000UL; /* Preserve the PIO format bit */
if (speed >= XFER_UDMA_0 && speed <= XFER_UDMA_7) if (speed >= XFER_UDMA_0 && speed <= XFER_UDMA_4)
reg |= cs5535_udma_timings[speed - XFER_UDMA_0]; reg |= cs5535_udma_timings[speed - XFER_UDMA_0];
else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2)
reg |= cs5535_mwdma_timings[speed - XFER_MW_DMA_0]; reg |= cs5535_mwdma_timings[speed - XFER_MW_DMA_0];
...@@ -151,32 +155,22 @@ static int cs5535_set_drive(ide_drive_t *drive, u8 speed) ...@@ -151,32 +155,22 @@ static int cs5535_set_drive(ide_drive_t *drive, u8 speed)
* *
* A callback from the upper layers for PIO-only tuning. * A callback from the upper layers for PIO-only tuning.
*/ */
static void cs5535_tuneproc(ide_drive_t *drive, u8 xferspeed) static void cs5535_tuneproc(ide_drive_t *drive, u8 pio)
{ {
u8 modes[] = { XFER_PIO_0, XFER_PIO_1, XFER_PIO_2, XFER_PIO_3, pio = ide_get_best_pio_mode(drive, pio, 4);
XFER_PIO_4 }; ide_config_drive_speed(drive, XFER_PIO_0 + pio);
cs5535_set_speed(drive, XFER_PIO_0 + pio);
/* cs5535 max pio is pio 4, best_pio will check the blacklist.
i think we don't need to rate_filter the incoming xferspeed
since we know we're only going to choose pio */
xferspeed = ide_get_best_pio_mode(drive, xferspeed, 4);
ide_config_drive_speed(drive, modes[xferspeed]);
cs5535_set_speed(drive, xferspeed);
} }
static int cs5535_dma_check(ide_drive_t *drive) static int cs5535_dma_check(ide_drive_t *drive)
{ {
u8 speed;
drive->init_speed = 0; drive->init_speed = 0;
if (ide_tune_dma(drive)) if (ide_tune_dma(drive))
return 0; return 0;
if (ide_use_fast_pio(drive)) { if (ide_use_fast_pio(drive))
speed = ide_get_best_pio_mode(drive, 255, 4); cs5535_tuneproc(drive, 255);
cs5535_set_drive(drive, speed);
}
return -1; return -1;
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* it8213_dma_2_pio - return the PIO mode matching DMA * it8213_dma_2_pio - return the PIO mode matching DMA
* @xfer_rate: transfer speed * @xfer_rate: transfer speed
* *
* Returns the nearest equivalent PIO timing for the PIO or DMA * Returns the nearest equivalent PIO timing for the DMA
* mode requested by the controller. * mode requested by the controller.
*/ */
...@@ -35,34 +35,28 @@ static u8 it8213_dma_2_pio (u8 xfer_rate) { ...@@ -35,34 +35,28 @@ static u8 it8213_dma_2_pio (u8 xfer_rate) {
case XFER_UDMA_1: case XFER_UDMA_1:
case XFER_UDMA_0: case XFER_UDMA_0:
case XFER_MW_DMA_2: case XFER_MW_DMA_2:
case XFER_PIO_4:
return 4; return 4;
case XFER_MW_DMA_1: case XFER_MW_DMA_1:
case XFER_PIO_3:
return 3; return 3;
case XFER_SW_DMA_2: case XFER_SW_DMA_2:
case XFER_PIO_2:
return 2; return 2;
case XFER_MW_DMA_0: case XFER_MW_DMA_0:
case XFER_SW_DMA_1: case XFER_SW_DMA_1:
case XFER_SW_DMA_0: case XFER_SW_DMA_0:
case XFER_PIO_1:
case XFER_PIO_0:
case XFER_PIO_SLOW:
default: default:
return 0; return 0;
} }
} }
/* /*
* it8213_tuneproc - tune a drive * it8213_tune_pio - tune a drive
* @drive: drive to tune * @drive: drive to tune
* @pio: desired PIO mode * @pio: desired PIO mode
* *
* Set the interface PIO mode. * Set the interface PIO mode.
*/ */
static void it8213_tuneproc (ide_drive_t *drive, u8 pio) static void it8213_tune_pio(ide_drive_t *drive, const u8 pio)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
...@@ -82,8 +76,6 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio) ...@@ -82,8 +76,6 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio)
{ 2, 1 }, { 2, 1 },
{ 2, 3 }, }; { 2, 3 }, };
pio = ide_get_best_pio_mode(drive, pio, 4);
spin_lock_irqsave(&tune_lock, flags); spin_lock_irqsave(&tune_lock, flags);
pci_read_config_word(dev, master_port, &master_data); pci_read_config_word(dev, master_port, &master_data);
...@@ -113,6 +105,13 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio) ...@@ -113,6 +105,13 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio)
spin_unlock_irqrestore(&tune_lock, flags); spin_unlock_irqrestore(&tune_lock, flags);
} }
static void it8213_tuneproc(ide_drive_t *drive, u8 pio)
{
pio = ide_get_best_pio_mode(drive, pio, 4);
it8213_tune_pio(drive, pio);
ide_config_drive_speed(drive, XFER_PIO_0 + pio);
}
/** /**
* it8213_tune_chipset - set controller timings * it8213_tune_chipset - set controller timings
* @drive: Drive to set up * @drive: Drive to set up
...@@ -193,7 +192,12 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -193,7 +192,12 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed)
if (reg55 & w_flag) if (reg55 & w_flag)
pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag); pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag);
} }
it8213_tuneproc(drive, it8213_dma_2_pio(speed));
if (speed > XFER_PIO_4)
it8213_tune_pio(drive, it8213_dma_2_pio(speed));
else
it8213_tune_pio(drive, speed - XFER_PIO_0);
return ide_config_drive_speed(drive, speed); return ide_config_drive_speed(drive, speed);
} }
...@@ -209,13 +213,10 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -209,13 +213,10 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed)
static int it8213_config_drive_for_dma (ide_drive_t *drive) static int it8213_config_drive_for_dma (ide_drive_t *drive)
{ {
u8 pio;
if (ide_tune_dma(drive)) if (ide_tune_dma(drive))
return 0; return 0;
pio = ide_get_best_pio_mode(drive, 255, 4); it8213_tuneproc(drive, 255);
it8213_tune_chipset(drive, XFER_PIO_0 + pio);
return -1; return -1;
} }
......
...@@ -83,23 +83,10 @@ static u8 __devinit ata66_jmicron(ide_hwif_t *hwif) ...@@ -83,23 +83,10 @@ static u8 __devinit ata66_jmicron(ide_hwif_t *hwif)
return ATA_CBL_PATA80; return ATA_CBL_PATA80;
} }
static void jmicron_tuneproc (ide_drive_t *drive, byte mode_wanted) static void jmicron_tuneproc(ide_drive_t *drive, u8 pio)
{ {
return; pio = ide_get_best_pio_mode(drive, pio, 5);
} ide_config_drive_speed(drive, XFER_PIO_0 + pio);
/**
* config_jmicron_chipset_for_pio - set drive timings
* @drive: drive to tune
* @speed we want
*
*/
static void config_jmicron_chipset_for_pio (ide_drive_t *drive, byte set_speed)
{
u8 speed = XFER_PIO_0 + ide_get_best_pio_mode(drive, 255, 5);
if (set_speed)
(void) ide_config_drive_speed(drive, speed);
} }
/** /**
...@@ -132,7 +119,7 @@ static int jmicron_config_drive_for_dma (ide_drive_t *drive) ...@@ -132,7 +119,7 @@ static int jmicron_config_drive_for_dma (ide_drive_t *drive)
if (ide_tune_dma(drive)) if (ide_tune_dma(drive))
return 0; return 0;
config_jmicron_chipset_for_pio(drive, 1); jmicron_tuneproc(drive, 255);
return -1; return -1;
} }
......
/* /*
* linux/drivers/ide/pci/piix.c Version 0.50 Jun 10, 2007 * linux/drivers/ide/pci/piix.c Version 0.51 Jul 6, 2007
* *
* Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
* Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
...@@ -109,7 +109,7 @@ static int no_piix_dma; ...@@ -109,7 +109,7 @@ static int no_piix_dma;
* piix_dma_2_pio - return the PIO mode matching DMA * piix_dma_2_pio - return the PIO mode matching DMA
* @xfer_rate: transfer speed * @xfer_rate: transfer speed
* *
* Returns the nearest equivalent PIO timing for the PIO or DMA * Returns the nearest equivalent PIO timing for the DMA
* mode requested by the controller. * mode requested by the controller.
*/ */
...@@ -123,20 +123,14 @@ static u8 piix_dma_2_pio (u8 xfer_rate) { ...@@ -123,20 +123,14 @@ static u8 piix_dma_2_pio (u8 xfer_rate) {
case XFER_UDMA_1: case XFER_UDMA_1:
case XFER_UDMA_0: case XFER_UDMA_0:
case XFER_MW_DMA_2: case XFER_MW_DMA_2:
case XFER_PIO_4:
return 4; return 4;
case XFER_MW_DMA_1: case XFER_MW_DMA_1:
case XFER_PIO_3:
return 3; return 3;
case XFER_SW_DMA_2: case XFER_SW_DMA_2:
case XFER_PIO_2:
return 2; return 2;
case XFER_MW_DMA_0: case XFER_MW_DMA_0:
case XFER_SW_DMA_1: case XFER_SW_DMA_1:
case XFER_SW_DMA_0: case XFER_SW_DMA_0:
case XFER_PIO_1:
case XFER_PIO_0:
case XFER_PIO_SLOW:
default: default:
return 0; return 0;
} }
...@@ -269,6 +263,7 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -269,6 +263,7 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed)
case XFER_PIO_4: case XFER_PIO_4:
case XFER_PIO_3: case XFER_PIO_3:
case XFER_PIO_2: case XFER_PIO_2:
case XFER_PIO_1:
case XFER_PIO_0: break; case XFER_PIO_0: break;
default: return -1; default: return -1;
} }
...@@ -299,7 +294,11 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -299,7 +294,11 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed)
pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag); pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag);
} }
piix_tune_pio(drive, piix_dma_2_pio(speed)); if (speed > XFER_PIO_4)
piix_tune_pio(drive, piix_dma_2_pio(speed));
else
piix_tune_pio(drive, speed - XFER_PIO_0);
return ide_config_drive_speed(drive, speed); return ide_config_drive_speed(drive, speed);
} }
......
...@@ -190,7 +190,7 @@ scc_ide_outsl(unsigned long port, void *addr, u32 count) ...@@ -190,7 +190,7 @@ scc_ide_outsl(unsigned long port, void *addr, u32 count)
} }
/** /**
* scc_tuneproc - tune a drive PIO mode * scc_tune_pio - tune a drive PIO mode
* @drive: drive to tune * @drive: drive to tune
* @mode_wanted: the target operating mode * @mode_wanted: the target operating mode
* *
...@@ -198,7 +198,7 @@ scc_ide_outsl(unsigned long port, void *addr, u32 count) ...@@ -198,7 +198,7 @@ scc_ide_outsl(unsigned long port, void *addr, u32 count)
* controller. * controller.
*/ */
static void scc_tuneproc(ide_drive_t *drive, byte mode_wanted) static void scc_tune_pio(ide_drive_t *drive, const u8 pio)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
struct scc_ports *ports = ide_get_hwifdata(hwif); struct scc_ports *ports = ide_get_hwifdata(hwif);
...@@ -207,41 +207,25 @@ static void scc_tuneproc(ide_drive_t *drive, byte mode_wanted) ...@@ -207,41 +207,25 @@ static void scc_tuneproc(ide_drive_t *drive, byte mode_wanted)
unsigned long piosht_port = ctl_base + 0x000; unsigned long piosht_port = ctl_base + 0x000;
unsigned long pioct_port = ctl_base + 0x004; unsigned long pioct_port = ctl_base + 0x004;
unsigned long reg; unsigned long reg;
unsigned char speed = XFER_PIO_0;
int offset; int offset;
mode_wanted = ide_get_best_pio_mode(drive, mode_wanted, 4);
switch (mode_wanted) {
case 4:
speed = XFER_PIO_4;
break;
case 3:
speed = XFER_PIO_3;
break;
case 2:
speed = XFER_PIO_2;
break;
case 1:
speed = XFER_PIO_1;
break;
case 0:
default:
speed = XFER_PIO_0;
break;
}
reg = in_be32((void __iomem *)cckctrl_port); reg = in_be32((void __iomem *)cckctrl_port);
if (reg & CCKCTRL_ATACLKOEN) { if (reg & CCKCTRL_ATACLKOEN) {
offset = 1; /* 133MHz */ offset = 1; /* 133MHz */
} else { } else {
offset = 0; /* 100MHz */ offset = 0; /* 100MHz */
} }
reg = JCHSTtbl[offset][mode_wanted] << 16 | JCHHTtbl[offset][mode_wanted]; reg = JCHSTtbl[offset][pio] << 16 | JCHHTtbl[offset][pio];
out_be32((void __iomem *)piosht_port, reg); out_be32((void __iomem *)piosht_port, reg);
reg = JCHCTtbl[offset][mode_wanted]; reg = JCHCTtbl[offset][pio];
out_be32((void __iomem *)pioct_port, reg); out_be32((void __iomem *)pioct_port, reg);
}
ide_config_drive_speed(drive, speed); static void scc_tuneproc(ide_drive_t *drive, u8 pio)
{
pio = ide_get_best_pio_mode(drive, pio, 4);
scc_tune_pio(drive, pio);
ide_config_drive_speed(drive, XFER_PIO_0 + pio);
} }
/** /**
...@@ -280,26 +264,21 @@ static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed) ...@@ -280,26 +264,21 @@ static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed)
switch (speed) { switch (speed) {
case XFER_UDMA_6: case XFER_UDMA_6:
idx = 6;
break;
case XFER_UDMA_5: case XFER_UDMA_5:
idx = 5;
break;
case XFER_UDMA_4: case XFER_UDMA_4:
idx = 4;
break;
case XFER_UDMA_3: case XFER_UDMA_3:
idx = 3;
break;
case XFER_UDMA_2: case XFER_UDMA_2:
idx = 2;
break;
case XFER_UDMA_1: case XFER_UDMA_1:
idx = 1;
break;
case XFER_UDMA_0: case XFER_UDMA_0:
idx = 0; idx = speed - XFER_UDMA_0;
break; break;
case XFER_PIO_4:
case XFER_PIO_3:
case XFER_PIO_2:
case XFER_PIO_1:
case XFER_PIO_0:
scc_tune_pio(drive, speed - XFER_PIO_0);
return ide_config_drive_speed(drive, speed);
default: default:
return 1; return 1;
} }
...@@ -329,7 +308,7 @@ static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed) ...@@ -329,7 +308,7 @@ static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed)
* required. * required.
* If the drive isn't suitable for DMA or we hit other problems * If the drive isn't suitable for DMA or we hit other problems
* then we will drop down to PIO and set up PIO appropriately. * then we will drop down to PIO and set up PIO appropriately.
* (return 1) * (return -1)
*/ */
static int scc_config_drive_for_dma(ide_drive_t *drive) static int scc_config_drive_for_dma(ide_drive_t *drive)
...@@ -338,7 +317,7 @@ static int scc_config_drive_for_dma(ide_drive_t *drive) ...@@ -338,7 +317,7 @@ static int scc_config_drive_for_dma(ide_drive_t *drive)
return 0; return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
scc_tuneproc(drive, 4); scc_tuneproc(drive, 255);
return -1; return -1;
} }
......
...@@ -801,6 +801,7 @@ struct sis_laptop { ...@@ -801,6 +801,7 @@ struct sis_laptop {
static const struct sis_laptop sis_laptop[] = { static const struct sis_laptop sis_laptop[] = {
/* devid, subvendor, subdev */ /* devid, subvendor, subdev */
{ 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */ { 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */
{ 0x5513, 0x1734, 0x105f }, /* FSC Amilo A1630 */
/* end marker */ /* end marker */
{ 0, } { 0, }
}; };
......
/* /*
* linux/drivers/ide/pci/slc90e66.c Version 0.14 February 8, 2007 * linux/drivers/ide/pci/slc90e66.c Version 0.15 Jul 6, 2007
* *
* Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com> * Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com>
...@@ -29,20 +29,14 @@ static u8 slc90e66_dma_2_pio (u8 xfer_rate) { ...@@ -29,20 +29,14 @@ static u8 slc90e66_dma_2_pio (u8 xfer_rate) {
case XFER_UDMA_1: case XFER_UDMA_1:
case XFER_UDMA_0: case XFER_UDMA_0:
case XFER_MW_DMA_2: case XFER_MW_DMA_2:
case XFER_PIO_4:
return 4; return 4;
case XFER_MW_DMA_1: case XFER_MW_DMA_1:
case XFER_PIO_3:
return 3; return 3;
case XFER_SW_DMA_2: case XFER_SW_DMA_2:
case XFER_PIO_2:
return 2; return 2;
case XFER_MW_DMA_0: case XFER_MW_DMA_0:
case XFER_SW_DMA_1: case XFER_SW_DMA_1:
case XFER_SW_DMA_0: case XFER_SW_DMA_0:
case XFER_PIO_1:
case XFER_PIO_0:
case XFER_PIO_SLOW:
default: default:
return 0; return 0;
} }
...@@ -136,6 +130,7 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -136,6 +130,7 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed)
case XFER_PIO_4: case XFER_PIO_4:
case XFER_PIO_3: case XFER_PIO_3:
case XFER_PIO_2: case XFER_PIO_2:
case XFER_PIO_1:
case XFER_PIO_0: break; case XFER_PIO_0: break;
default: return -1; default: return -1;
} }
...@@ -156,7 +151,11 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) ...@@ -156,7 +151,11 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed)
pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
} }
slc90e66_tune_pio(drive, slc90e66_dma_2_pio(speed)); if (speed > XFER_PIO_4)
slc90e66_tune_pio(drive, slc90e66_dma_2_pio(speed));
else
slc90e66_tune_pio(drive, speed - XFER_PIO_0);
return ide_config_drive_speed(drive, speed); return ide_config_drive_speed(drive, speed);
} }
......
...@@ -328,17 +328,15 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co ...@@ -328,17 +328,15 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co
u8 *buf; u8 *buf;
/* stuff a sense request in front of our current request */ /* stuff a sense request in front of our current request */
pc = kmalloc (sizeof (idescsi_pc_t), GFP_ATOMIC); pc = kzalloc(sizeof(idescsi_pc_t), GFP_ATOMIC);
rq = kmalloc (sizeof (struct request), GFP_ATOMIC); rq = kmalloc(sizeof(struct request), GFP_ATOMIC);
buf = kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_ATOMIC); buf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_ATOMIC);
if (pc == NULL || rq == NULL || buf == NULL) { if (!pc || !rq || !buf) {
kfree(buf); kfree(buf);
kfree(rq); kfree(rq);
kfree(pc); kfree(pc);
return -ENOMEM; return -ENOMEM;
} }
memset (pc, 0, sizeof (idescsi_pc_t));
memset (buf, 0, SCSI_SENSE_BUFFERSIZE);
ide_init_drive_cmd(rq); ide_init_drive_cmd(rq);
rq->special = (char *) pc; rq->special = (char *) pc;
pc->rq = rq; pc->rq = rq;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment