: s390: network driver fixes and feature
Subsystems (6)
cover : s390: network driver fixes and feature
Hi ,
this is the second version of patches I have sent already two days ago. I removed the kthread_run patch (3/5) .
Patches 1-3 contain fixes,patch 4 includes some kind of a new feature although it is just an adaption to the latest OSA hardware specification
and just prints out human readable text on specific error return codes.
Please apply them .
Thank you .
Frank
PATCH 1/4 s390: qeth driver connection hang
From: Ursula Braun <[email protected]>
Frank Pavlic <[email protected]>
Connection hangs when using EDDP mode because sk_protocol is NULL when skb has been copied via skb_copy. This results in dropping packets.
Also keep MAC address after recovery of Virtual NICs so that traffic can flow again and duplicate statements in qeth_dev_set_route_store removed.
--- qeth_eddp.c | 4 ++-- qeth_eddp.h | 3 ++- qeth_main.c | 5 +++-- qeth_sys.c | 2 -- 4 files changed, 7 insertions(+), 7 deletions(-)
drivers/s390/net/qeth_eddp.c +2 -2
@@ -620,10 +620,10 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,struct qeth_eddp_context *qeth_eddp_create_context (struct qeth_card *card,struct sk_buff *skb, -struct qeth_hdr *qhdr) +struct qeth_hdr *qhdr,unsigned char sk_protocol) {QETH_DBF_TEXT (trace,5 ,"creddpc" ); -switch (skb->sk->sk_protocol){ +switch (sk_protocol) {case IPPROTO_TCP :return qeth_eddp_create_context_tcp (card, skb, qhdr);default :
drivers/s390/net/qeth_eddp.h +2 -1
@@ -34,7 +34,8 @@ struct qeth_eddp_context_reference { };extern struct qeth_eddp_context * -qeth_eddp_create_context (struct qeth_card *,struct sk_buff *,struct qeth_hdr *); +qeth_eddp_create_context (struct qeth_card *,struct sk_buff *, +struct qeth_hdr *,unsigned char );extern void qeth_eddp_put_context (struct qeth_eddp_context *);
drivers/s390/net/qeth_main.c +3 -2
@@ -4423,7 +4423,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)qeth_fill_header (card, hdr, new_skb, ipv, cast_type); }if (large_send ==QETH_LARGE_SEND_EDDP ) { - ctx =qeth_eddp_create_context (card, new_skb, hdr); + ctx =qeth_eddp_create_context (card, new_skb, hdr, + skb->sk->sk_protocol);if (ctx ==NULL ) {__qeth_free_new_skb (skb, new_skb);PRINT_WARN ("could not create eddp context\n" );
@@ -6584,7 +6585,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,QETH_DBF_TEXT (trace,4 ,"chgmaccb" ); cmd = (struct qeth_ipa_cmd *) data; -if (!card->options.layer2 || card->info.guestlan || +if (!card->options.layer2 || !(card->info.mac_bits &QETH_LAYER2_MAC_READ )) { memcpy(card->dev->dev_addr, &cmd->data.setadapterparms.data.change_addr.addr,
drivers/s390/net/qeth_sys.c +0 -2
@@ -384,8 +384,6 @@ qeth_dev_route_store(struct qeth_card *card, struct qeth_routing_info *route, route->type =PRIMARY_CONNECTOR ; }else if (!strcmp (tmp,"secondary_connector" )) { route->type =SECONDARY_CONNECTOR ; - }else if (!strcmp (tmp,"multicast_router" )) { - route->type =MULTICAST_ROUTER ; }else if (!strcmp (tmp,"primary_router" )) { route->type =PRIMARY_ROUTER ; }else if (!strcmp (tmp,"secondary_router" )) {
Signature · 1 line
1.5.1.2
Re: [PATCH 1/4] s390: qeth driver connection hang
Quoted 8 lines · Frank Pavlic
From: Ursula Braun <[email protected]>
Frank Pavlic <[email protected]>Connection hangs when using EDDP mode because
sk_protocolis NULL
when skb has been copied viaskb_copy. This results in dropping packets. Also keep MAC address after recovery of Virtual NICs so that
traffic can flow again and duplicate statements inqeth_dev_set_route_storeremoved.
Quoted 8 lines
Signed-off-by Ursula Braun <[email protected]>Signed-off-by Frank Pavlic <[email protected]>--- qeth_eddp.c | 4 ++-- qeth_eddp.h | 3 ++- qeth_main.c | 5 +++-- qeth_sys.c | 2 -- 4 files changed, 7 insertions(+), 7 deletions(-)
applied 1-4
PATCH 2/4 s390: free skbs in finite amount of time in qeth
In reply to Frank PavlicFrom: Ursula Braun <[email protected]>
Free sent skbs in some finite amount of time. Affected are asynchronous queue of Hipersockets devices and the output queues of all eth-devices respectively.
---
drivers/s390/cio/qdio.c | 37 +++++++++++++++++++++++++++---------- drivers/s390/cio/qdio.h | 4 +++- drivers/s390/net/qeth_main.c | 14 ++++++++------ include/asm-s390/qdio.h | 1 + 4 files changed, 39 insertions(+), 17 deletions(-)
drivers/s390/cio/qdio.c +27 -10
@@ -978,18 +978,25 @@ __qdio_outbound_processing(struct qdio_q *q)if (qdio_has_outbound_q_moved (q))qdio_kick_outbound_handler (q); -if (q->is_iqdio_q) { +if (q->queue_type ==QDIO_ZFCP_QFMT ) { +if ((!q->hydra_gives_outbound_pcis) && + (!qdio_is_outbound_q_done (q))) +qdio_mark_q (q); + } +else if (((!q->is_iqdio_q) && (!q->is_pci_out)) || + (q->queue_type ==QDIO_IQDIO_QFMT_ASYNCH )) {/* -* for asynchronous queues, we better check, if the sent -* buffer is already switched from PRIMED to EMPTY. +* make sure buffer switch from PRIMED to EMPTY is noticed +* and outbound_handler is called */ -if ((q->queue_type ==QDIO_IQDIO_QFMT_ASYNCH ) && - !qdio_is_outbound_q_done (q)) -qdio_mark_q (q); - - }else if (!q->hydra_gives_outbound_pcis) -if (!qdio_is_outbound_q_done (q)) -qdio_mark_q (q); +if (qdio_is_outbound_q_done (q)) { +del_timer (&q->timer); + }else { +if (!timer_pending (&q->timer)) +mod_timer (&q->timer, jiffies + +QDIO_FORCE_CHECK_TIMEOUT ); + } + }qdio_release_q (q); }
@@ -1830,6 +1837,7 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev, q->queue_type =QDIO_IQDIO_QFMT_ASYNCH ; q->int_parm=int_parm; q->is_input_q=0 ; + q->is_pci_out =0 ; q->schid = irq_ptr->schid; q->cdev = cdev; q->irq_ptr = irq_ptr;
@@ -1842,6 +1850,10 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev, q->tasklet.data=(unsigned long )q; q->tasklet.func=(void (*)(unsigned long )) &qdio_outbound_processing; + q->timer.function=(void (*)(unsigned long )) + &qdio_outbound_processing; + q->timer.data = (long )q; +init_timer (&q->timer);atomic_set (&q->busy_siga_counter,0 ); q->timing.busy_start=0 ;
@@ -2648,6 +2660,7 @@ qdio_shutdown(struct ccw_device *cdev, int how) for (i=0;i<irq_ptr->no_output_qs;i++) { tasklet_kill(&irq_ptr->output_qs[i]->tasklet); + del_timer(&irq_ptr->output_qs[i]->timer); wait_event_interruptible_timeout(cdev->private->wait_q, !atomic_read(&irq_ptr-> output_qs[i]->
@@ -3477,6 +3490,10 @@ do_qdio_handle_outbound(struct qdio_q *q, unsigned int callflags, }return ; } +if (callflags &QDIO_FLAG_PCI_OUT ) + q->is_pci_out =1 ; +else + q->is_pci_out =0 ;if (q->is_iqdio_q) {/* one siga for every sbal */ while (count--)
drivers/s390/cio/qdio.h +3 -1
@@ -60,6 +60,7 @@#define QDIO_ACTIVATE_TIMEOUT ((5*HZ)>>10)#define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ)#define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ) +#define QDIO_FORCE_CHECK_TIMEOUT (10*HZ)enum qdio_irq_states {QDIO_IRQ_STATE_INACTIVE ,
@@ -489,8 +490,8 @@ struct qdio_q {void *irq_ptr; -#ifdef QDIO_USE_TIMERS_FOR_POLLING struct timer_list timer; +#ifdef QDIO_USE_TIMERS_FOR_POLLING atomic_t timer_already_set;spinlock_t timer_lock;#else /* QDIO_USE_TIMERS_FOR_POLLING */
@@ -536,6 +537,7 @@ struct qdio_q { } timing;atomic_t busy_siga_counter;unsigned int queue_type; +unsigned int is_pci_out;/* leave this member at the end. won't be cleared in qdio_fill_qs */ struct slib *slib;/* a page is allocated under this pointer,
drivers/s390/net/qeth_main.c +8 -6
@@ -2749,6 +2749,7 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,struct qeth_qdio_out_buffer *buf;int rc;int i; +unsigned int qdio_flags;QETH_DBF_TEXT (trace,6 ,"flushbuf" );
@@ -2792,13 +2793,13 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, queue->card->perf_stats.outbound_do_qdio_start_time =qeth_get_micros (); } + qdio_flags =QDIO_FLAG_SYNC_OUTPUT ;if (under_int) - rc =do_QDIO (CARD_DDEV (queue->card), -QDIO_FLAG_SYNC_OUTPUT |QDIO_FLAG_UNDER_INTERRUPT , - queue->queue_no, index, count,NULL ); -else - rc =do_QDIO (CARD_DDEV (queue->card),QDIO_FLAG_SYNC_OUTPUT , - queue->queue_no, index, count,NULL ); + qdio_flags |=QDIO_FLAG_UNDER_INTERRUPT ; +if (atomic_read (&queue->set_pci_flags_count)) + qdio_flags |=QDIO_FLAG_PCI_OUT ; + rc =do_QDIO (CARD_DDEV (queue->card), qdio_flags, + queue->queue_no, index, count,NULL );if (queue->card->options.performance_stats) queue->card->perf_stats.outbound_do_qdio_time += qeth_get_micros() -
@@ -8431,6 +8432,7 @@ __qeth_reboot_event_card(struct device *dev, void *data) card = (struct qeth_card *) dev->driver_data;qeth_clear_ip_list (card,0 ,0 );qeth_qdio_clear_card (card,0 ); +qeth_clear_qdio_buffers (card);return 0 ; }
include/asm-s390/qdio.h +1 -0
@@ -120,6 +120,7 @@ extern unsigned long qdio_get_status(int irq);#define QDIO_FLAG_NO_INPUT_INTERRUPT_CONTEXT 0x08/* no effect on adapter interrupts */ #define QDIO_FLAG_DONT_SIGA 0x10 +#define QDIO_FLAG_PCI_OUT 0x20 extern int do_QDIO(struct ccw_device*, unsigned int flags, unsigned int queue_number,
Signature · 1 line
1.5.1.2
PATCH 3/4 s390: fix Oops when unloading module netiucv
In reply to Frank PavlicFrom: Ursula Braun <[email protected]>
don't remove an entry from iucv_connection_list in netiucv_exit(). netiucv_free_netdevice is called anyway, which takes care of entry removal.
---netiucv.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
drivers/s390/net/netiucv.c +3 -2
@@ -1862,12 +1862,14 @@ static void netiucv_remove_connection(struct iucv_connection *conn)write_lock_bh (&iucv_connection_rwlock);list_del_init (&conn->list);write_unlock_bh (&iucv_connection_rwlock); +fsm_deltimer (&conn->timer); +netiucv_purge_skb_queue (&conn->collect_queue);if (conn->path) {iucv_path_sever (conn->path, iucvMagic);kfree (conn->path); conn->path =NULL ; } -fsm_deltimer (&conn->timer); +netiucv_purge_skb_queue (&conn->commit_queue);kfree_fsm (conn->fsm);kfree_skb (conn->rx_buff);kfree_skb (conn->tx_buff);
@@ -2115,7 +2117,6 @@ static void __exit netiucv_exit(void)while (!list_empty (&iucv_connection_list)) { cp =list_entry (iucv_connection_list.next, struct iucv_connection, list); -list_del (&cp->list); ndev = cp->netdev; priv =netdev_priv (ndev); dev = priv->dev;
Signature · 1 line
1.5.1.2
PATCH 4/4 s390: qeth driver hardware specs adaptions
In reply to Frank PavlicFrom: Peter Tiedemann <[email protected]>
s390: qeth driver hardware specs adaptions
- according to the latest OSA hardware specification incorporate actual IPA command and return codes into qeth.
- whitespaces removed from qeth_mpc.h
---
qeth_main.c | 26 +++++-- qeth_mpc.c | 101 +++++++++++++++++++++++++++ qeth_mpc.h | 219 ++++++++++++++++++++++++++++++++++-------------------------- 3 files changed, 247 insertions(+), 99 deletions(-)
drivers/s390/net/qeth_main.c +19 -7
@@ -1615,6 +1615,21 @@ qeth_put_reply(struct qeth_reply *reply)kfree (reply); } +static void +qeth_issue_ipa_msg (struct qeth_ipa_cmd *cmd,struct qeth_card *card) +{ +int rc; +int com; +char * ipa_name; + + com = cmd->hdr.command; + rc = cmd->hdr.return_code; + ipa_name =qeth_get_ipa_cmd_name (com); + +PRINT_ERR ("%s(x%X) for %s returned x%X \"%s\"\n" , ipa_name, com, +QETH_CARD_IFNAME (card), rc,qeth_get_ipa_msg (rc)); +} +static struct qeth_ipa_cmd *qeth_check_ipa_data (struct qeth_card *card,struct qeth_cmd_buffer *iob) {
@@ -1623,8 +1638,11 @@ qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)QETH_DBF_TEXT (trace,5 ,"chkipad" );if (IS_IPA (iob->data)){ cmd = (struct qeth_ipa_cmd *)PDU_ENCAPSULATION (iob->data); -if (IS_IPA_REPLY (cmd)) +if (IS_IPA_REPLY (cmd)) { +if (cmd->hdr.return_code) +qeth_issue_ipa_msg (cmd, card);return cmd; + }else {switch (cmd->hdr.command) {case IPA_CMD_STOPLAN :
@@ -5883,9 +5901,6 @@ qeth_layer2_send_setmac_cb(struct qeth_card *card, cmd = (struct qeth_ipa_cmd *) data;if (cmd->hdr.return_code) {QETH_DBF_TEXT_ (trace,2 ,"L2er%x" , cmd->hdr.return_code); -PRINT_WARN ("Error in registering MAC address on " \ -"device %s: x%x\n" ,CARD_BUS_ID (card), - cmd->hdr.return_code); card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED ; cmd->hdr.return_code = -EIO ; }else {
@@ -5920,9 +5935,6 @@ qeth_layer2_send_delmac_cb(struct qeth_card *card,QETH_DBF_TEXT (trace,2 ,"L2Dmaccb" ); cmd = (struct qeth_ipa_cmd *) data;if (cmd->hdr.return_code) { -PRINT_WARN ("Error in deregistering MAC address on " \ -"device %s: x%x\n" ,CARD_BUS_ID (card), - cmd->hdr.return_code);QETH_DBF_TEXT_ (trace,2 ,"err%d" , cmd->hdr.return_code); cmd->hdr.return_code = -EIO ;return 0 ;
drivers/s390/net/qeth_mpc.c +101 -0
113 lines not on this page · raw message
drivers/s390/net/qeth_mpc.h +127 -92
286 lines not on this page · raw message
Signature · 1 line
1.5.1.2