2
* drivers/s390/net/qeth_core_mpc.c
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>
10
#include <linux/module.h>
12
#include "qeth_core_mpc.h"
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,
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,
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,
45
0x0c, 0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff,
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,
64
0x05, 0x05, 0x00, 0x00, 0x00, 0x00,
66
0x04, 0x06, 0xc8, 0x00
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,
84
0x14, 0x04, 0x0a, 0x00, 0x20, 0x00, 0x00, 0xff,
85
0xff, 0x00, 0x08, 0xc8, 0xe8, 0xc4, 0xf1, 0xc7,
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,
104
0x05, 0x05, 0x30, 0x01, 0x00, 0x00,
106
0x04, 0x06, 0x40, 0x00,
107
0x00, 0x08, 0x04, 0x0b,
108
0x00, 0x00, 0x00, 0x00
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
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,
138
sizeof(struct qeth_ipa_cmd) / 256,
139
sizeof(struct qeth_ipa_cmd) % 256,
141
0x77, 0x77, 0x77, 0x77,
142
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144
sizeof(struct qeth_ipa_cmd) / 256,
145
sizeof(struct qeth_ipa_cmd) % 256,
146
0x00, 0x00, 0x00, 0x40,
148
EXPORT_SYMBOL_GPL(IPA_PDU_HEADER);
150
unsigned char WRITE_CCW[] = {
151
0x01, CCW_FLAG_SLI, 0, 0,
155
unsigned char READ_CCW[] = {
156
0x02, CCW_FLAG_SLI, 0, 0,
162
enum qeth_ipa_return_codes rc;
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_FFFF, "Unknown Error"}
215
char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)
218
qeth_ipa_rc_msg[sizeof(qeth_ipa_rc_msg) /
219
sizeof(struct ipa_rc_msg) - 1].rc = rc;
220
while (qeth_ipa_rc_msg[x].rc != rc)
222
return qeth_ipa_rc_msg[x].msg;
226
struct ipa_cmd_names {
227
enum qeth_ipa_cmds cmd;
231
static struct ipa_cmd_names qeth_ipa_cmd_names[] = {
232
{IPA_CMD_STARTLAN, "startlan"},
233
{IPA_CMD_STOPLAN, "stoplan"},
234
{IPA_CMD_SETVMAC, "setvmac"},
235
{IPA_CMD_DELVMAC, "delvmac"},
236
{IPA_CMD_SETGMAC, "setgmac"},
237
{IPA_CMD_DELGMAC, "delgmac"},
238
{IPA_CMD_SETVLAN, "setvlan"},
239
{IPA_CMD_DELVLAN, "delvlan"},
240
{IPA_CMD_SETCCID, "setccid"},
241
{IPA_CMD_DELCCID, "delccid"},
242
{IPA_CMD_MODCCID, "modccid"},
243
{IPA_CMD_SETIP, "setip"},
244
{IPA_CMD_QIPASSIST, "qipassist"},
245
{IPA_CMD_SETASSPARMS, "setassparms"},
246
{IPA_CMD_SETIPM, "setipm"},
247
{IPA_CMD_DELIPM, "delipm"},
248
{IPA_CMD_SETRTG, "setrtg"},
249
{IPA_CMD_DELIP, "delip"},
250
{IPA_CMD_SETADAPTERPARMS, "setadapterparms"},
251
{IPA_CMD_SET_DIAG_ASS, "set_diag_ass"},
252
{IPA_CMD_CREATE_ADDR, "create_addr"},
253
{IPA_CMD_DESTROY_ADDR, "destroy_addr"},
254
{IPA_CMD_REGISTER_LOCAL_ADDR, "register_local_addr"},
255
{IPA_CMD_UNREGISTER_LOCAL_ADDR, "unregister_local_addr"},
256
{IPA_CMD_UNKNOWN, "unknown"},
259
char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd)
263
sizeof(qeth_ipa_cmd_names) /
264
sizeof(struct ipa_cmd_names)-1].cmd = cmd;
265
while (qeth_ipa_cmd_names[x].cmd != cmd)
267
return qeth_ipa_cmd_names[x].name;