diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/s390/net/qeth_l2_main.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 78 |
1 files changed, 36 insertions, 42 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 73195553f84..b70b47fbd6c 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -1,4 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/net/qeth_l2_main.c | ||
3 | * | ||
2 | * Copyright IBM Corp. 2007, 2009 | 4 | * Copyright IBM Corp. 2007, 2009 |
3 | * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, | 5 | * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, |
4 | * Frank Pavlic <fpavlic@de.ibm.com>, | 6 | * Frank Pavlic <fpavlic@de.ibm.com>, |
@@ -73,9 +75,6 @@ static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
73 | mii_data->val_out = qeth_mdio_read(dev, | 75 | mii_data->val_out = qeth_mdio_read(dev, |
74 | mii_data->phy_id, mii_data->reg_num); | 76 | mii_data->phy_id, mii_data->reg_num); |
75 | break; | 77 | break; |
76 | case SIOC_QETH_QUERY_OAT: | ||
77 | rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); | ||
78 | break; | ||
79 | default: | 78 | default: |
80 | rc = -EOPNOTSUPP; | 79 | rc = -EOPNOTSUPP; |
81 | } | 80 | } |
@@ -302,21 +301,21 @@ static void qeth_l2_process_vlans(struct qeth_card *card) | |||
302 | spin_unlock_bh(&card->vlanlock); | 301 | spin_unlock_bh(&card->vlanlock); |
303 | } | 302 | } |
304 | 303 | ||
305 | static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | 304 | static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) |
306 | { | 305 | { |
307 | struct qeth_card *card = dev->ml_priv; | 306 | struct qeth_card *card = dev->ml_priv; |
308 | struct qeth_vlan_vid *id; | 307 | struct qeth_vlan_vid *id; |
309 | 308 | ||
310 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); | 309 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); |
311 | if (!vid) | 310 | if (!vid) |
312 | return 0; | 311 | return; |
313 | if (card->info.type == QETH_CARD_TYPE_OSM) { | 312 | if (card->info.type == QETH_CARD_TYPE_OSM) { |
314 | QETH_CARD_TEXT(card, 3, "aidOSM"); | 313 | QETH_CARD_TEXT(card, 3, "aidOSM"); |
315 | return 0; | 314 | return; |
316 | } | 315 | } |
317 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | 316 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { |
318 | QETH_CARD_TEXT(card, 3, "aidREC"); | 317 | QETH_CARD_TEXT(card, 3, "aidREC"); |
319 | return 0; | 318 | return; |
320 | } | 319 | } |
321 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); | 320 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); |
322 | if (id) { | 321 | if (id) { |
@@ -325,13 +324,10 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | |||
325 | spin_lock_bh(&card->vlanlock); | 324 | spin_lock_bh(&card->vlanlock); |
326 | list_add_tail(&id->list, &card->vid_list); | 325 | list_add_tail(&id->list, &card->vid_list); |
327 | spin_unlock_bh(&card->vlanlock); | 326 | spin_unlock_bh(&card->vlanlock); |
328 | } else { | ||
329 | return -ENOMEM; | ||
330 | } | 327 | } |
331 | return 0; | ||
332 | } | 328 | } |
333 | 329 | ||
334 | static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | 330 | static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) |
335 | { | 331 | { |
336 | struct qeth_vlan_vid *id, *tmpid = NULL; | 332 | struct qeth_vlan_vid *id, *tmpid = NULL; |
337 | struct qeth_card *card = dev->ml_priv; | 333 | struct qeth_card *card = dev->ml_priv; |
@@ -339,11 +335,11 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
339 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); | 335 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); |
340 | if (card->info.type == QETH_CARD_TYPE_OSM) { | 336 | if (card->info.type == QETH_CARD_TYPE_OSM) { |
341 | QETH_CARD_TEXT(card, 3, "kidOSM"); | 337 | QETH_CARD_TEXT(card, 3, "kidOSM"); |
342 | return 0; | 338 | return; |
343 | } | 339 | } |
344 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | 340 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { |
345 | QETH_CARD_TEXT(card, 3, "kidREC"); | 341 | QETH_CARD_TEXT(card, 3, "kidREC"); |
346 | return 0; | 342 | return; |
347 | } | 343 | } |
348 | spin_lock_bh(&card->vlanlock); | 344 | spin_lock_bh(&card->vlanlock); |
349 | list_for_each_entry(id, &card->vid_list, list) { | 345 | list_for_each_entry(id, &card->vid_list, list) { |
@@ -359,7 +355,6 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
359 | kfree(tmpid); | 355 | kfree(tmpid); |
360 | } | 356 | } |
361 | qeth_l2_set_multicast_list(card->dev); | 357 | qeth_l2_set_multicast_list(card->dev); |
362 | return 0; | ||
363 | } | 358 | } |
364 | 359 | ||
365 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | 360 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) |
@@ -411,10 +406,10 @@ static int qeth_l2_process_inbound_buffer(struct qeth_card *card, | |||
411 | unsigned int len; | 406 | unsigned int len; |
412 | 407 | ||
413 | *done = 0; | 408 | *done = 0; |
414 | WARN_ON_ONCE(!budget); | 409 | BUG_ON(!budget); |
415 | while (budget) { | 410 | while (budget) { |
416 | skb = qeth_core_get_next_skb(card, | 411 | skb = qeth_core_get_next_skb(card, |
417 | &card->qdio.in_q->bufs[card->rx.b_index], | 412 | card->qdio.in_q->bufs[card->rx.b_index].buffer, |
418 | &card->rx.b_element, &card->rx.e_offset, &hdr); | 413 | &card->rx.b_element, &card->rx.e_offset, &hdr); |
419 | if (!skb) { | 414 | if (!skb) { |
420 | *done = 1; | 415 | *done = 1; |
@@ -574,6 +569,7 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card, | |||
574 | default: | 569 | default: |
575 | break; | 570 | break; |
576 | } | 571 | } |
572 | cmd->hdr.return_code = -EIO; | ||
577 | } else { | 573 | } else { |
578 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | 574 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; |
579 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, | 575 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, |
@@ -602,6 +598,7 @@ static int qeth_l2_send_delmac_cb(struct qeth_card *card, | |||
602 | cmd = (struct qeth_ipa_cmd *) data; | 598 | cmd = (struct qeth_ipa_cmd *) data; |
603 | if (cmd->hdr.return_code) { | 599 | if (cmd->hdr.return_code) { |
604 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); | 600 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); |
601 | cmd->hdr.return_code = -EIO; | ||
605 | return 0; | 602 | return 0; |
606 | } | 603 | } |
607 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 604 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; |
@@ -626,13 +623,10 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
626 | QETH_DBF_TEXT(SETUP, 2, "doL2init"); | 623 | QETH_DBF_TEXT(SETUP, 2, "doL2init"); |
627 | QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card)); | 624 | QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card)); |
628 | 625 | ||
629 | if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { | 626 | rc = qeth_query_setadapterparms(card); |
630 | rc = qeth_query_setadapterparms(card); | 627 | if (rc) { |
631 | if (rc) { | 628 | QETH_DBF_MESSAGE(2, "could not query adapter parameters on " |
632 | QETH_DBF_MESSAGE(2, "could not query adapter " | 629 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
633 | "parameters on device %s: x%x\n", | ||
634 | CARD_BUS_ID(card), rc); | ||
635 | } | ||
636 | } | 630 | } |
637 | 631 | ||
638 | if (card->info.type == QETH_CARD_TYPE_IQD || | 632 | if (card->info.type == QETH_CARD_TYPE_IQD || |
@@ -648,7 +642,7 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
648 | } | 642 | } |
649 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); | 643 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); |
650 | } else { | 644 | } else { |
651 | eth_random_addr(card->dev->dev_addr); | 645 | random_ether_addr(card->dev->dev_addr); |
652 | memcpy(card->dev->dev_addr, vendor_pre, 3); | 646 | memcpy(card->dev->dev_addr, vendor_pre, 3); |
653 | } | 647 | } |
654 | return 0; | 648 | return 0; |
@@ -679,9 +673,9 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
679 | return -ERESTARTSYS; | 673 | return -ERESTARTSYS; |
680 | } | 674 | } |
681 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); | 675 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); |
682 | if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) | 676 | if (!rc) |
683 | rc = qeth_l2_send_setmac(card, addr->sa_data); | 677 | rc = qeth_l2_send_setmac(card, addr->sa_data); |
684 | return rc ? -EINVAL : 0; | 678 | return rc; |
685 | } | 679 | } |
686 | 680 | ||
687 | static void qeth_l2_set_multicast_list(struct net_device *dev) | 681 | static void qeth_l2_set_multicast_list(struct net_device *dev) |
@@ -883,6 +877,12 @@ static int qeth_l2_probe_device(struct ccwgroup_device *gdev) | |||
883 | INIT_LIST_HEAD(&card->mc_list); | 877 | INIT_LIST_HEAD(&card->mc_list); |
884 | card->options.layer2 = 1; | 878 | card->options.layer2 = 1; |
885 | card->info.hwtrap = 0; | 879 | card->info.hwtrap = 0; |
880 | card->discipline.start_poll = qeth_qdio_start_poll; | ||
881 | card->discipline.input_handler = (qdio_handler_t *) | ||
882 | qeth_qdio_input_handler; | ||
883 | card->discipline.output_handler = (qdio_handler_t *) | ||
884 | qeth_qdio_output_handler; | ||
885 | card->discipline.recover = qeth_l2_recover; | ||
886 | return 0; | 886 | return 0; |
887 | } | 887 | } |
888 | 888 | ||
@@ -925,7 +925,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = { | |||
925 | .ndo_get_stats = qeth_get_stats, | 925 | .ndo_get_stats = qeth_get_stats, |
926 | .ndo_start_xmit = qeth_l2_hard_start_xmit, | 926 | .ndo_start_xmit = qeth_l2_hard_start_xmit, |
927 | .ndo_validate_addr = eth_validate_addr, | 927 | .ndo_validate_addr = eth_validate_addr, |
928 | .ndo_set_rx_mode = qeth_l2_set_multicast_list, | 928 | .ndo_set_multicast_list = qeth_l2_set_multicast_list, |
929 | .ndo_do_ioctl = qeth_l2_do_ioctl, | 929 | .ndo_do_ioctl = qeth_l2_do_ioctl, |
930 | .ndo_set_mac_address = qeth_l2_set_mac_address, | 930 | .ndo_set_mac_address = qeth_l2_set_mac_address, |
931 | .ndo_change_mtu = qeth_change_mtu, | 931 | .ndo_change_mtu = qeth_change_mtu, |
@@ -973,6 +973,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
973 | int rc = 0; | 973 | int rc = 0; |
974 | enum qeth_card_states recover_flag; | 974 | enum qeth_card_states recover_flag; |
975 | 975 | ||
976 | BUG_ON(!card); | ||
976 | mutex_lock(&card->discipline_mutex); | 977 | mutex_lock(&card->discipline_mutex); |
977 | mutex_lock(&card->conf_mutex); | 978 | mutex_lock(&card->conf_mutex); |
978 | QETH_DBF_TEXT(SETUP, 2, "setonlin"); | 979 | QETH_DBF_TEXT(SETUP, 2, "setonlin"); |
@@ -985,7 +986,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
985 | rc = -ENODEV; | 986 | rc = -ENODEV; |
986 | goto out_remove; | 987 | goto out_remove; |
987 | } | 988 | } |
988 | qeth_trace_features(card); | ||
989 | 989 | ||
990 | if (!card->dev && qeth_l2_setup_netdev(card)) { | 990 | if (!card->dev && qeth_l2_setup_netdev(card)) { |
991 | rc = -ENODEV; | 991 | rc = -ENODEV; |
@@ -1144,12 +1144,11 @@ static int qeth_l2_recover(void *ptr) | |||
1144 | dev_info(&card->gdev->dev, | 1144 | dev_info(&card->gdev->dev, |
1145 | "Device successfully recovered!\n"); | 1145 | "Device successfully recovered!\n"); |
1146 | else { | 1146 | else { |
1147 | if (rtnl_trylock()) { | 1147 | rtnl_lock(); |
1148 | dev_close(card->dev); | 1148 | dev_close(card->dev); |
1149 | rtnl_unlock(); | 1149 | rtnl_unlock(); |
1150 | dev_warn(&card->gdev->dev, "The qeth device driver " | 1150 | dev_warn(&card->gdev->dev, "The qeth device driver " |
1151 | "failed to recover an error on the device\n"); | 1151 | "failed to recover an error on the device\n"); |
1152 | } | ||
1153 | } | 1152 | } |
1154 | qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); | 1153 | qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); |
1155 | qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); | 1154 | qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); |
@@ -1170,7 +1169,6 @@ static void __exit qeth_l2_exit(void) | |||
1170 | static void qeth_l2_shutdown(struct ccwgroup_device *gdev) | 1169 | static void qeth_l2_shutdown(struct ccwgroup_device *gdev) |
1171 | { | 1170 | { |
1172 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); | 1171 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
1173 | qeth_set_allowed_threads(card, 0, 1); | ||
1174 | if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) | 1172 | if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) |
1175 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); | 1173 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); |
1176 | qeth_qdio_clear_card(card, 0); | 1174 | qeth_qdio_clear_card(card, 0); |
@@ -1223,12 +1221,8 @@ out: | |||
1223 | return rc; | 1221 | return rc; |
1224 | } | 1222 | } |
1225 | 1223 | ||
1226 | struct qeth_discipline qeth_l2_discipline = { | 1224 | struct ccwgroup_driver qeth_l2_ccwgroup_driver = { |
1227 | .start_poll = qeth_qdio_start_poll, | 1225 | .probe = qeth_l2_probe_device, |
1228 | .input_handler = (qdio_handler_t *) qeth_qdio_input_handler, | ||
1229 | .output_handler = (qdio_handler_t *) qeth_qdio_output_handler, | ||
1230 | .recover = qeth_l2_recover, | ||
1231 | .setup = qeth_l2_probe_device, | ||
1232 | .remove = qeth_l2_remove_device, | 1226 | .remove = qeth_l2_remove_device, |
1233 | .set_online = qeth_l2_set_online, | 1227 | .set_online = qeth_l2_set_online, |
1234 | .set_offline = qeth_l2_set_offline, | 1228 | .set_offline = qeth_l2_set_offline, |
@@ -1237,7 +1231,7 @@ struct qeth_discipline qeth_l2_discipline = { | |||
1237 | .thaw = qeth_l2_pm_resume, | 1231 | .thaw = qeth_l2_pm_resume, |
1238 | .restore = qeth_l2_pm_resume, | 1232 | .restore = qeth_l2_pm_resume, |
1239 | }; | 1233 | }; |
1240 | EXPORT_SYMBOL_GPL(qeth_l2_discipline); | 1234 | EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver); |
1241 | 1235 | ||
1242 | static int qeth_osn_send_control_data(struct qeth_card *card, int len, | 1236 | static int qeth_osn_send_control_data(struct qeth_card *card, int len, |
1243 | struct qeth_cmd_buffer *iob) | 1237 | struct qeth_cmd_buffer *iob) |