diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-10 22:45:50 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-10 22:45:50 -0500 |
commit | e8b722f487589a1f60ca27adc695494f188d404e (patch) | |
tree | be3897dceb9b7c0949a8917ab11eea2752375e3b /drivers/s390 | |
parent | 01d07820a0df6b6134c1bb75b1e84c9d0cdab3be (diff) | |
parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) |
Merge commit 'v2.6.29-rc1' into irq/urgent
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 21 | ||||
-rw-r--r-- | drivers/s390/block/dasd_3990_erp.c | 2 | ||||
-rw-r--r-- | drivers/s390/block/dasd_devmap.c | 48 | ||||
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 3 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 3 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eer.c | 4 | ||||
-rw-r--r-- | drivers/s390/block/dasd_fba.c | 3 | ||||
-rw-r--r-- | drivers/s390/block/dasd_int.h | 2 | ||||
-rw-r--r-- | drivers/s390/char/Kconfig | 2 | ||||
-rw-r--r-- | drivers/s390/char/tape_3590.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/vmlogrdr.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_debug.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 2 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 27 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 53 |
16 files changed, 120 insertions, 60 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 570ae59c1d5e..bd5914994142 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -336,6 +336,9 @@ static int | |||
336 | dasd_state_ready_to_online(struct dasd_device * device) | 336 | dasd_state_ready_to_online(struct dasd_device * device) |
337 | { | 337 | { |
338 | int rc; | 338 | int rc; |
339 | struct gendisk *disk; | ||
340 | struct disk_part_iter piter; | ||
341 | struct hd_struct *part; | ||
339 | 342 | ||
340 | if (device->discipline->ready_to_online) { | 343 | if (device->discipline->ready_to_online) { |
341 | rc = device->discipline->ready_to_online(device); | 344 | rc = device->discipline->ready_to_online(device); |
@@ -343,8 +346,14 @@ dasd_state_ready_to_online(struct dasd_device * device) | |||
343 | return rc; | 346 | return rc; |
344 | } | 347 | } |
345 | device->state = DASD_STATE_ONLINE; | 348 | device->state = DASD_STATE_ONLINE; |
346 | if (device->block) | 349 | if (device->block) { |
347 | dasd_schedule_block_bh(device->block); | 350 | dasd_schedule_block_bh(device->block); |
351 | disk = device->block->bdev->bd_disk; | ||
352 | disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); | ||
353 | while ((part = disk_part_iter_next(&piter))) | ||
354 | kobject_uevent(&part_to_dev(part)->kobj, KOBJ_CHANGE); | ||
355 | disk_part_iter_exit(&piter); | ||
356 | } | ||
348 | return 0; | 357 | return 0; |
349 | } | 358 | } |
350 | 359 | ||
@@ -354,6 +363,9 @@ dasd_state_ready_to_online(struct dasd_device * device) | |||
354 | static int dasd_state_online_to_ready(struct dasd_device *device) | 363 | static int dasd_state_online_to_ready(struct dasd_device *device) |
355 | { | 364 | { |
356 | int rc; | 365 | int rc; |
366 | struct gendisk *disk; | ||
367 | struct disk_part_iter piter; | ||
368 | struct hd_struct *part; | ||
357 | 369 | ||
358 | if (device->discipline->online_to_ready) { | 370 | if (device->discipline->online_to_ready) { |
359 | rc = device->discipline->online_to_ready(device); | 371 | rc = device->discipline->online_to_ready(device); |
@@ -361,6 +373,13 @@ static int dasd_state_online_to_ready(struct dasd_device *device) | |||
361 | return rc; | 373 | return rc; |
362 | } | 374 | } |
363 | device->state = DASD_STATE_READY; | 375 | device->state = DASD_STATE_READY; |
376 | if (device->block) { | ||
377 | disk = device->block->bdev->bd_disk; | ||
378 | disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); | ||
379 | while ((part = disk_part_iter_next(&piter))) | ||
380 | kobject_uevent(&part_to_dev(part)->kobj, KOBJ_CHANGE); | ||
381 | disk_part_iter_exit(&piter); | ||
382 | } | ||
364 | return 0; | 383 | return 0; |
365 | } | 384 | } |
366 | 385 | ||
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index b8f9c00633f3..d82aad5224f0 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
@@ -2621,7 +2621,7 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) | |||
2621 | } | 2621 | } |
2622 | } | 2622 | } |
2623 | 2623 | ||
2624 | /* double-check if current erp/cqr was successfull */ | 2624 | /* double-check if current erp/cqr was successful */ |
2625 | if ((cqr->irb.scsw.cmd.cstat == 0x00) && | 2625 | if ((cqr->irb.scsw.cmd.cstat == 0x00) && |
2626 | (cqr->irb.scsw.cmd.dstat == | 2626 | (cqr->irb.scsw.cmd.dstat == |
2627 | (DEV_STAT_CHN_END | DEV_STAT_DEV_END))) { | 2627 | (DEV_STAT_CHN_END | DEV_STAT_DEV_END))) { |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index 2ef25731d197..300e28a531f8 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -206,6 +206,8 @@ dasd_feature_list(char *str, char **endp) | |||
206 | features |= DASD_FEATURE_USEDIAG; | 206 | features |= DASD_FEATURE_USEDIAG; |
207 | else if (len == 6 && !strncmp(str, "erplog", 6)) | 207 | else if (len == 6 && !strncmp(str, "erplog", 6)) |
208 | features |= DASD_FEATURE_ERPLOG; | 208 | features |= DASD_FEATURE_ERPLOG; |
209 | else if (len == 8 && !strncmp(str, "failfast", 8)) | ||
210 | features |= DASD_FEATURE_FAILFAST; | ||
209 | else { | 211 | else { |
210 | MESSAGE(KERN_WARNING, | 212 | MESSAGE(KERN_WARNING, |
211 | "unsupported feature: %*s, " | 213 | "unsupported feature: %*s, " |
@@ -667,6 +669,51 @@ dasd_device_from_cdev(struct ccw_device *cdev) | |||
667 | */ | 669 | */ |
668 | 670 | ||
669 | /* | 671 | /* |
672 | * failfast controls the behaviour, if no path is available | ||
673 | */ | ||
674 | static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr, | ||
675 | char *buf) | ||
676 | { | ||
677 | struct dasd_devmap *devmap; | ||
678 | int ff_flag; | ||
679 | |||
680 | devmap = dasd_find_busid(dev->bus_id); | ||
681 | if (!IS_ERR(devmap)) | ||
682 | ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0; | ||
683 | else | ||
684 | ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0; | ||
685 | return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n"); | ||
686 | } | ||
687 | |||
688 | static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr, | ||
689 | const char *buf, size_t count) | ||
690 | { | ||
691 | struct dasd_devmap *devmap; | ||
692 | int val; | ||
693 | char *endp; | ||
694 | |||
695 | devmap = dasd_devmap_from_cdev(to_ccwdev(dev)); | ||
696 | if (IS_ERR(devmap)) | ||
697 | return PTR_ERR(devmap); | ||
698 | |||
699 | val = simple_strtoul(buf, &endp, 0); | ||
700 | if (((endp + 1) < (buf + count)) || (val > 1)) | ||
701 | return -EINVAL; | ||
702 | |||
703 | spin_lock(&dasd_devmap_lock); | ||
704 | if (val) | ||
705 | devmap->features |= DASD_FEATURE_FAILFAST; | ||
706 | else | ||
707 | devmap->features &= ~DASD_FEATURE_FAILFAST; | ||
708 | if (devmap->device) | ||
709 | devmap->device->features = devmap->features; | ||
710 | spin_unlock(&dasd_devmap_lock); | ||
711 | return count; | ||
712 | } | ||
713 | |||
714 | static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store); | ||
715 | |||
716 | /* | ||
670 | * readonly controls the readonly status of a dasd | 717 | * readonly controls the readonly status of a dasd |
671 | */ | 718 | */ |
672 | static ssize_t | 719 | static ssize_t |
@@ -1020,6 +1067,7 @@ static struct attribute * dasd_attrs[] = { | |||
1020 | &dev_attr_use_diag.attr, | 1067 | &dev_attr_use_diag.attr, |
1021 | &dev_attr_eer_enabled.attr, | 1068 | &dev_attr_eer_enabled.attr, |
1022 | &dev_attr_erplog.attr, | 1069 | &dev_attr_erplog.attr, |
1070 | &dev_attr_failfast.attr, | ||
1023 | NULL, | 1071 | NULL, |
1024 | }; | 1072 | }; |
1025 | 1073 | ||
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 7844461a995b..ef2a56952054 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -544,7 +544,8 @@ static struct dasd_ccw_req *dasd_diag_build_cp(struct dasd_device *memdev, | |||
544 | } | 544 | } |
545 | cqr->retries = DIAG_MAX_RETRIES; | 545 | cqr->retries = DIAG_MAX_RETRIES; |
546 | cqr->buildclk = get_clock(); | 546 | cqr->buildclk = get_clock(); |
547 | if (blk_noretry_request(req)) | 547 | if (blk_noretry_request(req) || |
548 | block->base->features & DASD_FEATURE_FAILFAST) | ||
548 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); | 549 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); |
549 | cqr->startdev = memdev; | 550 | cqr->startdev = memdev; |
550 | cqr->memdev = memdev; | 551 | cqr->memdev = memdev; |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index bd2c52e20762..bdb87998f364 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -1700,7 +1700,8 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev, | |||
1700 | recid++; | 1700 | recid++; |
1701 | } | 1701 | } |
1702 | } | 1702 | } |
1703 | if (blk_noretry_request(req)) | 1703 | if (blk_noretry_request(req) || |
1704 | block->base->features & DASD_FEATURE_FAILFAST) | ||
1704 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); | 1705 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); |
1705 | cqr->startdev = startdev; | 1706 | cqr->startdev = startdev; |
1706 | cqr->memdev = startdev; | 1707 | cqr->memdev = startdev; |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index 892e2878d61b..f8e05ce98621 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -535,8 +535,8 @@ static int dasd_eer_open(struct inode *inp, struct file *filp) | |||
535 | eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { | 535 | eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { |
536 | kfree(eerb); | 536 | kfree(eerb); |
537 | MESSAGE(KERN_WARNING, "can't open device since module " | 537 | MESSAGE(KERN_WARNING, "can't open device since module " |
538 | "parameter eer_pages is smaller then 1 or" | 538 | "parameter eer_pages is smaller than 1 or" |
539 | " bigger then %d", (int)(INT_MAX / PAGE_SIZE)); | 539 | " bigger than %d", (int)(INT_MAX / PAGE_SIZE)); |
540 | unlock_kernel(); | 540 | unlock_kernel(); |
541 | return -EINVAL; | 541 | return -EINVAL; |
542 | } | 542 | } |
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 7d442aeff3d1..f1d176021694 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
@@ -355,7 +355,8 @@ static struct dasd_ccw_req *dasd_fba_build_cp(struct dasd_device * memdev, | |||
355 | recid++; | 355 | recid++; |
356 | } | 356 | } |
357 | } | 357 | } |
358 | if (blk_noretry_request(req)) | 358 | if (blk_noretry_request(req) || |
359 | block->base->features & DASD_FEATURE_FAILFAST) | ||
359 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); | 360 | set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); |
360 | cqr->startdev = memdev; | 361 | cqr->startdev = memdev; |
361 | cqr->memdev = memdev; | 362 | cqr->memdev = memdev; |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index 05a14536c369..4a39084d9c95 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -199,7 +199,7 @@ struct dasd_ccw_req { | |||
199 | #define DASD_CQR_ERROR 0x82 /* request is completed with error */ | 199 | #define DASD_CQR_ERROR 0x82 /* request is completed with error */ |
200 | #define DASD_CQR_CLEAR_PENDING 0x83 /* request is clear pending */ | 200 | #define DASD_CQR_CLEAR_PENDING 0x83 /* request is clear pending */ |
201 | #define DASD_CQR_CLEARED 0x84 /* request was cleared */ | 201 | #define DASD_CQR_CLEARED 0x84 /* request was cleared */ |
202 | #define DASD_CQR_SUCCESS 0x85 /* request was successfull */ | 202 | #define DASD_CQR_SUCCESS 0x85 /* request was successful */ |
203 | 203 | ||
204 | 204 | ||
205 | /* per dasd_ccw_req flags */ | 205 | /* per dasd_ccw_req flags */ |
diff --git a/drivers/s390/char/Kconfig b/drivers/s390/char/Kconfig index 643033890e34..0769ced52dbd 100644 --- a/drivers/s390/char/Kconfig +++ b/drivers/s390/char/Kconfig | |||
@@ -100,7 +100,7 @@ comment "S/390 tape interface support" | |||
100 | 100 | ||
101 | config S390_TAPE_BLOCK | 101 | config S390_TAPE_BLOCK |
102 | bool "Support for tape block devices" | 102 | bool "Support for tape block devices" |
103 | depends on S390_TAPE | 103 | depends on S390_TAPE && BLOCK |
104 | help | 104 | help |
105 | Select this option if you want to access your channel-attached tape | 105 | Select this option if you want to access your channel-attached tape |
106 | devices using the block device interface. This interface is similar | 106 | devices using the block device interface. This interface is similar |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index 4005c44a404c..71605a179d65 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
@@ -801,7 +801,7 @@ tape_3590_done(struct tape_device *device, struct tape_request *request) | |||
801 | static inline int | 801 | static inline int |
802 | tape_3590_erp_succeded(struct tape_device *device, struct tape_request *request) | 802 | tape_3590_erp_succeded(struct tape_device *device, struct tape_request *request) |
803 | { | 803 | { |
804 | DBF_EVENT(3, "Error Recovery successfull for %s\n", | 804 | DBF_EVENT(3, "Error Recovery successful for %s\n", |
805 | tape_op_verbose[request->op]); | 805 | tape_op_verbose[request->op]); |
806 | return tape_3590_done(device, request); | 806 | return tape_3590_done(device, request); |
807 | } | 807 | } |
diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index aabbeb909cc6..d8a2289fcb69 100644 --- a/drivers/s390/char/vmlogrdr.c +++ b/drivers/s390/char/vmlogrdr.c | |||
@@ -427,7 +427,7 @@ static int vmlogrdr_receive_data(struct vmlogrdr_priv_t *priv) | |||
427 | buffer = priv->buffer + sizeof(int); | 427 | buffer = priv->buffer + sizeof(int); |
428 | } | 428 | } |
429 | /* | 429 | /* |
430 | * If the record is bigger then our buffer, we receive only | 430 | * If the record is bigger than our buffer, we receive only |
431 | * a part of it. We can get the rest later. | 431 | * a part of it. We can get the rest later. |
432 | */ | 432 | */ |
433 | if (iucv_data_count > NET_BUFFER_SIZE) | 433 | if (iucv_data_count > NET_BUFFER_SIZE) |
@@ -437,7 +437,7 @@ static int vmlogrdr_receive_data(struct vmlogrdr_priv_t *priv) | |||
437 | 0, buffer, iucv_data_count, | 437 | 0, buffer, iucv_data_count, |
438 | &priv->residual_length); | 438 | &priv->residual_length); |
439 | spin_unlock_bh(&priv->priv_lock); | 439 | spin_unlock_bh(&priv->priv_lock); |
440 | /* An rc of 5 indicates that the record was bigger then | 440 | /* An rc of 5 indicates that the record was bigger than |
441 | * the buffer, which is OK for us. A 9 indicates that the | 441 | * the buffer, which is OK for us. A 9 indicates that the |
442 | * record was purged befor we could receive it. | 442 | * record was purged befor we could receive it. |
443 | */ | 443 | */ |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 06b71823f399..659f8a791656 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -379,7 +379,7 @@ int cio_commit_config(struct subchannel *sch) | |||
379 | if (ccode < 0) /* -EIO if msch gets a program check. */ | 379 | if (ccode < 0) /* -EIO if msch gets a program check. */ |
380 | return ccode; | 380 | return ccode; |
381 | switch (ccode) { | 381 | switch (ccode) { |
382 | case 0: /* successfull */ | 382 | case 0: /* successful */ |
383 | if (stsch(sch->schid, &schib) || | 383 | if (stsch(sch->schid, &schib) || |
384 | !css_sch_is_valid(&schib)) | 384 | !css_sch_is_valid(&schib)) |
385 | return -ENODEV; | 385 | return -ENODEV; |
diff --git a/drivers/s390/cio/qdio_debug.c b/drivers/s390/cio/qdio_debug.c index f8a3b6967f69..da7afb04e71f 100644 --- a/drivers/s390/cio/qdio_debug.c +++ b/drivers/s390/cio/qdio_debug.c | |||
@@ -169,6 +169,8 @@ static void setup_debugfs_entry(struct qdio_q *q, struct ccw_device *cdev) | |||
169 | q->nr); | 169 | q->nr); |
170 | debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR, | 170 | debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR, |
171 | debugfs_root, q, &debugfs_fops); | 171 | debugfs_root, q, &debugfs_fops); |
172 | if (IS_ERR(debugfs_queues[i])) | ||
173 | debugfs_queues[i] = NULL; | ||
172 | } | 174 | } |
173 | 175 | ||
174 | void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) | 176 | void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 744f928a59ea..10cb0f8726e5 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -114,7 +114,7 @@ static inline int qdio_check_ccq(struct qdio_q *q, unsigned int ccq) | |||
114 | * @count: count of buffers to examine | 114 | * @count: count of buffers to examine |
115 | * @auto_ack: automatically acknowledge buffers | 115 | * @auto_ack: automatically acknowledge buffers |
116 | * | 116 | * |
117 | * Returns the number of successfull extracted equal buffer states. | 117 | * Returns the number of successfully extracted equal buffer states. |
118 | * Stops processing if a state is different from the last buffers state. | 118 | * Stops processing if a state is different from the last buffers state. |
119 | */ | 119 | */ |
120 | static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state, | 120 | static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state, |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 591a2b3ae4cb..c4f1b046c3b1 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -916,6 +916,21 @@ static struct ethtool_ops qeth_l2_osn_ops = { | |||
916 | .get_drvinfo = qeth_core_get_drvinfo, | 916 | .get_drvinfo = qeth_core_get_drvinfo, |
917 | }; | 917 | }; |
918 | 918 | ||
919 | static struct net_device_ops qeth_l2_netdev_ops = { | ||
920 | .ndo_open = qeth_l2_open, | ||
921 | .ndo_stop = qeth_l2_stop, | ||
922 | .ndo_get_stats = qeth_get_stats, | ||
923 | .ndo_start_xmit = qeth_l2_hard_start_xmit, | ||
924 | .ndo_validate_addr = eth_validate_addr, | ||
925 | .ndo_set_multicast_list = qeth_l2_set_multicast_list, | ||
926 | .ndo_do_ioctl = qeth_l2_do_ioctl, | ||
927 | .ndo_set_mac_address = qeth_l2_set_mac_address, | ||
928 | .ndo_change_mtu = qeth_change_mtu, | ||
929 | .ndo_vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid, | ||
930 | .ndo_vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid, | ||
931 | .ndo_tx_timeout = qeth_tx_timeout, | ||
932 | }; | ||
933 | |||
919 | static int qeth_l2_setup_netdev(struct qeth_card *card) | 934 | static int qeth_l2_setup_netdev(struct qeth_card *card) |
920 | { | 935 | { |
921 | switch (card->info.type) { | 936 | switch (card->info.type) { |
@@ -937,19 +952,9 @@ static int qeth_l2_setup_netdev(struct qeth_card *card) | |||
937 | return -ENODEV; | 952 | return -ENODEV; |
938 | 953 | ||
939 | card->dev->ml_priv = card; | 954 | card->dev->ml_priv = card; |
940 | card->dev->tx_timeout = &qeth_tx_timeout; | ||
941 | card->dev->watchdog_timeo = QETH_TX_TIMEOUT; | 955 | card->dev->watchdog_timeo = QETH_TX_TIMEOUT; |
942 | card->dev->open = qeth_l2_open; | ||
943 | card->dev->stop = qeth_l2_stop; | ||
944 | card->dev->hard_start_xmit = qeth_l2_hard_start_xmit; | ||
945 | card->dev->do_ioctl = qeth_l2_do_ioctl; | ||
946 | card->dev->get_stats = qeth_get_stats; | ||
947 | card->dev->change_mtu = qeth_change_mtu; | ||
948 | card->dev->set_multicast_list = qeth_l2_set_multicast_list; | ||
949 | card->dev->vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid; | ||
950 | card->dev->vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid; | ||
951 | card->dev->set_mac_address = qeth_l2_set_mac_address; | ||
952 | card->dev->mtu = card->info.initial_mtu; | 956 | card->dev->mtu = card->info.initial_mtu; |
957 | card->dev->netdev_ops = &qeth_l2_netdev_ops; | ||
953 | if (card->info.type != QETH_CARD_TYPE_OSN) | 958 | if (card->info.type != QETH_CARD_TYPE_OSN) |
954 | SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops); | 959 | SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops); |
955 | else | 960 | else |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 4693ee4e7b98..68d623ab7e6e 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -1829,28 +1829,6 @@ static void qeth_l3_vlan_rx_register(struct net_device *dev, | |||
1829 | 1829 | ||
1830 | static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | 1830 | static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) |
1831 | { | 1831 | { |
1832 | struct net_device *vlandev; | ||
1833 | struct qeth_card *card = dev->ml_priv; | ||
1834 | struct in_device *in_dev; | ||
1835 | |||
1836 | if (card->info.type == QETH_CARD_TYPE_IQD) | ||
1837 | return; | ||
1838 | |||
1839 | vlandev = vlan_group_get_device(card->vlangrp, vid); | ||
1840 | vlandev->neigh_setup = qeth_l3_neigh_setup; | ||
1841 | |||
1842 | in_dev = in_dev_get(vlandev); | ||
1843 | #ifdef CONFIG_SYSCTL | ||
1844 | neigh_sysctl_unregister(in_dev->arp_parms); | ||
1845 | #endif | ||
1846 | neigh_parms_release(&arp_tbl, in_dev->arp_parms); | ||
1847 | |||
1848 | in_dev->arp_parms = neigh_parms_alloc(vlandev, &arp_tbl); | ||
1849 | #ifdef CONFIG_SYSCTL | ||
1850 | neigh_sysctl_register(vlandev, in_dev->arp_parms, NET_IPV4, | ||
1851 | NET_IPV4_NEIGH, "ipv4", NULL, NULL); | ||
1852 | #endif | ||
1853 | in_dev_put(in_dev); | ||
1854 | return; | 1832 | return; |
1855 | } | 1833 | } |
1856 | 1834 | ||
@@ -2916,6 +2894,21 @@ qeth_l3_neigh_setup(struct net_device *dev, struct neigh_parms *np) | |||
2916 | return 0; | 2894 | return 0; |
2917 | } | 2895 | } |
2918 | 2896 | ||
2897 | static struct net_device_ops qeth_l3_netdev_ops = { | ||
2898 | .ndo_open = qeth_l3_open, | ||
2899 | .ndo_stop = qeth_l3_stop, | ||
2900 | .ndo_get_stats = qeth_get_stats, | ||
2901 | .ndo_start_xmit = qeth_l3_hard_start_xmit, | ||
2902 | .ndo_validate_addr = eth_validate_addr, | ||
2903 | .ndo_set_multicast_list = qeth_l3_set_multicast_list, | ||
2904 | .ndo_do_ioctl = qeth_l3_do_ioctl, | ||
2905 | .ndo_change_mtu = qeth_change_mtu, | ||
2906 | .ndo_vlan_rx_register = qeth_l3_vlan_rx_register, | ||
2907 | .ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid, | ||
2908 | .ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid, | ||
2909 | .ndo_tx_timeout = qeth_tx_timeout, | ||
2910 | }; | ||
2911 | |||
2919 | static int qeth_l3_setup_netdev(struct qeth_card *card) | 2912 | static int qeth_l3_setup_netdev(struct qeth_card *card) |
2920 | { | 2913 | { |
2921 | if (card->info.type == QETH_CARD_TYPE_OSAE) { | 2914 | if (card->info.type == QETH_CARD_TYPE_OSAE) { |
@@ -2930,7 +2923,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
2930 | card->dev = alloc_etherdev(0); | 2923 | card->dev = alloc_etherdev(0); |
2931 | if (!card->dev) | 2924 | if (!card->dev) |
2932 | return -ENODEV; | 2925 | return -ENODEV; |
2933 | card->dev->neigh_setup = qeth_l3_neigh_setup; | 2926 | qeth_l3_netdev_ops.ndo_neigh_setup = |
2927 | qeth_l3_neigh_setup; | ||
2934 | 2928 | ||
2935 | /*IPv6 address autoconfiguration stuff*/ | 2929 | /*IPv6 address autoconfiguration stuff*/ |
2936 | qeth_l3_get_unique_id(card); | 2930 | qeth_l3_get_unique_id(card); |
@@ -2947,21 +2941,10 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
2947 | } else | 2941 | } else |
2948 | return -ENODEV; | 2942 | return -ENODEV; |
2949 | 2943 | ||
2950 | card->dev->hard_start_xmit = qeth_l3_hard_start_xmit; | ||
2951 | card->dev->ml_priv = card; | 2944 | card->dev->ml_priv = card; |
2952 | card->dev->tx_timeout = &qeth_tx_timeout; | ||
2953 | card->dev->watchdog_timeo = QETH_TX_TIMEOUT; | 2945 | card->dev->watchdog_timeo = QETH_TX_TIMEOUT; |
2954 | card->dev->open = qeth_l3_open; | ||
2955 | card->dev->stop = qeth_l3_stop; | ||
2956 | card->dev->do_ioctl = qeth_l3_do_ioctl; | ||
2957 | card->dev->get_stats = qeth_get_stats; | ||
2958 | card->dev->change_mtu = qeth_change_mtu; | ||
2959 | card->dev->set_multicast_list = qeth_l3_set_multicast_list; | ||
2960 | card->dev->vlan_rx_register = qeth_l3_vlan_rx_register; | ||
2961 | card->dev->vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid; | ||
2962 | card->dev->vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid; | ||
2963 | card->dev->mtu = card->info.initial_mtu; | 2946 | card->dev->mtu = card->info.initial_mtu; |
2964 | card->dev->set_mac_address = NULL; | 2947 | card->dev->netdev_ops = &qeth_l3_netdev_ops; |
2965 | SET_ETHTOOL_OPS(card->dev, &qeth_l3_ethtool_ops); | 2948 | SET_ETHTOOL_OPS(card->dev, &qeth_l3_ethtool_ops); |
2966 | card->dev->features |= NETIF_F_HW_VLAN_TX | | 2949 | card->dev->features |= NETIF_F_HW_VLAN_TX | |
2967 | NETIF_F_HW_VLAN_RX | | 2950 | NETIF_F_HW_VLAN_RX | |