diff options
| author | Frank Pavlic <fpavlic@de.ibm.com> | 2005-11-10 13:50:58 +0100 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-11 08:26:21 -0500 | 
| commit | d805d7c692e414c3adf01bb414a8c542ac2e67d1 (patch) | |
| tree | d1c3707b423e992970c24573a5d9689d569105ce /drivers/s390 | |
| parent | 6c88ad2ded1de1fe87e917b4a0a45873939c16e1 (diff) | |
| download | linux-d805d7c692e414c3adf01bb414a8c542ac2e67d1.tar.bz2 | |
[PATCH] s390: some more qeth fixes
[patch 4/7] s390: some more qeth fixes
From: Frank Pavlic <fpavlic@de.ibm.com>
From: Peter Tiedemann <ptiedem@de.ibm.com>
	- possible race on list fixed by reset
	  list processing after every operation
	- traffic hang fixed
Signed-off-by: Frank Pavlic <fpavlic@de.ibm.com>
diffstat:
 qeth_main.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/s390')
| -rw-r--r-- | drivers/s390/net/qeth_main.c | 11 | 
1 files changed, 7 insertions, 4 deletions
| diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 0a5d758b531e..d6844b24a8aa 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -1,6 +1,6 @@  /*   * - * linux/drivers/s390/net/qeth_main.c ($Revision: 1.236 $) + * linux/drivers/s390/net/qeth_main.c ($Revision: 1.238 $)   *   * Linux on zSeries OSA Express and HiperSockets support   * @@ -12,7 +12,7 @@   *			  Frank Pavlic (pavlic@de.ibm.com) and   *		 	  Thomas Spatzier <tspat@de.ibm.com>   * - *    $Revision: 1.236 $	 $Date: 2005/05/04 20:19:18 $ + *    $Revision: 1.238 $	 $Date: 2005/05/04 20:19:18 $   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -72,7 +72,7 @@  #include "qeth_eddp.h"  #include "qeth_tso.h" -#define VERSION_QETH_C "$Revision: 1.236 $" +#define VERSION_QETH_C "$Revision: 1.238 $"  static const char *version = "qeth S/390 OSA-Express driver";  /** @@ -799,7 +799,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)  {  	struct qeth_ipaddr *addr, *tmp;  	int rc; - +again:  	list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {  		if (addr->is_multicast) {  			spin_unlock_irqrestore(&card->ip_lock, *flags); @@ -808,6 +808,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)  			if (!rc) {  				list_del(&addr->entry);  				kfree(addr); +				goto again;  			}  		}  	} @@ -4336,6 +4337,8 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,  out:  	if (flush_count)  		qeth_flush_buffers(queue, 0, start_index, flush_count); +	else if (!atomic_read(&queue->set_pci_flags_count)) +		atomic_swap(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);  	/*  	 * queue->state will go from LOCKED -> UNLOCKED or from  	 * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us |