Commit 0718693f authored by Veerasenareddy Burru's avatar Veerasenareddy Burru Committed by David S. Miller

octeon_ep: function id in link info and stats mailbox commands

Update control mailbox API to include function id in get stats and
link info.
Signed-off-by: default avatarVeerasenareddy Burru <vburru@marvell.com>
Signed-off-by: default avatarAbhijit Ayarekar <aayarekar@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent baa98798
...@@ -19,7 +19,6 @@ static const u32 mtu_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mtu); ...@@ -19,7 +19,6 @@ static const u32 mtu_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mtu);
static const u32 mac_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mac); static const u32 mac_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mac);
static const u32 state_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_state); static const u32 state_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_state);
static const u32 link_info_sz = sizeof(struct octep_ctrl_net_link_info); static const u32 link_info_sz = sizeof(struct octep_ctrl_net_link_info);
static const u32 get_stats_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_get_stats);
static atomic_t ctrl_net_msg_id; static atomic_t ctrl_net_msg_id;
static void init_send_req(struct octep_ctrl_mbox_msg *msg, void *buf, static void init_send_req(struct octep_ctrl_mbox_msg *msg, void *buf,
...@@ -188,31 +187,29 @@ int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu, ...@@ -188,31 +187,29 @@ int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu,
return octep_send_mbox_req(oct, &d, wait_for_response); return octep_send_mbox_req(oct, &d, wait_for_response);
} }
int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid) int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid,
struct octep_iface_rx_stats *rx_stats,
struct octep_iface_tx_stats *tx_stats)
{ {
struct octep_ctrl_net_wait_data d = {0}; struct octep_ctrl_net_wait_data d = {0};
struct octep_ctrl_net_h2f_req *req = &d.data.req; struct octep_ctrl_net_h2f_req *req = &d.data.req;
void __iomem *iface_rx_stats; struct octep_ctrl_net_h2f_resp *resp;
void __iomem *iface_tx_stats;
int err; int err;
init_send_req(&d.msg, req, get_stats_sz, vfid); init_send_req(&d.msg, req, 0, vfid);
req->hdr.s.cmd = OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS; req->hdr.s.cmd = OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS;
req->get_stats.offset = oct->ctrl_mbox_ifstats_offset;
err = octep_send_mbox_req(oct, &d, true); err = octep_send_mbox_req(oct, &d, true);
if (err < 0) if (err < 0)
return err; return err;
iface_rx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset; resp = &d.data.resp;
iface_tx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset + memcpy(rx_stats, &resp->if_stats.rx_stats, sizeof(struct octep_iface_rx_stats));
sizeof(struct octep_iface_rx_stats); memcpy(tx_stats, &resp->if_stats.tx_stats, sizeof(struct octep_iface_tx_stats));
memcpy_fromio(&oct->iface_rx_stats, iface_rx_stats, sizeof(struct octep_iface_rx_stats));
memcpy_fromio(&oct->iface_tx_stats, iface_tx_stats, sizeof(struct octep_iface_tx_stats));
return 0; return 0;
} }
int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid) int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid,
struct octep_iface_link_info *link_info)
{ {
struct octep_ctrl_net_wait_data d = {0}; struct octep_ctrl_net_wait_data d = {0};
struct octep_ctrl_net_h2f_req *req = &d.data.req; struct octep_ctrl_net_h2f_req *req = &d.data.req;
...@@ -227,11 +224,11 @@ int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid) ...@@ -227,11 +224,11 @@ int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid)
return err; return err;
resp = &d.data.resp; resp = &d.data.resp;
oct->link_info.supported_modes = resp->link_info.supported_modes; link_info->supported_modes = resp->link_info.supported_modes;
oct->link_info.advertised_modes = resp->link_info.advertised_modes; link_info->advertised_modes = resp->link_info.advertised_modes;
oct->link_info.autoneg = resp->link_info.autoneg; link_info->autoneg = resp->link_info.autoneg;
oct->link_info.pause = resp->link_info.pause; link_info->pause = resp->link_info.pause;
oct->link_info.speed = resp->link_info.speed; link_info->speed = resp->link_info.speed;
return 0; return 0;
} }
......
...@@ -77,12 +77,6 @@ struct octep_ctrl_net_h2f_req_cmd_mac { ...@@ -77,12 +77,6 @@ struct octep_ctrl_net_h2f_req_cmd_mac {
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
}; };
/* get if_stats, xstats, q_stats request */
struct octep_ctrl_net_h2f_req_cmd_get_stats {
/* offset into barmem where fw should copy over stats */
u32 offset;
};
/* get/set link state, rx state */ /* get/set link state, rx state */
struct octep_ctrl_net_h2f_req_cmd_state { struct octep_ctrl_net_h2f_req_cmd_state {
/* enum octep_ctrl_net_cmd */ /* enum octep_ctrl_net_cmd */
...@@ -119,7 +113,6 @@ struct octep_ctrl_net_h2f_req { ...@@ -119,7 +113,6 @@ struct octep_ctrl_net_h2f_req {
union { union {
struct octep_ctrl_net_h2f_req_cmd_mtu mtu; struct octep_ctrl_net_h2f_req_cmd_mtu mtu;
struct octep_ctrl_net_h2f_req_cmd_mac mac; struct octep_ctrl_net_h2f_req_cmd_mac mac;
struct octep_ctrl_net_h2f_req_cmd_get_stats get_stats;
struct octep_ctrl_net_h2f_req_cmd_state link; struct octep_ctrl_net_h2f_req_cmd_state link;
struct octep_ctrl_net_h2f_req_cmd_state rx; struct octep_ctrl_net_h2f_req_cmd_state rx;
struct octep_ctrl_net_h2f_req_cmd_link_info link_info; struct octep_ctrl_net_h2f_req_cmd_link_info link_info;
...@@ -152,6 +145,12 @@ struct octep_ctrl_net_h2f_resp_cmd_mac { ...@@ -152,6 +145,12 @@ struct octep_ctrl_net_h2f_resp_cmd_mac {
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
}; };
/* get if_stats, xstats, q_stats request */
struct octep_ctrl_net_h2f_resp_cmd_get_stats {
struct octep_iface_rx_stats rx_stats;
struct octep_iface_tx_stats tx_stats;
};
/* get link state, rx state response */ /* get link state, rx state response */
struct octep_ctrl_net_h2f_resp_cmd_state { struct octep_ctrl_net_h2f_resp_cmd_state {
/* enum octep_ctrl_net_state */ /* enum octep_ctrl_net_state */
...@@ -164,6 +163,7 @@ struct octep_ctrl_net_h2f_resp { ...@@ -164,6 +163,7 @@ struct octep_ctrl_net_h2f_resp {
union { union {
struct octep_ctrl_net_h2f_resp_cmd_mtu mtu; struct octep_ctrl_net_h2f_resp_cmd_mtu mtu;
struct octep_ctrl_net_h2f_resp_cmd_mac mac; struct octep_ctrl_net_h2f_resp_cmd_mac mac;
struct octep_ctrl_net_h2f_resp_cmd_get_stats if_stats;
struct octep_ctrl_net_h2f_resp_cmd_state link; struct octep_ctrl_net_h2f_resp_cmd_state link;
struct octep_ctrl_net_h2f_resp_cmd_state rx; struct octep_ctrl_net_h2f_resp_cmd_state rx;
struct octep_ctrl_net_link_info link_info; struct octep_ctrl_net_link_info link_info;
...@@ -286,19 +286,25 @@ int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu, ...@@ -286,19 +286,25 @@ int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu,
* *
* @param oct: non-null pointer to struct octep_device. * @param oct: non-null pointer to struct octep_device.
* @param vfid: Index of virtual function. * @param vfid: Index of virtual function.
* @param rx_stats: non-null pointer struct octep_iface_rx_stats.
* @param tx_stats: non-null pointer struct octep_iface_tx_stats.
* *
* return value: 0 on success, -errno on failure. * return value: 0 on success, -errno on failure.
*/ */
int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid); int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid,
struct octep_iface_rx_stats *rx_stats,
struct octep_iface_tx_stats *tx_stats);
/** Get link info from firmware. /** Get link info from firmware.
* *
* @param oct: non-null pointer to struct octep_device. * @param oct: non-null pointer to struct octep_device.
* @param vfid: Index of virtual function. * @param vfid: Index of virtual function.
* @param link_info: non-null pointer to struct octep_iface_link_info.
* *
* return value: 0 on success, -errno on failure. * return value: 0 on success, -errno on failure.
*/ */
int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid); int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid,
struct octep_iface_link_info *link_info);
/** Set link info in firmware. /** Set link info in firmware.
* *
......
...@@ -150,9 +150,12 @@ octep_get_ethtool_stats(struct net_device *netdev, ...@@ -150,9 +150,12 @@ octep_get_ethtool_stats(struct net_device *netdev,
rx_packets = 0; rx_packets = 0;
rx_bytes = 0; rx_bytes = 0;
octep_ctrl_net_get_if_stats(oct, OCTEP_CTRL_NET_INVALID_VFID);
iface_tx_stats = &oct->iface_tx_stats; iface_tx_stats = &oct->iface_tx_stats;
iface_rx_stats = &oct->iface_rx_stats; iface_rx_stats = &oct->iface_rx_stats;
octep_ctrl_net_get_if_stats(oct,
OCTEP_CTRL_NET_INVALID_VFID,
iface_rx_stats,
iface_tx_stats);
for (q = 0; q < oct->num_oqs; q++) { for (q = 0; q < oct->num_oqs; q++) {
struct octep_iq *iq = oct->iq[q]; struct octep_iq *iq = oct->iq[q];
...@@ -283,11 +286,11 @@ static int octep_get_link_ksettings(struct net_device *netdev, ...@@ -283,11 +286,11 @@ static int octep_get_link_ksettings(struct net_device *netdev,
ethtool_link_ksettings_zero_link_mode(cmd, supported); ethtool_link_ksettings_zero_link_mode(cmd, supported);
ethtool_link_ksettings_zero_link_mode(cmd, advertising); ethtool_link_ksettings_zero_link_mode(cmd, advertising);
octep_ctrl_net_get_link_info(oct, OCTEP_CTRL_NET_INVALID_VFID); link_info = &oct->link_info;
octep_ctrl_net_get_link_info(oct, OCTEP_CTRL_NET_INVALID_VFID, link_info);
advertised_modes = oct->link_info.advertised_modes; advertised_modes = oct->link_info.advertised_modes;
supported_modes = oct->link_info.supported_modes; supported_modes = oct->link_info.supported_modes;
link_info = &oct->link_info;
OCTEP_SET_ETHTOOL_LINK_MODES_BITMAP(supported_modes, cmd, supported); OCTEP_SET_ETHTOOL_LINK_MODES_BITMAP(supported_modes, cmd, supported);
OCTEP_SET_ETHTOOL_LINK_MODES_BITMAP(advertised_modes, cmd, advertising); OCTEP_SET_ETHTOOL_LINK_MODES_BITMAP(advertised_modes, cmd, advertising);
......
...@@ -763,7 +763,10 @@ static void octep_get_stats64(struct net_device *netdev, ...@@ -763,7 +763,10 @@ static void octep_get_stats64(struct net_device *netdev,
int q; int q;
if (netif_running(netdev)) if (netif_running(netdev))
octep_ctrl_net_get_if_stats(oct, OCTEP_CTRL_NET_INVALID_VFID); octep_ctrl_net_get_if_stats(oct,
OCTEP_CTRL_NET_INVALID_VFID,
&oct->iface_rx_stats,
&oct->iface_tx_stats);
tx_packets = 0; tx_packets = 0;
tx_bytes = 0; tx_bytes = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment