linux/drivers/s390/net/qeth_l2_main.c
<<
>>
Prefs
   1/*
   2 *  drivers/s390/net/qeth_l2_main.c
   3 *
   4 *    Copyright IBM Corp. 2007, 2009
   5 *    Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
   6 *               Frank Pavlic <fpavlic@de.ibm.com>,
   7 *               Thomas Spatzier <tspat@de.ibm.com>,
   8 *               Frank Blaschka <frank.blaschka@de.ibm.com>
   9 */
  10
  11#define KMSG_COMPONENT "qeth"
  12#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  13
  14#include <linux/module.h>
  15#include <linux/moduleparam.h>
  16#include <linux/string.h>
  17#include <linux/errno.h>
  18#include <linux/kernel.h>
  19#include <linux/slab.h>
  20#include <linux/etherdevice.h>
  21#include <linux/mii.h>
  22#include <linux/ip.h>
  23#include <linux/list.h>
  24
  25#include "qeth_core.h"
  26
  27static int qeth_l2_set_offline(struct ccwgroup_device *);
  28static int qeth_l2_stop(struct net_device *);
  29static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
  30static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
  31                           enum qeth_ipa_cmds,
  32                           int (*reply_cb) (struct qeth_card *,
  33                                            struct qeth_reply*,
  34                                            unsigned long));
  35static void qeth_l2_set_multicast_list(struct net_device *);
  36static int qeth_l2_recover(void *);
  37
  38static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  39{
  40        struct qeth_card *card = dev->ml_priv;
  41        struct mii_ioctl_data *mii_data;
  42        int rc = 0;
  43
  44        if (!card)
  45                return -ENODEV;
  46
  47        if ((card->state != CARD_STATE_UP) &&
  48                (card->state != CARD_STATE_SOFTSETUP))
  49                return -ENODEV;
  50
  51        if (card->info.type == QETH_CARD_TYPE_OSN)
  52                return -EPERM;
  53
  54        switch (cmd) {
  55        case SIOC_QETH_ADP_SET_SNMP_CONTROL:
  56                rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
  57                break;
  58        case SIOC_QETH_GET_CARD_TYPE:
  59                if ((card->info.type == QETH_CARD_TYPE_OSD ||
  60                     card->info.type == QETH_CARD_TYPE_OSM ||
  61                     card->info.type == QETH_CARD_TYPE_OSX) &&
  62                    !card->info.guestlan)
  63                        return 1;
  64                return 0;
  65                break;
  66        case SIOCGMIIPHY:
  67                mii_data = if_mii(rq);
  68                mii_data->phy_id = 0;
  69                break;
  70        case SIOCGMIIREG:
  71                mii_data = if_mii(rq);
  72                if (mii_data->phy_id != 0)
  73                        rc = -EINVAL;
  74                else
  75                        mii_data->val_out = qeth_mdio_read(dev,
  76                                mii_data->phy_id, mii_data->reg_num);
  77                break;
  78        default:
  79                rc = -EOPNOTSUPP;
  80        }
  81        if (rc)
  82                QETH_CARD_TEXT_(card, 2, "ioce%d", rc);
  83        return rc;
  84}
  85
  86static int qeth_l2_verify_dev(struct net_device *dev)
  87{
  88        struct qeth_card *card;
  89        unsigned long flags;
  90        int rc = 0;
  91
  92        read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
  93        list_for_each_entry(card, &qeth_core_card_list.list, list) {
  94                if (card->dev == dev) {
  95                        rc = QETH_REAL_CARD;
  96                        break;
  97                }
  98        }
  99        read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
 100
 101        return rc;
 102}
 103
 104static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
 105{
 106        struct qeth_card *card;
 107        struct net_device *ndev;
 108        __u16 temp_dev_no;
 109        unsigned long flags;
 110        struct ccw_dev_id read_devid;
 111
 112        ndev = NULL;
 113        memcpy(&temp_dev_no, read_dev_no, 2);
 114        read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
 115        list_for_each_entry(card, &qeth_core_card_list.list, list) {
 116                ccw_device_get_id(CARD_RDEV(card), &read_devid);
 117                if (read_devid.devno == temp_dev_no) {
 118                        ndev = card->dev;
 119                        break;
 120                }
 121        }
 122        read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
 123        return ndev;
 124}
 125
 126static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,
 127                                struct qeth_reply *reply,
 128                                unsigned long data)
 129{
 130        struct qeth_ipa_cmd *cmd;
 131        __u8 *mac;
 132
 133        QETH_CARD_TEXT(card, 2, "L2Sgmacb");
 134        cmd = (struct qeth_ipa_cmd *) data;
 135        mac = &cmd->data.setdelmac.mac[0];
 136        /* MAC already registered, needed in couple/uncouple case */
 137        if (cmd->hdr.return_code ==  IPA_RC_L2_DUP_MAC) {
 138                QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n",
 139                          mac, QETH_CARD_IFNAME(card));
 140                cmd->hdr.return_code = 0;
 141        }
 142        if (cmd->hdr.return_code)
 143                QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n",
 144                          mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
 145        return 0;
 146}
 147
 148static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
 149{
 150        QETH_CARD_TEXT(card, 2, "L2Sgmac");
 151        return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,
 152                                          qeth_l2_send_setgroupmac_cb);
 153}
 154
 155static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,
 156                                struct qeth_reply *reply,
 157                                unsigned long data)
 158{
 159        struct qeth_ipa_cmd *cmd;
 160        __u8 *mac;
 161
 162        QETH_CARD_TEXT(card, 2, "L2Dgmacb");
 163        cmd = (struct qeth_ipa_cmd *) data;
 164        mac = &cmd->data.setdelmac.mac[0];
 165        if (cmd->hdr.return_code)
 166                QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n",
 167                          mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code);
 168        return 0;
 169}
 170
 171static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
 172{
 173        QETH_CARD_TEXT(card, 2, "L2Dgmac");
 174        return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,
 175                                          qeth_l2_send_delgroupmac_cb);
 176}
 177
 178static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac)
 179{
 180        struct qeth_mc_mac *mc;
 181        int rc;
 182
 183        mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
 184
 185        if (!mc)
 186                return;
 187
 188        memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
 189        mc->mc_addrlen = OSA_ADDR_LEN;
 190        mc->is_vmac = vmac;
 191
 192        if (vmac) {
 193                rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
 194                                        NULL);
 195        } else {
 196                rc = qeth_l2_send_setgroupmac(card, mac);
 197        }
 198
 199        if (!rc)
 200                list_add_tail(&mc->list, &card->mc_list);
 201        else
 202                kfree(mc);
 203}
 204
 205static void qeth_l2_del_all_mc(struct qeth_card *card)
 206{
 207        struct qeth_mc_mac *mc, *tmp;
 208
 209        spin_lock_bh(&card->mclock);
 210        list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
 211                if (mc->is_vmac)
 212                        qeth_l2_send_setdelmac(card, mc->mc_addr,
 213                                        IPA_CMD_DELVMAC, NULL);
 214                else
 215                        qeth_l2_send_delgroupmac(card, mc->mc_addr);
 216                list_del(&mc->list);
 217                kfree(mc);
 218        }
 219        spin_unlock_bh(&card->mclock);
 220}
 221
 222static inline int qeth_l2_get_cast_type(struct qeth_card *card,
 223                        struct sk_buff *skb)
 224{
 225        if (card->info.type == QETH_CARD_TYPE_OSN)
 226                return RTN_UNSPEC;
 227        if (is_broadcast_ether_addr(skb->data))
 228                return RTN_BROADCAST;
 229        if (is_multicast_ether_addr(skb->data))
 230                return RTN_MULTICAST;
 231        return RTN_UNSPEC;
 232}
 233
 234static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
 235                        struct sk_buff *skb, int ipv, int cast_type)
 236{
 237        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb_mac_header(skb);
 238
 239        memset(hdr, 0, sizeof(struct qeth_hdr));
 240        hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
 241
 242        /* set byte byte 3 to casting flags */
 243        if (cast_type == RTN_MULTICAST)
 244                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
 245        else if (cast_type == RTN_BROADCAST)
 246                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
 247        else
 248                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
 249
 250        hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
 251        /* VSWITCH relies on the VLAN
 252         * information to be present in
 253         * the QDIO header */
 254        if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
 255                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
 256                hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
 257        }
 258}
 259
 260static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
 261                        struct qeth_reply *reply, unsigned long data)
 262{
 263        struct qeth_ipa_cmd *cmd;
 264
 265        QETH_CARD_TEXT(card, 2, "L2sdvcb");
 266        cmd = (struct qeth_ipa_cmd *) data;
 267        if (cmd->hdr.return_code) {
 268                QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "
 269                          "Continuing\n", cmd->data.setdelvlan.vlan_id,
 270                          QETH_CARD_IFNAME(card), cmd->hdr.return_code);
 271                QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
 272                QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
 273        }
 274        return 0;
 275}
 276
 277static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
 278                                enum qeth_ipa_cmds ipacmd)
 279{
 280        struct qeth_ipa_cmd *cmd;
 281        struct qeth_cmd_buffer *iob;
 282
 283        QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);
 284        iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
 285        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
 286        cmd->data.setdelvlan.vlan_id = i;
 287        return qeth_send_ipa_cmd(card, iob,
 288                                 qeth_l2_send_setdelvlan_cb, NULL);
 289}
 290
 291static void qeth_l2_process_vlans(struct qeth_card *card, int clear)
 292{
 293        struct qeth_vlan_vid *id;
 294        QETH_CARD_TEXT(card, 3, "L2prcvln");
 295        spin_lock_bh(&card->vlanlock);
 296        list_for_each_entry(id, &card->vid_list, list) {
 297                if (clear)
 298                        qeth_l2_send_setdelvlan(card, id->vid,
 299                                IPA_CMD_DELVLAN);
 300                else
 301                        qeth_l2_send_setdelvlan(card, id->vid,
 302                                IPA_CMD_SETVLAN);
 303        }
 304        spin_unlock_bh(&card->vlanlock);
 305}
 306
 307static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
 308{
 309        struct qeth_card *card = dev->ml_priv;
 310        struct qeth_vlan_vid *id;
 311
 312        QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
 313        if (!vid)
 314                return;
 315        if (card->info.type == QETH_CARD_TYPE_OSM) {
 316                QETH_CARD_TEXT(card, 3, "aidOSM");
 317                return;
 318        }
 319        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 320                QETH_CARD_TEXT(card, 3, "aidREC");
 321                return;
 322        }
 323        id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
 324        if (id) {
 325                id->vid = vid;
 326                qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
 327                spin_lock_bh(&card->vlanlock);
 328                list_add_tail(&id->list, &card->vid_list);
 329                spin_unlock_bh(&card->vlanlock);
 330        }
 331}
 332
 333static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 334{
 335        struct qeth_vlan_vid *id, *tmpid = NULL;
 336        struct qeth_card *card = dev->ml_priv;
 337
 338        QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
 339        if (card->info.type == QETH_CARD_TYPE_OSM) {
 340                QETH_CARD_TEXT(card, 3, "kidOSM");
 341                return;
 342        }
 343        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 344                QETH_CARD_TEXT(card, 3, "kidREC");
 345                return;
 346        }
 347        spin_lock_bh(&card->vlanlock);
 348        list_for_each_entry(id, &card->vid_list, list) {
 349                if (id->vid == vid) {
 350                        list_del(&id->list);
 351                        tmpid = id;
 352                        break;
 353                }
 354        }
 355        spin_unlock_bh(&card->vlanlock);
 356        if (tmpid) {
 357                qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
 358                kfree(tmpid);
 359        }
 360        qeth_l2_set_multicast_list(card->dev);
 361}
 362
 363static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
 364{
 365        int rc = 0;
 366
 367        QETH_DBF_TEXT(SETUP , 2, "stopcard");
 368        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 369
 370        qeth_set_allowed_threads(card, 0, 1);
 371        if (card->read.state == CH_STATE_UP &&
 372            card->write.state == CH_STATE_UP &&
 373            (card->state == CARD_STATE_UP)) {
 374                if (recovery_mode &&
 375                    card->info.type != QETH_CARD_TYPE_OSN) {
 376                        qeth_l2_stop(card->dev);
 377                } else {
 378                        rtnl_lock();
 379                        dev_close(card->dev);
 380                        rtnl_unlock();
 381                }
 382                if (!card->use_hard_stop ||
 383                        recovery_mode) {
 384                        __u8 *mac = &card->dev->dev_addr[0];
 385                        rc = qeth_l2_send_delmac(card, mac);
 386                        QETH_DBF_TEXT_(SETUP, 2, "Lerr%d", rc);
 387                }
 388                card->state = CARD_STATE_SOFTSETUP;
 389        }
 390        if (card->state == CARD_STATE_SOFTSETUP) {
 391                qeth_l2_process_vlans(card, 1);
 392                if (!card->use_hard_stop ||
 393                        recovery_mode)
 394                        qeth_l2_del_all_mc(card);
 395                qeth_clear_ipacmd_list(card);
 396                card->state = CARD_STATE_HARDSETUP;
 397        }
 398        if (card->state == CARD_STATE_HARDSETUP) {
 399                qeth_qdio_clear_card(card, 0);
 400                qeth_clear_qdio_buffers(card);
 401                qeth_clear_working_pool_list(card);
 402                card->state = CARD_STATE_DOWN;
 403        }
 404        if (card->state == CARD_STATE_DOWN) {
 405                qeth_clear_cmd_buffers(&card->read);
 406                qeth_clear_cmd_buffers(&card->write);
 407        }
 408        card->use_hard_stop = 0;
 409        return rc;
 410}
 411
 412static int qeth_l2_process_inbound_buffer(struct qeth_card *card,
 413                                int budget, int *done)
 414{
 415        int work_done = 0;
 416        struct sk_buff *skb;
 417        struct qeth_hdr *hdr;
 418        unsigned int len;
 419
 420        *done = 0;
 421        BUG_ON(!budget);
 422        while (budget) {
 423                skb = qeth_core_get_next_skb(card,
 424                        card->qdio.in_q->bufs[card->rx.b_index].buffer,
 425                        &card->rx.b_element, &card->rx.e_offset, &hdr);
 426                if (!skb) {
 427                        *done = 1;
 428                        break;
 429                }
 430                skb->dev = card->dev;
 431                switch (hdr->hdr.l2.id) {
 432                case QETH_HEADER_TYPE_LAYER2:
 433                        skb->pkt_type = PACKET_HOST;
 434                        skb->protocol = eth_type_trans(skb, skb->dev);
 435                        if (card->options.checksum_type == NO_CHECKSUMMING)
 436                                skb->ip_summed = CHECKSUM_UNNECESSARY;
 437                        else
 438                                skb->ip_summed = CHECKSUM_NONE;
 439                        if (skb->protocol == htons(ETH_P_802_2))
 440                                *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
 441                        len = skb->len;
 442                        netif_receive_skb(skb);
 443                        break;
 444                case QETH_HEADER_TYPE_OSN:
 445                        if (card->info.type == QETH_CARD_TYPE_OSN) {
 446                                skb_push(skb, sizeof(struct qeth_hdr));
 447                                skb_copy_to_linear_data(skb, hdr,
 448                                                sizeof(struct qeth_hdr));
 449                                len = skb->len;
 450                                card->osn_info.data_cb(skb);
 451                                break;
 452                        }
 453                        /* else unknown */
 454                default:
 455                        dev_kfree_skb_any(skb);
 456                        QETH_CARD_TEXT(card, 3, "inbunkno");
 457                        QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
 458                        continue;
 459                }
 460                work_done++;
 461                budget--;
 462                card->stats.rx_packets++;
 463                card->stats.rx_bytes += len;
 464        }
 465        return work_done;
 466}
 467
 468static int qeth_l2_poll(struct napi_struct *napi, int budget)
 469{
 470        struct qeth_card *card = container_of(napi, struct qeth_card, napi);
 471        int work_done = 0;
 472        struct qeth_qdio_buffer *buffer;
 473        int done;
 474        int new_budget = budget;
 475
 476        if (card->options.performance_stats) {
 477                card->perf_stats.inbound_cnt++;
 478                card->perf_stats.inbound_start_time = qeth_get_micros();
 479        }
 480
 481        while (1) {
 482                if (!card->rx.b_count) {
 483                        card->rx.qdio_err = 0;
 484                        card->rx.b_count = qdio_get_next_buffers(
 485                                card->data.ccwdev, 0, &card->rx.b_index,
 486                                &card->rx.qdio_err);
 487                        if (card->rx.b_count <= 0) {
 488                                card->rx.b_count = 0;
 489                                break;
 490                        }
 491                        card->rx.b_element =
 492                                &card->qdio.in_q->bufs[card->rx.b_index]
 493                                .buffer->element[0];
 494                        card->rx.e_offset = 0;
 495                }
 496
 497                while (card->rx.b_count) {
 498                        buffer = &card->qdio.in_q->bufs[card->rx.b_index];
 499                        if (!(card->rx.qdio_err &&
 500                            qeth_check_qdio_errors(card, buffer->buffer,
 501                            card->rx.qdio_err, "qinerr")))
 502                                work_done += qeth_l2_process_inbound_buffer(
 503                                        card, new_budget, &done);
 504                        else
 505                                done = 1;
 506
 507                        if (done) {
 508                                if (card->options.performance_stats)
 509                                        card->perf_stats.bufs_rec++;
 510                                qeth_put_buffer_pool_entry(card,
 511                                        buffer->pool_entry);
 512                                qeth_queue_input_buffer(card, card->rx.b_index);
 513                                card->rx.b_count--;
 514                                if (card->rx.b_count) {
 515                                        card->rx.b_index =
 516                                                (card->rx.b_index + 1) %
 517                                                QDIO_MAX_BUFFERS_PER_Q;
 518                                        card->rx.b_element =
 519                                                &card->qdio.in_q
 520                                                ->bufs[card->rx.b_index]
 521                                                .buffer->element[0];
 522                                        card->rx.e_offset = 0;
 523                                }
 524                        }
 525
 526                        if (work_done >= budget)
 527                                goto out;
 528                        else
 529                                new_budget = budget - work_done;
 530                }
 531        }
 532
 533        napi_complete(napi);
 534        if (qdio_start_irq(card->data.ccwdev, 0))
 535                napi_schedule(&card->napi);
 536out:
 537        if (card->options.performance_stats)
 538                card->perf_stats.inbound_time += qeth_get_micros() -
 539                        card->perf_stats.inbound_start_time;
 540        return work_done;
 541}
 542
 543static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
 544                           enum qeth_ipa_cmds ipacmd,
 545                           int (*reply_cb) (struct qeth_card *,
 546                                            struct qeth_reply*,
 547                                            unsigned long))
 548{
 549        struct qeth_ipa_cmd *cmd;
 550        struct qeth_cmd_buffer *iob;
 551
 552        QETH_CARD_TEXT(card, 2, "L2sdmac");
 553        iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
 554        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
 555        cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
 556        memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
 557        return qeth_send_ipa_cmd(card, iob, reply_cb, NULL);
 558}
 559
 560static int qeth_l2_send_setmac_cb(struct qeth_card *card,
 561                           struct qeth_reply *reply,
 562                           unsigned long data)
 563{
 564        struct qeth_ipa_cmd *cmd;
 565
 566        QETH_CARD_TEXT(card, 2, "L2Smaccb");
 567        cmd = (struct qeth_ipa_cmd *) data;
 568        if (cmd->hdr.return_code) {
 569                QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code);
 570                card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 571                switch (cmd->hdr.return_code) {
 572                case IPA_RC_L2_DUP_MAC:
 573                case IPA_RC_L2_DUP_LAYER3_MAC:
 574                        dev_warn(&card->gdev->dev,
 575                                "MAC address %pM already exists\n",
 576                                cmd->data.setdelmac.mac);
 577                        break;
 578                case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP:
 579                case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP:
 580                        dev_warn(&card->gdev->dev,
 581                                "MAC address %pM is not authorized\n",
 582                                cmd->data.setdelmac.mac);
 583                        break;
 584                default:
 585                        break;
 586                }
 587                cmd->hdr.return_code = -EIO;
 588        } else {
 589                card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
 590                memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac,
 591                       OSA_ADDR_LEN);
 592                dev_info(&card->gdev->dev,
 593                        "MAC address %pM successfully registered on device %s\n",
 594                        card->dev->dev_addr, card->dev->name);
 595        }
 596        return 0;
 597}
 598
 599static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
 600{
 601        QETH_CARD_TEXT(card, 2, "L2Setmac");
 602        return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
 603                                          qeth_l2_send_setmac_cb);
 604}
 605
 606static int qeth_l2_send_delmac_cb(struct qeth_card *card,
 607                           struct qeth_reply *reply,
 608                           unsigned long data)
 609{
 610        struct qeth_ipa_cmd *cmd;
 611
 612        QETH_CARD_TEXT(card, 2, "L2Dmaccb");
 613        cmd = (struct qeth_ipa_cmd *) data;
 614        if (cmd->hdr.return_code) {
 615                QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
 616                cmd->hdr.return_code = -EIO;
 617                return 0;
 618        }
 619        card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
 620
 621        return 0;
 622}
 623
 624static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
 625{
 626        QETH_CARD_TEXT(card, 2, "L2Delmac");
 627        if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
 628                return 0;
 629        return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
 630                                          qeth_l2_send_delmac_cb);
 631}
 632
 633static int qeth_l2_request_initial_mac(struct qeth_card *card)
 634{
 635        int rc = 0;
 636        char vendor_pre[] = {0x02, 0x00, 0x00};
 637
 638        QETH_DBF_TEXT(SETUP, 2, "doL2init");
 639        QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
 640
 641        rc = qeth_query_setadapterparms(card);
 642        if (rc) {
 643                QETH_DBF_MESSAGE(2, "could not query adapter parameters on "
 644                        "device %s: x%x\n", CARD_BUS_ID(card), rc);
 645        }
 646
 647        if (card->info.type == QETH_CARD_TYPE_IQD ||
 648            card->info.type == QETH_CARD_TYPE_OSM ||
 649            card->info.type == QETH_CARD_TYPE_OSX ||
 650            card->info.guestlan) {
 651                rc = qeth_setadpparms_change_macaddr(card);
 652                if (rc) {
 653                        QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
 654                                "device %s: x%x\n", CARD_BUS_ID(card), rc);
 655                        QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
 656                        return rc;
 657                }
 658                QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
 659        } else {
 660                random_ether_addr(card->dev->dev_addr);
 661                memcpy(card->dev->dev_addr, vendor_pre, 3);
 662        }
 663        return 0;
 664}
 665
 666static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
 667{
 668        struct sockaddr *addr = p;
 669        struct qeth_card *card = dev->ml_priv;
 670        int rc = 0;
 671
 672        QETH_CARD_TEXT(card, 3, "setmac");
 673
 674        if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
 675                QETH_CARD_TEXT(card, 3, "setmcINV");
 676                return -EOPNOTSUPP;
 677        }
 678
 679        if (card->info.type == QETH_CARD_TYPE_OSN ||
 680            card->info.type == QETH_CARD_TYPE_OSM ||
 681            card->info.type == QETH_CARD_TYPE_OSX) {
 682                QETH_CARD_TEXT(card, 3, "setmcTYP");
 683                return -EOPNOTSUPP;
 684        }
 685        QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);
 686        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 687                QETH_CARD_TEXT(card, 3, "setmcREC");
 688                return -ERESTARTSYS;
 689        }
 690        rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
 691        if (!rc)
 692                rc = qeth_l2_send_setmac(card, addr->sa_data);
 693        return rc;
 694}
 695
 696static void qeth_l2_set_multicast_list(struct net_device *dev)
 697{
 698        struct qeth_card *card = dev->ml_priv;
 699        struct netdev_hw_addr *ha;
 700
 701        if (card->info.type == QETH_CARD_TYPE_OSN)
 702                return ;
 703
 704        QETH_CARD_TEXT(card, 3, "setmulti");
 705        if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&
 706            (card->state != CARD_STATE_UP))
 707                return;
 708        qeth_l2_del_all_mc(card);
 709        spin_lock_bh(&card->mclock);
 710        netdev_for_each_mc_addr(ha, dev)
 711                qeth_l2_add_mc(card, ha->addr, 0);
 712
 713        netdev_for_each_uc_addr(ha, dev)
 714                qeth_l2_add_mc(card, ha->addr, 1);
 715
 716        spin_unlock_bh(&card->mclock);
 717        if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
 718                return;
 719        qeth_setadp_promisc_mode(card);
 720}
 721
 722static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 723{
 724        int rc;
 725        struct qeth_hdr *hdr = NULL;
 726        int elements = 0;
 727        struct qeth_card *card = dev->ml_priv;
 728        struct sk_buff *new_skb = skb;
 729        int ipv = qeth_get_ip_version(skb);
 730        int cast_type = qeth_l2_get_cast_type(card, skb);
 731        struct qeth_qdio_out_q *queue = card->qdio.out_qs
 732                [qeth_get_priority_queue(card, skb, ipv, cast_type)];
 733        int tx_bytes = skb->len;
 734        int data_offset = -1;
 735        int elements_needed = 0;
 736        int hd_len = 0;
 737
 738        if ((card->state != CARD_STATE_UP) || !card->lan_online) {
 739                card->stats.tx_carrier_errors++;
 740                goto tx_drop;
 741        }
 742
 743        if ((card->info.type == QETH_CARD_TYPE_OSN) &&
 744            (skb->protocol == htons(ETH_P_IPV6)))
 745                goto tx_drop;
 746
 747        if (card->options.performance_stats) {
 748                card->perf_stats.outbound_cnt++;
 749                card->perf_stats.outbound_start_time = qeth_get_micros();
 750        }
 751        netif_stop_queue(dev);
 752
 753        if (card->info.type == QETH_CARD_TYPE_OSN)
 754                hdr = (struct qeth_hdr *)skb->data;
 755        else {
 756                if (card->info.type == QETH_CARD_TYPE_IQD) {
 757                        new_skb = skb;
 758                        data_offset = ETH_HLEN;
 759                        hd_len = ETH_HLEN;
 760                        hdr = kmem_cache_alloc(qeth_core_header_cache,
 761                                                GFP_ATOMIC);
 762                        if (!hdr)
 763                                goto tx_drop;
 764                        elements_needed++;
 765                        skb_reset_mac_header(new_skb);
 766                        qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type);
 767                        hdr->hdr.l2.pkt_length = new_skb->len;
 768                        memcpy(((char *)hdr) + sizeof(struct qeth_hdr),
 769                                skb_mac_header(new_skb), ETH_HLEN);
 770                } else {
 771                        /* create a clone with writeable headroom */
 772                        new_skb = skb_realloc_headroom(skb,
 773                                                sizeof(struct qeth_hdr));
 774                        if (!new_skb)
 775                                goto tx_drop;
 776                        hdr = (struct qeth_hdr *)skb_push(new_skb,
 777                                                sizeof(struct qeth_hdr));
 778                        skb_set_mac_header(new_skb, sizeof(struct qeth_hdr));
 779                        qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type);
 780                }
 781        }
 782
 783        elements = qeth_get_elements_no(card, (void *)hdr, new_skb,
 784                                                elements_needed);
 785        if (!elements) {
 786                if (data_offset >= 0)
 787                        kmem_cache_free(qeth_core_header_cache, hdr);
 788                goto tx_drop;
 789        }
 790
 791        if (card->info.type != QETH_CARD_TYPE_IQD) {
 792                if (qeth_hdr_chk_and_bounce(new_skb,
 793                    sizeof(struct qeth_hdr_layer2)))
 794                        goto tx_drop;
 795                rc = qeth_do_send_packet(card, queue, new_skb, hdr,
 796                                         elements);
 797        } else
 798                rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
 799                                        elements, data_offset, hd_len);
 800        if (!rc) {
 801                card->stats.tx_packets++;
 802                card->stats.tx_bytes += tx_bytes;
 803                if (new_skb != skb)
 804                        dev_kfree_skb_any(skb);
 805                rc = NETDEV_TX_OK;
 806        } else {
 807                if (data_offset >= 0)
 808                        kmem_cache_free(qeth_core_header_cache, hdr);
 809
 810                if (rc == -EBUSY) {
 811                        if (new_skb != skb)
 812                                dev_kfree_skb_any(new_skb);
 813                        return NETDEV_TX_BUSY;
 814                } else
 815                        goto tx_drop;
 816        }
 817
 818        netif_wake_queue(dev);
 819        if (card->options.performance_stats)
 820                card->perf_stats.outbound_time += qeth_get_micros() -
 821                        card->perf_stats.outbound_start_time;
 822        return rc;
 823
 824tx_drop:
 825        card->stats.tx_dropped++;
 826        card->stats.tx_errors++;
 827        if ((new_skb != skb) && new_skb)
 828                dev_kfree_skb_any(new_skb);
 829        dev_kfree_skb_any(skb);
 830        netif_wake_queue(dev);
 831        return NETDEV_TX_OK;
 832}
 833
 834static int __qeth_l2_open(struct net_device *dev)
 835{
 836        struct qeth_card *card = dev->ml_priv;
 837        int rc = 0;
 838
 839        QETH_CARD_TEXT(card, 4, "qethopen");
 840        if (card->state == CARD_STATE_UP)
 841                return rc;
 842        if (card->state != CARD_STATE_SOFTSETUP)
 843                return -ENODEV;
 844
 845        if ((card->info.type != QETH_CARD_TYPE_OSN) &&
 846             (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
 847                QETH_CARD_TEXT(card, 4, "nomacadr");
 848                return -EPERM;
 849        }
 850        card->data.state = CH_STATE_UP;
 851        card->state = CARD_STATE_UP;
 852        netif_start_queue(dev);
 853
 854        if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) {
 855                napi_enable(&card->napi);
 856                napi_schedule(&card->napi);
 857        } else
 858                rc = -EIO;
 859        return rc;
 860}
 861
 862static int qeth_l2_open(struct net_device *dev)
 863{
 864        struct qeth_card *card = dev->ml_priv;
 865
 866        QETH_CARD_TEXT(card, 5, "qethope_");
 867        if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
 868                QETH_CARD_TEXT(card, 3, "openREC");
 869                return -ERESTARTSYS;
 870        }
 871        return __qeth_l2_open(dev);
 872}
 873
 874static int qeth_l2_stop(struct net_device *dev)
 875{
 876        struct qeth_card *card = dev->ml_priv;
 877
 878        QETH_CARD_TEXT(card, 4, "qethstop");
 879        netif_tx_disable(dev);
 880        if (card->state == CARD_STATE_UP) {
 881                card->state = CARD_STATE_SOFTSETUP;
 882                napi_disable(&card->napi);
 883        }
 884        return 0;
 885}
 886
 887static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
 888{
 889        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
 890
 891        INIT_LIST_HEAD(&card->vid_list);
 892        INIT_LIST_HEAD(&card->mc_list);
 893        card->options.layer2 = 1;
 894        card->discipline.start_poll = qeth_qdio_start_poll;
 895        card->discipline.input_handler = (qdio_handler_t *)
 896                qeth_qdio_input_handler;
 897        card->discipline.output_handler = (qdio_handler_t *)
 898                qeth_qdio_output_handler;
 899        card->discipline.recover = qeth_l2_recover;
 900        return 0;
 901}
 902
 903static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
 904{
 905        struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
 906
 907        qeth_set_allowed_threads(card, 0, 1);
 908        wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
 909
 910        if (cgdev->state == CCWGROUP_ONLINE) {
 911                card->use_hard_stop = 1;
 912                qeth_l2_set_offline(cgdev);
 913        }
 914
 915        if (card->dev) {
 916                unregister_netdev(card->dev);
 917                card->dev = NULL;
 918        }
 919        return;
 920}
 921
 922static const struct ethtool_ops qeth_l2_ethtool_ops = {
 923        .get_link = ethtool_op_get_link,
 924        .get_strings = qeth_core_get_strings,
 925        .get_ethtool_stats = qeth_core_get_ethtool_stats,
 926        .get_sset_count = qeth_core_get_sset_count,
 927        .get_drvinfo = qeth_core_get_drvinfo,
 928        .get_settings = qeth_core_ethtool_get_settings,
 929};
 930
 931static const struct ethtool_ops qeth_l2_osn_ops = {
 932        .get_strings = qeth_core_get_strings,
 933        .get_ethtool_stats = qeth_core_get_ethtool_stats,
 934        .get_sset_count = qeth_core_get_sset_count,
 935        .get_drvinfo = qeth_core_get_drvinfo,
 936};
 937
 938static const struct net_device_ops qeth_l2_netdev_ops = {
 939        .ndo_open               = qeth_l2_open,
 940        .ndo_stop               = qeth_l2_stop,
 941        .ndo_get_stats          = qeth_get_stats,
 942        .ndo_start_xmit         = qeth_l2_hard_start_xmit,
 943        .ndo_validate_addr      = eth_validate_addr,
 944        .ndo_set_multicast_list = qeth_l2_set_multicast_list,
 945        .ndo_do_ioctl           = qeth_l2_do_ioctl,
 946        .ndo_set_mac_address    = qeth_l2_set_mac_address,
 947        .ndo_change_mtu         = qeth_change_mtu,
 948        .ndo_vlan_rx_add_vid    = qeth_l2_vlan_rx_add_vid,
 949        .ndo_vlan_rx_kill_vid   = qeth_l2_vlan_rx_kill_vid,
 950        .ndo_tx_timeout         = qeth_tx_timeout,
 951};
 952
 953static int qeth_l2_setup_netdev(struct qeth_card *card)
 954{
 955        switch (card->info.type) {
 956        case QETH_CARD_TYPE_IQD:
 957                card->dev = alloc_netdev(0, "hsi%d", ether_setup);
 958                break;
 959        case QETH_CARD_TYPE_OSN:
 960                card->dev = alloc_netdev(0, "osn%d", ether_setup);
 961                card->dev->flags |= IFF_NOARP;
 962                break;
 963        default:
 964                card->dev = alloc_etherdev(0);
 965        }
 966
 967        if (!card->dev)
 968                return -ENODEV;
 969
 970        card->dev->ml_priv = card;
 971        card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
 972        card->dev->mtu = card->info.initial_mtu;
 973        card->dev->netdev_ops = &qeth_l2_netdev_ops;
 974        if (card->info.type != QETH_CARD_TYPE_OSN)
 975                SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops);
 976        else
 977                SET_ETHTOOL_OPS(card->dev, &qeth_l2_osn_ops);
 978        card->dev->features |= NETIF_F_HW_VLAN_FILTER;
 979        card->info.broadcast_capable = 1;
 980        qeth_l2_request_initial_mac(card);
 981        SET_NETDEV_DEV(card->dev, &card->gdev->dev);
 982        netif_napi_add(card->dev, &card->napi, qeth_l2_poll, QETH_NAPI_WEIGHT);
 983        return register_netdev(card->dev);
 984}
 985
 986static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
 987{
 988        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
 989        int rc = 0;
 990        enum qeth_card_states recover_flag;
 991
 992        BUG_ON(!card);
 993        mutex_lock(&card->discipline_mutex);
 994        mutex_lock(&card->conf_mutex);
 995        QETH_DBF_TEXT(SETUP, 2, "setonlin");
 996        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 997
 998        recover_flag = card->state;
 999        rc = qeth_core_hardsetup_card(card);
1000        if (rc) {
1001                QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
1002                rc = -ENODEV;
1003                goto out_remove;
1004        }
1005
1006        if (!card->dev && qeth_l2_setup_netdev(card)) {
1007                rc = -ENODEV;
1008                goto out_remove;
1009        }
1010
1011        if (card->info.type != QETH_CARD_TYPE_OSN)
1012                qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
1013
1014        card->state = CARD_STATE_HARDSETUP;
1015        memset(&card->rx, 0, sizeof(struct qeth_rx));
1016        qeth_print_status_message(card);
1017
1018        /* softsetup */
1019        QETH_DBF_TEXT(SETUP, 2, "softsetp");
1020
1021        rc = qeth_send_startlan(card);
1022        if (rc) {
1023                QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1024                if (rc == 0xe080) {
1025                        dev_warn(&card->gdev->dev,
1026                                "The LAN is offline\n");
1027                        card->lan_online = 0;
1028                        goto contin;
1029                }
1030                rc = -ENODEV;
1031                goto out_remove;
1032        } else
1033                card->lan_online = 1;
1034
1035contin:
1036        if ((card->info.type == QETH_CARD_TYPE_OSD) ||
1037            (card->info.type == QETH_CARD_TYPE_OSX))
1038                /* configure isolation level */
1039                qeth_set_access_ctrl_online(card);
1040
1041        if (card->info.type != QETH_CARD_TYPE_OSN &&
1042            card->info.type != QETH_CARD_TYPE_OSM)
1043                qeth_l2_process_vlans(card, 0);
1044
1045        netif_tx_disable(card->dev);
1046
1047        rc = qeth_init_qdio_queues(card);
1048        if (rc) {
1049                QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
1050                rc = -ENODEV;
1051                goto out_remove;
1052        }
1053        card->state = CARD_STATE_SOFTSETUP;
1054        if (card->lan_online)
1055                netif_carrier_on(card->dev);
1056        else
1057                netif_carrier_off(card->dev);
1058
1059        qeth_set_allowed_threads(card, 0xffffffff, 0);
1060        if (recover_flag == CARD_STATE_RECOVER) {
1061                if (recovery_mode &&
1062                    card->info.type != QETH_CARD_TYPE_OSN) {
1063                        __qeth_l2_open(card->dev);
1064                } else {
1065                        rtnl_lock();
1066                        dev_open(card->dev);
1067                        rtnl_unlock();
1068                }
1069                /* this also sets saved unicast addresses */
1070                qeth_l2_set_multicast_list(card->dev);
1071        }
1072        /* let user_space know that device is online */
1073        kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
1074        mutex_unlock(&card->conf_mutex);
1075        mutex_unlock(&card->discipline_mutex);
1076        return 0;
1077
1078out_remove:
1079        card->use_hard_stop = 1;
1080        qeth_l2_stop_card(card, 0);
1081        ccw_device_set_offline(CARD_DDEV(card));
1082        ccw_device_set_offline(CARD_WDEV(card));
1083        ccw_device_set_offline(CARD_RDEV(card));
1084        if (recover_flag == CARD_STATE_RECOVER)
1085                card->state = CARD_STATE_RECOVER;
1086        else
1087                card->state = CARD_STATE_DOWN;
1088        mutex_unlock(&card->conf_mutex);
1089        mutex_unlock(&card->discipline_mutex);
1090        return rc;
1091}
1092
1093static int qeth_l2_set_online(struct ccwgroup_device *gdev)
1094{
1095        return __qeth_l2_set_online(gdev, 0);
1096}
1097
1098static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1099                                        int recovery_mode)
1100{
1101        struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
1102        int rc = 0, rc2 = 0, rc3 = 0;
1103        enum qeth_card_states recover_flag;
1104
1105        mutex_lock(&card->discipline_mutex);
1106        mutex_lock(&card->conf_mutex);
1107        QETH_DBF_TEXT(SETUP, 3, "setoffl");
1108        QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
1109
1110        if (card->dev && netif_carrier_ok(card->dev))
1111                netif_carrier_off(card->dev);
1112        recover_flag = card->state;
1113        qeth_l2_stop_card(card, recovery_mode);
1114        rc  = ccw_device_set_offline(CARD_DDEV(card));
1115        rc2 = ccw_device_set_offline(CARD_WDEV(card));
1116        rc3 = ccw_device_set_offline(CARD_RDEV(card));
1117        if (!rc)
1118                rc = (rc2) ? rc2 : rc3;
1119        if (rc)
1120                QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1121        if (recover_flag == CARD_STATE_UP)
1122                card->state = CARD_STATE_RECOVER;
1123        /* let user_space know that device is offline */
1124        kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
1125        mutex_unlock(&card->conf_mutex);
1126        mutex_unlock(&card->discipline_mutex);
1127        return 0;
1128}
1129
1130static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
1131{
1132        return __qeth_l2_set_offline(cgdev, 0);
1133}
1134
1135static int qeth_l2_recover(void *ptr)
1136{
1137        struct qeth_card *card;
1138        int rc = 0;
1139
1140        card = (struct qeth_card *) ptr;
1141        QETH_CARD_TEXT(card, 2, "recover1");
1142        if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
1143                return 0;
1144        QETH_CARD_TEXT(card, 2, "recover2");
1145        dev_warn(&card->gdev->dev,
1146                "A recovery process has been started for the device\n");
1147        card->use_hard_stop = 1;
1148        __qeth_l2_set_offline(card->gdev, 1);
1149        rc = __qeth_l2_set_online(card->gdev, 1);
1150        if (!rc)
1151                dev_info(&card->gdev->dev,
1152                        "Device successfully recovered!\n");
1153        else {
1154                rtnl_lock();
1155                dev_close(card->dev);
1156                rtnl_unlock();
1157                dev_warn(&card->gdev->dev, "The qeth device driver "
1158                        "failed to recover an error on the device\n");
1159        }
1160        qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1161        qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
1162        return 0;
1163}
1164
1165static int __init qeth_l2_init(void)
1166{
1167        pr_info("register layer 2 discipline\n");
1168        return 0;
1169}
1170
1171static void __exit qeth_l2_exit(void)
1172{
1173        pr_info("unregister layer 2 discipline\n");
1174}
1175
1176static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1177{
1178        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1179        qeth_qdio_clear_card(card, 0);
1180        qeth_clear_qdio_buffers(card);
1181}
1182
1183static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
1184{
1185        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1186
1187        if (card->dev)
1188                netif_device_detach(card->dev);
1189        qeth_set_allowed_threads(card, 0, 1);
1190        wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
1191        if (gdev->state == CCWGROUP_OFFLINE)
1192                return 0;
1193        if (card->state == CARD_STATE_UP) {
1194                card->use_hard_stop = 1;
1195                __qeth_l2_set_offline(card->gdev, 1);
1196        } else
1197                __qeth_l2_set_offline(card->gdev, 0);
1198        return 0;
1199}
1200
1201static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
1202{
1203        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
1204        int rc = 0;
1205
1206        if (gdev->state == CCWGROUP_OFFLINE)
1207                goto out;
1208
1209        if (card->state == CARD_STATE_RECOVER) {
1210                rc = __qeth_l2_set_online(card->gdev, 1);
1211                if (rc) {
1212                        rtnl_lock();
1213                        dev_close(card->dev);
1214                        rtnl_unlock();
1215                }
1216        } else
1217                rc = __qeth_l2_set_online(card->gdev, 0);
1218out:
1219        qeth_set_allowed_threads(card, 0xffffffff, 0);
1220        if (card->dev)
1221                netif_device_attach(card->dev);
1222        if (rc)
1223                dev_warn(&card->gdev->dev, "The qeth device driver "
1224                        "failed to recover an error on the device\n");
1225        return rc;
1226}
1227
1228struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
1229        .probe = qeth_l2_probe_device,
1230        .remove = qeth_l2_remove_device,
1231        .set_online = qeth_l2_set_online,
1232        .set_offline = qeth_l2_set_offline,
1233        .shutdown = qeth_l2_shutdown,
1234        .freeze = qeth_l2_pm_suspend,
1235        .thaw = qeth_l2_pm_resume,
1236        .restore = qeth_l2_pm_resume,
1237};
1238EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver);
1239
1240static int qeth_osn_send_control_data(struct qeth_card *card, int len,
1241                           struct qeth_cmd_buffer *iob)
1242{
1243        unsigned long flags;
1244        int rc = 0;
1245
1246        QETH_CARD_TEXT(card, 5, "osndctrd");
1247
1248        wait_event(card->wait_q,
1249                   atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1250        qeth_prepare_control_data(card, len, iob);
1251        QETH_CARD_TEXT(card, 6, "osnoirqp");
1252        spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1253        rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1254                              (addr_t) iob, 0, 0);
1255        spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1256        if (rc) {
1257                QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "
1258                           "ccw_device_start rc = %i\n", rc);
1259                QETH_CARD_TEXT_(card, 2, " err%d", rc);
1260                qeth_release_buffer(iob->channel, iob);
1261                atomic_set(&card->write.irq_pending, 0);
1262                wake_up(&card->wait_q);
1263        }
1264        return rc;
1265}
1266
1267static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
1268                        struct qeth_cmd_buffer *iob, int data_len)
1269{
1270        u16 s1, s2;
1271
1272        QETH_CARD_TEXT(card, 4, "osndipa");
1273
1274        qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1275        s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1276        s2 = (u16)data_len;
1277        memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1278        memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1279        memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1280        memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1281        return qeth_osn_send_control_data(card, s1, iob);
1282}
1283
1284int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
1285{
1286        struct qeth_cmd_buffer *iob;
1287        struct qeth_card *card;
1288        int rc;
1289
1290        if (!dev)
1291                return -ENODEV;
1292        card = dev->ml_priv;
1293        if (!card)
1294                return -ENODEV;
1295        QETH_CARD_TEXT(card, 2, "osnsdmc");
1296        if ((card->state != CARD_STATE_UP) &&
1297            (card->state != CARD_STATE_SOFTSETUP))
1298                return -ENODEV;
1299        iob = qeth_wait_for_buffer(&card->write);
1300        memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
1301        rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
1302        return rc;
1303}
1304EXPORT_SYMBOL(qeth_osn_assist);
1305
1306int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
1307                  int (*assist_cb)(struct net_device *, void *),
1308                  int (*data_cb)(struct sk_buff *))
1309{
1310        struct qeth_card *card;
1311
1312        *dev = qeth_l2_netdev_by_devno(read_dev_no);
1313        if (*dev == NULL)
1314                return -ENODEV;
1315        card = (*dev)->ml_priv;
1316        if (!card)
1317                return -ENODEV;
1318        QETH_CARD_TEXT(card, 2, "osnreg");
1319        if ((assist_cb == NULL) || (data_cb == NULL))
1320                return -EINVAL;
1321        card->osn_info.assist_cb = assist_cb;
1322        card->osn_info.data_cb = data_cb;
1323        return 0;
1324}
1325EXPORT_SYMBOL(qeth_osn_register);
1326
1327void qeth_osn_deregister(struct net_device *dev)
1328{
1329        struct qeth_card *card;
1330
1331        if (!dev)
1332                return;
1333        card = dev->ml_priv;
1334        if (!card)
1335                return;
1336        QETH_CARD_TEXT(card, 2, "osndereg");
1337        card->osn_info.assist_cb = NULL;
1338        card->osn_info.data_cb = NULL;
1339        return;
1340}
1341EXPORT_SYMBOL(qeth_osn_deregister);
1342
1343module_init(qeth_l2_init);
1344module_exit(qeth_l2_exit);
1345MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
1346MODULE_DESCRIPTION("qeth layer 2 discipline");
1347MODULE_LICENSE("GPL");
1348