linux/drivers/scsi/fcoe/fcoe.c
<<
>>
Prefs
   1/*
   2 * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc.,
  15 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  16 *
  17 * Maintained at www.Open-FCoE.org
  18 */
  19
  20#include <linux/module.h>
  21#include <linux/version.h>
  22#include <linux/spinlock.h>
  23#include <linux/netdevice.h>
  24#include <linux/etherdevice.h>
  25#include <linux/ethtool.h>
  26#include <linux/if_ether.h>
  27#include <linux/if_vlan.h>
  28#include <linux/crc32.h>
  29#include <linux/slab.h>
  30#include <linux/cpu.h>
  31#include <linux/fs.h>
  32#include <linux/sysfs.h>
  33#include <linux/ctype.h>
  34#include <scsi/scsi_tcq.h>
  35#include <scsi/scsicam.h>
  36#include <scsi/scsi_transport.h>
  37#include <scsi/scsi_transport_fc.h>
  38#include <net/rtnetlink.h>
  39
  40#include <scsi/fc/fc_encaps.h>
  41#include <scsi/fc/fc_fip.h>
  42
  43#include <scsi/libfc.h>
  44#include <scsi/fc_frame.h>
  45#include <scsi/libfcoe.h>
  46
  47#include "fcoe.h"
  48
  49MODULE_AUTHOR("Open-FCoE.org");
  50MODULE_DESCRIPTION("FCoE");
  51MODULE_LICENSE("GPL v2");
  52
  53/* Performance tuning parameters for fcoe */
  54static unsigned int fcoe_ddp_min;
  55module_param_named(ddp_min, fcoe_ddp_min, uint, S_IRUGO | S_IWUSR);
  56MODULE_PARM_DESC(ddp_min, "Minimum I/O size in bytes for "      \
  57                 "Direct Data Placement (DDP).");
  58
  59DEFINE_MUTEX(fcoe_config_mutex);
  60
  61/* fcoe_percpu_clean completion.  Waiter protected by fcoe_create_mutex */
  62static DECLARE_COMPLETION(fcoe_flush_completion);
  63
  64/* fcoe host list */
  65/* must only by accessed under the RTNL mutex */
  66LIST_HEAD(fcoe_hostlist);
  67DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu);
  68
  69/* Function Prototypes */
  70static int fcoe_reset(struct Scsi_Host *);
  71static int fcoe_xmit(struct fc_lport *, struct fc_frame *);
  72static int fcoe_rcv(struct sk_buff *, struct net_device *,
  73                    struct packet_type *, struct net_device *);
  74static int fcoe_percpu_receive_thread(void *);
  75static void fcoe_clean_pending_queue(struct fc_lport *);
  76static void fcoe_percpu_clean(struct fc_lport *);
  77static int fcoe_link_speed_update(struct fc_lport *);
  78static int fcoe_link_ok(struct fc_lport *);
  79
  80static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
  81static int fcoe_hostlist_add(const struct fc_lport *);
  82
  83static void fcoe_check_wait_queue(struct fc_lport *, struct sk_buff *);
  84static int fcoe_device_notification(struct notifier_block *, ulong, void *);
  85static void fcoe_dev_setup(void);
  86static void fcoe_dev_cleanup(void);
  87static struct fcoe_interface
  88*fcoe_hostlist_lookup_port(const struct net_device *);
  89
  90static int fcoe_fip_recv(struct sk_buff *, struct net_device *,
  91                         struct packet_type *, struct net_device *);
  92
  93static void fcoe_fip_send(struct fcoe_ctlr *, struct sk_buff *);
  94static void fcoe_update_src_mac(struct fc_lport *, u8 *);
  95static u8 *fcoe_get_src_mac(struct fc_lport *);
  96static void fcoe_destroy_work(struct work_struct *);
  97
  98static int fcoe_ddp_setup(struct fc_lport *, u16, struct scatterlist *,
  99                          unsigned int);
 100static int fcoe_ddp_done(struct fc_lport *, u16);
 101
 102static int fcoe_cpu_callback(struct notifier_block *, unsigned long, void *);
 103
 104static int fcoe_create(const char *, struct kernel_param *);
 105static int fcoe_destroy(const char *, struct kernel_param *);
 106static int fcoe_enable(const char *, struct kernel_param *);
 107static int fcoe_disable(const char *, struct kernel_param *);
 108
 109static struct fc_seq *fcoe_elsct_send(struct fc_lport *,
 110                                      u32 did, struct fc_frame *,
 111                                      unsigned int op,
 112                                      void (*resp)(struct fc_seq *,
 113                                                   struct fc_frame *,
 114                                                   void *),
 115                                      void *, u32 timeout);
 116static void fcoe_recv_frame(struct sk_buff *skb);
 117
 118static void fcoe_get_lesb(struct fc_lport *, struct fc_els_lesb *);
 119
 120module_param_call(create, fcoe_create, NULL, (void *)FIP_MODE_FABRIC, S_IWUSR);
 121__MODULE_PARM_TYPE(create, "string");
 122MODULE_PARM_DESC(create, " Creates fcoe instance on a ethernet interface");
 123module_param_call(create_vn2vn, fcoe_create, NULL,
 124                  (void *)FIP_MODE_VN2VN, S_IWUSR);
 125__MODULE_PARM_TYPE(create_vn2vn, "string");
 126MODULE_PARM_DESC(create_vn2vn, " Creates a VN_node to VN_node FCoE instance "
 127                 "on an Ethernet interface");
 128module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR);
 129__MODULE_PARM_TYPE(destroy, "string");
 130MODULE_PARM_DESC(destroy, " Destroys fcoe instance on a ethernet interface");
 131module_param_call(enable, fcoe_enable, NULL, NULL, S_IWUSR);
 132__MODULE_PARM_TYPE(enable, "string");
 133MODULE_PARM_DESC(enable, " Enables fcoe on a ethernet interface.");
 134module_param_call(disable, fcoe_disable, NULL, NULL, S_IWUSR);
 135__MODULE_PARM_TYPE(disable, "string");
 136MODULE_PARM_DESC(disable, " Disables fcoe on a ethernet interface.");
 137
 138/* notification function for packets from net device */
 139static struct notifier_block fcoe_notifier = {
 140        .notifier_call = fcoe_device_notification,
 141};
 142
 143/* notification function for CPU hotplug events */
 144static struct notifier_block fcoe_cpu_notifier = {
 145        .notifier_call = fcoe_cpu_callback,
 146};
 147
 148static struct scsi_transport_template *fcoe_transport_template;
 149static struct scsi_transport_template *fcoe_vport_transport_template;
 150
 151static int fcoe_vport_destroy(struct fc_vport *);
 152static int fcoe_vport_create(struct fc_vport *, bool disabled);
 153static int fcoe_vport_disable(struct fc_vport *, bool disable);
 154static void fcoe_set_vport_symbolic_name(struct fc_vport *);
 155static void fcoe_set_port_id(struct fc_lport *, u32, struct fc_frame *);
 156
 157static struct libfc_function_template fcoe_libfc_fcn_templ = {
 158        .frame_send = fcoe_xmit,
 159        .ddp_setup = fcoe_ddp_setup,
 160        .ddp_done = fcoe_ddp_done,
 161        .elsct_send = fcoe_elsct_send,
 162        .get_lesb = fcoe_get_lesb,
 163        .lport_set_port_id = fcoe_set_port_id,
 164};
 165
 166struct fc_function_template fcoe_transport_function = {
 167        .show_host_node_name = 1,
 168        .show_host_port_name = 1,
 169        .show_host_supported_classes = 1,
 170        .show_host_supported_fc4s = 1,
 171        .show_host_active_fc4s = 1,
 172        .show_host_maxframe_size = 1,
 173
 174        .show_host_port_id = 1,
 175        .show_host_supported_speeds = 1,
 176        .get_host_speed = fc_get_host_speed,
 177        .show_host_speed = 1,
 178        .show_host_port_type = 1,
 179        .get_host_port_state = fc_get_host_port_state,
 180        .show_host_port_state = 1,
 181        .show_host_symbolic_name = 1,
 182
 183        .dd_fcrport_size = sizeof(struct fc_rport_libfc_priv),
 184        .show_rport_maxframe_size = 1,
 185        .show_rport_supported_classes = 1,
 186
 187        .show_host_fabric_name = 1,
 188        .show_starget_node_name = 1,
 189        .show_starget_port_name = 1,
 190        .show_starget_port_id = 1,
 191        .set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
 192        .show_rport_dev_loss_tmo = 1,
 193        .get_fc_host_stats = fc_get_host_stats,
 194        .issue_fc_host_lip = fcoe_reset,
 195
 196        .terminate_rport_io = fc_rport_terminate_io,
 197
 198        .vport_create = fcoe_vport_create,
 199        .vport_delete = fcoe_vport_destroy,
 200        .vport_disable = fcoe_vport_disable,
 201        .set_vport_symbolic_name = fcoe_set_vport_symbolic_name,
 202
 203        .bsg_request = fc_lport_bsg_request,
 204};
 205
 206struct fc_function_template fcoe_vport_transport_function = {
 207        .show_host_node_name = 1,
 208        .show_host_port_name = 1,
 209        .show_host_supported_classes = 1,
 210        .show_host_supported_fc4s = 1,
 211        .show_host_active_fc4s = 1,
 212        .show_host_maxframe_size = 1,
 213
 214        .show_host_port_id = 1,
 215        .show_host_supported_speeds = 1,
 216        .get_host_speed = fc_get_host_speed,
 217        .show_host_speed = 1,
 218        .show_host_port_type = 1,
 219        .get_host_port_state = fc_get_host_port_state,
 220        .show_host_port_state = 1,
 221        .show_host_symbolic_name = 1,
 222
 223        .dd_fcrport_size = sizeof(struct fc_rport_libfc_priv),
 224        .show_rport_maxframe_size = 1,
 225        .show_rport_supported_classes = 1,
 226
 227        .show_host_fabric_name = 1,
 228        .show_starget_node_name = 1,
 229        .show_starget_port_name = 1,
 230        .show_starget_port_id = 1,
 231        .set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
 232        .show_rport_dev_loss_tmo = 1,
 233        .get_fc_host_stats = fc_get_host_stats,
 234        .issue_fc_host_lip = fcoe_reset,
 235
 236        .terminate_rport_io = fc_rport_terminate_io,
 237
 238        .bsg_request = fc_lport_bsg_request,
 239};
 240
 241static struct scsi_host_template fcoe_shost_template = {
 242        .module = THIS_MODULE,
 243        .name = "FCoE Driver",
 244        .proc_name = FCOE_NAME,
 245        .queuecommand = fc_queuecommand,
 246        .eh_abort_handler = fc_eh_abort,
 247        .eh_device_reset_handler = fc_eh_device_reset,
 248        .eh_host_reset_handler = fc_eh_host_reset,
 249        .slave_alloc = fc_slave_alloc,
 250        .change_queue_depth = fc_change_queue_depth,
 251        .change_queue_type = fc_change_queue_type,
 252        .this_id = -1,
 253        .cmd_per_lun = 3,
 254        .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS,
 255        .use_clustering = ENABLE_CLUSTERING,
 256        .sg_tablesize = SG_ALL,
 257        .max_sectors = 0xffff,
 258};
 259
 260/**
 261 * fcoe_interface_setup() - Setup a FCoE interface
 262 * @fcoe:   The new FCoE interface
 263 * @netdev: The net device that the fcoe interface is on
 264 *
 265 * Returns : 0 for success
 266 * Locking: must be called with the RTNL mutex held
 267 */
 268static int fcoe_interface_setup(struct fcoe_interface *fcoe,
 269                                struct net_device *netdev)
 270{
 271        struct fcoe_ctlr *fip = &fcoe->ctlr;
 272        struct netdev_hw_addr *ha;
 273        struct net_device *real_dev;
 274        u8 flogi_maddr[ETH_ALEN];
 275        const struct net_device_ops *ops;
 276
 277        fcoe->netdev = netdev;
 278
 279        /* Let LLD initialize for FCoE */
 280        ops = netdev->netdev_ops;
 281        if (ops->ndo_fcoe_enable) {
 282                if (ops->ndo_fcoe_enable(netdev))
 283                        FCOE_NETDEV_DBG(netdev, "Failed to enable FCoE"
 284                                        " specific feature for LLD.\n");
 285        }
 286
 287        /* Do not support for bonding device */
 288        if ((netdev->priv_flags & IFF_MASTER_ALB) ||
 289            (netdev->priv_flags & IFF_SLAVE_INACTIVE) ||
 290            (netdev->priv_flags & IFF_MASTER_8023AD)) {
 291                FCOE_NETDEV_DBG(netdev, "Bonded interfaces not supported\n");
 292                return -EOPNOTSUPP;
 293        }
 294
 295        /* look for SAN MAC address, if multiple SAN MACs exist, only
 296         * use the first one for SPMA */
 297        real_dev = (netdev->priv_flags & IFF_802_1Q_VLAN) ?
 298                vlan_dev_real_dev(netdev) : netdev;
 299        rcu_read_lock();
 300        for_each_dev_addr(real_dev, ha) {
 301                if ((ha->type == NETDEV_HW_ADDR_T_SAN) &&
 302                    (is_valid_ether_addr(ha->addr))) {
 303                        memcpy(fip->ctl_src_addr, ha->addr, ETH_ALEN);
 304                        fip->spma = 1;
 305                        break;
 306                }
 307        }
 308        rcu_read_unlock();
 309
 310        /* setup Source Mac Address */
 311        if (!fip->spma)
 312                memcpy(fip->ctl_src_addr, netdev->dev_addr, netdev->addr_len);
 313
 314        /*
 315         * Add FCoE MAC address as second unicast MAC address
 316         * or enter promiscuous mode if not capable of listening
 317         * for multiple unicast MACs.
 318         */
 319        memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
 320        dev_uc_add(netdev, flogi_maddr);
 321        if (fip->spma)
 322                dev_uc_add(netdev, fip->ctl_src_addr);
 323        if (fip->mode == FIP_MODE_VN2VN) {
 324                dev_mc_add(netdev, FIP_ALL_VN2VN_MACS);
 325                dev_mc_add(netdev, FIP_ALL_P2P_MACS);
 326        } else
 327                dev_mc_add(netdev, FIP_ALL_ENODE_MACS);
 328
 329        /*
 330         * setup the receive function from ethernet driver
 331         * on the ethertype for the given device
 332         */
 333        fcoe->fcoe_packet_type.func = fcoe_rcv;
 334        fcoe->fcoe_packet_type.type = __constant_htons(ETH_P_FCOE);
 335        fcoe->fcoe_packet_type.dev = netdev;
 336        dev_add_pack(&fcoe->fcoe_packet_type);
 337
 338        fcoe->fip_packet_type.func = fcoe_fip_recv;
 339        fcoe->fip_packet_type.type = htons(ETH_P_FIP);
 340        fcoe->fip_packet_type.dev = netdev;
 341        dev_add_pack(&fcoe->fip_packet_type);
 342
 343        return 0;
 344}
 345
 346/**
 347 * fcoe_interface_create() - Create a FCoE interface on a net device
 348 * @netdev: The net device to create the FCoE interface on
 349 * @fip_mode: The mode to use for FIP
 350 *
 351 * Returns: pointer to a struct fcoe_interface or NULL on error
 352 */
 353static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev,
 354                                                    enum fip_state fip_mode)
 355{
 356        struct fcoe_interface *fcoe;
 357        int err;
 358
 359        fcoe = kzalloc(sizeof(*fcoe), GFP_KERNEL);
 360        if (!fcoe) {
 361                FCOE_NETDEV_DBG(netdev, "Could not allocate fcoe structure\n");
 362                return NULL;
 363        }
 364
 365        dev_hold(netdev);
 366        kref_init(&fcoe->kref);
 367
 368        /*
 369         * Initialize FIP.
 370         */
 371        fcoe_ctlr_init(&fcoe->ctlr, fip_mode);
 372        fcoe->ctlr.send = fcoe_fip_send;
 373        fcoe->ctlr.update_mac = fcoe_update_src_mac;
 374        fcoe->ctlr.get_src_addr = fcoe_get_src_mac;
 375
 376        err = fcoe_interface_setup(fcoe, netdev);
 377        if (err) {
 378                fcoe_ctlr_destroy(&fcoe->ctlr);
 379                kfree(fcoe);
 380                dev_put(netdev);
 381                return NULL;
 382        }
 383
 384        return fcoe;
 385}
 386
 387/**
 388 * fcoe_interface_cleanup() - Clean up a FCoE interface
 389 * @fcoe: The FCoE interface to be cleaned up
 390 *
 391 * Caller must be holding the RTNL mutex
 392 */
 393void fcoe_interface_cleanup(struct fcoe_interface *fcoe)
 394{
 395        struct net_device *netdev = fcoe->netdev;
 396        struct fcoe_ctlr *fip = &fcoe->ctlr;
 397        u8 flogi_maddr[ETH_ALEN];
 398        const struct net_device_ops *ops;
 399
 400        /*
 401         * Don't listen for Ethernet packets anymore.
 402         * synchronize_net() ensures that the packet handlers are not running
 403         * on another CPU. dev_remove_pack() would do that, this calls the
 404         * unsyncronized version __dev_remove_pack() to avoid multiple delays.
 405         */
 406        __dev_remove_pack(&fcoe->fcoe_packet_type);
 407        __dev_remove_pack(&fcoe->fip_packet_type);
 408        synchronize_net();
 409
 410        /* Delete secondary MAC addresses */
 411        memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
 412        dev_uc_del(netdev, flogi_maddr);
 413        if (fip->spma)
 414                dev_uc_del(netdev, fip->ctl_src_addr);
 415        if (fip->mode == FIP_MODE_VN2VN) {
 416                dev_mc_del(netdev, FIP_ALL_VN2VN_MACS);
 417                dev_mc_del(netdev, FIP_ALL_P2P_MACS);
 418        } else
 419                dev_mc_del(netdev, FIP_ALL_ENODE_MACS);
 420
 421        /* Tell the LLD we are done w/ FCoE */
 422        ops = netdev->netdev_ops;
 423        if (ops->ndo_fcoe_disable) {
 424                if (ops->ndo_fcoe_disable(netdev))
 425                        FCOE_NETDEV_DBG(netdev, "Failed to disable FCoE"
 426                                        " specific feature for LLD.\n");
 427        }
 428}
 429
 430/**
 431 * fcoe_interface_release() - fcoe_port kref release function
 432 * @kref: Embedded reference count in an fcoe_interface struct
 433 */
 434static void fcoe_interface_release(struct kref *kref)
 435{
 436        struct fcoe_interface *fcoe;
 437        struct net_device *netdev;
 438
 439        fcoe = container_of(kref, struct fcoe_interface, kref);
 440        netdev = fcoe->netdev;
 441        /* tear-down the FCoE controller */
 442        fcoe_ctlr_destroy(&fcoe->ctlr);
 443        kfree(fcoe);
 444        dev_put(netdev);
 445}
 446
 447/**
 448 * fcoe_interface_get() - Get a reference to a FCoE interface
 449 * @fcoe: The FCoE interface to be held
 450 */
 451static inline void fcoe_interface_get(struct fcoe_interface *fcoe)
 452{
 453        kref_get(&fcoe->kref);
 454}
 455
 456/**
 457 * fcoe_interface_put() - Put a reference to a FCoE interface
 458 * @fcoe: The FCoE interface to be released
 459 */
 460static inline void fcoe_interface_put(struct fcoe_interface *fcoe)
 461{
 462        kref_put(&fcoe->kref, fcoe_interface_release);
 463}
 464
 465/**
 466 * fcoe_fip_recv() - Handler for received FIP frames
 467 * @skb:      The receive skb
 468 * @netdev:   The associated net device
 469 * @ptype:    The packet_type structure which was used to register this handler
 470 * @orig_dev: The original net_device the the skb was received on.
 471 *            (in case dev is a bond)
 472 *
 473 * Returns: 0 for success
 474 */
 475static int fcoe_fip_recv(struct sk_buff *skb, struct net_device *netdev,
 476                         struct packet_type *ptype,
 477                         struct net_device *orig_dev)
 478{
 479        struct fcoe_interface *fcoe;
 480
 481        fcoe = container_of(ptype, struct fcoe_interface, fip_packet_type);
 482        fcoe_ctlr_recv(&fcoe->ctlr, skb);
 483        return 0;
 484}
 485
 486/**
 487 * fcoe_fip_send() - Send an Ethernet-encapsulated FIP frame
 488 * @fip: The FCoE controller
 489 * @skb: The FIP packet to be sent
 490 */
 491static void fcoe_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
 492{
 493        skb->dev = fcoe_from_ctlr(fip)->netdev;
 494        dev_queue_xmit(skb);
 495}
 496
 497/**
 498 * fcoe_update_src_mac() - Update the Ethernet MAC filters
 499 * @lport: The local port to update the source MAC on
 500 * @addr:  Unicast MAC address to add
 501 *
 502 * Remove any previously-set unicast MAC filter.
 503 * Add secondary FCoE MAC address filter for our OUI.
 504 */
 505static void fcoe_update_src_mac(struct fc_lport *lport, u8 *addr)
 506{
 507        struct fcoe_port *port = lport_priv(lport);
 508        struct fcoe_interface *fcoe = port->fcoe;
 509
 510        rtnl_lock();
 511        if (!is_zero_ether_addr(port->data_src_addr))
 512                dev_uc_del(fcoe->netdev, port->data_src_addr);
 513        if (!is_zero_ether_addr(addr))
 514                dev_uc_add(fcoe->netdev, addr);
 515        memcpy(port->data_src_addr, addr, ETH_ALEN);
 516        rtnl_unlock();
 517}
 518
 519/**
 520 * fcoe_get_src_mac() - return the Ethernet source address for an lport
 521 * @lport: libfc lport
 522 */
 523static u8 *fcoe_get_src_mac(struct fc_lport *lport)
 524{
 525        struct fcoe_port *port = lport_priv(lport);
 526
 527        return port->data_src_addr;
 528}
 529
 530/**
 531 * fcoe_lport_config() - Set up a local port
 532 * @lport: The local port to be setup
 533 *
 534 * Returns: 0 for success
 535 */
 536static int fcoe_lport_config(struct fc_lport *lport)
 537{
 538        lport->link_up = 0;
 539        lport->qfull = 0;
 540        lport->max_retry_count = 3;
 541        lport->max_rport_retry_count = 3;
 542        lport->e_d_tov = 2 * 1000;      /* FC-FS default */
 543        lport->r_a_tov = 2 * 2 * 1000;
 544        lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS |
 545                                 FCP_SPPF_RETRY | FCP_SPPF_CONF_COMPL);
 546        lport->does_npiv = 1;
 547
 548        fc_lport_init_stats(lport);
 549
 550        /* lport fc_lport related configuration */
 551        fc_lport_config(lport);
 552
 553        /* offload related configuration */
 554        lport->crc_offload = 0;
 555        lport->seq_offload = 0;
 556        lport->lro_enabled = 0;
 557        lport->lro_xid = 0;
 558        lport->lso_max = 0;
 559
 560        return 0;
 561}
 562
 563/**
 564 * fcoe_queue_timer() - The fcoe queue timer
 565 * @lport: The local port
 566 *
 567 * Calls fcoe_check_wait_queue on timeout
 568 */
 569static void fcoe_queue_timer(ulong lport)
 570{
 571        fcoe_check_wait_queue((struct fc_lport *)lport, NULL);
 572}
 573
 574/**
 575 * fcoe_get_wwn() - Get the world wide name from LLD if it supports it
 576 * @netdev: the associated net device
 577 * @wwn: the output WWN
 578 * @type: the type of WWN (WWPN or WWNN)
 579 *
 580 * Returns: 0 for success
 581 */
 582static int fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
 583{
 584        const struct net_device_ops *ops = netdev->netdev_ops;
 585
 586        if (ops->ndo_fcoe_get_wwn)
 587                return ops->ndo_fcoe_get_wwn(netdev, wwn, type);
 588        return -EINVAL;
 589}
 590
 591/**
 592 * fcoe_netdev_features_change - Updates the lport's offload flags based
 593 * on the LLD netdev's FCoE feature flags
 594 */
 595static void fcoe_netdev_features_change(struct fc_lport *lport,
 596                                        struct net_device *netdev)
 597{
 598        mutex_lock(&lport->lp_mutex);
 599
 600        if (netdev->features & NETIF_F_SG)
 601                lport->sg_supp = 1;
 602        else
 603                lport->sg_supp = 0;
 604
 605        if (netdev->features & NETIF_F_FCOE_CRC) {
 606                lport->crc_offload = 1;
 607                FCOE_NETDEV_DBG(netdev, "Supports FCCRC offload\n");
 608        } else {
 609                lport->crc_offload = 0;
 610        }
 611
 612        if (netdev->features & NETIF_F_FSO) {
 613                lport->seq_offload = 1;
 614                lport->lso_max = netdev->gso_max_size;
 615                FCOE_NETDEV_DBG(netdev, "Supports LSO for max len 0x%x\n",
 616                                lport->lso_max);
 617        } else {
 618                lport->seq_offload = 0;
 619                lport->lso_max = 0;
 620        }
 621
 622        if (netdev->fcoe_ddp_xid) {
 623                lport->lro_enabled = 1;
 624                lport->lro_xid = netdev->fcoe_ddp_xid;
 625                FCOE_NETDEV_DBG(netdev, "Supports LRO for max xid 0x%x\n",
 626                                lport->lro_xid);
 627        } else {
 628                lport->lro_enabled = 0;
 629                lport->lro_xid = 0;
 630        }
 631
 632        mutex_unlock(&lport->lp_mutex);
 633}
 634
 635/**
 636 * fcoe_netdev_config() - Set up net devive for SW FCoE
 637 * @lport:  The local port that is associated with the net device
 638 * @netdev: The associated net device
 639 *
 640 * Must be called after fcoe_lport_config() as it will use local port mutex
 641 *
 642 * Returns: 0 for success
 643 */
 644static int fcoe_netdev_config(struct fc_lport *lport, struct net_device *netdev)
 645{
 646        u32 mfs;
 647        u64 wwnn, wwpn;
 648        struct fcoe_interface *fcoe;
 649        struct fcoe_port *port;
 650
 651        /* Setup lport private data to point to fcoe softc */
 652        port = lport_priv(lport);
 653        fcoe = port->fcoe;
 654
 655        /*
 656         * Determine max frame size based on underlying device and optional
 657         * user-configured limit.  If the MFS is too low, fcoe_link_ok()
 658         * will return 0, so do this first.
 659         */
 660        mfs = netdev->mtu;
 661        if (netdev->features & NETIF_F_FCOE_MTU) {
 662                mfs = FCOE_MTU;
 663                FCOE_NETDEV_DBG(netdev, "Supports FCOE_MTU of %d bytes\n", mfs);
 664        }
 665        mfs -= (sizeof(struct fcoe_hdr) + sizeof(struct fcoe_crc_eof));
 666        if (fc_set_mfs(lport, mfs))
 667                return -EINVAL;
 668
 669        /* offload features support */
 670        fcoe_netdev_features_change(lport, netdev);
 671
 672        skb_queue_head_init(&port->fcoe_pending_queue);
 673        port->fcoe_pending_queue_active = 0;
 674        setup_timer(&port->timer, fcoe_queue_timer, (unsigned long)lport);
 675
 676        fcoe_link_speed_update(lport);
 677
 678        if (!lport->vport) {
 679                if (fcoe_get_wwn(netdev, &wwnn, NETDEV_FCOE_WWNN))
 680                        wwnn = fcoe_wwn_from_mac(fcoe->ctlr.ctl_src_addr, 1, 0);
 681                fc_set_wwnn(lport, wwnn);
 682                if (fcoe_get_wwn(netdev, &wwpn, NETDEV_FCOE_WWPN))
 683                        wwpn = fcoe_wwn_from_mac(fcoe->ctlr.ctl_src_addr,
 684                                                 2, 0);
 685                fc_set_wwpn(lport, wwpn);
 686        }
 687
 688        return 0;
 689}
 690
 691/**
 692 * fcoe_shost_config() - Set up the SCSI host associated with a local port
 693 * @lport: The local port
 694 * @dev:   The device associated with the SCSI host
 695 *
 696 * Must be called after fcoe_lport_config() and fcoe_netdev_config()
 697 *
 698 * Returns: 0 for success
 699 */
 700static int fcoe_shost_config(struct fc_lport *lport, struct device *dev)
 701{
 702        int rc = 0;
 703
 704        /* lport scsi host config */
 705        lport->host->max_lun = FCOE_MAX_LUN;
 706        lport->host->max_id = FCOE_MAX_FCP_TARGET;
 707        lport->host->max_channel = 0;
 708        lport->host->max_cmd_len = FCOE_MAX_CMD_LEN;
 709
 710        if (lport->vport)
 711                lport->host->transportt = fcoe_vport_transport_template;
 712        else
 713                lport->host->transportt = fcoe_transport_template;
 714
 715        /* add the new host to the SCSI-ml */
 716        rc = scsi_add_host(lport->host, dev);
 717        if (rc) {
 718                FCOE_NETDEV_DBG(fcoe_netdev(lport), "fcoe_shost_config: "
 719                                "error on scsi_add_host\n");
 720                return rc;
 721        }
 722
 723        if (!lport->vport)
 724                fc_host_max_npiv_vports(lport->host) = USHRT_MAX;
 725
 726        snprintf(fc_host_symbolic_name(lport->host), FC_SYMBOLIC_NAME_SIZE,
 727                 "%s v%s over %s", FCOE_NAME, FCOE_VERSION,
 728                 fcoe_netdev(lport)->name);
 729
 730        return 0;
 731}
 732
 733/**
 734 * fcoe_oem_match() - The match routine for the offloaded exchange manager
 735 * @fp: The I/O frame
 736 *
 737 * This routine will be associated with an exchange manager (EM). When
 738 * the libfc exchange handling code is looking for an EM to use it will
 739 * call this routine and pass it the frame that it wishes to send. This
 740 * routine will return True if the associated EM is to be used and False
 741 * if the echange code should continue looking for an EM.
 742 *
 743 * The offload EM that this routine is associated with will handle any
 744 * packets that are for SCSI read requests.
 745 *
 746 * Returns: True for read types I/O, otherwise returns false.
 747 */
 748bool fcoe_oem_match(struct fc_frame *fp)
 749{
 750        return fc_fcp_is_read(fr_fsp(fp)) &&
 751                (fr_fsp(fp)->data_len > fcoe_ddp_min);
 752}
 753
 754/**
 755 * fcoe_em_config() - Allocate and configure an exchange manager
 756 * @lport: The local port that the new EM will be associated with
 757 *
 758 * Returns: 0 on success
 759 */
 760static inline int fcoe_em_config(struct fc_lport *lport)
 761{
 762        struct fcoe_port *port = lport_priv(lport);
 763        struct fcoe_interface *fcoe = port->fcoe;
 764        struct fcoe_interface *oldfcoe = NULL;
 765        struct net_device *old_real_dev, *cur_real_dev;
 766        u16 min_xid = FCOE_MIN_XID;
 767        u16 max_xid = FCOE_MAX_XID;
 768
 769        /*
 770         * Check if need to allocate an em instance for
 771         * offload exchange ids to be shared across all VN_PORTs/lport.
 772         */
 773        if (!lport->lro_enabled || !lport->lro_xid ||
 774            (lport->lro_xid >= max_xid)) {
 775                lport->lro_xid = 0;
 776                goto skip_oem;
 777        }
 778
 779        /*
 780         * Reuse existing offload em instance in case
 781         * it is already allocated on real eth device
 782         */
 783        if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN)
 784                cur_real_dev = vlan_dev_real_dev(fcoe->netdev);
 785        else
 786                cur_real_dev = fcoe->netdev;
 787
 788        list_for_each_entry(oldfcoe, &fcoe_hostlist, list) {
 789                if (oldfcoe->netdev->priv_flags & IFF_802_1Q_VLAN)
 790                        old_real_dev = vlan_dev_real_dev(oldfcoe->netdev);
 791                else
 792                        old_real_dev = oldfcoe->netdev;
 793
 794                if (cur_real_dev == old_real_dev) {
 795                        fcoe->oem = oldfcoe->oem;
 796                        break;
 797                }
 798        }
 799
 800        if (fcoe->oem) {
 801                if (!fc_exch_mgr_add(lport, fcoe->oem, fcoe_oem_match)) {
 802                        printk(KERN_ERR "fcoe_em_config: failed to add "
 803                               "offload em:%p on interface:%s\n",
 804                               fcoe->oem, fcoe->netdev->name);
 805                        return -ENOMEM;
 806                }
 807        } else {
 808                fcoe->oem = fc_exch_mgr_alloc(lport, FC_CLASS_3,
 809                                              FCOE_MIN_XID, lport->lro_xid,
 810                                              fcoe_oem_match);
 811                if (!fcoe->oem) {
 812                        printk(KERN_ERR "fcoe_em_config: failed to allocate "
 813                               "em for offload exches on interface:%s\n",
 814                               fcoe->netdev->name);
 815                        return -ENOMEM;
 816                }
 817        }
 818
 819        /*
 820         * Exclude offload EM xid range from next EM xid range.
 821         */
 822        min_xid += lport->lro_xid + 1;
 823
 824skip_oem:
 825        if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, min_xid, max_xid, NULL)) {
 826                printk(KERN_ERR "fcoe_em_config: failed to "
 827                       "allocate em on interface %s\n", fcoe->netdev->name);
 828                return -ENOMEM;
 829        }
 830
 831        return 0;
 832}
 833
 834/**
 835 * fcoe_if_destroy() - Tear down a SW FCoE instance
 836 * @lport: The local port to be destroyed
 837 *
 838 * Locking: must be called with the RTNL mutex held and RTNL mutex
 839 * needed to be dropped by this function since not dropping RTNL
 840 * would cause circular locking warning on synchronous fip worker
 841 * cancelling thru fcoe_interface_put invoked by this function.
 842 *
 843 */
 844static void fcoe_if_destroy(struct fc_lport *lport)
 845{
 846        struct fcoe_port *port = lport_priv(lport);
 847        struct fcoe_interface *fcoe = port->fcoe;
 848        struct net_device *netdev = fcoe->netdev;
 849
 850        FCOE_NETDEV_DBG(netdev, "Destroying interface\n");
 851
 852        /* Logout of the fabric */
 853        fc_fabric_logoff(lport);
 854
 855        /* Cleanup the fc_lport */
 856        fc_lport_destroy(lport);
 857
 858        /* Stop the transmit retry timer */
 859        del_timer_sync(&port->timer);
 860
 861        /* Free existing transmit skbs */
 862        fcoe_clean_pending_queue(lport);
 863
 864        if (!is_zero_ether_addr(port->data_src_addr))
 865                dev_uc_del(netdev, port->data_src_addr);
 866        rtnl_unlock();
 867
 868        /* receives may not be stopped until after this */
 869        fcoe_interface_put(fcoe);
 870
 871        /* Free queued packets for the per-CPU receive threads */
 872        fcoe_percpu_clean(lport);
 873
 874        /* Detach from the scsi-ml */
 875        fc_remove_host(lport->host);
 876        scsi_remove_host(lport->host);
 877
 878        /* Destroy lport scsi_priv */
 879        fc_fcp_destroy(lport);
 880
 881        /* There are no more rports or I/O, free the EM */
 882        fc_exch_mgr_free(lport);
 883
 884        /* Free memory used by statistical counters */
 885        fc_lport_free_stats(lport);
 886
 887        /* Release the Scsi_Host */
 888        scsi_host_put(lport->host);
 889        module_put(THIS_MODULE);
 890}
 891
 892/**
 893 * fcoe_ddp_setup() - Call a LLD's ddp_setup through the net device
 894 * @lport: The local port to setup DDP for
 895 * @xid:   The exchange ID for this DDP transfer
 896 * @sgl:   The scatterlist describing this transfer
 897 * @sgc:   The number of sg items
 898 *
 899 * Returns: 0 if the DDP context was not configured
 900 */
 901static int fcoe_ddp_setup(struct fc_lport *lport, u16 xid,
 902                          struct scatterlist *sgl, unsigned int sgc)
 903{
 904        struct net_device *netdev = fcoe_netdev(lport);
 905
 906        if (netdev->netdev_ops->ndo_fcoe_ddp_setup)
 907                return netdev->netdev_ops->ndo_fcoe_ddp_setup(netdev,
 908                                                              xid, sgl,
 909                                                              sgc);
 910
 911        return 0;
 912}
 913
 914/**
 915 * fcoe_ddp_done() - Call a LLD's ddp_done through the net device
 916 * @lport: The local port to complete DDP on
 917 * @xid:   The exchange ID for this DDP transfer
 918 *
 919 * Returns: the length of data that have been completed by DDP
 920 */
 921static int fcoe_ddp_done(struct fc_lport *lport, u16 xid)
 922{
 923        struct net_device *netdev = fcoe_netdev(lport);
 924
 925        if (netdev->netdev_ops->ndo_fcoe_ddp_done)
 926                return netdev->netdev_ops->ndo_fcoe_ddp_done(netdev, xid);
 927        return 0;
 928}
 929
 930/**
 931 * fcoe_if_create() - Create a FCoE instance on an interface
 932 * @fcoe:   The FCoE interface to create a local port on
 933 * @parent: The device pointer to be the parent in sysfs for the SCSI host
 934 * @npiv:   Indicates if the port is a vport or not
 935 *
 936 * Creates a fc_lport instance and a Scsi_Host instance and configure them.
 937 *
 938 * Returns: The allocated fc_lport or an error pointer
 939 */
 940static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
 941                                       struct device *parent, int npiv)
 942{
 943        struct net_device *netdev = fcoe->netdev;
 944        struct fc_lport *lport = NULL;
 945        struct fcoe_port *port;
 946        int rc;
 947        /*
 948         * parent is only a vport if npiv is 1,
 949         * but we'll only use vport in that case so go ahead and set it
 950         */
 951        struct fc_vport *vport = dev_to_vport(parent);
 952
 953        FCOE_NETDEV_DBG(netdev, "Create Interface\n");
 954
 955        if (!npiv) {
 956                lport = libfc_host_alloc(&fcoe_shost_template,
 957                                         sizeof(struct fcoe_port));
 958        } else  {
 959                lport = libfc_vport_create(vport,
 960                                           sizeof(struct fcoe_port));
 961        }
 962        if (!lport) {
 963                FCOE_NETDEV_DBG(netdev, "Could not allocate host structure\n");
 964                rc = -ENOMEM;
 965                goto out;
 966        }
 967        port = lport_priv(lport);
 968        port->lport = lport;
 969        port->fcoe = fcoe;
 970        INIT_WORK(&port->destroy_work, fcoe_destroy_work);
 971
 972        /* configure a fc_lport including the exchange manager */
 973        rc = fcoe_lport_config(lport);
 974        if (rc) {
 975                FCOE_NETDEV_DBG(netdev, "Could not configure lport for the "
 976                                "interface\n");
 977                goto out_host_put;
 978        }
 979
 980        if (npiv) {
 981                FCOE_NETDEV_DBG(netdev, "Setting vport names, "
 982                                "%16.16llx %16.16llx\n",
 983                                vport->node_name, vport->port_name);
 984                fc_set_wwnn(lport, vport->node_name);
 985                fc_set_wwpn(lport, vport->port_name);
 986        }
 987
 988        /* configure lport network properties */
 989        rc = fcoe_netdev_config(lport, netdev);
 990        if (rc) {
 991                FCOE_NETDEV_DBG(netdev, "Could not configure netdev for the "
 992                                "interface\n");
 993                goto out_lp_destroy;
 994        }
 995
 996        /* configure lport scsi host properties */
 997        rc = fcoe_shost_config(lport, parent);
 998        if (rc) {
 999                FCOE_NETDEV_DBG(netdev, "Could not configure shost for the "
1000                                "interface\n");
1001                goto out_lp_destroy;
1002        }
1003
1004        /* Initialize the library */
1005        rc = fcoe_libfc_config(lport, &fcoe->ctlr, &fcoe_libfc_fcn_templ, 1);
1006        if (rc) {
1007                FCOE_NETDEV_DBG(netdev, "Could not configure libfc for the "
1008                                "interface\n");
1009                goto out_lp_destroy;
1010        }
1011
1012        if (!npiv) {
1013                /*
1014                 * fcoe_em_alloc() and fcoe_hostlist_add() both
1015                 * need to be atomic with respect to other changes to the
1016                 * hostlist since fcoe_em_alloc() looks for an existing EM
1017                 * instance on host list updated by fcoe_hostlist_add().
1018                 *
1019                 * This is currently handled through the fcoe_config_mutex
1020                 * begin held.
1021                 */
1022
1023                /* lport exch manager allocation */
1024                rc = fcoe_em_config(lport);
1025                if (rc) {
1026                        FCOE_NETDEV_DBG(netdev, "Could not configure the EM "
1027                                        "for the interface\n");
1028                        goto out_lp_destroy;
1029                }
1030        }
1031
1032        fcoe_interface_get(fcoe);
1033        return lport;
1034
1035out_lp_destroy:
1036        fc_exch_mgr_free(lport);
1037out_host_put:
1038        scsi_host_put(lport->host);
1039out:
1040        return ERR_PTR(rc);
1041}
1042
1043/**
1044 * fcoe_if_init() - Initialization routine for fcoe.ko
1045 *
1046 * Attaches the SW FCoE transport to the FC transport
1047 *
1048 * Returns: 0 on success
1049 */
1050static int __init fcoe_if_init(void)
1051{
1052        /* attach to scsi transport */
1053        fcoe_transport_template = fc_attach_transport(&fcoe_transport_function);
1054        fcoe_vport_transport_template =
1055                fc_attach_transport(&fcoe_vport_transport_function);
1056
1057        if (!fcoe_transport_template) {
1058                printk(KERN_ERR "fcoe: Failed to attach to the FC transport\n");
1059                return -ENODEV;
1060        }
1061
1062        return 0;
1063}
1064
1065/**
1066 * fcoe_if_exit() - Tear down fcoe.ko
1067 *
1068 * Detaches the SW FCoE transport from the FC transport
1069 *
1070 * Returns: 0 on success
1071 */
1072int __exit fcoe_if_exit(void)
1073{
1074        fc_release_transport(fcoe_transport_template);
1075        fc_release_transport(fcoe_vport_transport_template);
1076        fcoe_transport_template = NULL;
1077        fcoe_vport_transport_template = NULL;
1078        return 0;
1079}
1080
1081/**
1082 * fcoe_percpu_thread_create() - Create a receive thread for an online CPU
1083 * @cpu: The CPU index of the CPU to create a receive thread for
1084 */
1085static void fcoe_percpu_thread_create(unsigned int cpu)
1086{
1087        struct fcoe_percpu_s *p;
1088        struct task_struct *thread;
1089
1090        p = &per_cpu(fcoe_percpu, cpu);
1091
1092        thread = kthread_create(fcoe_percpu_receive_thread,
1093                                (void *)p, "fcoethread/%d", cpu);
1094
1095        if (likely(!IS_ERR(thread))) {
1096                kthread_bind(thread, cpu);
1097                wake_up_process(thread);
1098
1099                spin_lock_bh(&p->fcoe_rx_list.lock);
1100                p->thread = thread;
1101                spin_unlock_bh(&p->fcoe_rx_list.lock);
1102        }
1103}
1104
1105/**
1106 * fcoe_percpu_thread_destroy() - Remove the receive thread of a CPU
1107 * @cpu: The CPU index of the CPU whose receive thread is to be destroyed
1108 *
1109 * Destroys a per-CPU Rx thread. Any pending skbs are moved to the
1110 * current CPU's Rx thread. If the thread being destroyed is bound to
1111 * the CPU processing this context the skbs will be freed.
1112 */
1113static void fcoe_percpu_thread_destroy(unsigned int cpu)
1114{
1115        struct fcoe_percpu_s *p;
1116        struct task_struct *thread;
1117        struct page *crc_eof;
1118        struct sk_buff *skb;
1119#ifdef CONFIG_SMP
1120        struct fcoe_percpu_s *p0;
1121        unsigned targ_cpu = get_cpu();
1122#endif /* CONFIG_SMP */
1123
1124        FCOE_DBG("Destroying receive thread for CPU %d\n", cpu);
1125
1126        /* Prevent any new skbs from being queued for this CPU. */
1127        p = &per_cpu(fcoe_percpu, cpu);
1128        spin_lock_bh(&p->fcoe_rx_list.lock);
1129        thread = p->thread;
1130        p->thread = NULL;
1131        crc_eof = p->crc_eof_page;
1132        p->crc_eof_page = NULL;
1133        p->crc_eof_offset = 0;
1134        spin_unlock_bh(&p->fcoe_rx_list.lock);
1135
1136#ifdef CONFIG_SMP
1137        /*
1138         * Don't bother moving the skb's if this context is running
1139         * on the same CPU that is having its thread destroyed. This
1140         * can easily happen when the module is removed.
1141         */
1142        if (cpu != targ_cpu) {
1143                p0 = &per_cpu(fcoe_percpu, targ_cpu);
1144                spin_lock_bh(&p0->fcoe_rx_list.lock);
1145                if (p0->thread) {
1146                        FCOE_DBG("Moving frames from CPU %d to CPU %d\n",
1147                                 cpu, targ_cpu);
1148
1149                        while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
1150                                __skb_queue_tail(&p0->fcoe_rx_list, skb);
1151                        spin_unlock_bh(&p0->fcoe_rx_list.lock);
1152                } else {
1153                        /*
1154                         * The targeted CPU is not initialized and cannot accept
1155                         * new  skbs. Unlock the targeted CPU and drop the skbs
1156                         * on the CPU that is going offline.
1157                         */
1158                        while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
1159                                kfree_skb(skb);
1160                        spin_unlock_bh(&p0->fcoe_rx_list.lock);
1161                }
1162        } else {
1163                /*
1164                 * This scenario occurs when the module is being removed
1165                 * and all threads are being destroyed. skbs will continue
1166                 * to be shifted from the CPU thread that is being removed
1167                 * to the CPU thread associated with the CPU that is processing
1168                 * the module removal. Once there is only one CPU Rx thread it
1169                 * will reach this case and we will drop all skbs and later
1170                 * stop the thread.
1171                 */
1172                spin_lock_bh(&p->fcoe_rx_list.lock);
1173                while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
1174                        kfree_skb(skb);
1175                spin_unlock_bh(&p->fcoe_rx_list.lock);
1176        }
1177        put_cpu();
1178#else
1179        /*
1180         * This a non-SMP scenario where the singular Rx thread is
1181         * being removed. Free all skbs and stop the thread.
1182         */
1183        spin_lock_bh(&p->fcoe_rx_list.lock);
1184        while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
1185                kfree_skb(skb);
1186        spin_unlock_bh(&p->fcoe_rx_list.lock);
1187#endif
1188
1189        if (thread)
1190                kthread_stop(thread);
1191
1192        if (crc_eof)
1193                put_page(crc_eof);
1194}
1195
1196/**
1197 * fcoe_cpu_callback() - Handler for CPU hotplug events
1198 * @nfb:    The callback data block
1199 * @action: The event triggering the callback
1200 * @hcpu:   The index of the CPU that the event is for
1201 *
1202 * This creates or destroys per-CPU data for fcoe
1203 *
1204 * Returns NOTIFY_OK always.
1205 */
1206static int fcoe_cpu_callback(struct notifier_block *nfb,
1207                             unsigned long action, void *hcpu)
1208{
1209        unsigned cpu = (unsigned long)hcpu;
1210
1211        switch (action) {
1212        case CPU_ONLINE:
1213        case CPU_ONLINE_FROZEN:
1214                FCOE_DBG("CPU %x online: Create Rx thread\n", cpu);
1215                fcoe_percpu_thread_create(cpu);
1216                break;
1217        case CPU_DEAD:
1218        case CPU_DEAD_FROZEN:
1219                FCOE_DBG("CPU %x offline: Remove Rx thread\n", cpu);
1220                fcoe_percpu_thread_destroy(cpu);
1221                break;
1222        default:
1223                break;
1224        }
1225        return NOTIFY_OK;
1226}
1227
1228/**
1229 * fcoe_rcv() - Receive packets from a net device
1230 * @skb:    The received packet
1231 * @netdev: The net device that the packet was received on
1232 * @ptype:  The packet type context
1233 * @olddev: The last device net device
1234 *
1235 * This routine is called by NET_RX_SOFTIRQ. It receives a packet, builds a
1236 * FC frame and passes the frame to libfc.
1237 *
1238 * Returns: 0 for success
1239 */
1240int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
1241             struct packet_type *ptype, struct net_device *olddev)
1242{
1243        struct fc_lport *lport;
1244        struct fcoe_rcv_info *fr;
1245        struct fcoe_interface *fcoe;
1246        struct fc_frame_header *fh;
1247        struct fcoe_percpu_s *fps;
1248        struct ethhdr *eh;
1249        unsigned int cpu;
1250
1251        fcoe = container_of(ptype, struct fcoe_interface, fcoe_packet_type);
1252        lport = fcoe->ctlr.lp;
1253        if (unlikely(!lport)) {
1254                FCOE_NETDEV_DBG(netdev, "Cannot find hba structure");
1255                goto err2;
1256        }
1257        if (!lport->link_up)
1258                goto err2;
1259
1260        FCOE_NETDEV_DBG(netdev, "skb_info: len:%d data_len:%d head:%p "
1261                        "data:%p tail:%p end:%p sum:%d dev:%s",
1262                        skb->len, skb->data_len, skb->head, skb->data,
1263                        skb_tail_pointer(skb), skb_end_pointer(skb),
1264                        skb->csum, skb->dev ? skb->dev->name : "<NULL>");
1265
1266        eh = eth_hdr(skb);
1267
1268        if (is_fip_mode(&fcoe->ctlr) &&
1269            compare_ether_addr(eh->h_source, fcoe->ctlr.dest_addr)) {
1270                FCOE_NETDEV_DBG(netdev, "wrong source mac address:%pM\n",
1271                                eh->h_source);
1272                goto err;
1273        }
1274
1275        /*
1276         * Check for minimum frame length, and make sure required FCoE
1277         * and FC headers are pulled into the linear data area.
1278         */
1279        if (unlikely((skb->len < FCOE_MIN_FRAME) ||
1280                     !pskb_may_pull(skb, FCOE_HEADER_LEN)))
1281                goto err;
1282
1283        skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
1284        fh = (struct fc_frame_header *) skb_transport_header(skb);
1285
1286        if (ntoh24(&eh->h_dest[3]) != ntoh24(fh->fh_d_id)) {
1287                FCOE_NETDEV_DBG(netdev, "FC frame d_id mismatch with MAC:%pM\n",
1288                                eh->h_dest);
1289                goto err;
1290        }
1291
1292        fr = fcoe_dev_from_skb(skb);
1293        fr->fr_dev = lport;
1294        fr->ptype = ptype;
1295
1296        /*
1297         * In case the incoming frame's exchange is originated from
1298         * the initiator, then received frame's exchange id is ANDed
1299         * with fc_cpu_mask bits to get the same cpu on which exchange
1300         * was originated, otherwise just use the current cpu.
1301         */
1302        if (ntoh24(fh->fh_f_ctl) & FC_FC_EX_CTX)
1303                cpu = ntohs(fh->fh_ox_id) & fc_cpu_mask;
1304        else
1305                cpu = smp_processor_id();
1306
1307        fps = &per_cpu(fcoe_percpu, cpu);
1308        spin_lock_bh(&fps->fcoe_rx_list.lock);
1309        if (unlikely(!fps->thread)) {
1310                /*
1311                 * The targeted CPU is not ready, let's target
1312                 * the first CPU now. For non-SMP systems this
1313                 * will check the same CPU twice.
1314                 */
1315                FCOE_NETDEV_DBG(netdev, "CPU is online, but no receive thread "
1316                                "ready for incoming skb- using first online "
1317                                "CPU.\n");
1318
1319                spin_unlock_bh(&fps->fcoe_rx_list.lock);
1320                cpu = cpumask_first(cpu_online_mask);
1321                fps = &per_cpu(fcoe_percpu, cpu);
1322                spin_lock_bh(&fps->fcoe_rx_list.lock);
1323                if (!fps->thread) {
1324                        spin_unlock_bh(&fps->fcoe_rx_list.lock);
1325                        goto err;
1326                }
1327        }
1328
1329        /*
1330         * We now have a valid CPU that we're targeting for
1331         * this skb. We also have this receive thread locked,
1332         * so we're free to queue skbs into it's queue.
1333         */
1334
1335        /* If this is a SCSI-FCP frame, and this is already executing on the
1336         * correct CPU, and the queue for this CPU is empty, then go ahead
1337         * and process the frame directly in the softirq context.
1338         * This lets us process completions without context switching from the
1339         * NET_RX softirq, to our receive processing thread, and then back to
1340         * BLOCK softirq context.
1341         */
1342        if (fh->fh_type == FC_TYPE_FCP &&
1343            cpu == smp_processor_id() &&
1344            skb_queue_empty(&fps->fcoe_rx_list)) {
1345                spin_unlock_bh(&fps->fcoe_rx_list.lock);
1346                fcoe_recv_frame(skb);
1347        } else {
1348                __skb_queue_tail(&fps->fcoe_rx_list, skb);
1349                if (fps->fcoe_rx_list.qlen == 1)
1350                        wake_up_process(fps->thread);
1351                spin_unlock_bh(&fps->fcoe_rx_list.lock);
1352        }
1353
1354        return 0;
1355err:
1356        per_cpu_ptr(lport->dev_stats, get_cpu())->ErrorFrames++;
1357        put_cpu();
1358err2:
1359        kfree_skb(skb);
1360        return -1;
1361}
1362
1363/**
1364 * fcoe_start_io() - Start FCoE I/O
1365 * @skb: The packet to be transmitted
1366 *
1367 * This routine is called from the net device to start transmitting
1368 * FCoE packets.
1369 *
1370 * Returns: 0 for success
1371 */
1372static inline int fcoe_start_io(struct sk_buff *skb)
1373{
1374        struct sk_buff *nskb;
1375        int rc;
1376
1377        nskb = skb_clone(skb, GFP_ATOMIC);
1378        rc = dev_queue_xmit(nskb);
1379        if (rc != 0)
1380                return rc;
1381        kfree_skb(skb);
1382        return 0;
1383}
1384
1385/**
1386 * fcoe_get_paged_crc_eof() - Allocate a page to be used for the trailer CRC
1387 * @skb:  The packet to be transmitted
1388 * @tlen: The total length of the trailer
1389 *
1390 * This routine allocates a page for frame trailers. The page is re-used if
1391 * there is enough room left on it for the current trailer. If there isn't
1392 * enough buffer left a new page is allocated for the trailer. Reference to
1393 * the page from this function as well as the skbs using the page fragments
1394 * ensure that the page is freed at the appropriate time.
1395 *
1396 * Returns: 0 for success
1397 */
1398static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
1399{
1400        struct fcoe_percpu_s *fps;
1401        struct page *page;
1402
1403        fps = &get_cpu_var(fcoe_percpu);
1404        page = fps->crc_eof_page;
1405        if (!page) {
1406                page = alloc_page(GFP_ATOMIC);
1407                if (!page) {
1408                        put_cpu_var(fcoe_percpu);
1409                        return -ENOMEM;
1410                }
1411                fps->crc_eof_page = page;
1412                fps->crc_eof_offset = 0;
1413        }
1414
1415        get_page(page);
1416        skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page,
1417                           fps->crc_eof_offset, tlen);
1418        skb->len += tlen;
1419        skb->data_len += tlen;
1420        skb->truesize += tlen;
1421        fps->crc_eof_offset += sizeof(struct fcoe_crc_eof);
1422
1423        if (fps->crc_eof_offset >= PAGE_SIZE) {
1424                fps->crc_eof_page = NULL;
1425                fps->crc_eof_offset = 0;
1426                put_page(page);
1427        }
1428        put_cpu_var(fcoe_percpu);
1429        return 0;
1430}
1431
1432/**
1433 * fcoe_fc_crc() - Calculates the CRC for a given frame
1434 * @fp: The frame to be checksumed
1435 *
1436 * This uses crc32() routine to calculate the CRC for a frame
1437 *
1438 * Return: The 32 bit CRC value
1439 */
1440u32 fcoe_fc_crc(struct fc_frame *fp)
1441{
1442        struct sk_buff *skb = fp_skb(fp);
1443        struct skb_frag_struct *frag;
1444        unsigned char *data;
1445        unsigned long off, len, clen;
1446        u32 crc;
1447        unsigned i;
1448
1449        crc = crc32(~0, skb->data, skb_headlen(skb));
1450
1451        for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1452                frag = &skb_shinfo(skb)->frags[i];
1453                off = frag->page_offset;
1454                len = frag->size;
1455                while (len > 0) {
1456                        clen = min(len, PAGE_SIZE - (off & ~PAGE_MASK));
1457                        data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
1458                                           KM_SKB_DATA_SOFTIRQ);
1459                        crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
1460                        kunmap_atomic(data, KM_SKB_DATA_SOFTIRQ);
1461                        off += clen;
1462                        len -= clen;
1463                }
1464        }
1465        return crc;
1466}
1467
1468/**
1469 * fcoe_xmit() - Transmit a FCoE frame
1470 * @lport: The local port that the frame is to be transmitted for
1471 * @fp:    The frame to be transmitted
1472 *
1473 * Return: 0 for success
1474 */
1475int fcoe_xmit(struct fc_lport *lport, struct fc_frame *fp)
1476{
1477        int wlen;
1478        u32 crc;
1479        struct ethhdr *eh;
1480        struct fcoe_crc_eof *cp;
1481        struct sk_buff *skb;
1482        struct fcoe_dev_stats *stats;
1483        struct fc_frame_header *fh;
1484        unsigned int hlen;              /* header length implies the version */
1485        unsigned int tlen;              /* trailer length */
1486        unsigned int elen;              /* eth header, may include vlan */
1487        struct fcoe_port *port = lport_priv(lport);
1488        struct fcoe_interface *fcoe = port->fcoe;
1489        u8 sof, eof;
1490        struct fcoe_hdr *hp;
1491
1492        WARN_ON((fr_len(fp) % sizeof(u32)) != 0);
1493
1494        fh = fc_frame_header_get(fp);
1495        skb = fp_skb(fp);
1496        wlen = skb->len / FCOE_WORD_TO_BYTE;
1497
1498        if (!lport->link_up) {
1499                kfree_skb(skb);
1500                return 0;
1501        }
1502
1503        if (unlikely(fh->fh_type == FC_TYPE_ELS) &&
1504            fcoe_ctlr_els_send(&fcoe->ctlr, lport, skb))
1505                return 0;
1506
1507        sof = fr_sof(fp);
1508        eof = fr_eof(fp);
1509
1510        elen = sizeof(struct ethhdr);
1511        hlen = sizeof(struct fcoe_hdr);
1512        tlen = sizeof(struct fcoe_crc_eof);
1513        wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE;
1514
1515        /* crc offload */
1516        if (likely(lport->crc_offload)) {
1517                skb->ip_summed = CHECKSUM_PARTIAL;
1518                skb->csum_start = skb_headroom(skb);
1519                skb->csum_offset = skb->len;
1520                crc = 0;
1521        } else {
1522                skb->ip_summed = CHECKSUM_NONE;
1523                crc = fcoe_fc_crc(fp);
1524        }
1525
1526        /* copy port crc and eof to the skb buff */
1527        if (skb_is_nonlinear(skb)) {
1528                skb_frag_t *frag;
1529                if (fcoe_get_paged_crc_eof(skb, tlen)) {
1530                        kfree_skb(skb);
1531                        return -ENOMEM;
1532                }
1533                frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
1534                cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
1535                        + frag->page_offset;
1536        } else {
1537                cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
1538        }
1539
1540        memset(cp, 0, sizeof(*cp));
1541        cp->fcoe_eof = eof;
1542        cp->fcoe_crc32 = cpu_to_le32(~crc);
1543
1544        if (skb_is_nonlinear(skb)) {
1545                kunmap_atomic(cp, KM_SKB_DATA_SOFTIRQ);
1546                cp = NULL;
1547        }
1548
1549        /* adjust skb network/transport offsets to match mac/fcoe/port */
1550        skb_push(skb, elen + hlen);
1551        skb_reset_mac_header(skb);
1552        skb_reset_network_header(skb);
1553        skb->mac_len = elen;
1554        skb->protocol = htons(ETH_P_FCOE);
1555        skb->dev = fcoe->netdev;
1556
1557        /* fill up mac and fcoe headers */
1558        eh = eth_hdr(skb);
1559        eh->h_proto = htons(ETH_P_FCOE);
1560        memcpy(eh->h_dest, fcoe->ctlr.dest_addr, ETH_ALEN);
1561        if (fcoe->ctlr.map_dest)
1562                memcpy(eh->h_dest + 3, fh->fh_d_id, 3);
1563
1564        if (unlikely(fcoe->ctlr.flogi_oxid != FC_XID_UNKNOWN))
1565                memcpy(eh->h_source, fcoe->ctlr.ctl_src_addr, ETH_ALEN);
1566        else
1567                memcpy(eh->h_source, port->data_src_addr, ETH_ALEN);
1568
1569        hp = (struct fcoe_hdr *)(eh + 1);
1570        memset(hp, 0, sizeof(*hp));
1571        if (FC_FCOE_VER)
1572                FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
1573        hp->fcoe_sof = sof;
1574
1575        /* fcoe lso, mss is in max_payload which is non-zero for FCP data */
1576        if (lport->seq_offload && fr_max_payload(fp)) {
1577                skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
1578                skb_shinfo(skb)->gso_size = fr_max_payload(fp);
1579        } else {
1580                skb_shinfo(skb)->gso_type = 0;
1581                skb_shinfo(skb)->gso_size = 0;
1582        }
1583        /* update tx stats: regardless if LLD fails */
1584        stats = per_cpu_ptr(lport->dev_stats, get_cpu());
1585        stats->TxFrames++;
1586        stats->TxWords += wlen;
1587        put_cpu();
1588
1589        /* send down to lld */
1590        fr_dev(fp) = lport;
1591        if (port->fcoe_pending_queue.qlen)
1592                fcoe_check_wait_queue(lport, skb);
1593        else if (fcoe_start_io(skb))
1594                fcoe_check_wait_queue(lport, skb);
1595
1596        return 0;
1597}
1598
1599/**
1600 * fcoe_percpu_flush_done() - Indicate per-CPU queue flush completion
1601 * @skb: The completed skb (argument required by destructor)
1602 */
1603static void fcoe_percpu_flush_done(struct sk_buff *skb)
1604{
1605        complete(&fcoe_flush_completion);
1606}
1607
1608/**
1609 * fcoe_recv_frame() - process a single received frame
1610 * @skb: frame to process
1611 */
1612static void fcoe_recv_frame(struct sk_buff *skb)
1613{
1614        u32 fr_len;
1615        struct fc_lport *lport;
1616        struct fcoe_rcv_info *fr;
1617        struct fcoe_dev_stats *stats;
1618        struct fc_frame_header *fh;
1619        struct fcoe_crc_eof crc_eof;
1620        struct fc_frame *fp;
1621        struct fcoe_port *port;
1622        struct fcoe_hdr *hp;
1623
1624        fr = fcoe_dev_from_skb(skb);
1625        lport = fr->fr_dev;
1626        if (unlikely(!lport)) {
1627                if (skb->destructor != fcoe_percpu_flush_done)
1628                        FCOE_NETDEV_DBG(skb->dev, "NULL lport in skb");
1629                kfree_skb(skb);
1630                return;
1631        }
1632
1633        FCOE_NETDEV_DBG(skb->dev, "skb_info: len:%d data_len:%d "
1634                        "head:%p data:%p tail:%p end:%p sum:%d dev:%s",
1635                        skb->len, skb->data_len,
1636                        skb->head, skb->data, skb_tail_pointer(skb),
1637                        skb_end_pointer(skb), skb->csum,
1638                        skb->dev ? skb->dev->name : "<NULL>");
1639
1640        port = lport_priv(lport);
1641        if (skb_is_nonlinear(skb))
1642                skb_linearize(skb);     /* not ideal */
1643
1644        /*
1645         * Frame length checks and setting up the header pointers
1646         * was done in fcoe_rcv already.
1647         */
1648        hp = (struct fcoe_hdr *) skb_network_header(skb);
1649        fh = (struct fc_frame_header *) skb_transport_header(skb);
1650
1651        stats = per_cpu_ptr(lport->dev_stats, get_cpu());
1652        if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
1653                if (stats->ErrorFrames < 5)
1654                        printk(KERN_WARNING "fcoe: FCoE version "
1655                               "mismatch: The frame has "
1656                               "version %x, but the "
1657                               "initiator supports version "
1658                               "%x\n", FC_FCOE_DECAPS_VER(hp),
1659                               FC_FCOE_VER);
1660                goto drop;
1661        }
1662
1663        skb_pull(skb, sizeof(struct fcoe_hdr));
1664        fr_len = skb->len - sizeof(struct fcoe_crc_eof);
1665
1666        stats->RxFrames++;
1667        stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
1668
1669        fp = (struct fc_frame *)skb;
1670        fc_frame_init(fp);
1671        fr_dev(fp) = lport;
1672        fr_sof(fp) = hp->fcoe_sof;
1673
1674        /* Copy out the CRC and EOF trailer for access */
1675        if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof)))
1676                goto drop;
1677        fr_eof(fp) = crc_eof.fcoe_eof;
1678        fr_crc(fp) = crc_eof.fcoe_crc32;
1679        if (pskb_trim(skb, fr_len))
1680                goto drop;
1681
1682        /*
1683         * We only check CRC if no offload is available and if it is
1684         * it's solicited data, in which case, the FCP layer would
1685         * check it during the copy.
1686         */
1687        if (lport->crc_offload &&
1688            skb->ip_summed == CHECKSUM_UNNECESSARY)
1689                fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
1690        else
1691                fr_flags(fp) |= FCPHF_CRC_UNCHECKED;
1692
1693        fh = fc_frame_header_get(fp);
1694        if ((fh->fh_r_ctl != FC_RCTL_DD_SOL_DATA ||
1695            fh->fh_type != FC_TYPE_FCP) &&
1696            (fr_flags(fp) & FCPHF_CRC_UNCHECKED)) {
1697                if (le32_to_cpu(fr_crc(fp)) !=
1698                    ~crc32(~0, skb->data, fr_len)) {
1699                        if (stats->InvalidCRCCount < 5)
1700                                printk(KERN_WARNING "fcoe: dropping "
1701                                       "frame with CRC error\n");
1702                        stats->InvalidCRCCount++;
1703                        goto drop;
1704                }
1705                fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
1706        }
1707        put_cpu();
1708        fc_exch_recv(lport, fp);
1709        return;
1710
1711drop:
1712        stats->ErrorFrames++;
1713        put_cpu();
1714        kfree_skb(skb);
1715}
1716
1717/**
1718 * fcoe_percpu_receive_thread() - The per-CPU packet receive thread
1719 * @arg: The per-CPU context
1720 *
1721 * Return: 0 for success
1722 */
1723int fcoe_percpu_receive_thread(void *arg)
1724{
1725        struct fcoe_percpu_s *p = arg;
1726        struct sk_buff *skb;
1727
1728        set_user_nice(current, -20);
1729
1730        while (!kthread_should_stop()) {
1731
1732                spin_lock_bh(&p->fcoe_rx_list.lock);
1733                while ((skb = __skb_dequeue(&p->fcoe_rx_list)) == NULL) {
1734                        set_current_state(TASK_INTERRUPTIBLE);
1735                        spin_unlock_bh(&p->fcoe_rx_list.lock);
1736                        schedule();
1737                        set_current_state(TASK_RUNNING);
1738                        if (kthread_should_stop())
1739                                return 0;
1740                        spin_lock_bh(&p->fcoe_rx_list.lock);
1741                }
1742                spin_unlock_bh(&p->fcoe_rx_list.lock);
1743                fcoe_recv_frame(skb);
1744        }
1745        return 0;
1746}
1747
1748/**
1749 * fcoe_check_wait_queue() - Attempt to clear the transmit backlog
1750 * @lport: The local port whose backlog is to be cleared
1751 *
1752 * This empties the wait_queue, dequeues the head of the wait_queue queue
1753 * and calls fcoe_start_io() for each packet. If all skb have been
1754 * transmitted it returns the qlen. If an error occurs it restores
1755 * wait_queue (to try again later) and returns -1.
1756 *
1757 * The wait_queue is used when the skb transmit fails. The failed skb
1758 * will go in the wait_queue which will be emptied by the timer function or
1759 * by the next skb transmit.
1760 */
1761static void fcoe_check_wait_queue(struct fc_lport *lport, struct sk_buff *skb)
1762{
1763        struct fcoe_port *port = lport_priv(lport);
1764        int rc;
1765
1766        spin_lock_bh(&port->fcoe_pending_queue.lock);
1767
1768        if (skb)
1769                __skb_queue_tail(&port->fcoe_pending_queue, skb);
1770
1771        if (port->fcoe_pending_queue_active)
1772                goto out;
1773        port->fcoe_pending_queue_active = 1;
1774
1775        while (port->fcoe_pending_queue.qlen) {
1776                /* keep qlen > 0 until fcoe_start_io succeeds */
1777                port->fcoe_pending_queue.qlen++;
1778                skb = __skb_dequeue(&port->fcoe_pending_queue);
1779
1780                spin_unlock_bh(&port->fcoe_pending_queue.lock);
1781                rc = fcoe_start_io(skb);
1782                spin_lock_bh(&port->fcoe_pending_queue.lock);
1783
1784                if (rc) {
1785                        __skb_queue_head(&port->fcoe_pending_queue, skb);
1786                        /* undo temporary increment above */
1787                        port->fcoe_pending_queue.qlen--;
1788                        break;
1789                }
1790                /* undo temporary increment above */
1791                port->fcoe_pending_queue.qlen--;
1792        }
1793
1794        if (port->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
1795                lport->qfull = 0;
1796        if (port->fcoe_pending_queue.qlen && !timer_pending(&port->timer))
1797                mod_timer(&port->timer, jiffies + 2);
1798        port->fcoe_pending_queue_active = 0;
1799out:
1800        if (port->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
1801                lport->qfull = 1;
1802        spin_unlock_bh(&port->fcoe_pending_queue.lock);
1803        return;
1804}
1805
1806/**
1807 * fcoe_dev_setup() - Setup the link change notification interface
1808 */
1809static void fcoe_dev_setup(void)
1810{
1811        register_netdevice_notifier(&fcoe_notifier);
1812}
1813
1814/**
1815 * fcoe_dev_cleanup() - Cleanup the link change notification interface
1816 */
1817static void fcoe_dev_cleanup(void)
1818{
1819        unregister_netdevice_notifier(&fcoe_notifier);
1820}
1821
1822/**
1823 * fcoe_device_notification() - Handler for net device events
1824 * @notifier: The context of the notification
1825 * @event:    The type of event
1826 * @ptr:      The net device that the event was on
1827 *
1828 * This function is called by the Ethernet driver in case of link change event.
1829 *
1830 * Returns: 0 for success
1831 */
1832static int fcoe_device_notification(struct notifier_block *notifier,
1833                                    ulong event, void *ptr)
1834{
1835        struct fc_lport *lport = NULL;
1836        struct net_device *netdev = ptr;
1837        struct fcoe_interface *fcoe;
1838        struct fcoe_port *port;
1839        struct fcoe_dev_stats *stats;
1840        u32 link_possible = 1;
1841        u32 mfs;
1842        int rc = NOTIFY_OK;
1843
1844        list_for_each_entry(fcoe, &fcoe_hostlist, list) {
1845                if (fcoe->netdev == netdev) {
1846                        lport = fcoe->ctlr.lp;
1847                        break;
1848                }
1849        }
1850        if (!lport) {
1851                rc = NOTIFY_DONE;
1852                goto out;
1853        }
1854
1855        switch (event) {
1856        case NETDEV_DOWN:
1857        case NETDEV_GOING_DOWN:
1858                link_possible = 0;
1859                break;
1860        case NETDEV_UP:
1861        case NETDEV_CHANGE:
1862                break;
1863        case NETDEV_CHANGEMTU:
1864                if (netdev->features & NETIF_F_FCOE_MTU)
1865                        break;
1866                mfs = netdev->mtu - (sizeof(struct fcoe_hdr) +
1867                                     sizeof(struct fcoe_crc_eof));
1868                if (mfs >= FC_MIN_MAX_FRAME)
1869                        fc_set_mfs(lport, mfs);
1870                break;
1871        case NETDEV_REGISTER:
1872                break;
1873        case NETDEV_UNREGISTER:
1874                list_del(&fcoe->list);
1875                port = lport_priv(fcoe->ctlr.lp);
1876                fcoe_interface_cleanup(fcoe);
1877                schedule_work(&port->destroy_work);
1878                goto out;
1879                break;
1880        case NETDEV_FEAT_CHANGE:
1881                fcoe_netdev_features_change(lport, netdev);
1882                break;
1883        default:
1884                FCOE_NETDEV_DBG(netdev, "Unknown event %ld "
1885                                "from netdev netlink\n", event);
1886        }
1887
1888        fcoe_link_speed_update(lport);
1889
1890        if (link_possible && !fcoe_link_ok(lport))
1891                fcoe_ctlr_link_up(&fcoe->ctlr);
1892        else if (fcoe_ctlr_link_down(&fcoe->ctlr)) {
1893                stats = per_cpu_ptr(lport->dev_stats, get_cpu());
1894                stats->LinkFailureCount++;
1895                put_cpu();
1896                fcoe_clean_pending_queue(lport);
1897        }
1898out:
1899        return rc;
1900}
1901
1902/**
1903 * fcoe_if_to_netdev() - Parse a name buffer to get a net device
1904 * @buffer: The name of the net device
1905 *
1906 * Returns: NULL or a ptr to net_device
1907 */
1908static struct net_device *fcoe_if_to_netdev(const char *buffer)
1909{
1910        char *cp;
1911        char ifname[IFNAMSIZ + 2];
1912
1913        if (buffer) {
1914                strlcpy(ifname, buffer, IFNAMSIZ);
1915                cp = ifname + strlen(ifname);
1916                while (--cp >= ifname && *cp == '\n')
1917                        *cp = '\0';
1918                return dev_get_by_name(&init_net, ifname);
1919        }
1920        return NULL;
1921}
1922
1923/**
1924 * fcoe_disable() - Disables a FCoE interface
1925 * @buffer: The name of the Ethernet interface to be disabled
1926 * @kp:     The associated kernel parameter
1927 *
1928 * Called from sysfs.
1929 *
1930 * Returns: 0 for success
1931 */
1932static int fcoe_disable(const char *buffer, struct kernel_param *kp)
1933{
1934        struct fcoe_interface *fcoe;
1935        struct net_device *netdev;
1936        int rc = 0;
1937
1938        mutex_lock(&fcoe_config_mutex);
1939#ifdef CONFIG_FCOE_MODULE
1940        /*
1941         * Make sure the module has been initialized, and is not about to be
1942         * removed.  Module paramter sysfs files are writable before the
1943         * module_init function is called and after module_exit.
1944         */
1945        if (THIS_MODULE->state != MODULE_STATE_LIVE) {
1946                rc = -ENODEV;
1947                goto out_nodev;
1948        }
1949#endif
1950
1951        netdev = fcoe_if_to_netdev(buffer);
1952        if (!netdev) {
1953                rc = -ENODEV;
1954                goto out_nodev;
1955        }
1956
1957        if (!rtnl_trylock()) {
1958                dev_put(netdev);
1959                mutex_unlock(&fcoe_config_mutex);
1960                return restart_syscall();
1961        }
1962
1963        fcoe = fcoe_hostlist_lookup_port(netdev);
1964        rtnl_unlock();
1965
1966        if (fcoe) {
1967                fcoe_ctlr_link_down(&fcoe->ctlr);
1968                fcoe_clean_pending_queue(fcoe->ctlr.lp);
1969        } else
1970                rc = -ENODEV;
1971
1972        dev_put(netdev);
1973out_nodev:
1974        mutex_unlock(&fcoe_config_mutex);
1975        return rc;
1976}
1977
1978/**
1979 * fcoe_enable() - Enables a FCoE interface
1980 * @buffer: The name of the Ethernet interface to be enabled
1981 * @kp:     The associated kernel parameter
1982 *
1983 * Called from sysfs.
1984 *
1985 * Returns: 0 for success
1986 */
1987static int fcoe_enable(const char *buffer, struct kernel_param *kp)
1988{
1989        struct fcoe_interface *fcoe;
1990        struct net_device *netdev;
1991        int rc = 0;
1992
1993        mutex_lock(&fcoe_config_mutex);
1994#ifdef CONFIG_FCOE_MODULE
1995        /*
1996         * Make sure the module has been initialized, and is not about to be
1997         * removed.  Module paramter sysfs files are writable before the
1998         * module_init function is called and after module_exit.
1999         */
2000        if (THIS_MODULE->state != MODULE_STATE_LIVE) {
2001                rc = -ENODEV;
2002                goto out_nodev;
2003        }
2004#endif
2005
2006        netdev = fcoe_if_to_netdev(buffer);
2007        if (!netdev) {
2008                rc = -ENODEV;
2009                goto out_nodev;
2010        }
2011
2012        if (!rtnl_trylock()) {
2013                dev_put(netdev);
2014                mutex_unlock(&fcoe_config_mutex);
2015                return restart_syscall();
2016        }
2017
2018        fcoe = fcoe_hostlist_lookup_port(netdev);
2019        rtnl_unlock();
2020
2021        if (!fcoe)
2022                rc = -ENODEV;
2023        else if (!fcoe_link_ok(fcoe->ctlr.lp))
2024                fcoe_ctlr_link_up(&fcoe->ctlr);
2025
2026        dev_put(netdev);
2027out_nodev:
2028        mutex_unlock(&fcoe_config_mutex);
2029        return rc;
2030}
2031
2032/**
2033 * fcoe_destroy() - Destroy a FCoE interface
2034 * @buffer: The name of the Ethernet interface to be destroyed
2035 * @kp:     The associated kernel parameter
2036 *
2037 * Called from sysfs.
2038 *
2039 * Returns: 0 for success
2040 */
2041static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
2042{
2043        struct fcoe_interface *fcoe;
2044        struct net_device *netdev;
2045        int rc = 0;
2046
2047        mutex_lock(&fcoe_config_mutex);
2048#ifdef CONFIG_FCOE_MODULE
2049        /*
2050         * Make sure the module has been initialized, and is not about to be
2051         * removed.  Module paramter sysfs files are writable before the
2052         * module_init function is called and after module_exit.
2053         */
2054        if (THIS_MODULE->state != MODULE_STATE_LIVE) {
2055                rc = -ENODEV;
2056                goto out_nodev;
2057        }
2058#endif
2059
2060        netdev = fcoe_if_to_netdev(buffer);
2061        if (!netdev) {
2062                rc = -ENODEV;
2063                goto out_nodev;
2064        }
2065
2066        if (!rtnl_trylock()) {
2067                dev_put(netdev);
2068                mutex_unlock(&fcoe_config_mutex);
2069                return restart_syscall();
2070        }
2071
2072        fcoe = fcoe_hostlist_lookup_port(netdev);
2073        if (!fcoe) {
2074                rtnl_unlock();
2075                rc = -ENODEV;
2076                goto out_putdev;
2077        }
2078        fcoe_interface_cleanup(fcoe);
2079        list_del(&fcoe->list);
2080        /* RTNL mutex is dropped by fcoe_if_destroy */
2081        fcoe_if_destroy(fcoe->ctlr.lp);
2082
2083out_putdev:
2084        dev_put(netdev);
2085out_nodev:
2086        mutex_unlock(&fcoe_config_mutex);
2087        return rc;
2088}
2089
2090/**
2091 * fcoe_destroy_work() - Destroy a FCoE port in a deferred work context
2092 * @work: Handle to the FCoE port to be destroyed
2093 */
2094static void fcoe_destroy_work(struct work_struct *work)
2095{
2096        struct fcoe_port *port;
2097
2098        port = container_of(work, struct fcoe_port, destroy_work);
2099        mutex_lock(&fcoe_config_mutex);
2100        rtnl_lock();
2101        /* RTNL mutex is dropped by fcoe_if_destroy */
2102        fcoe_if_destroy(port->lport);
2103        mutex_unlock(&fcoe_config_mutex);
2104}
2105
2106/**
2107 * fcoe_create() - Create a fcoe interface
2108 * @buffer: The name of the Ethernet interface to create on
2109 * @kp:     The associated kernel param
2110 *
2111 * Called from sysfs.
2112 *
2113 * Returns: 0 for success
2114 */
2115static int fcoe_create(const char *buffer, struct kernel_param *kp)
2116{
2117        enum fip_state fip_mode = (enum fip_state)(long)kp->arg;
2118        int rc;
2119        struct fcoe_interface *fcoe;
2120        struct fc_lport *lport;
2121        struct net_device *netdev;
2122
2123        mutex_lock(&fcoe_config_mutex);
2124
2125        if (!rtnl_trylock()) {
2126                mutex_unlock(&fcoe_config_mutex);
2127                return restart_syscall();
2128        }
2129
2130#ifdef CONFIG_FCOE_MODULE
2131        /*
2132         * Make sure the module has been initialized, and is not about to be
2133         * removed.  Module paramter sysfs files are writable before the
2134         * module_init function is called and after module_exit.
2135         */
2136        if (THIS_MODULE->state != MODULE_STATE_LIVE) {
2137                rc = -ENODEV;
2138                goto out_nomod;
2139        }
2140#endif
2141
2142        if (!try_module_get(THIS_MODULE)) {
2143                rc = -EINVAL;
2144                goto out_nomod;
2145        }
2146
2147        netdev = fcoe_if_to_netdev(buffer);
2148        if (!netdev) {
2149                rc = -ENODEV;
2150                goto out_nodev;
2151        }
2152
2153        /* look for existing lport */
2154        if (fcoe_hostlist_lookup(netdev)) {
2155                rc = -EEXIST;
2156                goto out_putdev;
2157        }
2158
2159        fcoe = fcoe_interface_create(netdev, fip_mode);
2160        if (!fcoe) {
2161                rc = -ENOMEM;
2162                goto out_putdev;
2163        }
2164
2165        lport = fcoe_if_create(fcoe, &netdev->dev, 0);
2166        if (IS_ERR(lport)) {
2167                printk(KERN_ERR "fcoe: Failed to create interface (%s)\n",
2168                       netdev->name);
2169                rc = -EIO;
2170                fcoe_interface_cleanup(fcoe);
2171                goto out_free;
2172        }
2173
2174        /* Make this the "master" N_Port */
2175        fcoe->ctlr.lp = lport;
2176
2177        /* add to lports list */
2178        fcoe_hostlist_add(lport);
2179
2180        /* start FIP Discovery and FLOGI */
2181        lport->boot_time = jiffies;
2182        fc_fabric_login(lport);
2183        if (!fcoe_link_ok(lport))
2184                fcoe_ctlr_link_up(&fcoe->ctlr);
2185
2186        /*
2187         * Release from init in fcoe_interface_create(), on success lport
2188         * should be holding a reference taken in fcoe_if_create().
2189         */
2190        fcoe_interface_put(fcoe);
2191        dev_put(netdev);
2192        rtnl_unlock();
2193        mutex_unlock(&fcoe_config_mutex);
2194
2195        return 0;
2196out_free:
2197        fcoe_interface_put(fcoe);
2198out_putdev:
2199        dev_put(netdev);
2200out_nodev:
2201        module_put(THIS_MODULE);
2202out_nomod:
2203        rtnl_unlock();
2204        mutex_unlock(&fcoe_config_mutex);
2205        return rc;
2206}
2207
2208/**
2209 * fcoe_link_speed_update() - Update the supported and actual link speeds
2210 * @lport: The local port to update speeds for
2211 *
2212 * Returns: 0 if the ethtool query was successful
2213 *          -1 if the ethtool query failed
2214 */
2215int fcoe_link_speed_update(struct fc_lport *lport)
2216{
2217        struct fcoe_port *port = lport_priv(lport);
2218        struct net_device *netdev = port->fcoe->netdev;
2219        struct ethtool_cmd ecmd = { ETHTOOL_GSET };
2220
2221        if (!dev_ethtool_get_settings(netdev, &ecmd)) {
2222                lport->link_supported_speeds &=
2223                        ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
2224                if (ecmd.supported & (SUPPORTED_1000baseT_Half |
2225                                      SUPPORTED_1000baseT_Full))
2226                        lport->link_supported_speeds |= FC_PORTSPEED_1GBIT;
2227                if (ecmd.supported & SUPPORTED_10000baseT_Full)
2228                        lport->link_supported_speeds |=
2229                                FC_PORTSPEED_10GBIT;
2230                if (ecmd.speed == SPEED_1000)
2231                        lport->link_speed = FC_PORTSPEED_1GBIT;
2232                if (ecmd.speed == SPEED_10000)
2233                        lport->link_speed = FC_PORTSPEED_10GBIT;
2234
2235                return 0;
2236        }
2237        return -1;
2238}
2239
2240/**
2241 * fcoe_link_ok() - Check if the link is OK for a local port
2242 * @lport: The local port to check link on
2243 *
2244 * Returns: 0 if link is UP and OK, -1 if not
2245 *
2246 */
2247int fcoe_link_ok(struct fc_lport *lport)
2248{
2249        struct fcoe_port *port = lport_priv(lport);
2250        struct net_device *netdev = port->fcoe->netdev;
2251
2252        if (netif_oper_up(netdev))
2253                return 0;
2254        return -1;
2255}
2256
2257/**
2258 * fcoe_percpu_clean() - Clear all pending skbs for an local port
2259 * @lport: The local port whose skbs are to be cleared
2260 *
2261 * Must be called with fcoe_create_mutex held to single-thread completion.
2262 *
2263 * This flushes the pending skbs by adding a new skb to each queue and
2264 * waiting until they are all freed.  This assures us that not only are
2265 * there no packets that will be handled by the lport, but also that any
2266 * threads already handling packet have returned.
2267 */
2268void fcoe_percpu_clean(struct fc_lport *lport)
2269{
2270        struct fcoe_percpu_s *pp;
2271        struct fcoe_rcv_info *fr;
2272        struct sk_buff_head *list;
2273        struct sk_buff *skb, *next;
2274        struct sk_buff *head;
2275        unsigned int cpu;
2276
2277        for_each_possible_cpu(cpu) {
2278                pp = &per_cpu(fcoe_percpu, cpu);
2279                spin_lock_bh(&pp->fcoe_rx_list.lock);
2280                list = &pp->fcoe_rx_list;
2281                head = list->next;
2282                for (skb = head; skb != (struct sk_buff *)list;
2283                     skb = next) {
2284                        next = skb->next;
2285                        fr = fcoe_dev_from_skb(skb);
2286                        if (fr->fr_dev == lport) {
2287                                __skb_unlink(skb, list);
2288                                kfree_skb(skb);
2289                        }
2290                }
2291
2292                if (!pp->thread || !cpu_online(cpu)) {
2293                        spin_unlock_bh(&pp->fcoe_rx_list.lock);
2294                        continue;
2295                }
2296
2297                skb = dev_alloc_skb(0);
2298                if (!skb) {
2299                        spin_unlock_bh(&pp->fcoe_rx_list.lock);
2300                        continue;
2301                }
2302                skb->destructor = fcoe_percpu_flush_done;
2303
2304                __skb_queue_tail(&pp->fcoe_rx_list, skb);
2305                if (pp->fcoe_rx_list.qlen == 1)
2306                        wake_up_process(pp->thread);
2307                spin_unlock_bh(&pp->fcoe_rx_list.lock);
2308
2309                wait_for_completion(&fcoe_flush_completion);
2310        }
2311}
2312
2313/**
2314 * fcoe_clean_pending_queue() - Dequeue a skb and free it
2315 * @lport: The local port to dequeue a skb on
2316 */
2317void fcoe_clean_pending_queue(struct fc_lport *lport)
2318{
2319        struct fcoe_port  *port = lport_priv(lport);
2320        struct sk_buff *skb;
2321
2322        spin_lock_bh(&port->fcoe_pending_queue.lock);
2323        while ((skb = __skb_dequeue(&port->fcoe_pending_queue)) != NULL) {
2324                spin_unlock_bh(&port->fcoe_pending_queue.lock);
2325                kfree_skb(skb);
2326                spin_lock_bh(&port->fcoe_pending_queue.lock);
2327        }
2328        spin_unlock_bh(&port->fcoe_pending_queue.lock);
2329}
2330
2331/**
2332 * fcoe_reset() - Reset a local port
2333 * @shost: The SCSI host associated with the local port to be reset
2334 *
2335 * Returns: Always 0 (return value required by FC transport template)
2336 */
2337int fcoe_reset(struct Scsi_Host *shost)
2338{
2339        struct fc_lport *lport = shost_priv(shost);
2340        fc_lport_reset(lport);
2341        return 0;
2342}
2343
2344/**
2345 * fcoe_hostlist_lookup_port() - Find the FCoE interface associated with a net device
2346 * @netdev: The net device used as a key
2347 *
2348 * Locking: Must be called with the RNL mutex held.
2349 *
2350 * Returns: NULL or the FCoE interface
2351 */
2352static struct fcoe_interface *
2353fcoe_hostlist_lookup_port(const struct net_device *netdev)
2354{
2355        struct fcoe_interface *fcoe;
2356
2357        list_for_each_entry(fcoe, &fcoe_hostlist, list) {
2358                if (fcoe->netdev == netdev)
2359                        return fcoe;
2360        }
2361        return NULL;
2362}
2363
2364/**
2365 * fcoe_hostlist_lookup() - Find the local port associated with a
2366 *                          given net device
2367 * @netdev: The netdevice used as a key
2368 *
2369 * Locking: Must be called with the RTNL mutex held
2370 *
2371 * Returns: NULL or the local port
2372 */
2373static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)
2374{
2375        struct fcoe_interface *fcoe;
2376
2377        fcoe = fcoe_hostlist_lookup_port(netdev);
2378        return (fcoe) ? fcoe->ctlr.lp : NULL;
2379}
2380
2381/**
2382 * fcoe_hostlist_add() - Add the FCoE interface identified by a local
2383 *                       port to the hostlist
2384 * @lport: The local port that identifies the FCoE interface to be added
2385 *
2386 * Locking: must be called with the RTNL mutex held
2387 *
2388 * Returns: 0 for success
2389 */
2390static int fcoe_hostlist_add(const struct fc_lport *lport)
2391{
2392        struct fcoe_interface *fcoe;
2393        struct fcoe_port *port;
2394
2395        fcoe = fcoe_hostlist_lookup_port(fcoe_netdev(lport));
2396        if (!fcoe) {
2397                port = lport_priv(lport);
2398                fcoe = port->fcoe;
2399                list_add_tail(&fcoe->list, &fcoe_hostlist);
2400        }
2401        return 0;
2402}
2403
2404/**
2405 * fcoe_init() - Initialize fcoe.ko
2406 *
2407 * Returns: 0 on success, or a negative value on failure
2408 */
2409static int __init fcoe_init(void)
2410{
2411        struct fcoe_percpu_s *p;
2412        unsigned int cpu;
2413        int rc = 0;
2414
2415        mutex_lock(&fcoe_config_mutex);
2416
2417        for_each_possible_cpu(cpu) {
2418                p = &per_cpu(fcoe_percpu, cpu);
2419                skb_queue_head_init(&p->fcoe_rx_list);
2420        }
2421
2422        for_each_online_cpu(cpu)
2423                fcoe_percpu_thread_create(cpu);
2424
2425        /* Initialize per CPU interrupt thread */
2426        rc = register_hotcpu_notifier(&fcoe_cpu_notifier);
2427        if (rc)
2428                goto out_free;
2429
2430        /* Setup link change notification */
2431        fcoe_dev_setup();
2432
2433        rc = fcoe_if_init();
2434        if (rc)
2435                goto out_free;
2436
2437        mutex_unlock(&fcoe_config_mutex);
2438        return 0;
2439
2440out_free:
2441        for_each_online_cpu(cpu) {
2442                fcoe_percpu_thread_destroy(cpu);
2443        }
2444        mutex_unlock(&fcoe_config_mutex);
2445        return rc;
2446}
2447module_init(fcoe_init);
2448
2449/**
2450 * fcoe_exit() - Clean up fcoe.ko
2451 *
2452 * Returns: 0 on success or a  negative value on failure
2453 */
2454static void __exit fcoe_exit(void)
2455{
2456        struct fcoe_interface *fcoe, *tmp;
2457        struct fcoe_port *port;
2458        unsigned int cpu;
2459
2460        mutex_lock(&fcoe_config_mutex);
2461
2462        fcoe_dev_cleanup();
2463
2464        /* releases the associated fcoe hosts */
2465        rtnl_lock();
2466        list_for_each_entry_safe(fcoe, tmp, &fcoe_hostlist, list) {
2467                list_del(&fcoe->list);
2468                port = lport_priv(fcoe->ctlr.lp);
2469                fcoe_interface_cleanup(fcoe);
2470                schedule_work(&port->destroy_work);
2471        }
2472        rtnl_unlock();
2473
2474        unregister_hotcpu_notifier(&fcoe_cpu_notifier);
2475
2476        for_each_online_cpu(cpu)
2477                fcoe_percpu_thread_destroy(cpu);
2478
2479        mutex_unlock(&fcoe_config_mutex);
2480
2481        /* flush any asyncronous interface destroys,
2482         * this should happen after the netdev notifier is unregistered */
2483        flush_scheduled_work();
2484        /* That will flush out all the N_Ports on the hostlist, but now we
2485         * may have NPIV VN_Ports scheduled for destruction */
2486        flush_scheduled_work();
2487
2488        /* detach from scsi transport
2489         * must happen after all destroys are done, therefor after the flush */
2490        fcoe_if_exit();
2491}
2492module_exit(fcoe_exit);
2493
2494/**
2495 * fcoe_flogi_resp() - FCoE specific FLOGI and FDISC response handler
2496 * @seq: active sequence in the FLOGI or FDISC exchange
2497 * @fp: response frame, or error encoded in a pointer (timeout)
2498 * @arg: pointer the the fcoe_ctlr structure
2499 *
2500 * This handles MAC address management for FCoE, then passes control on to
2501 * the libfc FLOGI response handler.
2502 */
2503static void fcoe_flogi_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
2504{
2505        struct fcoe_ctlr *fip = arg;
2506        struct fc_exch *exch = fc_seq_exch(seq);
2507        struct fc_lport *lport = exch->lp;
2508        u8 *mac;
2509
2510        if (IS_ERR(fp))
2511                goto done;
2512
2513        mac = fr_cb(fp)->granted_mac;
2514        if (is_zero_ether_addr(mac)) {
2515                /* pre-FIP */
2516                if (fcoe_ctlr_recv_flogi(fip, lport, fp)) {
2517                        fc_frame_free(fp);
2518                        return;
2519                }
2520        }
2521        fcoe_update_src_mac(lport, mac);
2522done:
2523        fc_lport_flogi_resp(seq, fp, lport);
2524}
2525
2526/**
2527 * fcoe_logo_resp() - FCoE specific LOGO response handler
2528 * @seq: active sequence in the LOGO exchange
2529 * @fp: response frame, or error encoded in a pointer (timeout)
2530 * @arg: pointer the the fcoe_ctlr structure
2531 *
2532 * This handles MAC address management for FCoE, then passes control on to
2533 * the libfc LOGO response handler.
2534 */
2535static void fcoe_logo_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
2536{
2537        struct fc_lport *lport = arg;
2538        static u8 zero_mac[ETH_ALEN] = { 0 };
2539
2540        if (!IS_ERR(fp))
2541                fcoe_update_src_mac(lport, zero_mac);
2542        fc_lport_logo_resp(seq, fp, lport);
2543}
2544
2545/**
2546 * fcoe_elsct_send - FCoE specific ELS handler
2547 *
2548 * This does special case handling of FIP encapsualted ELS exchanges for FCoE,
2549 * using FCoE specific response handlers and passing the FIP controller as
2550 * the argument (the lport is still available from the exchange).
2551 *
2552 * Most of the work here is just handed off to the libfc routine.
2553 */
2554static struct fc_seq *fcoe_elsct_send(struct fc_lport *lport, u32 did,
2555                                      struct fc_frame *fp, unsigned int op,
2556                                      void (*resp)(struct fc_seq *,
2557                                                   struct fc_frame *,
2558                                                   void *),
2559                                      void *arg, u32 timeout)
2560{
2561        struct fcoe_port *port = lport_priv(lport);
2562        struct fcoe_interface *fcoe = port->fcoe;
2563        struct fcoe_ctlr *fip = &fcoe->ctlr;
2564        struct fc_frame_header *fh = fc_frame_header_get(fp);
2565
2566        switch (op) {
2567        case ELS_FLOGI:
2568        case ELS_FDISC:
2569                if (lport->point_to_multipoint)
2570                        break;
2571                return fc_elsct_send(lport, did, fp, op, fcoe_flogi_resp,
2572                                     fip, timeout);
2573        case ELS_LOGO:
2574                /* only hook onto fabric logouts, not port logouts */
2575                if (ntoh24(fh->fh_d_id) != FC_FID_FLOGI)
2576                        break;
2577                return fc_elsct_send(lport, did, fp, op, fcoe_logo_resp,
2578                                     lport, timeout);
2579        }
2580        return fc_elsct_send(lport, did, fp, op, resp, arg, timeout);
2581}
2582
2583/**
2584 * fcoe_vport_create() - create an fc_host/scsi_host for a vport
2585 * @vport: fc_vport object to create a new fc_host for
2586 * @disabled: start the new fc_host in a disabled state by default?
2587 *
2588 * Returns: 0 for success
2589 */
2590static int fcoe_vport_create(struct fc_vport *vport, bool disabled)
2591{
2592        struct Scsi_Host *shost = vport_to_shost(vport);
2593        struct fc_lport *n_port = shost_priv(shost);
2594        struct fcoe_port *port = lport_priv(n_port);
2595        struct fcoe_interface *fcoe = port->fcoe;
2596        struct net_device *netdev = fcoe->netdev;
2597        struct fc_lport *vn_port;
2598
2599        mutex_lock(&fcoe_config_mutex);
2600        vn_port = fcoe_if_create(fcoe, &vport->dev, 1);
2601        mutex_unlock(&fcoe_config_mutex);
2602
2603        if (IS_ERR(vn_port)) {
2604                printk(KERN_ERR "fcoe: fcoe_vport_create(%s) failed\n",
2605                       netdev->name);
2606                return -EIO;
2607        }
2608
2609        if (disabled) {
2610                fc_vport_set_state(vport, FC_VPORT_DISABLED);
2611        } else {
2612                vn_port->boot_time = jiffies;
2613                fc_fabric_login(vn_port);
2614                fc_vport_setlink(vn_port);
2615        }
2616        return 0;
2617}
2618
2619/**
2620 * fcoe_vport_destroy() - destroy the fc_host/scsi_host for a vport
2621 * @vport: fc_vport object that is being destroyed
2622 *
2623 * Returns: 0 for success
2624 */
2625static int fcoe_vport_destroy(struct fc_vport *vport)
2626{
2627        struct Scsi_Host *shost = vport_to_shost(vport);
2628        struct fc_lport *n_port = shost_priv(shost);
2629        struct fc_lport *vn_port = vport->dd_data;
2630        struct fcoe_port *port = lport_priv(vn_port);
2631
2632        mutex_lock(&n_port->lp_mutex);
2633        list_del(&vn_port->list);
2634        mutex_unlock(&n_port->lp_mutex);
2635        schedule_work(&port->destroy_work);
2636        return 0;
2637}
2638
2639/**
2640 * fcoe_vport_disable() - change vport state
2641 * @vport: vport to bring online/offline
2642 * @disable: should the vport be disabled?
2643 */
2644static int fcoe_vport_disable(struct fc_vport *vport, bool disable)
2645{
2646        struct fc_lport *lport = vport->dd_data;
2647
2648        if (disable) {
2649                fc_vport_set_state(vport, FC_VPORT_DISABLED);
2650                fc_fabric_logoff(lport);
2651        } else {
2652                lport->boot_time = jiffies;
2653                fc_fabric_login(lport);
2654                fc_vport_setlink(lport);
2655        }
2656
2657        return 0;
2658}
2659
2660/**
2661 * fcoe_vport_set_symbolic_name() - append vport string to symbolic name
2662 * @vport: fc_vport with a new symbolic name string
2663 *
2664 * After generating a new symbolic name string, a new RSPN_ID request is
2665 * sent to the name server.  There is no response handler, so if it fails
2666 * for some reason it will not be retried.
2667 */
2668static void fcoe_set_vport_symbolic_name(struct fc_vport *vport)
2669{
2670        struct fc_lport *lport = vport->dd_data;
2671        struct fc_frame *fp;
2672        size_t len;
2673
2674        snprintf(fc_host_symbolic_name(lport->host), FC_SYMBOLIC_NAME_SIZE,
2675                 "%s v%s over %s : %s", FCOE_NAME, FCOE_VERSION,
2676                 fcoe_netdev(lport)->name, vport->symbolic_name);
2677
2678        if (lport->state != LPORT_ST_READY)
2679                return;
2680
2681        len = strnlen(fc_host_symbolic_name(lport->host), 255);
2682        fp = fc_frame_alloc(lport,
2683                            sizeof(struct fc_ct_hdr) +
2684                            sizeof(struct fc_ns_rspn) + len);
2685        if (!fp)
2686                return;
2687        lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RSPN_ID,
2688                             NULL, NULL, 3 * lport->r_a_tov);
2689}
2690
2691/**
2692 * fcoe_get_lesb() - Fill the FCoE Link Error Status Block
2693 * @lport: the local port
2694 * @fc_lesb: the link error status block
2695 */
2696static void fcoe_get_lesb(struct fc_lport *lport,
2697                         struct fc_els_lesb *fc_lesb)
2698{
2699        unsigned int cpu;
2700        u32 lfc, vlfc, mdac;
2701        struct fcoe_dev_stats *devst;
2702        struct fcoe_fc_els_lesb *lesb;
2703        struct rtnl_link_stats64 temp;
2704        struct net_device *netdev = fcoe_netdev(lport);
2705
2706        lfc = 0;
2707        vlfc = 0;
2708        mdac = 0;
2709        lesb = (struct fcoe_fc_els_lesb *)fc_lesb;
2710        memset(lesb, 0, sizeof(*lesb));
2711        for_each_possible_cpu(cpu) {
2712                devst = per_cpu_ptr(lport->dev_stats, cpu);
2713                lfc += devst->LinkFailureCount;
2714                vlfc += devst->VLinkFailureCount;
2715                mdac += devst->MissDiscAdvCount;
2716        }
2717        lesb->lesb_link_fail = htonl(lfc);
2718        lesb->lesb_vlink_fail = htonl(vlfc);
2719        lesb->lesb_miss_fka = htonl(mdac);
2720        lesb->lesb_fcs_error = htonl(dev_get_stats(netdev, &temp)->rx_crc_errors);
2721}
2722
2723/**
2724 * fcoe_set_port_id() - Callback from libfc when Port_ID is set.
2725 * @lport: the local port
2726 * @port_id: the port ID
2727 * @fp: the received frame, if any, that caused the port_id to be set.
2728 *
2729 * This routine handles the case where we received a FLOGI and are
2730 * entering point-to-point mode.  We need to call fcoe_ctlr_recv_flogi()
2731 * so it can set the non-mapped mode and gateway address.
2732 *
2733 * The FLOGI LS_ACC is handled by fcoe_flogi_resp().
2734 */
2735static void fcoe_set_port_id(struct fc_lport *lport,
2736                             u32 port_id, struct fc_frame *fp)
2737{
2738        struct fcoe_port *port = lport_priv(lport);
2739        struct fcoe_interface *fcoe = port->fcoe;
2740
2741        if (fp && fc_frame_payload_op(fp) == ELS_FLOGI)
2742                fcoe_ctlr_recv_flogi(&fcoe->ctlr, lport, fp);
2743}
2744