diff options
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
| -rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 220 |
1 files changed, 108 insertions, 112 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index d02cd1a67943..ce87ae72edbd 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
| @@ -27,10 +27,7 @@ static int qeth_l2_set_offline(struct ccwgroup_device *); | |||
| 27 | static int qeth_l2_stop(struct net_device *); | 27 | static int qeth_l2_stop(struct net_device *); |
| 28 | static int qeth_l2_send_delmac(struct qeth_card *, __u8 *); | 28 | static int qeth_l2_send_delmac(struct qeth_card *, __u8 *); |
| 29 | static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *, | 29 | static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *, |
| 30 | enum qeth_ipa_cmds, | 30 | enum qeth_ipa_cmds); |
| 31 | int (*reply_cb) (struct qeth_card *, | ||
| 32 | struct qeth_reply*, | ||
| 33 | unsigned long)); | ||
| 34 | static void qeth_l2_set_multicast_list(struct net_device *); | 31 | static void qeth_l2_set_multicast_list(struct net_device *); |
| 35 | static int qeth_l2_recover(void *); | 32 | static int qeth_l2_recover(void *); |
| 36 | static void qeth_bridgeport_query_support(struct qeth_card *card); | 33 | static void qeth_bridgeport_query_support(struct qeth_card *card); |
| @@ -130,56 +127,71 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no) | |||
| 130 | return ndev; | 127 | return ndev; |
| 131 | } | 128 | } |
| 132 | 129 | ||
| 133 | static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card, | 130 | static int qeth_setdel_makerc(struct qeth_card *card, int retcode) |
| 134 | struct qeth_reply *reply, | ||
| 135 | unsigned long data) | ||
| 136 | { | 131 | { |
| 137 | struct qeth_ipa_cmd *cmd; | 132 | int rc; |
| 138 | __u8 *mac; | ||
| 139 | 133 | ||
| 140 | QETH_CARD_TEXT(card, 2, "L2Sgmacb"); | 134 | if (retcode) |
| 141 | cmd = (struct qeth_ipa_cmd *) data; | 135 | QETH_CARD_TEXT_(card, 2, "err%04x", retcode); |
| 142 | mac = &cmd->data.setdelmac.mac[0]; | 136 | switch (retcode) { |
| 143 | /* MAC already registered, needed in couple/uncouple case */ | 137 | case IPA_RC_SUCCESS: |
| 144 | if (cmd->hdr.return_code == IPA_RC_L2_DUP_MAC) { | 138 | rc = 0; |
| 145 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n", | 139 | break; |
| 146 | mac, QETH_CARD_IFNAME(card)); | 140 | case IPA_RC_L2_UNSUPPORTED_CMD: |
| 147 | cmd->hdr.return_code = 0; | 141 | rc = -ENOSYS; |
| 142 | break; | ||
| 143 | case IPA_RC_L2_ADDR_TABLE_FULL: | ||
| 144 | rc = -ENOSPC; | ||
| 145 | break; | ||
| 146 | case IPA_RC_L2_DUP_MAC: | ||
| 147 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
| 148 | rc = -EEXIST; | ||
| 149 | break; | ||
| 150 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | ||
| 151 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
| 152 | rc = -EPERM; | ||
| 153 | break; | ||
| 154 | case IPA_RC_L2_MAC_NOT_FOUND: | ||
| 155 | rc = -ENOENT; | ||
| 156 | break; | ||
| 157 | case -ENOMEM: | ||
| 158 | rc = -ENOMEM; | ||
| 159 | break; | ||
| 160 | default: | ||
| 161 | rc = -EIO; | ||
| 162 | break; | ||
| 148 | } | 163 | } |
| 149 | if (cmd->hdr.return_code) | 164 | return rc; |
| 150 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n", | ||
| 151 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | ||
| 152 | return 0; | ||
| 153 | } | 165 | } |
| 154 | 166 | ||
| 155 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) | 167 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) |
| 156 | { | 168 | { |
| 157 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); | 169 | int rc; |
| 158 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC, | ||
| 159 | qeth_l2_send_setgroupmac_cb); | ||
| 160 | } | ||
| 161 | |||
| 162 | static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card, | ||
| 163 | struct qeth_reply *reply, | ||
| 164 | unsigned long data) | ||
| 165 | { | ||
| 166 | struct qeth_ipa_cmd *cmd; | ||
| 167 | __u8 *mac; | ||
| 168 | 170 | ||
| 169 | QETH_CARD_TEXT(card, 2, "L2Dgmacb"); | 171 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); |
| 170 | cmd = (struct qeth_ipa_cmd *) data; | 172 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 171 | mac = &cmd->data.setdelmac.mac[0]; | 173 | IPA_CMD_SETGMAC)); |
| 172 | if (cmd->hdr.return_code) | 174 | if (rc == -EEXIST) |
| 173 | QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n", | 175 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n", |
| 174 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 176 | mac, QETH_CARD_IFNAME(card)); |
| 175 | return 0; | 177 | else if (rc) |
| 178 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n", | ||
| 179 | mac, QETH_CARD_IFNAME(card), rc); | ||
| 180 | return rc; | ||
| 176 | } | 181 | } |
| 177 | 182 | ||
| 178 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) | 183 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) |
| 179 | { | 184 | { |
| 185 | int rc; | ||
| 186 | |||
| 180 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); | 187 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); |
| 181 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC, | 188 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 182 | qeth_l2_send_delgroupmac_cb); | 189 | IPA_CMD_DELGMAC)); |
| 190 | if (rc) | ||
| 191 | QETH_DBF_MESSAGE(2, | ||
| 192 | "Could not delete group MAC %pM on %s: %d\n", | ||
| 193 | mac, QETH_CARD_IFNAME(card), rc); | ||
| 194 | return rc; | ||
| 183 | } | 195 | } |
| 184 | 196 | ||
| 185 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | 197 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) |
| @@ -197,10 +209,11 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | |||
| 197 | mc->is_vmac = vmac; | 209 | mc->is_vmac = vmac; |
| 198 | 210 | ||
| 199 | if (vmac) { | 211 | if (vmac) { |
| 200 | rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | 212 | rc = qeth_setdel_makerc(card, |
| 201 | NULL); | 213 | qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC)); |
| 202 | } else { | 214 | } else { |
| 203 | rc = qeth_l2_send_setgroupmac(card, mac); | 215 | rc = qeth_setdel_makerc(card, |
| 216 | qeth_l2_send_setgroupmac(card, mac)); | ||
| 204 | } | 217 | } |
| 205 | 218 | ||
| 206 | if (!rc) | 219 | if (!rc) |
| @@ -218,7 +231,7 @@ static void qeth_l2_del_all_mc(struct qeth_card *card, int del) | |||
| 218 | if (del) { | 231 | if (del) { |
| 219 | if (mc->is_vmac) | 232 | if (mc->is_vmac) |
| 220 | qeth_l2_send_setdelmac(card, mc->mc_addr, | 233 | qeth_l2_send_setdelmac(card, mc->mc_addr, |
| 221 | IPA_CMD_DELVMAC, NULL); | 234 | IPA_CMD_DELVMAC); |
| 222 | else | 235 | else |
| 223 | qeth_l2_send_delgroupmac(card, mc->mc_addr); | 236 | qeth_l2_send_delgroupmac(card, mc->mc_addr); |
| 224 | } | 237 | } |
| @@ -291,6 +304,8 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, | |||
| 291 | 304 | ||
| 292 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); | 305 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); |
| 293 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 306 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
| 307 | if (!iob) | ||
| 308 | return -ENOMEM; | ||
| 294 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 309 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 295 | cmd->data.setdelvlan.vlan_id = i; | 310 | cmd->data.setdelvlan.vlan_id = i; |
| 296 | return qeth_send_ipa_cmd(card, iob, | 311 | return qeth_send_ipa_cmd(card, iob, |
| @@ -313,6 +328,7 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
| 313 | { | 328 | { |
| 314 | struct qeth_card *card = dev->ml_priv; | 329 | struct qeth_card *card = dev->ml_priv; |
| 315 | struct qeth_vlan_vid *id; | 330 | struct qeth_vlan_vid *id; |
| 331 | int rc; | ||
| 316 | 332 | ||
| 317 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); | 333 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); |
| 318 | if (!vid) | 334 | if (!vid) |
| @@ -328,7 +344,11 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
| 328 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); | 344 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); |
| 329 | if (id) { | 345 | if (id) { |
| 330 | id->vid = vid; | 346 | id->vid = vid; |
| 331 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); | 347 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); |
| 348 | if (rc) { | ||
| 349 | kfree(id); | ||
| 350 | return rc; | ||
| 351 | } | ||
| 332 | spin_lock_bh(&card->vlanlock); | 352 | spin_lock_bh(&card->vlanlock); |
| 333 | list_add_tail(&id->list, &card->vid_list); | 353 | list_add_tail(&id->list, &card->vid_list); |
| 334 | spin_unlock_bh(&card->vlanlock); | 354 | spin_unlock_bh(&card->vlanlock); |
| @@ -343,6 +363,7 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
| 343 | { | 363 | { |
| 344 | struct qeth_vlan_vid *id, *tmpid = NULL; | 364 | struct qeth_vlan_vid *id, *tmpid = NULL; |
| 345 | struct qeth_card *card = dev->ml_priv; | 365 | struct qeth_card *card = dev->ml_priv; |
| 366 | int rc = 0; | ||
| 346 | 367 | ||
| 347 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); | 368 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); |
| 348 | if (card->info.type == QETH_CARD_TYPE_OSM) { | 369 | if (card->info.type == QETH_CARD_TYPE_OSM) { |
| @@ -363,11 +384,11 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
| 363 | } | 384 | } |
| 364 | spin_unlock_bh(&card->vlanlock); | 385 | spin_unlock_bh(&card->vlanlock); |
| 365 | if (tmpid) { | 386 | if (tmpid) { |
| 366 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); | 387 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); |
| 367 | kfree(tmpid); | 388 | kfree(tmpid); |
| 368 | } | 389 | } |
| 369 | qeth_l2_set_multicast_list(card->dev); | 390 | qeth_l2_set_multicast_list(card->dev); |
| 370 | return 0; | 391 | return rc; |
| 371 | } | 392 | } |
| 372 | 393 | ||
| 373 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | 394 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) |
| @@ -539,91 +560,62 @@ out: | |||
| 539 | } | 560 | } |
| 540 | 561 | ||
| 541 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, | 562 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, |
| 542 | enum qeth_ipa_cmds ipacmd, | 563 | enum qeth_ipa_cmds ipacmd) |
| 543 | int (*reply_cb) (struct qeth_card *, | ||
| 544 | struct qeth_reply*, | ||
| 545 | unsigned long)) | ||
| 546 | { | 564 | { |
| 547 | struct qeth_ipa_cmd *cmd; | 565 | struct qeth_ipa_cmd *cmd; |
| 548 | struct qeth_cmd_buffer *iob; | 566 | struct qeth_cmd_buffer *iob; |
| 549 | 567 | ||
| 550 | QETH_CARD_TEXT(card, 2, "L2sdmac"); | 568 | QETH_CARD_TEXT(card, 2, "L2sdmac"); |
| 551 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 569 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
| 570 | if (!iob) | ||
| 571 | return -ENOMEM; | ||
| 552 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 572 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 553 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; | 573 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; |
| 554 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); | 574 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); |
| 555 | return qeth_send_ipa_cmd(card, iob, reply_cb, NULL); | 575 | return qeth_send_ipa_cmd(card, iob, NULL, NULL); |
| 556 | } | 576 | } |
| 557 | 577 | ||
| 558 | static int qeth_l2_send_setmac_cb(struct qeth_card *card, | 578 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) |
| 559 | struct qeth_reply *reply, | ||
| 560 | unsigned long data) | ||
| 561 | { | 579 | { |
| 562 | struct qeth_ipa_cmd *cmd; | 580 | int rc; |
| 563 | 581 | ||
| 564 | QETH_CARD_TEXT(card, 2, "L2Smaccb"); | 582 | QETH_CARD_TEXT(card, 2, "L2Setmac"); |
| 565 | cmd = (struct qeth_ipa_cmd *) data; | 583 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 566 | if (cmd->hdr.return_code) { | 584 | IPA_CMD_SETVMAC)); |
| 567 | QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code); | 585 | if (rc == 0) { |
| 586 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
| 587 | memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN); | ||
| 588 | dev_info(&card->gdev->dev, | ||
| 589 | "MAC address %pM successfully registered on device %s\n", | ||
| 590 | card->dev->dev_addr, card->dev->name); | ||
| 591 | } else { | ||
| 568 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 592 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; |
| 569 | switch (cmd->hdr.return_code) { | 593 | switch (rc) { |
| 570 | case IPA_RC_L2_DUP_MAC: | 594 | case -EEXIST: |
| 571 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
| 572 | dev_warn(&card->gdev->dev, | 595 | dev_warn(&card->gdev->dev, |
| 573 | "MAC address %pM already exists\n", | 596 | "MAC address %pM already exists\n", mac); |
| 574 | cmd->data.setdelmac.mac); | ||
| 575 | break; | 597 | break; |
| 576 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | 598 | case -EPERM: |
| 577 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
| 578 | dev_warn(&card->gdev->dev, | 599 | dev_warn(&card->gdev->dev, |
| 579 | "MAC address %pM is not authorized\n", | 600 | "MAC address %pM is not authorized\n", mac); |
| 580 | cmd->data.setdelmac.mac); | ||
| 581 | break; | ||
| 582 | default: | ||
| 583 | break; | 601 | break; |
| 584 | } | 602 | } |
| 585 | } else { | ||
| 586 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
| 587 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, | ||
| 588 | OSA_ADDR_LEN); | ||
| 589 | dev_info(&card->gdev->dev, | ||
| 590 | "MAC address %pM successfully registered on device %s\n", | ||
| 591 | card->dev->dev_addr, card->dev->name); | ||
| 592 | } | ||
| 593 | return 0; | ||
| 594 | } | ||
| 595 | |||
| 596 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) | ||
| 597 | { | ||
| 598 | QETH_CARD_TEXT(card, 2, "L2Setmac"); | ||
| 599 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | ||
| 600 | qeth_l2_send_setmac_cb); | ||
| 601 | } | ||
| 602 | |||
| 603 | static int qeth_l2_send_delmac_cb(struct qeth_card *card, | ||
| 604 | struct qeth_reply *reply, | ||
| 605 | unsigned long data) | ||
| 606 | { | ||
| 607 | struct qeth_ipa_cmd *cmd; | ||
| 608 | |||
| 609 | QETH_CARD_TEXT(card, 2, "L2Dmaccb"); | ||
| 610 | cmd = (struct qeth_ipa_cmd *) data; | ||
| 611 | if (cmd->hdr.return_code) { | ||
| 612 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); | ||
| 613 | return 0; | ||
| 614 | } | 603 | } |
| 615 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 604 | return rc; |
| 616 | |||
| 617 | return 0; | ||
| 618 | } | 605 | } |
| 619 | 606 | ||
| 620 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) | 607 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) |
| 621 | { | 608 | { |
| 609 | int rc; | ||
| 610 | |||
| 622 | QETH_CARD_TEXT(card, 2, "L2Delmac"); | 611 | QETH_CARD_TEXT(card, 2, "L2Delmac"); |
| 623 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) | 612 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) |
| 624 | return 0; | 613 | return 0; |
| 625 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, | 614 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 626 | qeth_l2_send_delmac_cb); | 615 | IPA_CMD_DELVMAC)); |
| 616 | if (rc == 0) | ||
| 617 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | ||
| 618 | return rc; | ||
| 627 | } | 619 | } |
| 628 | 620 | ||
| 629 | static int qeth_l2_request_initial_mac(struct qeth_card *card) | 621 | static int qeth_l2_request_initial_mac(struct qeth_card *card) |
| @@ -651,7 +643,7 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
| 651 | if (rc) { | 643 | if (rc) { |
| 652 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " | 644 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " |
| 653 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 645 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
| 654 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 646 | QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); |
| 655 | return rc; | 647 | return rc; |
| 656 | } | 648 | } |
| 657 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); | 649 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); |
| @@ -687,7 +679,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
| 687 | return -ERESTARTSYS; | 679 | return -ERESTARTSYS; |
| 688 | } | 680 | } |
| 689 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); | 681 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); |
| 690 | if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) | 682 | if (!rc || (rc == -ENOENT)) |
| 691 | rc = qeth_l2_send_setmac(card, addr->sa_data); | 683 | rc = qeth_l2_send_setmac(card, addr->sa_data); |
| 692 | return rc ? -EINVAL : 0; | 684 | return rc ? -EINVAL : 0; |
| 693 | } | 685 | } |
| @@ -996,7 +988,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
| 996 | recover_flag = card->state; | 988 | recover_flag = card->state; |
| 997 | rc = qeth_core_hardsetup_card(card); | 989 | rc = qeth_core_hardsetup_card(card); |
| 998 | if (rc) { | 990 | if (rc) { |
| 999 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 991 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
| 1000 | rc = -ENODEV; | 992 | rc = -ENODEV; |
| 1001 | goto out_remove; | 993 | goto out_remove; |
| 1002 | } | 994 | } |
| @@ -1730,6 +1722,8 @@ static void qeth_bridgeport_query_support(struct qeth_card *card) | |||
| 1730 | 1722 | ||
| 1731 | QETH_CARD_TEXT(card, 2, "brqsuppo"); | 1723 | QETH_CARD_TEXT(card, 2, "brqsuppo"); |
| 1732 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1724 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1725 | if (!iob) | ||
| 1726 | return; | ||
| 1733 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1727 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1734 | cmd->data.sbp.hdr.cmdlength = | 1728 | cmd->data.sbp.hdr.cmdlength = |
| 1735 | sizeof(struct qeth_ipacmd_sbp_hdr) + | 1729 | sizeof(struct qeth_ipacmd_sbp_hdr) + |
| @@ -1805,6 +1799,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
| 1805 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) | 1799 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) |
| 1806 | return -EOPNOTSUPP; | 1800 | return -EOPNOTSUPP; |
| 1807 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1801 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1802 | if (!iob) | ||
| 1803 | return -ENOMEM; | ||
| 1808 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1804 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1809 | cmd->data.sbp.hdr.cmdlength = | 1805 | cmd->data.sbp.hdr.cmdlength = |
| 1810 | sizeof(struct qeth_ipacmd_sbp_hdr); | 1806 | sizeof(struct qeth_ipacmd_sbp_hdr); |
| @@ -1817,9 +1813,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
| 1817 | if (rc) | 1813 | if (rc) |
| 1818 | return rc; | 1814 | return rc; |
| 1819 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); | 1815 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); |
| 1820 | if (rc) | 1816 | return rc; |
| 1821 | return rc; | ||
| 1822 | return 0; | ||
| 1823 | } | 1817 | } |
| 1824 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); | 1818 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); |
| 1825 | 1819 | ||
| @@ -1873,6 +1867,8 @@ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) | |||
| 1873 | if (!(card->options.sbp.supported_funcs & setcmd)) | 1867 | if (!(card->options.sbp.supported_funcs & setcmd)) |
| 1874 | return -EOPNOTSUPP; | 1868 | return -EOPNOTSUPP; |
| 1875 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1869 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1870 | if (!iob) | ||
| 1871 | return -ENOMEM; | ||
| 1876 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1872 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1877 | cmd->data.sbp.hdr.cmdlength = cmdlength; | 1873 | cmd->data.sbp.hdr.cmdlength = cmdlength; |
| 1878 | cmd->data.sbp.hdr.command_code = setcmd; | 1874 | cmd->data.sbp.hdr.command_code = setcmd; |
