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