2 * drivers/s390/net/qeth_core_sys.c
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>
11 #include <linux/list.h>
12 #include <linux/rwsem.h>
13 #include <asm/ebcdic.h>
15 #include "qeth_core.h"
17 static ssize_t qeth_dev_state_show(struct device *dev,
18 struct device_attribute *attr, char *buf)
20 struct qeth_card *card = dev_get_drvdata(dev);
24 switch (card->state) {
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");
33 return sprintf(buf, "UP (LAN ONLINE)\n");
35 return sprintf(buf, "UP (LAN OFFLINE)\n");
36 case CARD_STATE_RECOVER:
37 return sprintf(buf, "RECOVER\n");
39 return sprintf(buf, "UNKNOWN\n");
43 static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
45 static ssize_t qeth_dev_chpid_show(struct device *dev,
46 struct device_attribute *attr, char *buf)
48 struct qeth_card *card = dev_get_drvdata(dev);
52 return sprintf(buf, "%02X\n", card->info.chpid);
55 static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
57 static ssize_t qeth_dev_if_name_show(struct device *dev,
58 struct device_attribute *attr, char *buf)
60 struct qeth_card *card = dev_get_drvdata(dev);
63 return sprintf(buf, "%s\n", QETH_CARD_IFNAME(card));
66 static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
68 static ssize_t qeth_dev_card_type_show(struct device *dev,
69 struct device_attribute *attr, char *buf)
71 struct qeth_card *card = dev_get_drvdata(dev);
75 return sprintf(buf, "%s\n", qeth_get_cardname_short(card));
78 static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
80 static inline const char *qeth_get_bufsize_str(struct qeth_card *card)
82 if (card->qdio.in_buf_size == 16384)
84 else if (card->qdio.in_buf_size == 24576)
86 else if (card->qdio.in_buf_size == 32768)
88 else if (card->qdio.in_buf_size == 40960)
94 static ssize_t qeth_dev_inbuf_size_show(struct device *dev,
95 struct device_attribute *attr, char *buf)
97 struct qeth_card *card = dev_get_drvdata(dev);
101 return sprintf(buf, "%s\n", qeth_get_bufsize_str(card));
104 static DEVICE_ATTR(inbuf_size, 0444, qeth_dev_inbuf_size_show, NULL);
106 static ssize_t qeth_dev_portno_show(struct device *dev,
107 struct device_attribute *attr, char *buf)
109 struct qeth_card *card = dev_get_drvdata(dev);
113 return sprintf(buf, "%i\n", card->info.portno);
116 static ssize_t qeth_dev_portno_store(struct device *dev,
117 struct device_attribute *attr, const char *buf, size_t count)
119 struct qeth_card *card = dev_get_drvdata(dev);
121 unsigned int portno, limit;
126 if ((card->state != CARD_STATE_DOWN) &&
127 (card->state != CARD_STATE_RECOVER))
130 portno = simple_strtoul(buf, &tmp, 16);
131 if (portno > QETH_MAX_PORTNO)
133 limit = (card->ssqd.pcnt ? card->ssqd.pcnt - 1 : card->ssqd.pcnt);
137 card->info.portno = portno;
141 static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
143 static ssize_t qeth_dev_portname_show(struct device *dev,
144 struct device_attribute *attr, char *buf)
146 struct qeth_card *card = dev_get_drvdata(dev);
147 char portname[9] = {0, };
152 if (card->info.portname_required) {
153 memcpy(portname, card->info.portname + 1, 8);
155 return sprintf(buf, "%s\n", portname);
157 return sprintf(buf, "no portname required\n");
160 static ssize_t qeth_dev_portname_store(struct device *dev,
161 struct device_attribute *attr, const char *buf, size_t count)
163 struct qeth_card *card = dev_get_drvdata(dev);
170 if ((card->state != CARD_STATE_DOWN) &&
171 (card->state != CARD_STATE_RECOVER))
174 tmp = strsep((char **) &buf, "\n");
175 if ((strlen(tmp) > 8) || (strlen(tmp) == 0))
178 card->info.portname[0] = strlen(tmp);
179 /* for beauty reasons */
180 for (i = 1; i < 9; i++)
181 card->info.portname[i] = ' ';
182 strcpy(card->info.portname + 1, tmp);
183 ASCEBC(card->info.portname + 1, 8);
188 static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
189 qeth_dev_portname_store);
191 static ssize_t qeth_dev_prioqing_show(struct device *dev,
192 struct device_attribute *attr, char *buf)
194 struct qeth_card *card = dev_get_drvdata(dev);
199 switch (card->qdio.do_prio_queueing) {
200 case QETH_PRIO_Q_ING_PREC:
201 return sprintf(buf, "%s\n", "by precedence");
202 case QETH_PRIO_Q_ING_TOS:
203 return sprintf(buf, "%s\n", "by type of service");
205 return sprintf(buf, "always queue %i\n",
206 card->qdio.default_out_queue);
210 static ssize_t qeth_dev_prioqing_store(struct device *dev,
211 struct device_attribute *attr, const char *buf, size_t count)
213 struct qeth_card *card = dev_get_drvdata(dev);
219 if ((card->state != CARD_STATE_DOWN) &&
220 (card->state != CARD_STATE_RECOVER))
223 /* check if 1920 devices are supported ,
224 * if though we have to permit priority queueing
226 if (card->qdio.no_out_queues == 1) {
227 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
231 tmp = strsep((char **) &buf, "\n");
232 if (!strcmp(tmp, "prio_queueing_prec"))
233 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_PREC;
234 else if (!strcmp(tmp, "prio_queueing_tos"))
235 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_TOS;
236 else if (!strcmp(tmp, "no_prio_queueing:0")) {
237 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
238 card->qdio.default_out_queue = 0;
239 } else if (!strcmp(tmp, "no_prio_queueing:1")) {
240 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
241 card->qdio.default_out_queue = 1;
242 } else if (!strcmp(tmp, "no_prio_queueing:2")) {
243 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
244 card->qdio.default_out_queue = 2;
245 } else if (!strcmp(tmp, "no_prio_queueing:3")) {
246 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
247 card->qdio.default_out_queue = 3;
248 } else if (!strcmp(tmp, "no_prio_queueing")) {
249 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
250 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
257 static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
258 qeth_dev_prioqing_store);
260 static ssize_t qeth_dev_bufcnt_show(struct device *dev,
261 struct device_attribute *attr, char *buf)
263 struct qeth_card *card = dev_get_drvdata(dev);
268 return sprintf(buf, "%i\n", card->qdio.in_buf_pool.buf_count);
271 static ssize_t qeth_dev_bufcnt_store(struct device *dev,
272 struct device_attribute *attr, const char *buf, size_t count)
274 struct qeth_card *card = dev_get_drvdata(dev);
282 if ((card->state != CARD_STATE_DOWN) &&
283 (card->state != CARD_STATE_RECOVER))
286 old_cnt = card->qdio.in_buf_pool.buf_count;
287 cnt = simple_strtoul(buf, &tmp, 10);
288 cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN :
289 ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt);
290 if (old_cnt != cnt) {
291 rc = qeth_realloc_buffer_pool(card, cnt);
296 static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
297 qeth_dev_bufcnt_store);
299 static ssize_t qeth_dev_recover_store(struct device *dev,
300 struct device_attribute *attr, const char *buf, size_t count)
302 struct qeth_card *card = dev_get_drvdata(dev);
309 if (card->state != CARD_STATE_UP)
312 i = simple_strtoul(buf, &tmp, 16);
314 qeth_schedule_recovery(card);
319 static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
321 static ssize_t qeth_dev_performance_stats_show(struct device *dev,
322 struct device_attribute *attr, char *buf)
324 struct qeth_card *card = dev_get_drvdata(dev);
329 return sprintf(buf, "%i\n", card->options.performance_stats ? 1:0);
332 static ssize_t qeth_dev_performance_stats_store(struct device *dev,
333 struct device_attribute *attr, const char *buf, size_t count)
335 struct qeth_card *card = dev_get_drvdata(dev);
342 i = simple_strtoul(buf, &tmp, 16);
343 if ((i == 0) || (i == 1)) {
344 if (i == card->options.performance_stats)
346 card->options.performance_stats = i;
348 memset(&card->perf_stats, 0,
349 sizeof(struct qeth_perf_stats));
350 card->perf_stats.initial_rx_packets = card->stats.rx_packets;
351 card->perf_stats.initial_tx_packets = card->stats.tx_packets;
358 static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show,
359 qeth_dev_performance_stats_store);
361 static ssize_t qeth_dev_layer2_show(struct device *dev,
362 struct device_attribute *attr, char *buf)
364 struct qeth_card *card = dev_get_drvdata(dev);
369 return sprintf(buf, "%i\n", card->options.layer2);
372 static ssize_t qeth_dev_layer2_store(struct device *dev,
373 struct device_attribute *attr, const char *buf, size_t count)
375 struct qeth_card *card = dev_get_drvdata(dev);
378 enum qeth_discipline_id newdis;
383 if (((card->state != CARD_STATE_DOWN) &&
384 (card->state != CARD_STATE_RECOVER)))
387 i = simple_strtoul(buf, &tmp, 16);
390 newdis = QETH_DISCIPLINE_LAYER3;
393 newdis = QETH_DISCIPLINE_LAYER2;
399 if (card->options.layer2 == newdis) {
402 if (card->discipline.ccwgdriver) {
403 card->discipline.ccwgdriver->remove(card->gdev);
404 qeth_core_free_discipline(card);
408 rc = qeth_core_load_discipline(card, newdis);
412 rc = card->discipline.ccwgdriver->probe(card->gdev);
418 static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
419 qeth_dev_layer2_store);
421 #define ATTR_QETH_ISOLATION_NONE ("none")
422 #define ATTR_QETH_ISOLATION_FWD ("forward")
423 #define ATTR_QETH_ISOLATION_DROP ("drop")
425 static ssize_t qeth_dev_isolation_show(struct device *dev,
426 struct device_attribute *attr, char *buf)
428 struct qeth_card *card = dev_get_drvdata(dev);
433 switch (card->options.isolation) {
434 case ISOLATION_MODE_NONE:
435 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_NONE);
436 case ISOLATION_MODE_FWD:
437 return snprintf(buf, 9, "%s\n", ATTR_QETH_ISOLATION_FWD);
438 case ISOLATION_MODE_DROP:
439 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_DROP);
441 return snprintf(buf, 5, "%s\n", "N/A");
445 static ssize_t qeth_dev_isolation_store(struct device *dev,
446 struct device_attribute *attr, const char *buf, size_t count)
448 struct qeth_card *card = dev_get_drvdata(dev);
449 enum qeth_ipa_isolation_modes isolation;
451 char *tmp, *curtoken;
452 curtoken = (char *) buf;
459 /* check for unknown, too, in case we do not yet know who we are */
460 if (card->info.type != QETH_CARD_TYPE_OSAE &&
461 card->info.type != QETH_CARD_TYPE_UNKNOWN) {
463 dev_err(&card->gdev->dev, "Adapter does not "
464 "support QDIO data connection isolation\n");
468 /* parse input into isolation mode */
469 tmp = strsep(&curtoken, "\n");
470 if (!strcmp(tmp, ATTR_QETH_ISOLATION_NONE)) {
471 isolation = ISOLATION_MODE_NONE;
472 } else if (!strcmp(tmp, ATTR_QETH_ISOLATION_FWD)) {
473 isolation = ISOLATION_MODE_FWD;
474 } else if (!strcmp(tmp, ATTR_QETH_ISOLATION_DROP)) {
475 isolation = ISOLATION_MODE_DROP;
482 /* defer IP assist if device is offline (until discipline->set_online)*/
483 card->options.isolation = isolation;
484 if (card->state == CARD_STATE_SOFTSETUP ||
485 card->state == CARD_STATE_UP) {
486 int ipa_rc = qeth_set_access_ctrl_online(card);
494 static DEVICE_ATTR(isolation, 0644, qeth_dev_isolation_show,
495 qeth_dev_isolation_store);
497 static ssize_t qeth_dev_blkt_show(char *buf, struct qeth_card *card, int value)
503 return sprintf(buf, "%i\n", value);
506 static ssize_t qeth_dev_blkt_store(struct qeth_card *card,
507 const char *buf, size_t count, int *value, int max_value)
515 if ((card->state != CARD_STATE_DOWN) &&
516 (card->state != CARD_STATE_RECOVER))
519 i = simple_strtoul(buf, &tmp, 10);
520 if (i <= max_value) {
528 static ssize_t qeth_dev_blkt_total_show(struct device *dev,
529 struct device_attribute *attr, char *buf)
531 struct qeth_card *card = dev_get_drvdata(dev);
533 return qeth_dev_blkt_show(buf, card, card->info.blkt.time_total);
536 static ssize_t qeth_dev_blkt_total_store(struct device *dev,
537 struct device_attribute *attr, const char *buf, size_t count)
539 struct qeth_card *card = dev_get_drvdata(dev);
541 return qeth_dev_blkt_store(card, buf, count,
542 &card->info.blkt.time_total, 5000);
547 static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
548 qeth_dev_blkt_total_store);
550 static ssize_t qeth_dev_blkt_inter_show(struct device *dev,
551 struct device_attribute *attr, char *buf)
553 struct qeth_card *card = dev_get_drvdata(dev);
555 return qeth_dev_blkt_show(buf, card, card->info.blkt.inter_packet);
558 static ssize_t qeth_dev_blkt_inter_store(struct device *dev,
559 struct device_attribute *attr, const char *buf, size_t count)
561 struct qeth_card *card = dev_get_drvdata(dev);
563 return qeth_dev_blkt_store(card, buf, count,
564 &card->info.blkt.inter_packet, 1000);
567 static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
568 qeth_dev_blkt_inter_store);
570 static ssize_t qeth_dev_blkt_inter_jumbo_show(struct device *dev,
571 struct device_attribute *attr, char *buf)
573 struct qeth_card *card = dev_get_drvdata(dev);
575 return qeth_dev_blkt_show(buf, card,
576 card->info.blkt.inter_packet_jumbo);
579 static ssize_t qeth_dev_blkt_inter_jumbo_store(struct device *dev,
580 struct device_attribute *attr, const char *buf, size_t count)
582 struct qeth_card *card = dev_get_drvdata(dev);
584 return qeth_dev_blkt_store(card, buf, count,
585 &card->info.blkt.inter_packet_jumbo, 1000);
588 static DEVICE_ATTR(inter_jumbo, 0644, qeth_dev_blkt_inter_jumbo_show,
589 qeth_dev_blkt_inter_jumbo_store);
591 static struct attribute *qeth_blkt_device_attrs[] = {
592 &dev_attr_total.attr,
593 &dev_attr_inter.attr,
594 &dev_attr_inter_jumbo.attr,
598 static struct attribute_group qeth_device_blkt_group = {
600 .attrs = qeth_blkt_device_attrs,
603 static struct attribute *qeth_device_attrs[] = {
604 &dev_attr_state.attr,
605 &dev_attr_chpid.attr,
606 &dev_attr_if_name.attr,
607 &dev_attr_card_type.attr,
608 &dev_attr_inbuf_size.attr,
609 &dev_attr_portno.attr,
610 &dev_attr_portname.attr,
611 &dev_attr_priority_queueing.attr,
612 &dev_attr_buffer_count.attr,
613 &dev_attr_recover.attr,
614 &dev_attr_performance_stats.attr,
615 &dev_attr_layer2.attr,
616 &dev_attr_isolation.attr,
620 static struct attribute_group qeth_device_attr_group = {
621 .attrs = qeth_device_attrs,
624 static struct attribute *qeth_osn_device_attrs[] = {
625 &dev_attr_state.attr,
626 &dev_attr_chpid.attr,
627 &dev_attr_if_name.attr,
628 &dev_attr_card_type.attr,
629 &dev_attr_buffer_count.attr,
630 &dev_attr_recover.attr,
634 static struct attribute_group qeth_osn_device_attr_group = {
635 .attrs = qeth_osn_device_attrs,
638 int qeth_core_create_device_attributes(struct device *dev)
641 ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group);
644 ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group);
646 sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
651 void qeth_core_remove_device_attributes(struct device *dev)
653 sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
654 sysfs_remove_group(&dev->kobj, &qeth_device_blkt_group);
657 int qeth_core_create_osn_attributes(struct device *dev)
659 return sysfs_create_group(&dev->kobj, &qeth_osn_device_attr_group);
662 void qeth_core_remove_osn_attributes(struct device *dev)
664 sysfs_remove_group(&dev->kobj, &qeth_osn_device_attr_group);