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