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: Veerasenareddy Burru <vburru@marvell.com> Signed-off-by: Abhijit Ayarekar <aayarekar@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
baa9879887
commit
0718693fb3
@@ -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 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 get_stats_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_get_stats);
|
||||
static atomic_t ctrl_net_msg_id;
|
||||
|
||||
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,
|
||||
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_h2f_req *req = &d.data.req;
|
||||
void __iomem *iface_rx_stats;
|
||||
void __iomem *iface_tx_stats;
|
||||
struct octep_ctrl_net_h2f_resp *resp;
|
||||
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->get_stats.offset = oct->ctrl_mbox_ifstats_offset;
|
||||
err = octep_send_mbox_req(oct, &d, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
iface_rx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset;
|
||||
iface_tx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset +
|
||||
sizeof(struct octep_iface_rx_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));
|
||||
|
||||
resp = &d.data.resp;
|
||||
memcpy(rx_stats, &resp->if_stats.rx_stats, sizeof(struct octep_iface_rx_stats));
|
||||
memcpy(tx_stats, &resp->if_stats.tx_stats, sizeof(struct octep_iface_tx_stats));
|
||||
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_h2f_req *req = &d.data.req;
|
||||
@@ -227,11 +224,11 @@ int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid)
|
||||
return err;
|
||||
|
||||
resp = &d.data.resp;
|
||||
oct->link_info.supported_modes = resp->link_info.supported_modes;
|
||||
oct->link_info.advertised_modes = resp->link_info.advertised_modes;
|
||||
oct->link_info.autoneg = resp->link_info.autoneg;
|
||||
oct->link_info.pause = resp->link_info.pause;
|
||||
oct->link_info.speed = resp->link_info.speed;
|
||||
link_info->supported_modes = resp->link_info.supported_modes;
|
||||
link_info->advertised_modes = resp->link_info.advertised_modes;
|
||||
link_info->autoneg = resp->link_info.autoneg;
|
||||
link_info->pause = resp->link_info.pause;
|
||||
link_info->speed = resp->link_info.speed;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -77,12 +77,6 @@ struct octep_ctrl_net_h2f_req_cmd_mac {
|
||||
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 */
|
||||
struct octep_ctrl_net_h2f_req_cmd_state {
|
||||
/* enum octep_ctrl_net_cmd */
|
||||
@@ -119,7 +113,6 @@ struct octep_ctrl_net_h2f_req {
|
||||
union {
|
||||
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_get_stats get_stats;
|
||||
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_link_info link_info;
|
||||
@@ -152,6 +145,12 @@ struct octep_ctrl_net_h2f_resp_cmd_mac {
|
||||
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 */
|
||||
struct octep_ctrl_net_h2f_resp_cmd_state {
|
||||
/* enum octep_ctrl_net_state */
|
||||
@@ -164,6 +163,7 @@ struct octep_ctrl_net_h2f_resp {
|
||||
union {
|
||||
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_get_stats if_stats;
|
||||
struct octep_ctrl_net_h2f_resp_cmd_state link;
|
||||
struct octep_ctrl_net_h2f_resp_cmd_state rx;
|
||||
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,
|
||||
*
|
||||
* @param oct: non-null pointer to struct octep_device.
|
||||
* @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.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* @param oct: non-null pointer to struct octep_device.
|
||||
* @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.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
|
||||
@@ -150,9 +150,12 @@ octep_get_ethtool_stats(struct net_device *netdev,
|
||||
rx_packets = 0;
|
||||
rx_bytes = 0;
|
||||
|
||||
octep_ctrl_net_get_if_stats(oct, OCTEP_CTRL_NET_INVALID_VFID);
|
||||
iface_tx_stats = &oct->iface_tx_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++) {
|
||||
struct octep_iq *iq = oct->iq[q];
|
||||
@@ -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, 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;
|
||||
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(advertised_modes, cmd, advertising);
|
||||
|
||||
@@ -763,7 +763,10 @@ static void octep_get_stats64(struct net_device *netdev,
|
||||
int q;
|
||||
|
||||
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_bytes = 0;
|
||||
|
||||
Reference in New Issue
Block a user