RE: [EXT] [PATCH net-next v1] octeon_ep: get max rx packet length from firmware

From: Suman Ghosh
Date: Tue Nov 21 2023 - 23:43:01 EST


>Signed-off-by: Shinas Rasheed <srasheed@xxxxxxxxxxx>
>---
> .../marvell/octeon_ep/octep_ctrl_net.c | 18 ++++++++++++++++++
> .../marvell/octeon_ep/octep_ctrl_net.h | 9 +++++++++
> .../ethernet/marvell/octeon_ep/octep_main.c | 10 +++++++++-
> 3 files changed, 36 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c
>b/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c
>index 6dd3d03c1c0f..c9fcebb9bd9b 100644
>--- a/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c
>+++ b/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c
>@@ -198,6 +198,24 @@ int octep_ctrl_net_set_mac_addr(struct octep_device
>*oct, int vfid, u8 *addr,
> return octep_send_mbox_req(oct, &d, wait_for_response); }
>
>+int octep_ctrl_net_get_mtu(struct octep_device *oct, int vfid) {
>+ struct octep_ctrl_net_wait_data d = {0};
>+ struct octep_ctrl_net_h2f_req *req;
>+ int err;
>+
>+ req = &d.data.req;
>+ init_send_req(&d.msg, req, mtu_sz, vfid);
>+ req->hdr.s.cmd = OCTEP_CTRL_NET_H2F_CMD_MTU;
>+ req->mtu.cmd = OCTEP_CTRL_NET_CMD_GET;
>+
>+ err = octep_send_mbox_req(oct, &d, true);
>+ if (err < 0)
>+ return err;
>+
>+ return d.data.resp.mtu.val;
>+}
>+
> int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu,
> bool wait_for_response)
> {
>diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
>b/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
>index 4bb97ad1f1c6..46ddaa5c64d1 100644
>--- a/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
>+++ b/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
>@@ -282,6 +282,15 @@ int octep_ctrl_net_get_mac_addr(struct octep_device
>*oct, int vfid, u8 *addr); int octep_ctrl_net_set_mac_addr(struct
>octep_device *oct, int vfid, u8 *addr,
> bool wait_for_response);
>
>+/** Get max MTU from firmware.
>+ *
>+ * @param oct: non-null pointer to struct octep_device.
>+ * @param vfid: Index of virtual function.
>+ *
>+ * return value: mtu on success, -errno on failure.
>+ */
>+int octep_ctrl_net_get_mtu(struct octep_device *oct, int vfid);
>+
> /** Set mtu in firmware.
> *
> * @param oct: non-null pointer to struct octep_device.
>diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
>b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
>index 3cee69b3ac38..f9c539178114 100644
>--- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
>+++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
>@@ -1276,6 +1276,7 @@ static int octep_probe(struct pci_dev *pdev, const
>struct pci_device_id *ent) {
> struct octep_device *octep_dev = NULL;
> struct net_device *netdev;
>+ int max_rx_pktlen;
> int err;
>
> err = pci_enable_device(pdev);
>@@ -1346,8 +1347,15 @@ static int octep_probe(struct pci_dev *pdev,
>const struct pci_device_id *ent)
>
> netdev->hw_features = NETIF_F_SG;
> netdev->features |= netdev->hw_features;
>+
>+ max_rx_pktlen = octep_ctrl_net_get_mtu(octep_dev,
>OCTEP_CTRL_NET_INVALID_VFID);
>+ if (max_rx_pktlen < 0) {
>+ dev_err(&octep_dev->pdev->dev,
>+ "Failed to get max receive packet size; err = %d\n",
>max_rx_pktlen);
>+ goto register_dev_err;
>+ }
[Suman] Do we need to check if max_rx_pktlen <= OCTEP_MAX_MTU as well? If not, then this macro is not required further after the change?

> netdev->min_mtu = OCTEP_MIN_MTU;
>- netdev->max_mtu = OCTEP_MAX_MTU;
>+ netdev->max_mtu = max_rx_pktlen - (ETH_HLEN + ETH_FCS_LEN);
> netdev->mtu = OCTEP_DEFAULT_MTU;
>
> err = octep_ctrl_net_get_mac_addr(octep_dev,
>OCTEP_CTRL_NET_INVALID_VFID,
>--
>2.25.1
>