root/drivers/s390/net/qeth_core_sys.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. qeth_dev_state_show
  2. qeth_dev_chpid_show
  3. qeth_dev_if_name_show
  4. qeth_dev_card_type_show
  5. qeth_get_bufsize_str
  6. qeth_dev_inbuf_size_show
  7. qeth_dev_portno_show
  8. qeth_dev_portno_store
  9. qeth_dev_portname_show
  10. qeth_dev_portname_store
  11. qeth_dev_prioqing_show
  12. qeth_dev_prioqing_store
  13. qeth_dev_bufcnt_show
  14. qeth_dev_bufcnt_store
  15. qeth_dev_recover_store
  16. qeth_dev_performance_stats_show
  17. qeth_dev_performance_stats_store
  18. qeth_dev_layer2_show
  19. qeth_dev_layer2_store
  20. qeth_dev_isolation_show
  21. qeth_dev_isolation_store
  22. qeth_dev_switch_attrs_show
  23. qeth_hw_trap_show
  24. qeth_hw_trap_store
  25. qeth_dev_blkt_show
  26. qeth_dev_blkt_store
  27. qeth_dev_blkt_total_show
  28. qeth_dev_blkt_total_store
  29. qeth_dev_blkt_inter_show
  30. qeth_dev_blkt_inter_store
  31. qeth_dev_blkt_inter_jumbo_show
  32. qeth_dev_blkt_inter_jumbo_store

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

/* [<][>][^][v][top][bottom][index][help] */