linux/drivers/s390/net/qeth_l2_main.c
<<
>>
Prefs
   1/*
   2 *    Copyright IBM Corp. 2007, 2009
   3 *    Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
   4 *               Frank Pavlic <fpavlic@de.ibm.com>,
   5 *               Thomas Spatzier <tspat@de.ibm.com>,
   6 *               Frank Blaschka <frank.blaschka@de.ibm.com>
   7 */
   8
   9#define KMSG_COMPONENT "qeth"
  10#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  11
  12#include <linux/module.h>
  13#include <linux/moduleparam.h>
  14#include <linux/string.h>
  15#include <linux/errno.h>
  16#include <linux/kernel.h>
  17#include <linux/slab.h>
  18#include <linux/etherdevice.h>
  19#include <linux/mii.h>
  20#include <linux/ip.h>
  21#include <linux/list.h>
  22
  23#include "qeth_core.h"
  24#include "qeth_l2.h"
  25
  26static int qeth_l2_set_offline(struct ccwgroup_device *);
  27static int qeth_l2_stop(struct net_device *);
  28static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
  29static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
  30                           enum qeth_ipa_cmds);
  31static void qeth_l2_set_multicast_list(struct net_device *);
  32static int qeth_l2_recover(void *);
  33static void qeth_bridgeport_query_support(struct qeth_card *card);
  34static void qeth_bridge_state_change(struct qeth_card *card,
  35                                        struct qeth_ipa_cmd *cmd);
  36static void qeth_bridge_host_event(struct qeth_card *card,
  37                                        struct qeth_ipa_cmd *cmd);
  38
  39static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  40{
  41        struct qeth_card *card = dev->ml_priv;
  42        struct mii_ioctl_data *mii_data;
  43        int rc = 0;
  44
  45        if (!card)
  46                return -ENODEV;
  47
  48        if (!qeth_card_hw_is_reachable(card))
  49                return -ENODEV;
  50
  51        if (card->info.type == QETH_CARD_TYPE_OSN)
  52                return -EPERM;
  53
  54        switch (cmd) {
  55        case SIOC_QETH_ADP_SET_SNMP_CONTROL:
  56                rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
  57                break;
  58        case SIOC_QETH_GET_CARD_TYPE:
  59                if ((card->info.type == QETH_CARD_TYPE_OSD ||
  60                     card->info.type == QETH_CARD_TYPE_OSM ||
  61                     card->info.type == QETH_CARD_TYPE_OSX) &&
  62                    !card->info.guestlan)
  63                        return 1;
  64                return 0;
  65                break;
  66        case SIOCGMIIPHY:
  67                mii_data = if_mii(rq);
  68                mii_data->phy_id = 0;
  69                break;
  70        case SIOCGMIIREG:
  71                mii_data = if_mii(rq);
  72                if (mii_data->phy_id != 0)
  73                        rc = -EINVAL;
  74                else
  75                        mii_data->val_out = qeth_mdio_read(dev,
  76                                mii_data->phy_id, mii_data->reg_num);
  77                break;
  78        case SIOC_QETH_QUERY_OAT:
  79                rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
  80                break;
  81        default:
  82                rc = -EOPNOTSUPP;
  83        }
  84        if (rc)
  85                QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
  86        return rc;
  87}
  88
  89static int qeth_l2_verify_dev(struct net_device *dev)
  90{
  91        struct qeth_card *card;
  92        unsigned long flags;
  93        int rc = 0;
  94
  95        read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
  96        list_for_each_entry(card, &qeth_core_card_list.list, list) {
  97                if (card->dev == dev) {
  98                        rc = QETH_REAL_CARD;
  99                        break;
 100                }
 101        }
 102        read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
 103
 104        return rc;
 105}
 106
 107static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
 108{
 109        struct qeth_card *card;
 110        struct net_device *ndev;
 111        __u16 temp_dev_no;
 112        unsigned long flags;
 113        struct ccw_dev_id read_devid;
 114
 115        ndev = NULL;
 116        memcpy(&temp_dev_no, read_dev_no, 2);
 117        read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
 118        list_for_each_entry(card, &qeth_core_card_list.list, list) {
 119                ccw_device_get_id(CARD_RDEV(card), &read_devid);
 120                if (read_devid.devno == temp_dev_no) {
 121                        ndev = card->dev;
 122                        break;
 123                }
 124        }
 125        read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
 126        return ndev;
 127}
 128
 129static int qeth_setdel_makerc(struct qeth_card *card, int retcode)
 130{
 131        int rc;
 132
 133        if (retcode)
 134                QETH_CARD_TEXT_(card, 2, "err%04x", retcode);
 135        switch (retcode) {
 136        case IPA_RC_SUCCESS:
 137                rc = 0;
 138                break;
 139        case IPA_RC_L2_UNSUPPORTED_CMD:
 140                rc = -ENOSYS;
 141                break;
 142        case IPA_RC_L2_ADDR_TABLE_FULL:
 143                rc = -ENOSPC;
 144                break;
 145        case IPA_RC_L2_DUP_MAC:
 146        case IPA_RC_L2_DUP_LAYER3_MAC:
 147                rc = -EEXIST;
 148                break;
 149        case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
 150        case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
 151                rc = -EPERM;
 152                break;
 153        case IPA_RC_L2_MAC_NOT_FOUND:
 154                rc = -ENOENT;
 155                break;
 156        case -ENOMEM:
 157                rc = -ENOMEM;
 158                break;
 159        default:
 160                rc = -EIO;
 161                break;
 162        }
 163        return rc;
 164}
 165
 166static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
 167{
 168        int rc;
 169
 170        QETH_CARD_TEXT(card, 2, "L2Sgmac");
 171        rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
 172                                        IPA_CMD_SETGMAC));
 173        if (rc == -EEXIST)
 174                QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n",
 175                        mac, QETH_CARD_IFNAME(card));
 176        else if (rc)
 177                QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n",
 178                        mac, QETH_CARD_IFNAME(card), rc);
 179        return rc;
 180}
 181
 182static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
 183{
 184        int rc;
 185
 186        QETH_CARD_TEXT(card, 2, "L2Dgmac");
 187        rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
 188                                        IPA_CMD_DELGMAC));
 189        if (rc)
 190                QETH_DBF_MESSAGE(2,
 191                        "Could not delete group MAC %pM on %s: %d\n",
 192                        mac, QETH_CARD_IFNAME(card), rc);
 193        return rc;
 194}
 195
 196static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
 197{
 198        struct qeth_mc_mac *mc;
 199        int rc;
 200
 201        mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
 202
 203        if (!mc)
 204                return;
 205
 206        memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
 207        mc->mc_addrlen = OSA_ADDR_LEN;
 208        mc->is_vmac = vmac;
 209
 210        if (vmac) {
 211                rc = qeth_setdel_makerc(card,
 212                        qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC));
 213        } else {
 214                rc = qeth_setdel_makerc(card,
 215                        qeth_l2_send_setgroupmac(card, mac));
 216        }
 217
 218        if (!rc)
 219                list_add_tail(&mc->list, &card->mc_list);
 220        else
 221                kfree(mc);
 222}
 223
 224static void qeth_l2_del_all_mc(struct qeth_card *card, int del)
 225{
 226        struct qeth_mc_mac *mc, *tmp;
 227
 228        spin_lock_bh(&card->mclock);
 229        list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
 230                if (del) {
 231                        if (mc->is_vmac)
 232                                qeth_l2_send_setdelmac(card, mc->mc_addr,
 233                                        IPA_CMD_DELVMAC);
 234                        else
 235                                qeth_l2_send_delgroupmac(card, mc->mc_addr);
 236                }
 237                list_del(&mc->list);
 238                kfree(mc);
 239        }
 240        spin_unlock_bh(&card->mclock);
 241}
 242
 243static inline int qeth_l2_get_cast_type(struct qeth_card *card,
 244                        struct sk_buff *skb)
 245{
 246        if (card->info.type == QETH_CARD_TYPE_OSN)
 247                return RTN_UNSPEC;
 248        if (is_broadcast_ether_addr(skb->data))
 249                return RTN_BROADCAST;
 250        if (is_multicast_ether_addr(skb->data))
 251                return RTN_MULTICAST;
 252        return RTN_UNSPEC;
 253}
 254
 255static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
 256                        struct sk_buff *skb, int cast_type)
 257{
 258        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb);
 259
 260        memset(hdr, 0, sizeof(struct qeth_hdr));
 261        hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
 262
 263        /* set byte byte 3 to casting flags */
 264        if (cast_type == RTN_MULTICAST)
 265                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
 266        else if (cast_type == RTN_BROADCAST)
 267                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
 268        else
 269                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
 270
 271        hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
 272        /* VSWITCH relies on the VLAN
 273         * information to be present in
 274         * the QDIO header */
 275        if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
 276                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
 277                hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
 278        }
 279}
 280
 281static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
 282                        struct qeth_reply *reply, unsigned long data)
 283{
 284        struct qeth_ipa_cmd *cmd;
 285
 286        QETH_CARD_TEXT(card, 2, "L2sdvcb");
 287        cmd = (struct qeth_ipa_cmd *) data;
 288        if (cmd->hdr.return_code) {
 289                QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
 290                          "Continuing\n", cmd->data.setdelvlan.vlan_id,
 291                          QETH_CARD_IFNAME(card), cmd->hdr.return_code);
 292                QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
 293                QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
 294        }
 295        return 0;
 296}
 297
 298static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
 299                                enum qeth_ipa_cmds ipacmd)
 300{
 301        struct qeth_ipa_cmd *cmd;
 302        struct qeth_cmd_buffer *iob;
 303
 304        QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
 305        iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
 306        if (!iob)
 307                return -ENOMEM;
 308        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
 309        cmd->data.setdelvlan.vlan_id = i;
 310        return qeth_send_ipa_cmd(card, iob,
 311                                 qeth_l2_send_setdelvlan_cb, NULL);
 312}
 313
 314static void qeth_l2_process_vlans(struct qeth_card *card)
 315{
 316        struct qeth_vlan_vid *id;
 317        QETH_CARD_TEXT(card, 3, "L2prcvln");
 318        spin_lock_bh(&card->vlanlock);
 319        list_for_each_entry(id, &card->vid_list, list) {
 320                qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN);
 321        }
 322        spin_unlock_bh(&card->vlanlock);
 323}
 324
 325static int qeth_l2_vlan_rx_add_vid(struct net_device *dev,
 326                                   __be16 proto, u16 vid)
 327{
 328        struct qeth_card *card = dev->ml_priv;
 329        struct qeth_vlan_vid *id;
 330        int rc;
 331
 332        QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
 333        if (!vid)
 334                return 0;
 335        if (card->info.type == QETH_CARD_TYPE_OSM) {
 336                QETH_CARD_TEXT(card, 3, "aidOSM");
 337                return 0;
 338        }
 339        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 340                QETH_CARD_TEXT(card, 3, "aidREC");
 341                return 0;
 342        }
 343        id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
 344        if (id) {
 345                id->vid = vid;
 346                rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
 347                if (rc) {
 348                        kfree(id);
 349                        return rc;
 350                }
 351                spin_lock_bh(&card->vlanlock);
 352                list_add_tail(&id->list, &card->vid_list);
 353                spin_unlock_bh(&card->vlanlock);
 354        } else {
 355                return -ENOMEM;
 356        }
 357        return 0;
 358}
 359
 360static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev,
 361                                    __be16 proto, u16 vid)
 362{
 363        struct qeth_vlan_vid *id, *tmpid = NULL;
 364        struct qeth_card *card = dev->ml_priv;
 365        int rc = 0;
 366
 367        QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
 368        if (card->info.type == QETH_CARD_TYPE_OSM) {
 369                QETH_CARD_TEXT(card, 3, "kidOSM");
 370                return 0;
 371        }
 372        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 373                QETH_CARD_TEXT(card, 3, "kidREC");
 374                return 0;
 375        }
 376        spin_lock_bh(&card->vlanlock);
 377        list_for_each_entry(id, &card->vid_list, list) {
 378                if (id->vid == vid) {
 379                        list_del(&id->list);
 380                        tmpid = id;
 381                        break;
 382                }
 383        }
 384        spin_unlock_bh(&card->vlanlock);
 385        if (tmpid) {
 386                rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
 387                kfree(tmpid);
 388        }
 389        qeth_l2_set_multicast_list(card->dev);
 390        return rc;
 391}
 392
 393static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
 394{
 395        int rc = 0;
 396
 397        QETH_DBF_TEXT(SETUP , 2, "stopcard");
 398        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 399
 400        qeth_set_allowed_threads(card, 0, 1);
 401        if (card->read.state == CH_STATE_UP &&
 402            card->write.state == CH_STATE_UP &&
 403            (card->state == CARD_STATE_UP)) {
 404                if (recovery_mode &&
 405                    card->info.type != QETH_CARD_TYPE_OSN) {
 406                        qeth_l2_stop(card->dev);
 407                } else {
 408                        rtnl_lock();
 409                        dev_close(card->dev);
 410                        rtnl_unlock();
 411                }
 412                card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 413                card->state = CARD_STATE_SOFTSETUP;
 414        }
 415        if (card->state == CARD_STATE_SOFTSETUP) {
 416                qeth_l2_del_all_mc(card, 0);
 417                qeth_clear_ipacmd_list(card);
 418                card->state = CARD_STATE_HARDSETUP;
 419        }
 420        if (card->state == CARD_STATE_HARDSETUP) {
 421                qeth_qdio_clear_card(card, 0);
 422                qeth_clear_qdio_buffers(card);
 423                qeth_clear_working_pool_list(card);
 424                card->state = CARD_STATE_DOWN;
 425        }
 426        if (card->state == CARD_STATE_DOWN) {
 427                qeth_clear_cmd_buffers(&card->read);
 428                qeth_clear_cmd_buffers(&card->write);
 429        }
 430        return rc;
 431}
 432
 433static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
 434                                int budget, int *done)
 435{
 436        int work_done = 0;
 437        struct sk_buff *skb;
 438        struct qeth_hdr *hdr;
 439        unsigned int len;
 440
 441        *done = 0;
 442        WARN_ON_ONCE(!budget);
 443        while (budget) {
 444                skb = qeth_core_get_next_skb(card,
 445                        &card->qdio.in_q->bufs[card->rx.b_index],
 446                        &card->rx.b_element, &card->rx.e_offset, &hdr);
 447                if (!skb) {
 448                        *done = 1;
 449                        break;
 450                }
 451                skb->dev = card->dev;
 452                switch (hdr->hdr.l2.id) {
 453                case QETH_HEADER_TYPE_LAYER2:
 454                        skb->pkt_type = PACKET_HOST;
 455                        skb->protocol = eth_type_trans(skb, skb->dev);
 456                        skb->ip_summed = CHECKSUM_NONE;
 457                        if (skb->protocol == htons(ETH_P_802_2))
 458                                *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
 459                        len = skb->len;
 460                        netif_receive_skb(skb);
 461                        break;
 462                case QETH_HEADER_TYPE_OSN:
 463                        if (card->info.type == QETH_CARD_TYPE_OSN) {
 464                                skb_push(skb, sizeof(struct qeth_hdr));
 465                                skb_copy_to_linear_data(skb, hdr,
 466                                                sizeof(struct qeth_hdr));
 467                                len = skb->len;
 468                                card->osn_info.data_cb(skb);
 469                                break;
 470                        }
 471                        /* else unknown */
 472                default:
 473                        dev_kfree_skb_any(skb);
 474                        QETH_CARD_TEXT(card, 3, "inbunkno");
 475                        QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
 476                        continue;
 477                }
 478                work_done++;
 479                budget--;
 480                card->stats.rx_packets++;
 481                card->stats.rx_bytes += len;
 482        }
 483        return work_done;
 484}
 485
 486static int qeth_l2_poll(struct napi_struct *napi, int budget)
 487{
 488        struct qeth_card *card = container_of(napi, struct qeth_card, napi);
 489        int work_done = 0;
 490        struct qeth_qdio_buffer *buffer;
 491        int done;
 492        int new_budget = budget;
 493
 494        if (card->options.performance_stats) {
 495                card->perf_stats.inbound_cnt++;
 496                card->perf_stats.inbound_start_time = qeth_get_micros();
 497        }
 498
 499        while (1) {
 500                if (!card->rx.b_count) {
 501                        card->rx.qdio_err = 0;
 502                        card->rx.b_count = qdio_get_next_buffers(
 503                                card->data.ccwdev, 0, &card->rx.b_index,
 504                                &card->rx.qdio_err);
 505                        if (card->rx.b_count <= 0) {
 506                                card->rx.b_count = 0;
 507                                break;
 508                        }
 509                        card->rx.b_element =
 510                                &card->qdio.in_q->bufs[card->rx.b_index]
 511                                .buffer->element[0];
 512                        card->rx.e_offset = 0;
 513                }
 514
 515                while (card->rx.b_count) {
 516                        buffer = &card->qdio.in_q->bufs[card->rx.b_index];
 517                        if (!(card->rx.qdio_err &&
 518                            qeth_check_qdio_errors(card, buffer->buffer,
 519                            card->rx.qdio_err, "qinerr")))
 520                                work_done += qeth_l2_process_inbound_buffer(
 521                                        card, new_budget, &done);
 522                        else
 523                                done = 1;
 524
 525                        if (done) {
 526                                if (card->options.performance_stats)
 527                                        card->perf_stats.bufs_rec++;
 528                                qeth_put_buffer_pool_entry(card,
 529                                        buffer->pool_entry);
 530                                qeth_queue_input_buffer(card, card->rx.b_index);
 531                                card->rx.b_count--;
 532                                if (card->rx.b_count) {
 533                                        card->rx.b_index =
 534                                                (card->rx.b_index + 1) %
 535                                                QDIO_MAX_BUFFERS_PER_Q;
 536                                        card->rx.b_element =
 537                                                &card->qdio.in_q
 538                                                ->bufs[card->rx.b_index]
 539                                                .buffer->element[0];
 540                                        card->rx.e_offset = 0;
 541                                }
 542                        }
 543
 544                        if (work_done >= budget)
 545                                goto out;
 546                        else
 547                                new_budget = budget - work_done;
 548                }
 549        }
 550
 551        napi_complete(napi);
 552        if (qdio_start_irq(card->data.ccwdev, 0))
 553                napi_schedule(&card->napi);
 554out:
 555        if (card->options.performance_stats)
 556                card->perf_stats.inbound_time += qeth_get_micros() -
 557                        card->perf_stats.inbound_start_time;
 558        return work_done;
 559}
 560
 561static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
 562                           enum qeth_ipa_cmds ipacmd)
 563{
 564        struct qeth_ipa_cmd *cmd;
 565        struct qeth_cmd_buffer *iob;
 566
 567        QETH_CARD_TEXT(card, 2, "L2sdmac");
 568        iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
 569        if (!iob)
 570                return -ENOMEM;
 571        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
 572        cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
 573        memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
 574        return qeth_send_ipa_cmd(card, iob, NULL, NULL);
 575}
 576
 577static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
 578{
 579        int rc;
 580
 581        QETH_CARD_TEXT(card, 2, "L2Setmac");
 582        rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
 583                                        IPA_CMD_SETVMAC));
 584        if (rc == 0) {
 585                card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
 586                memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN);
 587                dev_info(&card->gdev->dev,
 588                        "MAC address %pM successfully registered on device %s\n",
 589                        card->dev->dev_addr, card->dev->name);
 590        } else {
 591                card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 592                switch (rc) {
 593                case -EEXIST:
 594                        dev_warn(&card->gdev->dev,
 595                                "MAC address %pM already exists\n", mac);
 596                        break;
 597                case -EPERM:
 598                        dev_warn(&card->gdev->dev,
 599                                "MAC address %pM is not authorized\n", mac);
 600                        break;
 601                }
 602        }
 603        return rc;
 604}
 605
 606static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
 607{
 608        int rc;
 609
 610        QETH_CARD_TEXT(card, 2, "L2Delmac");
 611        if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
 612                return 0;
 613        rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac,
 614                                        IPA_CMD_DELVMAC));
 615        if (rc == 0)
 616                card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 617        return rc;
 618}
 619
 620static int qeth_l2_request_initial_mac(struct qeth_card *card)
 621{
 622        int rc = 0;
 623        char vendor_pre[] = {0x02, 0x00, 0x00};
 624
 625        QETH_DBF_TEXT(SETUP, 2, "doL2init");
 626        QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
 627
 628        if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
 629                rc = qeth_query_setadapterparms(card);
 630                if (rc) {
 631                        QETH_DBF_MESSAGE(2, "could not query adapter "
 632                                "parameters on device %s: x%x\n",
 633                                CARD_BUS_ID(card), rc);
 634                }
 635        }
 636
 637        if (card->info.type == QETH_CARD_TYPE_IQD ||
 638            card->info.type == QETH_CARD_TYPE_OSM ||
 639            card->info.type == QETH_CARD_TYPE_OSX ||
 640            card->info.guestlan) {
 641                rc = qeth_setadpparms_change_macaddr(card);
 642                if (rc) {
 643                        QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
 644                                "device %s: x%x\n", CARD_BUS_ID(card), rc);
 645                        QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc);
 646                        return rc;
 647                }
 648                QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
 649        } else {
 650                eth_random_addr(card->dev->dev_addr);
 651                memcpy(card->dev->dev_addr, vendor_pre, 3);
 652        }
 653        return 0;
 654}
 655
 656static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
 657{
 658        struct sockaddr *addr = p;
 659        struct qeth_card *card = dev->ml_priv;
 660        int rc = 0;
 661
 662        QETH_CARD_TEXT(card, 3, "setmac");
 663
 664        if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
 665                QETH_CARD_TEXT(card, 3, "setmcINV");
 666                return -EOPNOTSUPP;
 667        }
 668
 669        if (card->info.type == QETH_CARD_TYPE_OSN ||
 670            card->info.type == QETH_CARD_TYPE_OSM ||
 671            card->info.type == QETH_CARD_TYPE_OSX) {
 672                QETH_CARD_TEXT(card, 3, "setmcTYP");
 673                return -EOPNOTSUPP;
 674        }
 675        QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);
 676        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 677                QETH_CARD_TEXT(card, 3, "setmcREC");
 678                return -ERESTARTSYS;
 679        }
 680        rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
 681        if (!rc || (rc == -ENOENT))
 682                rc = qeth_l2_send_setmac(card, addr->sa_data);
 683        return rc ? -EINVAL : 0;
 684}
 685
 686static void qeth_l2_set_multicast_list(struct net_device *dev)
 687{
 688        struct qeth_card *card = dev->ml_priv;
 689        struct netdev_hw_addr *ha;
 690
 691        if (card->info.type == QETH_CARD_TYPE_OSN)
 692                return ;
 693
 694        QETH_CARD_TEXT(card, 3, "setmulti");
 695        if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
 696            (card->state != CARD_STATE_UP))
 697                return;
 698        qeth_l2_del_all_mc(card, 1);
 699        spin_lock_bh(&card->mclock);
 700        netdev_for_each_mc_addr(ha, dev)
 701                qeth_l2_add_mc(card, ha->addr, 0);
 702
 703        netdev_for_each_uc_addr(ha, dev)
 704                qeth_l2_add_mc(card, ha->addr, 1);
 705
 706        spin_unlock_bh(&card->mclock);
 707        if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
 708                return;
 709        qeth_setadp_promisc_mode(card);
 710}
 711
 712static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 713{
 714        int rc;
 715        struct qeth_hdr *hdr = NULL;
 716        int elements = 0;
 717        struct qeth_card *card = dev->ml_priv;
 718        struct sk_buff *new_skb = skb;
 719        int cast_type = qeth_l2_get_cast_type(card, skb);
 720        struct qeth_qdio_out_q *queue;
 721        int tx_bytes = skb->len;
 722        int data_offset = -1;
 723        int elements_needed = 0;
 724        int hd_len = 0;
 725
 726        if (card->qdio.do_prio_queueing || (cast_type &&
 727                                        card->info.is_multicast_different))
 728                queue = card->qdio.out_qs[qeth_get_priority_queue(card, skb,
 729                                        qeth_get_ip_version(skb), cast_type)];
 730        else
 731                queue = card->qdio.out_qs[card->qdio.default_out_queue];
 732
 733        if ((card->state != CARD_STATE_UP) || !card->lan_online) {
 734                card->stats.tx_carrier_errors++;
 735                goto tx_drop;
 736        }
 737
 738        if ((card->info.type == QETH_CARD_TYPE_OSN) &&
 739            (skb->protocol == htons(ETH_P_IPV6)))
 740                goto tx_drop;
 741
 742        if (card->options.performance_stats) {
 743                card->perf_stats.outbound_cnt++;
 744                card->perf_stats.outbound_start_time = qeth_get_micros();
 745        }
 746        netif_stop_queue(dev);
 747
 748        if (card->info.type == QETH_CARD_TYPE_OSN)
 749                hdr = (struct qeth_hdr *)skb->data;
 750        else {
 751                if (card->info.type == QETH_CARD_TYPE_IQD) {
 752                        new_skb = skb;
 753                        data_offset = ETH_HLEN;
 754                        hd_len = ETH_HLEN;
 755                        hdr = kmem_cache_alloc(qeth_core_header_cache,
 756                                                GFP_ATOMIC);
 757                        if (!hdr)
 758                                goto tx_drop;
 759                        elements_needed++;
 760                        skb_reset_mac_header(new_skb);
 761                        qeth_l2_fill_header(card, hdr, new_skb, cast_type);
 762                        hdr->hdr.l2.pkt_length = new_skb->len;
 763                        memcpy(((char *)hdr) + sizeof(struct qeth_hdr),
 764                                skb_mac_header(new_skb), ETH_HLEN);
 765                } else {
 766                        /* create a clone with writeable headroom */
 767                        new_skb = skb_realloc_headroom(skb,
 768                                                sizeof(struct qeth_hdr));
 769                        if (!new_skb)
 770                                goto tx_drop;
 771                        hdr = (struct qeth_hdr *)skb_push(new_skb,
 772                                                sizeof(struct qeth_hdr));
 773                        skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
 774                        qeth_l2_fill_header(card, hdr, new_skb, cast_type);
 775                }
 776        }
 777
 778        elements = qeth_get_elements_no(card, new_skb, elements_needed);
 779        if (!elements) {
 780                if (data_offset >= 0)
 781                        kmem_cache_free(qeth_core_header_cache, hdr);
 782                goto tx_drop;
 783        }
 784
 785        if (card->info.type != QETH_CARD_TYPE_IQD) {
 786                if (qeth_hdr_chk_and_bounce(new_skb, &hdr,
 787                    sizeof(struct qeth_hdr_layer2)))
 788                        goto tx_drop;
 789                rc = qeth_do_send_packet(card, queue, new_skb, hdr,
 790                                         elements);
 791        } else
 792                rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
 793                                        elements, data_offset, hd_len);
 794        if (!rc) {
 795                card->stats.tx_packets++;
 796                card->stats.tx_bytes += tx_bytes;
 797                if (new_skb != skb)
 798                        dev_kfree_skb_any(skb);
 799                rc = NETDEV_TX_OK;
 800        } else {
 801                if (data_offset >= 0)
 802                        kmem_cache_free(qeth_core_header_cache, hdr);
 803
 804                if (rc == -EBUSY) {
 805                        if (new_skb != skb)
 806                                dev_kfree_skb_any(new_skb);
 807                        return NETDEV_TX_BUSY;
 808                } else
 809                        goto tx_drop;
 810        }
 811
 812        netif_wake_queue(dev);
 813        if (card->options.performance_stats)
 814                card->perf_stats.outbound_time += qeth_get_micros() -
 815                        card->perf_stats.outbound_start_time;
 816        return rc;
 817
 818tx_drop:
 819        card->stats.tx_dropped++;
 820        card->stats.tx_errors++;
 821        if ((new_skb != skb) && new_skb)
 822                dev_kfree_skb_any(new_skb);
 823        dev_kfree_skb_any(skb);
 824        netif_wake_queue(dev);
 825        return NETDEV_TX_OK;
 826}
 827
 828static int __qeth_l2_open(struct net_device *dev)
 829{
 830        struct qeth_card *card = dev->ml_priv;
 831        int rc = 0;
 832
 833        QETH_CARD_TEXT(card, 4, "qethopen");
 834        if (card->state == CARD_STATE_UP)
 835                return rc;
 836        if (card->state != CARD_STATE_SOFTSETUP)
 837                return -ENODEV;
 838
 839        if ((card->info.type != QETH_CARD_TYPE_OSN) &&
 840             (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
 841                QETH_CARD_TEXT(card, 4, "nomacadr");
 842                return -EPERM;
 843        }
 844        card->data.state = CH_STATE_UP;
 845        card->state = CARD_STATE_UP;
 846        netif_start_queue(dev);
 847
 848        if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) {
 849                napi_enable(&card->napi);
 850                napi_schedule(&card->napi);
 851        } else
 852                rc = -EIO;
 853        return rc;
 854}
 855
 856static int qeth_l2_open(struct net_device *dev)
 857{
 858        struct qeth_card *card = dev->ml_priv;
 859
 860        QETH_CARD_TEXT(card, 5, "qethope_");
 861        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 862                QETH_CARD_TEXT(card, 3, "openREC");
 863                return -ERESTARTSYS;
 864        }
 865        return __qeth_l2_open(dev);
 866}
 867
 868static int qeth_l2_stop(struct net_device *dev)
 869{
 870        struct qeth_card *card = dev->ml_priv;
 871
 872        QETH_CARD_TEXT(card, 4, "qethstop");
 873        netif_tx_disable(dev);
 874        if (card->state == CARD_STATE_UP) {
 875                card->state = CARD_STATE_SOFTSETUP;
 876                napi_disable(&card->napi);
 877        }
 878        return 0;
 879}
 880
 881static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
 882{
 883        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
 884
 885        qeth_l2_create_device_attributes(&gdev->dev);
 886        INIT_LIST_HEAD(&card->vid_list);
 887        INIT_LIST_HEAD(&card->mc_list);
 888        card->options.layer2 = 1;
 889        card->info.hwtrap = 0;
 890        return 0;
 891}
 892
 893static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
 894{
 895        struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
 896
 897        qeth_l2_remove_device_attributes(&cgdev->dev);
 898        qeth_set_allowed_threads(card, 0, 1);
 899        wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
 900
 901        if (cgdev->state == CCWGROUP_ONLINE)
 902                qeth_l2_set_offline(cgdev);
 903
 904        if (card->dev) {
 905                unregister_netdev(card->dev);
 906                card->dev = NULL;
 907        }
 908        return;
 909}
 910
 911static const struct ethtool_ops qeth_l2_ethtool_ops = {
 912        .get_link = ethtool_op_get_link,
 913        .get_strings = qeth_core_get_strings,
 914        .get_ethtool_stats = qeth_core_get_ethtool_stats,
 915        .get_sset_count = qeth_core_get_sset_count,
 916        .get_drvinfo = qeth_core_get_drvinfo,
 917        .get_settings = qeth_core_ethtool_get_settings,
 918};
 919
 920static const struct ethtool_ops qeth_l2_osn_ops = {
 921        .get_strings = qeth_core_get_strings,
 922        .get_ethtool_stats = qeth_core_get_ethtool_stats,
 923        .get_sset_count = qeth_core_get_sset_count,
 924        .get_drvinfo = qeth_core_get_drvinfo,
 925};
 926
 927static const struct net_device_ops qeth_l2_netdev_ops = {
 928        .ndo_open               = qeth_l2_open,
 929        .ndo_stop               = qeth_l2_stop,
 930        .ndo_get_stats          = qeth_get_stats,
 931        .ndo_start_xmit         = qeth_l2_hard_start_xmit,
 932        .ndo_validate_addr      = eth_validate_addr,
 933        .ndo_set_rx_mode        = qeth_l2_set_multicast_list,
 934        .ndo_do_ioctl           = qeth_l2_do_ioctl,
 935        .ndo_set_mac_address    = qeth_l2_set_mac_address,
 936        .ndo_change_mtu         = qeth_change_mtu,
 937        .ndo_vlan_rx_add_vid    = qeth_l2_vlan_rx_add_vid,
 938        .ndo_vlan_rx_kill_vid   = qeth_l2_vlan_rx_kill_vid,
 939        .ndo_tx_timeout         = qeth_tx_timeout,
 940};
 941
 942static int qeth_l2_setup_netdev(struct qeth_card *card)
 943{
 944        switch (card->info.type) {
 945        case QETH_CARD_TYPE_IQD:
 946                card->dev = alloc_netdev(0, "hsi%d", NET_NAME_UNKNOWN,
 947                                         ether_setup);
 948                break;
 949        case QETH_CARD_TYPE_OSN:
 950                card->dev = alloc_netdev(0, "osn%d", NET_NAME_UNKNOWN,
 951                                         ether_setup);
 952                card->dev->flags |= IFF_NOARP;
 953                break;
 954        default:
 955                card->dev = alloc_etherdev(0);
 956        }
 957
 958        if (!card->dev)
 959                return -ENODEV;
 960
 961        card->dev->ml_priv = card;
 962        card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
 963        card->dev->mtu = card->info.initial_mtu;
 964        card->dev->netdev_ops = &qeth_l2_netdev_ops;
 965        card->dev->ethtool_ops =
 966                (card->info.type != QETH_CARD_TYPE_OSN) ?
 967                &qeth_l2_ethtool_ops : &qeth_l2_osn_ops;
 968        card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 969        card->info.broadcast_capable = 1;
 970        qeth_l2_request_initial_mac(card);
 971        SET_NETDEV_DEV(card->dev, &card->gdev->dev);
 972        netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
 973        return register_netdev(card->dev);
 974}
 975
 976static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
 977{
 978        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
 979        int rc = 0;
 980        enum qeth_card_states recover_flag;
 981
 982        mutex_lock(&card->discipline_mutex);
 983        mutex_lock(&card->conf_mutex);
 984        QETH_DBF_TEXT(SETUP, 2, "setonlin");
 985        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 986
 987        recover_flag = card->state;
 988        rc = qeth_core_hardsetup_card(card);
 989        if (rc) {
 990                QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
 991                rc = -ENODEV;
 992                goto out_remove;
 993        }
 994        qeth_bridgeport_query_support(card);
 995        if (card->options.sbp.supported_funcs)
 996                dev_info(&card->gdev->dev,
 997                "The device represents a HiperSockets Bridge Capable Port\n");
 998        qeth_trace_features(card);
 999
1000        if (!card->dev && qeth_l2_setup_netdev(card)) {
1001                rc = -ENODEV;
1002                goto out_remove;
1003        }
1004
1005        if (card->info.type != QETH_CARD_TYPE_OSN)
1006                qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
1007
1008        if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) {
1009                if (card->info.hwtrap &&
1010                    qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM))
1011                        card->info.hwtrap = 0;
1012        } else
1013                card->info.hwtrap = 0;
1014
1015        qeth_l2_setup_bridgeport_attrs(card);
1016
1017        card->state = CARD_STATE_HARDSETUP;
1018        memset(&card->rx, 0, sizeof(struct qeth_rx));
1019        qeth_print_status_message(card);
1020
1021        /* softsetup */
1022        QETH_DBF_TEXT(SETUP, 2, "softsetp");
1023
1024        rc = qeth_send_startlan(card);
1025        if (rc) {
1026                QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1027                if (rc == 0xe080) {
1028                        dev_warn(&card->gdev->dev,
1029                                "The LAN is offline\n");
1030                        card->lan_online = 0;
1031                        goto contin;
1032                }
1033                rc = -ENODEV;
1034                goto out_remove;
1035        } else
1036                card->lan_online = 1;
1037
1038contin:
1039        if ((card->info.type == QETH_CARD_TYPE_OSD) ||
1040            (card->info.type == QETH_CARD_TYPE_OSX)) {
1041                /* configure isolation level */
1042                rc = qeth_set_access_ctrl_online(card, 0);
1043                if (rc) {
1044                        rc = -ENODEV;
1045                        goto out_remove;
1046                }
1047        }
1048
1049        if (card->info.type != QETH_CARD_TYPE_OSN &&
1050            card->info.type != QETH_CARD_TYPE_OSM)
1051                qeth_l2_process_vlans(card);
1052
1053        netif_tx_disable(card->dev);
1054
1055        rc = qeth_init_qdio_queues(card);
1056        if (rc) {
1057                QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
1058                rc = -ENODEV;
1059                goto out_remove;
1060        }
1061        card->state = CARD_STATE_SOFTSETUP;
1062        if (card->lan_online)
1063                netif_carrier_on(card->dev);
1064        else
1065                netif_carrier_off(card->dev);
1066
1067        qeth_set_allowed_threads(card, 0xffffffff, 0);
1068        if (recover_flag == CARD_STATE_RECOVER) {
1069                if (recovery_mode &&
1070                    card->info.type != QETH_CARD_TYPE_OSN) {
1071                        __qeth_l2_open(card->dev);
1072                } else {
1073                        rtnl_lock();
1074                        dev_open(card->dev);
1075                        rtnl_unlock();
1076                }
1077                /* this also sets saved unicast addresses */
1078                qeth_l2_set_multicast_list(card->dev);
1079        }
1080        /* let user_space know that device is online */
1081        kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
1082        mutex_unlock(&card->conf_mutex);
1083        mutex_unlock(&card->discipline_mutex);
1084        return 0;
1085
1086out_remove:
1087        qeth_l2_stop_card(card, 0);
1088        ccw_device_set_offline(CARD_DDEV(card));
1089        ccw_device_set_offline(CARD_WDEV(card));
1090        ccw_device_set_offline(CARD_RDEV(card));
1091        qdio_free(CARD_DDEV(card));
1092        if (recover_flag == CARD_STATE_RECOVER)
1093                card->state = CARD_STATE_RECOVER;
1094        else
1095                card->state = CARD_STATE_DOWN;
1096        mutex_unlock(&card->conf_mutex);
1097        mutex_unlock(&card->discipline_mutex);
1098        return rc;
1099}
1100
1101static int qeth_l2_set_online(struct ccwgroup_device *gdev)
1102{
1103        return __qeth_l2_set_online(gdev, 0);
1104}
1105
1106static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1107                                        int recovery_mode)
1108{
1109        struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
1110        int rc = 0, rc2 = 0, rc3 = 0;
1111        enum qeth_card_states recover_flag;
1112
1113        mutex_lock(&card->discipline_mutex);
1114        mutex_lock(&card->conf_mutex);
1115        QETH_DBF_TEXT(SETUP, 3, "setoffl");
1116        QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
1117
1118        if (card->dev && netif_carrier_ok(card->dev))
1119                netif_carrier_off(card->dev);
1120        recover_flag = card->state;
1121        if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) {
1122                qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1123                card->info.hwtrap = 1;
1124        }
1125        qeth_l2_stop_card(card, recovery_mode);
1126        rc  = ccw_device_set_offline(CARD_DDEV(card));
1127        rc2 = ccw_device_set_offline(CARD_WDEV(card));
1128        rc3 = ccw_device_set_offline(CARD_RDEV(card));
1129        if (!rc)
1130                rc = (rc2) ? rc2 : rc3;
1131        if (rc)
1132                QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1133        qdio_free(CARD_DDEV(card));
1134        if (recover_flag == CARD_STATE_UP)
1135                card->state = CARD_STATE_RECOVER;
1136        /* let user_space know that device is offline */
1137        kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
1138        mutex_unlock(&card->conf_mutex);
1139        mutex_unlock(&card->discipline_mutex);
1140        return 0;
1141}
1142
1143static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
1144{
1145        return __qeth_l2_set_offline(cgdev, 0);
1146}
1147
1148static int qeth_l2_recover(void *ptr)
1149{
1150        struct qeth_card *card;
1151        int rc = 0;
1152
1153        card = (struct qeth_card *) ptr;
1154        QETH_CARD_TEXT(card, 2, "recover1");
1155        if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
1156                return 0;
1157        QETH_CARD_TEXT(card, 2, "recover2");
1158        dev_warn(&card->gdev->dev,
1159                "A recovery process has been started for the device\n");
1160        qeth_set_recovery_task(card);
1161        __qeth_l2_set_offline(card->gdev, 1);
1162        rc = __qeth_l2_set_online(card->gdev, 1);
1163        if (!rc)
1164                dev_info(&card->gdev->dev,
1165                        "Device successfully recovered!\n");
1166        else {
1167                qeth_close_dev(card);
1168                dev_warn(&card->gdev->dev, "The qeth device driver "
1169                                "failed to recover an error on the device\n");
1170        }
1171        qeth_clear_recovery_task(card);
1172        qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1173        qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
1174        return 0;
1175}
1176
1177static int __init qeth_l2_init(void)
1178{
1179        pr_info("register layer 2 discipline\n");
1180        return 0;
1181}
1182
1183static void __exit qeth_l2_exit(void)
1184{
1185        pr_info("unregister layer 2 discipline\n");
1186}
1187
1188static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1189{
1190        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1191        qeth_set_allowed_threads(card, 0, 1);
1192        if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
1193                qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1194        qeth_qdio_clear_card(card, 0);
1195        qeth_clear_qdio_buffers(card);
1196        qdio_free(CARD_DDEV(card));
1197}
1198
1199static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1200{
1201        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1202
1203        if (card->dev)
1204                netif_device_detach(card->dev);
1205        qeth_set_allowed_threads(card, 0, 1);
1206        wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
1207        if (gdev->state == CCWGROUP_OFFLINE)
1208                return 0;
1209        if (card->state == CARD_STATE_UP) {
1210                if (card->info.hwtrap)
1211                        qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1212                __qeth_l2_set_offline(card->gdev, 1);
1213        } else
1214                __qeth_l2_set_offline(card->gdev, 0);
1215        return 0;
1216}
1217
1218static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
1219{
1220        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1221        int rc = 0;
1222
1223        if (gdev->state == CCWGROUP_OFFLINE)
1224                goto out;
1225
1226        if (card->state == CARD_STATE_RECOVER) {
1227                rc = __qeth_l2_set_online(card->gdev, 1);
1228                if (rc) {
1229                        rtnl_lock();
1230                        dev_close(card->dev);
1231                        rtnl_unlock();
1232                }
1233        } else
1234                rc = __qeth_l2_set_online(card->gdev, 0);
1235out:
1236        qeth_set_allowed_threads(card, 0xffffffff, 0);
1237        if (card->dev)
1238                netif_device_attach(card->dev);
1239        if (rc)
1240                dev_warn(&card->gdev->dev, "The qeth device driver "
1241                        "failed to recover an error on the device\n");
1242        return rc;
1243}
1244
1245/* Returns zero if the command is successfully "consumed" */
1246static int qeth_l2_control_event(struct qeth_card *card,
1247                                        struct qeth_ipa_cmd *cmd)
1248{
1249        switch (cmd->hdr.command) {
1250        case IPA_CMD_SETBRIDGEPORT:
1251                if (cmd->data.sbp.hdr.command_code ==
1252                                IPA_SBP_BRIDGE_PORT_STATE_CHANGE) {
1253                        qeth_bridge_state_change(card, cmd);
1254                        return 0;
1255                } else
1256                        return 1;
1257        case IPA_CMD_ADDRESS_CHANGE_NOTIF:
1258                qeth_bridge_host_event(card, cmd);
1259                return 0;
1260        default:
1261                return 1;
1262        }
1263}
1264
1265struct qeth_discipline qeth_l2_discipline = {
1266        .start_poll = qeth_qdio_start_poll,
1267        .input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
1268        .output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
1269        .recover = qeth_l2_recover,
1270        .setup = qeth_l2_probe_device,
1271        .remove = qeth_l2_remove_device,
1272        .set_online = qeth_l2_set_online,
1273        .set_offline = qeth_l2_set_offline,
1274        .shutdown = qeth_l2_shutdown,
1275        .freeze = qeth_l2_pm_suspend,
1276        .thaw = qeth_l2_pm_resume,
1277        .restore = qeth_l2_pm_resume,
1278        .control_event_handler = qeth_l2_control_event,
1279};
1280EXPORT_SYMBOL_GPL(qeth_l2_discipline);
1281
1282static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1283                           struct qeth_cmd_buffer *iob)
1284{
1285        unsigned long flags;
1286        int rc = 0;
1287
1288        QETH_CARD_TEXT(card, 5, "osndctrd");
1289
1290        wait_event(card->wait_q,
1291                   atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1292        qeth_prepare_control_data(card, len, iob);
1293        QETH_CARD_TEXT(card, 6, "osnoirqp");
1294        spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1295        rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1296                              (addr_t) iob, 0, 0);
1297        spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1298        if (rc) {
1299                QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "
1300                           "ccw_device_start rc = %i\n", rc);
1301                QETH_CARD_TEXT_(card, 2, " err%d", rc);
1302                qeth_release_buffer(iob->channel, iob);
1303                atomic_set(&card->write.irq_pending, 0);
1304                wake_up(&card->wait_q);
1305        }
1306        return rc;
1307}
1308
1309static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
1310                        struct qeth_cmd_buffer *iob, int data_len)
1311{
1312        u16 s1, s2;
1313
1314        QETH_CARD_TEXT(card, 4, "osndipa");
1315
1316        qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1317        s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1318        s2 = (u16)data_len;
1319        memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1320        memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1321        memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1322        memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1323        return qeth_osn_send_control_data(card, s1, iob);
1324}
1325
1326int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
1327{
1328        struct qeth_cmd_buffer *iob;
1329        struct qeth_card *card;
1330        int rc;
1331
1332        if (!dev)
1333                return -ENODEV;
1334        card = dev->ml_priv;
1335        if (!card)
1336                return -ENODEV;
1337        QETH_CARD_TEXT(card, 2, "osnsdmc");
1338        if (!qeth_card_hw_is_reachable(card))
1339                return -ENODEV;
1340        iob = qeth_wait_for_buffer(&card->write);
1341        memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
1342        rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
1343        return rc;
1344}
1345EXPORT_SYMBOL(qeth_osn_assist);
1346
1347int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
1348                  int (*assist_cb)(struct net_device *, void *),
1349                  int (*data_cb)(struct sk_buff *))
1350{
1351        struct qeth_card *card;
1352
1353        *dev = qeth_l2_netdev_by_devno(read_dev_no);
1354        if (*dev == NULL)
1355                return -ENODEV;
1356        card = (*dev)->ml_priv;
1357        if (!card)
1358                return -ENODEV;
1359        QETH_CARD_TEXT(card, 2, "osnreg");
1360        if ((assist_cb == NULL) || (data_cb == NULL))
1361                return -EINVAL;
1362        card->osn_info.assist_cb = assist_cb;
1363        card->osn_info.data_cb = data_cb;
1364        return 0;
1365}
1366EXPORT_SYMBOL(qeth_osn_register);
1367
1368void qeth_osn_deregister(struct net_device *dev)
1369{
1370        struct qeth_card *card;
1371
1372        if (!dev)
1373                return;
1374        card = dev->ml_priv;
1375        if (!card)
1376                return;
1377        QETH_CARD_TEXT(card, 2, "osndereg");
1378        card->osn_info.assist_cb = NULL;
1379        card->osn_info.data_cb = NULL;
1380        return;
1381}
1382EXPORT_SYMBOL(qeth_osn_deregister);
1383
1384/* SETBRIDGEPORT support, async notifications */
1385
1386enum qeth_an_event_type {anev_reg_unreg, anev_abort, anev_reset};
1387
1388/**
1389 * qeth_bridge_emit_host_event() - bridgeport address change notification
1390 * @card:  qeth_card structure pointer, for udev events.
1391 * @evtype:  "normal" register/unregister, or abort, or reset. For abort
1392 *            and reset token and addr_lnid are unused and may be NULL.
1393 * @code:  event bitmask: high order bit 0x80 value 1 means removal of an
1394 *                        object, 0 - addition of an object.
1395 *                        0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1396 * @token: "network token" structure identifying physical address of the port.
1397 * @addr_lnid: pointer to structure with MAC address and VLAN ID.
1398 *
1399 * This function is called when registrations and deregistrations are
1400 * reported by the hardware, and also when notifications are enabled -
1401 * for all currently registered addresses.
1402 */
1403static void qeth_bridge_emit_host_event(struct qeth_card *card,
1404        enum qeth_an_event_type evtype,
1405        u8 code, struct net_if_token *token, struct mac_addr_lnid *addr_lnid)
1406{
1407        char str[7][32];
1408        char *env[8];
1409        int i = 0;
1410
1411        switch (evtype) {
1412        case anev_reg_unreg:
1413                snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=%s",
1414                                (code & IPA_ADDR_CHANGE_CODE_REMOVAL)
1415                                ? "deregister" : "register");
1416                env[i] = str[i]; i++;
1417                if (code & IPA_ADDR_CHANGE_CODE_VLANID) {
1418                        snprintf(str[i], sizeof(str[i]), "VLAN=%d",
1419                                addr_lnid->lnid);
1420                        env[i] = str[i]; i++;
1421                }
1422                if (code & IPA_ADDR_CHANGE_CODE_MACADDR) {
1423                        snprintf(str[i], sizeof(str[i]), "MAC=%pM6",
1424                                &addr_lnid->mac);
1425                        env[i] = str[i]; i++;
1426                }
1427                snprintf(str[i], sizeof(str[i]), "NTOK_BUSID=%x.%x.%04x",
1428                        token->cssid, token->ssid, token->devnum);
1429                env[i] = str[i]; i++;
1430                snprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid);
1431                env[i] = str[i]; i++;
1432                snprintf(str[i], sizeof(str[i]), "NTOK_CHPID=%02x",
1433                                token->chpid);
1434                env[i] = str[i]; i++;
1435                snprintf(str[i], sizeof(str[i]), "NTOK_CHID=%04x", token->chid);
1436                env[i] = str[i]; i++;
1437                break;
1438        case anev_abort:
1439                snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=abort");
1440                env[i] = str[i]; i++;
1441                break;
1442        case anev_reset:
1443                snprintf(str[i], sizeof(str[i]), "BRIDGEDHOST=reset");
1444                env[i] = str[i]; i++;
1445                break;
1446        }
1447        env[i] = NULL;
1448        kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env);
1449}
1450
1451struct qeth_bridge_state_data {
1452        struct work_struct worker;
1453        struct qeth_card *card;
1454        struct qeth_sbp_state_change qports;
1455};
1456
1457static void qeth_bridge_state_change_worker(struct work_struct *work)
1458{
1459        struct qeth_bridge_state_data *data =
1460                container_of(work, struct qeth_bridge_state_data, worker);
1461        /* We are only interested in the first entry - local port */
1462        struct qeth_sbp_port_entry *entry = &data->qports.entry[0];
1463        char env_locrem[32];
1464        char env_role[32];
1465        char env_state[32];
1466        char *env[] = {
1467                env_locrem,
1468                env_role,
1469                env_state,
1470                NULL
1471        };
1472
1473        /* Role should not change by itself, but if it did, */
1474        /* information from the hardware is authoritative.  */
1475        mutex_lock(&data->card->conf_mutex);
1476        data->card->options.sbp.role = entry->role;
1477        mutex_unlock(&data->card->conf_mutex);
1478
1479        snprintf(env_locrem, sizeof(env_locrem), "BRIDGEPORT=statechange");
1480        snprintf(env_role, sizeof(env_role), "ROLE=%s",
1481                (entry->role == QETH_SBP_ROLE_NONE) ? "none" :
1482                (entry->role == QETH_SBP_ROLE_PRIMARY) ? "primary" :
1483                (entry->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" :
1484                "<INVALID>");
1485        snprintf(env_state, sizeof(env_state), "STATE=%s",
1486                (entry->state == QETH_SBP_STATE_INACTIVE) ? "inactive" :
1487                (entry->state == QETH_SBP_STATE_STANDBY) ? "standby" :
1488                (entry->state == QETH_SBP_STATE_ACTIVE) ? "active" :
1489                "<INVALID>");
1490        kobject_uevent_env(&data->card->gdev->dev.kobj,
1491                                KOBJ_CHANGE, env);
1492        kfree(data);
1493}
1494
1495static void qeth_bridge_state_change(struct qeth_card *card,
1496                                        struct qeth_ipa_cmd *cmd)
1497{
1498        struct qeth_sbp_state_change *qports =
1499                 &cmd->data.sbp.data.state_change;
1500        struct qeth_bridge_state_data *data;
1501        int extrasize;
1502
1503        QETH_CARD_TEXT(card, 2, "brstchng");
1504        if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1505                QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length);
1506                return;
1507        }
1508        extrasize = sizeof(struct qeth_sbp_port_entry) * qports->num_entries;
1509        data = kzalloc(sizeof(struct qeth_bridge_state_data) + extrasize,
1510                GFP_ATOMIC);
1511        if (!data) {
1512                QETH_CARD_TEXT(card, 2, "BPSalloc");
1513                return;
1514        }
1515        INIT_WORK(&data->worker, qeth_bridge_state_change_worker);
1516        data->card = card;
1517        memcpy(&data->qports, qports,
1518                        sizeof(struct qeth_sbp_state_change) + extrasize);
1519        queue_work(qeth_wq, &data->worker);
1520}
1521
1522struct qeth_bridge_host_data {
1523        struct work_struct worker;
1524        struct qeth_card *card;
1525        struct qeth_ipacmd_addr_change hostevs;
1526};
1527
1528static void qeth_bridge_host_event_worker(struct work_struct *work)
1529{
1530        struct qeth_bridge_host_data *data =
1531                container_of(work, struct qeth_bridge_host_data, worker);
1532        int i;
1533
1534        if (data->hostevs.lost_event_mask) {
1535                dev_info(&data->card->gdev->dev,
1536"Address notification from the HiperSockets Bridge Port stopped %s (%s)\n",
1537                        data->card->dev->name,
1538                        (data->hostevs.lost_event_mask == 0x01)
1539                        ? "Overflow"
1540                        : (data->hostevs.lost_event_mask == 0x02)
1541                        ? "Bridge port state change"
1542                        : "Unknown reason");
1543                mutex_lock(&data->card->conf_mutex);
1544                data->card->options.sbp.hostnotification = 0;
1545                mutex_unlock(&data->card->conf_mutex);
1546                qeth_bridge_emit_host_event(data->card, anev_abort,
1547                        0, NULL, NULL);
1548        } else
1549                for (i = 0; i < data->hostevs.num_entries; i++) {
1550                        struct qeth_ipacmd_addr_change_entry *entry =
1551                                        &data->hostevs.entry[i];
1552                        qeth_bridge_emit_host_event(data->card,
1553                                        anev_reg_unreg,
1554                                        entry->change_code,
1555                                        &entry->token, &entry->addr_lnid);
1556                }
1557        kfree(data);
1558}
1559
1560static void qeth_bridge_host_event(struct qeth_card *card,
1561                                        struct qeth_ipa_cmd *cmd)
1562{
1563        struct qeth_ipacmd_addr_change *hostevs =
1564                 &cmd->data.addrchange;
1565        struct qeth_bridge_host_data *data;
1566        int extrasize;
1567
1568        QETH_CARD_TEXT(card, 2, "brhostev");
1569        if (cmd->hdr.return_code != 0x0000) {
1570                if (cmd->hdr.return_code == 0x0010) {
1571                        if (hostevs->lost_event_mask == 0x00)
1572                                hostevs->lost_event_mask = 0xff;
1573                } else {
1574                        QETH_CARD_TEXT_(card, 2, "BPHe%04x",
1575                                cmd->hdr.return_code);
1576                        return;
1577                }
1578        }
1579        extrasize = sizeof(struct qeth_ipacmd_addr_change_entry) *
1580                                                hostevs->num_entries;
1581        data = kzalloc(sizeof(struct qeth_bridge_host_data) + extrasize,
1582                GFP_ATOMIC);
1583        if (!data) {
1584                QETH_CARD_TEXT(card, 2, "BPHalloc");
1585                return;
1586        }
1587        INIT_WORK(&data->worker, qeth_bridge_host_event_worker);
1588        data->card = card;
1589        memcpy(&data->hostevs, hostevs,
1590                        sizeof(struct qeth_ipacmd_addr_change) + extrasize);
1591        queue_work(qeth_wq, &data->worker);
1592}
1593
1594/* SETBRIDGEPORT support; sending commands */
1595
1596struct _qeth_sbp_cbctl {
1597        u16 ipa_rc;
1598        u16 cmd_rc;
1599        union {
1600                u32 supported;
1601                struct {
1602                        enum qeth_sbp_roles *role;
1603                        enum qeth_sbp_states *state;
1604                } qports;
1605        } data;
1606};
1607
1608/**
1609 * qeth_bridgeport_makerc() - derive "traditional" error from hardware codes.
1610 * @card:                     qeth_card structure pointer, for debug messages.
1611 * @cbctl:                    state structure with hardware return codes.
1612 * @setcmd:                   IPA command code
1613 *
1614 * Returns negative errno-compatible error indication or 0 on success.
1615 */
1616static int qeth_bridgeport_makerc(struct qeth_card *card,
1617        struct _qeth_sbp_cbctl *cbctl, enum qeth_ipa_sbp_cmd setcmd)
1618{
1619        int rc;
1620
1621        switch (cbctl->ipa_rc) {
1622        case IPA_RC_SUCCESS:
1623                switch (cbctl->cmd_rc) {
1624                case 0x0000:
1625                        rc = 0;
1626                        break;
1627                case 0x0004:
1628                        rc = -ENOSYS;
1629                        break;
1630                case 0x000C: /* Not configured as bridge Port */
1631                        rc = -ENODEV; /* maybe not the best code here? */
1632                        dev_err(&card->gdev->dev,
1633        "The HiperSockets device is not configured as a Bridge Port\n");
1634                        break;
1635                case 0x0014: /* Another device is Primary */
1636                        switch (setcmd) {
1637                        case IPA_SBP_SET_PRIMARY_BRIDGE_PORT:
1638                                rc = -EEXIST;
1639                                dev_err(&card->gdev->dev,
1640        "The HiperSockets LAN already has a primary Bridge Port\n");
1641                                break;
1642                        case IPA_SBP_SET_SECONDARY_BRIDGE_PORT:
1643                                rc = -EBUSY;
1644                                dev_err(&card->gdev->dev,
1645        "The HiperSockets device is already a primary Bridge Port\n");
1646                                break;
1647                        default:
1648                                rc = -EIO;
1649                        }
1650                        break;
1651                case 0x0018: /* This device is currently Secondary */
1652                        rc = -EBUSY;
1653                        dev_err(&card->gdev->dev,
1654        "The HiperSockets device is already a secondary Bridge Port\n");
1655                        break;
1656                case 0x001C: /* Limit for Secondary devices reached */
1657                        rc = -EEXIST;
1658                        dev_err(&card->gdev->dev,
1659        "The HiperSockets LAN cannot have more secondary Bridge Ports\n");
1660                        break;
1661                case 0x0024: /* This device is currently Primary */
1662                        rc = -EBUSY;
1663                        dev_err(&card->gdev->dev,
1664        "The HiperSockets device is already a primary Bridge Port\n");
1665                        break;
1666                case 0x0020: /* Not authorized by zManager */
1667                        rc = -EACCES;
1668                        dev_err(&card->gdev->dev,
1669        "The HiperSockets device is not authorized to be a Bridge Port\n");
1670                        break;
1671                default:
1672                        rc = -EIO;
1673                }
1674                break;
1675        case IPA_RC_NOTSUPP:
1676                rc = -ENOSYS;
1677                break;
1678        case IPA_RC_UNSUPPORTED_COMMAND:
1679                rc = -ENOSYS;
1680                break;
1681        default:
1682                rc = -EIO;
1683        }
1684        if (rc) {
1685                QETH_CARD_TEXT_(card, 2, "SBPi%04x", cbctl->ipa_rc);
1686                QETH_CARD_TEXT_(card, 2, "SBPc%04x", cbctl->cmd_rc);
1687        }
1688        return rc;
1689}
1690
1691static int qeth_bridgeport_query_support_cb(struct qeth_card *card,
1692        struct qeth_reply *reply, unsigned long data)
1693{
1694        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1695        struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1696        QETH_CARD_TEXT(card, 2, "brqsupcb");
1697        cbctl->ipa_rc = cmd->hdr.return_code;
1698        cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1699        if ((cbctl->ipa_rc == 0) && (cbctl->cmd_rc == 0)) {
1700                cbctl->data.supported =
1701                        cmd->data.sbp.data.query_cmds_supp.supported_cmds;
1702        } else {
1703                cbctl->data.supported = 0;
1704        }
1705        return 0;
1706}
1707
1708/**
1709 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1710 * @card:                            qeth_card structure pointer.
1711 *
1712 * Sets bitmask of supported setbridgeport subfunctions in the qeth_card
1713 * strucutre: card->options.sbp.supported_funcs.
1714 */
1715static void qeth_bridgeport_query_support(struct qeth_card *card)
1716{
1717        struct qeth_cmd_buffer *iob;
1718        struct qeth_ipa_cmd *cmd;
1719        struct _qeth_sbp_cbctl cbctl;
1720
1721        QETH_CARD_TEXT(card, 2, "brqsuppo");
1722        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
1723        if (!iob)
1724                return;
1725        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1726        cmd->data.sbp.hdr.cmdlength =
1727                sizeof(struct qeth_ipacmd_sbp_hdr) +
1728                sizeof(struct qeth_sbp_query_cmds_supp);
1729        cmd->data.sbp.hdr.command_code =
1730                IPA_SBP_QUERY_COMMANDS_SUPPORTED;
1731        cmd->data.sbp.hdr.used_total = 1;
1732        cmd->data.sbp.hdr.seq_no = 1;
1733        if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb,
1734                                                        (void *)&cbctl) ||
1735            qeth_bridgeport_makerc(card, &cbctl,
1736                                        IPA_SBP_QUERY_COMMANDS_SUPPORTED)) {
1737                /* non-zero makerc signifies failure, and produce messages */
1738                card->options.sbp.role = QETH_SBP_ROLE_NONE;
1739                return;
1740        }
1741        card->options.sbp.supported_funcs = cbctl.data.supported;
1742}
1743
1744static int qeth_bridgeport_query_ports_cb(struct qeth_card *card,
1745        struct qeth_reply *reply, unsigned long data)
1746{
1747        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
1748        struct qeth_sbp_query_ports *qports = &cmd->data.sbp.data.query_ports;
1749        struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1750
1751        QETH_CARD_TEXT(card, 2, "brqprtcb");
1752        cbctl->ipa_rc = cmd->hdr.return_code;
1753        cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1754        if ((cbctl->ipa_rc != 0) || (cbctl->cmd_rc != 0))
1755                return 0;
1756        if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1757                cbctl->cmd_rc = 0xffff;
1758                QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length);
1759                return 0;
1760        }
1761        /* first entry contains the state of the local port */
1762        if (qports->num_entries > 0) {
1763                if (cbctl->data.qports.role)
1764                        *cbctl->data.qports.role = qports->entry[0].role;
1765                if (cbctl->data.qports.state)
1766                        *cbctl->data.qports.state = qports->entry[0].state;
1767        }
1768        return 0;
1769}
1770
1771/**
1772 * qeth_bridgeport_query_ports() - query local bridgeport status.
1773 * @card:                          qeth_card structure pointer.
1774 * @role:   Role of the port: 0-none, 1-primary, 2-secondary.
1775 * @state:  State of the port: 0-inactive, 1-standby, 2-active.
1776 *
1777 * Returns negative errno-compatible error indication or 0 on success.
1778 *
1779 * 'role' and 'state' are not updated in case of hardware operation failure.
1780 */
1781int qeth_bridgeport_query_ports(struct qeth_card *card,
1782        enum qeth_sbp_roles *role, enum qeth_sbp_states *state)
1783{
1784        int rc = 0;
1785        struct qeth_cmd_buffer *iob;
1786        struct qeth_ipa_cmd *cmd;
1787        struct _qeth_sbp_cbctl cbctl = {
1788                .data = {
1789                        .qports = {
1790                                .role = role,
1791                                .state = state,
1792                        },
1793                },
1794        };
1795
1796        QETH_CARD_TEXT(card, 2, "brqports");
1797        if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS))
1798                return -EOPNOTSUPP;
1799        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
1800        if (!iob)
1801                return -ENOMEM;
1802        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1803        cmd->data.sbp.hdr.cmdlength =
1804                sizeof(struct qeth_ipacmd_sbp_hdr);
1805        cmd->data.sbp.hdr.command_code =
1806                IPA_SBP_QUERY_BRIDGE_PORTS;
1807        cmd->data.sbp.hdr.used_total = 1;
1808        cmd->data.sbp.hdr.seq_no = 1;
1809        rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb,
1810                                (void *)&cbctl);
1811        if (rc)
1812                return rc;
1813        rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS);
1814        return rc;
1815}
1816EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports);
1817
1818static int qeth_bridgeport_set_cb(struct qeth_card *card,
1819        struct qeth_reply *reply, unsigned long data)
1820{
1821        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
1822        struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param;
1823        QETH_CARD_TEXT(card, 2, "brsetrcb");
1824        cbctl->ipa_rc = cmd->hdr.return_code;
1825        cbctl->cmd_rc = cmd->data.sbp.hdr.return_code;
1826        return 0;
1827}
1828
1829/**
1830 * qeth_bridgeport_setrole() - Assign primary role to the port.
1831 * @card:                      qeth_card structure pointer.
1832 * @role:                      Role to assign.
1833 *
1834 * Returns negative errno-compatible error indication or 0 on success.
1835 */
1836int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role)
1837{
1838        int rc = 0;
1839        int cmdlength;
1840        struct qeth_cmd_buffer *iob;
1841        struct qeth_ipa_cmd *cmd;
1842        struct _qeth_sbp_cbctl cbctl;
1843        enum qeth_ipa_sbp_cmd setcmd;
1844
1845        QETH_CARD_TEXT(card, 2, "brsetrol");
1846        switch (role) {
1847        case QETH_SBP_ROLE_NONE:
1848                setcmd = IPA_SBP_RESET_BRIDGE_PORT_ROLE;
1849                cmdlength =  sizeof(struct qeth_ipacmd_sbp_hdr) +
1850                        sizeof(struct qeth_sbp_reset_role);
1851                break;
1852        case QETH_SBP_ROLE_PRIMARY:
1853                setcmd = IPA_SBP_SET_PRIMARY_BRIDGE_PORT;
1854                cmdlength =  sizeof(struct qeth_ipacmd_sbp_hdr) +
1855                        sizeof(struct qeth_sbp_set_primary);
1856                break;
1857        case QETH_SBP_ROLE_SECONDARY:
1858                setcmd = IPA_SBP_SET_SECONDARY_BRIDGE_PORT;
1859                cmdlength =  sizeof(struct qeth_ipacmd_sbp_hdr) +
1860                        sizeof(struct qeth_sbp_set_secondary);
1861                break;
1862        default:
1863                return -EINVAL;
1864        }
1865        if (!(card->options.sbp.supported_funcs & setcmd))
1866                return -EOPNOTSUPP;
1867        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0);
1868        if (!iob)
1869                return -ENOMEM;
1870        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
1871        cmd->data.sbp.hdr.cmdlength = cmdlength;
1872        cmd->data.sbp.hdr.command_code = setcmd;
1873        cmd->data.sbp.hdr.used_total = 1;
1874        cmd->data.sbp.hdr.seq_no = 1;
1875        rc = qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb,
1876                                (void *)&cbctl);
1877        if (rc)
1878                return rc;
1879        rc = qeth_bridgeport_makerc(card, &cbctl, setcmd);
1880        return rc;
1881}
1882
1883/**
1884 * qeth_anset_makerc() - derive "traditional" error from hardware codes.
1885 * @card:                     qeth_card structure pointer, for debug messages.
1886 *
1887 * Returns negative errno-compatible error indication or 0 on success.
1888 */
1889static int qeth_anset_makerc(struct qeth_card *card, int pnso_rc, u16 response)
1890{
1891        int rc;
1892
1893        if (pnso_rc == 0)
1894                switch (response) {
1895                case 0x0001:
1896                        rc = 0;
1897                        break;
1898                case 0x0004:
1899                case 0x0100:
1900                case 0x0106:
1901                        rc = -ENOSYS;
1902                        dev_err(&card->gdev->dev,
1903                                "Setting address notification failed\n");
1904                        break;
1905                case 0x0107:
1906                        rc = -EAGAIN;
1907                        break;
1908                default:
1909                        rc = -EIO;
1910                }
1911        else
1912                rc = -EIO;
1913
1914        if (rc) {
1915                QETH_CARD_TEXT_(card, 2, "SBPp%04x", pnso_rc);
1916                QETH_CARD_TEXT_(card, 2, "SBPr%04x", response);
1917        }
1918        return rc;
1919}
1920
1921static void qeth_bridgeport_an_set_cb(void *priv,
1922                enum qdio_brinfo_entry_type type, void *entry)
1923{
1924        struct qeth_card *card = (struct qeth_card *)priv;
1925        struct qdio_brinfo_entry_l2 *l2entry;
1926        u8 code;
1927
1928        if (type != l2_addr_lnid) {
1929                WARN_ON_ONCE(1);
1930                return;
1931        }
1932
1933        l2entry = (struct qdio_brinfo_entry_l2 *)entry;
1934        code = IPA_ADDR_CHANGE_CODE_MACADDR;
1935        if (l2entry->addr_lnid.lnid)
1936                code |= IPA_ADDR_CHANGE_CODE_VLANID;
1937        qeth_bridge_emit_host_event(card, anev_reg_unreg, code,
1938                (struct net_if_token *)&l2entry->nit,
1939                (struct mac_addr_lnid *)&l2entry->addr_lnid);
1940}
1941
1942/**
1943 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1944 * @card:                     qeth_card structure pointer.
1945 * @enable:                   0 - disable, non-zero - enable notifications
1946 *
1947 * Returns negative errno-compatible error indication or 0 on success.
1948 *
1949 * On enable, emits a series of address notifications udev events for all
1950 * currently registered hosts.
1951 */
1952int qeth_bridgeport_an_set(struct qeth_card *card, int enable)
1953{
1954        int rc;
1955        u16 response;
1956        struct ccw_device *ddev;
1957        struct subchannel_id schid;
1958
1959        if (!card)
1960                return -EINVAL;
1961        if (!card->options.sbp.supported_funcs)
1962                return -EOPNOTSUPP;
1963        ddev = CARD_DDEV(card);
1964        ccw_device_get_schid(ddev, &schid);
1965
1966        if (enable) {
1967                qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL);
1968                rc = qdio_pnso_brinfo(schid, 1, &response,
1969                        qeth_bridgeport_an_set_cb, card);
1970        } else
1971                rc = qdio_pnso_brinfo(schid, 0, &response, NULL, NULL);
1972        return qeth_anset_makerc(card, rc, response);
1973}
1974EXPORT_SYMBOL_GPL(qeth_bridgeport_an_set);
1975
1976module_init(qeth_l2_init);
1977module_exit(qeth_l2_exit);
1978MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
1979MODULE_DESCRIPTION("qeth layer 2 discipline");
1980MODULE_LICENSE("GPL");
1981