]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/s390/net/qeth_l2_main.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[mirror_ubuntu-artful-kernel.git] / drivers / s390 / net / qeth_l2_main.c
CommitLineData
4a71df50 1/*
bbcfcdc8 2 * Copyright IBM Corp. 2007, 2009
4a71df50
FB
3 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
4 * Frank Pavlic <fpavlic@de.ibm.com>,
5 * Thomas Spatzier <tspat@de.ibm.com>,
6 * Frank Blaschka <frank.blaschka@de.ibm.com>
7 */
8
74eacdb9
FB
9#define KMSG_COMPONENT "qeth"
10#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
4a71df50
FB
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/string.h>
15#include <linux/errno.h>
16#include <linux/kernel.h>
5a0e3ad6 17#include <linux/slab.h>
4a71df50
FB
18#include <linux/etherdevice.h>
19#include <linux/mii.h>
20#include <linux/ip.h>
ccffad25 21#include <linux/list.h>
4a71df50 22
4a71df50 23#include "qeth_core.h"
b4d72c08 24#include "qeth_l2.h"
4a71df50 25
4a71df50
FB
26static int qeth_l2_set_offline(struct ccwgroup_device *);
27static int qeth_l2_stop(struct net_device *);
28static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
29static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
efbbc1d5 30 enum qeth_ipa_cmds);
4a71df50
FB
31static void qeth_l2_set_multicast_list(struct net_device *);
32static int qeth_l2_recover(void *);
c044dc21
EC
33static void qeth_bridgeport_query_support(struct qeth_card *card);
34static void qeth_bridge_state_change(struct qeth_card *card,
35 struct qeth_ipa_cmd *cmd);
36static void qeth_bridge_host_event(struct qeth_card *card,
37 struct qeth_ipa_cmd *cmd);
4a71df50
FB
38
39static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
40{
509e2562 41 struct qeth_card *card = dev->ml_priv;
4a71df50
FB
42 struct mii_ioctl_data *mii_data;
43 int rc = 0;
44
45 if (!card)
46 return -ENODEV;
47
c3521254 48 if (!qeth_card_hw_is_reachable(card))
4a71df50
FB
49 return -ENODEV;
50
51 if (card->info.type == QETH_CARD_TYPE_OSN)
52 return -EPERM;
53
54 switch (cmd) {
55 case SIOC_QETH_ADP_SET_SNMP_CONTROL:
56 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
57 break;
58 case SIOC_QETH_GET_CARD_TYPE:
5113fec0
UB
59 if ((card->info.type == QETH_CARD_TYPE_OSD ||
60 card->info.type == QETH_CARD_TYPE_OSM ||
61 card->info.type == QETH_CARD_TYPE_OSX) &&
4a71df50
FB
62 !card->info.guestlan)
63 return 1;
64 return 0;
65 break;
66 case SIOCGMIIPHY:
67 mii_data = if_mii(rq);
68 mii_data->phy_id = 0;
69 break;
70 case SIOCGMIIREG:
71 mii_data = if_mii(rq);
72 if (mii_data->phy_id != 0)
73 rc = -EINVAL;
74 else
75 mii_data->val_out = qeth_mdio_read(dev,
76 mii_data->phy_id, mii_data->reg_num);
77 break;
c3ab96f3
FB
78 case SIOC_QETH_QUERY_OAT:
79 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
80 break;
4a71df50
FB
81 default:
82 rc = -EOPNOTSUPP;
83 }
84 if (rc)
847a50fd 85 QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
4a71df50
FB
86 return rc;
87}
88
89static int qeth_l2_verify_dev(struct net_device *dev)
90{
91 struct qeth_card *card;
92 unsigned long flags;
93 int rc = 0;
94
95 read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
96 list_for_each_entry(card, &qeth_core_card_list.list, list) {
97 if (card->dev == dev) {
98 rc = QETH_REAL_CARD;
99 break;
100 }
101 }
102 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
103
104 return rc;
105}
106
107static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
108{
109 struct qeth_card *card;
110 struct net_device *ndev;
f06f6f32 111 __u16 temp_dev_no;
4a71df50 112 unsigned long flags;
f06f6f32 113 struct ccw_dev_id read_devid;
4a71df50
FB
114
115 ndev = NULL;
116 memcpy(&temp_dev_no, read_dev_no, 2);
117 read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
118 list_for_each_entry(card, &qeth_core_card_list.list, list) {
f06f6f32
CH
119 ccw_device_get_id(CARD_RDEV(card), &read_devid);
120 if (read_devid.devno == temp_dev_no) {
4a71df50
FB
121 ndev = card->dev;
122 break;
123 }
124 }
125 read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
126 return ndev;
127}
128
efbbc1d5 129static int qeth_setdel_makerc(struct qeth_card *card, int retcode)
4a71df50 130{
efbbc1d5 131 int rc;
4a71df50 132
efbbc1d5 133 if (retcode)
1aec42bc 134 QETH_CARD_TEXT_(card, 2, "err%04x", retcode);
efbbc1d5
EC
135 switch (retcode) {
136 case IPA_RC_SUCCESS:
137 rc = 0;
138 break;
139 case IPA_RC_L2_UNSUPPORTED_CMD:
ffb95251 140 rc = -EOPNOTSUPP;
efbbc1d5
EC
141 break;
142 case IPA_RC_L2_ADDR_TABLE_FULL:
143 rc = -ENOSPC;
144 break;
145 case IPA_RC_L2_DUP_MAC:
146 case IPA_RC_L2_DUP_LAYER3_MAC:
147 rc = -EEXIST;
148 break;
149 case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
150 case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
151 rc = -EPERM;
152 break;
153 case IPA_RC_L2_MAC_NOT_FOUND:
154 rc = -ENOENT;
155 break;
1aec42bc
TR
156 case -ENOMEM:
157 rc = -ENOMEM;
158 break;
efbbc1d5
EC
159 default:
160 rc = -EIO;
161 break;
4a71df50 162 }
efbbc1d5 163 return rc;
4a71df50
FB
164}
165
166static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
167{
efbbc1d5 168 int rc;
4a71df50 169
efbbc1d5
EC
170 QETH_CARD_TEXT(card, 2, "L2Sgmac");
171 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
172 IPA_CMD_SETGMAC));
173 if (rc == -EEXIST)
174 QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n",
175 mac, QETH_CARD_IFNAME(card));
176 else if (rc)
177 QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n",
178 mac, QETH_CARD_IFNAME(card), rc);
179 return rc;
4a71df50
FB
180}
181
182static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
183{
efbbc1d5
EC
184 int rc;
185
847a50fd 186 QETH_CARD_TEXT(card, 2, "L2Dgmac");
efbbc1d5
EC
187 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
188 IPA_CMD_DELGMAC));
189 if (rc)
190 QETH_DBF_MESSAGE(2,
191 "Could not delete group MAC %pM on %s: %d\n",
192 mac, QETH_CARD_IFNAME(card), rc);
193 return rc;
4a71df50
FB
194}
195
7db2266a 196static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
4a71df50
FB
197{
198 struct qeth_mc_mac *mc;
7db2266a 199 int rc;
4a71df50
FB
200
201 mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
202
14cc21b6 203 if (!mc)
4a71df50 204 return;
4a71df50
FB
205
206 memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
207 mc->mc_addrlen = OSA_ADDR_LEN;
7db2266a
FB
208 mc->is_vmac = vmac;
209
210 if (vmac) {
efbbc1d5
EC
211 rc = qeth_setdel_makerc(card,
212 qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC));
7db2266a 213 } else {
efbbc1d5
EC
214 rc = qeth_setdel_makerc(card,
215 qeth_l2_send_setgroupmac(card, mac));
7db2266a 216 }
4a71df50 217
7db2266a 218 if (!rc)
4a71df50
FB
219 list_add_tail(&mc->list, &card->mc_list);
220 else
221 kfree(mc);
222}
223
70919e23 224static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
4a71df50
FB
225{
226 struct qeth_mc_mac *mc, *tmp;
227
228 spin_lock_bh(&card->mclock);
229 list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
70919e23
UB
230 if (del) {
231 if (mc->is_vmac)
232 qeth_l2_send_setdelmac(card, mc->mc_addr,
efbbc1d5 233 IPA_CMD_DELVMAC);
70919e23
UB
234 else
235 qeth_l2_send_delgroupmac(card, mc->mc_addr);
236 }
4a71df50
FB
237 list_del(&mc->list);
238 kfree(mc);
239 }
240 spin_unlock_bh(&card->mclock);
241}
242
ce73e10e
KDW
243static inline int qeth_l2_get_cast_type(struct qeth_card *card,
244 struct sk_buff *skb)
4a71df50 245{
ce73e10e
KDW
246 if (card->info.type == QETH_CARD_TYPE_OSN)
247 return RTN_UNSPEC;
248 if (is_broadcast_ether_addr(skb->data))
249 return RTN_BROADCAST;
250 if (is_multicast_ether_addr(skb->data))
251 return RTN_MULTICAST;
252 return RTN_UNSPEC;
4a71df50
FB
253}
254
255static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
43934077 256 struct sk_buff *skb, int cast_type)
4a71df50 257{
683d718a 258 struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb);
4a71df50
FB
259
260 memset(hdr, 0, sizeof(struct qeth_hdr));
261 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
262
263 /* set byte byte 3 to casting flags */
264 if (cast_type == RTN_MULTICAST)
265 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
266 else if (cast_type == RTN_BROADCAST)
267 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
268 else
ce73e10e 269 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
4a71df50
FB
270
271 hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
272 /* VSWITCH relies on the VLAN
273 * information to be present in
274 * the QDIO header */
275 if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
276 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
277 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
278 }
279}
280
281static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
282 struct qeth_reply *reply, unsigned long data)
283{
284 struct qeth_ipa_cmd *cmd;
285
847a50fd 286 QETH_CARD_TEXT(card, 2, "L2sdvcb");
4a71df50
FB
287 cmd = (struct qeth_ipa_cmd *) data;
288 if (cmd->hdr.return_code) {
14cc21b6 289 QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
4a71df50
FB
290 "Continuing\n", cmd->data.setdelvlan.vlan_id,
291 QETH_CARD_IFNAME(card), cmd->hdr.return_code);
847a50fd
CO
292 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
293 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
4a71df50
FB
294 }
295 return 0;
296}
297
298static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
299 enum qeth_ipa_cmds ipacmd)
300{
301 struct qeth_ipa_cmd *cmd;
302 struct qeth_cmd_buffer *iob;
303
847a50fd 304 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
4a71df50 305 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
1aec42bc
TR
306 if (!iob)
307 return -ENOMEM;
4a71df50
FB
308 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
309 cmd->data.setdelvlan.vlan_id = i;
310 return qeth_send_ipa_cmd(card, iob,
311 qeth_l2_send_setdelvlan_cb, NULL);
312}
313
70919e23 314static void qeth_l2_process_vlans(struct qeth_card *card)
4a71df50
FB
315{
316 struct qeth_vlan_vid *id;
847a50fd 317 QETH_CARD_TEXT(card, 3, "L2prcvln");
4a71df50
FB
318 spin_lock_bh(&card->vlanlock);
319 list_for_each_entry(id, &card->vid_list, list) {
70919e23 320 qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
4a71df50
FB
321 }
322 spin_unlock_bh(&card->vlanlock);
323}
324
80d5c368
PM
325static int qeth_l2_vlan_rx_add_vid(struct net_device *dev,
326 __be16 proto, u16 vid)
4a71df50 327{
509e2562 328 struct qeth_card *card = dev->ml_priv;
4a71df50 329 struct qeth_vlan_vid *id;
1aec42bc 330 int rc;
4a71df50 331
847a50fd 332 QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
10651db7 333 if (!vid)
8e586137 334 return 0;
5113fec0 335 if (card->info.type == QETH_CARD_TYPE_OSM) {
847a50fd 336 QETH_CARD_TEXT(card, 3, "aidOSM");
8e586137 337 return 0;
5113fec0 338 }
8e98ac48 339 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
847a50fd 340 QETH_CARD_TEXT(card, 3, "aidREC");
8e586137 341 return 0;
8e98ac48 342 }
4a71df50
FB
343 id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
344 if (id) {
345 id->vid = vid;
1aec42bc
TR
346 rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
347 if (rc) {
348 kfree(id);
349 return rc;
350 }
4a71df50
FB
351 spin_lock_bh(&card->vlanlock);
352 list_add_tail(&id->list, &card->vid_list);
353 spin_unlock_bh(&card->vlanlock);
8e586137
JP
354 } else {
355 return -ENOMEM;
4a71df50 356 }
8e586137 357 return 0;
4a71df50
FB
358}
359
80d5c368
PM
360static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
361 __be16 proto, u16 vid)
4a71df50
FB
362{
363 struct qeth_vlan_vid *id, *tmpid = NULL;
509e2562 364 struct qeth_card *card = dev->ml_priv;
1aec42bc 365 int rc = 0;
4a71df50 366
847a50fd 367 QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
5113fec0 368 if (card->info.type == QETH_CARD_TYPE_OSM) {
847a50fd 369 QETH_CARD_TEXT(card, 3, "kidOSM");
8e586137 370 return 0;
5113fec0 371 }
8e98ac48 372 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
847a50fd 373 QETH_CARD_TEXT(card, 3, "kidREC");
8e586137 374 return 0;
8e98ac48 375 }
4a71df50
FB
376 spin_lock_bh(&card->vlanlock);
377 list_for_each_entry(id, &card->vid_list, list) {
378 if (id->vid == vid) {
379 list_del(&id->list);
380 tmpid = id;
381 break;
382 }
383 }
384 spin_unlock_bh(&card->vlanlock);
385 if (tmpid) {
1aec42bc 386 rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
4a71df50
FB
387 kfree(tmpid);
388 }
389 qeth_l2_set_multicast_list(card->dev);
1aec42bc 390 return rc;
4a71df50
FB
391}
392
b2f4de8b 393static void qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
4a71df50 394{
d11ba0c4
PT
395 QETH_DBF_TEXT(SETUP , 2, "stopcard");
396 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
4a71df50
FB
397
398 qeth_set_allowed_threads(card, 0, 1);
4a71df50
FB
399 if (card->read.state == CH_STATE_UP &&
400 card->write.state == CH_STATE_UP &&
401 (card->state == CARD_STATE_UP)) {
402 if (recovery_mode &&
403 card->info.type != QETH_CARD_TYPE_OSN) {
404 qeth_l2_stop(card->dev);
405 } else {
406 rtnl_lock();
407 dev_close(card->dev);
408 rtnl_unlock();
409 }
70919e23 410 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
4a71df50
FB
411 card->state = CARD_STATE_SOFTSETUP;
412 }
413 if (card->state == CARD_STATE_SOFTSETUP) {
70919e23 414 qeth_l2_del_all_mc(card, 0);
4a71df50
FB
415 qeth_clear_ipacmd_list(card);
416 card->state = CARD_STATE_HARDSETUP;
417 }
418 if (card->state == CARD_STATE_HARDSETUP) {
419 qeth_qdio_clear_card(card, 0);
420 qeth_clear_qdio_buffers(card);
421 qeth_clear_working_pool_list(card);
422 card->state = CARD_STATE_DOWN;
423 }
424 if (card->state == CARD_STATE_DOWN) {
425 qeth_clear_cmd_buffers(&card->read);
426 qeth_clear_cmd_buffers(&card->write);
427 }
4a71df50
FB
428}
429
a1c3ed4c
FB
430static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
431 int budget, int *done)
4a71df50 432{
a1c3ed4c 433 int work_done = 0;
4a71df50
FB
434 struct sk_buff *skb;
435 struct qeth_hdr *hdr;
4a71df50
FB
436 unsigned int len;
437
a1c3ed4c 438 *done = 0;
18af5c17 439 WARN_ON_ONCE(!budget);
a1c3ed4c
FB
440 while (budget) {
441 skb = qeth_core_get_next_skb(card,
b3332930 442 &card->qdio.in_q->bufs[card->rx.b_index],
a1c3ed4c
FB
443 &card->rx.b_element, &card->rx.e_offset, &hdr);
444 if (!skb) {
445 *done = 1;
446 break;
4a71df50 447 }
a1c3ed4c 448 skb->dev = card->dev;
4a71df50
FB
449 switch (hdr->hdr.l2.id) {
450 case QETH_HEADER_TYPE_LAYER2:
451 skb->pkt_type = PACKET_HOST;
452 skb->protocol = eth_type_trans(skb, skb->dev);
c5e631a8 453 skb->ip_summed = CHECKSUM_NONE;
12883725
UB
454 if (skb->protocol == htons(ETH_P_802_2))
455 *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
4a71df50 456 len = skb->len;
a1c3ed4c 457 netif_receive_skb(skb);
4a71df50
FB
458 break;
459 case QETH_HEADER_TYPE_OSN:
2d488c2f
UB
460 if (card->info.type == QETH_CARD_TYPE_OSN) {
461 skb_push(skb, sizeof(struct qeth_hdr));
462 skb_copy_to_linear_data(skb, hdr,
4a71df50 463 sizeof(struct qeth_hdr));
2d488c2f
UB
464 len = skb->len;
465 card->osn_info.data_cb(skb);
466 break;
467 }
468 /* else unknown */
4a71df50
FB
469 default:
470 dev_kfree_skb_any(skb);
847a50fd 471 QETH_CARD_TEXT(card, 3, "inbunkno");
d11ba0c4 472 QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
4a71df50
FB
473 continue;
474 }
a1c3ed4c
FB
475 work_done++;
476 budget--;
4a71df50
FB
477 card->stats.rx_packets++;
478 card->stats.rx_bytes += len;
479 }
a1c3ed4c
FB
480 return work_done;
481}
482
483static int qeth_l2_poll(struct napi_struct *napi, int budget)
484{
485 struct qeth_card *card = container_of(napi, struct qeth_card, napi);
486 int work_done = 0;
487 struct qeth_qdio_buffer *buffer;
488 int done;
489 int new_budget = budget;
490
491 if (card->options.performance_stats) {
492 card->perf_stats.inbound_cnt++;
493 card->perf_stats.inbound_start_time = qeth_get_micros();
494 }
495
496 while (1) {
497 if (!card->rx.b_count) {
498 card->rx.qdio_err = 0;
499 card->rx.b_count = qdio_get_next_buffers(
500 card->data.ccwdev, 0, &card->rx.b_index,
501 &card->rx.qdio_err);
502 if (card->rx.b_count <= 0) {
503 card->rx.b_count = 0;
504 break;
505 }
506 card->rx.b_element =
507 &card->qdio.in_q->bufs[card->rx.b_index]
508 .buffer->element[0];
509 card->rx.e_offset = 0;
510 }
511
512 while (card->rx.b_count) {
513 buffer = &card->qdio.in_q->bufs[card->rx.b_index];
514 if (!(card->rx.qdio_err &&
515 qeth_check_qdio_errors(card, buffer->buffer,
516 card->rx.qdio_err, "qinerr")))
517 work_done += qeth_l2_process_inbound_buffer(
518 card, new_budget, &done);
519 else
520 done = 1;
521
522 if (done) {
523 if (card->options.performance_stats)
524 card->perf_stats.bufs_rec++;
525 qeth_put_buffer_pool_entry(card,
526 buffer->pool_entry);
527 qeth_queue_input_buffer(card, card->rx.b_index);
528 card->rx.b_count--;
529 if (card->rx.b_count) {
530 card->rx.b_index =
531 (card->rx.b_index + 1) %
532 QDIO_MAX_BUFFERS_PER_Q;
533 card->rx.b_element =
534 &card->qdio.in_q
535 ->bufs[card->rx.b_index]
536 .buffer->element[0];
537 card->rx.e_offset = 0;
538 }
539 }
540
541 if (work_done >= budget)
542 goto out;
543 else
544 new_budget = budget - work_done;
545 }
546 }
547
548 napi_complete(napi);
549 if (qdio_start_irq(card->data.ccwdev, 0))
550 napi_schedule(&card->napi);
551out:
552 if (card->options.performance_stats)
553 card->perf_stats.inbound_time += qeth_get_micros() -
554 card->perf_stats.inbound_start_time;
555 return work_done;
4a71df50
FB
556}
557
558static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
efbbc1d5 559 enum qeth_ipa_cmds ipacmd)
4a71df50
FB
560{
561 struct qeth_ipa_cmd *cmd;
562 struct qeth_cmd_buffer *iob;
563
847a50fd 564 QETH_CARD_TEXT(card, 2, "L2sdmac");
4a71df50 565 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
1aec42bc
TR
566 if (!iob)
567 return -ENOMEM;
4a71df50
FB
568 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
569 cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
570 memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
efbbc1d5 571 return qeth_send_ipa_cmd(card, iob, NULL, NULL);
4a71df50
FB
572}
573
efbbc1d5 574static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
4a71df50 575{
efbbc1d5 576 int rc;
4a71df50 577
efbbc1d5
EC
578 QETH_CARD_TEXT(card, 2, "L2Setmac");
579 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
580 IPA_CMD_SETVMAC));
581 if (rc == 0) {
582 card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
583 memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN);
584 dev_info(&card->gdev->dev,
585 "MAC address %pM successfully registered on device %s\n",
586 card->dev->dev_addr, card->dev->name);
587 } else {
4a71df50 588 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
efbbc1d5
EC
589 switch (rc) {
590 case -EEXIST:
0666eb06 591 dev_warn(&card->gdev->dev,
efbbc1d5 592 "MAC address %pM already exists\n", mac);
0666eb06 593 break;
efbbc1d5 594 case -EPERM:
0666eb06 595 dev_warn(&card->gdev->dev,
efbbc1d5 596 "MAC address %pM is not authorized\n", mac);
0666eb06
UB
597 break;
598 }
4a71df50 599 }
efbbc1d5 600 return rc;
4a71df50
FB
601}
602
603static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
604{
efbbc1d5
EC
605 int rc;
606
847a50fd 607 QETH_CARD_TEXT(card, 2, "L2Delmac");
4a71df50
FB
608 if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
609 return 0;
efbbc1d5
EC
610 rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
611 IPA_CMD_DELVMAC));
612 if (rc == 0)
613 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
614 return rc;
4a71df50
FB
615}
616
617static int qeth_l2_request_initial_mac(struct qeth_card *card)
618{
619 int rc = 0;
620 char vendor_pre[] = {0x02, 0x00, 0x00};
621
d11ba0c4
PT
622 QETH_DBF_TEXT(SETUP, 2, "doL2init");
623 QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
4a71df50 624
a134884a
SR
625 if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
626 rc = qeth_query_setadapterparms(card);
627 if (rc) {
628 QETH_DBF_MESSAGE(2, "could not query adapter "
629 "parameters on device %s: x%x\n",
630 CARD_BUS_ID(card), rc);
631 }
4a71df50
FB
632 }
633
5113fec0
UB
634 if (card->info.type == QETH_CARD_TYPE_IQD ||
635 card->info.type == QETH_CARD_TYPE_OSM ||
636 card->info.type == QETH_CARD_TYPE_OSX ||
637 card->info.guestlan) {
4a71df50
FB
638 rc = qeth_setadpparms_change_macaddr(card);
639 if (rc) {
14cc21b6
FB
640 QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
641 "device %s: x%x\n", CARD_BUS_ID(card), rc);
1aec42bc 642 QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc);
4a71df50
FB
643 return rc;
644 }
d11ba0c4 645 QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
4a71df50 646 } else {
1833611d 647 eth_random_addr(card->dev->dev_addr);
4a71df50
FB
648 memcpy(card->dev->dev_addr, vendor_pre, 3);
649 }
650 return 0;
651}
652
653static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
654{
655 struct sockaddr *addr = p;
509e2562 656 struct qeth_card *card = dev->ml_priv;
4a71df50
FB
657 int rc = 0;
658
847a50fd 659 QETH_CARD_TEXT(card, 3, "setmac");
4a71df50
FB
660
661 if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
847a50fd 662 QETH_CARD_TEXT(card, 3, "setmcINV");
4a71df50
FB
663 return -EOPNOTSUPP;
664 }
665
5113fec0
UB
666 if (card->info.type == QETH_CARD_TYPE_OSN ||
667 card->info.type == QETH_CARD_TYPE_OSM ||
668 card->info.type == QETH_CARD_TYPE_OSX) {
847a50fd 669 QETH_CARD_TEXT(card, 3, "setmcTYP");
4a71df50
FB
670 return -EOPNOTSUPP;
671 }
847a50fd 672 QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);
8e98ac48 673 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
847a50fd 674 QETH_CARD_TEXT(card, 3, "setmcREC");
8e98ac48
UB
675 return -ERESTARTSYS;
676 }
4a71df50 677 rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
efbbc1d5 678 if (!rc || (rc == -ENOENT))
4a71df50 679 rc = qeth_l2_send_setmac(card, addr->sa_data);
e0a8114c 680 return rc ? -EINVAL : 0;
4a71df50
FB
681}
682
0db587b0
EC
683static void qeth_promisc_to_bridge(struct qeth_card *card)
684{
685 struct net_device *dev = card->dev;
686 enum qeth_ipa_promisc_modes promisc_mode;
687 int role;
688 int rc;
689
690 QETH_CARD_TEXT(card, 3, "pmisc2br");
691
692 if (!card->options.sbp.reflect_promisc)
693 return;
694 promisc_mode = (dev->flags & IFF_PROMISC) ? SET_PROMISC_MODE_ON
695 : SET_PROMISC_MODE_OFF;
696 if (promisc_mode == card->info.promisc_mode)
697 return;
698
699 if (promisc_mode == SET_PROMISC_MODE_ON) {
700 if (card->options.sbp.reflect_promisc_primary)
701 role = QETH_SBP_ROLE_PRIMARY;
702 else
703 role = QETH_SBP_ROLE_SECONDARY;
704 } else
705 role = QETH_SBP_ROLE_NONE;
706
707 rc = qeth_bridgeport_setrole(card, role);
708 QETH_DBF_TEXT_(SETUP, 2, "bpm%c%04x",
709 (promisc_mode == SET_PROMISC_MODE_ON) ? '+' : '-', rc);
710 if (!rc) {
711 card->options.sbp.role = role;
712 card->info.promisc_mode = promisc_mode;
713 }
714}
715
4a71df50
FB
716static void qeth_l2_set_multicast_list(struct net_device *dev)
717{
509e2562 718 struct qeth_card *card = dev->ml_priv;
ccffad25 719 struct netdev_hw_addr *ha;
4a71df50
FB
720
721 if (card->info.type == QETH_CARD_TYPE_OSN)
722 return ;
723
847a50fd 724 QETH_CARD_TEXT(card, 3, "setmulti");
8e98ac48
UB
725 if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
726 (card->state != CARD_STATE_UP))
727 return;
70919e23 728 qeth_l2_del_all_mc(card, 1);
4a71df50 729 spin_lock_bh(&card->mclock);
22bedad3
JP
730 netdev_for_each_mc_addr(ha, dev)
731 qeth_l2_add_mc(card, ha->addr, 0);
7db2266a 732
32e7bfc4 733 netdev_for_each_uc_addr(ha, dev)
ccffad25 734 qeth_l2_add_mc(card, ha->addr, 1);
7db2266a 735
4a71df50 736 spin_unlock_bh(&card->mclock);
0db587b0
EC
737 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
738 qeth_setadp_promisc_mode(card);
739 else
740 qeth_promisc_to_bridge(card);
4a71df50
FB
741}
742
743static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
744{
745 int rc;
746 struct qeth_hdr *hdr = NULL;
747 int elements = 0;
509e2562 748 struct qeth_card *card = dev->ml_priv;
4a71df50 749 struct sk_buff *new_skb = skb;
ce73e10e 750 int cast_type = qeth_l2_get_cast_type(card, skb);
290b8348 751 struct qeth_qdio_out_q *queue;
4a71df50 752 int tx_bytes = skb->len;
683d718a
FB
753 int data_offset = -1;
754 int elements_needed = 0;
755 int hd_len = 0;
4a71df50 756
290b8348
SR
757 if (card->qdio.do_prio_queueing || (cast_type &&
758 card->info.is_multicast_different))
759 queue = card->qdio.out_qs[qeth_get_priority_queue(card, skb,
760 qeth_get_ip_version(skb), cast_type)];
761 else
762 queue = card->qdio.out_qs[card->qdio.default_out_queue];
763
4a71df50
FB
764 if ((card->state != CARD_STATE_UP) || !card->lan_online) {
765 card->stats.tx_carrier_errors++;
766 goto tx_drop;
767 }
768
769 if ((card->info.type == QETH_CARD_TYPE_OSN) &&
770 (skb->protocol == htons(ETH_P_IPV6)))
771 goto tx_drop;
772
773 if (card->options.performance_stats) {
774 card->perf_stats.outbound_cnt++;
775 card->perf_stats.outbound_start_time = qeth_get_micros();
776 }
777 netif_stop_queue(dev);
778
4a71df50
FB
779 if (card->info.type == QETH_CARD_TYPE_OSN)
780 hdr = (struct qeth_hdr *)skb->data;
781 else {
64ef8957 782 if (card->info.type == QETH_CARD_TYPE_IQD) {
683d718a
FB
783 new_skb = skb;
784 data_offset = ETH_HLEN;
785 hd_len = ETH_HLEN;
786 hdr = kmem_cache_alloc(qeth_core_header_cache,
787 GFP_ATOMIC);
788 if (!hdr)
789 goto tx_drop;
790 elements_needed++;
791 skb_reset_mac_header(new_skb);
43934077 792 qeth_l2_fill_header(card, hdr, new_skb, cast_type);
683d718a
FB
793 hdr->hdr.l2.pkt_length = new_skb->len;
794 memcpy(((char *)hdr) + sizeof(struct qeth_hdr),
795 skb_mac_header(new_skb), ETH_HLEN);
796 } else {
797 /* create a clone with writeable headroom */
798 new_skb = skb_realloc_headroom(skb,
799 sizeof(struct qeth_hdr));
800 if (!new_skb)
801 goto tx_drop;
802 hdr = (struct qeth_hdr *)skb_push(new_skb,
f90b744e 803 sizeof(struct qeth_hdr));
683d718a 804 skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
43934077 805 qeth_l2_fill_header(card, hdr, new_skb, cast_type);
683d718a 806 }
4a71df50
FB
807 }
808
065cc782 809 elements = qeth_get_elements_no(card, new_skb, elements_needed);
64ef8957
FB
810 if (!elements) {
811 if (data_offset >= 0)
812 kmem_cache_free(qeth_core_header_cache, hdr);
813 goto tx_drop;
f61a0d05 814 }
4a71df50 815
51aa165c 816 if (card->info.type != QETH_CARD_TYPE_IQD) {
d4ae1f5e 817 if (qeth_hdr_chk_and_bounce(new_skb, &hdr,
51aa165c
FB
818 sizeof(struct qeth_hdr_layer2)))
819 goto tx_drop;
4a71df50 820 rc = qeth_do_send_packet(card, queue, new_skb, hdr,
64ef8957 821 elements);
51aa165c 822 } else
4a71df50 823 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
64ef8957 824 elements, data_offset, hd_len);
4a71df50
FB
825 if (!rc) {
826 card->stats.tx_packets++;
827 card->stats.tx_bytes += tx_bytes;
828 if (new_skb != skb)
829 dev_kfree_skb_any(skb);
ec634fe3 830 rc = NETDEV_TX_OK;
4a71df50 831 } else {
683d718a
FB
832 if (data_offset >= 0)
833 kmem_cache_free(qeth_core_header_cache, hdr);
834
4a71df50
FB
835 if (rc == -EBUSY) {
836 if (new_skb != skb)
837 dev_kfree_skb_any(new_skb);
838 return NETDEV_TX_BUSY;
839 } else
840 goto tx_drop;
841 }
842
843 netif_wake_queue(dev);
844 if (card->options.performance_stats)
845 card->perf_stats.outbound_time += qeth_get_micros() -
846 card->perf_stats.outbound_start_time;
847 return rc;
848
849tx_drop:
850 card->stats.tx_dropped++;
851 card->stats.tx_errors++;
852 if ((new_skb != skb) && new_skb)
853 dev_kfree_skb_any(new_skb);
854 dev_kfree_skb_any(skb);
d0ec0f54 855 netif_wake_queue(dev);
4a71df50
FB
856 return NETDEV_TX_OK;
857}
858
39423440 859static int __qeth_l2_open(struct net_device *dev)
4a71df50 860{
509e2562 861 struct qeth_card *card = dev->ml_priv;
a1c3ed4c 862 int rc = 0;
4a71df50 863
847a50fd 864 QETH_CARD_TEXT(card, 4, "qethopen");
39423440
UB
865 if (card->state == CARD_STATE_UP)
866 return rc;
4a71df50
FB
867 if (card->state != CARD_STATE_SOFTSETUP)
868 return -ENODEV;
869
870 if ((card->info.type != QETH_CARD_TYPE_OSN) &&
871 (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
847a50fd 872 QETH_CARD_TEXT(card, 4, "nomacadr");
4a71df50
FB
873 return -EPERM;
874 }
875 card->data.state = CH_STATE_UP;
876 card->state = CARD_STATE_UP;
4a71df50
FB
877 netif_start_queue(dev);
878
a1c3ed4c
FB
879 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) {
880 napi_enable(&card->napi);
881 napi_schedule(&card->napi);
882 } else
883 rc = -EIO;
884 return rc;
4a71df50
FB
885}
886
39423440
UB
887static int qeth_l2_open(struct net_device *dev)
888{
889 struct qeth_card *card = dev->ml_priv;
890
891 QETH_CARD_TEXT(card, 5, "qethope_");
892 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
893 QETH_CARD_TEXT(card, 3, "openREC");
894 return -ERESTARTSYS;
895 }
896 return __qeth_l2_open(dev);
897}
898
4a71df50
FB
899static int qeth_l2_stop(struct net_device *dev)
900{
509e2562 901 struct qeth_card *card = dev->ml_priv;
4a71df50 902
847a50fd 903 QETH_CARD_TEXT(card, 4, "qethstop");
4a71df50 904 netif_tx_disable(dev);
a1c3ed4c 905 if (card->state == CARD_STATE_UP) {
4a71df50 906 card->state = CARD_STATE_SOFTSETUP;
a1c3ed4c
FB
907 napi_disable(&card->napi);
908 }
4a71df50
FB
909 return 0;
910}
911
912static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
913{
914 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
915
b4d72c08 916 qeth_l2_create_device_attributes(&gdev->dev);
4a71df50
FB
917 INIT_LIST_HEAD(&card->vid_list);
918 INIT_LIST_HEAD(&card->mc_list);
919 card->options.layer2 = 1;
1da74b1c 920 card->info.hwtrap = 0;
4a71df50
FB
921 return 0;
922}
923
924static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
925{
926 struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
927
b4d72c08 928 qeth_l2_remove_device_attributes(&cgdev->dev);
f2148565 929 qeth_set_allowed_threads(card, 0, 1);
4a71df50
FB
930 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
931
70919e23 932 if (cgdev->state == CCWGROUP_ONLINE)
4a71df50 933 qeth_l2_set_offline(cgdev);
4a71df50
FB
934
935 if (card->dev) {
936 unregister_netdev(card->dev);
937 card->dev = NULL;
938 }
4a71df50
FB
939 return;
940}
941
0fc0b732 942static const struct ethtool_ops qeth_l2_ethtool_ops = {
4a71df50 943 .get_link = ethtool_op_get_link,
4a71df50
FB
944 .get_strings = qeth_core_get_strings,
945 .get_ethtool_stats = qeth_core_get_ethtool_stats,
df8b4ec8 946 .get_sset_count = qeth_core_get_sset_count,
4a71df50 947 .get_drvinfo = qeth_core_get_drvinfo,
3f9975aa 948 .get_settings = qeth_core_ethtool_get_settings,
4a71df50
FB
949};
950
0fc0b732 951static const struct ethtool_ops qeth_l2_osn_ops = {
4a71df50
FB
952 .get_strings = qeth_core_get_strings,
953 .get_ethtool_stats = qeth_core_get_ethtool_stats,
df8b4ec8 954 .get_sset_count = qeth_core_get_sset_count,
4a71df50
FB
955 .get_drvinfo = qeth_core_get_drvinfo,
956};
957
3d58cefd 958static const struct net_device_ops qeth_l2_netdev_ops = {
8403b13c
FB
959 .ndo_open = qeth_l2_open,
960 .ndo_stop = qeth_l2_stop,
961 .ndo_get_stats = qeth_get_stats,
962 .ndo_start_xmit = qeth_l2_hard_start_xmit,
963 .ndo_validate_addr = eth_validate_addr,
afc4b13d 964 .ndo_set_rx_mode = qeth_l2_set_multicast_list,
8403b13c
FB
965 .ndo_do_ioctl = qeth_l2_do_ioctl,
966 .ndo_set_mac_address = qeth_l2_set_mac_address,
967 .ndo_change_mtu = qeth_change_mtu,
968 .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid,
969 .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid,
970 .ndo_tx_timeout = qeth_tx_timeout,
971};
972
4a71df50
FB
973static int qeth_l2_setup_netdev(struct qeth_card *card)
974{
975 switch (card->info.type) {
4a71df50 976 case QETH_CARD_TYPE_IQD:
c835a677
TG
977 card->dev = alloc_netdev(0, "hsi%d", NET_NAME_UNKNOWN,
978 ether_setup);
4a71df50
FB
979 break;
980 case QETH_CARD_TYPE_OSN:
c835a677
TG
981 card->dev = alloc_netdev(0, "osn%d", NET_NAME_UNKNOWN,
982 ether_setup);
4a71df50
FB
983 card->dev->flags |= IFF_NOARP;
984 break;
985 default:
986 card->dev = alloc_etherdev(0);
987 }
988
989 if (!card->dev)
990 return -ENODEV;
991
509e2562 992 card->dev->ml_priv = card;
4a71df50 993 card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
4a71df50 994 card->dev->mtu = card->info.initial_mtu;
8403b13c 995 card->dev->netdev_ops = &qeth_l2_netdev_ops;
7ad24ea4
WK
996 card->dev->ethtool_ops =
997 (card->info.type != QETH_CARD_TYPE_OSN) ?
998 &qeth_l2_ethtool_ops : &qeth_l2_osn_ops;
f646968f 999 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
4a71df50
FB
1000 card->info.broadcast_capable = 1;
1001 qeth_l2_request_initial_mac(card);
1002 SET_NETDEV_DEV(card->dev, &card->gdev->dev);
a1c3ed4c 1003 netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
4a71df50
FB
1004 return register_netdev(card->dev);
1005}
1006
1007static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
1008{
1009 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1010 int rc = 0;
1011 enum qeth_card_states recover_flag;
1012
9dc48ccc 1013 mutex_lock(&card->discipline_mutex);
c4949f07 1014 mutex_lock(&card->conf_mutex);
d11ba0c4
PT
1015 QETH_DBF_TEXT(SETUP, 2, "setonlin");
1016 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
4a71df50 1017
4a71df50 1018 recover_flag = card->state;
4a71df50
FB
1019 rc = qeth_core_hardsetup_card(card);
1020 if (rc) {
1aec42bc 1021 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
aa909224 1022 rc = -ENODEV;
4a71df50
FB
1023 goto out_remove;
1024 }
c044dc21
EC
1025 qeth_bridgeport_query_support(card);
1026 if (card->options.sbp.supported_funcs)
1027 dev_info(&card->gdev->dev,
9c23f4da 1028 "The device represents a Bridge Capable Port\n");
395672e0 1029 qeth_trace_features(card);
4a71df50 1030
aa909224
UB
1031 if (!card->dev && qeth_l2_setup_netdev(card)) {
1032 rc = -ENODEV;
4a71df50 1033 goto out_remove;
aa909224 1034 }
4a71df50
FB
1035
1036 if (card->info.type != QETH_CARD_TYPE_OSN)
1037 qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
1038
1da74b1c
FB
1039 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
1040 if (card->info.hwtrap &&
1041 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
1042 card->info.hwtrap = 0;
1043 } else
1044 card->info.hwtrap = 0;
1045
b4d72c08
EC
1046 qeth_l2_setup_bridgeport_attrs(card);
1047
4a71df50 1048 card->state = CARD_STATE_HARDSETUP;
a1c3ed4c 1049 memset(&card->rx, 0, sizeof(struct qeth_rx));
4a71df50
FB
1050 qeth_print_status_message(card);
1051
1052 /* softsetup */
d11ba0c4 1053 QETH_DBF_TEXT(SETUP, 2, "softsetp");
4a71df50
FB
1054
1055 rc = qeth_send_startlan(card);
1056 if (rc) {
d11ba0c4 1057 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
4a71df50 1058 if (rc == 0xe080) {
74eacdb9
FB
1059 dev_warn(&card->gdev->dev,
1060 "The LAN is offline\n");
4a71df50 1061 card->lan_online = 0;
2b6203bb 1062 goto contin;
4a71df50 1063 }
aa909224 1064 rc = -ENODEV;
f2148565 1065 goto out_remove;
4a71df50
FB
1066 } else
1067 card->lan_online = 1;
1068
2b6203bb 1069contin:
5113fec0 1070 if ((card->info.type == QETH_CARD_TYPE_OSD) ||
0f54761d 1071 (card->info.type == QETH_CARD_TYPE_OSX)) {
d64ecc22 1072 /* configure isolation level */
0f54761d
SR
1073 rc = qeth_set_access_ctrl_online(card, 0);
1074 if (rc) {
1075 rc = -ENODEV;
1076 goto out_remove;
1077 }
1078 }
5113fec0
UB
1079
1080 if (card->info.type != QETH_CARD_TYPE_OSN &&
1081 card->info.type != QETH_CARD_TYPE_OSM)
70919e23 1082 qeth_l2_process_vlans(card);
4a71df50
FB
1083
1084 netif_tx_disable(card->dev);
1085
1086 rc = qeth_init_qdio_queues(card);
1087 if (rc) {
d11ba0c4 1088 QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
aa909224 1089 rc = -ENODEV;
4a71df50
FB
1090 goto out_remove;
1091 }
1092 card->state = CARD_STATE_SOFTSETUP;
2b6203bb
UB
1093 if (card->lan_online)
1094 netif_carrier_on(card->dev);
1095 else
1096 netif_carrier_off(card->dev);
4a71df50
FB
1097
1098 qeth_set_allowed_threads(card, 0xffffffff, 0);
1099 if (recover_flag == CARD_STATE_RECOVER) {
1100 if (recovery_mode &&
1101 card->info.type != QETH_CARD_TYPE_OSN) {
39423440 1102 __qeth_l2_open(card->dev);
4a71df50
FB
1103 } else {
1104 rtnl_lock();
1105 dev_open(card->dev);
1106 rtnl_unlock();
1107 }
1108 /* this also sets saved unicast addresses */
1109 qeth_l2_set_multicast_list(card->dev);
1110 }
1111 /* let user_space know that device is online */
1112 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
c4949f07 1113 mutex_unlock(&card->conf_mutex);
9dc48ccc 1114 mutex_unlock(&card->discipline_mutex);
4a71df50 1115 return 0;
aa909224 1116
4a71df50 1117out_remove:
4a71df50
FB
1118 qeth_l2_stop_card(card, 0);
1119 ccw_device_set_offline(CARD_DDEV(card));
1120 ccw_device_set_offline(CARD_WDEV(card));
1121 ccw_device_set_offline(CARD_RDEV(card));
22ae2790 1122 qdio_free(CARD_DDEV(card));
4a71df50
FB
1123 if (recover_flag == CARD_STATE_RECOVER)
1124 card->state = CARD_STATE_RECOVER;
1125 else
1126 card->state = CARD_STATE_DOWN;
c4949f07 1127 mutex_unlock(&card->conf_mutex);
9dc48ccc 1128 mutex_unlock(&card->discipline_mutex);
aa909224 1129 return rc;
4a71df50
FB
1130}
1131
1132static int qeth_l2_set_online(struct ccwgroup_device *gdev)
1133{
1134 return __qeth_l2_set_online(gdev, 0);
1135}
1136
1137static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1138 int recovery_mode)
1139{
1140 struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
1141 int rc = 0, rc2 = 0, rc3 = 0;
1142 enum qeth_card_states recover_flag;
1143
9dc48ccc 1144 mutex_lock(&card->discipline_mutex);
c4949f07 1145 mutex_lock(&card->conf_mutex);
d11ba0c4
PT
1146 QETH_DBF_TEXT(SETUP, 3, "setoffl");
1147 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
4a71df50
FB
1148
1149 if (card->dev && netif_carrier_ok(card->dev))
1150 netif_carrier_off(card->dev);
1151 recover_flag = card->state;
1da74b1c
FB
1152 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
1153 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1154 card->info.hwtrap = 1;
1155 }
0f5623c9 1156 qeth_l2_stop_card(card, recovery_mode);
4a71df50
FB
1157 rc = ccw_device_set_offline(CARD_DDEV(card));
1158 rc2 = ccw_device_set_offline(CARD_WDEV(card));
1159 rc3 = ccw_device_set_offline(CARD_RDEV(card));
1160 if (!rc)
1161 rc = (rc2) ? rc2 : rc3;
1162 if (rc)
d11ba0c4 1163 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
22ae2790 1164 qdio_free(CARD_DDEV(card));
4a71df50
FB
1165 if (recover_flag == CARD_STATE_UP)
1166 card->state = CARD_STATE_RECOVER;
1167 /* let user_space know that device is offline */
1168 kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
c4949f07 1169 mutex_unlock(&card->conf_mutex);
9dc48ccc 1170 mutex_unlock(&card->discipline_mutex);
4a71df50
FB
1171 return 0;
1172}
1173
1174static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
1175{
1176 return __qeth_l2_set_offline(cgdev, 0);
1177}
1178
1179static int qeth_l2_recover(void *ptr)
1180{
1181 struct qeth_card *card;
1182 int rc = 0;
1183
1184 card = (struct qeth_card *) ptr;
847a50fd 1185 QETH_CARD_TEXT(card, 2, "recover1");
4a71df50
FB
1186 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
1187 return 0;
847a50fd 1188 QETH_CARD_TEXT(card, 2, "recover2");
74eacdb9
FB
1189 dev_warn(&card->gdev->dev,
1190 "A recovery process has been started for the device\n");
65d8013c 1191 qeth_set_recovery_task(card);
4a71df50
FB
1192 __qeth_l2_set_offline(card->gdev, 1);
1193 rc = __qeth_l2_set_online(card->gdev, 1);
4a71df50 1194 if (!rc)
74eacdb9
FB
1195 dev_info(&card->gdev->dev,
1196 "Device successfully recovered!\n");
28a7e4c9 1197 else {
0f54761d
SR
1198 qeth_close_dev(card);
1199 dev_warn(&card->gdev->dev, "The qeth device driver "
2efaf5ff 1200 "failed to recover an error on the device\n");
28a7e4c9 1201 }
65d8013c 1202 qeth_clear_recovery_task(card);
a1c3ed4c
FB
1203 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1204 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
4a71df50
FB
1205 return 0;
1206}
1207
1208static int __init qeth_l2_init(void)
1209{
74eacdb9 1210 pr_info("register layer 2 discipline\n");
4a71df50
FB
1211 return 0;
1212}
1213
1214static void __exit qeth_l2_exit(void)
1215{
74eacdb9 1216 pr_info("unregister layer 2 discipline\n");
4a71df50
FB
1217}
1218
1219static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1220{
1221 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
f78ac2bb 1222 qeth_set_allowed_threads(card, 0, 1);
1da74b1c
FB
1223 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
1224 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
4a71df50
FB
1225 qeth_qdio_clear_card(card, 0);
1226 qeth_clear_qdio_buffers(card);
22ae2790 1227 qdio_free(CARD_DDEV(card));
4a71df50
FB
1228}
1229
bbcfcdc8
FB
1230static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1231{
1232 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1233
1234 if (card->dev)
1235 netif_device_detach(card->dev);
1236 qeth_set_allowed_threads(card, 0, 1);
1237 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
1238 if (gdev->state == CCWGROUP_OFFLINE)
1239 return 0;
1240 if (card->state == CARD_STATE_UP) {
1da74b1c
FB
1241 if (card->info.hwtrap)
1242 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
bbcfcdc8
FB
1243 __qeth_l2_set_offline(card->gdev, 1);
1244 } else
1245 __qeth_l2_set_offline(card->gdev, 0);
1246 return 0;
1247}
1248
1249static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
1250{
1251 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1252 int rc = 0;
1253
1254 if (gdev->state == CCWGROUP_OFFLINE)
1255 goto out;
1256
1257 if (card->state == CARD_STATE_RECOVER) {
1258 rc = __qeth_l2_set_online(card->gdev, 1);
1259 if (rc) {
869da90b
UB
1260 rtnl_lock();
1261 dev_close(card->dev);
1262 rtnl_unlock();
bbcfcdc8
FB
1263 }
1264 } else
1265 rc = __qeth_l2_set_online(card->gdev, 0);
1266out:
1267 qeth_set_allowed_threads(card, 0xffffffff, 0);
1268 if (card->dev)
1269 netif_device_attach(card->dev);
1270 if (rc)
1271 dev_warn(&card->gdev->dev, "The qeth device driver "
1272 "failed to recover an error on the device\n");
1273 return rc;
1274}
1275
c044dc21
EC
1276/* Returns zero if the command is successfully "consumed" */
1277static int qeth_l2_control_event(struct qeth_card *card,
1278 struct qeth_ipa_cmd *cmd)
1279{
1280 switch (cmd->hdr.command) {
9c23f4da
EC
1281 case IPA_CMD_SETBRIDGEPORT_OSA:
1282 case IPA_CMD_SETBRIDGEPORT_IQD:
c044dc21
EC
1283 if (cmd->data.sbp.hdr.command_code ==
1284 IPA_SBP_BRIDGE_PORT_STATE_CHANGE) {
1285 qeth_bridge_state_change(card, cmd);
1286 return 0;
1287 } else
1288 return 1;
1289 case IPA_CMD_ADDRESS_CHANGE_NOTIF:
1290 qeth_bridge_host_event(card, cmd);
1291 return 0;
1292 default:
1293 return 1;
1294 }
1295}
1296
c041f2d4
SO
1297struct qeth_discipline qeth_l2_discipline = {
1298 .start_poll = qeth_qdio_start_poll,
1299 .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
1300 .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
1301 .recover = qeth_l2_recover,
1302 .setup = qeth_l2_probe_device,
4a71df50
FB
1303 .remove = qeth_l2_remove_device,
1304 .set_online = qeth_l2_set_online,
1305 .set_offline = qeth_l2_set_offline,
1306 .shutdown = qeth_l2_shutdown,
bbcfcdc8
FB
1307 .freeze = qeth_l2_pm_suspend,
1308 .thaw = qeth_l2_pm_resume,
1309 .restore = qeth_l2_pm_resume,
c044dc21 1310 .control_event_handler = qeth_l2_control_event,
4a71df50 1311};
c041f2d4 1312EXPORT_SYMBOL_GPL(qeth_l2_discipline);
4a71df50
FB
1313
1314static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1315 struct qeth_cmd_buffer *iob)
1316{
1317 unsigned long flags;
1318 int rc = 0;
1319
847a50fd 1320 QETH_CARD_TEXT(card, 5, "osndctrd");
4a71df50
FB
1321
1322 wait_event(card->wait_q,
1323 atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1324 qeth_prepare_control_data(card, len, iob);
847a50fd 1325 QETH_CARD_TEXT(card, 6, "osnoirqp");
4a71df50
FB
1326 spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1327 rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1328 (addr_t) iob, 0, 0);
1329 spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1330 if (rc) {
14cc21b6 1331 QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "
4a71df50 1332 "ccw_device_start rc = %i\n", rc);
847a50fd 1333 QETH_CARD_TEXT_(card, 2, " err%d", rc);
4a71df50
FB
1334 qeth_release_buffer(iob->channel, iob);
1335 atomic_set(&card->write.irq_pending, 0);
1336 wake_up(&card->wait_q);
1337 }
1338 return rc;
1339}
1340
1341static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
1342 struct qeth_cmd_buffer *iob, int data_len)
1343{
1344 u16 s1, s2;
1345
847a50fd 1346 QETH_CARD_TEXT(card, 4, "osndipa");
4a71df50
FB
1347
1348 qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1349 s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1350 s2 = (u16)data_len;
1351 memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1352 memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1353 memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1354 memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1355 return qeth_osn_send_control_data(card, s1, iob);
1356}
1357
1358int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
1359{
1360 struct qeth_cmd_buffer *iob;
1361 struct qeth_card *card;
1362 int rc;
1363
4a71df50
FB
1364 if (!dev)
1365 return -ENODEV;
509e2562 1366 card = dev->ml_priv;
4a71df50
FB
1367 if (!card)
1368 return -ENODEV;
847a50fd 1369 QETH_CARD_TEXT(card, 2, "osnsdmc");
c3521254 1370 if (!qeth_card_hw_is_reachable(card))
4a71df50
FB
1371 return -ENODEV;
1372 iob = qeth_wait_for_buffer(&card->write);
1373 memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
1374 rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
1375 return rc;
1376}
1377EXPORT_SYMBOL(qeth_osn_assist);
1378
1379int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
1380 int (*assist_cb)(struct net_device *, void *),
1381 int (*data_cb)(struct sk_buff *))
1382{
1383 struct qeth_card *card;
1384
4a71df50
FB
1385 *dev = qeth_l2_netdev_by_devno(read_dev_no);
1386 if (*dev == NULL)
1387 return -ENODEV;
509e2562 1388 card = (*dev)->ml_priv;
4a71df50
FB
1389 if (!card)
1390 return -ENODEV;
847a50fd 1391 QETH_CARD_TEXT(card, 2, "osnreg");
4a71df50
FB
1392 if ((assist_cb == NULL) || (data_cb == NULL))
1393 return -EINVAL;
1394 card->osn_info.assist_cb = assist_cb;
1395 card->osn_info.data_cb = data_cb;
1396 return 0;
1397}
1398EXPORT_SYMBOL(qeth_osn_register);
1399
1400void qeth_osn_deregister(struct net_device *dev)
1401{
1402 struct qeth_card *card;
1403
4a71df50
FB
1404 if (!dev)
1405 return;
509e2562 1406 card = dev->ml_priv;
4a71df50
FB
1407 if (!card)
1408 return;
847a50fd 1409 QETH_CARD_TEXT(card, 2, "osndereg");
4a71df50
FB
1410 card->osn_info.assist_cb = NULL;
1411 card->osn_info.data_cb = NULL;
1412 return;
1413}
1414EXPORT_SYMBOL(qeth_osn_deregister);
1415
b4d72c08
EC
1416/* SETBRIDGEPORT support, async notifications */
1417
9f48b9db
EC
1418enum qeth_an_event_type {anev_reg_unreg, anev_abort, anev_reset};
1419
1420/**
1421 * qeth_bridge_emit_host_event() - bridgeport address change notification
1422 * @card: qeth_card structure pointer, for udev events.
1423 * @evtype: "normal" register/unregister, or abort, or reset. For abort
1424 * and reset token and addr_lnid are unused and may be NULL.
1425 * @code: event bitmask: high order bit 0x80 value 1 means removal of an
1426 * object, 0 - addition of an object.
1427 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1428 * @token: "network token" structure identifying physical address of the port.
1429 * @addr_lnid: pointer to structure with MAC address and VLAN ID.
1430 *
1431 * This function is called when registrations and deregistrations are
1432 * reported by the hardware, and also when notifications are enabled -
1433 * for all currently registered addresses.
1434 */
1435static void qeth_bridge_emit_host_event(struct qeth_card *card,
1436 enum qeth_an_event_type evtype,
1437 u8 code, struct net_if_token *token, struct mac_addr_lnid *addr_lnid)
1438{
1439 char str[7][32];
1440 char *env[8];
1441 int i = 0;
1442
1443 switch (evtype) {
1444 case anev_reg_unreg:
1445 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=%s",
1446 (code & IPA_ADDR_CHANGE_CODE_REMOVAL)
1447 ? "deregister" : "register");
1448 env[i] = str[i]; i++;
1449 if (code & IPA_ADDR_CHANGE_CODE_VLANID) {
1450 snprintf(str[i], sizeof(str[i]), "VLAN=%d",
1451 addr_lnid->lnid);
1452 env[i] = str[i]; i++;
1453 }
1454 if (code & IPA_ADDR_CHANGE_CODE_MACADDR) {
1455 snprintf(str[i], sizeof(str[i]), "MAC=%pM6",
1456 &addr_lnid->mac);
1457 env[i] = str[i]; i++;
1458 }
1459 snprintf(str[i], sizeof(str[i]), "NTOK_BUSID=%x.%x.%04x",
1460 token->cssid, token->ssid, token->devnum);
1461 env[i] = str[i]; i++;
1462 snprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid);
1463 env[i] = str[i]; i++;
1464 snprintf(str[i], sizeof(str[i]), "NTOK_CHPID=%02x",
1465 token->chpid);
1466 env[i] = str[i]; i++;
1467 snprintf(str[i], sizeof(str[i]), "NTOK_CHID=%04x", token->chid);
1468 env[i] = str[i]; i++;
1469 break;
1470 case anev_abort:
1471 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=abort");
1472 env[i] = str[i]; i++;
1473 break;
1474 case anev_reset:
1475 snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=reset");
1476 env[i] = str[i]; i++;
1477 break;
1478 }
1479 env[i] = NULL;
1480 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env);
1481}
1482
b4d72c08
EC
1483struct qeth_bridge_state_data {
1484 struct work_struct worker;
1485 struct qeth_card *card;
1486 struct qeth_sbp_state_change qports;
1487};
1488
1489static void qeth_bridge_state_change_worker(struct work_struct *work)
1490{
1491 struct qeth_bridge_state_data *data =
1492 container_of(work, struct qeth_bridge_state_data, worker);
1493 /* We are only interested in the first entry - local port */
1494 struct qeth_sbp_port_entry *entry = &data->qports.entry[0];
1495 char env_locrem[32];
1496 char env_role[32];
1497 char env_state[32];
1498 char *env[] = {
1499 env_locrem,
1500 env_role,
1501 env_state,
1502 NULL
1503 };
1504
1505 /* Role should not change by itself, but if it did, */
1506 /* information from the hardware is authoritative. */
1507 mutex_lock(&data->card->conf_mutex);
1508 data->card->options.sbp.role = entry->role;
1509 mutex_unlock(&data->card->conf_mutex);
1510
1511 snprintf(env_locrem, sizeof(env_locrem), "BRIDGEPORT=statechange");
1512 snprintf(env_role, sizeof(env_role), "ROLE=%s",
1513 (entry->role == QETH_SBP_ROLE_NONE) ? "none" :
1514 (entry->role == QETH_SBP_ROLE_PRIMARY) ? "primary" :
1515 (entry->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" :
1516 "<INVALID>");
1517 snprintf(env_state, sizeof(env_state), "STATE=%s",
1518 (entry->state == QETH_SBP_STATE_INACTIVE) ? "inactive" :
1519 (entry->state == QETH_SBP_STATE_STANDBY) ? "standby" :
1520 (entry->state == QETH_SBP_STATE_ACTIVE) ? "active" :
1521 "<INVALID>");
1522 kobject_uevent_env(&data->card->gdev->dev.kobj,
1523 KOBJ_CHANGE, env);
1524 kfree(data);
1525}
1526
c044dc21
EC
1527static void qeth_bridge_state_change(struct qeth_card *card,
1528 struct qeth_ipa_cmd *cmd)
b4d72c08
EC
1529{
1530 struct qeth_sbp_state_change *qports =
1531 &cmd->data.sbp.data.state_change;
1532 struct qeth_bridge_state_data *data;
1533 int extrasize;
1534
1535 QETH_CARD_TEXT(card, 2, "brstchng");
1536 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
8a593148 1537 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length);
b4d72c08
EC
1538 return;
1539 }
1540 extrasize = sizeof(struct qeth_sbp_port_entry) * qports->num_entries;
1541 data = kzalloc(sizeof(struct qeth_bridge_state_data) + extrasize,
1542 GFP_ATOMIC);
1543 if (!data) {
1544 QETH_CARD_TEXT(card, 2, "BPSalloc");
1545 return;
1546 }
1547 INIT_WORK(&data->worker, qeth_bridge_state_change_worker);
1548 data->card = card;
1549 memcpy(&data->qports, qports,
1550 sizeof(struct qeth_sbp_state_change) + extrasize);
1551 queue_work(qeth_wq, &data->worker);
1552}
b4d72c08 1553
9f48b9db
EC
1554struct qeth_bridge_host_data {
1555 struct work_struct worker;
1556 struct qeth_card *card;
1557 struct qeth_ipacmd_addr_change hostevs;
1558};
1559
1560static void qeth_bridge_host_event_worker(struct work_struct *work)
1561{
1562 struct qeth_bridge_host_data *data =
1563 container_of(work, struct qeth_bridge_host_data, worker);
1564 int i;
1565
1566 if (data->hostevs.lost_event_mask) {
1567 dev_info(&data->card->gdev->dev,
9c23f4da 1568"Address notification from the Bridge Port stopped %s (%s)\n",
9f48b9db
EC
1569 data->card->dev->name,
1570 (data->hostevs.lost_event_mask == 0x01)
1571 ? "Overflow"
1572 : (data->hostevs.lost_event_mask == 0x02)
1573 ? "Bridge port state change"
1574 : "Unknown reason");
1575 mutex_lock(&data->card->conf_mutex);
1576 data->card->options.sbp.hostnotification = 0;
1577 mutex_unlock(&data->card->conf_mutex);
1578 qeth_bridge_emit_host_event(data->card, anev_abort,
1579 0, NULL, NULL);
1580 } else
1581 for (i = 0; i < data->hostevs.num_entries; i++) {
1582 struct qeth_ipacmd_addr_change_entry *entry =
1583 &data->hostevs.entry[i];
1584 qeth_bridge_emit_host_event(data->card,
1585 anev_reg_unreg,
1586 entry->change_code,
1587 &entry->token, &entry->addr_lnid);
1588 }
1589 kfree(data);
1590}
1591
c044dc21
EC
1592static void qeth_bridge_host_event(struct qeth_card *card,
1593 struct qeth_ipa_cmd *cmd)
9f48b9db
EC
1594{
1595 struct qeth_ipacmd_addr_change *hostevs =
1596 &cmd->data.addrchange;
1597 struct qeth_bridge_host_data *data;
1598 int extrasize;
1599
1600 QETH_CARD_TEXT(card, 2, "brhostev");
1601 if (cmd->hdr.return_code != 0x0000) {
1602 if (cmd->hdr.return_code == 0x0010) {
1603 if (hostevs->lost_event_mask == 0x00)
1604 hostevs->lost_event_mask = 0xff;
1605 } else {
1606 QETH_CARD_TEXT_(card, 2, "BPHe%04x",
1607 cmd->hdr.return_code);
1608 return;
1609 }
1610 }
1611 extrasize = sizeof(struct qeth_ipacmd_addr_change_entry) *
1612 hostevs->num_entries;
1613 data = kzalloc(sizeof(struct qeth_bridge_host_data) + extrasize,
1614 GFP_ATOMIC);
1615 if (!data) {
1616 QETH_CARD_TEXT(card, 2, "BPHalloc");
1617 return;
1618 }
1619 INIT_WORK(&data->worker, qeth_bridge_host_event_worker);
1620 data->card = card;
1621 memcpy(&data->hostevs, hostevs,
1622 sizeof(struct qeth_ipacmd_addr_change) + extrasize);
1623 queue_work(qeth_wq, &data->worker);
1624}
9f48b9db 1625
b4d72c08
EC
1626/* SETBRIDGEPORT support; sending commands */
1627
1628struct _qeth_sbp_cbctl {
1629 u16 ipa_rc;
1630 u16 cmd_rc;
1631 union {
1632 u32 supported;
1633 struct {
1634 enum qeth_sbp_roles *role;
1635 enum qeth_sbp_states *state;
1636 } qports;
1637 } data;
1638};
1639
1640/**
1641 * qeth_bridgeport_makerc() - derive "traditional" error from hardware codes.
1642 * @card: qeth_card structure pointer, for debug messages.
1643 * @cbctl: state structure with hardware return codes.
1644 * @setcmd: IPA command code
1645 *
1646 * Returns negative errno-compatible error indication or 0 on success.
1647 */
1648static int qeth_bridgeport_makerc(struct qeth_card *card,
1649 struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd)
1650{
1651 int rc;
9c23f4da 1652 int is_iqd = (card->info.type == QETH_CARD_TYPE_IQD);
b4d72c08 1653
9c23f4da
EC
1654 if ((is_iqd && (cbctl->ipa_rc == IPA_RC_SUCCESS)) ||
1655 (!is_iqd && (cbctl->ipa_rc == cbctl->cmd_rc)))
b4d72c08
EC
1656 switch (cbctl->cmd_rc) {
1657 case 0x0000:
1658 rc = 0;
1659 break;
9c23f4da 1660 case 0x2B04:
b4d72c08 1661 case 0x0004:
ffb95251 1662 rc = -EOPNOTSUPP;
b4d72c08 1663 break;
9c23f4da 1664 case 0x2B0C:
b4d72c08
EC
1665 case 0x000C: /* Not configured as bridge Port */
1666 rc = -ENODEV; /* maybe not the best code here? */
1667 dev_err(&card->gdev->dev,
9c23f4da 1668 "The device is not configured as a Bridge Port\n");
b4d72c08 1669 break;
9c23f4da 1670 case 0x2B14:
b4d72c08
EC
1671 case 0x0014: /* Another device is Primary */
1672 switch (setcmd) {
1673 case IPA_SBP_SET_PRIMARY_BRIDGE_PORT:
1674 rc = -EEXIST;
1675 dev_err(&card->gdev->dev,
9c23f4da 1676 "The LAN already has a primary Bridge Port\n");
b4d72c08
EC
1677 break;
1678 case IPA_SBP_SET_SECONDARY_BRIDGE_PORT:
1679 rc = -EBUSY;
1680 dev_err(&card->gdev->dev,
9c23f4da 1681 "The device is already a primary Bridge Port\n");
b4d72c08
EC
1682 break;
1683 default:
1684 rc = -EIO;
1685 }
1686 break;
9c23f4da 1687 case 0x2B18:
b4d72c08
EC
1688 case 0x0018: /* This device is currently Secondary */
1689 rc = -EBUSY;
1690 dev_err(&card->gdev->dev,
9c23f4da 1691 "The device is already a secondary Bridge Port\n");
b4d72c08 1692 break;
9c23f4da 1693 case 0x2B1C:
b4d72c08
EC
1694 case 0x001C: /* Limit for Secondary devices reached */
1695 rc = -EEXIST;
1696 dev_err(&card->gdev->dev,
9c23f4da 1697 "The LAN cannot have more secondary Bridge Ports\n");
b4d72c08 1698 break;
9c23f4da 1699 case 0x2B24:
b4d72c08
EC
1700 case 0x0024: /* This device is currently Primary */
1701 rc = -EBUSY;
1702 dev_err(&card->gdev->dev,
9c23f4da 1703 "The device is already a primary Bridge Port\n");
b4d72c08 1704 break;
9c23f4da 1705 case 0x2B20:
b4d72c08
EC
1706 case 0x0020: /* Not authorized by zManager */
1707 rc = -EACCES;
1708 dev_err(&card->gdev->dev,
9c23f4da 1709 "The device is not authorized to be a Bridge Port\n");
b4d72c08
EC
1710 break;
1711 default:
1712 rc = -EIO;
1713 }
9c23f4da
EC
1714 else
1715 switch (cbctl->ipa_rc) {
1716 case IPA_RC_NOTSUPP:
ffb95251 1717 rc = -EOPNOTSUPP;
9c23f4da
EC
1718 break;
1719 case IPA_RC_UNSUPPORTED_COMMAND:
ffb95251 1720 rc = -EOPNOTSUPP;
9c23f4da
EC
1721 break;
1722 default:
1723 rc = -EIO;
1724 }
1725
b4d72c08
EC
1726 if (rc) {
1727 QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc);
1728 QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc);
1729 }
1730 return rc;
1731}
1732
9c23f4da
EC
1733static inline int ipa_cmd_sbp(struct qeth_card *card)
1734{
1735 return (card->info.type == QETH_CARD_TYPE_IQD) ?
1736 IPA_CMD_SETBRIDGEPORT_IQD :
1737 IPA_CMD_SETBRIDGEPORT_OSA;
1738}
1739
b4d72c08
EC
1740static int qeth_bridgeport_query_support_cb(struct qeth_card *card,
1741 struct qeth_reply *reply, unsigned long data)
1742{
1743 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1744 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1745 QETH_CARD_TEXT(card, 2, "brqsupcb");
1746 cbctl->ipa_rc = cmd->hdr.return_code;
1747 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1748 if ((cbctl->ipa_rc == 0) && (cbctl->cmd_rc == 0)) {
1749 cbctl->data.supported =
1750 cmd->data.sbp.data.query_cmds_supp.supported_cmds;
1751 } else {
1752 cbctl->data.supported = 0;
1753 }
1754 return 0;
1755}
1756
1757/**
1758 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1759 * @card: qeth_card structure pointer.
1760 *
1761 * Sets bitmask of supported setbridgeport subfunctions in the qeth_card
1762 * strucutre: card->options.sbp.supported_funcs.
1763 */
c044dc21 1764static void qeth_bridgeport_query_support(struct qeth_card *card)
b4d72c08
EC
1765{
1766 struct qeth_cmd_buffer *iob;
1767 struct qeth_ipa_cmd *cmd;
1768 struct _qeth_sbp_cbctl cbctl;
1769
1770 QETH_CARD_TEXT(card, 2, "brqsuppo");
9c23f4da 1771 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1aec42bc
TR
1772 if (!iob)
1773 return;
b4d72c08
EC
1774 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1775 cmd->data.sbp.hdr.cmdlength =
1776 sizeof(struct qeth_ipacmd_sbp_hdr) +
1777 sizeof(struct qeth_sbp_query_cmds_supp);
1778 cmd->data.sbp.hdr.command_code =
1779 IPA_SBP_QUERY_COMMANDS_SUPPORTED;
1780 cmd->data.sbp.hdr.used_total = 1;
1781 cmd->data.sbp.hdr.seq_no = 1;
1782 if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb,
1783 (void *)&cbctl) ||
1784 qeth_bridgeport_makerc(card, &cbctl,
1785 IPA_SBP_QUERY_COMMANDS_SUPPORTED)) {
1786 /* non-zero makerc signifies failure, and produce messages */
1787 card->options.sbp.role = QETH_SBP_ROLE_NONE;
1788 return;
1789 }
1790 card->options.sbp.supported_funcs = cbctl.data.supported;
1791}
b4d72c08
EC
1792
1793static int qeth_bridgeport_query_ports_cb(struct qeth_card *card,
1794 struct qeth_reply *reply, unsigned long data)
1795{
1796 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1797 struct qeth_sbp_query_ports *qports = &cmd->data.sbp.data.query_ports;
1798 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1799
1800 QETH_CARD_TEXT(card, 2, "brqprtcb");
1801 cbctl->ipa_rc = cmd->hdr.return_code;
1802 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1803 if ((cbctl->ipa_rc != 0) || (cbctl->cmd_rc != 0))
1804 return 0;
1805 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1806 cbctl->cmd_rc = 0xffff;
1807 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length);
1808 return 0;
1809 }
1810 /* first entry contains the state of the local port */
1811 if (qports->num_entries > 0) {
1812 if (cbctl->data.qports.role)
1813 *cbctl->data.qports.role = qports->entry[0].role;
1814 if (cbctl->data.qports.state)
1815 *cbctl->data.qports.state = qports->entry[0].state;
1816 }
1817 return 0;
1818}
1819
1820/**
1821 * qeth_bridgeport_query_ports() - query local bridgeport status.
1822 * @card: qeth_card structure pointer.
1823 * @role: Role of the port: 0-none, 1-primary, 2-secondary.
1824 * @state: State of the port: 0-inactive, 1-standby, 2-active.
1825 *
1826 * Returns negative errno-compatible error indication or 0 on success.
1827 *
1828 * 'role' and 'state' are not updated in case of hardware operation failure.
1829 */
1830int qeth_bridgeport_query_ports(struct qeth_card *card,
1831 enum qeth_sbp_roles *role, enum qeth_sbp_states *state)
1832{
1833 int rc = 0;
1834 struct qeth_cmd_buffer *iob;
1835 struct qeth_ipa_cmd *cmd;
1836 struct _qeth_sbp_cbctl cbctl = {
1837 .data = {
1838 .qports = {
1839 .role = role,
1840 .state = state,
1841 },
1842 },
1843 };
1844
1845 QETH_CARD_TEXT(card, 2, "brqports");
1846 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
1847 return -EOPNOTSUPP;
9c23f4da 1848 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1aec42bc
TR
1849 if (!iob)
1850 return -ENOMEM;
b4d72c08
EC
1851 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1852 cmd->data.sbp.hdr.cmdlength =
1853 sizeof(struct qeth_ipacmd_sbp_hdr);
1854 cmd->data.sbp.hdr.command_code =
1855 IPA_SBP_QUERY_BRIDGE_PORTS;
1856 cmd->data.sbp.hdr.used_total = 1;
1857 cmd->data.sbp.hdr.seq_no = 1;
1858 rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb,
1859 (void *)&cbctl);
c88394e7 1860 if (rc < 0)
b4d72c08 1861 return rc;
c88394e7 1862 return qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS);
b4d72c08
EC
1863}
1864EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports);
1865
1866static int qeth_bridgeport_set_cb(struct qeth_card *card,
1867 struct qeth_reply *reply, unsigned long data)
1868{
1869 struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
1870 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1871 QETH_CARD_TEXT(card, 2, "brsetrcb");
1872 cbctl->ipa_rc = cmd->hdr.return_code;
1873 cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1874 return 0;
1875}
1876
1877/**
1878 * qeth_bridgeport_setrole() - Assign primary role to the port.
1879 * @card: qeth_card structure pointer.
1880 * @role: Role to assign.
1881 *
1882 * Returns negative errno-compatible error indication or 0 on success.
1883 */
1884int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role)
1885{
1886 int rc = 0;
1887 int cmdlength;
1888 struct qeth_cmd_buffer *iob;
1889 struct qeth_ipa_cmd *cmd;
1890 struct _qeth_sbp_cbctl cbctl;
1891 enum qeth_ipa_sbp_cmd setcmd;
1892
1893 QETH_CARD_TEXT(card, 2, "brsetrol");
1894 switch (role) {
1895 case QETH_SBP_ROLE_NONE:
1896 setcmd = IPA_SBP_RESET_BRIDGE_PORT_ROLE;
1897 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1898 sizeof(struct qeth_sbp_reset_role);
1899 break;
1900 case QETH_SBP_ROLE_PRIMARY:
1901 setcmd = IPA_SBP_SET_PRIMARY_BRIDGE_PORT;
1902 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1903 sizeof(struct qeth_sbp_set_primary);
1904 break;
1905 case QETH_SBP_ROLE_SECONDARY:
1906 setcmd = IPA_SBP_SET_SECONDARY_BRIDGE_PORT;
1907 cmdlength = sizeof(struct qeth_ipacmd_sbp_hdr) +
1908 sizeof(struct qeth_sbp_set_secondary);
1909 break;
1910 default:
1911 return -EINVAL;
1912 }
1913 if (!(card->options.sbp.supported_funcs & setcmd))
1914 return -EOPNOTSUPP;
9c23f4da 1915 iob = qeth_get_ipacmd_buffer(card, ipa_cmd_sbp(card), 0);
1aec42bc
TR
1916 if (!iob)
1917 return -ENOMEM;
b4d72c08
EC
1918 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1919 cmd->data.sbp.hdr.cmdlength = cmdlength;
1920 cmd->data.sbp.hdr.command_code = setcmd;
1921 cmd->data.sbp.hdr.used_total = 1;
1922 cmd->data.sbp.hdr.seq_no = 1;
1923 rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb,
1924 (void *)&cbctl);
c88394e7 1925 if (rc < 0)
b4d72c08 1926 return rc;
c88394e7 1927 return qeth_bridgeport_makerc(card, &cbctl, setcmd);
b4d72c08
EC
1928}
1929
9f48b9db
EC
1930/**
1931 * qeth_anset_makerc() - derive "traditional" error from hardware codes.
1932 * @card: qeth_card structure pointer, for debug messages.
1933 *
1934 * Returns negative errno-compatible error indication or 0 on success.
1935 */
1936static int qeth_anset_makerc(struct qeth_card *card, int pnso_rc, u16 response)
1937{
1938 int rc;
1939
1940 if (pnso_rc == 0)
1941 switch (response) {
1942 case 0x0001:
1943 rc = 0;
1944 break;
1945 case 0x0004:
1946 case 0x0100:
1947 case 0x0106:
ffb95251 1948 rc = -EOPNOTSUPP;
9f48b9db
EC
1949 dev_err(&card->gdev->dev,
1950 "Setting address notification failed\n");
1951 break;
1952 case 0x0107:
1953 rc = -EAGAIN;
1954 break;
1955 default:
1956 rc = -EIO;
1957 }
1958 else
1959 rc = -EIO;
1960
1961 if (rc) {
1962 QETH_CARD_TEXT_(card, 2, "SBPp%04x", pnso_rc);
1963 QETH_CARD_TEXT_(card, 2, "SBPr%04x", response);
1964 }
1965 return rc;
1966}
1967
1968static void qeth_bridgeport_an_set_cb(void *priv,
1969 enum qdio_brinfo_entry_type type, void *entry)
1970{
1971 struct qeth_card *card = (struct qeth_card *)priv;
1972 struct qdio_brinfo_entry_l2 *l2entry;
1973 u8 code;
1974
1975 if (type != l2_addr_lnid) {
1976 WARN_ON_ONCE(1);
1977 return;
1978 }
1979
1980 l2entry = (struct qdio_brinfo_entry_l2 *)entry;
1981 code = IPA_ADDR_CHANGE_CODE_MACADDR;
1982 if (l2entry->addr_lnid.lnid)
1983 code |= IPA_ADDR_CHANGE_CODE_VLANID;
1984 qeth_bridge_emit_host_event(card, anev_reg_unreg, code,
1985 (struct net_if_token *)&l2entry->nit,
1986 (struct mac_addr_lnid *)&l2entry->addr_lnid);
1987}
1988
1989/**
1990 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1991 * @card: qeth_card structure pointer.
1992 * @enable: 0 - disable, non-zero - enable notifications
1993 *
1994 * Returns negative errno-compatible error indication or 0 on success.
1995 *
1996 * On enable, emits a series of address notifications udev events for all
1997 * currently registered hosts.
1998 */
1999int qeth_bridgeport_an_set(struct qeth_card *card, int enable)
2000{
2001 int rc;
2002 u16 response;
2003 struct ccw_device *ddev;
2004 struct subchannel_id schid;
2005
2006 if (!card)
2007 return -EINVAL;
2008 if (!card->options.sbp.supported_funcs)
2009 return -EOPNOTSUPP;
2010 ddev = CARD_DDEV(card);
2011 ccw_device_get_schid(ddev, &schid);
2012
2013 if (enable) {
2014 qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL);
2015 rc = qdio_pnso_brinfo(schid, 1, &response,
2016 qeth_bridgeport_an_set_cb, card);
2017 } else
2018 rc = qdio_pnso_brinfo(schid, 0, &response, NULL, NULL);
2019 return qeth_anset_makerc(card, rc, response);
2020}
2021EXPORT_SYMBOL_GPL(qeth_bridgeport_an_set);
2022
4a71df50
FB
2023module_init(qeth_l2_init);
2024module_exit(qeth_l2_exit);
2025MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
2026MODULE_DESCRIPTION("qeth layer 2 discipline");
2027MODULE_LICENSE("GPL");