]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.31/patches.arch/s390-11-16-qeth_siga_error_handling.patch
Changed checkfs to auto reboot after correctable fsck fixes.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.arch / s390-11-16-qeth_siga_error_handling.patch
1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: qeth: adept SIGA error handling to qdio changes
3 References: bnc#484767,LTC#52300
4
5 Symptom: A qeth recovery may be triggered on hipersocket devices
6 in case no buffers are available on the target.
7 Problem: Recovery is triggered for all non-zero return values of
8 do_QDIO.
9 Solution: Check for SIGA errors after do_QDIO and don't recover in case
10 of temporary problems.
11
12 Acked-by: John Jolly <jjolly@suse.de>
13 ---
14 drivers/s390/net/qeth_core_main.c | 55 +++++++++++---------------------------
15 1 file changed, 17 insertions(+), 38 deletions(-)
16
17 Index: linux-sles11/drivers/s390/net/qeth_core_main.c
18 ===================================================================
19 --- linux-sles11.orig/drivers/s390/net/qeth_core_main.c
20 +++ linux-sles11/drivers/s390/net/qeth_core_main.c
21 @@ -2659,40 +2659,21 @@ static int qeth_handle_send_error(struct
22 struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err)
23 {
24 int sbalf15 = buffer->buffer->element[15].flags & 0xff;
25 - int cc = qdio_err & 3;
26
27 QETH_DBF_TEXT(TRACE, 6, "hdsnderr");
28 qeth_check_qdio_errors(buffer->buffer, qdio_err, "qouterr");
29 - switch (cc) {
30 - case 0:
31 - if (qdio_err) {
32 - QETH_DBF_TEXT(TRACE, 1, "lnkfail");
33 - QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
34 - QETH_DBF_TEXT_(TRACE, 1, "%04x %02x",
35 - (u16)qdio_err, (u8)sbalf15);
36 - return QETH_SEND_ERROR_LINK_FAILURE;
37 - }
38 +
39 + if (!qdio_err)
40 return QETH_SEND_ERROR_NONE;
41 - case 2:
42 - if (qdio_err & QDIO_ERROR_SIGA_BUSY) {
43 - QETH_DBF_TEXT(TRACE, 1, "SIGAcc2B");
44 - QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
45 - return QETH_SEND_ERROR_KICK_IT;
46 - }
47 - if ((sbalf15 >= 15) && (sbalf15 <= 31))
48 - return QETH_SEND_ERROR_RETRY;
49 - return QETH_SEND_ERROR_LINK_FAILURE;
50 - /* look at qdio_error and sbalf 15 */
51 - case 1:
52 - QETH_DBF_TEXT(TRACE, 1, "SIGAcc1");
53 - QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
54 - return QETH_SEND_ERROR_LINK_FAILURE;
55 - case 3:
56 - default:
57 - QETH_DBF_TEXT(TRACE, 1, "SIGAcc3");
58 - QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
59 - return QETH_SEND_ERROR_KICK_IT;
60 - }
61 +
62 + if ((sbalf15 >= 15) && (sbalf15 <= 31))
63 + return QETH_SEND_ERROR_RETRY;
64 +
65 + QETH_DBF_TEXT(TRACE, 1, "lnkfail");
66 + QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
67 + QETH_DBF_TEXT_(TRACE, 1, "%04x %02x",
68 + (u16)qdio_err, (u8)sbalf15);
69 + return QETH_SEND_ERROR_LINK_FAILURE;
70 }
71
72 /*
73 @@ -2828,10 +2809,14 @@ static void qeth_flush_buffers(struct qe
74 qeth_get_micros() -
75 queue->card->perf_stats.outbound_do_qdio_start_time;
76 if (rc) {
77 + queue->card->stats.tx_errors += count;
78 + /* ignore temporary SIGA errors without busy condition */
79 + if (rc == 2)
80 + return;
81 QETH_DBF_TEXT(TRACE, 2, "flushbuf");
82 QETH_DBF_TEXT_(TRACE, 2, " err%d", rc);
83 QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_DDEV_ID(queue->card));
84 - queue->card->stats.tx_errors += count;
85 +
86 /* this must not happen under normal circumstances. if it
87 * happens something is really wrong -> recover */
88 qeth_schedule_recovery(queue->card);
89 @@ -2906,13 +2891,7 @@ void qeth_qdio_output_handler(struct ccw
90 }
91 for (i = first_element; i < (first_element + count); ++i) {
92 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
93 - /*we only handle the KICK_IT error by doing a recovery */
94 - if (qeth_handle_send_error(card, buffer, qdio_error)
95 - == QETH_SEND_ERROR_KICK_IT){
96 - netif_stop_queue(card->dev);
97 - qeth_schedule_recovery(card);
98 - return;
99 - }
100 + qeth_handle_send_error(card, buffer, qdio_error);
101 qeth_clear_output_buffer(queue, buffer);
102 }
103 atomic_sub(count, &queue->used_buffers);