]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/s390/net/qeth_core_sys.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[karo-tx-linux.git] / drivers / s390 / net / qeth_core_sys.c
1 /*
2  *    Copyright IBM Corp. 2007
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
9 #define KMSG_COMPONENT "qeth"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/list.h>
13 #include <linux/rwsem.h>
14 #include <asm/ebcdic.h>
15
16 #include "qeth_core.h"
17
18 static ssize_t qeth_dev_state_show(struct device *dev,
19                                 struct device_attribute *attr, char *buf)
20 {
21         struct qeth_card *card = dev_get_drvdata(dev);
22         if (!card)
23                 return -EINVAL;
24
25         switch (card->state) {
26         case CARD_STATE_DOWN:
27                 return sprintf(buf, "DOWN\n");
28         case CARD_STATE_HARDSETUP:
29                 return sprintf(buf, "HARDSETUP\n");
30         case CARD_STATE_SOFTSETUP:
31                 return sprintf(buf, "SOFTSETUP\n");
32         case CARD_STATE_UP:
33                 if (card->lan_online)
34                 return sprintf(buf, "UP (LAN ONLINE)\n");
35                 else
36                         return sprintf(buf, "UP (LAN OFFLINE)\n");
37         case CARD_STATE_RECOVER:
38                 return sprintf(buf, "RECOVER\n");
39         default:
40                 return sprintf(buf, "UNKNOWN\n");
41         }
42 }
43
44 static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
45
46 static ssize_t qeth_dev_chpid_show(struct device *dev,
47                                 struct device_attribute *attr, char *buf)
48 {
49         struct qeth_card *card = dev_get_drvdata(dev);
50         if (!card)
51                 return -EINVAL;
52
53         return sprintf(buf, "%02X\n", card->info.chpid);
54 }
55
56 static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
57
58 static ssize_t qeth_dev_if_name_show(struct device *dev,
59                                 struct device_attribute *attr, char *buf)
60 {
61         struct qeth_card *card = dev_get_drvdata(dev);
62         if (!card)
63                 return -EINVAL;
64         return sprintf(buf, "%s\n", QETH_CARD_IFNAME(card));
65 }
66
67 static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
68
69 static ssize_t qeth_dev_card_type_show(struct device *dev,
70                                 struct device_attribute *attr, char *buf)
71 {
72         struct qeth_card *card = dev_get_drvdata(dev);
73         if (!card)
74                 return -EINVAL;
75
76         return sprintf(buf, "%s\n", qeth_get_cardname_short(card));
77 }
78
79 static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
80
81 static inline const char *qeth_get_bufsize_str(struct qeth_card *card)
82 {
83         if (card->qdio.in_buf_size == 16384)
84                 return "16k";
85         else if (card->qdio.in_buf_size == 24576)
86                 return "24k";
87         else if (card->qdio.in_buf_size == 32768)
88                 return "32k";
89         else if (card->qdio.in_buf_size == 40960)
90                 return "40k";
91         else
92                 return "64k";
93 }
94
95 static ssize_t qeth_dev_inbuf_size_show(struct device *dev,
96                                 struct device_attribute *attr, char *buf)
97 {
98         struct qeth_card *card = dev_get_drvdata(dev);
99         if (!card)
100                 return -EINVAL;
101
102         return sprintf(buf, "%s\n", qeth_get_bufsize_str(card));
103 }
104
105 static DEVICE_ATTR(inbuf_size, 0444, qeth_dev_inbuf_size_show, NULL);
106
107 static ssize_t qeth_dev_portno_show(struct device *dev,
108                         struct device_attribute *attr, char *buf)
109 {
110         struct qeth_card *card = dev_get_drvdata(dev);
111         if (!card)
112                 return -EINVAL;
113
114         return sprintf(buf, "%i\n", card->info.portno);
115 }
116
117 static ssize_t qeth_dev_portno_store(struct device *dev,
118                 struct device_attribute *attr, const char *buf, size_t count)
119 {
120         struct qeth_card *card = dev_get_drvdata(dev);
121         char *tmp;
122         unsigned int portno, limit;
123         int rc = 0;
124
125         if (!card)
126                 return -EINVAL;
127
128         mutex_lock(&card->conf_mutex);
129         if ((card->state != CARD_STATE_DOWN) &&
130             (card->state != CARD_STATE_RECOVER)) {
131                 rc = -EPERM;
132                 goto out;
133         }
134
135         portno = simple_strtoul(buf, &tmp, 16);
136         if (portno > QETH_MAX_PORTNO) {
137                 rc = -EINVAL;
138                 goto out;
139         }
140         limit = (card->ssqd.pcnt ? card->ssqd.pcnt - 1 : card->ssqd.pcnt);
141         if (portno > limit) {
142                 rc = -EINVAL;
143                 goto out;
144         }
145         card->info.portno = portno;
146 out:
147         mutex_unlock(&card->conf_mutex);
148         return rc ? rc : count;
149 }
150
151 static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
152
153 static ssize_t qeth_dev_portname_show(struct device *dev,
154                                 struct device_attribute *attr, char *buf)
155 {
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
164         dev_warn_once(&card->gdev->dev,
165                       "portname is deprecated and is ignored\n");
166         return count;
167 }
168
169 static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
170                 qeth_dev_portname_store);
171
172 static ssize_t qeth_dev_prioqing_show(struct device *dev,
173                                 struct device_attribute *attr, char *buf)
174 {
175         struct qeth_card *card = dev_get_drvdata(dev);
176
177         if (!card)
178                 return -EINVAL;
179
180         switch (card->qdio.do_prio_queueing) {
181         case QETH_PRIO_Q_ING_PREC:
182                 return sprintf(buf, "%s\n", "by precedence");
183         case QETH_PRIO_Q_ING_TOS:
184                 return sprintf(buf, "%s\n", "by type of service");
185         case QETH_PRIO_Q_ING_SKB:
186                 return sprintf(buf, "%s\n", "by skb-priority");
187         case QETH_PRIO_Q_ING_VLAN:
188                 return sprintf(buf, "%s\n", "by VLAN headers");
189         default:
190                 return sprintf(buf, "always queue %i\n",
191                                card->qdio.default_out_queue);
192         }
193 }
194
195 static ssize_t qeth_dev_prioqing_store(struct device *dev,
196                 struct device_attribute *attr, const char *buf, size_t count)
197 {
198         struct qeth_card *card = dev_get_drvdata(dev);
199         int rc = 0;
200
201         if (!card)
202                 return -EINVAL;
203
204         mutex_lock(&card->conf_mutex);
205         if ((card->state != CARD_STATE_DOWN) &&
206             (card->state != CARD_STATE_RECOVER)) {
207                 rc = -EPERM;
208                 goto out;
209         }
210
211         /* check if 1920 devices are supported ,
212          * if though we have to permit priority queueing
213          */
214         if (card->qdio.no_out_queues == 1) {
215                 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
216                 rc = -EPERM;
217                 goto out;
218         }
219
220         if (sysfs_streq(buf, "prio_queueing_prec")) {
221                 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_PREC;
222                 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
223         } else if (sysfs_streq(buf, "prio_queueing_skb")) {
224                 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_SKB;
225                 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
226         } else if (sysfs_streq(buf, "prio_queueing_tos")) {
227                 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_TOS;
228                 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
229         } else if (sysfs_streq(buf, "prio_queueing_vlan")) {
230                 if (!card->options.layer2) {
231                         rc = -ENOTSUPP;
232                         goto out;
233                 }
234                 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_VLAN;
235                 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
236         } else if (sysfs_streq(buf, "no_prio_queueing:0")) {
237                 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
238                 card->qdio.default_out_queue = 0;
239         } else if (sysfs_streq(buf, "no_prio_queueing:1")) {
240                 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
241                 card->qdio.default_out_queue = 1;
242         } else if (sysfs_streq(buf, "no_prio_queueing:2")) {
243                 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
244                 card->qdio.default_out_queue = 2;
245         } else if (sysfs_streq(buf, "no_prio_queueing:3")) {
246                 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
247                 card->qdio.default_out_queue = 3;
248         } else if (sysfs_streq(buf, "no_prio_queueing")) {
249                 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
250                 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
251         } else
252                 rc = -EINVAL;
253 out:
254         mutex_unlock(&card->conf_mutex);
255         return rc ? rc : count;
256 }
257
258 static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
259                 qeth_dev_prioqing_store);
260
261 static ssize_t qeth_dev_bufcnt_show(struct device *dev,
262                                 struct device_attribute *attr, char *buf)
263 {
264         struct qeth_card *card = dev_get_drvdata(dev);
265
266         if (!card)
267                 return -EINVAL;
268
269         return sprintf(buf, "%i\n", card->qdio.in_buf_pool.buf_count);
270 }
271
272 static ssize_t qeth_dev_bufcnt_store(struct device *dev,
273                 struct device_attribute *attr, const char *buf, size_t count)
274 {
275         struct qeth_card *card = dev_get_drvdata(dev);
276         char *tmp;
277         int cnt, old_cnt;
278         int rc = 0;
279
280         if (!card)
281                 return -EINVAL;
282
283         mutex_lock(&card->conf_mutex);
284         if ((card->state != CARD_STATE_DOWN) &&
285             (card->state != CARD_STATE_RECOVER)) {
286                 rc = -EPERM;
287                 goto out;
288         }
289
290         old_cnt = card->qdio.in_buf_pool.buf_count;
291         cnt = simple_strtoul(buf, &tmp, 10);
292         cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN :
293                 ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt);
294         if (old_cnt != cnt) {
295                 rc = qeth_realloc_buffer_pool(card, cnt);
296         }
297 out:
298         mutex_unlock(&card->conf_mutex);
299         return rc ? rc : count;
300 }
301
302 static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
303                 qeth_dev_bufcnt_store);
304
305 static ssize_t qeth_dev_recover_store(struct device *dev,
306                 struct device_attribute *attr, const char *buf, size_t count)
307 {
308         struct qeth_card *card = dev_get_drvdata(dev);
309         char *tmp;
310         int i;
311
312         if (!card)
313                 return -EINVAL;
314
315         if (card->state != CARD_STATE_UP)
316                 return -EPERM;
317
318         i = simple_strtoul(buf, &tmp, 16);
319         if (i == 1)
320                 qeth_schedule_recovery(card);
321
322         return count;
323 }
324
325 static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
326
327 static ssize_t qeth_dev_performance_stats_show(struct device *dev,
328                                 struct device_attribute *attr, char *buf)
329 {
330         struct qeth_card *card = dev_get_drvdata(dev);
331
332         if (!card)
333                 return -EINVAL;
334
335         return sprintf(buf, "%i\n", card->options.performance_stats ? 1:0);
336 }
337
338 static ssize_t qeth_dev_performance_stats_store(struct device *dev,
339                 struct device_attribute *attr, const char *buf, size_t count)
340 {
341         struct qeth_card *card = dev_get_drvdata(dev);
342         char *tmp;
343         int i, rc = 0;
344
345         if (!card)
346                 return -EINVAL;
347
348         mutex_lock(&card->conf_mutex);
349         i = simple_strtoul(buf, &tmp, 16);
350         if ((i == 0) || (i == 1)) {
351                 if (i == card->options.performance_stats)
352                         goto out;
353                 card->options.performance_stats = i;
354                 if (i == 0)
355                         memset(&card->perf_stats, 0,
356                                 sizeof(struct qeth_perf_stats));
357                 card->perf_stats.initial_rx_packets = card->stats.rx_packets;
358                 card->perf_stats.initial_tx_packets = card->stats.tx_packets;
359         } else
360                 rc = -EINVAL;
361 out:
362         mutex_unlock(&card->conf_mutex);
363         return rc ? rc : count;
364 }
365
366 static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show,
367                    qeth_dev_performance_stats_store);
368
369 static ssize_t qeth_dev_layer2_show(struct device *dev,
370                 struct device_attribute *attr, char *buf)
371 {
372         struct qeth_card *card = dev_get_drvdata(dev);
373
374         if (!card)
375                 return -EINVAL;
376
377         return sprintf(buf, "%i\n", card->options.layer2);
378 }
379
380 static ssize_t qeth_dev_layer2_store(struct device *dev,
381                 struct device_attribute *attr, const char *buf, size_t count)
382 {
383         struct qeth_card *card = dev_get_drvdata(dev);
384         char *tmp;
385         int i, rc = 0;
386         enum qeth_discipline_id newdis;
387
388         if (!card)
389                 return -EINVAL;
390
391         mutex_lock(&card->discipline_mutex);
392         if (card->state != CARD_STATE_DOWN) {
393                 rc = -EPERM;
394                 goto out;
395         }
396
397         i = simple_strtoul(buf, &tmp, 16);
398         switch (i) {
399         case 0:
400                 newdis = QETH_DISCIPLINE_LAYER3;
401                 break;
402         case 1:
403                 newdis = QETH_DISCIPLINE_LAYER2;
404                 break;
405         default:
406                 rc = -EINVAL;
407                 goto out;
408         }
409
410         if (card->options.layer2 == newdis)
411                 goto out;
412         else {
413                 card->info.mac_bits  = 0;
414                 if (card->discipline) {
415                         card->discipline->remove(card->gdev);
416                         qeth_core_free_discipline(card);
417                 }
418         }
419
420         rc = qeth_core_load_discipline(card, newdis);
421         if (rc)
422                 goto out;
423
424         rc = card->discipline->setup(card->gdev);
425 out:
426         mutex_unlock(&card->discipline_mutex);
427         return rc ? rc : count;
428 }
429
430 static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
431                    qeth_dev_layer2_store);
432
433 #define ATTR_QETH_ISOLATION_NONE        ("none")
434 #define ATTR_QETH_ISOLATION_FWD         ("forward")
435 #define ATTR_QETH_ISOLATION_DROP        ("drop")
436
437 static ssize_t qeth_dev_isolation_show(struct device *dev,
438                                 struct device_attribute *attr, char *buf)
439 {
440         struct qeth_card *card = dev_get_drvdata(dev);
441
442         if (!card)
443                 return -EINVAL;
444
445         switch (card->options.isolation) {
446         case ISOLATION_MODE_NONE:
447                 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_NONE);
448         case ISOLATION_MODE_FWD:
449                 return snprintf(buf, 9, "%s\n", ATTR_QETH_ISOLATION_FWD);
450         case ISOLATION_MODE_DROP:
451                 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_DROP);
452         default:
453                 return snprintf(buf, 5, "%s\n", "N/A");
454         }
455 }
456
457 static ssize_t qeth_dev_isolation_store(struct device *dev,
458                 struct device_attribute *attr, const char *buf, size_t count)
459 {
460         struct qeth_card *card = dev_get_drvdata(dev);
461         enum qeth_ipa_isolation_modes isolation;
462         int rc = 0;
463
464         if (!card)
465                 return -EINVAL;
466
467         mutex_lock(&card->conf_mutex);
468         /* check for unknown, too, in case we do not yet know who we are */
469         if (card->info.type != QETH_CARD_TYPE_OSD &&
470             card->info.type != QETH_CARD_TYPE_OSX &&
471             card->info.type != QETH_CARD_TYPE_UNKNOWN) {
472                 rc = -EOPNOTSUPP;
473                 dev_err(&card->gdev->dev, "Adapter does not "
474                         "support QDIO data connection isolation\n");
475                 goto out;
476         }
477
478         /* parse input into isolation mode */
479         if (sysfs_streq(buf, ATTR_QETH_ISOLATION_NONE)) {
480                 isolation = ISOLATION_MODE_NONE;
481         } else if (sysfs_streq(buf, ATTR_QETH_ISOLATION_FWD)) {
482                 isolation = ISOLATION_MODE_FWD;
483         } else if (sysfs_streq(buf, ATTR_QETH_ISOLATION_DROP)) {
484                 isolation = ISOLATION_MODE_DROP;
485         } else {
486                 rc = -EINVAL;
487                 goto out;
488         }
489         rc = count;
490
491         /* defer IP assist if device is offline (until discipline->set_online)*/
492         card->options.prev_isolation = card->options.isolation;
493         card->options.isolation = isolation;
494         if (qeth_card_hw_is_reachable(card)) {
495                 int ipa_rc = qeth_set_access_ctrl_online(card, 1);
496                 if (ipa_rc != 0)
497                         rc = ipa_rc;
498         }
499 out:
500         mutex_unlock(&card->conf_mutex);
501         return rc;
502 }
503
504 static DEVICE_ATTR(isolation, 0644, qeth_dev_isolation_show,
505                         qeth_dev_isolation_store);
506
507 static ssize_t qeth_dev_switch_attrs_show(struct device *dev,
508                                 struct device_attribute *attr, char *buf)
509 {
510         struct qeth_card *card = dev_get_drvdata(dev);
511         struct qeth_switch_info sw_info;
512         int     rc = 0;
513
514         if (!card)
515                 return -EINVAL;
516
517         if (!qeth_card_hw_is_reachable(card))
518                 return sprintf(buf, "n/a\n");
519
520         rc = qeth_query_switch_attributes(card, &sw_info);
521         if (rc)
522                 return rc;
523
524         if (!sw_info.capabilities)
525                 rc = sprintf(buf, "unknown");
526
527         if (sw_info.capabilities & QETH_SWITCH_FORW_802_1)
528                 rc = sprintf(buf, (sw_info.settings & QETH_SWITCH_FORW_802_1 ?
529                                                         "[802.1]" : "802.1"));
530         if (sw_info.capabilities & QETH_SWITCH_FORW_REFL_RELAY)
531                 rc += sprintf(buf + rc,
532                         (sw_info.settings & QETH_SWITCH_FORW_REFL_RELAY ?
533                                                         " [rr]" : " rr"));
534         rc += sprintf(buf + rc, "\n");
535
536         return rc;
537 }
538
539 static DEVICE_ATTR(switch_attrs, 0444,
540                    qeth_dev_switch_attrs_show, NULL);
541
542 static ssize_t qeth_hw_trap_show(struct device *dev,
543                                 struct device_attribute *attr, char *buf)
544 {
545         struct qeth_card *card = dev_get_drvdata(dev);
546
547         if (!card)
548                 return -EINVAL;
549         if (card->info.hwtrap)
550                 return snprintf(buf, 5, "arm\n");
551         else
552                 return snprintf(buf, 8, "disarm\n");
553 }
554
555 static ssize_t qeth_hw_trap_store(struct device *dev,
556                 struct device_attribute *attr, const char *buf, size_t count)
557 {
558         struct qeth_card *card = dev_get_drvdata(dev);
559         int rc = 0;
560         int state = 0;
561
562         if (!card)
563                 return -EINVAL;
564
565         mutex_lock(&card->conf_mutex);
566         if (qeth_card_hw_is_reachable(card))
567                 state = 1;
568
569         if (sysfs_streq(buf, "arm") && !card->info.hwtrap) {
570                 if (state) {
571                         if (qeth_is_diagass_supported(card,
572                             QETH_DIAGS_CMD_TRAP)) {
573                                 rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM);
574                                 if (!rc)
575                                         card->info.hwtrap = 1;
576                         } else
577                                 rc = -EINVAL;
578                 } else
579                         card->info.hwtrap = 1;
580         } else if (sysfs_streq(buf, "disarm") && card->info.hwtrap) {
581                 if (state) {
582                         rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
583                         if (!rc)
584                                 card->info.hwtrap = 0;
585                 } else
586                         card->info.hwtrap = 0;
587         } else if (sysfs_streq(buf, "trap") && state && card->info.hwtrap)
588                 rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_CAPTURE);
589         else
590                 rc = -EINVAL;
591
592         mutex_unlock(&card->conf_mutex);
593         return rc ? rc : count;
594 }
595
596 static DEVICE_ATTR(hw_trap, 0644, qeth_hw_trap_show,
597                    qeth_hw_trap_store);
598
599 static ssize_t qeth_dev_blkt_show(char *buf, struct qeth_card *card, int value)
600 {
601
602         if (!card)
603                 return -EINVAL;
604
605         return sprintf(buf, "%i\n", value);
606 }
607
608 static ssize_t qeth_dev_blkt_store(struct qeth_card *card,
609                 const char *buf, size_t count, int *value, int max_value)
610 {
611         char *tmp;
612         int i, rc = 0;
613
614         if (!card)
615                 return -EINVAL;
616
617         mutex_lock(&card->conf_mutex);
618         if ((card->state != CARD_STATE_DOWN) &&
619             (card->state != CARD_STATE_RECOVER)) {
620                 rc = -EPERM;
621                 goto out;
622         }
623         i = simple_strtoul(buf, &tmp, 10);
624         if (i <= max_value)
625                 *value = i;
626         else
627                 rc = -EINVAL;
628 out:
629         mutex_unlock(&card->conf_mutex);
630         return rc ? rc : count;
631 }
632
633 static ssize_t qeth_dev_blkt_total_show(struct device *dev,
634                                 struct device_attribute *attr, char *buf)
635 {
636         struct qeth_card *card = dev_get_drvdata(dev);
637
638         return qeth_dev_blkt_show(buf, card, card->info.blkt.time_total);
639 }
640
641 static ssize_t qeth_dev_blkt_total_store(struct device *dev,
642                 struct device_attribute *attr, const char *buf, size_t count)
643 {
644         struct qeth_card *card = dev_get_drvdata(dev);
645
646         return qeth_dev_blkt_store(card, buf, count,
647                                    &card->info.blkt.time_total, 5000);
648 }
649
650
651
652 static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
653                    qeth_dev_blkt_total_store);
654
655 static ssize_t qeth_dev_blkt_inter_show(struct device *dev,
656                                 struct device_attribute *attr, char *buf)
657 {
658         struct qeth_card *card = dev_get_drvdata(dev);
659
660         return qeth_dev_blkt_show(buf, card, card->info.blkt.inter_packet);
661 }
662
663 static ssize_t qeth_dev_blkt_inter_store(struct device *dev,
664                 struct device_attribute *attr, const char *buf, size_t count)
665 {
666         struct qeth_card *card = dev_get_drvdata(dev);
667
668         return qeth_dev_blkt_store(card, buf, count,
669                                    &card->info.blkt.inter_packet, 1000);
670 }
671
672 static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
673                    qeth_dev_blkt_inter_store);
674
675 static ssize_t qeth_dev_blkt_inter_jumbo_show(struct device *dev,
676                                 struct device_attribute *attr, char *buf)
677 {
678         struct qeth_card *card = dev_get_drvdata(dev);
679
680         return qeth_dev_blkt_show(buf, card,
681                                   card->info.blkt.inter_packet_jumbo);
682 }
683
684 static ssize_t qeth_dev_blkt_inter_jumbo_store(struct device *dev,
685                 struct device_attribute *attr, const char *buf, size_t count)
686 {
687         struct qeth_card *card = dev_get_drvdata(dev);
688
689         return qeth_dev_blkt_store(card, buf, count,
690                                    &card->info.blkt.inter_packet_jumbo, 1000);
691 }
692
693 static DEVICE_ATTR(inter_jumbo, 0644, qeth_dev_blkt_inter_jumbo_show,
694                    qeth_dev_blkt_inter_jumbo_store);
695
696 static struct attribute *qeth_blkt_device_attrs[] = {
697         &dev_attr_total.attr,
698         &dev_attr_inter.attr,
699         &dev_attr_inter_jumbo.attr,
700         NULL,
701 };
702 static struct attribute_group qeth_device_blkt_group = {
703         .name = "blkt",
704         .attrs = qeth_blkt_device_attrs,
705 };
706
707 static struct attribute *qeth_device_attrs[] = {
708         &dev_attr_state.attr,
709         &dev_attr_chpid.attr,
710         &dev_attr_if_name.attr,
711         &dev_attr_card_type.attr,
712         &dev_attr_inbuf_size.attr,
713         &dev_attr_portno.attr,
714         &dev_attr_portname.attr,
715         &dev_attr_priority_queueing.attr,
716         &dev_attr_buffer_count.attr,
717         &dev_attr_recover.attr,
718         &dev_attr_performance_stats.attr,
719         &dev_attr_layer2.attr,
720         &dev_attr_isolation.attr,
721         &dev_attr_hw_trap.attr,
722         &dev_attr_switch_attrs.attr,
723         NULL,
724 };
725 static struct attribute_group qeth_device_attr_group = {
726         .attrs = qeth_device_attrs,
727 };
728
729 const struct attribute_group *qeth_generic_attr_groups[] = {
730         &qeth_device_attr_group,
731         &qeth_device_blkt_group,
732         NULL,
733 };
734
735 static struct attribute *qeth_osn_device_attrs[] = {
736         &dev_attr_state.attr,
737         &dev_attr_chpid.attr,
738         &dev_attr_if_name.attr,
739         &dev_attr_card_type.attr,
740         &dev_attr_buffer_count.attr,
741         &dev_attr_recover.attr,
742         NULL,
743 };
744 static struct attribute_group qeth_osn_device_attr_group = {
745         .attrs = qeth_osn_device_attrs,
746 };
747 const struct attribute_group *qeth_osn_attr_groups[] = {
748         &qeth_osn_device_attr_group,
749         NULL,
750 };