IDE fixes
PATCH 1/1 IDE fixes
Hi Linus,
This update contains: HPT37x PIO mode timings fixes (from Sergei Shtylyov), Promise TX4 support bugfix, DMA modes reporting and validity checking fixes, ->io32_bit setting race fix, addition of device model/firmware/serial entries to sysfs, some minor fixups and a few trivial patches like coding style fixes dead code removal etc. (just to keep IDE tree patchcount + me sane)...
Bart
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git/
to receive the following updates:
drivers/ide/Kconfig | 6 +++- drivers/ide/ide-cd.c | 35 +------------------- drivers/ide/ide-disk.c | 33 +----------------- drivers/ide/ide-dma.c | 66 ++++++++---------------------------- drivers/ide/ide-io.c | 3 +- drivers/ide/ide-iops.c | 3 ++ drivers/ide/ide-lib.c | 55 ++++++++++++++++-------------- drivers/ide/ide-probe.c | 21 ++--------- drivers/ide/ide.c | 30 +++++++++++++++++ drivers/ide/pci/hpt366.c | 71 +++++++++++++++++++++++++++++++++++++++- drivers/ide/pci/pdc202xx_new.c | 3 +- drivers/ide/setup-pci.c | 31 +++++++++-------- drivers/scsi/ide-scsi.c | 17 +++++---- include/linux/ide.h | 6 ++-- 14 files changed, 191 insertions(+), 189 deletions(-)
Bartlomiej Zolnierkiewicz (13):
ide-scsi: add ide_scsi_hex_dump() helper
ide: add missing checks for control register existence
ide: deprecate CONFIG_BLK_DEV_OFFBOARD
ide: fix ide_scan_pcibus() error message
ide: coding style fixes for drivers/ide/setup-pci.c
ide: add /sys/bus/ide/devices/*/{model,firmware,serial} sysfs entries
ide: DMA reporting and validity checking fixes (take 3)
ide-cd: remove dead post_transform_command()
pdc202xx_new: fix Promise TX4 support
ide: remove dead code from __ide_dma_test_irq()
ide: remove stale changelog from ide-disk.c
ide: remove stale changelog from ide-probe.c
ide: fix ->io_32bit race in set_io_32bit()
Sergei Shtylyov (1):
hpt366: fix HPT37x PIO mode timings (take 2)
drivers/ide/Kconfig +1 -1
@@ -390,7 +390,7 @@ config IDEPCI_PCIBUS_ORDER # TODO: split it on per host driver config options (or module parameters) config BLK_DEV_OFFBOARD - bool "Boot off-board chipsets first support" + bool "Boot off-board chipsets first support (DEPRECATED)" depends on BLK_DEV_IDEPCI && (BLK_DEV_AEC62XX || BLK_DEV_GENERIC || BLK_DEV_HPT34X ||
BLK_DEV_HPT366 || BLK_DEV_PDC202XX_NEW || BLK_DEV_PDC202XX_OLD || BLK_DEV_TC86C001)
help
Normally, IDE controllers built into the motherboard (on-board
@@ -410,6 +410,10 @@ config BLK_DEV_OFFBOARD
Note that, if you do this, the order of the hd* devices will be rearranged which may require modification of fstab and other files.
+ Please also note that this method of assuring stable naming of + IDE devices is unreliable and use other means for achieving it + (i.e. udev).
+
If in doubt, say N.
config BLK_DEV_GENERIC
drivers/ide/ide-cd.c +1 -34
@@ -1650,31 +1650,6 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)return 1 ; } -static void post_transform_command (struct request *req) -{ -u8 *c = req->cmd; -char *ibuf; - -if (!blk_pc_request (req)) -return ; - -if (req->bio) - ibuf =bio_data (req->bio); -else - ibuf = req->data; - -if (!ibuf) -return ; - -/* -* set ansi-revision and response data as atapi -*/ -if (c[0 ] ==GPCMD_INQUIRY ) { - ibuf[2 ] |=2 ; - ibuf[3 ] = (ibuf[3 ] &0xf0 ) |2 ; - } -} -typedef void (xfer_func_t )(ide_drive_t *,void *,u32 );/*
@@ -1810,9 +1785,6 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)return ide_started; end_request: -if (!rq->data_len) -post_transform_command (rq); -spin_lock_irqsave (&ide_lock, flags);blkdev_dequeue_request (rq);end_that_request_last (rq,1 );
@@ -3049,12 +3021,7 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive)else printk (" drive" ); -printk (", %dkB Cache" ,be16_to_cpu (cap.buffer_size)); - -if (drive->using_dma) -ide_dma_verbose (drive); - -printk ("\n" ); +printk (KERN_CONT ", %dkB Cache\n" ,be16_to_cpu (cap.buffer_size));return nslots; }
drivers/ide/ide-disk.c +2 -31
@@ -13,32 +13,6 @@* and Andre Hedrick <[email protected]> * * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c. -* -* Version 1.00 move disk only code from ide.c to ide-disk.c -* support optional byte-swapping of all data -* Version 1.01 fix previous byte-swapping code -* Version 1.02 remove ", LBA" from drive identification msgs -* Version 1.03 fix display of id->buf_size for big-endian -* Version 1.04 add /proc configurable settings and S.M.A.R.T support -* Version 1.05 add capacity support for ATA3 >= 8GB -* Version 1.06 get boot-up messages to show full cyl count -* Version 1.07 disable door-locking if it fails -* Version 1.08 fixed CHS/LBA translations for ATA4 > 8GB, -* process of adding new ATA4 compliance. -* fixed problems in allowing fdisk to see -* the entire disk. -* Version 1.09 added increment of rq->sector in ide_multwrite -* added UDMA 3/4 reporting -* Version 1.10 request queue changes, Ultra DMA 100 -* Version 1.11 added 48-bit lba -* Version 1.12 adding taskfile io access method -* Version 1.13 added standby and flush-cache for notifier -* Version 1.14 added acoustic-wcache -* Version 1.15 convert all calls to ide_raw_taskfile -* since args will return register content. -* Version 1.16 added suspend-resume-checkpower -* Version 1.17 do flush on standby, do flush on ATA < ATA6 -* fix wcache setup. */ #define IDEDISK_VERSION "1.18"
@@ -961,11 +935,8 @@ static void idedisk_setup (ide_drive_t *drive)if (id->buf_size)printk (" w/%dKiB Cache" , id->buf_size/2 ); -printk (", CHS=%d/%d/%d" , - drive->bios_cyl, drive->bios_head, drive->bios_sect); -if (drive->using_dma) -ide_dma_verbose (drive); -printk ("\n" ); +printk (KERN_CONT ", CHS=%d/%d/%d\n" , + drive->bios_cyl, drive->bios_head, drive->bios_sect);/* write cache enabled? */ if ((id->csfo &1 ) || (id->cfs_enable_1 & (1 <<5 )))
drivers/ide/ide-dma.c +15 -51
101 lines not on this page · raw message
drivers/ide/ide-io.c +2 -1
@@ -970,7 +970,8 @@ static void ide_check_pm_state(ide_drive_t *drive, struct request *rq)if (rc)printk (KERN_WARNING "%s: bus not ready on wakeup\n" , drive->name);SELECT_DRIVE (drive); -HWIF (drive)->OUTB (8 ,HWIF (drive)->io_ports[IDE_CONTROL_OFFSET ]); +if (IDE_CONTROL_REG ) +HWIF (drive)->OUTB (drive->ctl,IDE_CONTROL_REG ); rc =ide_wait_not_busy (HWIF (drive),100000 );if (rc)printk (KERN_WARNING "%s: drive not ready on wakeup\n" , drive->name);
drivers/ide/ide-iops.c +3 -0
@@ -748,6 +748,9 @@ int ide_driveid_update(ide_drive_t *drive) drive->id->dma_1word = id->dma_1word;/* anything more ? */ kfree (id); + +if (drive->using_dma &&ide_id_dma_bug (drive)) +ide_dma_off (drive); }return 1 ;
drivers/ide/ide-lib.c +29 -26
70 lines not on this page · raw message
drivers/ide/ide-probe.c +4 -17
@@ -13,22 +13,8 @@* * This is the IDE probe module, as evolved from hd.c and ide.c. * -* Version 1.00 move drive probing code from ide.c to ide-probe.c -* Version 1.01 fix compilation problem for m68k -* Version 1.02 increase WAIT_PIDENTIFY to avoid CD-ROM locking at boot -* by Andrea Arcangeli -* Version 1.03 fix for (hwif->chipset == ide_4drives) -* Version 1.04 fixed buggy treatments of known flash memory cards -* -* Version 1.05 fix for (hwif->chipset == ide_pdc4030) -* added ide6/7/8/9 -* allowed for secondary flash card to be detectable -* with new flag : drive->ata_flash : 1; -* Version 1.06 stream line request queue and prep for cascade project. -* Version 1.07 max_sect <= 255; slower disks would get behind and -* then fall over when they get to 256. Paul G. -* Version 1.10 Update set for new IDE. drive->id is now always -* valid after probe time even with noprobe +* -- increase WAIT_PIDENTIFY to avoid CD-ROM locking at boot +* by Andrea Arcangeli */ #include <linux/module.h>
@@ -667,7 +653,8 @@ static int wait_hwif_ready(ide_hwif_t *hwif)/* Ignore disks that we will not probe for later. */ if (!drive->noprobe || drive->present) {SELECT_DRIVE (drive); - hwif->OUTB (8 , hwif->io_ports[IDE_CONTROL_OFFSET ]); +if (IDE_CONTROL_REG ) + hwif->OUTB (drive->ctl,IDE_CONTROL_REG );mdelay (2 ); rc =ide_wait_not_busy (hwif,35000 );if (rc)
drivers/ide/ide.c +30 -0
@@ -800,11 +800,17 @@ int set_io_32bit(ide_drive_t *drive, int arg)if (arg <0 || arg >1 + (SUPPORT_VLB_SYNC <<1 ))return -EINVAL ; +if (ide_spin_wait_hwgroup (drive)) +return -EBUSY ; + drive->io_32bit = arg;#ifdef CONFIG_BLK_DEV_DTC2278 if (HWIF (drive)->chipset == ide_dtc2278)HWIF (drive)->drives[!drive->select.b.unit].io_32bit = arg;#endif /* CONFIG_BLK_DEV_DTC2278 */ + +spin_unlock_irq (&ide_lock); +return 0 ; }
@@ -1670,10 +1676,34 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,return sprintf (buf,"ide:m-%s\n" ,media_string (drive)); } +static ssize_t model_show (struct device *dev,struct device_attribute *attr, +char *buf) +{ +ide_drive_t *drive =to_ide_device (dev); +return sprintf (buf,"%s\n" , drive->id->model); +} + +static ssize_t firmware_show (struct device *dev,struct device_attribute *attr, +char *buf) +{ +ide_drive_t *drive =to_ide_device (dev); +return sprintf (buf,"%s\n" , drive->id->fw_rev); +} + +static ssize_t serial_show (struct device *dev,struct device_attribute *attr, +char *buf) +{ +ide_drive_t *drive =to_ide_device (dev); +return sprintf (buf,"%s\n" , drive->id->serial_no); +} +static struct device_attribute ide_dev_attrs[] = {__ATTR_RO (media),__ATTR_RO (drivename),__ATTR_RO (modalias), +__ATTR_RO (model), +__ATTR_RO (firmware), +__ATTR (serial,0400 , serial_show,NULL ), __ATTR_NULL };
drivers/ide/pci/hpt366.c +70 -1
87 lines not on this page · raw message
drivers/ide/pci/pdc202xx_new.c +2 -1
@@ -482,8 +482,9 @@ static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev) {struct pci_dev *dev2; - dev2 =pci_get_slot (dev->bus,PCI_DEVFN (PCI_SLOT (dev->devfn) +2 , + dev2 =pci_get_slot (dev->bus,PCI_DEVFN (PCI_SLOT (dev->devfn) +1 ,PCI_FUNC (dev->devfn))); +if (dev2 && dev2->vendor == dev->vendor && dev2->device == dev->device) {
drivers/ide/setup-pci.c +16 -15
@@ -704,7 +704,7 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_devices);/* * Module interfaces */ - +static int pre_init =1 ;/* Before first ordered IDE scan */ static LIST_HEAD (ide_pci_drivers);
@@ -714,7 +714,7 @@ static LIST_HEAD(ide_pci_drivers);* @module: owner module of the driver * * Registers a driver with the IDE layer. The IDE layer arranges that -* boot time setup is done in the expected device order and then +* boot time setup is done in the expected device order and then * hands the controllers off to the core PCI code to do the rest of * the work. *
@@ -724,13 +724,12 @@ static LIST_HEAD(ide_pci_drivers);int __ide_pci_register_driver (struct pci_driver *driver,struct module *module,const char *mod_name) { -if (!pre_init) +if (!pre_init)return __pci_register_driver (driver, module, mod_name); driver->driver.owner = module;list_add_tail (&driver->node, &ide_pci_drivers);return 0 ; } -EXPORT_SYMBOL_GPL (__ide_pci_register_driver);/**
@@ -741,17 +740,18 @@ EXPORT_SYMBOL_GPL(__ide_pci_register_driver);* This is only used during boot up to get the ordering correct. After * boot up the pci layer takes over the job. */ - +static int __init ide_scan_pcidev (struct pci_dev *dev) {struct list_head *l;struct pci_driver *d; - +list_for_each (l, &ide_pci_drivers) { d = list_entry(l, struct pci_driver, node);if (d->id_table) { -const struct pci_device_id *id =pci_match_id (d->id_table, - dev); +const struct pci_device_id *id = +pci_match_id (d->id_table, dev); +if (id !=NULL && d->probe (dev, id) >=0 ) { dev->driver = d;pci_dev_get (dev);
@@ -779,13 +779,13 @@ void __init ide_scan_pcibus (int scan_direction) pre_init =0 ;if (!scan_direction) -while ((dev =pci_get_device (PCI_ANY_ID ,PCI_ANY_ID , dev)) !=NULL ) +while ((dev =pci_get_device (PCI_ANY_ID ,PCI_ANY_ID , dev)))ide_scan_pcidev (dev);else -while ((dev =pci_get_device_reverse (PCI_ANY_ID ,PCI_ANY_ID , dev)) - !=NULL ) +while ((dev =pci_get_device_reverse (PCI_ANY_ID ,PCI_ANY_ID , + dev)))ide_scan_pcidev (dev); - +/* * Hand the drivers over to the PCI layer now we * are post init.
@@ -794,9 +794,10 @@ void __init ide_scan_pcibus (int scan_direction)list_for_each_safe (l, n, &ide_pci_drivers) {list_del (l); d = list_entry(l, struct pci_driver, node); -if (__pci_register_driver (d, d->driver.owner, d->driver.mod_name)) -printk (KERN_ERR "%s: failed to register driver for %s\n" , - __FUNCTION__, d->driver.mod_name); +if (__pci_register_driver (d, d->driver.owner, + d->driver.mod_name)) +printk (KERN_ERR "%s: failed to register %s driver\n" , + __FUNCTION__, d->driver.mod_name); } }#endif
drivers/scsi/ide-scsi.c +6 -2
@@ -242,6 +242,11 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign } } +static void ide_scsi_hex_dump (u8 *data,int len) +{ +print_hex_dump (KERN_CONT ,"" ,DUMP_PREFIX_NONE ,16 ,1 , data, len,0 ); +} +static int idescsi_check_condition (ide_drive_t *drive,struct request *failed_command) {idescsi_scsi_t *scsi =drive_to_idescsi (drive);
@@ -272,8 +277,7 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co pc->scsi_cmd = ((idescsi_pc_t *) failed_command->special)->scsi_cmd;if (test_bit (IDESCSI_LOG_CMD , &scsi->log)) {printk ("ide-scsi: %s: queue cmd = " , drive->name); -print_hex_dump (KERN_CONT ,"" ,DUMP_PREFIX_NONE ,16 ,1 , pc->c, -6 ,0 ); +ide_scsi_hex_dump (pc->c,6 ); } rq->rq_disk = scsi->disk;return ide_do_drive_cmd (drive, rq, ide_preempt);
@@ -328,8 +332,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs)idescsi_pc_t *opc = (idescsi_pc_t *) rq->buffer;if (log) { printk ("ide-scsi: %s: wrap up check %lu, rst = ", drive->name,
opc->scsi_cmd->serial_number);
- print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
- pc->buffer, 16, 0);
+ ide_scsi_hex_dump(pc->buffer, 16);
}
memcpy((void *) opc->scsi_cmd->sense_buffer, pc->buffer, SCSI_SENSE_BUFFERSIZE); kfree(pc->buffer);
@@ -808,12 +811,10 @@ static int idescsi_queue (struct scsi_cmnd *cmd,
if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) {
printk ("ide-scsi: %s: que %lu, cmd = ", drive->name, cmd->serial_number);
- print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
- cmd->cmnd, cmd->cmd_len, 0);
+ ide_scsi_hex_dump(cmd->cmnd, cmd->cmd_len);
if (memcmp(pc->c, cmd->cmnd, cmd->cmd_len)) {
printk ("ide-scsi: %s: que %lu, tsl = ", drive->name, cmd->serial_number);
- print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
- pc->c, 12, 0);
+ ide_scsi_hex_dump(pc->c, 12);
}
}
include/linux/ide.h +3 -3
@@ -1255,6 +1255,7 @@ int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);#ifdef CONFIG_BLK_DEV_IDEDMA int __ide_dma_bad_drive (ide_drive_t *); +int ide_id_dma_bug (ide_drive_t *);u8 ide_find_dma_mode (ide_drive_t *,u8 );
@@ -1264,7 +1265,6 @@ static inline u8 ide_max_dma_mode(ide_drive_t *drive) }void ide_dma_off (ide_drive_t *); -void ide_dma_verbose (ide_drive_t *);int ide_set_dma (ide_drive_t *);ide_startstop_t ide_dma_intr (ide_drive_t *);
@@ -1287,6 +1287,7 @@ extern void ide_dma_timeout(ide_drive_t *);#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ #else +static inline int ide_id_dma_bug (ide_drive_t *drive) {return 0 ; }static inline u8 ide_find_dma_mode (ide_drive_t *drive,u8 speed) {return 0 ; }static inline u8 ide_max_dma_mode (ide_drive_t *drive) {return 0 ; }static inline void ide_dma_off (ide_drive_t *drive) { ; }
@@ -1333,8 +1334,7 @@ static inline void ide_set_hwifdata (ide_hwif_t * hwif, void *data) hwif->hwif_data = data; } -/* ide-lib.c */ -extern char *ide_xfer_verbose (u8 xfer_rate); +const char *ide_xfer_verbose (u8 mode);extern void ide_toggle_bounce (ide_drive_t *drive,int on);extern int ide_set_xfer_rate (ide_drive_t *drive,u8 rate);