linux/drivers/s390/net/qeth_core_main.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *    Copyright IBM Corp. 2007, 2009
   4 *    Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
   5 *               Frank Pavlic <fpavlic@de.ibm.com>,
   6 *               Thomas Spatzier <tspat@de.ibm.com>,
   7 *               Frank Blaschka <frank.blaschka@de.ibm.com>
   8 */
   9
  10#define KMSG_COMPONENT "qeth"
  11#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  12
  13#include <linux/compat.h>
  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/log2.h>
  20#include <linux/ip.h>
  21#include <linux/tcp.h>
  22#include <linux/mii.h>
  23#include <linux/mm.h>
  24#include <linux/kthread.h>
  25#include <linux/slab.h>
  26#include <linux/if_vlan.h>
  27#include <linux/netdevice.h>
  28#include <linux/netdev_features.h>
  29#include <linux/skbuff.h>
  30#include <linux/vmalloc.h>
  31
  32#include <net/iucv/af_iucv.h>
  33#include <net/dsfield.h>
  34
  35#include <asm/ebcdic.h>
  36#include <asm/chpid.h>
  37#include <asm/io.h>
  38#include <asm/sysinfo.h>
  39#include <asm/diag.h>
  40#include <asm/cio.h>
  41#include <asm/ccwdev.h>
  42#include <asm/cpcmd.h>
  43
  44#include "qeth_core.h"
  45
  46struct qeth_dbf_info qeth_dbf[QETH_DBF_INFOS] = {
  47        /* define dbf - Name, Pages, Areas, Maxlen, Level, View, Handle */
  48        /*                   N  P  A    M  L  V                      H  */
  49        [QETH_DBF_SETUP] = {"qeth_setup",
  50                                8, 1,   8, 5, &debug_hex_ascii_view, NULL},
  51        [QETH_DBF_MSG]   = {"qeth_msg", 8, 1, 11 * sizeof(long), 3,
  52                            &debug_sprintf_view, NULL},
  53        [QETH_DBF_CTRL]  = {"qeth_control",
  54                8, 1, QETH_DBF_CTRL_LEN, 5, &debug_hex_ascii_view, NULL},
  55};
  56EXPORT_SYMBOL_GPL(qeth_dbf);
  57
  58struct kmem_cache *qeth_core_header_cache;
  59EXPORT_SYMBOL_GPL(qeth_core_header_cache);
  60static struct kmem_cache *qeth_qdio_outbuf_cache;
  61
  62static struct device *qeth_core_root_dev;
  63static struct lock_class_key qdio_out_skb_queue_key;
  64
  65static void qeth_issue_next_read_cb(struct qeth_card *card,
  66                                    struct qeth_cmd_buffer *iob);
  67static void qeth_free_buffer_pool(struct qeth_card *);
  68static int qeth_qdio_establish(struct qeth_card *);
  69static void qeth_free_qdio_queues(struct qeth_card *card);
  70static void qeth_notify_skbs(struct qeth_qdio_out_q *queue,
  71                struct qeth_qdio_out_buffer *buf,
  72                enum iucv_tx_notify notification);
  73static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf);
  74static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *, int);
  75
  76static void qeth_close_dev_handler(struct work_struct *work)
  77{
  78        struct qeth_card *card;
  79
  80        card = container_of(work, struct qeth_card, close_dev_work);
  81        QETH_CARD_TEXT(card, 2, "cldevhdl");
  82        ccwgroup_set_offline(card->gdev);
  83}
  84
  85static const char *qeth_get_cardname(struct qeth_card *card)
  86{
  87        if (IS_VM_NIC(card)) {
  88                switch (card->info.type) {
  89                case QETH_CARD_TYPE_OSD:
  90                        return " Virtual NIC QDIO";
  91                case QETH_CARD_TYPE_IQD:
  92                        return " Virtual NIC Hiper";
  93                case QETH_CARD_TYPE_OSM:
  94                        return " Virtual NIC QDIO - OSM";
  95                case QETH_CARD_TYPE_OSX:
  96                        return " Virtual NIC QDIO - OSX";
  97                default:
  98                        return " unknown";
  99                }
 100        } else {
 101                switch (card->info.type) {
 102                case QETH_CARD_TYPE_OSD:
 103                        return " OSD Express";
 104                case QETH_CARD_TYPE_IQD:
 105                        return " HiperSockets";
 106                case QETH_CARD_TYPE_OSN:
 107                        return " OSN QDIO";
 108                case QETH_CARD_TYPE_OSM:
 109                        return " OSM QDIO";
 110                case QETH_CARD_TYPE_OSX:
 111                        return " OSX QDIO";
 112                default:
 113                        return " unknown";
 114                }
 115        }
 116        return " n/a";
 117}
 118
 119/* max length to be returned: 14 */
 120const char *qeth_get_cardname_short(struct qeth_card *card)
 121{
 122        if (IS_VM_NIC(card)) {
 123                switch (card->info.type) {
 124                case QETH_CARD_TYPE_OSD:
 125                        return "Virt.NIC QDIO";
 126                case QETH_CARD_TYPE_IQD:
 127                        return "Virt.NIC Hiper";
 128                case QETH_CARD_TYPE_OSM:
 129                        return "Virt.NIC OSM";
 130                case QETH_CARD_TYPE_OSX:
 131                        return "Virt.NIC OSX";
 132                default:
 133                        return "unknown";
 134                }
 135        } else {
 136                switch (card->info.type) {
 137                case QETH_CARD_TYPE_OSD:
 138                        switch (card->info.link_type) {
 139                        case QETH_LINK_TYPE_FAST_ETH:
 140                                return "OSD_100";
 141                        case QETH_LINK_TYPE_HSTR:
 142                                return "HSTR";
 143                        case QETH_LINK_TYPE_GBIT_ETH:
 144                                return "OSD_1000";
 145                        case QETH_LINK_TYPE_10GBIT_ETH:
 146                                return "OSD_10GIG";
 147                        case QETH_LINK_TYPE_25GBIT_ETH:
 148                                return "OSD_25GIG";
 149                        case QETH_LINK_TYPE_LANE_ETH100:
 150                                return "OSD_FE_LANE";
 151                        case QETH_LINK_TYPE_LANE_TR:
 152                                return "OSD_TR_LANE";
 153                        case QETH_LINK_TYPE_LANE_ETH1000:
 154                                return "OSD_GbE_LANE";
 155                        case QETH_LINK_TYPE_LANE:
 156                                return "OSD_ATM_LANE";
 157                        default:
 158                                return "OSD_Express";
 159                        }
 160                case QETH_CARD_TYPE_IQD:
 161                        return "HiperSockets";
 162                case QETH_CARD_TYPE_OSN:
 163                        return "OSN";
 164                case QETH_CARD_TYPE_OSM:
 165                        return "OSM_1000";
 166                case QETH_CARD_TYPE_OSX:
 167                        return "OSX_10GIG";
 168                default:
 169                        return "unknown";
 170                }
 171        }
 172        return "n/a";
 173}
 174
 175void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
 176                         int clear_start_mask)
 177{
 178        unsigned long flags;
 179
 180        spin_lock_irqsave(&card->thread_mask_lock, flags);
 181        card->thread_allowed_mask = threads;
 182        if (clear_start_mask)
 183                card->thread_start_mask &= threads;
 184        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 185        wake_up(&card->wait_q);
 186}
 187EXPORT_SYMBOL_GPL(qeth_set_allowed_threads);
 188
 189int qeth_threads_running(struct qeth_card *card, unsigned long threads)
 190{
 191        unsigned long flags;
 192        int rc = 0;
 193
 194        spin_lock_irqsave(&card->thread_mask_lock, flags);
 195        rc = (card->thread_running_mask & threads);
 196        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 197        return rc;
 198}
 199EXPORT_SYMBOL_GPL(qeth_threads_running);
 200
 201void qeth_clear_working_pool_list(struct qeth_card *card)
 202{
 203        struct qeth_buffer_pool_entry *pool_entry, *tmp;
 204
 205        QETH_CARD_TEXT(card, 5, "clwrklst");
 206        list_for_each_entry_safe(pool_entry, tmp,
 207                            &card->qdio.in_buf_pool.entry_list, list){
 208                        list_del(&pool_entry->list);
 209        }
 210}
 211EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list);
 212
 213static int qeth_alloc_buffer_pool(struct qeth_card *card)
 214{
 215        struct qeth_buffer_pool_entry *pool_entry;
 216        void *ptr;
 217        int i, j;
 218
 219        QETH_CARD_TEXT(card, 5, "alocpool");
 220        for (i = 0; i < card->qdio.init_pool.buf_count; ++i) {
 221                pool_entry = kzalloc(sizeof(*pool_entry), GFP_KERNEL);
 222                if (!pool_entry) {
 223                        qeth_free_buffer_pool(card);
 224                        return -ENOMEM;
 225                }
 226                for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) {
 227                        ptr = (void *) __get_free_page(GFP_KERNEL);
 228                        if (!ptr) {
 229                                while (j > 0)
 230                                        free_page((unsigned long)
 231                                                  pool_entry->elements[--j]);
 232                                kfree(pool_entry);
 233                                qeth_free_buffer_pool(card);
 234                                return -ENOMEM;
 235                        }
 236                        pool_entry->elements[j] = ptr;
 237                }
 238                list_add(&pool_entry->init_list,
 239                         &card->qdio.init_pool.entry_list);
 240        }
 241        return 0;
 242}
 243
 244int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
 245{
 246        QETH_CARD_TEXT(card, 2, "realcbp");
 247
 248        if (card->state != CARD_STATE_DOWN)
 249                return -EPERM;
 250
 251        /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
 252        qeth_clear_working_pool_list(card);
 253        qeth_free_buffer_pool(card);
 254        card->qdio.in_buf_pool.buf_count = bufcnt;
 255        card->qdio.init_pool.buf_count = bufcnt;
 256        return qeth_alloc_buffer_pool(card);
 257}
 258EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool);
 259
 260static void qeth_free_qdio_queue(struct qeth_qdio_q *q)
 261{
 262        if (!q)
 263                return;
 264
 265        qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
 266        kfree(q);
 267}
 268
 269static struct qeth_qdio_q *qeth_alloc_qdio_queue(void)
 270{
 271        struct qeth_qdio_q *q = kzalloc(sizeof(*q), GFP_KERNEL);
 272        int i;
 273
 274        if (!q)
 275                return NULL;
 276
 277        if (qdio_alloc_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q)) {
 278                kfree(q);
 279                return NULL;
 280        }
 281
 282        for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
 283                q->bufs[i].buffer = q->qdio_bufs[i];
 284
 285        QETH_DBF_HEX(SETUP, 2, &q, sizeof(void *));
 286        return q;
 287}
 288
 289static int qeth_cq_init(struct qeth_card *card)
 290{
 291        int rc;
 292
 293        if (card->options.cq == QETH_CQ_ENABLED) {
 294                QETH_CARD_TEXT(card, 2, "cqinit");
 295                qdio_reset_buffers(card->qdio.c_q->qdio_bufs,
 296                                   QDIO_MAX_BUFFERS_PER_Q);
 297                card->qdio.c_q->next_buf_to_init = 127;
 298                rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT,
 299                             card->qdio.no_in_queues - 1, 0,
 300                             127);
 301                if (rc) {
 302                        QETH_CARD_TEXT_(card, 2, "1err%d", rc);
 303                        goto out;
 304                }
 305        }
 306        rc = 0;
 307out:
 308        return rc;
 309}
 310
 311static int qeth_alloc_cq(struct qeth_card *card)
 312{
 313        int rc;
 314
 315        if (card->options.cq == QETH_CQ_ENABLED) {
 316                int i;
 317                struct qdio_outbuf_state *outbuf_states;
 318
 319                QETH_CARD_TEXT(card, 2, "cqon");
 320                card->qdio.c_q = qeth_alloc_qdio_queue();
 321                if (!card->qdio.c_q) {
 322                        rc = -1;
 323                        goto kmsg_out;
 324                }
 325                card->qdio.no_in_queues = 2;
 326                card->qdio.out_bufstates =
 327                        kcalloc(card->qdio.no_out_queues *
 328                                        QDIO_MAX_BUFFERS_PER_Q,
 329                                sizeof(struct qdio_outbuf_state),
 330                                GFP_KERNEL);
 331                outbuf_states = card->qdio.out_bufstates;
 332                if (outbuf_states == NULL) {
 333                        rc = -1;
 334                        goto free_cq_out;
 335                }
 336                for (i = 0; i < card->qdio.no_out_queues; ++i) {
 337                        card->qdio.out_qs[i]->bufstates = outbuf_states;
 338                        outbuf_states += QDIO_MAX_BUFFERS_PER_Q;
 339                }
 340        } else {
 341                QETH_CARD_TEXT(card, 2, "nocq");
 342                card->qdio.c_q = NULL;
 343                card->qdio.no_in_queues = 1;
 344        }
 345        QETH_CARD_TEXT_(card, 2, "iqc%d", card->qdio.no_in_queues);
 346        rc = 0;
 347out:
 348        return rc;
 349free_cq_out:
 350        qeth_free_qdio_queue(card->qdio.c_q);
 351        card->qdio.c_q = NULL;
 352kmsg_out:
 353        dev_err(&card->gdev->dev, "Failed to create completion queue\n");
 354        goto out;
 355}
 356
 357static void qeth_free_cq(struct qeth_card *card)
 358{
 359        if (card->qdio.c_q) {
 360                --card->qdio.no_in_queues;
 361                qeth_free_qdio_queue(card->qdio.c_q);
 362                card->qdio.c_q = NULL;
 363        }
 364        kfree(card->qdio.out_bufstates);
 365        card->qdio.out_bufstates = NULL;
 366}
 367
 368static enum iucv_tx_notify qeth_compute_cq_notification(int sbalf15,
 369                                                        int delayed)
 370{
 371        enum iucv_tx_notify n;
 372
 373        switch (sbalf15) {
 374        case 0:
 375                n = delayed ? TX_NOTIFY_DELAYED_OK : TX_NOTIFY_OK;
 376                break;
 377        case 4:
 378        case 16:
 379        case 17:
 380        case 18:
 381                n = delayed ? TX_NOTIFY_DELAYED_UNREACHABLE :
 382                        TX_NOTIFY_UNREACHABLE;
 383                break;
 384        default:
 385                n = delayed ? TX_NOTIFY_DELAYED_GENERALERROR :
 386                        TX_NOTIFY_GENERALERROR;
 387                break;
 388        }
 389
 390        return n;
 391}
 392
 393static void qeth_cleanup_handled_pending(struct qeth_qdio_out_q *q, int bidx,
 394                                         int forced_cleanup)
 395{
 396        if (q->card->options.cq != QETH_CQ_ENABLED)
 397                return;
 398
 399        if (q->bufs[bidx]->next_pending != NULL) {
 400                struct qeth_qdio_out_buffer *head = q->bufs[bidx];
 401                struct qeth_qdio_out_buffer *c = q->bufs[bidx]->next_pending;
 402
 403                while (c) {
 404                        if (forced_cleanup ||
 405                            atomic_read(&c->state) ==
 406                              QETH_QDIO_BUF_HANDLED_DELAYED) {
 407                                struct qeth_qdio_out_buffer *f = c;
 408                                QETH_CARD_TEXT(f->q->card, 5, "fp");
 409                                QETH_CARD_TEXT_(f->q->card, 5, "%lx", (long) f);
 410                                /* release here to avoid interleaving between
 411                                   outbound tasklet and inbound tasklet
 412                                   regarding notifications and lifecycle */
 413                                qeth_release_skbs(c);
 414
 415                                c = f->next_pending;
 416                                WARN_ON_ONCE(head->next_pending != f);
 417                                head->next_pending = c;
 418                                kmem_cache_free(qeth_qdio_outbuf_cache, f);
 419                        } else {
 420                                head = c;
 421                                c = c->next_pending;
 422                        }
 423
 424                }
 425        }
 426        if (forced_cleanup && (atomic_read(&(q->bufs[bidx]->state)) ==
 427                                        QETH_QDIO_BUF_HANDLED_DELAYED)) {
 428                /* for recovery situations */
 429                qeth_init_qdio_out_buf(q, bidx);
 430                QETH_CARD_TEXT(q->card, 2, "clprecov");
 431        }
 432}
 433
 434
 435static void qeth_qdio_handle_aob(struct qeth_card *card,
 436                                 unsigned long phys_aob_addr)
 437{
 438        struct qaob *aob;
 439        struct qeth_qdio_out_buffer *buffer;
 440        enum iucv_tx_notify notification;
 441        unsigned int i;
 442
 443        aob = (struct qaob *) phys_to_virt(phys_aob_addr);
 444        QETH_CARD_TEXT(card, 5, "haob");
 445        QETH_CARD_TEXT_(card, 5, "%lx", phys_aob_addr);
 446        buffer = (struct qeth_qdio_out_buffer *) aob->user1;
 447        QETH_CARD_TEXT_(card, 5, "%lx", aob->user1);
 448
 449        if (atomic_cmpxchg(&buffer->state, QETH_QDIO_BUF_PRIMED,
 450                           QETH_QDIO_BUF_IN_CQ) == QETH_QDIO_BUF_PRIMED) {
 451                notification = TX_NOTIFY_OK;
 452        } else {
 453                WARN_ON_ONCE(atomic_read(&buffer->state) !=
 454                                                        QETH_QDIO_BUF_PENDING);
 455                atomic_set(&buffer->state, QETH_QDIO_BUF_IN_CQ);
 456                notification = TX_NOTIFY_DELAYED_OK;
 457        }
 458
 459        if (aob->aorc != 0)  {
 460                QETH_CARD_TEXT_(card, 2, "aorc%02X", aob->aorc);
 461                notification = qeth_compute_cq_notification(aob->aorc, 1);
 462        }
 463        qeth_notify_skbs(buffer->q, buffer, notification);
 464
 465        /* Free dangling allocations. The attached skbs are handled by
 466         * qeth_cleanup_handled_pending().
 467         */
 468        for (i = 0;
 469             i < aob->sb_count && i < QETH_MAX_BUFFER_ELEMENTS(card);
 470             i++) {
 471                if (aob->sba[i] && buffer->is_header[i])
 472                        kmem_cache_free(qeth_core_header_cache,
 473                                        (void *) aob->sba[i]);
 474        }
 475        atomic_set(&buffer->state, QETH_QDIO_BUF_HANDLED_DELAYED);
 476
 477        qdio_release_aob(aob);
 478}
 479
 480static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue)
 481{
 482        return card->options.cq == QETH_CQ_ENABLED &&
 483            card->qdio.c_q != NULL &&
 484            queue != 0 &&
 485            queue == card->qdio.no_in_queues - 1;
 486}
 487
 488static void qeth_setup_ccw(struct ccw1 *ccw, u8 cmd_code, u8 flags, u32 len,
 489                           void *data)
 490{
 491        ccw->cmd_code = cmd_code;
 492        ccw->flags = flags | CCW_FLAG_SLI;
 493        ccw->count = len;
 494        ccw->cda = (__u32) __pa(data);
 495}
 496
 497static int __qeth_issue_next_read(struct qeth_card *card)
 498{
 499        struct qeth_cmd_buffer *iob = card->read_cmd;
 500        struct qeth_channel *channel = iob->channel;
 501        struct ccw1 *ccw = __ccw_from_cmd(iob);
 502        int rc;
 503
 504        QETH_CARD_TEXT(card, 5, "issnxrd");
 505        if (channel->state != CH_STATE_UP)
 506                return -EIO;
 507
 508        memset(iob->data, 0, iob->length);
 509        qeth_setup_ccw(ccw, CCW_CMD_READ, 0, iob->length, iob->data);
 510        iob->callback = qeth_issue_next_read_cb;
 511        /* keep the cmd alive after completion: */
 512        qeth_get_cmd(iob);
 513
 514        QETH_CARD_TEXT(card, 6, "noirqpnd");
 515        rc = ccw_device_start(channel->ccwdev, ccw, (addr_t) iob, 0, 0);
 516        if (rc) {
 517                QETH_DBF_MESSAGE(2, "error %i on device %x when starting next read ccw!\n",
 518                                 rc, CARD_DEVID(card));
 519                atomic_set(&channel->irq_pending, 0);
 520                qeth_put_cmd(iob);
 521                card->read_or_write_problem = 1;
 522                qeth_schedule_recovery(card);
 523                wake_up(&card->wait_q);
 524        }
 525        return rc;
 526}
 527
 528static int qeth_issue_next_read(struct qeth_card *card)
 529{
 530        int ret;
 531
 532        spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card)));
 533        ret = __qeth_issue_next_read(card);
 534        spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card)));
 535
 536        return ret;
 537}
 538
 539static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
 540{
 541        struct qeth_reply *reply;
 542
 543        reply = kzalloc(sizeof(*reply), GFP_KERNEL);
 544        if (reply) {
 545                refcount_set(&reply->refcnt, 1);
 546                init_completion(&reply->received);
 547                spin_lock_init(&reply->lock);
 548        }
 549        return reply;
 550}
 551
 552static void qeth_get_reply(struct qeth_reply *reply)
 553{
 554        refcount_inc(&reply->refcnt);
 555}
 556
 557static void qeth_put_reply(struct qeth_reply *reply)
 558{
 559        if (refcount_dec_and_test(&reply->refcnt))
 560                kfree(reply);
 561}
 562
 563static void qeth_enqueue_reply(struct qeth_card *card, struct qeth_reply *reply)
 564{
 565        spin_lock_irq(&card->lock);
 566        list_add_tail(&reply->list, &card->cmd_waiter_list);
 567        spin_unlock_irq(&card->lock);
 568}
 569
 570static void qeth_dequeue_reply(struct qeth_card *card, struct qeth_reply *reply)
 571{
 572        spin_lock_irq(&card->lock);
 573        list_del(&reply->list);
 574        spin_unlock_irq(&card->lock);
 575}
 576
 577void qeth_notify_reply(struct qeth_reply *reply, int reason)
 578{
 579        reply->rc = reason;
 580        complete(&reply->received);
 581}
 582EXPORT_SYMBOL_GPL(qeth_notify_reply);
 583
 584static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
 585                struct qeth_card *card)
 586{
 587        const char *ipa_name;
 588        int com = cmd->hdr.command;
 589        ipa_name = qeth_get_ipa_cmd_name(com);
 590
 591        if (rc)
 592                QETH_DBF_MESSAGE(2, "IPA: %s(%#x) for device %x returned %#x \"%s\"\n",
 593                                 ipa_name, com, CARD_DEVID(card), rc,
 594                                 qeth_get_ipa_msg(rc));
 595        else
 596                QETH_DBF_MESSAGE(5, "IPA: %s(%#x) for device %x succeeded\n",
 597                                 ipa_name, com, CARD_DEVID(card));
 598}
 599
 600static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
 601                                                struct qeth_ipa_cmd *cmd)
 602{
 603        QETH_CARD_TEXT(card, 5, "chkipad");
 604
 605        if (IS_IPA_REPLY(cmd)) {
 606                if (cmd->hdr.command != IPA_CMD_SETCCID &&
 607                    cmd->hdr.command != IPA_CMD_DELCCID &&
 608                    cmd->hdr.command != IPA_CMD_MODCCID &&
 609                    cmd->hdr.command != IPA_CMD_SET_DIAG_ASS)
 610                        qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card);
 611                return cmd;
 612        }
 613
 614        /* handle unsolicited event: */
 615        switch (cmd->hdr.command) {
 616        case IPA_CMD_STOPLAN:
 617                if (cmd->hdr.return_code == IPA_RC_VEPA_TO_VEB_TRANSITION) {
 618                        dev_err(&card->gdev->dev,
 619                                "Interface %s is down because the adjacent port is no longer in reflective relay mode\n",
 620                                QETH_CARD_IFNAME(card));
 621                        schedule_work(&card->close_dev_work);
 622                } else {
 623                        dev_warn(&card->gdev->dev,
 624                                 "The link for interface %s on CHPID 0x%X failed\n",
 625                                 QETH_CARD_IFNAME(card), card->info.chpid);
 626                        qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card);
 627                        netif_carrier_off(card->dev);
 628                }
 629                return NULL;
 630        case IPA_CMD_STARTLAN:
 631                dev_info(&card->gdev->dev,
 632                         "The link for %s on CHPID 0x%X has been restored\n",
 633                         QETH_CARD_IFNAME(card), card->info.chpid);
 634                if (card->info.hwtrap)
 635                        card->info.hwtrap = 2;
 636                qeth_schedule_recovery(card);
 637                return NULL;
 638        case IPA_CMD_SETBRIDGEPORT_IQD:
 639        case IPA_CMD_SETBRIDGEPORT_OSA:
 640        case IPA_CMD_ADDRESS_CHANGE_NOTIF:
 641                if (card->discipline->control_event_handler(card, cmd))
 642                        return cmd;
 643                return NULL;
 644        case IPA_CMD_MODCCID:
 645                return cmd;
 646        case IPA_CMD_REGISTER_LOCAL_ADDR:
 647                QETH_CARD_TEXT(card, 3, "irla");
 648                return NULL;
 649        case IPA_CMD_UNREGISTER_LOCAL_ADDR:
 650                QETH_CARD_TEXT(card, 3, "urla");
 651                return NULL;
 652        default:
 653                QETH_DBF_MESSAGE(2, "Received data is IPA but not a reply!\n");
 654                return cmd;
 655        }
 656}
 657
 658void qeth_clear_ipacmd_list(struct qeth_card *card)
 659{
 660        struct qeth_reply *reply;
 661        unsigned long flags;
 662
 663        QETH_CARD_TEXT(card, 4, "clipalst");
 664
 665        spin_lock_irqsave(&card->lock, flags);
 666        list_for_each_entry(reply, &card->cmd_waiter_list, list)
 667                qeth_notify_reply(reply, -EIO);
 668        spin_unlock_irqrestore(&card->lock, flags);
 669}
 670EXPORT_SYMBOL_GPL(qeth_clear_ipacmd_list);
 671
 672static int qeth_check_idx_response(struct qeth_card *card,
 673        unsigned char *buffer)
 674{
 675        QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN);
 676        if ((buffer[2] & 0xc0) == 0xc0) {
 677                QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#04x\n",
 678                                 buffer[4]);
 679                QETH_CARD_TEXT(card, 2, "ckidxres");
 680                QETH_CARD_TEXT(card, 2, " idxterm");
 681                QETH_CARD_TEXT_(card, 2, "  rc%d", -EIO);
 682                if (buffer[4] == 0xf6) {
 683                        dev_err(&card->gdev->dev,
 684                        "The qeth device is not configured "
 685                        "for the OSI layer required by z/VM\n");
 686                        return -EPERM;
 687                }
 688                return -EIO;
 689        }
 690        return 0;
 691}
 692
 693void qeth_put_cmd(struct qeth_cmd_buffer *iob)
 694{
 695        if (refcount_dec_and_test(&iob->ref_count)) {
 696                if (iob->reply)
 697                        qeth_put_reply(iob->reply);
 698                kfree(iob->data);
 699                kfree(iob);
 700        }
 701}
 702EXPORT_SYMBOL_GPL(qeth_put_cmd);
 703
 704static void qeth_release_buffer_cb(struct qeth_card *card,
 705                                   struct qeth_cmd_buffer *iob)
 706{
 707        qeth_put_cmd(iob);
 708}
 709
 710static void qeth_cancel_cmd(struct qeth_cmd_buffer *iob, int rc)
 711{
 712        struct qeth_reply *reply = iob->reply;
 713
 714        if (reply)
 715                qeth_notify_reply(reply, rc);
 716        qeth_put_cmd(iob);
 717}
 718
 719struct qeth_cmd_buffer *qeth_alloc_cmd(struct qeth_channel *channel,
 720                                       unsigned int length, unsigned int ccws,
 721                                       long timeout)
 722{
 723        struct qeth_cmd_buffer *iob;
 724
 725        if (length > QETH_BUFSIZE)
 726                return NULL;
 727
 728        iob = kzalloc(sizeof(*iob), GFP_KERNEL);
 729        if (!iob)
 730                return NULL;
 731
 732        iob->data = kzalloc(ALIGN(length, 8) + ccws * sizeof(struct ccw1),
 733                            GFP_KERNEL | GFP_DMA);
 734        if (!iob->data) {
 735                kfree(iob);
 736                return NULL;
 737        }
 738
 739        refcount_set(&iob->ref_count, 1);
 740        iob->channel = channel;
 741        iob->timeout = timeout;
 742        iob->length = length;
 743        return iob;
 744}
 745EXPORT_SYMBOL_GPL(qeth_alloc_cmd);
 746
 747static void qeth_issue_next_read_cb(struct qeth_card *card,
 748                                    struct qeth_cmd_buffer *iob)
 749{
 750        struct qeth_ipa_cmd *cmd = NULL;
 751        struct qeth_reply *reply = NULL;
 752        struct qeth_reply *r;
 753        unsigned long flags;
 754        int rc = 0;
 755
 756        QETH_CARD_TEXT(card, 4, "sndctlcb");
 757        rc = qeth_check_idx_response(card, iob->data);
 758        switch (rc) {
 759        case 0:
 760                break;
 761        case -EIO:
 762                qeth_clear_ipacmd_list(card);
 763                qeth_schedule_recovery(card);
 764                /* fall through */
 765        default:
 766                goto out;
 767        }
 768
 769        if (IS_IPA(iob->data)) {
 770                cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
 771                cmd = qeth_check_ipa_data(card, cmd);
 772                if (!cmd)
 773                        goto out;
 774                if (IS_OSN(card) && card->osn_info.assist_cb &&
 775                    cmd->hdr.command != IPA_CMD_STARTLAN) {
 776                        card->osn_info.assist_cb(card->dev, cmd);
 777                        goto out;
 778                }
 779        } else {
 780                /* non-IPA commands should only flow during initialization */
 781                if (card->state != CARD_STATE_DOWN)
 782                        goto out;
 783        }
 784
 785        /* match against pending cmd requests */
 786        spin_lock_irqsave(&card->lock, flags);
 787        list_for_each_entry(r, &card->cmd_waiter_list, list) {
 788                if ((r->seqno == QETH_IDX_COMMAND_SEQNO) ||
 789                    (cmd && (r->seqno == cmd->hdr.seqno))) {
 790                        reply = r;
 791                        /* take the object outside the lock */
 792                        qeth_get_reply(reply);
 793                        break;
 794                }
 795        }
 796        spin_unlock_irqrestore(&card->lock, flags);
 797
 798        if (!reply)
 799                goto out;
 800
 801        if (!reply->callback) {
 802                rc = 0;
 803                goto no_callback;
 804        }
 805
 806        spin_lock_irqsave(&reply->lock, flags);
 807        if (reply->rc) {
 808                /* Bail out when the requestor has already left: */
 809                rc = reply->rc;
 810        } else {
 811                if (cmd) {
 812                        reply->offset = (u16)((char *)cmd - (char *)iob->data);
 813                        rc = reply->callback(card, reply, (unsigned long)cmd);
 814                } else {
 815                        rc = reply->callback(card, reply, (unsigned long)iob);
 816                }
 817        }
 818        spin_unlock_irqrestore(&reply->lock, flags);
 819
 820no_callback:
 821        if (rc <= 0)
 822                qeth_notify_reply(reply, rc);
 823        qeth_put_reply(reply);
 824
 825out:
 826        memcpy(&card->seqno.pdu_hdr_ack,
 827                QETH_PDU_HEADER_SEQ_NO(iob->data),
 828                QETH_SEQ_NO_LENGTH);
 829        qeth_put_cmd(iob);
 830        __qeth_issue_next_read(card);
 831}
 832
 833static int qeth_set_thread_start_bit(struct qeth_card *card,
 834                unsigned long thread)
 835{
 836        unsigned long flags;
 837
 838        spin_lock_irqsave(&card->thread_mask_lock, flags);
 839        if (!(card->thread_allowed_mask & thread) ||
 840              (card->thread_start_mask & thread)) {
 841                spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 842                return -EPERM;
 843        }
 844        card->thread_start_mask |= thread;
 845        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 846        return 0;
 847}
 848
 849void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
 850{
 851        unsigned long flags;
 852
 853        spin_lock_irqsave(&card->thread_mask_lock, flags);
 854        card->thread_start_mask &= ~thread;
 855        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 856        wake_up(&card->wait_q);
 857}
 858EXPORT_SYMBOL_GPL(qeth_clear_thread_start_bit);
 859
 860void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
 861{
 862        unsigned long flags;
 863
 864        spin_lock_irqsave(&card->thread_mask_lock, flags);
 865        card->thread_running_mask &= ~thread;
 866        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 867        wake_up_all(&card->wait_q);
 868}
 869EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit);
 870
 871static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
 872{
 873        unsigned long flags;
 874        int rc = 0;
 875
 876        spin_lock_irqsave(&card->thread_mask_lock, flags);
 877        if (card->thread_start_mask & thread) {
 878                if ((card->thread_allowed_mask & thread) &&
 879                    !(card->thread_running_mask & thread)) {
 880                        rc = 1;
 881                        card->thread_start_mask &= ~thread;
 882                        card->thread_running_mask |= thread;
 883                } else
 884                        rc = -EPERM;
 885        }
 886        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
 887        return rc;
 888}
 889
 890int qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
 891{
 892        int rc = 0;
 893
 894        wait_event(card->wait_q,
 895                   (rc = __qeth_do_run_thread(card, thread)) >= 0);
 896        return rc;
 897}
 898EXPORT_SYMBOL_GPL(qeth_do_run_thread);
 899
 900void qeth_schedule_recovery(struct qeth_card *card)
 901{
 902        QETH_CARD_TEXT(card, 2, "startrec");
 903        if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
 904                schedule_work(&card->kernel_thread_starter);
 905}
 906EXPORT_SYMBOL_GPL(qeth_schedule_recovery);
 907
 908static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev,
 909                            struct irb *irb)
 910{
 911        int dstat, cstat;
 912        char *sense;
 913
 914        sense = (char *) irb->ecw;
 915        cstat = irb->scsw.cmd.cstat;
 916        dstat = irb->scsw.cmd.dstat;
 917
 918        if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
 919                     SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
 920                     SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
 921                QETH_CARD_TEXT(card, 2, "CGENCHK");
 922                dev_warn(&cdev->dev, "The qeth device driver "
 923                        "failed to recover an error on the device\n");
 924                QETH_DBF_MESSAGE(2, "check on channel %x with dstat=%#x, cstat=%#x\n",
 925                                 CCW_DEVID(cdev), dstat, cstat);
 926                print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET,
 927                                16, 1, irb, 64, 1);
 928                return 1;
 929        }
 930
 931        if (dstat & DEV_STAT_UNIT_CHECK) {
 932                if (sense[SENSE_RESETTING_EVENT_BYTE] &
 933                    SENSE_RESETTING_EVENT_FLAG) {
 934                        QETH_CARD_TEXT(card, 2, "REVIND");
 935                        return 1;
 936                }
 937                if (sense[SENSE_COMMAND_REJECT_BYTE] &
 938                    SENSE_COMMAND_REJECT_FLAG) {
 939                        QETH_CARD_TEXT(card, 2, "CMDREJi");
 940                        return 1;
 941                }
 942                if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
 943                        QETH_CARD_TEXT(card, 2, "AFFE");
 944                        return 1;
 945                }
 946                if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
 947                        QETH_CARD_TEXT(card, 2, "ZEROSEN");
 948                        return 0;
 949                }
 950                QETH_CARD_TEXT(card, 2, "DGENCHK");
 951                        return 1;
 952        }
 953        return 0;
 954}
 955
 956static int qeth_check_irb_error(struct qeth_card *card, struct ccw_device *cdev,
 957                                struct irb *irb)
 958{
 959        if (!IS_ERR(irb))
 960                return 0;
 961
 962        switch (PTR_ERR(irb)) {
 963        case -EIO:
 964                QETH_DBF_MESSAGE(2, "i/o-error on channel %x\n",
 965                                 CCW_DEVID(cdev));
 966                QETH_CARD_TEXT(card, 2, "ckirberr");
 967                QETH_CARD_TEXT_(card, 2, "  rc%d", -EIO);
 968                return -EIO;
 969        case -ETIMEDOUT:
 970                dev_warn(&cdev->dev, "A hardware operation timed out"
 971                        " on the device\n");
 972                QETH_CARD_TEXT(card, 2, "ckirberr");
 973                QETH_CARD_TEXT_(card, 2, "  rc%d", -ETIMEDOUT);
 974                return -ETIMEDOUT;
 975        default:
 976                QETH_DBF_MESSAGE(2, "unknown error %ld on channel %x\n",
 977                                 PTR_ERR(irb), CCW_DEVID(cdev));
 978                QETH_CARD_TEXT(card, 2, "ckirberr");
 979                QETH_CARD_TEXT(card, 2, "  rc???");
 980                return PTR_ERR(irb);
 981        }
 982}
 983
 984static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
 985                struct irb *irb)
 986{
 987        int rc;
 988        int cstat, dstat;
 989        struct qeth_cmd_buffer *iob = NULL;
 990        struct ccwgroup_device *gdev;
 991        struct qeth_channel *channel;
 992        struct qeth_card *card;
 993
 994        /* while we hold the ccwdev lock, this stays valid: */
 995        gdev = dev_get_drvdata(&cdev->dev);
 996        card = dev_get_drvdata(&gdev->dev);
 997        if (!card)
 998                return;
 999
1000        QETH_CARD_TEXT(card, 5, "irq");
1001
1002        if (card->read.ccwdev == cdev) {
1003                channel = &card->read;
1004                QETH_CARD_TEXT(card, 5, "read");
1005        } else if (card->write.ccwdev == cdev) {
1006                channel = &card->write;
1007                QETH_CARD_TEXT(card, 5, "write");
1008        } else {
1009                channel = &card->data;
1010                QETH_CARD_TEXT(card, 5, "data");
1011        }
1012
1013        if (qeth_intparm_is_iob(intparm))
1014                iob = (struct qeth_cmd_buffer *) __va((addr_t)intparm);
1015
1016        rc = qeth_check_irb_error(card, cdev, irb);
1017        if (rc) {
1018                /* IO was terminated, free its resources. */
1019                if (iob)
1020                        qeth_cancel_cmd(iob, rc);
1021                atomic_set(&channel->irq_pending, 0);
1022                wake_up(&card->wait_q);
1023                return;
1024        }
1025
1026        atomic_set(&channel->irq_pending, 0);
1027
1028        if (irb->scsw.cmd.fctl & (SCSW_FCTL_CLEAR_FUNC))
1029                channel->state = CH_STATE_STOPPED;
1030
1031        if (irb->scsw.cmd.fctl & (SCSW_FCTL_HALT_FUNC))
1032                channel->state = CH_STATE_HALTED;
1033
1034        if (intparm == QETH_CLEAR_CHANNEL_PARM) {
1035                QETH_CARD_TEXT(card, 6, "clrchpar");
1036                /* we don't have to handle this further */
1037                intparm = 0;
1038        }
1039        if (intparm == QETH_HALT_CHANNEL_PARM) {
1040                QETH_CARD_TEXT(card, 6, "hltchpar");
1041                /* we don't have to handle this further */
1042                intparm = 0;
1043        }
1044
1045        cstat = irb->scsw.cmd.cstat;
1046        dstat = irb->scsw.cmd.dstat;
1047
1048        if ((dstat & DEV_STAT_UNIT_EXCEP) ||
1049            (dstat & DEV_STAT_UNIT_CHECK) ||
1050            (cstat)) {
1051                if (irb->esw.esw0.erw.cons) {
1052                        dev_warn(&channel->ccwdev->dev,
1053                                "The qeth device driver failed to recover "
1054                                "an error on the device\n");
1055                        QETH_DBF_MESSAGE(2, "sense data available on channel %x: cstat %#X dstat %#X\n",
1056                                         CCW_DEVID(channel->ccwdev), cstat,
1057                                         dstat);
1058                        print_hex_dump(KERN_WARNING, "qeth: irb ",
1059                                DUMP_PREFIX_OFFSET, 16, 1, irb, 32, 1);
1060                        print_hex_dump(KERN_WARNING, "qeth: sense data ",
1061                                DUMP_PREFIX_OFFSET, 16, 1, irb->ecw, 32, 1);
1062                }
1063
1064                rc = qeth_get_problem(card, cdev, irb);
1065                if (rc) {
1066                        card->read_or_write_problem = 1;
1067                        if (iob)
1068                                qeth_cancel_cmd(iob, rc);
1069                        qeth_clear_ipacmd_list(card);
1070                        qeth_schedule_recovery(card);
1071                        goto out;
1072                }
1073        }
1074
1075        if (iob && iob->callback)
1076                iob->callback(card, iob);
1077
1078out:
1079        wake_up(&card->wait_q);
1080        return;
1081}
1082
1083static void qeth_notify_skbs(struct qeth_qdio_out_q *q,
1084                struct qeth_qdio_out_buffer *buf,
1085                enum iucv_tx_notify notification)
1086{
1087        struct sk_buff *skb;
1088
1089        skb_queue_walk(&buf->skb_list, skb) {
1090                QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
1091                QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
1092                if (skb->protocol == htons(ETH_P_AF_IUCV) && skb->sk)
1093                        iucv_sk(skb->sk)->sk_txnotify(skb, notification);
1094        }
1095}
1096
1097static void qeth_release_skbs(struct qeth_qdio_out_buffer *buf)
1098{
1099        struct sk_buff *skb;
1100
1101        /* release may never happen from within CQ tasklet scope */
1102        WARN_ON_ONCE(atomic_read(&buf->state) == QETH_QDIO_BUF_IN_CQ);
1103
1104        if (atomic_read(&buf->state) == QETH_QDIO_BUF_PENDING)
1105                qeth_notify_skbs(buf->q, buf, TX_NOTIFY_GENERALERROR);
1106
1107        while ((skb = __skb_dequeue(&buf->skb_list)) != NULL)
1108                consume_skb(skb);
1109}
1110
1111static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
1112                                     struct qeth_qdio_out_buffer *buf)
1113{
1114        int i;
1115
1116        /* is PCI flag set on buffer? */
1117        if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ)
1118                atomic_dec(&queue->set_pci_flags_count);
1119
1120        qeth_release_skbs(buf);
1121
1122        for (i = 0; i < queue->max_elements; ++i) {
1123                if (buf->buffer->element[i].addr && buf->is_header[i])
1124                        kmem_cache_free(qeth_core_header_cache,
1125                                buf->buffer->element[i].addr);
1126                buf->is_header[i] = 0;
1127        }
1128
1129        qeth_scrub_qdio_buffer(buf->buffer, queue->max_elements);
1130        buf->next_element_to_fill = 0;
1131        atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY);
1132}
1133
1134static void qeth_drain_output_queue(struct qeth_qdio_out_q *q, bool free)
1135{
1136        int j;
1137
1138        for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
1139                if (!q->bufs[j])
1140                        continue;
1141                qeth_cleanup_handled_pending(q, j, 1);
1142                qeth_clear_output_buffer(q, q->bufs[j]);
1143                if (free) {
1144                        kmem_cache_free(qeth_qdio_outbuf_cache, q->bufs[j]);
1145                        q->bufs[j] = NULL;
1146                }
1147        }
1148}
1149
1150void qeth_drain_output_queues(struct qeth_card *card)
1151{
1152        int i;
1153
1154        QETH_CARD_TEXT(card, 2, "clearqdbf");
1155        /* clear outbound buffers to free skbs */
1156        for (i = 0; i < card->qdio.no_out_queues; ++i) {
1157                if (card->qdio.out_qs[i])
1158                        qeth_drain_output_queue(card->qdio.out_qs[i], false);
1159        }
1160}
1161EXPORT_SYMBOL_GPL(qeth_drain_output_queues);
1162
1163static void qeth_free_buffer_pool(struct qeth_card *card)
1164{
1165        struct qeth_buffer_pool_entry *pool_entry, *tmp;
1166        int i = 0;
1167        list_for_each_entry_safe(pool_entry, tmp,
1168                                 &card->qdio.init_pool.entry_list, init_list){
1169                for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
1170                        free_page((unsigned long)pool_entry->elements[i]);
1171                list_del(&pool_entry->init_list);
1172                kfree(pool_entry);
1173        }
1174}
1175
1176static void qeth_clean_channel(struct qeth_channel *channel)
1177{
1178        struct ccw_device *cdev = channel->ccwdev;
1179
1180        QETH_DBF_TEXT(SETUP, 2, "freech");
1181
1182        spin_lock_irq(get_ccwdev_lock(cdev));
1183        cdev->handler = NULL;
1184        spin_unlock_irq(get_ccwdev_lock(cdev));
1185}
1186
1187static void qeth_setup_channel(struct qeth_channel *channel)
1188{
1189        struct ccw_device *cdev = channel->ccwdev;
1190
1191        QETH_DBF_TEXT(SETUP, 2, "setupch");
1192
1193        channel->state = CH_STATE_DOWN;
1194        atomic_set(&channel->irq_pending, 0);
1195
1196        spin_lock_irq(get_ccwdev_lock(cdev));
1197        cdev->handler = qeth_irq;
1198        spin_unlock_irq(get_ccwdev_lock(cdev));
1199}
1200
1201static int qeth_osa_set_output_queues(struct qeth_card *card, bool single)
1202{
1203        unsigned int count = single ? 1 : card->dev->num_tx_queues;
1204        int rc;
1205
1206        rtnl_lock();
1207        rc = netif_set_real_num_tx_queues(card->dev, count);
1208        rtnl_unlock();
1209
1210        if (rc)
1211                return rc;
1212
1213        if (card->qdio.no_out_queues == count)
1214                return 0;
1215
1216        if (atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED)
1217                qeth_free_qdio_queues(card);
1218
1219        if (count == 1)
1220                dev_info(&card->gdev->dev, "Priority Queueing not supported\n");
1221
1222        card->qdio.default_out_queue = single ? 0 : QETH_DEFAULT_QUEUE;
1223        card->qdio.no_out_queues = count;
1224        return 0;
1225}
1226
1227static int qeth_update_from_chp_desc(struct qeth_card *card)
1228{
1229        struct ccw_device *ccwdev;
1230        struct channel_path_desc_fmt0 *chp_dsc;
1231        int rc = 0;
1232
1233        QETH_CARD_TEXT(card, 2, "chp_desc");
1234
1235        ccwdev = card->data.ccwdev;
1236        chp_dsc = ccw_device_get_chp_desc(ccwdev, 0);
1237        if (!chp_dsc)
1238                return -ENOMEM;
1239
1240        card->info.func_level = 0x4100 + chp_dsc->desc;
1241
1242        if (IS_OSD(card) || IS_OSX(card))
1243                /* CHPP field bit 6 == 1 -> single queue */
1244                rc = qeth_osa_set_output_queues(card, chp_dsc->chpp & 0x02);
1245
1246        kfree(chp_dsc);
1247        QETH_CARD_TEXT_(card, 2, "nr:%x", card->qdio.no_out_queues);
1248        QETH_CARD_TEXT_(card, 2, "lvl:%02x", card->info.func_level);
1249        return rc;
1250}
1251
1252static void qeth_init_qdio_info(struct qeth_card *card)
1253{
1254        QETH_CARD_TEXT(card, 4, "intqdinf");
1255        atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
1256        card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
1257        card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1258
1259        /* inbound */
1260        card->qdio.no_in_queues = 1;
1261        card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
1262        if (IS_IQD(card))
1263                card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT;
1264        else
1265                card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
1266        card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
1267        INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
1268        INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
1269}
1270
1271static void qeth_set_initial_options(struct qeth_card *card)
1272{
1273        card->options.route4.type = NO_ROUTER;
1274        card->options.route6.type = NO_ROUTER;
1275        card->options.rx_sg_cb = QETH_RX_SG_CB;
1276        card->options.isolation = ISOLATION_MODE_NONE;
1277        card->options.cq = QETH_CQ_DISABLED;
1278        card->options.layer = QETH_DISCIPLINE_UNDETERMINED;
1279}
1280
1281static int qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
1282{
1283        unsigned long flags;
1284        int rc = 0;
1285
1286        spin_lock_irqsave(&card->thread_mask_lock, flags);
1287        QETH_CARD_TEXT_(card, 4, "  %02x%02x%02x",
1288                        (u8) card->thread_start_mask,
1289                        (u8) card->thread_allowed_mask,
1290                        (u8) card->thread_running_mask);
1291        rc = (card->thread_start_mask & thread);
1292        spin_unlock_irqrestore(&card->thread_mask_lock, flags);
1293        return rc;
1294}
1295
1296static void qeth_start_kernel_thread(struct work_struct *work)
1297{
1298        struct task_struct *ts;
1299        struct qeth_card *card = container_of(work, struct qeth_card,
1300                                        kernel_thread_starter);
1301        QETH_CARD_TEXT(card , 2, "strthrd");
1302
1303        if (card->read.state != CH_STATE_UP &&
1304            card->write.state != CH_STATE_UP)
1305                return;
1306        if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
1307                ts = kthread_run(card->discipline->recover, (void *)card,
1308                                "qeth_recover");
1309                if (IS_ERR(ts)) {
1310                        qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
1311                        qeth_clear_thread_running_bit(card,
1312                                QETH_RECOVER_THREAD);
1313                }
1314        }
1315}
1316
1317static void qeth_buffer_reclaim_work(struct work_struct *);
1318static void qeth_setup_card(struct qeth_card *card)
1319{
1320        QETH_CARD_TEXT(card, 2, "setupcrd");
1321
1322        card->info.type = CARD_RDEV(card)->id.driver_info;
1323        card->state = CARD_STATE_DOWN;
1324        spin_lock_init(&card->lock);
1325        spin_lock_init(&card->thread_mask_lock);
1326        mutex_init(&card->conf_mutex);
1327        mutex_init(&card->discipline_mutex);
1328        INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread);
1329        INIT_LIST_HEAD(&card->cmd_waiter_list);
1330        init_waitqueue_head(&card->wait_q);
1331        qeth_set_initial_options(card);
1332        /* IP address takeover */
1333        INIT_LIST_HEAD(&card->ipato.entries);
1334        qeth_init_qdio_info(card);
1335        INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work);
1336        INIT_WORK(&card->close_dev_work, qeth_close_dev_handler);
1337}
1338
1339static void qeth_core_sl_print(struct seq_file *m, struct service_level *slr)
1340{
1341        struct qeth_card *card = container_of(slr, struct qeth_card,
1342                                        qeth_service_level);
1343        if (card->info.mcl_level[0])
1344                seq_printf(m, "qeth: %s firmware level %s\n",
1345                        CARD_BUS_ID(card), card->info.mcl_level);
1346}
1347
1348static struct qeth_card *qeth_alloc_card(struct ccwgroup_device *gdev)
1349{
1350        struct qeth_card *card;
1351
1352        QETH_DBF_TEXT(SETUP, 2, "alloccrd");
1353        card = kzalloc(sizeof(*card), GFP_KERNEL);
1354        if (!card)
1355                goto out;
1356        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
1357
1358        card->gdev = gdev;
1359        dev_set_drvdata(&gdev->dev, card);
1360        CARD_RDEV(card) = gdev->cdev[0];
1361        CARD_WDEV(card) = gdev->cdev[1];
1362        CARD_DDEV(card) = gdev->cdev[2];
1363
1364        card->event_wq = alloc_ordered_workqueue("%s_event", 0,
1365                                                 dev_name(&gdev->dev));
1366        if (!card->event_wq)
1367                goto out_wq;
1368
1369        card->read_cmd = qeth_alloc_cmd(&card->read, QETH_BUFSIZE, 1, 0);
1370        if (!card->read_cmd)
1371                goto out_read_cmd;
1372
1373        qeth_setup_channel(&card->read);
1374        qeth_setup_channel(&card->write);
1375        qeth_setup_channel(&card->data);
1376        card->qeth_service_level.seq_print = qeth_core_sl_print;
1377        register_service_level(&card->qeth_service_level);
1378        return card;
1379
1380out_read_cmd:
1381        destroy_workqueue(card->event_wq);
1382out_wq:
1383        dev_set_drvdata(&gdev->dev, NULL);
1384        kfree(card);
1385out:
1386        return NULL;
1387}
1388
1389static int qeth_clear_channel(struct qeth_card *card,
1390                              struct qeth_channel *channel)
1391{
1392        int rc;
1393
1394        QETH_CARD_TEXT(card, 3, "clearch");
1395        spin_lock_irq(get_ccwdev_lock(channel->ccwdev));
1396        rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM);
1397        spin_unlock_irq(get_ccwdev_lock(channel->ccwdev));
1398
1399        if (rc)
1400                return rc;
1401        rc = wait_event_interruptible_timeout(card->wait_q,
1402                        channel->state == CH_STATE_STOPPED, QETH_TIMEOUT);
1403        if (rc == -ERESTARTSYS)
1404                return rc;
1405        if (channel->state != CH_STATE_STOPPED)
1406                return -ETIME;
1407        channel->state = CH_STATE_DOWN;
1408        return 0;
1409}
1410
1411static int qeth_halt_channel(struct qeth_card *card,
1412                             struct qeth_channel *channel)
1413{
1414        int rc;
1415
1416        QETH_CARD_TEXT(card, 3, "haltch");
1417        spin_lock_irq(get_ccwdev_lock(channel->ccwdev));
1418        rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM);
1419        spin_unlock_irq(get_ccwdev_lock(channel->ccwdev));
1420
1421        if (rc)
1422                return rc;
1423        rc = wait_event_interruptible_timeout(card->wait_q,
1424                        channel->state == CH_STATE_HALTED, QETH_TIMEOUT);
1425        if (rc == -ERESTARTSYS)
1426                return rc;
1427        if (channel->state != CH_STATE_HALTED)
1428                return -ETIME;
1429        return 0;
1430}
1431
1432static int qeth_halt_channels(struct qeth_card *card)
1433{
1434        int rc1 = 0, rc2 = 0, rc3 = 0;
1435
1436        QETH_CARD_TEXT(card, 3, "haltchs");
1437        rc1 = qeth_halt_channel(card, &card->read);
1438        rc2 = qeth_halt_channel(card, &card->write);
1439        rc3 = qeth_halt_channel(card, &card->data);
1440        if (rc1)
1441                return rc1;
1442        if (rc2)
1443                return rc2;
1444        return rc3;
1445}
1446
1447static int qeth_clear_channels(struct qeth_card *card)
1448{
1449        int rc1 = 0, rc2 = 0, rc3 = 0;
1450
1451        QETH_CARD_TEXT(card, 3, "clearchs");
1452        rc1 = qeth_clear_channel(card, &card->read);
1453        rc2 = qeth_clear_channel(card, &card->write);
1454        rc3 = qeth_clear_channel(card, &card->data);
1455        if (rc1)
1456                return rc1;
1457        if (rc2)
1458                return rc2;
1459        return rc3;
1460}
1461
1462static int qeth_clear_halt_card(struct qeth_card *card, int halt)
1463{
1464        int rc = 0;
1465
1466        QETH_CARD_TEXT(card, 3, "clhacrd");
1467
1468        if (halt)
1469                rc = qeth_halt_channels(card);
1470        if (rc)
1471                return rc;
1472        return qeth_clear_channels(card);
1473}
1474
1475int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
1476{
1477        int rc = 0;
1478
1479        QETH_CARD_TEXT(card, 3, "qdioclr");
1480        switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED,
1481                QETH_QDIO_CLEANING)) {
1482        case QETH_QDIO_ESTABLISHED:
1483                if (IS_IQD(card))
1484                        rc = qdio_shutdown(CARD_DDEV(card),
1485                                QDIO_FLAG_CLEANUP_USING_HALT);
1486                else
1487                        rc = qdio_shutdown(CARD_DDEV(card),
1488                                QDIO_FLAG_CLEANUP_USING_CLEAR);
1489                if (rc)
1490                        QETH_CARD_TEXT_(card, 3, "1err%d", rc);
1491                atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
1492                break;
1493        case QETH_QDIO_CLEANING:
1494                return rc;
1495        default:
1496                break;
1497        }
1498        rc = qeth_clear_halt_card(card, use_halt);
1499        if (rc)
1500                QETH_CARD_TEXT_(card, 3, "2err%d", rc);
1501        card->state = CARD_STATE_DOWN;
1502        return rc;
1503}
1504EXPORT_SYMBOL_GPL(qeth_qdio_clear_card);
1505
1506static enum qeth_discipline_id qeth_vm_detect_layer(struct qeth_card *card)
1507{
1508        enum qeth_discipline_id disc = QETH_DISCIPLINE_UNDETERMINED;
1509        struct diag26c_vnic_resp *response = NULL;
1510        struct diag26c_vnic_req *request = NULL;
1511        struct ccw_dev_id id;
1512        char userid[80];
1513        int rc = 0;
1514
1515        QETH_CARD_TEXT(card, 2, "vmlayer");
1516
1517        cpcmd("QUERY USERID", userid, sizeof(userid), &rc);
1518        if (rc)
1519                goto out;
1520
1521        request = kzalloc(sizeof(*request), GFP_KERNEL | GFP_DMA);
1522        response = kzalloc(sizeof(*response), GFP_KERNEL | GFP_DMA);
1523        if (!request || !response) {
1524                rc = -ENOMEM;
1525                goto out;
1526        }
1527
1528        ccw_device_get_id(CARD_RDEV(card), &id);
1529        request->resp_buf_len = sizeof(*response);
1530        request->resp_version = DIAG26C_VERSION6_VM65918;
1531        request->req_format = DIAG26C_VNIC_INFO;
1532        ASCEBC(userid, 8);
1533        memcpy(&request->sys_name, userid, 8);
1534        request->devno = id.devno;
1535
1536        QETH_DBF_HEX(CTRL, 2, request, sizeof(*request));
1537        rc = diag26c(request, response, DIAG26C_PORT_VNIC);
1538        QETH_DBF_HEX(CTRL, 2, request, sizeof(*request));
1539        if (rc)
1540                goto out;
1541        QETH_DBF_HEX(CTRL, 2, response, sizeof(*response));
1542
1543        if (request->resp_buf_len < sizeof(*response) ||
1544            response->version != request->resp_version) {
1545                rc = -EIO;
1546                goto out;
1547        }
1548
1549        if (response->protocol == VNIC_INFO_PROT_L2)
1550                disc = QETH_DISCIPLINE_LAYER2;
1551        else if (response->protocol == VNIC_INFO_PROT_L3)
1552                disc = QETH_DISCIPLINE_LAYER3;
1553
1554out:
1555        kfree(response);
1556        kfree(request);
1557        if (rc)
1558                QETH_CARD_TEXT_(card, 2, "err%x", rc);
1559        return disc;
1560}
1561
1562/* Determine whether the device requires a specific layer discipline */
1563static enum qeth_discipline_id qeth_enforce_discipline(struct qeth_card *card)
1564{
1565        enum qeth_discipline_id disc = QETH_DISCIPLINE_UNDETERMINED;
1566
1567        if (IS_OSM(card) || IS_OSN(card))
1568                disc = QETH_DISCIPLINE_LAYER2;
1569        else if (IS_VM_NIC(card))
1570                disc = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 :
1571                                      qeth_vm_detect_layer(card);
1572
1573        switch (disc) {
1574        case QETH_DISCIPLINE_LAYER2:
1575                QETH_CARD_TEXT(card, 3, "force l2");
1576                break;
1577        case QETH_DISCIPLINE_LAYER3:
1578                QETH_CARD_TEXT(card, 3, "force l3");
1579                break;
1580        default:
1581                QETH_CARD_TEXT(card, 3, "force no");
1582        }
1583
1584        return disc;
1585}
1586
1587static void qeth_set_blkt_defaults(struct qeth_card *card)
1588{
1589        QETH_CARD_TEXT(card, 2, "cfgblkt");
1590
1591        if (card->info.use_v1_blkt) {
1592                card->info.blkt.time_total = 0;
1593                card->info.blkt.inter_packet = 0;
1594                card->info.blkt.inter_packet_jumbo = 0;
1595        } else {
1596                card->info.blkt.time_total = 250;
1597                card->info.blkt.inter_packet = 5;
1598                card->info.blkt.inter_packet_jumbo = 15;
1599        }
1600}
1601
1602static void qeth_init_tokens(struct qeth_card *card)
1603{
1604        card->token.issuer_rm_w = 0x00010103UL;
1605        card->token.cm_filter_w = 0x00010108UL;
1606        card->token.cm_connection_w = 0x0001010aUL;
1607        card->token.ulp_filter_w = 0x0001010bUL;
1608        card->token.ulp_connection_w = 0x0001010dUL;
1609}
1610
1611static void qeth_init_func_level(struct qeth_card *card)
1612{
1613        switch (card->info.type) {
1614        case QETH_CARD_TYPE_IQD:
1615                card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
1616                break;
1617        case QETH_CARD_TYPE_OSD:
1618        case QETH_CARD_TYPE_OSN:
1619                card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD;
1620                break;
1621        default:
1622                break;
1623        }
1624}
1625
1626static void qeth_idx_finalize_cmd(struct qeth_card *card,
1627                                  struct qeth_cmd_buffer *iob)
1628{
1629        memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data), &card->seqno.trans_hdr,
1630               QETH_SEQ_NO_LENGTH);
1631        if (iob->channel == &card->write)
1632                card->seqno.trans_hdr++;
1633}
1634
1635static int qeth_peer_func_level(int level)
1636{
1637        if ((level & 0xff) == 8)
1638                return (level & 0xff) + 0x400;
1639        if (((level >> 8) & 3) == 1)
1640                return (level & 0xff) + 0x200;
1641        return level;
1642}
1643
1644static void qeth_mpc_finalize_cmd(struct qeth_card *card,
1645                                  struct qeth_cmd_buffer *iob)
1646{
1647        qeth_idx_finalize_cmd(card, iob);
1648
1649        memcpy(QETH_PDU_HEADER_SEQ_NO(iob->data),
1650               &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
1651        card->seqno.pdu_hdr++;
1652        memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(iob->data),
1653               &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
1654
1655        iob->reply->seqno = QETH_IDX_COMMAND_SEQNO;
1656        iob->callback = qeth_release_buffer_cb;
1657}
1658
1659static struct qeth_cmd_buffer *qeth_mpc_alloc_cmd(struct qeth_card *card,
1660                                                  void *data,
1661                                                  unsigned int data_length)
1662{
1663        struct qeth_cmd_buffer *iob;
1664
1665        iob = qeth_alloc_cmd(&card->write, data_length, 1, QETH_TIMEOUT);
1666        if (!iob)
1667                return NULL;
1668
1669        memcpy(iob->data, data, data_length);
1670        qeth_setup_ccw(__ccw_from_cmd(iob), CCW_CMD_WRITE, 0, data_length,
1671                       iob->data);
1672        iob->finalize = qeth_mpc_finalize_cmd;
1673        return iob;
1674}
1675
1676/**
1677 * qeth_send_control_data() -   send control command to the card
1678 * @card:                       qeth_card structure pointer
1679 * @iob:                        qeth_cmd_buffer pointer
1680 * @reply_cb:                   callback function pointer
1681 * @cb_card:                    pointer to the qeth_card structure
1682 * @cb_reply:                   pointer to the qeth_reply structure
1683 * @cb_cmd:                     pointer to the original iob for non-IPA
1684 *                              commands, or to the qeth_ipa_cmd structure
1685 *                              for the IPA commands.
1686 * @reply_param:                private pointer passed to the callback
1687 *
1688 * Callback function gets called one or more times, with cb_cmd
1689 * pointing to the response returned by the hardware. Callback
1690 * function must return
1691 *   > 0 if more reply blocks are expected,
1692 *     0 if the last or only reply block is received, and
1693 *   < 0 on error.
1694 * Callback function can get the value of the reply_param pointer from the
1695 * field 'param' of the structure qeth_reply.
1696 */
1697
1698static int qeth_send_control_data(struct qeth_card *card,
1699                                  struct qeth_cmd_buffer *iob,
1700                                  int (*reply_cb)(struct qeth_card *cb_card,
1701                                                  struct qeth_reply *cb_reply,
1702                                                  unsigned long cb_cmd),
1703                                  void *reply_param)
1704{
1705        struct qeth_channel *channel = iob->channel;
1706        long timeout = iob->timeout;
1707        int rc;
1708        struct qeth_reply *reply = NULL;
1709
1710        QETH_CARD_TEXT(card, 2, "sendctl");
1711
1712        reply = qeth_alloc_reply(card);
1713        if (!reply) {
1714                qeth_put_cmd(iob);
1715                return -ENOMEM;
1716        }
1717        reply->callback = reply_cb;
1718        reply->param = reply_param;
1719
1720        /* pairs with qeth_put_cmd(): */
1721        qeth_get_reply(reply);
1722        iob->reply = reply;
1723
1724        timeout = wait_event_interruptible_timeout(card->wait_q,
1725                                                   qeth_trylock_channel(channel),
1726                                                   timeout);
1727        if (timeout <= 0) {
1728                qeth_put_reply(reply);
1729                qeth_put_cmd(iob);
1730                return (timeout == -ERESTARTSYS) ? -EINTR : -ETIME;
1731        }
1732
1733        if (iob->finalize)
1734                iob->finalize(card, iob);
1735        QETH_DBF_HEX(CTRL, 2, iob->data, min(iob->length, QETH_DBF_CTRL_LEN));
1736
1737        qeth_enqueue_reply(card, reply);
1738
1739        QETH_CARD_TEXT(card, 6, "noirqpnd");
1740        spin_lock_irq(get_ccwdev_lock(channel->ccwdev));
1741        rc = ccw_device_start_timeout(channel->ccwdev, __ccw_from_cmd(iob),
1742                                      (addr_t) iob, 0, 0, timeout);
1743        spin_unlock_irq(get_ccwdev_lock(channel->ccwdev));
1744        if (rc) {
1745                QETH_DBF_MESSAGE(2, "qeth_send_control_data on device %x: ccw_device_start rc = %i\n",
1746                                 CARD_DEVID(card), rc);
1747                QETH_CARD_TEXT_(card, 2, " err%d", rc);
1748                qeth_dequeue_reply(card, reply);
1749                qeth_put_reply(reply);
1750                qeth_put_cmd(iob);
1751                atomic_set(&channel->irq_pending, 0);
1752                wake_up(&card->wait_q);
1753                return rc;
1754        }
1755
1756        timeout = wait_for_completion_interruptible_timeout(&reply->received,
1757                                                            timeout);
1758        if (timeout <= 0)
1759                rc = (timeout == -ERESTARTSYS) ? -EINTR : -ETIME;
1760
1761        qeth_dequeue_reply(card, reply);
1762
1763        if (reply_cb) {
1764                /* Wait until the callback for a late reply has completed: */
1765                spin_lock_irq(&reply->lock);
1766                if (rc)
1767                        /* Zap any callback that's still pending: */
1768                        reply->rc = rc;
1769                spin_unlock_irq(&reply->lock);
1770        }
1771
1772        if (!rc)
1773                rc = reply->rc;
1774        qeth_put_reply(reply);
1775        return rc;
1776}
1777
1778static void qeth_read_conf_data_cb(struct qeth_card *card,
1779                                   struct qeth_cmd_buffer *iob)
1780{
1781        unsigned char *prcd = iob->data;
1782
1783        QETH_CARD_TEXT(card, 2, "cfgunit");
1784        card->info.chpid = prcd[30];
1785        card->info.unit_addr2 = prcd[31];
1786        card->info.cula = prcd[63];
1787        card->info.is_vm_nic = ((prcd[0x10] == _ascebc['V']) &&
1788                                (prcd[0x11] == _ascebc['M']));
1789        card->info.use_v1_blkt = prcd[74] == 0xF0 && prcd[75] == 0xF0 &&
1790                                 prcd[76] >= 0xF1 && prcd[76] <= 0xF4;
1791
1792        qeth_notify_reply(iob->reply, 0);
1793        qeth_put_cmd(iob);
1794}
1795
1796static int qeth_read_conf_data(struct qeth_card *card)
1797{
1798        struct qeth_channel *channel = &card->data;
1799        struct qeth_cmd_buffer *iob;
1800        struct ciw *ciw;
1801
1802        /* scan for RCD command in extended SenseID data */
1803        ciw = ccw_device_get_ciw(channel->ccwdev, CIW_TYPE_RCD);
1804        if (!ciw || ciw->cmd == 0)
1805                return -EOPNOTSUPP;
1806
1807        iob = qeth_alloc_cmd(channel, ciw->count, 1, QETH_RCD_TIMEOUT);
1808        if (!iob)
1809                return -ENOMEM;
1810
1811        iob->callback = qeth_read_conf_data_cb;
1812        qeth_setup_ccw(__ccw_from_cmd(iob), ciw->cmd, 0, iob->length,
1813                       iob->data);
1814
1815        return qeth_send_control_data(card, iob, NULL, NULL);
1816}
1817
1818static int qeth_idx_check_activate_response(struct qeth_card *card,
1819                                            struct qeth_channel *channel,
1820                                            struct qeth_cmd_buffer *iob)
1821{
1822        int rc;
1823
1824        rc = qeth_check_idx_response(card, iob->data);
1825        if (rc)
1826                return rc;
1827
1828        if (QETH_IS_IDX_ACT_POS_REPLY(iob->data))
1829                return 0;
1830
1831        /* negative reply: */
1832        QETH_CARD_TEXT_(card, 2, "idxneg%c",
1833                        QETH_IDX_ACT_CAUSE_CODE(iob->data));
1834
1835        switch (QETH_IDX_ACT_CAUSE_CODE(iob->data)) {
1836        case QETH_IDX_ACT_ERR_EXCL:
1837                dev_err(&channel->ccwdev->dev,
1838                        "The adapter is used exclusively by another host\n");
1839                return -EBUSY;
1840        case QETH_IDX_ACT_ERR_AUTH:
1841        case QETH_IDX_ACT_ERR_AUTH_USER:
1842                dev_err(&channel->ccwdev->dev,
1843                        "Setting the device online failed because of insufficient authorization\n");
1844                return -EPERM;
1845        default:
1846                QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: negative reply\n",
1847                                 CCW_DEVID(channel->ccwdev));
1848                return -EIO;
1849        }
1850}
1851
1852static void qeth_idx_activate_read_channel_cb(struct qeth_card *card,
1853                                              struct qeth_cmd_buffer *iob)
1854{
1855        struct qeth_channel *channel = iob->channel;
1856        u16 peer_level;
1857        int rc;
1858
1859        QETH_CARD_TEXT(card, 2, "idxrdcb");
1860
1861        rc = qeth_idx_check_activate_response(card, channel, iob);
1862        if (rc)
1863                goto out;
1864
1865        memcpy(&peer_level, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1866        if (peer_level != qeth_peer_func_level(card->info.func_level)) {
1867                QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: function level mismatch (sent: %#x, received: %#x)\n",
1868                                 CCW_DEVID(channel->ccwdev),
1869                                 card->info.func_level, peer_level);
1870                rc = -EINVAL;
1871                goto out;
1872        }
1873
1874        memcpy(&card->token.issuer_rm_r,
1875               QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1876               QETH_MPC_TOKEN_LENGTH);
1877        memcpy(&card->info.mcl_level[0],
1878               QETH_IDX_REPLY_LEVEL(iob->data), QETH_MCL_LENGTH);
1879
1880out:
1881        qeth_notify_reply(iob->reply, rc);
1882        qeth_put_cmd(iob);
1883}
1884
1885static void qeth_idx_activate_write_channel_cb(struct qeth_card *card,
1886                                               struct qeth_cmd_buffer *iob)
1887{
1888        struct qeth_channel *channel = iob->channel;
1889        u16 peer_level;
1890        int rc;
1891
1892        QETH_CARD_TEXT(card, 2, "idxwrcb");
1893
1894        rc = qeth_idx_check_activate_response(card, channel, iob);
1895        if (rc)
1896                goto out;
1897
1898        memcpy(&peer_level, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1899        if ((peer_level & ~0x0100) !=
1900            qeth_peer_func_level(card->info.func_level)) {
1901                QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: function level mismatch (sent: %#x, received: %#x)\n",
1902                                 CCW_DEVID(channel->ccwdev),
1903                                 card->info.func_level, peer_level);
1904                rc = -EINVAL;
1905        }
1906
1907out:
1908        qeth_notify_reply(iob->reply, rc);
1909        qeth_put_cmd(iob);
1910}
1911
1912static void qeth_idx_setup_activate_cmd(struct qeth_card *card,
1913                                        struct qeth_cmd_buffer *iob)
1914{
1915        u16 addr = (card->info.cula << 8) + card->info.unit_addr2;
1916        u8 port = ((u8)card->dev->dev_port) | 0x80;
1917        struct ccw1 *ccw = __ccw_from_cmd(iob);
1918        struct ccw_dev_id dev_id;
1919
1920        qeth_setup_ccw(&ccw[0], CCW_CMD_WRITE, CCW_FLAG_CC, IDX_ACTIVATE_SIZE,
1921                       iob->data);
1922        qeth_setup_ccw(&ccw[1], CCW_CMD_READ, 0, iob->length, iob->data);
1923        ccw_device_get_id(CARD_DDEV(card), &dev_id);
1924        iob->finalize = qeth_idx_finalize_cmd;
1925
1926        memcpy(QETH_IDX_ACT_PNO(iob->data), &port, 1);
1927        memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1928               &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
1929        memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data),
1930               &card->info.func_level, 2);
1931        memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &dev_id.devno, 2);
1932        memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &addr, 2);
1933}
1934
1935static int qeth_idx_activate_read_channel(struct qeth_card *card)
1936{
1937        struct qeth_channel *channel = &card->read;
1938        struct qeth_cmd_buffer *iob;
1939        int rc;
1940
1941        QETH_CARD_TEXT(card, 2, "idxread");
1942
1943        iob = qeth_alloc_cmd(channel, QETH_BUFSIZE, 2, QETH_TIMEOUT);
1944        if (!iob)
1945                return -ENOMEM;
1946
1947        memcpy(iob->data, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
1948        qeth_idx_setup_activate_cmd(card, iob);
1949        iob->callback = qeth_idx_activate_read_channel_cb;
1950
1951        rc = qeth_send_control_data(card, iob, NULL, NULL);
1952        if (rc)
1953                return rc;
1954
1955        channel->state = CH_STATE_UP;
1956        return 0;
1957}
1958
1959static int qeth_idx_activate_write_channel(struct qeth_card *card)
1960{
1961        struct qeth_channel *channel = &card->write;
1962        struct qeth_cmd_buffer *iob;
1963        int rc;
1964
1965        QETH_CARD_TEXT(card, 2, "idxwrite");
1966
1967        iob = qeth_alloc_cmd(channel, QETH_BUFSIZE, 2, QETH_TIMEOUT);
1968        if (!iob)
1969                return -ENOMEM;
1970
1971        memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
1972        qeth_idx_setup_activate_cmd(card, iob);
1973        iob->callback = qeth_idx_activate_write_channel_cb;
1974
1975        rc = qeth_send_control_data(card, iob, NULL, NULL);
1976        if (rc)
1977                return rc;
1978
1979        channel->state = CH_STATE_UP;
1980        return 0;
1981}
1982
1983static int qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
1984                unsigned long data)
1985{
1986        struct qeth_cmd_buffer *iob;
1987
1988        QETH_CARD_TEXT(card, 2, "cmenblcb");
1989
1990        iob = (struct qeth_cmd_buffer *) data;
1991        memcpy(&card->token.cm_filter_r,
1992               QETH_CM_ENABLE_RESP_FILTER_TOKEN(iob->data),
1993               QETH_MPC_TOKEN_LENGTH);
1994        return 0;
1995}
1996
1997static int qeth_cm_enable(struct qeth_card *card)
1998{
1999        struct qeth_cmd_buffer *iob;
2000
2001        QETH_CARD_TEXT(card, 2, "cmenable");
2002
2003        iob = qeth_mpc_alloc_cmd(card, CM_ENABLE, CM_ENABLE_SIZE);
2004        if (!iob)
2005                return -ENOMEM;
2006
2007        memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(iob->data),
2008               &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2009        memcpy(QETH_CM_ENABLE_FILTER_TOKEN(iob->data),
2010               &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
2011
2012        return qeth_send_control_data(card, iob, qeth_cm_enable_cb, NULL);
2013}
2014
2015static int qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2016                unsigned long data)
2017{
2018        struct qeth_cmd_buffer *iob;
2019
2020        QETH_CARD_TEXT(card, 2, "cmsetpcb");
2021
2022        iob = (struct qeth_cmd_buffer *) data;
2023        memcpy(&card->token.cm_connection_r,
2024               QETH_CM_SETUP_RESP_DEST_ADDR(iob->data),
2025               QETH_MPC_TOKEN_LENGTH);
2026        return 0;
2027}
2028
2029static int qeth_cm_setup(struct qeth_card *card)
2030{
2031        struct qeth_cmd_buffer *iob;
2032
2033        QETH_CARD_TEXT(card, 2, "cmsetup");
2034
2035        iob = qeth_mpc_alloc_cmd(card, CM_SETUP, CM_SETUP_SIZE);
2036        if (!iob)
2037                return -ENOMEM;
2038
2039        memcpy(QETH_CM_SETUP_DEST_ADDR(iob->data),
2040               &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2041        memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(iob->data),
2042               &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
2043        memcpy(QETH_CM_SETUP_FILTER_TOKEN(iob->data),
2044               &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
2045        return qeth_send_control_data(card, iob, qeth_cm_setup_cb, NULL);
2046}
2047
2048static int qeth_update_max_mtu(struct qeth_card *card, unsigned int max_mtu)
2049{
2050        struct net_device *dev = card->dev;
2051        unsigned int new_mtu;
2052
2053        if (!max_mtu) {
2054                /* IQD needs accurate max MTU to set up its RX buffers: */
2055                if (IS_IQD(card))
2056                        return -EINVAL;
2057                /* tolerate quirky HW: */
2058                max_mtu = ETH_MAX_MTU;
2059        }
2060
2061        rtnl_lock();
2062        if (IS_IQD(card)) {
2063                /* move any device with default MTU to new max MTU: */
2064                new_mtu = (dev->mtu == dev->max_mtu) ? max_mtu : dev->mtu;
2065
2066                /* adjust RX buffer size to new max MTU: */
2067                card->qdio.in_buf_size = max_mtu + 2 * PAGE_SIZE;
2068                if (dev->max_mtu && dev->max_mtu != max_mtu)
2069                        qeth_free_qdio_queues(card);
2070        } else {
2071                if (dev->mtu)
2072                        new_mtu = dev->mtu;
2073                /* default MTUs for first setup: */
2074                else if (IS_LAYER2(card))
2075                        new_mtu = ETH_DATA_LEN;
2076                else
2077                        new_mtu = ETH_DATA_LEN - 8; /* allow for LLC + SNAP */
2078        }
2079
2080        dev->max_mtu = max_mtu;
2081        dev->mtu = min(new_mtu, max_mtu);
2082        rtnl_unlock();
2083        return 0;
2084}
2085
2086static int qeth_get_mtu_outof_framesize(int framesize)
2087{
2088        switch (framesize) {
2089        case 0x4000:
2090                return 8192;
2091        case 0x6000:
2092                return 16384;
2093        case 0xa000:
2094                return 32768;
2095        case 0xffff:
2096                return 57344;
2097        default:
2098                return 0;
2099        }
2100}
2101
2102static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2103                unsigned long data)
2104{
2105        __u16 mtu, framesize;
2106        __u16 len;
2107        __u8 link_type;
2108        struct qeth_cmd_buffer *iob;
2109
2110        QETH_CARD_TEXT(card, 2, "ulpenacb");
2111
2112        iob = (struct qeth_cmd_buffer *) data;
2113        memcpy(&card->token.ulp_filter_r,
2114               QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
2115               QETH_MPC_TOKEN_LENGTH);
2116        if (IS_IQD(card)) {
2117                memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
2118                mtu = qeth_get_mtu_outof_framesize(framesize);
2119        } else {
2120                mtu = *(__u16 *)QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data);
2121        }
2122        *(u16 *)reply->param = mtu;
2123
2124        memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(iob->data), 2);
2125        if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
2126                memcpy(&link_type,
2127                       QETH_ULP_ENABLE_RESP_LINK_TYPE(iob->data), 1);
2128                card->info.link_type = link_type;
2129        } else
2130                card->info.link_type = 0;
2131        QETH_CARD_TEXT_(card, 2, "link%d", card->info.link_type);
2132        return 0;
2133}
2134
2135static u8 qeth_mpc_select_prot_type(struct qeth_card *card)
2136{
2137        if (IS_OSN(card))
2138                return QETH_PROT_OSN2;
2139        return IS_LAYER2(card) ? QETH_PROT_LAYER2 : QETH_PROT_TCPIP;
2140}
2141
2142static int qeth_ulp_enable(struct qeth_card *card)
2143{
2144        u8 prot_type = qeth_mpc_select_prot_type(card);
2145        struct qeth_cmd_buffer *iob;
2146        u16 max_mtu;
2147        int rc;
2148
2149        QETH_CARD_TEXT(card, 2, "ulpenabl");
2150
2151        iob = qeth_mpc_alloc_cmd(card, ULP_ENABLE, ULP_ENABLE_SIZE);
2152        if (!iob)
2153                return -ENOMEM;
2154
2155        *(QETH_ULP_ENABLE_LINKNUM(iob->data)) = (u8) card->dev->dev_port;
2156        memcpy(QETH_ULP_ENABLE_PROT_TYPE(iob->data), &prot_type, 1);
2157        memcpy(QETH_ULP_ENABLE_DEST_ADDR(iob->data),
2158               &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2159        memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
2160               &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
2161        rc = qeth_send_control_data(card, iob, qeth_ulp_enable_cb, &max_mtu);
2162        if (rc)
2163                return rc;
2164        return qeth_update_max_mtu(card, max_mtu);
2165}
2166
2167static int qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2168                unsigned long data)
2169{
2170        struct qeth_cmd_buffer *iob;
2171
2172        QETH_CARD_TEXT(card, 2, "ulpstpcb");
2173
2174        iob = (struct qeth_cmd_buffer *) data;
2175        memcpy(&card->token.ulp_connection_r,
2176               QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
2177               QETH_MPC_TOKEN_LENGTH);
2178        if (!strncmp("00S", QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
2179                     3)) {
2180                QETH_CARD_TEXT(card, 2, "olmlimit");
2181                dev_err(&card->gdev->dev, "A connection could not be "
2182                        "established because of an OLM limit\n");
2183                return -EMLINK;
2184        }
2185        return 0;
2186}
2187
2188static int qeth_ulp_setup(struct qeth_card *card)
2189{
2190        __u16 temp;
2191        struct qeth_cmd_buffer *iob;
2192        struct ccw_dev_id dev_id;
2193
2194        QETH_CARD_TEXT(card, 2, "ulpsetup");
2195
2196        iob = qeth_mpc_alloc_cmd(card, ULP_SETUP, ULP_SETUP_SIZE);
2197        if (!iob)
2198                return -ENOMEM;
2199
2200        memcpy(QETH_ULP_SETUP_DEST_ADDR(iob->data),
2201               &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2202        memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(iob->data),
2203               &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
2204        memcpy(QETH_ULP_SETUP_FILTER_TOKEN(iob->data),
2205               &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
2206
2207        ccw_device_get_id(CARD_DDEV(card), &dev_id);
2208        memcpy(QETH_ULP_SETUP_CUA(iob->data), &dev_id.devno, 2);
2209        temp = (card->info.cula << 8) + card->info.unit_addr2;
2210        memcpy(QETH_ULP_SETUP_REAL_DEVADDR(iob->data), &temp, 2);
2211        return qeth_send_control_data(card, iob, qeth_ulp_setup_cb, NULL);
2212}
2213
2214static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *q, int bidx)
2215{
2216        struct qeth_qdio_out_buffer *newbuf;
2217
2218        newbuf = kmem_cache_zalloc(qeth_qdio_outbuf_cache, GFP_ATOMIC);
2219        if (!newbuf)
2220                return -ENOMEM;
2221
2222        newbuf->buffer = q->qdio_bufs[bidx];
2223        skb_queue_head_init(&newbuf->skb_list);
2224        lockdep_set_class(&newbuf->skb_list.lock, &qdio_out_skb_queue_key);
2225        newbuf->q = q;
2226        newbuf->next_pending = q->bufs[bidx];
2227        atomic_set(&newbuf->state, QETH_QDIO_BUF_EMPTY);
2228        q->bufs[bidx] = newbuf;
2229        return 0;
2230}
2231
2232static void qeth_free_output_queue(struct qeth_qdio_out_q *q)
2233{
2234        if (!q)
2235                return;
2236
2237        qeth_drain_output_queue(q, true);
2238        qdio_free_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
2239        kfree(q);
2240}
2241
2242static struct qeth_qdio_out_q *qeth_alloc_output_queue(void)
2243{
2244        struct qeth_qdio_out_q *q = kzalloc(sizeof(*q), GFP_KERNEL);
2245
2246        if (!q)
2247                return NULL;
2248
2249        if (qdio_alloc_buffers(q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q)) {
2250                kfree(q);
2251                return NULL;
2252        }
2253        return q;
2254}
2255
2256static int qeth_alloc_qdio_queues(struct qeth_card *card)
2257{
2258        int i, j;
2259
2260        QETH_CARD_TEXT(card, 2, "allcqdbf");
2261
2262        if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
2263                QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED)
2264                return 0;
2265
2266        QETH_CARD_TEXT(card, 2, "inq");
2267        card->qdio.in_q = qeth_alloc_qdio_queue();
2268        if (!card->qdio.in_q)
2269                goto out_nomem;
2270
2271        /* inbound buffer pool */
2272        if (qeth_alloc_buffer_pool(card))
2273                goto out_freeinq;
2274
2275        /* outbound */
2276        for (i = 0; i < card->qdio.no_out_queues; ++i) {
2277                card->qdio.out_qs[i] = qeth_alloc_output_queue();
2278                if (!card->qdio.out_qs[i])
2279                        goto out_freeoutq;
2280                QETH_CARD_TEXT_(card, 2, "outq %i", i);
2281                QETH_CARD_HEX(card, 2, &card->qdio.out_qs[i], sizeof(void *));
2282                card->qdio.out_qs[i]->card = card;
2283                card->qdio.out_qs[i]->queue_no = i;
2284                /* give outbound qeth_qdio_buffers their qdio_buffers */
2285                for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2286                        WARN_ON(card->qdio.out_qs[i]->bufs[j] != NULL);
2287                        if (qeth_init_qdio_out_buf(card->qdio.out_qs[i], j))
2288                                goto out_freeoutqbufs;
2289                }
2290        }
2291
2292        /* completion */
2293        if (qeth_alloc_cq(card))
2294                goto out_freeoutq;
2295
2296        return 0;
2297
2298out_freeoutqbufs:
2299        while (j > 0) {
2300                --j;
2301                kmem_cache_free(qeth_qdio_outbuf_cache,
2302                                card->qdio.out_qs[i]->bufs[j]);
2303                card->qdio.out_qs[i]->bufs[j] = NULL;
2304        }
2305out_freeoutq:
2306        while (i > 0) {
2307                qeth_free_output_queue(card->qdio.out_qs[--i]);
2308                card->qdio.out_qs[i] = NULL;
2309        }
2310        qeth_free_buffer_pool(card);
2311out_freeinq:
2312        qeth_free_qdio_queue(card->qdio.in_q);
2313        card->qdio.in_q = NULL;
2314out_nomem:
2315        atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
2316        return -ENOMEM;
2317}
2318
2319static void qeth_free_qdio_queues(struct qeth_card *card)
2320{
2321        int i, j;
2322
2323        if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
2324                QETH_QDIO_UNINITIALIZED)
2325                return;
2326
2327        qeth_free_cq(card);
2328        cancel_delayed_work_sync(&card->buffer_reclaim_work);
2329        for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
2330                if (card->qdio.in_q->bufs[j].rx_skb)
2331                        dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
2332        }
2333        qeth_free_qdio_queue(card->qdio.in_q);
2334        card->qdio.in_q = NULL;
2335        /* inbound buffer pool */
2336        qeth_free_buffer_pool(card);
2337        /* free outbound qdio_qs */
2338        for (i = 0; i < card->qdio.no_out_queues; i++) {
2339                qeth_free_output_queue(card->qdio.out_qs[i]);
2340                card->qdio.out_qs[i] = NULL;
2341        }
2342}
2343
2344static void qeth_create_qib_param_field(struct qeth_card *card,
2345                char *param_field)
2346{
2347
2348        param_field[0] = _ascebc['P'];
2349        param_field[1] = _ascebc['C'];
2350        param_field[2] = _ascebc['I'];
2351        param_field[3] = _ascebc['T'];
2352        *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
2353        *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
2354        *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
2355}
2356
2357static void qeth_create_qib_param_field_blkt(struct qeth_card *card,
2358                char *param_field)
2359{
2360        param_field[16] = _ascebc['B'];
2361        param_field[17] = _ascebc['L'];
2362        param_field[18] = _ascebc['K'];
2363        param_field[19] = _ascebc['T'];
2364        *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
2365        *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
2366        *((unsigned int *) (&param_field[28])) =
2367                card->info.blkt.inter_packet_jumbo;
2368}
2369
2370static int qeth_qdio_activate(struct qeth_card *card)
2371{
2372        QETH_CARD_TEXT(card, 3, "qdioact");
2373        return qdio_activate(CARD_DDEV(card));
2374}
2375
2376static int qeth_dm_act(struct qeth_card *card)
2377{
2378        struct qeth_cmd_buffer *iob;
2379
2380        QETH_CARD_TEXT(card, 2, "dmact");
2381
2382        iob = qeth_mpc_alloc_cmd(card, DM_ACT, DM_ACT_SIZE);
2383        if (!iob)
2384                return -ENOMEM;
2385
2386        memcpy(QETH_DM_ACT_DEST_ADDR(iob->data),
2387               &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2388        memcpy(QETH_DM_ACT_CONNECTION_TOKEN(iob->data),
2389               &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2390        return qeth_send_control_data(card, iob, NULL, NULL);
2391}
2392
2393static int qeth_mpc_initialize(struct qeth_card *card)
2394{
2395        int rc;
2396
2397        QETH_CARD_TEXT(card, 2, "mpcinit");
2398
2399        rc = qeth_issue_next_read(card);
2400        if (rc) {
2401                QETH_CARD_TEXT_(card, 2, "1err%d", rc);
2402                return rc;
2403        }
2404        rc = qeth_cm_enable(card);
2405        if (rc) {
2406                QETH_CARD_TEXT_(card, 2, "2err%d", rc);
2407                goto out_qdio;
2408        }
2409        rc = qeth_cm_setup(card);
2410        if (rc) {
2411                QETH_CARD_TEXT_(card, 2, "3err%d", rc);
2412                goto out_qdio;
2413        }
2414        rc = qeth_ulp_enable(card);
2415        if (rc) {
2416                QETH_CARD_TEXT_(card, 2, "4err%d", rc);
2417                goto out_qdio;
2418        }
2419        rc = qeth_ulp_setup(card);
2420        if (rc) {
2421                QETH_CARD_TEXT_(card, 2, "5err%d", rc);
2422                goto out_qdio;
2423        }
2424        rc = qeth_alloc_qdio_queues(card);
2425        if (rc) {
2426                QETH_CARD_TEXT_(card, 2, "5err%d", rc);
2427                goto out_qdio;
2428        }
2429        rc = qeth_qdio_establish(card);
2430        if (rc) {
2431                QETH_CARD_TEXT_(card, 2, "6err%d", rc);
2432                qeth_free_qdio_queues(card);
2433                goto out_qdio;
2434        }
2435        rc = qeth_qdio_activate(card);
2436        if (rc) {
2437                QETH_CARD_TEXT_(card, 2, "7err%d", rc);
2438                goto out_qdio;
2439        }
2440        rc = qeth_dm_act(card);
2441        if (rc) {
2442                QETH_CARD_TEXT_(card, 2, "8err%d", rc);
2443                goto out_qdio;
2444        }
2445
2446        return 0;
2447out_qdio:
2448        qeth_qdio_clear_card(card, !IS_IQD(card));
2449        qdio_free(CARD_DDEV(card));
2450        return rc;
2451}
2452
2453void qeth_print_status_message(struct qeth_card *card)
2454{
2455        switch (card->info.type) {
2456        case QETH_CARD_TYPE_OSD:
2457        case QETH_CARD_TYPE_OSM:
2458        case QETH_CARD_TYPE_OSX:
2459                /* VM will use a non-zero first character
2460                 * to indicate a HiperSockets like reporting
2461                 * of the level OSA sets the first character to zero
2462                 * */
2463                if (!card->info.mcl_level[0]) {
2464                        sprintf(card->info.mcl_level, "%02x%02x",
2465                                card->info.mcl_level[2],
2466                                card->info.mcl_level[3]);
2467                        break;
2468                }
2469                /* fallthrough */
2470        case QETH_CARD_TYPE_IQD:
2471                if (IS_VM_NIC(card) || (card->info.mcl_level[0] & 0x80)) {
2472                        card->info.mcl_level[0] = (char) _ebcasc[(__u8)
2473                                card->info.mcl_level[0]];
2474                        card->info.mcl_level[1] = (char) _ebcasc[(__u8)
2475                                card->info.mcl_level[1]];
2476                        card->info.mcl_level[2] = (char) _ebcasc[(__u8)
2477                                card->info.mcl_level[2]];
2478                        card->info.mcl_level[3] = (char) _ebcasc[(__u8)
2479                                card->info.mcl_level[3]];
2480                        card->info.mcl_level[QETH_MCL_LENGTH] = 0;
2481                }
2482                break;
2483        default:
2484                memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
2485        }
2486        dev_info(&card->gdev->dev,
2487                 "Device is a%s card%s%s%s\nwith link type %s.\n",
2488                 qeth_get_cardname(card),
2489                 (card->info.mcl_level[0]) ? " (level: " : "",
2490                 (card->info.mcl_level[0]) ? card->info.mcl_level : "",
2491                 (card->info.mcl_level[0]) ? ")" : "",
2492                 qeth_get_cardname_short(card));
2493}
2494EXPORT_SYMBOL_GPL(qeth_print_status_message);
2495
2496static void qeth_initialize_working_pool_list(struct qeth_card *card)
2497{
2498        struct qeth_buffer_pool_entry *entry;
2499
2500        QETH_CARD_TEXT(card, 5, "inwrklst");
2501
2502        list_for_each_entry(entry,
2503                            &card->qdio.init_pool.entry_list, init_list) {
2504                qeth_put_buffer_pool_entry(card, entry);
2505        }
2506}
2507
2508static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry(
2509                                        struct qeth_card *card)
2510{
2511        struct list_head *plh;
2512        struct qeth_buffer_pool_entry *entry;
2513        int i, free;
2514        struct page *page;
2515
2516        if (list_empty(&card->qdio.in_buf_pool.entry_list))
2517                return NULL;
2518
2519        list_for_each(plh, &card->qdio.in_buf_pool.entry_list) {
2520                entry = list_entry(plh, struct qeth_buffer_pool_entry, list);
2521                free = 1;
2522                for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2523                        if (page_count(virt_to_page(entry->elements[i])) > 1) {
2524                                free = 0;
2525                                break;
2526                        }
2527                }
2528                if (free) {
2529                        list_del_init(&entry->list);
2530                        return entry;
2531                }
2532        }
2533
2534        /* no free buffer in pool so take first one and swap pages */
2535        entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
2536                        struct qeth_buffer_pool_entry, list);
2537        for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2538                if (page_count(virt_to_page(entry->elements[i])) > 1) {
2539                        page = alloc_page(GFP_ATOMIC);
2540                        if (!page) {
2541                                return NULL;
2542                        } else {
2543                                free_page((unsigned long)entry->elements[i]);
2544                                entry->elements[i] = page_address(page);
2545                                QETH_CARD_STAT_INC(card, rx_sg_alloc_page);
2546                        }
2547                }
2548        }
2549        list_del_init(&entry->list);
2550        return entry;
2551}
2552
2553static int qeth_init_input_buffer(struct qeth_card *card,
2554                struct qeth_qdio_buffer *buf)
2555{
2556        struct qeth_buffer_pool_entry *pool_entry;
2557        int i;
2558
2559        if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) {
2560                buf->rx_skb = netdev_alloc_skb(card->dev,
2561                                               QETH_RX_PULL_LEN + ETH_HLEN);
2562                if (!buf->rx_skb)
2563                        return 1;
2564        }
2565
2566        pool_entry = qeth_find_free_buffer_pool_entry(card);
2567        if (!pool_entry)
2568                return 1;
2569
2570        /*
2571         * since the buffer is accessed only from the input_tasklet
2572         * there shouldn't be a need to synchronize; also, since we use
2573         * the QETH_IN_BUF_REQUEUE_THRESHOLD we should never run  out off
2574         * buffers
2575         */
2576
2577        buf->pool_entry = pool_entry;
2578        for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2579                buf->buffer->element[i].length = PAGE_SIZE;
2580                buf->buffer->element[i].addr =  pool_entry->elements[i];
2581                if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2582                        buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
2583                else
2584                        buf->buffer->element[i].eflags = 0;
2585                buf->buffer->element[i].sflags = 0;
2586        }
2587        return 0;
2588}
2589
2590int qeth_init_qdio_queues(struct qeth_card *card)
2591{
2592        unsigned int i;
2593        int rc;
2594
2595        QETH_CARD_TEXT(card, 2, "initqdqs");
2596
2597        /* inbound queue */
2598        qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
2599        memset(&card->rx, 0, sizeof(struct qeth_rx));
2600        qeth_initialize_working_pool_list(card);
2601        /*give only as many buffers to hardware as we have buffer pool entries*/
2602        for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
2603                qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
2604        card->qdio.in_q->next_buf_to_init =
2605                card->qdio.in_buf_pool.buf_count - 1;
2606        rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
2607                     card->qdio.in_buf_pool.buf_count - 1);
2608        if (rc) {
2609                QETH_CARD_TEXT_(card, 2, "1err%d", rc);
2610                return rc;
2611        }
2612
2613        /* completion */
2614        rc = qeth_cq_init(card);
2615        if (rc) {
2616                return rc;
2617        }
2618
2619        /* outbound queue */
2620        for (i = 0; i < card->qdio.no_out_queues; ++i) {
2621                struct qeth_qdio_out_q *queue = card->qdio.out_qs[i];
2622
2623                qdio_reset_buffers(queue->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
2624                queue->max_elements = QETH_MAX_BUFFER_ELEMENTS(card);
2625                queue->next_buf_to_fill = 0;
2626                queue->do_pack = 0;
2627                atomic_set(&queue->used_buffers, 0);
2628                atomic_set(&queue->set_pci_flags_count, 0);
2629                atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
2630        }
2631        return 0;
2632}
2633EXPORT_SYMBOL_GPL(qeth_init_qdio_queues);
2634
2635static void qeth_ipa_finalize_cmd(struct qeth_card *card,
2636                                  struct qeth_cmd_buffer *iob)
2637{
2638        qeth_mpc_finalize_cmd(card, iob);
2639
2640        /* override with IPA-specific values: */
2641        __ipa_cmd(iob)->hdr.seqno = card->seqno.ipa;
2642        iob->reply->seqno = card->seqno.ipa++;
2643}
2644
2645void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2646                          u16 cmd_length)
2647{
2648        u8 prot_type = qeth_mpc_select_prot_type(card);
2649        u16 total_length = iob->length;
2650
2651        qeth_setup_ccw(__ccw_from_cmd(iob), CCW_CMD_WRITE, 0, total_length,
2652                       iob->data);
2653        iob->finalize = qeth_ipa_finalize_cmd;
2654
2655        memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
2656        memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &total_length, 2);
2657        memcpy(QETH_IPA_CMD_PROT_TYPE(iob->data), &prot_type, 1);
2658        memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &cmd_length, 2);
2659        memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &cmd_length, 2);
2660        memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
2661               &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
2662        memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &cmd_length, 2);
2663}
2664EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd);
2665
2666struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card,
2667                                           enum qeth_ipa_cmds cmd_code,
2668                                           enum qeth_prot_versions prot,
2669                                           unsigned int data_length)
2670{
2671        enum qeth_link_types link_type = card->info.link_type;
2672        struct qeth_cmd_buffer *iob;
2673        struct qeth_ipacmd_hdr *hdr;
2674
2675        data_length += offsetof(struct qeth_ipa_cmd, data);
2676        iob = qeth_alloc_cmd(&card->write, IPA_PDU_HEADER_SIZE + data_length, 1,
2677                             QETH_IPA_TIMEOUT);
2678        if (!iob)
2679                return NULL;
2680
2681        qeth_prepare_ipa_cmd(card, iob, data_length);
2682
2683        hdr = &__ipa_cmd(iob)->hdr;
2684        hdr->command = cmd_code;
2685        hdr->initiator = IPA_CMD_INITIATOR_HOST;
2686        /* hdr->seqno is set by qeth_send_control_data() */
2687        hdr->adapter_type = (link_type == QETH_LINK_TYPE_HSTR) ? 2 : 1;
2688        hdr->rel_adapter_no = (u8) card->dev->dev_port;
2689        hdr->prim_version_no = IS_LAYER2(card) ? 2 : 1;
2690        hdr->param_count = 1;
2691        hdr->prot_version = prot;
2692        return iob;
2693}
2694EXPORT_SYMBOL_GPL(qeth_ipa_alloc_cmd);
2695
2696static int qeth_send_ipa_cmd_cb(struct qeth_card *card,
2697                                struct qeth_reply *reply, unsigned long data)
2698{
2699        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2700
2701        return (cmd->hdr.return_code) ? -EIO : 0;
2702}
2703
2704/**
2705 * qeth_send_ipa_cmd() - send an IPA command
2706 *
2707 * See qeth_send_control_data() for explanation of the arguments.
2708 */
2709
2710int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2711                int (*reply_cb)(struct qeth_card *, struct qeth_reply*,
2712                        unsigned long),
2713                void *reply_param)
2714{
2715        int rc;
2716
2717        QETH_CARD_TEXT(card, 4, "sendipa");
2718
2719        if (card->read_or_write_problem) {
2720                qeth_put_cmd(iob);
2721                return -EIO;
2722        }
2723
2724        if (reply_cb == NULL)
2725                reply_cb = qeth_send_ipa_cmd_cb;
2726        rc = qeth_send_control_data(card, iob, reply_cb, reply_param);
2727        if (rc == -ETIME) {
2728                qeth_clear_ipacmd_list(card);
2729                qeth_schedule_recovery(card);
2730        }
2731        return rc;
2732}
2733EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
2734
2735static int qeth_send_startlan_cb(struct qeth_card *card,
2736                                 struct qeth_reply *reply, unsigned long data)
2737{
2738        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2739
2740        if (cmd->hdr.return_code == IPA_RC_LAN_OFFLINE)
2741                return -ENETDOWN;
2742
2743        return (cmd->hdr.return_code) ? -EIO : 0;
2744}
2745
2746static int qeth_send_startlan(struct qeth_card *card)
2747{
2748        struct qeth_cmd_buffer *iob;
2749
2750        QETH_CARD_TEXT(card, 2, "strtlan");
2751
2752        iob = qeth_ipa_alloc_cmd(card, IPA_CMD_STARTLAN, QETH_PROT_NONE, 0);
2753        if (!iob)
2754                return -ENOMEM;
2755        return qeth_send_ipa_cmd(card, iob, qeth_send_startlan_cb, NULL);
2756}
2757
2758static int qeth_setadpparms_inspect_rc(struct qeth_ipa_cmd *cmd)
2759{
2760        if (!cmd->hdr.return_code)
2761                cmd->hdr.return_code =
2762                        cmd->data.setadapterparms.hdr.return_code;
2763        return cmd->hdr.return_code;
2764}
2765
2766static int qeth_query_setadapterparms_cb(struct qeth_card *card,
2767                struct qeth_reply *reply, unsigned long data)
2768{
2769        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2770
2771        QETH_CARD_TEXT(card, 3, "quyadpcb");
2772        if (qeth_setadpparms_inspect_rc(cmd))
2773                return -EIO;
2774
2775        if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) {
2776                card->info.link_type =
2777                      cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
2778                QETH_CARD_TEXT_(card, 2, "lnk %d", card->info.link_type);
2779        }
2780        card->options.adp.supported_funcs =
2781                cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
2782        return 0;
2783}
2784
2785static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
2786                                                    enum qeth_ipa_setadp_cmd adp_cmd,
2787                                                    unsigned int data_length)
2788{
2789        struct qeth_ipacmd_setadpparms_hdr *hdr;
2790        struct qeth_cmd_buffer *iob;
2791
2792        iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETADAPTERPARMS, QETH_PROT_IPV4,
2793                                 data_length +
2794                                 offsetof(struct qeth_ipacmd_setadpparms,
2795                                          data));
2796        if (!iob)
2797                return NULL;
2798
2799        hdr = &__ipa_cmd(iob)->data.setadapterparms.hdr;
2800        hdr->cmdlength = sizeof(*hdr) + data_length;
2801        hdr->command_code = adp_cmd;
2802        hdr->used_total = 1;
2803        hdr->seq_no = 1;
2804        return iob;
2805}
2806
2807static int qeth_query_setadapterparms(struct qeth_card *card)
2808{
2809        int rc;
2810        struct qeth_cmd_buffer *iob;
2811
2812        QETH_CARD_TEXT(card, 3, "queryadp");
2813        iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
2814                                   SETADP_DATA_SIZEOF(query_cmds_supp));
2815        if (!iob)
2816                return -ENOMEM;
2817        rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
2818        return rc;
2819}
2820
2821static int qeth_query_ipassists_cb(struct qeth_card *card,
2822                struct qeth_reply *reply, unsigned long data)
2823{
2824        struct qeth_ipa_cmd *cmd;
2825
2826        QETH_CARD_TEXT(card, 2, "qipasscb");
2827
2828        cmd = (struct qeth_ipa_cmd *) data;
2829
2830        switch (cmd->hdr.return_code) {
2831        case IPA_RC_SUCCESS:
2832                break;
2833        case IPA_RC_NOTSUPP:
2834        case IPA_RC_L2_UNSUPPORTED_CMD:
2835                QETH_CARD_TEXT(card, 2, "ipaunsup");
2836                card->options.ipa4.supported_funcs |= IPA_SETADAPTERPARMS;
2837                card->options.ipa6.supported_funcs |= IPA_SETADAPTERPARMS;
2838                return -EOPNOTSUPP;
2839        default:
2840                QETH_DBF_MESSAGE(1, "IPA_CMD_QIPASSIST on device %x: Unhandled rc=%#x\n",
2841                                 CARD_DEVID(card), cmd->hdr.return_code);
2842                return -EIO;
2843        }
2844
2845        if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
2846                card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
2847                card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
2848        } else if (cmd->hdr.prot_version == QETH_PROT_IPV6) {
2849                card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
2850                card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
2851        } else
2852                QETH_DBF_MESSAGE(1, "IPA_CMD_QIPASSIST on device %x: Flawed LIC detected\n",
2853                                 CARD_DEVID(card));
2854        return 0;
2855}
2856
2857static int qeth_query_ipassists(struct qeth_card *card,
2858                                enum qeth_prot_versions prot)
2859{
2860        int rc;
2861        struct qeth_cmd_buffer *iob;
2862
2863        QETH_CARD_TEXT_(card, 2, "qipassi%i", prot);
2864        iob = qeth_ipa_alloc_cmd(card, IPA_CMD_QIPASSIST, prot, 0);
2865        if (!iob)
2866                return -ENOMEM;
2867        rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
2868        return rc;
2869}
2870
2871static int qeth_query_switch_attributes_cb(struct qeth_card *card,
2872                                struct qeth_reply *reply, unsigned long data)
2873{
2874        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2875        struct qeth_query_switch_attributes *attrs;
2876        struct qeth_switch_info *sw_info;
2877
2878        QETH_CARD_TEXT(card, 2, "qswiatcb");
2879        if (qeth_setadpparms_inspect_rc(cmd))
2880                return -EIO;
2881
2882        sw_info = (struct qeth_switch_info *)reply->param;
2883        attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
2884        sw_info->capabilities = attrs->capabilities;
2885        sw_info->settings = attrs->settings;
2886        QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
2887                        sw_info->settings);
2888        return 0;
2889}
2890
2891int qeth_query_switch_attributes(struct qeth_card *card,
2892                                 struct qeth_switch_info *sw_info)
2893{
2894        struct qeth_cmd_buffer *iob;
2895
2896        QETH_CARD_TEXT(card, 2, "qswiattr");
2897        if (!qeth_adp_supported(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES))
2898                return -EOPNOTSUPP;
2899        if (!netif_carrier_ok(card->dev))
2900                return -ENOMEDIUM;
2901        iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES, 0);
2902        if (!iob)
2903                return -ENOMEM;
2904        return qeth_send_ipa_cmd(card, iob,
2905                                qeth_query_switch_attributes_cb, sw_info);
2906}
2907
2908struct qeth_cmd_buffer *qeth_get_diag_cmd(struct qeth_card *card,
2909                                          enum qeth_diags_cmds sub_cmd,
2910                                          unsigned int data_length)
2911{
2912        struct qeth_ipacmd_diagass *cmd;
2913        struct qeth_cmd_buffer *iob;
2914
2915        iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SET_DIAG_ASS, QETH_PROT_NONE,
2916                                 DIAG_HDR_LEN + data_length);
2917        if (!iob)
2918                return NULL;
2919
2920        cmd = &__ipa_cmd(iob)->data.diagass;
2921        cmd->subcmd_len = DIAG_SUB_HDR_LEN + data_length;
2922        cmd->subcmd = sub_cmd;
2923        return iob;
2924}
2925EXPORT_SYMBOL_GPL(qeth_get_diag_cmd);
2926
2927static int qeth_query_setdiagass_cb(struct qeth_card *card,
2928                struct qeth_reply *reply, unsigned long data)
2929{
2930        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2931        u16 rc = cmd->hdr.return_code;
2932
2933        if (rc) {
2934                QETH_CARD_TEXT_(card, 2, "diagq:%x", rc);
2935                return -EIO;
2936        }
2937
2938        card->info.diagass_support = cmd->data.diagass.ext;
2939        return 0;
2940}
2941
2942static int qeth_query_setdiagass(struct qeth_card *card)
2943{
2944        struct qeth_cmd_buffer *iob;
2945
2946        QETH_CARD_TEXT(card, 2, "qdiagass");
2947        iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_QUERY, 0);
2948        if (!iob)
2949                return -ENOMEM;
2950        return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
2951}
2952
2953static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
2954{
2955        unsigned long info = get_zeroed_page(GFP_KERNEL);
2956        struct sysinfo_2_2_2 *info222 = (struct sysinfo_2_2_2 *)info;
2957        struct sysinfo_3_2_2 *info322 = (struct sysinfo_3_2_2 *)info;
2958        struct ccw_dev_id ccwid;
2959        int level;
2960
2961        tid->chpid = card->info.chpid;
2962        ccw_device_get_id(CARD_RDEV(card), &ccwid);
2963        tid->ssid = ccwid.ssid;
2964        tid->devno = ccwid.devno;
2965        if (!info)
2966                return;
2967        level = stsi(NULL, 0, 0, 0);
2968        if ((level >= 2) && (stsi(info222, 2, 2, 2) == 0))
2969                tid->lparnr = info222->lpar_number;
2970        if ((level >= 3) && (stsi(info322, 3, 2, 2) == 0)) {
2971                EBCASC(info322->vm[0].name, sizeof(info322->vm[0].name));
2972                memcpy(tid->vmname, info322->vm[0].name, sizeof(tid->vmname));
2973        }
2974        free_page(info);
2975        return;
2976}
2977
2978static int qeth_hw_trap_cb(struct qeth_card *card,
2979                struct qeth_reply *reply, unsigned long data)
2980{
2981        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
2982        u16 rc = cmd->hdr.return_code;
2983
2984        if (rc) {
2985                QETH_CARD_TEXT_(card, 2, "trapc:%x", rc);
2986                return -EIO;
2987        }
2988        return 0;
2989}
2990
2991int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action)
2992{
2993        struct qeth_cmd_buffer *iob;
2994        struct qeth_ipa_cmd *cmd;
2995
2996        QETH_CARD_TEXT(card, 2, "diagtrap");
2997        iob = qeth_get_diag_cmd(card, QETH_DIAGS_CMD_TRAP, 64);
2998        if (!iob)
2999                return -ENOMEM;
3000        cmd = __ipa_cmd(iob);
3001        cmd->data.diagass.type = 1;
3002        cmd->data.diagass.action = action;
3003        switch (action) {
3004        case QETH_DIAGS_TRAP_ARM:
3005                cmd->data.diagass.options = 0x0003;
3006                cmd->data.diagass.ext = 0x00010000 +
3007                        sizeof(struct qeth_trap_id);
3008                qeth_get_trap_id(card,
3009                        (struct qeth_trap_id *)cmd->data.diagass.cdata);
3010                break;
3011        case QETH_DIAGS_TRAP_DISARM:
3012                cmd->data.diagass.options = 0x0001;
3013                break;
3014        case QETH_DIAGS_TRAP_CAPTURE:
3015                break;
3016        }
3017        return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL);
3018}
3019EXPORT_SYMBOL_GPL(qeth_hw_trap);
3020
3021static int qeth_check_qdio_errors(struct qeth_card *card,
3022                                  struct qdio_buffer *buf,
3023                                  unsigned int qdio_error,
3024                                  const char *dbftext)
3025{
3026        if (qdio_error) {
3027                QETH_CARD_TEXT(card, 2, dbftext);
3028                QETH_CARD_TEXT_(card, 2, " F15=%02X",
3029                               buf->element[15].sflags);
3030                QETH_CARD_TEXT_(card, 2, " F14=%02X",
3031                               buf->element[14].sflags);
3032                QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
3033                if ((buf->element[15].sflags) == 0x12) {
3034                        QETH_CARD_STAT_INC(card, rx_dropped);
3035                        return 0;
3036                } else
3037                        return 1;
3038        }
3039        return 0;
3040}
3041
3042static void qeth_queue_input_buffer(struct qeth_card *card, int index)
3043{
3044        struct qeth_qdio_q *queue = card->qdio.in_q;
3045        struct list_head *lh;
3046        int count;
3047        int i;
3048        int rc;
3049        int newcount = 0;
3050
3051        count = (index < queue->next_buf_to_init)?
3052                card->qdio.in_buf_pool.buf_count -
3053                (queue->next_buf_to_init - index) :
3054                card->qdio.in_buf_pool.buf_count -
3055                (queue->next_buf_to_init + QDIO_MAX_BUFFERS_PER_Q - index);
3056        /* only requeue at a certain threshold to avoid SIGAs */
3057        if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)) {
3058                for (i = queue->next_buf_to_init;
3059                     i < queue->next_buf_to_init + count; ++i) {
3060                        if (qeth_init_input_buffer(card,
3061                                &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q])) {
3062                                break;
3063                        } else {
3064                                newcount++;
3065                        }
3066                }
3067
3068                if (newcount < count) {
3069                        /* we are in memory shortage so we switch back to
3070                           traditional skb allocation and drop packages */
3071                        atomic_set(&card->force_alloc_skb, 3);
3072                        count = newcount;
3073                } else {
3074                        atomic_add_unless(&card->force_alloc_skb, -1, 0);
3075                }
3076
3077                if (!count) {
3078                        i = 0;
3079                        list_for_each(lh, &card->qdio.in_buf_pool.entry_list)
3080                                i++;
3081                        if (i == card->qdio.in_buf_pool.buf_count) {
3082                                QETH_CARD_TEXT(card, 2, "qsarbw");
3083                                card->reclaim_index = index;
3084                                schedule_delayed_work(
3085                                        &card->buffer_reclaim_work,
3086                                        QETH_RECLAIM_WORK_TIME);
3087                        }
3088                        return;
3089                }
3090
3091                /*
3092                 * according to old code it should be avoided to requeue all
3093                 * 128 buffers in order to benefit from PCI avoidance.
3094                 * this function keeps at least one buffer (the buffer at
3095                 * 'index') un-requeued -> this buffer is the first buffer that
3096                 * will be requeued the next time
3097                 */
3098                rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0,
3099                             queue->next_buf_to_init, count);
3100                if (rc) {
3101                        QETH_CARD_TEXT(card, 2, "qinberr");
3102                }
3103                queue->next_buf_to_init = (queue->next_buf_to_init + count) %
3104                                          QDIO_MAX_BUFFERS_PER_Q;
3105        }
3106}
3107
3108static void qeth_buffer_reclaim_work(struct work_struct *work)
3109{
3110        struct qeth_card *card = container_of(work, struct qeth_card,
3111                buffer_reclaim_work.work);
3112
3113        QETH_CARD_TEXT_(card, 2, "brw:%x", card->reclaim_index);
3114        qeth_queue_input_buffer(card, card->reclaim_index);
3115}
3116
3117static void qeth_handle_send_error(struct qeth_card *card,
3118                struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err)
3119{
3120        int sbalf15 = buffer->buffer->element[15].sflags;
3121
3122        QETH_CARD_TEXT(card, 6, "hdsnderr");
3123        qeth_check_qdio_errors(card, buffer->buffer, qdio_err, "qouterr");
3124
3125        if (!qdio_err)
3126                return;
3127
3128        if ((sbalf15 >= 15) && (sbalf15 <= 31))
3129                return;
3130
3131        QETH_CARD_TEXT(card, 1, "lnkfail");
3132        QETH_CARD_TEXT_(card, 1, "%04x %02x",
3133                       (u16)qdio_err, (u8)sbalf15);
3134}
3135
3136/**
3137 * qeth_prep_flush_pack_buffer - Prepares flushing of a packing buffer.
3138 * @queue: queue to check for packing buffer
3139 *
3140 * Returns number of buffers that were prepared for flush.
3141 */
3142static int qeth_prep_flush_pack_buffer(struct qeth_qdio_out_q *queue)
3143{
3144        struct qeth_qdio_out_buffer *buffer;
3145
3146        buffer = queue->bufs[queue->next_buf_to_fill];
3147        if ((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) &&
3148            (buffer->next_element_to_fill > 0)) {
3149                /* it's a packing buffer */
3150                atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
3151                queue->next_buf_to_fill =
3152                        (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q;
3153                return 1;
3154        }
3155        return 0;
3156}
3157
3158/*
3159 * Switched to packing state if the number of used buffers on a queue
3160 * reaches a certain limit.
3161 */
3162static void qeth_switch_to_packing_if_needed(struct qeth_qdio_out_q *queue)
3163{
3164        if (!queue->do_pack) {
3165                if (atomic_read(&queue->used_buffers)
3166                    >= QETH_HIGH_WATERMARK_PACK){
3167                        /* switch non-PACKING -> PACKING */
3168                        QETH_CARD_TEXT(queue->card, 6, "np->pack");
3169                        QETH_TXQ_STAT_INC(queue, packing_mode_switch);
3170                        queue->do_pack = 1;
3171                }
3172        }
3173}
3174
3175/*
3176 * Switches from packing to non-packing mode. If there is a packing
3177 * buffer on the queue this buffer will be prepared to be flushed.
3178 * In that case 1 is returned to inform the caller. If no buffer
3179 * has to be flushed, zero is returned.
3180 */
3181static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
3182{
3183        if (queue->do_pack) {
3184                if (atomic_read(&queue->used_buffers)
3185                    <= QETH_LOW_WATERMARK_PACK) {
3186                        /* switch PACKING -> non-PACKING */
3187                        QETH_CARD_TEXT(queue->card, 6, "pack->np");
3188                        QETH_TXQ_STAT_INC(queue, packing_mode_switch);
3189                        queue->do_pack = 0;
3190                        return qeth_prep_flush_pack_buffer(queue);
3191                }
3192        }
3193        return 0;
3194}
3195
3196static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
3197                               int count)
3198{
3199        struct qeth_qdio_out_buffer *buf;
3200        int rc;
3201        int i;
3202        unsigned int qdio_flags;
3203
3204        for (i = index; i < index + count; ++i) {
3205                int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3206                buf = queue->bufs[bidx];
3207                buf->buffer->element[buf->next_element_to_fill - 1].eflags |=
3208                                SBAL_EFLAGS_LAST_ENTRY;
3209
3210                if (queue->bufstates)
3211                        queue->bufstates[bidx].user = buf;
3212
3213                if (IS_IQD(queue->card))
3214                        continue;
3215
3216                if (!queue->do_pack) {
3217                        if ((atomic_read(&queue->used_buffers) >=
3218                                (QETH_HIGH_WATERMARK_PACK -
3219                                 QETH_WATERMARK_PACK_FUZZ)) &&
3220                            !atomic_read(&queue->set_pci_flags_count)) {
3221                                /* it's likely that we'll go to packing
3222                                 * mode soon */
3223                                atomic_inc(&queue->set_pci_flags_count);
3224                                buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
3225                        }
3226                } else {
3227                        if (!atomic_read(&queue->set_pci_flags_count)) {
3228                                /*
3229                                 * there's no outstanding PCI any more, so we
3230                                 * have to request a PCI to be sure the the PCI
3231                                 * will wake at some time in the future then we
3232                                 * can flush packed buffers that might still be
3233                                 * hanging around, which can happen if no
3234                                 * further send was requested by the stack
3235                                 */
3236                                atomic_inc(&queue->set_pci_flags_count);
3237                                buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
3238                        }
3239                }
3240        }
3241
3242        QETH_TXQ_STAT_ADD(queue, bufs, count);
3243        qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
3244        if (atomic_read(&queue->set_pci_flags_count))
3245                qdio_flags |= QDIO_FLAG_PCI_OUT;
3246        rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
3247                     queue->queue_no, index, count);
3248        if (rc) {
3249                QETH_TXQ_STAT_ADD(queue, tx_errors, count);
3250                /* ignore temporary SIGA errors without busy condition */
3251                if (rc == -ENOBUFS)
3252                        return;
3253                QETH_CARD_TEXT(queue->card, 2, "flushbuf");
3254                QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
3255                QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
3256                QETH_CARD_TEXT_(queue->card, 2, " c%d", count);
3257                QETH_CARD_TEXT_(queue->card, 2, " err%d", rc);
3258
3259                /* this must not happen under normal circumstances. if it
3260                 * happens something is really wrong -> recover */
3261                qeth_schedule_recovery(queue->card);
3262                return;
3263        }
3264}
3265
3266static void qeth_check_outbound_queue(struct qeth_qdio_out_q *queue)
3267{
3268        int index;
3269        int flush_cnt = 0;
3270        int q_was_packing = 0;
3271
3272        /*
3273         * check if weed have to switch to non-packing mode or if
3274         * we have to get a pci flag out on the queue
3275         */
3276        if ((atomic_read(&queue->used_buffers) <= QETH_LOW_WATERMARK_PACK) ||
3277            !atomic_read(&queue->set_pci_flags_count)) {
3278                if (atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH) ==
3279                                QETH_OUT_Q_UNLOCKED) {
3280                        /*
3281                         * If we get in here, there was no action in
3282                         * do_send_packet. So, we check if there is a
3283                         * packing buffer to be flushed here.
3284                         */
3285                        index = queue->next_buf_to_fill;
3286                        q_was_packing = queue->do_pack;
3287                        /* queue->do_pack may change */
3288                        barrier();
3289                        flush_cnt += qeth_switch_to_nonpacking_if_needed(queue);
3290                        if (!flush_cnt &&
3291                            !atomic_read(&queue->set_pci_flags_count))
3292                                flush_cnt += qeth_prep_flush_pack_buffer(queue);
3293                        if (q_was_packing)
3294                                QETH_TXQ_STAT_ADD(queue, bufs_pack, flush_cnt);
3295                        if (flush_cnt)
3296                                qeth_flush_buffers(queue, index, flush_cnt);
3297                        atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
3298                }
3299        }
3300}
3301
3302static void qeth_qdio_start_poll(struct ccw_device *ccwdev, int queue,
3303                                 unsigned long card_ptr)
3304{
3305        struct qeth_card *card = (struct qeth_card *)card_ptr;
3306
3307        if (card->dev->flags & IFF_UP)
3308                napi_schedule(&card->napi);
3309}
3310
3311int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
3312{
3313        int rc;
3314
3315        if (card->options.cq ==  QETH_CQ_NOTAVAILABLE) {
3316                rc = -1;
3317                goto out;
3318        } else {
3319                if (card->options.cq == cq) {
3320                        rc = 0;
3321                        goto out;
3322                }
3323
3324                if (card->state != CARD_STATE_DOWN) {
3325                        rc = -1;
3326                        goto out;
3327                }
3328
3329                qeth_free_qdio_queues(card);
3330                card->options.cq = cq;
3331                rc = 0;
3332        }
3333out:
3334        return rc;
3335
3336}
3337EXPORT_SYMBOL_GPL(qeth_configure_cq);
3338
3339static void qeth_qdio_cq_handler(struct qeth_card *card, unsigned int qdio_err,
3340                                 unsigned int queue, int first_element,
3341                                 int count)
3342{
3343        struct qeth_qdio_q *cq = card->qdio.c_q;
3344        int i;
3345        int rc;
3346
3347        if (!qeth_is_cq(card, queue))
3348                return;
3349
3350        QETH_CARD_TEXT_(card, 5, "qcqhe%d", first_element);
3351        QETH_CARD_TEXT_(card, 5, "qcqhc%d", count);
3352        QETH_CARD_TEXT_(card, 5, "qcqherr%d", qdio_err);
3353
3354        if (qdio_err) {
3355                netif_tx_stop_all_queues(card->dev);
3356                qeth_schedule_recovery(card);
3357                return;
3358        }
3359
3360        for (i = first_element; i < first_element + count; ++i) {
3361                int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3362                struct qdio_buffer *buffer = cq->qdio_bufs[bidx];
3363                int e = 0;
3364
3365                while ((e < QDIO_MAX_ELEMENTS_PER_BUFFER) &&
3366                       buffer->element[e].addr) {
3367                        unsigned long phys_aob_addr;
3368
3369                        phys_aob_addr = (unsigned long) buffer->element[e].addr;
3370                        qeth_qdio_handle_aob(card, phys_aob_addr);
3371                        ++e;
3372                }
3373                qeth_scrub_qdio_buffer(buffer, QDIO_MAX_ELEMENTS_PER_BUFFER);
3374        }
3375        rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, queue,
3376                    card->qdio.c_q->next_buf_to_init,
3377                    count);
3378        if (rc) {
3379                dev_warn(&card->gdev->dev,
3380                        "QDIO reported an error, rc=%i\n", rc);
3381                QETH_CARD_TEXT(card, 2, "qcqherr");
3382        }
3383        card->qdio.c_q->next_buf_to_init = (card->qdio.c_q->next_buf_to_init
3384                                   + count) % QDIO_MAX_BUFFERS_PER_Q;
3385}
3386
3387static void qeth_qdio_input_handler(struct ccw_device *ccwdev,
3388                                    unsigned int qdio_err, int queue,
3389                                    int first_elem, int count,
3390                                    unsigned long card_ptr)
3391{
3392        struct qeth_card *card = (struct qeth_card *)card_ptr;
3393
3394        QETH_CARD_TEXT_(card, 2, "qihq%d", queue);
3395        QETH_CARD_TEXT_(card, 2, "qiec%d", qdio_err);
3396
3397        if (qeth_is_cq(card, queue))
3398                qeth_qdio_cq_handler(card, qdio_err, queue, first_elem, count);
3399        else if (qdio_err)
3400                qeth_schedule_recovery(card);
3401}
3402
3403static void qeth_qdio_output_handler(struct ccw_device *ccwdev,
3404                                     unsigned int qdio_error, int __queue,
3405                                     int first_element, int count,
3406                                     unsigned long card_ptr)
3407{
3408        struct qeth_card *card        = (struct qeth_card *) card_ptr;
3409        struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
3410        struct qeth_qdio_out_buffer *buffer;
3411        struct net_device *dev = card->dev;
3412        struct netdev_queue *txq;
3413        int i;
3414
3415        QETH_CARD_TEXT(card, 6, "qdouhdl");
3416        if (qdio_error & QDIO_ERROR_FATAL) {
3417                QETH_CARD_TEXT(card, 2, "achkcond");
3418                netif_tx_stop_all_queues(dev);
3419                qeth_schedule_recovery(card);
3420                return;
3421        }
3422
3423        for (i = first_element; i < (first_element + count); ++i) {
3424                int bidx = i % QDIO_MAX_BUFFERS_PER_Q;
3425                buffer = queue->bufs[bidx];
3426                qeth_handle_send_error(card, buffer, qdio_error);
3427
3428                if (queue->bufstates &&
3429                    (queue->bufstates[bidx].flags &
3430                     QDIO_OUTBUF_STATE_FLAG_PENDING) != 0) {
3431                        WARN_ON_ONCE(card->options.cq != QETH_CQ_ENABLED);
3432
3433                        if (atomic_cmpxchg(&buffer->state,
3434                                           QETH_QDIO_BUF_PRIMED,
3435                                           QETH_QDIO_BUF_PENDING) ==
3436                                QETH_QDIO_BUF_PRIMED) {
3437                                qeth_notify_skbs(queue, buffer,
3438                                                 TX_NOTIFY_PENDING);
3439                        }
3440                        QETH_CARD_TEXT_(queue->card, 5, "pel%d", bidx);
3441
3442                        /* prepare the queue slot for re-use: */
3443                        qeth_scrub_qdio_buffer(buffer->buffer,
3444                                               queue->max_elements);
3445                        if (qeth_init_qdio_out_buf(queue, bidx)) {
3446                                QETH_CARD_TEXT(card, 2, "outofbuf");
3447                                qeth_schedule_recovery(card);
3448                        }
3449                } else {
3450                        if (card->options.cq == QETH_CQ_ENABLED) {
3451                                enum iucv_tx_notify n;
3452
3453                                n = qeth_compute_cq_notification(
3454                                        buffer->buffer->element[15].sflags, 0);
3455                                qeth_notify_skbs(queue, buffer, n);
3456                        }
3457
3458                        qeth_clear_output_buffer(queue, buffer);
3459                }
3460                qeth_cleanup_handled_pending(queue, bidx, 0);
3461        }
3462        atomic_sub(count, &queue->used_buffers);
3463        /* check if we need to do something on this outbound queue */
3464        if (!IS_IQD(card))
3465                qeth_check_outbound_queue(queue);
3466
3467        if (IS_IQD(card))
3468                __queue = qeth_iqd_translate_txq(dev, __queue);
3469        txq = netdev_get_tx_queue(dev, __queue);
3470        /* xmit may have observed the full-condition, but not yet stopped the
3471         * txq. In which case the code below won't trigger. So before returning,
3472         * xmit will re-check the txq's fill level and wake it up if needed.
3473         */
3474        if (netif_tx_queue_stopped(txq) && !qeth_out_queue_is_full(queue))
3475                netif_tx_wake_queue(txq);
3476}
3477
3478/**
3479 * Note: Function assumes that we have 4 outbound queues.
3480 */
3481int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb)
3482{
3483        struct vlan_ethhdr *veth = vlan_eth_hdr(skb);
3484        u8 tos;
3485
3486        switch (card->qdio.do_prio_queueing) {
3487        case QETH_PRIO_Q_ING_TOS:
3488        case QETH_PRIO_Q_ING_PREC:
3489                switch (qeth_get_ip_version(skb)) {
3490                case 4:
3491                        tos = ipv4_get_dsfield(ip_hdr(skb));
3492                        break;
3493                case 6:
3494                        tos = ipv6_get_dsfield(ipv6_hdr(skb));
3495                        break;
3496                default:
3497                        return card->qdio.default_out_queue;
3498                }
3499                if (card->qdio.do_prio_queueing == QETH_PRIO_Q_ING_PREC)
3500                        return ~tos >> 6 & 3;
3501                if (tos & IPTOS_MINCOST)
3502                        return 3;
3503                if (tos & IPTOS_RELIABILITY)
3504                        return 2;
3505                if (tos & IPTOS_THROUGHPUT)
3506                        return 1;
3507                if (tos & IPTOS_LOWDELAY)
3508                        return 0;
3509                break;
3510        case QETH_PRIO_Q_ING_SKB:
3511                if (skb->priority > 5)
3512                        return 0;
3513                return ~skb->priority >> 1 & 3;
3514        case QETH_PRIO_Q_ING_VLAN:
3515                if (veth->h_vlan_proto == htons(ETH_P_8021Q))
3516                        return ~ntohs(veth->h_vlan_TCI) >>
3517                               (VLAN_PRIO_SHIFT + 1) & 3;
3518                break;
3519        default:
3520                break;
3521        }
3522        return card->qdio.default_out_queue;
3523}
3524EXPORT_SYMBOL_GPL(qeth_get_priority_queue);
3525
3526/**
3527 * qeth_get_elements_for_frags() -      find number of SBALEs for skb frags.
3528 * @skb:                                SKB address
3529 *
3530 * Returns the number of pages, and thus QDIO buffer elements, needed to cover
3531 * fragmented part of the SKB. Returns zero for linear SKB.
3532 */
3533static int qeth_get_elements_for_frags(struct sk_buff *skb)
3534{
3535        int cnt, elements = 0;
3536
3537        for (cnt = 0; cnt < skb_shinfo(skb)->nr_frags; cnt++) {
3538                struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[cnt];
3539
3540                elements += qeth_get_elements_for_range(
3541                        (addr_t)skb_frag_address(frag),
3542                        (addr_t)skb_frag_address(frag) + skb_frag_size(frag));
3543        }
3544        return elements;
3545}
3546
3547/**
3548 * qeth_count_elements() -      Counts the number of QDIO buffer elements needed
3549 *                              to transmit an skb.
3550 * @skb:                        the skb to operate on.
3551 * @data_offset:                skip this part of the skb's linear data
3552 *
3553 * Returns the number of pages, and thus QDIO buffer elements, needed to map the
3554 * skb's data (both its linear part and paged fragments).
3555 */
3556unsigned int qeth_count_elements(struct sk_buff *skb, unsigned int data_offset)
3557{
3558        unsigned int elements = qeth_get_elements_for_frags(skb);
3559        addr_t end = (addr_t)skb->data + skb_headlen(skb);
3560        addr_t start = (addr_t)skb->data + data_offset;
3561
3562        if (start != end)
3563                elements += qeth_get_elements_for_range(start, end);
3564        return elements;
3565}
3566EXPORT_SYMBOL_GPL(qeth_count_elements);
3567
3568#define QETH_HDR_CACHE_OBJ_SIZE         (sizeof(struct qeth_hdr_tso) + \
3569                                         MAX_TCP_HEADER)
3570
3571/**
3572 * qeth_add_hw_header() - add a HW header to an skb.
3573 * @skb: skb that the HW header should be added to.
3574 * @hdr: double pointer to a qeth_hdr. When returning with >= 0,
3575 *       it contains a valid pointer to a qeth_hdr.
3576 * @hdr_len: length of the HW header.
3577 * @proto_len: length of protocol headers that need to be in same page as the
3578 *             HW header.
3579 *
3580 * Returns the pushed length. If the header can't be pushed on
3581 * (eg. because it would cross a page boundary), it is allocated from
3582 * the cache instead and 0 is returned.
3583 * The number of needed buffer elements is returned in @elements.
3584 * Error to create the hdr is indicated by returning with < 0.
3585 */
3586static int qeth_add_hw_header(struct qeth_qdio_out_q *queue,
3587                              struct sk_buff *skb, struct qeth_hdr **hdr,
3588                              unsigned int hdr_len, unsigned int proto_len,
3589                              unsigned int *elements)
3590{
3591        const unsigned int contiguous = proto_len ? proto_len : 1;
3592        const unsigned int max_elements = queue->max_elements;
3593        unsigned int __elements;
3594        addr_t start, end;
3595        bool push_ok;
3596        int rc;
3597
3598check_layout:
3599        start = (addr_t)skb->data - hdr_len;
3600        end = (addr_t)skb->data;
3601
3602        if (qeth_get_elements_for_range(start, end + contiguous) == 1) {
3603                /* Push HW header into same page as first protocol header. */
3604                push_ok = true;
3605                /* ... but TSO always needs a separate element for headers: */
3606                if (skb_is_gso(skb))
3607                        __elements = 1 + qeth_count_elements(skb, proto_len);
3608                else
3609                        __elements = qeth_count_elements(skb, 0);
3610        } else if (!proto_len && PAGE_ALIGNED(skb->data)) {
3611                /* Push HW header into preceding page, flush with skb->data. */
3612                push_ok = true;
3613                __elements = 1 + qeth_count_elements(skb, 0);
3614        } else {
3615                /* Use header cache, copy protocol headers up. */
3616                push_ok = false;
3617                __elements = 1 + qeth_count_elements(skb, proto_len);
3618        }
3619
3620        /* Compress skb to fit into one IO buffer: */
3621        if (__elements > max_elements) {
3622                if (!skb_is_nonlinear(skb)) {
3623                        /* Drop it, no easy way of shrinking it further. */
3624                        QETH_DBF_MESSAGE(2, "Dropped an oversized skb (Max Elements=%u / Actual=%u / Length=%u).\n",
3625                                         max_elements, __elements, skb->len);
3626                        return -E2BIG;
3627                }
3628
3629                rc = skb_linearize(skb);
3630                if (rc) {
3631                        QETH_TXQ_STAT_INC(queue, skbs_linearized_fail);
3632                        return rc;
3633                }
3634
3635                QETH_TXQ_STAT_INC(queue, skbs_linearized);
3636                /* Linearization changed the layout, re-evaluate: */
3637                goto check_layout;
3638        }
3639
3640        *elements = __elements;
3641        /* Add the header: */
3642        if (push_ok) {
3643                *hdr = skb_push(skb, hdr_len);
3644                return hdr_len;
3645        }
3646        /* fall back */
3647        if (hdr_len + proto_len > QETH_HDR_CACHE_OBJ_SIZE)
3648                return -E2BIG;
3649        *hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
3650        if (!*hdr)
3651                return -ENOMEM;
3652        /* Copy protocol headers behind HW header: */
3653        skb_copy_from_linear_data(skb, ((char *)*hdr) + hdr_len, proto_len);
3654        return 0;
3655}
3656
3657static void __qeth_fill_buffer(struct sk_buff *skb,
3658                               struct qeth_qdio_out_buffer *buf,
3659                               bool is_first_elem, unsigned int offset)
3660{
3661        struct qdio_buffer *buffer = buf->buffer;
3662        int element = buf->next_element_to_fill;
3663        int length = skb_headlen(skb) - offset;
3664        char *data = skb->data + offset;
3665        unsigned int elem_length, cnt;
3666
3667        /* map linear part into buffer element(s) */
3668        while (length > 0) {
3669                elem_length = min_t(unsigned int, length,
3670                                    PAGE_SIZE - offset_in_page(data));
3671
3672                buffer->element[element].addr = data;
3673                buffer->element[element].length = elem_length;
3674                length -= elem_length;
3675                if (is_first_elem) {
3676                        is_first_elem = false;
3677                        if (length || skb_is_nonlinear(skb))
3678                                /* skb needs additional elements */
3679                                buffer->element[element].eflags =
3680                                        SBAL_EFLAGS_FIRST_FRAG;
3681                        else
3682                                buffer->element[element].eflags = 0;
3683                } else {
3684                        buffer->element[element].eflags =
3685                                SBAL_EFLAGS_MIDDLE_FRAG;
3686                }
3687
3688                data += elem_length;
3689                element++;
3690        }
3691
3692        /* map page frags into buffer element(s) */
3693        for (cnt = 0; cnt < skb_shinfo(skb)->nr_frags; cnt++) {
3694                skb_frag_t *frag = &skb_shinfo(skb)->frags[cnt];
3695
3696                data = skb_frag_address(frag);
3697                length = skb_frag_size(frag);
3698                while (length > 0) {
3699                        elem_length = min_t(unsigned int, length,
3700                                            PAGE_SIZE - offset_in_page(data));
3701
3702                        buffer->element[element].addr = data;
3703                        buffer->element[element].length = elem_length;
3704                        buffer->element[element].eflags =
3705                                SBAL_EFLAGS_MIDDLE_FRAG;
3706
3707                        length -= elem_length;
3708                        data += elem_length;
3709                        element++;
3710                }
3711        }
3712
3713        if (buffer->element[element - 1].eflags)
3714                buffer->element[element - 1].eflags = SBAL_EFLAGS_LAST_FRAG;
3715        buf->next_element_to_fill = element;
3716}
3717
3718/**
3719 * qeth_fill_buffer() - map skb into an output buffer
3720 * @queue:      QDIO queue to submit the buffer on
3721 * @buf:        buffer to transport the skb
3722 * @skb:        skb to map into the buffer
3723 * @hdr:        qeth_hdr for this skb. Either at skb->data, or allocated
3724 *              from qeth_core_header_cache.
3725 * @offset:     when mapping the skb, start at skb->data + offset
3726 * @hd_len:     if > 0, build a dedicated header element of this size
3727 * flush:       Prepare the buffer to be flushed, regardless of its fill level.
3728 */
3729static int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
3730                            struct qeth_qdio_out_buffer *buf,
3731                            struct sk_buff *skb, struct qeth_hdr *hdr,
3732                            unsigned int offset, unsigned int hd_len,
3733                            bool flush)
3734{
3735        struct qdio_buffer *buffer = buf->buffer;
3736        bool is_first_elem = true;
3737
3738        __skb_queue_tail(&buf->skb_list, skb);
3739
3740        /* build dedicated header element */
3741        if (hd_len) {
3742                int element = buf->next_element_to_fill;
3743                is_first_elem = false;
3744
3745                buffer->element[element].addr = hdr;
3746                buffer->element[element].length = hd_len;
3747                buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
3748                /* remember to free cache-allocated qeth_hdr: */
3749                buf->is_header[element] = ((void *)hdr != skb->data);
3750                buf->next_element_to_fill++;
3751        }
3752
3753        __qeth_fill_buffer(skb, buf, is_first_elem, offset);
3754
3755        if (!queue->do_pack) {
3756                QETH_CARD_TEXT(queue->card, 6, "fillbfnp");
3757        } else {
3758                QETH_CARD_TEXT(queue->card, 6, "fillbfpa");
3759
3760                QETH_TXQ_STAT_INC(queue, skbs_pack);
3761                /* If the buffer still has free elements, keep using it. */
3762                if (!flush &&
3763                    buf->next_element_to_fill < queue->max_elements)
3764                        return 0;
3765        }
3766
3767        /* flush out the buffer */
3768        atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
3769        queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
3770                                  QDIO_MAX_BUFFERS_PER_Q;
3771        return 1;
3772}
3773
3774static int qeth_do_send_packet_fast(struct qeth_qdio_out_q *queue,
3775                                    struct sk_buff *skb, struct qeth_hdr *hdr,
3776                                    unsigned int offset, unsigned int hd_len)
3777{
3778        int index = queue->next_buf_to_fill;
3779        struct qeth_qdio_out_buffer *buffer = queue->bufs[index];
3780        struct netdev_queue *txq;
3781        bool stopped = false;
3782
3783        /* Just a sanity check, the wake/stop logic should ensure that we always
3784         * get a free buffer.
3785         */
3786        if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY)
3787                return -EBUSY;
3788
3789        txq = netdev_get_tx_queue(queue->card->dev, skb_get_queue_mapping(skb));
3790
3791        if (atomic_inc_return(&queue->used_buffers) >= QDIO_MAX_BUFFERS_PER_Q) {
3792                /* If a TX completion happens right _here_ and misses to wake
3793                 * the txq, then our re-check below will catch the race.
3794                 */
3795                QETH_TXQ_STAT_INC(queue, stopped);
3796                netif_tx_stop_queue(txq);
3797                stopped = true;
3798        }
3799
3800        qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len, stopped);
3801        qeth_flush_buffers(queue, index, 1);
3802
3803        if (stopped && !qeth_out_queue_is_full(queue))
3804                netif_tx_start_queue(txq);
3805        return 0;
3806}
3807
3808int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
3809                        struct sk_buff *skb, struct qeth_hdr *hdr,
3810                        unsigned int offset, unsigned int hd_len,
3811                        int elements_needed)
3812{
3813        struct qeth_qdio_out_buffer *buffer;
3814        struct netdev_queue *txq;
3815        bool stopped = false;
3816        int start_index;
3817        int flush_count = 0;
3818        int do_pack = 0;
3819        int tmp;
3820        int rc = 0;
3821
3822        /* spin until we get the queue ... */
3823        while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
3824                              QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
3825        start_index = queue->next_buf_to_fill;
3826        buffer = queue->bufs[queue->next_buf_to_fill];
3827
3828        /* Just a sanity check, the wake/stop logic should ensure that we always
3829         * get a free buffer.
3830         */
3831        if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) {
3832                atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
3833                return -EBUSY;
3834        }
3835
3836        txq = netdev_get_tx_queue(card->dev, skb_get_queue_mapping(skb));
3837
3838        /* check if we need to switch packing state of this queue */
3839        qeth_switch_to_packing_if_needed(queue);
3840        if (queue->do_pack) {
3841                do_pack = 1;
3842                /* does packet fit in current buffer? */
3843                if (buffer->next_element_to_fill + elements_needed >
3844                    queue->max_elements) {
3845                        /* ... no -> set state PRIMED */
3846                        atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
3847                        flush_count++;
3848                        queue->next_buf_to_fill =
3849                                (queue->next_buf_to_fill + 1) %
3850                                QDIO_MAX_BUFFERS_PER_Q;
3851                        buffer = queue->bufs[queue->next_buf_to_fill];
3852
3853                        /* We stepped forward, so sanity-check again: */
3854                        if (atomic_read(&buffer->state) !=
3855                            QETH_QDIO_BUF_EMPTY) {
3856                                qeth_flush_buffers(queue, start_index,
3857                                                           flush_count);
3858                                atomic_set(&queue->state,
3859                                                QETH_OUT_Q_UNLOCKED);
3860                                rc = -EBUSY;
3861                                goto out;
3862                        }
3863                }
3864        }
3865
3866        if (buffer->next_element_to_fill == 0 &&
3867            atomic_inc_return(&queue->used_buffers) >= QDIO_MAX_BUFFERS_PER_Q) {
3868                /* If a TX completion happens right _here_ and misses to wake
3869                 * the txq, then our re-check below will catch the race.
3870                 */
3871                QETH_TXQ_STAT_INC(queue, stopped);
3872                netif_tx_stop_queue(txq);
3873                stopped = true;
3874        }
3875
3876        flush_count += qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len,
3877                                        stopped);
3878        if (flush_count)
3879                qeth_flush_buffers(queue, start_index, flush_count);
3880        else if (!atomic_read(&queue->set_pci_flags_count))
3881                atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
3882        /*
3883         * queue->state will go from LOCKED -> UNLOCKED or from
3884         * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
3885         * (switch packing state or flush buffer to get another pci flag out).
3886         * In that case we will enter this loop
3887         */
3888        while (atomic_dec_return(&queue->state)) {
3889                start_index = queue->next_buf_to_fill;
3890                /* check if we can go back to non-packing state */
3891                tmp = qeth_switch_to_nonpacking_if_needed(queue);
3892                /*
3893                 * check if we need to flush a packing buffer to get a pci
3894                 * flag out on the queue
3895                 */
3896                if (!tmp && !atomic_read(&queue->set_pci_flags_count))
3897                        tmp = qeth_prep_flush_pack_buffer(queue);
3898                if (tmp) {
3899                        qeth_flush_buffers(queue, start_index, tmp);
3900                        flush_count += tmp;
3901                }
3902        }
3903out:
3904        /* at this point the queue is UNLOCKED again */
3905        if (do_pack)
3906                QETH_TXQ_STAT_ADD(queue, bufs_pack, flush_count);
3907
3908        if (stopped && !qeth_out_queue_is_full(queue))
3909                netif_tx_start_queue(txq);
3910        return rc;
3911}
3912EXPORT_SYMBOL_GPL(qeth_do_send_packet);
3913
3914static void qeth_fill_tso_ext(struct qeth_hdr_tso *hdr,
3915                              unsigned int payload_len, struct sk_buff *skb,
3916                              unsigned int proto_len)
3917{
3918        struct qeth_hdr_ext_tso *ext = &hdr->ext;
3919
3920        ext->hdr_tot_len = sizeof(*ext);
3921        ext->imb_hdr_no = 1;
3922        ext->hdr_type = 1;
3923        ext->hdr_version = 1;
3924        ext->hdr_len = 28;
3925        ext->payload_len = payload_len;
3926        ext->mss = skb_shinfo(skb)->gso_size;
3927        ext->dg_hdr_len = proto_len;
3928}
3929
3930int qeth_xmit(struct qeth_card *card, struct sk_buff *skb,
3931              struct qeth_qdio_out_q *queue, int ipv,
3932              void (*fill_header)(struct qeth_qdio_out_q *queue,
3933                                  struct qeth_hdr *hdr, struct sk_buff *skb,
3934                                  int ipv, unsigned int data_len))
3935{
3936        unsigned int proto_len, hw_hdr_len;
3937        unsigned int frame_len = skb->len;
3938        bool is_tso = skb_is_gso(skb);
3939        unsigned int data_offset = 0;
3940        struct qeth_hdr *hdr = NULL;
3941        unsigned int hd_len = 0;
3942        unsigned int elements;
3943        int push_len, rc;
3944        bool is_sg;
3945
3946        if (is_tso) {
3947                hw_hdr_len = sizeof(struct qeth_hdr_tso);
3948                proto_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
3949        } else {
3950                hw_hdr_len = sizeof(struct qeth_hdr);
3951                proto_len = (IS_IQD(card) && IS_LAYER2(card)) ? ETH_HLEN : 0;
3952        }
3953
3954        rc = skb_cow_head(skb, hw_hdr_len);
3955        if (rc)
3956                return rc;
3957
3958        push_len = qeth_add_hw_header(queue, skb, &hdr, hw_hdr_len, proto_len,
3959                                      &elements);
3960        if (push_len < 0)
3961                return push_len;
3962        if (is_tso || !push_len) {
3963                /* HW header needs its own buffer element. */
3964                hd_len = hw_hdr_len + proto_len;
3965                data_offset = push_len + proto_len;
3966        }
3967        memset(hdr, 0, hw_hdr_len);
3968        fill_header(queue, hdr, skb, ipv, frame_len);
3969        if (is_tso)
3970                qeth_fill_tso_ext((struct qeth_hdr_tso *) hdr,
3971                                  frame_len - proto_len, skb, proto_len);
3972
3973        is_sg = skb_is_nonlinear(skb);
3974        if (IS_IQD(card)) {
3975                rc = qeth_do_send_packet_fast(queue, skb, hdr, data_offset,
3976                                              hd_len);
3977        } else {
3978                /* TODO: drop skb_orphan() once TX completion is fast enough */
3979                skb_orphan(skb);
3980                rc = qeth_do_send_packet(card, queue, skb, hdr, data_offset,
3981                                         hd_len, elements);
3982        }
3983
3984        if (!rc) {
3985                QETH_TXQ_STAT_ADD(queue, buf_elements, elements);
3986                if (is_sg)
3987                        QETH_TXQ_STAT_INC(queue, skbs_sg);
3988                if (is_tso) {
3989                        QETH_TXQ_STAT_INC(queue, skbs_tso);
3990                        QETH_TXQ_STAT_ADD(queue, tso_bytes, frame_len);
3991                }
3992        } else {
3993                if (!push_len)
3994                        kmem_cache_free(qeth_core_header_cache, hdr);
3995        }
3996        return rc;
3997}
3998EXPORT_SYMBOL_GPL(qeth_xmit);
3999
4000static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
4001                struct qeth_reply *reply, unsigned long data)
4002{
4003        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
4004        struct qeth_ipacmd_setadpparms *setparms;
4005
4006        QETH_CARD_TEXT(card, 4, "prmadpcb");
4007
4008        setparms = &(cmd->data.setadapterparms);
4009        if (qeth_setadpparms_inspect_rc(cmd)) {
4010                QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
4011                setparms->data.mode = SET_PROMISC_MODE_OFF;
4012        }
4013        card->info.promisc_mode = setparms->data.mode;
4014        return (cmd->hdr.return_code) ? -EIO : 0;
4015}
4016
4017void qeth_setadp_promisc_mode(struct qeth_card *card)
4018{
4019        enum qeth_ipa_promisc_modes mode;
4020        struct net_device *dev = card->dev;
4021        struct qeth_cmd_buffer *iob;
4022        struct qeth_ipa_cmd *cmd;
4023
4024        QETH_CARD_TEXT(card, 4, "setprom");
4025
4026        if (((dev->flags & IFF_PROMISC) &&
4027             (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
4028            (!(dev->flags & IFF_PROMISC) &&
4029             (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
4030                return;
4031        mode = SET_PROMISC_MODE_OFF;
4032        if (dev->flags & IFF_PROMISC)
4033                mode = SET_PROMISC_MODE_ON;
4034        QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
4035
4036        iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
4037                                   SETADP_DATA_SIZEOF(mode));
4038        if (!iob)
4039                return;
4040        cmd = __ipa_cmd(iob);
4041        cmd->data.setadapterparms.data.mode = mode;
4042        qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
4043}
4044EXPORT_SYMBOL_GPL(qeth_setadp_promisc_mode);
4045
4046static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
4047                struct qeth_reply *reply, unsigned long data)
4048{
4049        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
4050        struct qeth_ipacmd_setadpparms *adp_cmd;
4051
4052        QETH_CARD_TEXT(card, 4, "chgmaccb");
4053        if (qeth_setadpparms_inspect_rc(cmd))
4054                return -EIO;
4055
4056        adp_cmd = &cmd->data.setadapterparms;
4057        if (!is_valid_ether_addr(adp_cmd->data.change_addr.addr))
4058                return -EADDRNOTAVAIL;
4059
4060        if (IS_LAYER2(card) && IS_OSD(card) && !IS_VM_NIC(card) &&
4061            !(adp_cmd->hdr.flags & QETH_SETADP_FLAGS_VIRTUAL_MAC))
4062                return -EADDRNOTAVAIL;
4063
4064        ether_addr_copy(card->dev->dev_addr, adp_cmd->data.change_addr.addr);
4065        return 0;
4066}
4067
4068int qeth_setadpparms_change_macaddr(struct qeth_card *card)
4069{
4070        int rc;
4071        struct qeth_cmd_buffer *iob;
4072        struct qeth_ipa_cmd *cmd;
4073
4074        QETH_CARD_TEXT(card, 4, "chgmac");
4075
4076        iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS,
4077                                   SETADP_DATA_SIZEOF(change_addr));
4078        if (!iob)
4079                return -ENOMEM;
4080        cmd = __ipa_cmd(iob);
4081        cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
4082        cmd->data.setadapterparms.data.change_addr.addr_size = ETH_ALEN;
4083        ether_addr_copy(cmd->data.setadapterparms.data.change_addr.addr,
4084                        card->dev->dev_addr);
4085        rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
4086                               NULL);
4087        return rc;
4088}
4089EXPORT_SYMBOL_GPL(qeth_setadpparms_change_macaddr);
4090
4091static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
4092                struct qeth_reply *reply, unsigned long data)
4093{
4094        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
4095        struct qeth_set_access_ctrl *access_ctrl_req;
4096        int fallback = *(int *)reply->param;
4097
4098        QETH_CARD_TEXT(card, 4, "setaccb");
4099        if (cmd->hdr.return_code)
4100                return -EIO;
4101        qeth_setadpparms_inspect_rc(cmd);
4102
4103        access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
4104        QETH_CARD_TEXT_(card, 2, "rc=%d",
4105                        cmd->data.setadapterparms.hdr.return_code);
4106        if (cmd->data.setadapterparms.hdr.return_code !=
4107                                                SET_ACCESS_CTRL_RC_SUCCESS)
4108                QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%#x) on device %x: %#x\n",
4109                                 access_ctrl_req->subcmd_code, CARD_DEVID(card),
4110                                 cmd->data.setadapterparms.hdr.return_code);
4111        switch (cmd->data.setadapterparms.hdr.return_code) {
4112        case SET_ACCESS_CTRL_RC_SUCCESS:
4113                if (card->options.isolation == ISOLATION_MODE_NONE) {
4114                        dev_info(&card->gdev->dev,
4115                            "QDIO data connection isolation is deactivated\n");
4116                } else {
4117                        dev_info(&card->gdev->dev,
4118                            "QDIO data connection isolation is activated\n");
4119                }
4120                break;
4121        case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED:
4122                QETH_DBF_MESSAGE(2, "QDIO data connection isolation on device %x already deactivated\n",
4123                                 CARD_DEVID(card));
4124                if (fallback)
4125                        card->options.isolation = card->options.prev_isolation;
4126                break;
4127        case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED:
4128                QETH_DBF_MESSAGE(2, "QDIO data connection isolation on device %x already activated\n",
4129                                 CARD_DEVID(card));
4130                if (fallback)
4131                        card->options.isolation = card->options.prev_isolation;
4132                break;
4133        case SET_ACCESS_CTRL_RC_NOT_SUPPORTED:
4134                dev_err(&card->gdev->dev, "Adapter does not "
4135                        "support QDIO data connection isolation\n");
4136                break;
4137        case SET_ACCESS_CTRL_RC_NONE_SHARED_ADAPTER:
4138                dev_err(&card->gdev->dev,
4139                        "Adapter is dedicated. "
4140                        "QDIO data connection isolation not supported\n");
4141                if (fallback)
4142                        card->options.isolation = card->options.prev_isolation;
4143                break;
4144        case SET_ACCESS_CTRL_RC_ACTIVE_CHECKSUM_OFF:
4145                dev_err(&card->gdev->dev,
4146                        "TSO does not permit QDIO data connection isolation\n");
4147                if (fallback)
4148                        card->options.isolation = card->options.prev_isolation;
4149                break;
4150        case SET_ACCESS_CTRL_RC_REFLREL_UNSUPPORTED:
4151                dev_err(&card->gdev->dev, "The adjacent switch port does not "
4152                        "support reflective relay mode\n");
4153                if (fallback)
4154                        card->options.isolation = card->options.prev_isolation;
4155                break;
4156        case SET_ACCESS_CTRL_RC_REFLREL_FAILED:
4157                dev_err(&card->gdev->dev, "The reflective relay mode cannot be "
4158                                        "enabled at the adjacent switch port");
4159                if (fallback)
4160                        card->options.isolation = card->options.prev_isolation;
4161                break;
4162        case SET_ACCESS_CTRL_RC_REFLREL_DEACT_FAILED:
4163                dev_warn(&card->gdev->dev, "Turning off reflective relay mode "
4164                                        "at the adjacent switch failed\n");
4165                break;
4166        default:
4167                /* this should never happen */
4168                if (fallback)
4169                        card->options.isolation = card->options.prev_isolation;
4170                break;
4171        }
4172        return (cmd->hdr.return_code) ? -EIO : 0;
4173}
4174
4175static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
4176                enum qeth_ipa_isolation_modes isolation, int fallback)
4177{
4178        int rc;
4179        struct qeth_cmd_buffer *iob;
4180        struct qeth_ipa_cmd *cmd;
4181        struct qeth_set_access_ctrl *access_ctrl_req;
4182
4183        QETH_CARD_TEXT(card, 4, "setacctl");
4184
4185        iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL,
4186                                   SETADP_DATA_SIZEOF(set_access_ctrl));
4187        if (!iob)
4188                return -ENOMEM;
4189        cmd = __ipa_cmd(iob);
4190        access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
4191        access_ctrl_req->subcmd_code = isolation;
4192
4193        rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb,
4194                               &fallback);
4195        QETH_CARD_TEXT_(card, 2, "rc=%d", rc);
4196        return rc;
4197}
4198
4199int qeth_set_access_ctrl_online(struct qeth_card *card, int fallback)
4200{
4201        int rc = 0;
4202
4203        QETH_CARD_TEXT(card, 4, "setactlo");
4204
4205        if ((IS_OSD(card) || IS_OSX(card)) &&
4206            qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) {
4207                rc = qeth_setadpparms_set_access_ctrl(card,
4208                        card->options.isolation, fallback);
4209                if (rc) {
4210                        QETH_DBF_MESSAGE(3, "IPA(SET_ACCESS_CTRL(%d) on device %x: sent failed\n",
4211                                         rc, CARD_DEVID(card));
4212                        rc = -EOPNOTSUPP;
4213                }
4214        } else if (card->options.isolation != ISOLATION_MODE_NONE) {
4215                card->options.isolation = ISOLATION_MODE_NONE;
4216
4217                dev_err(&card->gdev->dev, "Adapter does not "
4218                        "support QDIO data connection isolation\n");
4219                rc = -EOPNOTSUPP;
4220        }
4221        return rc;
4222}
4223EXPORT_SYMBOL_GPL(qeth_set_access_ctrl_online);
4224
4225void qeth_tx_timeout(struct net_device *dev)
4226{
4227        struct qeth_card *card;
4228
4229        card = dev->ml_priv;
4230        QETH_CARD_TEXT(card, 4, "txtimeo");
4231        qeth_schedule_recovery(card);
4232}
4233EXPORT_SYMBOL_GPL(qeth_tx_timeout);
4234
4235static int qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
4236{
4237        struct qeth_card *card = dev->ml_priv;
4238        int rc = 0;
4239
4240        switch (regnum) {
4241        case MII_BMCR: /* Basic mode control register */
4242                rc = BMCR_FULLDPLX;
4243                if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
4244                    (card->info.link_type != QETH_LINK_TYPE_OSN) &&
4245                    (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH) &&
4246                    (card->info.link_type != QETH_LINK_TYPE_25GBIT_ETH))
4247                        rc |= BMCR_SPEED100;
4248                break;
4249        case MII_BMSR: /* Basic mode status register */
4250                rc = BMSR_ERCAP | BMSR_ANEGCOMPLETE | BMSR_LSTATUS |
4251                     BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | BMSR_100FULL |
4252                     BMSR_100BASE4;
4253                break;
4254        case MII_PHYSID1: /* PHYS ID 1 */
4255                rc = (dev->dev_addr[0] << 16) | (dev->dev_addr[1] << 8) |
4256                     dev->dev_addr[2];
4257                rc = (rc >> 5) & 0xFFFF;
4258                break;
4259        case MII_PHYSID2: /* PHYS ID 2 */
4260                rc = (dev->dev_addr[2] << 10) & 0xFFFF;
4261                break;
4262        case MII_ADVERTISE: /* Advertisement control reg */
4263                rc = ADVERTISE_ALL;
4264                break;
4265        case MII_LPA: /* Link partner ability reg */
4266                rc = LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL |
4267                     LPA_100BASE4 | LPA_LPACK;
4268                break;
4269        case MII_EXPANSION: /* Expansion register */
4270                break;
4271        case MII_DCOUNTER: /* disconnect counter */
4272                break;
4273        case MII_FCSCOUNTER: /* false carrier counter */
4274                break;
4275        case MII_NWAYTEST: /* N-way auto-neg test register */
4276                break;
4277        case MII_RERRCOUNTER: /* rx error counter */
4278                rc = card->stats.rx_errors;
4279                break;
4280        case MII_SREVISION: /* silicon revision */
4281                break;
4282        case MII_RESV1: /* reserved 1 */
4283                break;
4284        case MII_LBRERROR: /* loopback, rx, bypass error */
4285                break;
4286        case MII_PHYADDR: /* physical address */
4287                break;
4288        case MII_RESV2: /* reserved 2 */
4289                break;
4290        case MII_TPISTATUS: /* TPI status for 10mbps */
4291                break;
4292        case MII_NCONFIG: /* network interface config */
4293                break;
4294        default:
4295                break;
4296        }
4297        return rc;
4298}
4299
4300static int qeth_snmp_command_cb(struct qeth_card *card,
4301                struct qeth_reply *reply, unsigned long sdata)
4302{
4303        struct qeth_ipa_cmd *cmd;
4304        struct qeth_arp_query_info *qinfo;
4305        unsigned char *data;
4306        void *snmp_data;
4307        __u16 data_len;
4308
4309        QETH_CARD_TEXT(card, 3, "snpcmdcb");
4310
4311        cmd = (struct qeth_ipa_cmd *) sdata;
4312        data = (unsigned char *)((char *)cmd - reply->offset);
4313        qinfo = (struct qeth_arp_query_info *) reply->param;
4314
4315        if (cmd->hdr.return_code) {
4316                QETH_CARD_TEXT_(card, 4, "scer1%x", cmd->hdr.return_code);
4317                return -EIO;
4318        }
4319        if (cmd->data.setadapterparms.hdr.return_code) {
4320                cmd->hdr.return_code =
4321                        cmd->data.setadapterparms.hdr.return_code;
4322                QETH_CARD_TEXT_(card, 4, "scer2%x", cmd->hdr.return_code);
4323                return -EIO;
4324        }
4325        data_len = *((__u16 *)QETH_IPA_PDU_LEN_PDU1(data));
4326        if (cmd->data.setadapterparms.hdr.seq_no == 1) {
4327                snmp_data = &cmd->data.setadapterparms.data.snmp;
4328                data_len -= offsetof(struct qeth_ipa_cmd,
4329                                     data.setadapterparms.data.snmp);
4330        } else {
4331                snmp_data = &cmd->data.setadapterparms.data.snmp.request;
4332                data_len -= offsetof(struct qeth_ipa_cmd,
4333                                     data.setadapterparms.data.snmp.request);
4334        }
4335
4336        /* check if there is enough room in userspace */
4337        if ((qinfo->udata_len - qinfo->udata_offset) < data_len) {
4338                QETH_CARD_TEXT_(card, 4, "scer3%i", -ENOSPC);
4339                return -ENOSPC;
4340        }
4341        QETH_CARD_TEXT_(card, 4, "snore%i",
4342                        cmd->data.setadapterparms.hdr.used_total);
4343        QETH_CARD_TEXT_(card, 4, "sseqn%i",
4344                        cmd->data.setadapterparms.hdr.seq_no);
4345        /*copy entries to user buffer*/
4346        memcpy(qinfo->udata + qinfo->udata_offset, snmp_data, data_len);
4347        qinfo->udata_offset += data_len;
4348
4349        if (cmd->data.setadapterparms.hdr.seq_no <
4350            cmd->data.setadapterparms.hdr.used_total)
4351                return 1;
4352        return 0;
4353}
4354
4355static int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4356{
4357        struct qeth_snmp_ureq __user *ureq;
4358        struct qeth_cmd_buffer *iob;
4359        unsigned int req_len;
4360        struct qeth_arp_query_info qinfo = {0, };
4361        int rc = 0;
4362
4363        QETH_CARD_TEXT(card, 3, "snmpcmd");
4364
4365        if (IS_VM_NIC(card))
4366                return -EOPNOTSUPP;
4367
4368        if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) &&
4369            IS_LAYER3(card))
4370                return -EOPNOTSUPP;
4371
4372        ureq = (struct qeth_snmp_ureq __user *) udata;
4373        if (get_user(qinfo.udata_len, &ureq->hdr.data_len) ||
4374            get_user(req_len, &ureq->hdr.req_len))
4375                return -EFAULT;
4376
4377        /* Sanitize user input, to avoid overflows in iob size calculation: */
4378        if (req_len > QETH_BUFSIZE)
4379                return -EINVAL;
4380
4381        iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, req_len);
4382        if (!iob)
4383                return -ENOMEM;
4384
4385        if (copy_from_user(&__ipa_cmd(iob)->data.setadapterparms.data.snmp,
4386                           &ureq->cmd, req_len)) {
4387                qeth_put_cmd(iob);
4388                return -EFAULT;
4389        }
4390
4391        qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL);
4392        if (!qinfo.udata) {
4393                qeth_put_cmd(iob);
4394                return -ENOMEM;
4395        }
4396        qinfo.udata_offset = sizeof(struct qeth_snmp_ureq_hdr);
4397
4398        rc = qeth_send_ipa_cmd(card, iob, qeth_snmp_command_cb, &qinfo);
4399        if (rc)
4400                QETH_DBF_MESSAGE(2, "SNMP command failed on device %x: (%#x)\n",
4401                                 CARD_DEVID(card), rc);
4402        else {
4403                if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
4404                        rc = -EFAULT;
4405        }
4406
4407        kfree(qinfo.udata);
4408        return rc;
4409}
4410
4411static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
4412                struct qeth_reply *reply, unsigned long data)
4413{
4414        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
4415        struct qeth_qoat_priv *priv;
4416        char *resdata;
4417        int resdatalen;
4418
4419        QETH_CARD_TEXT(card, 3, "qoatcb");
4420        if (qeth_setadpparms_inspect_rc(cmd))
4421                return -EIO;
4422
4423        priv = (struct qeth_qoat_priv *)reply->param;
4424        resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
4425        resdata = (char *)data + 28;
4426
4427        if (resdatalen > (priv->buffer_len - priv->response_len))
4428                return -ENOSPC;
4429
4430        memcpy((priv->buffer + priv->response_len), resdata,
4431                resdatalen);
4432        priv->response_len += resdatalen;
4433
4434        if (cmd->data.setadapterparms.hdr.seq_no <
4435            cmd->data.setadapterparms.hdr.used_total)
4436                return 1;
4437        return 0;
4438}
4439
4440static int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
4441{
4442        int rc = 0;
4443        struct qeth_cmd_buffer *iob;
4444        struct qeth_ipa_cmd *cmd;
4445        struct qeth_query_oat *oat_req;
4446        struct qeth_query_oat_data oat_data;
4447        struct qeth_qoat_priv priv;
4448        void __user *tmp;
4449
4450        QETH_CARD_TEXT(card, 3, "qoatcmd");
4451
4452        if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) {
4453                rc = -EOPNOTSUPP;
4454                goto out;
4455        }
4456
4457        if (copy_from_user(&oat_data, udata,
4458            sizeof(struct qeth_query_oat_data))) {
4459                        rc = -EFAULT;
4460                        goto out;
4461        }
4462
4463        priv.buffer_len = oat_data.buffer_len;
4464        priv.response_len = 0;
4465        priv.buffer = vzalloc(oat_data.buffer_len);
4466        if (!priv.buffer) {
4467                rc = -ENOMEM;
4468                goto out;
4469        }
4470
4471        iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT,
4472                                   SETADP_DATA_SIZEOF(query_oat));
4473        if (!iob) {
4474                rc = -ENOMEM;
4475                goto out_free;
4476        }
4477        cmd = __ipa_cmd(iob);
4478        oat_req = &cmd->data.setadapterparms.data.query_oat;
4479        oat_req->subcmd_code = oat_data.command;
4480
4481        rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb,
4482                               &priv);
4483        if (!rc) {
4484                if (is_compat_task())
4485                        tmp = compat_ptr(oat_data.ptr);
4486                else
4487                        tmp = (void __user *)(unsigned long)oat_data.ptr;
4488
4489                if (copy_to_user(tmp, priv.buffer,
4490                    priv.response_len)) {
4491                        rc = -EFAULT;
4492                        goto out_free;
4493                }
4494
4495                oat_data.response_len = priv.response_len;
4496
4497                if (copy_to_user(udata, &oat_data,
4498                    sizeof(struct qeth_query_oat_data)))
4499                        rc = -EFAULT;
4500        }
4501
4502out_free:
4503        vfree(priv.buffer);
4504out:
4505        return rc;
4506}
4507
4508static int qeth_query_card_info_cb(struct qeth_card *card,
4509                                   struct qeth_reply *reply, unsigned long data)
4510{
4511        struct carrier_info *carrier_info = (struct carrier_info *)reply->param;
4512        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
4513        struct qeth_query_card_info *card_info;
4514
4515        QETH_CARD_TEXT(card, 2, "qcrdincb");
4516        if (qeth_setadpparms_inspect_rc(cmd))
4517                return -EIO;
4518
4519        card_info = &cmd->data.setadapterparms.data.card_info;
4520        carrier_info->card_type = card_info->card_type;
4521        carrier_info->port_mode = card_info->port_mode;
4522        carrier_info->port_speed = card_info->port_speed;
4523        return 0;
4524}
4525
4526int qeth_query_card_info(struct qeth_card *card,
4527                         struct carrier_info *carrier_info)
4528{
4529        struct qeth_cmd_buffer *iob;
4530
4531        QETH_CARD_TEXT(card, 2, "qcrdinfo");
4532        if (!qeth_adp_supported(card, IPA_SETADP_QUERY_CARD_INFO))
4533                return -EOPNOTSUPP;
4534        iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO, 0);
4535        if (!iob)
4536                return -ENOMEM;
4537        return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb,
4538                                        (void *)carrier_info);
4539}
4540
4541/**
4542 * qeth_vm_request_mac() - Request a hypervisor-managed MAC address
4543 * @card: pointer to a qeth_card
4544 *
4545 * Returns
4546 *      0, if a MAC address has been set for the card's netdevice
4547 *      a return code, for various error conditions
4548 */
4549int qeth_vm_request_mac(struct qeth_card *card)
4550{
4551        struct diag26c_mac_resp *response;
4552        struct diag26c_mac_req *request;
4553        struct ccw_dev_id id;
4554        int rc;
4555
4556        QETH_CARD_TEXT(card, 2, "vmreqmac");
4557
4558        request = kzalloc(sizeof(*request), GFP_KERNEL | GFP_DMA);
4559        response = kzalloc(sizeof(*response), GFP_KERNEL | GFP_DMA);
4560        if (!request || !response) {
4561                rc = -ENOMEM;
4562                goto out;
4563        }
4564
4565        ccw_device_get_id(CARD_DDEV(card), &id);
4566        request->resp_buf_len = sizeof(*response);
4567        request->resp_version = DIAG26C_VERSION2;
4568        request->op_code = DIAG26C_GET_MAC;
4569        request->devno = id.devno;
4570
4571        QETH_DBF_HEX(CTRL, 2, request, sizeof(*request));
4572        rc = diag26c(request, response, DIAG26C_MAC_SERVICES);
4573        QETH_DBF_HEX(CTRL, 2, request, sizeof(*request));
4574        if (rc)
4575                goto out;
4576        QETH_DBF_HEX(CTRL, 2, response, sizeof(*response));
4577
4578        if (request->resp_buf_len < sizeof(*response) ||
4579            response->version != request->resp_version) {
4580                rc = -EIO;
4581                QETH_CARD_TEXT(card, 2, "badresp");
4582                QETH_CARD_HEX(card, 2, &request->resp_buf_len,
4583                              sizeof(request->resp_buf_len));
4584        } else if (!is_valid_ether_addr(response->mac)) {
4585                rc = -EINVAL;
4586                QETH_CARD_TEXT(card, 2, "badmac");
4587                QETH_CARD_HEX(card, 2, response->mac, ETH_ALEN);
4588        } else {
4589                ether_addr_copy(card->dev->dev_addr, response->mac);
4590        }
4591
4592out:
4593        kfree(response);
4594        kfree(request);
4595        return rc;
4596}
4597EXPORT_SYMBOL_GPL(qeth_vm_request_mac);
4598
4599static void qeth_determine_capabilities(struct qeth_card *card)
4600{
4601        int rc;
4602        struct ccw_device *ddev;
4603        int ddev_offline = 0;
4604
4605        QETH_CARD_TEXT(card, 2, "detcapab");
4606        ddev = CARD_DDEV(card);
4607        if (!ddev->online) {
4608                ddev_offline = 1;
4609                rc = ccw_device_set_online(ddev);
4610                if (rc) {
4611                        QETH_CARD_TEXT_(card, 2, "3err%d", rc);
4612                        goto out;
4613                }
4614        }
4615
4616        rc = qeth_read_conf_data(card);
4617        if (rc) {
4618                QETH_DBF_MESSAGE(2, "qeth_read_conf_data on device %x returned %i\n",
4619                                 CARD_DEVID(card), rc);
4620                QETH_CARD_TEXT_(card, 2, "5err%d", rc);
4621                goto out_offline;
4622        }
4623
4624        rc = qdio_get_ssqd_desc(ddev, &card->ssqd);
4625        if (rc)
4626                QETH_CARD_TEXT_(card, 2, "6err%d", rc);
4627
4628        QETH_CARD_TEXT_(card, 2, "qfmt%d", card->ssqd.qfmt);
4629        QETH_CARD_TEXT_(card, 2, "ac1:%02x", card->ssqd.qdioac1);
4630        QETH_CARD_TEXT_(card, 2, "ac2:%04x", card->ssqd.qdioac2);
4631        QETH_CARD_TEXT_(card, 2, "ac3:%04x", card->ssqd.qdioac3);
4632        QETH_CARD_TEXT_(card, 2, "icnt%d", card->ssqd.icnt);
4633        if (!((card->ssqd.qfmt != QDIO_IQDIO_QFMT) ||
4634            ((card->ssqd.qdioac1 & CHSC_AC1_INITIATE_INPUTQ) == 0) ||
4635            ((card->ssqd.qdioac3 & CHSC_AC3_FORMAT2_CQ_AVAILABLE) == 0))) {
4636                dev_info(&card->gdev->dev,
4637                        "Completion Queueing supported\n");
4638        } else {
4639                card->options.cq = QETH_CQ_NOTAVAILABLE;
4640        }
4641
4642
4643out_offline:
4644        if (ddev_offline == 1)
4645                ccw_device_set_offline(ddev);
4646out:
4647        return;
4648}
4649
4650static void qeth_qdio_establish_cq(struct qeth_card *card,
4651                                   struct qdio_buffer **in_sbal_ptrs,
4652                                   void (**queue_start_poll)
4653                                        (struct ccw_device *, int,
4654                                         unsigned long))
4655{
4656        int i;
4657
4658        if (card->options.cq == QETH_CQ_ENABLED) {
4659                int offset = QDIO_MAX_BUFFERS_PER_Q *
4660                             (card->qdio.no_in_queues - 1);
4661                for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4662                        in_sbal_ptrs[offset + i] = (struct qdio_buffer *)
4663                                virt_to_phys(card->qdio.c_q->bufs[i].buffer);
4664                }
4665
4666                queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
4667        }
4668}
4669
4670static int qeth_qdio_establish(struct qeth_card *card)
4671{
4672        struct qdio_initialize init_data;
4673        char *qib_param_field;
4674        struct qdio_buffer **in_sbal_ptrs;
4675        void (**queue_start_poll) (struct ccw_device *, int, unsigned long);
4676        struct qdio_buffer **out_sbal_ptrs;
4677        int i, j, k;
4678        int rc = 0;
4679
4680        QETH_CARD_TEXT(card, 2, "qdioest");
4681
4682        qib_param_field = kzalloc(QDIO_MAX_BUFFERS_PER_Q,
4683                                  GFP_KERNEL);
4684        if (!qib_param_field) {
4685                rc =  -ENOMEM;
4686                goto out_free_nothing;
4687        }
4688
4689        qeth_create_qib_param_field(card, qib_param_field);
4690        qeth_create_qib_param_field_blkt(card, qib_param_field);
4691
4692        in_sbal_ptrs = kcalloc(card->qdio.no_in_queues * QDIO_MAX_BUFFERS_PER_Q,
4693                               sizeof(void *),
4694                               GFP_KERNEL);
4695        if (!in_sbal_ptrs) {
4696                rc = -ENOMEM;
4697                goto out_free_qib_param;
4698        }
4699        for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
4700                in_sbal_ptrs[i] = (struct qdio_buffer *)
4701                        virt_to_phys(card->qdio.in_q->bufs[i].buffer);
4702        }
4703
4704        queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *),
4705                                   GFP_KERNEL);
4706        if (!queue_start_poll) {
4707                rc = -ENOMEM;
4708                goto out_free_in_sbals;
4709        }
4710        for (i = 0; i < card->qdio.no_in_queues; ++i)
4711                queue_start_poll[i] = qeth_qdio_start_poll;
4712
4713        qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
4714
4715        out_sbal_ptrs =
4716                kcalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q,
4717                        sizeof(void *),
4718                        GFP_KERNEL);
4719        if (!out_sbal_ptrs) {
4720                rc = -ENOMEM;
4721                goto out_free_queue_start_poll;
4722        }
4723        for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
4724                for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) {
4725                        out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys(
4726                                card->qdio.out_qs[i]->bufs[j]->buffer);
4727                }
4728
4729        memset(&init_data, 0, sizeof(struct qdio_initialize));
4730        init_data.cdev                   = CARD_DDEV(card);
4731        init_data.q_format               = IS_IQD(card) ? QDIO_IQDIO_QFMT :
4732                                                          QDIO_QETH_QFMT;
4733        init_data.qib_param_field_format = 0;
4734        init_data.qib_param_field        = qib_param_field;
4735        init_data.no_input_qs            = card->qdio.no_in_queues;
4736        init_data.no_output_qs           = card->qdio.no_out_queues;
4737        init_data.input_handler          = qeth_qdio_input_handler;
4738        init_data.output_handler         = qeth_qdio_output_handler;
4739        init_data.queue_start_poll_array = queue_start_poll;
4740        init_data.int_parm               = (unsigned long) card;
4741        init_data.input_sbal_addr_array  = in_sbal_ptrs;
4742        init_data.output_sbal_addr_array = out_sbal_ptrs;
4743        init_data.output_sbal_state_array = card->qdio.out_bufstates;
4744        init_data.scan_threshold         = IS_IQD(card) ? 1 : 32;
4745
4746        if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
4747                QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) {
4748                rc = qdio_allocate(&init_data);
4749                if (rc) {
4750                        atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
4751                        goto out;
4752                }
4753                rc = qdio_establish(&init_data);
4754                if (rc) {
4755                        atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
4756                        qdio_free(CARD_DDEV(card));
4757                }
4758        }
4759
4760        switch (card->options.cq) {
4761        case QETH_CQ_ENABLED:
4762                dev_info(&card->gdev->dev, "Completion Queue support enabled");
4763                break;
4764        case QETH_CQ_DISABLED:
4765                dev_info(&card->gdev->dev, "Completion Queue support disabled");
4766                break;
4767        default:
4768                break;
4769        }
4770out:
4771        kfree(out_sbal_ptrs);
4772out_free_queue_start_poll:
4773        kfree(queue_start_poll);
4774out_free_in_sbals:
4775        kfree(in_sbal_ptrs);
4776out_free_qib_param:
4777        kfree(qib_param_field);
4778out_free_nothing:
4779        return rc;
4780}
4781
4782static void qeth_core_free_card(struct qeth_card *card)
4783{
4784        QETH_CARD_TEXT(card, 2, "freecrd");
4785        qeth_clean_channel(&card->read);
4786        qeth_clean_channel(&card->write);
4787        qeth_clean_channel(&card->data);
4788        qeth_put_cmd(card->read_cmd);
4789        destroy_workqueue(card->event_wq);
4790        qeth_free_qdio_queues(card);
4791        unregister_service_level(&card->qeth_service_level);
4792        dev_set_drvdata(&card->gdev->dev, NULL);
4793        kfree(card);
4794}
4795
4796void qeth_trace_features(struct qeth_card *card)
4797{
4798        QETH_CARD_TEXT(card, 2, "features");
4799        QETH_CARD_HEX(card, 2, &card->options.ipa4, sizeof(card->options.ipa4));
4800        QETH_CARD_HEX(card, 2, &card->options.ipa6, sizeof(card->options.ipa6));
4801        QETH_CARD_HEX(card, 2, &card->options.adp, sizeof(card->options.adp));
4802        QETH_CARD_HEX(card, 2, &card->info.diagass_support,
4803                      sizeof(card->info.diagass_support));
4804}
4805EXPORT_SYMBOL_GPL(qeth_trace_features);
4806
4807static struct ccw_device_id qeth_ids[] = {
4808        {CCW_DEVICE_DEVTYPE(0x1731, 0x01, 0x1732, 0x01),
4809                                        .driver_info = QETH_CARD_TYPE_OSD},
4810        {CCW_DEVICE_DEVTYPE(0x1731, 0x05, 0x1732, 0x05),
4811                                        .driver_info = QETH_CARD_TYPE_IQD},
4812        {CCW_DEVICE_DEVTYPE(0x1731, 0x06, 0x1732, 0x06),
4813                                        .driver_info = QETH_CARD_TYPE_OSN},
4814        {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x03),
4815                                        .driver_info = QETH_CARD_TYPE_OSM},
4816        {CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x02),
4817                                        .driver_info = QETH_CARD_TYPE_OSX},
4818        {},
4819};
4820MODULE_DEVICE_TABLE(ccw, qeth_ids);
4821
4822static struct ccw_driver qeth_ccw_driver = {
4823        .driver = {
4824                .owner = THIS_MODULE,
4825                .name = "qeth",
4826        },
4827        .ids = qeth_ids,
4828        .probe = ccwgroup_probe_ccwdev,
4829        .remove = ccwgroup_remove_ccwdev,
4830};
4831
4832int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
4833{
4834        int retries = 3;
4835        int rc;
4836
4837        QETH_CARD_TEXT(card, 2, "hrdsetup");
4838        atomic_set(&card->force_alloc_skb, 0);
4839        rc = qeth_update_from_chp_desc(card);
4840        if (rc)
4841                return rc;
4842retry:
4843        if (retries < 3)
4844                QETH_DBF_MESSAGE(2, "Retrying to do IDX activates on device %x.\n",
4845                                 CARD_DEVID(card));
4846        rc = qeth_qdio_clear_card(card, !IS_IQD(card));
4847        ccw_device_set_offline(CARD_DDEV(card));
4848        ccw_device_set_offline(CARD_WDEV(card));
4849        ccw_device_set_offline(CARD_RDEV(card));
4850        qdio_free(CARD_DDEV(card));
4851        rc = ccw_device_set_online(CARD_RDEV(card));
4852        if (rc)
4853                goto retriable;
4854        rc = ccw_device_set_online(CARD_WDEV(card));
4855        if (rc)
4856                goto retriable;
4857        rc = ccw_device_set_online(CARD_DDEV(card));
4858        if (rc)
4859                goto retriable;
4860retriable:
4861        if (rc == -ERESTARTSYS) {
4862                QETH_CARD_TEXT(card, 2, "break1");
4863                return rc;
4864        } else if (rc) {
4865                QETH_CARD_TEXT_(card, 2, "1err%d", rc);
4866                if (--retries < 0)
4867                        goto out;
4868                else
4869                        goto retry;
4870        }
4871        qeth_determine_capabilities(card);
4872        qeth_init_tokens(card);
4873        qeth_init_func_level(card);
4874
4875        rc = qeth_idx_activate_read_channel(card);
4876        if (rc == -EINTR) {
4877                QETH_CARD_TEXT(card, 2, "break2");
4878                return rc;
4879        } else if (rc) {
4880                QETH_CARD_TEXT_(card, 2, "3err%d", rc);
4881                if (--retries < 0)
4882                        goto out;
4883                else
4884                        goto retry;
4885        }
4886
4887        rc = qeth_idx_activate_write_channel(card);
4888        if (rc == -EINTR) {
4889                QETH_CARD_TEXT(card, 2, "break3");
4890                return rc;
4891        } else if (rc) {
4892                QETH_CARD_TEXT_(card, 2, "4err%d", rc);
4893                if (--retries < 0)
4894                        goto out;
4895                else
4896                        goto retry;
4897        }
4898        card->read_or_write_problem = 0;
4899        rc = qeth_mpc_initialize(card);
4900        if (rc) {
4901                QETH_CARD_TEXT_(card, 2, "5err%d", rc);
4902                goto out;
4903        }
4904
4905        rc = qeth_send_startlan(card);
4906        if (rc) {
4907                QETH_CARD_TEXT_(card, 2, "6err%d", rc);
4908                if (rc == -ENETDOWN) {
4909                        dev_warn(&card->gdev->dev, "The LAN is offline\n");
4910                        *carrier_ok = false;
4911                } else {
4912                        goto out;
4913                }
4914        } else {
4915                *carrier_ok = true;
4916        }
4917
4918        card->options.ipa4.supported_funcs = 0;
4919        card->options.ipa6.supported_funcs = 0;
4920        card->options.adp.supported_funcs = 0;
4921        card->options.sbp.supported_funcs = 0;
4922        card->info.diagass_support = 0;
4923        rc = qeth_query_ipassists(card, QETH_PROT_IPV4);
4924        if (rc == -ENOMEM)
4925                goto out;
4926        if (qeth_is_supported(card, IPA_IPV6)) {
4927                rc = qeth_query_ipassists(card, QETH_PROT_IPV6);
4928                if (rc == -ENOMEM)
4929                        goto out;
4930        }
4931        if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
4932                rc = qeth_query_setadapterparms(card);
4933                if (rc < 0) {
4934                        QETH_CARD_TEXT_(card, 2, "7err%d", rc);
4935                        goto out;
4936                }
4937        }
4938        if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
4939                rc = qeth_query_setdiagass(card);
4940                if (rc < 0) {
4941                        QETH_CARD_TEXT_(card, 2, "8err%d", rc);
4942                        goto out;
4943                }
4944        }
4945        return 0;
4946out:
4947        dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
4948                "an error on the device\n");
4949        QETH_DBF_MESSAGE(2, "Initialization for device %x failed in hardsetup! rc=%d\n",
4950                         CARD_DEVID(card), rc);
4951        return rc;
4952}
4953EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
4954
4955static void qeth_create_skb_frag(struct qdio_buffer_element *element,
4956                                 struct sk_buff *skb, int offset, int data_len)
4957{
4958        struct page *page = virt_to_page(element->addr);
4959        unsigned int next_frag;
4960
4961        /* first fill the linear space */
4962        if (!skb->len) {
4963                unsigned int linear = min(data_len, skb_tailroom(skb));
4964
4965                skb_put_data(skb, element->addr + offset, linear);
4966                data_len -= linear;
4967                if (!data_len)
4968                        return;
4969                offset += linear;
4970                /* fall through to add page frag for remaining data */
4971        }
4972
4973        next_frag = skb_shinfo(skb)->nr_frags;
4974        get_page(page);
4975        skb_add_rx_frag(skb, next_frag, page, offset, data_len, data_len);
4976}
4977
4978static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
4979{
4980        return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);
4981}
4982
4983struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
4984                struct qeth_qdio_buffer *qethbuffer,
4985                struct qdio_buffer_element **__element, int *__offset,
4986                struct qeth_hdr **hdr)
4987{
4988        struct qdio_buffer_element *element = *__element;
4989        struct qdio_buffer *buffer = qethbuffer->buffer;
4990        int offset = *__offset;
4991        struct sk_buff *skb;
4992        int skb_len = 0;
4993        void *data_ptr;
4994        int data_len;
4995        int headroom = 0;
4996        int use_rx_sg = 0;
4997
4998        /* qeth_hdr must not cross element boundaries */
4999        while (element->length < offset + sizeof(struct qeth_hdr)) {
5000                if (qeth_is_last_sbale(element))
5001                        return NULL;
5002                element++;
5003                offset = 0;
5004        }
5005        *hdr = element->addr + offset;
5006
5007        offset += sizeof(struct qeth_hdr);
5008        switch ((*hdr)->hdr.l2.id) {
5009        case QETH_HEADER_TYPE_LAYER2:
5010                skb_len = (*hdr)->hdr.l2.pkt_length;
5011                break;
5012        case QETH_HEADER_TYPE_LAYER3:
5013                skb_len = (*hdr)->hdr.l3.length;
5014                headroom = ETH_HLEN;
5015                break;
5016        case QETH_HEADER_TYPE_OSN:
5017                skb_len = (*hdr)->hdr.osn.pdu_length;
5018                headroom = sizeof(struct qeth_hdr);
5019                break;
5020        default:
5021                break;
5022        }
5023
5024        if (!skb_len)
5025                return NULL;
5026
5027        if (((skb_len >= card->options.rx_sg_cb) &&
5028             !IS_OSN(card) &&
5029             (!atomic_read(&card->force_alloc_skb))) ||
5030            (card->options.cq == QETH_CQ_ENABLED))
5031                use_rx_sg = 1;
5032
5033        if (use_rx_sg && qethbuffer->rx_skb) {
5034                /* QETH_CQ_ENABLED only: */
5035                skb = qethbuffer->rx_skb;
5036                qethbuffer->rx_skb = NULL;
5037        } else {
5038                unsigned int linear = (use_rx_sg) ? QETH_RX_PULL_LEN : skb_len;
5039
5040                skb = napi_alloc_skb(&card->napi, linear + headroom);
5041        }
5042        if (!skb)
5043                goto no_mem;
5044        if (headroom)
5045                skb_reserve(skb, headroom);
5046
5047        data_ptr = element->addr + offset;
5048        while (skb_len) {
5049                data_len = min(skb_len, (int)(element->length - offset));
5050                if (data_len) {
5051                        if (use_rx_sg)
5052                                qeth_create_skb_frag(element, skb, offset,
5053                                                     data_len);
5054                        else
5055                                skb_put_data(skb, data_ptr, data_len);
5056                }
5057                skb_len -= data_len;
5058                if (skb_len) {
5059                        if (qeth_is_last_sbale(element)) {
5060                                QETH_CARD_TEXT(card, 4, "unexeob");
5061                                QETH_CARD_HEX(card, 2, buffer, sizeof(void *));
5062                                dev_kfree_skb_any(skb);
5063                                QETH_CARD_STAT_INC(card, rx_errors);
5064                                return NULL;
5065                        }
5066                        element++;
5067                        offset = 0;
5068                        data_ptr = element->addr;
5069                } else {
5070                        offset += data_len;
5071                }
5072        }
5073        *__element = element;
5074        *__offset = offset;
5075        if (use_rx_sg) {
5076                QETH_CARD_STAT_INC(card, rx_sg_skbs);
5077                QETH_CARD_STAT_ADD(card, rx_sg_frags,
5078                                   skb_shinfo(skb)->nr_frags);
5079        }
5080        return skb;
5081no_mem:
5082        if (net_ratelimit()) {
5083                QETH_CARD_TEXT(card, 2, "noskbmem");
5084        }
5085        QETH_CARD_STAT_INC(card, rx_dropped);
5086        return NULL;
5087}
5088EXPORT_SYMBOL_GPL(qeth_core_get_next_skb);
5089
5090int qeth_poll(struct napi_struct *napi, int budget)
5091{
5092        struct qeth_card *card = container_of(napi, struct qeth_card, napi);
5093        int work_done = 0;
5094        struct qeth_qdio_buffer *buffer;
5095        int done;
5096        int new_budget = budget;
5097
5098        while (1) {
5099                if (!card->rx.b_count) {
5100                        card->rx.qdio_err = 0;
5101                        card->rx.b_count = qdio_get_next_buffers(
5102                                card->data.ccwdev, 0, &card->rx.b_index,
5103                                &card->rx.qdio_err);
5104                        if (card->rx.b_count <= 0) {
5105                                card->rx.b_count = 0;
5106                                break;
5107                        }
5108                        card->rx.b_element =
5109                                &card->qdio.in_q->bufs[card->rx.b_index]
5110                                .buffer->element[0];
5111                        card->rx.e_offset = 0;
5112                }
5113
5114                while (card->rx.b_count) {
5115                        buffer = &card->qdio.in_q->bufs[card->rx.b_index];
5116                        if (!(card->rx.qdio_err &&
5117                            qeth_check_qdio_errors(card, buffer->buffer,
5118                            card->rx.qdio_err, "qinerr")))
5119                                work_done +=
5120                                        card->discipline->process_rx_buffer(
5121                                                card, new_budget, &done);
5122                        else
5123                                done = 1;
5124
5125                        if (done) {
5126                                QETH_CARD_STAT_INC(card, rx_bufs);
5127                                qeth_put_buffer_pool_entry(card,
5128                                        buffer->pool_entry);
5129                                qeth_queue_input_buffer(card, card->rx.b_index);
5130                                card->rx.b_count--;
5131                                if (card->rx.b_count) {
5132                                        card->rx.b_index =
5133                                                (card->rx.b_index + 1) %
5134                                                QDIO_MAX_BUFFERS_PER_Q;
5135                                        card->rx.b_element =
5136                                                &card->qdio.in_q
5137                                                ->bufs[card->rx.b_index]
5138                                                .buffer->element[0];
5139                                        card->rx.e_offset = 0;
5140                                }
5141                        }
5142
5143                        if (work_done >= budget)
5144                                goto out;
5145                        else
5146                                new_budget = budget - work_done;
5147                }
5148        }
5149
5150        napi_complete_done(napi, work_done);
5151        if (qdio_start_irq(card->data.ccwdev, 0))
5152                napi_schedule(&card->napi);
5153out:
5154        return work_done;
5155}
5156EXPORT_SYMBOL_GPL(qeth_poll);
5157
5158static int qeth_setassparms_inspect_rc(struct qeth_ipa_cmd *cmd)
5159{
5160        if (!cmd->hdr.return_code)
5161                cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
5162        return cmd->hdr.return_code;
5163}
5164
5165static int qeth_setassparms_get_caps_cb(struct qeth_card *card,
5166                                        struct qeth_reply *reply,
5167                                        unsigned long data)
5168{
5169        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
5170        struct qeth_ipa_caps *caps = reply->param;
5171
5172        if (qeth_setassparms_inspect_rc(cmd))
5173                return -EIO;
5174
5175        caps->supported = cmd->data.setassparms.data.caps.supported;
5176        caps->enabled = cmd->data.setassparms.data.caps.enabled;
5177        return 0;
5178}
5179
5180int qeth_setassparms_cb(struct qeth_card *card,
5181                        struct qeth_reply *reply, unsigned long data)
5182{
5183        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
5184
5185        QETH_CARD_TEXT(card, 4, "defadpcb");
5186
5187        if (cmd->hdr.return_code)
5188                return -EIO;
5189
5190        cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
5191        if (cmd->hdr.prot_version == QETH_PROT_IPV4)
5192                card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
5193        if (cmd->hdr.prot_version == QETH_PROT_IPV6)
5194                card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
5195        return 0;
5196}
5197EXPORT_SYMBOL_GPL(qeth_setassparms_cb);
5198
5199struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
5200                                                 enum qeth_ipa_funcs ipa_func,
5201                                                 u16 cmd_code,
5202                                                 unsigned int data_length,
5203                                                 enum qeth_prot_versions prot)
5204{
5205        struct qeth_ipacmd_setassparms *setassparms;
5206        struct qeth_ipacmd_setassparms_hdr *hdr;
5207        struct qeth_cmd_buffer *iob;
5208
5209        QETH_CARD_TEXT(card, 4, "getasscm");
5210        iob = qeth_ipa_alloc_cmd(card, IPA_CMD_SETASSPARMS, prot,
5211                                 data_length +
5212                                 offsetof(struct qeth_ipacmd_setassparms,
5213                                          data));
5214        if (!iob)
5215                return NULL;
5216
5217        setassparms = &__ipa_cmd(iob)->data.setassparms;
5218        setassparms->assist_no = ipa_func;
5219
5220        hdr = &setassparms->hdr;
5221        hdr->length = sizeof(*hdr) + data_length;
5222        hdr->command_code = cmd_code;
5223        return iob;
5224}
5225EXPORT_SYMBOL_GPL(qeth_get_setassparms_cmd);
5226
5227int qeth_send_simple_setassparms_prot(struct qeth_card *card,
5228                                      enum qeth_ipa_funcs ipa_func,
5229                                      u16 cmd_code, u32 *data,
5230                                      enum qeth_prot_versions prot)
5231{
5232        unsigned int length = data ? SETASS_DATA_SIZEOF(flags_32bit) : 0;
5233        struct qeth_cmd_buffer *iob;
5234
5235        QETH_CARD_TEXT_(card, 4, "simassp%i", prot);
5236        iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code, length, prot);
5237        if (!iob)
5238                return -ENOMEM;
5239
5240        if (data)
5241                __ipa_cmd(iob)->data.setassparms.data.flags_32bit = *data;
5242        return qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL);
5243}
5244EXPORT_SYMBOL_GPL(qeth_send_simple_setassparms_prot);
5245
5246static void qeth_unregister_dbf_views(void)
5247{
5248        int x;
5249        for (x = 0; x < QETH_DBF_INFOS; x++) {
5250                debug_unregister(qeth_dbf[x].id);
5251                qeth_dbf[x].id = NULL;
5252        }
5253}
5254
5255void qeth_dbf_longtext(debug_info_t *id, int level, char *fmt, ...)
5256{
5257        char dbf_txt_buf[32];
5258        va_list args;
5259
5260        if (!debug_level_enabled(id, level))
5261                return;
5262        va_start(args, fmt);
5263        vsnprintf(dbf_txt_buf, sizeof(dbf_txt_buf), fmt, args);
5264        va_end(args);
5265        debug_text_event(id, level, dbf_txt_buf);
5266}
5267EXPORT_SYMBOL_GPL(qeth_dbf_longtext);
5268
5269static int qeth_register_dbf_views(void)
5270{
5271        int ret;
5272        int x;
5273
5274        for (x = 0; x < QETH_DBF_INFOS; x++) {
5275                /* register the areas */
5276                qeth_dbf[x].id = debug_register(qeth_dbf[x].name,
5277                                                qeth_dbf[x].pages,
5278                                                qeth_dbf[x].areas,
5279                                                qeth_dbf[x].len);
5280                if (qeth_dbf[x].id == NULL) {
5281                        qeth_unregister_dbf_views();
5282                        return -ENOMEM;
5283                }
5284
5285                /* register a view */
5286                ret = debug_register_view(qeth_dbf[x].id, qeth_dbf[x].view);
5287                if (ret) {
5288                        qeth_unregister_dbf_views();
5289                        return ret;
5290                }
5291
5292                /* set a passing level */
5293                debug_set_level(qeth_dbf[x].id, qeth_dbf[x].level);
5294        }
5295
5296        return 0;
5297}
5298
5299static DEFINE_MUTEX(qeth_mod_mutex);    /* for synchronized module loading */
5300
5301int qeth_core_load_discipline(struct qeth_card *card,
5302                enum qeth_discipline_id discipline)
5303{
5304        mutex_lock(&qeth_mod_mutex);
5305        switch (discipline) {
5306        case QETH_DISCIPLINE_LAYER3:
5307                card->discipline = try_then_request_module(
5308                        symbol_get(qeth_l3_discipline), "qeth_l3");
5309                break;
5310        case QETH_DISCIPLINE_LAYER2:
5311                card->discipline = try_then_request_module(
5312                        symbol_get(qeth_l2_discipline), "qeth_l2");
5313                break;
5314        default:
5315                break;
5316        }
5317        mutex_unlock(&qeth_mod_mutex);
5318
5319        if (!card->discipline) {
5320                dev_err(&card->gdev->dev, "There is no kernel module to "
5321                        "support discipline %d\n", discipline);
5322                return -EINVAL;
5323        }
5324
5325        card->options.layer = discipline;
5326        return 0;
5327}
5328
5329void qeth_core_free_discipline(struct qeth_card *card)
5330{
5331        if (IS_LAYER2(card))
5332                symbol_put(qeth_l2_discipline);
5333        else
5334                symbol_put(qeth_l3_discipline);
5335        card->options.layer = QETH_DISCIPLINE_UNDETERMINED;
5336        card->discipline = NULL;
5337}
5338
5339const struct device_type qeth_generic_devtype = {
5340        .name = "qeth_generic",
5341        .groups = qeth_generic_attr_groups,
5342};
5343EXPORT_SYMBOL_GPL(qeth_generic_devtype);
5344
5345static const struct device_type qeth_osn_devtype = {
5346        .name = "qeth_osn",
5347        .groups = qeth_osn_attr_groups,
5348};
5349
5350#define DBF_NAME_LEN    20
5351
5352struct qeth_dbf_entry {
5353        char dbf_name[DBF_NAME_LEN];
5354        debug_info_t *dbf_info;
5355        struct list_head dbf_list;
5356};
5357
5358static LIST_HEAD(qeth_dbf_list);
5359static DEFINE_MUTEX(qeth_dbf_list_mutex);
5360
5361static debug_info_t *qeth_get_dbf_entry(char *name)
5362{
5363        struct qeth_dbf_entry *entry;
5364        debug_info_t *rc = NULL;
5365
5366        mutex_lock(&qeth_dbf_list_mutex);
5367        list_for_each_entry(entry, &qeth_dbf_list, dbf_list) {
5368                if (strcmp(entry->dbf_name, name) == 0) {
5369                        rc = entry->dbf_info;
5370                        break;
5371                }
5372        }
5373        mutex_unlock(&qeth_dbf_list_mutex);
5374        return rc;
5375}
5376
5377static int qeth_add_dbf_entry(struct qeth_card *card, char *name)
5378{
5379        struct qeth_dbf_entry *new_entry;
5380
5381        card->debug = debug_register(name, 2, 1, 8);
5382        if (!card->debug) {
5383                QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf");
5384                goto err;
5385        }
5386        if (debug_register_view(card->debug, &debug_hex_ascii_view))
5387                goto err_dbg;
5388        new_entry = kzalloc(sizeof(struct qeth_dbf_entry), GFP_KERNEL);
5389        if (!new_entry)
5390                goto err_dbg;
5391        strncpy(new_entry->dbf_name, name, DBF_NAME_LEN);
5392        new_entry->dbf_info = card->debug;
5393        mutex_lock(&qeth_dbf_list_mutex);
5394        list_add(&new_entry->dbf_list, &qeth_dbf_list);
5395        mutex_unlock(&qeth_dbf_list_mutex);
5396
5397        return 0;
5398
5399err_dbg:
5400        debug_unregister(card->debug);
5401err:
5402        return -ENOMEM;
5403}
5404
5405static void qeth_clear_dbf_list(void)
5406{
5407        struct qeth_dbf_entry *entry, *tmp;
5408
5409        mutex_lock(&qeth_dbf_list_mutex);
5410        list_for_each_entry_safe(entry, tmp, &qeth_dbf_list, dbf_list) {
5411                list_del(&entry->dbf_list);
5412                debug_unregister(entry->dbf_info);
5413                kfree(entry);
5414        }
5415        mutex_unlock(&qeth_dbf_list_mutex);
5416}
5417
5418static struct net_device *qeth_alloc_netdev(struct qeth_card *card)
5419{
5420        struct net_device *dev;
5421
5422        switch (card->info.type) {
5423        case QETH_CARD_TYPE_IQD:
5424                dev = alloc_netdev_mqs(0, "hsi%d", NET_NAME_UNKNOWN,
5425                                       ether_setup, QETH_MAX_QUEUES, 1);
5426                break;
5427        case QETH_CARD_TYPE_OSM:
5428                dev = alloc_etherdev(0);
5429                break;
5430        case QETH_CARD_TYPE_OSN:
5431                dev = alloc_netdev(0, "osn%d", NET_NAME_UNKNOWN, ether_setup);
5432                break;
5433        default:
5434                dev = alloc_etherdev_mqs(0, QETH_MAX_QUEUES, 1);
5435        }
5436
5437        if (!dev)
5438                return NULL;
5439
5440        dev->ml_priv = card;
5441        dev->watchdog_timeo = QETH_TX_TIMEOUT;
5442        dev->min_mtu = IS_OSN(card) ? 64 : 576;
5443         /* initialized when device first goes online: */
5444        dev->max_mtu = 0;
5445        dev->mtu = 0;
5446        SET_NETDEV_DEV(dev, &card->gdev->dev);
5447        netif_carrier_off(dev);
5448
5449        if (IS_OSN(card)) {
5450                dev->ethtool_ops = &qeth_osn_ethtool_ops;
5451        } else {
5452                dev->ethtool_ops = &qeth_ethtool_ops;
5453                dev->priv_flags &= ~IFF_TX_SKB_SHARING;
5454                dev->hw_features |= NETIF_F_SG;
5455                dev->vlan_features |= NETIF_F_SG;
5456                if (IS_IQD(card)) {
5457                        dev->features |= NETIF_F_SG;
5458                        if (netif_set_real_num_tx_queues(dev,
5459                                                         QETH_IQD_MIN_TXQ)) {
5460                                free_netdev(dev);
5461                                return NULL;
5462                        }
5463                }
5464        }
5465
5466        return dev;
5467}
5468
5469struct net_device *qeth_clone_netdev(struct net_device *orig)
5470{
5471        struct net_device *clone = qeth_alloc_netdev(orig->ml_priv);
5472
5473        if (!clone)
5474                return NULL;
5475
5476        clone->dev_port = orig->dev_port;
5477        return clone;
5478}
5479
5480static int qeth_core_probe_device(struct ccwgroup_device *gdev)
5481{
5482        struct qeth_card *card;
5483        struct device *dev;
5484        int rc;
5485        enum qeth_discipline_id enforced_disc;
5486        char dbf_name[DBF_NAME_LEN];
5487
5488        QETH_DBF_TEXT(SETUP, 2, "probedev");
5489
5490        dev = &gdev->dev;
5491        if (!get_device(dev))
5492                return -ENODEV;
5493
5494        QETH_DBF_TEXT_(SETUP, 2, "%s", dev_name(&gdev->dev));
5495
5496        card = qeth_alloc_card(gdev);
5497        if (!card) {
5498                QETH_DBF_TEXT_(SETUP, 2, "1err%d", -ENOMEM);
5499                rc = -ENOMEM;
5500                goto err_dev;
5501        }
5502
5503        snprintf(dbf_name, sizeof(dbf_name), "qeth_card_%s",
5504                dev_name(&gdev->dev));
5505        card->debug = qeth_get_dbf_entry(dbf_name);
5506        if (!card->debug) {
5507                rc = qeth_add_dbf_entry(card, dbf_name);
5508                if (rc)
5509                        goto err_card;
5510        }
5511
5512        qeth_setup_card(card);
5513        card->dev = qeth_alloc_netdev(card);
5514        if (!card->dev) {
5515                rc = -ENOMEM;
5516                goto err_card;
5517        }
5518
5519        card->qdio.no_out_queues = card->dev->num_tx_queues;
5520        rc = qeth_update_from_chp_desc(card);
5521        if (rc)
5522                goto err_chp_desc;
5523        qeth_determine_capabilities(card);
5524        qeth_set_blkt_defaults(card);
5525
5526        enforced_disc = qeth_enforce_discipline(card);
5527        switch (enforced_disc) {
5528        case QETH_DISCIPLINE_UNDETERMINED:
5529                gdev->dev.type = &qeth_generic_devtype;
5530                break;
5531        default:
5532                card->info.layer_enforced = true;
5533                rc = qeth_core_load_discipline(card, enforced_disc);
5534                if (rc)
5535                        goto err_load;
5536
5537                gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype :
5538                                                card->discipline->devtype;
5539                rc = card->discipline->setup(card->gdev);
5540                if (rc)
5541                        goto err_disc;
5542                break;
5543        }
5544
5545        return 0;
5546
5547err_disc:
5548        qeth_core_free_discipline(card);
5549err_load:
5550err_chp_desc:
5551        free_netdev(card->dev);
5552err_card:
5553        qeth_core_free_card(card);
5554err_dev:
5555        put_device(dev);
5556        return rc;
5557}
5558
5559static void qeth_core_remove_device(struct ccwgroup_device *gdev)
5560{
5561        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5562
5563        QETH_CARD_TEXT(card, 2, "removedv");
5564
5565        if (card->discipline) {
5566                card->discipline->remove(gdev);
5567                qeth_core_free_discipline(card);
5568        }
5569
5570        free_netdev(card->dev);
5571        qeth_core_free_card(card);
5572        put_device(&gdev->dev);
5573}
5574
5575static int qeth_core_set_online(struct ccwgroup_device *gdev)
5576{
5577        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5578        int rc = 0;
5579        enum qeth_discipline_id def_discipline;
5580
5581        if (!card->discipline) {
5582                def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 :
5583                                                QETH_DISCIPLINE_LAYER2;
5584                rc = qeth_core_load_discipline(card, def_discipline);
5585                if (rc)
5586                        goto err;
5587                rc = card->discipline->setup(card->gdev);
5588                if (rc) {
5589                        qeth_core_free_discipline(card);
5590                        goto err;
5591                }
5592        }
5593        rc = card->discipline->set_online(gdev);
5594err:
5595        return rc;
5596}
5597
5598static int qeth_core_set_offline(struct ccwgroup_device *gdev)
5599{
5600        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5601        return card->discipline->set_offline(gdev);
5602}
5603
5604static void qeth_core_shutdown(struct ccwgroup_device *gdev)
5605{
5606        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5607        qeth_set_allowed_threads(card, 0, 1);
5608        if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap)
5609                qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
5610        qeth_qdio_clear_card(card, 0);
5611        qeth_drain_output_queues(card);
5612        qdio_free(CARD_DDEV(card));
5613}
5614
5615static int qeth_suspend(struct ccwgroup_device *gdev)
5616{
5617        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5618
5619        qeth_set_allowed_threads(card, 0, 1);
5620        wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
5621        if (gdev->state == CCWGROUP_OFFLINE)
5622                return 0;
5623
5624        card->discipline->set_offline(gdev);
5625        return 0;
5626}
5627
5628static int qeth_resume(struct ccwgroup_device *gdev)
5629{
5630        struct qeth_card *card = dev_get_drvdata(&gdev->dev);
5631        int rc;
5632
5633        rc = card->discipline->set_online(gdev);
5634
5635        qeth_set_allowed_threads(card, 0xffffffff, 0);
5636        if (rc)
5637                dev_warn(&card->gdev->dev, "The qeth device driver failed to recover an error on the device\n");
5638        return rc;
5639}
5640
5641static ssize_t group_store(struct device_driver *ddrv, const char *buf,
5642                           size_t count)
5643{
5644        int err;
5645
5646        err = ccwgroup_create_dev(qeth_core_root_dev, to_ccwgroupdrv(ddrv), 3,
5647                                  buf);
5648
5649        return err ? err : count;
5650}
5651static DRIVER_ATTR_WO(group);
5652
5653static struct attribute *qeth_drv_attrs[] = {
5654        &driver_attr_group.attr,
5655        NULL,
5656};
5657static struct attribute_group qeth_drv_attr_group = {
5658        .attrs = qeth_drv_attrs,
5659};
5660static const struct attribute_group *qeth_drv_attr_groups[] = {
5661        &qeth_drv_attr_group,
5662        NULL,
5663};
5664
5665static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
5666        .driver = {
5667                .groups = qeth_drv_attr_groups,
5668                .owner = THIS_MODULE,
5669                .name = "qeth",
5670        },
5671        .ccw_driver = &qeth_ccw_driver,
5672        .setup = qeth_core_probe_device,
5673        .remove = qeth_core_remove_device,
5674        .set_online = qeth_core_set_online,
5675        .set_offline = qeth_core_set_offline,
5676        .shutdown = qeth_core_shutdown,
5677        .prepare = NULL,
5678        .complete = NULL,
5679        .freeze = qeth_suspend,
5680        .thaw = qeth_resume,
5681        .restore = qeth_resume,
5682};
5683
5684struct qeth_card *qeth_get_card_by_busid(char *bus_id)
5685{
5686        struct ccwgroup_device *gdev;
5687        struct qeth_card *card;
5688
5689        gdev = get_ccwgroupdev_by_busid(&qeth_core_ccwgroup_driver, bus_id);
5690        if (!gdev)
5691                return NULL;
5692
5693        card = dev_get_drvdata(&gdev->dev);
5694        put_device(&gdev->dev);
5695        return card;
5696}
5697EXPORT_SYMBOL_GPL(qeth_get_card_by_busid);
5698
5699int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5700{
5701        struct qeth_card *card = dev->ml_priv;
5702        struct mii_ioctl_data *mii_data;
5703        int rc = 0;
5704
5705        if (!card)
5706                return -ENODEV;
5707
5708        switch (cmd) {
5709        case SIOC_QETH_ADP_SET_SNMP_CONTROL:
5710                rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
5711                break;
5712        case SIOC_QETH_GET_CARD_TYPE:
5713                if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) &&
5714                    !IS_VM_NIC(card))
5715                        return 1;
5716                return 0;
5717        case SIOCGMIIPHY:
5718                mii_data = if_mii(rq);
5719                mii_data->phy_id = 0;
5720                break;
5721        case SIOCGMIIREG:
5722                mii_data = if_mii(rq);
5723                if (mii_data->phy_id != 0)
5724                        rc = -EINVAL;
5725                else
5726                        mii_data->val_out = qeth_mdio_read(dev,
5727                                mii_data->phy_id, mii_data->reg_num);
5728                break;
5729        case SIOC_QETH_QUERY_OAT:
5730                rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
5731                break;
5732        default:
5733                if (card->discipline->do_ioctl)
5734                        rc = card->discipline->do_ioctl(dev, rq, cmd);
5735                else
5736                        rc = -EOPNOTSUPP;
5737        }
5738        if (rc)
5739                QETH_CARD_TEXT_(card, 2, "ioce%x", rc);
5740        return rc;
5741}
5742EXPORT_SYMBOL_GPL(qeth_do_ioctl);
5743
5744static int qeth_start_csum_cb(struct qeth_card *card, struct qeth_reply *reply,
5745                              unsigned long data)
5746{
5747        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
5748        u32 *features = reply->param;
5749
5750        if (qeth_setassparms_inspect_rc(cmd))
5751                return -EIO;
5752
5753        *features = cmd->data.setassparms.data.flags_32bit;
5754        return 0;
5755}
5756
5757static int qeth_set_csum_off(struct qeth_card *card, enum qeth_ipa_funcs cstype,
5758                             enum qeth_prot_versions prot)
5759{
5760        return qeth_send_simple_setassparms_prot(card, cstype, IPA_CMD_ASS_STOP,
5761                                                 NULL, prot);
5762}
5763
5764static int qeth_set_csum_on(struct qeth_card *card, enum qeth_ipa_funcs cstype,
5765                            enum qeth_prot_versions prot)
5766{
5767        u32 required_features = QETH_IPA_CHECKSUM_UDP | QETH_IPA_CHECKSUM_TCP;
5768        struct qeth_cmd_buffer *iob;
5769        struct qeth_ipa_caps caps;
5770        u32 features;
5771        int rc;
5772
5773        /* some L3 HW requires combined L3+L4 csum offload: */
5774        if (IS_LAYER3(card) && prot == QETH_PROT_IPV4 &&
5775            cstype == IPA_OUTBOUND_CHECKSUM)
5776                required_features |= QETH_IPA_CHECKSUM_IP_HDR;
5777
5778        iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_START, 0,
5779                                       prot);
5780        if (!iob)
5781                return -ENOMEM;
5782
5783        rc = qeth_send_ipa_cmd(card, iob, qeth_start_csum_cb, &features);
5784        if (rc)
5785                return rc;
5786
5787        if ((required_features & features) != required_features) {
5788                qeth_set_csum_off(card, cstype, prot);
5789                return -EOPNOTSUPP;
5790        }
5791
5792        iob = qeth_get_setassparms_cmd(card, cstype, IPA_CMD_ASS_ENABLE,
5793                                       SETASS_DATA_SIZEOF(flags_32bit),
5794                                       prot);
5795        if (!iob) {
5796                qeth_set_csum_off(card, cstype, prot);
5797                return -ENOMEM;
5798        }
5799
5800        if (features & QETH_IPA_CHECKSUM_LP2LP)
5801                required_features |= QETH_IPA_CHECKSUM_LP2LP;
5802        __ipa_cmd(iob)->data.setassparms.data.flags_32bit = required_features;
5803        rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps);
5804        if (rc) {
5805                qeth_set_csum_off(card, cstype, prot);
5806                return rc;
5807        }
5808
5809        if (!qeth_ipa_caps_supported(&caps, required_features) ||
5810            !qeth_ipa_caps_enabled(&caps, required_features)) {
5811                qeth_set_csum_off(card, cstype, prot);
5812                return -EOPNOTSUPP;
5813        }
5814
5815        dev_info(&card->gdev->dev, "HW Checksumming (%sbound IPv%d) enabled\n",
5816                 cstype == IPA_INBOUND_CHECKSUM ? "in" : "out", prot);
5817        if (!qeth_ipa_caps_enabled(&caps, QETH_IPA_CHECKSUM_LP2LP) &&
5818            cstype == IPA_OUTBOUND_CHECKSUM)
5819                dev_warn(&card->gdev->dev,
5820                         "Hardware checksumming is performed only if %s and its peer use different OSA Express 3 ports\n",
5821                         QETH_CARD_IFNAME(card));
5822        return 0;
5823}
5824
5825static int qeth_set_ipa_csum(struct qeth_card *card, bool on, int cstype,
5826                             enum qeth_prot_versions prot)
5827{
5828        return on ? qeth_set_csum_on(card, cstype, prot) :
5829                    qeth_set_csum_off(card, cstype, prot);
5830}
5831
5832static int qeth_start_tso_cb(struct qeth_card *card, struct qeth_reply *reply,
5833                             unsigned long data)
5834{
5835        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
5836        struct qeth_tso_start_data *tso_data = reply->param;
5837
5838        if (qeth_setassparms_inspect_rc(cmd))
5839                return -EIO;
5840
5841        tso_data->mss = cmd->data.setassparms.data.tso.mss;
5842        tso_data->supported = cmd->data.setassparms.data.tso.supported;
5843        return 0;
5844}
5845
5846static int qeth_set_tso_off(struct qeth_card *card,
5847                            enum qeth_prot_versions prot)
5848{
5849        return qeth_send_simple_setassparms_prot(card, IPA_OUTBOUND_TSO,
5850                                                 IPA_CMD_ASS_STOP, NULL, prot);
5851}
5852
5853static int qeth_set_tso_on(struct qeth_card *card,
5854                           enum qeth_prot_versions prot)
5855{
5856        struct qeth_tso_start_data tso_data;
5857        struct qeth_cmd_buffer *iob;
5858        struct qeth_ipa_caps caps;
5859        int rc;
5860
5861        iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO,
5862                                       IPA_CMD_ASS_START, 0, prot);
5863        if (!iob)
5864                return -ENOMEM;
5865
5866        rc = qeth_send_ipa_cmd(card, iob, qeth_start_tso_cb, &tso_data);
5867        if (rc)
5868                return rc;
5869
5870        if (!tso_data.mss || !(tso_data.supported & QETH_IPA_LARGE_SEND_TCP)) {
5871                qeth_set_tso_off(card, prot);
5872                return -EOPNOTSUPP;
5873        }
5874
5875        iob = qeth_get_setassparms_cmd(card, IPA_OUTBOUND_TSO,
5876                                       IPA_CMD_ASS_ENABLE,
5877                                       SETASS_DATA_SIZEOF(caps), prot);
5878        if (!iob) {
5879                qeth_set_tso_off(card, prot);
5880                return -ENOMEM;
5881        }
5882
5883        /* enable TSO capability */
5884        __ipa_cmd(iob)->data.setassparms.data.caps.enabled =
5885                QETH_IPA_LARGE_SEND_TCP;
5886        rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_get_caps_cb, &caps);
5887        if (rc) {
5888                qeth_set_tso_off(card, prot);
5889                return rc;
5890        }
5891
5892        if (!qeth_ipa_caps_supported(&caps, QETH_IPA_LARGE_SEND_TCP) ||
5893            !qeth_ipa_caps_enabled(&caps, QETH_IPA_LARGE_SEND_TCP)) {
5894                qeth_set_tso_off(card, prot);
5895                return -EOPNOTSUPP;
5896        }
5897
5898        dev_info(&card->gdev->dev, "TSOv%u enabled (MSS: %u)\n", prot,
5899                 tso_data.mss);
5900        return 0;
5901}
5902
5903static int qeth_set_ipa_tso(struct qeth_card *card, bool on,
5904                            enum qeth_prot_versions prot)
5905{
5906        return on ? qeth_set_tso_on(card, prot) : qeth_set_tso_off(card, prot);
5907}
5908
5909static int qeth_set_ipa_rx_csum(struct qeth_card *card, bool on)
5910{
5911        int rc_ipv4 = (on) ? -EOPNOTSUPP : 0;
5912        int rc_ipv6;
5913
5914        if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
5915                rc_ipv4 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM,
5916                                            QETH_PROT_IPV4);
5917        if (!qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6))
5918                /* no/one Offload Assist available, so the rc is trivial */
5919                return rc_ipv4;
5920
5921        rc_ipv6 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM,
5922                                    QETH_PROT_IPV6);
5923
5924        if (on)
5925                /* enable: success if any Assist is active */
5926                return (rc_ipv6) ? rc_ipv4 : 0;
5927
5928        /* disable: failure if any Assist is still active */
5929        return (rc_ipv6) ? rc_ipv6 : rc_ipv4;
5930}
5931
5932/**
5933 * qeth_enable_hw_features() - (Re-)Enable HW functions for device features
5934 * @dev:        a net_device
5935 */
5936void qeth_enable_hw_features(struct net_device *dev)
5937{
5938        struct qeth_card *card = dev->ml_priv;
5939        netdev_features_t features;
5940
5941        features = dev->features;
5942        /* force-off any feature that might need an IPA sequence.
5943         * netdev_update_features() will restart them.
5944         */
5945        dev->features &= ~dev->hw_features;
5946        /* toggle VLAN filter, so that VIDs are re-programmed: */
5947        if (IS_LAYER2(card) && IS_VM_NIC(card)) {
5948                dev->features &= ~NETIF_F_HW_VLAN_CTAG_FILTER;
5949                dev->wanted_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
5950        }
5951        netdev_update_features(dev);
5952        if (features != dev->features)
5953                dev_warn(&card->gdev->dev,
5954                         "Device recovery failed to restore all offload features\n");
5955}
5956EXPORT_SYMBOL_GPL(qeth_enable_hw_features);
5957
5958int qeth_set_features(struct net_device *dev, netdev_features_t features)
5959{
5960        struct qeth_card *card = dev->ml_priv;
5961        netdev_features_t changed = dev->features ^ features;
5962        int rc = 0;
5963
5964        QETH_CARD_TEXT(card, 2, "setfeat");
5965        QETH_CARD_HEX(card, 2, &features, sizeof(features));
5966
5967        if ((changed & NETIF_F_IP_CSUM)) {
5968                rc = qeth_set_ipa_csum(card, features & NETIF_F_IP_CSUM,
5969                                       IPA_OUTBOUND_CHECKSUM, QETH_PROT_IPV4);
5970                if (rc)
5971                        changed ^= NETIF_F_IP_CSUM;
5972        }
5973        if (changed & NETIF_F_IPV6_CSUM) {
5974                rc = qeth_set_ipa_csum(card, features & NETIF_F_IPV6_CSUM,
5975                                       IPA_OUTBOUND_CHECKSUM, QETH_PROT_IPV6);
5976                if (rc)
5977                        changed ^= NETIF_F_IPV6_CSUM;
5978        }
5979        if (changed & NETIF_F_RXCSUM) {
5980                rc = qeth_set_ipa_rx_csum(card, features & NETIF_F_RXCSUM);
5981                if (rc)
5982                        changed ^= NETIF_F_RXCSUM;
5983        }
5984        if (changed & NETIF_F_TSO) {
5985                rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO,
5986                                      QETH_PROT_IPV4);
5987                if (rc)
5988                        changed ^= NETIF_F_TSO;
5989        }
5990        if (changed & NETIF_F_TSO6) {
5991                rc = qeth_set_ipa_tso(card, features & NETIF_F_TSO6,
5992                                      QETH_PROT_IPV6);
5993                if (rc)
5994                        changed ^= NETIF_F_TSO6;
5995        }
5996
5997        /* everything changed successfully? */
5998        if ((dev->features ^ features) == changed)
5999                return 0;
6000        /* something went wrong. save changed features and return error */
6001        dev->features ^= changed;
6002        return -EIO;
6003}
6004EXPORT_SYMBOL_GPL(qeth_set_features);
6005
6006netdev_features_t qeth_fix_features(struct net_device *dev,
6007                                    netdev_features_t features)
6008{
6009        struct qeth_card *card = dev->ml_priv;
6010
6011        QETH_CARD_TEXT(card, 2, "fixfeat");
6012        if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM))
6013                features &= ~NETIF_F_IP_CSUM;
6014        if (!qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6))
6015                features &= ~NETIF_F_IPV6_CSUM;
6016        if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM) &&
6017            !qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6))
6018                features &= ~NETIF_F_RXCSUM;
6019        if (!qeth_is_supported(card, IPA_OUTBOUND_TSO))
6020                features &= ~NETIF_F_TSO;
6021        if (!qeth_is_supported6(card, IPA_OUTBOUND_TSO))
6022                features &= ~NETIF_F_TSO6;
6023
6024        QETH_CARD_HEX(card, 2, &features, sizeof(features));
6025        return features;
6026}
6027EXPORT_SYMBOL_GPL(qeth_fix_features);
6028
6029netdev_features_t qeth_features_check(struct sk_buff *skb,
6030                                      struct net_device *dev,
6031                                      netdev_features_t features)
6032{
6033        /* GSO segmentation builds skbs with
6034         *      a (small) linear part for the headers, and
6035         *      page frags for the data.
6036         * Compared to a linear skb, the header-only part consumes an
6037         * additional buffer element. This reduces buffer utilization, and
6038         * hurts throughput. So compress small segments into one element.
6039         */
6040        if (netif_needs_gso(skb, features)) {
6041                /* match skb_segment(): */
6042                unsigned int doffset = skb->data - skb_mac_header(skb);
6043                unsigned int hsize = skb_shinfo(skb)->gso_size;
6044                unsigned int hroom = skb_headroom(skb);
6045
6046                /* linearize only if resulting skb allocations are order-0: */
6047                if (SKB_DATA_ALIGN(hroom + doffset + hsize) <= SKB_MAX_HEAD(0))
6048                        features &= ~NETIF_F_SG;
6049        }
6050
6051        return vlan_features_check(skb, features);
6052}
6053EXPORT_SYMBOL_GPL(qeth_features_check);
6054
6055void qeth_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
6056{
6057        struct qeth_card *card = dev->ml_priv;
6058        struct qeth_qdio_out_q *queue;
6059        unsigned int i;
6060
6061        QETH_CARD_TEXT(card, 5, "getstat");
6062
6063        stats->rx_packets = card->stats.rx_packets;
6064        stats->rx_bytes = card->stats.rx_bytes;
6065        stats->rx_errors = card->stats.rx_errors;
6066        stats->rx_dropped = card->stats.rx_dropped;
6067        stats->multicast = card->stats.rx_multicast;
6068
6069        for (i = 0; i < card->qdio.no_out_queues; i++) {
6070                queue = card->qdio.out_qs[i];
6071
6072                stats->tx_packets += queue->stats.tx_packets;
6073                stats->tx_bytes += queue->stats.tx_bytes;
6074                stats->tx_errors += queue->stats.tx_errors;
6075                stats->tx_dropped += queue->stats.tx_dropped;
6076        }
6077}
6078EXPORT_SYMBOL_GPL(qeth_get_stats64);
6079
6080u16 qeth_iqd_select_queue(struct net_device *dev, struct sk_buff *skb,
6081                          u8 cast_type, struct net_device *sb_dev)
6082{
6083        if (cast_type != RTN_UNICAST)
6084                return QETH_IQD_MCAST_TXQ;
6085        return QETH_IQD_MIN_UCAST_TXQ;
6086}
6087EXPORT_SYMBOL_GPL(qeth_iqd_select_queue);
6088
6089int qeth_open(struct net_device *dev)
6090{
6091        struct qeth_card *card = dev->ml_priv;
6092
6093        QETH_CARD_TEXT(card, 4, "qethopen");
6094
6095        if (qdio_stop_irq(CARD_DDEV(card), 0) < 0)
6096                return -EIO;
6097
6098        card->data.state = CH_STATE_UP;
6099        netif_tx_start_all_queues(dev);
6100
6101        napi_enable(&card->napi);
6102        local_bh_disable();
6103        napi_schedule(&card->napi);
6104        /* kick-start the NAPI softirq: */
6105        local_bh_enable();
6106        return 0;
6107}
6108EXPORT_SYMBOL_GPL(qeth_open);
6109
6110int qeth_stop(struct net_device *dev)
6111{
6112        struct qeth_card *card = dev->ml_priv;
6113
6114        QETH_CARD_TEXT(card, 4, "qethstop");
6115        netif_tx_disable(dev);
6116        napi_disable(&card->napi);
6117        return 0;
6118}
6119EXPORT_SYMBOL_GPL(qeth_stop);
6120
6121static int __init qeth_core_init(void)
6122{
6123        int rc;
6124
6125        pr_info("loading core functions\n");
6126
6127        rc = qeth_register_dbf_views();
6128        if (rc)
6129                goto dbf_err;
6130        qeth_core_root_dev = root_device_register("qeth");
6131        rc = PTR_ERR_OR_ZERO(qeth_core_root_dev);
6132        if (rc)
6133                goto register_err;
6134        qeth_core_header_cache =
6135                kmem_cache_create("qeth_hdr", QETH_HDR_CACHE_OBJ_SIZE,
6136                                  roundup_pow_of_two(QETH_HDR_CACHE_OBJ_SIZE),
6137                                  0, NULL);
6138        if (!qeth_core_header_cache) {
6139                rc = -ENOMEM;
6140                goto slab_err;
6141        }
6142        qeth_qdio_outbuf_cache = kmem_cache_create("qeth_buf",
6143                        sizeof(struct qeth_qdio_out_buffer), 0, 0, NULL);
6144        if (!qeth_qdio_outbuf_cache) {
6145                rc = -ENOMEM;
6146                goto cqslab_err;
6147        }
6148        rc = ccw_driver_register(&qeth_ccw_driver);
6149        if (rc)
6150                goto ccw_err;
6151        rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
6152        if (rc)
6153                goto ccwgroup_err;
6154
6155        return 0;
6156
6157ccwgroup_err:
6158        ccw_driver_unregister(&qeth_ccw_driver);
6159ccw_err:
6160        kmem_cache_destroy(qeth_qdio_outbuf_cache);
6161cqslab_err:
6162        kmem_cache_destroy(qeth_core_header_cache);
6163slab_err:
6164        root_device_unregister(qeth_core_root_dev);
6165register_err:
6166        qeth_unregister_dbf_views();
6167dbf_err:
6168        pr_err("Initializing the qeth device driver failed\n");
6169        return rc;
6170}
6171
6172static void __exit qeth_core_exit(void)
6173{
6174        qeth_clear_dbf_list();
6175        ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
6176        ccw_driver_unregister(&qeth_ccw_driver);
6177        kmem_cache_destroy(qeth_qdio_outbuf_cache);
6178        kmem_cache_destroy(qeth_core_header_cache);
6179        root_device_unregister(qeth_core_root_dev);
6180        qeth_unregister_dbf_views();
6181        pr_info("core functions removed\n");
6182}
6183
6184module_init(qeth_core_init);
6185module_exit(qeth_core_exit);
6186MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
6187MODULE_DESCRIPTION("qeth core functions");
6188MODULE_LICENSE("GPL");
6189