From: Alexander Lobakin <alobakin@marvell.com>
To: "David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>
Cc: Alexander Lobakin <alobakin@marvell.com>,
Igor Russkikh <irusskikh@marvell.com>,
Michal Kalderon <michal.kalderon@marvell.com>,
"Ariel Elior" <aelior@marvell.com>,
Denis Bolotin <denis.bolotin@marvell.com>,
"James E.J. Bottomley" <jejb@linux.ibm.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Andrew Lunn <andrew@lunn.ch>, <GR-everest-linux-l2@marvell.com>,
<QLogic-Storage-Upstream@marvell.com>, <netdev@vger.kernel.org>,
<linux-scsi@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH v3 net-next 03/16] qede: populate supported link modes maps on module init
Date: Mon, 20 Jul 2020 21:08:02 +0300 [thread overview]
Message-ID: <20200720180815.107-4-alobakin@marvell.com> (raw)
In-Reply-To: <20200720180815.107-1-alobakin@marvell.com>
Simplify and lighten qede_set_link_ksettings() by declaring static link
modes maps and populating them on module init. This way we save plenty
of text size at the low expense of __ro_after_init and __initconst data
(the latter will be purged after module init is done).
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
---
drivers/net/ethernet/qlogic/qede/qede.h | 2 +
.../net/ethernet/qlogic/qede/qede_ethtool.c | 158 ++++++++++++------
drivers/net/ethernet/qlogic/qede/qede_main.c | 2 +
3 files changed, 108 insertions(+), 54 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
index 8adda5dc9e88..f1d7f73de902 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -557,6 +557,8 @@ void qede_update_rx_prod(struct qede_dev *edev, struct qede_rx_queue *rxq);
int qede_add_tc_flower_fltr(struct qede_dev *edev, __be16 proto,
struct flow_cls_offload *f);
+void qede_forced_speed_maps_init(void);
+
#define RX_RING_SIZE_POW 13
#define RX_RING_SIZE ((u16)BIT(RX_RING_SIZE_POW))
#define NUM_RX_BDS_MAX (RX_RING_SIZE - 1)
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
index 0a564b06d697..7a985307cdd5 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
@@ -196,6 +196,96 @@ static const char qede_tests_str_arr[QEDE_ETHTOOL_TEST_MAX][ETH_GSTRING_LEN] = {
"Nvram (online)\t\t",
};
+/* Forced speed capabilities maps */
+
+struct qede_forced_speed_map {
+ u32 speed;
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(caps);
+
+ const u32 *cap_arr;
+ u32 arr_size;
+};
+
+#define QEDE_FORCED_SPEED_MAP(value) \
+{ \
+ .speed = SPEED_##value, \
+ .cap_arr = qede_forced_speed_##value, \
+ .arr_size = ARRAY_SIZE(qede_forced_speed_##value), \
+}
+
+static const u32 qede_forced_speed_1000[] __initconst = {
+ ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+ ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
+ ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
+};
+
+static const u32 qede_forced_speed_10000[] __initconst = {
+ ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseR_FEC_BIT,
+ ETHTOOL_LINK_MODE_10000baseCR_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
+ ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT,
+};
+
+static const u32 qede_forced_speed_20000[] __initconst = {
+ ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT,
+};
+
+static const u32 qede_forced_speed_25000[] __initconst = {
+ ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
+ ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
+ ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
+};
+
+static const u32 qede_forced_speed_40000[] __initconst = {
+ ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
+ ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
+ ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
+ ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
+};
+
+static const u32 qede_forced_speed_50000[] __initconst = {
+ ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT,
+ ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT,
+ ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT,
+};
+
+static const u32 qede_forced_speed_100000[] __initconst = {
+ ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT,
+ ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
+ ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
+ ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
+};
+
+static struct qede_forced_speed_map qede_forced_speed_maps[] __ro_after_init = {
+ QEDE_FORCED_SPEED_MAP(1000),
+ QEDE_FORCED_SPEED_MAP(10000),
+ QEDE_FORCED_SPEED_MAP(20000),
+ QEDE_FORCED_SPEED_MAP(25000),
+ QEDE_FORCED_SPEED_MAP(40000),
+ QEDE_FORCED_SPEED_MAP(50000),
+ QEDE_FORCED_SPEED_MAP(100000),
+};
+
+void __init qede_forced_speed_maps_init(void)
+{
+ struct qede_forced_speed_map *map;
+ u32 i;
+
+ for (i = 0; i < ARRAY_SIZE(qede_forced_speed_maps); i++) {
+ map = qede_forced_speed_maps + i;
+
+ linkmode_set_bit_array(map->cap_arr, map->arr_size, map->caps);
+ map->cap_arr = NULL;
+ map->arr_size = 0;
+ }
+}
+
+/* Ethtool callbacks */
+
static void qede_get_strings_stats_txq(struct qede_dev *edev,
struct qede_tx_queue *txq, u8 **buf)
{
@@ -458,10 +548,11 @@ static int qede_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd)
{
const struct ethtool_link_settings *base = &cmd->base;
- __ETHTOOL_DECLARE_LINK_MODE_MASK(sup_caps);
struct qede_dev *edev = netdev_priv(dev);
+ const struct qede_forced_speed_map *map;
struct qed_link_output current_link;
struct qed_link_params params;
+ u32 i;
if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) {
DP_INFO(edev, "Link settings are not allowed to be changed\n");
@@ -489,65 +580,24 @@ static int qede_set_link_ksettings(struct net_device *dev,
params.autoneg = false;
params.forced_speed = base->speed;
- phylink_zero(sup_caps);
+ for (i = 0; i < ARRAY_SIZE(qede_forced_speed_maps); i++) {
+ map = qede_forced_speed_maps + i;
- switch (base->speed) {
- case SPEED_1000:
- phylink_set(sup_caps, 1000baseT_Full);
- phylink_set(sup_caps, 1000baseKX_Full);
- phylink_set(sup_caps, 1000baseX_Full);
- break;
- case SPEED_10000:
- phylink_set(sup_caps, 10000baseT_Full);
- phylink_set(sup_caps, 10000baseKR_Full);
- phylink_set(sup_caps, 10000baseKX4_Full);
- phylink_set(sup_caps, 10000baseR_FEC);
- phylink_set(sup_caps, 10000baseCR_Full);
- phylink_set(sup_caps, 10000baseSR_Full);
- phylink_set(sup_caps, 10000baseLR_Full);
- phylink_set(sup_caps, 10000baseLRM_Full);
- break;
- case SPEED_20000:
- phylink_set(sup_caps, 20000baseKR2_Full);
- break;
- case SPEED_25000:
- phylink_set(sup_caps, 25000baseKR_Full);
- phylink_set(sup_caps, 25000baseCR_Full);
- phylink_set(sup_caps, 25000baseSR_Full);
- break;
- case SPEED_40000:
- phylink_set(sup_caps, 40000baseLR4_Full);
- phylink_set(sup_caps, 40000baseKR4_Full);
- phylink_set(sup_caps, 40000baseCR4_Full);
- phylink_set(sup_caps, 40000baseSR4_Full);
- break;
- case SPEED_50000:
- phylink_set(sup_caps, 50000baseKR2_Full);
- phylink_set(sup_caps, 50000baseCR2_Full);
- phylink_set(sup_caps, 50000baseSR2_Full);
- break;
- case SPEED_100000:
- phylink_set(sup_caps, 100000baseKR4_Full);
- phylink_set(sup_caps, 100000baseSR4_Full);
- phylink_set(sup_caps, 100000baseCR4_Full);
- phylink_set(sup_caps, 100000baseLR4_ER4_Full);
- break;
- default:
- DP_INFO(edev, "Unsupported speed %u\n", base->speed);
- return -EINVAL;
- }
+ if (base->speed != map->speed ||
+ !linkmode_intersects(current_link.supported_caps,
+ map->caps))
+ continue;
- if (!linkmode_intersects(current_link.supported_caps,
- sup_caps)) {
- DP_INFO(edev, "%uG speed not supported\n",
- base->speed / 1000);
- return -EINVAL;
+ linkmode_and(params.adv_speeds,
+ current_link.supported_caps, map->caps);
+ goto set_link;
}
- linkmode_and(params.adv_speeds, current_link.supported_caps,
- sup_caps);
+ DP_INFO(edev, "Unsupported speed %u\n", base->speed);
+ return -EINVAL;
}
+set_link:
params.link_up = true;
edev->ops->common->set_link(edev->cdev, ¶ms);
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index a653dd0e5c22..6f2171dc0dea 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -263,6 +263,8 @@ int __init qede_init(void)
pr_info("qede_init: %s\n", version);
+ qede_forced_speed_maps_init();
+
qed_ops = qed_get_eth_ops();
if (!qed_ops) {
pr_notice("Failed to get qed ethtool operations\n");
--
2.25.1
next prev parent reply other threads:[~2020-07-20 18:09 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-20 18:07 [PATCH v3 net-next 00/16] qed, qede: add support for new operating modes Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 01/16] linkmode: introduce linkmode_intersects() Alexander Lobakin
2020-07-20 18:31 ` Andrew Lunn
2020-07-20 18:08 ` [PATCH v3 net-next 02/16] qed, qede, qedf: convert link mode from u32 to ETHTOOL_LINK_MODE Alexander Lobakin
2020-07-20 18:34 ` Andrew Lunn
2020-07-20 18:08 ` Alexander Lobakin [this message]
2020-07-20 18:08 ` [PATCH v3 net-next 04/16] qed: reformat public_port::transceiver_data a bit Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 05/16] qed: add support for multi-rate transceivers Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 06/16] qed: use transceiver data to fill link partner's advertising speeds Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 07/16] qed: reformat several structures a bit Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 08/16] qed: add support for Forward Error Correction Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 09/16] qede: format qede{,_vf}_ethtool_ops Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 10/16] qede: introduce support for FEC control Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 11/16] qed: reformat several structures a bit Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 12/16] qed: remove unused qed_hw_info::port_mode and QED_PORT_MODE Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 13/16] qed: add support for new port modes Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 14/16] qed: add missing loopback modes Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 15/16] qed: populate supported link modes maps on module init Alexander Lobakin
2020-07-20 18:08 ` [PATCH v3 net-next 16/16] qed: add support for the extended speed and FEC modes Alexander Lobakin
2020-07-21 0:14 ` [PATCH v3 net-next 00/16] qed, qede: add support for new operating modes Jakub Kicinski
2020-07-21 1:00 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200720180815.107-4-alobakin@marvell.com \
--to=alobakin@marvell.com \
--cc=GR-everest-linux-l2@marvell.com \
--cc=QLogic-Storage-Upstream@marvell.com \
--cc=aelior@marvell.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=denis.bolotin@marvell.com \
--cc=irusskikh@marvell.com \
--cc=jejb@linux.ibm.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=michal.kalderon@marvell.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).