Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.39-rc2 1198 lines 34 kB view raw
1/* 2 * Copyright (c) 2007 Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 * 32 */ 33 34#include <linux/etherdevice.h> 35#include <linux/tcp.h> 36#include <linux/if_vlan.h> 37#include <linux/delay.h> 38#include <linux/slab.h> 39 40#include <linux/mlx4/driver.h> 41#include <linux/mlx4/device.h> 42#include <linux/mlx4/cmd.h> 43#include <linux/mlx4/cq.h> 44 45#include "mlx4_en.h" 46#include "en_port.h" 47 48 49static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) 50{ 51 struct mlx4_en_priv *priv = netdev_priv(dev); 52 struct mlx4_en_dev *mdev = priv->mdev; 53 int err; 54 55 en_dbg(HW, priv, "Registering VLAN group:%p\n", grp); 56 priv->vlgrp = grp; 57 58 mutex_lock(&mdev->state_lock); 59 if (mdev->device_up && priv->port_up) { 60 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, grp); 61 if (err) 62 en_err(priv, "Failed configuring VLAN filter\n"); 63 } 64 mutex_unlock(&mdev->state_lock); 65} 66 67static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 68{ 69 struct mlx4_en_priv *priv = netdev_priv(dev); 70 struct mlx4_en_dev *mdev = priv->mdev; 71 int err; 72 int idx; 73 74 if (!priv->vlgrp) 75 return; 76 77 en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n", 78 vid, vlan_group_get_device(priv->vlgrp, vid)); 79 80 /* Add VID to port VLAN filter */ 81 mutex_lock(&mdev->state_lock); 82 if (mdev->device_up && priv->port_up) { 83 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 84 if (err) 85 en_err(priv, "Failed configuring VLAN filter\n"); 86 } 87 if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx)) 88 en_err(priv, "failed adding vlan %d\n", vid); 89 mutex_unlock(&mdev->state_lock); 90 91} 92 93static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) 94{ 95 struct mlx4_en_priv *priv = netdev_priv(dev); 96 struct mlx4_en_dev *mdev = priv->mdev; 97 int err; 98 int idx; 99 100 if (!priv->vlgrp) 101 return; 102 103 en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n", 104 vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid)); 105 vlan_group_set_device(priv->vlgrp, vid, NULL); 106 107 /* Remove VID from port VLAN filter */ 108 mutex_lock(&mdev->state_lock); 109 if (!mlx4_find_cached_vlan(mdev->dev, priv->port, vid, &idx)) 110 mlx4_unregister_vlan(mdev->dev, priv->port, idx); 111 else 112 en_err(priv, "could not find vid %d in cache\n", vid); 113 114 if (mdev->device_up && priv->port_up) { 115 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 116 if (err) 117 en_err(priv, "Failed configuring VLAN filter\n"); 118 } 119 mutex_unlock(&mdev->state_lock); 120} 121 122u64 mlx4_en_mac_to_u64(u8 *addr) 123{ 124 u64 mac = 0; 125 int i; 126 127 for (i = 0; i < ETH_ALEN; i++) { 128 mac <<= 8; 129 mac |= addr[i]; 130 } 131 return mac; 132} 133 134static int mlx4_en_set_mac(struct net_device *dev, void *addr) 135{ 136 struct mlx4_en_priv *priv = netdev_priv(dev); 137 struct mlx4_en_dev *mdev = priv->mdev; 138 struct sockaddr *saddr = addr; 139 140 if (!is_valid_ether_addr(saddr->sa_data)) 141 return -EADDRNOTAVAIL; 142 143 memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN); 144 priv->mac = mlx4_en_mac_to_u64(dev->dev_addr); 145 queue_work(mdev->workqueue, &priv->mac_task); 146 return 0; 147} 148 149static void mlx4_en_do_set_mac(struct work_struct *work) 150{ 151 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, 152 mac_task); 153 struct mlx4_en_dev *mdev = priv->mdev; 154 int err = 0; 155 156 mutex_lock(&mdev->state_lock); 157 if (priv->port_up) { 158 /* Remove old MAC and insert the new one */ 159 err = mlx4_replace_mac(mdev->dev, priv->port, 160 priv->base_qpn, priv->mac, 0); 161 if (err) 162 en_err(priv, "Failed changing HW MAC address\n"); 163 } else 164 en_dbg(HW, priv, "Port is down while " 165 "registering mac, exiting...\n"); 166 167 mutex_unlock(&mdev->state_lock); 168} 169 170static void mlx4_en_clear_list(struct net_device *dev) 171{ 172 struct mlx4_en_priv *priv = netdev_priv(dev); 173 174 kfree(priv->mc_addrs); 175 priv->mc_addrs_cnt = 0; 176} 177 178static void mlx4_en_cache_mclist(struct net_device *dev) 179{ 180 struct mlx4_en_priv *priv = netdev_priv(dev); 181 struct netdev_hw_addr *ha; 182 char *mc_addrs; 183 int mc_addrs_cnt = netdev_mc_count(dev); 184 int i; 185 186 mc_addrs = kmalloc(mc_addrs_cnt * ETH_ALEN, GFP_ATOMIC); 187 if (!mc_addrs) { 188 en_err(priv, "failed to allocate multicast list\n"); 189 return; 190 } 191 i = 0; 192 netdev_for_each_mc_addr(ha, dev) 193 memcpy(mc_addrs + i++ * ETH_ALEN, ha->addr, ETH_ALEN); 194 priv->mc_addrs = mc_addrs; 195 priv->mc_addrs_cnt = mc_addrs_cnt; 196} 197 198 199static void mlx4_en_set_multicast(struct net_device *dev) 200{ 201 struct mlx4_en_priv *priv = netdev_priv(dev); 202 203 if (!priv->port_up) 204 return; 205 206 queue_work(priv->mdev->workqueue, &priv->mcast_task); 207} 208 209static void mlx4_en_do_set_multicast(struct work_struct *work) 210{ 211 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, 212 mcast_task); 213 struct mlx4_en_dev *mdev = priv->mdev; 214 struct net_device *dev = priv->dev; 215 u64 mcast_addr = 0; 216 u8 mc_list[16] = {0}; 217 int err; 218 219 mutex_lock(&mdev->state_lock); 220 if (!mdev->device_up) { 221 en_dbg(HW, priv, "Card is not up, " 222 "ignoring multicast change.\n"); 223 goto out; 224 } 225 if (!priv->port_up) { 226 en_dbg(HW, priv, "Port is down, " 227 "ignoring multicast change.\n"); 228 goto out; 229 } 230 231 /* 232 * Promsicuous mode: disable all filters 233 */ 234 235 if (dev->flags & IFF_PROMISC) { 236 if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) { 237 if (netif_msg_rx_status(priv)) 238 en_warn(priv, "Entering promiscuous mode\n"); 239 priv->flags |= MLX4_EN_FLAG_PROMISC; 240 241 /* Enable promiscouos mode */ 242 if (!mdev->dev->caps.vep_uc_steering) 243 err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, 244 priv->base_qpn, 1); 245 else 246 err = mlx4_unicast_promisc_add(mdev->dev, priv->base_qpn, 247 priv->port); 248 if (err) 249 en_err(priv, "Failed enabling " 250 "promiscous mode\n"); 251 252 /* Disable port multicast filter (unconditionally) */ 253 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 254 0, MLX4_MCAST_DISABLE); 255 if (err) 256 en_err(priv, "Failed disabling " 257 "multicast filter\n"); 258 259 /* Add the default qp number as multicast promisc */ 260 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { 261 err = mlx4_multicast_promisc_add(mdev->dev, priv->base_qpn, 262 priv->port); 263 if (err) 264 en_err(priv, "Failed entering multicast promisc mode\n"); 265 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; 266 } 267 268 if (priv->vlgrp) { 269 /* Disable port VLAN filter */ 270 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL); 271 if (err) 272 en_err(priv, "Failed disabling VLAN filter\n"); 273 } 274 } 275 goto out; 276 } 277 278 /* 279 * Not in promiscous mode 280 */ 281 282 if (priv->flags & MLX4_EN_FLAG_PROMISC) { 283 if (netif_msg_rx_status(priv)) 284 en_warn(priv, "Leaving promiscuous mode\n"); 285 priv->flags &= ~MLX4_EN_FLAG_PROMISC; 286 287 /* Disable promiscouos mode */ 288 if (!mdev->dev->caps.vep_uc_steering) 289 err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, 290 priv->base_qpn, 0); 291 else 292 err = mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn, 293 priv->port); 294 if (err) 295 en_err(priv, "Failed disabling promiscous mode\n"); 296 297 /* Disable Multicast promisc */ 298 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { 299 err = mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn, 300 priv->port); 301 if (err) 302 en_err(priv, "Failed disabling multicast promiscous mode\n"); 303 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; 304 } 305 306 /* Enable port VLAN filter */ 307 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 308 if (err) 309 en_err(priv, "Failed enabling VLAN filter\n"); 310 } 311 312 /* Enable/disable the multicast filter according to IFF_ALLMULTI */ 313 if (dev->flags & IFF_ALLMULTI) { 314 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 315 0, MLX4_MCAST_DISABLE); 316 if (err) 317 en_err(priv, "Failed disabling multicast filter\n"); 318 319 /* Add the default qp number as multicast promisc */ 320 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { 321 err = mlx4_multicast_promisc_add(mdev->dev, priv->base_qpn, 322 priv->port); 323 if (err) 324 en_err(priv, "Failed entering multicast promisc mode\n"); 325 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; 326 } 327 } else { 328 int i; 329 /* Disable Multicast promisc */ 330 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { 331 err = mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn, 332 priv->port); 333 if (err) 334 en_err(priv, "Failed disabling multicast promiscous mode\n"); 335 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; 336 } 337 338 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 339 0, MLX4_MCAST_DISABLE); 340 if (err) 341 en_err(priv, "Failed disabling multicast filter\n"); 342 343 /* Detach our qp from all the multicast addresses */ 344 for (i = 0; i < priv->mc_addrs_cnt; i++) { 345 memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN); 346 mc_list[5] = priv->port; 347 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, 348 mc_list, MLX4_PROT_ETH); 349 } 350 /* Flush mcast filter and init it with broadcast address */ 351 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, ETH_BCAST, 352 1, MLX4_MCAST_CONFIG); 353 354 /* Update multicast list - we cache all addresses so they won't 355 * change while HW is updated holding the command semaphor */ 356 netif_tx_lock_bh(dev); 357 mlx4_en_cache_mclist(dev); 358 netif_tx_unlock_bh(dev); 359 for (i = 0; i < priv->mc_addrs_cnt; i++) { 360 mcast_addr = 361 mlx4_en_mac_to_u64(priv->mc_addrs + i * ETH_ALEN); 362 memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN); 363 mc_list[5] = priv->port; 364 mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp, 365 mc_list, 0, MLX4_PROT_ETH); 366 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 367 mcast_addr, 0, MLX4_MCAST_CONFIG); 368 } 369 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 370 0, MLX4_MCAST_ENABLE); 371 if (err) 372 en_err(priv, "Failed enabling multicast filter\n"); 373 } 374out: 375 mutex_unlock(&mdev->state_lock); 376} 377 378#ifdef CONFIG_NET_POLL_CONTROLLER 379static void mlx4_en_netpoll(struct net_device *dev) 380{ 381 struct mlx4_en_priv *priv = netdev_priv(dev); 382 struct mlx4_en_cq *cq; 383 unsigned long flags; 384 int i; 385 386 for (i = 0; i < priv->rx_ring_num; i++) { 387 cq = &priv->rx_cq[i]; 388 spin_lock_irqsave(&cq->lock, flags); 389 napi_synchronize(&cq->napi); 390 mlx4_en_process_rx_cq(dev, cq, 0); 391 spin_unlock_irqrestore(&cq->lock, flags); 392 } 393} 394#endif 395 396static void mlx4_en_tx_timeout(struct net_device *dev) 397{ 398 struct mlx4_en_priv *priv = netdev_priv(dev); 399 struct mlx4_en_dev *mdev = priv->mdev; 400 401 if (netif_msg_timer(priv)) 402 en_warn(priv, "Tx timeout called on port:%d\n", priv->port); 403 404 priv->port_stats.tx_timeout++; 405 en_dbg(DRV, priv, "Scheduling watchdog\n"); 406 queue_work(mdev->workqueue, &priv->watchdog_task); 407} 408 409 410static struct net_device_stats *mlx4_en_get_stats(struct net_device *dev) 411{ 412 struct mlx4_en_priv *priv = netdev_priv(dev); 413 414 spin_lock_bh(&priv->stats_lock); 415 memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats)); 416 spin_unlock_bh(&priv->stats_lock); 417 418 return &priv->ret_stats; 419} 420 421static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) 422{ 423 struct mlx4_en_cq *cq; 424 int i; 425 426 /* If we haven't received a specific coalescing setting 427 * (module param), we set the moderation parameters as follows: 428 * - moder_cnt is set to the number of mtu sized packets to 429 * satisfy our coelsing target. 430 * - moder_time is set to a fixed value. 431 */ 432 priv->rx_frames = MLX4_EN_RX_COAL_TARGET; 433 priv->rx_usecs = MLX4_EN_RX_COAL_TIME; 434 en_dbg(INTR, priv, "Default coalesing params for mtu:%d - " 435 "rx_frames:%d rx_usecs:%d\n", 436 priv->dev->mtu, priv->rx_frames, priv->rx_usecs); 437 438 /* Setup cq moderation params */ 439 for (i = 0; i < priv->rx_ring_num; i++) { 440 cq = &priv->rx_cq[i]; 441 cq->moder_cnt = priv->rx_frames; 442 cq->moder_time = priv->rx_usecs; 443 } 444 445 for (i = 0; i < priv->tx_ring_num; i++) { 446 cq = &priv->tx_cq[i]; 447 cq->moder_cnt = MLX4_EN_TX_COAL_PKTS; 448 cq->moder_time = MLX4_EN_TX_COAL_TIME; 449 } 450 451 /* Reset auto-moderation params */ 452 priv->pkt_rate_low = MLX4_EN_RX_RATE_LOW; 453 priv->rx_usecs_low = MLX4_EN_RX_COAL_TIME_LOW; 454 priv->pkt_rate_high = MLX4_EN_RX_RATE_HIGH; 455 priv->rx_usecs_high = MLX4_EN_RX_COAL_TIME_HIGH; 456 priv->sample_interval = MLX4_EN_SAMPLE_INTERVAL; 457 priv->adaptive_rx_coal = 1; 458 priv->last_moder_time = MLX4_EN_AUTO_CONF; 459 priv->last_moder_jiffies = 0; 460 priv->last_moder_packets = 0; 461 priv->last_moder_tx_packets = 0; 462 priv->last_moder_bytes = 0; 463} 464 465static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) 466{ 467 unsigned long period = (unsigned long) (jiffies - priv->last_moder_jiffies); 468 struct mlx4_en_cq *cq; 469 unsigned long packets; 470 unsigned long rate; 471 unsigned long avg_pkt_size; 472 unsigned long rx_packets; 473 unsigned long rx_bytes; 474 unsigned long tx_packets; 475 unsigned long tx_pkt_diff; 476 unsigned long rx_pkt_diff; 477 int moder_time; 478 int i, err; 479 480 if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ) 481 return; 482 483 spin_lock_bh(&priv->stats_lock); 484 rx_packets = priv->stats.rx_packets; 485 rx_bytes = priv->stats.rx_bytes; 486 tx_packets = priv->stats.tx_packets; 487 spin_unlock_bh(&priv->stats_lock); 488 489 if (!priv->last_moder_jiffies || !period) 490 goto out; 491 492 tx_pkt_diff = ((unsigned long) (tx_packets - 493 priv->last_moder_tx_packets)); 494 rx_pkt_diff = ((unsigned long) (rx_packets - 495 priv->last_moder_packets)); 496 packets = max(tx_pkt_diff, rx_pkt_diff); 497 rate = packets * HZ / period; 498 avg_pkt_size = packets ? ((unsigned long) (rx_bytes - 499 priv->last_moder_bytes)) / packets : 0; 500 501 /* Apply auto-moderation only when packet rate exceeds a rate that 502 * it matters */ 503 if (rate > MLX4_EN_RX_RATE_THRESH && avg_pkt_size > MLX4_EN_AVG_PKT_SMALL) { 504 /* If tx and rx packet rates are not balanced, assume that 505 * traffic is mainly BW bound and apply maximum moderation. 506 * Otherwise, moderate according to packet rate */ 507 if (2 * tx_pkt_diff > 3 * rx_pkt_diff || 508 2 * rx_pkt_diff > 3 * tx_pkt_diff) { 509 moder_time = priv->rx_usecs_high; 510 } else { 511 if (rate < priv->pkt_rate_low) 512 moder_time = priv->rx_usecs_low; 513 else if (rate > priv->pkt_rate_high) 514 moder_time = priv->rx_usecs_high; 515 else 516 moder_time = (rate - priv->pkt_rate_low) * 517 (priv->rx_usecs_high - priv->rx_usecs_low) / 518 (priv->pkt_rate_high - priv->pkt_rate_low) + 519 priv->rx_usecs_low; 520 } 521 } else { 522 moder_time = priv->rx_usecs_low; 523 } 524 525 en_dbg(INTR, priv, "tx rate:%lu rx_rate:%lu\n", 526 tx_pkt_diff * HZ / period, rx_pkt_diff * HZ / period); 527 528 en_dbg(INTR, priv, "Rx moder_time changed from:%d to %d period:%lu " 529 "[jiff] packets:%lu avg_pkt_size:%lu rate:%lu [p/s])\n", 530 priv->last_moder_time, moder_time, period, packets, 531 avg_pkt_size, rate); 532 533 if (moder_time != priv->last_moder_time) { 534 priv->last_moder_time = moder_time; 535 for (i = 0; i < priv->rx_ring_num; i++) { 536 cq = &priv->rx_cq[i]; 537 cq->moder_time = moder_time; 538 err = mlx4_en_set_cq_moder(priv, cq); 539 if (err) { 540 en_err(priv, "Failed modifying moderation for cq:%d\n", i); 541 break; 542 } 543 } 544 } 545 546out: 547 priv->last_moder_packets = rx_packets; 548 priv->last_moder_tx_packets = tx_packets; 549 priv->last_moder_bytes = rx_bytes; 550 priv->last_moder_jiffies = jiffies; 551} 552 553static void mlx4_en_do_get_stats(struct work_struct *work) 554{ 555 struct delayed_work *delay = to_delayed_work(work); 556 struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv, 557 stats_task); 558 struct mlx4_en_dev *mdev = priv->mdev; 559 int err; 560 561 err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0); 562 if (err) 563 en_dbg(HW, priv, "Could not update stats\n"); 564 565 mutex_lock(&mdev->state_lock); 566 if (mdev->device_up) { 567 if (priv->port_up) 568 mlx4_en_auto_moderation(priv); 569 570 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); 571 } 572 if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) { 573 queue_work(mdev->workqueue, &priv->mac_task); 574 mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0; 575 } 576 mutex_unlock(&mdev->state_lock); 577} 578 579static void mlx4_en_linkstate(struct work_struct *work) 580{ 581 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, 582 linkstate_task); 583 struct mlx4_en_dev *mdev = priv->mdev; 584 int linkstate = priv->link_state; 585 586 mutex_lock(&mdev->state_lock); 587 /* If observable port state changed set carrier state and 588 * report to system log */ 589 if (priv->last_link_state != linkstate) { 590 if (linkstate == MLX4_DEV_EVENT_PORT_DOWN) { 591 en_info(priv, "Link Down\n"); 592 netif_carrier_off(priv->dev); 593 } else { 594 en_info(priv, "Link Up\n"); 595 netif_carrier_on(priv->dev); 596 } 597 } 598 priv->last_link_state = linkstate; 599 mutex_unlock(&mdev->state_lock); 600} 601 602 603int mlx4_en_start_port(struct net_device *dev) 604{ 605 struct mlx4_en_priv *priv = netdev_priv(dev); 606 struct mlx4_en_dev *mdev = priv->mdev; 607 struct mlx4_en_cq *cq; 608 struct mlx4_en_tx_ring *tx_ring; 609 int rx_index = 0; 610 int tx_index = 0; 611 int err = 0; 612 int i; 613 int j; 614 u8 mc_list[16] = {0}; 615 char name[32]; 616 617 if (priv->port_up) { 618 en_dbg(DRV, priv, "start port called while port already up\n"); 619 return 0; 620 } 621 622 /* Calculate Rx buf size */ 623 dev->mtu = min(dev->mtu, priv->max_mtu); 624 mlx4_en_calc_rx_buf(dev); 625 en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_skb_size); 626 627 /* Configure rx cq's and rings */ 628 err = mlx4_en_activate_rx_rings(priv); 629 if (err) { 630 en_err(priv, "Failed to activate RX rings\n"); 631 return err; 632 } 633 for (i = 0; i < priv->rx_ring_num; i++) { 634 cq = &priv->rx_cq[i]; 635 636 err = mlx4_en_activate_cq(priv, cq); 637 if (err) { 638 en_err(priv, "Failed activating Rx CQ\n"); 639 goto cq_err; 640 } 641 for (j = 0; j < cq->size; j++) 642 cq->buf[j].owner_sr_opcode = MLX4_CQE_OWNER_MASK; 643 err = mlx4_en_set_cq_moder(priv, cq); 644 if (err) { 645 en_err(priv, "Failed setting cq moderation parameters"); 646 mlx4_en_deactivate_cq(priv, cq); 647 goto cq_err; 648 } 649 mlx4_en_arm_cq(priv, cq); 650 priv->rx_ring[i].cqn = cq->mcq.cqn; 651 ++rx_index; 652 } 653 654 /* Set port mac number */ 655 en_dbg(DRV, priv, "Setting mac for port %d\n", priv->port); 656 err = mlx4_register_mac(mdev->dev, priv->port, 657 priv->mac, &priv->base_qpn, 0); 658 if (err) { 659 en_err(priv, "Failed setting port mac\n"); 660 goto cq_err; 661 } 662 mdev->mac_removed[priv->port] = 0; 663 664 err = mlx4_en_config_rss_steer(priv); 665 if (err) { 666 en_err(priv, "Failed configuring rss steering\n"); 667 goto mac_err; 668 } 669 670 if (mdev->dev->caps.comp_pool && !priv->tx_vector) { 671 sprintf(name , "%s-tx", priv->dev->name); 672 if (mlx4_assign_eq(mdev->dev , name, &priv->tx_vector)) { 673 mlx4_warn(mdev, "Failed Assigning an EQ to " 674 "%s_tx ,Falling back to legacy " 675 "EQ's\n", priv->dev->name); 676 } 677 } 678 /* Configure tx cq's and rings */ 679 for (i = 0; i < priv->tx_ring_num; i++) { 680 /* Configure cq */ 681 cq = &priv->tx_cq[i]; 682 cq->vector = priv->tx_vector; 683 err = mlx4_en_activate_cq(priv, cq); 684 if (err) { 685 en_err(priv, "Failed allocating Tx CQ\n"); 686 goto tx_err; 687 } 688 err = mlx4_en_set_cq_moder(priv, cq); 689 if (err) { 690 en_err(priv, "Failed setting cq moderation parameters"); 691 mlx4_en_deactivate_cq(priv, cq); 692 goto tx_err; 693 } 694 en_dbg(DRV, priv, "Resetting index of collapsed CQ:%d to -1\n", i); 695 cq->buf->wqe_index = cpu_to_be16(0xffff); 696 697 /* Configure ring */ 698 tx_ring = &priv->tx_ring[i]; 699 err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn); 700 if (err) { 701 en_err(priv, "Failed allocating Tx ring\n"); 702 mlx4_en_deactivate_cq(priv, cq); 703 goto tx_err; 704 } 705 /* Set initial ownership of all Tx TXBBs to SW (1) */ 706 for (j = 0; j < tx_ring->buf_size; j += STAMP_STRIDE) 707 *((u32 *) (tx_ring->buf + j)) = 0xffffffff; 708 ++tx_index; 709 } 710 711 /* Configure port */ 712 err = mlx4_SET_PORT_general(mdev->dev, priv->port, 713 priv->rx_skb_size + ETH_FCS_LEN, 714 priv->prof->tx_pause, 715 priv->prof->tx_ppp, 716 priv->prof->rx_pause, 717 priv->prof->rx_ppp); 718 if (err) { 719 en_err(priv, "Failed setting port general configurations " 720 "for port %d, with error %d\n", priv->port, err); 721 goto tx_err; 722 } 723 /* Set default qp number */ 724 err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, priv->base_qpn, 0); 725 if (err) { 726 en_err(priv, "Failed setting default qp numbers\n"); 727 goto tx_err; 728 } 729 730 /* Init port */ 731 en_dbg(HW, priv, "Initializing port\n"); 732 err = mlx4_INIT_PORT(mdev->dev, priv->port); 733 if (err) { 734 en_err(priv, "Failed Initializing port\n"); 735 goto tx_err; 736 } 737 738 /* Attach rx QP to bradcast address */ 739 memset(&mc_list[10], 0xff, ETH_ALEN); 740 mc_list[5] = priv->port; 741 if (mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp, mc_list, 742 0, MLX4_PROT_ETH)) 743 mlx4_warn(mdev, "Failed Attaching Broadcast\n"); 744 745 /* Must redo promiscuous mode setup. */ 746 priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC); 747 748 /* Schedule multicast task to populate multicast list */ 749 queue_work(mdev->workqueue, &priv->mcast_task); 750 751 priv->port_up = true; 752 netif_tx_start_all_queues(dev); 753 return 0; 754 755tx_err: 756 while (tx_index--) { 757 mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[tx_index]); 758 mlx4_en_deactivate_cq(priv, &priv->tx_cq[tx_index]); 759 } 760 761 mlx4_en_release_rss_steer(priv); 762mac_err: 763 mlx4_unregister_mac(mdev->dev, priv->port, priv->base_qpn); 764cq_err: 765 while (rx_index--) 766 mlx4_en_deactivate_cq(priv, &priv->rx_cq[rx_index]); 767 for (i = 0; i < priv->rx_ring_num; i++) 768 mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]); 769 770 return err; /* need to close devices */ 771} 772 773 774void mlx4_en_stop_port(struct net_device *dev) 775{ 776 struct mlx4_en_priv *priv = netdev_priv(dev); 777 struct mlx4_en_dev *mdev = priv->mdev; 778 int i; 779 u8 mc_list[16] = {0}; 780 781 if (!priv->port_up) { 782 en_dbg(DRV, priv, "stop port called while port already down\n"); 783 return; 784 } 785 786 /* Synchronize with tx routine */ 787 netif_tx_lock_bh(dev); 788 netif_tx_stop_all_queues(dev); 789 netif_tx_unlock_bh(dev); 790 791 /* Set port as not active */ 792 priv->port_up = false; 793 794 /* Detach All multicasts */ 795 memset(&mc_list[10], 0xff, ETH_ALEN); 796 mc_list[5] = priv->port; 797 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list, 798 MLX4_PROT_ETH); 799 for (i = 0; i < priv->mc_addrs_cnt; i++) { 800 memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN); 801 mc_list[5] = priv->port; 802 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, 803 mc_list, MLX4_PROT_ETH); 804 } 805 mlx4_en_clear_list(dev); 806 /* Flush multicast filter */ 807 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG); 808 809 /* Unregister Mac address for the port */ 810 mlx4_unregister_mac(mdev->dev, priv->port, priv->base_qpn); 811 mdev->mac_removed[priv->port] = 1; 812 813 /* Free TX Rings */ 814 for (i = 0; i < priv->tx_ring_num; i++) { 815 mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[i]); 816 mlx4_en_deactivate_cq(priv, &priv->tx_cq[i]); 817 } 818 msleep(10); 819 820 for (i = 0; i < priv->tx_ring_num; i++) 821 mlx4_en_free_tx_buf(dev, &priv->tx_ring[i]); 822 823 /* Free RSS qps */ 824 mlx4_en_release_rss_steer(priv); 825 826 /* Free RX Rings */ 827 for (i = 0; i < priv->rx_ring_num; i++) { 828 mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]); 829 while (test_bit(NAPI_STATE_SCHED, &priv->rx_cq[i].napi.state)) 830 msleep(1); 831 mlx4_en_deactivate_cq(priv, &priv->rx_cq[i]); 832 } 833 834 /* close port*/ 835 mlx4_CLOSE_PORT(mdev->dev, priv->port); 836} 837 838static void mlx4_en_restart(struct work_struct *work) 839{ 840 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, 841 watchdog_task); 842 struct mlx4_en_dev *mdev = priv->mdev; 843 struct net_device *dev = priv->dev; 844 845 en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); 846 847 mutex_lock(&mdev->state_lock); 848 if (priv->port_up) { 849 mlx4_en_stop_port(dev); 850 if (mlx4_en_start_port(dev)) 851 en_err(priv, "Failed restarting port %d\n", priv->port); 852 } 853 mutex_unlock(&mdev->state_lock); 854} 855 856 857static int mlx4_en_open(struct net_device *dev) 858{ 859 struct mlx4_en_priv *priv = netdev_priv(dev); 860 struct mlx4_en_dev *mdev = priv->mdev; 861 int i; 862 int err = 0; 863 864 mutex_lock(&mdev->state_lock); 865 866 if (!mdev->device_up) { 867 en_err(priv, "Cannot open - device down/disabled\n"); 868 err = -EBUSY; 869 goto out; 870 } 871 872 /* Reset HW statistics and performance counters */ 873 if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) 874 en_dbg(HW, priv, "Failed dumping statistics\n"); 875 876 memset(&priv->stats, 0, sizeof(priv->stats)); 877 memset(&priv->pstats, 0, sizeof(priv->pstats)); 878 879 for (i = 0; i < priv->tx_ring_num; i++) { 880 priv->tx_ring[i].bytes = 0; 881 priv->tx_ring[i].packets = 0; 882 } 883 for (i = 0; i < priv->rx_ring_num; i++) { 884 priv->rx_ring[i].bytes = 0; 885 priv->rx_ring[i].packets = 0; 886 } 887 888 err = mlx4_en_start_port(dev); 889 if (err) 890 en_err(priv, "Failed starting port:%d\n", priv->port); 891 892out: 893 mutex_unlock(&mdev->state_lock); 894 return err; 895} 896 897 898static int mlx4_en_close(struct net_device *dev) 899{ 900 struct mlx4_en_priv *priv = netdev_priv(dev); 901 struct mlx4_en_dev *mdev = priv->mdev; 902 903 en_dbg(IFDOWN, priv, "Close port called\n"); 904 905 mutex_lock(&mdev->state_lock); 906 907 mlx4_en_stop_port(dev); 908 netif_carrier_off(dev); 909 910 mutex_unlock(&mdev->state_lock); 911 return 0; 912} 913 914void mlx4_en_free_resources(struct mlx4_en_priv *priv, bool reserve_vectors) 915{ 916 int i; 917 918 for (i = 0; i < priv->tx_ring_num; i++) { 919 if (priv->tx_ring[i].tx_info) 920 mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); 921 if (priv->tx_cq[i].buf) 922 mlx4_en_destroy_cq(priv, &priv->tx_cq[i], reserve_vectors); 923 } 924 925 for (i = 0; i < priv->rx_ring_num; i++) { 926 if (priv->rx_ring[i].rx_info) 927 mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i]); 928 if (priv->rx_cq[i].buf) 929 mlx4_en_destroy_cq(priv, &priv->rx_cq[i], reserve_vectors); 930 } 931} 932 933int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) 934{ 935 struct mlx4_en_port_profile *prof = priv->prof; 936 int i; 937 int base_tx_qpn, err; 938 939 err = mlx4_qp_reserve_range(priv->mdev->dev, priv->tx_ring_num, 256, &base_tx_qpn); 940 if (err) { 941 en_err(priv, "failed reserving range for TX rings\n"); 942 return err; 943 } 944 945 /* Create tx Rings */ 946 for (i = 0; i < priv->tx_ring_num; i++) { 947 if (mlx4_en_create_cq(priv, &priv->tx_cq[i], 948 prof->tx_ring_size, i, TX)) 949 goto err; 950 951 if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i], base_tx_qpn + i, 952 prof->tx_ring_size, TXBB_SIZE)) 953 goto err; 954 } 955 956 /* Create rx Rings */ 957 for (i = 0; i < priv->rx_ring_num; i++) { 958 if (mlx4_en_create_cq(priv, &priv->rx_cq[i], 959 prof->rx_ring_size, i, RX)) 960 goto err; 961 962 if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i], 963 prof->rx_ring_size, priv->stride)) 964 goto err; 965 } 966 967 return 0; 968 969err: 970 en_err(priv, "Failed to allocate NIC resources\n"); 971 mlx4_qp_release_range(priv->mdev->dev, base_tx_qpn, priv->tx_ring_num); 972 return -ENOMEM; 973} 974 975 976void mlx4_en_destroy_netdev(struct net_device *dev) 977{ 978 struct mlx4_en_priv *priv = netdev_priv(dev); 979 struct mlx4_en_dev *mdev = priv->mdev; 980 981 en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); 982 983 /* Unregister device - this will close the port if it was up */ 984 if (priv->registered) 985 unregister_netdev(dev); 986 987 if (priv->allocated) 988 mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE); 989 990 cancel_delayed_work(&priv->stats_task); 991 /* flush any pending task for this netdev */ 992 flush_workqueue(mdev->workqueue); 993 994 /* Detach the netdev so tasks would not attempt to access it */ 995 mutex_lock(&mdev->state_lock); 996 mdev->pndev[priv->port] = NULL; 997 mutex_unlock(&mdev->state_lock); 998 999 mlx4_en_free_resources(priv, false); 1000 free_netdev(dev); 1001} 1002 1003static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) 1004{ 1005 struct mlx4_en_priv *priv = netdev_priv(dev); 1006 struct mlx4_en_dev *mdev = priv->mdev; 1007 int err = 0; 1008 1009 en_dbg(DRV, priv, "Change MTU called - current:%d new:%d\n", 1010 dev->mtu, new_mtu); 1011 1012 if ((new_mtu < MLX4_EN_MIN_MTU) || (new_mtu > priv->max_mtu)) { 1013 en_err(priv, "Bad MTU size:%d.\n", new_mtu); 1014 return -EPERM; 1015 } 1016 dev->mtu = new_mtu; 1017 1018 if (netif_running(dev)) { 1019 mutex_lock(&mdev->state_lock); 1020 if (!mdev->device_up) { 1021 /* NIC is probably restarting - let watchdog task reset 1022 * the port */ 1023 en_dbg(DRV, priv, "Change MTU called with card down!?\n"); 1024 } else { 1025 mlx4_en_stop_port(dev); 1026 err = mlx4_en_start_port(dev); 1027 if (err) { 1028 en_err(priv, "Failed restarting port:%d\n", 1029 priv->port); 1030 queue_work(mdev->workqueue, &priv->watchdog_task); 1031 } 1032 } 1033 mutex_unlock(&mdev->state_lock); 1034 } 1035 return 0; 1036} 1037 1038static const struct net_device_ops mlx4_netdev_ops = { 1039 .ndo_open = mlx4_en_open, 1040 .ndo_stop = mlx4_en_close, 1041 .ndo_start_xmit = mlx4_en_xmit, 1042 .ndo_select_queue = mlx4_en_select_queue, 1043 .ndo_get_stats = mlx4_en_get_stats, 1044 .ndo_set_multicast_list = mlx4_en_set_multicast, 1045 .ndo_set_mac_address = mlx4_en_set_mac, 1046 .ndo_validate_addr = eth_validate_addr, 1047 .ndo_change_mtu = mlx4_en_change_mtu, 1048 .ndo_tx_timeout = mlx4_en_tx_timeout, 1049 .ndo_vlan_rx_register = mlx4_en_vlan_rx_register, 1050 .ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid, 1051 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid, 1052#ifdef CONFIG_NET_POLL_CONTROLLER 1053 .ndo_poll_controller = mlx4_en_netpoll, 1054#endif 1055}; 1056 1057int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 1058 struct mlx4_en_port_profile *prof) 1059{ 1060 struct net_device *dev; 1061 struct mlx4_en_priv *priv; 1062 int i; 1063 int err; 1064 1065 dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv), 1066 prof->tx_ring_num, prof->rx_ring_num); 1067 if (dev == NULL) { 1068 mlx4_err(mdev, "Net device allocation failed\n"); 1069 return -ENOMEM; 1070 } 1071 1072 SET_NETDEV_DEV(dev, &mdev->dev->pdev->dev); 1073 dev->dev_id = port - 1; 1074 1075 /* 1076 * Initialize driver private data 1077 */ 1078 1079 priv = netdev_priv(dev); 1080 memset(priv, 0, sizeof(struct mlx4_en_priv)); 1081 priv->dev = dev; 1082 priv->mdev = mdev; 1083 priv->prof = prof; 1084 priv->port = port; 1085 priv->port_up = false; 1086 priv->rx_csum = 1; 1087 priv->flags = prof->flags; 1088 priv->tx_ring_num = prof->tx_ring_num; 1089 priv->rx_ring_num = prof->rx_ring_num; 1090 priv->mac_index = -1; 1091 priv->msg_enable = MLX4_EN_MSG_LEVEL; 1092 spin_lock_init(&priv->stats_lock); 1093 INIT_WORK(&priv->mcast_task, mlx4_en_do_set_multicast); 1094 INIT_WORK(&priv->mac_task, mlx4_en_do_set_mac); 1095 INIT_WORK(&priv->watchdog_task, mlx4_en_restart); 1096 INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate); 1097 INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats); 1098 1099 /* Query for default mac and max mtu */ 1100 priv->max_mtu = mdev->dev->caps.eth_mtu_cap[priv->port]; 1101 priv->mac = mdev->dev->caps.def_mac[priv->port]; 1102 if (ILLEGAL_MAC(priv->mac)) { 1103 en_err(priv, "Port: %d, invalid mac burned: 0x%llx, quiting\n", 1104 priv->port, priv->mac); 1105 err = -EINVAL; 1106 goto out; 1107 } 1108 1109 priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) + 1110 DS_SIZE * MLX4_EN_MAX_RX_FRAGS); 1111 err = mlx4_en_alloc_resources(priv); 1112 if (err) 1113 goto out; 1114 1115 /* Allocate page for receive rings */ 1116 err = mlx4_alloc_hwq_res(mdev->dev, &priv->res, 1117 MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE); 1118 if (err) { 1119 en_err(priv, "Failed to allocate page for rx qps\n"); 1120 goto out; 1121 } 1122 priv->allocated = 1; 1123 1124 /* 1125 * Initialize netdev entry points 1126 */ 1127 dev->netdev_ops = &mlx4_netdev_ops; 1128 dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT; 1129 netif_set_real_num_tx_queues(dev, priv->tx_ring_num); 1130 netif_set_real_num_rx_queues(dev, priv->rx_ring_num); 1131 1132 SET_ETHTOOL_OPS(dev, &mlx4_en_ethtool_ops); 1133 1134 /* Set defualt MAC */ 1135 dev->addr_len = ETH_ALEN; 1136 for (i = 0; i < ETH_ALEN; i++) { 1137 dev->dev_addr[ETH_ALEN - 1 - i] = (u8) (priv->mac >> (8 * i)); 1138 dev->perm_addr[ETH_ALEN - 1 - i] = (u8) (priv->mac >> (8 * i)); 1139 } 1140 1141 /* 1142 * Set driver features 1143 */ 1144 dev->features |= NETIF_F_SG; 1145 dev->vlan_features |= NETIF_F_SG; 1146 dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1147 dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1148 dev->features |= NETIF_F_HIGHDMA; 1149 dev->features |= NETIF_F_HW_VLAN_TX | 1150 NETIF_F_HW_VLAN_RX | 1151 NETIF_F_HW_VLAN_FILTER; 1152 dev->features |= NETIF_F_GRO; 1153 if (mdev->LSO_support) { 1154 dev->features |= NETIF_F_TSO; 1155 dev->features |= NETIF_F_TSO6; 1156 dev->vlan_features |= NETIF_F_TSO; 1157 dev->vlan_features |= NETIF_F_TSO6; 1158 } 1159 1160 mdev->pndev[port] = dev; 1161 1162 netif_carrier_off(dev); 1163 err = register_netdev(dev); 1164 if (err) { 1165 en_err(priv, "Netdev registration failed for port %d\n", port); 1166 goto out; 1167 } 1168 1169 en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num); 1170 en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num); 1171 1172 /* Configure port */ 1173 err = mlx4_SET_PORT_general(mdev->dev, priv->port, 1174 MLX4_EN_MIN_MTU, 1175 0, 0, 0, 0); 1176 if (err) { 1177 en_err(priv, "Failed setting port general configurations " 1178 "for port %d, with error %d\n", priv->port, err); 1179 goto out; 1180 } 1181 1182 /* Init port */ 1183 en_warn(priv, "Initializing port\n"); 1184 err = mlx4_INIT_PORT(mdev->dev, priv->port); 1185 if (err) { 1186 en_err(priv, "Failed Initializing port\n"); 1187 goto out; 1188 } 1189 priv->registered = 1; 1190 mlx4_en_set_default_moderation(priv); 1191 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); 1192 return 0; 1193 1194out: 1195 mlx4_en_destroy_netdev(dev); 1196 return err; 1197} 1198