cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

octep_ctrl_net.c (5650B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Marvell Octeon EP (EndPoint) Ethernet Driver
      3 *
      4 * Copyright (C) 2020 Marvell.
      5 *
      6 */
      7#include <linux/string.h>
      8#include <linux/types.h>
      9#include <linux/etherdevice.h>
     10#include <linux/pci.h>
     11
     12#include "octep_config.h"
     13#include "octep_main.h"
     14#include "octep_ctrl_net.h"
     15
     16int octep_get_link_status(struct octep_device *oct)
     17{
     18	struct octep_ctrl_net_h2f_req req = {};
     19	struct octep_ctrl_net_h2f_resp *resp;
     20	struct octep_ctrl_mbox_msg msg = {};
     21	int err;
     22
     23	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS;
     24	req.link.cmd = OCTEP_CTRL_NET_CMD_GET;
     25
     26	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
     27	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
     28	msg.msg = &req;
     29	err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
     30	if (err)
     31		return err;
     32
     33	resp = (struct octep_ctrl_net_h2f_resp *)&req;
     34	return resp->link.state;
     35}
     36
     37void octep_set_link_status(struct octep_device *oct, bool up)
     38{
     39	struct octep_ctrl_net_h2f_req req = {};
     40	struct octep_ctrl_mbox_msg msg = {};
     41
     42	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS;
     43	req.link.cmd = OCTEP_CTRL_NET_CMD_SET;
     44	req.link.state = (up) ? OCTEP_CTRL_NET_STATE_UP : OCTEP_CTRL_NET_STATE_DOWN;
     45
     46	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
     47	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
     48	msg.msg = &req;
     49	octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
     50}
     51
     52void octep_set_rx_state(struct octep_device *oct, bool up)
     53{
     54	struct octep_ctrl_net_h2f_req req = {};
     55	struct octep_ctrl_mbox_msg msg = {};
     56
     57	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_RX_STATE;
     58	req.link.cmd = OCTEP_CTRL_NET_CMD_SET;
     59	req.link.state = (up) ? OCTEP_CTRL_NET_STATE_UP : OCTEP_CTRL_NET_STATE_DOWN;
     60
     61	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
     62	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
     63	msg.msg = &req;
     64	octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
     65}
     66
     67int octep_get_mac_addr(struct octep_device *oct, u8 *addr)
     68{
     69	struct octep_ctrl_net_h2f_req req = {};
     70	struct octep_ctrl_net_h2f_resp *resp;
     71	struct octep_ctrl_mbox_msg msg = {};
     72	int err;
     73
     74	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MAC;
     75	req.link.cmd = OCTEP_CTRL_NET_CMD_GET;
     76
     77	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
     78	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MAC_REQ_SZW;
     79	msg.msg = &req;
     80	err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
     81	if (err)
     82		return err;
     83
     84	resp = (struct octep_ctrl_net_h2f_resp *)&req;
     85	memcpy(addr, resp->mac.addr, ETH_ALEN);
     86
     87	return err;
     88}
     89
     90int octep_set_mac_addr(struct octep_device *oct, u8 *addr)
     91{
     92	struct octep_ctrl_net_h2f_req req = {};
     93	struct octep_ctrl_mbox_msg msg = {};
     94
     95	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MAC;
     96	req.mac.cmd = OCTEP_CTRL_NET_CMD_SET;
     97	memcpy(&req.mac.addr, addr, ETH_ALEN);
     98
     99	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
    100	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MAC_REQ_SZW;
    101	msg.msg = &req;
    102
    103	return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
    104}
    105
    106int octep_set_mtu(struct octep_device *oct, int mtu)
    107{
    108	struct octep_ctrl_net_h2f_req req = {};
    109	struct octep_ctrl_mbox_msg msg = {};
    110
    111	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MTU;
    112	req.mtu.cmd = OCTEP_CTRL_NET_CMD_SET;
    113	req.mtu.val = mtu;
    114
    115	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
    116	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MTU_REQ_SZW;
    117	msg.msg = &req;
    118
    119	return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
    120}
    121
    122int octep_get_if_stats(struct octep_device *oct)
    123{
    124	void __iomem *iface_rx_stats;
    125	void __iomem *iface_tx_stats;
    126	struct octep_ctrl_net_h2f_req req = {};
    127	struct octep_ctrl_mbox_msg msg = {};
    128	int err;
    129
    130	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS;
    131	req.mac.cmd = OCTEP_CTRL_NET_CMD_GET;
    132	req.get_stats.offset = oct->ctrl_mbox_ifstats_offset;
    133
    134	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
    135	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_GET_STATS_REQ_SZW;
    136	msg.msg = &req;
    137	err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
    138	if (err)
    139		return err;
    140
    141	iface_rx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset;
    142	iface_tx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset +
    143			 sizeof(struct octep_iface_rx_stats);
    144	memcpy_fromio(&oct->iface_rx_stats, iface_rx_stats, sizeof(struct octep_iface_rx_stats));
    145	memcpy_fromio(&oct->iface_tx_stats, iface_tx_stats, sizeof(struct octep_iface_tx_stats));
    146
    147	return err;
    148}
    149
    150int octep_get_link_info(struct octep_device *oct)
    151{
    152	struct octep_ctrl_net_h2f_req req = {};
    153	struct octep_ctrl_net_h2f_resp *resp;
    154	struct octep_ctrl_mbox_msg msg = {};
    155	int err;
    156
    157	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_INFO;
    158	req.mac.cmd = OCTEP_CTRL_NET_CMD_GET;
    159
    160	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
    161	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_LINK_INFO_REQ_SZW;
    162	msg.msg = &req;
    163	err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
    164	if (err)
    165		return err;
    166
    167	resp = (struct octep_ctrl_net_h2f_resp *)&req;
    168	oct->link_info.supported_modes = resp->link_info.supported_modes;
    169	oct->link_info.advertised_modes = resp->link_info.advertised_modes;
    170	oct->link_info.autoneg = resp->link_info.autoneg;
    171	oct->link_info.pause = resp->link_info.pause;
    172	oct->link_info.speed = resp->link_info.speed;
    173
    174	return err;
    175}
    176
    177int octep_set_link_info(struct octep_device *oct, struct octep_iface_link_info *link_info)
    178{
    179	struct octep_ctrl_net_h2f_req req = {};
    180	struct octep_ctrl_mbox_msg msg = {};
    181
    182	req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_INFO;
    183	req.link_info.cmd = OCTEP_CTRL_NET_CMD_SET;
    184	req.link_info.info.advertised_modes = link_info->advertised_modes;
    185	req.link_info.info.autoneg = link_info->autoneg;
    186	req.link_info.info.pause = link_info->pause;
    187	req.link_info.info.speed = link_info->speed;
    188
    189	msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
    190	msg.hdr.sizew = OCTEP_CTRL_NET_H2F_LINK_INFO_REQ_SZW;
    191	msg.msg = &req;
    192
    193	return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
    194}