aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-03-26 19:04:22 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-03-26 19:04:22 -0400
commit21cdbc1378e8aa96e1ed4a606dce1a8e7daf7fdf (patch)
tree55b6c294b912ccdc3eede15960b0ece53a69d902 /drivers/s390/net
parent86d9c070175de65890794fa227b68297da6206d8 (diff)
parentef3500b2b2955af4fa6b0564b51c0c604e38c571 (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.c55
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);