1 /*
2  *  drivers/s390/net/qeth_core_mpc.c
3  *
4  *    Copyright IBM Corp. 2007
5  *    Author(s): Frank Pavlic <fpavlic@de.ibm.com>,
6  *		 Thomas Spatzier <tspat@de.ibm.com>,
7  *		 Frank Blaschka <frank.blaschka@de.ibm.com>
8  */
9 
10 #include <linux/module.h>
11 #include <asm/cio.h>
12 #include "qeth_core_mpc.h"
13 
14 unsigned char IDX_ACTIVATE_READ[] = {
15 	0x00, 0x00, 0x80, 0x00,  0x00, 0x00, 0x00, 0x00,
16 	0x19, 0x01, 0x01, 0x80,  0x00, 0x00, 0x00, 0x00,
17 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0xc8, 0xc1,
18 	0xd3, 0xd3, 0xd6, 0xd3,  0xc5, 0x40, 0x00, 0x00,
19 	0x00, 0x00
20 };
21 
22 unsigned char IDX_ACTIVATE_WRITE[] = {
23 	0x00, 0x00, 0x80, 0x00,  0x00, 0x00, 0x00, 0x00,
24 	0x15, 0x01, 0x01, 0x80,  0x00, 0x00, 0x00, 0x00,
25 	0xff, 0xff, 0x00, 0x00,  0x00, 0x00, 0xc8, 0xc1,
26 	0xd3, 0xd3, 0xd6, 0xd3,  0xc5, 0x40, 0x00, 0x00,
27 	0x00, 0x00
28 };
29 
30 unsigned char CM_ENABLE[] = {
31 	0x00, 0xe0, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01,
32 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00, 0x00, 0x63,
33 	0x10, 0x00, 0x00, 0x01,
34 	0x00, 0x00, 0x00, 0x00,
35 	0x81, 0x7e, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00,
36 	0x00, 0x00, 0x00, 0x00,  0x00, 0x24, 0x00, 0x23,
37 	0x00, 0x00, 0x23, 0x05,  0x00, 0x00, 0x00, 0x00,
38 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
39 	0x01, 0x00, 0x00, 0x23,  0x00, 0x00, 0x00, 0x40,
40 	0x00, 0x0c, 0x41, 0x02,  0x00, 0x17, 0x00, 0x00,
41 	0x00, 0x00, 0x00, 0x00,
42 	0x00, 0x0b, 0x04, 0x01,
43 	0x7e, 0x04, 0x05, 0x00,  0x01, 0x01, 0x0f,
44 	0x00,
45 	0x0c, 0x04, 0x02, 0xff,  0xff, 0xff, 0xff, 0xff,
46 	0xff, 0xff, 0xff
47 };
48 
49 unsigned char CM_SETUP[] = {
50 	0x00, 0xe0, 0x00, 0x00,  0x00, 0x00, 0x00, 0x02,
51 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00, 0x00, 0x64,
52 	0x10, 0x00, 0x00, 0x01,
53 	0x00, 0x00, 0x00, 0x00,
54 	0x81, 0x7e, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00,
55 	0x00, 0x00, 0x00, 0x00,  0x00, 0x24, 0x00, 0x24,
56 	0x00, 0x00, 0x24, 0x05,  0x00, 0x00, 0x00, 0x00,
57 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
58 	0x01, 0x00, 0x00, 0x24,  0x00, 0x00, 0x00, 0x40,
59 	0x00, 0x0c, 0x41, 0x04,  0x00, 0x18, 0x00, 0x00,
60 	0x00, 0x00, 0x00, 0x00,
61 	0x00, 0x09, 0x04, 0x04,
62 	0x05, 0x00, 0x01, 0x01,  0x11,
63 	0x00, 0x09, 0x04,
64 	0x05, 0x05, 0x00, 0x00,  0x00, 0x00,
65 	0x00, 0x06,
66 	0x04, 0x06, 0xc8, 0x00
67 };
68 
69 unsigned char ULP_ENABLE[] = {
70 	0x00, 0xe0, 0x00, 0x00,  0x00, 0x00, 0x00, 0x03,
71 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00, 0x00, 0x6b,
72 	0x10, 0x00, 0x00, 0x01,
73 	0x00, 0x00, 0x00, 0x00,
74 	0x41, 0x7e, 0x00, 0x01,  0x00, 0x00, 0x00, 0x01,
75 	0x00, 0x00, 0x00, 0x00,  0x00, 0x24, 0x00, 0x2b,
76 	0x00, 0x00, 0x2b, 0x05,  0x20, 0x01, 0x00, 0x00,
77 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78 	0x01, 0x00, 0x00, 0x2b,  0x00, 0x00, 0x00, 0x40,
79 	0x00, 0x0c, 0x41, 0x02,  0x00, 0x1f, 0x00, 0x00,
80 	0x00, 0x00, 0x00, 0x00,
81 	0x00, 0x0b, 0x04, 0x01,
82 	0x03, 0x04, 0x05, 0x00,  0x01, 0x01, 0x12,
83 	0x00,
84 	0x14, 0x04, 0x0a, 0x00,  0x20, 0x00, 0x00, 0xff,
85 	0xff, 0x00, 0x08, 0xc8,  0xe8, 0xc4, 0xf1, 0xc7,
86 	0xf1, 0x00, 0x00
87 };
88 
89 unsigned char ULP_SETUP[] = {
90 	0x00, 0xe0, 0x00, 0x00,  0x00, 0x00, 0x00, 0x04,
91 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00, 0x00, 0x6c,
92 	0x10, 0x00, 0x00, 0x01,
93 	0x00, 0x00, 0x00, 0x00,
94 	0x41, 0x7e, 0x00, 0x01,  0x00, 0x00, 0x00, 0x02,
95 	0x00, 0x00, 0x00, 0x01,  0x00, 0x24, 0x00, 0x2c,
96 	0x00, 0x00, 0x2c, 0x05,  0x20, 0x01, 0x00, 0x00,
97 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98 	0x01, 0x00, 0x00, 0x2c,  0x00, 0x00, 0x00, 0x40,
99 	0x00, 0x0c, 0x41, 0x04,  0x00, 0x20, 0x00, 0x00,
100 	0x00, 0x00, 0x00, 0x00,
101 	0x00, 0x09, 0x04, 0x04,
102 	0x05, 0x00, 0x01, 0x01,  0x14,
103 	0x00, 0x09, 0x04,
104 	0x05, 0x05, 0x30, 0x01,  0x00, 0x00,
105 	0x00, 0x06,
106 	0x04, 0x06, 0x40, 0x00,
107 	0x00, 0x08, 0x04, 0x0b,
108 	0x00, 0x00, 0x00, 0x00
109 };
110 
111 unsigned char DM_ACT[] = {
112 	0x00, 0xe0, 0x00, 0x00,  0x00, 0x00, 0x00, 0x05,
113 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00, 0x00, 0x55,
114 	0x10, 0x00, 0x00, 0x01,
115 	0x00, 0x00, 0x00, 0x00,
116 	0x41, 0x7e, 0x00, 0x01,  0x00, 0x00, 0x00, 0x03,
117 	0x00, 0x00, 0x00, 0x02,  0x00, 0x24, 0x00, 0x15,
118 	0x00, 0x00, 0x2c, 0x05,  0x20, 0x01, 0x00, 0x00,
119 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120 	0x01, 0x00, 0x00, 0x15,  0x00, 0x00, 0x00, 0x40,
121 	0x00, 0x0c, 0x43, 0x60,  0x00, 0x09, 0x00, 0x00,
122 	0x00, 0x00, 0x00, 0x00,
123 	0x00, 0x09, 0x04, 0x04,
124 	0x05, 0x40, 0x01, 0x01,  0x00
125 };
126 
127 unsigned char IPA_PDU_HEADER[] = {
128 	0x00, 0xe0, 0x00, 0x00,  0x77, 0x77, 0x77, 0x77,
129 	0x00, 0x00, 0x00, 0x14,  0x00, 0x00,
130 		(IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_cmd)) / 256,
131 		(IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_cmd)) % 256,
132 	0x10, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00,
133 	0xc1, 0x03, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00,
134 	0x00, 0x00, 0x00, 0x00,  0x00, 0x24,
135 		sizeof(struct qeth_ipa_cmd) / 256,
136 		sizeof(struct qeth_ipa_cmd) % 256,
137 	0x00,
138 		sizeof(struct qeth_ipa_cmd) / 256,
139 		sizeof(struct qeth_ipa_cmd) % 256,
140 	0x05,
141 	0x77, 0x77, 0x77, 0x77,
142 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143 	0x01, 0x00,
144 		sizeof(struct qeth_ipa_cmd) / 256,
145 		sizeof(struct qeth_ipa_cmd) % 256,
146 	0x00, 0x00, 0x00, 0x40,
147 };
148 EXPORT_SYMBOL_GPL(IPA_PDU_HEADER);
149 
150 unsigned char WRITE_CCW[] = {
151 	0x01, CCW_FLAG_SLI, 0, 0,
152 	0, 0, 0, 0
153 };
154 
155 unsigned char READ_CCW[] = {
156 	0x02, CCW_FLAG_SLI, 0, 0,
157 	0, 0, 0, 0
158 };
159 
160 
161 struct ipa_rc_msg {
162 	enum qeth_ipa_return_codes rc;
163 	char *msg;
164 };
165 
166 static struct ipa_rc_msg qeth_ipa_rc_msg[] = {
167 	{IPA_RC_SUCCESS,		"success"},
168 	{IPA_RC_NOTSUPP,		"Command not supported"},
169 	{IPA_RC_IP_TABLE_FULL,		"Add Addr IP Table Full - ipv6"},
170 	{IPA_RC_UNKNOWN_ERROR,		"IPA command failed - reason unknown"},
171 	{IPA_RC_UNSUPPORTED_COMMAND,	"Command not supported"},
172 	{IPA_RC_DUP_IPV6_REMOTE, "ipv6 address already registered remote"},
173 	{IPA_RC_DUP_IPV6_HOME,		"ipv6 address already registered"},
174 	{IPA_RC_UNREGISTERED_ADDR,	"Address not registered"},
175 	{IPA_RC_NO_ID_AVAILABLE,	"No identifiers available"},
176 	{IPA_RC_ID_NOT_FOUND,		"Identifier not found"},
177 	{IPA_RC_INVALID_IP_VERSION,	"IP version incorrect"},
178 	{IPA_RC_LAN_FRAME_MISMATCH,	"LAN and frame mismatch"},
179 	{IPA_RC_L2_UNSUPPORTED_CMD,	"Unsupported layer 2 command"},
180 	{IPA_RC_L2_DUP_MAC,		"Duplicate MAC address"},
181 	{IPA_RC_L2_ADDR_TABLE_FULL,	"Layer2 address table full"},
182 	{IPA_RC_L2_DUP_LAYER3_MAC,	"Duplicate with layer 3 MAC"},
183 	{IPA_RC_L2_GMAC_NOT_FOUND,	"GMAC not found"},
184 	{IPA_RC_L2_MAC_NOT_AUTH_BY_HYP,	"L2 mac not authorized by hypervisor"},
185 	{IPA_RC_L2_MAC_NOT_AUTH_BY_ADP,	"L2 mac not authorized by adapter"},
186 	{IPA_RC_L2_MAC_NOT_FOUND,	"L2 mac address not found"},
187 	{IPA_RC_L2_INVALID_VLAN_ID,	"L2 invalid vlan id"},
188 	{IPA_RC_L2_DUP_VLAN_ID,		"L2 duplicate vlan id"},
189 	{IPA_RC_L2_VLAN_ID_NOT_FOUND,	"L2 vlan id not found"},
190 	{IPA_RC_DATA_MISMATCH,		"Data field mismatch (v4/v6 mixed)"},
191 	{IPA_RC_INVALID_MTU_SIZE,	"Invalid MTU size"},
192 	{IPA_RC_INVALID_LANTYPE,	"Invalid LAN type"},
193 	{IPA_RC_INVALID_LANNUM,		"Invalid LAN num"},
194 	{IPA_RC_DUPLICATE_IP_ADDRESS,	"Address already registered"},
195 	{IPA_RC_IP_ADDR_TABLE_FULL,	"IP address table full"},
196 	{IPA_RC_LAN_PORT_STATE_ERROR,	"LAN port state error"},
197 	{IPA_RC_SETIP_NO_STARTLAN,	"Setip no startlan received"},
198 	{IPA_RC_SETIP_ALREADY_RECEIVED,	"Setip already received"},
199 	{IPA_RC_IP_ADDR_ALREADY_USED,	"IP address already in use on LAN"},
200 	{IPA_RC_MC_ADDR_NOT_FOUND,	"Multicast address not found"},
201 	{IPA_RC_SETIP_INVALID_VERSION,	"SETIP invalid IP version"},
202 	{IPA_RC_UNSUPPORTED_SUBCMD,	"Unsupported assist subcommand"},
203 	{IPA_RC_ARP_ASSIST_NO_ENABLE,	"Only partial success, no enable"},
204 	{IPA_RC_PRIMARY_ALREADY_DEFINED, "Primary already defined"},
205 	{IPA_RC_SECOND_ALREADY_DEFINED,	"Secondary already defined"},
206 	{IPA_RC_INVALID_SETRTG_INDICATOR, "Invalid SETRTG indicator"},
207 	{IPA_RC_MC_ADDR_ALREADY_DEFINED, "Multicast address already defined"},
208 	{IPA_RC_LAN_OFFLINE,		"STRTLAN_LAN_DISABLED - LAN offline"},
209 	{IPA_RC_INVALID_IP_VERSION2,	"Invalid IP version"},
210 	{IPA_RC_ENOMEM,			"Memory problem"},
211 	{IPA_RC_FFFF,			"Unknown Error"}
212 };
213 
214 
215 
qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)216 char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)
217 {
218 	int x = 0;
219 	qeth_ipa_rc_msg[sizeof(qeth_ipa_rc_msg) /
220 			sizeof(struct ipa_rc_msg) - 1].rc = rc;
221 	while (qeth_ipa_rc_msg[x].rc != rc)
222 		x++;
223 	return qeth_ipa_rc_msg[x].msg;
224 }
225 
226 
227 struct ipa_cmd_names {
228 	enum qeth_ipa_cmds cmd;
229 	char *name;
230 };
231 
232 static struct ipa_cmd_names qeth_ipa_cmd_names[] = {
233 	{IPA_CMD_STARTLAN,	"startlan"},
234 	{IPA_CMD_STOPLAN,	"stoplan"},
235 	{IPA_CMD_SETVMAC,	"setvmac"},
236 	{IPA_CMD_DELVMAC,	"delvmac"},
237 	{IPA_CMD_SETGMAC,	"setgmac"},
238 	{IPA_CMD_DELGMAC,	"delgmac"},
239 	{IPA_CMD_SETVLAN,	"setvlan"},
240 	{IPA_CMD_DELVLAN,	"delvlan"},
241 	{IPA_CMD_SETCCID,	"setccid"},
242 	{IPA_CMD_DELCCID,	"delccid"},
243 	{IPA_CMD_MODCCID,	"modccid"},
244 	{IPA_CMD_SETIP,		"setip"},
245 	{IPA_CMD_QIPASSIST,	"qipassist"},
246 	{IPA_CMD_SETASSPARMS,	"setassparms"},
247 	{IPA_CMD_SETIPM,	"setipm"},
248 	{IPA_CMD_DELIPM,	"delipm"},
249 	{IPA_CMD_SETRTG,	"setrtg"},
250 	{IPA_CMD_DELIP,		"delip"},
251 	{IPA_CMD_SETADAPTERPARMS, "setadapterparms"},
252 	{IPA_CMD_SET_DIAG_ASS,	"set_diag_ass"},
253 	{IPA_CMD_CREATE_ADDR,	"create_addr"},
254 	{IPA_CMD_DESTROY_ADDR,	"destroy_addr"},
255 	{IPA_CMD_REGISTER_LOCAL_ADDR,	"register_local_addr"},
256 	{IPA_CMD_UNREGISTER_LOCAL_ADDR,	"unregister_local_addr"},
257 	{IPA_CMD_UNKNOWN,	"unknown"},
258 };
259 
qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd)260 char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd)
261 {
262 	int x = 0;
263 	qeth_ipa_cmd_names[
264 		sizeof(qeth_ipa_cmd_names) /
265 			sizeof(struct ipa_cmd_names)-1].cmd = cmd;
266 	while (qeth_ipa_cmd_names[x].cmd != cmd)
267 		x++;
268 	return qeth_ipa_cmd_names[x].name;
269 }
270