diff options
author | Ursula Braun <ursula.braun@de.ibm.com> | 2010-01-10 21:50:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-13 23:34:55 -0500 |
commit | 76b11f8e270f04851774ff64b16e29e5a43d3a1a (patch) | |
tree | d4e7666c766bd1fba5ef2219717f302faf3a21bf /drivers/s390/net/qeth_l3_sys.c | |
parent | ab8932f3e8e07df92d6ce3fa41f5af0dda865429 (diff) |
qeth: HiperSockets Network Traffic Analyzer
New feature to trace HiperSockets network traffic for debugging
purposes.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net/qeth_l3_sys.c')
-rw-r--r-- | drivers/s390/net/qeth_l3_sys.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c index 3360b0941aa1..3f08b11274ae 100644 --- a/drivers/s390/net/qeth_l3_sys.c +++ b/drivers/s390/net/qeth_l3_sys.c | |||
@@ -319,6 +319,61 @@ static ssize_t qeth_l3_dev_checksum_store(struct device *dev, | |||
319 | static DEVICE_ATTR(checksumming, 0644, qeth_l3_dev_checksum_show, | 319 | static DEVICE_ATTR(checksumming, 0644, qeth_l3_dev_checksum_show, |
320 | qeth_l3_dev_checksum_store); | 320 | qeth_l3_dev_checksum_store); |
321 | 321 | ||
322 | static ssize_t qeth_l3_dev_sniffer_show(struct device *dev, | ||
323 | struct device_attribute *attr, char *buf) | ||
324 | { | ||
325 | struct qeth_card *card = dev_get_drvdata(dev); | ||
326 | |||
327 | if (!card) | ||
328 | return -EINVAL; | ||
329 | |||
330 | return sprintf(buf, "%i\n", card->options.sniffer ? 1 : 0); | ||
331 | } | ||
332 | |||
333 | static ssize_t qeth_l3_dev_sniffer_store(struct device *dev, | ||
334 | struct device_attribute *attr, const char *buf, size_t count) | ||
335 | { | ||
336 | struct qeth_card *card = dev_get_drvdata(dev); | ||
337 | int ret; | ||
338 | unsigned long i; | ||
339 | |||
340 | if (!card) | ||
341 | return -EINVAL; | ||
342 | |||
343 | if (card->info.type != QETH_CARD_TYPE_IQD) | ||
344 | return -EPERM; | ||
345 | |||
346 | if ((card->state != CARD_STATE_DOWN) && | ||
347 | (card->state != CARD_STATE_RECOVER)) | ||
348 | return -EPERM; | ||
349 | |||
350 | ret = strict_strtoul(buf, 16, &i); | ||
351 | if (ret) | ||
352 | return -EINVAL; | ||
353 | switch (i) { | ||
354 | case 0: | ||
355 | card->options.sniffer = i; | ||
356 | break; | ||
357 | case 1: | ||
358 | ret = qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd); | ||
359 | if (card->ssqd.qdioac2 & QETH_SNIFF_AVAIL) { | ||
360 | card->options.sniffer = i; | ||
361 | if (card->qdio.init_pool.buf_count != | ||
362 | QETH_IN_BUF_COUNT_MAX) | ||
363 | qeth_realloc_buffer_pool(card, | ||
364 | QETH_IN_BUF_COUNT_MAX); | ||
365 | break; | ||
366 | } else | ||
367 | return -EPERM; | ||
368 | default: /* fall through */ | ||
369 | return -EINVAL; | ||
370 | } | ||
371 | return count; | ||
372 | } | ||
373 | |||
374 | static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show, | ||
375 | qeth_l3_dev_sniffer_store); | ||
376 | |||
322 | static ssize_t qeth_l3_dev_large_send_show(struct device *dev, | 377 | static ssize_t qeth_l3_dev_large_send_show(struct device *dev, |
323 | struct device_attribute *attr, char *buf) | 378 | struct device_attribute *attr, char *buf) |
324 | { | 379 | { |
@@ -373,6 +428,7 @@ static struct attribute *qeth_l3_device_attrs[] = { | |||
373 | &dev_attr_broadcast_mode.attr, | 428 | &dev_attr_broadcast_mode.attr, |
374 | &dev_attr_canonical_macaddr.attr, | 429 | &dev_attr_canonical_macaddr.attr, |
375 | &dev_attr_checksumming.attr, | 430 | &dev_attr_checksumming.attr, |
431 | &dev_attr_sniffer.attr, | ||
376 | &dev_attr_large_send.attr, | 432 | &dev_attr_large_send.attr, |
377 | NULL, | 433 | NULL, |
378 | }; | 434 | }; |