xref: /openbmc/linux/drivers/s390/net/qeth_core_sys.c (revision f42b3800)
1 /*
2  *  drivers/s390/net/qeth_core_sys.c
3  *
4  *    Copyright IBM Corp. 2007
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 #include <linux/list.h>
12 #include <linux/rwsem.h>
13 #include <asm/ebcdic.h>
14 
15 #include "qeth_core.h"
16 
17 static ssize_t qeth_dev_state_show(struct device *dev,
18 				struct device_attribute *attr, char *buf)
19 {
20 	struct qeth_card *card = dev_get_drvdata(dev);
21 	if (!card)
22 		return -EINVAL;
23 
24 	switch (card->state) {
25 	case CARD_STATE_DOWN:
26 		return sprintf(buf, "DOWN\n");
27 	case CARD_STATE_HARDSETUP:
28 		return sprintf(buf, "HARDSETUP\n");
29 	case CARD_STATE_SOFTSETUP:
30 		return sprintf(buf, "SOFTSETUP\n");
31 	case CARD_STATE_UP:
32 		if (card->lan_online)
33 		return sprintf(buf, "UP (LAN ONLINE)\n");
34 		else
35 			return sprintf(buf, "UP (LAN OFFLINE)\n");
36 	case CARD_STATE_RECOVER:
37 		return sprintf(buf, "RECOVER\n");
38 	default:
39 		return sprintf(buf, "UNKNOWN\n");
40 	}
41 }
42 
43 static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
44 
45 static ssize_t qeth_dev_chpid_show(struct device *dev,
46 				struct device_attribute *attr, char *buf)
47 {
48 	struct qeth_card *card = dev_get_drvdata(dev);
49 	if (!card)
50 		return -EINVAL;
51 
52 	return sprintf(buf, "%02X\n", card->info.chpid);
53 }
54 
55 static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
56 
57 static ssize_t qeth_dev_if_name_show(struct device *dev,
58 				struct device_attribute *attr, char *buf)
59 {
60 	struct qeth_card *card = dev_get_drvdata(dev);
61 	if (!card)
62 		return -EINVAL;
63 	return sprintf(buf, "%s\n", QETH_CARD_IFNAME(card));
64 }
65 
66 static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
67 
68 static ssize_t qeth_dev_card_type_show(struct device *dev,
69 				struct device_attribute *attr, char *buf)
70 {
71 	struct qeth_card *card = dev_get_drvdata(dev);
72 	if (!card)
73 		return -EINVAL;
74 
75 	return sprintf(buf, "%s\n", qeth_get_cardname_short(card));
76 }
77 
78 static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
79 
80 static inline const char *qeth_get_bufsize_str(struct qeth_card *card)
81 {
82 	if (card->qdio.in_buf_size == 16384)
83 		return "16k";
84 	else if (card->qdio.in_buf_size == 24576)
85 		return "24k";
86 	else if (card->qdio.in_buf_size == 32768)
87 		return "32k";
88 	else if (card->qdio.in_buf_size == 40960)
89 		return "40k";
90 	else
91 		return "64k";
92 }
93 
94 static ssize_t qeth_dev_inbuf_size_show(struct device *dev,
95 				struct device_attribute *attr, char *buf)
96 {
97 	struct qeth_card *card = dev_get_drvdata(dev);
98 	if (!card)
99 		return -EINVAL;
100 
101 	return sprintf(buf, "%s\n", qeth_get_bufsize_str(card));
102 }
103 
104 static DEVICE_ATTR(inbuf_size, 0444, qeth_dev_inbuf_size_show, NULL);
105 
106 static ssize_t qeth_dev_portno_show(struct device *dev,
107 			struct device_attribute *attr, char *buf)
108 {
109 	struct qeth_card *card = dev_get_drvdata(dev);
110 	if (!card)
111 		return -EINVAL;
112 
113 	return sprintf(buf, "%i\n", card->info.portno);
114 }
115 
116 static ssize_t qeth_dev_portno_store(struct device *dev,
117 		struct device_attribute *attr, const char *buf, size_t count)
118 {
119 	struct qeth_card *card = dev_get_drvdata(dev);
120 	char *tmp;
121 	unsigned int portno;
122 
123 	if (!card)
124 		return -EINVAL;
125 
126 	if ((card->state != CARD_STATE_DOWN) &&
127 	    (card->state != CARD_STATE_RECOVER))
128 		return -EPERM;
129 
130 	portno = simple_strtoul(buf, &tmp, 16);
131 	if (portno > QETH_MAX_PORTNO) {
132 		PRINT_WARN("portno 0x%X is out of range\n", portno);
133 		return -EINVAL;
134 	}
135 
136 	card->info.portno = portno;
137 	return count;
138 }
139 
140 static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
141 
142 static ssize_t qeth_dev_portname_show(struct device *dev,
143 				struct device_attribute *attr, char *buf)
144 {
145 	struct qeth_card *card = dev_get_drvdata(dev);
146 	char portname[9] = {0, };
147 
148 	if (!card)
149 		return -EINVAL;
150 
151 	if (card->info.portname_required) {
152 		memcpy(portname, card->info.portname + 1, 8);
153 		EBCASC(portname, 8);
154 		return sprintf(buf, "%s\n", portname);
155 	} else
156 		return sprintf(buf, "no portname required\n");
157 }
158 
159 static ssize_t qeth_dev_portname_store(struct device *dev,
160 		struct device_attribute *attr, const char *buf, size_t count)
161 {
162 	struct qeth_card *card = dev_get_drvdata(dev);
163 	char *tmp;
164 	int i;
165 
166 	if (!card)
167 		return -EINVAL;
168 
169 	if ((card->state != CARD_STATE_DOWN) &&
170 	    (card->state != CARD_STATE_RECOVER))
171 		return -EPERM;
172 
173 	tmp = strsep((char **) &buf, "\n");
174 	if ((strlen(tmp) > 8) || (strlen(tmp) == 0))
175 		return -EINVAL;
176 
177 	card->info.portname[0] = strlen(tmp);
178 	/* for beauty reasons */
179 	for (i = 1; i < 9; i++)
180 		card->info.portname[i] = ' ';
181 	strcpy(card->info.portname + 1, tmp);
182 	ASCEBC(card->info.portname + 1, 8);
183 
184 	return count;
185 }
186 
187 static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
188 		qeth_dev_portname_store);
189 
190 static ssize_t qeth_dev_prioqing_show(struct device *dev,
191 				struct device_attribute *attr, char *buf)
192 {
193 	struct qeth_card *card = dev_get_drvdata(dev);
194 
195 	if (!card)
196 		return -EINVAL;
197 
198 	switch (card->qdio.do_prio_queueing) {
199 	case QETH_PRIO_Q_ING_PREC:
200 		return sprintf(buf, "%s\n", "by precedence");
201 	case QETH_PRIO_Q_ING_TOS:
202 		return sprintf(buf, "%s\n", "by type of service");
203 	default:
204 		return sprintf(buf, "always queue %i\n",
205 			       card->qdio.default_out_queue);
206 	}
207 }
208 
209 static ssize_t qeth_dev_prioqing_store(struct device *dev,
210 		struct device_attribute *attr, const char *buf, size_t count)
211 {
212 	struct qeth_card *card = dev_get_drvdata(dev);
213 	char *tmp;
214 
215 	if (!card)
216 		return -EINVAL;
217 
218 	if ((card->state != CARD_STATE_DOWN) &&
219 	    (card->state != CARD_STATE_RECOVER))
220 		return -EPERM;
221 
222 	/* check if 1920 devices are supported ,
223 	 * if though we have to permit priority queueing
224 	 */
225 	if (card->qdio.no_out_queues == 1) {
226 		PRINT_WARN("Priority queueing disabled due "
227 			   "to hardware limitations!\n");
228 		card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
229 		return -EPERM;
230 	}
231 
232 	tmp = strsep((char **) &buf, "\n");
233 	if (!strcmp(tmp, "prio_queueing_prec"))
234 		card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_PREC;
235 	else if (!strcmp(tmp, "prio_queueing_tos"))
236 		card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_TOS;
237 	else if (!strcmp(tmp, "no_prio_queueing:0")) {
238 		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
239 		card->qdio.default_out_queue = 0;
240 	} else if (!strcmp(tmp, "no_prio_queueing:1")) {
241 		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
242 		card->qdio.default_out_queue = 1;
243 	} else if (!strcmp(tmp, "no_prio_queueing:2")) {
244 		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
245 		card->qdio.default_out_queue = 2;
246 	} else if (!strcmp(tmp, "no_prio_queueing:3")) {
247 		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
248 		card->qdio.default_out_queue = 3;
249 	} else if (!strcmp(tmp, "no_prio_queueing")) {
250 		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
251 		card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
252 	} else {
253 		PRINT_WARN("Unknown queueing type '%s'\n", tmp);
254 		return -EINVAL;
255 	}
256 	return count;
257 }
258 
259 static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
260 		qeth_dev_prioqing_store);
261 
262 static ssize_t qeth_dev_bufcnt_show(struct device *dev,
263 				struct device_attribute *attr, char *buf)
264 {
265 	struct qeth_card *card = dev_get_drvdata(dev);
266 
267 	if (!card)
268 		return -EINVAL;
269 
270 	return sprintf(buf, "%i\n", card->qdio.in_buf_pool.buf_count);
271 }
272 
273 static ssize_t qeth_dev_bufcnt_store(struct device *dev,
274 		struct device_attribute *attr, const char *buf, size_t count)
275 {
276 	struct qeth_card *card = dev_get_drvdata(dev);
277 	char *tmp;
278 	int cnt, old_cnt;
279 	int rc;
280 
281 	if (!card)
282 		return -EINVAL;
283 
284 	if ((card->state != CARD_STATE_DOWN) &&
285 	    (card->state != CARD_STATE_RECOVER))
286 		return -EPERM;
287 
288 	old_cnt = card->qdio.in_buf_pool.buf_count;
289 	cnt = simple_strtoul(buf, &tmp, 10);
290 	cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN :
291 		((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt);
292 	if (old_cnt != cnt) {
293 		rc = qeth_realloc_buffer_pool(card, cnt);
294 		if (rc)
295 			PRINT_WARN("Error (%d) while setting "
296 				   "buffer count.\n", rc);
297 	}
298 	return count;
299 }
300 
301 static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
302 		qeth_dev_bufcnt_store);
303 
304 static ssize_t qeth_dev_recover_store(struct device *dev,
305 		struct device_attribute *attr, const char *buf, size_t count)
306 {
307 	struct qeth_card *card = dev_get_drvdata(dev);
308 	char *tmp;
309 	int i;
310 
311 	if (!card)
312 		return -EINVAL;
313 
314 	if (card->state != CARD_STATE_UP)
315 		return -EPERM;
316 
317 	i = simple_strtoul(buf, &tmp, 16);
318 	if (i == 1)
319 		qeth_schedule_recovery(card);
320 
321 	return count;
322 }
323 
324 static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
325 
326 static ssize_t qeth_dev_performance_stats_show(struct device *dev,
327 				struct device_attribute *attr, char *buf)
328 {
329 	struct qeth_card *card = dev_get_drvdata(dev);
330 
331 	if (!card)
332 		return -EINVAL;
333 
334 	return sprintf(buf, "%i\n", card->options.performance_stats ? 1:0);
335 }
336 
337 static ssize_t qeth_dev_performance_stats_store(struct device *dev,
338 		struct device_attribute *attr, const char *buf, size_t count)
339 {
340 	struct qeth_card *card = dev_get_drvdata(dev);
341 	char *tmp;
342 	int i;
343 
344 	if (!card)
345 		return -EINVAL;
346 
347 	i = simple_strtoul(buf, &tmp, 16);
348 	if ((i == 0) || (i == 1)) {
349 		if (i == card->options.performance_stats)
350 			return count;
351 		card->options.performance_stats = i;
352 		if (i == 0)
353 			memset(&card->perf_stats, 0,
354 				sizeof(struct qeth_perf_stats));
355 		card->perf_stats.initial_rx_packets = card->stats.rx_packets;
356 		card->perf_stats.initial_tx_packets = card->stats.tx_packets;
357 	} else {
358 		PRINT_WARN("performance_stats: write 0 or 1 to this file!\n");
359 		return -EINVAL;
360 	}
361 	return count;
362 }
363 
364 static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show,
365 		   qeth_dev_performance_stats_store);
366 
367 static ssize_t qeth_dev_layer2_show(struct device *dev,
368 		struct device_attribute *attr, char *buf)
369 {
370 	struct qeth_card *card = dev_get_drvdata(dev);
371 
372 	if (!card)
373 		return -EINVAL;
374 
375 	return sprintf(buf, "%i\n", card->options.layer2 ? 1:0);
376 }
377 
378 static ssize_t qeth_dev_layer2_store(struct device *dev,
379 		struct device_attribute *attr, const char *buf, size_t count)
380 {
381 	struct qeth_card *card = dev_get_drvdata(dev);
382 	char *tmp;
383 	int i, rc;
384 	enum qeth_discipline_id newdis;
385 
386 	if (!card)
387 		return -EINVAL;
388 
389 	if (((card->state != CARD_STATE_DOWN) &&
390 	     (card->state != CARD_STATE_RECOVER)))
391 		return -EPERM;
392 
393 	i = simple_strtoul(buf, &tmp, 16);
394 	switch (i) {
395 	case 0:
396 		newdis = QETH_DISCIPLINE_LAYER3;
397 		break;
398 	case 1:
399 		newdis = QETH_DISCIPLINE_LAYER2;
400 		break;
401 	default:
402 		PRINT_WARN("layer2: write 0 or 1 to this file!\n");
403 		return -EINVAL;
404 	}
405 
406 	if (card->options.layer2 == newdis) {
407 		return count;
408 	} else {
409 		if (card->discipline.ccwgdriver) {
410 			card->discipline.ccwgdriver->remove(card->gdev);
411 			qeth_core_free_discipline(card);
412 		}
413 	}
414 
415 	rc = qeth_core_load_discipline(card, newdis);
416 	if (rc)
417 		return rc;
418 
419 	rc = card->discipline.ccwgdriver->probe(card->gdev);
420 	if (rc)
421 		return rc;
422 	return count;
423 }
424 
425 static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
426 		   qeth_dev_layer2_store);
427 
428 static ssize_t qeth_dev_large_send_show(struct device *dev,
429 				struct device_attribute *attr, char *buf)
430 {
431 	struct qeth_card *card = dev_get_drvdata(dev);
432 
433 	if (!card)
434 		return -EINVAL;
435 
436 	switch (card->options.large_send) {
437 	case QETH_LARGE_SEND_NO:
438 		return sprintf(buf, "%s\n", "no");
439 	case QETH_LARGE_SEND_EDDP:
440 		return sprintf(buf, "%s\n", "EDDP");
441 	case QETH_LARGE_SEND_TSO:
442 		return sprintf(buf, "%s\n", "TSO");
443 	default:
444 		return sprintf(buf, "%s\n", "N/A");
445 	}
446 }
447 
448 static ssize_t qeth_dev_large_send_store(struct device *dev,
449 		struct device_attribute *attr, const char *buf, size_t count)
450 {
451 	struct qeth_card *card = dev_get_drvdata(dev);
452 	enum qeth_large_send_types type;
453 	int rc = 0;
454 	char *tmp;
455 
456 	if (!card)
457 		return -EINVAL;
458 	tmp = strsep((char **) &buf, "\n");
459 	if (!strcmp(tmp, "no")) {
460 		type = QETH_LARGE_SEND_NO;
461 	} else if (!strcmp(tmp, "EDDP")) {
462 		type = QETH_LARGE_SEND_EDDP;
463 	} else if (!strcmp(tmp, "TSO")) {
464 		type = QETH_LARGE_SEND_TSO;
465 	} else {
466 		PRINT_WARN("large_send: invalid mode %s!\n", tmp);
467 		return -EINVAL;
468 	}
469 	if (card->options.large_send == type)
470 		return count;
471 	rc = qeth_set_large_send(card, type);
472 	if (rc)
473 		return rc;
474 	return count;
475 }
476 
477 static DEVICE_ATTR(large_send, 0644, qeth_dev_large_send_show,
478 		   qeth_dev_large_send_store);
479 
480 static ssize_t qeth_dev_blkt_show(char *buf, struct qeth_card *card, int value)
481 {
482 
483 	if (!card)
484 		return -EINVAL;
485 
486 	return sprintf(buf, "%i\n", value);
487 }
488 
489 static ssize_t qeth_dev_blkt_store(struct qeth_card *card,
490 		const char *buf, size_t count, int *value, int max_value)
491 {
492 	char *tmp;
493 	int i;
494 
495 	if (!card)
496 		return -EINVAL;
497 
498 	if ((card->state != CARD_STATE_DOWN) &&
499 	    (card->state != CARD_STATE_RECOVER))
500 		return -EPERM;
501 
502 	i = simple_strtoul(buf, &tmp, 10);
503 	if (i <= max_value) {
504 		*value = i;
505 	} else {
506 		PRINT_WARN("blkt total time: write values between"
507 			   " 0 and %d to this file!\n", max_value);
508 		return -EINVAL;
509 	}
510 	return count;
511 }
512 
513 static ssize_t qeth_dev_blkt_total_show(struct device *dev,
514 				struct device_attribute *attr, char *buf)
515 {
516 	struct qeth_card *card = dev_get_drvdata(dev);
517 
518 	return qeth_dev_blkt_show(buf, card, card->info.blkt.time_total);
519 }
520 
521 static ssize_t qeth_dev_blkt_total_store(struct device *dev,
522 		struct device_attribute *attr, const char *buf, size_t count)
523 {
524 	struct qeth_card *card = dev_get_drvdata(dev);
525 
526 	return qeth_dev_blkt_store(card, buf, count,
527 				   &card->info.blkt.time_total, 1000);
528 }
529 
530 
531 
532 static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
533 		   qeth_dev_blkt_total_store);
534 
535 static ssize_t qeth_dev_blkt_inter_show(struct device *dev,
536 				struct device_attribute *attr, char *buf)
537 {
538 	struct qeth_card *card = dev_get_drvdata(dev);
539 
540 	return qeth_dev_blkt_show(buf, card, card->info.blkt.inter_packet);
541 }
542 
543 static ssize_t qeth_dev_blkt_inter_store(struct device *dev,
544 		struct device_attribute *attr, const char *buf, size_t count)
545 {
546 	struct qeth_card *card = dev_get_drvdata(dev);
547 
548 	return qeth_dev_blkt_store(card, buf, count,
549 				   &card->info.blkt.inter_packet, 100);
550 }
551 
552 static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
553 		   qeth_dev_blkt_inter_store);
554 
555 static ssize_t qeth_dev_blkt_inter_jumbo_show(struct device *dev,
556 				struct device_attribute *attr, char *buf)
557 {
558 	struct qeth_card *card = dev_get_drvdata(dev);
559 
560 	return qeth_dev_blkt_show(buf, card,
561 				  card->info.blkt.inter_packet_jumbo);
562 }
563 
564 static ssize_t qeth_dev_blkt_inter_jumbo_store(struct device *dev,
565 		struct device_attribute *attr, const char *buf, size_t count)
566 {
567 	struct qeth_card *card = dev_get_drvdata(dev);
568 
569 	return qeth_dev_blkt_store(card, buf, count,
570 				   &card->info.blkt.inter_packet_jumbo, 100);
571 }
572 
573 static DEVICE_ATTR(inter_jumbo, 0644, qeth_dev_blkt_inter_jumbo_show,
574 		   qeth_dev_blkt_inter_jumbo_store);
575 
576 static struct attribute *qeth_blkt_device_attrs[] = {
577 	&dev_attr_total.attr,
578 	&dev_attr_inter.attr,
579 	&dev_attr_inter_jumbo.attr,
580 	NULL,
581 };
582 
583 static struct attribute_group qeth_device_blkt_group = {
584 	.name = "blkt",
585 	.attrs = qeth_blkt_device_attrs,
586 };
587 
588 static struct attribute *qeth_device_attrs[] = {
589 	&dev_attr_state.attr,
590 	&dev_attr_chpid.attr,
591 	&dev_attr_if_name.attr,
592 	&dev_attr_card_type.attr,
593 	&dev_attr_inbuf_size.attr,
594 	&dev_attr_portno.attr,
595 	&dev_attr_portname.attr,
596 	&dev_attr_priority_queueing.attr,
597 	&dev_attr_buffer_count.attr,
598 	&dev_attr_recover.attr,
599 	&dev_attr_performance_stats.attr,
600 	&dev_attr_layer2.attr,
601 	&dev_attr_large_send.attr,
602 	NULL,
603 };
604 
605 static struct attribute_group qeth_device_attr_group = {
606 	.attrs = qeth_device_attrs,
607 };
608 
609 static struct attribute *qeth_osn_device_attrs[] = {
610 	&dev_attr_state.attr,
611 	&dev_attr_chpid.attr,
612 	&dev_attr_if_name.attr,
613 	&dev_attr_card_type.attr,
614 	&dev_attr_buffer_count.attr,
615 	&dev_attr_recover.attr,
616 	NULL,
617 };
618 
619 static struct attribute_group qeth_osn_device_attr_group = {
620 	.attrs = qeth_osn_device_attrs,
621 };
622 
623 int qeth_core_create_device_attributes(struct device *dev)
624 {
625 	int ret;
626 	ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group);
627 	if (ret)
628 		return ret;
629 	ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group);
630 	if (ret)
631 		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
632 
633 	return 0;
634 }
635 
636 void qeth_core_remove_device_attributes(struct device *dev)
637 {
638 	sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
639 	sysfs_remove_group(&dev->kobj, &qeth_device_blkt_group);
640 }
641 
642 int qeth_core_create_osn_attributes(struct device *dev)
643 {
644 	return sysfs_create_group(&dev->kobj, &qeth_osn_device_attr_group);
645 }
646 
647 void qeth_core_remove_osn_attributes(struct device *dev)
648 {
649 	sysfs_remove_group(&dev->kobj, &qeth_osn_device_attr_group);
650 	return;
651 }
652