~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/s390/net/qeth_core_mpc.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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_FFFF,                   "Unknown Error"}
 
211
};
 
212
 
 
213
 
 
214
 
 
215
char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)
 
216
{
 
217
        int x = 0;
 
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)
 
221
                x++;
 
222
        return qeth_ipa_rc_msg[x].msg;
 
223
}
 
224
 
 
225
 
 
226
struct ipa_cmd_names {
 
227
        enum qeth_ipa_cmds cmd;
 
228
        char *name;
 
229
};
 
230
 
 
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"},
 
257
};
 
258
 
 
259
char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd)
 
260
{
 
261
        int x = 0;
 
262
        qeth_ipa_cmd_names[
 
263
                sizeof(qeth_ipa_cmd_names) /
 
264
                        sizeof(struct ipa_cmd_names)-1].cmd = cmd;
 
265
        while (qeth_ipa_cmd_names[x].cmd != cmd)
 
266
                x++;
 
267
        return qeth_ipa_cmd_names[x].name;
 
268
}