Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Trivial conflict in CAN, keep the net-next + the byteswap wrapper. Conflicts: drivers/net/can/usb/gs_usb.c Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
|
||||
#include <net/iucv/af_iucv.h>
|
||||
#include <net/dsfield.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#include <asm/ebcdic.h>
|
||||
#include <asm/chpid.h>
|
||||
@@ -499,17 +500,12 @@ static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx,
|
||||
|
||||
}
|
||||
}
|
||||
if (forced_cleanup && (atomic_read(&(q->bufs[bidx]->state)) ==
|
||||
QETH_QDIO_BUF_HANDLED_DELAYED)) {
|
||||
/* for recovery situations */
|
||||
qeth_init_qdio_out_buf(q, bidx);
|
||||
QETH_CARD_TEXT(q->card, 2, "clprecov");
|
||||
}
|
||||
}
|
||||
|
||||
static void qeth_qdio_handle_aob(struct qeth_card *card,
|
||||
unsigned long phys_aob_addr)
|
||||
{
|
||||
enum qeth_qdio_out_buffer_state new_state = QETH_QDIO_BUF_QAOB_OK;
|
||||
struct qaob *aob;
|
||||
struct qeth_qdio_out_buffer *buffer;
|
||||
enum iucv_tx_notify notification;
|
||||
@@ -521,22 +517,6 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
|
||||
buffer = (struct qeth_qdio_out_buffer *) aob->user1;
|
||||
QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
|
||||
|
||||
if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
|
||||
QETH_QDIO_BUF_IN_CQ) == QETH_QDIO_BUF_PRIMED) {
|
||||
notification = TX_NOTIFY_OK;
|
||||
} else {
|
||||
WARN_ON_ONCE(atomic_read(&buffer->state) !=
|
||||
QETH_QDIO_BUF_PENDING);
|
||||
atomic_set(&buffer->state, QETH_QDIO_BUF_IN_CQ);
|
||||
notification = TX_NOTIFY_DELAYED_OK;
|
||||
}
|
||||
|
||||
if (aob->aorc != 0) {
|
||||
QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
|
||||
notification = qeth_compute_cq_notification(aob->aorc, 1);
|
||||
}
|
||||
qeth_notify_skbs(buffer->q, buffer, notification);
|
||||
|
||||
/* Free dangling allocations. The attached skbs are handled by
|
||||
* qeth_cleanup_handled_pending().
|
||||
*/
|
||||
@@ -548,7 +528,33 @@ static void qeth_qdio_handle_aob(struct qeth_card *card,
|
||||
if (data && buffer->is_header[i])
|
||||
kmem_cache_free(qeth_core_header_cache, data);
|
||||
}
|
||||
atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
|
||||
|
||||
if (aob->aorc) {
|
||||
QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
|
||||
new_state = QETH_QDIO_BUF_QAOB_ERROR;
|
||||
}
|
||||
|
||||
switch (atomic_xchg(&buffer->state, new_state)) {
|
||||
case QETH_QDIO_BUF_PRIMED:
|
||||
/* Faster than TX completion code. */
|
||||
notification = qeth_compute_cq_notification(aob->aorc, 0);
|
||||
qeth_notify_skbs(buffer->q, buffer, notification);
|
||||
atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
|
||||
break;
|
||||
case QETH_QDIO_BUF_PENDING:
|
||||
/* TX completion code is active and will handle the async
|
||||
* completion for us.
|
||||
*/
|
||||
break;
|
||||
case QETH_QDIO_BUF_NEED_QAOB:
|
||||
/* TX completion code is already finished. */
|
||||
notification = qeth_compute_cq_notification(aob->aorc, 1);
|
||||
qeth_notify_skbs(buffer->q, buffer, notification);
|
||||
atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
}
|
||||
|
||||
qdio_release_aob(aob);
|
||||
}
|
||||
@@ -1405,7 +1411,7 @@ static void qeth_notify_skbs(struct qeth_qdio_out_q *q,
|
||||
skb_queue_walk(&buf->skb_list, skb) {
|
||||
QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
|
||||
QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
|
||||
if (skb->protocol == htons(ETH_P_AF_IUCV) && skb->sk)
|
||||
if (skb->sk && skb->sk->sk_family == PF_IUCV)
|
||||
iucv_sk(skb->sk)->sk_txnotify(skb, notification);
|
||||
}
|
||||
}
|
||||
@@ -1416,9 +1422,6 @@ static void qeth_tx_complete_buf(struct qeth_qdio_out_buffer *buf, bool error,
|
||||
struct qeth_qdio_out_q *queue = buf->q;
|
||||
struct sk_buff *skb;
|
||||
|
||||
/* release may never happen from within CQ tasklet scope */
|
||||
WARN_ON_ONCE(atomic_read(&buf->state) == QETH_QDIO_BUF_IN_CQ);
|
||||
|
||||
if (atomic_read(&buf->state) == QETH_QDIO_BUF_PENDING)
|
||||
qeth_notify_skbs(queue, buf, TX_NOTIFY_GENERALERROR);
|
||||
|
||||
@@ -6078,9 +6081,32 @@ static void qeth_iqd_tx_complete(struct qeth_qdio_out_q *queue,
|
||||
|
||||
if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
|
||||
QETH_QDIO_BUF_PENDING) ==
|
||||
QETH_QDIO_BUF_PRIMED)
|
||||
QETH_QDIO_BUF_PRIMED) {
|
||||
qeth_notify_skbs(queue, buffer, TX_NOTIFY_PENDING);
|
||||
|
||||
/* Handle race with qeth_qdio_handle_aob(): */
|
||||
switch (atomic_xchg(&buffer->state,
|
||||
QETH_QDIO_BUF_NEED_QAOB)) {
|
||||
case QETH_QDIO_BUF_PENDING:
|
||||
/* No concurrent QAOB notification. */
|
||||
break;
|
||||
case QETH_QDIO_BUF_QAOB_OK:
|
||||
qeth_notify_skbs(queue, buffer,
|
||||
TX_NOTIFY_DELAYED_OK);
|
||||
atomic_set(&buffer->state,
|
||||
QETH_QDIO_BUF_HANDLED_DELAYED);
|
||||
break;
|
||||
case QETH_QDIO_BUF_QAOB_ERROR:
|
||||
qeth_notify_skbs(queue, buffer,
|
||||
TX_NOTIFY_DELAYED_GENERALERROR);
|
||||
atomic_set(&buffer->state,
|
||||
QETH_QDIO_BUF_HANDLED_DELAYED);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
}
|
||||
}
|
||||
|
||||
QETH_CARD_TEXT_(card, 5, "pel%u", bidx);
|
||||
|
||||
/* prepare the queue slot for re-use: */
|
||||
|
||||
Reference in New Issue
Block a user