diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 19:04:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 19:04:22 -0400 |
commit | 21cdbc1378e8aa96e1ed4a606dce1a8e7daf7fdf (patch) | |
tree | 55b6c294b912ccdc3eede15960b0ece53a69d902 /drivers/s390/net | |
parent | 86d9c070175de65890794fa227b68297da6206d8 (diff) | |
parent | ef3500b2b2955af4fa6b0564b51c0c604e38c571 (diff) |
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: (81 commits)
[S390] remove duplicated #includes
[S390] cpumask: use mm_cpumask() wrapper
[S390] cpumask: Use accessors code.
[S390] cpumask: prepare for iterators to only go to nr_cpu_ids/nr_cpumask_bits.
[S390] cpumask: remove cpu_coregroup_map
[S390] fix clock comparator save area usage
[S390] Add hwcap flag for the etf3 enhancement facility
[S390] Ensure that ipl panic notifier is called late.
[S390] fix dfp elf hwcap/facility bit detection
[S390] smp: perform initial cpu reset before starting a cpu
[S390] smp: fix memory leak on __cpu_up
[S390] ipl: Improve checking logic and remove switch defaults.
[S390] s390dbf: Remove needless check for NULL pointer.
[S390] s390dbf: Remove redundant initilizations.
[S390] use kzfree()
[S390] BUG to BUG_ON changes
[S390] zfcpdump: Prevent zcore from beeing built as a kernel module.
[S390] Use csum_partial in checksum.h
[S390] cleanup lowcore.h
[S390] eliminate ipl_device from lowcore
...
Diffstat (limited to 'drivers/s390/net')
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 55 |
1 files changed, 17 insertions, 38 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 6fec3cfcf978..c827d69b5a91 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -2680,40 +2680,21 @@ static int qeth_handle_send_error(struct qeth_card *card, | |||
2680 | struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err) | 2680 | struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err) |
2681 | { | 2681 | { |
2682 | int sbalf15 = buffer->buffer->element[15].flags & 0xff; | 2682 | int sbalf15 = buffer->buffer->element[15].flags & 0xff; |
2683 | int cc = qdio_err & 3; | ||
2684 | 2683 | ||
2685 | QETH_DBF_TEXT(TRACE, 6, "hdsnderr"); | 2684 | QETH_DBF_TEXT(TRACE, 6, "hdsnderr"); |
2686 | qeth_check_qdio_errors(buffer->buffer, qdio_err, "qouterr"); | 2685 | qeth_check_qdio_errors(buffer->buffer, qdio_err, "qouterr"); |
2687 | switch (cc) { | 2686 | |
2688 | case 0: | 2687 | if (!qdio_err) |
2689 | if (qdio_err) { | ||
2690 | QETH_DBF_TEXT(TRACE, 1, "lnkfail"); | ||
2691 | QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); | ||
2692 | QETH_DBF_TEXT_(TRACE, 1, "%04x %02x", | ||
2693 | (u16)qdio_err, (u8)sbalf15); | ||
2694 | return QETH_SEND_ERROR_LINK_FAILURE; | ||
2695 | } | ||
2696 | return QETH_SEND_ERROR_NONE; | 2688 | return QETH_SEND_ERROR_NONE; |
2697 | case 2: | 2689 | |
2698 | if (qdio_err & QDIO_ERROR_SIGA_BUSY) { | 2690 | if ((sbalf15 >= 15) && (sbalf15 <= 31)) |
2699 | QETH_DBF_TEXT(TRACE, 1, "SIGAcc2B"); | 2691 | return QETH_SEND_ERROR_RETRY; |
2700 | QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); | 2692 | |
2701 | return QETH_SEND_ERROR_KICK_IT; | 2693 | QETH_DBF_TEXT(TRACE, 1, "lnkfail"); |
2702 | } | 2694 | QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); |
2703 | if ((sbalf15 >= 15) && (sbalf15 <= 31)) | 2695 | QETH_DBF_TEXT_(TRACE, 1, "%04x %02x", |
2704 | return QETH_SEND_ERROR_RETRY; | 2696 | (u16)qdio_err, (u8)sbalf15); |
2705 | return QETH_SEND_ERROR_LINK_FAILURE; | 2697 | return QETH_SEND_ERROR_LINK_FAILURE; |
2706 | /* look at qdio_error and sbalf 15 */ | ||
2707 | case 1: | ||
2708 | QETH_DBF_TEXT(TRACE, 1, "SIGAcc1"); | ||
2709 | QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); | ||
2710 | return QETH_SEND_ERROR_LINK_FAILURE; | ||
2711 | case 3: | ||
2712 | default: | ||
2713 | QETH_DBF_TEXT(TRACE, 1, "SIGAcc3"); | ||
2714 | QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); | ||
2715 | return QETH_SEND_ERROR_KICK_IT; | ||
2716 | } | ||
2717 | } | 2698 | } |
2718 | 2699 | ||
2719 | /* | 2700 | /* |
@@ -2849,10 +2830,14 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, | |||
2849 | qeth_get_micros() - | 2830 | qeth_get_micros() - |
2850 | queue->card->perf_stats.outbound_do_qdio_start_time; | 2831 | queue->card->perf_stats.outbound_do_qdio_start_time; |
2851 | if (rc) { | 2832 | if (rc) { |
2833 | queue->card->stats.tx_errors += count; | ||
2834 | /* ignore temporary SIGA errors without busy condition */ | ||
2835 | if (rc == QDIO_ERROR_SIGA_TARGET) | ||
2836 | return; | ||
2852 | QETH_DBF_TEXT(TRACE, 2, "flushbuf"); | 2837 | QETH_DBF_TEXT(TRACE, 2, "flushbuf"); |
2853 | QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); | 2838 | QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); |
2854 | QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_DDEV_ID(queue->card)); | 2839 | QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_DDEV_ID(queue->card)); |
2855 | queue->card->stats.tx_errors += count; | 2840 | |
2856 | /* this must not happen under normal circumstances. if it | 2841 | /* this must not happen under normal circumstances. if it |
2857 | * happens something is really wrong -> recover */ | 2842 | * happens something is really wrong -> recover */ |
2858 | qeth_schedule_recovery(queue->card); | 2843 | qeth_schedule_recovery(queue->card); |
@@ -2927,13 +2912,7 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, | |||
2927 | } | 2912 | } |
2928 | for (i = first_element; i < (first_element + count); ++i) { | 2913 | for (i = first_element; i < (first_element + count); ++i) { |
2929 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; | 2914 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; |
2930 | /*we only handle the KICK_IT error by doing a recovery */ | 2915 | qeth_handle_send_error(card, buffer, qdio_error); |
2931 | if (qeth_handle_send_error(card, buffer, qdio_error) | ||
2932 | == QETH_SEND_ERROR_KICK_IT){ | ||
2933 | netif_stop_queue(card->dev); | ||
2934 | qeth_schedule_recovery(card); | ||
2935 | return; | ||
2936 | } | ||
2937 | qeth_clear_output_buffer(queue, buffer); | 2916 | qeth_clear_output_buffer(queue, buffer); |
2938 | } | 2917 | } |
2939 | atomic_sub(count, &queue->used_buffers); | 2918 | atomic_sub(count, &queue->used_buffers); |