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