aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/cio/qdio.c37
-rw-r--r--drivers/s390/cio/qdio.h4
-rw-r--r--drivers/s390/net/netiucv.c5
-rw-r--r--drivers/s390/net/qeth_eddp.c4
-rw-r--r--drivers/s390/net/qeth_eddp.h3
-rw-r--r--drivers/s390/net/qeth_main.c45
-rw-r--r--drivers/s390/net/qeth_mpc.c101
-rw-r--r--drivers/s390/net/qeth_mpc.h219
-rw-r--r--drivers/s390/net/qeth_sys.c2
9 files changed, 295 insertions, 125 deletions
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
index cba64e4cfcd4..f770018fe1d5 100644
--- a/drivers/s390/cio/qdio.c
+++ b/drivers/s390/cio/qdio.c
@@ -996,18 +996,25 @@ __qdio_outbound_processing(struct qdio_q *q)
996 if (qdio_has_outbound_q_moved(q)) 996 if (qdio_has_outbound_q_moved(q))
997 qdio_kick_outbound_handler(q); 997 qdio_kick_outbound_handler(q);
998 998
999 if (q->is_iqdio_q) { 999 if (q->queue_type == QDIO_ZFCP_QFMT) {
1000 if ((!q->hydra_gives_outbound_pcis) &&
1001 (!qdio_is_outbound_q_done(q)))
1002 qdio_mark_q(q);
1003 }
1004 else if (((!q->is_iqdio_q) && (!q->is_pci_out)) ||
1005 (q->queue_type == QDIO_IQDIO_QFMT_ASYNCH)) {
1000 /* 1006 /*
1001 * for asynchronous queues, we better check, if the sent 1007 * make sure buffer switch from PRIMED to EMPTY is noticed
1002 * buffer is already switched from PRIMED to EMPTY. 1008 * and outbound_handler is called
1003 */ 1009 */
1004 if ((q->queue_type == QDIO_IQDIO_QFMT_ASYNCH) && 1010 if (qdio_is_outbound_q_done(q)) {
1005 !qdio_is_outbound_q_done(q)) 1011 del_timer(&q->timer);
1006 qdio_mark_q(q); 1012 } else {
1007 1013 if (!timer_pending(&q->timer))
1008 } else if (!q->hydra_gives_outbound_pcis) 1014 mod_timer(&q->timer, jiffies +
1009 if (!qdio_is_outbound_q_done(q)) 1015 QDIO_FORCE_CHECK_TIMEOUT);
1010 qdio_mark_q(q); 1016 }
1017 }
1011 1018
1012 qdio_release_q(q); 1019 qdio_release_q(q);
1013} 1020}
@@ -1826,6 +1833,7 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev,
1826 q->queue_type = QDIO_IQDIO_QFMT_ASYNCH; 1833 q->queue_type = QDIO_IQDIO_QFMT_ASYNCH;
1827 q->int_parm=int_parm; 1834 q->int_parm=int_parm;
1828 q->is_input_q=0; 1835 q->is_input_q=0;
1836 q->is_pci_out = 0;
1829 q->schid = irq_ptr->schid; 1837 q->schid = irq_ptr->schid;
1830 q->cdev = cdev; 1838 q->cdev = cdev;
1831 q->irq_ptr = irq_ptr; 1839 q->irq_ptr = irq_ptr;
@@ -1838,6 +1846,10 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev,
1838 q->tasklet.data=(unsigned long)q; 1846 q->tasklet.data=(unsigned long)q;
1839 q->tasklet.func=(void(*)(unsigned long)) 1847 q->tasklet.func=(void(*)(unsigned long))
1840 &qdio_outbound_processing; 1848 &qdio_outbound_processing;
1849 q->timer.function=(void(*)(unsigned long))
1850 &qdio_outbound_processing;
1851 q->timer.data = (long)q;
1852 init_timer(&q->timer);
1841 1853
1842 atomic_set(&q->busy_siga_counter,0); 1854 atomic_set(&q->busy_siga_counter,0);
1843 q->timing.busy_start=0; 1855 q->timing.busy_start=0;
@@ -2635,6 +2647,7 @@ qdio_shutdown(struct ccw_device *cdev, int how)
2635 2647
2636 for (i=0;i<irq_ptr->no_output_qs;i++) { 2648 for (i=0;i<irq_ptr->no_output_qs;i++) {
2637 tasklet_kill(&irq_ptr->output_qs[i]->tasklet); 2649 tasklet_kill(&irq_ptr->output_qs[i]->tasklet);
2650 del_timer(&irq_ptr->output_qs[i]->timer);
2638 wait_event_interruptible_timeout(cdev->private->wait_q, 2651 wait_event_interruptible_timeout(cdev->private->wait_q,
2639 !atomic_read(&irq_ptr-> 2652 !atomic_read(&irq_ptr->
2640 output_qs[i]-> 2653 output_qs[i]->
@@ -3458,6 +3471,10 @@ do_qdio_handle_outbound(struct qdio_q *q, unsigned int callflags,
3458 qdio_perf_stat_inc(&perf_stats.outbound_cnt); 3471 qdio_perf_stat_inc(&perf_stats.outbound_cnt);
3459 return; 3472 return;
3460 } 3473 }
3474 if (callflags & QDIO_FLAG_PCI_OUT)
3475 q->is_pci_out = 1;
3476 else
3477 q->is_pci_out = 0;
3461 if (q->is_iqdio_q) { 3478 if (q->is_iqdio_q) {
3462 /* one siga for every sbal */ 3479 /* one siga for every sbal */
3463 while (count--) 3480 while (count--)
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index 2895392eaae4..6d7aad18f6f0 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -60,6 +60,7 @@
60#define QDIO_ACTIVATE_TIMEOUT ((5*HZ)>>10) 60#define QDIO_ACTIVATE_TIMEOUT ((5*HZ)>>10)
61#define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ) 61#define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ)
62#define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ) 62#define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ)
63#define QDIO_FORCE_CHECK_TIMEOUT (10*HZ)
63 64
64enum qdio_irq_states { 65enum qdio_irq_states {
65 QDIO_IRQ_STATE_INACTIVE, 66 QDIO_IRQ_STATE_INACTIVE,
@@ -511,8 +512,8 @@ struct qdio_q {
511 512
512 void *irq_ptr; 513 void *irq_ptr;
513 514
514#ifdef QDIO_USE_TIMERS_FOR_POLLING
515 struct timer_list timer; 515 struct timer_list timer;
516#ifdef QDIO_USE_TIMERS_FOR_POLLING
516 atomic_t timer_already_set; 517 atomic_t timer_already_set;
517 spinlock_t timer_lock; 518 spinlock_t timer_lock;
518#else /* QDIO_USE_TIMERS_FOR_POLLING */ 519#else /* QDIO_USE_TIMERS_FOR_POLLING */
@@ -558,6 +559,7 @@ struct qdio_q {
558 } timing; 559 } timing;
559 atomic_t busy_siga_counter; 560 atomic_t busy_siga_counter;
560 unsigned int queue_type; 561 unsigned int queue_type;
562 unsigned int is_pci_out;
561 563
562 /* leave this member at the end. won't be cleared in qdio_fill_qs */ 564 /* leave this member at the end. won't be cleared in qdio_fill_qs */
563 struct slib *slib; /* a page is allocated under this pointer, 565 struct slib *slib; /* a page is allocated under this pointer,
diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
index e10e85e85c84..c358764f3264 100644
--- a/drivers/s390/net/netiucv.c
+++ b/drivers/s390/net/netiucv.c
@@ -1862,12 +1862,14 @@ static void netiucv_remove_connection(struct iucv_connection *conn)
1862 write_lock_bh(&iucv_connection_rwlock); 1862 write_lock_bh(&iucv_connection_rwlock);
1863 list_del_init(&conn->list); 1863 list_del_init(&conn->list);
1864 write_unlock_bh(&iucv_connection_rwlock); 1864 write_unlock_bh(&iucv_connection_rwlock);
1865 fsm_deltimer(&conn->timer);
1866 netiucv_purge_skb_queue(&conn->collect_queue);
1865 if (conn->path) { 1867 if (conn->path) {
1866 iucv_path_sever(conn->path, iucvMagic); 1868 iucv_path_sever(conn->path, iucvMagic);
1867 kfree(conn->path); 1869 kfree(conn->path);
1868 conn->path = NULL; 1870 conn->path = NULL;
1869 } 1871 }
1870 fsm_deltimer(&conn->timer); 1872 netiucv_purge_skb_queue(&conn->commit_queue);
1871 kfree_fsm(conn->fsm); 1873 kfree_fsm(conn->fsm);
1872 kfree_skb(conn->rx_buff); 1874 kfree_skb(conn->rx_buff);
1873 kfree_skb(conn->tx_buff); 1875 kfree_skb(conn->tx_buff);
@@ -2115,7 +2117,6 @@ static void __exit netiucv_exit(void)
2115 while (!list_empty(&iucv_connection_list)) { 2117 while (!list_empty(&iucv_connection_list)) {
2116 cp = list_entry(iucv_connection_list.next, 2118 cp = list_entry(iucv_connection_list.next,
2117 struct iucv_connection, list); 2119 struct iucv_connection, list);
2118 list_del(&cp->list);
2119 ndev = cp->netdev; 2120 ndev = cp->netdev;
2120 priv = netdev_priv(ndev); 2121 priv = netdev_priv(ndev);
2121 dev = priv->dev; 2122 dev = priv->dev;
diff --git a/drivers/s390/net/qeth_eddp.c b/drivers/s390/net/qeth_eddp.c
index dd7034fbfff8..4640f32daae5 100644
--- a/drivers/s390/net/qeth_eddp.c
+++ b/drivers/s390/net/qeth_eddp.c
@@ -620,10 +620,10 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
620 620
621struct qeth_eddp_context * 621struct qeth_eddp_context *
622qeth_eddp_create_context(struct qeth_card *card, struct sk_buff *skb, 622qeth_eddp_create_context(struct qeth_card *card, struct sk_buff *skb,
623 struct qeth_hdr *qhdr) 623 struct qeth_hdr *qhdr, unsigned char sk_protocol)
624{ 624{
625 QETH_DBF_TEXT(trace, 5, "creddpc"); 625 QETH_DBF_TEXT(trace, 5, "creddpc");
626 switch (skb->sk->sk_protocol){ 626 switch (sk_protocol) {
627 case IPPROTO_TCP: 627 case IPPROTO_TCP:
628 return qeth_eddp_create_context_tcp(card, skb, qhdr); 628 return qeth_eddp_create_context_tcp(card, skb, qhdr);
629 default: 629 default:
diff --git a/drivers/s390/net/qeth_eddp.h b/drivers/s390/net/qeth_eddp.h
index 103768d3bab2..52910c9252c0 100644
--- a/drivers/s390/net/qeth_eddp.h
+++ b/drivers/s390/net/qeth_eddp.h
@@ -34,7 +34,8 @@ struct qeth_eddp_context_reference {
34}; 34};
35 35
36extern struct qeth_eddp_context * 36extern struct qeth_eddp_context *
37qeth_eddp_create_context(struct qeth_card *,struct sk_buff *,struct qeth_hdr *); 37qeth_eddp_create_context(struct qeth_card *,struct sk_buff *,
38 struct qeth_hdr *, unsigned char);
38 39
39extern void 40extern void
40qeth_eddp_put_context(struct qeth_eddp_context *); 41qeth_eddp_put_context(struct qeth_eddp_context *);
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c
index 6fd8870551d3..29d176036e5c 100644
--- a/drivers/s390/net/qeth_main.c
+++ b/drivers/s390/net/qeth_main.c
@@ -1682,6 +1682,21 @@ qeth_put_reply(struct qeth_reply *reply)
1682 kfree(reply); 1682 kfree(reply);
1683} 1683}
1684 1684
1685static void
1686qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, struct qeth_card *card)
1687{
1688 int rc;
1689 int com;
1690 char * ipa_name;
1691
1692 com = cmd->hdr.command;
1693 rc = cmd->hdr.return_code;
1694 ipa_name = qeth_get_ipa_cmd_name(com);
1695
1696 PRINT_ERR("%s(x%X) for %s returned x%X \"%s\"\n", ipa_name, com,
1697 QETH_CARD_IFNAME(card), rc, qeth_get_ipa_msg(rc));
1698}
1699
1685static struct qeth_ipa_cmd * 1700static struct qeth_ipa_cmd *
1686qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob) 1701qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
1687{ 1702{
@@ -1690,8 +1705,11 @@ qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
1690 QETH_DBF_TEXT(trace,5,"chkipad"); 1705 QETH_DBF_TEXT(trace,5,"chkipad");
1691 if (IS_IPA(iob->data)){ 1706 if (IS_IPA(iob->data)){
1692 cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data); 1707 cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
1693 if (IS_IPA_REPLY(cmd)) 1708 if (IS_IPA_REPLY(cmd)) {
1709 if (cmd->hdr.return_code)
1710 qeth_issue_ipa_msg(cmd, card);
1694 return cmd; 1711 return cmd;
1712 }
1695 else { 1713 else {
1696 switch (cmd->hdr.command) { 1714 switch (cmd->hdr.command) {
1697 case IPA_CMD_STOPLAN: 1715 case IPA_CMD_STOPLAN:
@@ -2816,6 +2834,7 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,
2816 struct qeth_qdio_out_buffer *buf; 2834 struct qeth_qdio_out_buffer *buf;
2817 int rc; 2835 int rc;
2818 int i; 2836 int i;
2837 unsigned int qdio_flags;
2819 2838
2820 QETH_DBF_TEXT(trace, 6, "flushbuf"); 2839 QETH_DBF_TEXT(trace, 6, "flushbuf");
2821 2840
@@ -2859,13 +2878,13 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,
2859 queue->card->perf_stats.outbound_do_qdio_start_time = 2878 queue->card->perf_stats.outbound_do_qdio_start_time =
2860 qeth_get_micros(); 2879 qeth_get_micros();
2861 } 2880 }
2881 qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
2862 if (under_int) 2882 if (under_int)
2863 rc = do_QDIO(CARD_DDEV(queue->card), 2883 qdio_flags |= QDIO_FLAG_UNDER_INTERRUPT;
2864 QDIO_FLAG_SYNC_OUTPUT | QDIO_FLAG_UNDER_INTERRUPT, 2884 if (atomic_read(&queue->set_pci_flags_count))
2865 queue->queue_no, index, count, NULL); 2885 qdio_flags |= QDIO_FLAG_PCI_OUT;
2866 else 2886 rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
2867 rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT, 2887 queue->queue_no, index, count, NULL);
2868 queue->queue_no, index, count, NULL);
2869 if (queue->card->options.performance_stats) 2888 if (queue->card->options.performance_stats)
2870 queue->card->perf_stats.outbound_do_qdio_time += 2889 queue->card->perf_stats.outbound_do_qdio_time +=
2871 qeth_get_micros() - 2890 qeth_get_micros() -
@@ -4490,7 +4509,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
4490 qeth_fill_header(card, hdr, new_skb, ipv, cast_type); 4509 qeth_fill_header(card, hdr, new_skb, ipv, cast_type);
4491 } 4510 }
4492 if (large_send == QETH_LARGE_SEND_EDDP) { 4511 if (large_send == QETH_LARGE_SEND_EDDP) {
4493 ctx = qeth_eddp_create_context(card, new_skb, hdr); 4512 ctx = qeth_eddp_create_context(card, new_skb, hdr,
4513 skb->sk->sk_protocol);
4494 if (ctx == NULL) { 4514 if (ctx == NULL) {
4495 __qeth_free_new_skb(skb, new_skb); 4515 __qeth_free_new_skb(skb, new_skb);
4496 PRINT_WARN("could not create eddp context\n"); 4516 PRINT_WARN("could not create eddp context\n");
@@ -5948,9 +5968,6 @@ qeth_layer2_send_setmac_cb(struct qeth_card *card,
5948 cmd = (struct qeth_ipa_cmd *) data; 5968 cmd = (struct qeth_ipa_cmd *) data;
5949 if (cmd->hdr.return_code) { 5969 if (cmd->hdr.return_code) {
5950 QETH_DBF_TEXT_(trace, 2, "L2er%x", cmd->hdr.return_code); 5970 QETH_DBF_TEXT_(trace, 2, "L2er%x", cmd->hdr.return_code);
5951 PRINT_WARN("Error in registering MAC address on " \
5952 "device %s: x%x\n", CARD_BUS_ID(card),
5953 cmd->hdr.return_code);
5954 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 5971 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
5955 cmd->hdr.return_code = -EIO; 5972 cmd->hdr.return_code = -EIO;
5956 } else { 5973 } else {
@@ -5985,9 +6002,6 @@ qeth_layer2_send_delmac_cb(struct qeth_card *card,
5985 QETH_DBF_TEXT(trace, 2, "L2Dmaccb"); 6002 QETH_DBF_TEXT(trace, 2, "L2Dmaccb");
5986 cmd = (struct qeth_ipa_cmd *) data; 6003 cmd = (struct qeth_ipa_cmd *) data;
5987 if (cmd->hdr.return_code) { 6004 if (cmd->hdr.return_code) {
5988 PRINT_WARN("Error in deregistering MAC address on " \
5989 "device %s: x%x\n", CARD_BUS_ID(card),
5990 cmd->hdr.return_code);
5991 QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code); 6005 QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code);
5992 cmd->hdr.return_code = -EIO; 6006 cmd->hdr.return_code = -EIO;
5993 return 0; 6007 return 0;
@@ -6651,7 +6665,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
6651 QETH_DBF_TEXT(trace,4,"chgmaccb"); 6665 QETH_DBF_TEXT(trace,4,"chgmaccb");
6652 6666
6653 cmd = (struct qeth_ipa_cmd *) data; 6667 cmd = (struct qeth_ipa_cmd *) data;
6654 if (!card->options.layer2 || card->info.guestlan || 6668 if (!card->options.layer2 ||
6655 !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) { 6669 !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
6656 memcpy(card->dev->dev_addr, 6670 memcpy(card->dev->dev_addr,
6657 &cmd->data.setadapterparms.data.change_addr.addr, 6671 &cmd->data.setadapterparms.data.change_addr.addr,
@@ -8497,6 +8511,7 @@ __qeth_reboot_event_card(struct device *dev, void *data)
8497 card = (struct qeth_card *) dev->driver_data; 8511 card = (struct qeth_card *) dev->driver_data;
8498 qeth_clear_ip_list(card, 0, 0); 8512 qeth_clear_ip_list(card, 0, 0);
8499 qeth_qdio_clear_card(card, 0); 8513 qeth_qdio_clear_card(card, 0);
8514 qeth_clear_qdio_buffers(card);
8500 return 0; 8515 return 0;
8501} 8516}
8502 8517
diff --git a/drivers/s390/net/qeth_mpc.c b/drivers/s390/net/qeth_mpc.c
index 77c83209d70e..f54fdfdbf06f 100644
--- a/drivers/s390/net/qeth_mpc.c
+++ b/drivers/s390/net/qeth_mpc.c
@@ -157,12 +157,113 @@ unsigned char READ_CCW[]={
157}; 157};
158 158
159 159
160struct ipa_rc_msg {
161 enum qeth_ipa_return_codes rc;
162 char *msg;
163};
160 164
165struct ipa_rc_msg qeth_ipa_rc_msg[] = {
166 {IPA_RC_SUCCESS, "success"},
167 {IPA_RC_NOTSUPP, "Command not supported"},
168 {IPA_RC_IP_TABLE_FULL, "Add Addr IP Table Full - ipv6"},
169 {IPA_RC_UNKNOWN_ERROR, "IPA command failed - reason unknown"},
170 {IPA_RC_UNSUPPORTED_COMMAND, "Command not supported"},
171 {IPA_RC_DUP_IPV6_REMOTE,"ipv6 address already registered remote"},
172 {IPA_RC_DUP_IPV6_HOME, "ipv6 address already registered"},
173 {IPA_RC_UNREGISTERED_ADDR, "Address not registered"},
174 {IPA_RC_NO_ID_AVAILABLE, "No identifiers available"},
175 {IPA_RC_ID_NOT_FOUND, "Identifier not found"},
176 {IPA_RC_INVALID_IP_VERSION, "IP version incorrect"},
177 {IPA_RC_LAN_FRAME_MISMATCH, "LAN and frame mismatch"},
178 {IPA_RC_L2_UNSUPPORTED_CMD, "Unsupported layer 2 command"},
179 {IPA_RC_L2_DUP_MAC, "Duplicate MAC address"},
180 {IPA_RC_L2_ADDR_TABLE_FULL, "Layer2 address table full"},
181 {IPA_RC_L2_DUP_LAYER3_MAC, "Duplicate with layer 3 MAC"},
182 {IPA_RC_L2_GMAC_NOT_FOUND, "GMAC not found"},
183 {IPA_RC_L2_MAC_NOT_FOUND, "L2 mac address not found"},
184 {IPA_RC_L2_INVALID_VLAN_ID, "L2 invalid vlan id"},
185 {IPA_RC_L2_DUP_VLAN_ID, "L2 duplicate vlan id"},
186 {IPA_RC_L2_VLAN_ID_NOT_FOUND, "L2 vlan id not found"},
187 {IPA_RC_DATA_MISMATCH, "Data field mismatch (v4/v6 mixed)"},
188 {IPA_RC_INVALID_MTU_SIZE, "Invalid MTU size"},
189 {IPA_RC_INVALID_LANTYPE, "Invalid LAN type"},
190 {IPA_RC_INVALID_LANNUM, "Invalid LAN num"},
191 {IPA_RC_DUPLICATE_IP_ADDRESS, "Address already registered"},
192 {IPA_RC_IP_ADDR_TABLE_FULL, "IP address table full"},
193 {IPA_RC_LAN_PORT_STATE_ERROR, "LAN port state error"},
194 {IPA_RC_SETIP_NO_STARTLAN, "Setip no startlan received"},
195 {IPA_RC_SETIP_ALREADY_RECEIVED, "Setip already received"},
196 {IPA_RC_IP_ADDR_ALREADY_USED, "IP address already in use on LAN"},
197 {IPA_RC_MULTICAST_FULL, "No task available, multicast full"},
198 {IPA_RC_SETIP_INVALID_VERSION, "SETIP invalid IP version"},
199 {IPA_RC_UNSUPPORTED_SUBCMD, "Unsupported assist subcommand"},
200 {IPA_RC_ARP_ASSIST_NO_ENABLE, "Only partial success, no enable"},
201 {IPA_RC_PRIMARY_ALREADY_DEFINED,"Primary already defined"},
202 {IPA_RC_SECOND_ALREADY_DEFINED, "Secondary already defined"},
203 {IPA_RC_INVALID_SETRTG_INDICATOR,"Invalid SETRTG indicator"},
204 {IPA_RC_MC_ADDR_ALREADY_DEFINED,"Multicast address already defined"},
205 {IPA_RC_LAN_OFFLINE, "STRTLAN_LAN_DISABLED - LAN offline"},
206 {IPA_RC_INVALID_IP_VERSION2, "Invalid IP version"},
207 {IPA_RC_FFFF, "Unknown Error"}
208};
161 209
162 210
163 211
212char *
213qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)
214{
215 int x = 0;
216 qeth_ipa_rc_msg[sizeof(qeth_ipa_rc_msg) /
217 sizeof(struct ipa_rc_msg) - 1].rc = rc;
218 while(qeth_ipa_rc_msg[x].rc != rc)
219 x++;
220 return qeth_ipa_rc_msg[x].msg;
221}
164 222
165 223
224struct ipa_cmd_names {
225 enum qeth_ipa_cmds cmd;
226 char *name;
227};
228
229struct ipa_cmd_names qeth_ipa_cmd_names[] = {
230 {IPA_CMD_STARTLAN, "startlan"},
231 {IPA_CMD_STOPLAN, "stoplan"},
232 {IPA_CMD_SETVMAC, "setvmac"},
233 {IPA_CMD_DELVMAC, "delvmca"},
234 {IPA_CMD_SETGMAC, "setgmac"},
235 {IPA_CMD_DELGMAC, "delgmac"},
236 {IPA_CMD_SETVLAN, "setvlan"},
237 {IPA_CMD_DELVLAN, "delvlan"},
238 {IPA_CMD_SETCCID, "setccid"},
239 {IPA_CMD_DELCCID, "delccid"},
240 {IPA_CMD_MODCCID, "setip"},
241 {IPA_CMD_SETIP, "setip"},
242 {IPA_CMD_QIPASSIST, "qipassist"},
243 {IPA_CMD_SETASSPARMS, "setassparms"},
244 {IPA_CMD_SETIPM, "setipm"},
245 {IPA_CMD_DELIPM, "delipm"},
246 {IPA_CMD_SETRTG, "setrtg"},
247 {IPA_CMD_DELIP, "delip"},
248 {IPA_CMD_SETADAPTERPARMS, "setadapterparms"},
249 {IPA_CMD_SET_DIAG_ASS, "set_diag_ass"},
250 {IPA_CMD_CREATE_ADDR, "create_addr"},
251 {IPA_CMD_DESTROY_ADDR, "destroy_addr"},
252 {IPA_CMD_REGISTER_LOCAL_ADDR, "register_local_addr"},
253 {IPA_CMD_UNREGISTER_LOCAL_ADDR, "unregister_local_addr"},
254 {IPA_CMD_UNKNOWN, "unknown"},
255};
166 256
257char *
258qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd)
259{
260 int x = 0;
261 qeth_ipa_cmd_names[
262 sizeof(qeth_ipa_cmd_names)/
263 sizeof(struct ipa_cmd_names)-1].cmd = cmd;
264 while(qeth_ipa_cmd_names[x].cmd != cmd)
265 x++;
266 return qeth_ipa_cmd_names[x].name;
267}
167 268
168 269
diff --git a/drivers/s390/net/qeth_mpc.h b/drivers/s390/net/qeth_mpc.h
index d74bc43da72a..1d8083c91765 100644
--- a/drivers/s390/net/qeth_mpc.h
+++ b/drivers/s390/net/qeth_mpc.h
@@ -25,14 +25,14 @@ extern unsigned char IPA_PDU_HEADER[];
25 25
26#define IPA_CMD_LENGTH (IPA_PDU_HEADER_SIZE + sizeof(struct qeth_ipa_cmd)) 26#define IPA_CMD_LENGTH (IPA_PDU_HEADER_SIZE + sizeof(struct qeth_ipa_cmd))
27 27
28#define QETH_SEQ_NO_LENGTH 4 28#define QETH_SEQ_NO_LENGTH 4
29#define QETH_MPC_TOKEN_LENGTH 4 29#define QETH_MPC_TOKEN_LENGTH 4
30#define QETH_MCL_LENGTH 4 30#define QETH_MCL_LENGTH 4
31#define OSA_ADDR_LEN 6 31#define OSA_ADDR_LEN 6
32 32
33#define QETH_TIMEOUT (10 * HZ) 33#define QETH_TIMEOUT (10 * HZ)
34#define QETH_IPA_TIMEOUT (45 * HZ) 34#define QETH_IPA_TIMEOUT (45 * HZ)
35#define QETH_IDX_COMMAND_SEQNO 0xffff0000 35#define QETH_IDX_COMMAND_SEQNO 0xffff0000
36#define SR_INFO_LEN 16 36#define SR_INFO_LEN 16
37 37
38#define QETH_CLEAR_CHANNEL_PARM -10 38#define QETH_CLEAR_CHANNEL_PARM -10
@@ -93,79 +93,107 @@ enum qeth_checksum_types {
93 */ 93 */
94#define RESET_ROUTING_FLAG 0x10 /* indicate that routing type shall be set */ 94#define RESET_ROUTING_FLAG 0x10 /* indicate that routing type shall be set */
95enum qeth_routing_types { 95enum qeth_routing_types {
96 NO_ROUTER = 0, /* TODO: set to bit flag used in IPA Command */ 96 NO_ROUTER = 0, /* TODO: set to bit flag used in IPA Command */
97 PRIMARY_ROUTER = 1, 97 PRIMARY_ROUTER = 1,
98 SECONDARY_ROUTER = 2, 98 SECONDARY_ROUTER = 2,
99 MULTICAST_ROUTER = 3, 99 MULTICAST_ROUTER = 3,
100 PRIMARY_CONNECTOR = 4, 100 PRIMARY_CONNECTOR = 4,
101 SECONDARY_CONNECTOR = 5, 101 SECONDARY_CONNECTOR = 5,
102}; 102};
103 103
104
105/* IPA Commands */ 104/* IPA Commands */
106enum qeth_ipa_cmds { 105enum qeth_ipa_cmds {
107 IPA_CMD_STARTLAN = 0x01, 106 IPA_CMD_STARTLAN = 0x01,
108 IPA_CMD_STOPLAN = 0x02, 107 IPA_CMD_STOPLAN = 0x02,
109 IPA_CMD_SETVMAC = 0x21, 108 IPA_CMD_SETVMAC = 0x21,
110 IPA_CMD_DELVMAC = 0x22, 109 IPA_CMD_DELVMAC = 0x22,
111 IPA_CMD_SETGMAC = 0x23, 110 IPA_CMD_SETGMAC = 0x23,
112 IPA_CMD_DELGMAC = 0x24, 111 IPA_CMD_DELGMAC = 0x24,
113 IPA_CMD_SETVLAN = 0x25, 112 IPA_CMD_SETVLAN = 0x25,
114 IPA_CMD_DELVLAN = 0x26, 113 IPA_CMD_DELVLAN = 0x26,
115 IPA_CMD_SETCCID = 0x41, 114 IPA_CMD_SETCCID = 0x41,
116 IPA_CMD_DELCCID = 0x42, 115 IPA_CMD_DELCCID = 0x42,
117 IPA_CMD_MODCCID = 0x43, 116 IPA_CMD_MODCCID = 0x43,
118 IPA_CMD_SETIP = 0xb1, 117 IPA_CMD_SETIP = 0xb1,
119 IPA_CMD_DELIP = 0xb7, 118 IPA_CMD_QIPASSIST = 0xb2,
120 IPA_CMD_QIPASSIST = 0xb2, 119 IPA_CMD_SETASSPARMS = 0xb3,
121 IPA_CMD_SETASSPARMS = 0xb3, 120 IPA_CMD_SETIPM = 0xb4,
122 IPA_CMD_SETIPM = 0xb4, 121 IPA_CMD_DELIPM = 0xb5,
123 IPA_CMD_DELIPM = 0xb5, 122 IPA_CMD_SETRTG = 0xb6,
124 IPA_CMD_SETRTG = 0xb6, 123 IPA_CMD_DELIP = 0xb7,
125 IPA_CMD_SETADAPTERPARMS = 0xb8, 124 IPA_CMD_SETADAPTERPARMS = 0xb8,
126 IPA_CMD_IPFRAME = 0xb9, 125 IPA_CMD_SET_DIAG_ASS = 0xb9,
127 IPA_CMD_ADD_ADDR_ENTRY = 0xc1, 126 IPA_CMD_CREATE_ADDR = 0xc3,
128 IPA_CMD_DELETE_ADDR_ENTRY = 0xc2, 127 IPA_CMD_DESTROY_ADDR = 0xc4,
129 IPA_CMD_CREATE_ADDR = 0xc3, 128 IPA_CMD_REGISTER_LOCAL_ADDR = 0xd1,
130 IPA_CMD_DESTROY_ADDR = 0xc4, 129 IPA_CMD_UNREGISTER_LOCAL_ADDR = 0xd2,
131 IPA_CMD_REGISTER_LOCAL_ADDR = 0xd1, 130 IPA_CMD_UNKNOWN = 0x00
132 IPA_CMD_UNREGISTER_LOCAL_ADDR = 0xd2,
133}; 131};
134 132
135enum qeth_ip_ass_cmds { 133enum qeth_ip_ass_cmds {
136 IPA_CMD_ASS_START = 0x0001, 134 IPA_CMD_ASS_START = 0x0001,
137 IPA_CMD_ASS_STOP = 0x0002, 135 IPA_CMD_ASS_STOP = 0x0002,
138 IPA_CMD_ASS_CONFIGURE = 0x0003, 136 IPA_CMD_ASS_CONFIGURE = 0x0003,
139 IPA_CMD_ASS_ENABLE = 0x0004, 137 IPA_CMD_ASS_ENABLE = 0x0004,
140}; 138};
141 139
142enum qeth_arp_process_subcmds { 140enum qeth_arp_process_subcmds {
143 IPA_CMD_ASS_ARP_SET_NO_ENTRIES = 0x0003, 141 IPA_CMD_ASS_ARP_SET_NO_ENTRIES = 0x0003,
144 IPA_CMD_ASS_ARP_QUERY_CACHE = 0x0004, 142 IPA_CMD_ASS_ARP_QUERY_CACHE = 0x0004,
145 IPA_CMD_ASS_ARP_ADD_ENTRY = 0x0005, 143 IPA_CMD_ASS_ARP_ADD_ENTRY = 0x0005,
146 IPA_CMD_ASS_ARP_REMOVE_ENTRY = 0x0006, 144 IPA_CMD_ASS_ARP_REMOVE_ENTRY = 0x0006,
147 IPA_CMD_ASS_ARP_FLUSH_CACHE = 0x0007, 145 IPA_CMD_ASS_ARP_FLUSH_CACHE = 0x0007,
148 IPA_CMD_ASS_ARP_QUERY_INFO = 0x0104, 146 IPA_CMD_ASS_ARP_QUERY_INFO = 0x0104,
149 IPA_CMD_ASS_ARP_QUERY_STATS = 0x0204, 147 IPA_CMD_ASS_ARP_QUERY_STATS = 0x0204,
150}; 148};
151 149
152/* Return Codes for IPA Commands */ 150
151/* Return Codes for IPA Commands
152 * according to OSA card Specs */
153
153enum qeth_ipa_return_codes { 154enum qeth_ipa_return_codes {
154 IPA_RC_SUCCESS = 0x0000, 155 IPA_RC_SUCCESS = 0x0000,
155 IPA_RC_NOTSUPP = 0x0001, 156 IPA_RC_NOTSUPP = 0x0001,
156 IPA_RC_NO_ACCESS = 0x0002, 157 IPA_RC_IP_TABLE_FULL = 0x0002,
157 IPA_RC_FAILED = 0x0003, 158 IPA_RC_UNKNOWN_ERROR = 0x0003,
158 IPA_RC_DATA_MISMATCH = 0xe001, 159 IPA_RC_UNSUPPORTED_COMMAND = 0x0004,
159 IPA_RC_INVALID_LAN_TYPE = 0xe003, 160 IPA_RC_DUP_IPV6_REMOTE = 0x0008,
160 IPA_RC_INVALID_LAN_NO = 0xe004, 161 IPA_RC_DUP_IPV6_HOME = 0x0010,
161 IPA_RC_IPADDR_ALREADY_REG = 0xe005, 162 IPA_RC_UNREGISTERED_ADDR = 0x0011,
162 IPA_RC_IPADDR_TABLE_FULL = 0xe006, 163 IPA_RC_NO_ID_AVAILABLE = 0x0012,
163 IPA_RC_IPADDR_ALREADY_USED = 0xe00a, 164 IPA_RC_ID_NOT_FOUND = 0x0013,
164 IPA_RC_ASSNO_NOT_SUPP = 0xe00d, 165 IPA_RC_INVALID_IP_VERSION = 0x0020,
165 IPA_RC_ASSCMD_START_FAILED = 0xe00e, 166 IPA_RC_LAN_FRAME_MISMATCH = 0x0040,
166 IPA_RC_ASSCMD_PART_SUCCESS = 0xe00f, 167 IPA_RC_L2_UNSUPPORTED_CMD = 0x2003,
167 IPA_RC_IPADDR_NOT_DEFINED = 0xe010, 168 IPA_RC_L2_DUP_MAC = 0x2005,
168 IPA_RC_LAN_OFFLINE = 0xe080, 169 IPA_RC_L2_ADDR_TABLE_FULL = 0x2006,
170 IPA_RC_L2_DUP_LAYER3_MAC = 0x200a,
171 IPA_RC_L2_GMAC_NOT_FOUND = 0x200b,
172 IPA_RC_L2_MAC_NOT_FOUND = 0x2010,
173 IPA_RC_L2_INVALID_VLAN_ID = 0x2015,
174 IPA_RC_L2_DUP_VLAN_ID = 0x2016,
175 IPA_RC_L2_VLAN_ID_NOT_FOUND = 0x2017,
176 IPA_RC_DATA_MISMATCH = 0xe001,
177 IPA_RC_INVALID_MTU_SIZE = 0xe002,
178 IPA_RC_INVALID_LANTYPE = 0xe003,
179 IPA_RC_INVALID_LANNUM = 0xe004,
180 IPA_RC_DUPLICATE_IP_ADDRESS = 0xe005,
181 IPA_RC_IP_ADDR_TABLE_FULL = 0xe006,
182 IPA_RC_LAN_PORT_STATE_ERROR = 0xe007,
183 IPA_RC_SETIP_NO_STARTLAN = 0xe008,
184 IPA_RC_SETIP_ALREADY_RECEIVED = 0xe009,
185 IPA_RC_IP_ADDR_ALREADY_USED = 0xe00a,
186 IPA_RC_MULTICAST_FULL = 0xe00b,
187 IPA_RC_SETIP_INVALID_VERSION = 0xe00d,
188 IPA_RC_UNSUPPORTED_SUBCMD = 0xe00e,
189 IPA_RC_ARP_ASSIST_NO_ENABLE = 0xe00f,
190 IPA_RC_PRIMARY_ALREADY_DEFINED = 0xe010,
191 IPA_RC_SECOND_ALREADY_DEFINED = 0xe011,
192 IPA_RC_INVALID_SETRTG_INDICATOR = 0xe012,
193 IPA_RC_MC_ADDR_ALREADY_DEFINED = 0xe013,
194 IPA_RC_LAN_OFFLINE = 0xe080,
195 IPA_RC_INVALID_IP_VERSION2 = 0xf001,
196 IPA_RC_FFFF = 0xffff
169}; 197};
170 198
171/* IPA function flags; each flag marks availability of respective function */ 199/* IPA function flags; each flag marks availability of respective function */
@@ -183,7 +211,9 @@ enum qeth_ipa_funcs {
183 IPA_SETADAPTERPARMS = 0x00000400L, 211 IPA_SETADAPTERPARMS = 0x00000400L,
184 IPA_VLAN_PRIO = 0x00000800L, 212 IPA_VLAN_PRIO = 0x00000800L,
185 IPA_PASSTHRU = 0x00001000L, 213 IPA_PASSTHRU = 0x00001000L,
214 IPA_FLUSH_ARP_SUPPORT = 0x00002000L,
186 IPA_FULL_VLAN = 0x00004000L, 215 IPA_FULL_VLAN = 0x00004000L,
216 IPA_INBOUND_PASSTHRU = 0x00008000L,
187 IPA_SOURCE_MAC = 0x00010000L, 217 IPA_SOURCE_MAC = 0x00010000L,
188 IPA_OSA_MC_ROUTER = 0x00020000L, 218 IPA_OSA_MC_ROUTER = 0x00020000L,
189 IPA_QUERY_ARP_ASSIST = 0x00040000L, 219 IPA_QUERY_ARP_ASSIST = 0x00040000L,
@@ -204,31 +234,30 @@ enum qeth_ipa_setdelip_flags {
204/* SETADAPTER IPA Command: ****************************************************/ 234/* SETADAPTER IPA Command: ****************************************************/
205enum qeth_ipa_setadp_cmd { 235enum qeth_ipa_setadp_cmd {
206 IPA_SETADP_QUERY_COMMANDS_SUPPORTED = 0x01, 236 IPA_SETADP_QUERY_COMMANDS_SUPPORTED = 0x01,
207 IPA_SETADP_ALTER_MAC_ADDRESS = 0x02, 237 IPA_SETADP_ALTER_MAC_ADDRESS = 0x02,
208 IPA_SETADP_ADD_DELETE_GROUP_ADDRESS = 0x04, 238 IPA_SETADP_ADD_DELETE_GROUP_ADDRESS = 0x04,
209 IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR = 0x08, 239 IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR = 0x08,
210 IPA_SETADP_SET_ADDRESSING_MODE = 0x10, 240 IPA_SETADP_SET_ADDRESSING_MODE = 0x10,
211 IPA_SETADP_SET_CONFIG_PARMS = 0x20, 241 IPA_SETADP_SET_CONFIG_PARMS = 0x20,
212 IPA_SETADP_SET_CONFIG_PARMS_EXTENDED = 0x40, 242 IPA_SETADP_SET_CONFIG_PARMS_EXTENDED = 0x40,
213 IPA_SETADP_SET_BROADCAST_MODE = 0x80, 243 IPA_SETADP_SET_BROADCAST_MODE = 0x80,
214 IPA_SETADP_SEND_OSA_MESSAGE = 0x0100, 244 IPA_SETADP_SEND_OSA_MESSAGE = 0x0100,
215 IPA_SETADP_SET_SNMP_CONTROL = 0x0200, 245 IPA_SETADP_SET_SNMP_CONTROL = 0x0200,
216 IPA_SETADP_READ_SNMP_PARMS = 0x0400, 246 IPA_SETADP_QUERY_CARD_INFO = 0x0400,
217 IPA_SETADP_SET_PROMISC_MODE = 0x0800, 247 IPA_SETADP_SET_PROMISC_MODE = 0x0800,
218 IPA_SETADP_QUERY_CARD_INFO = 0x1000,
219}; 248};
220enum qeth_ipa_mac_ops { 249enum qeth_ipa_mac_ops {
221 CHANGE_ADDR_READ_MAC = 0, 250 CHANGE_ADDR_READ_MAC = 0,
222 CHANGE_ADDR_REPLACE_MAC = 1, 251 CHANGE_ADDR_REPLACE_MAC = 1,
223 CHANGE_ADDR_ADD_MAC = 2, 252 CHANGE_ADDR_ADD_MAC = 2,
224 CHANGE_ADDR_DEL_MAC = 4, 253 CHANGE_ADDR_DEL_MAC = 4,
225 CHANGE_ADDR_RESET_MAC = 8, 254 CHANGE_ADDR_RESET_MAC = 8,
226}; 255};
227enum qeth_ipa_addr_ops { 256enum qeth_ipa_addr_ops {
228 CHANGE_ADDR_READ_ADDR = 0, 257 CHANGE_ADDR_READ_ADDR = 0,
229 CHANGE_ADDR_ADD_ADDR = 1, 258 CHANGE_ADDR_ADD_ADDR = 1,
230 CHANGE_ADDR_DEL_ADDR = 2, 259 CHANGE_ADDR_DEL_ADDR = 2,
231 CHANGE_ADDR_FLUSH_ADDR_TABLE = 4, 260 CHANGE_ADDR_FLUSH_ADDR_TABLE = 4,
232}; 261};
233enum qeth_ipa_promisc_modes { 262enum qeth_ipa_promisc_modes {
234 SET_PROMISC_MODE_OFF = 0, 263 SET_PROMISC_MODE_OFF = 0,
@@ -407,15 +436,15 @@ struct qeth_ipacmd_hdr {
407struct qeth_ipa_cmd { 436struct qeth_ipa_cmd {
408 struct qeth_ipacmd_hdr hdr; 437 struct qeth_ipacmd_hdr hdr;
409 union { 438 union {
410 struct qeth_ipacmd_setdelip4 setdelip4; 439 struct qeth_ipacmd_setdelip4 setdelip4;
411 struct qeth_ipacmd_setdelip6 setdelip6; 440 struct qeth_ipacmd_setdelip6 setdelip6;
412 struct qeth_ipacmd_setdelipm setdelipm; 441 struct qeth_ipacmd_setdelipm setdelipm;
413 struct qeth_ipacmd_setassparms setassparms; 442 struct qeth_ipacmd_setassparms setassparms;
414 struct qeth_ipacmd_layer2setdelmac setdelmac; 443 struct qeth_ipacmd_layer2setdelmac setdelmac;
415 struct qeth_ipacmd_layer2setdelvlan setdelvlan; 444 struct qeth_ipacmd_layer2setdelvlan setdelvlan;
416 struct qeth_create_destroy_address create_destroy_addr; 445 struct qeth_create_destroy_address create_destroy_addr;
417 struct qeth_ipacmd_setadpparms setadapterparms; 446 struct qeth_ipacmd_setadpparms setadapterparms;
418 struct qeth_set_routing setrtg; 447 struct qeth_set_routing setrtg;
419 } data; 448 } data;
420} __attribute__ ((packed)); 449} __attribute__ ((packed));
421 450
@@ -433,6 +462,12 @@ enum qeth_ipa_arp_return_codes {
433 QETH_IPA_ARP_RC_Q_NO_DATA = 0x0008, 462 QETH_IPA_ARP_RC_Q_NO_DATA = 0x0008,
434}; 463};
435 464
465
466extern char *
467qeth_get_ipa_msg(enum qeth_ipa_return_codes rc);
468extern char *
469qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd);
470
436#define QETH_SETASS_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \ 471#define QETH_SETASS_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \
437 sizeof(struct qeth_ipacmd_setassparms_hdr)) 472 sizeof(struct qeth_ipacmd_setassparms_hdr))
438#define QETH_IPA_ARP_DATA_POS(buffer) (buffer + IPA_PDU_HEADER_SIZE + \ 473#define QETH_IPA_ARP_DATA_POS(buffer) (buffer + IPA_PDU_HEADER_SIZE + \
@@ -521,7 +556,7 @@ extern unsigned char DM_ACT[];
521extern unsigned char IDX_ACTIVATE_READ[]; 556extern unsigned char IDX_ACTIVATE_READ[];
522extern unsigned char IDX_ACTIVATE_WRITE[]; 557extern unsigned char IDX_ACTIVATE_WRITE[];
523 558
524#define IDX_ACTIVATE_SIZE 0x22 559#define IDX_ACTIVATE_SIZE 0x22
525#define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c) 560#define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c)
526#define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80) 561#define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80)
527#define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10) 562#define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10)
diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c
index d518419cd0c6..65ffc21afc37 100644
--- a/drivers/s390/net/qeth_sys.c
+++ b/drivers/s390/net/qeth_sys.c
@@ -384,8 +384,6 @@ qeth_dev_route_store(struct qeth_card *card, struct qeth_routing_info *route,
384 route->type = PRIMARY_CONNECTOR; 384 route->type = PRIMARY_CONNECTOR;
385 } else if (!strcmp(tmp, "secondary_connector")) { 385 } else if (!strcmp(tmp, "secondary_connector")) {
386 route->type = SECONDARY_CONNECTOR; 386 route->type = SECONDARY_CONNECTOR;
387 } else if (!strcmp(tmp, "multicast_router")) {
388 route->type = MULTICAST_ROUTER;
389 } else if (!strcmp(tmp, "primary_router")) { 387 } else if (!strcmp(tmp, "primary_router")) {
390 route->type = PRIMARY_ROUTER; 388 route->type = PRIMARY_ROUTER;
391 } else if (!strcmp(tmp, "secondary_router")) { 389 } else if (!strcmp(tmp, "secondary_router")) {