aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-01-10 22:45:50 -0500
committerIngo Molnar <mingo@elte.hu>2009-01-10 22:45:50 -0500
commite8b722f487589a1f60ca27adc695494f188d404e (patch)
treebe3897dceb9b7c0949a8917ab11eea2752375e3b /drivers/s390
parent01d07820a0df6b6134c1bb75b1e84c9d0cdab3be (diff)
parentc59765042f53a79a7a65585042ff463b69cb248c (diff)
Merge commit 'v2.6.29-rc1' into irq/urgent
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd.c21
-rw-r--r--drivers/s390/block/dasd_3990_erp.c2
-rw-r--r--drivers/s390/block/dasd_devmap.c48
-rw-r--r--drivers/s390/block/dasd_diag.c3
-rw-r--r--drivers/s390/block/dasd_eckd.c3
-rw-r--r--drivers/s390/block/dasd_eer.c4
-rw-r--r--drivers/s390/block/dasd_fba.c3
-rw-r--r--drivers/s390/block/dasd_int.h2
-rw-r--r--drivers/s390/char/Kconfig2
-rw-r--r--drivers/s390/char/tape_3590.c2
-rw-r--r--drivers/s390/char/vmlogrdr.c4
-rw-r--r--drivers/s390/cio/cio.c2
-rw-r--r--drivers/s390/cio/qdio_debug.c2
-rw-r--r--drivers/s390/cio/qdio_main.c2
-rw-r--r--drivers/s390/net/qeth_l2_main.c27
-rw-r--r--drivers/s390/net/qeth_l3_main.c53
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
336dasd_state_ready_to_online(struct dasd_device * device) 336dasd_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)
354static int dasd_state_online_to_ready(struct dasd_device *device) 363static 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 */
674static 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
688static 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
714static 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 */
672static ssize_t 719static 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
101config S390_TAPE_BLOCK 101config 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)
801static inline int 801static inline int
802tape_3590_erp_succeded(struct tape_device *device, struct tape_request *request) 802tape_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
174void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) 176void 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 */
120static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state, 120static 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
919static 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
919static int qeth_l2_setup_netdev(struct qeth_card *card) 934static 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
1830static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 1830static 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
2897static 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
2919static int qeth_l3_setup_netdev(struct qeth_card *card) 2912static 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 |