ata: add CONFIG_SATA_HOST config option
PATCH v3 1/1 ata: add CONFIG_SATA_HOST config option
From: Bartlomiej Zolnierkiewicz <[email protected]>
Subject: [PATCH v3] ata: add CONFIG_SATA_HOST config option
Add CONFIG_SATA_HOST config option (for selecting SATA Host support) to make setup easier on PATA-only systems.
Additionally move SATA-specific code to libata-sata.c which allows us to save ~11.5k of the output code size (x86-64) on PATA-only systems for CONFIG_SATA_HOST=n:
CONFIG_SATA_HOST=y:
text data bss dec hex filename
44283 6576 57 50916 c6e4 drivers/ata/libata-core.o 29054 16 2 29072 7190 drivers/ata/libata-eh.o 20085 0 19 20104 4e88 drivers/ata/libata-sff.o 8699 0 0 8699 21fb drivers/ata/libata-sata.o
CONFIG_SATA_HOST=n:
text data bss dec hex filename
43754 6576 57 50387 c4d3 drivers/ata/libata-core.o 26775 16 2 26793 68a9 drivers/ata/libata-eh.o 20144 0 19 20163 4ec3 drivers/ata/libata-sff.o
---
v2:
- Kconfig fixups per Sergei's comments
- add non-SATA version of ata_std_postreset()
- drop non-SATA versions of sata_link_[debounce,hardreset,resume](), sata_set_spd(), sata_print_link_status() and ata_tf_from_fis()
- move SATA-specific code to libata-sata.c
v3:
- require SATA_HOST for ata_piix for now
earlier references:
https://lkml.org/lkml/2011/2/9/149
https://lkml.org/lkml/2011/2/11/103
drivers/ata/Kconfig | 19 drivers/ata/Makefile | 1 drivers/ata/libata-core.c | 814 ------------------------------ drivers/ata/libata-eh.c | 412 --------------- drivers/ata/libata-sata.c | 1243 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/ata/libata-sff.c | 32 - drivers/ata/libata.h | 52 + include/linux/libata.h | 32 - 8 files changed, 1365 insertions(+), 1240 deletions(-)
drivers/ata/Kconfig +17 -2
@@ -58,13 +58,22 @@ config ATA_ACPI You can disable this at kernel boot time by using the option libata.noacpi=1 +config SATA_HOST + bool "SATA Host support" + default y + help + This option adds support for SATA Hosts. + config SATA_PMP bool "SATA Port Multiplier support" + depends on SATA_HOST default y help This option adds support for SATA Port Multipliers (the SATA version of an ethernet hub, or SAS expander). +if SATA_HOST + comment "Controllers with non-SFF native interface" config SATA_AHCI
@@ -114,6 +123,8 @@ config SATA_SIL24 If unsure, say N. +endif # SATA_HOST + config ATA_SFF bool "ATA SFF support" default y
@@ -155,7 +166,7 @@ config PATA_OCTEON_CF config SATA_QSTOR tristate "Pacific Digital SATA QStor support" - depends on PCI + depends on PCI && SATA_HOST help This option enables support for Pacific Digital Serial ATA QStor.
@@ -163,7 +174,7 @@ config SATA_QSTOR config SATA_SX4 tristate "Promise SATA SX4 support (Experimental)" - depends on PCI && EXPERIMENTAL + depends on PCI && SATA_HOST && EXPERIMENTAL help This option enables support for Promise Serial ATA SX4.
@@ -181,6 +192,8 @@ config ATA_BMDMA if ATA_BMDMA +if SATA_HOST + comment "SATA SFF controllers with BMDMA" config ATA_PIIX
@@ -291,6 +304,8 @@ config SATA_VITESSE If unsure, say N. +endif # SATA_HOST + comment "PATA SFF controllers with BMDMA" config PATA_ALI
drivers/ata/Makefile +1 -0
@@ -103,6 +103,7 @@ obj-$(CONFIG_ATA_GENERIC) += ata_generic obj-$(CONFIG_PATA_LEGACY) += pata_legacy.o libata-y := libata-core.o libata-scsi.o libata-eh.o libata-transport.o +libata-$(CONFIG_SATA_HOST) += libata-sata.o libata-$(CONFIG_ATA_SFF) += libata-sff.o libata-$(CONFIG_SATA_PMP) += libata-pmp.o libata-$(CONFIG_ATA_ACPI) += libata-acpi.o
drivers/ata/libata-core.c +26 -788
938 lines not on this page · raw message
drivers/ata/libata-eh.c +5 -407
442 lines not on this page · raw message
drivers/ata/libata-sata.c new file +1243 -0
1,243 lines not on this page · raw message
drivers/ata/libata-sff.c +4 -28
@@ -252,7 +252,7 @@ int ata_sff_busy_sleep(struct ata_port * }EXPORT_SYMBOL_GPL (ata_sff_busy_sleep); -static int ata_sff_check_ready (struct ata_link *link) +int ata_sff_check_ready (struct ata_link *link) {u8 status = link->ap->ops->sff_check_status (link->ap);
@@ -2074,38 +2074,14 @@ int ata_sff_softreset(struct ata_link *l }EXPORT_SYMBOL_GPL (ata_sff_softreset); -/** -* sata_sff_hardreset - reset host port via SATA phy reset -* @link: link to reset -* @class: resulting class of attached device -* @deadline: deadline jiffies for the operation -* -* SATA phy-reset host port using DET bits of SControl register, -* wait for !BSY and classify the attached device. -* -* LOCKING: -* Kernel thread context (may sleep) -* -* RETURNS: -* 0 on success, -errno otherwise. -*/ +#ifndef CONFIG_SATA_HOST int sata_sff_hardreset (struct ata_link *link,unsigned int *class,unsigned long deadline) { -struct ata_eh_context *ehc = &link->eh_context; -const unsigned long *timing =sata_ehc_deb_timing (ehc); -bool online; -int rc; - - rc =sata_link_hardreset (link, timing, deadline, &online, - ata_sff_check_ready); -if (online) - *class =ata_sff_dev_classify (link->device,1 ,NULL ); - -DPRINTK ("EXIT, class=%u\n" , *class); -return rc; +return -EOPNOTSUPP ; }EXPORT_SYMBOL_GPL (sata_sff_hardreset); +#endif /** * ata_sff_postreset - SFF postreset callback
drivers/ata/libata.h +50 -2
82 lines not on this page · raw message
include/linux/libata.h +19 -13
@@ -935,15 +935,13 @@ struct ata_timing { };/* -* Core layer - drivers/ata/libata-core.c +* SATA host - drivers/ata/libata-sata.c */ +#ifdef CONFIG_SATA_HOST extern const unsigned long sata_deb_timing_normal[];extern const unsigned long sata_deb_timing_hotplug[];extern const unsigned long sata_deb_timing_long[]; -extern struct ata_port_operations ata_dummy_port_ops; -extern const struct ata_port_info ata_dummy_port_info; -static inline const unsigned long *sata_ehc_deb_timing (struct ata_eh_context *ehc) {
@@ -953,24 +951,33 @@ sata_ehc_deb_timing(struct ata_eh_contexreturn sata_deb_timing_normal; } +void ata_tf_from_fis (const u8 *fis,struct ata_taskfile *tf); +int sata_set_spd (struct ata_link *link); +int sata_link_debounce (struct ata_link *link,const unsigned long *params, +unsigned long deadline); +int sata_link_resume (struct ata_link *link,const unsigned long *params, +unsigned long deadline); +int sata_link_hardreset (struct ata_link *link,const unsigned long *timing, +unsigned long deadline,bool *online, +int (*check_ready)(struct ata_link *)); +#endif + +/* +* Core layer - drivers/ata/libata-core.c +*/ +extern struct ata_port_operations ata_dummy_port_ops; +extern const struct ata_port_info ata_dummy_port_info; +static inline int ata_port_is_dummy (struct ata_port *ap) {return ap->ops == &ata_dummy_port_ops; } -extern int sata_set_spd (struct ata_link *link);extern int ata_std_prereset (struct ata_link *link,unsigned long deadline);extern int ata_wait_after_reset (struct ata_link *link,unsigned long deadline,int (*check_ready)(struct ata_link *link)); -extern int sata_link_debounce (struct ata_link *link, -const unsigned long *params,unsigned long deadline); -extern int sata_link_resume (struct ata_link *link,const unsigned long *params, -unsigned long deadline);extern int sata_link_scr_lpm (struct ata_link *link,enum ata_lpm_policy policy,bool spm_wakeup); -extern int sata_link_hardreset (struct ata_link *link, -const unsigned long *timing,unsigned long deadline, -bool *online,int (*check_ready)(struct ata_link *));extern int sata_std_hardreset (struct ata_link *link,unsigned int *class,unsigned long deadline);extern void ata_std_postreset (struct ata_link *link,unsigned int *classes);
@@ -1018,7 +1025,6 @@ extern u32 ata_wait_register(struct ata_extern int atapi_cmd_type (u8 opcode);extern void ata_tf_to_fis (const struct ata_taskfile *tf,u8 pmp,int is_cmd,u8 *fis); -extern void ata_tf_from_fis (const u8 *fis,struct ata_taskfile *tf);extern unsigned long ata_pack_xfermask (unsigned long pio_mask,unsigned long mwdma_mask,unsigned long udma_mask); extern void ata_unpack_xfermask(unsigned long xfer_mask,
Quoted 38 lines · Bartlomiej Zolnierkiewicz
From: Bartlomiej Zolnierkiewicz<[email protected]>
Subject: [PATCH v3] ata: addCONFIG_SATA_HOSTconfig optionAdd
CONFIG_SATA_HOSTconfig option (for selecting SATA Host support) to make setup easier on PATA-only systems.Additionally move SATA-specific code to
libata-sata.cwhich allows us to save ~11.5k of the output code size (x86-64) on PATA-only systems forCONFIG_SATA_HOST=n:
CONFIG_SATA_HOST=y:
text data bss dec hex filename44283 6576 57 50916 c6e4 drivers/ata/libata-core.o 29054 16 2 29072 7190 drivers/ata/libata-eh.o 20085 0 19 20104 4e88 drivers/ata/libata-sff.o 8699 0 0 8699 21fb drivers/ata/libata-sata.o
CONFIG_SATA_HOST=n:
text data bss dec hex filename43754 6576 57 50387 c4d3 drivers/ata/libata-core.o 26775 16 2 26793 68a9 drivers/ata/libata-eh.o 20144 0 19 20163 4ec3 drivers/ata/libata-sff.oSigned-off-by Bartlomiej Zolnierkiewicz<[email protected]>---
v2:
-Kconfigfixups per Sergei's comments
- add non-SATA version ofata_std_postreset()
- drop non-SATA versions of sata_link_[debounce,hardreset,resume](),sata_set_spd(),sata_print_link_status()andata_tf_from_fis()
- move SATA-specific code tolibata-sata.c
v3:
- requireSATA_HOSTforata_piixfor nowearlier references:
https://lkml.org/lkml/2011/2/9/149
https://lkml.org/lkml/2011/2/11/103
Quoted 9 lines
drivers/ata/Kconfig | 19 drivers/ata/Makefile | 1 drivers/ata/libata-core.c | 814 ------------------------------ drivers/ata/libata-eh.c | 412 --------------- drivers/ata/libata-sata.c | 1243 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/ata/libata-sff.c | 32 - drivers/ata/libata.h | 52 + include/linux/libata.h | 32 - 8 files changed, 1365 insertions(+), 1240 deletions(-)
You did a good job of avoiding the "#ifdef ugliness" problem that often plagues patches like this.
However, let's not mix code movement in with the rest of the separation.
Code movement into drivers/ata/libata-sata.c should be a separate,
first patch. Patch #1 should link and behave as before (excepting the addition of libata-sata.c to the build of course).
Creating no-op stubs and CONFIG_SATA_HOST is a separate change after code movement.
Jeff