aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_l2_main.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/s390/net/qeth_l2_main.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
-rw-r--r--drivers/s390/net/qeth_l2_main.c78
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
305static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 304static 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
334static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) 330static 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
365static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) 360static 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
687static void qeth_l2_set_multicast_list(struct net_device *dev) 681static 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)
1170static void qeth_l2_shutdown(struct ccwgroup_device *gdev) 1169static 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
1226struct qeth_discipline qeth_l2_discipline = { 1224struct 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};
1240EXPORT_SYMBOL_GPL(qeth_l2_discipline); 1234EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver);
1241 1235
1242static int qeth_osn_send_control_data(struct qeth_card *card, int len, 1236static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1243 struct qeth_cmd_buffer *iob) 1237 struct qeth_cmd_buffer *iob)