1 /*
2  * Huawei HiNIC PCI Express Linux driver
3  * Copyright(c) 2017 Huawei Technologies Co., Ltd
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  */
15 
16 #ifndef HINIC_PORT_H
17 #define HINIC_PORT_H
18 
19 #include <linux/types.h>
20 #include <linux/etherdevice.h>
21 #include <linux/bitops.h>
22 
23 #include "hinic_dev.h"
24 
25 enum hinic_rx_mode {
26 	HINIC_RX_MODE_UC        = BIT(0),
27 	HINIC_RX_MODE_MC        = BIT(1),
28 	HINIC_RX_MODE_BC        = BIT(2),
29 	HINIC_RX_MODE_MC_ALL    = BIT(3),
30 	HINIC_RX_MODE_PROMISC   = BIT(4),
31 };
32 
33 enum hinic_port_link_state {
34 	HINIC_LINK_STATE_DOWN,
35 	HINIC_LINK_STATE_UP,
36 };
37 
38 enum hinic_port_state {
39 	HINIC_PORT_DISABLE      = 0,
40 	HINIC_PORT_ENABLE       = 3,
41 };
42 
43 enum hinic_func_port_state {
44 	HINIC_FUNC_PORT_DISABLE = 0,
45 	HINIC_FUNC_PORT_ENABLE  = 2,
46 };
47 
48 struct hinic_port_mac_cmd {
49 	u8              status;
50 	u8              version;
51 	u8              rsvd0[6];
52 
53 	u16             func_idx;
54 	u16             vlan_id;
55 	u16             rsvd1;
56 	unsigned char   mac[ETH_ALEN];
57 };
58 
59 struct hinic_port_mtu_cmd {
60 	u8      status;
61 	u8      version;
62 	u8      rsvd0[6];
63 
64 	u16     func_idx;
65 	u16     rsvd1;
66 	u32     mtu;
67 };
68 
69 struct hinic_port_vlan_cmd {
70 	u8      status;
71 	u8      version;
72 	u8      rsvd0[6];
73 
74 	u16     func_idx;
75 	u16     vlan_id;
76 };
77 
78 struct hinic_port_rx_mode_cmd {
79 	u8      status;
80 	u8      version;
81 	u8      rsvd0[6];
82 
83 	u16     func_idx;
84 	u16     rsvd;
85 	u32     rx_mode;
86 };
87 
88 struct hinic_port_link_cmd {
89 	u8      status;
90 	u8      version;
91 	u8      rsvd0[6];
92 
93 	u16     func_idx;
94 	u8      state;
95 	u8      rsvd1;
96 };
97 
98 struct hinic_port_state_cmd {
99 	u8      status;
100 	u8      version;
101 	u8      rsvd0[6];
102 
103 	u8      state;
104 	u8      rsvd1[3];
105 };
106 
107 struct hinic_port_link_status {
108 	u8      status;
109 	u8      version;
110 	u8      rsvd0[6];
111 
112 	u16     rsvd1;
113 	u8      link;
114 	u8      rsvd2;
115 };
116 
117 struct hinic_port_func_state_cmd {
118 	u8      status;
119 	u8      version;
120 	u8      rsvd0[6];
121 
122 	u16     func_idx;
123 	u16     rsvd1;
124 	u8      state;
125 	u8      rsvd2[3];
126 };
127 
128 int hinic_port_add_mac(struct hinic_dev *nic_dev, const u8 *addr,
129 		       u16 vlan_id);
130 
131 int hinic_port_del_mac(struct hinic_dev *nic_dev, const u8 *addr,
132 		       u16 vlan_id);
133 
134 int hinic_port_get_mac(struct hinic_dev *nic_dev, u8 *addr);
135 
136 int hinic_port_set_mtu(struct hinic_dev *nic_dev, int new_mtu);
137 
138 int hinic_port_add_vlan(struct hinic_dev *nic_dev, u16 vlan_id);
139 
140 int hinic_port_del_vlan(struct hinic_dev *nic_dev, u16 vlan_id);
141 
142 int hinic_port_set_rx_mode(struct hinic_dev *nic_dev, u32 rx_mode);
143 
144 int hinic_port_link_state(struct hinic_dev *nic_dev,
145 			  enum hinic_port_link_state *link_state);
146 
147 int hinic_port_set_state(struct hinic_dev *nic_dev,
148 			 enum hinic_port_state state);
149 
150 int hinic_port_set_func_state(struct hinic_dev *nic_dev,
151 			      enum hinic_func_port_state state);
152 
153 #endif
154