Message ID | 20240822184944.3882360-1-mohsin.bashr@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,1/2] eth: fbnic: Add ethtool support for fbnic | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net-next, async |
netdev/apply | fail | Patch does not apply to net-next-0 |
On 8/22/24 20:49, Mohsin Bashir wrote: > Add ethtool ops support and enable 'get_drvinfo' for fbnic. The driver > provides firmware version information while the driver name and bus > information is provided by ethtool_get_drvinfo(). > > Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com> > --- > drivers/net/ethernet/meta/fbnic/Makefile | 1 + > drivers/net/ethernet/meta/fbnic/fbnic.h | 3 +++ > .../net/ethernet/meta/fbnic/fbnic_ethtool.c | 26 +++++++++++++++++++ > drivers/net/ethernet/meta/fbnic/fbnic_fw.c | 13 ++++++++++ > drivers/net/ethernet/meta/fbnic/fbnic_fw.h | 6 ++--- > .../net/ethernet/meta/fbnic/fbnic_netdev.c | 2 ++ > .../net/ethernet/meta/fbnic/fbnic_netdev.h | 1 + > 7 files changed, 49 insertions(+), 3 deletions(-) > create mode 100644 drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c > > diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile > index 9373b558fdc9..37cfc34a5118 100644 > --- a/drivers/net/ethernet/meta/fbnic/Makefile > +++ b/drivers/net/ethernet/meta/fbnic/Makefile > @@ -8,6 +8,7 @@ > obj-$(CONFIG_FBNIC) += fbnic.o > > fbnic-y := fbnic_devlink.o \ > + fbnic_ethtool.o \ > fbnic_fw.o \ > fbnic_irq.o \ > fbnic_mac.o \ > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h > index ad2689bfd6cb..28d970f81bfc 100644 > --- a/drivers/net/ethernet/meta/fbnic/fbnic.h > +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h > @@ -132,6 +132,9 @@ void fbnic_free_irq(struct fbnic_dev *dev, int nr, void *data); > void fbnic_free_irqs(struct fbnic_dev *fbd); > int fbnic_alloc_irqs(struct fbnic_dev *fbd); > > +void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version, > + const size_t str_sz); > + > enum fbnic_boards { > fbnic_board_asic > }; > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c > new file mode 100644 > index 000000000000..0dc083fd1878 > --- /dev/null > +++ b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c > @@ -0,0 +1,26 @@ > +#include <linux/ethtool.h> > +#include <linux/netdevice.h> > +#include <linux/pci.h> > + > +#include "fbnic.h" > +#include "fbnic_netdev.h" > +#include "fbnic_tlv.h" > + > +static void > +fbnic_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) > +{ > + struct fbnic_net *fbn = netdev_priv(netdev); > + struct fbnic_dev *fbd = fbn->fbd; > + > + fbnic_get_fw_ver_commit_str(fbd, drvinfo->fw_version, > + sizeof(drvinfo->fw_version)); > +} > + > +static const struct ethtool_ops fbnic_ethtool_ops = { > + .get_drvinfo = fbnic_get_drvinfo, > +}; > + > +void fbnic_set_ethtool_ops(struct net_device *dev) > +{ > + dev->ethtool_ops = &fbnic_ethtool_ops; > +} > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c > index 0c6e1b4c119b..5825b69f4638 100644 > --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c > +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c > @@ -789,3 +789,16 @@ void fbnic_mbx_flush_tx(struct fbnic_dev *fbd) > count += (tx_mbx->head - head) % FBNIC_IPC_MBX_DESC_LEN; > } while (count < FBNIC_IPC_MBX_DESC_LEN && --attempts); > } > + > +void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version, > + const size_t str_sz) > +{ > + struct fbnic_fw_ver *mgmt = &fbd->fw_cap.running.mgmt; > + const char *delim = ""; > + > + if (strlen(mgmt->commit) > 0) isn't @str_sz holding the size already? anyway, non-emptiness check should be just mgmt->commit[0] > + delim = "_"; > + > + fbnic_mk_full_fw_ver_str(mgmt->version, delim, mgmt->commit, > + fw_version, str_sz); > +} > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h > index c65bca613665..221faf8c6756 100644 > --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h > +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h > @@ -53,10 +53,10 @@ int fbnic_fw_xmit_ownership_msg(struct fbnic_dev *fbd, bool take_ownership); > int fbnic_fw_init_heartbeat(struct fbnic_dev *fbd, bool poll); > void fbnic_fw_check_heartbeat(struct fbnic_dev *fbd); > > -#define fbnic_mk_full_fw_ver_str(_rev_id, _delim, _commit, _str) \ > +#define fbnic_mk_full_fw_ver_str(_rev_id, _delim, _commit, _str, _str_sz) \ > do { \ > const u32 __rev_id = _rev_id; \ > - snprintf(_str, sizeof(_str), "%02lu.%02lu.%02lu-%03lu%s%s", \ > + snprintf(_str, _str_sz, "%02lu.%02lu.%02lu-%03lu%s%s", \ > FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MAJOR, __rev_id), \ > FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MINOR, __rev_id), \ > FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_PATCH, __rev_id), \ > @@ -65,7 +65,7 @@ do { \ > } while (0) > > #define fbnic_mk_fw_ver_str(_rev_id, _str) \ > - fbnic_mk_full_fw_ver_str(_rev_id, "", "", _str) > + fbnic_mk_full_fw_ver_str(_rev_id, "", "", _str, sizeof(_str)) > > #define FW_HEARTBEAT_PERIOD (10 * HZ) > > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c > index b7ce6da68543..921325de8d8a 100644 > --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c > +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c > @@ -385,6 +385,8 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd) > > netdev->netdev_ops = &fbnic_netdev_ops; > > + fbnic_set_ethtool_ops(netdev); > + > fbn = netdev_priv(netdev); > > fbn->netdev = netdev; > diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h > index 6bc0ebeb8182..d1abc67f340d 100644 > --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h > +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h > @@ -55,6 +55,7 @@ int fbnic_netdev_register(struct net_device *netdev); > void fbnic_netdev_unregister(struct net_device *netdev); > void fbnic_reset_queues(struct fbnic_net *fbn, > unsigned int tx, unsigned int rx); > +void fbnic_set_ethtool_ops(struct net_device *dev); > > void __fbnic_set_rx_mode(struct net_device *netdev); > void fbnic_clear_rx_mode(struct net_device *netdev);
On Thu, Aug 22, 2024 at 11:49:43AM -0700, Mohsin Bashir wrote: > Add ethtool ops support and enable 'get_drvinfo' for fbnic. The driver > provides firmware version information while the driver name and bus > information is provided by ethtool_get_drvinfo(). > > Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com> Unfortunately this patchset doesn't apply cleanly to net-next. So I think it will need to be rebased and reposted. Also, please consider a cover letter for patch-sets with two or more patches. Thanks!
diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile index 9373b558fdc9..37cfc34a5118 100644 --- a/drivers/net/ethernet/meta/fbnic/Makefile +++ b/drivers/net/ethernet/meta/fbnic/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_FBNIC) += fbnic.o fbnic-y := fbnic_devlink.o \ + fbnic_ethtool.o \ fbnic_fw.o \ fbnic_irq.o \ fbnic_mac.o \ diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h index ad2689bfd6cb..28d970f81bfc 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h @@ -132,6 +132,9 @@ void fbnic_free_irq(struct fbnic_dev *dev, int nr, void *data); void fbnic_free_irqs(struct fbnic_dev *fbd); int fbnic_alloc_irqs(struct fbnic_dev *fbd); +void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version, + const size_t str_sz); + enum fbnic_boards { fbnic_board_asic }; diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c new file mode 100644 index 000000000000..0dc083fd1878 --- /dev/null +++ b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c @@ -0,0 +1,26 @@ +#include <linux/ethtool.h> +#include <linux/netdevice.h> +#include <linux/pci.h> + +#include "fbnic.h" +#include "fbnic_netdev.h" +#include "fbnic_tlv.h" + +static void +fbnic_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) +{ + struct fbnic_net *fbn = netdev_priv(netdev); + struct fbnic_dev *fbd = fbn->fbd; + + fbnic_get_fw_ver_commit_str(fbd, drvinfo->fw_version, + sizeof(drvinfo->fw_version)); +} + +static const struct ethtool_ops fbnic_ethtool_ops = { + .get_drvinfo = fbnic_get_drvinfo, +}; + +void fbnic_set_ethtool_ops(struct net_device *dev) +{ + dev->ethtool_ops = &fbnic_ethtool_ops; +} diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c index 0c6e1b4c119b..5825b69f4638 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c @@ -789,3 +789,16 @@ void fbnic_mbx_flush_tx(struct fbnic_dev *fbd) count += (tx_mbx->head - head) % FBNIC_IPC_MBX_DESC_LEN; } while (count < FBNIC_IPC_MBX_DESC_LEN && --attempts); } + +void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version, + const size_t str_sz) +{ + struct fbnic_fw_ver *mgmt = &fbd->fw_cap.running.mgmt; + const char *delim = ""; + + if (strlen(mgmt->commit) > 0) + delim = "_"; + + fbnic_mk_full_fw_ver_str(mgmt->version, delim, mgmt->commit, + fw_version, str_sz); +} diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h index c65bca613665..221faf8c6756 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h @@ -53,10 +53,10 @@ int fbnic_fw_xmit_ownership_msg(struct fbnic_dev *fbd, bool take_ownership); int fbnic_fw_init_heartbeat(struct fbnic_dev *fbd, bool poll); void fbnic_fw_check_heartbeat(struct fbnic_dev *fbd); -#define fbnic_mk_full_fw_ver_str(_rev_id, _delim, _commit, _str) \ +#define fbnic_mk_full_fw_ver_str(_rev_id, _delim, _commit, _str, _str_sz) \ do { \ const u32 __rev_id = _rev_id; \ - snprintf(_str, sizeof(_str), "%02lu.%02lu.%02lu-%03lu%s%s", \ + snprintf(_str, _str_sz, "%02lu.%02lu.%02lu-%03lu%s%s", \ FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MAJOR, __rev_id), \ FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MINOR, __rev_id), \ FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_PATCH, __rev_id), \ @@ -65,7 +65,7 @@ do { \ } while (0) #define fbnic_mk_fw_ver_str(_rev_id, _str) \ - fbnic_mk_full_fw_ver_str(_rev_id, "", "", _str) + fbnic_mk_full_fw_ver_str(_rev_id, "", "", _str, sizeof(_str)) #define FW_HEARTBEAT_PERIOD (10 * HZ) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c index b7ce6da68543..921325de8d8a 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c @@ -385,6 +385,8 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd) netdev->netdev_ops = &fbnic_netdev_ops; + fbnic_set_ethtool_ops(netdev); + fbn = netdev_priv(netdev); fbn->netdev = netdev; diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h index 6bc0ebeb8182..d1abc67f340d 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h @@ -55,6 +55,7 @@ int fbnic_netdev_register(struct net_device *netdev); void fbnic_netdev_unregister(struct net_device *netdev); void fbnic_reset_queues(struct fbnic_net *fbn, unsigned int tx, unsigned int rx); +void fbnic_set_ethtool_ops(struct net_device *dev); void __fbnic_set_rx_mode(struct net_device *netdev); void fbnic_clear_rx_mode(struct net_device *netdev);
Add ethtool ops support and enable 'get_drvinfo' for fbnic. The driver provides firmware version information while the driver name and bus information is provided by ethtool_get_drvinfo(). Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com> --- drivers/net/ethernet/meta/fbnic/Makefile | 1 + drivers/net/ethernet/meta/fbnic/fbnic.h | 3 +++ .../net/ethernet/meta/fbnic/fbnic_ethtool.c | 26 +++++++++++++++++++ drivers/net/ethernet/meta/fbnic/fbnic_fw.c | 13 ++++++++++ drivers/net/ethernet/meta/fbnic/fbnic_fw.h | 6 ++--- .../net/ethernet/meta/fbnic/fbnic_netdev.c | 2 ++ .../net/ethernet/meta/fbnic/fbnic_netdev.h | 1 + 7 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c