aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorFrank Blaschka <frank.blaschka@de.ibm.com>2011-08-07 21:33:59 -0400
committerDavid S. Miller <davem@davemloft.net>2011-08-13 04:10:17 -0400
commitb333293058aa2d401737c7246bce58f8ba00906d (patch)
treedace4eab8f669d29b4e10cd784d16ca1690cbbbf /drivers/s390
parent0da9581ddb0ffbec8129504d661b563749160e70 (diff)
qeth: add support for af_iucv HiperSockets transport
This patch extends the HiperSockets device driver to send and receive af_iucv traffic over HiperSockets transport. TX: Driver uses new asynchronous delivery of storage blocks to pass flow control/congestion information from the HiperSockets microcode to the af_iucv socket. RX: Memory for incoming traffic is preallocated and passed to HiperSockets layer. If receiver is not capable to clean its buffers shared with HiperSockets and pass new memory to the HiperSockets layer this will cause flow control/congestion events on the sender. Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com> Signed-off-by: Einar Lueck <elelueck@de.ibm.com> Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/net/qeth_core.h19
-rw-r--r--drivers/s390/net/qeth_core_main.c230
-rw-r--r--drivers/s390/net/qeth_l2_main.c2
-rw-r--r--drivers/s390/net/qeth_l3.h4
-rw-r--r--drivers/s390/net/qeth_l3_main.c87
-rw-r--r--drivers/s390/net/qeth_l3_sys.c110
6 files changed, 391 insertions, 61 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index 2c25ed0a49ca..b77c65ed1381 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -217,6 +217,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
217 */ 217 */
218#define QETH_TX_TIMEOUT 100 * HZ 218#define QETH_TX_TIMEOUT 100 * HZ
219#define QETH_RCD_TIMEOUT 60 * HZ 219#define QETH_RCD_TIMEOUT 60 * HZ
220#define QETH_RECLAIM_WORK_TIME HZ
220#define QETH_HEADER_SIZE 32 221#define QETH_HEADER_SIZE 32
221#define QETH_MAX_PORTNO 15 222#define QETH_MAX_PORTNO 15
222 223
@@ -265,6 +266,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
265 266
266/* large receive scatter gather copy break */ 267/* large receive scatter gather copy break */
267#define QETH_RX_SG_CB (PAGE_SIZE >> 1) 268#define QETH_RX_SG_CB (PAGE_SIZE >> 1)
269#define QETH_RX_PULL_LEN 256
268 270
269struct qeth_hdr_layer3 { 271struct qeth_hdr_layer3 {
270 __u8 id; 272 __u8 id;
@@ -382,6 +384,16 @@ enum qeth_qdio_buffer_states {
382 QETH_QDIO_BUF_PRIMED, 384 QETH_QDIO_BUF_PRIMED,
383 /* 385 /*
384 * inbound: not applicable 386 * inbound: not applicable
387 * outbound: identified to be pending in TPQ
388 */
389 QETH_QDIO_BUF_PENDING,
390 /*
391 * inbound: not applicable
392 * outbound: found in completion queue
393 */
394 QETH_QDIO_BUF_IN_CQ,
395 /*
396 * inbound: not applicable
385 * outbound: handled via transfer pending / completion queue 397 * outbound: handled via transfer pending / completion queue
386 */ 398 */
387 QETH_QDIO_BUF_HANDLED_DELAYED, 399 QETH_QDIO_BUF_HANDLED_DELAYED,
@@ -409,6 +421,7 @@ struct qeth_qdio_buffer {
409 struct qdio_buffer *buffer; 421 struct qdio_buffer *buffer;
410 /* the buffer pool entry currently associated to this buffer */ 422 /* the buffer pool entry currently associated to this buffer */
411 struct qeth_buffer_pool_entry *pool_entry; 423 struct qeth_buffer_pool_entry *pool_entry;
424 struct sk_buff *rx_skb;
412}; 425};
413 426
414struct qeth_qdio_q { 427struct qeth_qdio_q {
@@ -674,6 +687,7 @@ struct qeth_card_options {
674 enum qeth_ipa_isolation_modes isolation; 687 enum qeth_ipa_isolation_modes isolation;
675 int sniffer; 688 int sniffer;
676 enum qeth_cq cq; 689 enum qeth_cq cq;
690 char hsuid[9];
677}; 691};
678 692
679/* 693/*
@@ -771,6 +785,8 @@ struct qeth_card {
771 struct mutex discipline_mutex; 785 struct mutex discipline_mutex;
772 struct napi_struct napi; 786 struct napi_struct napi;
773 struct qeth_rx rx; 787 struct qeth_rx rx;
788 struct delayed_work buffer_reclaim_work;
789 int reclaim_index;
774}; 790};
775 791
776struct qeth_card_list_struct { 792struct qeth_card_list_struct {
@@ -836,6 +852,7 @@ int qeth_core_create_device_attributes(struct device *);
836void qeth_core_remove_device_attributes(struct device *); 852void qeth_core_remove_device_attributes(struct device *);
837int qeth_core_create_osn_attributes(struct device *); 853int qeth_core_create_osn_attributes(struct device *);
838void qeth_core_remove_osn_attributes(struct device *); 854void qeth_core_remove_osn_attributes(struct device *);
855void qeth_buffer_reclaim_work(struct work_struct *);
839 856
840/* exports for qeth discipline device drivers */ 857/* exports for qeth discipline device drivers */
841extern struct qeth_card_list_struct qeth_core_card_list; 858extern struct qeth_card_list_struct qeth_core_card_list;
@@ -864,7 +881,7 @@ int qeth_check_qdio_errors(struct qeth_card *, struct qdio_buffer *,
864 unsigned int, const char *); 881 unsigned int, const char *);
865void qeth_queue_input_buffer(struct qeth_card *, int); 882void qeth_queue_input_buffer(struct qeth_card *, int);
866struct sk_buff *qeth_core_get_next_skb(struct qeth_card *, 883struct sk_buff *qeth_core_get_next_skb(struct qeth_card *,
867 struct qdio_buffer *, struct qdio_buffer_element **, int *, 884 struct qeth_qdio_buffer *, struct qdio_buffer_element **, int *,
868 struct qeth_hdr **); 885 struct qeth_hdr **);
869void qeth_schedule_recovery(struct qeth_card *); 886void qeth_schedule_recovery(struct qeth_card *);
870void qeth_qdio_start_poll(struct ccw_device *, int, unsigned long); 887void qeth_qdio_start_poll(struct ccw_device *, int, unsigned long);
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 68a92b06526b..97172f8a15b7 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -21,6 +21,7 @@
21#include <linux/mii.h> 21#include <linux/mii.h>
22#include <linux/kthread.h> 22#include <linux/kthread.h>
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <net/iucv/af_iucv.h>
24 25
25#include <asm/ebcdic.h> 26#include <asm/ebcdic.h>
26#include <asm/io.h> 27#include <asm/io.h>
@@ -58,6 +59,10 @@ static void qeth_setup_ccw(struct qeth_channel *, unsigned char *, __u32);
58static void qeth_free_buffer_pool(struct qeth_card *); 59static void qeth_free_buffer_pool(struct qeth_card *);
59static int qeth_qdio_establish(struct qeth_card *); 60static int qeth_qdio_establish(struct qeth_card *);
60static void qeth_free_qdio_buffers(struct qeth_card *); 61static void qeth_free_qdio_buffers(struct qeth_card *);
62static void qeth_notify_skbs(struct qeth_qdio_out_q *queue,
63 struct qeth_qdio_out_buffer *buf,
64 enum iucv_tx_notify notification);
65static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf);
61static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, 66static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
62 struct qeth_qdio_out_buffer *buf, 67 struct qeth_qdio_out_buffer *buf,
63 enum qeth_qdio_buffer_states newbufstate); 68 enum qeth_qdio_buffer_states newbufstate);
@@ -204,7 +209,7 @@ static int qeth_alloc_buffer_pool(struct qeth_card *card)
204 209
205 QETH_CARD_TEXT(card, 5, "alocpool"); 210 QETH_CARD_TEXT(card, 5, "alocpool");
206 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { 211 for (i = 0; i < card->qdio.init_pool.buf_count; ++i) {
207 pool_entry = kmalloc(sizeof(*pool_entry), GFP_KERNEL); 212 pool_entry = kzalloc(sizeof(*pool_entry), GFP_KERNEL);
208 if (!pool_entry) { 213 if (!pool_entry) {
209 qeth_free_buffer_pool(card); 214 qeth_free_buffer_pool(card);
210 return -ENOMEM; 215 return -ENOMEM;
@@ -331,6 +336,30 @@ static inline void qeth_free_cq(struct qeth_card *card)
331 card->qdio.out_bufstates = NULL; 336 card->qdio.out_bufstates = NULL;
332} 337}
333 338
339static inline enum iucv_tx_notify qeth_compute_cq_notification(int sbalf15,
340 int delayed) {
341 enum iucv_tx_notify n;
342
343 switch (sbalf15) {
344 case 0:
345 n = delayed ? TX_NOTIFY_DELAYED_OK : TX_NOTIFY_OK;
346 break;
347 case 4:
348 case 16:
349 case 17:
350 case 18:
351 n = delayed ? TX_NOTIFY_DELAYED_UNREACHABLE :
352 TX_NOTIFY_UNREACHABLE;
353 break;
354 default:
355 n = delayed ? TX_NOTIFY_DELAYED_GENERALERROR :
356 TX_NOTIFY_GENERALERROR;
357 break;
358 }
359
360 return n;
361}
362
334static inline void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, 363static inline void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q,
335 int bidx, int forced_cleanup) 364 int bidx, int forced_cleanup)
336{ 365{
@@ -345,6 +374,11 @@ static inline void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q,
345 struct qeth_qdio_out_buffer *f = c; 374 struct qeth_qdio_out_buffer *f = c;
346 QETH_CARD_TEXT(f->q->card, 5, "fp"); 375 QETH_CARD_TEXT(f->q->card, 5, "fp");
347 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f); 376 QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f);
377 /* release here to avoid interleaving between
378 outbound tasklet and inbound tasklet
379 regarding notifications and lifecycle */
380 qeth_release_skbs(c);
381
348 c = f->next_pending; 382 c = f->next_pending;
349 BUG_ON(head->next_pending != f); 383 BUG_ON(head->next_pending != f);
350 head->next_pending = c; 384 head->next_pending = c;
@@ -363,6 +397,7 @@ static inline void qeth_qdio_handle_aob(struct qeth_card *card,
363 unsigned long phys_aob_addr) { 397 unsigned long phys_aob_addr) {
364 struct qaob *aob; 398 struct qaob *aob;
365 struct qeth_qdio_out_buffer *buffer; 399 struct qeth_qdio_out_buffer *buffer;
400 enum iucv_tx_notify notification;
366 401
367 aob = (struct qaob *) phys_to_virt(phys_aob_addr); 402 aob = (struct qaob *) phys_to_virt(phys_aob_addr);
368 QETH_CARD_TEXT(card, 5, "haob"); 403 QETH_CARD_TEXT(card, 5, "haob");
@@ -372,6 +407,22 @@ static inline void qeth_qdio_handle_aob(struct qeth_card *card,
372 407
373 BUG_ON(buffer == NULL); 408 BUG_ON(buffer == NULL);
374 409
410 if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
411 QETH_QDIO_BUF_IN_CQ) == QETH_QDIO_BUF_PRIMED) {
412 notification = TX_NOTIFY_OK;
413 } else {
414 BUG_ON(atomic_read(&buffer->state) != QETH_QDIO_BUF_PENDING);
415
416 atomic_set(&buffer->state, QETH_QDIO_BUF_IN_CQ);
417 notification = TX_NOTIFY_DELAYED_OK;
418 }
419
420 if (aob->aorc != 0) {
421 QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
422 notification = qeth_compute_cq_notification(aob->aorc, 1);
423 }
424 qeth_notify_skbs(buffer->q, buffer, notification);
425
375 buffer->aob = NULL; 426 buffer->aob = NULL;
376 qeth_clear_output_buffer(buffer->q, buffer, 427 qeth_clear_output_buffer(buffer->q, buffer,
377 QETH_QDIO_BUF_HANDLED_DELAYED); 428 QETH_QDIO_BUF_HANDLED_DELAYED);
@@ -738,7 +789,7 @@ static int qeth_setup_channel(struct qeth_channel *channel)
738 QETH_DBF_TEXT(SETUP, 2, "setupch"); 789 QETH_DBF_TEXT(SETUP, 2, "setupch");
739 for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) { 790 for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) {
740 channel->iob[cnt].data = 791 channel->iob[cnt].data =
741 kmalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL); 792 kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL);
742 if (channel->iob[cnt].data == NULL) 793 if (channel->iob[cnt].data == NULL)
743 break; 794 break;
744 channel->iob[cnt].state = BUF_STATE_FREE; 795 channel->iob[cnt].state = BUF_STATE_FREE;
@@ -1033,23 +1084,60 @@ out:
1033 return; 1084 return;
1034} 1085}
1035 1086
1036static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, 1087static void qeth_notify_skbs(struct qeth_qdio_out_q *q,
1037 struct qeth_qdio_out_buffer *buf, 1088 struct qeth_qdio_out_buffer *buf,
1038 enum qeth_qdio_buffer_states newbufstate) 1089 enum iucv_tx_notify notification)
1039{ 1090{
1040 int i;
1041 struct sk_buff *skb; 1091 struct sk_buff *skb;
1042 1092
1043 /* is PCI flag set on buffer? */ 1093 if (skb_queue_empty(&buf->skb_list))
1044 if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ) 1094 goto out;
1045 atomic_dec(&queue->set_pci_flags_count); 1095 skb = skb_peek(&buf->skb_list);
1096 while (skb) {
1097 QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
1098 QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
1099 if (skb->protocol == ETH_P_AF_IUCV) {
1100 if (skb->sk) {
1101 struct iucv_sock *iucv = iucv_sk(skb->sk);
1102 iucv->sk_txnotify(skb, notification);
1103 }
1104 }
1105 if (skb_queue_is_last(&buf->skb_list, skb))
1106 skb = NULL;
1107 else
1108 skb = skb_queue_next(&buf->skb_list, skb);
1109 }
1110out:
1111 return;
1112}
1113
1114static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf)
1115{
1116 struct sk_buff *skb;
1046 1117
1047 skb = skb_dequeue(&buf->skb_list); 1118 skb = skb_dequeue(&buf->skb_list);
1048 while (skb) { 1119 while (skb) {
1120 QETH_CARD_TEXT(buf->q->card, 5, "skbr");
1121 QETH_CARD_TEXT_(buf->q->card, 5, "%lx", (long) skb);
1049 atomic_dec(&skb->users); 1122 atomic_dec(&skb->users);
1050 dev_kfree_skb_any(skb); 1123 dev_kfree_skb_any(skb);
1051 skb = skb_dequeue(&buf->skb_list); 1124 skb = skb_dequeue(&buf->skb_list);
1052 } 1125 }
1126}
1127
1128static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
1129 struct qeth_qdio_out_buffer *buf,
1130 enum qeth_qdio_buffer_states newbufstate)
1131{
1132 int i;
1133
1134 /* is PCI flag set on buffer? */
1135 if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ)
1136 atomic_dec(&queue->set_pci_flags_count);
1137
1138 if (newbufstate == QETH_QDIO_BUF_EMPTY) {
1139 qeth_release_skbs(buf);
1140 }
1053 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { 1141 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) {
1054 if (buf->buffer->element[i].addr && buf->is_header[i]) 1142 if (buf->buffer->element[i].addr && buf->is_header[i])
1055 kmem_cache_free(qeth_core_header_cache, 1143 kmem_cache_free(qeth_core_header_cache,
@@ -1111,14 +1199,16 @@ static void qeth_free_buffer_pool(struct qeth_card *card)
1111 1199
1112static void qeth_free_qdio_buffers(struct qeth_card *card) 1200static void qeth_free_qdio_buffers(struct qeth_card *card)
1113{ 1201{
1114 int i; 1202 int i, j;
1115 1203
1116 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == 1204 if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
1117 QETH_QDIO_UNINITIALIZED) 1205 QETH_QDIO_UNINITIALIZED)
1118 return; 1206 return;
1119 1207
1120 qeth_free_cq(card); 1208 qeth_free_cq(card);
1121 1209 cancel_delayed_work_sync(&card->buffer_reclaim_work);
1210 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
1211 kfree_skb(card->qdio.in_q->bufs[j].rx_skb);
1122 kfree(card->qdio.in_q); 1212 kfree(card->qdio.in_q);
1123 card->qdio.in_q = NULL; 1213 card->qdio.in_q = NULL;
1124 /* inbound buffer pool */ 1214 /* inbound buffer pool */
@@ -1289,6 +1379,7 @@ static int qeth_setup_card(struct qeth_card *card)
1289 card->ipato.invert6 = 0; 1379 card->ipato.invert6 = 0;
1290 /* init QDIO stuff */ 1380 /* init QDIO stuff */
1291 qeth_init_qdio_info(card); 1381 qeth_init_qdio_info(card);
1382 INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work);
1292 return 0; 1383 return 0;
1293} 1384}
1294 1385
@@ -1310,7 +1401,7 @@ static struct qeth_card *qeth_alloc_card(void)
1310 if (!card) 1401 if (!card)
1311 goto out; 1402 goto out;
1312 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 1403 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1313 card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_KERNEL); 1404 card->ip_tbd_list = kzalloc(sizeof(struct list_head), GFP_KERNEL);
1314 if (!card->ip_tbd_list) { 1405 if (!card->ip_tbd_list) {
1315 QETH_DBF_TEXT(SETUP, 0, "iptbdnom"); 1406 QETH_DBF_TEXT(SETUP, 0, "iptbdnom");
1316 goto out_card; 1407 goto out_card;
@@ -2239,7 +2330,7 @@ static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2239 QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED) 2330 QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED)
2240 return 0; 2331 return 0;
2241 2332
2242 card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), 2333 card->qdio.in_q = kzalloc(sizeof(struct qeth_qdio_q),
2243 GFP_KERNEL); 2334 GFP_KERNEL);
2244 if (!card->qdio.in_q) 2335 if (!card->qdio.in_q)
2245 goto out_nomem; 2336 goto out_nomem;
@@ -2247,27 +2338,28 @@ static int qeth_alloc_qdio_buffers(struct qeth_card *card)
2247 QETH_DBF_HEX(SETUP, 2, &card->qdio.in_q, sizeof(void *)); 2338 QETH_DBF_HEX(SETUP, 2, &card->qdio.in_q, sizeof(void *));
2248 memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q)); 2339 memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
2249 /* give inbound qeth_qdio_buffers their qdio_buffers */ 2340 /* give inbound qeth_qdio_buffers their qdio_buffers */
2250 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) 2341 for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
2251 card->qdio.in_q->bufs[i].buffer = 2342 card->qdio.in_q->bufs[i].buffer =
2252 &card->qdio.in_q->qdio_bufs[i]; 2343 &card->qdio.in_q->qdio_bufs[i];
2344 card->qdio.in_q->bufs[i].rx_skb = NULL;
2345 }
2253 /* inbound buffer pool */ 2346 /* inbound buffer pool */
2254 if (qeth_alloc_buffer_pool(card)) 2347 if (qeth_alloc_buffer_pool(card))
2255 goto out_freeinq; 2348 goto out_freeinq;
2256 2349
2257 /* outbound */ 2350 /* outbound */
2258 card->qdio.out_qs = 2351 card->qdio.out_qs =
2259 kmalloc(card->qdio.no_out_queues * 2352 kzalloc(card->qdio.no_out_queues *
2260 sizeof(struct qeth_qdio_out_q *), GFP_KERNEL); 2353 sizeof(struct qeth_qdio_out_q *), GFP_KERNEL);
2261 if (!card->qdio.out_qs) 2354 if (!card->qdio.out_qs)
2262 goto out_freepool; 2355 goto out_freepool;
2263 for (i = 0; i < card->qdio.no_out_queues; ++i) { 2356 for (i = 0; i < card->qdio.no_out_queues; ++i) {
2264 card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q), 2357 card->qdio.out_qs[i] = kzalloc(sizeof(struct qeth_qdio_out_q),
2265 GFP_KERNEL); 2358 GFP_KERNEL);
2266 if (!card->qdio.out_qs[i]) 2359 if (!card->qdio.out_qs[i])
2267 goto out_freeoutq; 2360 goto out_freeoutq;
2268 QETH_DBF_TEXT_(SETUP, 2, "outq %i", i); 2361 QETH_DBF_TEXT_(SETUP, 2, "outq %i", i);
2269 QETH_DBF_HEX(SETUP, 2, &card->qdio.out_qs[i], sizeof(void *)); 2362 QETH_DBF_HEX(SETUP, 2, &card->qdio.out_qs[i], sizeof(void *));
2270 memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q));
2271 card->qdio.out_qs[i]->queue_no = i; 2363 card->qdio.out_qs[i]->queue_no = i;
2272 /* give outbound qeth_qdio_buffers their qdio_buffers */ 2364 /* give outbound qeth_qdio_buffers their qdio_buffers */
2273 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { 2365 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
@@ -2565,6 +2657,12 @@ static int qeth_init_input_buffer(struct qeth_card *card,
2565 struct qeth_buffer_pool_entry *pool_entry; 2657 struct qeth_buffer_pool_entry *pool_entry;
2566 int i; 2658 int i;
2567 2659
2660 if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) {
2661 buf->rx_skb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
2662 if (!buf->rx_skb)
2663 return 1;
2664 }
2665
2568 pool_entry = qeth_find_free_buffer_pool_entry(card); 2666 pool_entry = qeth_find_free_buffer_pool_entry(card);
2569 if (!pool_entry) 2667 if (!pool_entry)
2570 return 1; 2668 return 1;
@@ -2954,9 +3052,19 @@ int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
2954} 3052}
2955EXPORT_SYMBOL_GPL(qeth_check_qdio_errors); 3053EXPORT_SYMBOL_GPL(qeth_check_qdio_errors);
2956 3054
3055void qeth_buffer_reclaim_work(struct work_struct *work)
3056{
3057 struct qeth_card *card = container_of(work, struct qeth_card,
3058 buffer_reclaim_work.work);
3059
3060 QETH_CARD_TEXT_(card, 2, "brw:%x", card->reclaim_index);
3061 qeth_queue_input_buffer(card, card->reclaim_index);
3062}
3063
2957void qeth_queue_input_buffer(struct qeth_card *card, int index) 3064void qeth_queue_input_buffer(struct qeth_card *card, int index)
2958{ 3065{
2959 struct qeth_qdio_q *queue = card->qdio.in_q; 3066 struct qeth_qdio_q *queue = card->qdio.in_q;
3067 struct list_head *lh;
2960 int count; 3068 int count;
2961 int i; 3069 int i;
2962 int rc; 3070 int rc;
@@ -2988,6 +3096,20 @@ void qeth_queue_input_buffer(struct qeth_card *card, int index)
2988 atomic_add_unless(&card->force_alloc_skb, -1, 0); 3096 atomic_add_unless(&card->force_alloc_skb, -1, 0);
2989 } 3097 }
2990 3098
3099 if (!count) {
3100 i = 0;
3101 list_for_each(lh, &card->qdio.in_buf_pool.entry_list)
3102 i++;
3103 if (i == card->qdio.in_buf_pool.buf_count) {
3104 QETH_CARD_TEXT(card, 2, "qsarbw");
3105 card->reclaim_index = index;
3106 schedule_delayed_work(
3107 &card->buffer_reclaim_work,
3108 QETH_RECLAIM_WORK_TIME);
3109 }
3110 return;
3111 }
3112
2991 /* 3113 /*
2992 * according to old code it should be avoided to requeue all 3114 * according to old code it should be avoided to requeue all
2993 * 128 buffers in order to benefit from PCI avoidance. 3115 * 128 buffers in order to benefit from PCI avoidance.
@@ -3396,15 +3518,34 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev,
3396 if (queue->bufstates && 3518 if (queue->bufstates &&
3397 (queue->bufstates[bidx].flags & 3519 (queue->bufstates[bidx].flags &
3398 QDIO_OUTBUF_STATE_FLAG_PENDING) != 0) { 3520 QDIO_OUTBUF_STATE_FLAG_PENDING) != 0) {
3521 BUG_ON(card->options.cq != QETH_CQ_ENABLED);
3522
3523 if (atomic_cmpxchg(&buffer->state,
3524 QETH_QDIO_BUF_PRIMED,
3525 QETH_QDIO_BUF_PENDING) ==
3526 QETH_QDIO_BUF_PRIMED) {
3527 qeth_notify_skbs(queue, buffer,
3528 TX_NOTIFY_PENDING);
3529 }
3399 buffer->aob = queue->bufstates[bidx].aob; 3530 buffer->aob = queue->bufstates[bidx].aob;
3400 QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx); 3531 QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx);
3401 QETH_CARD_TEXT_(queue->card, 5, "aob"); 3532 QETH_CARD_TEXT(queue->card, 5, "aob");
3402 QETH_CARD_TEXT_(queue->card, 5, "%lx", 3533 QETH_CARD_TEXT_(queue->card, 5, "%lx",
3403 virt_to_phys(buffer->aob)); 3534 virt_to_phys(buffer->aob));
3404 BUG_ON(bidx < 0 || bidx >= QDIO_MAX_BUFFERS_PER_Q); 3535 BUG_ON(bidx < 0 || bidx >= QDIO_MAX_BUFFERS_PER_Q);
3405 if (qeth_init_qdio_out_buf(queue, bidx)) 3536 if (qeth_init_qdio_out_buf(queue, bidx)) {
3537 QETH_CARD_TEXT(card, 2, "outofbuf");
3406 qeth_schedule_recovery(card); 3538 qeth_schedule_recovery(card);
3539 }
3407 } else { 3540 } else {
3541 if (card->options.cq == QETH_CQ_ENABLED) {
3542 enum iucv_tx_notify n;
3543
3544 n = qeth_compute_cq_notification(
3545 buffer->buffer->element[15].sflags, 0);
3546 qeth_notify_skbs(queue, buffer, n);
3547 }
3548
3408 qeth_clear_output_buffer(queue, buffer, 3549 qeth_clear_output_buffer(queue, buffer,
3409 QETH_QDIO_BUF_EMPTY); 3550 QETH_QDIO_BUF_EMPTY);
3410 } 3551 }
@@ -4335,7 +4476,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
4335 qeth_create_qib_param_field(card, qib_param_field); 4476 qeth_create_qib_param_field(card, qib_param_field);
4336 qeth_create_qib_param_field_blkt(card, qib_param_field); 4477 qeth_create_qib_param_field_blkt(card, qib_param_field);
4337 4478
4338 in_sbal_ptrs = kmalloc(card->qdio.no_in_queues * 4479 in_sbal_ptrs = kzalloc(card->qdio.no_in_queues *
4339 QDIO_MAX_BUFFERS_PER_Q * sizeof(void *), 4480 QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
4340 GFP_KERNEL); 4481 GFP_KERNEL);
4341 if (!in_sbal_ptrs) { 4482 if (!in_sbal_ptrs) {
@@ -4359,7 +4500,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
4359 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll); 4500 qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
4360 4501
4361 out_sbal_ptrs = 4502 out_sbal_ptrs =
4362 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q * 4503 kzalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
4363 sizeof(void *), GFP_KERNEL); 4504 sizeof(void *), GFP_KERNEL);
4364 if (!out_sbal_ptrs) { 4505 if (!out_sbal_ptrs) {
4365 rc = -ENOMEM; 4506 rc = -ENOMEM;
@@ -4557,29 +4698,36 @@ out:
4557} 4698}
4558EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card); 4699EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
4559 4700
4560static inline int qeth_create_skb_frag(struct qdio_buffer_element *element, 4701static inline int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer,
4702 struct qdio_buffer_element *element,
4561 struct sk_buff **pskb, int offset, int *pfrag, int data_len) 4703 struct sk_buff **pskb, int offset, int *pfrag, int data_len)
4562{ 4704{
4563 struct page *page = virt_to_page(element->addr); 4705 struct page *page = virt_to_page(element->addr);
4564 if (*pskb == NULL) { 4706 if (*pskb == NULL) {
4565 /* the upper protocol layers assume that there is data in the 4707 if (qethbuffer->rx_skb) {
4566 * skb itself. Copy a small amount (64 bytes) to make them 4708 /* only if qeth_card.options.cq == QETH_CQ_ENABLED */
4567 * happy. */ 4709 *pskb = qethbuffer->rx_skb;
4568 *pskb = dev_alloc_skb(64 + ETH_HLEN); 4710 qethbuffer->rx_skb = NULL;
4569 if (!(*pskb)) 4711 } else {
4570 return -ENOMEM; 4712 *pskb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
4713 if (!(*pskb))
4714 return -ENOMEM;
4715 }
4716
4571 skb_reserve(*pskb, ETH_HLEN); 4717 skb_reserve(*pskb, ETH_HLEN);
4572 if (data_len <= 64) { 4718 if (data_len <= QETH_RX_PULL_LEN) {
4573 memcpy(skb_put(*pskb, data_len), element->addr + offset, 4719 memcpy(skb_put(*pskb, data_len), element->addr + offset,
4574 data_len); 4720 data_len);
4575 } else { 4721 } else {
4576 get_page(page); 4722 get_page(page);
4577 memcpy(skb_put(*pskb, 64), element->addr + offset, 64); 4723 memcpy(skb_put(*pskb, QETH_RX_PULL_LEN),
4578 skb_fill_page_desc(*pskb, *pfrag, page, offset + 64, 4724 element->addr + offset, QETH_RX_PULL_LEN);
4579 data_len - 64); 4725 skb_fill_page_desc(*pskb, *pfrag, page,
4580 (*pskb)->data_len += data_len - 64; 4726 offset + QETH_RX_PULL_LEN,
4581 (*pskb)->len += data_len - 64; 4727 data_len - QETH_RX_PULL_LEN);
4582 (*pskb)->truesize += data_len - 64; 4728 (*pskb)->data_len += data_len - QETH_RX_PULL_LEN;
4729 (*pskb)->len += data_len - QETH_RX_PULL_LEN;
4730 (*pskb)->truesize += data_len - QETH_RX_PULL_LEN;
4583 (*pfrag)++; 4731 (*pfrag)++;
4584 } 4732 }
4585 } else { 4733 } else {
@@ -4596,11 +4744,12 @@ static inline int qeth_create_skb_frag(struct qdio_buffer_element *element,
4596} 4744}
4597 4745
4598struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, 4746struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4599 struct qdio_buffer *buffer, 4747 struct qeth_qdio_buffer *qethbuffer,
4600 struct qdio_buffer_element **__element, int *__offset, 4748 struct qdio_buffer_element **__element, int *__offset,
4601 struct qeth_hdr **hdr) 4749 struct qeth_hdr **hdr)
4602{ 4750{
4603 struct qdio_buffer_element *element = *__element; 4751 struct qdio_buffer_element *element = *__element;
4752 struct qdio_buffer *buffer = qethbuffer->buffer;
4604 int offset = *__offset; 4753 int offset = *__offset;
4605 struct sk_buff *skb = NULL; 4754 struct sk_buff *skb = NULL;
4606 int skb_len = 0; 4755 int skb_len = 0;
@@ -4645,9 +4794,10 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4645 if (!skb_len) 4794 if (!skb_len)
4646 return NULL; 4795 return NULL;
4647 4796
4648 if ((skb_len >= card->options.rx_sg_cb) && 4797 if (((skb_len >= card->options.rx_sg_cb) &&
4649 (!(card->info.type == QETH_CARD_TYPE_OSN)) && 4798 (!(card->info.type == QETH_CARD_TYPE_OSN)) &&
4650 (!atomic_read(&card->force_alloc_skb))) { 4799 (!atomic_read(&card->force_alloc_skb))) ||
4800 (card->options.cq == QETH_CQ_ENABLED)) {
4651 use_rx_sg = 1; 4801 use_rx_sg = 1;
4652 } else { 4802 } else {
4653 skb = dev_alloc_skb(skb_len + headroom); 4803 skb = dev_alloc_skb(skb_len + headroom);
@@ -4662,8 +4812,8 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4662 data_len = min(skb_len, (int)(element->length - offset)); 4812 data_len = min(skb_len, (int)(element->length - offset));
4663 if (data_len) { 4813 if (data_len) {
4664 if (use_rx_sg) { 4814 if (use_rx_sg) {
4665 if (qeth_create_skb_frag(element, &skb, offset, 4815 if (qeth_create_skb_frag(qethbuffer, element,
4666 &frag, data_len)) 4816 &skb, offset, &frag, data_len))
4667 goto no_mem; 4817 goto no_mem;
4668 } else { 4818 } else {
4669 memcpy(skb_put(skb, data_len), data_ptr, 4819 memcpy(skb_put(skb, data_len), data_ptr,
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index b70b47fbd6cd..3e68b66dc43e 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -409,7 +409,7 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
409 BUG_ON(!budget); 409 BUG_ON(!budget);
410 while (budget) { 410 while (budget) {
411 skb = qeth_core_get_next_skb(card, 411 skb = qeth_core_get_next_skb(card,
412 card->qdio.in_q->bufs[card->rx.b_index].buffer, 412 &card->qdio.in_q->bufs[card->rx.b_index],
413 &card->rx.b_element, &card->rx.e_offset, &hdr); 413 &card->rx.b_element, &card->rx.e_offset, &hdr);
414 if (!skb) { 414 if (!skb) {
415 *done = 1; 415 *done = 1;
diff --git a/drivers/s390/net/qeth_l3.h b/drivers/s390/net/qeth_l3.h
index 14a43aeb0c2a..e367315a63f0 100644
--- a/drivers/s390/net/qeth_l3.h
+++ b/drivers/s390/net/qeth_l3.h
@@ -63,5 +63,9 @@ int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
63void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions, 63void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
64 const u8 *); 64 const u8 *);
65int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *); 65int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
66struct qeth_ipaddr *qeth_l3_get_addr_buffer(enum qeth_prot_versions);
67int qeth_l3_add_ip(struct qeth_card *, struct qeth_ipaddr *);
68int qeth_l3_delete_ip(struct qeth_card *, struct qeth_ipaddr *);
69void qeth_l3_set_ip_addr_list(struct qeth_card *);
66 70
67#endif /* __QETH_L3_H__ */ 71#endif /* __QETH_L3_H__ */
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 553b6686dd31..e2a927ae002a 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -29,6 +29,7 @@
29#include <net/ip.h> 29#include <net/ip.h>
30#include <net/arp.h> 30#include <net/arp.h>
31#include <net/ip6_checksum.h> 31#include <net/ip6_checksum.h>
32#include <net/iucv/af_iucv.h>
32 33
33#include "qeth_l3.h" 34#include "qeth_l3.h"
34 35
@@ -267,7 +268,7 @@ static int __qeth_l3_insert_ip_todo(struct qeth_card *card,
267 } 268 }
268} 269}
269 270
270static int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr) 271int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
271{ 272{
272 unsigned long flags; 273 unsigned long flags;
273 int rc = 0; 274 int rc = 0;
@@ -286,7 +287,7 @@ static int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
286 return rc; 287 return rc;
287} 288}
288 289
289static int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr) 290int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
290{ 291{
291 unsigned long flags; 292 unsigned long flags;
292 int rc = 0; 293 int rc = 0;
@@ -305,7 +306,7 @@ static int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
305} 306}
306 307
307 308
308static struct qeth_ipaddr *qeth_l3_get_addr_buffer( 309struct qeth_ipaddr *qeth_l3_get_addr_buffer(
309 enum qeth_prot_versions prot) 310 enum qeth_prot_versions prot)
310{ 311{
311 struct qeth_ipaddr *addr; 312 struct qeth_ipaddr *addr;
@@ -421,7 +422,7 @@ again:
421 list_splice(&fail_list, &card->ip_list); 422 list_splice(&fail_list, &card->ip_list);
422} 423}
423 424
424static void qeth_l3_set_ip_addr_list(struct qeth_card *card) 425void qeth_l3_set_ip_addr_list(struct qeth_card *card)
425{ 426{
426 struct list_head *tbd_list; 427 struct list_head *tbd_list;
427 struct qeth_ipaddr *todo, *addr; 428 struct qeth_ipaddr *todo, *addr;
@@ -438,7 +439,7 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
438 439
439 spin_lock_irqsave(&card->ip_lock, flags); 440 spin_lock_irqsave(&card->ip_lock, flags);
440 tbd_list = card->ip_tbd_list; 441 tbd_list = card->ip_tbd_list;
441 card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_ATOMIC); 442 card->ip_tbd_list = kzalloc(sizeof(struct list_head), GFP_ATOMIC);
442 if (!card->ip_tbd_list) { 443 if (!card->ip_tbd_list) {
443 QETH_CARD_TEXT(card, 0, "silnomem"); 444 QETH_CARD_TEXT(card, 0, "silnomem");
444 card->ip_tbd_list = tbd_list; 445 card->ip_tbd_list = tbd_list;
@@ -1993,12 +1994,13 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card,
1993 __u16 vlan_tag = 0; 1994 __u16 vlan_tag = 0;
1994 int is_vlan; 1995 int is_vlan;
1995 unsigned int len; 1996 unsigned int len;
1997 __u16 magic;
1996 1998
1997 *done = 0; 1999 *done = 0;
1998 BUG_ON(!budget); 2000 BUG_ON(!budget);
1999 while (budget) { 2001 while (budget) {
2000 skb = qeth_core_get_next_skb(card, 2002 skb = qeth_core_get_next_skb(card,
2001 card->qdio.in_q->bufs[card->rx.b_index].buffer, 2003 &card->qdio.in_q->bufs[card->rx.b_index],
2002 &card->rx.b_element, &card->rx.e_offset, &hdr); 2004 &card->rx.b_element, &card->rx.e_offset, &hdr);
2003 if (!skb) { 2005 if (!skb) {
2004 *done = 1; 2006 *done = 1;
@@ -2007,12 +2009,26 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card,
2007 skb->dev = card->dev; 2009 skb->dev = card->dev;
2008 switch (hdr->hdr.l3.id) { 2010 switch (hdr->hdr.l3.id) {
2009 case QETH_HEADER_TYPE_LAYER3: 2011 case QETH_HEADER_TYPE_LAYER3:
2010 is_vlan = qeth_l3_rebuild_skb(card, skb, hdr, 2012 magic = *(__u16 *)skb->data;
2013 if ((card->info.type == QETH_CARD_TYPE_IQD) &&
2014 (magic == ETH_P_AF_IUCV)) {
2015 skb->protocol = ETH_P_AF_IUCV;
2016 skb->pkt_type = PACKET_HOST;
2017 skb->mac_header = NET_SKB_PAD;
2018 skb->dev = card->dev;
2019 len = skb->len;
2020 card->dev->header_ops->create(skb, card->dev, 0,
2021 card->dev->dev_addr, "FAKELL",
2022 card->dev->addr_len);
2023 netif_receive_skb(skb);
2024 } else {
2025 is_vlan = qeth_l3_rebuild_skb(card, skb, hdr,
2011 &vlan_tag); 2026 &vlan_tag);
2012 len = skb->len; 2027 len = skb->len;
2013 if (is_vlan && !card->options.sniffer) 2028 if (is_vlan && !card->options.sniffer)
2014 __vlan_hwaccel_put_tag(skb, vlan_tag); 2029 __vlan_hwaccel_put_tag(skb, vlan_tag);
2015 napi_gro_receive(&card->napi, skb); 2030 napi_gro_receive(&card->napi, skb);
2031 }
2016 break; 2032 break;
2017 case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */ 2033 case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */
2018 skb->pkt_type = PACKET_HOST; 2034 skb->pkt_type = PACKET_HOST;
@@ -2784,6 +2800,30 @@ int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
2784 return cast_type; 2800 return cast_type;
2785} 2801}
2786 2802
2803static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card,
2804 struct qeth_hdr *hdr, struct sk_buff *skb)
2805{
2806 char daddr[16];
2807 struct af_iucv_trans_hdr *iucv_hdr;
2808
2809 skb_pull(skb, 14);
2810 card->dev->header_ops->create(skb, card->dev, 0,
2811 card->dev->dev_addr, card->dev->dev_addr,
2812 card->dev->addr_len);
2813 skb_pull(skb, 14);
2814 iucv_hdr = (struct af_iucv_trans_hdr *)skb->data;
2815 memset(hdr, 0, sizeof(struct qeth_hdr));
2816 hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
2817 hdr->hdr.l3.ext_flags = 0;
2818 hdr->hdr.l3.length = skb->len;
2819 hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST;
2820 memset(daddr, 0, sizeof(daddr));
2821 daddr[0] = 0xfe;
2822 daddr[1] = 0x80;
2823 memcpy(&daddr[8], iucv_hdr->destUserID, 8);
2824 memcpy(hdr->hdr.l3.dest_addr, daddr, 16);
2825}
2826
2787static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, 2827static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
2788 struct sk_buff *skb, int ipv, int cast_type) 2828 struct sk_buff *skb, int ipv, int cast_type)
2789{ 2829{
@@ -2936,8 +2976,11 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
2936 int data_offset = -1; 2976 int data_offset = -1;
2937 int nr_frags; 2977 int nr_frags;
2938 2978
2939 if (((card->info.type == QETH_CARD_TYPE_IQD) && (!ipv)) || 2979 if (((card->info.type == QETH_CARD_TYPE_IQD) &&
2940 card->options.sniffer) 2980 (((card->options.cq != QETH_CQ_ENABLED) && !ipv) ||
2981 ((card->options.cq == QETH_CQ_ENABLED) &&
2982 (skb->protocol != ETH_P_AF_IUCV)))) ||
2983 card->options.sniffer)
2941 goto tx_drop; 2984 goto tx_drop;
2942 2985
2943 if ((card->state != CARD_STATE_UP) || !card->lan_online) { 2986 if ((card->state != CARD_STATE_UP) || !card->lan_online) {
@@ -2959,7 +3002,10 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
2959 if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) && 3002 if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) &&
2960 (skb_shinfo(skb)->nr_frags == 0)) { 3003 (skb_shinfo(skb)->nr_frags == 0)) {
2961 new_skb = skb; 3004 new_skb = skb;
2962 data_offset = ETH_HLEN; 3005 if (new_skb->protocol == ETH_P_AF_IUCV)
3006 data_offset = 0;
3007 else
3008 data_offset = ETH_HLEN;
2963 hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC); 3009 hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
2964 if (!hdr) 3010 if (!hdr)
2965 goto tx_drop; 3011 goto tx_drop;
@@ -3024,9 +3070,13 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
3024 qeth_l3_fill_header(card, hdr, new_skb, ipv, 3070 qeth_l3_fill_header(card, hdr, new_skb, ipv,
3025 cast_type); 3071 cast_type);
3026 } else { 3072 } else {
3027 qeth_l3_fill_header(card, hdr, new_skb, ipv, 3073 if (new_skb->protocol == ETH_P_AF_IUCV)
3028 cast_type); 3074 qeth_l3_fill_af_iucv_hdr(card, hdr, new_skb);
3029 hdr->hdr.l3.length = new_skb->len - data_offset; 3075 else {
3076 qeth_l3_fill_header(card, hdr, new_skb, ipv,
3077 cast_type);
3078 hdr->hdr.l3.length = new_skb->len - data_offset;
3079 }
3030 } 3080 }
3031 3081
3032 if (skb->ip_summed == CHECKSUM_PARTIAL) 3082 if (skb->ip_summed == CHECKSUM_PARTIAL)
@@ -3289,6 +3339,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
3289 card->dev->flags |= IFF_NOARP; 3339 card->dev->flags |= IFF_NOARP;
3290 card->dev->netdev_ops = &qeth_l3_netdev_ops; 3340 card->dev->netdev_ops = &qeth_l3_netdev_ops;
3291 qeth_l3_iqd_read_initial_mac(card); 3341 qeth_l3_iqd_read_initial_mac(card);
3342 if (card->options.hsuid[0])
3343 memcpy(card->dev->perm_addr, card->options.hsuid, 9);
3292 } else 3344 } else
3293 return -ENODEV; 3345 return -ENODEV;
3294 3346
@@ -3659,7 +3711,6 @@ static int qeth_l3_ip6_event(struct notifier_block *this,
3659 struct qeth_ipaddr *addr; 3711 struct qeth_ipaddr *addr;
3660 struct qeth_card *card; 3712 struct qeth_card *card;
3661 3713
3662
3663 card = qeth_l3_get_card_from_dev(dev); 3714 card = qeth_l3_get_card_from_dev(dev);
3664 if (!card) 3715 if (!card)
3665 return NOTIFY_DONE; 3716 return NOTIFY_DONE;
diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c
index cd99210296e2..0ea2fbfe0e99 100644
--- a/drivers/s390/net/qeth_l3_sys.c
+++ b/drivers/s390/net/qeth_l3_sys.c
@@ -9,7 +9,7 @@
9 */ 9 */
10 10
11#include <linux/slab.h> 11#include <linux/slab.h>
12 12#include <asm/ebcdic.h>
13#include "qeth_l3.h" 13#include "qeth_l3.h"
14 14
15#define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \ 15#define QETH_DEVICE_ATTR(_id, _name, _mode, _show, _store) \
@@ -308,6 +308,8 @@ static ssize_t qeth_l3_dev_sniffer_store(struct device *dev,
308 308
309 if (card->info.type != QETH_CARD_TYPE_IQD) 309 if (card->info.type != QETH_CARD_TYPE_IQD)
310 return -EPERM; 310 return -EPERM;
311 if (card->options.cq == QETH_CQ_ENABLED)
312 return -EPERM;
311 313
312 mutex_lock(&card->conf_mutex); 314 mutex_lock(&card->conf_mutex);
313 if ((card->state != CARD_STATE_DOWN) && 315 if ((card->state != CARD_STATE_DOWN) &&
@@ -347,6 +349,111 @@ out:
347static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show, 349static DEVICE_ATTR(sniffer, 0644, qeth_l3_dev_sniffer_show,
348 qeth_l3_dev_sniffer_store); 350 qeth_l3_dev_sniffer_store);
349 351
352
353static ssize_t qeth_l3_dev_hsuid_show(struct device *dev,
354 struct device_attribute *attr, char *buf)
355{
356 struct qeth_card *card = dev_get_drvdata(dev);
357 char tmp_hsuid[9];
358
359 if (!card)
360 return -EINVAL;
361
362 if (card->info.type != QETH_CARD_TYPE_IQD)
363 return -EPERM;
364
365 if (card->state == CARD_STATE_DOWN)
366 return -EPERM;
367
368 memcpy(tmp_hsuid, card->options.hsuid, sizeof(tmp_hsuid));
369 EBCASC(tmp_hsuid, 8);
370 return sprintf(buf, "%s\n", tmp_hsuid);
371}
372
373static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
374 struct device_attribute *attr, const char *buf, size_t count)
375{
376 struct qeth_card *card = dev_get_drvdata(dev);
377 struct qeth_ipaddr *addr;
378 char *tmp;
379 int i;
380
381 if (!card)
382 return -EINVAL;
383
384 if (card->info.type != QETH_CARD_TYPE_IQD)
385 return -EPERM;
386 if (card->state != CARD_STATE_DOWN &&
387 card->state != CARD_STATE_RECOVER)
388 return -EPERM;
389 if (card->options.sniffer)
390 return -EPERM;
391 if (card->options.cq == QETH_CQ_NOTAVAILABLE)
392 return -EPERM;
393
394 tmp = strsep((char **)&buf, "\n");
395 if (strlen(tmp) > 8)
396 return -EINVAL;
397
398 if (card->options.hsuid[0]) {
399 /* delete old ip address */
400 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
401 if (addr != NULL) {
402 addr->u.a6.addr.s6_addr32[0] = 0xfe800000;
403 addr->u.a6.addr.s6_addr32[1] = 0x00000000;
404 for (i = 8; i < 16; i++)
405 addr->u.a6.addr.s6_addr[i] =
406 card->options.hsuid[i - 8];
407 addr->u.a6.pfxlen = 0;
408 addr->type = QETH_IP_TYPE_NORMAL;
409 } else
410 return -ENOMEM;
411 if (!qeth_l3_delete_ip(card, addr))
412 kfree(addr);
413 qeth_l3_set_ip_addr_list(card);
414 }
415
416 if (strlen(tmp) == 0) {
417 /* delete ip address only */
418 card->options.hsuid[0] = '\0';
419 if (card->dev)
420 memcpy(card->dev->perm_addr, card->options.hsuid, 9);
421 qeth_configure_cq(card, QETH_CQ_DISABLED);
422 return count;
423 }
424
425 if (qeth_configure_cq(card, QETH_CQ_ENABLED))
426 return -EPERM;
427
428 for (i = 0; i < 8; i++)
429 card->options.hsuid[i] = ' ';
430 card->options.hsuid[8] = '\0';
431 strncpy(card->options.hsuid, tmp, strlen(tmp));
432 ASCEBC(card->options.hsuid, 8);
433 if (card->dev)
434 memcpy(card->dev->perm_addr, card->options.hsuid, 9);
435
436 addr = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
437 if (addr != NULL) {
438 addr->u.a6.addr.s6_addr32[0] = 0xfe800000;
439 addr->u.a6.addr.s6_addr32[1] = 0x00000000;
440 for (i = 8; i < 16; i++)
441 addr->u.a6.addr.s6_addr[i] = card->options.hsuid[i - 8];
442 addr->u.a6.pfxlen = 0;
443 addr->type = QETH_IP_TYPE_NORMAL;
444 } else
445 return -ENOMEM;
446 if (!qeth_l3_add_ip(card, addr))
447 kfree(addr);
448 qeth_l3_set_ip_addr_list(card);
449
450 return count;
451}
452
453static DEVICE_ATTR(hsuid, 0644, qeth_l3_dev_hsuid_show,
454 qeth_l3_dev_hsuid_store);
455
456
350static struct attribute *qeth_l3_device_attrs[] = { 457static struct attribute *qeth_l3_device_attrs[] = {
351 &dev_attr_route4.attr, 458 &dev_attr_route4.attr,
352 &dev_attr_route6.attr, 459 &dev_attr_route6.attr,
@@ -354,6 +461,7 @@ static struct attribute *qeth_l3_device_attrs[] = {
354 &dev_attr_broadcast_mode.attr, 461 &dev_attr_broadcast_mode.attr,
355 &dev_attr_canonical_macaddr.attr, 462 &dev_attr_canonical_macaddr.attr,
356 &dev_attr_sniffer.attr, 463 &dev_attr_sniffer.attr,
464 &dev_attr_hsuid.attr,
357 NULL, 465 NULL,
358}; 466};
359 467