Skip to contentSkip to conversation

ata: add CONFIG_SATA_HOST config option

PATCH In review Bartlomiej Zolnierkiewicz 2 participants 2 messages Oct 13, 2011 – Oct 14, 2011 libata

lore
Share & tools
lore
#0 lore raw

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
Index: b/drivers/ata/Kconfig
===================================================================
@@ -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
Index: b/drivers/ata/Makefile
===================================================================
@@ -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
Index: b/drivers/ata/libata-sff.c
===================================================================
@@ -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
Index: b/include/linux/libata.h
===================================================================
@@ -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_contex
 		return 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,
#1 lore raw
Quoted 38 lines · Bartlomiej Zolnierkiewicz

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

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