Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp236103imm; Tue, 18 Sep 2018 20:46:44 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdby6r8dOyhvXfOw1ZUz+eMqRkDPFi4gaeA0Fh+IJm1uFQjW9DjrKrHBhnDnIJKXJ1PLsfP1 X-Received: by 2002:a17:902:561:: with SMTP id 88-v6mr32076140plf.320.1537328804610; Tue, 18 Sep 2018 20:46:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537328804; cv=none; d=google.com; s=arc-20160816; b=E2SBRuvIIpsF/BC/qW9QjdaND9WJGLyARJaSAc5SHJIkStYLzL6euJpwWCcH/6u/Bi uk7yJEcQcbTHcO3YrKe1gDyBcB5vOEiaEtkI57gCmHaMwyQy3532hwohY0TVRDrSy2DW 0n8kvrauArrRfUFh6vIUUFJ5D8c1YUXbYgrZQ2NhCUiZTo8fFi51Kf4seP/+3RJBAN22 Ho4Yo2K9jFrhPkja+zstijHKBWdYrJdkJDnKt5E+0IogmUt6MsCKZ9cefQJf05WvvadP Ztyp7SPRQx6NRri1mthKSnuiKiru3fAosYZ8yYkPtURxRBKcXyks1byl41CZebkP6tID 7rgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=qJ0Nbw7Gi12E/i9rEsaPP+vgebQkwVN3Q0aBFepQXCM=; b=ZV1PPTsUP2bjXrYXQWoHxhcVDM36nMey8jpEn+KxxfK1owj8nHTkn6Cl5XXFIF0Qiv crm34EXM0+3h99RZRvZx8qznqqzZcz3l3mIte66dOjOTRDL71bhJzhHK7Tfmh8akIU1P 2jqkr6zdZCyKSWtk2rNJfcgWv7EmaF9pJll/boJz3mM15a0H7n673kXFwtBhAdHob84S xL8EkRNBGfdCEkiR/LahwVCgVAKL0Py4j1NFhOuAQpLKHHrkGF30uqxYSAyI8B41cbfO DG0gFguFB/WfRusocNLxVPtyptUV1xrD3R/cHNOCpzm7+yo+rsoVnFd4c6Sx371uwNOW KuiQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h11-v6si21034586pfk.81.2018.09.18.20.46.29; Tue, 18 Sep 2018 20:46:44 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730554AbeISJWJ (ORCPT + 99 others); Wed, 19 Sep 2018 05:22:09 -0400 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:49957 "EHLO relay3-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725875AbeISJWJ (ORCPT ); Wed, 19 Sep 2018 05:22:09 -0400 X-Originating-IP: 36.71.235.160 Received: from ubuntuVM.lan (unknown [36.71.235.160]) (Authenticated sender: aditya@kobol.io) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 6192460004; Wed, 19 Sep 2018 03:46:08 +0000 (UTC) From: Aditya Prayoga To: linux-ide@vger.kernel.org, linux-leds@vger.kernel.org Cc: Jason Cooper , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Russell King , Jens Axboe , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Jacek Anaszewski , Pavel Machek , Daniel Golle , Aditya Prayoga Subject: [PATCH 1/2] libata: add ledtrig support Date: Wed, 19 Sep 2018 11:45:29 +0800 Message-Id: <1537328730-9156-2-git-send-email-aditya@kobol.io> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1537328730-9156-1-git-send-email-aditya@kobol.io> References: <1537328730-9156-1-git-send-email-aditya@kobol.io> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Golle This adds a LED trigger for each ATA port indicating disk activity. As this is needed only on specific platforms (NAS SoCs and such), these platforms should define ARCH_WANTS_LIBATA_LEDS if there are boards with LED(s) intended to indicate ATA disk activity and need the OS to take care of that. In that way, if not selected, LED trigger support not will be included in libata-core and both, codepaths and structures remain untouched. I'm currently deploying this for the oxnas target in OpenWrt https://dev.openwrt.org/changeset/43675/ v2: rebased to kernel/git/tj/libata.git plus small corrections and comments added Signed-off-by: Daniel Golle URL: https://patchwork.ozlabs.org/patch/420733/ [Aditya Prayoga: * Port forward * Change ATA_LEDS default to no * Reduce performance impact by moving ata_led_act() call from ata_qc_new() to ata_qc_complete()] Signed-off-by: Aditya Prayoga --- If there is anything fundamentally wrong with that approach, I'd be glad for some advise on how to do it better. I conciously choose an #ifdev approach to make sure performance will not be affected for non-users of that code. Thanks Daniel --- --- drivers/ata/Kconfig | 16 ++++++++++++++ drivers/ata/libata-core.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/libata.h | 7 ++++++ 3 files changed, 79 insertions(+) diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 39b181d..a2c64ce 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig @@ -46,6 +46,22 @@ config ATA_VERBOSE_ERROR If unsure, say Y. +config ARCH_WANT_LIBATA_LEDS + bool + +config ATA_LEDS + bool "support ATA port LED triggers" + depends on ARCH_WANT_LIBATA_LEDS + select NEW_LEDS + select LEDS_CLASS + select LEDS_TRIGGERS + default n + help + This option adds a LED trigger for each registered ATA port. + It is used to drive disk activity leds connected via GPIO. + + If unsure, say N. + config ATA_ACPI bool "ATA ACPI Support" depends on ACPI diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 599e01b..65228f5 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -5105,6 +5105,30 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) } /** + * ata_led_act - Trigger port activity LED + * @ap: indicating port + * + * Blinks any LEDs registered to the trigger. + * Commonly used with leds-gpio on NAS systems with disk activity + * indicator LEDs. + * + * LOCKING: + * None. + */ +static inline void ata_led_act(struct ata_port *ap) +{ +#ifdef CONFIG_ATA_LEDS +#define LIBATA_BLINK_DELAY 20 /* ms */ + unsigned long led_delay = LIBATA_BLINK_DELAY; + + if (unlikely(!ap->ledtrig)) + return; + + led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0); +#endif /* CONFIG_ATA_LEDS */ +} + +/** * ata_qc_new_init - Request an available ATA command, and initialize it * @dev: Device from whom we request an available command structure * @tag: tag @@ -5249,6 +5273,10 @@ void ata_qc_complete(struct ata_queued_cmd *qc) /* Trigger the LED (if available) */ ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE)); +#ifdef CONFIG_ATA_LEDS + ata_led_act(ap); +#endif + /* XXX: New EH and old EH use different mechanisms to * synchronize EH with regular execution path. * @@ -6028,6 +6056,9 @@ struct ata_port *ata_port_alloc(struct ata_host *host) ap->stats.unhandled_irq = 1; ap->stats.idle_irq = 1; #endif +#ifdef CONFIG_ATA_LEDS + ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); +#endif ata_sff_port_init(ap); return ap; @@ -6063,6 +6094,12 @@ static void ata_host_release(struct kref *kref) kfree(ap->pmp_link); kfree(ap->slave_link); +#ifdef CONFIG_ATA_LEDS + if (ap->ledtrig) { + led_trigger_unregister(ap->ledtrig); + kfree(ap->ledtrig); + }; +#endif kfree(ap); host->ports[i] = NULL; } @@ -6527,6 +6564,25 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) host->ports[i]->local_port_no = i + 1; } +#ifdef CONFIG_ATA_LEDS + /* register LED triggers for all ports */ + for (i = 0; i < host->n_ports; i++) { + if (unlikely(!host->ports[i]->ledtrig)) + continue; + + snprintf(host->ports[i]->ledtrig_name, + sizeof(host->ports[i]->ledtrig_name), "ata%u", + host->ports[i]->print_id); + + host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; + + if (led_trigger_register(host->ports[i]->ledtrig)) { + kfree(host->ports[i]->ledtrig); + host->ports[i]->ledtrig = NULL; + } + } +#endif + /* Create associated sysfs transport objects */ for (i = 0; i < host->n_ports; i++) { rc = ata_tport_add(host->dev,host->ports[i]); diff --git a/include/linux/libata.h b/include/linux/libata.h index 38c95d6..3cc5f63 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -38,6 +38,7 @@ #include #include #include +#include /* * Define if arch has non-standard setup. This is a _PCI_ standard @@ -893,6 +894,12 @@ struct ata_port { #ifdef CONFIG_ATA_ACPI struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ #endif + +#ifdef CONFIG_ATA_LEDS + struct led_trigger *ledtrig; + char ledtrig_name[8]; +#endif + /* owned by EH */ u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned; }; -- 2.7.4