162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2014-2015 Hisilicon Limited. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __HNS_ENET_H 762306a36Sopenharmony_ci#define __HNS_ENET_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/netdevice.h> 1062306a36Sopenharmony_ci#include <linux/of_net.h> 1162306a36Sopenharmony_ci#include <linux/of_mdio.h> 1262306a36Sopenharmony_ci#include <linux/timer.h> 1362306a36Sopenharmony_ci#include <linux/workqueue.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "hnae.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define HNS_DEBUG_OFFSET 6 1862306a36Sopenharmony_ci#define HNS_SRV_OFFSET 2 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cienum hns_nic_state { 2162306a36Sopenharmony_ci NIC_STATE_TESTING = 0, 2262306a36Sopenharmony_ci NIC_STATE_RESETTING, 2362306a36Sopenharmony_ci NIC_STATE_REINITING, 2462306a36Sopenharmony_ci NIC_STATE_DOWN, 2562306a36Sopenharmony_ci NIC_STATE_DISABLED, 2662306a36Sopenharmony_ci NIC_STATE_REMOVING, 2762306a36Sopenharmony_ci NIC_STATE_SERVICE_INITED, 2862306a36Sopenharmony_ci NIC_STATE_SERVICE_SCHED, 2962306a36Sopenharmony_ci NIC_STATE2_RESET_REQUESTED, 3062306a36Sopenharmony_ci NIC_STATE_MAX 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct hns_nic_ring_data { 3462306a36Sopenharmony_ci struct hnae_ring *ring; 3562306a36Sopenharmony_ci struct napi_struct napi; 3662306a36Sopenharmony_ci cpumask_t mask; /* affinity mask */ 3762306a36Sopenharmony_ci u32 queue_index; 3862306a36Sopenharmony_ci int (*poll_one)(struct hns_nic_ring_data *, int, void *); 3962306a36Sopenharmony_ci void (*ex_process)(struct hns_nic_ring_data *, struct sk_buff *); 4062306a36Sopenharmony_ci bool (*fini_process)(struct hns_nic_ring_data *); 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* compatible the difference between two versions */ 4462306a36Sopenharmony_cistruct hns_nic_ops { 4562306a36Sopenharmony_ci void (*fill_desc)(struct hnae_ring *ring, void *priv, 4662306a36Sopenharmony_ci int size, dma_addr_t dma, int frag_end, 4762306a36Sopenharmony_ci int buf_num, enum hns_desc_type type, int mtu, 4862306a36Sopenharmony_ci bool is_gso); 4962306a36Sopenharmony_ci int (*maybe_stop_tx)(struct sk_buff **out_skb, 5062306a36Sopenharmony_ci int *bnum, struct hnae_ring *ring); 5162306a36Sopenharmony_ci void (*get_rxd_bnum)(u32 bnum_flag, int *out_bnum); 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct hns_nic_priv { 5562306a36Sopenharmony_ci const struct fwnode_handle *fwnode; 5662306a36Sopenharmony_ci u32 enet_ver; 5762306a36Sopenharmony_ci u32 port_id; 5862306a36Sopenharmony_ci int phy_mode; 5962306a36Sopenharmony_ci int phy_led_val; 6062306a36Sopenharmony_ci struct net_device *netdev; 6162306a36Sopenharmony_ci struct device *dev; 6262306a36Sopenharmony_ci struct hnae_handle *ae_handle; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci struct hns_nic_ops ops; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci /* the cb for nic to manage the ring buffer, the first half of the 6762306a36Sopenharmony_ci * array is for tx_ring and vice versa for the second half 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci struct hns_nic_ring_data *ring_data; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* The most recently read link state */ 7262306a36Sopenharmony_ci int link; 7362306a36Sopenharmony_ci u64 tx_timeout_count; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci unsigned long state; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci struct timer_list service_timer; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci struct work_struct service_task; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci struct notifier_block notifier_block; 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#define tx_ring_data(priv, idx) ((priv)->ring_data[idx]) 8562306a36Sopenharmony_ci#define rx_ring_data(priv, idx) \ 8662306a36Sopenharmony_ci ((priv)->ring_data[(priv)->ae_handle->q_num + (idx)]) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_civoid hns_ethtool_set_ops(struct net_device *ndev); 8962306a36Sopenharmony_civoid hns_nic_net_reset(struct net_device *ndev); 9062306a36Sopenharmony_civoid hns_nic_net_reinit(struct net_device *netdev); 9162306a36Sopenharmony_ciint hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h); 9262306a36Sopenharmony_cinetdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev, 9362306a36Sopenharmony_ci struct sk_buff *skb, 9462306a36Sopenharmony_ci struct hns_nic_ring_data *ring_data); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#endif /**__HNS_ENET_H */ 97