···440440 * index of buffer to be filled by driver; state EMPTY or PACKING441441 */442442 int next_buf_to_fill;443443- int sync_iqdio_error;444443 /*445444 * number of buffers that are currently filled (PRIMED)446445 * -> these buffers are hardware-owned···693694 unsigned char mc_addrlen;694695 int is_vmac;695696};696696-697697-struct qeth_skb_data {698698- __u32 magic;699699- int count;700700-};701701-702702-#define QETH_SKB_MAGIC 0x71657468703703-#define QETH_SIGA_CC2_RETRIES 3704697705698struct qeth_rx {706699 int b_count;
+9-46
drivers/s390/net/qeth_core_main.c
···877877 return;878878}879879880880-static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,881881- struct qeth_qdio_out_buffer *buf, unsigned int qeth_skip_skb)880880+static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,881881+ struct qeth_qdio_out_buffer *buf)882882{883883 int i;884884 struct sk_buff *skb;···887887 if (buf->buffer->element[0].flags & 0x40)888888 atomic_dec(&queue->set_pci_flags_count);889889890890- if (!qeth_skip_skb) {890890+ skb = skb_dequeue(&buf->skb_list);891891+ while (skb) {892892+ atomic_dec(&skb->users);893893+ dev_kfree_skb_any(skb);891894 skb = skb_dequeue(&buf->skb_list);892892- while (skb) {893893- atomic_dec(&skb->users);894894- dev_kfree_skb_any(skb);895895- skb = skb_dequeue(&buf->skb_list);896896- }897895 }898896 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) {899897 if (buf->buffer->element[i].addr && buf->is_header[i])···905907 buf->buffer->element[15].flags = 0;906908 buf->next_element_to_fill = 0;907909 atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY);908908-}909909-910910-static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,911911- struct qeth_qdio_out_buffer *buf)912912-{913913- __qeth_clear_output_buffer(queue, buf, 0);914910}915911916912void qeth_clear_qdio_buffers(struct qeth_card *card)···28252833 }28262834 }2827283528282828- queue->sync_iqdio_error = 0;28292836 queue->card->dev->trans_start = jiffies;28302837 if (queue->card->options.performance_stats) {28312838 queue->card->perf_stats.outbound_do_qdio_cnt++;···28402849 queue->card->perf_stats.outbound_do_qdio_time +=28412850 qeth_get_micros() -28422851 queue->card->perf_stats.outbound_do_qdio_start_time;28432843- if (rc > 0) {28442844- if (!(rc & QDIO_ERROR_SIGA_BUSY))28452845- queue->sync_iqdio_error = rc & 3;28462846- }28472852 if (rc) {28482853 queue->card->stats.tx_errors += count;28492854 /* ignore temporary SIGA errors without busy condition */···29032916{29042917 struct qeth_card *card = (struct qeth_card *)card_ptr;2905291829062906- if (card->dev)29192919+ if (card->dev && (card->dev->flags & IFF_UP))29072920 napi_schedule(&card->napi);29082921}29092922EXPORT_SYMBOL_GPL(qeth_qdio_start_poll);···29272940 struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];29282941 struct qeth_qdio_out_buffer *buffer;29292942 int i;29302930- unsigned qeth_send_err;2931294329322944 QETH_CARD_TEXT(card, 6, "qdouhdl");29332945 if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) {···29422956 }29432957 for (i = first_element; i < (first_element + count); ++i) {29442958 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];29452945- qeth_send_err = qeth_handle_send_error(card, buffer, qdio_error);29462946- __qeth_clear_output_buffer(queue, buffer,29472947- (qeth_send_err == QETH_SEND_ERROR_RETRY) ? 1 : 0);29592959+ qeth_handle_send_error(card, buffer, qdio_error);29602960+ qeth_clear_output_buffer(queue, buffer);29482961 }29492962 atomic_sub(count, &queue->used_buffers);29502963 /* check if we need to do something on this outbound queue */···31683183 int offset, int hd_len)31693184{31703185 struct qeth_qdio_out_buffer *buffer;31713171- struct sk_buff *skb1;31723172- struct qeth_skb_data *retry_ctrl;31733186 int index;31743174- int rc;3175318731763188 /* spin until we get the queue ... */31773189 while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,···31873205 atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);31883206 qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len);31893207 qeth_flush_buffers(queue, index, 1);31903190- if (queue->sync_iqdio_error == 2) {31913191- skb1 = skb_dequeue(&buffer->skb_list);31923192- while (skb1) {31933193- atomic_dec(&skb1->users);31943194- skb1 = skb_dequeue(&buffer->skb_list);31953195- }31963196- retry_ctrl = (struct qeth_skb_data *) &skb->cb[16];31973197- if (retry_ctrl->magic != QETH_SKB_MAGIC) {31983198- retry_ctrl->magic = QETH_SKB_MAGIC;31993199- retry_ctrl->count = 0;32003200- }32013201- if (retry_ctrl->count < QETH_SIGA_CC2_RETRIES) {32023202- retry_ctrl->count++;32033203- rc = dev_queue_xmit(skb);32043204- } else {32053205- dev_kfree_skb_any(skb);32063206- QETH_CARD_TEXT(card, 2, "qrdrop");32073207- }32083208- }32093208 return 0;32103209out:32113210 atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
+5
include/linux/netdevice.h
···1554155415551555static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)15561556{15571557+ if (WARN_ON(!dev_queue)) {15581558+ printk(KERN_INFO "netif_stop_queue() cannot be called before "15591559+ "register_netdev()");15601560+ return;15611561+ }15571562 set_bit(__QUEUE_STATE_XOFF, &dev_queue->state);15581563}15591564