6742 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/**************************************************************************/3/* */4/* IBM System i and System p Virtual NIC Device Driver */5/* Copyright (C) 2014 IBM Corp. */6/* Santiago Leon (santi_leon@yahoo.com) */7/* Thomas Falcon (tlfalcon@linux.vnet.ibm.com) */8/* John Allen (jallen@linux.vnet.ibm.com) */9/* */10/* */11/* This module contains the implementation of a virtual ethernet device */12/* for use with IBM i/p Series LPAR Linux. It utilizes the logical LAN */13/* option of the RS/6000 Platform Architecture to interface with virtual */14/* ethernet NICs that are presented to the partition by the hypervisor. */15/* */16/* Messages are passed between the VNIC driver and the VNIC server using */17/* Command/Response Queues (CRQs) and sub CRQs (sCRQs). CRQs are used to */18/* issue and receive commands that initiate communication with the server */19/* on driver initialization. Sub CRQs (sCRQs) are similar to CRQs, but */20/* are used by the driver to notify the server that a packet is */21/* ready for transmission or that a buffer has been added to receive a */22/* packet. Subsequently, sCRQs are used by the server to notify the */23/* driver that a packet transmission has been completed or that a packet */24/* has been received and placed in a waiting buffer. */25/* */26/* In lieu of a more conventional "on-the-fly" DMA mapping strategy in */27/* which skbs are DMA mapped and immediately unmapped when the transmit */28/* or receive has been completed, the VNIC driver is required to use */29/* "long term mapping". This entails that large, continuous DMA mapped */30/* buffers are allocated on driver initialization and these buffers are */31/* then continuously reused to pass skbs to and from the VNIC server. */32/* */33/**************************************************************************/34 35#include <linux/module.h>36#include <linux/moduleparam.h>37#include <linux/types.h>38#include <linux/errno.h>39#include <linux/completion.h>40#include <linux/ioport.h>41#include <linux/dma-mapping.h>42#include <linux/kernel.h>43#include <linux/netdevice.h>44#include <linux/etherdevice.h>45#include <linux/skbuff.h>46#include <linux/init.h>47#include <linux/delay.h>48#include <linux/mm.h>49#include <linux/ethtool.h>50#include <linux/proc_fs.h>51#include <linux/if_arp.h>52#include <linux/in.h>53#include <linux/ip.h>54#include <linux/ipv6.h>55#include <linux/irq.h>56#include <linux/irqdomain.h>57#include <linux/kthread.h>58#include <linux/seq_file.h>59#include <linux/interrupt.h>60#include <net/net_namespace.h>61#include <asm/hvcall.h>62#include <linux/atomic.h>63#include <asm/vio.h>64#include <asm/xive.h>65#include <asm/iommu.h>66#include <linux/uaccess.h>67#include <asm/firmware.h>68#include <linux/workqueue.h>69#include <linux/if_vlan.h>70#include <linux/utsname.h>71#include <linux/cpu.h>72 73#include "ibmvnic.h"74 75static const char ibmvnic_driver_name[] = "ibmvnic";76static const char ibmvnic_driver_string[] = "IBM System i/p Virtual NIC Driver";77 78MODULE_AUTHOR("Santiago Leon");79MODULE_DESCRIPTION("IBM System i/p Virtual NIC Driver");80MODULE_LICENSE("GPL");81MODULE_VERSION(IBMVNIC_DRIVER_VERSION);82 83static int ibmvnic_version = IBMVNIC_INITIAL_VERSION;84static void release_sub_crqs(struct ibmvnic_adapter *, bool);85static int ibmvnic_reset_crq(struct ibmvnic_adapter *);86static int ibmvnic_send_crq_init(struct ibmvnic_adapter *);87static int ibmvnic_reenable_crq_queue(struct ibmvnic_adapter *);88static int ibmvnic_send_crq(struct ibmvnic_adapter *, union ibmvnic_crq *);89static int send_subcrq_indirect(struct ibmvnic_adapter *, u64, u64, u64);90static irqreturn_t ibmvnic_interrupt_rx(int irq, void *instance);91static int enable_scrq_irq(struct ibmvnic_adapter *,92 struct ibmvnic_sub_crq_queue *);93static int disable_scrq_irq(struct ibmvnic_adapter *,94 struct ibmvnic_sub_crq_queue *);95static int pending_scrq(struct ibmvnic_adapter *,96 struct ibmvnic_sub_crq_queue *);97static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *,98 struct ibmvnic_sub_crq_queue *);99static int ibmvnic_poll(struct napi_struct *napi, int data);100static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter);101static inline void reinit_init_done(struct ibmvnic_adapter *adapter);102static void send_query_map(struct ibmvnic_adapter *adapter);103static int send_request_map(struct ibmvnic_adapter *, dma_addr_t, u32, u8);104static int send_request_unmap(struct ibmvnic_adapter *, u8);105static int send_login(struct ibmvnic_adapter *adapter);106static void send_query_cap(struct ibmvnic_adapter *adapter);107static int init_sub_crqs(struct ibmvnic_adapter *);108static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter);109static int ibmvnic_reset_init(struct ibmvnic_adapter *, bool reset);110static void release_crq_queue(struct ibmvnic_adapter *);111static int __ibmvnic_set_mac(struct net_device *, u8 *);112static int init_crq_queue(struct ibmvnic_adapter *adapter);113static int send_query_phys_parms(struct ibmvnic_adapter *adapter);114static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,115 struct ibmvnic_sub_crq_queue *tx_scrq);116static void free_long_term_buff(struct ibmvnic_adapter *adapter,117 struct ibmvnic_long_term_buff *ltb);118static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter);119static void flush_reset_queue(struct ibmvnic_adapter *adapter);120static void print_subcrq_error(struct device *dev, int rc, const char *func);121 122struct ibmvnic_stat {123 char name[ETH_GSTRING_LEN];124 int offset;125};126 127#define IBMVNIC_STAT_OFF(stat) (offsetof(struct ibmvnic_adapter, stats) + \128 offsetof(struct ibmvnic_statistics, stat))129#define IBMVNIC_GET_STAT(a, off) (*((u64 *)(((unsigned long)(a)) + (off))))130 131static const struct ibmvnic_stat ibmvnic_stats[] = {132 {"rx_packets", IBMVNIC_STAT_OFF(rx_packets)},133 {"rx_bytes", IBMVNIC_STAT_OFF(rx_bytes)},134 {"tx_packets", IBMVNIC_STAT_OFF(tx_packets)},135 {"tx_bytes", IBMVNIC_STAT_OFF(tx_bytes)},136 {"ucast_tx_packets", IBMVNIC_STAT_OFF(ucast_tx_packets)},137 {"ucast_rx_packets", IBMVNIC_STAT_OFF(ucast_rx_packets)},138 {"mcast_tx_packets", IBMVNIC_STAT_OFF(mcast_tx_packets)},139 {"mcast_rx_packets", IBMVNIC_STAT_OFF(mcast_rx_packets)},140 {"bcast_tx_packets", IBMVNIC_STAT_OFF(bcast_tx_packets)},141 {"bcast_rx_packets", IBMVNIC_STAT_OFF(bcast_rx_packets)},142 {"align_errors", IBMVNIC_STAT_OFF(align_errors)},143 {"fcs_errors", IBMVNIC_STAT_OFF(fcs_errors)},144 {"single_collision_frames", IBMVNIC_STAT_OFF(single_collision_frames)},145 {"multi_collision_frames", IBMVNIC_STAT_OFF(multi_collision_frames)},146 {"sqe_test_errors", IBMVNIC_STAT_OFF(sqe_test_errors)},147 {"deferred_tx", IBMVNIC_STAT_OFF(deferred_tx)},148 {"late_collisions", IBMVNIC_STAT_OFF(late_collisions)},149 {"excess_collisions", IBMVNIC_STAT_OFF(excess_collisions)},150 {"internal_mac_tx_errors", IBMVNIC_STAT_OFF(internal_mac_tx_errors)},151 {"carrier_sense", IBMVNIC_STAT_OFF(carrier_sense)},152 {"too_long_frames", IBMVNIC_STAT_OFF(too_long_frames)},153 {"internal_mac_rx_errors", IBMVNIC_STAT_OFF(internal_mac_rx_errors)},154};155 156static int send_crq_init_complete(struct ibmvnic_adapter *adapter)157{158 union ibmvnic_crq crq;159 160 memset(&crq, 0, sizeof(crq));161 crq.generic.first = IBMVNIC_CRQ_INIT_CMD;162 crq.generic.cmd = IBMVNIC_CRQ_INIT_COMPLETE;163 164 return ibmvnic_send_crq(adapter, &crq);165}166 167static int send_version_xchg(struct ibmvnic_adapter *adapter)168{169 union ibmvnic_crq crq;170 171 memset(&crq, 0, sizeof(crq));172 crq.version_exchange.first = IBMVNIC_CRQ_CMD;173 crq.version_exchange.cmd = VERSION_EXCHANGE;174 crq.version_exchange.version = cpu_to_be16(ibmvnic_version);175 176 return ibmvnic_send_crq(adapter, &crq);177}178 179static void ibmvnic_clean_queue_affinity(struct ibmvnic_adapter *adapter,180 struct ibmvnic_sub_crq_queue *queue)181{182 if (!(queue && queue->irq))183 return;184 185 cpumask_clear(queue->affinity_mask);186 187 if (irq_set_affinity_and_hint(queue->irq, NULL))188 netdev_warn(adapter->netdev,189 "%s: Clear affinity failed, queue addr = %p, IRQ = %d\n",190 __func__, queue, queue->irq);191}192 193static void ibmvnic_clean_affinity(struct ibmvnic_adapter *adapter)194{195 struct ibmvnic_sub_crq_queue **rxqs;196 struct ibmvnic_sub_crq_queue **txqs;197 int num_rxqs, num_txqs;198 int i;199 200 rxqs = adapter->rx_scrq;201 txqs = adapter->tx_scrq;202 num_txqs = adapter->num_active_tx_scrqs;203 num_rxqs = adapter->num_active_rx_scrqs;204 205 netdev_dbg(adapter->netdev, "%s: Cleaning irq affinity hints", __func__);206 if (txqs) {207 for (i = 0; i < num_txqs; i++)208 ibmvnic_clean_queue_affinity(adapter, txqs[i]);209 }210 if (rxqs) {211 for (i = 0; i < num_rxqs; i++)212 ibmvnic_clean_queue_affinity(adapter, rxqs[i]);213 }214}215 216static int ibmvnic_set_queue_affinity(struct ibmvnic_sub_crq_queue *queue,217 unsigned int *cpu, int *stragglers,218 int stride)219{220 cpumask_var_t mask;221 int i;222 int rc = 0;223 224 if (!(queue && queue->irq))225 return rc;226 227 /* cpumask_var_t is either a pointer or array, allocation works here */228 if (!zalloc_cpumask_var(&mask, GFP_KERNEL))229 return -ENOMEM;230 231 /* while we have extra cpu give one extra to this irq */232 if (*stragglers) {233 stride++;234 (*stragglers)--;235 }236 /* atomic write is safer than writing bit by bit directly */237 for (i = 0; i < stride; i++) {238 cpumask_set_cpu(*cpu, mask);239 *cpu = cpumask_next_wrap(*cpu, cpu_online_mask,240 nr_cpu_ids, false);241 }242 /* set queue affinity mask */243 cpumask_copy(queue->affinity_mask, mask);244 rc = irq_set_affinity_and_hint(queue->irq, queue->affinity_mask);245 free_cpumask_var(mask);246 247 return rc;248}249 250/* assumes cpu read lock is held */251static void ibmvnic_set_affinity(struct ibmvnic_adapter *adapter)252{253 struct ibmvnic_sub_crq_queue **rxqs = adapter->rx_scrq;254 struct ibmvnic_sub_crq_queue **txqs = adapter->tx_scrq;255 struct ibmvnic_sub_crq_queue *queue;256 int num_rxqs = adapter->num_active_rx_scrqs, i_rxqs = 0;257 int num_txqs = adapter->num_active_tx_scrqs, i_txqs = 0;258 int total_queues, stride, stragglers, i;259 unsigned int num_cpu, cpu;260 bool is_rx_queue;261 int rc = 0;262 263 netdev_dbg(adapter->netdev, "%s: Setting irq affinity hints", __func__);264 if (!(adapter->rx_scrq && adapter->tx_scrq)) {265 netdev_warn(adapter->netdev,266 "%s: Set affinity failed, queues not allocated\n",267 __func__);268 return;269 }270 271 total_queues = num_rxqs + num_txqs;272 num_cpu = num_online_cpus();273 /* number of cpu's assigned per irq */274 stride = max_t(int, num_cpu / total_queues, 1);275 /* number of leftover cpu's */276 stragglers = num_cpu >= total_queues ? num_cpu % total_queues : 0;277 /* next available cpu to assign irq to */278 cpu = cpumask_next(-1, cpu_online_mask);279 280 for (i = 0; i < total_queues; i++) {281 is_rx_queue = false;282 /* balance core load by alternating rx and tx assignments283 * ex: TX0 -> RX0 -> TX1 -> RX1 etc.284 */285 if ((i % 2 == 1 && i_rxqs < num_rxqs) || i_txqs == num_txqs) {286 queue = rxqs[i_rxqs++];287 is_rx_queue = true;288 } else {289 queue = txqs[i_txqs++];290 }291 292 rc = ibmvnic_set_queue_affinity(queue, &cpu, &stragglers,293 stride);294 if (rc)295 goto out;296 297 if (!queue || is_rx_queue)298 continue;299 300 rc = __netif_set_xps_queue(adapter->netdev,301 cpumask_bits(queue->affinity_mask),302 i_txqs - 1, XPS_CPUS);303 if (rc)304 netdev_warn(adapter->netdev, "%s: Set XPS on queue %d failed, rc = %d.\n",305 __func__, i_txqs - 1, rc);306 }307 308out:309 if (rc) {310 netdev_warn(adapter->netdev,311 "%s: Set affinity failed, queue addr = %p, IRQ = %d, rc = %d.\n",312 __func__, queue, queue->irq, rc);313 ibmvnic_clean_affinity(adapter);314 }315}316 317static int ibmvnic_cpu_online(unsigned int cpu, struct hlist_node *node)318{319 struct ibmvnic_adapter *adapter;320 321 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node);322 ibmvnic_set_affinity(adapter);323 return 0;324}325 326static int ibmvnic_cpu_dead(unsigned int cpu, struct hlist_node *node)327{328 struct ibmvnic_adapter *adapter;329 330 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node_dead);331 ibmvnic_set_affinity(adapter);332 return 0;333}334 335static int ibmvnic_cpu_down_prep(unsigned int cpu, struct hlist_node *node)336{337 struct ibmvnic_adapter *adapter;338 339 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node);340 ibmvnic_clean_affinity(adapter);341 return 0;342}343 344static enum cpuhp_state ibmvnic_online;345 346static int ibmvnic_cpu_notif_add(struct ibmvnic_adapter *adapter)347{348 int ret;349 350 ret = cpuhp_state_add_instance_nocalls(ibmvnic_online, &adapter->node);351 if (ret)352 return ret;353 ret = cpuhp_state_add_instance_nocalls(CPUHP_IBMVNIC_DEAD,354 &adapter->node_dead);355 if (!ret)356 return ret;357 cpuhp_state_remove_instance_nocalls(ibmvnic_online, &adapter->node);358 return ret;359}360 361static void ibmvnic_cpu_notif_remove(struct ibmvnic_adapter *adapter)362{363 cpuhp_state_remove_instance_nocalls(ibmvnic_online, &adapter->node);364 cpuhp_state_remove_instance_nocalls(CPUHP_IBMVNIC_DEAD,365 &adapter->node_dead);366}367 368static long h_reg_sub_crq(unsigned long unit_address, unsigned long token,369 unsigned long length, unsigned long *number,370 unsigned long *irq)371{372 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];373 long rc;374 375 rc = plpar_hcall(H_REG_SUB_CRQ, retbuf, unit_address, token, length);376 *number = retbuf[0];377 *irq = retbuf[1];378 379 return rc;380}381 382/**383 * ibmvnic_wait_for_completion - Check device state and wait for completion384 * @adapter: private device data385 * @comp_done: completion structure to wait for386 * @timeout: time to wait in milliseconds387 *388 * Wait for a completion signal or until the timeout limit is reached389 * while checking that the device is still active.390 */391static int ibmvnic_wait_for_completion(struct ibmvnic_adapter *adapter,392 struct completion *comp_done,393 unsigned long timeout)394{395 struct net_device *netdev;396 unsigned long div_timeout;397 u8 retry;398 399 netdev = adapter->netdev;400 retry = 5;401 div_timeout = msecs_to_jiffies(timeout / retry);402 while (true) {403 if (!adapter->crq.active) {404 netdev_err(netdev, "Device down!\n");405 return -ENODEV;406 }407 if (!retry--)408 break;409 if (wait_for_completion_timeout(comp_done, div_timeout))410 return 0;411 }412 netdev_err(netdev, "Operation timed out.\n");413 return -ETIMEDOUT;414}415 416/**417 * reuse_ltb() - Check if a long term buffer can be reused418 * @ltb: The long term buffer to be checked419 * @size: The size of the long term buffer.420 *421 * An LTB can be reused unless its size has changed.422 *423 * Return: Return true if the LTB can be reused, false otherwise.424 */425static bool reuse_ltb(struct ibmvnic_long_term_buff *ltb, int size)426{427 return (ltb->buff && ltb->size == size);428}429 430/**431 * alloc_long_term_buff() - Allocate a long term buffer (LTB)432 *433 * @adapter: ibmvnic adapter associated to the LTB434 * @ltb: container object for the LTB435 * @size: size of the LTB436 *437 * Allocate an LTB of the specified size and notify VIOS.438 *439 * If the given @ltb already has the correct size, reuse it. Otherwise if440 * its non-NULL, free it. Then allocate a new one of the correct size.441 * Notify the VIOS either way since we may now be working with a new VIOS.442 *443 * Allocating larger chunks of memory during resets, specially LPM or under444 * low memory situations can cause resets to fail/timeout and for LPAR to445 * lose connectivity. So hold onto the LTB even if we fail to communicate446 * with the VIOS and reuse it on next open. Free LTB when adapter is closed.447 *448 * Return: 0 if we were able to allocate the LTB and notify the VIOS and449 * a negative value otherwise.450 */451static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,452 struct ibmvnic_long_term_buff *ltb, int size)453{454 struct device *dev = &adapter->vdev->dev;455 u64 prev = 0;456 int rc;457 458 if (!reuse_ltb(ltb, size)) {459 dev_dbg(dev,460 "LTB size changed from 0x%llx to 0x%x, reallocating\n",461 ltb->size, size);462 prev = ltb->size;463 free_long_term_buff(adapter, ltb);464 }465 466 if (ltb->buff) {467 dev_dbg(dev, "Reusing LTB [map %d, size 0x%llx]\n",468 ltb->map_id, ltb->size);469 } else {470 ltb->buff = dma_alloc_coherent(dev, size, <b->addr,471 GFP_KERNEL);472 if (!ltb->buff) {473 dev_err(dev, "Couldn't alloc long term buffer\n");474 return -ENOMEM;475 }476 ltb->size = size;477 478 ltb->map_id = find_first_zero_bit(adapter->map_ids,479 MAX_MAP_ID);480 bitmap_set(adapter->map_ids, ltb->map_id, 1);481 482 dev_dbg(dev,483 "Allocated new LTB [map %d, size 0x%llx was 0x%llx]\n",484 ltb->map_id, ltb->size, prev);485 }486 487 /* Ensure ltb is zeroed - specially when reusing it. */488 memset(ltb->buff, 0, ltb->size);489 490 mutex_lock(&adapter->fw_lock);491 adapter->fw_done_rc = 0;492 reinit_completion(&adapter->fw_done);493 494 rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id);495 if (rc) {496 dev_err(dev, "send_request_map failed, rc = %d\n", rc);497 goto out;498 }499 500 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);501 if (rc) {502 dev_err(dev, "LTB map request aborted or timed out, rc = %d\n",503 rc);504 goto out;505 }506 507 if (adapter->fw_done_rc) {508 dev_err(dev, "Couldn't map LTB, rc = %d\n",509 adapter->fw_done_rc);510 rc = -EIO;511 goto out;512 }513 rc = 0;514out:515 /* don't free LTB on communication error - see function header */516 mutex_unlock(&adapter->fw_lock);517 return rc;518}519 520static void free_long_term_buff(struct ibmvnic_adapter *adapter,521 struct ibmvnic_long_term_buff *ltb)522{523 struct device *dev = &adapter->vdev->dev;524 525 if (!ltb->buff)526 return;527 528 /* VIOS automatically unmaps the long term buffer at remote529 * end for the following resets:530 * FAILOVER, MOBILITY, TIMEOUT.531 */532 if (adapter->reset_reason != VNIC_RESET_FAILOVER &&533 adapter->reset_reason != VNIC_RESET_MOBILITY &&534 adapter->reset_reason != VNIC_RESET_TIMEOUT)535 send_request_unmap(adapter, ltb->map_id);536 537 dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);538 539 ltb->buff = NULL;540 /* mark this map_id free */541 bitmap_clear(adapter->map_ids, ltb->map_id, 1);542 ltb->map_id = 0;543}544 545/**546 * free_ltb_set - free the given set of long term buffers (LTBS)547 * @adapter: The ibmvnic adapter containing this ltb set548 * @ltb_set: The ltb_set to be freed549 *550 * Free the set of LTBs in the given set.551 */552 553static void free_ltb_set(struct ibmvnic_adapter *adapter,554 struct ibmvnic_ltb_set *ltb_set)555{556 int i;557 558 for (i = 0; i < ltb_set->num_ltbs; i++)559 free_long_term_buff(adapter, <b_set->ltbs[i]);560 561 kfree(ltb_set->ltbs);562 ltb_set->ltbs = NULL;563 ltb_set->num_ltbs = 0;564}565 566/**567 * alloc_ltb_set() - Allocate a set of long term buffers (LTBs)568 *569 * @adapter: ibmvnic adapter associated to the LTB570 * @ltb_set: container object for the set of LTBs571 * @num_buffs: Number of buffers in the LTB572 * @buff_size: Size of each buffer in the LTB573 *574 * Allocate a set of LTBs to accommodate @num_buffs buffers of @buff_size575 * each. We currently cap size each LTB to IBMVNIC_ONE_LTB_SIZE. If the576 * new set of LTBs have fewer LTBs than the old set, free the excess LTBs.577 * If new set needs more than in old set, allocate the remaining ones.578 * Try and reuse as many LTBs as possible and avoid reallocation.579 *580 * Any changes to this allocation strategy must be reflected in581 * map_rxpool_buff_to_ltb() and map_txpool_buff_to_ltb().582 */583static int alloc_ltb_set(struct ibmvnic_adapter *adapter,584 struct ibmvnic_ltb_set *ltb_set, int num_buffs,585 int buff_size)586{587 struct device *dev = &adapter->vdev->dev;588 struct ibmvnic_ltb_set old_set;589 struct ibmvnic_ltb_set new_set;590 int rem_size;591 int tot_size; /* size of all ltbs */592 int ltb_size; /* size of one ltb */593 int nltbs;594 int rc;595 int n;596 int i;597 598 dev_dbg(dev, "%s() num_buffs %d, buff_size %d\n", __func__, num_buffs,599 buff_size);600 601 ltb_size = rounddown(IBMVNIC_ONE_LTB_SIZE, buff_size);602 tot_size = num_buffs * buff_size;603 604 if (ltb_size > tot_size)605 ltb_size = tot_size;606 607 nltbs = tot_size / ltb_size;608 if (tot_size % ltb_size)609 nltbs++;610 611 old_set = *ltb_set;612 613 if (old_set.num_ltbs == nltbs) {614 new_set = old_set;615 } else {616 int tmp = nltbs * sizeof(struct ibmvnic_long_term_buff);617 618 new_set.ltbs = kzalloc(tmp, GFP_KERNEL);619 if (!new_set.ltbs)620 return -ENOMEM;621 622 new_set.num_ltbs = nltbs;623 624 /* Free any excess ltbs in old set */625 for (i = new_set.num_ltbs; i < old_set.num_ltbs; i++)626 free_long_term_buff(adapter, &old_set.ltbs[i]);627 628 /* Copy remaining ltbs to new set. All LTBs except the629 * last one are of the same size. alloc_long_term_buff()630 * will realloc if the size changes.631 */632 n = min(old_set.num_ltbs, new_set.num_ltbs);633 for (i = 0; i < n; i++)634 new_set.ltbs[i] = old_set.ltbs[i];635 636 /* Any additional ltbs in new set will have NULL ltbs for637 * now and will be allocated in alloc_long_term_buff().638 */639 640 /* We no longer need the old_set so free it. Note that we641 * may have reused some ltbs from old set and freed excess642 * ltbs above. So we only need to free the container now643 * not the LTBs themselves. (i.e. dont free_ltb_set()!)644 */645 kfree(old_set.ltbs);646 old_set.ltbs = NULL;647 old_set.num_ltbs = 0;648 649 /* Install the new set. If allocations fail below, we will650 * retry later and know what size LTBs we need.651 */652 *ltb_set = new_set;653 }654 655 i = 0;656 rem_size = tot_size;657 while (rem_size) {658 if (ltb_size > rem_size)659 ltb_size = rem_size;660 661 rem_size -= ltb_size;662 663 rc = alloc_long_term_buff(adapter, &new_set.ltbs[i], ltb_size);664 if (rc)665 goto out;666 i++;667 }668 669 WARN_ON(i != new_set.num_ltbs);670 671 return 0;672out:673 /* We may have allocated one/more LTBs before failing and we674 * want to try and reuse on next reset. So don't free ltb set.675 */676 return rc;677}678 679/**680 * map_rxpool_buf_to_ltb - Map given rxpool buffer to offset in an LTB.681 * @rxpool: The receive buffer pool containing buffer682 * @bufidx: Index of buffer in rxpool683 * @ltbp: (Output) pointer to the long term buffer containing the buffer684 * @offset: (Output) offset of buffer in the LTB from @ltbp685 *686 * Map the given buffer identified by [rxpool, bufidx] to an LTB in the687 * pool and its corresponding offset. Assume for now that each LTB is of688 * different size but could possibly be optimized based on the allocation689 * strategy in alloc_ltb_set().690 */691static void map_rxpool_buf_to_ltb(struct ibmvnic_rx_pool *rxpool,692 unsigned int bufidx,693 struct ibmvnic_long_term_buff **ltbp,694 unsigned int *offset)695{696 struct ibmvnic_long_term_buff *ltb;697 int nbufs; /* # of buffers in one ltb */698 int i;699 700 WARN_ON(bufidx >= rxpool->size);701 702 for (i = 0; i < rxpool->ltb_set.num_ltbs; i++) {703 ltb = &rxpool->ltb_set.ltbs[i];704 nbufs = ltb->size / rxpool->buff_size;705 if (bufidx < nbufs)706 break;707 bufidx -= nbufs;708 }709 710 *ltbp = ltb;711 *offset = bufidx * rxpool->buff_size;712}713 714/**715 * map_txpool_buf_to_ltb - Map given txpool buffer to offset in an LTB.716 * @txpool: The transmit buffer pool containing buffer717 * @bufidx: Index of buffer in txpool718 * @ltbp: (Output) pointer to the long term buffer (LTB) containing the buffer719 * @offset: (Output) offset of buffer in the LTB from @ltbp720 *721 * Map the given buffer identified by [txpool, bufidx] to an LTB in the722 * pool and its corresponding offset.723 */724static void map_txpool_buf_to_ltb(struct ibmvnic_tx_pool *txpool,725 unsigned int bufidx,726 struct ibmvnic_long_term_buff **ltbp,727 unsigned int *offset)728{729 struct ibmvnic_long_term_buff *ltb;730 int nbufs; /* # of buffers in one ltb */731 int i;732 733 WARN_ON_ONCE(bufidx >= txpool->num_buffers);734 735 for (i = 0; i < txpool->ltb_set.num_ltbs; i++) {736 ltb = &txpool->ltb_set.ltbs[i];737 nbufs = ltb->size / txpool->buf_size;738 if (bufidx < nbufs)739 break;740 bufidx -= nbufs;741 }742 743 *ltbp = ltb;744 *offset = bufidx * txpool->buf_size;745}746 747static void deactivate_rx_pools(struct ibmvnic_adapter *adapter)748{749 int i;750 751 for (i = 0; i < adapter->num_active_rx_pools; i++)752 adapter->rx_pool[i].active = 0;753}754 755static void replenish_rx_pool(struct ibmvnic_adapter *adapter,756 struct ibmvnic_rx_pool *pool)757{758 int count = pool->size - atomic_read(&pool->available);759 u64 handle = adapter->rx_scrq[pool->index]->handle;760 struct device *dev = &adapter->vdev->dev;761 struct ibmvnic_ind_xmit_queue *ind_bufp;762 struct ibmvnic_sub_crq_queue *rx_scrq;763 struct ibmvnic_long_term_buff *ltb;764 union sub_crq *sub_crq;765 int buffers_added = 0;766 unsigned long lpar_rc;767 struct sk_buff *skb;768 unsigned int offset;769 dma_addr_t dma_addr;770 unsigned char *dst;771 int shift = 0;772 int bufidx;773 int i;774 775 if (!pool->active)776 return;777 778 rx_scrq = adapter->rx_scrq[pool->index];779 ind_bufp = &rx_scrq->ind_buf;780 781 /* netdev_skb_alloc() could have failed after we saved a few skbs782 * in the indir_buf and we would not have sent them to VIOS yet.783 * To account for them, start the loop at ind_bufp->index rather784 * than 0. If we pushed all the skbs to VIOS, ind_bufp->index will785 * be 0.786 */787 for (i = ind_bufp->index; i < count; ++i) {788 bufidx = pool->free_map[pool->next_free];789 790 /* We maybe reusing the skb from earlier resets. Allocate791 * only if necessary. But since the LTB may have changed792 * during reset (see init_rx_pools()), update LTB below793 * even if reusing skb.794 */795 skb = pool->rx_buff[bufidx].skb;796 if (!skb) {797 skb = netdev_alloc_skb(adapter->netdev,798 pool->buff_size);799 if (!skb) {800 dev_err(dev, "Couldn't replenish rx buff\n");801 adapter->replenish_no_mem++;802 break;803 }804 }805 806 pool->free_map[pool->next_free] = IBMVNIC_INVALID_MAP;807 pool->next_free = (pool->next_free + 1) % pool->size;808 809 /* Copy the skb to the long term mapped DMA buffer */810 map_rxpool_buf_to_ltb(pool, bufidx, <b, &offset);811 dst = ltb->buff + offset;812 memset(dst, 0, pool->buff_size);813 dma_addr = ltb->addr + offset;814 815 /* add the skb to an rx_buff in the pool */816 pool->rx_buff[bufidx].data = dst;817 pool->rx_buff[bufidx].dma = dma_addr;818 pool->rx_buff[bufidx].skb = skb;819 pool->rx_buff[bufidx].pool_index = pool->index;820 pool->rx_buff[bufidx].size = pool->buff_size;821 822 /* queue the rx_buff for the next send_subcrq_indirect */823 sub_crq = &ind_bufp->indir_arr[ind_bufp->index++];824 memset(sub_crq, 0, sizeof(*sub_crq));825 sub_crq->rx_add.first = IBMVNIC_CRQ_CMD;826 sub_crq->rx_add.correlator =827 cpu_to_be64((u64)&pool->rx_buff[bufidx]);828 sub_crq->rx_add.ioba = cpu_to_be32(dma_addr);829 sub_crq->rx_add.map_id = ltb->map_id;830 831 /* The length field of the sCRQ is defined to be 24 bits so the832 * buffer size needs to be left shifted by a byte before it is833 * converted to big endian to prevent the last byte from being834 * truncated.835 */836#ifdef __LITTLE_ENDIAN__837 shift = 8;838#endif839 sub_crq->rx_add.len = cpu_to_be32(pool->buff_size << shift);840 841 /* if send_subcrq_indirect queue is full, flush to VIOS */842 if (ind_bufp->index == IBMVNIC_MAX_IND_DESCS ||843 i == count - 1) {844 lpar_rc =845 send_subcrq_indirect(adapter, handle,846 (u64)ind_bufp->indir_dma,847 (u64)ind_bufp->index);848 if (lpar_rc != H_SUCCESS)849 goto failure;850 buffers_added += ind_bufp->index;851 adapter->replenish_add_buff_success += ind_bufp->index;852 ind_bufp->index = 0;853 }854 }855 atomic_add(buffers_added, &pool->available);856 return;857 858failure:859 if (lpar_rc != H_PARAMETER && lpar_rc != H_CLOSED)860 dev_err_ratelimited(dev, "rx: replenish packet buffer failed\n");861 for (i = ind_bufp->index - 1; i >= 0; --i) {862 struct ibmvnic_rx_buff *rx_buff;863 864 pool->next_free = pool->next_free == 0 ?865 pool->size - 1 : pool->next_free - 1;866 sub_crq = &ind_bufp->indir_arr[i];867 rx_buff = (struct ibmvnic_rx_buff *)868 be64_to_cpu(sub_crq->rx_add.correlator);869 bufidx = (int)(rx_buff - pool->rx_buff);870 pool->free_map[pool->next_free] = bufidx;871 dev_kfree_skb_any(pool->rx_buff[bufidx].skb);872 pool->rx_buff[bufidx].skb = NULL;873 }874 adapter->replenish_add_buff_failure += ind_bufp->index;875 atomic_add(buffers_added, &pool->available);876 ind_bufp->index = 0;877 if (lpar_rc == H_CLOSED || adapter->failover_pending) {878 /* Disable buffer pool replenishment and report carrier off if879 * queue is closed or pending failover.880 * Firmware guarantees that a signal will be sent to the881 * driver, triggering a reset.882 */883 deactivate_rx_pools(adapter);884 netif_carrier_off(adapter->netdev);885 }886}887 888static void replenish_pools(struct ibmvnic_adapter *adapter)889{890 int i;891 892 adapter->replenish_task_cycles++;893 for (i = 0; i < adapter->num_active_rx_pools; i++) {894 if (adapter->rx_pool[i].active)895 replenish_rx_pool(adapter, &adapter->rx_pool[i]);896 }897 898 netdev_dbg(adapter->netdev, "Replenished %d pools\n", i);899}900 901static void release_stats_buffers(struct ibmvnic_adapter *adapter)902{903 kfree(adapter->tx_stats_buffers);904 kfree(adapter->rx_stats_buffers);905 adapter->tx_stats_buffers = NULL;906 adapter->rx_stats_buffers = NULL;907}908 909static int init_stats_buffers(struct ibmvnic_adapter *adapter)910{911 adapter->tx_stats_buffers =912 kcalloc(IBMVNIC_MAX_QUEUES,913 sizeof(struct ibmvnic_tx_queue_stats),914 GFP_KERNEL);915 if (!adapter->tx_stats_buffers)916 return -ENOMEM;917 918 adapter->rx_stats_buffers =919 kcalloc(IBMVNIC_MAX_QUEUES,920 sizeof(struct ibmvnic_rx_queue_stats),921 GFP_KERNEL);922 if (!adapter->rx_stats_buffers)923 return -ENOMEM;924 925 return 0;926}927 928static void release_stats_token(struct ibmvnic_adapter *adapter)929{930 struct device *dev = &adapter->vdev->dev;931 932 if (!adapter->stats_token)933 return;934 935 dma_unmap_single(dev, adapter->stats_token,936 sizeof(struct ibmvnic_statistics),937 DMA_FROM_DEVICE);938 adapter->stats_token = 0;939}940 941static int init_stats_token(struct ibmvnic_adapter *adapter)942{943 struct device *dev = &adapter->vdev->dev;944 dma_addr_t stok;945 int rc;946 947 stok = dma_map_single(dev, &adapter->stats,948 sizeof(struct ibmvnic_statistics),949 DMA_FROM_DEVICE);950 rc = dma_mapping_error(dev, stok);951 if (rc) {952 dev_err(dev, "Couldn't map stats buffer, rc = %d\n", rc);953 return rc;954 }955 956 adapter->stats_token = stok;957 netdev_dbg(adapter->netdev, "Stats token initialized (%llx)\n", stok);958 return 0;959}960 961/**962 * release_rx_pools() - Release any rx pools attached to @adapter.963 * @adapter: ibmvnic adapter964 *965 * Safe to call this multiple times - even if no pools are attached.966 */967static void release_rx_pools(struct ibmvnic_adapter *adapter)968{969 struct ibmvnic_rx_pool *rx_pool;970 int i, j;971 972 if (!adapter->rx_pool)973 return;974 975 for (i = 0; i < adapter->num_active_rx_pools; i++) {976 rx_pool = &adapter->rx_pool[i];977 978 netdev_dbg(adapter->netdev, "Releasing rx_pool[%d]\n", i);979 980 kfree(rx_pool->free_map);981 982 free_ltb_set(adapter, &rx_pool->ltb_set);983 984 if (!rx_pool->rx_buff)985 continue;986 987 for (j = 0; j < rx_pool->size; j++) {988 if (rx_pool->rx_buff[j].skb) {989 dev_kfree_skb_any(rx_pool->rx_buff[j].skb);990 rx_pool->rx_buff[j].skb = NULL;991 }992 }993 994 kfree(rx_pool->rx_buff);995 }996 997 kfree(adapter->rx_pool);998 adapter->rx_pool = NULL;999 adapter->num_active_rx_pools = 0;1000 adapter->prev_rx_pool_size = 0;1001}1002 1003/**1004 * reuse_rx_pools() - Check if the existing rx pools can be reused.1005 * @adapter: ibmvnic adapter1006 *1007 * Check if the existing rx pools in the adapter can be reused. The1008 * pools can be reused if the pool parameters (number of pools,1009 * number of buffers in the pool and size of each buffer) have not1010 * changed.1011 *1012 * NOTE: This assumes that all pools have the same number of buffers1013 * which is the case currently. If that changes, we must fix this.1014 *1015 * Return: true if the rx pools can be reused, false otherwise.1016 */1017static bool reuse_rx_pools(struct ibmvnic_adapter *adapter)1018{1019 u64 old_num_pools, new_num_pools;1020 u64 old_pool_size, new_pool_size;1021 u64 old_buff_size, new_buff_size;1022 1023 if (!adapter->rx_pool)1024 return false;1025 1026 old_num_pools = adapter->num_active_rx_pools;1027 new_num_pools = adapter->req_rx_queues;1028 1029 old_pool_size = adapter->prev_rx_pool_size;1030 new_pool_size = adapter->req_rx_add_entries_per_subcrq;1031 1032 old_buff_size = adapter->prev_rx_buf_sz;1033 new_buff_size = adapter->cur_rx_buf_sz;1034 1035 if (old_buff_size != new_buff_size ||1036 old_num_pools != new_num_pools ||1037 old_pool_size != new_pool_size)1038 return false;1039 1040 return true;1041}1042 1043/**1044 * init_rx_pools(): Initialize the set of receiver pools in the adapter.1045 * @netdev: net device associated with the vnic interface1046 *1047 * Initialize the set of receiver pools in the ibmvnic adapter associated1048 * with the net_device @netdev. If possible, reuse the existing rx pools.1049 * Otherwise free any existing pools and allocate a new set of pools1050 * before initializing them.1051 *1052 * Return: 0 on success and negative value on error.1053 */1054static int init_rx_pools(struct net_device *netdev)1055{1056 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1057 struct device *dev = &adapter->vdev->dev;1058 struct ibmvnic_rx_pool *rx_pool;1059 u64 num_pools;1060 u64 pool_size; /* # of buffers in one pool */1061 u64 buff_size;1062 int i, j, rc;1063 1064 pool_size = adapter->req_rx_add_entries_per_subcrq;1065 num_pools = adapter->req_rx_queues;1066 buff_size = adapter->cur_rx_buf_sz;1067 1068 if (reuse_rx_pools(adapter)) {1069 dev_dbg(dev, "Reusing rx pools\n");1070 goto update_ltb;1071 }1072 1073 /* Allocate/populate the pools. */1074 release_rx_pools(adapter);1075 1076 adapter->rx_pool = kcalloc(num_pools,1077 sizeof(struct ibmvnic_rx_pool),1078 GFP_KERNEL);1079 if (!adapter->rx_pool) {1080 dev_err(dev, "Failed to allocate rx pools\n");1081 return -ENOMEM;1082 }1083 1084 /* Set num_active_rx_pools early. If we fail below after partial1085 * allocation, release_rx_pools() will know how many to look for.1086 */1087 adapter->num_active_rx_pools = num_pools;1088 1089 for (i = 0; i < num_pools; i++) {1090 rx_pool = &adapter->rx_pool[i];1091 1092 netdev_dbg(adapter->netdev,1093 "Initializing rx_pool[%d], %lld buffs, %lld bytes each\n",1094 i, pool_size, buff_size);1095 1096 rx_pool->size = pool_size;1097 rx_pool->index = i;1098 rx_pool->buff_size = ALIGN(buff_size, L1_CACHE_BYTES);1099 1100 rx_pool->free_map = kcalloc(rx_pool->size, sizeof(int),1101 GFP_KERNEL);1102 if (!rx_pool->free_map) {1103 dev_err(dev, "Couldn't alloc free_map %d\n", i);1104 rc = -ENOMEM;1105 goto out_release;1106 }1107 1108 rx_pool->rx_buff = kcalloc(rx_pool->size,1109 sizeof(struct ibmvnic_rx_buff),1110 GFP_KERNEL);1111 if (!rx_pool->rx_buff) {1112 dev_err(dev, "Couldn't alloc rx buffers\n");1113 rc = -ENOMEM;1114 goto out_release;1115 }1116 }1117 1118 adapter->prev_rx_pool_size = pool_size;1119 adapter->prev_rx_buf_sz = adapter->cur_rx_buf_sz;1120 1121update_ltb:1122 for (i = 0; i < num_pools; i++) {1123 rx_pool = &adapter->rx_pool[i];1124 dev_dbg(dev, "Updating LTB for rx pool %d [%d, %d]\n",1125 i, rx_pool->size, rx_pool->buff_size);1126 1127 rc = alloc_ltb_set(adapter, &rx_pool->ltb_set,1128 rx_pool->size, rx_pool->buff_size);1129 if (rc)1130 goto out;1131 1132 for (j = 0; j < rx_pool->size; ++j) {1133 struct ibmvnic_rx_buff *rx_buff;1134 1135 rx_pool->free_map[j] = j;1136 1137 /* NOTE: Don't clear rx_buff->skb here - will leak1138 * memory! replenish_rx_pool() will reuse skbs or1139 * allocate as necessary.1140 */1141 rx_buff = &rx_pool->rx_buff[j];1142 rx_buff->dma = 0;1143 rx_buff->data = 0;1144 rx_buff->size = 0;1145 rx_buff->pool_index = 0;1146 }1147 1148 /* Mark pool "empty" so replenish_rx_pools() will1149 * update the LTB info for each buffer1150 */1151 atomic_set(&rx_pool->available, 0);1152 rx_pool->next_alloc = 0;1153 rx_pool->next_free = 0;1154 /* replenish_rx_pool() may have called deactivate_rx_pools()1155 * on failover. Ensure pool is active now.1156 */1157 rx_pool->active = 1;1158 }1159 return 0;1160out_release:1161 release_rx_pools(adapter);1162out:1163 /* We failed to allocate one or more LTBs or map them on the VIOS.1164 * Hold onto the pools and any LTBs that we did allocate/map.1165 */1166 return rc;1167}1168 1169static void release_vpd_data(struct ibmvnic_adapter *adapter)1170{1171 if (!adapter->vpd)1172 return;1173 1174 kfree(adapter->vpd->buff);1175 kfree(adapter->vpd);1176 1177 adapter->vpd = NULL;1178}1179 1180static void release_one_tx_pool(struct ibmvnic_adapter *adapter,1181 struct ibmvnic_tx_pool *tx_pool)1182{1183 kfree(tx_pool->tx_buff);1184 kfree(tx_pool->free_map);1185 free_ltb_set(adapter, &tx_pool->ltb_set);1186}1187 1188/**1189 * release_tx_pools() - Release any tx pools attached to @adapter.1190 * @adapter: ibmvnic adapter1191 *1192 * Safe to call this multiple times - even if no pools are attached.1193 */1194static void release_tx_pools(struct ibmvnic_adapter *adapter)1195{1196 int i;1197 1198 /* init_tx_pools() ensures that ->tx_pool and ->tso_pool are1199 * both NULL or both non-NULL. So we only need to check one.1200 */1201 if (!adapter->tx_pool)1202 return;1203 1204 for (i = 0; i < adapter->num_active_tx_pools; i++) {1205 release_one_tx_pool(adapter, &adapter->tx_pool[i]);1206 release_one_tx_pool(adapter, &adapter->tso_pool[i]);1207 }1208 1209 kfree(adapter->tx_pool);1210 adapter->tx_pool = NULL;1211 kfree(adapter->tso_pool);1212 adapter->tso_pool = NULL;1213 adapter->num_active_tx_pools = 0;1214 adapter->prev_tx_pool_size = 0;1215}1216 1217static int init_one_tx_pool(struct net_device *netdev,1218 struct ibmvnic_tx_pool *tx_pool,1219 int pool_size, int buf_size)1220{1221 int i;1222 1223 tx_pool->tx_buff = kcalloc(pool_size,1224 sizeof(struct ibmvnic_tx_buff),1225 GFP_KERNEL);1226 if (!tx_pool->tx_buff)1227 return -ENOMEM;1228 1229 tx_pool->free_map = kcalloc(pool_size, sizeof(int), GFP_KERNEL);1230 if (!tx_pool->free_map) {1231 kfree(tx_pool->tx_buff);1232 tx_pool->tx_buff = NULL;1233 return -ENOMEM;1234 }1235 1236 for (i = 0; i < pool_size; i++)1237 tx_pool->free_map[i] = i;1238 1239 tx_pool->consumer_index = 0;1240 tx_pool->producer_index = 0;1241 tx_pool->num_buffers = pool_size;1242 tx_pool->buf_size = buf_size;1243 1244 return 0;1245}1246 1247/**1248 * reuse_tx_pools() - Check if the existing tx pools can be reused.1249 * @adapter: ibmvnic adapter1250 *1251 * Check if the existing tx pools in the adapter can be reused. The1252 * pools can be reused if the pool parameters (number of pools,1253 * number of buffers in the pool and mtu) have not changed.1254 *1255 * NOTE: This assumes that all pools have the same number of buffers1256 * which is the case currently. If that changes, we must fix this.1257 *1258 * Return: true if the tx pools can be reused, false otherwise.1259 */1260static bool reuse_tx_pools(struct ibmvnic_adapter *adapter)1261{1262 u64 old_num_pools, new_num_pools;1263 u64 old_pool_size, new_pool_size;1264 u64 old_mtu, new_mtu;1265 1266 if (!adapter->tx_pool)1267 return false;1268 1269 old_num_pools = adapter->num_active_tx_pools;1270 new_num_pools = adapter->num_active_tx_scrqs;1271 old_pool_size = adapter->prev_tx_pool_size;1272 new_pool_size = adapter->req_tx_entries_per_subcrq;1273 old_mtu = adapter->prev_mtu;1274 new_mtu = adapter->req_mtu;1275 1276 if (old_mtu != new_mtu ||1277 old_num_pools != new_num_pools ||1278 old_pool_size != new_pool_size)1279 return false;1280 1281 return true;1282}1283 1284/**1285 * init_tx_pools(): Initialize the set of transmit pools in the adapter.1286 * @netdev: net device associated with the vnic interface1287 *1288 * Initialize the set of transmit pools in the ibmvnic adapter associated1289 * with the net_device @netdev. If possible, reuse the existing tx pools.1290 * Otherwise free any existing pools and allocate a new set of pools1291 * before initializing them.1292 *1293 * Return: 0 on success and negative value on error.1294 */1295static int init_tx_pools(struct net_device *netdev)1296{1297 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1298 struct device *dev = &adapter->vdev->dev;1299 int num_pools;1300 u64 pool_size; /* # of buffers in pool */1301 u64 buff_size;1302 int i, j, rc;1303 1304 num_pools = adapter->req_tx_queues;1305 1306 /* We must notify the VIOS about the LTB on all resets - but we only1307 * need to alloc/populate pools if either the number of buffers or1308 * size of each buffer in the pool has changed.1309 */1310 if (reuse_tx_pools(adapter)) {1311 netdev_dbg(netdev, "Reusing tx pools\n");1312 goto update_ltb;1313 }1314 1315 /* Allocate/populate the pools. */1316 release_tx_pools(adapter);1317 1318 pool_size = adapter->req_tx_entries_per_subcrq;1319 num_pools = adapter->num_active_tx_scrqs;1320 1321 adapter->tx_pool = kcalloc(num_pools,1322 sizeof(struct ibmvnic_tx_pool), GFP_KERNEL);1323 if (!adapter->tx_pool)1324 return -ENOMEM;1325 1326 adapter->tso_pool = kcalloc(num_pools,1327 sizeof(struct ibmvnic_tx_pool), GFP_KERNEL);1328 /* To simplify release_tx_pools() ensure that ->tx_pool and1329 * ->tso_pool are either both NULL or both non-NULL.1330 */1331 if (!adapter->tso_pool) {1332 kfree(adapter->tx_pool);1333 adapter->tx_pool = NULL;1334 return -ENOMEM;1335 }1336 1337 /* Set num_active_tx_pools early. If we fail below after partial1338 * allocation, release_tx_pools() will know how many to look for.1339 */1340 adapter->num_active_tx_pools = num_pools;1341 1342 buff_size = adapter->req_mtu + VLAN_HLEN;1343 buff_size = ALIGN(buff_size, L1_CACHE_BYTES);1344 1345 for (i = 0; i < num_pools; i++) {1346 dev_dbg(dev, "Init tx pool %d [%llu, %llu]\n",1347 i, adapter->req_tx_entries_per_subcrq, buff_size);1348 1349 rc = init_one_tx_pool(netdev, &adapter->tx_pool[i],1350 pool_size, buff_size);1351 if (rc)1352 goto out_release;1353 1354 rc = init_one_tx_pool(netdev, &adapter->tso_pool[i],1355 IBMVNIC_TSO_BUFS,1356 IBMVNIC_TSO_BUF_SZ);1357 if (rc)1358 goto out_release;1359 }1360 1361 adapter->prev_tx_pool_size = pool_size;1362 adapter->prev_mtu = adapter->req_mtu;1363 1364update_ltb:1365 /* NOTE: All tx_pools have the same number of buffers (which is1366 * same as pool_size). All tso_pools have IBMVNIC_TSO_BUFS1367 * buffers (see calls init_one_tx_pool() for these).1368 * For consistency, we use tx_pool->num_buffers and1369 * tso_pool->num_buffers below.1370 */1371 rc = -1;1372 for (i = 0; i < num_pools; i++) {1373 struct ibmvnic_tx_pool *tso_pool;1374 struct ibmvnic_tx_pool *tx_pool;1375 1376 tx_pool = &adapter->tx_pool[i];1377 1378 dev_dbg(dev, "Updating LTB for tx pool %d [%d, %d]\n",1379 i, tx_pool->num_buffers, tx_pool->buf_size);1380 1381 rc = alloc_ltb_set(adapter, &tx_pool->ltb_set,1382 tx_pool->num_buffers, tx_pool->buf_size);1383 if (rc)1384 goto out;1385 1386 tx_pool->consumer_index = 0;1387 tx_pool->producer_index = 0;1388 1389 for (j = 0; j < tx_pool->num_buffers; j++)1390 tx_pool->free_map[j] = j;1391 1392 tso_pool = &adapter->tso_pool[i];1393 1394 dev_dbg(dev, "Updating LTB for tso pool %d [%d, %d]\n",1395 i, tso_pool->num_buffers, tso_pool->buf_size);1396 1397 rc = alloc_ltb_set(adapter, &tso_pool->ltb_set,1398 tso_pool->num_buffers, tso_pool->buf_size);1399 if (rc)1400 goto out;1401 1402 tso_pool->consumer_index = 0;1403 tso_pool->producer_index = 0;1404 1405 for (j = 0; j < tso_pool->num_buffers; j++)1406 tso_pool->free_map[j] = j;1407 }1408 1409 return 0;1410out_release:1411 release_tx_pools(adapter);1412out:1413 /* We failed to allocate one or more LTBs or map them on the VIOS.1414 * Hold onto the pools and any LTBs that we did allocate/map.1415 */1416 return rc;1417}1418 1419static void ibmvnic_napi_enable(struct ibmvnic_adapter *adapter)1420{1421 int i;1422 1423 if (adapter->napi_enabled)1424 return;1425 1426 for (i = 0; i < adapter->req_rx_queues; i++)1427 napi_enable(&adapter->napi[i]);1428 1429 adapter->napi_enabled = true;1430}1431 1432static void ibmvnic_napi_disable(struct ibmvnic_adapter *adapter)1433{1434 int i;1435 1436 if (!adapter->napi_enabled)1437 return;1438 1439 for (i = 0; i < adapter->req_rx_queues; i++) {1440 netdev_dbg(adapter->netdev, "Disabling napi[%d]\n", i);1441 napi_disable(&adapter->napi[i]);1442 }1443 1444 adapter->napi_enabled = false;1445}1446 1447static int init_napi(struct ibmvnic_adapter *adapter)1448{1449 int i;1450 1451 adapter->napi = kcalloc(adapter->req_rx_queues,1452 sizeof(struct napi_struct), GFP_KERNEL);1453 if (!adapter->napi)1454 return -ENOMEM;1455 1456 for (i = 0; i < adapter->req_rx_queues; i++) {1457 netdev_dbg(adapter->netdev, "Adding napi[%d]\n", i);1458 netif_napi_add(adapter->netdev, &adapter->napi[i],1459 ibmvnic_poll);1460 }1461 1462 adapter->num_active_rx_napi = adapter->req_rx_queues;1463 return 0;1464}1465 1466static void release_napi(struct ibmvnic_adapter *adapter)1467{1468 int i;1469 1470 if (!adapter->napi)1471 return;1472 1473 for (i = 0; i < adapter->num_active_rx_napi; i++) {1474 netdev_dbg(adapter->netdev, "Releasing napi[%d]\n", i);1475 netif_napi_del(&adapter->napi[i]);1476 }1477 1478 kfree(adapter->napi);1479 adapter->napi = NULL;1480 adapter->num_active_rx_napi = 0;1481 adapter->napi_enabled = false;1482}1483 1484static const char *adapter_state_to_string(enum vnic_state state)1485{1486 switch (state) {1487 case VNIC_PROBING:1488 return "PROBING";1489 case VNIC_PROBED:1490 return "PROBED";1491 case VNIC_OPENING:1492 return "OPENING";1493 case VNIC_OPEN:1494 return "OPEN";1495 case VNIC_CLOSING:1496 return "CLOSING";1497 case VNIC_CLOSED:1498 return "CLOSED";1499 case VNIC_REMOVING:1500 return "REMOVING";1501 case VNIC_REMOVED:1502 return "REMOVED";1503 case VNIC_DOWN:1504 return "DOWN";1505 }1506 return "UNKNOWN";1507}1508 1509static int ibmvnic_login(struct net_device *netdev)1510{1511 unsigned long flags, timeout = msecs_to_jiffies(20000);1512 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1513 int retry_count = 0;1514 int retries = 10;1515 bool retry;1516 int rc;1517 1518 do {1519 retry = false;1520 if (retry_count > retries) {1521 netdev_warn(netdev, "Login attempts exceeded\n");1522 return -EACCES;1523 }1524 1525 adapter->init_done_rc = 0;1526 reinit_completion(&adapter->init_done);1527 rc = send_login(adapter);1528 if (rc)1529 return rc;1530 1531 if (!wait_for_completion_timeout(&adapter->init_done,1532 timeout)) {1533 netdev_warn(netdev, "Login timed out\n");1534 adapter->login_pending = false;1535 goto partial_reset;1536 }1537 1538 if (adapter->init_done_rc == ABORTED) {1539 netdev_warn(netdev, "Login aborted, retrying...\n");1540 retry = true;1541 adapter->init_done_rc = 0;1542 retry_count++;1543 /* FW or device may be busy, so1544 * wait a bit before retrying login1545 */1546 msleep(500);1547 } else if (adapter->init_done_rc == PARTIALSUCCESS) {1548 retry_count++;1549 release_sub_crqs(adapter, 1);1550 1551 retry = true;1552 netdev_dbg(netdev,1553 "Received partial success, retrying...\n");1554 adapter->init_done_rc = 0;1555 reinit_completion(&adapter->init_done);1556 send_query_cap(adapter);1557 if (!wait_for_completion_timeout(&adapter->init_done,1558 timeout)) {1559 netdev_warn(netdev,1560 "Capabilities query timed out\n");1561 return -ETIMEDOUT;1562 }1563 1564 rc = init_sub_crqs(adapter);1565 if (rc) {1566 netdev_warn(netdev,1567 "SCRQ initialization failed\n");1568 return rc;1569 }1570 1571 rc = init_sub_crq_irqs(adapter);1572 if (rc) {1573 netdev_warn(netdev,1574 "SCRQ irq initialization failed\n");1575 return rc;1576 }1577 /* Default/timeout error handling, reset and start fresh */1578 } else if (adapter->init_done_rc) {1579 netdev_warn(netdev, "Adapter login failed, init_done_rc = %d\n",1580 adapter->init_done_rc);1581 1582partial_reset:1583 /* adapter login failed, so free any CRQs or sub-CRQs1584 * and register again before attempting to login again.1585 * If we don't do this then the VIOS may think that1586 * we are already logged in and reject any subsequent1587 * attempts1588 */1589 netdev_warn(netdev,1590 "Freeing and re-registering CRQs before attempting to login again\n");1591 retry = true;1592 adapter->init_done_rc = 0;1593 release_sub_crqs(adapter, true);1594 /* Much of this is similar logic as ibmvnic_probe(),1595 * we are essentially re-initializing communication1596 * with the server. We really should not run any1597 * resets/failovers here because this is already a form1598 * of reset and we do not want parallel resets occurring1599 */1600 do {1601 reinit_init_done(adapter);1602 /* Clear any failovers we got in the previous1603 * pass since we are re-initializing the CRQ1604 */1605 adapter->failover_pending = false;1606 release_crq_queue(adapter);1607 /* If we don't sleep here then we risk an1608 * unnecessary failover event from the VIOS.1609 * This is a known VIOS issue caused by a vnic1610 * device freeing and registering a CRQ too1611 * quickly.1612 */1613 msleep(1500);1614 /* Avoid any resets, since we are currently1615 * resetting.1616 */1617 spin_lock_irqsave(&adapter->rwi_lock, flags);1618 flush_reset_queue(adapter);1619 spin_unlock_irqrestore(&adapter->rwi_lock,1620 flags);1621 1622 rc = init_crq_queue(adapter);1623 if (rc) {1624 netdev_err(netdev, "login recovery: init CRQ failed %d\n",1625 rc);1626 return -EIO;1627 }1628 1629 rc = ibmvnic_reset_init(adapter, false);1630 if (rc)1631 netdev_err(netdev, "login recovery: Reset init failed %d\n",1632 rc);1633 /* IBMVNIC_CRQ_INIT will return EAGAIN if it1634 * fails, since ibmvnic_reset_init will free1635 * irq's in failure, we won't be able to receive1636 * new CRQs so we need to keep trying. probe()1637 * handles this similarly.1638 */1639 } while (rc == -EAGAIN && retry_count++ < retries);1640 }1641 } while (retry);1642 1643 __ibmvnic_set_mac(netdev, adapter->mac_addr);1644 1645 netdev_dbg(netdev, "[S:%s] Login succeeded\n", adapter_state_to_string(adapter->state));1646 return 0;1647}1648 1649static void release_login_buffer(struct ibmvnic_adapter *adapter)1650{1651 if (!adapter->login_buf)1652 return;1653 1654 dma_unmap_single(&adapter->vdev->dev, adapter->login_buf_token,1655 adapter->login_buf_sz, DMA_TO_DEVICE);1656 kfree(adapter->login_buf);1657 adapter->login_buf = NULL;1658}1659 1660static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter)1661{1662 if (!adapter->login_rsp_buf)1663 return;1664 1665 dma_unmap_single(&adapter->vdev->dev, adapter->login_rsp_buf_token,1666 adapter->login_rsp_buf_sz, DMA_FROM_DEVICE);1667 kfree(adapter->login_rsp_buf);1668 adapter->login_rsp_buf = NULL;1669}1670 1671static void release_resources(struct ibmvnic_adapter *adapter)1672{1673 release_vpd_data(adapter);1674 1675 release_napi(adapter);1676 release_login_buffer(adapter);1677 release_login_rsp_buffer(adapter);1678}1679 1680static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state)1681{1682 struct net_device *netdev = adapter->netdev;1683 unsigned long timeout = msecs_to_jiffies(20000);1684 union ibmvnic_crq crq;1685 bool resend;1686 int rc;1687 1688 netdev_dbg(netdev, "setting link state %d\n", link_state);1689 1690 memset(&crq, 0, sizeof(crq));1691 crq.logical_link_state.first = IBMVNIC_CRQ_CMD;1692 crq.logical_link_state.cmd = LOGICAL_LINK_STATE;1693 crq.logical_link_state.link_state = link_state;1694 1695 do {1696 resend = false;1697 1698 reinit_completion(&adapter->init_done);1699 rc = ibmvnic_send_crq(adapter, &crq);1700 if (rc) {1701 netdev_err(netdev, "Failed to set link state\n");1702 return rc;1703 }1704 1705 if (!wait_for_completion_timeout(&adapter->init_done,1706 timeout)) {1707 netdev_err(netdev, "timeout setting link state\n");1708 return -ETIMEDOUT;1709 }1710 1711 if (adapter->init_done_rc == PARTIALSUCCESS) {1712 /* Partuial success, delay and re-send */1713 mdelay(1000);1714 resend = true;1715 } else if (adapter->init_done_rc) {1716 netdev_warn(netdev, "Unable to set link state, rc=%d\n",1717 adapter->init_done_rc);1718 return adapter->init_done_rc;1719 }1720 } while (resend);1721 1722 return 0;1723}1724 1725static int set_real_num_queues(struct net_device *netdev)1726{1727 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1728 int rc;1729 1730 netdev_dbg(netdev, "Setting real tx/rx queues (%llx/%llx)\n",1731 adapter->req_tx_queues, adapter->req_rx_queues);1732 1733 rc = netif_set_real_num_tx_queues(netdev, adapter->req_tx_queues);1734 if (rc) {1735 netdev_err(netdev, "failed to set the number of tx queues\n");1736 return rc;1737 }1738 1739 rc = netif_set_real_num_rx_queues(netdev, adapter->req_rx_queues);1740 if (rc)1741 netdev_err(netdev, "failed to set the number of rx queues\n");1742 1743 return rc;1744}1745 1746static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)1747{1748 struct device *dev = &adapter->vdev->dev;1749 union ibmvnic_crq crq;1750 int len = 0;1751 int rc;1752 1753 if (adapter->vpd->buff)1754 len = adapter->vpd->len;1755 1756 mutex_lock(&adapter->fw_lock);1757 adapter->fw_done_rc = 0;1758 reinit_completion(&adapter->fw_done);1759 1760 crq.get_vpd_size.first = IBMVNIC_CRQ_CMD;1761 crq.get_vpd_size.cmd = GET_VPD_SIZE;1762 rc = ibmvnic_send_crq(adapter, &crq);1763 if (rc) {1764 mutex_unlock(&adapter->fw_lock);1765 return rc;1766 }1767 1768 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);1769 if (rc) {1770 dev_err(dev, "Could not retrieve VPD size, rc = %d\n", rc);1771 mutex_unlock(&adapter->fw_lock);1772 return rc;1773 }1774 mutex_unlock(&adapter->fw_lock);1775 1776 if (!adapter->vpd->len)1777 return -ENODATA;1778 1779 if (!adapter->vpd->buff)1780 adapter->vpd->buff = kzalloc(adapter->vpd->len, GFP_KERNEL);1781 else if (adapter->vpd->len != len)1782 adapter->vpd->buff =1783 krealloc(adapter->vpd->buff,1784 adapter->vpd->len, GFP_KERNEL);1785 1786 if (!adapter->vpd->buff) {1787 dev_err(dev, "Could allocate VPD buffer\n");1788 return -ENOMEM;1789 }1790 1791 adapter->vpd->dma_addr =1792 dma_map_single(dev, adapter->vpd->buff, adapter->vpd->len,1793 DMA_FROM_DEVICE);1794 if (dma_mapping_error(dev, adapter->vpd->dma_addr)) {1795 dev_err(dev, "Could not map VPD buffer\n");1796 kfree(adapter->vpd->buff);1797 adapter->vpd->buff = NULL;1798 return -ENOMEM;1799 }1800 1801 mutex_lock(&adapter->fw_lock);1802 adapter->fw_done_rc = 0;1803 reinit_completion(&adapter->fw_done);1804 1805 crq.get_vpd.first = IBMVNIC_CRQ_CMD;1806 crq.get_vpd.cmd = GET_VPD;1807 crq.get_vpd.ioba = cpu_to_be32(adapter->vpd->dma_addr);1808 crq.get_vpd.len = cpu_to_be32((u32)adapter->vpd->len);1809 rc = ibmvnic_send_crq(adapter, &crq);1810 if (rc) {1811 kfree(adapter->vpd->buff);1812 adapter->vpd->buff = NULL;1813 mutex_unlock(&adapter->fw_lock);1814 return rc;1815 }1816 1817 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);1818 if (rc) {1819 dev_err(dev, "Unable to retrieve VPD, rc = %d\n", rc);1820 kfree(adapter->vpd->buff);1821 adapter->vpd->buff = NULL;1822 mutex_unlock(&adapter->fw_lock);1823 return rc;1824 }1825 1826 mutex_unlock(&adapter->fw_lock);1827 return 0;1828}1829 1830static int init_resources(struct ibmvnic_adapter *adapter)1831{1832 struct net_device *netdev = adapter->netdev;1833 int rc;1834 1835 rc = set_real_num_queues(netdev);1836 if (rc)1837 return rc;1838 1839 adapter->vpd = kzalloc(sizeof(*adapter->vpd), GFP_KERNEL);1840 if (!adapter->vpd)1841 return -ENOMEM;1842 1843 /* Vital Product Data (VPD) */1844 rc = ibmvnic_get_vpd(adapter);1845 if (rc) {1846 netdev_err(netdev, "failed to initialize Vital Product Data (VPD)\n");1847 return rc;1848 }1849 1850 rc = init_napi(adapter);1851 if (rc)1852 return rc;1853 1854 send_query_map(adapter);1855 1856 rc = init_rx_pools(netdev);1857 if (rc)1858 return rc;1859 1860 rc = init_tx_pools(netdev);1861 return rc;1862}1863 1864static int __ibmvnic_open(struct net_device *netdev)1865{1866 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1867 enum vnic_state prev_state = adapter->state;1868 int i, rc;1869 1870 adapter->state = VNIC_OPENING;1871 replenish_pools(adapter);1872 ibmvnic_napi_enable(adapter);1873 1874 /* We're ready to receive frames, enable the sub-crq interrupts and1875 * set the logical link state to up1876 */1877 for (i = 0; i < adapter->req_rx_queues; i++) {1878 netdev_dbg(netdev, "Enabling rx_scrq[%d] irq\n", i);1879 if (prev_state == VNIC_CLOSED)1880 enable_irq(adapter->rx_scrq[i]->irq);1881 enable_scrq_irq(adapter, adapter->rx_scrq[i]);1882 }1883 1884 for (i = 0; i < adapter->req_tx_queues; i++) {1885 netdev_dbg(netdev, "Enabling tx_scrq[%d] irq\n", i);1886 if (prev_state == VNIC_CLOSED)1887 enable_irq(adapter->tx_scrq[i]->irq);1888 enable_scrq_irq(adapter, adapter->tx_scrq[i]);1889 /* netdev_tx_reset_queue will reset dql stats. During NON_FATAL1890 * resets, don't reset the stats because there could be batched1891 * skb's waiting to be sent. If we reset dql stats, we risk1892 * num_completed being greater than num_queued. This will cause1893 * a BUG_ON in dql_completed().1894 */1895 if (adapter->reset_reason != VNIC_RESET_NON_FATAL)1896 netdev_tx_reset_queue(netdev_get_tx_queue(netdev, i));1897 }1898 1899 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP);1900 if (rc) {1901 ibmvnic_napi_disable(adapter);1902 ibmvnic_disable_irqs(adapter);1903 return rc;1904 }1905 1906 adapter->tx_queues_active = true;1907 1908 /* Since queues were stopped until now, there shouldn't be any1909 * one in ibmvnic_complete_tx() or ibmvnic_xmit() so maybe we1910 * don't need the synchronize_rcu()? Leaving it for consistency1911 * with setting ->tx_queues_active = false.1912 */1913 synchronize_rcu();1914 1915 netif_tx_start_all_queues(netdev);1916 1917 if (prev_state == VNIC_CLOSED) {1918 for (i = 0; i < adapter->req_rx_queues; i++)1919 napi_schedule(&adapter->napi[i]);1920 }1921 1922 adapter->state = VNIC_OPEN;1923 return rc;1924}1925 1926static int ibmvnic_open(struct net_device *netdev)1927{1928 struct ibmvnic_adapter *adapter = netdev_priv(netdev);1929 int rc;1930 1931 ASSERT_RTNL();1932 1933 /* If device failover is pending or we are about to reset, just set1934 * device state and return. Device operation will be handled by reset1935 * routine.1936 *1937 * It should be safe to overwrite the adapter->state here. Since1938 * we hold the rtnl, either the reset has not actually started or1939 * the rtnl got dropped during the set_link_state() in do_reset().1940 * In the former case, no one else is changing the state (again we1941 * have the rtnl) and in the latter case, do_reset() will detect and1942 * honor our setting below.1943 */1944 if (adapter->failover_pending || (test_bit(0, &adapter->resetting))) {1945 netdev_dbg(netdev, "[S:%s FOP:%d] Resetting, deferring open\n",1946 adapter_state_to_string(adapter->state),1947 adapter->failover_pending);1948 adapter->state = VNIC_OPEN;1949 rc = 0;1950 goto out;1951 }1952 1953 if (adapter->state != VNIC_CLOSED) {1954 rc = ibmvnic_login(netdev);1955 if (rc)1956 goto out;1957 1958 rc = init_resources(adapter);1959 if (rc) {1960 netdev_err(netdev, "failed to initialize resources\n");1961 goto out;1962 }1963 }1964 1965 rc = __ibmvnic_open(netdev);1966 1967out:1968 /* If open failed and there is a pending failover or in-progress reset,1969 * set device state and return. Device operation will be handled by1970 * reset routine. See also comments above regarding rtnl.1971 */1972 if (rc &&1973 (adapter->failover_pending || (test_bit(0, &adapter->resetting)))) {1974 adapter->state = VNIC_OPEN;1975 rc = 0;1976 }1977 1978 if (rc) {1979 release_resources(adapter);1980 release_rx_pools(adapter);1981 release_tx_pools(adapter);1982 }1983 1984 return rc;1985}1986 1987static void clean_rx_pools(struct ibmvnic_adapter *adapter)1988{1989 struct ibmvnic_rx_pool *rx_pool;1990 struct ibmvnic_rx_buff *rx_buff;1991 u64 rx_entries;1992 int rx_scrqs;1993 int i, j;1994 1995 if (!adapter->rx_pool)1996 return;1997 1998 rx_scrqs = adapter->num_active_rx_pools;1999 rx_entries = adapter->req_rx_add_entries_per_subcrq;2000 2001 /* Free any remaining skbs in the rx buffer pools */2002 for (i = 0; i < rx_scrqs; i++) {2003 rx_pool = &adapter->rx_pool[i];2004 if (!rx_pool || !rx_pool->rx_buff)2005 continue;2006 2007 netdev_dbg(adapter->netdev, "Cleaning rx_pool[%d]\n", i);2008 for (j = 0; j < rx_entries; j++) {2009 rx_buff = &rx_pool->rx_buff[j];2010 if (rx_buff && rx_buff->skb) {2011 dev_kfree_skb_any(rx_buff->skb);2012 rx_buff->skb = NULL;2013 }2014 }2015 }2016}2017 2018static void clean_one_tx_pool(struct ibmvnic_adapter *adapter,2019 struct ibmvnic_tx_pool *tx_pool)2020{2021 struct ibmvnic_tx_buff *tx_buff;2022 u64 tx_entries;2023 int i;2024 2025 if (!tx_pool || !tx_pool->tx_buff)2026 return;2027 2028 tx_entries = tx_pool->num_buffers;2029 2030 for (i = 0; i < tx_entries; i++) {2031 tx_buff = &tx_pool->tx_buff[i];2032 if (tx_buff && tx_buff->skb) {2033 dev_kfree_skb_any(tx_buff->skb);2034 tx_buff->skb = NULL;2035 }2036 }2037}2038 2039static void clean_tx_pools(struct ibmvnic_adapter *adapter)2040{2041 int tx_scrqs;2042 int i;2043 2044 if (!adapter->tx_pool || !adapter->tso_pool)2045 return;2046 2047 tx_scrqs = adapter->num_active_tx_pools;2048 2049 /* Free any remaining skbs in the tx buffer pools */2050 for (i = 0; i < tx_scrqs; i++) {2051 netdev_dbg(adapter->netdev, "Cleaning tx_pool[%d]\n", i);2052 clean_one_tx_pool(adapter, &adapter->tx_pool[i]);2053 clean_one_tx_pool(adapter, &adapter->tso_pool[i]);2054 }2055}2056 2057static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter)2058{2059 struct net_device *netdev = adapter->netdev;2060 int i;2061 2062 if (adapter->tx_scrq) {2063 for (i = 0; i < adapter->req_tx_queues; i++)2064 if (adapter->tx_scrq[i]->irq) {2065 netdev_dbg(netdev,2066 "Disabling tx_scrq[%d] irq\n", i);2067 disable_scrq_irq(adapter, adapter->tx_scrq[i]);2068 disable_irq(adapter->tx_scrq[i]->irq);2069 }2070 }2071 2072 if (adapter->rx_scrq) {2073 for (i = 0; i < adapter->req_rx_queues; i++) {2074 if (adapter->rx_scrq[i]->irq) {2075 netdev_dbg(netdev,2076 "Disabling rx_scrq[%d] irq\n", i);2077 disable_scrq_irq(adapter, adapter->rx_scrq[i]);2078 disable_irq(adapter->rx_scrq[i]->irq);2079 }2080 }2081 }2082}2083 2084static void ibmvnic_cleanup(struct net_device *netdev)2085{2086 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2087 2088 /* ensure that transmissions are stopped if called by do_reset */2089 2090 adapter->tx_queues_active = false;2091 2092 /* Ensure complete_tx() and ibmvnic_xmit() see ->tx_queues_active2093 * update so they don't restart a queue after we stop it below.2094 */2095 synchronize_rcu();2096 2097 if (test_bit(0, &adapter->resetting))2098 netif_tx_disable(netdev);2099 else2100 netif_tx_stop_all_queues(netdev);2101 2102 ibmvnic_napi_disable(adapter);2103 ibmvnic_disable_irqs(adapter);2104}2105 2106static int __ibmvnic_close(struct net_device *netdev)2107{2108 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2109 int rc = 0;2110 2111 adapter->state = VNIC_CLOSING;2112 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN);2113 adapter->state = VNIC_CLOSED;2114 return rc;2115}2116 2117static int ibmvnic_close(struct net_device *netdev)2118{2119 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2120 int rc;2121 2122 netdev_dbg(netdev, "[S:%s FOP:%d FRR:%d] Closing\n",2123 adapter_state_to_string(adapter->state),2124 adapter->failover_pending,2125 adapter->force_reset_recovery);2126 2127 /* If device failover is pending, just set device state and return.2128 * Device operation will be handled by reset routine.2129 */2130 if (adapter->failover_pending) {2131 adapter->state = VNIC_CLOSED;2132 return 0;2133 }2134 2135 rc = __ibmvnic_close(netdev);2136 ibmvnic_cleanup(netdev);2137 clean_rx_pools(adapter);2138 clean_tx_pools(adapter);2139 2140 return rc;2141}2142 2143/**2144 * get_hdr_lens - fills list of L2/L3/L4 hdr lens2145 * @hdr_field: bitfield determining needed headers2146 * @skb: socket buffer2147 * @hdr_len: array of header lengths to be filled2148 *2149 * Reads hdr_field to determine which headers are needed by firmware.2150 * Builds a buffer containing these headers. Saves individual header2151 * lengths and total buffer length to be used to build descriptors.2152 *2153 * Return: total len of all headers2154 */2155static int get_hdr_lens(u8 hdr_field, struct sk_buff *skb,2156 int *hdr_len)2157{2158 int len = 0;2159 2160 2161 if ((hdr_field >> 6) & 1) {2162 hdr_len[0] = skb_mac_header_len(skb);2163 len += hdr_len[0];2164 }2165 2166 if ((hdr_field >> 5) & 1) {2167 hdr_len[1] = skb_network_header_len(skb);2168 len += hdr_len[1];2169 }2170 2171 if (!((hdr_field >> 4) & 1))2172 return len;2173 2174 if (skb->protocol == htons(ETH_P_IP)) {2175 if (ip_hdr(skb)->protocol == IPPROTO_TCP)2176 hdr_len[2] = tcp_hdrlen(skb);2177 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)2178 hdr_len[2] = sizeof(struct udphdr);2179 } else if (skb->protocol == htons(ETH_P_IPV6)) {2180 if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)2181 hdr_len[2] = tcp_hdrlen(skb);2182 else if (ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)2183 hdr_len[2] = sizeof(struct udphdr);2184 }2185 2186 return len + hdr_len[2];2187}2188 2189/**2190 * create_hdr_descs - create header and header extension descriptors2191 * @hdr_field: bitfield determining needed headers2192 * @hdr_data: buffer containing header data2193 * @len: length of data buffer2194 * @hdr_len: array of individual header lengths2195 * @scrq_arr: descriptor array2196 *2197 * Creates header and, if needed, header extension descriptors and2198 * places them in a descriptor array, scrq_arr2199 *2200 * Return: Number of header descs2201 */2202 2203static int create_hdr_descs(u8 hdr_field, u8 *hdr_data, int len, int *hdr_len,2204 union sub_crq *scrq_arr)2205{2206 union sub_crq *hdr_desc;2207 int tmp_len = len;2208 int num_descs = 0;2209 u8 *data, *cur;2210 int tmp;2211 2212 while (tmp_len > 0) {2213 cur = hdr_data + len - tmp_len;2214 2215 hdr_desc = &scrq_arr[num_descs];2216 if (num_descs) {2217 data = hdr_desc->hdr_ext.data;2218 tmp = tmp_len > 29 ? 29 : tmp_len;2219 hdr_desc->hdr_ext.first = IBMVNIC_CRQ_CMD;2220 hdr_desc->hdr_ext.type = IBMVNIC_HDR_EXT_DESC;2221 hdr_desc->hdr_ext.len = tmp;2222 } else {2223 data = hdr_desc->hdr.data;2224 tmp = tmp_len > 24 ? 24 : tmp_len;2225 hdr_desc->hdr.first = IBMVNIC_CRQ_CMD;2226 hdr_desc->hdr.type = IBMVNIC_HDR_DESC;2227 hdr_desc->hdr.len = tmp;2228 hdr_desc->hdr.l2_len = (u8)hdr_len[0];2229 hdr_desc->hdr.l3_len = cpu_to_be16((u16)hdr_len[1]);2230 hdr_desc->hdr.l4_len = (u8)hdr_len[2];2231 hdr_desc->hdr.flag = hdr_field << 1;2232 }2233 memcpy(data, cur, tmp);2234 tmp_len -= tmp;2235 num_descs++;2236 }2237 2238 return num_descs;2239}2240 2241/**2242 * build_hdr_descs_arr - build a header descriptor array2243 * @skb: tx socket buffer2244 * @indir_arr: indirect array2245 * @num_entries: number of descriptors to be sent2246 * @hdr_field: bit field determining which headers will be sent2247 *2248 * This function will build a TX descriptor array with applicable2249 * L2/L3/L4 packet header descriptors to be sent by send_subcrq_indirect.2250 */2251 2252static void build_hdr_descs_arr(struct sk_buff *skb,2253 union sub_crq *indir_arr,2254 int *num_entries, u8 hdr_field)2255{2256 int hdr_len[3] = {0, 0, 0};2257 int tot_len;2258 2259 tot_len = get_hdr_lens(hdr_field, skb, hdr_len);2260 *num_entries += create_hdr_descs(hdr_field, skb_mac_header(skb),2261 tot_len, hdr_len, indir_arr + 1);2262}2263 2264static int ibmvnic_xmit_workarounds(struct sk_buff *skb,2265 struct net_device *netdev)2266{2267 /* For some backing devices, mishandling of small packets2268 * can result in a loss of connection or TX stall. Device2269 * architects recommend that no packet should be smaller2270 * than the minimum MTU value provided to the driver, so2271 * pad any packets to that length2272 */2273 if (skb->len < netdev->min_mtu)2274 return skb_put_padto(skb, netdev->min_mtu);2275 2276 return 0;2277}2278 2279static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,2280 struct ibmvnic_sub_crq_queue *tx_scrq)2281{2282 struct ibmvnic_ind_xmit_queue *ind_bufp;2283 struct ibmvnic_tx_buff *tx_buff;2284 struct ibmvnic_tx_pool *tx_pool;2285 union sub_crq tx_scrq_entry;2286 int queue_num;2287 int entries;2288 int index;2289 int i;2290 2291 ind_bufp = &tx_scrq->ind_buf;2292 entries = (u64)ind_bufp->index;2293 queue_num = tx_scrq->pool_index;2294 2295 for (i = entries - 1; i >= 0; --i) {2296 tx_scrq_entry = ind_bufp->indir_arr[i];2297 if (tx_scrq_entry.v1.type != IBMVNIC_TX_DESC)2298 continue;2299 index = be32_to_cpu(tx_scrq_entry.v1.correlator);2300 if (index & IBMVNIC_TSO_POOL_MASK) {2301 tx_pool = &adapter->tso_pool[queue_num];2302 index &= ~IBMVNIC_TSO_POOL_MASK;2303 } else {2304 tx_pool = &adapter->tx_pool[queue_num];2305 }2306 tx_pool->free_map[tx_pool->consumer_index] = index;2307 tx_pool->consumer_index = tx_pool->consumer_index == 0 ?2308 tx_pool->num_buffers - 1 :2309 tx_pool->consumer_index - 1;2310 tx_buff = &tx_pool->tx_buff[index];2311 adapter->netdev->stats.tx_packets--;2312 adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;2313 adapter->tx_stats_buffers[queue_num].packets--;2314 adapter->tx_stats_buffers[queue_num].bytes -=2315 tx_buff->skb->len;2316 dev_kfree_skb_any(tx_buff->skb);2317 tx_buff->skb = NULL;2318 adapter->netdev->stats.tx_dropped++;2319 }2320 2321 ind_bufp->index = 0;2322 2323 if (atomic_sub_return(entries, &tx_scrq->used) <=2324 (adapter->req_tx_entries_per_subcrq / 2) &&2325 __netif_subqueue_stopped(adapter->netdev, queue_num)) {2326 rcu_read_lock();2327 2328 if (adapter->tx_queues_active) {2329 netif_wake_subqueue(adapter->netdev, queue_num);2330 netdev_dbg(adapter->netdev, "Started queue %d\n",2331 queue_num);2332 }2333 2334 rcu_read_unlock();2335 }2336}2337 2338static int send_subcrq_direct(struct ibmvnic_adapter *adapter,2339 u64 remote_handle, u64 *entry)2340{2341 unsigned int ua = adapter->vdev->unit_address;2342 struct device *dev = &adapter->vdev->dev;2343 int rc;2344 2345 /* Make sure the hypervisor sees the complete request */2346 dma_wmb();2347 rc = plpar_hcall_norets(H_SEND_SUB_CRQ, ua,2348 cpu_to_be64(remote_handle),2349 cpu_to_be64(entry[0]), cpu_to_be64(entry[1]),2350 cpu_to_be64(entry[2]), cpu_to_be64(entry[3]));2351 2352 if (rc)2353 print_subcrq_error(dev, rc, __func__);2354 2355 return rc;2356}2357 2358static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter,2359 struct ibmvnic_sub_crq_queue *tx_scrq,2360 bool indirect)2361{2362 struct ibmvnic_ind_xmit_queue *ind_bufp;2363 u64 dma_addr;2364 u64 entries;2365 u64 handle;2366 int rc;2367 2368 ind_bufp = &tx_scrq->ind_buf;2369 dma_addr = (u64)ind_bufp->indir_dma;2370 entries = (u64)ind_bufp->index;2371 handle = tx_scrq->handle;2372 2373 if (!entries)2374 return 0;2375 2376 if (indirect)2377 rc = send_subcrq_indirect(adapter, handle, dma_addr, entries);2378 else2379 rc = send_subcrq_direct(adapter, handle,2380 (u64 *)ind_bufp->indir_arr);2381 2382 if (rc)2383 ibmvnic_tx_scrq_clean_buffer(adapter, tx_scrq);2384 else2385 ind_bufp->index = 0;2386 return rc;2387}2388 2389static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)2390{2391 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2392 int queue_num = skb_get_queue_mapping(skb);2393 u8 *hdrs = (u8 *)&adapter->tx_rx_desc_req;2394 struct device *dev = &adapter->vdev->dev;2395 struct ibmvnic_ind_xmit_queue *ind_bufp;2396 struct ibmvnic_tx_buff *tx_buff = NULL;2397 struct ibmvnic_sub_crq_queue *tx_scrq;2398 struct ibmvnic_long_term_buff *ltb;2399 struct ibmvnic_tx_pool *tx_pool;2400 unsigned int tx_send_failed = 0;2401 netdev_tx_t ret = NETDEV_TX_OK;2402 unsigned int tx_map_failed = 0;2403 union sub_crq indir_arr[16];2404 unsigned int tx_dropped = 0;2405 unsigned int tx_packets = 0;2406 unsigned int tx_bytes = 0;2407 dma_addr_t data_dma_addr;2408 struct netdev_queue *txq;2409 unsigned long lpar_rc;2410 union sub_crq tx_crq;2411 unsigned int offset;2412 bool use_scrq_send_direct = false;2413 int num_entries = 1;2414 unsigned char *dst;2415 int bufidx = 0;2416 u8 proto = 0;2417 2418 /* If a reset is in progress, drop the packet since2419 * the scrqs may get torn down. Otherwise use the2420 * rcu to ensure reset waits for us to complete.2421 */2422 rcu_read_lock();2423 if (!adapter->tx_queues_active) {2424 dev_kfree_skb_any(skb);2425 2426 tx_send_failed++;2427 tx_dropped++;2428 ret = NETDEV_TX_OK;2429 goto out;2430 }2431 2432 tx_scrq = adapter->tx_scrq[queue_num];2433 txq = netdev_get_tx_queue(netdev, queue_num);2434 ind_bufp = &tx_scrq->ind_buf;2435 2436 if (ibmvnic_xmit_workarounds(skb, netdev)) {2437 tx_dropped++;2438 tx_send_failed++;2439 ret = NETDEV_TX_OK;2440 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);2441 if (lpar_rc != H_SUCCESS)2442 goto tx_err;2443 goto out;2444 }2445 2446 if (skb_is_gso(skb))2447 tx_pool = &adapter->tso_pool[queue_num];2448 else2449 tx_pool = &adapter->tx_pool[queue_num];2450 2451 bufidx = tx_pool->free_map[tx_pool->consumer_index];2452 2453 if (bufidx == IBMVNIC_INVALID_MAP) {2454 dev_kfree_skb_any(skb);2455 tx_send_failed++;2456 tx_dropped++;2457 ret = NETDEV_TX_OK;2458 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);2459 if (lpar_rc != H_SUCCESS)2460 goto tx_err;2461 goto out;2462 }2463 2464 tx_pool->free_map[tx_pool->consumer_index] = IBMVNIC_INVALID_MAP;2465 2466 map_txpool_buf_to_ltb(tx_pool, bufidx, <b, &offset);2467 2468 dst = ltb->buff + offset;2469 memset(dst, 0, tx_pool->buf_size);2470 data_dma_addr = ltb->addr + offset;2471 2472 /* if we are going to send_subcrq_direct this then we need to2473 * update the checksum before copying the data into ltb. Essentially2474 * these packets force disable CSO so that we can guarantee that2475 * FW does not need header info and we can send direct. Also, vnic2476 * server must be able to xmit standard packets without header data2477 */2478 if (*hdrs == 0 && !skb_is_gso(skb) &&2479 !ind_bufp->index && !netdev_xmit_more()) {2480 use_scrq_send_direct = true;2481 if (skb->ip_summed == CHECKSUM_PARTIAL &&2482 skb_checksum_help(skb))2483 use_scrq_send_direct = false;2484 }2485 2486 if (skb_shinfo(skb)->nr_frags) {2487 int cur, i;2488 2489 /* Copy the head */2490 skb_copy_from_linear_data(skb, dst, skb_headlen(skb));2491 cur = skb_headlen(skb);2492 2493 /* Copy the frags */2494 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {2495 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];2496 2497 memcpy(dst + cur, skb_frag_address(frag),2498 skb_frag_size(frag));2499 cur += skb_frag_size(frag);2500 }2501 } else {2502 skb_copy_from_linear_data(skb, dst, skb->len);2503 }2504 2505 tx_pool->consumer_index =2506 (tx_pool->consumer_index + 1) % tx_pool->num_buffers;2507 2508 tx_buff = &tx_pool->tx_buff[bufidx];2509 2510 /* Sanity checks on our free map to make sure it points to an index2511 * that is not being occupied by another skb. If skb memory is2512 * not freed then we see congestion control kick in and halt tx.2513 */2514 if (unlikely(tx_buff->skb)) {2515 dev_warn_ratelimited(dev, "TX free map points to untracked skb (%s %d idx=%d)\n",2516 skb_is_gso(skb) ? "tso_pool" : "tx_pool",2517 queue_num, bufidx);2518 dev_kfree_skb_any(tx_buff->skb);2519 }2520 2521 tx_buff->skb = skb;2522 tx_buff->index = bufidx;2523 tx_buff->pool_index = queue_num;2524 2525 memset(&tx_crq, 0, sizeof(tx_crq));2526 tx_crq.v1.first = IBMVNIC_CRQ_CMD;2527 tx_crq.v1.type = IBMVNIC_TX_DESC;2528 tx_crq.v1.n_crq_elem = 1;2529 tx_crq.v1.n_sge = 1;2530 tx_crq.v1.flags1 = IBMVNIC_TX_COMP_NEEDED;2531 2532 if (skb_is_gso(skb))2533 tx_crq.v1.correlator =2534 cpu_to_be32(bufidx | IBMVNIC_TSO_POOL_MASK);2535 else2536 tx_crq.v1.correlator = cpu_to_be32(bufidx);2537 tx_crq.v1.dma_reg = cpu_to_be16(ltb->map_id);2538 tx_crq.v1.sge_len = cpu_to_be32(skb->len);2539 tx_crq.v1.ioba = cpu_to_be64(data_dma_addr);2540 2541 if (adapter->vlan_header_insertion && skb_vlan_tag_present(skb)) {2542 tx_crq.v1.flags2 |= IBMVNIC_TX_VLAN_INSERT;2543 tx_crq.v1.vlan_id = cpu_to_be16(skb->vlan_tci);2544 }2545 2546 if (skb->protocol == htons(ETH_P_IP)) {2547 tx_crq.v1.flags1 |= IBMVNIC_TX_PROT_IPV4;2548 proto = ip_hdr(skb)->protocol;2549 } else if (skb->protocol == htons(ETH_P_IPV6)) {2550 tx_crq.v1.flags1 |= IBMVNIC_TX_PROT_IPV6;2551 proto = ipv6_hdr(skb)->nexthdr;2552 }2553 2554 if (proto == IPPROTO_TCP)2555 tx_crq.v1.flags1 |= IBMVNIC_TX_PROT_TCP;2556 else if (proto == IPPROTO_UDP)2557 tx_crq.v1.flags1 |= IBMVNIC_TX_PROT_UDP;2558 2559 if (skb->ip_summed == CHECKSUM_PARTIAL) {2560 tx_crq.v1.flags1 |= IBMVNIC_TX_CHKSUM_OFFLOAD;2561 hdrs += 2;2562 }2563 if (skb_is_gso(skb)) {2564 tx_crq.v1.flags1 |= IBMVNIC_TX_LSO;2565 tx_crq.v1.mss = cpu_to_be16(skb_shinfo(skb)->gso_size);2566 hdrs += 2;2567 } else if (use_scrq_send_direct) {2568 /* See above comment, CSO disabled with direct xmit */2569 tx_crq.v1.flags1 &= ~(IBMVNIC_TX_CHKSUM_OFFLOAD);2570 ind_bufp->index = 1;2571 tx_buff->num_entries = 1;2572 netdev_tx_sent_queue(txq, skb->len);2573 ind_bufp->indir_arr[0] = tx_crq;2574 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, false);2575 if (lpar_rc != H_SUCCESS)2576 goto tx_err;2577 2578 goto early_exit;2579 }2580 2581 if ((*hdrs >> 7) & 1)2582 build_hdr_descs_arr(skb, indir_arr, &num_entries, *hdrs);2583 2584 tx_crq.v1.n_crq_elem = num_entries;2585 tx_buff->num_entries = num_entries;2586 /* flush buffer if current entry can not fit */2587 if (num_entries + ind_bufp->index > IBMVNIC_MAX_IND_DESCS) {2588 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);2589 if (lpar_rc != H_SUCCESS)2590 goto tx_flush_err;2591 }2592 2593 indir_arr[0] = tx_crq;2594 memcpy(&ind_bufp->indir_arr[ind_bufp->index], &indir_arr[0],2595 num_entries * sizeof(struct ibmvnic_generic_scrq));2596 2597 ind_bufp->index += num_entries;2598 if (__netdev_tx_sent_queue(txq, skb->len,2599 netdev_xmit_more() &&2600 ind_bufp->index < IBMVNIC_MAX_IND_DESCS)) {2601 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true);2602 if (lpar_rc != H_SUCCESS)2603 goto tx_err;2604 }2605 2606early_exit:2607 if (atomic_add_return(num_entries, &tx_scrq->used)2608 >= adapter->req_tx_entries_per_subcrq) {2609 netdev_dbg(netdev, "Stopping queue %d\n", queue_num);2610 netif_stop_subqueue(netdev, queue_num);2611 }2612 2613 tx_packets++;2614 tx_bytes += skb->len;2615 txq_trans_cond_update(txq);2616 ret = NETDEV_TX_OK;2617 goto out;2618 2619tx_flush_err:2620 dev_kfree_skb_any(skb);2621 tx_buff->skb = NULL;2622 tx_pool->consumer_index = tx_pool->consumer_index == 0 ?2623 tx_pool->num_buffers - 1 :2624 tx_pool->consumer_index - 1;2625 tx_dropped++;2626tx_err:2627 if (lpar_rc != H_CLOSED && lpar_rc != H_PARAMETER)2628 dev_err_ratelimited(dev, "tx: send failed\n");2629 2630 if (lpar_rc == H_CLOSED || adapter->failover_pending) {2631 /* Disable TX and report carrier off if queue is closed2632 * or pending failover.2633 * Firmware guarantees that a signal will be sent to the2634 * driver, triggering a reset or some other action.2635 */2636 netif_tx_stop_all_queues(netdev);2637 netif_carrier_off(netdev);2638 }2639out:2640 rcu_read_unlock();2641 netdev->stats.tx_dropped += tx_dropped;2642 netdev->stats.tx_bytes += tx_bytes;2643 netdev->stats.tx_packets += tx_packets;2644 adapter->tx_send_failed += tx_send_failed;2645 adapter->tx_map_failed += tx_map_failed;2646 adapter->tx_stats_buffers[queue_num].packets += tx_packets;2647 adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;2648 adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;2649 2650 return ret;2651}2652 2653static void ibmvnic_set_multi(struct net_device *netdev)2654{2655 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2656 struct netdev_hw_addr *ha;2657 union ibmvnic_crq crq;2658 2659 memset(&crq, 0, sizeof(crq));2660 crq.request_capability.first = IBMVNIC_CRQ_CMD;2661 crq.request_capability.cmd = REQUEST_CAPABILITY;2662 2663 if (netdev->flags & IFF_PROMISC) {2664 if (!adapter->promisc_supported)2665 return;2666 } else {2667 if (netdev->flags & IFF_ALLMULTI) {2668 /* Accept all multicast */2669 memset(&crq, 0, sizeof(crq));2670 crq.multicast_ctrl.first = IBMVNIC_CRQ_CMD;2671 crq.multicast_ctrl.cmd = MULTICAST_CTRL;2672 crq.multicast_ctrl.flags = IBMVNIC_ENABLE_ALL;2673 ibmvnic_send_crq(adapter, &crq);2674 } else if (netdev_mc_empty(netdev)) {2675 /* Reject all multicast */2676 memset(&crq, 0, sizeof(crq));2677 crq.multicast_ctrl.first = IBMVNIC_CRQ_CMD;2678 crq.multicast_ctrl.cmd = MULTICAST_CTRL;2679 crq.multicast_ctrl.flags = IBMVNIC_DISABLE_ALL;2680 ibmvnic_send_crq(adapter, &crq);2681 } else {2682 /* Accept one or more multicast(s) */2683 netdev_for_each_mc_addr(ha, netdev) {2684 memset(&crq, 0, sizeof(crq));2685 crq.multicast_ctrl.first = IBMVNIC_CRQ_CMD;2686 crq.multicast_ctrl.cmd = MULTICAST_CTRL;2687 crq.multicast_ctrl.flags = IBMVNIC_ENABLE_MC;2688 ether_addr_copy(&crq.multicast_ctrl.mac_addr[0],2689 ha->addr);2690 ibmvnic_send_crq(adapter, &crq);2691 }2692 }2693 }2694}2695 2696static int __ibmvnic_set_mac(struct net_device *netdev, u8 *dev_addr)2697{2698 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2699 union ibmvnic_crq crq;2700 int rc;2701 2702 if (!is_valid_ether_addr(dev_addr)) {2703 rc = -EADDRNOTAVAIL;2704 goto err;2705 }2706 2707 memset(&crq, 0, sizeof(crq));2708 crq.change_mac_addr.first = IBMVNIC_CRQ_CMD;2709 crq.change_mac_addr.cmd = CHANGE_MAC_ADDR;2710 ether_addr_copy(&crq.change_mac_addr.mac_addr[0], dev_addr);2711 2712 mutex_lock(&adapter->fw_lock);2713 adapter->fw_done_rc = 0;2714 reinit_completion(&adapter->fw_done);2715 2716 rc = ibmvnic_send_crq(adapter, &crq);2717 if (rc) {2718 rc = -EIO;2719 mutex_unlock(&adapter->fw_lock);2720 goto err;2721 }2722 2723 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);2724 /* netdev->dev_addr is changed in handle_change_mac_rsp function */2725 if (rc || adapter->fw_done_rc) {2726 rc = -EIO;2727 mutex_unlock(&adapter->fw_lock);2728 goto err;2729 }2730 mutex_unlock(&adapter->fw_lock);2731 return 0;2732err:2733 ether_addr_copy(adapter->mac_addr, netdev->dev_addr);2734 return rc;2735}2736 2737static int ibmvnic_set_mac(struct net_device *netdev, void *p)2738{2739 struct ibmvnic_adapter *adapter = netdev_priv(netdev);2740 struct sockaddr *addr = p;2741 int rc;2742 2743 rc = 0;2744 if (!is_valid_ether_addr(addr->sa_data))2745 return -EADDRNOTAVAIL;2746 2747 ether_addr_copy(adapter->mac_addr, addr->sa_data);2748 if (adapter->state != VNIC_PROBED)2749 rc = __ibmvnic_set_mac(netdev, addr->sa_data);2750 2751 return rc;2752}2753 2754static const char *reset_reason_to_string(enum ibmvnic_reset_reason reason)2755{2756 switch (reason) {2757 case VNIC_RESET_FAILOVER:2758 return "FAILOVER";2759 case VNIC_RESET_MOBILITY:2760 return "MOBILITY";2761 case VNIC_RESET_FATAL:2762 return "FATAL";2763 case VNIC_RESET_NON_FATAL:2764 return "NON_FATAL";2765 case VNIC_RESET_TIMEOUT:2766 return "TIMEOUT";2767 case VNIC_RESET_CHANGE_PARAM:2768 return "CHANGE_PARAM";2769 case VNIC_RESET_PASSIVE_INIT:2770 return "PASSIVE_INIT";2771 }2772 return "UNKNOWN";2773}2774 2775/*2776 * Initialize the init_done completion and return code values. We2777 * can get a transport event just after registering the CRQ and the2778 * tasklet will use this to communicate the transport event. To ensure2779 * we don't miss the notification/error, initialize these _before_2780 * regisering the CRQ.2781 */2782static inline void reinit_init_done(struct ibmvnic_adapter *adapter)2783{2784 reinit_completion(&adapter->init_done);2785 adapter->init_done_rc = 0;2786}2787 2788/*2789 * do_reset returns zero if we are able to keep processing reset events, or2790 * non-zero if we hit a fatal error and must halt.2791 */2792static int do_reset(struct ibmvnic_adapter *adapter,2793 struct ibmvnic_rwi *rwi, u32 reset_state)2794{2795 struct net_device *netdev = adapter->netdev;2796 u64 old_num_rx_queues, old_num_tx_queues;2797 u64 old_num_rx_slots, old_num_tx_slots;2798 int rc;2799 2800 netdev_dbg(adapter->netdev,2801 "[S:%s FOP:%d] Reset reason: %s, reset_state: %s\n",2802 adapter_state_to_string(adapter->state),2803 adapter->failover_pending,2804 reset_reason_to_string(rwi->reset_reason),2805 adapter_state_to_string(reset_state));2806 2807 adapter->reset_reason = rwi->reset_reason;2808 /* requestor of VNIC_RESET_CHANGE_PARAM already has the rtnl lock */2809 if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))2810 rtnl_lock();2811 2812 /* Now that we have the rtnl lock, clear any pending failover.2813 * This will ensure ibmvnic_open() has either completed or will2814 * block until failover is complete.2815 */2816 if (rwi->reset_reason == VNIC_RESET_FAILOVER)2817 adapter->failover_pending = false;2818 2819 /* read the state and check (again) after getting rtnl */2820 reset_state = adapter->state;2821 2822 if (reset_state == VNIC_REMOVING || reset_state == VNIC_REMOVED) {2823 rc = -EBUSY;2824 goto out;2825 }2826 2827 netif_carrier_off(netdev);2828 2829 old_num_rx_queues = adapter->req_rx_queues;2830 old_num_tx_queues = adapter->req_tx_queues;2831 old_num_rx_slots = adapter->req_rx_add_entries_per_subcrq;2832 old_num_tx_slots = adapter->req_tx_entries_per_subcrq;2833 2834 ibmvnic_cleanup(netdev);2835 2836 if (reset_state == VNIC_OPEN &&2837 adapter->reset_reason != VNIC_RESET_MOBILITY &&2838 adapter->reset_reason != VNIC_RESET_FAILOVER) {2839 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {2840 rc = __ibmvnic_close(netdev);2841 if (rc)2842 goto out;2843 } else {2844 adapter->state = VNIC_CLOSING;2845 2846 /* Release the RTNL lock before link state change and2847 * re-acquire after the link state change to allow2848 * linkwatch_event to grab the RTNL lock and run during2849 * a reset.2850 */2851 rtnl_unlock();2852 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN);2853 rtnl_lock();2854 if (rc)2855 goto out;2856 2857 if (adapter->state == VNIC_OPEN) {2858 /* When we dropped rtnl, ibmvnic_open() got2859 * it and noticed that we are resetting and2860 * set the adapter state to OPEN. Update our2861 * new "target" state, and resume the reset2862 * from VNIC_CLOSING state.2863 */2864 netdev_dbg(netdev,2865 "Open changed state from %s, updating.\n",2866 adapter_state_to_string(reset_state));2867 reset_state = VNIC_OPEN;2868 adapter->state = VNIC_CLOSING;2869 }2870 2871 if (adapter->state != VNIC_CLOSING) {2872 /* If someone else changed the adapter state2873 * when we dropped the rtnl, fail the reset2874 */2875 rc = -EAGAIN;2876 goto out;2877 }2878 adapter->state = VNIC_CLOSED;2879 }2880 }2881 2882 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {2883 release_resources(adapter);2884 release_sub_crqs(adapter, 1);2885 release_crq_queue(adapter);2886 }2887 2888 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) {2889 /* remove the closed state so when we call open it appears2890 * we are coming from the probed state.2891 */2892 adapter->state = VNIC_PROBED;2893 2894 reinit_init_done(adapter);2895 2896 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {2897 rc = init_crq_queue(adapter);2898 } else if (adapter->reset_reason == VNIC_RESET_MOBILITY) {2899 rc = ibmvnic_reenable_crq_queue(adapter);2900 release_sub_crqs(adapter, 1);2901 } else {2902 rc = ibmvnic_reset_crq(adapter);2903 if (rc == H_CLOSED || rc == H_SUCCESS) {2904 rc = vio_enable_interrupts(adapter->vdev);2905 if (rc)2906 netdev_err(adapter->netdev,2907 "Reset failed to enable interrupts. rc=%d\n",2908 rc);2909 }2910 }2911 2912 if (rc) {2913 netdev_err(adapter->netdev,2914 "Reset couldn't initialize crq. rc=%d\n", rc);2915 goto out;2916 }2917 2918 rc = ibmvnic_reset_init(adapter, true);2919 if (rc)2920 goto out;2921 2922 /* If the adapter was in PROBE or DOWN state prior to the reset,2923 * exit here.2924 */2925 if (reset_state == VNIC_PROBED || reset_state == VNIC_DOWN) {2926 rc = 0;2927 goto out;2928 }2929 2930 rc = ibmvnic_login(netdev);2931 if (rc)2932 goto out;2933 2934 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) {2935 rc = init_resources(adapter);2936 if (rc)2937 goto out;2938 } else if (adapter->req_rx_queues != old_num_rx_queues ||2939 adapter->req_tx_queues != old_num_tx_queues ||2940 adapter->req_rx_add_entries_per_subcrq !=2941 old_num_rx_slots ||2942 adapter->req_tx_entries_per_subcrq !=2943 old_num_tx_slots ||2944 !adapter->rx_pool ||2945 !adapter->tso_pool ||2946 !adapter->tx_pool) {2947 release_napi(adapter);2948 release_vpd_data(adapter);2949 2950 rc = init_resources(adapter);2951 if (rc)2952 goto out;2953 2954 } else {2955 rc = init_tx_pools(netdev);2956 if (rc) {2957 netdev_dbg(netdev,2958 "init tx pools failed (%d)\n",2959 rc);2960 goto out;2961 }2962 2963 rc = init_rx_pools(netdev);2964 if (rc) {2965 netdev_dbg(netdev,2966 "init rx pools failed (%d)\n",2967 rc);2968 goto out;2969 }2970 }2971 ibmvnic_disable_irqs(adapter);2972 }2973 adapter->state = VNIC_CLOSED;2974 2975 if (reset_state == VNIC_CLOSED) {2976 rc = 0;2977 goto out;2978 }2979 2980 rc = __ibmvnic_open(netdev);2981 if (rc) {2982 rc = IBMVNIC_OPEN_FAILED;2983 goto out;2984 }2985 2986 /* refresh device's multicast list */2987 ibmvnic_set_multi(netdev);2988 2989 if (adapter->reset_reason == VNIC_RESET_FAILOVER ||2990 adapter->reset_reason == VNIC_RESET_MOBILITY)2991 __netdev_notify_peers(netdev);2992 2993 rc = 0;2994 2995out:2996 /* restore the adapter state if reset failed */2997 if (rc)2998 adapter->state = reset_state;2999 /* requestor of VNIC_RESET_CHANGE_PARAM should still hold the rtnl lock */3000 if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM))3001 rtnl_unlock();3002 3003 netdev_dbg(adapter->netdev, "[S:%s FOP:%d] Reset done, rc %d\n",3004 adapter_state_to_string(adapter->state),3005 adapter->failover_pending, rc);3006 return rc;3007}3008 3009static int do_hard_reset(struct ibmvnic_adapter *adapter,3010 struct ibmvnic_rwi *rwi, u32 reset_state)3011{3012 struct net_device *netdev = adapter->netdev;3013 int rc;3014 3015 netdev_dbg(adapter->netdev, "Hard resetting driver (%s)\n",3016 reset_reason_to_string(rwi->reset_reason));3017 3018 /* read the state and check (again) after getting rtnl */3019 reset_state = adapter->state;3020 3021 if (reset_state == VNIC_REMOVING || reset_state == VNIC_REMOVED) {3022 rc = -EBUSY;3023 goto out;3024 }3025 3026 netif_carrier_off(netdev);3027 adapter->reset_reason = rwi->reset_reason;3028 3029 ibmvnic_cleanup(netdev);3030 release_resources(adapter);3031 release_sub_crqs(adapter, 0);3032 release_crq_queue(adapter);3033 3034 /* remove the closed state so when we call open it appears3035 * we are coming from the probed state.3036 */3037 adapter->state = VNIC_PROBED;3038 3039 reinit_init_done(adapter);3040 3041 rc = init_crq_queue(adapter);3042 if (rc) {3043 netdev_err(adapter->netdev,3044 "Couldn't initialize crq. rc=%d\n", rc);3045 goto out;3046 }3047 3048 rc = ibmvnic_reset_init(adapter, false);3049 if (rc)3050 goto out;3051 3052 /* If the adapter was in PROBE or DOWN state prior to the reset,3053 * exit here.3054 */3055 if (reset_state == VNIC_PROBED || reset_state == VNIC_DOWN)3056 goto out;3057 3058 rc = ibmvnic_login(netdev);3059 if (rc)3060 goto out;3061 3062 rc = init_resources(adapter);3063 if (rc)3064 goto out;3065 3066 ibmvnic_disable_irqs(adapter);3067 adapter->state = VNIC_CLOSED;3068 3069 if (reset_state == VNIC_CLOSED)3070 goto out;3071 3072 rc = __ibmvnic_open(netdev);3073 if (rc) {3074 rc = IBMVNIC_OPEN_FAILED;3075 goto out;3076 }3077 3078 __netdev_notify_peers(netdev);3079out:3080 /* restore adapter state if reset failed */3081 if (rc)3082 adapter->state = reset_state;3083 netdev_dbg(adapter->netdev, "[S:%s FOP:%d] Hard reset done, rc %d\n",3084 adapter_state_to_string(adapter->state),3085 adapter->failover_pending, rc);3086 return rc;3087}3088 3089static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter)3090{3091 struct ibmvnic_rwi *rwi;3092 unsigned long flags;3093 3094 spin_lock_irqsave(&adapter->rwi_lock, flags);3095 3096 if (!list_empty(&adapter->rwi_list)) {3097 rwi = list_first_entry(&adapter->rwi_list, struct ibmvnic_rwi,3098 list);3099 list_del(&rwi->list);3100 } else {3101 rwi = NULL;3102 }3103 3104 spin_unlock_irqrestore(&adapter->rwi_lock, flags);3105 return rwi;3106}3107 3108/**3109 * do_passive_init - complete probing when partner device is detected.3110 * @adapter: ibmvnic_adapter struct3111 *3112 * If the ibmvnic device does not have a partner device to communicate with at boot3113 * and that partner device comes online at a later time, this function is called3114 * to complete the initialization process of ibmvnic device.3115 * Caller is expected to hold rtnl_lock().3116 *3117 * Returns non-zero if sub-CRQs are not initialized properly leaving the device3118 * in the down state.3119 * Returns 0 upon success and the device is in PROBED state.3120 */3121 3122static int do_passive_init(struct ibmvnic_adapter *adapter)3123{3124 unsigned long timeout = msecs_to_jiffies(30000);3125 struct net_device *netdev = adapter->netdev;3126 struct device *dev = &adapter->vdev->dev;3127 int rc;3128 3129 netdev_dbg(netdev, "Partner device found, probing.\n");3130 3131 adapter->state = VNIC_PROBING;3132 reinit_completion(&adapter->init_done);3133 adapter->init_done_rc = 0;3134 adapter->crq.active = true;3135 3136 rc = send_crq_init_complete(adapter);3137 if (rc)3138 goto out;3139 3140 rc = send_version_xchg(adapter);3141 if (rc)3142 netdev_dbg(adapter->netdev, "send_version_xchg failed, rc=%d\n", rc);3143 3144 if (!wait_for_completion_timeout(&adapter->init_done, timeout)) {3145 dev_err(dev, "Initialization sequence timed out\n");3146 rc = -ETIMEDOUT;3147 goto out;3148 }3149 3150 rc = init_sub_crqs(adapter);3151 if (rc) {3152 dev_err(dev, "Initialization of sub crqs failed, rc=%d\n", rc);3153 goto out;3154 }3155 3156 rc = init_sub_crq_irqs(adapter);3157 if (rc) {3158 dev_err(dev, "Failed to initialize sub crq irqs\n, rc=%d", rc);3159 goto init_failed;3160 }3161 3162 netdev->mtu = adapter->req_mtu - ETH_HLEN;3163 netdev->min_mtu = adapter->min_mtu - ETH_HLEN;3164 netdev->max_mtu = adapter->max_mtu - ETH_HLEN;3165 3166 adapter->state = VNIC_PROBED;3167 netdev_dbg(netdev, "Probed successfully. Waiting for signal from partner device.\n");3168 3169 return 0;3170 3171init_failed:3172 release_sub_crqs(adapter, 1);3173out:3174 adapter->state = VNIC_DOWN;3175 return rc;3176}3177 3178static void __ibmvnic_reset(struct work_struct *work)3179{3180 struct ibmvnic_adapter *adapter;3181 unsigned int timeout = 5000;3182 struct ibmvnic_rwi *tmprwi;3183 bool saved_state = false;3184 struct ibmvnic_rwi *rwi;3185 unsigned long flags;3186 struct device *dev;3187 bool need_reset;3188 int num_fails = 0;3189 u32 reset_state;3190 int rc = 0;3191 3192 adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset);3193 dev = &adapter->vdev->dev;3194 3195 /* Wait for ibmvnic_probe() to complete. If probe is taking too long3196 * or if another reset is in progress, defer work for now. If probe3197 * eventually fails it will flush and terminate our work.3198 *3199 * Three possibilities here:3200 * 1. Adpater being removed - just return3201 * 2. Timed out on probe or another reset in progress - delay the work3202 * 3. Completed probe - perform any resets in queue3203 */3204 if (adapter->state == VNIC_PROBING &&3205 !wait_for_completion_timeout(&adapter->probe_done, timeout)) {3206 dev_err(dev, "Reset thread timed out on probe");3207 queue_delayed_work(system_long_wq,3208 &adapter->ibmvnic_delayed_reset,3209 IBMVNIC_RESET_DELAY);3210 return;3211 }3212 3213 /* adapter is done with probe (i.e state is never VNIC_PROBING now) */3214 if (adapter->state == VNIC_REMOVING)3215 return;3216 3217 /* ->rwi_list is stable now (no one else is removing entries) */3218 3219 /* ibmvnic_probe() may have purged the reset queue after we were3220 * scheduled to process a reset so there maybe no resets to process.3221 * Before setting the ->resetting bit though, we have to make sure3222 * that there is infact a reset to process. Otherwise we may race3223 * with ibmvnic_open() and end up leaving the vnic down:3224 *3225 * __ibmvnic_reset() ibmvnic_open()3226 * ----------------- --------------3227 *3228 * set ->resetting bit3229 * find ->resetting bit is set3230 * set ->state to IBMVNIC_OPEN (i.e3231 * assume reset will open device)3232 * return3233 * find reset queue empty3234 * return3235 *3236 * Neither performed vnic login/open and vnic stays down3237 *3238 * If we hold the lock and conditionally set the bit, either we3239 * or ibmvnic_open() will complete the open.3240 */3241 need_reset = false;3242 spin_lock(&adapter->rwi_lock);3243 if (!list_empty(&adapter->rwi_list)) {3244 if (test_and_set_bit_lock(0, &adapter->resetting)) {3245 queue_delayed_work(system_long_wq,3246 &adapter->ibmvnic_delayed_reset,3247 IBMVNIC_RESET_DELAY);3248 } else {3249 need_reset = true;3250 }3251 }3252 spin_unlock(&adapter->rwi_lock);3253 3254 if (!need_reset)3255 return;3256 3257 rwi = get_next_rwi(adapter);3258 while (rwi) {3259 spin_lock_irqsave(&adapter->state_lock, flags);3260 3261 if (adapter->state == VNIC_REMOVING ||3262 adapter->state == VNIC_REMOVED) {3263 spin_unlock_irqrestore(&adapter->state_lock, flags);3264 kfree(rwi);3265 rc = EBUSY;3266 break;3267 }3268 3269 if (!saved_state) {3270 reset_state = adapter->state;3271 saved_state = true;3272 }3273 spin_unlock_irqrestore(&adapter->state_lock, flags);3274 3275 if (rwi->reset_reason == VNIC_RESET_PASSIVE_INIT) {3276 rtnl_lock();3277 rc = do_passive_init(adapter);3278 rtnl_unlock();3279 if (!rc)3280 netif_carrier_on(adapter->netdev);3281 } else if (adapter->force_reset_recovery) {3282 /* Since we are doing a hard reset now, clear the3283 * failover_pending flag so we don't ignore any3284 * future MOBILITY or other resets.3285 */3286 adapter->failover_pending = false;3287 3288 /* Transport event occurred during previous reset */3289 if (adapter->wait_for_reset) {3290 /* Previous was CHANGE_PARAM; caller locked */3291 adapter->force_reset_recovery = false;3292 rc = do_hard_reset(adapter, rwi, reset_state);3293 } else {3294 rtnl_lock();3295 adapter->force_reset_recovery = false;3296 rc = do_hard_reset(adapter, rwi, reset_state);3297 rtnl_unlock();3298 }3299 if (rc)3300 num_fails++;3301 else3302 num_fails = 0;3303 3304 /* If auto-priority-failover is enabled we can get3305 * back to back failovers during resets, resulting3306 * in at least two failed resets (from high-priority3307 * backing device to low-priority one and then back)3308 * If resets continue to fail beyond that, give the3309 * adapter some time to settle down before retrying.3310 */3311 if (num_fails >= 3) {3312 netdev_dbg(adapter->netdev,3313 "[S:%s] Hard reset failed %d times, waiting 60 secs\n",3314 adapter_state_to_string(adapter->state),3315 num_fails);3316 set_current_state(TASK_UNINTERRUPTIBLE);3317 schedule_timeout(60 * HZ);3318 }3319 } else {3320 rc = do_reset(adapter, rwi, reset_state);3321 }3322 tmprwi = rwi;3323 adapter->last_reset_time = jiffies;3324 3325 if (rc)3326 netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc);3327 3328 rwi = get_next_rwi(adapter);3329 3330 /*3331 * If there are no resets queued and the previous reset failed,3332 * the adapter would be in an undefined state. So retry the3333 * previous reset as a hard reset.3334 *3335 * Else, free the previous rwi and, if there is another reset3336 * queued, process the new reset even if previous reset failed3337 * (the previous reset could have failed because of a fail3338 * over for instance, so process the fail over).3339 */3340 if (!rwi && rc)3341 rwi = tmprwi;3342 else3343 kfree(tmprwi);3344 3345 if (rwi && (rwi->reset_reason == VNIC_RESET_FAILOVER ||3346 rwi->reset_reason == VNIC_RESET_MOBILITY || rc))3347 adapter->force_reset_recovery = true;3348 }3349 3350 if (adapter->wait_for_reset) {3351 adapter->reset_done_rc = rc;3352 complete(&adapter->reset_done);3353 }3354 3355 clear_bit_unlock(0, &adapter->resetting);3356 3357 netdev_dbg(adapter->netdev,3358 "[S:%s FRR:%d WFR:%d] Done processing resets\n",3359 adapter_state_to_string(adapter->state),3360 adapter->force_reset_recovery,3361 adapter->wait_for_reset);3362}3363 3364static void __ibmvnic_delayed_reset(struct work_struct *work)3365{3366 struct ibmvnic_adapter *adapter;3367 3368 adapter = container_of(work, struct ibmvnic_adapter,3369 ibmvnic_delayed_reset.work);3370 __ibmvnic_reset(&adapter->ibmvnic_reset);3371}3372 3373static void flush_reset_queue(struct ibmvnic_adapter *adapter)3374{3375 struct list_head *entry, *tmp_entry;3376 3377 if (!list_empty(&adapter->rwi_list)) {3378 list_for_each_safe(entry, tmp_entry, &adapter->rwi_list) {3379 list_del(entry);3380 kfree(list_entry(entry, struct ibmvnic_rwi, list));3381 }3382 }3383}3384 3385static int ibmvnic_reset(struct ibmvnic_adapter *adapter,3386 enum ibmvnic_reset_reason reason)3387{3388 struct net_device *netdev = adapter->netdev;3389 struct ibmvnic_rwi *rwi, *tmp;3390 unsigned long flags;3391 int ret;3392 3393 spin_lock_irqsave(&adapter->rwi_lock, flags);3394 3395 /* If failover is pending don't schedule any other reset.3396 * Instead let the failover complete. If there is already a3397 * a failover reset scheduled, we will detect and drop the3398 * duplicate reset when walking the ->rwi_list below.3399 */3400 if (adapter->state == VNIC_REMOVING ||3401 adapter->state == VNIC_REMOVED ||3402 (adapter->failover_pending && reason != VNIC_RESET_FAILOVER)) {3403 ret = EBUSY;3404 netdev_dbg(netdev, "Adapter removing or pending failover, skipping reset\n");3405 goto err;3406 }3407 3408 list_for_each_entry(tmp, &adapter->rwi_list, list) {3409 if (tmp->reset_reason == reason) {3410 netdev_dbg(netdev, "Skipping matching reset, reason=%s\n",3411 reset_reason_to_string(reason));3412 ret = EBUSY;3413 goto err;3414 }3415 }3416 3417 rwi = kzalloc(sizeof(*rwi), GFP_ATOMIC);3418 if (!rwi) {3419 ret = ENOMEM;3420 goto err;3421 }3422 /* if we just received a transport event,3423 * flush reset queue and process this reset3424 */3425 if (adapter->force_reset_recovery)3426 flush_reset_queue(adapter);3427 3428 rwi->reset_reason = reason;3429 list_add_tail(&rwi->list, &adapter->rwi_list);3430 netdev_dbg(adapter->netdev, "Scheduling reset (reason %s)\n",3431 reset_reason_to_string(reason));3432 queue_work(system_long_wq, &adapter->ibmvnic_reset);3433 3434 ret = 0;3435err:3436 /* ibmvnic_close() below can block, so drop the lock first */3437 spin_unlock_irqrestore(&adapter->rwi_lock, flags);3438 3439 if (ret == ENOMEM)3440 ibmvnic_close(netdev);3441 3442 return -ret;3443}3444 3445static void ibmvnic_tx_timeout(struct net_device *dev, unsigned int txqueue)3446{3447 struct ibmvnic_adapter *adapter = netdev_priv(dev);3448 3449 if (test_bit(0, &adapter->resetting)) {3450 netdev_err(adapter->netdev,3451 "Adapter is resetting, skip timeout reset\n");3452 return;3453 }3454 /* No queuing up reset until at least 5 seconds (default watchdog val)3455 * after last reset3456 */3457 if (time_before(jiffies, (adapter->last_reset_time + dev->watchdog_timeo))) {3458 netdev_dbg(dev, "Not yet time to tx timeout.\n");3459 return;3460 }3461 ibmvnic_reset(adapter, VNIC_RESET_TIMEOUT);3462}3463 3464static void remove_buff_from_pool(struct ibmvnic_adapter *adapter,3465 struct ibmvnic_rx_buff *rx_buff)3466{3467 struct ibmvnic_rx_pool *pool = &adapter->rx_pool[rx_buff->pool_index];3468 3469 rx_buff->skb = NULL;3470 3471 pool->free_map[pool->next_alloc] = (int)(rx_buff - pool->rx_buff);3472 pool->next_alloc = (pool->next_alloc + 1) % pool->size;3473 3474 atomic_dec(&pool->available);3475}3476 3477static int ibmvnic_poll(struct napi_struct *napi, int budget)3478{3479 struct ibmvnic_sub_crq_queue *rx_scrq;3480 struct ibmvnic_adapter *adapter;3481 struct net_device *netdev;3482 int frames_processed;3483 int scrq_num;3484 3485 netdev = napi->dev;3486 adapter = netdev_priv(netdev);3487 scrq_num = (int)(napi - adapter->napi);3488 frames_processed = 0;3489 rx_scrq = adapter->rx_scrq[scrq_num];3490 3491restart_poll:3492 while (frames_processed < budget) {3493 struct sk_buff *skb;3494 struct ibmvnic_rx_buff *rx_buff;3495 union sub_crq *next;3496 u32 length;3497 u16 offset;3498 u8 flags = 0;3499 3500 if (unlikely(test_bit(0, &adapter->resetting) &&3501 adapter->reset_reason != VNIC_RESET_NON_FATAL)) {3502 enable_scrq_irq(adapter, rx_scrq);3503 napi_complete_done(napi, frames_processed);3504 return frames_processed;3505 }3506 3507 if (!pending_scrq(adapter, rx_scrq))3508 break;3509 next = ibmvnic_next_scrq(adapter, rx_scrq);3510 rx_buff = (struct ibmvnic_rx_buff *)3511 be64_to_cpu(next->rx_comp.correlator);3512 /* do error checking */3513 if (next->rx_comp.rc) {3514 netdev_dbg(netdev, "rx buffer returned with rc %x\n",3515 be16_to_cpu(next->rx_comp.rc));3516 /* free the entry */3517 next->rx_comp.first = 0;3518 dev_kfree_skb_any(rx_buff->skb);3519 remove_buff_from_pool(adapter, rx_buff);3520 continue;3521 } else if (!rx_buff->skb) {3522 /* free the entry */3523 next->rx_comp.first = 0;3524 remove_buff_from_pool(adapter, rx_buff);3525 continue;3526 }3527 3528 length = be32_to_cpu(next->rx_comp.len);3529 offset = be16_to_cpu(next->rx_comp.off_frame_data);3530 flags = next->rx_comp.flags;3531 skb = rx_buff->skb;3532 /* load long_term_buff before copying to skb */3533 dma_rmb();3534 skb_copy_to_linear_data(skb, rx_buff->data + offset,3535 length);3536 3537 /* VLAN Header has been stripped by the system firmware and3538 * needs to be inserted by the driver3539 */3540 if (adapter->rx_vlan_header_insertion &&3541 (flags & IBMVNIC_VLAN_STRIPPED))3542 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),3543 ntohs(next->rx_comp.vlan_tci));3544 3545 /* free the entry */3546 next->rx_comp.first = 0;3547 remove_buff_from_pool(adapter, rx_buff);3548 3549 skb_put(skb, length);3550 skb->protocol = eth_type_trans(skb, netdev);3551 skb_record_rx_queue(skb, scrq_num);3552 3553 if (flags & IBMVNIC_IP_CHKSUM_GOOD &&3554 flags & IBMVNIC_TCP_UDP_CHKSUM_GOOD) {3555 skb->ip_summed = CHECKSUM_UNNECESSARY;3556 }3557 3558 length = skb->len;3559 napi_gro_receive(napi, skb); /* send it up */3560 netdev->stats.rx_packets++;3561 netdev->stats.rx_bytes += length;3562 adapter->rx_stats_buffers[scrq_num].packets++;3563 adapter->rx_stats_buffers[scrq_num].bytes += length;3564 frames_processed++;3565 }3566 3567 if (adapter->state != VNIC_CLOSING &&3568 (atomic_read(&adapter->rx_pool[scrq_num].available) <3569 adapter->req_rx_add_entries_per_subcrq / 2))3570 replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]);3571 if (frames_processed < budget) {3572 if (napi_complete_done(napi, frames_processed)) {3573 enable_scrq_irq(adapter, rx_scrq);3574 if (pending_scrq(adapter, rx_scrq)) {3575 if (napi_schedule(napi)) {3576 disable_scrq_irq(adapter, rx_scrq);3577 goto restart_poll;3578 }3579 }3580 }3581 }3582 return frames_processed;3583}3584 3585static int wait_for_reset(struct ibmvnic_adapter *adapter)3586{3587 int rc, ret;3588 3589 adapter->fallback.mtu = adapter->req_mtu;3590 adapter->fallback.rx_queues = adapter->req_rx_queues;3591 adapter->fallback.tx_queues = adapter->req_tx_queues;3592 adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq;3593 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq;3594 3595 reinit_completion(&adapter->reset_done);3596 adapter->wait_for_reset = true;3597 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);3598 3599 if (rc) {3600 ret = rc;3601 goto out;3602 }3603 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, 60000);3604 if (rc) {3605 ret = -ENODEV;3606 goto out;3607 }3608 3609 ret = 0;3610 if (adapter->reset_done_rc) {3611 ret = -EIO;3612 adapter->desired.mtu = adapter->fallback.mtu;3613 adapter->desired.rx_queues = adapter->fallback.rx_queues;3614 adapter->desired.tx_queues = adapter->fallback.tx_queues;3615 adapter->desired.rx_entries = adapter->fallback.rx_entries;3616 adapter->desired.tx_entries = adapter->fallback.tx_entries;3617 3618 reinit_completion(&adapter->reset_done);3619 adapter->wait_for_reset = true;3620 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);3621 if (rc) {3622 ret = rc;3623 goto out;3624 }3625 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done,3626 60000);3627 if (rc) {3628 ret = -ENODEV;3629 goto out;3630 }3631 }3632out:3633 adapter->wait_for_reset = false;3634 3635 return ret;3636}3637 3638static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu)3639{3640 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3641 3642 adapter->desired.mtu = new_mtu + ETH_HLEN;3643 3644 return wait_for_reset(adapter);3645}3646 3647static netdev_features_t ibmvnic_features_check(struct sk_buff *skb,3648 struct net_device *dev,3649 netdev_features_t features)3650{3651 /* Some backing hardware adapters can not3652 * handle packets with a MSS less than 2243653 * or with only one segment.3654 */3655 if (skb_is_gso(skb)) {3656 if (skb_shinfo(skb)->gso_size < 224 ||3657 skb_shinfo(skb)->gso_segs == 1)3658 features &= ~NETIF_F_GSO_MASK;3659 }3660 3661 return features;3662}3663 3664static const struct net_device_ops ibmvnic_netdev_ops = {3665 .ndo_open = ibmvnic_open,3666 .ndo_stop = ibmvnic_close,3667 .ndo_start_xmit = ibmvnic_xmit,3668 .ndo_set_rx_mode = ibmvnic_set_multi,3669 .ndo_set_mac_address = ibmvnic_set_mac,3670 .ndo_validate_addr = eth_validate_addr,3671 .ndo_tx_timeout = ibmvnic_tx_timeout,3672 .ndo_change_mtu = ibmvnic_change_mtu,3673 .ndo_features_check = ibmvnic_features_check,3674};3675 3676/* ethtool functions */3677 3678static int ibmvnic_get_link_ksettings(struct net_device *netdev,3679 struct ethtool_link_ksettings *cmd)3680{3681 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3682 int rc;3683 3684 rc = send_query_phys_parms(adapter);3685 if (rc) {3686 adapter->speed = SPEED_UNKNOWN;3687 adapter->duplex = DUPLEX_UNKNOWN;3688 }3689 cmd->base.speed = adapter->speed;3690 cmd->base.duplex = adapter->duplex;3691 cmd->base.port = PORT_FIBRE;3692 cmd->base.phy_address = 0;3693 cmd->base.autoneg = AUTONEG_ENABLE;3694 3695 return 0;3696}3697 3698static void ibmvnic_get_drvinfo(struct net_device *netdev,3699 struct ethtool_drvinfo *info)3700{3701 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3702 3703 strscpy(info->driver, ibmvnic_driver_name, sizeof(info->driver));3704 strscpy(info->version, IBMVNIC_DRIVER_VERSION, sizeof(info->version));3705 strscpy(info->fw_version, adapter->fw_version,3706 sizeof(info->fw_version));3707}3708 3709static u32 ibmvnic_get_msglevel(struct net_device *netdev)3710{3711 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3712 3713 return adapter->msg_enable;3714}3715 3716static void ibmvnic_set_msglevel(struct net_device *netdev, u32 data)3717{3718 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3719 3720 adapter->msg_enable = data;3721}3722 3723static u32 ibmvnic_get_link(struct net_device *netdev)3724{3725 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3726 3727 /* Don't need to send a query because we request a logical link up at3728 * init and then we wait for link state indications3729 */3730 return adapter->logical_link_state;3731}3732 3733static void ibmvnic_get_ringparam(struct net_device *netdev,3734 struct ethtool_ringparam *ring,3735 struct kernel_ethtool_ringparam *kernel_ring,3736 struct netlink_ext_ack *extack)3737{3738 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3739 3740 ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq;3741 ring->tx_max_pending = adapter->max_tx_entries_per_subcrq;3742 ring->rx_mini_max_pending = 0;3743 ring->rx_jumbo_max_pending = 0;3744 ring->rx_pending = adapter->req_rx_add_entries_per_subcrq;3745 ring->tx_pending = adapter->req_tx_entries_per_subcrq;3746 ring->rx_mini_pending = 0;3747 ring->rx_jumbo_pending = 0;3748}3749 3750static int ibmvnic_set_ringparam(struct net_device *netdev,3751 struct ethtool_ringparam *ring,3752 struct kernel_ethtool_ringparam *kernel_ring,3753 struct netlink_ext_ack *extack)3754{3755 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3756 3757 if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq ||3758 ring->tx_pending > adapter->max_tx_entries_per_subcrq) {3759 netdev_err(netdev, "Invalid request.\n");3760 netdev_err(netdev, "Max tx buffers = %llu\n",3761 adapter->max_rx_add_entries_per_subcrq);3762 netdev_err(netdev, "Max rx buffers = %llu\n",3763 adapter->max_tx_entries_per_subcrq);3764 return -EINVAL;3765 }3766 3767 adapter->desired.rx_entries = ring->rx_pending;3768 adapter->desired.tx_entries = ring->tx_pending;3769 3770 return wait_for_reset(adapter);3771}3772 3773static void ibmvnic_get_channels(struct net_device *netdev,3774 struct ethtool_channels *channels)3775{3776 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3777 3778 channels->max_rx = adapter->max_rx_queues;3779 channels->max_tx = adapter->max_tx_queues;3780 channels->max_other = 0;3781 channels->max_combined = 0;3782 channels->rx_count = adapter->req_rx_queues;3783 channels->tx_count = adapter->req_tx_queues;3784 channels->other_count = 0;3785 channels->combined_count = 0;3786}3787 3788static int ibmvnic_set_channels(struct net_device *netdev,3789 struct ethtool_channels *channels)3790{3791 struct ibmvnic_adapter *adapter = netdev_priv(netdev);3792 3793 adapter->desired.rx_queues = channels->rx_count;3794 adapter->desired.tx_queues = channels->tx_count;3795 3796 return wait_for_reset(adapter);3797}3798 3799static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)3800{3801 struct ibmvnic_adapter *adapter = netdev_priv(dev);3802 int i;3803 3804 if (stringset != ETH_SS_STATS)3805 return;3806 3807 for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++, data += ETH_GSTRING_LEN)3808 memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);3809 3810 for (i = 0; i < adapter->req_tx_queues; i++) {3811 snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);3812 data += ETH_GSTRING_LEN;3813 3814 snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);3815 data += ETH_GSTRING_LEN;3816 3817 snprintf(data, ETH_GSTRING_LEN, "tx%d_dropped_packets", i);3818 data += ETH_GSTRING_LEN;3819 }3820 3821 for (i = 0; i < adapter->req_rx_queues; i++) {3822 snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);3823 data += ETH_GSTRING_LEN;3824 3825 snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);3826 data += ETH_GSTRING_LEN;3827 3828 snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);3829 data += ETH_GSTRING_LEN;3830 }3831}3832 3833static int ibmvnic_get_sset_count(struct net_device *dev, int sset)3834{3835 struct ibmvnic_adapter *adapter = netdev_priv(dev);3836 3837 switch (sset) {3838 case ETH_SS_STATS:3839 return ARRAY_SIZE(ibmvnic_stats) +3840 adapter->req_tx_queues * NUM_TX_STATS +3841 adapter->req_rx_queues * NUM_RX_STATS;3842 default:3843 return -EOPNOTSUPP;3844 }3845}3846 3847static void ibmvnic_get_ethtool_stats(struct net_device *dev,3848 struct ethtool_stats *stats, u64 *data)3849{3850 struct ibmvnic_adapter *adapter = netdev_priv(dev);3851 union ibmvnic_crq crq;3852 int i, j;3853 int rc;3854 3855 memset(&crq, 0, sizeof(crq));3856 crq.request_statistics.first = IBMVNIC_CRQ_CMD;3857 crq.request_statistics.cmd = REQUEST_STATISTICS;3858 crq.request_statistics.ioba = cpu_to_be32(adapter->stats_token);3859 crq.request_statistics.len =3860 cpu_to_be32(sizeof(struct ibmvnic_statistics));3861 3862 /* Wait for data to be written */3863 reinit_completion(&adapter->stats_done);3864 rc = ibmvnic_send_crq(adapter, &crq);3865 if (rc)3866 return;3867 rc = ibmvnic_wait_for_completion(adapter, &adapter->stats_done, 10000);3868 if (rc)3869 return;3870 3871 for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++)3872 data[i] = be64_to_cpu(IBMVNIC_GET_STAT3873 (adapter, ibmvnic_stats[i].offset));3874 3875 for (j = 0; j < adapter->req_tx_queues; j++) {3876 data[i] = adapter->tx_stats_buffers[j].packets;3877 i++;3878 data[i] = adapter->tx_stats_buffers[j].bytes;3879 i++;3880 data[i] = adapter->tx_stats_buffers[j].dropped_packets;3881 i++;3882 }3883 3884 for (j = 0; j < adapter->req_rx_queues; j++) {3885 data[i] = adapter->rx_stats_buffers[j].packets;3886 i++;3887 data[i] = adapter->rx_stats_buffers[j].bytes;3888 i++;3889 data[i] = adapter->rx_stats_buffers[j].interrupts;3890 i++;3891 }3892}3893 3894static const struct ethtool_ops ibmvnic_ethtool_ops = {3895 .get_drvinfo = ibmvnic_get_drvinfo,3896 .get_msglevel = ibmvnic_get_msglevel,3897 .set_msglevel = ibmvnic_set_msglevel,3898 .get_link = ibmvnic_get_link,3899 .get_ringparam = ibmvnic_get_ringparam,3900 .set_ringparam = ibmvnic_set_ringparam,3901 .get_channels = ibmvnic_get_channels,3902 .set_channels = ibmvnic_set_channels,3903 .get_strings = ibmvnic_get_strings,3904 .get_sset_count = ibmvnic_get_sset_count,3905 .get_ethtool_stats = ibmvnic_get_ethtool_stats,3906 .get_link_ksettings = ibmvnic_get_link_ksettings,3907};3908 3909/* Routines for managing CRQs/sCRQs */3910 3911static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter,3912 struct ibmvnic_sub_crq_queue *scrq)3913{3914 int rc;3915 3916 if (!scrq) {3917 netdev_dbg(adapter->netdev, "Invalid scrq reset.\n");3918 return -EINVAL;3919 }3920 3921 if (scrq->irq) {3922 free_irq(scrq->irq, scrq);3923 irq_dispose_mapping(scrq->irq);3924 scrq->irq = 0;3925 }3926 3927 if (scrq->msgs) {3928 memset(scrq->msgs, 0, 4 * PAGE_SIZE);3929 atomic_set(&scrq->used, 0);3930 scrq->cur = 0;3931 scrq->ind_buf.index = 0;3932 } else {3933 netdev_dbg(adapter->netdev, "Invalid scrq reset\n");3934 return -EINVAL;3935 }3936 3937 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,3938 4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq);3939 return rc;3940}3941 3942static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter)3943{3944 int i, rc;3945 3946 if (!adapter->tx_scrq || !adapter->rx_scrq)3947 return -EINVAL;3948 3949 ibmvnic_clean_affinity(adapter);3950 3951 for (i = 0; i < adapter->req_tx_queues; i++) {3952 netdev_dbg(adapter->netdev, "Re-setting tx_scrq[%d]\n", i);3953 rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]);3954 if (rc)3955 return rc;3956 }3957 3958 for (i = 0; i < adapter->req_rx_queues; i++) {3959 netdev_dbg(adapter->netdev, "Re-setting rx_scrq[%d]\n", i);3960 rc = reset_one_sub_crq_queue(adapter, adapter->rx_scrq[i]);3961 if (rc)3962 return rc;3963 }3964 3965 return rc;3966}3967 3968static void release_sub_crq_queue(struct ibmvnic_adapter *adapter,3969 struct ibmvnic_sub_crq_queue *scrq,3970 bool do_h_free)3971{3972 struct device *dev = &adapter->vdev->dev;3973 long rc;3974 3975 netdev_dbg(adapter->netdev, "Releasing sub-CRQ\n");3976 3977 if (do_h_free) {3978 /* Close the sub-crqs */3979 do {3980 rc = plpar_hcall_norets(H_FREE_SUB_CRQ,3981 adapter->vdev->unit_address,3982 scrq->crq_num);3983 } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));3984 3985 if (rc) {3986 netdev_err(adapter->netdev,3987 "Failed to release sub-CRQ %16lx, rc = %ld\n",3988 scrq->crq_num, rc);3989 }3990 }3991 3992 dma_free_coherent(dev,3993 IBMVNIC_IND_ARR_SZ,3994 scrq->ind_buf.indir_arr,3995 scrq->ind_buf.indir_dma);3996 3997 dma_unmap_single(dev, scrq->msg_token, 4 * PAGE_SIZE,3998 DMA_BIDIRECTIONAL);3999 free_pages((unsigned long)scrq->msgs, 2);4000 free_cpumask_var(scrq->affinity_mask);4001 kfree(scrq);4002}4003 4004static struct ibmvnic_sub_crq_queue *init_sub_crq_queue(struct ibmvnic_adapter4005 *adapter)4006{4007 struct device *dev = &adapter->vdev->dev;4008 struct ibmvnic_sub_crq_queue *scrq;4009 int rc;4010 4011 scrq = kzalloc(sizeof(*scrq), GFP_KERNEL);4012 if (!scrq)4013 return NULL;4014 4015 scrq->msgs =4016 (union sub_crq *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 2);4017 if (!scrq->msgs) {4018 dev_warn(dev, "Couldn't allocate crq queue messages page\n");4019 goto zero_page_failed;4020 }4021 if (!zalloc_cpumask_var(&scrq->affinity_mask, GFP_KERNEL))4022 goto cpumask_alloc_failed;4023 4024 scrq->msg_token = dma_map_single(dev, scrq->msgs, 4 * PAGE_SIZE,4025 DMA_BIDIRECTIONAL);4026 if (dma_mapping_error(dev, scrq->msg_token)) {4027 dev_warn(dev, "Couldn't map crq queue messages page\n");4028 goto map_failed;4029 }4030 4031 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token,4032 4 * PAGE_SIZE, &scrq->crq_num, &scrq->hw_irq);4033 4034 if (rc == H_RESOURCE)4035 rc = ibmvnic_reset_crq(adapter);4036 4037 if (rc == H_CLOSED) {4038 dev_warn(dev, "Partner adapter not ready, waiting.\n");4039 } else if (rc) {4040 dev_warn(dev, "Error %d registering sub-crq\n", rc);4041 goto reg_failed;4042 }4043 4044 scrq->adapter = adapter;4045 scrq->size = 4 * PAGE_SIZE / sizeof(*scrq->msgs);4046 scrq->ind_buf.index = 0;4047 4048 scrq->ind_buf.indir_arr =4049 dma_alloc_coherent(dev,4050 IBMVNIC_IND_ARR_SZ,4051 &scrq->ind_buf.indir_dma,4052 GFP_KERNEL);4053 4054 if (!scrq->ind_buf.indir_arr)4055 goto indir_failed;4056 4057 spin_lock_init(&scrq->lock);4058 4059 netdev_dbg(adapter->netdev,4060 "sub-crq initialized, num %lx, hw_irq=%lx, irq=%x\n",4061 scrq->crq_num, scrq->hw_irq, scrq->irq);4062 4063 return scrq;4064 4065indir_failed:4066 do {4067 rc = plpar_hcall_norets(H_FREE_SUB_CRQ,4068 adapter->vdev->unit_address,4069 scrq->crq_num);4070 } while (rc == H_BUSY || rc == H_IS_LONG_BUSY(rc));4071reg_failed:4072 dma_unmap_single(dev, scrq->msg_token, 4 * PAGE_SIZE,4073 DMA_BIDIRECTIONAL);4074map_failed:4075 free_cpumask_var(scrq->affinity_mask);4076cpumask_alloc_failed:4077 free_pages((unsigned long)scrq->msgs, 2);4078zero_page_failed:4079 kfree(scrq);4080 4081 return NULL;4082}4083 4084static void release_sub_crqs(struct ibmvnic_adapter *adapter, bool do_h_free)4085{4086 int i;4087 4088 ibmvnic_clean_affinity(adapter);4089 if (adapter->tx_scrq) {4090 for (i = 0; i < adapter->num_active_tx_scrqs; i++) {4091 if (!adapter->tx_scrq[i])4092 continue;4093 4094 netdev_dbg(adapter->netdev, "Releasing tx_scrq[%d]\n",4095 i);4096 ibmvnic_tx_scrq_clean_buffer(adapter, adapter->tx_scrq[i]);4097 if (adapter->tx_scrq[i]->irq) {4098 free_irq(adapter->tx_scrq[i]->irq,4099 adapter->tx_scrq[i]);4100 irq_dispose_mapping(adapter->tx_scrq[i]->irq);4101 adapter->tx_scrq[i]->irq = 0;4102 }4103 4104 release_sub_crq_queue(adapter, adapter->tx_scrq[i],4105 do_h_free);4106 }4107 4108 kfree(adapter->tx_scrq);4109 adapter->tx_scrq = NULL;4110 adapter->num_active_tx_scrqs = 0;4111 }4112 4113 /* Clean any remaining outstanding SKBs4114 * we freed the irq so we won't be hearing4115 * from them4116 */4117 clean_tx_pools(adapter);4118 4119 if (adapter->rx_scrq) {4120 for (i = 0; i < adapter->num_active_rx_scrqs; i++) {4121 if (!adapter->rx_scrq[i])4122 continue;4123 4124 netdev_dbg(adapter->netdev, "Releasing rx_scrq[%d]\n",4125 i);4126 if (adapter->rx_scrq[i]->irq) {4127 free_irq(adapter->rx_scrq[i]->irq,4128 adapter->rx_scrq[i]);4129 irq_dispose_mapping(adapter->rx_scrq[i]->irq);4130 adapter->rx_scrq[i]->irq = 0;4131 }4132 4133 release_sub_crq_queue(adapter, adapter->rx_scrq[i],4134 do_h_free);4135 }4136 4137 kfree(adapter->rx_scrq);4138 adapter->rx_scrq = NULL;4139 adapter->num_active_rx_scrqs = 0;4140 }4141}4142 4143static int disable_scrq_irq(struct ibmvnic_adapter *adapter,4144 struct ibmvnic_sub_crq_queue *scrq)4145{4146 struct device *dev = &adapter->vdev->dev;4147 unsigned long rc;4148 4149 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address,4150 H_DISABLE_VIO_INTERRUPT, scrq->hw_irq, 0, 0);4151 if (rc)4152 dev_err(dev, "Couldn't disable scrq irq 0x%lx. rc=%ld\n",4153 scrq->hw_irq, rc);4154 return rc;4155}4156 4157/* We can not use the IRQ chip EOI handler because that has the4158 * unintended effect of changing the interrupt priority.4159 */4160static void ibmvnic_xics_eoi(struct device *dev, struct ibmvnic_sub_crq_queue *scrq)4161{4162 u64 val = 0xff000000 | scrq->hw_irq;4163 unsigned long rc;4164 4165 rc = plpar_hcall_norets(H_EOI, val);4166 if (rc)4167 dev_err(dev, "H_EOI FAILED irq 0x%llx. rc=%ld\n", val, rc);4168}4169 4170/* Due to a firmware bug, the hypervisor can send an interrupt to a4171 * transmit or receive queue just prior to a partition migration.4172 * Force an EOI after migration.4173 */4174static void ibmvnic_clear_pending_interrupt(struct device *dev,4175 struct ibmvnic_sub_crq_queue *scrq)4176{4177 if (!xive_enabled())4178 ibmvnic_xics_eoi(dev, scrq);4179}4180 4181static int enable_scrq_irq(struct ibmvnic_adapter *adapter,4182 struct ibmvnic_sub_crq_queue *scrq)4183{4184 struct device *dev = &adapter->vdev->dev;4185 unsigned long rc;4186 4187 if (scrq->hw_irq > 0x100000000ULL) {4188 dev_err(dev, "bad hw_irq = %lx\n", scrq->hw_irq);4189 return 1;4190 }4191 4192 if (test_bit(0, &adapter->resetting) &&4193 adapter->reset_reason == VNIC_RESET_MOBILITY) {4194 ibmvnic_clear_pending_interrupt(dev, scrq);4195 }4196 4197 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address,4198 H_ENABLE_VIO_INTERRUPT, scrq->hw_irq, 0, 0);4199 if (rc)4200 dev_err(dev, "Couldn't enable scrq irq 0x%lx. rc=%ld\n",4201 scrq->hw_irq, rc);4202 return rc;4203}4204 4205static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter,4206 struct ibmvnic_sub_crq_queue *scrq)4207{4208 struct device *dev = &adapter->vdev->dev;4209 int num_packets = 0, total_bytes = 0;4210 struct ibmvnic_tx_pool *tx_pool;4211 struct ibmvnic_tx_buff *txbuff;4212 struct netdev_queue *txq;4213 union sub_crq *next;4214 int index, i;4215 4216restart_loop:4217 while (pending_scrq(adapter, scrq)) {4218 unsigned int pool = scrq->pool_index;4219 int num_entries = 0;4220 next = ibmvnic_next_scrq(adapter, scrq);4221 for (i = 0; i < next->tx_comp.num_comps; i++) {4222 index = be32_to_cpu(next->tx_comp.correlators[i]);4223 if (index & IBMVNIC_TSO_POOL_MASK) {4224 tx_pool = &adapter->tso_pool[pool];4225 index &= ~IBMVNIC_TSO_POOL_MASK;4226 } else {4227 tx_pool = &adapter->tx_pool[pool];4228 }4229 4230 txbuff = &tx_pool->tx_buff[index];4231 num_packets++;4232 num_entries += txbuff->num_entries;4233 if (txbuff->skb) {4234 total_bytes += txbuff->skb->len;4235 if (next->tx_comp.rcs[i]) {4236 dev_err(dev, "tx error %x\n",4237 next->tx_comp.rcs[i]);4238 dev_kfree_skb_irq(txbuff->skb);4239 } else {4240 dev_consume_skb_irq(txbuff->skb);4241 }4242 txbuff->skb = NULL;4243 } else {4244 netdev_warn(adapter->netdev,4245 "TX completion received with NULL socket buffer\n");4246 }4247 tx_pool->free_map[tx_pool->producer_index] = index;4248 tx_pool->producer_index =4249 (tx_pool->producer_index + 1) %4250 tx_pool->num_buffers;4251 }4252 /* remove tx_comp scrq*/4253 next->tx_comp.first = 0;4254 4255 4256 if (atomic_sub_return(num_entries, &scrq->used) <=4257 (adapter->req_tx_entries_per_subcrq / 2) &&4258 __netif_subqueue_stopped(adapter->netdev,4259 scrq->pool_index)) {4260 rcu_read_lock();4261 if (adapter->tx_queues_active) {4262 netif_wake_subqueue(adapter->netdev,4263 scrq->pool_index);4264 netdev_dbg(adapter->netdev,4265 "Started queue %d\n",4266 scrq->pool_index);4267 }4268 rcu_read_unlock();4269 }4270 }4271 4272 enable_scrq_irq(adapter, scrq);4273 4274 if (pending_scrq(adapter, scrq)) {4275 disable_scrq_irq(adapter, scrq);4276 goto restart_loop;4277 }4278 4279 txq = netdev_get_tx_queue(adapter->netdev, scrq->pool_index);4280 netdev_tx_completed_queue(txq, num_packets, total_bytes);4281 4282 return 0;4283}4284 4285static irqreturn_t ibmvnic_interrupt_tx(int irq, void *instance)4286{4287 struct ibmvnic_sub_crq_queue *scrq = instance;4288 struct ibmvnic_adapter *adapter = scrq->adapter;4289 4290 disable_scrq_irq(adapter, scrq);4291 ibmvnic_complete_tx(adapter, scrq);4292 4293 return IRQ_HANDLED;4294}4295 4296static irqreturn_t ibmvnic_interrupt_rx(int irq, void *instance)4297{4298 struct ibmvnic_sub_crq_queue *scrq = instance;4299 struct ibmvnic_adapter *adapter = scrq->adapter;4300 4301 /* When booting a kdump kernel we can hit pending interrupts4302 * prior to completing driver initialization.4303 */4304 if (unlikely(adapter->state != VNIC_OPEN))4305 return IRQ_NONE;4306 4307 adapter->rx_stats_buffers[scrq->scrq_num].interrupts++;4308 4309 if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) {4310 disable_scrq_irq(adapter, scrq);4311 __napi_schedule(&adapter->napi[scrq->scrq_num]);4312 }4313 4314 return IRQ_HANDLED;4315}4316 4317static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter)4318{4319 struct device *dev = &adapter->vdev->dev;4320 struct ibmvnic_sub_crq_queue *scrq;4321 int i = 0, j = 0;4322 int rc = 0;4323 4324 for (i = 0; i < adapter->req_tx_queues; i++) {4325 netdev_dbg(adapter->netdev, "Initializing tx_scrq[%d] irq\n",4326 i);4327 scrq = adapter->tx_scrq[i];4328 scrq->irq = irq_create_mapping(NULL, scrq->hw_irq);4329 4330 if (!scrq->irq) {4331 rc = -EINVAL;4332 dev_err(dev, "Error mapping irq\n");4333 goto req_tx_irq_failed;4334 }4335 4336 snprintf(scrq->name, sizeof(scrq->name), "ibmvnic-%x-tx%d",4337 adapter->vdev->unit_address, i);4338 rc = request_irq(scrq->irq, ibmvnic_interrupt_tx,4339 0, scrq->name, scrq);4340 4341 if (rc) {4342 dev_err(dev, "Couldn't register tx irq 0x%x. rc=%d\n",4343 scrq->irq, rc);4344 irq_dispose_mapping(scrq->irq);4345 goto req_tx_irq_failed;4346 }4347 }4348 4349 for (i = 0; i < adapter->req_rx_queues; i++) {4350 netdev_dbg(adapter->netdev, "Initializing rx_scrq[%d] irq\n",4351 i);4352 scrq = adapter->rx_scrq[i];4353 scrq->irq = irq_create_mapping(NULL, scrq->hw_irq);4354 if (!scrq->irq) {4355 rc = -EINVAL;4356 dev_err(dev, "Error mapping irq\n");4357 goto req_rx_irq_failed;4358 }4359 snprintf(scrq->name, sizeof(scrq->name), "ibmvnic-%x-rx%d",4360 adapter->vdev->unit_address, i);4361 rc = request_irq(scrq->irq, ibmvnic_interrupt_rx,4362 0, scrq->name, scrq);4363 if (rc) {4364 dev_err(dev, "Couldn't register rx irq 0x%x. rc=%d\n",4365 scrq->irq, rc);4366 irq_dispose_mapping(scrq->irq);4367 goto req_rx_irq_failed;4368 }4369 }4370 4371 cpus_read_lock();4372 ibmvnic_set_affinity(adapter);4373 cpus_read_unlock();4374 4375 return rc;4376 4377req_rx_irq_failed:4378 for (j = 0; j < i; j++) {4379 free_irq(adapter->rx_scrq[j]->irq, adapter->rx_scrq[j]);4380 irq_dispose_mapping(adapter->rx_scrq[j]->irq);4381 }4382 i = adapter->req_tx_queues;4383req_tx_irq_failed:4384 for (j = 0; j < i; j++) {4385 free_irq(adapter->tx_scrq[j]->irq, adapter->tx_scrq[j]);4386 irq_dispose_mapping(adapter->tx_scrq[j]->irq);4387 }4388 release_sub_crqs(adapter, 1);4389 return rc;4390}4391 4392static int init_sub_crqs(struct ibmvnic_adapter *adapter)4393{4394 struct device *dev = &adapter->vdev->dev;4395 struct ibmvnic_sub_crq_queue **allqueues;4396 int registered_queues = 0;4397 int total_queues;4398 int more = 0;4399 int i;4400 4401 total_queues = adapter->req_tx_queues + adapter->req_rx_queues;4402 4403 allqueues = kcalloc(total_queues, sizeof(*allqueues), GFP_KERNEL);4404 if (!allqueues)4405 return -ENOMEM;4406 4407 for (i = 0; i < total_queues; i++) {4408 allqueues[i] = init_sub_crq_queue(adapter);4409 if (!allqueues[i]) {4410 dev_warn(dev, "Couldn't allocate all sub-crqs\n");4411 break;4412 }4413 registered_queues++;4414 }4415 4416 /* Make sure we were able to register the minimum number of queues */4417 if (registered_queues <4418 adapter->min_tx_queues + adapter->min_rx_queues) {4419 dev_err(dev, "Fatal: Couldn't init min number of sub-crqs\n");4420 goto tx_failed;4421 }4422 4423 /* Distribute the failed allocated queues*/4424 for (i = 0; i < total_queues - registered_queues + more ; i++) {4425 netdev_dbg(adapter->netdev, "Reducing number of queues\n");4426 switch (i % 3) {4427 case 0:4428 if (adapter->req_rx_queues > adapter->min_rx_queues)4429 adapter->req_rx_queues--;4430 else4431 more++;4432 break;4433 case 1:4434 if (adapter->req_tx_queues > adapter->min_tx_queues)4435 adapter->req_tx_queues--;4436 else4437 more++;4438 break;4439 }4440 }4441 4442 adapter->tx_scrq = kcalloc(adapter->req_tx_queues,4443 sizeof(*adapter->tx_scrq), GFP_KERNEL);4444 if (!adapter->tx_scrq)4445 goto tx_failed;4446 4447 for (i = 0; i < adapter->req_tx_queues; i++) {4448 adapter->tx_scrq[i] = allqueues[i];4449 adapter->tx_scrq[i]->pool_index = i;4450 adapter->num_active_tx_scrqs++;4451 }4452 4453 adapter->rx_scrq = kcalloc(adapter->req_rx_queues,4454 sizeof(*adapter->rx_scrq), GFP_KERNEL);4455 if (!adapter->rx_scrq)4456 goto rx_failed;4457 4458 for (i = 0; i < adapter->req_rx_queues; i++) {4459 adapter->rx_scrq[i] = allqueues[i + adapter->req_tx_queues];4460 adapter->rx_scrq[i]->scrq_num = i;4461 adapter->num_active_rx_scrqs++;4462 }4463 4464 kfree(allqueues);4465 return 0;4466 4467rx_failed:4468 kfree(adapter->tx_scrq);4469 adapter->tx_scrq = NULL;4470tx_failed:4471 for (i = 0; i < registered_queues; i++)4472 release_sub_crq_queue(adapter, allqueues[i], 1);4473 kfree(allqueues);4474 return -ENOMEM;4475}4476 4477static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)4478{4479 struct device *dev = &adapter->vdev->dev;4480 union ibmvnic_crq crq;4481 int max_entries;4482 int cap_reqs;4483 4484 /* We send out 6 or 7 REQUEST_CAPABILITY CRQs below (depending on4485 * the PROMISC flag). Initialize this count upfront. When the tasklet4486 * receives a response to all of these, it will send the next protocol4487 * message (QUERY_IP_OFFLOAD).4488 */4489 if (!(adapter->netdev->flags & IFF_PROMISC) ||4490 adapter->promisc_supported)4491 cap_reqs = 7;4492 else4493 cap_reqs = 6;4494 4495 if (!retry) {4496 /* Sub-CRQ entries are 32 byte long */4497 int entries_page = 4 * PAGE_SIZE / (sizeof(u64) * 4);4498 4499 atomic_set(&adapter->running_cap_crqs, cap_reqs);4500 4501 if (adapter->min_tx_entries_per_subcrq > entries_page ||4502 adapter->min_rx_add_entries_per_subcrq > entries_page) {4503 dev_err(dev, "Fatal, invalid entries per sub-crq\n");4504 return;4505 }4506 4507 if (adapter->desired.mtu)4508 adapter->req_mtu = adapter->desired.mtu;4509 else4510 adapter->req_mtu = adapter->netdev->mtu + ETH_HLEN;4511 4512 if (!adapter->desired.tx_entries)4513 adapter->desired.tx_entries =4514 adapter->max_tx_entries_per_subcrq;4515 if (!adapter->desired.rx_entries)4516 adapter->desired.rx_entries =4517 adapter->max_rx_add_entries_per_subcrq;4518 4519 max_entries = IBMVNIC_LTB_SET_SIZE /4520 (adapter->req_mtu + IBMVNIC_BUFFER_HLEN);4521 4522 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) *4523 adapter->desired.tx_entries > IBMVNIC_LTB_SET_SIZE) {4524 adapter->desired.tx_entries = max_entries;4525 }4526 4527 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) *4528 adapter->desired.rx_entries > IBMVNIC_LTB_SET_SIZE) {4529 adapter->desired.rx_entries = max_entries;4530 }4531 4532 if (adapter->desired.tx_entries)4533 adapter->req_tx_entries_per_subcrq =4534 adapter->desired.tx_entries;4535 else4536 adapter->req_tx_entries_per_subcrq =4537 adapter->max_tx_entries_per_subcrq;4538 4539 if (adapter->desired.rx_entries)4540 adapter->req_rx_add_entries_per_subcrq =4541 adapter->desired.rx_entries;4542 else4543 adapter->req_rx_add_entries_per_subcrq =4544 adapter->max_rx_add_entries_per_subcrq;4545 4546 if (adapter->desired.tx_queues)4547 adapter->req_tx_queues =4548 adapter->desired.tx_queues;4549 else4550 adapter->req_tx_queues =4551 adapter->opt_tx_comp_sub_queues;4552 4553 if (adapter->desired.rx_queues)4554 adapter->req_rx_queues =4555 adapter->desired.rx_queues;4556 else4557 adapter->req_rx_queues =4558 adapter->opt_rx_comp_queues;4559 4560 adapter->req_rx_add_queues = adapter->max_rx_add_queues;4561 } else {4562 atomic_add(cap_reqs, &adapter->running_cap_crqs);4563 }4564 memset(&crq, 0, sizeof(crq));4565 crq.request_capability.first = IBMVNIC_CRQ_CMD;4566 crq.request_capability.cmd = REQUEST_CAPABILITY;4567 4568 crq.request_capability.capability = cpu_to_be16(REQ_TX_QUEUES);4569 crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues);4570 cap_reqs--;4571 ibmvnic_send_crq(adapter, &crq);4572 4573 crq.request_capability.capability = cpu_to_be16(REQ_RX_QUEUES);4574 crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues);4575 cap_reqs--;4576 ibmvnic_send_crq(adapter, &crq);4577 4578 crq.request_capability.capability = cpu_to_be16(REQ_RX_ADD_QUEUES);4579 crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues);4580 cap_reqs--;4581 ibmvnic_send_crq(adapter, &crq);4582 4583 crq.request_capability.capability =4584 cpu_to_be16(REQ_TX_ENTRIES_PER_SUBCRQ);4585 crq.request_capability.number =4586 cpu_to_be64(adapter->req_tx_entries_per_subcrq);4587 cap_reqs--;4588 ibmvnic_send_crq(adapter, &crq);4589 4590 crq.request_capability.capability =4591 cpu_to_be16(REQ_RX_ADD_ENTRIES_PER_SUBCRQ);4592 crq.request_capability.number =4593 cpu_to_be64(adapter->req_rx_add_entries_per_subcrq);4594 cap_reqs--;4595 ibmvnic_send_crq(adapter, &crq);4596 4597 crq.request_capability.capability = cpu_to_be16(REQ_MTU);4598 crq.request_capability.number = cpu_to_be64(adapter->req_mtu);4599 cap_reqs--;4600 ibmvnic_send_crq(adapter, &crq);4601 4602 if (adapter->netdev->flags & IFF_PROMISC) {4603 if (adapter->promisc_supported) {4604 crq.request_capability.capability =4605 cpu_to_be16(PROMISC_REQUESTED);4606 crq.request_capability.number = cpu_to_be64(1);4607 cap_reqs--;4608 ibmvnic_send_crq(adapter, &crq);4609 }4610 } else {4611 crq.request_capability.capability =4612 cpu_to_be16(PROMISC_REQUESTED);4613 crq.request_capability.number = cpu_to_be64(0);4614 cap_reqs--;4615 ibmvnic_send_crq(adapter, &crq);4616 }4617 4618 /* Keep at end to catch any discrepancy between expected and actual4619 * CRQs sent.4620 */4621 WARN_ON(cap_reqs != 0);4622}4623 4624static int pending_scrq(struct ibmvnic_adapter *adapter,4625 struct ibmvnic_sub_crq_queue *scrq)4626{4627 union sub_crq *entry = &scrq->msgs[scrq->cur];4628 int rc;4629 4630 rc = !!(entry->generic.first & IBMVNIC_CRQ_CMD_RSP);4631 4632 /* Ensure that the SCRQ valid flag is loaded prior to loading the4633 * contents of the SCRQ descriptor4634 */4635 dma_rmb();4636 4637 return rc;4638}4639 4640static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter,4641 struct ibmvnic_sub_crq_queue *scrq)4642{4643 union sub_crq *entry;4644 unsigned long flags;4645 4646 spin_lock_irqsave(&scrq->lock, flags);4647 entry = &scrq->msgs[scrq->cur];4648 if (entry->generic.first & IBMVNIC_CRQ_CMD_RSP) {4649 if (++scrq->cur == scrq->size)4650 scrq->cur = 0;4651 } else {4652 entry = NULL;4653 }4654 spin_unlock_irqrestore(&scrq->lock, flags);4655 4656 /* Ensure that the SCRQ valid flag is loaded prior to loading the4657 * contents of the SCRQ descriptor4658 */4659 dma_rmb();4660 4661 return entry;4662}4663 4664static union ibmvnic_crq *ibmvnic_next_crq(struct ibmvnic_adapter *adapter)4665{4666 struct ibmvnic_crq_queue *queue = &adapter->crq;4667 union ibmvnic_crq *crq;4668 4669 crq = &queue->msgs[queue->cur];4670 if (crq->generic.first & IBMVNIC_CRQ_CMD_RSP) {4671 if (++queue->cur == queue->size)4672 queue->cur = 0;4673 } else {4674 crq = NULL;4675 }4676 4677 return crq;4678}4679 4680static void print_subcrq_error(struct device *dev, int rc, const char *func)4681{4682 switch (rc) {4683 case H_PARAMETER:4684 dev_warn_ratelimited(dev,4685 "%s failed: Send request is malformed or adapter failover pending. (rc=%d)\n",4686 func, rc);4687 break;4688 case H_CLOSED:4689 dev_warn_ratelimited(dev,4690 "%s failed: Backing queue closed. Adapter is down or failover pending. (rc=%d)\n",4691 func, rc);4692 break;4693 default:4694 dev_err_ratelimited(dev, "%s failed: (rc=%d)\n", func, rc);4695 break;4696 }4697}4698 4699static int send_subcrq_indirect(struct ibmvnic_adapter *adapter,4700 u64 remote_handle, u64 ioba, u64 num_entries)4701{4702 unsigned int ua = adapter->vdev->unit_address;4703 struct device *dev = &adapter->vdev->dev;4704 int rc;4705 4706 /* Make sure the hypervisor sees the complete request */4707 dma_wmb();4708 rc = plpar_hcall_norets(H_SEND_SUB_CRQ_INDIRECT, ua,4709 cpu_to_be64(remote_handle),4710 ioba, num_entries);4711 4712 if (rc)4713 print_subcrq_error(dev, rc, __func__);4714 4715 return rc;4716}4717 4718static int ibmvnic_send_crq(struct ibmvnic_adapter *adapter,4719 union ibmvnic_crq *crq)4720{4721 unsigned int ua = adapter->vdev->unit_address;4722 struct device *dev = &adapter->vdev->dev;4723 u64 *u64_crq = (u64 *)crq;4724 int rc;4725 4726 netdev_dbg(adapter->netdev, "Sending CRQ: %016lx %016lx\n",4727 (unsigned long)cpu_to_be64(u64_crq[0]),4728 (unsigned long)cpu_to_be64(u64_crq[1]));4729 4730 if (!adapter->crq.active &&4731 crq->generic.first != IBMVNIC_CRQ_INIT_CMD) {4732 dev_warn(dev, "Invalid request detected while CRQ is inactive, possible device state change during reset\n");4733 return -EINVAL;4734 }4735 4736 /* Make sure the hypervisor sees the complete request */4737 dma_wmb();4738 4739 rc = plpar_hcall_norets(H_SEND_CRQ, ua,4740 cpu_to_be64(u64_crq[0]),4741 cpu_to_be64(u64_crq[1]));4742 4743 if (rc) {4744 if (rc == H_CLOSED) {4745 dev_warn(dev, "CRQ Queue closed\n");4746 /* do not reset, report the fail, wait for passive init from server */4747 }4748 4749 dev_warn(dev, "Send error (rc=%d)\n", rc);4750 }4751 4752 return rc;4753}4754 4755static int ibmvnic_send_crq_init(struct ibmvnic_adapter *adapter)4756{4757 struct device *dev = &adapter->vdev->dev;4758 union ibmvnic_crq crq;4759 int retries = 100;4760 int rc;4761 4762 memset(&crq, 0, sizeof(crq));4763 crq.generic.first = IBMVNIC_CRQ_INIT_CMD;4764 crq.generic.cmd = IBMVNIC_CRQ_INIT;4765 netdev_dbg(adapter->netdev, "Sending CRQ init\n");4766 4767 do {4768 rc = ibmvnic_send_crq(adapter, &crq);4769 if (rc != H_CLOSED)4770 break;4771 retries--;4772 msleep(50);4773 4774 } while (retries > 0);4775 4776 if (rc) {4777 dev_err(dev, "Failed to send init request, rc = %d\n", rc);4778 return rc;4779 }4780 4781 return 0;4782}4783 4784struct vnic_login_client_data {4785 u8 type;4786 __be16 len;4787 char name[];4788} __packed;4789 4790static int vnic_client_data_len(struct ibmvnic_adapter *adapter)4791{4792 int len;4793 4794 /* Calculate the amount of buffer space needed for the4795 * vnic client data in the login buffer. There are four entries,4796 * OS name, LPAR name, device name, and a null last entry.4797 */4798 len = 4 * sizeof(struct vnic_login_client_data);4799 len += 6; /* "Linux" plus NULL */4800 len += strlen(utsname()->nodename) + 1;4801 len += strlen(adapter->netdev->name) + 1;4802 4803 return len;4804}4805 4806static void vnic_add_client_data(struct ibmvnic_adapter *adapter,4807 struct vnic_login_client_data *vlcd)4808{4809 const char *os_name = "Linux";4810 int len;4811 4812 /* Type 1 - LPAR OS */4813 vlcd->type = 1;4814 len = strlen(os_name) + 1;4815 vlcd->len = cpu_to_be16(len);4816 strscpy(vlcd->name, os_name, len);4817 vlcd = (struct vnic_login_client_data *)(vlcd->name + len);4818 4819 /* Type 2 - LPAR name */4820 vlcd->type = 2;4821 len = strlen(utsname()->nodename) + 1;4822 vlcd->len = cpu_to_be16(len);4823 strscpy(vlcd->name, utsname()->nodename, len);4824 vlcd = (struct vnic_login_client_data *)(vlcd->name + len);4825 4826 /* Type 3 - device name */4827 vlcd->type = 3;4828 len = strlen(adapter->netdev->name) + 1;4829 vlcd->len = cpu_to_be16(len);4830 strscpy(vlcd->name, adapter->netdev->name, len);4831}4832 4833static int send_login(struct ibmvnic_adapter *adapter)4834{4835 struct ibmvnic_login_rsp_buffer *login_rsp_buffer;4836 struct ibmvnic_login_buffer *login_buffer;4837 struct device *dev = &adapter->vdev->dev;4838 struct vnic_login_client_data *vlcd;4839 dma_addr_t rsp_buffer_token;4840 dma_addr_t buffer_token;4841 size_t rsp_buffer_size;4842 union ibmvnic_crq crq;4843 int client_data_len;4844 size_t buffer_size;4845 __be64 *tx_list_p;4846 __be64 *rx_list_p;4847 int rc;4848 int i;4849 4850 if (!adapter->tx_scrq || !adapter->rx_scrq) {4851 netdev_err(adapter->netdev,4852 "RX or TX queues are not allocated, device login failed\n");4853 return -ENOMEM;4854 }4855 4856 release_login_buffer(adapter);4857 release_login_rsp_buffer(adapter);4858 4859 client_data_len = vnic_client_data_len(adapter);4860 4861 buffer_size =4862 sizeof(struct ibmvnic_login_buffer) +4863 sizeof(u64) * (adapter->req_tx_queues + adapter->req_rx_queues) +4864 client_data_len;4865 4866 login_buffer = kzalloc(buffer_size, GFP_ATOMIC);4867 if (!login_buffer)4868 goto buf_alloc_failed;4869 4870 buffer_token = dma_map_single(dev, login_buffer, buffer_size,4871 DMA_TO_DEVICE);4872 if (dma_mapping_error(dev, buffer_token)) {4873 dev_err(dev, "Couldn't map login buffer\n");4874 goto buf_map_failed;4875 }4876 4877 rsp_buffer_size = sizeof(struct ibmvnic_login_rsp_buffer) +4878 sizeof(u64) * adapter->req_tx_queues +4879 sizeof(u64) * adapter->req_rx_queues +4880 sizeof(u64) * adapter->req_rx_queues +4881 sizeof(u8) * IBMVNIC_TX_DESC_VERSIONS;4882 4883 login_rsp_buffer = kmalloc(rsp_buffer_size, GFP_ATOMIC);4884 if (!login_rsp_buffer)4885 goto buf_rsp_alloc_failed;4886 4887 rsp_buffer_token = dma_map_single(dev, login_rsp_buffer,4888 rsp_buffer_size, DMA_FROM_DEVICE);4889 if (dma_mapping_error(dev, rsp_buffer_token)) {4890 dev_err(dev, "Couldn't map login rsp buffer\n");4891 goto buf_rsp_map_failed;4892 }4893 4894 adapter->login_buf = login_buffer;4895 adapter->login_buf_token = buffer_token;4896 adapter->login_buf_sz = buffer_size;4897 adapter->login_rsp_buf = login_rsp_buffer;4898 adapter->login_rsp_buf_token = rsp_buffer_token;4899 adapter->login_rsp_buf_sz = rsp_buffer_size;4900 4901 login_buffer->len = cpu_to_be32(buffer_size);4902 login_buffer->version = cpu_to_be32(INITIAL_VERSION_LB);4903 login_buffer->num_txcomp_subcrqs = cpu_to_be32(adapter->req_tx_queues);4904 login_buffer->off_txcomp_subcrqs =4905 cpu_to_be32(sizeof(struct ibmvnic_login_buffer));4906 login_buffer->num_rxcomp_subcrqs = cpu_to_be32(adapter->req_rx_queues);4907 login_buffer->off_rxcomp_subcrqs =4908 cpu_to_be32(sizeof(struct ibmvnic_login_buffer) +4909 sizeof(u64) * adapter->req_tx_queues);4910 login_buffer->login_rsp_ioba = cpu_to_be32(rsp_buffer_token);4911 login_buffer->login_rsp_len = cpu_to_be32(rsp_buffer_size);4912 4913 tx_list_p = (__be64 *)((char *)login_buffer +4914 sizeof(struct ibmvnic_login_buffer));4915 rx_list_p = (__be64 *)((char *)login_buffer +4916 sizeof(struct ibmvnic_login_buffer) +4917 sizeof(u64) * adapter->req_tx_queues);4918 4919 for (i = 0; i < adapter->req_tx_queues; i++) {4920 if (adapter->tx_scrq[i]) {4921 tx_list_p[i] =4922 cpu_to_be64(adapter->tx_scrq[i]->crq_num);4923 }4924 }4925 4926 for (i = 0; i < adapter->req_rx_queues; i++) {4927 if (adapter->rx_scrq[i]) {4928 rx_list_p[i] =4929 cpu_to_be64(adapter->rx_scrq[i]->crq_num);4930 }4931 }4932 4933 /* Insert vNIC login client data */4934 vlcd = (struct vnic_login_client_data *)4935 ((char *)rx_list_p + (sizeof(u64) * adapter->req_rx_queues));4936 login_buffer->client_data_offset =4937 cpu_to_be32((char *)vlcd - (char *)login_buffer);4938 login_buffer->client_data_len = cpu_to_be32(client_data_len);4939 4940 vnic_add_client_data(adapter, vlcd);4941 4942 netdev_dbg(adapter->netdev, "Login Buffer:\n");4943 for (i = 0; i < (adapter->login_buf_sz - 1) / 8 + 1; i++) {4944 netdev_dbg(adapter->netdev, "%016lx\n",4945 ((unsigned long *)(adapter->login_buf))[i]);4946 }4947 4948 memset(&crq, 0, sizeof(crq));4949 crq.login.first = IBMVNIC_CRQ_CMD;4950 crq.login.cmd = LOGIN;4951 crq.login.ioba = cpu_to_be32(buffer_token);4952 crq.login.len = cpu_to_be32(buffer_size);4953 4954 adapter->login_pending = true;4955 rc = ibmvnic_send_crq(adapter, &crq);4956 if (rc) {4957 adapter->login_pending = false;4958 netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc);4959 goto buf_send_failed;4960 }4961 4962 return 0;4963 4964buf_send_failed:4965 dma_unmap_single(dev, rsp_buffer_token, rsp_buffer_size,4966 DMA_FROM_DEVICE);4967buf_rsp_map_failed:4968 kfree(login_rsp_buffer);4969 adapter->login_rsp_buf = NULL;4970buf_rsp_alloc_failed:4971 dma_unmap_single(dev, buffer_token, buffer_size, DMA_TO_DEVICE);4972buf_map_failed:4973 kfree(login_buffer);4974 adapter->login_buf = NULL;4975buf_alloc_failed:4976 return -ENOMEM;4977}4978 4979static int send_request_map(struct ibmvnic_adapter *adapter, dma_addr_t addr,4980 u32 len, u8 map_id)4981{4982 union ibmvnic_crq crq;4983 4984 memset(&crq, 0, sizeof(crq));4985 crq.request_map.first = IBMVNIC_CRQ_CMD;4986 crq.request_map.cmd = REQUEST_MAP;4987 crq.request_map.map_id = map_id;4988 crq.request_map.ioba = cpu_to_be32(addr);4989 crq.request_map.len = cpu_to_be32(len);4990 return ibmvnic_send_crq(adapter, &crq);4991}4992 4993static int send_request_unmap(struct ibmvnic_adapter *adapter, u8 map_id)4994{4995 union ibmvnic_crq crq;4996 4997 memset(&crq, 0, sizeof(crq));4998 crq.request_unmap.first = IBMVNIC_CRQ_CMD;4999 crq.request_unmap.cmd = REQUEST_UNMAP;5000 crq.request_unmap.map_id = map_id;5001 return ibmvnic_send_crq(adapter, &crq);5002}5003 5004static void send_query_map(struct ibmvnic_adapter *adapter)5005{5006 union ibmvnic_crq crq;5007 5008 memset(&crq, 0, sizeof(crq));5009 crq.query_map.first = IBMVNIC_CRQ_CMD;5010 crq.query_map.cmd = QUERY_MAP;5011 ibmvnic_send_crq(adapter, &crq);5012}5013 5014/* Send a series of CRQs requesting various capabilities of the VNIC server */5015static void send_query_cap(struct ibmvnic_adapter *adapter)5016{5017 union ibmvnic_crq crq;5018 int cap_reqs;5019 5020 /* We send out 25 QUERY_CAPABILITY CRQs below. Initialize this count5021 * upfront. When the tasklet receives a response to all of these, it5022 * can send out the next protocol messaage (REQUEST_CAPABILITY).5023 */5024 cap_reqs = 25;5025 5026 atomic_set(&adapter->running_cap_crqs, cap_reqs);5027 5028 memset(&crq, 0, sizeof(crq));5029 crq.query_capability.first = IBMVNIC_CRQ_CMD;5030 crq.query_capability.cmd = QUERY_CAPABILITY;5031 5032 crq.query_capability.capability = cpu_to_be16(MIN_TX_QUEUES);5033 ibmvnic_send_crq(adapter, &crq);5034 cap_reqs--;5035 5036 crq.query_capability.capability = cpu_to_be16(MIN_RX_QUEUES);5037 ibmvnic_send_crq(adapter, &crq);5038 cap_reqs--;5039 5040 crq.query_capability.capability = cpu_to_be16(MIN_RX_ADD_QUEUES);5041 ibmvnic_send_crq(adapter, &crq);5042 cap_reqs--;5043 5044 crq.query_capability.capability = cpu_to_be16(MAX_TX_QUEUES);5045 ibmvnic_send_crq(adapter, &crq);5046 cap_reqs--;5047 5048 crq.query_capability.capability = cpu_to_be16(MAX_RX_QUEUES);5049 ibmvnic_send_crq(adapter, &crq);5050 cap_reqs--;5051 5052 crq.query_capability.capability = cpu_to_be16(MAX_RX_ADD_QUEUES);5053 ibmvnic_send_crq(adapter, &crq);5054 cap_reqs--;5055 5056 crq.query_capability.capability =5057 cpu_to_be16(MIN_TX_ENTRIES_PER_SUBCRQ);5058 ibmvnic_send_crq(adapter, &crq);5059 cap_reqs--;5060 5061 crq.query_capability.capability =5062 cpu_to_be16(MIN_RX_ADD_ENTRIES_PER_SUBCRQ);5063 ibmvnic_send_crq(adapter, &crq);5064 cap_reqs--;5065 5066 crq.query_capability.capability =5067 cpu_to_be16(MAX_TX_ENTRIES_PER_SUBCRQ);5068 ibmvnic_send_crq(adapter, &crq);5069 cap_reqs--;5070 5071 crq.query_capability.capability =5072 cpu_to_be16(MAX_RX_ADD_ENTRIES_PER_SUBCRQ);5073 ibmvnic_send_crq(adapter, &crq);5074 cap_reqs--;5075 5076 crq.query_capability.capability = cpu_to_be16(TCP_IP_OFFLOAD);5077 ibmvnic_send_crq(adapter, &crq);5078 cap_reqs--;5079 5080 crq.query_capability.capability = cpu_to_be16(PROMISC_SUPPORTED);5081 ibmvnic_send_crq(adapter, &crq);5082 cap_reqs--;5083 5084 crq.query_capability.capability = cpu_to_be16(MIN_MTU);5085 ibmvnic_send_crq(adapter, &crq);5086 cap_reqs--;5087 5088 crq.query_capability.capability = cpu_to_be16(MAX_MTU);5089 ibmvnic_send_crq(adapter, &crq);5090 cap_reqs--;5091 5092 crq.query_capability.capability = cpu_to_be16(MAX_MULTICAST_FILTERS);5093 ibmvnic_send_crq(adapter, &crq);5094 cap_reqs--;5095 5096 crq.query_capability.capability = cpu_to_be16(VLAN_HEADER_INSERTION);5097 ibmvnic_send_crq(adapter, &crq);5098 cap_reqs--;5099 5100 crq.query_capability.capability = cpu_to_be16(RX_VLAN_HEADER_INSERTION);5101 ibmvnic_send_crq(adapter, &crq);5102 cap_reqs--;5103 5104 crq.query_capability.capability = cpu_to_be16(MAX_TX_SG_ENTRIES);5105 ibmvnic_send_crq(adapter, &crq);5106 cap_reqs--;5107 5108 crq.query_capability.capability = cpu_to_be16(RX_SG_SUPPORTED);5109 ibmvnic_send_crq(adapter, &crq);5110 cap_reqs--;5111 5112 crq.query_capability.capability = cpu_to_be16(OPT_TX_COMP_SUB_QUEUES);5113 ibmvnic_send_crq(adapter, &crq);5114 cap_reqs--;5115 5116 crq.query_capability.capability = cpu_to_be16(OPT_RX_COMP_QUEUES);5117 ibmvnic_send_crq(adapter, &crq);5118 cap_reqs--;5119 5120 crq.query_capability.capability =5121 cpu_to_be16(OPT_RX_BUFADD_Q_PER_RX_COMP_Q);5122 ibmvnic_send_crq(adapter, &crq);5123 cap_reqs--;5124 5125 crq.query_capability.capability =5126 cpu_to_be16(OPT_TX_ENTRIES_PER_SUBCRQ);5127 ibmvnic_send_crq(adapter, &crq);5128 cap_reqs--;5129 5130 crq.query_capability.capability =5131 cpu_to_be16(OPT_RXBA_ENTRIES_PER_SUBCRQ);5132 ibmvnic_send_crq(adapter, &crq);5133 cap_reqs--;5134 5135 crq.query_capability.capability = cpu_to_be16(TX_RX_DESC_REQ);5136 5137 ibmvnic_send_crq(adapter, &crq);5138 cap_reqs--;5139 5140 /* Keep at end to catch any discrepancy between expected and actual5141 * CRQs sent.5142 */5143 WARN_ON(cap_reqs != 0);5144}5145 5146static void send_query_ip_offload(struct ibmvnic_adapter *adapter)5147{5148 int buf_sz = sizeof(struct ibmvnic_query_ip_offload_buffer);5149 struct device *dev = &adapter->vdev->dev;5150 union ibmvnic_crq crq;5151 5152 adapter->ip_offload_tok =5153 dma_map_single(dev,5154 &adapter->ip_offload_buf,5155 buf_sz,5156 DMA_FROM_DEVICE);5157 5158 if (dma_mapping_error(dev, adapter->ip_offload_tok)) {5159 if (!firmware_has_feature(FW_FEATURE_CMO))5160 dev_err(dev, "Couldn't map offload buffer\n");5161 return;5162 }5163 5164 memset(&crq, 0, sizeof(crq));5165 crq.query_ip_offload.first = IBMVNIC_CRQ_CMD;5166 crq.query_ip_offload.cmd = QUERY_IP_OFFLOAD;5167 crq.query_ip_offload.len = cpu_to_be32(buf_sz);5168 crq.query_ip_offload.ioba =5169 cpu_to_be32(adapter->ip_offload_tok);5170 5171 ibmvnic_send_crq(adapter, &crq);5172}5173 5174static void send_control_ip_offload(struct ibmvnic_adapter *adapter)5175{5176 struct ibmvnic_control_ip_offload_buffer *ctrl_buf = &adapter->ip_offload_ctrl;5177 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf;5178 struct device *dev = &adapter->vdev->dev;5179 netdev_features_t old_hw_features = 0;5180 union ibmvnic_crq crq;5181 5182 adapter->ip_offload_ctrl_tok =5183 dma_map_single(dev,5184 ctrl_buf,5185 sizeof(adapter->ip_offload_ctrl),5186 DMA_TO_DEVICE);5187 5188 if (dma_mapping_error(dev, adapter->ip_offload_ctrl_tok)) {5189 dev_err(dev, "Couldn't map ip offload control buffer\n");5190 return;5191 }5192 5193 ctrl_buf->len = cpu_to_be32(sizeof(adapter->ip_offload_ctrl));5194 ctrl_buf->version = cpu_to_be32(INITIAL_VERSION_IOB);5195 ctrl_buf->ipv4_chksum = buf->ipv4_chksum;5196 ctrl_buf->ipv6_chksum = buf->ipv6_chksum;5197 ctrl_buf->tcp_ipv4_chksum = buf->tcp_ipv4_chksum;5198 ctrl_buf->udp_ipv4_chksum = buf->udp_ipv4_chksum;5199 ctrl_buf->tcp_ipv6_chksum = buf->tcp_ipv6_chksum;5200 ctrl_buf->udp_ipv6_chksum = buf->udp_ipv6_chksum;5201 ctrl_buf->large_tx_ipv4 = buf->large_tx_ipv4;5202 ctrl_buf->large_tx_ipv6 = buf->large_tx_ipv6;5203 5204 /* large_rx disabled for now, additional features needed */5205 ctrl_buf->large_rx_ipv4 = 0;5206 ctrl_buf->large_rx_ipv6 = 0;5207 5208 if (adapter->state != VNIC_PROBING) {5209 old_hw_features = adapter->netdev->hw_features;5210 adapter->netdev->hw_features = 0;5211 }5212 5213 adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO;5214 5215 if (buf->tcp_ipv4_chksum || buf->udp_ipv4_chksum)5216 adapter->netdev->hw_features |= NETIF_F_IP_CSUM;5217 5218 if (buf->tcp_ipv6_chksum || buf->udp_ipv6_chksum)5219 adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM;5220 5221 if ((adapter->netdev->features &5222 (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))5223 adapter->netdev->hw_features |= NETIF_F_RXCSUM;5224 5225 if (buf->large_tx_ipv4)5226 adapter->netdev->hw_features |= NETIF_F_TSO;5227 if (buf->large_tx_ipv6)5228 adapter->netdev->hw_features |= NETIF_F_TSO6;5229 5230 if (adapter->state == VNIC_PROBING) {5231 adapter->netdev->features |= adapter->netdev->hw_features;5232 } else if (old_hw_features != adapter->netdev->hw_features) {5233 netdev_features_t tmp = 0;5234 5235 /* disable features no longer supported */5236 adapter->netdev->features &= adapter->netdev->hw_features;5237 /* turn on features now supported if previously enabled */5238 tmp = (old_hw_features ^ adapter->netdev->hw_features) &5239 adapter->netdev->hw_features;5240 adapter->netdev->features |=5241 tmp & adapter->netdev->wanted_features;5242 }5243 5244 memset(&crq, 0, sizeof(crq));5245 crq.control_ip_offload.first = IBMVNIC_CRQ_CMD;5246 crq.control_ip_offload.cmd = CONTROL_IP_OFFLOAD;5247 crq.control_ip_offload.len =5248 cpu_to_be32(sizeof(adapter->ip_offload_ctrl));5249 crq.control_ip_offload.ioba = cpu_to_be32(adapter->ip_offload_ctrl_tok);5250 ibmvnic_send_crq(adapter, &crq);5251}5252 5253static void handle_vpd_size_rsp(union ibmvnic_crq *crq,5254 struct ibmvnic_adapter *adapter)5255{5256 struct device *dev = &adapter->vdev->dev;5257 5258 if (crq->get_vpd_size_rsp.rc.code) {5259 dev_err(dev, "Error retrieving VPD size, rc=%x\n",5260 crq->get_vpd_size_rsp.rc.code);5261 complete(&adapter->fw_done);5262 return;5263 }5264 5265 adapter->vpd->len = be64_to_cpu(crq->get_vpd_size_rsp.len);5266 complete(&adapter->fw_done);5267}5268 5269static void handle_vpd_rsp(union ibmvnic_crq *crq,5270 struct ibmvnic_adapter *adapter)5271{5272 struct device *dev = &adapter->vdev->dev;5273 unsigned char *substr = NULL;5274 u8 fw_level_len = 0;5275 5276 memset(adapter->fw_version, 0, 32);5277 5278 dma_unmap_single(dev, adapter->vpd->dma_addr, adapter->vpd->len,5279 DMA_FROM_DEVICE);5280 5281 if (crq->get_vpd_rsp.rc.code) {5282 dev_err(dev, "Error retrieving VPD from device, rc=%x\n",5283 crq->get_vpd_rsp.rc.code);5284 goto complete;5285 }5286 5287 /* get the position of the firmware version info5288 * located after the ASCII 'RM' substring in the buffer5289 */5290 substr = strnstr(adapter->vpd->buff, "RM", adapter->vpd->len);5291 if (!substr) {5292 dev_info(dev, "Warning - No FW level has been provided in the VPD buffer by the VIOS Server\n");5293 goto complete;5294 }5295 5296 /* get length of firmware level ASCII substring */5297 if ((substr + 2) < (adapter->vpd->buff + adapter->vpd->len)) {5298 fw_level_len = *(substr + 2);5299 } else {5300 dev_info(dev, "Length of FW substr extrapolated VDP buff\n");5301 goto complete;5302 }5303 5304 /* copy firmware version string from vpd into adapter */5305 if ((substr + 3 + fw_level_len) <5306 (adapter->vpd->buff + adapter->vpd->len)) {5307 strscpy(adapter->fw_version, substr + 3,5308 sizeof(adapter->fw_version));5309 } else {5310 dev_info(dev, "FW substr extrapolated VPD buff\n");5311 }5312 5313complete:5314 if (adapter->fw_version[0] == '\0')5315 strscpy((char *)adapter->fw_version, "N/A", sizeof(adapter->fw_version));5316 complete(&adapter->fw_done);5317}5318 5319static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter)5320{5321 struct device *dev = &adapter->vdev->dev;5322 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf;5323 int i;5324 5325 dma_unmap_single(dev, adapter->ip_offload_tok,5326 sizeof(adapter->ip_offload_buf), DMA_FROM_DEVICE);5327 5328 netdev_dbg(adapter->netdev, "Query IP Offload Buffer:\n");5329 for (i = 0; i < (sizeof(adapter->ip_offload_buf) - 1) / 8 + 1; i++)5330 netdev_dbg(adapter->netdev, "%016lx\n",5331 ((unsigned long *)(buf))[i]);5332 5333 netdev_dbg(adapter->netdev, "ipv4_chksum = %d\n", buf->ipv4_chksum);5334 netdev_dbg(adapter->netdev, "ipv6_chksum = %d\n", buf->ipv6_chksum);5335 netdev_dbg(adapter->netdev, "tcp_ipv4_chksum = %d\n",5336 buf->tcp_ipv4_chksum);5337 netdev_dbg(adapter->netdev, "tcp_ipv6_chksum = %d\n",5338 buf->tcp_ipv6_chksum);5339 netdev_dbg(adapter->netdev, "udp_ipv4_chksum = %d\n",5340 buf->udp_ipv4_chksum);5341 netdev_dbg(adapter->netdev, "udp_ipv6_chksum = %d\n",5342 buf->udp_ipv6_chksum);5343 netdev_dbg(adapter->netdev, "large_tx_ipv4 = %d\n",5344 buf->large_tx_ipv4);5345 netdev_dbg(adapter->netdev, "large_tx_ipv6 = %d\n",5346 buf->large_tx_ipv6);5347 netdev_dbg(adapter->netdev, "large_rx_ipv4 = %d\n",5348 buf->large_rx_ipv4);5349 netdev_dbg(adapter->netdev, "large_rx_ipv6 = %d\n",5350 buf->large_rx_ipv6);5351 netdev_dbg(adapter->netdev, "max_ipv4_hdr_sz = %d\n",5352 buf->max_ipv4_header_size);5353 netdev_dbg(adapter->netdev, "max_ipv6_hdr_sz = %d\n",5354 buf->max_ipv6_header_size);5355 netdev_dbg(adapter->netdev, "max_tcp_hdr_size = %d\n",5356 buf->max_tcp_header_size);5357 netdev_dbg(adapter->netdev, "max_udp_hdr_size = %d\n",5358 buf->max_udp_header_size);5359 netdev_dbg(adapter->netdev, "max_large_tx_size = %d\n",5360 buf->max_large_tx_size);5361 netdev_dbg(adapter->netdev, "max_large_rx_size = %d\n",5362 buf->max_large_rx_size);5363 netdev_dbg(adapter->netdev, "ipv6_ext_hdr = %d\n",5364 buf->ipv6_extension_header);5365 netdev_dbg(adapter->netdev, "tcp_pseudosum_req = %d\n",5366 buf->tcp_pseudosum_req);5367 netdev_dbg(adapter->netdev, "num_ipv6_ext_hd = %d\n",5368 buf->num_ipv6_ext_headers);5369 netdev_dbg(adapter->netdev, "off_ipv6_ext_hd = %d\n",5370 buf->off_ipv6_ext_headers);5371 5372 send_control_ip_offload(adapter);5373}5374 5375static const char *ibmvnic_fw_err_cause(u16 cause)5376{5377 switch (cause) {5378 case ADAPTER_PROBLEM:5379 return "adapter problem";5380 case BUS_PROBLEM:5381 return "bus problem";5382 case FW_PROBLEM:5383 return "firmware problem";5384 case DD_PROBLEM:5385 return "device driver problem";5386 case EEH_RECOVERY:5387 return "EEH recovery";5388 case FW_UPDATED:5389 return "firmware updated";5390 case LOW_MEMORY:5391 return "low Memory";5392 default:5393 return "unknown";5394 }5395}5396 5397static void handle_error_indication(union ibmvnic_crq *crq,5398 struct ibmvnic_adapter *adapter)5399{5400 struct device *dev = &adapter->vdev->dev;5401 u16 cause;5402 5403 cause = be16_to_cpu(crq->error_indication.error_cause);5404 5405 dev_warn_ratelimited(dev,5406 "Firmware reports %serror, cause: %s. Starting recovery...\n",5407 crq->error_indication.flags5408 & IBMVNIC_FATAL_ERROR ? "FATAL " : "",5409 ibmvnic_fw_err_cause(cause));5410 5411 if (crq->error_indication.flags & IBMVNIC_FATAL_ERROR)5412 ibmvnic_reset(adapter, VNIC_RESET_FATAL);5413 else5414 ibmvnic_reset(adapter, VNIC_RESET_NON_FATAL);5415}5416 5417static int handle_change_mac_rsp(union ibmvnic_crq *crq,5418 struct ibmvnic_adapter *adapter)5419{5420 struct net_device *netdev = adapter->netdev;5421 struct device *dev = &adapter->vdev->dev;5422 long rc;5423 5424 rc = crq->change_mac_addr_rsp.rc.code;5425 if (rc) {5426 dev_err(dev, "Error %ld in CHANGE_MAC_ADDR_RSP\n", rc);5427 goto out;5428 }5429 /* crq->change_mac_addr.mac_addr is the requested one5430 * crq->change_mac_addr_rsp.mac_addr is the returned valid one.5431 */5432 eth_hw_addr_set(netdev, &crq->change_mac_addr_rsp.mac_addr[0]);5433 ether_addr_copy(adapter->mac_addr,5434 &crq->change_mac_addr_rsp.mac_addr[0]);5435out:5436 complete(&adapter->fw_done);5437 return rc;5438}5439 5440static void handle_request_cap_rsp(union ibmvnic_crq *crq,5441 struct ibmvnic_adapter *adapter)5442{5443 struct device *dev = &adapter->vdev->dev;5444 u64 *req_value;5445 char *name;5446 5447 atomic_dec(&adapter->running_cap_crqs);5448 netdev_dbg(adapter->netdev, "Outstanding request-caps: %d\n",5449 atomic_read(&adapter->running_cap_crqs));5450 switch (be16_to_cpu(crq->request_capability_rsp.capability)) {5451 case REQ_TX_QUEUES:5452 req_value = &adapter->req_tx_queues;5453 name = "tx";5454 break;5455 case REQ_RX_QUEUES:5456 req_value = &adapter->req_rx_queues;5457 name = "rx";5458 break;5459 case REQ_RX_ADD_QUEUES:5460 req_value = &adapter->req_rx_add_queues;5461 name = "rx_add";5462 break;5463 case REQ_TX_ENTRIES_PER_SUBCRQ:5464 req_value = &adapter->req_tx_entries_per_subcrq;5465 name = "tx_entries_per_subcrq";5466 break;5467 case REQ_RX_ADD_ENTRIES_PER_SUBCRQ:5468 req_value = &adapter->req_rx_add_entries_per_subcrq;5469 name = "rx_add_entries_per_subcrq";5470 break;5471 case REQ_MTU:5472 req_value = &adapter->req_mtu;5473 name = "mtu";5474 break;5475 case PROMISC_REQUESTED:5476 req_value = &adapter->promisc;5477 name = "promisc";5478 break;5479 default:5480 dev_err(dev, "Got invalid cap request rsp %d\n",5481 crq->request_capability.capability);5482 return;5483 }5484 5485 switch (crq->request_capability_rsp.rc.code) {5486 case SUCCESS:5487 break;5488 case PARTIALSUCCESS:5489 dev_info(dev, "req=%lld, rsp=%ld in %s queue, retrying.\n",5490 *req_value,5491 (long)be64_to_cpu(crq->request_capability_rsp.number),5492 name);5493 5494 if (be16_to_cpu(crq->request_capability_rsp.capability) ==5495 REQ_MTU) {5496 pr_err("mtu of %llu is not supported. Reverting.\n",5497 *req_value);5498 *req_value = adapter->fallback.mtu;5499 } else {5500 *req_value =5501 be64_to_cpu(crq->request_capability_rsp.number);5502 }5503 5504 send_request_cap(adapter, 1);5505 return;5506 default:5507 dev_err(dev, "Error %d in request cap rsp\n",5508 crq->request_capability_rsp.rc.code);5509 return;5510 }5511 5512 /* Done receiving requested capabilities, query IP offload support */5513 if (atomic_read(&adapter->running_cap_crqs) == 0)5514 send_query_ip_offload(adapter);5515}5516 5517static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,5518 struct ibmvnic_adapter *adapter)5519{5520 struct device *dev = &adapter->vdev->dev;5521 struct net_device *netdev = adapter->netdev;5522 struct ibmvnic_login_rsp_buffer *login_rsp = adapter->login_rsp_buf;5523 struct ibmvnic_login_buffer *login = adapter->login_buf;5524 u64 *tx_handle_array;5525 u64 *rx_handle_array;5526 int num_tx_pools;5527 int num_rx_pools;5528 u64 *size_array;5529 u32 rsp_len;5530 int i;5531 5532 /* CHECK: Test/set of login_pending does not need to be atomic5533 * because only ibmvnic_tasklet tests/clears this.5534 */5535 if (!adapter->login_pending) {5536 netdev_warn(netdev, "Ignoring unexpected login response\n");5537 return 0;5538 }5539 adapter->login_pending = false;5540 5541 /* If the number of queues requested can't be allocated by the5542 * server, the login response will return with code 1. We will need5543 * to resend the login buffer with fewer queues requested.5544 */5545 if (login_rsp_crq->generic.rc.code) {5546 adapter->init_done_rc = login_rsp_crq->generic.rc.code;5547 complete(&adapter->init_done);5548 return 0;5549 }5550 5551 if (adapter->failover_pending) {5552 adapter->init_done_rc = -EAGAIN;5553 netdev_dbg(netdev, "Failover pending, ignoring login response\n");5554 complete(&adapter->init_done);5555 /* login response buffer will be released on reset */5556 return 0;5557 }5558 5559 netdev->mtu = adapter->req_mtu - ETH_HLEN;5560 5561 netdev_dbg(adapter->netdev, "Login Response Buffer:\n");5562 for (i = 0; i < (adapter->login_rsp_buf_sz - 1) / 8 + 1; i++) {5563 netdev_dbg(adapter->netdev, "%016lx\n",5564 ((unsigned long *)(adapter->login_rsp_buf))[i]);5565 }5566 5567 /* Sanity checks */5568 if (login->num_txcomp_subcrqs != login_rsp->num_txsubm_subcrqs ||5569 (be32_to_cpu(login->num_rxcomp_subcrqs) *5570 adapter->req_rx_add_queues !=5571 be32_to_cpu(login_rsp->num_rxadd_subcrqs))) {5572 dev_err(dev, "FATAL: Inconsistent login and login rsp\n");5573 ibmvnic_reset(adapter, VNIC_RESET_FATAL);5574 return -EIO;5575 }5576 5577 rsp_len = be32_to_cpu(login_rsp->len);5578 if (be32_to_cpu(login->login_rsp_len) < rsp_len ||5579 rsp_len <= be32_to_cpu(login_rsp->off_txsubm_subcrqs) ||5580 rsp_len <= be32_to_cpu(login_rsp->off_rxadd_subcrqs) ||5581 rsp_len <= be32_to_cpu(login_rsp->off_rxadd_buff_size) ||5582 rsp_len <= be32_to_cpu(login_rsp->off_supp_tx_desc)) {5583 /* This can happen if a login request times out and there are5584 * 2 outstanding login requests sent, the LOGIN_RSP crq5585 * could have been for the older login request. So we are5586 * parsing the newer response buffer which may be incomplete5587 */5588 dev_err(dev, "FATAL: Login rsp offsets/lengths invalid\n");5589 ibmvnic_reset(adapter, VNIC_RESET_FATAL);5590 return -EIO;5591 }5592 5593 size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +5594 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size));5595 /* variable buffer sizes are not supported, so just read the5596 * first entry.5597 */5598 adapter->cur_rx_buf_sz = be64_to_cpu(size_array[0]);5599 5600 num_tx_pools = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs);5601 num_rx_pools = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs);5602 5603 tx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +5604 be32_to_cpu(adapter->login_rsp_buf->off_txsubm_subcrqs));5605 rx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +5606 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_subcrqs));5607 5608 for (i = 0; i < num_tx_pools; i++)5609 adapter->tx_scrq[i]->handle = tx_handle_array[i];5610 5611 for (i = 0; i < num_rx_pools; i++)5612 adapter->rx_scrq[i]->handle = rx_handle_array[i];5613 5614 adapter->num_active_tx_scrqs = num_tx_pools;5615 adapter->num_active_rx_scrqs = num_rx_pools;5616 release_login_rsp_buffer(adapter);5617 release_login_buffer(adapter);5618 complete(&adapter->init_done);5619 5620 return 0;5621}5622 5623static void handle_request_unmap_rsp(union ibmvnic_crq *crq,5624 struct ibmvnic_adapter *adapter)5625{5626 struct device *dev = &adapter->vdev->dev;5627 long rc;5628 5629 rc = crq->request_unmap_rsp.rc.code;5630 if (rc)5631 dev_err(dev, "Error %ld in REQUEST_UNMAP_RSP\n", rc);5632}5633 5634static void handle_query_map_rsp(union ibmvnic_crq *crq,5635 struct ibmvnic_adapter *adapter)5636{5637 struct net_device *netdev = adapter->netdev;5638 struct device *dev = &adapter->vdev->dev;5639 long rc;5640 5641 rc = crq->query_map_rsp.rc.code;5642 if (rc) {5643 dev_err(dev, "Error %ld in QUERY_MAP_RSP\n", rc);5644 return;5645 }5646 netdev_dbg(netdev, "page_size = %d\ntot_pages = %u\nfree_pages = %u\n",5647 crq->query_map_rsp.page_size,5648 __be32_to_cpu(crq->query_map_rsp.tot_pages),5649 __be32_to_cpu(crq->query_map_rsp.free_pages));5650}5651 5652static void handle_query_cap_rsp(union ibmvnic_crq *crq,5653 struct ibmvnic_adapter *adapter)5654{5655 struct net_device *netdev = adapter->netdev;5656 struct device *dev = &adapter->vdev->dev;5657 long rc;5658 5659 atomic_dec(&adapter->running_cap_crqs);5660 netdev_dbg(netdev, "Outstanding queries: %d\n",5661 atomic_read(&adapter->running_cap_crqs));5662 rc = crq->query_capability.rc.code;5663 if (rc) {5664 dev_err(dev, "Error %ld in QUERY_CAP_RSP\n", rc);5665 goto out;5666 }5667 5668 switch (be16_to_cpu(crq->query_capability.capability)) {5669 case MIN_TX_QUEUES:5670 adapter->min_tx_queues =5671 be64_to_cpu(crq->query_capability.number);5672 netdev_dbg(netdev, "min_tx_queues = %lld\n",5673 adapter->min_tx_queues);5674 break;5675 case MIN_RX_QUEUES:5676 adapter->min_rx_queues =5677 be64_to_cpu(crq->query_capability.number);5678 netdev_dbg(netdev, "min_rx_queues = %lld\n",5679 adapter->min_rx_queues);5680 break;5681 case MIN_RX_ADD_QUEUES:5682 adapter->min_rx_add_queues =5683 be64_to_cpu(crq->query_capability.number);5684 netdev_dbg(netdev, "min_rx_add_queues = %lld\n",5685 adapter->min_rx_add_queues);5686 break;5687 case MAX_TX_QUEUES:5688 adapter->max_tx_queues =5689 be64_to_cpu(crq->query_capability.number);5690 netdev_dbg(netdev, "max_tx_queues = %lld\n",5691 adapter->max_tx_queues);5692 break;5693 case MAX_RX_QUEUES:5694 adapter->max_rx_queues =5695 be64_to_cpu(crq->query_capability.number);5696 netdev_dbg(netdev, "max_rx_queues = %lld\n",5697 adapter->max_rx_queues);5698 break;5699 case MAX_RX_ADD_QUEUES:5700 adapter->max_rx_add_queues =5701 be64_to_cpu(crq->query_capability.number);5702 netdev_dbg(netdev, "max_rx_add_queues = %lld\n",5703 adapter->max_rx_add_queues);5704 break;5705 case MIN_TX_ENTRIES_PER_SUBCRQ:5706 adapter->min_tx_entries_per_subcrq =5707 be64_to_cpu(crq->query_capability.number);5708 netdev_dbg(netdev, "min_tx_entries_per_subcrq = %lld\n",5709 adapter->min_tx_entries_per_subcrq);5710 break;5711 case MIN_RX_ADD_ENTRIES_PER_SUBCRQ:5712 adapter->min_rx_add_entries_per_subcrq =5713 be64_to_cpu(crq->query_capability.number);5714 netdev_dbg(netdev, "min_rx_add_entrs_per_subcrq = %lld\n",5715 adapter->min_rx_add_entries_per_subcrq);5716 break;5717 case MAX_TX_ENTRIES_PER_SUBCRQ:5718 adapter->max_tx_entries_per_subcrq =5719 be64_to_cpu(crq->query_capability.number);5720 netdev_dbg(netdev, "max_tx_entries_per_subcrq = %lld\n",5721 adapter->max_tx_entries_per_subcrq);5722 break;5723 case MAX_RX_ADD_ENTRIES_PER_SUBCRQ:5724 adapter->max_rx_add_entries_per_subcrq =5725 be64_to_cpu(crq->query_capability.number);5726 netdev_dbg(netdev, "max_rx_add_entrs_per_subcrq = %lld\n",5727 adapter->max_rx_add_entries_per_subcrq);5728 break;5729 case TCP_IP_OFFLOAD:5730 adapter->tcp_ip_offload =5731 be64_to_cpu(crq->query_capability.number);5732 netdev_dbg(netdev, "tcp_ip_offload = %lld\n",5733 adapter->tcp_ip_offload);5734 break;5735 case PROMISC_SUPPORTED:5736 adapter->promisc_supported =5737 be64_to_cpu(crq->query_capability.number);5738 netdev_dbg(netdev, "promisc_supported = %lld\n",5739 adapter->promisc_supported);5740 break;5741 case MIN_MTU:5742 adapter->min_mtu = be64_to_cpu(crq->query_capability.number);5743 netdev->min_mtu = adapter->min_mtu - ETH_HLEN;5744 netdev_dbg(netdev, "min_mtu = %lld\n", adapter->min_mtu);5745 break;5746 case MAX_MTU:5747 adapter->max_mtu = be64_to_cpu(crq->query_capability.number);5748 netdev->max_mtu = adapter->max_mtu - ETH_HLEN;5749 netdev_dbg(netdev, "max_mtu = %lld\n", adapter->max_mtu);5750 break;5751 case MAX_MULTICAST_FILTERS:5752 adapter->max_multicast_filters =5753 be64_to_cpu(crq->query_capability.number);5754 netdev_dbg(netdev, "max_multicast_filters = %lld\n",5755 adapter->max_multicast_filters);5756 break;5757 case VLAN_HEADER_INSERTION:5758 adapter->vlan_header_insertion =5759 be64_to_cpu(crq->query_capability.number);5760 if (adapter->vlan_header_insertion)5761 netdev->features |= NETIF_F_HW_VLAN_STAG_TX;5762 netdev_dbg(netdev, "vlan_header_insertion = %lld\n",5763 adapter->vlan_header_insertion);5764 break;5765 case RX_VLAN_HEADER_INSERTION:5766 adapter->rx_vlan_header_insertion =5767 be64_to_cpu(crq->query_capability.number);5768 netdev_dbg(netdev, "rx_vlan_header_insertion = %lld\n",5769 adapter->rx_vlan_header_insertion);5770 break;5771 case MAX_TX_SG_ENTRIES:5772 adapter->max_tx_sg_entries =5773 be64_to_cpu(crq->query_capability.number);5774 netdev_dbg(netdev, "max_tx_sg_entries = %lld\n",5775 adapter->max_tx_sg_entries);5776 break;5777 case RX_SG_SUPPORTED:5778 adapter->rx_sg_supported =5779 be64_to_cpu(crq->query_capability.number);5780 netdev_dbg(netdev, "rx_sg_supported = %lld\n",5781 adapter->rx_sg_supported);5782 break;5783 case OPT_TX_COMP_SUB_QUEUES:5784 adapter->opt_tx_comp_sub_queues =5785 be64_to_cpu(crq->query_capability.number);5786 netdev_dbg(netdev, "opt_tx_comp_sub_queues = %lld\n",5787 adapter->opt_tx_comp_sub_queues);5788 break;5789 case OPT_RX_COMP_QUEUES:5790 adapter->opt_rx_comp_queues =5791 be64_to_cpu(crq->query_capability.number);5792 netdev_dbg(netdev, "opt_rx_comp_queues = %lld\n",5793 adapter->opt_rx_comp_queues);5794 break;5795 case OPT_RX_BUFADD_Q_PER_RX_COMP_Q:5796 adapter->opt_rx_bufadd_q_per_rx_comp_q =5797 be64_to_cpu(crq->query_capability.number);5798 netdev_dbg(netdev, "opt_rx_bufadd_q_per_rx_comp_q = %lld\n",5799 adapter->opt_rx_bufadd_q_per_rx_comp_q);5800 break;5801 case OPT_TX_ENTRIES_PER_SUBCRQ:5802 adapter->opt_tx_entries_per_subcrq =5803 be64_to_cpu(crq->query_capability.number);5804 netdev_dbg(netdev, "opt_tx_entries_per_subcrq = %lld\n",5805 adapter->opt_tx_entries_per_subcrq);5806 break;5807 case OPT_RXBA_ENTRIES_PER_SUBCRQ:5808 adapter->opt_rxba_entries_per_subcrq =5809 be64_to_cpu(crq->query_capability.number);5810 netdev_dbg(netdev, "opt_rxba_entries_per_subcrq = %lld\n",5811 adapter->opt_rxba_entries_per_subcrq);5812 break;5813 case TX_RX_DESC_REQ:5814 adapter->tx_rx_desc_req = crq->query_capability.number;5815 netdev_dbg(netdev, "tx_rx_desc_req = %llx\n",5816 adapter->tx_rx_desc_req);5817 break;5818 5819 default:5820 netdev_err(netdev, "Got invalid cap rsp %d\n",5821 crq->query_capability.capability);5822 }5823 5824out:5825 if (atomic_read(&adapter->running_cap_crqs) == 0)5826 send_request_cap(adapter, 0);5827}5828 5829static int send_query_phys_parms(struct ibmvnic_adapter *adapter)5830{5831 union ibmvnic_crq crq;5832 int rc;5833 5834 memset(&crq, 0, sizeof(crq));5835 crq.query_phys_parms.first = IBMVNIC_CRQ_CMD;5836 crq.query_phys_parms.cmd = QUERY_PHYS_PARMS;5837 5838 mutex_lock(&adapter->fw_lock);5839 adapter->fw_done_rc = 0;5840 reinit_completion(&adapter->fw_done);5841 5842 rc = ibmvnic_send_crq(adapter, &crq);5843 if (rc) {5844 mutex_unlock(&adapter->fw_lock);5845 return rc;5846 }5847 5848 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);5849 if (rc) {5850 mutex_unlock(&adapter->fw_lock);5851 return rc;5852 }5853 5854 mutex_unlock(&adapter->fw_lock);5855 return adapter->fw_done_rc ? -EIO : 0;5856}5857 5858static int handle_query_phys_parms_rsp(union ibmvnic_crq *crq,5859 struct ibmvnic_adapter *adapter)5860{5861 struct net_device *netdev = adapter->netdev;5862 int rc;5863 __be32 rspeed = cpu_to_be32(crq->query_phys_parms_rsp.speed);5864 5865 rc = crq->query_phys_parms_rsp.rc.code;5866 if (rc) {5867 netdev_err(netdev, "Error %d in QUERY_PHYS_PARMS\n", rc);5868 return rc;5869 }5870 switch (rspeed) {5871 case IBMVNIC_10MBPS:5872 adapter->speed = SPEED_10;5873 break;5874 case IBMVNIC_100MBPS:5875 adapter->speed = SPEED_100;5876 break;5877 case IBMVNIC_1GBPS:5878 adapter->speed = SPEED_1000;5879 break;5880 case IBMVNIC_10GBPS:5881 adapter->speed = SPEED_10000;5882 break;5883 case IBMVNIC_25GBPS:5884 adapter->speed = SPEED_25000;5885 break;5886 case IBMVNIC_40GBPS:5887 adapter->speed = SPEED_40000;5888 break;5889 case IBMVNIC_50GBPS:5890 adapter->speed = SPEED_50000;5891 break;5892 case IBMVNIC_100GBPS:5893 adapter->speed = SPEED_100000;5894 break;5895 case IBMVNIC_200GBPS:5896 adapter->speed = SPEED_200000;5897 break;5898 default:5899 if (netif_carrier_ok(netdev))5900 netdev_warn(netdev, "Unknown speed 0x%08x\n", rspeed);5901 adapter->speed = SPEED_UNKNOWN;5902 }5903 if (crq->query_phys_parms_rsp.flags1 & IBMVNIC_FULL_DUPLEX)5904 adapter->duplex = DUPLEX_FULL;5905 else if (crq->query_phys_parms_rsp.flags1 & IBMVNIC_HALF_DUPLEX)5906 adapter->duplex = DUPLEX_HALF;5907 else5908 adapter->duplex = DUPLEX_UNKNOWN;5909 5910 return rc;5911}5912 5913static void ibmvnic_handle_crq(union ibmvnic_crq *crq,5914 struct ibmvnic_adapter *adapter)5915{5916 struct ibmvnic_generic_crq *gen_crq = &crq->generic;5917 struct net_device *netdev = adapter->netdev;5918 struct device *dev = &adapter->vdev->dev;5919 u64 *u64_crq = (u64 *)crq;5920 long rc;5921 5922 netdev_dbg(netdev, "Handling CRQ: %016lx %016lx\n",5923 (unsigned long)cpu_to_be64(u64_crq[0]),5924 (unsigned long)cpu_to_be64(u64_crq[1]));5925 switch (gen_crq->first) {5926 case IBMVNIC_CRQ_INIT_RSP:5927 switch (gen_crq->cmd) {5928 case IBMVNIC_CRQ_INIT:5929 dev_info(dev, "Partner initialized\n");5930 adapter->from_passive_init = true;5931 /* Discard any stale login responses from prev reset.5932 * CHECK: should we clear even on INIT_COMPLETE?5933 */5934 adapter->login_pending = false;5935 5936 if (adapter->state == VNIC_DOWN)5937 rc = ibmvnic_reset(adapter, VNIC_RESET_PASSIVE_INIT);5938 else5939 rc = ibmvnic_reset(adapter, VNIC_RESET_FAILOVER);5940 5941 if (rc && rc != -EBUSY) {5942 /* We were unable to schedule the failover5943 * reset either because the adapter was still5944 * probing (eg: during kexec) or we could not5945 * allocate memory. Clear the failover_pending5946 * flag since no one else will. We ignore5947 * EBUSY because it means either FAILOVER reset5948 * is already scheduled or the adapter is5949 * being removed.5950 */5951 netdev_err(netdev,5952 "Error %ld scheduling failover reset\n",5953 rc);5954 adapter->failover_pending = false;5955 }5956 5957 if (!completion_done(&adapter->init_done)) {5958 if (!adapter->init_done_rc)5959 adapter->init_done_rc = -EAGAIN;5960 complete(&adapter->init_done);5961 }5962 5963 break;5964 case IBMVNIC_CRQ_INIT_COMPLETE:5965 dev_info(dev, "Partner initialization complete\n");5966 adapter->crq.active = true;5967 send_version_xchg(adapter);5968 break;5969 default:5970 dev_err(dev, "Unknown crq cmd: %d\n", gen_crq->cmd);5971 }5972 return;5973 case IBMVNIC_CRQ_XPORT_EVENT:5974 netif_carrier_off(netdev);5975 adapter->crq.active = false;5976 /* terminate any thread waiting for a response5977 * from the device5978 */5979 if (!completion_done(&adapter->fw_done)) {5980 adapter->fw_done_rc = -EIO;5981 complete(&adapter->fw_done);5982 }5983 5984 /* if we got here during crq-init, retry crq-init */5985 if (!completion_done(&adapter->init_done)) {5986 adapter->init_done_rc = -EAGAIN;5987 complete(&adapter->init_done);5988 }5989 5990 if (!completion_done(&adapter->stats_done))5991 complete(&adapter->stats_done);5992 if (test_bit(0, &adapter->resetting))5993 adapter->force_reset_recovery = true;5994 if (gen_crq->cmd == IBMVNIC_PARTITION_MIGRATED) {5995 dev_info(dev, "Migrated, re-enabling adapter\n");5996 ibmvnic_reset(adapter, VNIC_RESET_MOBILITY);5997 } else if (gen_crq->cmd == IBMVNIC_DEVICE_FAILOVER) {5998 dev_info(dev, "Backing device failover detected\n");5999 adapter->failover_pending = true;6000 } else {6001 /* The adapter lost the connection */6002 dev_err(dev, "Virtual Adapter failed (rc=%d)\n",6003 gen_crq->cmd);6004 ibmvnic_reset(adapter, VNIC_RESET_FATAL);6005 }6006 return;6007 case IBMVNIC_CRQ_CMD_RSP:6008 break;6009 default:6010 dev_err(dev, "Got an invalid msg type 0x%02x\n",6011 gen_crq->first);6012 return;6013 }6014 6015 switch (gen_crq->cmd) {6016 case VERSION_EXCHANGE_RSP:6017 rc = crq->version_exchange_rsp.rc.code;6018 if (rc) {6019 dev_err(dev, "Error %ld in VERSION_EXCHG_RSP\n", rc);6020 break;6021 }6022 ibmvnic_version =6023 be16_to_cpu(crq->version_exchange_rsp.version);6024 dev_info(dev, "Partner protocol version is %d\n",6025 ibmvnic_version);6026 send_query_cap(adapter);6027 break;6028 case QUERY_CAPABILITY_RSP:6029 handle_query_cap_rsp(crq, adapter);6030 break;6031 case QUERY_MAP_RSP:6032 handle_query_map_rsp(crq, adapter);6033 break;6034 case REQUEST_MAP_RSP:6035 adapter->fw_done_rc = crq->request_map_rsp.rc.code;6036 complete(&adapter->fw_done);6037 break;6038 case REQUEST_UNMAP_RSP:6039 handle_request_unmap_rsp(crq, adapter);6040 break;6041 case REQUEST_CAPABILITY_RSP:6042 handle_request_cap_rsp(crq, adapter);6043 break;6044 case LOGIN_RSP:6045 netdev_dbg(netdev, "Got Login Response\n");6046 handle_login_rsp(crq, adapter);6047 break;6048 case LOGICAL_LINK_STATE_RSP:6049 netdev_dbg(netdev,6050 "Got Logical Link State Response, state: %d rc: %d\n",6051 crq->logical_link_state_rsp.link_state,6052 crq->logical_link_state_rsp.rc.code);6053 adapter->logical_link_state =6054 crq->logical_link_state_rsp.link_state;6055 adapter->init_done_rc = crq->logical_link_state_rsp.rc.code;6056 complete(&adapter->init_done);6057 break;6058 case LINK_STATE_INDICATION:6059 netdev_dbg(netdev, "Got Logical Link State Indication\n");6060 adapter->phys_link_state =6061 crq->link_state_indication.phys_link_state;6062 adapter->logical_link_state =6063 crq->link_state_indication.logical_link_state;6064 if (adapter->phys_link_state && adapter->logical_link_state)6065 netif_carrier_on(netdev);6066 else6067 netif_carrier_off(netdev);6068 break;6069 case CHANGE_MAC_ADDR_RSP:6070 netdev_dbg(netdev, "Got MAC address change Response\n");6071 adapter->fw_done_rc = handle_change_mac_rsp(crq, adapter);6072 break;6073 case ERROR_INDICATION:6074 netdev_dbg(netdev, "Got Error Indication\n");6075 handle_error_indication(crq, adapter);6076 break;6077 case REQUEST_STATISTICS_RSP:6078 netdev_dbg(netdev, "Got Statistics Response\n");6079 complete(&adapter->stats_done);6080 break;6081 case QUERY_IP_OFFLOAD_RSP:6082 netdev_dbg(netdev, "Got Query IP offload Response\n");6083 handle_query_ip_offload_rsp(adapter);6084 break;6085 case MULTICAST_CTRL_RSP:6086 netdev_dbg(netdev, "Got multicast control Response\n");6087 break;6088 case CONTROL_IP_OFFLOAD_RSP:6089 netdev_dbg(netdev, "Got Control IP offload Response\n");6090 dma_unmap_single(dev, adapter->ip_offload_ctrl_tok,6091 sizeof(adapter->ip_offload_ctrl),6092 DMA_TO_DEVICE);6093 complete(&adapter->init_done);6094 break;6095 case COLLECT_FW_TRACE_RSP:6096 netdev_dbg(netdev, "Got Collect firmware trace Response\n");6097 complete(&adapter->fw_done);6098 break;6099 case GET_VPD_SIZE_RSP:6100 handle_vpd_size_rsp(crq, adapter);6101 break;6102 case GET_VPD_RSP:6103 handle_vpd_rsp(crq, adapter);6104 break;6105 case QUERY_PHYS_PARMS_RSP:6106 adapter->fw_done_rc = handle_query_phys_parms_rsp(crq, adapter);6107 complete(&adapter->fw_done);6108 break;6109 default:6110 netdev_err(netdev, "Got an invalid cmd type 0x%02x\n",6111 gen_crq->cmd);6112 }6113}6114 6115static irqreturn_t ibmvnic_interrupt(int irq, void *instance)6116{6117 struct ibmvnic_adapter *adapter = instance;6118 6119 tasklet_schedule(&adapter->tasklet);6120 return IRQ_HANDLED;6121}6122 6123static void ibmvnic_tasklet(struct tasklet_struct *t)6124{6125 struct ibmvnic_adapter *adapter = from_tasklet(adapter, t, tasklet);6126 struct ibmvnic_crq_queue *queue = &adapter->crq;6127 union ibmvnic_crq *crq;6128 unsigned long flags;6129 6130 spin_lock_irqsave(&queue->lock, flags);6131 6132 /* Pull all the valid messages off the CRQ */6133 while ((crq = ibmvnic_next_crq(adapter)) != NULL) {6134 /* This barrier makes sure ibmvnic_next_crq()'s6135 * crq->generic.first & IBMVNIC_CRQ_CMD_RSP is loaded6136 * before ibmvnic_handle_crq()'s6137 * switch(gen_crq->first) and switch(gen_crq->cmd).6138 */6139 dma_rmb();6140 ibmvnic_handle_crq(crq, adapter);6141 crq->generic.first = 0;6142 }6143 6144 spin_unlock_irqrestore(&queue->lock, flags);6145}6146 6147static int ibmvnic_reenable_crq_queue(struct ibmvnic_adapter *adapter)6148{6149 struct vio_dev *vdev = adapter->vdev;6150 int rc;6151 6152 do {6153 rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address);6154 } while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));6155 6156 if (rc)6157 dev_err(&vdev->dev, "Error enabling adapter (rc=%d)\n", rc);6158 6159 return rc;6160}6161 6162static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter)6163{6164 struct ibmvnic_crq_queue *crq = &adapter->crq;6165 struct device *dev = &adapter->vdev->dev;6166 struct vio_dev *vdev = adapter->vdev;6167 int rc;6168 6169 /* Close the CRQ */6170 do {6171 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);6172 } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));6173 6174 /* Clean out the queue */6175 if (!crq->msgs)6176 return -EINVAL;6177 6178 memset(crq->msgs, 0, PAGE_SIZE);6179 crq->cur = 0;6180 crq->active = false;6181 6182 /* And re-open it again */6183 rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,6184 crq->msg_token, PAGE_SIZE);6185 6186 if (rc == H_CLOSED)6187 /* Adapter is good, but other end is not ready */6188 dev_warn(dev, "Partner adapter not ready\n");6189 else if (rc != 0)6190 dev_warn(dev, "Couldn't register crq (rc=%d)\n", rc);6191 6192 return rc;6193}6194 6195static void release_crq_queue(struct ibmvnic_adapter *adapter)6196{6197 struct ibmvnic_crq_queue *crq = &adapter->crq;6198 struct vio_dev *vdev = adapter->vdev;6199 long rc;6200 6201 if (!crq->msgs)6202 return;6203 6204 netdev_dbg(adapter->netdev, "Releasing CRQ\n");6205 free_irq(vdev->irq, adapter);6206 tasklet_kill(&adapter->tasklet);6207 do {6208 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);6209 } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));6210 6211 dma_unmap_single(&vdev->dev, crq->msg_token, PAGE_SIZE,6212 DMA_BIDIRECTIONAL);6213 free_page((unsigned long)crq->msgs);6214 crq->msgs = NULL;6215 crq->active = false;6216}6217 6218static int init_crq_queue(struct ibmvnic_adapter *adapter)6219{6220 struct ibmvnic_crq_queue *crq = &adapter->crq;6221 struct device *dev = &adapter->vdev->dev;6222 struct vio_dev *vdev = adapter->vdev;6223 int rc, retrc = -ENOMEM;6224 6225 if (crq->msgs)6226 return 0;6227 6228 crq->msgs = (union ibmvnic_crq *)get_zeroed_page(GFP_KERNEL);6229 /* Should we allocate more than one page? */6230 6231 if (!crq->msgs)6232 return -ENOMEM;6233 6234 crq->size = PAGE_SIZE / sizeof(*crq->msgs);6235 crq->msg_token = dma_map_single(dev, crq->msgs, PAGE_SIZE,6236 DMA_BIDIRECTIONAL);6237 if (dma_mapping_error(dev, crq->msg_token))6238 goto map_failed;6239 6240 rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,6241 crq->msg_token, PAGE_SIZE);6242 6243 if (rc == H_RESOURCE)6244 /* maybe kexecing and resource is busy. try a reset */6245 rc = ibmvnic_reset_crq(adapter);6246 retrc = rc;6247 6248 if (rc == H_CLOSED) {6249 dev_warn(dev, "Partner adapter not ready\n");6250 } else if (rc) {6251 dev_warn(dev, "Error %d opening adapter\n", rc);6252 goto reg_crq_failed;6253 }6254 6255 retrc = 0;6256 6257 tasklet_setup(&adapter->tasklet, (void *)ibmvnic_tasklet);6258 6259 netdev_dbg(adapter->netdev, "registering irq 0x%x\n", vdev->irq);6260 snprintf(crq->name, sizeof(crq->name), "ibmvnic-%x",6261 adapter->vdev->unit_address);6262 rc = request_irq(vdev->irq, ibmvnic_interrupt, 0, crq->name, adapter);6263 if (rc) {6264 dev_err(dev, "Couldn't register irq 0x%x. rc=%d\n",6265 vdev->irq, rc);6266 goto req_irq_failed;6267 }6268 6269 rc = vio_enable_interrupts(vdev);6270 if (rc) {6271 dev_err(dev, "Error %d enabling interrupts\n", rc);6272 goto req_irq_failed;6273 }6274 6275 crq->cur = 0;6276 spin_lock_init(&crq->lock);6277 6278 /* process any CRQs that were queued before we enabled interrupts */6279 tasklet_schedule(&adapter->tasklet);6280 6281 return retrc;6282 6283req_irq_failed:6284 tasklet_kill(&adapter->tasklet);6285 do {6286 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);6287 } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));6288reg_crq_failed:6289 dma_unmap_single(dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);6290map_failed:6291 free_page((unsigned long)crq->msgs);6292 crq->msgs = NULL;6293 return retrc;6294}6295 6296static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset)6297{6298 struct device *dev = &adapter->vdev->dev;6299 unsigned long timeout = msecs_to_jiffies(20000);6300 u64 old_num_rx_queues = adapter->req_rx_queues;6301 u64 old_num_tx_queues = adapter->req_tx_queues;6302 int rc;6303 6304 adapter->from_passive_init = false;6305 6306 rc = ibmvnic_send_crq_init(adapter);6307 if (rc) {6308 dev_err(dev, "Send crq init failed with error %d\n", rc);6309 return rc;6310 }6311 6312 if (!wait_for_completion_timeout(&adapter->init_done, timeout)) {6313 dev_err(dev, "Initialization sequence timed out\n");6314 return -ETIMEDOUT;6315 }6316 6317 if (adapter->init_done_rc) {6318 release_crq_queue(adapter);6319 dev_err(dev, "CRQ-init failed, %d\n", adapter->init_done_rc);6320 return adapter->init_done_rc;6321 }6322 6323 if (adapter->from_passive_init) {6324 adapter->state = VNIC_OPEN;6325 adapter->from_passive_init = false;6326 dev_err(dev, "CRQ-init failed, passive-init\n");6327 return -EINVAL;6328 }6329 6330 if (reset &&6331 test_bit(0, &adapter->resetting) && !adapter->wait_for_reset &&6332 adapter->reset_reason != VNIC_RESET_MOBILITY) {6333 if (adapter->req_rx_queues != old_num_rx_queues ||6334 adapter->req_tx_queues != old_num_tx_queues) {6335 release_sub_crqs(adapter, 0);6336 rc = init_sub_crqs(adapter);6337 } else {6338 /* no need to reinitialize completely, but we do6339 * need to clean up transmits that were in flight6340 * when we processed the reset. Failure to do so6341 * will confound the upper layer, usually TCP, by6342 * creating the illusion of transmits that are6343 * awaiting completion.6344 */6345 clean_tx_pools(adapter);6346 6347 rc = reset_sub_crq_queues(adapter);6348 }6349 } else {6350 rc = init_sub_crqs(adapter);6351 }6352 6353 if (rc) {6354 dev_err(dev, "Initialization of sub crqs failed\n");6355 release_crq_queue(adapter);6356 return rc;6357 }6358 6359 rc = init_sub_crq_irqs(adapter);6360 if (rc) {6361 dev_err(dev, "Failed to initialize sub crq irqs\n");6362 release_crq_queue(adapter);6363 }6364 6365 return rc;6366}6367 6368static struct device_attribute dev_attr_failover;6369 6370static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)6371{6372 struct ibmvnic_adapter *adapter;6373 struct net_device *netdev;6374 unsigned char *mac_addr_p;6375 unsigned long flags;6376 bool init_success;6377 int rc;6378 6379 dev_dbg(&dev->dev, "entering ibmvnic_probe for UA 0x%x\n",6380 dev->unit_address);6381 6382 mac_addr_p = (unsigned char *)vio_get_attribute(dev,6383 VETH_MAC_ADDR, NULL);6384 if (!mac_addr_p) {6385 dev_err(&dev->dev,6386 "(%s:%3.3d) ERROR: Can't find MAC_ADDR attribute\n",6387 __FILE__, __LINE__);6388 return 0;6389 }6390 6391 netdev = alloc_etherdev_mq(sizeof(struct ibmvnic_adapter),6392 IBMVNIC_MAX_QUEUES);6393 if (!netdev)6394 return -ENOMEM;6395 6396 adapter = netdev_priv(netdev);6397 adapter->state = VNIC_PROBING;6398 dev_set_drvdata(&dev->dev, netdev);6399 adapter->vdev = dev;6400 adapter->netdev = netdev;6401 adapter->login_pending = false;6402 memset(&adapter->map_ids, 0, sizeof(adapter->map_ids));6403 /* map_ids start at 1, so ensure map_id 0 is always "in-use" */6404 bitmap_set(adapter->map_ids, 0, 1);6405 6406 ether_addr_copy(adapter->mac_addr, mac_addr_p);6407 eth_hw_addr_set(netdev, adapter->mac_addr);6408 netdev->irq = dev->irq;6409 netdev->netdev_ops = &ibmvnic_netdev_ops;6410 netdev->ethtool_ops = &ibmvnic_ethtool_ops;6411 SET_NETDEV_DEV(netdev, &dev->dev);6412 6413 INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset);6414 INIT_DELAYED_WORK(&adapter->ibmvnic_delayed_reset,6415 __ibmvnic_delayed_reset);6416 INIT_LIST_HEAD(&adapter->rwi_list);6417 spin_lock_init(&adapter->rwi_lock);6418 spin_lock_init(&adapter->state_lock);6419 mutex_init(&adapter->fw_lock);6420 init_completion(&adapter->probe_done);6421 init_completion(&adapter->init_done);6422 init_completion(&adapter->fw_done);6423 init_completion(&adapter->reset_done);6424 init_completion(&adapter->stats_done);6425 clear_bit(0, &adapter->resetting);6426 adapter->prev_rx_buf_sz = 0;6427 adapter->prev_mtu = 0;6428 6429 init_success = false;6430 do {6431 reinit_init_done(adapter);6432 6433 /* clear any failovers we got in the previous pass6434 * since we are reinitializing the CRQ6435 */6436 adapter->failover_pending = false;6437 6438 /* If we had already initialized CRQ, we may have one or6439 * more resets queued already. Discard those and release6440 * the CRQ before initializing the CRQ again.6441 */6442 release_crq_queue(adapter);6443 6444 /* Since we are still in PROBING state, __ibmvnic_reset()6445 * will not access the ->rwi_list and since we released CRQ,6446 * we won't get _new_ transport events. But there maybe an6447 * ongoing ibmvnic_reset() call. So serialize access to6448 * rwi_list. If we win the race, ibvmnic_reset() could add6449 * a reset after we purged but thats ok - we just may end6450 * up with an extra reset (i.e similar to having two or more6451 * resets in the queue at once).6452 * CHECK.6453 */6454 spin_lock_irqsave(&adapter->rwi_lock, flags);6455 flush_reset_queue(adapter);6456 spin_unlock_irqrestore(&adapter->rwi_lock, flags);6457 6458 rc = init_crq_queue(adapter);6459 if (rc) {6460 dev_err(&dev->dev, "Couldn't initialize crq. rc=%d\n",6461 rc);6462 goto ibmvnic_init_fail;6463 }6464 6465 rc = ibmvnic_reset_init(adapter, false);6466 } while (rc == -EAGAIN);6467 6468 /* We are ignoring the error from ibmvnic_reset_init() assuming that the6469 * partner is not ready. CRQ is not active. When the partner becomes6470 * ready, we will do the passive init reset.6471 */6472 6473 if (!rc)6474 init_success = true;6475 6476 rc = init_stats_buffers(adapter);6477 if (rc)6478 goto ibmvnic_init_fail;6479 6480 rc = init_stats_token(adapter);6481 if (rc)6482 goto ibmvnic_stats_fail;6483 6484 rc = device_create_file(&dev->dev, &dev_attr_failover);6485 if (rc)6486 goto ibmvnic_dev_file_err;6487 6488 netif_carrier_off(netdev);6489 6490 if (init_success) {6491 adapter->state = VNIC_PROBED;6492 netdev->mtu = adapter->req_mtu - ETH_HLEN;6493 netdev->min_mtu = adapter->min_mtu - ETH_HLEN;6494 netdev->max_mtu = adapter->max_mtu - ETH_HLEN;6495 } else {6496 adapter->state = VNIC_DOWN;6497 }6498 6499 adapter->wait_for_reset = false;6500 adapter->last_reset_time = jiffies;6501 6502 rc = register_netdev(netdev);6503 if (rc) {6504 dev_err(&dev->dev, "failed to register netdev rc=%d\n", rc);6505 goto ibmvnic_register_fail;6506 }6507 dev_info(&dev->dev, "ibmvnic registered\n");6508 6509 rc = ibmvnic_cpu_notif_add(adapter);6510 if (rc) {6511 netdev_err(netdev, "Registering cpu notifier failed\n");6512 goto cpu_notif_add_failed;6513 }6514 6515 complete(&adapter->probe_done);6516 6517 return 0;6518 6519cpu_notif_add_failed:6520 unregister_netdev(netdev);6521 6522ibmvnic_register_fail:6523 device_remove_file(&dev->dev, &dev_attr_failover);6524 6525ibmvnic_dev_file_err:6526 release_stats_token(adapter);6527 6528ibmvnic_stats_fail:6529 release_stats_buffers(adapter);6530 6531ibmvnic_init_fail:6532 release_sub_crqs(adapter, 1);6533 release_crq_queue(adapter);6534 6535 /* cleanup worker thread after releasing CRQ so we don't get6536 * transport events (i.e new work items for the worker thread).6537 */6538 adapter->state = VNIC_REMOVING;6539 complete(&adapter->probe_done);6540 flush_work(&adapter->ibmvnic_reset);6541 flush_delayed_work(&adapter->ibmvnic_delayed_reset);6542 6543 flush_reset_queue(adapter);6544 6545 mutex_destroy(&adapter->fw_lock);6546 free_netdev(netdev);6547 6548 return rc;6549}6550 6551static void ibmvnic_remove(struct vio_dev *dev)6552{6553 struct net_device *netdev = dev_get_drvdata(&dev->dev);6554 struct ibmvnic_adapter *adapter = netdev_priv(netdev);6555 unsigned long flags;6556 6557 spin_lock_irqsave(&adapter->state_lock, flags);6558 6559 /* If ibmvnic_reset() is scheduling a reset, wait for it to6560 * finish. Then, set the state to REMOVING to prevent it from6561 * scheduling any more work and to have reset functions ignore6562 * any resets that have already been scheduled. Drop the lock6563 * after setting state, so __ibmvnic_reset() which is called6564 * from the flush_work() below, can make progress.6565 */6566 spin_lock(&adapter->rwi_lock);6567 adapter->state = VNIC_REMOVING;6568 spin_unlock(&adapter->rwi_lock);6569 6570 spin_unlock_irqrestore(&adapter->state_lock, flags);6571 6572 ibmvnic_cpu_notif_remove(adapter);6573 6574 flush_work(&adapter->ibmvnic_reset);6575 flush_delayed_work(&adapter->ibmvnic_delayed_reset);6576 6577 rtnl_lock();6578 unregister_netdevice(netdev);6579 6580 release_resources(adapter);6581 release_rx_pools(adapter);6582 release_tx_pools(adapter);6583 release_sub_crqs(adapter, 1);6584 release_crq_queue(adapter);6585 6586 release_stats_token(adapter);6587 release_stats_buffers(adapter);6588 6589 adapter->state = VNIC_REMOVED;6590 6591 rtnl_unlock();6592 mutex_destroy(&adapter->fw_lock);6593 device_remove_file(&dev->dev, &dev_attr_failover);6594 free_netdev(netdev);6595 dev_set_drvdata(&dev->dev, NULL);6596}6597 6598static ssize_t failover_store(struct device *dev, struct device_attribute *attr,6599 const char *buf, size_t count)6600{6601 struct net_device *netdev = dev_get_drvdata(dev);6602 struct ibmvnic_adapter *adapter = netdev_priv(netdev);6603 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];6604 __be64 session_token;6605 long rc;6606 6607 if (!sysfs_streq(buf, "1"))6608 return -EINVAL;6609 6610 rc = plpar_hcall(H_VIOCTL, retbuf, adapter->vdev->unit_address,6611 H_GET_SESSION_TOKEN, 0, 0, 0);6612 if (rc) {6613 netdev_err(netdev, "Couldn't retrieve session token, rc %ld\n",6614 rc);6615 goto last_resort;6616 }6617 6618 session_token = (__be64)retbuf[0];6619 netdev_dbg(netdev, "Initiating client failover, session id %llx\n",6620 be64_to_cpu(session_token));6621 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address,6622 H_SESSION_ERR_DETECTED, session_token, 0, 0);6623 if (rc) {6624 netdev_err(netdev,6625 "H_VIOCTL initiated failover failed, rc %ld\n",6626 rc);6627 goto last_resort;6628 }6629 6630 return count;6631 6632last_resort:6633 netdev_dbg(netdev, "Trying to send CRQ_CMD, the last resort\n");6634 ibmvnic_reset(adapter, VNIC_RESET_FAILOVER);6635 6636 return count;6637}6638static DEVICE_ATTR_WO(failover);6639 6640static unsigned long ibmvnic_get_desired_dma(struct vio_dev *vdev)6641{6642 struct net_device *netdev = dev_get_drvdata(&vdev->dev);6643 struct ibmvnic_adapter *adapter;6644 struct iommu_table *tbl;6645 unsigned long ret = 0;6646 int i;6647 6648 tbl = get_iommu_table_base(&vdev->dev);6649 6650 /* netdev inits at probe time along with the structures we need below*/6651 if (!netdev)6652 return IOMMU_PAGE_ALIGN(IBMVNIC_IO_ENTITLEMENT_DEFAULT, tbl);6653 6654 adapter = netdev_priv(netdev);6655 6656 ret += PAGE_SIZE; /* the crq message queue */6657 ret += IOMMU_PAGE_ALIGN(sizeof(struct ibmvnic_statistics), tbl);6658 6659 for (i = 0; i < adapter->req_tx_queues + adapter->req_rx_queues; i++)6660 ret += 4 * PAGE_SIZE; /* the scrq message queue */6661 6662 for (i = 0; i < adapter->num_active_rx_pools; i++)6663 ret += adapter->rx_pool[i].size *6664 IOMMU_PAGE_ALIGN(adapter->rx_pool[i].buff_size, tbl);6665 6666 return ret;6667}6668 6669static int ibmvnic_resume(struct device *dev)6670{6671 struct net_device *netdev = dev_get_drvdata(dev);6672 struct ibmvnic_adapter *adapter = netdev_priv(netdev);6673 6674 if (adapter->state != VNIC_OPEN)6675 return 0;6676 6677 tasklet_schedule(&adapter->tasklet);6678 6679 return 0;6680}6681 6682static const struct vio_device_id ibmvnic_device_table[] = {6683 {"network", "IBM,vnic"},6684 {"", "" }6685};6686MODULE_DEVICE_TABLE(vio, ibmvnic_device_table);6687 6688static const struct dev_pm_ops ibmvnic_pm_ops = {6689 .resume = ibmvnic_resume6690};6691 6692static struct vio_driver ibmvnic_driver = {6693 .id_table = ibmvnic_device_table,6694 .probe = ibmvnic_probe,6695 .remove = ibmvnic_remove,6696 .get_desired_dma = ibmvnic_get_desired_dma,6697 .name = ibmvnic_driver_name,6698 .pm = &ibmvnic_pm_ops,6699};6700 6701/* module functions */6702static int __init ibmvnic_module_init(void)6703{6704 int ret;6705 6706 ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "net/ibmvnic:online",6707 ibmvnic_cpu_online,6708 ibmvnic_cpu_down_prep);6709 if (ret < 0)6710 goto out;6711 ibmvnic_online = ret;6712 ret = cpuhp_setup_state_multi(CPUHP_IBMVNIC_DEAD, "net/ibmvnic:dead",6713 NULL, ibmvnic_cpu_dead);6714 if (ret)6715 goto err_dead;6716 6717 ret = vio_register_driver(&ibmvnic_driver);6718 if (ret)6719 goto err_vio_register;6720 6721 pr_info("%s: %s %s\n", ibmvnic_driver_name, ibmvnic_driver_string,6722 IBMVNIC_DRIVER_VERSION);6723 6724 return 0;6725err_vio_register:6726 cpuhp_remove_multi_state(CPUHP_IBMVNIC_DEAD);6727err_dead:6728 cpuhp_remove_multi_state(ibmvnic_online);6729out:6730 return ret;6731}6732 6733static void __exit ibmvnic_module_exit(void)6734{6735 vio_unregister_driver(&ibmvnic_driver);6736 cpuhp_remove_multi_state(CPUHP_IBMVNIC_DEAD);6737 cpuhp_remove_multi_state(ibmvnic_online);6738}6739 6740module_init(ibmvnic_module_init);6741module_exit(ibmvnic_module_exit);6742