From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97BA9C282DA for ; Thu, 18 Apr 2019 02:43:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5607E217F9 for ; Thu, 18 Apr 2019 02:43:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=lunn.ch header.i=@lunn.ch header.b="3N1/oy8n" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387919AbfDRCn5 (ORCPT ); Wed, 17 Apr 2019 22:43:57 -0400 Received: from vps0.lunn.ch ([185.16.172.187]:37030 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732737AbfDRCn5 (ORCPT ); Wed, 17 Apr 2019 22:43:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lunn.ch; s=20171124; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=W0+4P4IL1bQ3U/0D3w5ZbC+a9HNe+J8gtcTtdksPRYU=; b=3N1/oy8nYYRc52fRndUs0NErs8 uWIjZUhNorpl81GFIPt0wKcIugmjupwaBXx2U1EgyQQRIG5wG0DBMBJmDj9n7bHZN0O8UtjjutDzv Sh1bYWzjwb2mwOMQ7AcHlAR/RaLOrkWJNJ2QTTLrcxRjbLSXB4ZI0J9GW/wAbVJSMn54=; Received: from andrew by vps0.lunn.ch with local (Exim 4.89) (envelope-from ) id 1hGwpi-0004Sb-7z; Thu, 18 Apr 2019 04:31:26 +0200 From: Andrew Lunn To: David Miller Cc: netdev , Florian Fainelli , Vivien Didelot , Andrew Lunn Subject: [PATCH net-next 07/15] dsa: Add boilerplate helper to register DSA tag driver modules Date: Thu, 18 Apr 2019 04:31:12 +0200 Message-Id: <20190418023120.17067-8-andrew@lunn.ch> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190418023120.17067-1-andrew@lunn.ch> References: <20190418023120.17067-1-andrew@lunn.ch> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org A DSA tag driver module will need to register the tag protocols it implements with the DSA core. Add a macro containing this boiler plate. The registration/unregistration code is currently just a stub. A Later patch will add the real implementation. Signed-off-by: Andrew Lunn --- include/net/dsa.h | 48 +++++++++++++++++++++++++++++++++++++++++++ net/dsa/dsa.c | 13 ++++++++++++ net/dsa/tag_brcm.c | 11 ++++++++++ net/dsa/tag_dsa.c | 2 ++ net/dsa/tag_edsa.c | 2 ++ net/dsa/tag_gswip.c | 2 ++ net/dsa/tag_ksz.c | 7 +++++++ net/dsa/tag_lan9303.c | 2 ++ net/dsa/tag_mtk.c | 2 ++ net/dsa/tag_qca.c | 2 ++ net/dsa/tag_trailer.c | 2 ++ 11 files changed, 93 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 303c71c5288a..551c6c0d7870 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -594,4 +594,52 @@ int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data); int dsa_port_get_phy_sset_count(struct dsa_port *dp); void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up); +int dsa_tag_drivers_register(struct dsa_device_ops *ops_array[], + unsigned int count, + struct module *owner); +void dsa_tag_drivers_unregister(struct dsa_device_ops *ops_array[], + unsigned int count); + +/** + * module_dsa_tag_drivers() - Helper macro for registering DSA tag + * drivers + * @__ops_array: Array of tag driver strucutres + * + * Helper macro for DSA tag drivers which do not do anything special + * in module init/exit. Each module may only use this macro once, and + * calling it replaces module_init() and module_exit(). + */ +#define dsa_tag_driver_module_drivers(__ops_array, __count) \ +static int __init dsa_tag_driver_module_init(void) \ +{ \ + return dsa_tag_drivers_register(__ops_array, __count, \ + THIS_MODULE); \ +} \ +module_init(dsa_tag_driver_module_init); \ + \ +static void __exit dsa_tag_driver_module_exit(void) \ +{ \ + dsa_tag_drivers_unregister(__ops_array, __count); \ +} \ +module_exit(dsa_tag_driver_module_exit) + +#define module_dsa_tag_drivers(__ops_array) \ +dsa_tag_driver_module_drivers(__ops_array, ARRAY_SIZE(__ops_array)) + +/** + * module_dsa_tag_driver() - Helper macro for registering a single DSA tag + * driver + * @__ops: Single tag driver strucutres + * + * Helper macro for DSA tag drivers which do not do anything special + * in module init/exit. Each module may only use this macro once, and + * calling it replaces module_init() and module_exit(). + */ +#define module_dsa_tag_driver(__ops) \ + static struct dsa_device_ops *ops_array[] = \ + { __ops }; \ + \ + module_dsa_tag_drivers(ops_array); \ + #endif + diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 5c37508747a0..a49e230b6247 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c @@ -76,6 +76,19 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = { [DSA_TAG_PROTO_NONE] = &none_ops, }; +int dsa_tag_drivers_register(struct dsa_device_ops *ops[], + unsigned int count, struct module *owner) +{ + return 0; +} +EXPORT_SYMBOL_GPL(dsa_tag_drivers_register); + +void dsa_tag_drivers_unregister(struct dsa_device_ops *ops[], + unsigned int count) +{ +} +EXPORT_SYMBOL_GPL(dsa_tag_drivers_unregister); + const char *dsa_tag_protocol_to_str(const struct dsa_device_ops *ops) { return ops->name; diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c index 756bade54fee..bff9b03a7752 100644 --- a/net/dsa/tag_brcm.c +++ b/net/dsa/tag_brcm.c @@ -205,3 +205,14 @@ struct dsa_device_ops brcm_prepend_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_PREPEND); + +static struct dsa_device_ops *ops_array[] = { +#ifdef CONFIG_NET_DSA_TAG_BRCM + &brcm_netdev_ops, + #endif +#ifdef CONFIG_NET_DSA_TAG_BRCM_PREPEND + &brcm_prepend_netdev_ops, + #endif +}; + +module_dsa_tag_drivers(ops_array); diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c index 5db7dd21c73a..44e023e3da84 100644 --- a/net/dsa/tag_dsa.c +++ b/net/dsa/tag_dsa.c @@ -161,3 +161,5 @@ struct dsa_device_ops dsa_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_DSA); + +module_dsa_tag_driver(&dsa_netdev_ops); diff --git a/net/dsa/tag_edsa.c b/net/dsa/tag_edsa.c index 94c6eed1905f..e51e5db45d43 100644 --- a/net/dsa/tag_edsa.c +++ b/net/dsa/tag_edsa.c @@ -180,3 +180,5 @@ struct dsa_device_ops edsa_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_EDSA); + +module_dsa_tag_driver(&edsa_netdev_ops); diff --git a/net/dsa/tag_gswip.c b/net/dsa/tag_gswip.c index f2cb183e4a8a..38d7617d8a03 100644 --- a/net/dsa/tag_gswip.c +++ b/net/dsa/tag_gswip.c @@ -113,3 +113,5 @@ struct dsa_device_ops gswip_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_GSWIP); + +module_dsa_tag_driver(&gswip_netdev_ops); diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index 9c5f7db632a7..3e4ea4ac10d6 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -180,3 +180,10 @@ struct dsa_device_ops ksz9893_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ9893); + +static struct dsa_device_ops *ops_array[] = { + &ksz9477_netdev_ops, + &ksz9893_netdev_ops, +}; + +module_dsa_tag_drivers(ops_array); diff --git a/net/dsa/tag_lan9303.c b/net/dsa/tag_lan9303.c index edfa15583607..4135080559cf 100644 --- a/net/dsa/tag_lan9303.c +++ b/net/dsa/tag_lan9303.c @@ -138,3 +138,5 @@ struct dsa_device_ops lan9303_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_LAN9303); + +module_dsa_tag_driver(&lan9303_netdev_ops); diff --git a/net/dsa/tag_mtk.c b/net/dsa/tag_mtk.c index dc51d7d05370..bcca5e1a3732 100644 --- a/net/dsa/tag_mtk.c +++ b/net/dsa/tag_mtk.c @@ -109,3 +109,5 @@ struct dsa_device_ops mtk_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_MTK); + +module_dsa_tag_driver(&mtk_netdev_ops); diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index e34c507e9e7e..fce437c51fcd 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -110,3 +110,5 @@ struct dsa_device_ops qca_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_QCA); + +module_dsa_tag_driver(&qca_netdev_ops); diff --git a/net/dsa/tag_trailer.c b/net/dsa/tag_trailer.c index 81a45c523ab7..d8955ec1a38f 100644 --- a/net/dsa/tag_trailer.c +++ b/net/dsa/tag_trailer.c @@ -87,3 +87,5 @@ struct dsa_device_ops trailer_netdev_ops = { MODULE_LICENSE("GPL"); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_TRAILER); + +module_dsa_tag_driver(&trailer_netdev_ops); -- 2.20.1