xref: /linux/drivers/s390/net/qeth_l2_main.c (revision b43ab901d671e3e3cad425ea5e9a3c74e266dcdd)
1 /*
2  *  drivers/s390/net/qeth_l2_main.c
3  *
4  *    Copyright IBM Corp. 2007, 2009
5  *    Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
6  *		 Frank Pavlic <fpavlic@de.ibm.com>,
7  *		 Thomas Spatzier <tspat@de.ibm.com>,
8  *		 Frank Blaschka <frank.blaschka@de.ibm.com>
9  */
10 
11 #define KMSG_COMPONENT "qeth"
12 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
13 
14 #include <linux/module.h>
15 #include <linux/moduleparam.h>
16 #include <linux/string.h>
17 #include <linux/errno.h>
18 #include <linux/kernel.h>
19 #include <linux/slab.h>
20 #include <linux/etherdevice.h>
21 #include <linux/mii.h>
22 #include <linux/ip.h>
23 #include <linux/list.h>
24 
25 #include "qeth_core.h"
26 
27 static int qeth_l2_set_offline(struct ccwgroup_device *);
28 static int qeth_l2_stop(struct net_device *);
29 static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
30 static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
31 			   enum qeth_ipa_cmds,
32 			   int (*reply_cb) (struct qeth_card *,
33 					    struct qeth_reply*,
34 					    unsigned long));
35 static void qeth_l2_set_multicast_list(struct net_device *);
36 static int qeth_l2_recover(void *);
37 
38 static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
39 {
40 	struct qeth_card *card = dev->ml_priv;
41 	struct mii_ioctl_data *mii_data;
42 	int rc = 0;
43 
44 	if (!card)
45 		return -ENODEV;
46 
47 	if ((card->state != CARD_STATE_UP) &&
48 		(card->state != CARD_STATE_SOFTSETUP))
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:
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) &&
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;
78 	default:
79 		rc = -EOPNOTSUPP;
80 	}
81 	if (rc)
82 		QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
83 	return rc;
84 }
85 
86 static int qeth_l2_verify_dev(struct net_device *dev)
87 {
88 	struct qeth_card *card;
89 	unsigned long flags;
90 	int rc = 0;
91 
92 	read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
93 	list_for_each_entry(card, &qeth_core_card_list.list, list) {
94 		if (card->dev == dev) {
95 			rc = QETH_REAL_CARD;
96 			break;
97 		}
98 	}
99 	read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
100 
101 	return rc;
102 }
103 
104 static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
105 {
106 	struct qeth_card *card;
107 	struct net_device *ndev;
108 	__u16 temp_dev_no;
109 	unsigned long flags;
110 	struct ccw_dev_id read_devid;
111 
112 	ndev = NULL;
113 	memcpy(&temp_dev_no, read_dev_no, 2);
114 	read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
115 	list_for_each_entry(card, &qeth_core_card_list.list, list) {
116 		ccw_device_get_id(CARD_RDEV(card), &read_devid);
117 		if (read_devid.devno == temp_dev_no) {
118 			ndev = card->dev;
119 			break;
120 		}
121 	}
122 	read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
123 	return ndev;
124 }
125 
126 static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,
127 				struct qeth_reply *reply,
128 				unsigned long data)
129 {
130 	struct qeth_ipa_cmd *cmd;
131 	__u8 *mac;
132 
133 	QETH_CARD_TEXT(card, 2, "L2Sgmacb");
134 	cmd = (struct qeth_ipa_cmd *) data;
135 	mac = &cmd->data.setdelmac.mac[0];
136 	/* MAC already registered, needed in couple/uncouple case */
137 	if (cmd->hdr.return_code ==  IPA_RC_L2_DUP_MAC) {
138 		QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n",
139 			  mac, QETH_CARD_IFNAME(card));
140 		cmd->hdr.return_code = 0;
141 	}
142 	if (cmd->hdr.return_code)
143 		QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n",
144 			  mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
145 	return 0;
146 }
147 
148 static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
149 {
150 	QETH_CARD_TEXT(card, 2, "L2Sgmac");
151 	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,
152 					  qeth_l2_send_setgroupmac_cb);
153 }
154 
155 static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,
156 				struct qeth_reply *reply,
157 				unsigned long data)
158 {
159 	struct qeth_ipa_cmd *cmd;
160 	__u8 *mac;
161 
162 	QETH_CARD_TEXT(card, 2, "L2Dgmacb");
163 	cmd = (struct qeth_ipa_cmd *) data;
164 	mac = &cmd->data.setdelmac.mac[0];
165 	if (cmd->hdr.return_code)
166 		QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n",
167 			  mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
168 	return 0;
169 }
170 
171 static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
172 {
173 	QETH_CARD_TEXT(card, 2, "L2Dgmac");
174 	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,
175 					  qeth_l2_send_delgroupmac_cb);
176 }
177 
178 static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
179 {
180 	struct qeth_mc_mac *mc;
181 	int rc;
182 
183 	mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
184 
185 	if (!mc)
186 		return;
187 
188 	memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
189 	mc->mc_addrlen = OSA_ADDR_LEN;
190 	mc->is_vmac = vmac;
191 
192 	if (vmac) {
193 		rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
194 					NULL);
195 	} else {
196 		rc = qeth_l2_send_setgroupmac(card, mac);
197 	}
198 
199 	if (!rc)
200 		list_add_tail(&mc->list, &card->mc_list);
201 	else
202 		kfree(mc);
203 }
204 
205 static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
206 {
207 	struct qeth_mc_mac *mc, *tmp;
208 
209 	spin_lock_bh(&card->mclock);
210 	list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
211 		if (del) {
212 			if (mc->is_vmac)
213 				qeth_l2_send_setdelmac(card, mc->mc_addr,
214 					IPA_CMD_DELVMAC, NULL);
215 			else
216 				qeth_l2_send_delgroupmac(card, mc->mc_addr);
217 		}
218 		list_del(&mc->list);
219 		kfree(mc);
220 	}
221 	spin_unlock_bh(&card->mclock);
222 }
223 
224 static inline int qeth_l2_get_cast_type(struct qeth_card *card,
225 			struct sk_buff *skb)
226 {
227 	if (card->info.type == QETH_CARD_TYPE_OSN)
228 		return RTN_UNSPEC;
229 	if (is_broadcast_ether_addr(skb->data))
230 		return RTN_BROADCAST;
231 	if (is_multicast_ether_addr(skb->data))
232 		return RTN_MULTICAST;
233 	return RTN_UNSPEC;
234 }
235 
236 static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
237 			struct sk_buff *skb, int ipv, int cast_type)
238 {
239 	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb);
240 
241 	memset(hdr, 0, sizeof(struct qeth_hdr));
242 	hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
243 
244 	/* set byte byte 3 to casting flags */
245 	if (cast_type == RTN_MULTICAST)
246 		hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
247 	else if (cast_type == RTN_BROADCAST)
248 		hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
249 	else
250 		hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
251 
252 	hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
253 	/* VSWITCH relies on the VLAN
254 	 * information to be present in
255 	 * the QDIO header */
256 	if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
257 		hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
258 		hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
259 	}
260 }
261 
262 static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
263 			struct qeth_reply *reply, unsigned long data)
264 {
265 	struct qeth_ipa_cmd *cmd;
266 
267 	QETH_CARD_TEXT(card, 2, "L2sdvcb");
268 	cmd = (struct qeth_ipa_cmd *) data;
269 	if (cmd->hdr.return_code) {
270 		QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
271 			  "Continuing\n", cmd->data.setdelvlan.vlan_id,
272 			  QETH_CARD_IFNAME(card), cmd->hdr.return_code);
273 		QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
274 		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
275 	}
276 	return 0;
277 }
278 
279 static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
280 				enum qeth_ipa_cmds ipacmd)
281 {
282 	struct qeth_ipa_cmd *cmd;
283 	struct qeth_cmd_buffer *iob;
284 
285 	QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
286 	iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
287 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
288 	cmd->data.setdelvlan.vlan_id = i;
289 	return qeth_send_ipa_cmd(card, iob,
290 				 qeth_l2_send_setdelvlan_cb, NULL);
291 }
292 
293 static void qeth_l2_process_vlans(struct qeth_card *card)
294 {
295 	struct qeth_vlan_vid *id;
296 	QETH_CARD_TEXT(card, 3, "L2prcvln");
297 	spin_lock_bh(&card->vlanlock);
298 	list_for_each_entry(id, &card->vid_list, list) {
299 		qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
300 	}
301 	spin_unlock_bh(&card->vlanlock);
302 }
303 
304 static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
305 {
306 	struct qeth_card *card = dev->ml_priv;
307 	struct qeth_vlan_vid *id;
308 
309 	QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
310 	if (!vid)
311 		return 0;
312 	if (card->info.type == QETH_CARD_TYPE_OSM) {
313 		QETH_CARD_TEXT(card, 3, "aidOSM");
314 		return 0;
315 	}
316 	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
317 		QETH_CARD_TEXT(card, 3, "aidREC");
318 		return 0;
319 	}
320 	id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
321 	if (id) {
322 		id->vid = vid;
323 		qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
324 		spin_lock_bh(&card->vlanlock);
325 		list_add_tail(&id->list, &card->vid_list);
326 		spin_unlock_bh(&card->vlanlock);
327 	} else {
328 		return -ENOMEM;
329 	}
330 	return 0;
331 }
332 
333 static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
334 {
335 	struct qeth_vlan_vid *id, *tmpid = NULL;
336 	struct qeth_card *card = dev->ml_priv;
337 
338 	QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
339 	if (card->info.type == QETH_CARD_TYPE_OSM) {
340 		QETH_CARD_TEXT(card, 3, "kidOSM");
341 		return 0;
342 	}
343 	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
344 		QETH_CARD_TEXT(card, 3, "kidREC");
345 		return 0;
346 	}
347 	spin_lock_bh(&card->vlanlock);
348 	list_for_each_entry(id, &card->vid_list, list) {
349 		if (id->vid == vid) {
350 			list_del(&id->list);
351 			tmpid = id;
352 			break;
353 		}
354 	}
355 	spin_unlock_bh(&card->vlanlock);
356 	if (tmpid) {
357 		qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
358 		kfree(tmpid);
359 	}
360 	qeth_l2_set_multicast_list(card->dev);
361 	return 0;
362 }
363 
364 static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
365 {
366 	int rc = 0;
367 
368 	QETH_DBF_TEXT(SETUP , 2, "stopcard");
369 	QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
370 
371 	qeth_set_allowed_threads(card, 0, 1);
372 	if (card->read.state == CH_STATE_UP &&
373 	    card->write.state == CH_STATE_UP &&
374 	    (card->state == CARD_STATE_UP)) {
375 		if (recovery_mode &&
376 		    card->info.type != QETH_CARD_TYPE_OSN) {
377 			qeth_l2_stop(card->dev);
378 		} else {
379 			rtnl_lock();
380 			dev_close(card->dev);
381 			rtnl_unlock();
382 		}
383 		card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
384 		card->state = CARD_STATE_SOFTSETUP;
385 	}
386 	if (card->state == CARD_STATE_SOFTSETUP) {
387 		qeth_l2_del_all_mc(card, 0);
388 		qeth_clear_ipacmd_list(card);
389 		card->state = CARD_STATE_HARDSETUP;
390 	}
391 	if (card->state == CARD_STATE_HARDSETUP) {
392 		qeth_qdio_clear_card(card, 0);
393 		qeth_clear_qdio_buffers(card);
394 		qeth_clear_working_pool_list(card);
395 		card->state = CARD_STATE_DOWN;
396 	}
397 	if (card->state == CARD_STATE_DOWN) {
398 		qeth_clear_cmd_buffers(&card->read);
399 		qeth_clear_cmd_buffers(&card->write);
400 	}
401 	return rc;
402 }
403 
404 static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
405 				int budget, int *done)
406 {
407 	int work_done = 0;
408 	struct sk_buff *skb;
409 	struct qeth_hdr *hdr;
410 	unsigned int len;
411 
412 	*done = 0;
413 	BUG_ON(!budget);
414 	while (budget) {
415 		skb = qeth_core_get_next_skb(card,
416 			&card->qdio.in_q->bufs[card->rx.b_index],
417 			&card->rx.b_element, &card->rx.e_offset, &hdr);
418 		if (!skb) {
419 			*done = 1;
420 			break;
421 		}
422 		skb->dev = card->dev;
423 		switch (hdr->hdr.l2.id) {
424 		case QETH_HEADER_TYPE_LAYER2:
425 			skb->pkt_type = PACKET_HOST;
426 			skb->protocol = eth_type_trans(skb, skb->dev);
427 			skb->ip_summed = CHECKSUM_NONE;
428 			if (skb->protocol == htons(ETH_P_802_2))
429 				*((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
430 			len = skb->len;
431 			netif_receive_skb(skb);
432 			break;
433 		case QETH_HEADER_TYPE_OSN:
434 			if (card->info.type == QETH_CARD_TYPE_OSN) {
435 				skb_push(skb, sizeof(struct qeth_hdr));
436 				skb_copy_to_linear_data(skb, hdr,
437 						sizeof(struct qeth_hdr));
438 				len = skb->len;
439 				card->osn_info.data_cb(skb);
440 				break;
441 			}
442 			/* else unknown */
443 		default:
444 			dev_kfree_skb_any(skb);
445 			QETH_CARD_TEXT(card, 3, "inbunkno");
446 			QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
447 			continue;
448 		}
449 		work_done++;
450 		budget--;
451 		card->stats.rx_packets++;
452 		card->stats.rx_bytes += len;
453 	}
454 	return work_done;
455 }
456 
457 static int qeth_l2_poll(struct napi_struct *napi, int budget)
458 {
459 	struct qeth_card *card = container_of(napi, struct qeth_card, napi);
460 	int work_done = 0;
461 	struct qeth_qdio_buffer *buffer;
462 	int done;
463 	int new_budget = budget;
464 
465 	if (card->options.performance_stats) {
466 		card->perf_stats.inbound_cnt++;
467 		card->perf_stats.inbound_start_time = qeth_get_micros();
468 	}
469 
470 	while (1) {
471 		if (!card->rx.b_count) {
472 			card->rx.qdio_err = 0;
473 			card->rx.b_count = qdio_get_next_buffers(
474 				card->data.ccwdev, 0, &card->rx.b_index,
475 				&card->rx.qdio_err);
476 			if (card->rx.b_count <= 0) {
477 				card->rx.b_count = 0;
478 				break;
479 			}
480 			card->rx.b_element =
481 				&card->qdio.in_q->bufs[card->rx.b_index]
482 				.buffer->element[0];
483 			card->rx.e_offset = 0;
484 		}
485 
486 		while (card->rx.b_count) {
487 			buffer = &card->qdio.in_q->bufs[card->rx.b_index];
488 			if (!(card->rx.qdio_err &&
489 			    qeth_check_qdio_errors(card, buffer->buffer,
490 			    card->rx.qdio_err, "qinerr")))
491 				work_done += qeth_l2_process_inbound_buffer(
492 					card, new_budget, &done);
493 			else
494 				done = 1;
495 
496 			if (done) {
497 				if (card->options.performance_stats)
498 					card->perf_stats.bufs_rec++;
499 				qeth_put_buffer_pool_entry(card,
500 					buffer->pool_entry);
501 				qeth_queue_input_buffer(card, card->rx.b_index);
502 				card->rx.b_count--;
503 				if (card->rx.b_count) {
504 					card->rx.b_index =
505 						(card->rx.b_index + 1) %
506 						QDIO_MAX_BUFFERS_PER_Q;
507 					card->rx.b_element =
508 						&card->qdio.in_q
509 						->bufs[card->rx.b_index]
510 						.buffer->element[0];
511 					card->rx.e_offset = 0;
512 				}
513 			}
514 
515 			if (work_done >= budget)
516 				goto out;
517 			else
518 				new_budget = budget - work_done;
519 		}
520 	}
521 
522 	napi_complete(napi);
523 	if (qdio_start_irq(card->data.ccwdev, 0))
524 		napi_schedule(&card->napi);
525 out:
526 	if (card->options.performance_stats)
527 		card->perf_stats.inbound_time += qeth_get_micros() -
528 			card->perf_stats.inbound_start_time;
529 	return work_done;
530 }
531 
532 static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
533 			   enum qeth_ipa_cmds ipacmd,
534 			   int (*reply_cb) (struct qeth_card *,
535 					    struct qeth_reply*,
536 					    unsigned long))
537 {
538 	struct qeth_ipa_cmd *cmd;
539 	struct qeth_cmd_buffer *iob;
540 
541 	QETH_CARD_TEXT(card, 2, "L2sdmac");
542 	iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
543 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
544 	cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
545 	memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
546 	return qeth_send_ipa_cmd(card, iob, reply_cb, NULL);
547 }
548 
549 static int qeth_l2_send_setmac_cb(struct qeth_card *card,
550 			   struct qeth_reply *reply,
551 			   unsigned long data)
552 {
553 	struct qeth_ipa_cmd *cmd;
554 
555 	QETH_CARD_TEXT(card, 2, "L2Smaccb");
556 	cmd = (struct qeth_ipa_cmd *) data;
557 	if (cmd->hdr.return_code) {
558 		QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code);
559 		card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
560 		switch (cmd->hdr.return_code) {
561 		case IPA_RC_L2_DUP_MAC:
562 		case IPA_RC_L2_DUP_LAYER3_MAC:
563 			dev_warn(&card->gdev->dev,
564 				"MAC address %pM already exists\n",
565 				cmd->data.setdelmac.mac);
566 			break;
567 		case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
568 		case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
569 			dev_warn(&card->gdev->dev,
570 				"MAC address %pM is not authorized\n",
571 				cmd->data.setdelmac.mac);
572 			break;
573 		default:
574 			break;
575 		}
576 		cmd->hdr.return_code = -EIO;
577 	} else {
578 		card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
579 		memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac,
580 		       OSA_ADDR_LEN);
581 		dev_info(&card->gdev->dev,
582 			"MAC address %pM successfully registered on device %s\n",
583 			card->dev->dev_addr, card->dev->name);
584 	}
585 	return 0;
586 }
587 
588 static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
589 {
590 	QETH_CARD_TEXT(card, 2, "L2Setmac");
591 	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
592 					  qeth_l2_send_setmac_cb);
593 }
594 
595 static int qeth_l2_send_delmac_cb(struct qeth_card *card,
596 			   struct qeth_reply *reply,
597 			   unsigned long data)
598 {
599 	struct qeth_ipa_cmd *cmd;
600 
601 	QETH_CARD_TEXT(card, 2, "L2Dmaccb");
602 	cmd = (struct qeth_ipa_cmd *) data;
603 	if (cmd->hdr.return_code) {
604 		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
605 		cmd->hdr.return_code = -EIO;
606 		return 0;
607 	}
608 	card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
609 
610 	return 0;
611 }
612 
613 static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
614 {
615 	QETH_CARD_TEXT(card, 2, "L2Delmac");
616 	if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
617 		return 0;
618 	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
619 					  qeth_l2_send_delmac_cb);
620 }
621 
622 static int qeth_l2_request_initial_mac(struct qeth_card *card)
623 {
624 	int rc = 0;
625 	char vendor_pre[] = {0x02, 0x00, 0x00};
626 
627 	QETH_DBF_TEXT(SETUP, 2, "doL2init");
628 	QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
629 
630 	rc = qeth_query_setadapterparms(card);
631 	if (rc) {
632 		QETH_DBF_MESSAGE(2, "could not query adapter parameters on "
633 			"device %s: x%x\n", CARD_BUS_ID(card), rc);
634 	}
635 
636 	if (card->info.type == QETH_CARD_TYPE_IQD ||
637 	    card->info.type == QETH_CARD_TYPE_OSM ||
638 	    card->info.type == QETH_CARD_TYPE_OSX ||
639 	    card->info.guestlan) {
640 		rc = qeth_setadpparms_change_macaddr(card);
641 		if (rc) {
642 			QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
643 				"device %s: x%x\n", CARD_BUS_ID(card), rc);
644 			QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
645 			return rc;
646 		}
647 		QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
648 	} else {
649 		random_ether_addr(card->dev->dev_addr);
650 		memcpy(card->dev->dev_addr, vendor_pre, 3);
651 	}
652 	return 0;
653 }
654 
655 static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
656 {
657 	struct sockaddr *addr = p;
658 	struct qeth_card *card = dev->ml_priv;
659 	int rc = 0;
660 
661 	QETH_CARD_TEXT(card, 3, "setmac");
662 
663 	if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
664 		QETH_CARD_TEXT(card, 3, "setmcINV");
665 		return -EOPNOTSUPP;
666 	}
667 
668 	if (card->info.type == QETH_CARD_TYPE_OSN ||
669 	    card->info.type == QETH_CARD_TYPE_OSM ||
670 	    card->info.type == QETH_CARD_TYPE_OSX) {
671 		QETH_CARD_TEXT(card, 3, "setmcTYP");
672 		return -EOPNOTSUPP;
673 	}
674 	QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);
675 	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
676 		QETH_CARD_TEXT(card, 3, "setmcREC");
677 		return -ERESTARTSYS;
678 	}
679 	rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
680 	if (!rc)
681 		rc = qeth_l2_send_setmac(card, addr->sa_data);
682 	return rc;
683 }
684 
685 static void qeth_l2_set_multicast_list(struct net_device *dev)
686 {
687 	struct qeth_card *card = dev->ml_priv;
688 	struct netdev_hw_addr *ha;
689 
690 	if (card->info.type == QETH_CARD_TYPE_OSN)
691 		return ;
692 
693 	QETH_CARD_TEXT(card, 3, "setmulti");
694 	if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
695 	    (card->state != CARD_STATE_UP))
696 		return;
697 	qeth_l2_del_all_mc(card, 1);
698 	spin_lock_bh(&card->mclock);
699 	netdev_for_each_mc_addr(ha, dev)
700 		qeth_l2_add_mc(card, ha->addr, 0);
701 
702 	netdev_for_each_uc_addr(ha, dev)
703 		qeth_l2_add_mc(card, ha->addr, 1);
704 
705 	spin_unlock_bh(&card->mclock);
706 	if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
707 		return;
708 	qeth_setadp_promisc_mode(card);
709 }
710 
711 static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
712 {
713 	int rc;
714 	struct qeth_hdr *hdr = NULL;
715 	int elements = 0;
716 	struct qeth_card *card = dev->ml_priv;
717 	struct sk_buff *new_skb = skb;
718 	int ipv = qeth_get_ip_version(skb);
719 	int cast_type = qeth_l2_get_cast_type(card, skb);
720 	struct qeth_qdio_out_q *queue = card->qdio.out_qs
721 		[qeth_get_priority_queue(card, skb, ipv, cast_type)];
722 	int tx_bytes = skb->len;
723 	int data_offset = -1;
724 	int elements_needed = 0;
725 	int hd_len = 0;
726 
727 	if ((card->state != CARD_STATE_UP) || !card->lan_online) {
728 		card->stats.tx_carrier_errors++;
729 		goto tx_drop;
730 	}
731 
732 	if ((card->info.type == QETH_CARD_TYPE_OSN) &&
733 	    (skb->protocol == htons(ETH_P_IPV6)))
734 		goto tx_drop;
735 
736 	if (card->options.performance_stats) {
737 		card->perf_stats.outbound_cnt++;
738 		card->perf_stats.outbound_start_time = qeth_get_micros();
739 	}
740 	netif_stop_queue(dev);
741 
742 	if (card->info.type == QETH_CARD_TYPE_OSN)
743 		hdr = (struct qeth_hdr *)skb->data;
744 	else {
745 		if (card->info.type == QETH_CARD_TYPE_IQD) {
746 			new_skb = skb;
747 			data_offset = ETH_HLEN;
748 			hd_len = ETH_HLEN;
749 			hdr = kmem_cache_alloc(qeth_core_header_cache,
750 						GFP_ATOMIC);
751 			if (!hdr)
752 				goto tx_drop;
753 			elements_needed++;
754 			skb_reset_mac_header(new_skb);
755 			qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type);
756 			hdr->hdr.l2.pkt_length = new_skb->len;
757 			memcpy(((char *)hdr) + sizeof(struct qeth_hdr),
758 				skb_mac_header(new_skb), ETH_HLEN);
759 		} else {
760 			/* create a clone with writeable headroom */
761 			new_skb = skb_realloc_headroom(skb,
762 						sizeof(struct qeth_hdr));
763 			if (!new_skb)
764 				goto tx_drop;
765 			hdr = (struct qeth_hdr *)skb_push(new_skb,
766 						sizeof(struct qeth_hdr));
767 			skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
768 			qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type);
769 		}
770 	}
771 
772 	elements = qeth_get_elements_no(card, (void *)hdr, new_skb,
773 						elements_needed);
774 	if (!elements) {
775 		if (data_offset >= 0)
776 			kmem_cache_free(qeth_core_header_cache, hdr);
777 		goto tx_drop;
778 	}
779 
780 	if (card->info.type != QETH_CARD_TYPE_IQD) {
781 		if (qeth_hdr_chk_and_bounce(new_skb,
782 		    sizeof(struct qeth_hdr_layer2)))
783 			goto tx_drop;
784 		rc = qeth_do_send_packet(card, queue, new_skb, hdr,
785 					 elements);
786 	} else
787 		rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
788 					elements, data_offset, hd_len);
789 	if (!rc) {
790 		card->stats.tx_packets++;
791 		card->stats.tx_bytes += tx_bytes;
792 		if (new_skb != skb)
793 			dev_kfree_skb_any(skb);
794 		rc = NETDEV_TX_OK;
795 	} else {
796 		if (data_offset >= 0)
797 			kmem_cache_free(qeth_core_header_cache, hdr);
798 
799 		if (rc == -EBUSY) {
800 			if (new_skb != skb)
801 				dev_kfree_skb_any(new_skb);
802 			return NETDEV_TX_BUSY;
803 		} else
804 			goto tx_drop;
805 	}
806 
807 	netif_wake_queue(dev);
808 	if (card->options.performance_stats)
809 		card->perf_stats.outbound_time += qeth_get_micros() -
810 			card->perf_stats.outbound_start_time;
811 	return rc;
812 
813 tx_drop:
814 	card->stats.tx_dropped++;
815 	card->stats.tx_errors++;
816 	if ((new_skb != skb) && new_skb)
817 		dev_kfree_skb_any(new_skb);
818 	dev_kfree_skb_any(skb);
819 	netif_wake_queue(dev);
820 	return NETDEV_TX_OK;
821 }
822 
823 static int __qeth_l2_open(struct net_device *dev)
824 {
825 	struct qeth_card *card = dev->ml_priv;
826 	int rc = 0;
827 
828 	QETH_CARD_TEXT(card, 4, "qethopen");
829 	if (card->state == CARD_STATE_UP)
830 		return rc;
831 	if (card->state != CARD_STATE_SOFTSETUP)
832 		return -ENODEV;
833 
834 	if ((card->info.type != QETH_CARD_TYPE_OSN) &&
835 	     (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
836 		QETH_CARD_TEXT(card, 4, "nomacadr");
837 		return -EPERM;
838 	}
839 	card->data.state = CH_STATE_UP;
840 	card->state = CARD_STATE_UP;
841 	netif_start_queue(dev);
842 
843 	if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) {
844 		napi_enable(&card->napi);
845 		napi_schedule(&card->napi);
846 	} else
847 		rc = -EIO;
848 	return rc;
849 }
850 
851 static int qeth_l2_open(struct net_device *dev)
852 {
853 	struct qeth_card *card = dev->ml_priv;
854 
855 	QETH_CARD_TEXT(card, 5, "qethope_");
856 	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
857 		QETH_CARD_TEXT(card, 3, "openREC");
858 		return -ERESTARTSYS;
859 	}
860 	return __qeth_l2_open(dev);
861 }
862 
863 static int qeth_l2_stop(struct net_device *dev)
864 {
865 	struct qeth_card *card = dev->ml_priv;
866 
867 	QETH_CARD_TEXT(card, 4, "qethstop");
868 	netif_tx_disable(dev);
869 	if (card->state == CARD_STATE_UP) {
870 		card->state = CARD_STATE_SOFTSETUP;
871 		napi_disable(&card->napi);
872 	}
873 	return 0;
874 }
875 
876 static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
877 {
878 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
879 
880 	INIT_LIST_HEAD(&card->vid_list);
881 	INIT_LIST_HEAD(&card->mc_list);
882 	card->options.layer2 = 1;
883 	card->info.hwtrap = 0;
884 	card->discipline.start_poll = qeth_qdio_start_poll;
885 	card->discipline.input_handler = (qdio_handler_t *)
886 		qeth_qdio_input_handler;
887 	card->discipline.output_handler = (qdio_handler_t *)
888 		qeth_qdio_output_handler;
889 	card->discipline.recover = qeth_l2_recover;
890 	return 0;
891 }
892 
893 static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
894 {
895 	struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
896 
897 	qeth_set_allowed_threads(card, 0, 1);
898 	wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
899 
900 	if (cgdev->state == CCWGROUP_ONLINE)
901 		qeth_l2_set_offline(cgdev);
902 
903 	if (card->dev) {
904 		unregister_netdev(card->dev);
905 		card->dev = NULL;
906 	}
907 	return;
908 }
909 
910 static const struct ethtool_ops qeth_l2_ethtool_ops = {
911 	.get_link = ethtool_op_get_link,
912 	.get_strings = qeth_core_get_strings,
913 	.get_ethtool_stats = qeth_core_get_ethtool_stats,
914 	.get_sset_count = qeth_core_get_sset_count,
915 	.get_drvinfo = qeth_core_get_drvinfo,
916 	.get_settings = qeth_core_ethtool_get_settings,
917 };
918 
919 static const struct ethtool_ops qeth_l2_osn_ops = {
920 	.get_strings = qeth_core_get_strings,
921 	.get_ethtool_stats = qeth_core_get_ethtool_stats,
922 	.get_sset_count = qeth_core_get_sset_count,
923 	.get_drvinfo = qeth_core_get_drvinfo,
924 };
925 
926 static const struct net_device_ops qeth_l2_netdev_ops = {
927 	.ndo_open		= qeth_l2_open,
928 	.ndo_stop		= qeth_l2_stop,
929 	.ndo_get_stats		= qeth_get_stats,
930 	.ndo_start_xmit		= qeth_l2_hard_start_xmit,
931 	.ndo_validate_addr	= eth_validate_addr,
932 	.ndo_set_rx_mode	= qeth_l2_set_multicast_list,
933 	.ndo_do_ioctl	   	= qeth_l2_do_ioctl,
934 	.ndo_set_mac_address    = qeth_l2_set_mac_address,
935 	.ndo_change_mtu	   	= qeth_change_mtu,
936 	.ndo_vlan_rx_add_vid	= qeth_l2_vlan_rx_add_vid,
937 	.ndo_vlan_rx_kill_vid   = qeth_l2_vlan_rx_kill_vid,
938 	.ndo_tx_timeout	   	= qeth_tx_timeout,
939 };
940 
941 static int qeth_l2_setup_netdev(struct qeth_card *card)
942 {
943 	switch (card->info.type) {
944 	case QETH_CARD_TYPE_IQD:
945 		card->dev = alloc_netdev(0, "hsi%d", ether_setup);
946 		break;
947 	case QETH_CARD_TYPE_OSN:
948 		card->dev = alloc_netdev(0, "osn%d", ether_setup);
949 		card->dev->flags |= IFF_NOARP;
950 		break;
951 	default:
952 		card->dev = alloc_etherdev(0);
953 	}
954 
955 	if (!card->dev)
956 		return -ENODEV;
957 
958 	card->dev->ml_priv = card;
959 	card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
960 	card->dev->mtu = card->info.initial_mtu;
961 	card->dev->netdev_ops = &qeth_l2_netdev_ops;
962 	if (card->info.type != QETH_CARD_TYPE_OSN)
963 		SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops);
964 	else
965 		SET_ETHTOOL_OPS(card->dev, &qeth_l2_osn_ops);
966 	card->dev->features |= NETIF_F_HW_VLAN_FILTER;
967 	card->info.broadcast_capable = 1;
968 	qeth_l2_request_initial_mac(card);
969 	SET_NETDEV_DEV(card->dev, &card->gdev->dev);
970 	netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
971 	return register_netdev(card->dev);
972 }
973 
974 static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
975 {
976 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
977 	int rc = 0;
978 	enum qeth_card_states recover_flag;
979 
980 	BUG_ON(!card);
981 	mutex_lock(&card->discipline_mutex);
982 	mutex_lock(&card->conf_mutex);
983 	QETH_DBF_TEXT(SETUP, 2, "setonlin");
984 	QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
985 
986 	recover_flag = card->state;
987 	rc = qeth_core_hardsetup_card(card);
988 	if (rc) {
989 		QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
990 		rc = -ENODEV;
991 		goto out_remove;
992 	}
993 
994 	if (!card->dev && qeth_l2_setup_netdev(card)) {
995 		rc = -ENODEV;
996 		goto out_remove;
997 	}
998 
999 	if (card->info.type != QETH_CARD_TYPE_OSN)
1000 		qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
1001 
1002 	if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
1003 		if (card->info.hwtrap &&
1004 		    qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
1005 			card->info.hwtrap = 0;
1006 	} else
1007 		card->info.hwtrap = 0;
1008 
1009 	card->state = CARD_STATE_HARDSETUP;
1010 	memset(&card->rx, 0, sizeof(struct qeth_rx));
1011 	qeth_print_status_message(card);
1012 
1013 	/* softsetup */
1014 	QETH_DBF_TEXT(SETUP, 2, "softsetp");
1015 
1016 	rc = qeth_send_startlan(card);
1017 	if (rc) {
1018 		QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1019 		if (rc == 0xe080) {
1020 			dev_warn(&card->gdev->dev,
1021 				"The LAN is offline\n");
1022 			card->lan_online = 0;
1023 			goto contin;
1024 		}
1025 		rc = -ENODEV;
1026 		goto out_remove;
1027 	} else
1028 		card->lan_online = 1;
1029 
1030 contin:
1031 	if ((card->info.type == QETH_CARD_TYPE_OSD) ||
1032 	    (card->info.type == QETH_CARD_TYPE_OSX))
1033 		/* configure isolation level */
1034 		qeth_set_access_ctrl_online(card);
1035 
1036 	if (card->info.type != QETH_CARD_TYPE_OSN &&
1037 	    card->info.type != QETH_CARD_TYPE_OSM)
1038 		qeth_l2_process_vlans(card);
1039 
1040 	netif_tx_disable(card->dev);
1041 
1042 	rc = qeth_init_qdio_queues(card);
1043 	if (rc) {
1044 		QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
1045 		rc = -ENODEV;
1046 		goto out_remove;
1047 	}
1048 	card->state = CARD_STATE_SOFTSETUP;
1049 	if (card->lan_online)
1050 		netif_carrier_on(card->dev);
1051 	else
1052 		netif_carrier_off(card->dev);
1053 
1054 	qeth_set_allowed_threads(card, 0xffffffff, 0);
1055 	if (recover_flag == CARD_STATE_RECOVER) {
1056 		if (recovery_mode &&
1057 		    card->info.type != QETH_CARD_TYPE_OSN) {
1058 			__qeth_l2_open(card->dev);
1059 		} else {
1060 			rtnl_lock();
1061 			dev_open(card->dev);
1062 			rtnl_unlock();
1063 		}
1064 		/* this also sets saved unicast addresses */
1065 		qeth_l2_set_multicast_list(card->dev);
1066 	}
1067 	/* let user_space know that device is online */
1068 	kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
1069 	mutex_unlock(&card->conf_mutex);
1070 	mutex_unlock(&card->discipline_mutex);
1071 	return 0;
1072 
1073 out_remove:
1074 	qeth_l2_stop_card(card, 0);
1075 	ccw_device_set_offline(CARD_DDEV(card));
1076 	ccw_device_set_offline(CARD_WDEV(card));
1077 	ccw_device_set_offline(CARD_RDEV(card));
1078 	if (recover_flag == CARD_STATE_RECOVER)
1079 		card->state = CARD_STATE_RECOVER;
1080 	else
1081 		card->state = CARD_STATE_DOWN;
1082 	mutex_unlock(&card->conf_mutex);
1083 	mutex_unlock(&card->discipline_mutex);
1084 	return rc;
1085 }
1086 
1087 static int qeth_l2_set_online(struct ccwgroup_device *gdev)
1088 {
1089 	return __qeth_l2_set_online(gdev, 0);
1090 }
1091 
1092 static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1093 					int recovery_mode)
1094 {
1095 	struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
1096 	int rc = 0, rc2 = 0, rc3 = 0;
1097 	enum qeth_card_states recover_flag;
1098 
1099 	mutex_lock(&card->discipline_mutex);
1100 	mutex_lock(&card->conf_mutex);
1101 	QETH_DBF_TEXT(SETUP, 3, "setoffl");
1102 	QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
1103 
1104 	if (card->dev && netif_carrier_ok(card->dev))
1105 		netif_carrier_off(card->dev);
1106 	recover_flag = card->state;
1107 	if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
1108 		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1109 		card->info.hwtrap = 1;
1110 	}
1111 	qeth_l2_stop_card(card, recovery_mode);
1112 	rc  = ccw_device_set_offline(CARD_DDEV(card));
1113 	rc2 = ccw_device_set_offline(CARD_WDEV(card));
1114 	rc3 = ccw_device_set_offline(CARD_RDEV(card));
1115 	if (!rc)
1116 		rc = (rc2) ? rc2 : rc3;
1117 	if (rc)
1118 		QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1119 	if (recover_flag == CARD_STATE_UP)
1120 		card->state = CARD_STATE_RECOVER;
1121 	/* let user_space know that device is offline */
1122 	kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
1123 	mutex_unlock(&card->conf_mutex);
1124 	mutex_unlock(&card->discipline_mutex);
1125 	return 0;
1126 }
1127 
1128 static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
1129 {
1130 	return __qeth_l2_set_offline(cgdev, 0);
1131 }
1132 
1133 static int qeth_l2_recover(void *ptr)
1134 {
1135 	struct qeth_card *card;
1136 	int rc = 0;
1137 
1138 	card = (struct qeth_card *) ptr;
1139 	QETH_CARD_TEXT(card, 2, "recover1");
1140 	if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
1141 		return 0;
1142 	QETH_CARD_TEXT(card, 2, "recover2");
1143 	dev_warn(&card->gdev->dev,
1144 		"A recovery process has been started for the device\n");
1145 	__qeth_l2_set_offline(card->gdev, 1);
1146 	rc = __qeth_l2_set_online(card->gdev, 1);
1147 	if (!rc)
1148 		dev_info(&card->gdev->dev,
1149 			"Device successfully recovered!\n");
1150 	else {
1151 		rtnl_lock();
1152 		dev_close(card->dev);
1153 		rtnl_unlock();
1154 		dev_warn(&card->gdev->dev, "The qeth device driver "
1155 			"failed to recover an error on the device\n");
1156 	}
1157 	qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1158 	qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
1159 	return 0;
1160 }
1161 
1162 static int __init qeth_l2_init(void)
1163 {
1164 	pr_info("register layer 2 discipline\n");
1165 	return 0;
1166 }
1167 
1168 static void __exit qeth_l2_exit(void)
1169 {
1170 	pr_info("unregister layer 2 discipline\n");
1171 }
1172 
1173 static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1174 {
1175 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1176 	qeth_set_allowed_threads(card, 0, 1);
1177 	if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
1178 		qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1179 	qeth_qdio_clear_card(card, 0);
1180 	qeth_clear_qdio_buffers(card);
1181 }
1182 
1183 static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1184 {
1185 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1186 
1187 	if (card->dev)
1188 		netif_device_detach(card->dev);
1189 	qeth_set_allowed_threads(card, 0, 1);
1190 	wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
1191 	if (gdev->state == CCWGROUP_OFFLINE)
1192 		return 0;
1193 	if (card->state == CARD_STATE_UP) {
1194 		if (card->info.hwtrap)
1195 			qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1196 		__qeth_l2_set_offline(card->gdev, 1);
1197 	} else
1198 		__qeth_l2_set_offline(card->gdev, 0);
1199 	return 0;
1200 }
1201 
1202 static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
1203 {
1204 	struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1205 	int rc = 0;
1206 
1207 	if (gdev->state == CCWGROUP_OFFLINE)
1208 		goto out;
1209 
1210 	if (card->state == CARD_STATE_RECOVER) {
1211 		rc = __qeth_l2_set_online(card->gdev, 1);
1212 		if (rc) {
1213 			rtnl_lock();
1214 			dev_close(card->dev);
1215 			rtnl_unlock();
1216 		}
1217 	} else
1218 		rc = __qeth_l2_set_online(card->gdev, 0);
1219 out:
1220 	qeth_set_allowed_threads(card, 0xffffffff, 0);
1221 	if (card->dev)
1222 		netif_device_attach(card->dev);
1223 	if (rc)
1224 		dev_warn(&card->gdev->dev, "The qeth device driver "
1225 			"failed to recover an error on the device\n");
1226 	return rc;
1227 }
1228 
1229 struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
1230 	.probe = qeth_l2_probe_device,
1231 	.remove = qeth_l2_remove_device,
1232 	.set_online = qeth_l2_set_online,
1233 	.set_offline = qeth_l2_set_offline,
1234 	.shutdown = qeth_l2_shutdown,
1235 	.freeze = qeth_l2_pm_suspend,
1236 	.thaw = qeth_l2_pm_resume,
1237 	.restore = qeth_l2_pm_resume,
1238 };
1239 EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver);
1240 
1241 static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1242 			   struct qeth_cmd_buffer *iob)
1243 {
1244 	unsigned long flags;
1245 	int rc = 0;
1246 
1247 	QETH_CARD_TEXT(card, 5, "osndctrd");
1248 
1249 	wait_event(card->wait_q,
1250 		   atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1251 	qeth_prepare_control_data(card, len, iob);
1252 	QETH_CARD_TEXT(card, 6, "osnoirqp");
1253 	spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1254 	rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1255 			      (addr_t) iob, 0, 0);
1256 	spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1257 	if (rc) {
1258 		QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "
1259 			   "ccw_device_start rc = %i\n", rc);
1260 		QETH_CARD_TEXT_(card, 2, " err%d", rc);
1261 		qeth_release_buffer(iob->channel, iob);
1262 		atomic_set(&card->write.irq_pending, 0);
1263 		wake_up(&card->wait_q);
1264 	}
1265 	return rc;
1266 }
1267 
1268 static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
1269 			struct qeth_cmd_buffer *iob, int data_len)
1270 {
1271 	u16 s1, s2;
1272 
1273 	QETH_CARD_TEXT(card, 4, "osndipa");
1274 
1275 	qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1276 	s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1277 	s2 = (u16)data_len;
1278 	memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1279 	memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1280 	memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1281 	memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1282 	return qeth_osn_send_control_data(card, s1, iob);
1283 }
1284 
1285 int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
1286 {
1287 	struct qeth_cmd_buffer *iob;
1288 	struct qeth_card *card;
1289 	int rc;
1290 
1291 	if (!dev)
1292 		return -ENODEV;
1293 	card = dev->ml_priv;
1294 	if (!card)
1295 		return -ENODEV;
1296 	QETH_CARD_TEXT(card, 2, "osnsdmc");
1297 	if ((card->state != CARD_STATE_UP) &&
1298 	    (card->state != CARD_STATE_SOFTSETUP))
1299 		return -ENODEV;
1300 	iob = qeth_wait_for_buffer(&card->write);
1301 	memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
1302 	rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
1303 	return rc;
1304 }
1305 EXPORT_SYMBOL(qeth_osn_assist);
1306 
1307 int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
1308 		  int (*assist_cb)(struct net_device *, void *),
1309 		  int (*data_cb)(struct sk_buff *))
1310 {
1311 	struct qeth_card *card;
1312 
1313 	*dev = qeth_l2_netdev_by_devno(read_dev_no);
1314 	if (*dev == NULL)
1315 		return -ENODEV;
1316 	card = (*dev)->ml_priv;
1317 	if (!card)
1318 		return -ENODEV;
1319 	QETH_CARD_TEXT(card, 2, "osnreg");
1320 	if ((assist_cb == NULL) || (data_cb == NULL))
1321 		return -EINVAL;
1322 	card->osn_info.assist_cb = assist_cb;
1323 	card->osn_info.data_cb = data_cb;
1324 	return 0;
1325 }
1326 EXPORT_SYMBOL(qeth_osn_register);
1327 
1328 void qeth_osn_deregister(struct net_device *dev)
1329 {
1330 	struct qeth_card *card;
1331 
1332 	if (!dev)
1333 		return;
1334 	card = dev->ml_priv;
1335 	if (!card)
1336 		return;
1337 	QETH_CARD_TEXT(card, 2, "osndereg");
1338 	card->osn_info.assist_cb = NULL;
1339 	card->osn_info.data_cb = NULL;
1340 	return;
1341 }
1342 EXPORT_SYMBOL(qeth_osn_deregister);
1343 
1344 module_init(qeth_l2_init);
1345 module_exit(qeth_l2_exit);
1346 MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
1347 MODULE_DESCRIPTION("qeth layer 2 discipline");
1348 MODULE_LICENSE("GPL");
1349