0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #define KMSG_COMPONENT "qeth"
0011 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
0012
0013 #include <linux/list.h>
0014 #include <linux/rwsem.h>
0015 #include <asm/ebcdic.h>
0016
0017 #include "qeth_core.h"
0018
0019 static ssize_t qeth_dev_state_show(struct device *dev,
0020 struct device_attribute *attr, char *buf)
0021 {
0022 struct qeth_card *card = dev_get_drvdata(dev);
0023
0024 switch (card->state) {
0025 case CARD_STATE_DOWN:
0026 return sprintf(buf, "DOWN\n");
0027 case CARD_STATE_SOFTSETUP:
0028 if (card->dev->flags & IFF_UP)
0029 return sprintf(buf, "UP (LAN %s)\n",
0030 netif_carrier_ok(card->dev) ? "ONLINE" :
0031 "OFFLINE");
0032 return sprintf(buf, "SOFTSETUP\n");
0033 default:
0034 return sprintf(buf, "UNKNOWN\n");
0035 }
0036 }
0037
0038 static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
0039
0040 static ssize_t qeth_dev_chpid_show(struct device *dev,
0041 struct device_attribute *attr, char *buf)
0042 {
0043 struct qeth_card *card = dev_get_drvdata(dev);
0044
0045 return sprintf(buf, "%02X\n", card->info.chpid);
0046 }
0047
0048 static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
0049
0050 static ssize_t qeth_dev_if_name_show(struct device *dev,
0051 struct device_attribute *attr, char *buf)
0052 {
0053 struct qeth_card *card = dev_get_drvdata(dev);
0054
0055 return sprintf(buf, "%s\n", netdev_name(card->dev));
0056 }
0057
0058 static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
0059
0060 static ssize_t qeth_dev_card_type_show(struct device *dev,
0061 struct device_attribute *attr, char *buf)
0062 {
0063 struct qeth_card *card = dev_get_drvdata(dev);
0064
0065 return sprintf(buf, "%s\n", qeth_get_cardname_short(card));
0066 }
0067
0068 static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
0069
0070 static const char *qeth_get_bufsize_str(struct qeth_card *card)
0071 {
0072 if (card->qdio.in_buf_size == 16384)
0073 return "16k";
0074 else if (card->qdio.in_buf_size == 24576)
0075 return "24k";
0076 else if (card->qdio.in_buf_size == 32768)
0077 return "32k";
0078 else if (card->qdio.in_buf_size == 40960)
0079 return "40k";
0080 else
0081 return "64k";
0082 }
0083
0084 static ssize_t qeth_dev_inbuf_size_show(struct device *dev,
0085 struct device_attribute *attr, char *buf)
0086 {
0087 struct qeth_card *card = dev_get_drvdata(dev);
0088
0089 return sprintf(buf, "%s\n", qeth_get_bufsize_str(card));
0090 }
0091
0092 static DEVICE_ATTR(inbuf_size, 0444, qeth_dev_inbuf_size_show, NULL);
0093
0094 static ssize_t qeth_dev_portno_show(struct device *dev,
0095 struct device_attribute *attr, char *buf)
0096 {
0097 struct qeth_card *card = dev_get_drvdata(dev);
0098
0099 return sprintf(buf, "%i\n", card->dev->dev_port);
0100 }
0101
0102 static ssize_t qeth_dev_portno_store(struct device *dev,
0103 struct device_attribute *attr, const char *buf, size_t count)
0104 {
0105 struct qeth_card *card = dev_get_drvdata(dev);
0106 unsigned int portno, limit;
0107 int rc = 0;
0108
0109 rc = kstrtouint(buf, 16, &portno);
0110 if (rc)
0111 return rc;
0112 if (portno > QETH_MAX_PORTNO)
0113 return -EINVAL;
0114
0115 mutex_lock(&card->conf_mutex);
0116 if (card->state != CARD_STATE_DOWN) {
0117 rc = -EPERM;
0118 goto out;
0119 }
0120
0121 limit = (card->ssqd.pcnt ? card->ssqd.pcnt - 1 : card->ssqd.pcnt);
0122 if (portno > limit) {
0123 rc = -EINVAL;
0124 goto out;
0125 }
0126 card->dev->dev_port = portno;
0127 out:
0128 mutex_unlock(&card->conf_mutex);
0129 return rc ? rc : count;
0130 }
0131
0132 static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
0133
0134 static ssize_t qeth_dev_portname_show(struct device *dev,
0135 struct device_attribute *attr, char *buf)
0136 {
0137 return sprintf(buf, "no portname required\n");
0138 }
0139
0140 static ssize_t qeth_dev_portname_store(struct device *dev,
0141 struct device_attribute *attr, const char *buf, size_t count)
0142 {
0143 struct qeth_card *card = dev_get_drvdata(dev);
0144
0145 dev_warn_once(&card->gdev->dev,
0146 "portname is deprecated and is ignored\n");
0147 return count;
0148 }
0149
0150 static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
0151 qeth_dev_portname_store);
0152
0153 static ssize_t qeth_dev_prioqing_show(struct device *dev,
0154 struct device_attribute *attr, char *buf)
0155 {
0156 struct qeth_card *card = dev_get_drvdata(dev);
0157
0158 switch (card->qdio.do_prio_queueing) {
0159 case QETH_PRIO_Q_ING_PREC:
0160 return sprintf(buf, "%s\n", "by precedence");
0161 case QETH_PRIO_Q_ING_TOS:
0162 return sprintf(buf, "%s\n", "by type of service");
0163 case QETH_PRIO_Q_ING_SKB:
0164 return sprintf(buf, "%s\n", "by skb-priority");
0165 case QETH_PRIO_Q_ING_VLAN:
0166 return sprintf(buf, "%s\n", "by VLAN headers");
0167 case QETH_PRIO_Q_ING_FIXED:
0168 return sprintf(buf, "always queue %i\n",
0169 card->qdio.default_out_queue);
0170 default:
0171 return sprintf(buf, "disabled\n");
0172 }
0173 }
0174
0175 static ssize_t qeth_dev_prioqing_store(struct device *dev,
0176 struct device_attribute *attr, const char *buf, size_t count)
0177 {
0178 struct qeth_card *card = dev_get_drvdata(dev);
0179 int rc = 0;
0180
0181 if (IS_IQD(card) || IS_VM_NIC(card))
0182 return -EOPNOTSUPP;
0183
0184 mutex_lock(&card->conf_mutex);
0185 if (card->state != CARD_STATE_DOWN) {
0186 rc = -EPERM;
0187 goto out;
0188 }
0189
0190
0191
0192
0193 if (card->qdio.no_out_queues == 1) {
0194 card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
0195 rc = -EPERM;
0196 goto out;
0197 }
0198
0199 if (sysfs_streq(buf, "prio_queueing_prec")) {
0200 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_PREC;
0201 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
0202 } else if (sysfs_streq(buf, "prio_queueing_skb")) {
0203 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_SKB;
0204 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
0205 } else if (sysfs_streq(buf, "prio_queueing_tos")) {
0206 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_TOS;
0207 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
0208 } else if (sysfs_streq(buf, "prio_queueing_vlan")) {
0209 if (IS_LAYER3(card)) {
0210 rc = -EOPNOTSUPP;
0211 goto out;
0212 }
0213 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_VLAN;
0214 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
0215 } else if (sysfs_streq(buf, "no_prio_queueing:0")) {
0216 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_FIXED;
0217 card->qdio.default_out_queue = 0;
0218 } else if (sysfs_streq(buf, "no_prio_queueing:1")) {
0219 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_FIXED;
0220 card->qdio.default_out_queue = 1;
0221 } else if (sysfs_streq(buf, "no_prio_queueing:2")) {
0222 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_FIXED;
0223 card->qdio.default_out_queue = 2;
0224 } else if (sysfs_streq(buf, "no_prio_queueing:3")) {
0225 card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_FIXED;
0226 card->qdio.default_out_queue = 3;
0227 } else if (sysfs_streq(buf, "no_prio_queueing")) {
0228 card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
0229 card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
0230 } else
0231 rc = -EINVAL;
0232 out:
0233 mutex_unlock(&card->conf_mutex);
0234 return rc ? rc : count;
0235 }
0236
0237 static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
0238 qeth_dev_prioqing_store);
0239
0240 static ssize_t qeth_dev_bufcnt_show(struct device *dev,
0241 struct device_attribute *attr, char *buf)
0242 {
0243 struct qeth_card *card = dev_get_drvdata(dev);
0244
0245 return sprintf(buf, "%i\n", card->qdio.in_buf_pool.buf_count);
0246 }
0247
0248 static ssize_t qeth_dev_bufcnt_store(struct device *dev,
0249 struct device_attribute *attr, const char *buf, size_t count)
0250 {
0251 struct qeth_card *card = dev_get_drvdata(dev);
0252 unsigned int cnt;
0253 int rc = 0;
0254
0255 rc = kstrtouint(buf, 10, &cnt);
0256 if (rc)
0257 return rc;
0258
0259 mutex_lock(&card->conf_mutex);
0260 if (card->state != CARD_STATE_DOWN) {
0261 rc = -EPERM;
0262 goto out;
0263 }
0264
0265 cnt = clamp(cnt, QETH_IN_BUF_COUNT_MIN, QETH_IN_BUF_COUNT_MAX);
0266 rc = qeth_resize_buffer_pool(card, cnt);
0267
0268 out:
0269 mutex_unlock(&card->conf_mutex);
0270 return rc ? rc : count;
0271 }
0272
0273 static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
0274 qeth_dev_bufcnt_store);
0275
0276 static ssize_t qeth_dev_recover_store(struct device *dev,
0277 struct device_attribute *attr, const char *buf, size_t count)
0278 {
0279 struct qeth_card *card = dev_get_drvdata(dev);
0280 bool reset;
0281 int rc;
0282
0283 rc = kstrtobool(buf, &reset);
0284 if (rc)
0285 return rc;
0286
0287 if (!qeth_card_hw_is_reachable(card))
0288 return -EPERM;
0289
0290 if (reset)
0291 rc = qeth_schedule_recovery(card);
0292
0293 return rc ? rc : count;
0294 }
0295
0296 static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
0297
0298 static ssize_t qeth_dev_performance_stats_show(struct device *dev,
0299 struct device_attribute *attr, char *buf)
0300 {
0301 return sprintf(buf, "1\n");
0302 }
0303
0304 static ssize_t qeth_dev_performance_stats_store(struct device *dev,
0305 struct device_attribute *attr, const char *buf, size_t count)
0306 {
0307 struct qeth_card *card = dev_get_drvdata(dev);
0308 struct qeth_qdio_out_q *queue;
0309 unsigned int i;
0310 bool reset;
0311 int rc;
0312
0313 rc = kstrtobool(buf, &reset);
0314 if (rc)
0315 return rc;
0316
0317 if (reset) {
0318 memset(&card->stats, 0, sizeof(card->stats));
0319 for (i = 0; i < card->qdio.no_out_queues; i++) {
0320 queue = card->qdio.out_qs[i];
0321 if (!queue)
0322 break;
0323 memset(&queue->stats, 0, sizeof(queue->stats));
0324 }
0325 }
0326
0327 return count;
0328 }
0329
0330 static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show,
0331 qeth_dev_performance_stats_store);
0332
0333 static ssize_t qeth_dev_layer2_show(struct device *dev,
0334 struct device_attribute *attr, char *buf)
0335 {
0336 struct qeth_card *card = dev_get_drvdata(dev);
0337
0338 return sprintf(buf, "%i\n", card->options.layer);
0339 }
0340
0341 static ssize_t qeth_dev_layer2_store(struct device *dev,
0342 struct device_attribute *attr, const char *buf, size_t count)
0343 {
0344 struct qeth_card *card = dev_get_drvdata(dev);
0345 struct net_device *ndev;
0346 enum qeth_discipline_id newdis;
0347 unsigned int input;
0348 int rc;
0349
0350 rc = kstrtouint(buf, 16, &input);
0351 if (rc)
0352 return rc;
0353
0354 switch (input) {
0355 case 0:
0356 newdis = QETH_DISCIPLINE_LAYER3;
0357 break;
0358 case 1:
0359 newdis = QETH_DISCIPLINE_LAYER2;
0360 break;
0361 default:
0362 return -EINVAL;
0363 }
0364
0365 mutex_lock(&card->discipline_mutex);
0366 if (card->state != CARD_STATE_DOWN) {
0367 rc = -EPERM;
0368 goto out;
0369 }
0370
0371 if (card->options.layer == newdis)
0372 goto out;
0373 if (card->info.layer_enforced) {
0374
0375 rc = -EOPNOTSUPP;
0376 goto out;
0377 }
0378
0379 if (card->discipline) {
0380
0381 ndev = qeth_clone_netdev(card->dev);
0382 if (!ndev) {
0383 rc = -ENOMEM;
0384 goto out;
0385 }
0386
0387 qeth_remove_discipline(card);
0388 free_netdev(card->dev);
0389 card->dev = ndev;
0390 }
0391
0392 rc = qeth_setup_discipline(card, newdis);
0393
0394 out:
0395 mutex_unlock(&card->discipline_mutex);
0396 return rc ? rc : count;
0397 }
0398
0399 static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
0400 qeth_dev_layer2_store);
0401
0402 #define ATTR_QETH_ISOLATION_NONE ("none")
0403 #define ATTR_QETH_ISOLATION_FWD ("forward")
0404 #define ATTR_QETH_ISOLATION_DROP ("drop")
0405
0406 static ssize_t qeth_dev_isolation_show(struct device *dev,
0407 struct device_attribute *attr, char *buf)
0408 {
0409 struct qeth_card *card = dev_get_drvdata(dev);
0410
0411 switch (card->options.isolation) {
0412 case ISOLATION_MODE_NONE:
0413 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_NONE);
0414 case ISOLATION_MODE_FWD:
0415 return snprintf(buf, 9, "%s\n", ATTR_QETH_ISOLATION_FWD);
0416 case ISOLATION_MODE_DROP:
0417 return snprintf(buf, 6, "%s\n", ATTR_QETH_ISOLATION_DROP);
0418 default:
0419 return snprintf(buf, 5, "%s\n", "N/A");
0420 }
0421 }
0422
0423 static ssize_t qeth_dev_isolation_store(struct device *dev,
0424 struct device_attribute *attr, const char *buf, size_t count)
0425 {
0426 struct qeth_card *card = dev_get_drvdata(dev);
0427 enum qeth_ipa_isolation_modes isolation;
0428 int rc = 0;
0429
0430 mutex_lock(&card->conf_mutex);
0431 if (!IS_OSD(card) && !IS_OSX(card)) {
0432 rc = -EOPNOTSUPP;
0433 dev_err(&card->gdev->dev, "Adapter does not "
0434 "support QDIO data connection isolation\n");
0435 goto out;
0436 }
0437
0438
0439 if (sysfs_streq(buf, ATTR_QETH_ISOLATION_NONE)) {
0440 isolation = ISOLATION_MODE_NONE;
0441 } else if (sysfs_streq(buf, ATTR_QETH_ISOLATION_FWD)) {
0442 isolation = ISOLATION_MODE_FWD;
0443 } else if (sysfs_streq(buf, ATTR_QETH_ISOLATION_DROP)) {
0444 isolation = ISOLATION_MODE_DROP;
0445 } else {
0446 rc = -EINVAL;
0447 goto out;
0448 }
0449
0450 if (qeth_card_hw_is_reachable(card))
0451 rc = qeth_setadpparms_set_access_ctrl(card, isolation);
0452
0453 if (!rc)
0454 WRITE_ONCE(card->options.isolation, isolation);
0455
0456 out:
0457 mutex_unlock(&card->conf_mutex);
0458
0459 return rc ? rc : count;
0460 }
0461
0462 static DEVICE_ATTR(isolation, 0644, qeth_dev_isolation_show,
0463 qeth_dev_isolation_store);
0464
0465 static ssize_t qeth_dev_switch_attrs_show(struct device *dev,
0466 struct device_attribute *attr, char *buf)
0467 {
0468 struct qeth_card *card = dev_get_drvdata(dev);
0469 struct qeth_switch_info sw_info;
0470 int rc = 0;
0471
0472 if (!qeth_card_hw_is_reachable(card))
0473 return sprintf(buf, "n/a\n");
0474
0475 rc = qeth_query_switch_attributes(card, &sw_info);
0476 if (rc)
0477 return rc;
0478
0479 if (!sw_info.capabilities)
0480 rc = sprintf(buf, "unknown");
0481
0482 if (sw_info.capabilities & QETH_SWITCH_FORW_802_1)
0483 rc = sprintf(buf, (sw_info.settings & QETH_SWITCH_FORW_802_1 ?
0484 "[802.1]" : "802.1"));
0485 if (sw_info.capabilities & QETH_SWITCH_FORW_REFL_RELAY)
0486 rc += sprintf(buf + rc,
0487 (sw_info.settings & QETH_SWITCH_FORW_REFL_RELAY ?
0488 " [rr]" : " rr"));
0489 rc += sprintf(buf + rc, "\n");
0490
0491 return rc;
0492 }
0493
0494 static DEVICE_ATTR(switch_attrs, 0444,
0495 qeth_dev_switch_attrs_show, NULL);
0496
0497 static ssize_t qeth_hw_trap_show(struct device *dev,
0498 struct device_attribute *attr, char *buf)
0499 {
0500 struct qeth_card *card = dev_get_drvdata(dev);
0501
0502 if (card->info.hwtrap)
0503 return snprintf(buf, 5, "arm\n");
0504 else
0505 return snprintf(buf, 8, "disarm\n");
0506 }
0507
0508 static ssize_t qeth_hw_trap_store(struct device *dev,
0509 struct device_attribute *attr, const char *buf, size_t count)
0510 {
0511 struct qeth_card *card = dev_get_drvdata(dev);
0512 int rc = 0;
0513 int state = 0;
0514
0515 mutex_lock(&card->conf_mutex);
0516 if (qeth_card_hw_is_reachable(card))
0517 state = 1;
0518
0519 if (sysfs_streq(buf, "arm") && !card->info.hwtrap) {
0520 if (state) {
0521 if (qeth_is_diagass_supported(card,
0522 QETH_DIAGS_CMD_TRAP)) {
0523 rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM);
0524 if (!rc)
0525 card->info.hwtrap = 1;
0526 } else
0527 rc = -EINVAL;
0528 } else
0529 card->info.hwtrap = 1;
0530 } else if (sysfs_streq(buf, "disarm") && card->info.hwtrap) {
0531 if (state) {
0532 rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
0533 if (!rc)
0534 card->info.hwtrap = 0;
0535 } else
0536 card->info.hwtrap = 0;
0537 } else if (sysfs_streq(buf, "trap") && state && card->info.hwtrap)
0538 rc = qeth_hw_trap(card, QETH_DIAGS_TRAP_CAPTURE);
0539 else
0540 rc = -EINVAL;
0541
0542 mutex_unlock(&card->conf_mutex);
0543 return rc ? rc : count;
0544 }
0545
0546 static DEVICE_ATTR(hw_trap, 0644, qeth_hw_trap_show,
0547 qeth_hw_trap_store);
0548
0549 static ssize_t qeth_dev_blkt_store(struct qeth_card *card,
0550 const char *buf, size_t count, int *value, int max_value)
0551 {
0552 unsigned int input;
0553 int rc;
0554
0555 rc = kstrtouint(buf, 10, &input);
0556 if (rc)
0557 return rc;
0558
0559 if (input > max_value)
0560 return -EINVAL;
0561
0562 mutex_lock(&card->conf_mutex);
0563 if (card->state != CARD_STATE_DOWN)
0564 rc = -EPERM;
0565 else
0566 *value = input;
0567 mutex_unlock(&card->conf_mutex);
0568 return rc ? rc : count;
0569 }
0570
0571 static ssize_t qeth_dev_blkt_total_show(struct device *dev,
0572 struct device_attribute *attr, char *buf)
0573 {
0574 struct qeth_card *card = dev_get_drvdata(dev);
0575
0576 return sprintf(buf, "%i\n", card->info.blkt.time_total);
0577 }
0578
0579 static ssize_t qeth_dev_blkt_total_store(struct device *dev,
0580 struct device_attribute *attr, const char *buf, size_t count)
0581 {
0582 struct qeth_card *card = dev_get_drvdata(dev);
0583
0584 return qeth_dev_blkt_store(card, buf, count,
0585 &card->info.blkt.time_total, 5000);
0586 }
0587
0588 static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
0589 qeth_dev_blkt_total_store);
0590
0591 static ssize_t qeth_dev_blkt_inter_show(struct device *dev,
0592 struct device_attribute *attr, char *buf)
0593 {
0594 struct qeth_card *card = dev_get_drvdata(dev);
0595
0596 return sprintf(buf, "%i\n", card->info.blkt.inter_packet);
0597 }
0598
0599 static ssize_t qeth_dev_blkt_inter_store(struct device *dev,
0600 struct device_attribute *attr, const char *buf, size_t count)
0601 {
0602 struct qeth_card *card = dev_get_drvdata(dev);
0603
0604 return qeth_dev_blkt_store(card, buf, count,
0605 &card->info.blkt.inter_packet, 1000);
0606 }
0607
0608 static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
0609 qeth_dev_blkt_inter_store);
0610
0611 static ssize_t qeth_dev_blkt_inter_jumbo_show(struct device *dev,
0612 struct device_attribute *attr, char *buf)
0613 {
0614 struct qeth_card *card = dev_get_drvdata(dev);
0615
0616 return sprintf(buf, "%i\n", card->info.blkt.inter_packet_jumbo);
0617 }
0618
0619 static ssize_t qeth_dev_blkt_inter_jumbo_store(struct device *dev,
0620 struct device_attribute *attr, const char *buf, size_t count)
0621 {
0622 struct qeth_card *card = dev_get_drvdata(dev);
0623
0624 return qeth_dev_blkt_store(card, buf, count,
0625 &card->info.blkt.inter_packet_jumbo, 1000);
0626 }
0627
0628 static DEVICE_ATTR(inter_jumbo, 0644, qeth_dev_blkt_inter_jumbo_show,
0629 qeth_dev_blkt_inter_jumbo_store);
0630
0631 static struct attribute *qeth_blkt_device_attrs[] = {
0632 &dev_attr_total.attr,
0633 &dev_attr_inter.attr,
0634 &dev_attr_inter_jumbo.attr,
0635 NULL,
0636 };
0637
0638 static const struct attribute_group qeth_dev_blkt_group = {
0639 .name = "blkt",
0640 .attrs = qeth_blkt_device_attrs,
0641 };
0642
0643 static struct attribute *qeth_dev_extended_attrs[] = {
0644 &dev_attr_inbuf_size.attr,
0645 &dev_attr_portno.attr,
0646 &dev_attr_portname.attr,
0647 &dev_attr_priority_queueing.attr,
0648 &dev_attr_performance_stats.attr,
0649 &dev_attr_layer2.attr,
0650 &dev_attr_isolation.attr,
0651 &dev_attr_hw_trap.attr,
0652 &dev_attr_switch_attrs.attr,
0653 NULL,
0654 };
0655
0656 static const struct attribute_group qeth_dev_extended_group = {
0657 .attrs = qeth_dev_extended_attrs,
0658 };
0659
0660 static struct attribute *qeth_dev_attrs[] = {
0661 &dev_attr_state.attr,
0662 &dev_attr_chpid.attr,
0663 &dev_attr_if_name.attr,
0664 &dev_attr_card_type.attr,
0665 &dev_attr_buffer_count.attr,
0666 &dev_attr_recover.attr,
0667 NULL,
0668 };
0669
0670 static const struct attribute_group qeth_dev_group = {
0671 .attrs = qeth_dev_attrs,
0672 };
0673
0674 const struct attribute_group *qeth_dev_groups[] = {
0675 &qeth_dev_group,
0676 &qeth_dev_extended_group,
0677 &qeth_dev_blkt_group,
0678 NULL,
0679 };