|
@@ -4040,35 +4040,23 @@ static int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
|
|
|
return flush_cnt;
|
|
|
}
|
|
|
|
|
|
-int qeth_do_send_packet_fast(struct qeth_card *card,
|
|
|
- struct qeth_qdio_out_q *queue, struct sk_buff *skb,
|
|
|
+int qeth_do_send_packet_fast(struct qeth_qdio_out_q *queue, struct sk_buff *skb,
|
|
|
struct qeth_hdr *hdr, unsigned int offset,
|
|
|
unsigned int hd_len)
|
|
|
{
|
|
|
- struct qeth_qdio_out_buffer *buffer;
|
|
|
- int index;
|
|
|
+ int index = queue->next_buf_to_fill;
|
|
|
+ struct qeth_qdio_out_buffer *buffer = queue->bufs[index];
|
|
|
|
|
|
- /* spin until we get the queue ... */
|
|
|
- while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
|
|
|
- QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
|
|
|
- /* ... now we've got the queue */
|
|
|
- index = queue->next_buf_to_fill;
|
|
|
- buffer = queue->bufs[queue->next_buf_to_fill];
|
|
|
/*
|
|
|
* check if buffer is empty to make sure that we do not 'overtake'
|
|
|
* ourselves and try to fill a buffer that is already primed
|
|
|
*/
|
|
|
if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY)
|
|
|
- goto out;
|
|
|
- queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
|
|
|
- QDIO_MAX_BUFFERS_PER_Q;
|
|
|
- atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
|
|
|
+ return -EBUSY;
|
|
|
+ queue->next_buf_to_fill = (index + 1) % QDIO_MAX_BUFFERS_PER_Q;
|
|
|
qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len);
|
|
|
qeth_flush_buffers(queue, index, 1);
|
|
|
return 0;
|
|
|
-out:
|
|
|
- atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
|
|
|
- return -EBUSY;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(qeth_do_send_packet_fast);
|
|
|
|