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