pata_ninja32: update ID table
PATCH 1/7 pata_ninja32: update ID table
From: Alan Cox <[email protected]>
---
drivers/ata/pata_ninja32.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
drivers/ata/pata_ninja32.c +7 -2
@@ -44,7 +44,7 @@#include <linux/libata.h> #define DRV_NAME "pata_ninja32" -#define DRV_VERSION "0.1.1" +#define DRV_VERSION "0.1.3"/**
@@ -130,7 +130,8 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)return rc;pci_set_master (dev); -/* Set up the register mappings */ +/* Set up the register mappings. We use the I/O mapping as only the +older chips also have MMIO on BAR 1 */ base = host->iomap[0 ];if (!base)return -ENOMEM ;
@@ -167,8 +168,12 @@ static int ninja32_reinit_one(struct pci_dev *pdev)#endif static const struct pci_device_id ninja32[] = { + {0x10FC ,0x0003 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, + {0x1145 ,0x8008 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, + {0x1145 ,0xf008 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, {0x1145 ,0xf021 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, {0x1145 ,0xf024 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, + {0x1145 ,0xf02C ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, { }, };
PATCH 2/7 pata_ali: force initialise a few bits
From: Alan Cox <[email protected]>
We can't assume some of the setup here on non x86 boxes.
---
drivers/ata/pata_ali.c | 71 ++++++++++++++++++++++++++---------------------- 1 files changed, 38 insertions(+), 33 deletions(-)
drivers/ata/pata_ali.c +38 -33
@@ -19,7 +19,9 @@* * TODO/CHECK * Cannot have ATAPI on both master & slave for rev < c2 (???) but -* otherwise should do atapi DMA. +* otherwise should do atapi DMA (For now for old we do PIO only for +* ATAPI) +* Review Sunblade workaround. */ #include <linux/kernel.h>
@@ -33,12 +35,14 @@#include <linux/dmi.h> #define DRV_NAME "pata_ali" -#define DRV_VERSION "0.7.5" +#define DRV_VERSION "0.7.7"static int ali_atapi_dma =0 ;module_param_named (atapi_dma, ali_atapi_dma, int,0644 );MODULE_PARM_DESC (atapi_dma,"Enable ATAPI DMA (0=disable, 1=enable)" ); +static struct pci_dev *isa_bridge; +/* * Cable special cases */
@@ -401,52 +405,49 @@ static struct ata_port_operations ali_c5_port_ops = {static void ali_init_chipset (struct pci_dev *pdev) {u8 tmp; -struct pci_dev *north, *isa_bridge; +struct pci_dev *north;/* * The chipset revision selects the driver operations and * mode data. */ -if (pdev->revision >=0x20 && pdev->revision <0xC2 ) { -/* 1543-E/F, 1543C-C, 1543C-D, 1543C-E */ -pci_read_config_byte (pdev,0x4B , &tmp); -/* Clear CD-ROM DMA write bit */ - tmp &=0x7F ; -pci_write_config_byte (pdev,0x4B , tmp); - }else if (pdev->revision >=0xC2 ) { -/* Enable cable detection logic */ +if (pdev->revision <=0x20 ) { +pci_read_config_byte (pdev,0x53 , &tmp); + tmp |=0x03 ; +pci_write_config_byte (pdev,0x53 , tmp); + }else { +pci_read_config_byte (pdev,0x4a , &tmp); +pci_write_config_byte (pdev,0x4a , tmp |0x20 );pci_read_config_byte (pdev,0x4B , &tmp); -pci_write_config_byte (pdev,0x4B , tmp |0x08 ); - } - north =pci_get_bus_and_slot (0 ,PCI_DEVFN (0 ,0 )); - isa_bridge =pci_get_device (PCI_VENDOR_ID_AL ,PCI_DEVICE_ID_AL_M1533 ,NULL ); - -if (north && north->vendor ==PCI_VENDOR_ID_AL && isa_bridge) { -/* Configure the ALi bridge logic. For non ALi rely on BIOS. -Set the south bridge enable bit */ -pci_read_config_byte (isa_bridge,0x79 , &tmp); -if (pdev->revision ==0xC2 ) -pci_write_config_byte (isa_bridge,0x79 , tmp |0x04 ); -else if (pdev->revision >0xC2 && pdev->revision <0xC5 ) -pci_write_config_byte (isa_bridge,0x79 , tmp |0x02 ); - } -if (pdev->revision >=0x20 ) { +if (pdev->revision <0xC2 ) +/* 1543-E/F, 1543C-C, 1543C-D, 1543C-E */ +/* Clear CD-ROM DMA write bit */ + tmp &=0x7F ; +/* Cable and UDMA */ +pci_write_config_byte (pdev,0x4B , tmp |0x09 );/* * CD_ROM DMA on (0x53 bit 0). Enable this even if we want * to use PIO. 0x53 bit 1 (rev 20 only) - enable FIFO control * via 0x54/55. */ pci_read_config_byte (pdev,0x53 , &tmp); -if (pdev->revision <=0x20 ) - tmp &= ~0x02 ;if (pdev->revision >=0xc7 ) tmp |=0x03 ;else tmp |=0x01 ;/* CD_ROM enable for DMA */ pci_write_config_byte (pdev,0x53 , tmp); } -pci_dev_put (isa_bridge); + north =pci_get_bus_and_slot (0 ,PCI_DEVFN (0 ,0 )); +if (north && north->vendor ==PCI_VENDOR_ID_AL && isa_bridge) { +/* Configure the ALi bridge logic. For non ALi rely on BIOS. +Set the south bridge enable bit */ +pci_read_config_byte (isa_bridge,0x79 , &tmp); +if (pdev->revision ==0xC2 ) +pci_write_config_byte (isa_bridge,0x79 , tmp |0x04 ); +else if (pdev->revision >0xC2 && pdev->revision <0xC5 ) +pci_write_config_byte (isa_bridge,0x79 , tmp |0x02 ); + }pci_dev_put (north);ata_pci_bmdma_clear_simplex (pdev); }
@@ -516,7 +517,6 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)const struct ata_port_info *ppi[] = {NULL ,NULL };u8 tmp; -struct pci_dev *isa_bridge;int rc; rc =pcim_enable_device (pdev);
@@ -543,14 +543,12 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)ali_init_chipset (pdev); - isa_bridge =pci_get_device (PCI_VENDOR_ID_AL ,PCI_DEVICE_ID_AL_M1533 ,NULL );if (isa_bridge && pdev->revision >=0x20 && pdev->revision <0xC2 ) {/* Are we paired with a UDMA capable chip */ pci_read_config_byte (isa_bridge,0x5E , &tmp);if ((tmp &0x1E ) ==0x12 ) ppi[0 ] = &info_20_udma; } -pci_dev_put (isa_bridge);return ata_pci_sff_init_one (pdev, ppi, &ali_sht,NULL ); }
@@ -590,13 +588,20 @@ static struct pci_driver ali_pci_driver = {static int __init ali_init (void ) { -return pci_register_driver (&ali_pci_driver); +int ret; + isa_bridge =pci_get_device (PCI_VENDOR_ID_AL ,PCI_DEVICE_ID_AL_M1533 ,NULL ); + + ret =pci_register_driver (&ali_pci_driver); +if (ret <0 ) +pci_dev_put (isa_bridge); +return ret; } static void __exit ali_exit(void) {pci_unregister_driver (&ali_pci_driver); +pci_dev_put (isa_bridge); }
PATCH 3/7 ata: Fix experimental tags
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Various tags are now way out of date
---
drivers/ata/Kconfig | 44 ++++++++++++++++++++++---------------------- 1 files changed, 22 insertions(+), 22 deletions(-)
drivers/ata/Kconfig +22 -22
@@ -153,7 +153,7 @@ config SATA_PROMISE If unsure, say N. config SATA_SX4 - tristate "Promise SATA SX4 support" + tristate "Promise SATA SX4 support (Experimental)" depends on PCI && EXPERIMENTAL help This option enables support for Promise Serial ATA SX4.
@@ -219,8 +219,8 @@ config PATA_ACPI otherwise unsupported hardware. config PATA_ALI - tristate "ALi PATA support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "ALi PATA support" + depends on PCI help This option enables support for the ALi ATA interfaces found on the many ALi chipsets.
@@ -263,7 +263,7 @@ config PATA_ATIIXP If unsure, say N. config PATA_CMD640_PCI - tristate "CMD640 PCI PATA support (Very Experimental)" + tristate "CMD640 PCI PATA support (Experimental)" depends on PCI && EXPERIMENTAL help This option enables support for the CMD640 PCI IDE
@@ -291,8 +291,8 @@ config PATA_CS5520 If unsure, say N. config PATA_CS5530 - tristate "CS5530 PATA support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "CS5530 PATA support" + depends on PCI help This option enables support for the Cyrix/NatSemi/AMD CS5530 companion chip used with the MediaGX/Geode processor family.
@@ -309,8 +309,8 @@ config PATA_CS5535 If unsure, say N. config PATA_CS5536 - tristate "CS5536 PATA support (Experimental)" - depends on PCI && X86 && !X86_64 && EXPERIMENTAL + tristate "CS5536 PATA support" + depends on PCI && X86 && !X86_64 help This option enables support for the AMD CS5536 companion chip used with the Geode LX processor family.
@@ -363,7 +363,7 @@ config PATA_HPT37X If unsure, say N. config PATA_HPT3X2N - tristate "HPT 372N/302N PATA support (Very Experimental)" + tristate "HPT 372N/302N PATA support (Experimental)" depends on PCI && EXPERIMENTAL help This option enables support for the N variant HPT PATA
@@ -389,8 +389,8 @@ config PATA_HPT3X3_DMA problems with DMA on this chipset. config PATA_ISAPNP - tristate "ISA Plug and Play PATA support (Experimental)" - depends on EXPERIMENTAL && ISAPNP + tristate "ISA Plug and Play PATA support" + depends on ISAPNP help This option enables support for ISA plug & play ATA controllers such as those found on old soundcards.
@@ -498,8 +498,8 @@ config PATA_NINJA32 If unsure, say N. config PATA_NS87410 - tristate "Nat Semi NS87410 PATA support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "Nat Semi NS87410 PATA support" + depends on PCI help This option enables support for the National Semiconductor NS87410 PCI-IDE controller.
@@ -507,8 +507,8 @@ config PATA_NS87410 If unsure, say N. config PATA_NS87415 - tristate "Nat Semi NS87415 PATA support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "Nat Semi NS87415 PATA support" + depends on PCI help This option enables support for the National Semiconductor NS87415 PCI-IDE controller.
@@ -544,8 +544,8 @@ config PATA_PCMCIA If unsure, say N. config PATA_PDC_OLD - tristate "Older Promise PATA controller support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "Older Promise PATA controller support" + depends on PCI help This option enables support for the Promise 20246, 20262, 20263, 20265 and 20267 adapters.
@@ -559,7 +559,7 @@ config PATA_QDI Support for QDI 6500 and 6580 PATA controllers on VESA local bus. config PATA_RADISYS - tristate "RADISYS 82600 PATA support (Very Experimental)" + tristate "RADISYS 82600 PATA support (Experimental)" depends on PCI && EXPERIMENTAL help This option enables support for the RADISYS 82600
@@ -586,8 +586,8 @@ config PATA_RZ1000 If unsure, say N. config PATA_SC1200 - tristate "SC1200 PATA support (Very Experimental)" - depends on PCI && EXPERIMENTAL + tristate "SC1200 PATA support" + depends on PCI help This option enables support for the NatSemi/AMD SC1200 SoC companion chip used with the Geode processor family.
@@ -620,8 +620,8 @@ config PATA_SIL680 If unsure, say N. config PATA_SIS - tristate "SiS PATA support (Experimental)" - depends on PCI && EXPERIMENTAL + tristate "SiS PATA support" + depends on PCI help This option enables support for SiS PATA controllers
Re: [PATCH 3/7] ata: Fix experimental tags
Quoted 14 lines · Alan Cox
From: Alan Cox <[email protected]>
Various tags are now way out of date
---drivers/ata/Kconfig | 44 ++++++++++++++++++++++---------------------- 1 files changed, 22 insertions(+), 22 deletions(-)drivers/ata/Kconfig +0
-0
drivers/ata/Kconfig config SATA_PROMISE · line 159
Quoted 8 lines
drivers/ata/Kconfig +1
-1@@ -153,7 +153,7 @@ config SATA_PROMISE If unsure, say N. config SATA_SX4 - tristate "Promise SATA SX4 support" + tristate "Promise SATA SX4 support (Experimental)" depends on PCI && EXPERIMENTAL help This option enables support for Promise Serial ATA SX4.
Forgot to remove the EXPERIMENTAL dependency on this one?
Re: [PATCH 3/7] ata: Fix experimental tags
In reply to Alan CoxQuoted 6 lines · Alan Cox
From: Alan Cox <[email protected]>
Various tags are now way out of date
---drivers/ata/Kconfig | 44 ++++++++++++++++++++++----------------------
applied #upstream-fixes
PATCH 4/7 libata: Drain data on errors
In reply to Alan CoxFrom: Alan Cox <[email protected]>
If the device is signalling that there is data to drain after an error we should read the bytes out and throw them away. Without this some devices and controllers get wedged and don't recover.
Based on earlier work by Mark Lord
---
drivers/ata/libata-sff.c | 44 +++++++++++++++++++++++++++++++++++++++++++- drivers/ata/pata_pcmcia.c | 34 +++++++++++++++++++++++++++++++++- include/linux/libata.h | 3 +++ 3 files changed, 79 insertions(+), 2 deletions(-)
drivers/ata/libata-sff.c +43 -1
@@ -52,6 +52,7 @@ const struct ata_port_operations ata_sff_port_ops = { .softreset = ata_sff_softreset, .hardreset = sata_sff_hardreset, .postreset = ata_sff_postreset, + .drain_fifo = ata_sff_drain_fifo, .error_handler = ata_sff_error_handler, .post_internal_cmd = ata_sff_post_internal_cmd,
@@ -2082,6 +2083,38 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes) }/** +* ata_sff_drain_fifo - Stock FIFO drain logic for SFF controllers +* @qc: command +* +* Drain the FIFO and device of any stuck data following a command +* failing to complete. In some cases this is neccessary before a +* reset will recover the device. +* +*/ + +void ata_sff_drain_fifo (struct ata_queued_cmd *qc) +{ +int count; +struct ata_port *ap; + +/* We only need to flush incoming data when a command was running */ +if (qc ==NULL || qc->dma_dir ==DMA_TO_DEVICE ) +return ; + + ap = qc->ap; +/* Drain up to 64K of data before we give up this recovery method */ +for (count =0 ; (ap->ops->sff_check_status (ap) &ATA_DRQ ) + && count <32768 ; count++) +ioread16 (ap->ioaddr.data_addr); + +/* Can become DEBUG later */ +if (count) +ata_port_printk (ap,KERN_WARNING , +"drained %d bytes to clear DRQ.\n" , count); + +} + +/** * ata_sff_error_handler - Stock error handler for BMDMA controller * @ap: port to handle error for *
@@ -2122,7 +2155,8 @@ void ata_sff_error_handler(struct ata_port *ap)* really a timeout event, adjust error mask and * cancel frozen state. */ -if (qc->err_mask ==AC_ERR_TIMEOUT && (host_stat &ATA_DMA_ERR )) { +if (qc->err_mask ==AC_ERR_TIMEOUT + && (host_stat &ATA_DMA_ERR )) { qc->err_mask =AC_ERR_HOST_BUS ; thaw =1 ; }
@@ -2133,6 +2167,13 @@ void ata_sff_error_handler(struct ata_port *ap)ata_sff_sync (ap);/* FIXME: We don't need this */ ap->ops->sff_check_status (ap); ap->ops->sff_irq_clear (ap); +/* We *MUST* do FIFO draining before we issue a reset as several +* devices helpfully clear their internal state and will lock solid +* if we touch the data port post reset. Pass qc in case anyone wants +* to do different PIO/DMA recovery or has per command fixups +*/ +if (ap->ops->drain_fifo) + ap->ops->drain_fifo (qc);spin_unlock_irqrestore (ap->lock, flags);
@@ -2856,6 +2897,7 @@ EXPORT_SYMBOL_GPL(ata_sff_wait_after_reset);EXPORT_SYMBOL_GPL (ata_sff_softreset);EXPORT_SYMBOL_GPL (sata_sff_hardreset);EXPORT_SYMBOL_GPL (ata_sff_postreset); +EXPORT_SYMBOL_GPL (ata_sff_drain_fifo);EXPORT_SYMBOL_GPL (ata_sff_error_handler);EXPORT_SYMBOL_GPL (ata_sff_post_internal_cmd);EXPORT_SYMBOL_GPL (ata_sff_port_start);
drivers/ata/pata_pcmcia.c +33 -1
@@ -42,7 +42,7 @@#define DRV_NAME "pata_pcmcia" -#define DRV_VERSION "0.3.3" +#define DRV_VERSION "0.3.5"/* * Private data structure to glue stuff together
@@ -126,6 +126,37 @@ static unsigned int ata_data_xfer_8bit(struct ata_device *dev,return buflen; } +/** +* pcmcia_8bit_drain_fifo - Stock FIFO drain logic for SFF controllers +* @qc: command +* +* Drain the FIFO and device of any stuck data following a command +* failing to complete. In some cases this is neccessary before a +* reset will recover the device. +* +*/ + +void pcmcia_8bit_drain_fifo (struct ata_queued_cmd *qc) +{ +int count; +struct ata_port *ap; + +/* We only need to flush incoming data when a command was running */ +if (qc ==NULL || qc->dma_dir ==DMA_TO_DEVICE ) +return ; + + ap = qc->ap; + +/* Drain up to 64K of data before we give up this recovery method */ +for (count =0 ; (ap->ops->sff_check_status (ap) &ATA_DRQ ) + && count++ <65536 ;) +ioread8 (ap->ioaddr.data_addr); + +/* Can become DEBUG later */ +ata_port_printk (ap,KERN_WARNING ,"drained %d bytes to clear DRQ.\n" , + count); + +}static struct scsi_host_template pcmcia_sht = {ATA_PIO_SHT (DRV_NAME ),
@@ -143,6 +174,7 @@ static struct ata_port_operations pcmcia_8bit_port_ops = { .sff_data_xfer = ata_data_xfer_8bit, .cable_detect = ata_cable_40wire, .set_mode = pcmcia_set_mode_8bit, + .drain_fifo = pcmcia_8bit_drain_fifo, };#define CS_CHECK (fn, ret) \
include/linux/libata.h +3 -0
@@ -825,6 +825,8 @@ struct ata_port_operations {void (*bmdma_start)(struct ata_queued_cmd *qc);void (*bmdma_stop)(struct ata_queued_cmd *qc);u8 (*bmdma_status)(struct ata_port *ap); + +void (*drain_fifo)(struct ata_queued_cmd *qc);#endif /* CONFIG_ATA_SFF */ ssize_t (*em_show)(struct ata_port *ap,char *buf);
@@ -1531,6 +1533,7 @@ extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes,extern int sata_sff_hardreset (struct ata_link *link,unsigned int *class,unsigned long deadline);extern void ata_sff_postreset (struct ata_link *link,unsigned int *classes); +extern void ata_sff_drain_fifo (struct ata_queued_cmd *qc);extern void ata_sff_error_handler (struct ata_port *ap);extern void ata_sff_post_internal_cmd (struct ata_queued_cmd *qc);extern int ata_sff_port_start (struct ata_port *ap);
PATCH 5/7 libata: Improve timeout handling
In reply to Alan CoxFrom: Alan Cox <[email protected]>
On a timeout call a device specific handler early in the recovery so that we can complete and process successful commands which timed out due to IRQ loss or the like rather more elegantly.
---
drivers/ata/libata-eh.c | 19 +++++++++++++++++-- drivers/ata/libata-sff.c | 46 ++++++++++++++++++++++++++++++++++++++++++++- drivers/ata/pata_isapnp.c | 12 ++++++++++-- include/linux/libata.h | 2 ++ 4 files changed, 74 insertions(+), 5 deletions(-)
drivers/ata/libata-eh.c +17 -2
@@ -518,7 +518,7 @@ void ata_scsi_error(struct Scsi_Host *host)/* For new EH, all qcs are finished in one of three ways - * normal completion, error completion, and SCSI timeout. -* Both cmpletions can race against SCSI timeout. When normal +* Both completions can race against SCSI timeout. When normal * completion wins, the qc never reaches EH. When error * completion wins, the qc has ATA_QCFLAG_FAILED set. *
@@ -533,7 +533,19 @@ void ata_scsi_error(struct Scsi_Host *host)int nr_timedout =0 ;spin_lock_irqsave (ap->lock, flags); - + +/* This must occur under the ap->lock as we don't want +a polled recovery to race the real interrupt handler ++ The lost_interrupt handler checks for any completed but +non-notified command and completes much like an IRQ handler. ++ We then fall into the error recovery code which will treat +this as if normal completion won the race */ + +if (ap->ops->lost_interrupt) + ap->ops->lost_interrupt (ap); +list_for_each_entry_safe (scmd, tmp, &host->eh_cmd_q, eh_entry) {struct ata_queued_cmd *qc;
@@ -577,6 +589,9 @@ void ata_scsi_error(struct Scsi_Host *host) ap->eh_tries =ATA_EH_MAX_TRIES ; }else spin_unlock_wait (ap->lock); + +/* If we timed raced normal completion and there is nothing to +recover nr_timedout == 0 why exactly are we doing error recovery ? */ repeat:/* invoke error handler */
drivers/ata/libata-sff.c +45 -1
70 lines not on this page · raw message
drivers/ata/pata_isapnp.c +10 -2
@@ -17,7 +17,7 @@#include <linux/libata.h> #define DRV_NAME "pata_isapnp" -#define DRV_VERSION "0.2.2" +#define DRV_VERSION "0.2.5"static struct scsi_host_template isapnp_sht = {ATA_PIO_SHT (DRV_NAME ),
@@ -28,6 +28,13 @@ static struct ata_port_operations isapnp_port_ops = { .cable_detect = ata_cable_40wire, }; +static struct ata_port_operations isapnp_noalt_port_ops = { + .inherits = &ata_sff_port_ops, + .cable_detect = ata_cable_40wire, +/* No altstatus so we don't want to use the lost interrupt poll */ + .lost_interrupt =ATA_OP_NULL , +}; +/** * isapnp_init_one - attach an isapnp interface * @idev: PnP device
@@ -65,7 +72,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev ap = host->ports[0 ]; - ap->ops = &isapnp_port_ops; + ap->ops = &isapnp_noalt_port_ops; ap->pio_mask =1 ; ap->flags |=ATA_FLAG_SLAVE_POSS ;
@@ -76,6 +83,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev pnp_port_start(idev, 1), 1); ap->ioaddr.altstatus_addr = ctl_addr; ap->ioaddr.ctl_addr = ctl_addr; + ap->ops = &isapnp_port_ops; }ata_sff_std_ports (&ap->ioaddr);
include/linux/libata.h +2 -0
@@ -784,6 +784,7 @@ struct ata_port_operations {ata_reset_fn_t pmp_hardreset;ata_postreset_fn_t pmp_postreset;void (*error_handler)(struct ata_port *ap); +void (*lost_interrupt)(struct ata_port *ap);void (*post_internal_cmd)(struct ata_queued_cmd *qc);/*
@@ -1521,6 +1522,7 @@ extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);extern unsigned int ata_sff_host_intr (struct ata_port *ap,struct ata_queued_cmd *qc);extern irqreturn_t ata_sff_interrupt (int irq,void *dev_instance); +extern void ata_sff_lost_interrupt (struct ata_port *ap);extern void ata_sff_freeze (struct ata_port *ap);extern void ata_sff_thaw (struct ata_port *ap);extern int ata_sff_prereset (struct ata_link *link,unsigned long deadline);
PATCH 6/7 libata: clean up the SFF code for coding style
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/ata/libata-sff.c | 136 +++++++++++++++++++++++----------------------- 1 files changed, 69 insertions(+), 67 deletions(-)
drivers/ata/libata-sff.c +69 -67
@@ -69,6 +69,7 @@ const struct ata_port_operations ata_sff_port_ops = { .port_start = ata_sff_port_start, }; +EXPORT_SYMBOL_GPL (ata_sff_port_ops);const struct ata_port_operations ata_bmdma_port_ops = { .inherits = &ata_sff_port_ops,
@@ -80,6 +81,7 @@ const struct ata_port_operations ata_bmdma_port_ops = { .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, }; +EXPORT_SYMBOL_GPL (ata_bmdma_port_ops);/** * ata_fill_sg - Fill PCI IDE PRD table
@@ -169,8 +171,9 @@ static void ata_fill_sg_dumb(struct ata_queued_cmd *qc) blen = len &0xffff ; ap->prd[pi].addr =cpu_to_le32 (addr);if (blen ==0 ) { -/* Some PATA chipsets like the CS5530 can't -cope with 0x0000 meaning 64K as the spec says */ +/* Some PATA chipsets like the CS5530 can't +cope with 0x0000 meaning 64K as the spec +says */ ap->prd[pi].flags_len =cpu_to_le32 (0x8000 ); blen =0x8000 ; ap->prd[++pi].addr =cpu_to_le32 (addr +0x8000 );
@@ -203,6 +206,7 @@ void ata_sff_qc_prep(struct ata_queued_cmd *qc)ata_fill_sg (qc); } +EXPORT_SYMBOL_GPL (ata_sff_qc_prep);/** * ata_sff_dumb_qc_prep - Prepare taskfile for submission
@@ -220,6 +224,7 @@ void ata_sff_dumb_qc_prep(struct ata_queued_cmd *qc)ata_fill_sg_dumb (qc); } +EXPORT_SYMBOL_GPL (ata_sff_dumb_qc_prep);/** * ata_sff_check_status - Read device status reg & clear interrupt
@@ -236,6 +241,7 @@ u8 ata_sff_check_status(struct ata_port *ap) {return ioread8 (ap->ioaddr.status_addr); } +EXPORT_SYMBOL_GPL (ata_sff_check_status);/** * ata_sff_altstatus - Read device alternate status reg
@@ -278,7 +284,7 @@ static u8 ata_sff_irq_status(struct ata_port *ap) status =ata_sff_altstatus (ap);/* Not us: We are busy */ if (status &ATA_BUSY ) -return status; +return status; }/* Clear INTRQ latch */ status = ap->ops->sff_check_status (ap);
@@ -322,6 +328,7 @@ void ata_sff_pause(struct ata_port *ap)ata_sff_sync (ap);ndelay (400 ); } +EXPORT_SYMBOL_GPL (ata_sff_pause);/** * ata_sff_dma_pause - Pause before commencing DMA
@@ -330,7 +337,7 @@ void ata_sff_pause(struct ata_port *ap)* Perform I/O fencing and ensure sufficient cycle delays occur * for the HDMA1:0 transition */ - +void ata_sff_dma_pause (struct ata_port *ap) {if (ap->ops->sff_check_altstatus || ap->ioaddr.altstatus_addr) {
@@ -344,6 +351,7 @@ void ata_sff_dma_pause(struct ata_port *ap)corruption. */ BUG (); } +EXPORT_SYMBOL_GPL (ata_sff_dma_pause);/** * ata_sff_busy_sleep - sleep until BSY clears, or timeout
@@ -399,6 +407,7 @@ int ata_sff_busy_sleep(struct ata_port *ap,return 0 ; } +EXPORT_SYMBOL_GPL (ata_sff_busy_sleep);static int ata_sff_check_ready (struct ata_link *link) {
@@ -425,6 +434,7 @@ int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline) {return ata_wait_ready (link, deadline, ata_sff_check_ready); } +EXPORT_SYMBOL_GPL (ata_sff_wait_ready);/** * ata_sff_dev_select - Select device 0/1 on ATA bus
@@ -452,6 +462,7 @@ void ata_sff_dev_select(struct ata_port *ap, unsigned int device)iowrite8 (tmp, ap->ioaddr.device_addr);ata_sff_pause (ap);/* needed; also flushes, for mmio */ } +EXPORT_SYMBOL_GPL (ata_sff_dev_select);/** * ata_dev_select - Select device 0/1 on ATA bus
@@ -516,6 +527,7 @@ u8 ata_sff_irq_on(struct ata_port *ap)return tmp; } +EXPORT_SYMBOL_GPL (ata_sff_irq_on);/** * ata_sff_irq_clear - Clear PCI IDE BMDMA interrupt.
@@ -537,6 +549,7 @@ void ata_sff_irq_clear(struct ata_port *ap)iowrite8 (ioread8 (mmio +ATA_DMA_STATUS ), mmio +ATA_DMA_STATUS ); } +EXPORT_SYMBOL_GPL (ata_sff_irq_clear);/** * ata_sff_tf_load - send taskfile registers to host controller
@@ -596,6 +609,7 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)ata_wait_idle (ap); } +EXPORT_SYMBOL_GPL (ata_sff_tf_load);/** * ata_sff_tf_read - input device's ATA taskfile shadow registers
@@ -636,6 +650,7 @@ void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf)WARN_ON (1 ); } } +EXPORT_SYMBOL_GPL (ata_sff_tf_read);/** * ata_sff_exec_command - issue ATA command to host controller
@@ -655,6 +670,7 @@ void ata_sff_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)iowrite8 (tf->command, ap->ioaddr.command_addr);ata_sff_pause (ap); } +EXPORT_SYMBOL_GPL (ata_sff_exec_command);/** * ata_tf_to_host - issue ATA taskfile to host controller
@@ -720,6 +736,7 @@ unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf,return words <<1 ; } +EXPORT_SYMBOL_GPL (ata_sff_data_xfer);/** * ata_sff_data_xfer_noirq - Transfer data by PIO
@@ -749,6 +766,7 @@ unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, unsigned char *buf,return consumed; } +EXPORT_SYMBOL_GPL (ata_sff_data_xfer_noirq);/** * ata_pio_sector - Transfer a sector of data.
@@ -925,13 +943,15 @@ next_sg: buf =kmap_atomic (page,KM_IRQ0 );/* do the actual data transfer */ - consumed = ap->ops->sff_data_xfer (dev, buf + offset, count, rw); + consumed = ap->ops->sff_data_xfer (dev, buf + offset, + count, rw);kunmap_atomic (buf,KM_IRQ0 );local_irq_restore (flags); }else { buf =page_address (page); - consumed = ap->ops->sff_data_xfer (dev, buf + offset, count, rw); + consumed = ap->ops->sff_data_xfer (dev, buf + offset, + count, rw); } bytes -=min (bytes, consumed);
@@ -1016,18 +1036,19 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)* RETURNS: * 1 if ok in workqueue, 0 otherwise. */ -static inline int ata_hsm_ok_in_wq (struct ata_port *ap,struct ata_queued_cmd *qc) +static inline int ata_hsm_ok_in_wq (struct ata_port *ap, +struct ata_queued_cmd *qc) {if (qc->tf.flags &ATA_TFLAG_POLLING )return 1 ;if (ap->hsm_task_state ==HSM_ST_FIRST ) {if (qc->tf.protocol ==ATA_PROT_PIO && - (qc->tf.flags &ATA_TFLAG_WRITE )) + (qc->tf.flags &ATA_TFLAG_WRITE ))return 1 ;if (ata_is_atapi (qc->tf.protocol) && - !(qc->dev->flags &ATA_DFLAG_CDB_INTR )) + !(qc->dev->flags &ATA_DFLAG_CDB_INTR ))return 1 ; }
@@ -1341,6 +1362,7 @@ fsm_start:return poll_next; } +EXPORT_SYMBOL_GPL (ata_sff_hsm_move);void ata_pio_task (struct work_struct *work) {
@@ -1510,6 +1532,7 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)return 0 ; } +EXPORT_SYMBOL_GPL (ata_sff_qc_issue);/** * ata_sff_qc_fill_rtf - fill result TF using ->sff_tf_read
@@ -1529,6 +1552,7 @@ bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc) qc->ap->ops->sff_tf_read (qc->ap, &qc->result_tf);return true; } +EXPORT_SYMBOL_GPL (ata_sff_qc_fill_rtf);/** * ata_sff_host_intr - Handle host interrupt for given (port, task)
@@ -1626,6 +1650,7 @@ idle_irq:#endif return 0 ;/* irq not handled */ } +EXPORT_SYMBOL_GPL (ata_sff_host_intr);/** * ata_sff_interrupt - Default ATA host interrupt handler
@@ -1670,6 +1695,7 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)return IRQ_RETVAL (handled); } +EXPORT_SYMBOL_GPL (ata_sff_interrupt);/** * ata_sff_lost_interrupt - Check for an apparent lost interrupt
@@ -1711,6 +1737,7 @@ void ata_sff_lost_interrupt(struct ata_port *ap)lost */ ata_sff_host_intr (ap, qc); } +EXPORT_SYMBOL_GPL (ata_sff_lost_interrupt);/** * ata_sff_freeze - Freeze SFF controller port
@@ -1739,6 +1766,7 @@ void ata_sff_freeze(struct ata_port *ap) ap->ops->sff_irq_clear (ap); } +EXPORT_SYMBOL_GPL (ata_sff_freeze);/** * ata_sff_thaw - Thaw SFF controller port
@@ -1756,6 +1784,7 @@ void ata_sff_thaw(struct ata_port *ap) ap->ops->sff_irq_clear (ap); ap->ops->sff_irq_on (ap); } +EXPORT_SYMBOL_GPL (ata_sff_thaw);/** * ata_sff_prereset - prepare SFF link for reset
@@ -1797,6 +1826,7 @@ int ata_sff_prereset(struct ata_link *link, unsigned long deadline)return 0 ; } +EXPORT_SYMBOL_GPL (ata_sff_prereset);/** * ata_devchk - PATA device presence detection
@@ -1909,6 +1939,7 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present,return class; } +EXPORT_SYMBOL_GPL (ata_sff_dev_classify);/** * ata_sff_wait_after_reset - wait for devices to become ready after reset
@@ -1985,6 +2016,7 @@ int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask,return ret; } +EXPORT_SYMBOL_GPL (ata_sff_wait_after_reset);static int ata_bus_softreset (struct ata_port *ap,unsigned int devmask,unsigned long deadline)
@@ -2057,6 +2089,7 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,DPRINTK ("EXIT, classes[0]=%u [1]=%u\n" , classes[0 ], classes[1 ]);return 0 ; } +EXPORT_SYMBOL_GPL (ata_sff_softreset);/** * sata_sff_hardreset - reset host port via SATA phy reset
@@ -2089,6 +2122,7 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,DPRINTK ("EXIT, class=%u\n" , *class);return rc; } +EXPORT_SYMBOL_GPL (sata_sff_hardreset);/** * ata_sff_postreset - SFF postreset callback
@@ -2124,6 +2158,7 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)if (ap->ioaddr.ctl_addr)iowrite8 (ap->ctl, ap->ioaddr.ctl_addr); } +EXPORT_SYMBOL_GPL (ata_sff_postreset);/** * ata_sff_drain_fifo - Stock FIFO drain logic for SFF controllers
@@ -2156,6 +2191,7 @@ void ata_sff_drain_fifo(struct ata_queued_cmd *qc) "drained %d bytes to clear DRQ.\n", count); } +EXPORT_SYMBOL_GPL (ata_sff_drain_fifo);/** * ata_sff_error_handler - Stock error handler for BMDMA controller
@@ -2236,6 +2272,7 @@ void ata_sff_error_handler(struct ata_port *ap)ata_do_eh (ap, ap->ops->prereset, softreset, hardreset, ap->ops->postreset); } +EXPORT_SYMBOL_GPL (ata_sff_error_handler);/** * ata_sff_post_internal_cmd - Stock post_internal_cmd for SFF controller
@@ -2258,6 +2295,7 @@ void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc)spin_unlock_irqrestore (ap->lock, flags); } +EXPORT_SYMBOL_GPL (ata_sff_post_internal_cmd);/** * ata_sff_port_start - Set port up for dma.
@@ -2278,6 +2316,7 @@ int ata_sff_port_start(struct ata_port *ap)return ata_port_start (ap);return 0 ; } +EXPORT_SYMBOL_GPL (ata_sff_port_start);/** * ata_sff_std_ports - initialize ioaddr with standard port offsets.
@@ -2303,6 +2342,7 @@ void ata_sff_std_ports(struct ata_ioports *ioaddr) ioaddr->status_addr = ioaddr->cmd_addr +ATA_REG_STATUS ; ioaddr->command_addr = ioaddr->cmd_addr +ATA_REG_CMD ; } +EXPORT_SYMBOL_GPL (ata_sff_std_ports);unsigned long ata_bmdma_mode_filter (struct ata_device *adev,unsigned long xfer_mask)
@@ -2314,6 +2354,7 @@ unsigned long ata_bmdma_mode_filter(struct ata_device *adev, xfer_mask &= ~(ATA_MASK_MWDMA |ATA_MASK_UDMA );return xfer_mask; } +EXPORT_SYMBOL_GPL (ata_bmdma_mode_filter);/** * ata_bmdma_setup - Set up PCI IDE BMDMA transaction
@@ -2342,6 +2383,7 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)/* issue r/w command */ ap->ops->sff_exec_command (ap, &qc->tf); } +EXPORT_SYMBOL_GPL (ata_bmdma_setup);/** * ata_bmdma_start - Start a PCI IDE BMDMA transaction
@@ -2374,6 +2416,7 @@ void ata_bmdma_start(struct ata_queued_cmd *qc)* unneccessarily delayed for MMIO */ } +EXPORT_SYMBOL_GPL (ata_bmdma_start);/** * ata_bmdma_stop - Stop PCI IDE BMDMA transfer
@@ -2398,6 +2441,7 @@ void ata_bmdma_stop(struct ata_queued_cmd *qc)/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ ata_sff_dma_pause (ap); } +EXPORT_SYMBOL_GPL (ata_bmdma_stop);/** * ata_bmdma_status - Read PCI IDE BMDMA status
@@ -2414,6 +2458,7 @@ u8 ata_bmdma_status(struct ata_port *ap) {return ioread8 (ap->ioaddr.bmdma_addr +ATA_DMA_STATUS ); } +EXPORT_SYMBOL_GPL (ata_bmdma_status);/** * ata_bus_reset - reset host port and associated ATA channel
@@ -2506,6 +2551,7 @@ err_out:DPRINTK ("EXIT\n" ); } +EXPORT_SYMBOL_GPL (ata_bus_reset);#ifdef CONFIG_PCI
@@ -2533,6 +2579,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)return -EOPNOTSUPP ;return 0 ; } +EXPORT_SYMBOL_GPL (ata_pci_bmdma_clear_simplex);/** * ata_pci_bmdma_init - acquire PCI BMDMA resources and init ATA host
@@ -2585,11 +2632,12 @@ int ata_pci_bmdma_init(struct ata_host *host) host->flags |=ATA_HOST_SIMPLEX ;ata_port_desc (ap,"bmdma 0x%llx" , - (unsigned long long )pci_resource_start (pdev,4 ) +8 * i); + (unsigned long long )pci_resource_start (pdev,4 ) +8 * i); }return 0 ; } +EXPORT_SYMBOL_GPL (ata_pci_bmdma_init);static int ata_resources_present (struct pci_dev *pdev,int port) {
@@ -2597,7 +2645,7 @@ static int ata_resources_present(struct pci_dev *pdev, int port)/* Check the PCI resources for this channel are enabled */ port = port *2 ; -for (i =0 ; i <2 ; i ++) { +for (i =0 ; i <2 ; i++) {if (pci_resource_start (pdev, port + i) ==0 ||pci_resource_len (pdev, port + i) ==0 )return 0 ;
@@ -2682,6 +2730,7 @@ int ata_pci_sff_init_host(struct ata_host *host)return 0 ; } +EXPORT_SYMBOL_GPL (ata_pci_sff_init_host);/** * ata_pci_sff_prepare_host - helper to prepare native PCI ATA host
@@ -2699,7 +2748,7 @@ int ata_pci_sff_init_host(struct ata_host *host)* 0 on success, -errno otherwise. */ int ata_pci_sff_prepare_host (struct pci_dev *pdev, -const struct ata_port_info *const * ppi, +const struct ata_port_info *const *ppi,struct ata_host **r_host) {struct ata_host *host;
@@ -2729,17 +2778,18 @@ int ata_pci_sff_prepare_host(struct pci_dev *pdev, *r_host = host;return 0 ; - err_bmdma: +err_bmdma:/* This is necessary because PCI and iomap resources are * merged and releasing the top group won't release the * acquired resources if some of those have been acquired * before entering this function. */ pcim_iounmap_regions (pdev,0xf ); - err_out: +err_out:devres_release_group (&pdev->dev,NULL );return rc; } +EXPORT_SYMBOL_GPL (ata_pci_sff_prepare_host);/** * ata_pci_sff_activate_host - start SFF host, request IRQ and register it
@@ -2825,7 +2875,7 @@ int ata_pci_sff_activate_host(struct ata_host *host, } rc =ata_host_register (host, sht); - out: +out:if (rc ==0 )devres_remove_group (dev,NULL );else
@@ -2833,6 +2883,7 @@ int ata_pci_sff_activate_host(struct ata_host *host,return rc; } +EXPORT_SYMBOL_GPL (ata_pci_sff_activate_host);/** * ata_pci_sff_init_one - Initialize/register PCI IDE host controller
@@ -2860,7 +2911,7 @@ int ata_pci_sff_activate_host(struct ata_host *host,* Zero on success, negative on errno-based value on error. */ int ata_pci_sff_init_one (struct pci_dev *pdev, -const struct ata_port_info *const * ppi, +const struct ata_port_info *const *ppi,struct scsi_host_template *sht,void *host_priv) {struct device *dev = &pdev->dev;
@@ -2899,7 +2950,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,pci_set_master (pdev); rc =ata_pci_sff_activate_host (host, ata_sff_interrupt, sht); - out: +out:if (rc ==0 )devres_remove_group (&pdev->dev,NULL );else
@@ -2907,56 +2958,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev, return rc; } +EXPORT_SYMBOL_GPL (ata_pci_sff_init_one);#endif /* CONFIG_PCI */ -EXPORT_SYMBOL_GPL (ata_sff_port_ops); -EXPORT_SYMBOL_GPL (ata_bmdma_port_ops); -EXPORT_SYMBOL_GPL (ata_sff_qc_prep); -EXPORT_SYMBOL_GPL (ata_sff_dumb_qc_prep); -EXPORT_SYMBOL_GPL (ata_sff_dev_select); -EXPORT_SYMBOL_GPL (ata_sff_check_status); -EXPORT_SYMBOL_GPL (ata_sff_dma_pause); -EXPORT_SYMBOL_GPL (ata_sff_pause); -EXPORT_SYMBOL_GPL (ata_sff_busy_sleep); -EXPORT_SYMBOL_GPL (ata_sff_wait_ready); -EXPORT_SYMBOL_GPL (ata_sff_tf_load); -EXPORT_SYMBOL_GPL (ata_sff_tf_read); -EXPORT_SYMBOL_GPL (ata_sff_exec_command); -EXPORT_SYMBOL_GPL (ata_sff_data_xfer); -EXPORT_SYMBOL_GPL (ata_sff_data_xfer_noirq); -EXPORT_SYMBOL_GPL (ata_sff_irq_on); -EXPORT_SYMBOL_GPL (ata_sff_irq_clear); -EXPORT_SYMBOL_GPL (ata_sff_hsm_move); -EXPORT_SYMBOL_GPL (ata_sff_qc_issue); -EXPORT_SYMBOL_GPL (ata_sff_qc_fill_rtf); -EXPORT_SYMBOL_GPL (ata_sff_host_intr); -EXPORT_SYMBOL_GPL (ata_sff_interrupt); -EXPORT_SYMBOL_GPL (ata_sff_lost_interrupt); -EXPORT_SYMBOL_GPL (ata_sff_freeze); -EXPORT_SYMBOL_GPL (ata_sff_thaw); -EXPORT_SYMBOL_GPL (ata_sff_prereset); -EXPORT_SYMBOL_GPL (ata_sff_dev_classify); -EXPORT_SYMBOL_GPL (ata_sff_wait_after_reset); -EXPORT_SYMBOL_GPL (ata_sff_softreset); -EXPORT_SYMBOL_GPL (sata_sff_hardreset); -EXPORT_SYMBOL_GPL (ata_sff_postreset); -EXPORT_SYMBOL_GPL (ata_sff_drain_fifo); -EXPORT_SYMBOL_GPL (ata_sff_error_handler); -EXPORT_SYMBOL_GPL (ata_sff_post_internal_cmd); -EXPORT_SYMBOL_GPL (ata_sff_port_start); -EXPORT_SYMBOL_GPL (ata_sff_std_ports); -EXPORT_SYMBOL_GPL (ata_bmdma_mode_filter); -EXPORT_SYMBOL_GPL (ata_bmdma_setup); -EXPORT_SYMBOL_GPL (ata_bmdma_start); -EXPORT_SYMBOL_GPL (ata_bmdma_stop); -EXPORT_SYMBOL_GPL (ata_bmdma_status); -EXPORT_SYMBOL_GPL (ata_bus_reset); -#ifdef CONFIG_PCI -EXPORT_SYMBOL_GPL (ata_pci_bmdma_clear_simplex); -EXPORT_SYMBOL_GPL (ata_pci_bmdma_init); -EXPORT_SYMBOL_GPL (ata_pci_sff_init_host); -EXPORT_SYMBOL_GPL (ata_pci_sff_prepare_host); -EXPORT_SYMBOL_GPL (ata_pci_sff_activate_host); -EXPORT_SYMBOL_GPL (ata_pci_sff_init_one); -#endif /* CONFIG_PCI */
Re: [PATCH 6/7] libata: clean up the SFF code for coding style
Quoted 7 lines · Alan Cox
From: Alan Cox <[email protected]>
Signed-off-by Alan Cox <[email protected]>---
drivers/ata/libata-sff.c | 136 +++++++++++++++++++++++----------------------- 1 files changed, 69 insertions(+), 67 deletions(-)
I always disliked the style where exports were mixed in with code, because IMO in practice it clouds the picture of what exactly is exported.
But I suppose time has overruled me, so I'll apply...
Jeff
PATCH 7/7 libata: Add 32bit PIO support
In reply to Alan CoxFrom: Alan Cox <[email protected]>
This matters for some controllers and in one or two cases almost doubles PIO performance. Add a bmdma32 operations set we can inherit and activate it for some controllers
---
drivers/ata/ata_piix.c | 2 +- drivers/ata/libata-sff.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ drivers/ata/pata_ali.c | 6 +++-- drivers/ata/pata_amd.c | 4 ++- drivers/ata/pata_mpiix.c | 3 ++- drivers/ata/pata_sil680.c | 4 ++- include/linux/libata.h | 3 +++ 7 files changed, 66 insertions(+), 9 deletions(-)
drivers/ata/ata_piix.c +1 -1
@@ -308,7 +308,7 @@ static struct scsi_host_template piix_sht = { };static struct ata_port_operations piix_pata_ops = { - .inherits = &ata_bmdma_port_ops, + .inherits = &ata_bmdma32_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = piix_set_piomode, .set_dmamode = piix_set_dmamode,
drivers/ata/libata-sff.c +53 -0
65 lines not on this page · raw message
drivers/ata/pata_ali.c +3 -3
@@ -151,8 +151,7 @@ static void ali_fifo_control(struct ata_port *ap, struct ata_device *adev, int opci_read_config_byte (pdev, pio_fifo, &fifo); fifo &= ~(0x0F << shift); -if (on) - fifo |= (on << shift); + fifo |= (on << shift);pci_write_config_byte (pdev, pio_fifo, fifo); }
@@ -353,10 +352,11 @@ static struct ata_port_operations ali_early_port_ops = { .inherits = &ata_sff_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = ali_set_piomode, + .sff_data_xfer = ata_sff_data_xfer32, };static const struct ata_port_operations ali_dma_base_ops = { - .inherits = &ata_bmdma_port_ops, + .inherits = &ata_bmdma32_port_ops, .set_piomode = ali_set_piomode, .set_dmamode = ali_set_dmamode, };
drivers/ata/pata_amd.c +2 -2
@@ -24,7 +24,7 @@#include <linux/libata.h> #define DRV_NAME "pata_amd" -#define DRV_VERSION "0.3.10" +#define DRV_VERSION "0.3.11"/** * timing_setup - shared timing computation and load
@@ -345,7 +345,7 @@ static struct scsi_host_template amd_sht = { };static const struct ata_port_operations amd_base_port_ops = { - .inherits = &ata_bmdma_port_ops, + .inherits = &ata_bmdma32_port_ops, .prereset = amd_pre_reset, };
drivers/ata/pata_mpiix.c +2 -1
@@ -35,7 +35,7 @@#include <linux/libata.h> #define DRV_NAME "pata_mpiix" -#define DRV_VERSION "0.7.6" +#define DRV_VERSION "0.7.7"enum {IDETIM =0x6C ,/* IDE control register */
@@ -146,6 +146,7 @@ static struct ata_port_operations mpiix_port_ops = { .cable_detect = ata_cable_40wire, .set_piomode = mpiix_set_piomode, .prereset = mpiix_pre_reset, + .sff_data_xfer = ata_sff_data_xfer32, };static int mpiix_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ata/pata_sil680.c +2 -2
@@ -32,7 +32,7 @@#include <linux/libata.h> #define DRV_NAME "pata_sil680" -#define DRV_VERSION "0.4.8" +#define DRV_VERSION "0.4.9"#define SIL680_MMIO_BAR 5
@@ -195,7 +195,7 @@ static struct scsi_host_template sil680_sht = { };static struct ata_port_operations sil680_port_ops = { - .inherits = &ata_bmdma_port_ops, + .inherits = &ata_bmdma32_port_ops, .cable_detect = sil680_cable_detect, .set_piomode = sil680_set_piomode, .set_dmamode = sil680_set_dmamode,
include/linux/libata.h +3 -0
@@ -1484,6 +1484,7 @@ extern void sata_pmp_error_handler(struct ata_port *ap);extern const struct ata_port_operations ata_sff_port_ops;extern const struct ata_port_operations ata_bmdma_port_ops; +extern const struct ata_port_operations ata_bmdma32_port_ops;/* PIO only, sg_tablesize and dma_boundary limits can be removed */ #define ATA_PIO_SHT (drv_name) \
@@ -1511,6 +1512,8 @@ extern void ata_sff_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);extern unsigned int ata_sff_data_xfer (struct ata_device *dev,unsigned char *buf,unsigned int buflen,int rw); +extern unsigned int ata_sff_data_xfer32 (struct ata_device *dev, +unsigned char *buf,unsigned int buflen,int rw);extern unsigned int ata_sff_data_xfer_noirq (struct ata_device *dev,unsigned char *buf,unsigned int buflen,int rw);extern u8 ata_sff_irq_on (struct ata_port *ap);
Re: [PATCH 7/7] libata: Add 32bit PIO support
Quoted 8 lines · Alan Cox
From: Alan Cox <[email protected]>
This matters for some controllers and in one or two cases almost doubles PIO performance. Add a bmdma32 operations set we can inherit and activate it for some controllers
Signed-off-by Alan Cox <[email protected]>---
[...]
Quoted 4 lines
drivers/ata/libata-sff.c +0
-0
[...]
drivers/ata/libata-sff.c unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf, · line 786
Quoted 8 lines
drivers/ata/libata-sff.c +8
-0+if (unlikely (slop)) { +__le32 pad; +if (rw ==READ ) { + pad =cpu_to_le32 (ioread32 (ap->ioaddr.data_addr)); +memcpy (buf + buflen - slop, &pad, slop); + }else { +memcpy (&pad, buf + buflen - slop, slop); +iowrite32 (le32_to_cpu (pad), ap->ioaddr.data_addr);
Shouldn't the rest of pad be initialised to zero or something before it is written?
Regards,
Elias
Re: [PATCH 7/7] libata: Add 32bit PIO support
Quoted 8 lines
drivers/ata/libata-sff.c unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf, · line 786
Quoted 5 lines
drivers/ata/libata-sff.c +5
-0+ pad =cpu_to_le32 (ioread32 (ap->ioaddr.data_addr)); +memcpy (buf + buflen - slop, &pad, slop); + }else { +memcpy (&pad, buf + buflen - slop, slop); +iowrite32 (le32_to_cpu (pad), ap->ioaddr.data_addr);Shouldn't the rest of pad be initialised to zero or something before it is written?
It really doesn't matter but I suppose it wouldn't do any harm not to expose 3 random bytes of stack to the io bus.
Alan
Hello.
Quoted 6 lines · Alan Cox
Signed-off-by Alan Cox <[email protected]>drivers/ata/pata_ninja32.c +0
-0
[...]
drivers/ata/pata_ninja32.c static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) · line 135
Quoted 8 lines
drivers/ata/pata_ninja32.c +2
-1@@ -130,7 +130,8 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)return rc;pci_set_master (dev); -/* Set up the register mappings */ +/* Set up the register mappings. We use the I/O mapping as only the +older chips also have MMIO on BAR 1 */
CodingStyle, chapter 8. It's only an examplet preferrable comment
style there though...
MBR, Sergei
Quoted 6 lines · Alan Cox
From: Alan Cox <[email protected]>
Signed-off-by Alan Cox <[email protected]>---
drivers/ata/pata_ninja32.c | 9 +++++++--
applied #upstream-fixes, since it was a straightforward id update