Lines Matching full:adapter
100 static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter);
101 static inline void reinit_init_done(struct ibmvnic_adapter *adapter);
102 static void send_query_map(struct ibmvnic_adapter *adapter);
105 static int send_login(struct ibmvnic_adapter *adapter);
106 static void send_query_cap(struct ibmvnic_adapter *adapter);
108 static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter);
112 static int init_crq_queue(struct ibmvnic_adapter *adapter);
113 static int send_query_phys_parms(struct ibmvnic_adapter *adapter);
114 static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
116 static void free_long_term_buff(struct ibmvnic_adapter *adapter,
118 static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter);
119 static void flush_reset_queue(struct ibmvnic_adapter *adapter);
156 static int send_crq_init_complete(struct ibmvnic_adapter *adapter) in send_crq_init_complete() argument
164 return ibmvnic_send_crq(adapter, &crq); in send_crq_init_complete()
167 static int send_version_xchg(struct ibmvnic_adapter *adapter) in send_version_xchg() argument
176 return ibmvnic_send_crq(adapter, &crq); in send_version_xchg()
179 static void ibmvnic_clean_queue_affinity(struct ibmvnic_adapter *adapter, in ibmvnic_clean_queue_affinity() argument
188 netdev_warn(adapter->netdev, in ibmvnic_clean_queue_affinity()
193 static void ibmvnic_clean_affinity(struct ibmvnic_adapter *adapter) in ibmvnic_clean_affinity() argument
200 rxqs = adapter->rx_scrq; in ibmvnic_clean_affinity()
201 txqs = adapter->tx_scrq; in ibmvnic_clean_affinity()
202 num_txqs = adapter->num_active_tx_scrqs; in ibmvnic_clean_affinity()
203 num_rxqs = adapter->num_active_rx_scrqs; in ibmvnic_clean_affinity()
205 netdev_dbg(adapter->netdev, "%s: Cleaning irq affinity hints", __func__); in ibmvnic_clean_affinity()
208 ibmvnic_clean_queue_affinity(adapter, txqs[i]); in ibmvnic_clean_affinity()
212 ibmvnic_clean_queue_affinity(adapter, rxqs[i]); in ibmvnic_clean_affinity()
257 static void ibmvnic_set_affinity(struct ibmvnic_adapter *adapter) in ibmvnic_set_affinity() argument
259 struct ibmvnic_sub_crq_queue **rxqs = adapter->rx_scrq; in ibmvnic_set_affinity()
260 struct ibmvnic_sub_crq_queue **txqs = adapter->tx_scrq; in ibmvnic_set_affinity()
262 int num_rxqs = adapter->num_active_rx_scrqs, i_rxqs = 0; in ibmvnic_set_affinity()
263 int num_txqs = adapter->num_active_tx_scrqs, i_txqs = 0; in ibmvnic_set_affinity()
269 netdev_dbg(adapter->netdev, "%s: Setting irq affinity hints", __func__); in ibmvnic_set_affinity()
270 if (!(adapter->rx_scrq && adapter->tx_scrq)) { in ibmvnic_set_affinity()
271 netdev_warn(adapter->netdev, in ibmvnic_set_affinity()
304 rc = __netif_set_xps_queue(adapter->netdev, in ibmvnic_set_affinity()
308 netdev_warn(adapter->netdev, "%s: Set XPS on queue %d failed, rc = %d.\n", in ibmvnic_set_affinity()
314 netdev_warn(adapter->netdev, in ibmvnic_set_affinity()
317 ibmvnic_clean_affinity(adapter); in ibmvnic_set_affinity()
323 struct ibmvnic_adapter *adapter; in ibmvnic_cpu_online() local
325 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node); in ibmvnic_cpu_online()
326 ibmvnic_set_affinity(adapter); in ibmvnic_cpu_online()
332 struct ibmvnic_adapter *adapter; in ibmvnic_cpu_dead() local
334 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node_dead); in ibmvnic_cpu_dead()
335 ibmvnic_set_affinity(adapter); in ibmvnic_cpu_dead()
341 struct ibmvnic_adapter *adapter; in ibmvnic_cpu_down_prep() local
343 adapter = hlist_entry_safe(node, struct ibmvnic_adapter, node); in ibmvnic_cpu_down_prep()
344 ibmvnic_clean_affinity(adapter); in ibmvnic_cpu_down_prep()
350 static int ibmvnic_cpu_notif_add(struct ibmvnic_adapter *adapter) in ibmvnic_cpu_notif_add() argument
354 ret = cpuhp_state_add_instance_nocalls(ibmvnic_online, &adapter->node); in ibmvnic_cpu_notif_add()
358 &adapter->node_dead); in ibmvnic_cpu_notif_add()
361 cpuhp_state_remove_instance_nocalls(ibmvnic_online, &adapter->node); in ibmvnic_cpu_notif_add()
365 static void ibmvnic_cpu_notif_remove(struct ibmvnic_adapter *adapter) in ibmvnic_cpu_notif_remove() argument
367 cpuhp_state_remove_instance_nocalls(ibmvnic_online, &adapter->node); in ibmvnic_cpu_notif_remove()
369 &adapter->node_dead); in ibmvnic_cpu_notif_remove()
388 * @adapter: private device data
395 static int ibmvnic_wait_for_completion(struct ibmvnic_adapter *adapter, in ibmvnic_wait_for_completion() argument
403 netdev = adapter->netdev; in ibmvnic_wait_for_completion()
407 if (!adapter->crq.active) { in ibmvnic_wait_for_completion()
437 * @adapter: ibmvnic adapter associated to the LTB
450 * with the VIOS and reuse it on next open. Free LTB when adapter is closed.
455 static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, in alloc_long_term_buff() argument
458 struct device *dev = &adapter->vdev->dev; in alloc_long_term_buff()
467 free_long_term_buff(adapter, ltb); in alloc_long_term_buff()
482 ltb->map_id = find_first_zero_bit(adapter->map_ids, in alloc_long_term_buff()
484 bitmap_set(adapter->map_ids, ltb->map_id, 1); in alloc_long_term_buff()
494 mutex_lock(&adapter->fw_lock); in alloc_long_term_buff()
495 adapter->fw_done_rc = 0; in alloc_long_term_buff()
496 reinit_completion(&adapter->fw_done); in alloc_long_term_buff()
498 rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id); in alloc_long_term_buff()
504 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in alloc_long_term_buff()
511 if (adapter->fw_done_rc) { in alloc_long_term_buff()
513 adapter->fw_done_rc); in alloc_long_term_buff()
520 mutex_unlock(&adapter->fw_lock); in alloc_long_term_buff()
524 static void free_long_term_buff(struct ibmvnic_adapter *adapter, in free_long_term_buff() argument
527 struct device *dev = &adapter->vdev->dev; in free_long_term_buff()
536 if (adapter->reset_reason != VNIC_RESET_FAILOVER && in free_long_term_buff()
537 adapter->reset_reason != VNIC_RESET_MOBILITY && in free_long_term_buff()
538 adapter->reset_reason != VNIC_RESET_TIMEOUT) in free_long_term_buff()
539 send_request_unmap(adapter, ltb->map_id); in free_long_term_buff()
545 bitmap_clear(adapter->map_ids, ltb->map_id, 1); in free_long_term_buff()
551 * @adapter: The ibmvnic adapter containing this ltb set
557 static void free_ltb_set(struct ibmvnic_adapter *adapter, in free_ltb_set() argument
563 free_long_term_buff(adapter, <b_set->ltbs[i]); in free_ltb_set()
573 * @adapter: ibmvnic adapter associated to the LTB
587 static int alloc_ltb_set(struct ibmvnic_adapter *adapter, in alloc_ltb_set() argument
591 struct device *dev = &adapter->vdev->dev; in alloc_ltb_set()
630 free_long_term_buff(adapter, &old_set.ltbs[i]); in alloc_ltb_set()
667 rc = alloc_long_term_buff(adapter, &new_set.ltbs[i], ltb_size); in alloc_ltb_set()
751 static void deactivate_rx_pools(struct ibmvnic_adapter *adapter) in deactivate_rx_pools() argument
755 for (i = 0; i < adapter->num_active_rx_pools; i++) in deactivate_rx_pools()
756 adapter->rx_pool[i].active = 0; in deactivate_rx_pools()
759 static void replenish_rx_pool(struct ibmvnic_adapter *adapter, in replenish_rx_pool() argument
763 u64 handle = adapter->rx_scrq[pool->index]->handle; in replenish_rx_pool()
764 struct device *dev = &adapter->vdev->dev; in replenish_rx_pool()
782 rx_scrq = adapter->rx_scrq[pool->index]; in replenish_rx_pool()
801 skb = netdev_alloc_skb(adapter->netdev, in replenish_rx_pool()
805 adapter->replenish_no_mem++; in replenish_rx_pool()
849 send_subcrq_indirect(adapter, handle, in replenish_rx_pool()
855 adapter->replenish_add_buff_success += ind_bufp->index; in replenish_rx_pool()
878 adapter->replenish_add_buff_failure += ind_bufp->index; in replenish_rx_pool()
881 if (lpar_rc == H_CLOSED || adapter->failover_pending) { in replenish_rx_pool()
887 deactivate_rx_pools(adapter); in replenish_rx_pool()
888 netif_carrier_off(adapter->netdev); in replenish_rx_pool()
892 static void replenish_pools(struct ibmvnic_adapter *adapter) in replenish_pools() argument
896 adapter->replenish_task_cycles++; in replenish_pools()
897 for (i = 0; i < adapter->num_active_rx_pools; i++) { in replenish_pools()
898 if (adapter->rx_pool[i].active) in replenish_pools()
899 replenish_rx_pool(adapter, &adapter->rx_pool[i]); in replenish_pools()
902 netdev_dbg(adapter->netdev, "Replenished %d pools\n", i); in replenish_pools()
905 static void release_stats_buffers(struct ibmvnic_adapter *adapter) in release_stats_buffers() argument
907 kfree(adapter->tx_stats_buffers); in release_stats_buffers()
908 kfree(adapter->rx_stats_buffers); in release_stats_buffers()
909 adapter->tx_stats_buffers = NULL; in release_stats_buffers()
910 adapter->rx_stats_buffers = NULL; in release_stats_buffers()
913 static int init_stats_buffers(struct ibmvnic_adapter *adapter) in init_stats_buffers() argument
915 adapter->tx_stats_buffers = in init_stats_buffers()
919 if (!adapter->tx_stats_buffers) in init_stats_buffers()
922 adapter->rx_stats_buffers = in init_stats_buffers()
926 if (!adapter->rx_stats_buffers) in init_stats_buffers()
932 static void release_stats_token(struct ibmvnic_adapter *adapter) in release_stats_token() argument
934 struct device *dev = &adapter->vdev->dev; in release_stats_token()
936 if (!adapter->stats_token) in release_stats_token()
939 dma_unmap_single(dev, adapter->stats_token, in release_stats_token()
942 adapter->stats_token = 0; in release_stats_token()
945 static int init_stats_token(struct ibmvnic_adapter *adapter) in init_stats_token() argument
947 struct device *dev = &adapter->vdev->dev; in init_stats_token()
951 stok = dma_map_single(dev, &adapter->stats, in init_stats_token()
960 adapter->stats_token = stok; in init_stats_token()
961 netdev_dbg(adapter->netdev, "Stats token initialized (%llx)\n", stok); in init_stats_token()
966 * release_rx_pools() - Release any rx pools attached to @adapter.
967 * @adapter: ibmvnic adapter
971 static void release_rx_pools(struct ibmvnic_adapter *adapter) in release_rx_pools() argument
976 if (!adapter->rx_pool) in release_rx_pools()
979 for (i = 0; i < adapter->num_active_rx_pools; i++) { in release_rx_pools()
980 rx_pool = &adapter->rx_pool[i]; in release_rx_pools()
982 netdev_dbg(adapter->netdev, "Releasing rx_pool[%d]\n", i); in release_rx_pools()
986 free_ltb_set(adapter, &rx_pool->ltb_set); in release_rx_pools()
1001 kfree(adapter->rx_pool); in release_rx_pools()
1002 adapter->rx_pool = NULL; in release_rx_pools()
1003 adapter->num_active_rx_pools = 0; in release_rx_pools()
1004 adapter->prev_rx_pool_size = 0; in release_rx_pools()
1009 * @adapter: ibmvnic adapter
1011 * Check if the existing rx pools in the adapter can be reused. The
1021 static bool reuse_rx_pools(struct ibmvnic_adapter *adapter) in reuse_rx_pools() argument
1027 if (!adapter->rx_pool) in reuse_rx_pools()
1030 old_num_pools = adapter->num_active_rx_pools; in reuse_rx_pools()
1031 new_num_pools = adapter->req_rx_queues; in reuse_rx_pools()
1033 old_pool_size = adapter->prev_rx_pool_size; in reuse_rx_pools()
1034 new_pool_size = adapter->req_rx_add_entries_per_subcrq; in reuse_rx_pools()
1036 old_buff_size = adapter->prev_rx_buf_sz; in reuse_rx_pools()
1037 new_buff_size = adapter->cur_rx_buf_sz; in reuse_rx_pools()
1048 * init_rx_pools(): Initialize the set of receiver pools in the adapter.
1051 * Initialize the set of receiver pools in the ibmvnic adapter associated
1060 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in init_rx_pools() local
1061 struct device *dev = &adapter->vdev->dev; in init_rx_pools()
1068 pool_size = adapter->req_rx_add_entries_per_subcrq; in init_rx_pools()
1069 num_pools = adapter->req_rx_queues; in init_rx_pools()
1070 buff_size = adapter->cur_rx_buf_sz; in init_rx_pools()
1072 if (reuse_rx_pools(adapter)) { in init_rx_pools()
1078 release_rx_pools(adapter); in init_rx_pools()
1080 adapter->rx_pool = kcalloc(num_pools, in init_rx_pools()
1083 if (!adapter->rx_pool) { in init_rx_pools()
1091 adapter->num_active_rx_pools = num_pools; in init_rx_pools()
1094 rx_pool = &adapter->rx_pool[i]; in init_rx_pools()
1096 netdev_dbg(adapter->netdev, in init_rx_pools()
1122 adapter->prev_rx_pool_size = pool_size; in init_rx_pools()
1123 adapter->prev_rx_buf_sz = adapter->cur_rx_buf_sz; in init_rx_pools()
1127 rx_pool = &adapter->rx_pool[i]; in init_rx_pools()
1131 rc = alloc_ltb_set(adapter, &rx_pool->ltb_set, in init_rx_pools()
1165 release_rx_pools(adapter); in init_rx_pools()
1173 static void release_vpd_data(struct ibmvnic_adapter *adapter) in release_vpd_data() argument
1175 if (!adapter->vpd) in release_vpd_data()
1178 kfree(adapter->vpd->buff); in release_vpd_data()
1179 kfree(adapter->vpd); in release_vpd_data()
1181 adapter->vpd = NULL; in release_vpd_data()
1184 static void release_one_tx_pool(struct ibmvnic_adapter *adapter, in release_one_tx_pool() argument
1189 free_ltb_set(adapter, &tx_pool->ltb_set); in release_one_tx_pool()
1193 * release_tx_pools() - Release any tx pools attached to @adapter.
1194 * @adapter: ibmvnic adapter
1198 static void release_tx_pools(struct ibmvnic_adapter *adapter) in release_tx_pools() argument
1205 if (!adapter->tx_pool) in release_tx_pools()
1208 for (i = 0; i < adapter->num_active_tx_pools; i++) { in release_tx_pools()
1209 release_one_tx_pool(adapter, &adapter->tx_pool[i]); in release_tx_pools()
1210 release_one_tx_pool(adapter, &adapter->tso_pool[i]); in release_tx_pools()
1213 kfree(adapter->tx_pool); in release_tx_pools()
1214 adapter->tx_pool = NULL; in release_tx_pools()
1215 kfree(adapter->tso_pool); in release_tx_pools()
1216 adapter->tso_pool = NULL; in release_tx_pools()
1217 adapter->num_active_tx_pools = 0; in release_tx_pools()
1218 adapter->prev_tx_pool_size = 0; in release_tx_pools()
1253 * @adapter: ibmvnic adapter
1255 * Check if the existing tx pools in the adapter can be reused. The
1264 static bool reuse_tx_pools(struct ibmvnic_adapter *adapter) in reuse_tx_pools() argument
1270 if (!adapter->tx_pool) in reuse_tx_pools()
1273 old_num_pools = adapter->num_active_tx_pools; in reuse_tx_pools()
1274 new_num_pools = adapter->num_active_tx_scrqs; in reuse_tx_pools()
1275 old_pool_size = adapter->prev_tx_pool_size; in reuse_tx_pools()
1276 new_pool_size = adapter->req_tx_entries_per_subcrq; in reuse_tx_pools()
1277 old_mtu = adapter->prev_mtu; in reuse_tx_pools()
1278 new_mtu = adapter->req_mtu; in reuse_tx_pools()
1289 * init_tx_pools(): Initialize the set of transmit pools in the adapter.
1292 * Initialize the set of transmit pools in the ibmvnic adapter associated
1301 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in init_tx_pools() local
1302 struct device *dev = &adapter->vdev->dev; in init_tx_pools()
1308 num_pools = adapter->req_tx_queues; in init_tx_pools()
1314 if (reuse_tx_pools(adapter)) { in init_tx_pools()
1320 release_tx_pools(adapter); in init_tx_pools()
1322 pool_size = adapter->req_tx_entries_per_subcrq; in init_tx_pools()
1323 num_pools = adapter->num_active_tx_scrqs; in init_tx_pools()
1325 adapter->tx_pool = kcalloc(num_pools, in init_tx_pools()
1327 if (!adapter->tx_pool) in init_tx_pools()
1330 adapter->tso_pool = kcalloc(num_pools, in init_tx_pools()
1335 if (!adapter->tso_pool) { in init_tx_pools()
1336 kfree(adapter->tx_pool); in init_tx_pools()
1337 adapter->tx_pool = NULL; in init_tx_pools()
1344 adapter->num_active_tx_pools = num_pools; in init_tx_pools()
1346 buff_size = adapter->req_mtu + VLAN_HLEN; in init_tx_pools()
1351 i, adapter->req_tx_entries_per_subcrq, buff_size); in init_tx_pools()
1353 rc = init_one_tx_pool(netdev, &adapter->tx_pool[i], in init_tx_pools()
1358 rc = init_one_tx_pool(netdev, &adapter->tso_pool[i], in init_tx_pools()
1365 adapter->prev_tx_pool_size = pool_size; in init_tx_pools()
1366 adapter->prev_mtu = adapter->req_mtu; in init_tx_pools()
1380 tx_pool = &adapter->tx_pool[i]; in init_tx_pools()
1385 rc = alloc_ltb_set(adapter, &tx_pool->ltb_set, in init_tx_pools()
1396 tso_pool = &adapter->tso_pool[i]; in init_tx_pools()
1401 rc = alloc_ltb_set(adapter, &tso_pool->ltb_set, in init_tx_pools()
1415 release_tx_pools(adapter); in init_tx_pools()
1423 static void ibmvnic_napi_enable(struct ibmvnic_adapter *adapter) in ibmvnic_napi_enable() argument
1427 if (adapter->napi_enabled) in ibmvnic_napi_enable()
1430 for (i = 0; i < adapter->req_rx_queues; i++) in ibmvnic_napi_enable()
1431 napi_enable(&adapter->napi[i]); in ibmvnic_napi_enable()
1433 adapter->napi_enabled = true; in ibmvnic_napi_enable()
1436 static void ibmvnic_napi_disable(struct ibmvnic_adapter *adapter) in ibmvnic_napi_disable() argument
1440 if (!adapter->napi_enabled) in ibmvnic_napi_disable()
1443 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_napi_disable()
1444 netdev_dbg(adapter->netdev, "Disabling napi[%d]\n", i); in ibmvnic_napi_disable()
1445 napi_disable(&adapter->napi[i]); in ibmvnic_napi_disable()
1448 adapter->napi_enabled = false; in ibmvnic_napi_disable()
1451 static int init_napi(struct ibmvnic_adapter *adapter) in init_napi() argument
1455 adapter->napi = kcalloc(adapter->req_rx_queues, in init_napi()
1457 if (!adapter->napi) in init_napi()
1460 for (i = 0; i < adapter->req_rx_queues; i++) { in init_napi()
1461 netdev_dbg(adapter->netdev, "Adding napi[%d]\n", i); in init_napi()
1462 netif_napi_add(adapter->netdev, &adapter->napi[i], in init_napi()
1466 adapter->num_active_rx_napi = adapter->req_rx_queues; in init_napi()
1470 static void release_napi(struct ibmvnic_adapter *adapter) in release_napi() argument
1474 if (!adapter->napi) in release_napi()
1477 for (i = 0; i < adapter->num_active_rx_napi; i++) { in release_napi()
1478 netdev_dbg(adapter->netdev, "Releasing napi[%d]\n", i); in release_napi()
1479 netif_napi_del(&adapter->napi[i]); in release_napi()
1482 kfree(adapter->napi); in release_napi()
1483 adapter->napi = NULL; in release_napi()
1484 adapter->num_active_rx_napi = 0; in release_napi()
1485 adapter->napi_enabled = false; in release_napi()
1516 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_login() local
1529 adapter->init_done_rc = 0; in ibmvnic_login()
1530 reinit_completion(&adapter->init_done); in ibmvnic_login()
1531 rc = send_login(adapter); in ibmvnic_login()
1535 if (!wait_for_completion_timeout(&adapter->init_done, in ibmvnic_login()
1538 adapter->login_pending = false; in ibmvnic_login()
1542 if (adapter->init_done_rc == ABORTED) { in ibmvnic_login()
1545 adapter->init_done_rc = 0; in ibmvnic_login()
1551 } else if (adapter->init_done_rc == PARTIALSUCCESS) { in ibmvnic_login()
1553 release_sub_crqs(adapter, 1); in ibmvnic_login()
1558 adapter->init_done_rc = 0; in ibmvnic_login()
1559 reinit_completion(&adapter->init_done); in ibmvnic_login()
1560 send_query_cap(adapter); in ibmvnic_login()
1561 if (!wait_for_completion_timeout(&adapter->init_done, in ibmvnic_login()
1568 rc = init_sub_crqs(adapter); in ibmvnic_login()
1575 rc = init_sub_crq_irqs(adapter); in ibmvnic_login()
1582 } else if (adapter->init_done_rc) { in ibmvnic_login()
1583 netdev_warn(netdev, "Adapter login failed, init_done_rc = %d\n", in ibmvnic_login()
1584 adapter->init_done_rc); in ibmvnic_login()
1587 /* adapter login failed, so free any CRQs or sub-CRQs in ibmvnic_login()
1596 adapter->init_done_rc = 0; in ibmvnic_login()
1597 release_sub_crqs(adapter, true); in ibmvnic_login()
1605 reinit_init_done(adapter); in ibmvnic_login()
1609 adapter->failover_pending = false; in ibmvnic_login()
1610 release_crq_queue(adapter); in ibmvnic_login()
1621 spin_lock_irqsave(&adapter->rwi_lock, flags); in ibmvnic_login()
1622 flush_reset_queue(adapter); in ibmvnic_login()
1623 spin_unlock_irqrestore(&adapter->rwi_lock, in ibmvnic_login()
1626 rc = init_crq_queue(adapter); in ibmvnic_login()
1633 rc = ibmvnic_reset_init(adapter, false); in ibmvnic_login()
1647 __ibmvnic_set_mac(netdev, adapter->mac_addr); in ibmvnic_login()
1649 netdev_dbg(netdev, "[S:%s] Login succeeded\n", adapter_state_to_string(adapter->state)); in ibmvnic_login()
1653 static void release_login_buffer(struct ibmvnic_adapter *adapter) in release_login_buffer() argument
1655 if (!adapter->login_buf) in release_login_buffer()
1658 dma_unmap_single(&adapter->vdev->dev, adapter->login_buf_token, in release_login_buffer()
1659 adapter->login_buf_sz, DMA_TO_DEVICE); in release_login_buffer()
1660 kfree(adapter->login_buf); in release_login_buffer()
1661 adapter->login_buf = NULL; in release_login_buffer()
1664 static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter) in release_login_rsp_buffer() argument
1666 if (!adapter->login_rsp_buf) in release_login_rsp_buffer()
1669 dma_unmap_single(&adapter->vdev->dev, adapter->login_rsp_buf_token, in release_login_rsp_buffer()
1670 adapter->login_rsp_buf_sz, DMA_FROM_DEVICE); in release_login_rsp_buffer()
1671 kfree(adapter->login_rsp_buf); in release_login_rsp_buffer()
1672 adapter->login_rsp_buf = NULL; in release_login_rsp_buffer()
1675 static void release_resources(struct ibmvnic_adapter *adapter) in release_resources() argument
1677 release_vpd_data(adapter); in release_resources()
1679 release_napi(adapter); in release_resources()
1680 release_login_buffer(adapter); in release_resources()
1681 release_login_rsp_buffer(adapter); in release_resources()
1684 static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state) in set_link_state() argument
1686 struct net_device *netdev = adapter->netdev; in set_link_state()
1702 reinit_completion(&adapter->init_done); in set_link_state()
1703 rc = ibmvnic_send_crq(adapter, &crq); in set_link_state()
1709 if (!wait_for_completion_timeout(&adapter->init_done, in set_link_state()
1715 if (adapter->init_done_rc == PARTIALSUCCESS) { in set_link_state()
1719 } else if (adapter->init_done_rc) { in set_link_state()
1721 adapter->init_done_rc); in set_link_state()
1722 return adapter->init_done_rc; in set_link_state()
1731 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in set_real_num_queues() local
1735 adapter->req_tx_queues, adapter->req_rx_queues); in set_real_num_queues()
1737 rc = netif_set_real_num_tx_queues(netdev, adapter->req_tx_queues); in set_real_num_queues()
1743 rc = netif_set_real_num_rx_queues(netdev, adapter->req_rx_queues); in set_real_num_queues()
1750 static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter) in ibmvnic_get_vpd() argument
1752 struct device *dev = &adapter->vdev->dev; in ibmvnic_get_vpd()
1757 if (adapter->vpd->buff) in ibmvnic_get_vpd()
1758 len = adapter->vpd->len; in ibmvnic_get_vpd()
1760 mutex_lock(&adapter->fw_lock); in ibmvnic_get_vpd()
1761 adapter->fw_done_rc = 0; in ibmvnic_get_vpd()
1762 reinit_completion(&adapter->fw_done); in ibmvnic_get_vpd()
1766 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_vpd()
1768 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1772 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in ibmvnic_get_vpd()
1775 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1778 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1780 if (!adapter->vpd->len) in ibmvnic_get_vpd()
1783 if (!adapter->vpd->buff) in ibmvnic_get_vpd()
1784 adapter->vpd->buff = kzalloc(adapter->vpd->len, GFP_KERNEL); in ibmvnic_get_vpd()
1785 else if (adapter->vpd->len != len) in ibmvnic_get_vpd()
1786 adapter->vpd->buff = in ibmvnic_get_vpd()
1787 krealloc(adapter->vpd->buff, in ibmvnic_get_vpd()
1788 adapter->vpd->len, GFP_KERNEL); in ibmvnic_get_vpd()
1790 if (!adapter->vpd->buff) { in ibmvnic_get_vpd()
1795 adapter->vpd->dma_addr = in ibmvnic_get_vpd()
1796 dma_map_single(dev, adapter->vpd->buff, adapter->vpd->len, in ibmvnic_get_vpd()
1798 if (dma_mapping_error(dev, adapter->vpd->dma_addr)) { in ibmvnic_get_vpd()
1800 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1801 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1805 mutex_lock(&adapter->fw_lock); in ibmvnic_get_vpd()
1806 adapter->fw_done_rc = 0; in ibmvnic_get_vpd()
1807 reinit_completion(&adapter->fw_done); in ibmvnic_get_vpd()
1811 crq.get_vpd.ioba = cpu_to_be32(adapter->vpd->dma_addr); in ibmvnic_get_vpd()
1812 crq.get_vpd.len = cpu_to_be32((u32)adapter->vpd->len); in ibmvnic_get_vpd()
1813 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_vpd()
1815 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1816 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1817 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1821 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in ibmvnic_get_vpd()
1824 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1825 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1826 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1830 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1834 static int init_resources(struct ibmvnic_adapter *adapter) in init_resources() argument
1836 struct net_device *netdev = adapter->netdev; in init_resources()
1843 adapter->vpd = kzalloc(sizeof(*adapter->vpd), GFP_KERNEL); in init_resources()
1844 if (!adapter->vpd) in init_resources()
1848 rc = ibmvnic_get_vpd(adapter); in init_resources()
1854 rc = init_napi(adapter); in init_resources()
1858 send_query_map(adapter); in init_resources()
1870 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_open() local
1871 enum vnic_state prev_state = adapter->state; in __ibmvnic_open()
1874 adapter->state = VNIC_OPENING; in __ibmvnic_open()
1875 replenish_pools(adapter); in __ibmvnic_open()
1876 ibmvnic_napi_enable(adapter); in __ibmvnic_open()
1881 for (i = 0; i < adapter->req_rx_queues; i++) { in __ibmvnic_open()
1884 enable_irq(adapter->rx_scrq[i]->irq); in __ibmvnic_open()
1885 enable_scrq_irq(adapter, adapter->rx_scrq[i]); in __ibmvnic_open()
1888 for (i = 0; i < adapter->req_tx_queues; i++) { in __ibmvnic_open()
1891 enable_irq(adapter->tx_scrq[i]->irq); in __ibmvnic_open()
1892 enable_scrq_irq(adapter, adapter->tx_scrq[i]); in __ibmvnic_open()
1899 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) in __ibmvnic_open()
1903 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP); in __ibmvnic_open()
1905 ibmvnic_napi_disable(adapter); in __ibmvnic_open()
1906 ibmvnic_disable_irqs(adapter); in __ibmvnic_open()
1910 adapter->tx_queues_active = true; in __ibmvnic_open()
1922 for (i = 0; i < adapter->req_rx_queues; i++) in __ibmvnic_open()
1923 napi_schedule(&adapter->napi[i]); in __ibmvnic_open()
1926 adapter->state = VNIC_OPEN; in __ibmvnic_open()
1932 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_open() local
1941 * It should be safe to overwrite the adapter->state here. Since in ibmvnic_open()
1948 if (adapter->failover_pending || (test_bit(0, &adapter->resetting))) { in ibmvnic_open()
1950 adapter_state_to_string(adapter->state), in ibmvnic_open()
1951 adapter->failover_pending); in ibmvnic_open()
1952 adapter->state = VNIC_OPEN; in ibmvnic_open()
1957 if (adapter->state != VNIC_CLOSED) { in ibmvnic_open()
1962 rc = init_resources(adapter); in ibmvnic_open()
1977 (adapter->failover_pending || (test_bit(0, &adapter->resetting)))) { in ibmvnic_open()
1978 adapter->state = VNIC_OPEN; in ibmvnic_open()
1983 release_resources(adapter); in ibmvnic_open()
1984 release_rx_pools(adapter); in ibmvnic_open()
1985 release_tx_pools(adapter); in ibmvnic_open()
1991 static void clean_rx_pools(struct ibmvnic_adapter *adapter) in clean_rx_pools() argument
1999 if (!adapter->rx_pool) in clean_rx_pools()
2002 rx_scrqs = adapter->num_active_rx_pools; in clean_rx_pools()
2003 rx_entries = adapter->req_rx_add_entries_per_subcrq; in clean_rx_pools()
2007 rx_pool = &adapter->rx_pool[i]; in clean_rx_pools()
2011 netdev_dbg(adapter->netdev, "Cleaning rx_pool[%d]\n", i); in clean_rx_pools()
2022 static void clean_one_tx_pool(struct ibmvnic_adapter *adapter, in clean_one_tx_pool() argument
2043 static void clean_tx_pools(struct ibmvnic_adapter *adapter) in clean_tx_pools() argument
2048 if (!adapter->tx_pool || !adapter->tso_pool) in clean_tx_pools()
2051 tx_scrqs = adapter->num_active_tx_pools; in clean_tx_pools()
2055 netdev_dbg(adapter->netdev, "Cleaning tx_pool[%d]\n", i); in clean_tx_pools()
2056 clean_one_tx_pool(adapter, &adapter->tx_pool[i]); in clean_tx_pools()
2057 clean_one_tx_pool(adapter, &adapter->tso_pool[i]); in clean_tx_pools()
2061 static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter) in ibmvnic_disable_irqs() argument
2063 struct net_device *netdev = adapter->netdev; in ibmvnic_disable_irqs()
2066 if (adapter->tx_scrq) { in ibmvnic_disable_irqs()
2067 for (i = 0; i < adapter->req_tx_queues; i++) in ibmvnic_disable_irqs()
2068 if (adapter->tx_scrq[i]->irq) { in ibmvnic_disable_irqs()
2071 disable_scrq_irq(adapter, adapter->tx_scrq[i]); in ibmvnic_disable_irqs()
2072 disable_irq(adapter->tx_scrq[i]->irq); in ibmvnic_disable_irqs()
2076 if (adapter->rx_scrq) { in ibmvnic_disable_irqs()
2077 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_disable_irqs()
2078 if (adapter->rx_scrq[i]->irq) { in ibmvnic_disable_irqs()
2081 disable_scrq_irq(adapter, adapter->rx_scrq[i]); in ibmvnic_disable_irqs()
2082 disable_irq(adapter->rx_scrq[i]->irq); in ibmvnic_disable_irqs()
2090 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_cleanup() local
2094 adapter->tx_queues_active = false; in ibmvnic_cleanup()
2101 if (test_bit(0, &adapter->resetting)) in ibmvnic_cleanup()
2106 ibmvnic_napi_disable(adapter); in ibmvnic_cleanup()
2107 ibmvnic_disable_irqs(adapter); in ibmvnic_cleanup()
2112 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_close() local
2115 adapter->state = VNIC_CLOSING; in __ibmvnic_close()
2116 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); in __ibmvnic_close()
2117 adapter->state = VNIC_CLOSED; in __ibmvnic_close()
2123 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_close() local
2127 adapter_state_to_string(adapter->state), in ibmvnic_close()
2128 adapter->failover_pending, in ibmvnic_close()
2129 adapter->force_reset_recovery); in ibmvnic_close()
2134 if (adapter->failover_pending) { in ibmvnic_close()
2135 adapter->state = VNIC_CLOSED; in ibmvnic_close()
2141 clean_rx_pools(adapter); in ibmvnic_close()
2142 clean_tx_pools(adapter); in ibmvnic_close()
2283 static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter, in ibmvnic_tx_scrq_clean_buffer() argument
2305 tx_pool = &adapter->tso_pool[queue_num]; in ibmvnic_tx_scrq_clean_buffer()
2308 tx_pool = &adapter->tx_pool[queue_num]; in ibmvnic_tx_scrq_clean_buffer()
2315 adapter->netdev->stats.tx_packets--; in ibmvnic_tx_scrq_clean_buffer()
2316 adapter->netdev->stats.tx_bytes -= tx_buff->skb->len; in ibmvnic_tx_scrq_clean_buffer()
2317 adapter->tx_stats_buffers[queue_num].batched_packets--; in ibmvnic_tx_scrq_clean_buffer()
2318 adapter->tx_stats_buffers[queue_num].bytes -= in ibmvnic_tx_scrq_clean_buffer()
2322 adapter->netdev->stats.tx_dropped++; in ibmvnic_tx_scrq_clean_buffer()
2328 (adapter->req_tx_entries_per_subcrq / 2) && in ibmvnic_tx_scrq_clean_buffer()
2329 __netif_subqueue_stopped(adapter->netdev, queue_num)) { in ibmvnic_tx_scrq_clean_buffer()
2332 if (adapter->tx_queues_active) { in ibmvnic_tx_scrq_clean_buffer()
2333 netif_wake_subqueue(adapter->netdev, queue_num); in ibmvnic_tx_scrq_clean_buffer()
2334 netdev_dbg(adapter->netdev, "Started queue %d\n", in ibmvnic_tx_scrq_clean_buffer()
2342 static int send_subcrq_direct(struct ibmvnic_adapter *adapter, in send_subcrq_direct() argument
2345 unsigned int ua = adapter->vdev->unit_address; in send_subcrq_direct()
2346 struct device *dev = &adapter->vdev->dev; in send_subcrq_direct()
2362 static int ibmvnic_tx_scrq_flush(struct ibmvnic_adapter *adapter, in ibmvnic_tx_scrq_flush() argument
2381 rc = send_subcrq_indirect(adapter, handle, dma_addr, entries); in ibmvnic_tx_scrq_flush()
2383 rc = send_subcrq_direct(adapter, handle, in ibmvnic_tx_scrq_flush()
2387 ibmvnic_tx_scrq_clean_buffer(adapter, tx_scrq); in ibmvnic_tx_scrq_flush()
2395 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_xmit() local
2397 u8 *hdrs = (u8 *)&adapter->tx_rx_desc_req; in ibmvnic_xmit()
2398 struct device *dev = &adapter->vdev->dev; in ibmvnic_xmit()
2429 if (!adapter->tx_queues_active) { in ibmvnic_xmit()
2438 tx_scrq = adapter->tx_scrq[queue_num]; in ibmvnic_xmit()
2446 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true); in ibmvnic_xmit()
2453 tx_pool = &adapter->tso_pool[queue_num]; in ibmvnic_xmit()
2455 tx_pool = &adapter->tx_pool[queue_num]; in ibmvnic_xmit()
2464 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true); in ibmvnic_xmit()
2548 if (adapter->vlan_header_insertion && skb_vlan_tag_present(skb)) { in ibmvnic_xmit()
2581 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, false); in ibmvnic_xmit()
2596 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true); in ibmvnic_xmit()
2609 lpar_rc = ibmvnic_tx_scrq_flush(adapter, tx_scrq, true); in ibmvnic_xmit()
2618 >= adapter->req_tx_entries_per_subcrq) { in ibmvnic_xmit()
2639 if (lpar_rc == H_CLOSED || adapter->failover_pending) { in ibmvnic_xmit()
2653 adapter->tx_send_failed += tx_send_failed; in ibmvnic_xmit()
2654 adapter->tx_map_failed += tx_map_failed; in ibmvnic_xmit()
2655 adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets; in ibmvnic_xmit()
2656 adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets; in ibmvnic_xmit()
2657 adapter->tx_stats_buffers[queue_num].bytes += tx_bytes; in ibmvnic_xmit()
2658 adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped; in ibmvnic_xmit()
2665 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_multi() local
2674 if (!adapter->promisc_supported) in ibmvnic_set_multi()
2683 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
2690 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
2700 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
2708 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_set_mac() local
2722 mutex_lock(&adapter->fw_lock); in __ibmvnic_set_mac()
2723 adapter->fw_done_rc = 0; in __ibmvnic_set_mac()
2724 reinit_completion(&adapter->fw_done); in __ibmvnic_set_mac()
2726 rc = ibmvnic_send_crq(adapter, &crq); in __ibmvnic_set_mac()
2729 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
2733 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in __ibmvnic_set_mac()
2735 if (rc || adapter->fw_done_rc) { in __ibmvnic_set_mac()
2737 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
2740 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
2743 ether_addr_copy(adapter->mac_addr, netdev->dev_addr); in __ibmvnic_set_mac()
2749 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_mac() local
2757 ether_addr_copy(adapter->mac_addr, addr->sa_data); in ibmvnic_set_mac()
2758 if (adapter->state != VNIC_PROBED) in ibmvnic_set_mac()
2792 static inline void reinit_init_done(struct ibmvnic_adapter *adapter) in reinit_init_done() argument
2794 reinit_completion(&adapter->init_done); in reinit_init_done()
2795 adapter->init_done_rc = 0; in reinit_init_done()
2802 static int do_reset(struct ibmvnic_adapter *adapter, in do_reset() argument
2805 struct net_device *netdev = adapter->netdev; in do_reset()
2810 netdev_dbg(adapter->netdev, in do_reset()
2812 adapter_state_to_string(adapter->state), in do_reset()
2813 adapter->failover_pending, in do_reset()
2817 adapter->reset_reason = rwi->reset_reason; in do_reset()
2819 if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM)) in do_reset()
2827 adapter->failover_pending = false; in do_reset()
2830 reset_state = adapter->state; in do_reset()
2839 old_num_rx_queues = adapter->req_rx_queues; in do_reset()
2840 old_num_tx_queues = adapter->req_tx_queues; in do_reset()
2841 old_num_rx_slots = adapter->req_rx_add_entries_per_subcrq; in do_reset()
2842 old_num_tx_slots = adapter->req_tx_entries_per_subcrq; in do_reset()
2847 adapter->reset_reason != VNIC_RESET_MOBILITY && in do_reset()
2848 adapter->reset_reason != VNIC_RESET_FAILOVER) { in do_reset()
2849 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { in do_reset()
2854 adapter->state = VNIC_CLOSING; in do_reset()
2862 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); in do_reset()
2867 if (adapter->state == VNIC_OPEN) { in do_reset()
2870 * set the adapter state to OPEN. Update our in do_reset()
2878 adapter->state = VNIC_CLOSING; in do_reset()
2881 if (adapter->state != VNIC_CLOSING) { in do_reset()
2882 /* If someone else changed the adapter state in do_reset()
2888 adapter->state = VNIC_CLOSED; in do_reset()
2892 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { in do_reset()
2893 release_resources(adapter); in do_reset()
2894 release_sub_crqs(adapter, 1); in do_reset()
2895 release_crq_queue(adapter); in do_reset()
2898 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) { in do_reset()
2902 adapter->state = VNIC_PROBED; in do_reset()
2904 reinit_init_done(adapter); in do_reset()
2906 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { in do_reset()
2907 rc = init_crq_queue(adapter); in do_reset()
2908 } else if (adapter->reset_reason == VNIC_RESET_MOBILITY) { in do_reset()
2909 rc = ibmvnic_reenable_crq_queue(adapter); in do_reset()
2910 release_sub_crqs(adapter, 1); in do_reset()
2912 rc = ibmvnic_reset_crq(adapter); in do_reset()
2914 rc = vio_enable_interrupts(adapter->vdev); in do_reset()
2916 netdev_err(adapter->netdev, in do_reset()
2923 netdev_err(adapter->netdev, in do_reset()
2928 rc = ibmvnic_reset_init(adapter, true); in do_reset()
2932 /* If the adapter was in PROBE or DOWN state prior to the reset, in do_reset()
2944 if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { in do_reset()
2945 rc = init_resources(adapter); in do_reset()
2948 } else if (adapter->req_rx_queues != old_num_rx_queues || in do_reset()
2949 adapter->req_tx_queues != old_num_tx_queues || in do_reset()
2950 adapter->req_rx_add_entries_per_subcrq != in do_reset()
2952 adapter->req_tx_entries_per_subcrq != in do_reset()
2954 !adapter->rx_pool || in do_reset()
2955 !adapter->tso_pool || in do_reset()
2956 !adapter->tx_pool) { in do_reset()
2957 release_napi(adapter); in do_reset()
2958 release_vpd_data(adapter); in do_reset()
2960 rc = init_resources(adapter); in do_reset()
2981 ibmvnic_disable_irqs(adapter); in do_reset()
2983 adapter->state = VNIC_CLOSED; in do_reset()
2999 if (adapter->reset_reason == VNIC_RESET_FAILOVER || in do_reset()
3000 adapter->reset_reason == VNIC_RESET_MOBILITY) in do_reset()
3006 /* restore the adapter state if reset failed */ in do_reset()
3008 adapter->state = reset_state; in do_reset()
3010 if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM)) in do_reset()
3013 netdev_dbg(adapter->netdev, "[S:%s FOP:%d] Reset done, rc %d\n", in do_reset()
3014 adapter_state_to_string(adapter->state), in do_reset()
3015 adapter->failover_pending, rc); in do_reset()
3019 static int do_hard_reset(struct ibmvnic_adapter *adapter, in do_hard_reset() argument
3022 struct net_device *netdev = adapter->netdev; in do_hard_reset()
3025 netdev_dbg(adapter->netdev, "Hard resetting driver (%s)\n", in do_hard_reset()
3029 reset_state = adapter->state; in do_hard_reset()
3037 adapter->reset_reason = rwi->reset_reason; in do_hard_reset()
3040 release_resources(adapter); in do_hard_reset()
3041 release_sub_crqs(adapter, 0); in do_hard_reset()
3042 release_crq_queue(adapter); in do_hard_reset()
3047 adapter->state = VNIC_PROBED; in do_hard_reset()
3049 reinit_init_done(adapter); in do_hard_reset()
3051 rc = init_crq_queue(adapter); in do_hard_reset()
3053 netdev_err(adapter->netdev, in do_hard_reset()
3058 rc = ibmvnic_reset_init(adapter, false); in do_hard_reset()
3062 /* If the adapter was in PROBE or DOWN state prior to the reset, in do_hard_reset()
3072 rc = init_resources(adapter); in do_hard_reset()
3076 ibmvnic_disable_irqs(adapter); in do_hard_reset()
3077 adapter->state = VNIC_CLOSED; in do_hard_reset()
3090 /* restore adapter state if reset failed */ in do_hard_reset()
3092 adapter->state = reset_state; in do_hard_reset()
3093 netdev_dbg(adapter->netdev, "[S:%s FOP:%d] Hard reset done, rc %d\n", in do_hard_reset()
3094 adapter_state_to_string(adapter->state), in do_hard_reset()
3095 adapter->failover_pending, rc); in do_hard_reset()
3099 static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter) in get_next_rwi() argument
3104 spin_lock_irqsave(&adapter->rwi_lock, flags); in get_next_rwi()
3106 if (!list_empty(&adapter->rwi_list)) { in get_next_rwi()
3107 rwi = list_first_entry(&adapter->rwi_list, struct ibmvnic_rwi, in get_next_rwi()
3114 spin_unlock_irqrestore(&adapter->rwi_lock, flags); in get_next_rwi()
3120 * @adapter: ibmvnic_adapter struct
3132 static int do_passive_init(struct ibmvnic_adapter *adapter) in do_passive_init() argument
3135 struct net_device *netdev = adapter->netdev; in do_passive_init()
3136 struct device *dev = &adapter->vdev->dev; in do_passive_init()
3141 adapter->state = VNIC_PROBING; in do_passive_init()
3142 reinit_completion(&adapter->init_done); in do_passive_init()
3143 adapter->init_done_rc = 0; in do_passive_init()
3144 adapter->crq.active = true; in do_passive_init()
3146 rc = send_crq_init_complete(adapter); in do_passive_init()
3150 rc = send_version_xchg(adapter); in do_passive_init()
3152 netdev_dbg(adapter->netdev, "send_version_xchg failed, rc=%d\n", rc); in do_passive_init()
3154 if (!wait_for_completion_timeout(&adapter->init_done, timeout)) { in do_passive_init()
3160 rc = init_sub_crqs(adapter); in do_passive_init()
3166 rc = init_sub_crq_irqs(adapter); in do_passive_init()
3172 netdev->mtu = adapter->req_mtu - ETH_HLEN; in do_passive_init()
3173 netdev->min_mtu = adapter->min_mtu - ETH_HLEN; in do_passive_init()
3174 netdev->max_mtu = adapter->max_mtu - ETH_HLEN; in do_passive_init()
3176 adapter->state = VNIC_PROBED; in do_passive_init()
3182 release_sub_crqs(adapter, 1); in do_passive_init()
3184 adapter->state = VNIC_DOWN; in do_passive_init()
3190 struct ibmvnic_adapter *adapter; in __ibmvnic_reset() local
3202 adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); in __ibmvnic_reset()
3203 dev = &adapter->vdev->dev; in __ibmvnic_reset()
3214 if (adapter->state == VNIC_PROBING && in __ibmvnic_reset()
3215 !wait_for_completion_timeout(&adapter->probe_done, timeout)) { in __ibmvnic_reset()
3218 &adapter->ibmvnic_delayed_reset, in __ibmvnic_reset()
3223 /* adapter is done with probe (i.e state is never VNIC_PROBING now) */ in __ibmvnic_reset()
3224 if (adapter->state == VNIC_REMOVING) in __ibmvnic_reset()
3252 spin_lock(&adapter->rwi_lock); in __ibmvnic_reset()
3253 if (!list_empty(&adapter->rwi_list)) { in __ibmvnic_reset()
3254 if (test_and_set_bit_lock(0, &adapter->resetting)) { in __ibmvnic_reset()
3256 &adapter->ibmvnic_delayed_reset, in __ibmvnic_reset()
3262 spin_unlock(&adapter->rwi_lock); in __ibmvnic_reset()
3267 rwi = get_next_rwi(adapter); in __ibmvnic_reset()
3269 spin_lock_irqsave(&adapter->state_lock, flags); in __ibmvnic_reset()
3271 if (adapter->state == VNIC_REMOVING || in __ibmvnic_reset()
3272 adapter->state == VNIC_REMOVED) { in __ibmvnic_reset()
3273 spin_unlock_irqrestore(&adapter->state_lock, flags); in __ibmvnic_reset()
3280 reset_state = adapter->state; in __ibmvnic_reset()
3283 spin_unlock_irqrestore(&adapter->state_lock, flags); in __ibmvnic_reset()
3287 rc = do_passive_init(adapter); in __ibmvnic_reset()
3290 netif_carrier_on(adapter->netdev); in __ibmvnic_reset()
3291 } else if (adapter->force_reset_recovery) { in __ibmvnic_reset()
3296 adapter->failover_pending = false; in __ibmvnic_reset()
3299 if (adapter->wait_for_reset) { in __ibmvnic_reset()
3301 adapter->force_reset_recovery = false; in __ibmvnic_reset()
3302 rc = do_hard_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
3305 adapter->force_reset_recovery = false; in __ibmvnic_reset()
3306 rc = do_hard_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
3319 * adapter some time to settle down before retrying. in __ibmvnic_reset()
3322 netdev_dbg(adapter->netdev, in __ibmvnic_reset()
3324 adapter_state_to_string(adapter->state), in __ibmvnic_reset()
3330 rc = do_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
3333 adapter->last_reset_time = jiffies; in __ibmvnic_reset()
3336 netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc); in __ibmvnic_reset()
3338 rwi = get_next_rwi(adapter); in __ibmvnic_reset()
3342 * the adapter would be in an undefined state. So retry the in __ibmvnic_reset()
3357 adapter->force_reset_recovery = true; in __ibmvnic_reset()
3360 if (adapter->wait_for_reset) { in __ibmvnic_reset()
3361 adapter->reset_done_rc = rc; in __ibmvnic_reset()
3362 complete(&adapter->reset_done); in __ibmvnic_reset()
3365 clear_bit_unlock(0, &adapter->resetting); in __ibmvnic_reset()
3367 netdev_dbg(adapter->netdev, in __ibmvnic_reset()
3369 adapter_state_to_string(adapter->state), in __ibmvnic_reset()
3370 adapter->force_reset_recovery, in __ibmvnic_reset()
3371 adapter->wait_for_reset); in __ibmvnic_reset()
3376 struct ibmvnic_adapter *adapter; in __ibmvnic_delayed_reset() local
3378 adapter = container_of(work, struct ibmvnic_adapter, in __ibmvnic_delayed_reset()
3380 __ibmvnic_reset(&adapter->ibmvnic_reset); in __ibmvnic_delayed_reset()
3383 static void flush_reset_queue(struct ibmvnic_adapter *adapter) in flush_reset_queue() argument
3387 if (!list_empty(&adapter->rwi_list)) { in flush_reset_queue()
3388 list_for_each_safe(entry, tmp_entry, &adapter->rwi_list) { in flush_reset_queue()
3395 static int ibmvnic_reset(struct ibmvnic_adapter *adapter, in ibmvnic_reset() argument
3398 struct net_device *netdev = adapter->netdev; in ibmvnic_reset()
3403 spin_lock_irqsave(&adapter->rwi_lock, flags); in ibmvnic_reset()
3410 if (adapter->state == VNIC_REMOVING || in ibmvnic_reset()
3411 adapter->state == VNIC_REMOVED || in ibmvnic_reset()
3412 (adapter->failover_pending && reason != VNIC_RESET_FAILOVER)) { in ibmvnic_reset()
3414 netdev_dbg(netdev, "Adapter removing or pending failover, skipping reset\n"); in ibmvnic_reset()
3418 list_for_each_entry(tmp, &adapter->rwi_list, list) { in ibmvnic_reset()
3435 if (adapter->force_reset_recovery) in ibmvnic_reset()
3436 flush_reset_queue(adapter); in ibmvnic_reset()
3439 list_add_tail(&rwi->list, &adapter->rwi_list); in ibmvnic_reset()
3440 netdev_dbg(adapter->netdev, "Scheduling reset (reason %s)\n", in ibmvnic_reset()
3442 queue_work(system_long_wq, &adapter->ibmvnic_reset); in ibmvnic_reset()
3447 spin_unlock_irqrestore(&adapter->rwi_lock, flags); in ibmvnic_reset()
3457 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_tx_timeout() local
3459 if (test_bit(0, &adapter->resetting)) { in ibmvnic_tx_timeout()
3460 netdev_err(adapter->netdev, in ibmvnic_tx_timeout()
3461 "Adapter is resetting, skip timeout reset\n"); in ibmvnic_tx_timeout()
3467 if (time_before(jiffies, (adapter->last_reset_time + dev->watchdog_timeo))) { in ibmvnic_tx_timeout()
3471 ibmvnic_reset(adapter, VNIC_RESET_TIMEOUT); in ibmvnic_tx_timeout()
3474 static void remove_buff_from_pool(struct ibmvnic_adapter *adapter, in remove_buff_from_pool() argument
3477 struct ibmvnic_rx_pool *pool = &adapter->rx_pool[rx_buff->pool_index]; in remove_buff_from_pool()
3490 struct ibmvnic_adapter *adapter; in ibmvnic_poll() local
3496 adapter = netdev_priv(netdev); in ibmvnic_poll()
3497 scrq_num = (int)(napi - adapter->napi); in ibmvnic_poll()
3499 rx_scrq = adapter->rx_scrq[scrq_num]; in ibmvnic_poll()
3510 if (unlikely(test_bit(0, &adapter->resetting) && in ibmvnic_poll()
3511 adapter->reset_reason != VNIC_RESET_NON_FATAL)) { in ibmvnic_poll()
3512 enable_scrq_irq(adapter, rx_scrq); in ibmvnic_poll()
3517 if (!pending_scrq(adapter, rx_scrq)) in ibmvnic_poll()
3519 next = ibmvnic_next_scrq(adapter, rx_scrq); in ibmvnic_poll()
3529 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
3534 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
3550 if (adapter->rx_vlan_header_insertion && in ibmvnic_poll()
3557 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
3572 adapter->rx_stats_buffers[scrq_num].packets++; in ibmvnic_poll()
3573 adapter->rx_stats_buffers[scrq_num].bytes += length; in ibmvnic_poll()
3577 if (adapter->state != VNIC_CLOSING && in ibmvnic_poll()
3578 (atomic_read(&adapter->rx_pool[scrq_num].available) < in ibmvnic_poll()
3579 adapter->req_rx_add_entries_per_subcrq / 2)) in ibmvnic_poll()
3580 replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]); in ibmvnic_poll()
3583 enable_scrq_irq(adapter, rx_scrq); in ibmvnic_poll()
3584 if (pending_scrq(adapter, rx_scrq)) { in ibmvnic_poll()
3586 disable_scrq_irq(adapter, rx_scrq); in ibmvnic_poll()
3595 static int wait_for_reset(struct ibmvnic_adapter *adapter) in wait_for_reset() argument
3599 adapter->fallback.mtu = adapter->req_mtu; in wait_for_reset()
3600 adapter->fallback.rx_queues = adapter->req_rx_queues; in wait_for_reset()
3601 adapter->fallback.tx_queues = adapter->req_tx_queues; in wait_for_reset()
3602 adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq; in wait_for_reset()
3603 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq; in wait_for_reset()
3605 reinit_completion(&adapter->reset_done); in wait_for_reset()
3606 adapter->wait_for_reset = true; in wait_for_reset()
3607 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); in wait_for_reset()
3613 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, 60000); in wait_for_reset()
3620 if (adapter->reset_done_rc) { in wait_for_reset()
3622 adapter->desired.mtu = adapter->fallback.mtu; in wait_for_reset()
3623 adapter->desired.rx_queues = adapter->fallback.rx_queues; in wait_for_reset()
3624 adapter->desired.tx_queues = adapter->fallback.tx_queues; in wait_for_reset()
3625 adapter->desired.rx_entries = adapter->fallback.rx_entries; in wait_for_reset()
3626 adapter->desired.tx_entries = adapter->fallback.tx_entries; in wait_for_reset()
3628 reinit_completion(&adapter->reset_done); in wait_for_reset()
3629 adapter->wait_for_reset = true; in wait_for_reset()
3630 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); in wait_for_reset()
3635 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, in wait_for_reset()
3643 adapter->wait_for_reset = false; in wait_for_reset()
3650 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_change_mtu() local
3652 adapter->desired.mtu = new_mtu + ETH_HLEN; in ibmvnic_change_mtu()
3654 return wait_for_reset(adapter); in ibmvnic_change_mtu()
3691 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_link_ksettings() local
3694 rc = send_query_phys_parms(adapter); in ibmvnic_get_link_ksettings()
3696 adapter->speed = SPEED_UNKNOWN; in ibmvnic_get_link_ksettings()
3697 adapter->duplex = DUPLEX_UNKNOWN; in ibmvnic_get_link_ksettings()
3699 cmd->base.speed = adapter->speed; in ibmvnic_get_link_ksettings()
3700 cmd->base.duplex = adapter->duplex; in ibmvnic_get_link_ksettings()
3711 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_drvinfo() local
3715 strscpy(info->fw_version, adapter->fw_version, in ibmvnic_get_drvinfo()
3721 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_msglevel() local
3723 return adapter->msg_enable; in ibmvnic_get_msglevel()
3728 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_msglevel() local
3730 adapter->msg_enable = data; in ibmvnic_set_msglevel()
3735 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_link() local
3740 return adapter->logical_link_state; in ibmvnic_get_link()
3748 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_ringparam() local
3750 ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq; in ibmvnic_get_ringparam()
3751 ring->tx_max_pending = adapter->max_tx_entries_per_subcrq; in ibmvnic_get_ringparam()
3754 ring->rx_pending = adapter->req_rx_add_entries_per_subcrq; in ibmvnic_get_ringparam()
3755 ring->tx_pending = adapter->req_tx_entries_per_subcrq; in ibmvnic_get_ringparam()
3765 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_ringparam() local
3767 if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq || in ibmvnic_set_ringparam()
3768 ring->tx_pending > adapter->max_tx_entries_per_subcrq) { in ibmvnic_set_ringparam()
3771 adapter->max_rx_add_entries_per_subcrq); in ibmvnic_set_ringparam()
3773 adapter->max_tx_entries_per_subcrq); in ibmvnic_set_ringparam()
3777 adapter->desired.rx_entries = ring->rx_pending; in ibmvnic_set_ringparam()
3778 adapter->desired.tx_entries = ring->tx_pending; in ibmvnic_set_ringparam()
3780 return wait_for_reset(adapter); in ibmvnic_set_ringparam()
3786 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_channels() local
3788 channels->max_rx = adapter->max_rx_queues; in ibmvnic_get_channels()
3789 channels->max_tx = adapter->max_tx_queues; in ibmvnic_get_channels()
3792 channels->rx_count = adapter->req_rx_queues; in ibmvnic_get_channels()
3793 channels->tx_count = adapter->req_tx_queues; in ibmvnic_get_channels()
3801 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_channels() local
3803 adapter->desired.rx_queues = channels->rx_count; in ibmvnic_set_channels()
3804 adapter->desired.tx_queues = channels->tx_count; in ibmvnic_set_channels()
3806 return wait_for_reset(adapter); in ibmvnic_set_channels()
3811 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_strings() local
3820 for (i = 0; i < adapter->req_tx_queues; i++) { in ibmvnic_get_strings()
3827 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_get_strings()
3836 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_sset_count() local
3841 adapter->req_tx_queues * NUM_TX_STATS + in ibmvnic_get_sset_count()
3842 adapter->req_rx_queues * NUM_RX_STATS; in ibmvnic_get_sset_count()
3851 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_ethtool_stats() local
3859 crq.request_statistics.ioba = cpu_to_be32(adapter->stats_token); in ibmvnic_get_ethtool_stats()
3864 reinit_completion(&adapter->stats_done); in ibmvnic_get_ethtool_stats()
3865 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_ethtool_stats()
3868 rc = ibmvnic_wait_for_completion(adapter, &adapter->stats_done, 10000); in ibmvnic_get_ethtool_stats()
3874 (adapter, ibmvnic_stats[i].offset)); in ibmvnic_get_ethtool_stats()
3876 for (j = 0; j < adapter->req_tx_queues; j++) { in ibmvnic_get_ethtool_stats()
3877 data[i] = adapter->tx_stats_buffers[j].batched_packets; in ibmvnic_get_ethtool_stats()
3879 data[i] = adapter->tx_stats_buffers[j].direct_packets; in ibmvnic_get_ethtool_stats()
3881 data[i] = adapter->tx_stats_buffers[j].bytes; in ibmvnic_get_ethtool_stats()
3883 data[i] = adapter->tx_stats_buffers[j].dropped_packets; in ibmvnic_get_ethtool_stats()
3887 for (j = 0; j < adapter->req_rx_queues; j++) { in ibmvnic_get_ethtool_stats()
3888 data[i] = adapter->rx_stats_buffers[j].packets; in ibmvnic_get_ethtool_stats()
3890 data[i] = adapter->rx_stats_buffers[j].bytes; in ibmvnic_get_ethtool_stats()
3892 data[i] = adapter->rx_stats_buffers[j].interrupts; in ibmvnic_get_ethtool_stats()
3914 static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter, in reset_one_sub_crq_queue() argument
3920 netdev_dbg(adapter->netdev, "Invalid scrq reset.\n"); in reset_one_sub_crq_queue()
3936 netdev_dbg(adapter->netdev, "Invalid scrq reset\n"); in reset_one_sub_crq_queue()
3940 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in reset_one_sub_crq_queue()
3945 static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter) in reset_sub_crq_queues() argument
3949 if (!adapter->tx_scrq || !adapter->rx_scrq) in reset_sub_crq_queues()
3952 ibmvnic_clean_affinity(adapter); in reset_sub_crq_queues()
3954 for (i = 0; i < adapter->req_tx_queues; i++) { in reset_sub_crq_queues()
3955 netdev_dbg(adapter->netdev, "Re-setting tx_scrq[%d]\n", i); in reset_sub_crq_queues()
3956 rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]); in reset_sub_crq_queues()
3961 for (i = 0; i < adapter->req_rx_queues; i++) { in reset_sub_crq_queues()
3962 netdev_dbg(adapter->netdev, "Re-setting rx_scrq[%d]\n", i); in reset_sub_crq_queues()
3963 rc = reset_one_sub_crq_queue(adapter, adapter->rx_scrq[i]); in reset_sub_crq_queues()
3971 static void release_sub_crq_queue(struct ibmvnic_adapter *adapter, in release_sub_crq_queue() argument
3975 struct device *dev = &adapter->vdev->dev; in release_sub_crq_queue()
3978 netdev_dbg(adapter->netdev, "Releasing sub-CRQ\n"); in release_sub_crq_queue()
3984 adapter->vdev->unit_address, in release_sub_crq_queue()
3989 netdev_err(adapter->netdev, in release_sub_crq_queue()
4008 *adapter) in init_sub_crq_queue()
4010 struct device *dev = &adapter->vdev->dev; in init_sub_crq_queue()
4034 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in init_sub_crq_queue()
4038 rc = ibmvnic_reset_crq(adapter); in init_sub_crq_queue()
4041 dev_warn(dev, "Partner adapter not ready, waiting.\n"); in init_sub_crq_queue()
4047 scrq->adapter = adapter; in init_sub_crq_queue()
4062 netdev_dbg(adapter->netdev, in init_sub_crq_queue()
4071 adapter->vdev->unit_address, in init_sub_crq_queue()
4087 static void release_sub_crqs(struct ibmvnic_adapter *adapter, bool do_h_free) in release_sub_crqs() argument
4091 ibmvnic_clean_affinity(adapter); in release_sub_crqs()
4092 if (adapter->tx_scrq) { in release_sub_crqs()
4093 for (i = 0; i < adapter->num_active_tx_scrqs; i++) { in release_sub_crqs()
4094 if (!adapter->tx_scrq[i]) in release_sub_crqs()
4097 netdev_dbg(adapter->netdev, "Releasing tx_scrq[%d]\n", in release_sub_crqs()
4099 ibmvnic_tx_scrq_clean_buffer(adapter, adapter->tx_scrq[i]); in release_sub_crqs()
4100 if (adapter->tx_scrq[i]->irq) { in release_sub_crqs()
4101 free_irq(adapter->tx_scrq[i]->irq, in release_sub_crqs()
4102 adapter->tx_scrq[i]); in release_sub_crqs()
4103 irq_dispose_mapping(adapter->tx_scrq[i]->irq); in release_sub_crqs()
4104 adapter->tx_scrq[i]->irq = 0; in release_sub_crqs()
4107 release_sub_crq_queue(adapter, adapter->tx_scrq[i], in release_sub_crqs()
4111 kfree(adapter->tx_scrq); in release_sub_crqs()
4112 adapter->tx_scrq = NULL; in release_sub_crqs()
4113 adapter->num_active_tx_scrqs = 0; in release_sub_crqs()
4120 clean_tx_pools(adapter); in release_sub_crqs()
4122 if (adapter->rx_scrq) { in release_sub_crqs()
4123 for (i = 0; i < adapter->num_active_rx_scrqs; i++) { in release_sub_crqs()
4124 if (!adapter->rx_scrq[i]) in release_sub_crqs()
4127 netdev_dbg(adapter->netdev, "Releasing rx_scrq[%d]\n", in release_sub_crqs()
4129 if (adapter->rx_scrq[i]->irq) { in release_sub_crqs()
4130 free_irq(adapter->rx_scrq[i]->irq, in release_sub_crqs()
4131 adapter->rx_scrq[i]); in release_sub_crqs()
4132 irq_dispose_mapping(adapter->rx_scrq[i]->irq); in release_sub_crqs()
4133 adapter->rx_scrq[i]->irq = 0; in release_sub_crqs()
4136 release_sub_crq_queue(adapter, adapter->rx_scrq[i], in release_sub_crqs()
4140 kfree(adapter->rx_scrq); in release_sub_crqs()
4141 adapter->rx_scrq = NULL; in release_sub_crqs()
4142 adapter->num_active_rx_scrqs = 0; in release_sub_crqs()
4146 static int disable_scrq_irq(struct ibmvnic_adapter *adapter, in disable_scrq_irq() argument
4149 struct device *dev = &adapter->vdev->dev; in disable_scrq_irq()
4152 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in disable_scrq_irq()
4184 static int enable_scrq_irq(struct ibmvnic_adapter *adapter, in enable_scrq_irq() argument
4187 struct device *dev = &adapter->vdev->dev; in enable_scrq_irq()
4195 if (test_bit(0, &adapter->resetting) && in enable_scrq_irq()
4196 adapter->reset_reason == VNIC_RESET_MOBILITY) { in enable_scrq_irq()
4200 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in enable_scrq_irq()
4208 static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter, in ibmvnic_complete_tx() argument
4211 struct device *dev = &adapter->vdev->dev; in ibmvnic_complete_tx()
4220 while (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
4223 next = ibmvnic_next_scrq(adapter, scrq); in ibmvnic_complete_tx()
4227 tx_pool = &adapter->tso_pool[pool]; in ibmvnic_complete_tx()
4230 tx_pool = &adapter->tx_pool[pool]; in ibmvnic_complete_tx()
4247 netdev_warn(adapter->netdev, in ibmvnic_complete_tx()
4260 (adapter->req_tx_entries_per_subcrq / 2) && in ibmvnic_complete_tx()
4261 __netif_subqueue_stopped(adapter->netdev, in ibmvnic_complete_tx()
4264 if (adapter->tx_queues_active) { in ibmvnic_complete_tx()
4265 netif_wake_subqueue(adapter->netdev, in ibmvnic_complete_tx()
4267 netdev_dbg(adapter->netdev, in ibmvnic_complete_tx()
4275 enable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
4277 if (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
4278 disable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
4282 txq = netdev_get_tx_queue(adapter->netdev, scrq->pool_index); in ibmvnic_complete_tx()
4291 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_tx() local
4293 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_tx()
4294 ibmvnic_complete_tx(adapter, scrq); in ibmvnic_interrupt_tx()
4302 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_rx() local
4307 if (unlikely(adapter->state != VNIC_OPEN)) in ibmvnic_interrupt_rx()
4310 adapter->rx_stats_buffers[scrq->scrq_num].interrupts++; in ibmvnic_interrupt_rx()
4312 if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) { in ibmvnic_interrupt_rx()
4313 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_rx()
4314 __napi_schedule(&adapter->napi[scrq->scrq_num]); in ibmvnic_interrupt_rx()
4320 static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter) in init_sub_crq_irqs() argument
4322 struct device *dev = &adapter->vdev->dev; in init_sub_crq_irqs()
4327 for (i = 0; i < adapter->req_tx_queues; i++) { in init_sub_crq_irqs()
4328 netdev_dbg(adapter->netdev, "Initializing tx_scrq[%d] irq\n", in init_sub_crq_irqs()
4330 scrq = adapter->tx_scrq[i]; in init_sub_crq_irqs()
4340 adapter->vdev->unit_address, i); in init_sub_crq_irqs()
4352 for (i = 0; i < adapter->req_rx_queues; i++) { in init_sub_crq_irqs()
4353 netdev_dbg(adapter->netdev, "Initializing rx_scrq[%d] irq\n", in init_sub_crq_irqs()
4355 scrq = adapter->rx_scrq[i]; in init_sub_crq_irqs()
4363 adapter->vdev->unit_address, i); in init_sub_crq_irqs()
4375 ibmvnic_set_affinity(adapter); in init_sub_crq_irqs()
4382 free_irq(adapter->rx_scrq[j]->irq, adapter->rx_scrq[j]); in init_sub_crq_irqs()
4383 irq_dispose_mapping(adapter->rx_scrq[j]->irq); in init_sub_crq_irqs()
4385 i = adapter->req_tx_queues; in init_sub_crq_irqs()
4388 free_irq(adapter->tx_scrq[j]->irq, adapter->tx_scrq[j]); in init_sub_crq_irqs()
4389 irq_dispose_mapping(adapter->tx_scrq[j]->irq); in init_sub_crq_irqs()
4391 release_sub_crqs(adapter, 1); in init_sub_crq_irqs()
4395 static int init_sub_crqs(struct ibmvnic_adapter *adapter) in init_sub_crqs() argument
4397 struct device *dev = &adapter->vdev->dev; in init_sub_crqs()
4404 total_queues = adapter->req_tx_queues + adapter->req_rx_queues; in init_sub_crqs()
4411 allqueues[i] = init_sub_crq_queue(adapter); in init_sub_crqs()
4421 adapter->min_tx_queues + adapter->min_rx_queues) { in init_sub_crqs()
4428 netdev_dbg(adapter->netdev, "Reducing number of queues\n"); in init_sub_crqs()
4431 if (adapter->req_rx_queues > adapter->min_rx_queues) in init_sub_crqs()
4432 adapter->req_rx_queues--; in init_sub_crqs()
4437 if (adapter->req_tx_queues > adapter->min_tx_queues) in init_sub_crqs()
4438 adapter->req_tx_queues--; in init_sub_crqs()
4445 adapter->tx_scrq = kcalloc(adapter->req_tx_queues, in init_sub_crqs()
4446 sizeof(*adapter->tx_scrq), GFP_KERNEL); in init_sub_crqs()
4447 if (!adapter->tx_scrq) in init_sub_crqs()
4450 for (i = 0; i < adapter->req_tx_queues; i++) { in init_sub_crqs()
4451 adapter->tx_scrq[i] = allqueues[i]; in init_sub_crqs()
4452 adapter->tx_scrq[i]->pool_index = i; in init_sub_crqs()
4453 adapter->num_active_tx_scrqs++; in init_sub_crqs()
4456 adapter->rx_scrq = kcalloc(adapter->req_rx_queues, in init_sub_crqs()
4457 sizeof(*adapter->rx_scrq), GFP_KERNEL); in init_sub_crqs()
4458 if (!adapter->rx_scrq) in init_sub_crqs()
4461 for (i = 0; i < adapter->req_rx_queues; i++) { in init_sub_crqs()
4462 adapter->rx_scrq[i] = allqueues[i + adapter->req_tx_queues]; in init_sub_crqs()
4463 adapter->rx_scrq[i]->scrq_num = i; in init_sub_crqs()
4464 adapter->num_active_rx_scrqs++; in init_sub_crqs()
4471 kfree(adapter->tx_scrq); in init_sub_crqs()
4472 adapter->tx_scrq = NULL; in init_sub_crqs()
4475 release_sub_crq_queue(adapter, allqueues[i], 1); in init_sub_crqs()
4480 static void send_request_cap(struct ibmvnic_adapter *adapter, int retry) in send_request_cap() argument
4482 struct device *dev = &adapter->vdev->dev; in send_request_cap()
4492 if (!(adapter->netdev->flags & IFF_PROMISC) || in send_request_cap()
4493 adapter->promisc_supported) in send_request_cap()
4502 atomic_set(&adapter->running_cap_crqs, cap_reqs); in send_request_cap()
4504 if (adapter->min_tx_entries_per_subcrq > entries_page || in send_request_cap()
4505 adapter->min_rx_add_entries_per_subcrq > entries_page) { in send_request_cap()
4510 if (adapter->desired.mtu) in send_request_cap()
4511 adapter->req_mtu = adapter->desired.mtu; in send_request_cap()
4513 adapter->req_mtu = adapter->netdev->mtu + ETH_HLEN; in send_request_cap()
4515 if (!adapter->desired.tx_entries) in send_request_cap()
4516 adapter->desired.tx_entries = in send_request_cap()
4517 adapter->max_tx_entries_per_subcrq; in send_request_cap()
4518 if (!adapter->desired.rx_entries) in send_request_cap()
4519 adapter->desired.rx_entries = in send_request_cap()
4520 adapter->max_rx_add_entries_per_subcrq; in send_request_cap()
4523 (adapter->req_mtu + IBMVNIC_BUFFER_HLEN); in send_request_cap()
4525 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) * in send_request_cap()
4526 adapter->desired.tx_entries > IBMVNIC_LTB_SET_SIZE) { in send_request_cap()
4527 adapter->desired.tx_entries = max_entries; in send_request_cap()
4530 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) * in send_request_cap()
4531 adapter->desired.rx_entries > IBMVNIC_LTB_SET_SIZE) { in send_request_cap()
4532 adapter->desired.rx_entries = max_entries; in send_request_cap()
4535 if (adapter->desired.tx_entries) in send_request_cap()
4536 adapter->req_tx_entries_per_subcrq = in send_request_cap()
4537 adapter->desired.tx_entries; in send_request_cap()
4539 adapter->req_tx_entries_per_subcrq = in send_request_cap()
4540 adapter->max_tx_entries_per_subcrq; in send_request_cap()
4542 if (adapter->desired.rx_entries) in send_request_cap()
4543 adapter->req_rx_add_entries_per_subcrq = in send_request_cap()
4544 adapter->desired.rx_entries; in send_request_cap()
4546 adapter->req_rx_add_entries_per_subcrq = in send_request_cap()
4547 adapter->max_rx_add_entries_per_subcrq; in send_request_cap()
4549 if (adapter->desired.tx_queues) in send_request_cap()
4550 adapter->req_tx_queues = in send_request_cap()
4551 adapter->desired.tx_queues; in send_request_cap()
4553 adapter->req_tx_queues = in send_request_cap()
4554 adapter->opt_tx_comp_sub_queues; in send_request_cap()
4556 if (adapter->desired.rx_queues) in send_request_cap()
4557 adapter->req_rx_queues = in send_request_cap()
4558 adapter->desired.rx_queues; in send_request_cap()
4560 adapter->req_rx_queues = in send_request_cap()
4561 adapter->opt_rx_comp_queues; in send_request_cap()
4563 adapter->req_rx_add_queues = adapter->max_rx_add_queues; in send_request_cap()
4565 atomic_add(cap_reqs, &adapter->running_cap_crqs); in send_request_cap()
4572 crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues); in send_request_cap()
4574 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4577 crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues); in send_request_cap()
4579 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4582 crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues); in send_request_cap()
4584 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4589 cpu_to_be64(adapter->req_tx_entries_per_subcrq); in send_request_cap()
4591 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4596 cpu_to_be64(adapter->req_rx_add_entries_per_subcrq); in send_request_cap()
4598 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4601 crq.request_capability.number = cpu_to_be64(adapter->req_mtu); in send_request_cap()
4603 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4605 if (adapter->netdev->flags & IFF_PROMISC) { in send_request_cap()
4606 if (adapter->promisc_supported) { in send_request_cap()
4611 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4618 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
4627 static int pending_scrq(struct ibmvnic_adapter *adapter, in pending_scrq() argument
4643 static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter, in ibmvnic_next_scrq() argument
4667 static union ibmvnic_crq *ibmvnic_next_crq(struct ibmvnic_adapter *adapter) in ibmvnic_next_crq() argument
4669 struct ibmvnic_crq_queue *queue = &adapter->crq; in ibmvnic_next_crq()
4688 "%s failed: Send request is malformed or adapter failover pending. (rc=%d)\n", in print_subcrq_error()
4693 "%s failed: Backing queue closed. Adapter is down or failover pending. (rc=%d)\n", in print_subcrq_error()
4702 static int send_subcrq_indirect(struct ibmvnic_adapter *adapter, in send_subcrq_indirect() argument
4705 unsigned int ua = adapter->vdev->unit_address; in send_subcrq_indirect()
4706 struct device *dev = &adapter->vdev->dev; in send_subcrq_indirect()
4721 static int ibmvnic_send_crq(struct ibmvnic_adapter *adapter, in ibmvnic_send_crq() argument
4724 unsigned int ua = adapter->vdev->unit_address; in ibmvnic_send_crq()
4725 struct device *dev = &adapter->vdev->dev; in ibmvnic_send_crq()
4729 netdev_dbg(adapter->netdev, "Sending CRQ: %016lx %016lx\n", in ibmvnic_send_crq()
4733 if (!adapter->crq.active && in ibmvnic_send_crq()
4758 static int ibmvnic_send_crq_init(struct ibmvnic_adapter *adapter) in ibmvnic_send_crq_init() argument
4760 struct device *dev = &adapter->vdev->dev; in ibmvnic_send_crq_init()
4768 netdev_dbg(adapter->netdev, "Sending CRQ init\n"); in ibmvnic_send_crq_init()
4771 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_send_crq_init()
4793 static int vnic_client_data_len(struct ibmvnic_adapter *adapter) in vnic_client_data_len() argument
4804 len += strlen(adapter->netdev->name) + 1; in vnic_client_data_len()
4809 static void vnic_add_client_data(struct ibmvnic_adapter *adapter, in vnic_add_client_data() argument
4831 len = strlen(adapter->netdev->name) + 1; in vnic_add_client_data()
4833 strscpy(vlcd->name, adapter->netdev->name, len); in vnic_add_client_data()
4848 static int send_login(struct ibmvnic_adapter *adapter) in send_login() argument
4852 struct device *dev = &adapter->vdev->dev; in send_login()
4865 if (!adapter->tx_scrq || !adapter->rx_scrq) { in send_login()
4866 netdev_err(adapter->netdev, in send_login()
4871 release_login_buffer(adapter); in send_login()
4872 release_login_rsp_buffer(adapter); in send_login()
4874 client_data_len = vnic_client_data_len(adapter); in send_login()
4878 sizeof(u64) * (adapter->req_tx_queues + adapter->req_rx_queues) + in send_login()
4893 sizeof(u64) * adapter->req_tx_queues + in send_login()
4894 sizeof(u64) * adapter->req_rx_queues + in send_login()
4895 sizeof(u64) * adapter->req_rx_queues + in send_login()
4909 adapter->login_buf = login_buffer; in send_login()
4910 adapter->login_buf_token = buffer_token; in send_login()
4911 adapter->login_buf_sz = buffer_size; in send_login()
4912 adapter->login_rsp_buf = login_rsp_buffer; in send_login()
4913 adapter->login_rsp_buf_token = rsp_buffer_token; in send_login()
4914 adapter->login_rsp_buf_sz = rsp_buffer_size; in send_login()
4918 login_buffer->num_txcomp_subcrqs = cpu_to_be32(adapter->req_tx_queues); in send_login()
4921 login_buffer->num_rxcomp_subcrqs = cpu_to_be32(adapter->req_rx_queues); in send_login()
4924 sizeof(u64) * adapter->req_tx_queues); in send_login()
4932 sizeof(u64) * adapter->req_tx_queues); in send_login()
4934 for (i = 0; i < adapter->req_tx_queues; i++) { in send_login()
4935 if (adapter->tx_scrq[i]) { in send_login()
4937 cpu_to_be64(adapter->tx_scrq[i]->crq_num); in send_login()
4941 for (i = 0; i < adapter->req_rx_queues; i++) { in send_login()
4942 if (adapter->rx_scrq[i]) { in send_login()
4944 cpu_to_be64(adapter->rx_scrq[i]->crq_num); in send_login()
4950 ((char *)rx_list_p + (sizeof(u64) * adapter->req_rx_queues)); in send_login()
4955 vnic_add_client_data(adapter, vlcd); in send_login()
4957 netdev_dbg(adapter->netdev, "Login Buffer:\n"); in send_login()
4958 ibmvnic_print_hex_dump(adapter->netdev, adapter->login_buf, in send_login()
4959 adapter->login_buf_sz); in send_login()
4967 adapter->login_pending = true; in send_login()
4968 rc = ibmvnic_send_crq(adapter, &crq); in send_login()
4970 adapter->login_pending = false; in send_login()
4971 netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc); in send_login()
4982 adapter->login_rsp_buf = NULL; in send_login()
4987 adapter->login_buf = NULL; in send_login()
4992 static int send_request_map(struct ibmvnic_adapter *adapter, dma_addr_t addr, in send_request_map() argument
5003 return ibmvnic_send_crq(adapter, &crq); in send_request_map()
5006 static int send_request_unmap(struct ibmvnic_adapter *adapter, u8 map_id) in send_request_unmap() argument
5014 return ibmvnic_send_crq(adapter, &crq); in send_request_unmap()
5017 static void send_query_map(struct ibmvnic_adapter *adapter) in send_query_map() argument
5024 ibmvnic_send_crq(adapter, &crq); in send_query_map()
5028 static void send_query_cap(struct ibmvnic_adapter *adapter) in send_query_cap() argument
5039 atomic_set(&adapter->running_cap_crqs, cap_reqs); in send_query_cap()
5046 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5050 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5054 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5058 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5062 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5066 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5071 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5076 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5081 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5086 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5090 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5094 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5098 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5102 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5106 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5110 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5114 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5118 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5122 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5126 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5130 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5135 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5140 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5145 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5150 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
5159 static void send_query_ip_offload(struct ibmvnic_adapter *adapter) in send_query_ip_offload() argument
5162 struct device *dev = &adapter->vdev->dev; in send_query_ip_offload()
5165 adapter->ip_offload_tok = in send_query_ip_offload()
5167 &adapter->ip_offload_buf, in send_query_ip_offload()
5171 if (dma_mapping_error(dev, adapter->ip_offload_tok)) { in send_query_ip_offload()
5182 cpu_to_be32(adapter->ip_offload_tok); in send_query_ip_offload()
5184 ibmvnic_send_crq(adapter, &crq); in send_query_ip_offload()
5187 static void send_control_ip_offload(struct ibmvnic_adapter *adapter) in send_control_ip_offload() argument
5189 struct ibmvnic_control_ip_offload_buffer *ctrl_buf = &adapter->ip_offload_ctrl; in send_control_ip_offload()
5190 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; in send_control_ip_offload()
5191 struct device *dev = &adapter->vdev->dev; in send_control_ip_offload()
5195 adapter->ip_offload_ctrl_tok = in send_control_ip_offload()
5198 sizeof(adapter->ip_offload_ctrl), in send_control_ip_offload()
5201 if (dma_mapping_error(dev, adapter->ip_offload_ctrl_tok)) { in send_control_ip_offload()
5206 ctrl_buf->len = cpu_to_be32(sizeof(adapter->ip_offload_ctrl)); in send_control_ip_offload()
5221 if (adapter->state != VNIC_PROBING) { in send_control_ip_offload()
5222 old_hw_features = adapter->netdev->hw_features; in send_control_ip_offload()
5223 adapter->netdev->hw_features = 0; in send_control_ip_offload()
5226 adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO; in send_control_ip_offload()
5229 adapter->netdev->hw_features |= NETIF_F_IP_CSUM; in send_control_ip_offload()
5232 adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM; in send_control_ip_offload()
5234 if ((adapter->netdev->features & in send_control_ip_offload()
5236 adapter->netdev->hw_features |= NETIF_F_RXCSUM; in send_control_ip_offload()
5239 adapter->netdev->hw_features |= NETIF_F_TSO; in send_control_ip_offload()
5241 adapter->netdev->hw_features |= NETIF_F_TSO6; in send_control_ip_offload()
5243 if (adapter->state == VNIC_PROBING) { in send_control_ip_offload()
5244 adapter->netdev->features |= adapter->netdev->hw_features; in send_control_ip_offload()
5245 } else if (old_hw_features != adapter->netdev->hw_features) { in send_control_ip_offload()
5249 adapter->netdev->features &= adapter->netdev->hw_features; in send_control_ip_offload()
5251 tmp = (old_hw_features ^ adapter->netdev->hw_features) & in send_control_ip_offload()
5252 adapter->netdev->hw_features; in send_control_ip_offload()
5253 adapter->netdev->features |= in send_control_ip_offload()
5254 tmp & adapter->netdev->wanted_features; in send_control_ip_offload()
5261 cpu_to_be32(sizeof(adapter->ip_offload_ctrl)); in send_control_ip_offload()
5262 crq.control_ip_offload.ioba = cpu_to_be32(adapter->ip_offload_ctrl_tok); in send_control_ip_offload()
5263 ibmvnic_send_crq(adapter, &crq); in send_control_ip_offload()
5267 struct ibmvnic_adapter *adapter) in handle_vpd_size_rsp() argument
5269 struct device *dev = &adapter->vdev->dev; in handle_vpd_size_rsp()
5274 complete(&adapter->fw_done); in handle_vpd_size_rsp()
5278 adapter->vpd->len = be64_to_cpu(crq->get_vpd_size_rsp.len); in handle_vpd_size_rsp()
5279 complete(&adapter->fw_done); in handle_vpd_size_rsp()
5283 struct ibmvnic_adapter *adapter) in handle_vpd_rsp() argument
5285 struct device *dev = &adapter->vdev->dev; in handle_vpd_rsp()
5289 memset(adapter->fw_version, 0, 32); in handle_vpd_rsp()
5291 dma_unmap_single(dev, adapter->vpd->dma_addr, adapter->vpd->len, in handle_vpd_rsp()
5303 substr = strnstr(adapter->vpd->buff, "RM", adapter->vpd->len); in handle_vpd_rsp()
5310 if ((substr + 2) < (adapter->vpd->buff + adapter->vpd->len)) { in handle_vpd_rsp()
5317 /* copy firmware version string from vpd into adapter */ in handle_vpd_rsp()
5319 (adapter->vpd->buff + adapter->vpd->len)) { in handle_vpd_rsp()
5320 strscpy(adapter->fw_version, substr + 3, in handle_vpd_rsp()
5321 sizeof(adapter->fw_version)); in handle_vpd_rsp()
5327 if (adapter->fw_version[0] == '\0') in handle_vpd_rsp()
5328 strscpy((char *)adapter->fw_version, "N/A", sizeof(adapter->fw_version)); in handle_vpd_rsp()
5329 complete(&adapter->fw_done); in handle_vpd_rsp()
5332 static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter) in handle_query_ip_offload_rsp() argument
5334 struct device *dev = &adapter->vdev->dev; in handle_query_ip_offload_rsp()
5335 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; in handle_query_ip_offload_rsp()
5337 dma_unmap_single(dev, adapter->ip_offload_tok, in handle_query_ip_offload_rsp()
5338 sizeof(adapter->ip_offload_buf), DMA_FROM_DEVICE); in handle_query_ip_offload_rsp()
5340 netdev_dbg(adapter->netdev, "Query IP Offload Buffer:\n"); in handle_query_ip_offload_rsp()
5341 ibmvnic_print_hex_dump(adapter->netdev, buf, in handle_query_ip_offload_rsp()
5342 sizeof(adapter->ip_offload_buf)); in handle_query_ip_offload_rsp()
5344 netdev_dbg(adapter->netdev, "ipv4_chksum = %d\n", buf->ipv4_chksum); in handle_query_ip_offload_rsp()
5345 netdev_dbg(adapter->netdev, "ipv6_chksum = %d\n", buf->ipv6_chksum); in handle_query_ip_offload_rsp()
5346 netdev_dbg(adapter->netdev, "tcp_ipv4_chksum = %d\n", in handle_query_ip_offload_rsp()
5348 netdev_dbg(adapter->netdev, "tcp_ipv6_chksum = %d\n", in handle_query_ip_offload_rsp()
5350 netdev_dbg(adapter->netdev, "udp_ipv4_chksum = %d\n", in handle_query_ip_offload_rsp()
5352 netdev_dbg(adapter->netdev, "udp_ipv6_chksum = %d\n", in handle_query_ip_offload_rsp()
5354 netdev_dbg(adapter->netdev, "large_tx_ipv4 = %d\n", in handle_query_ip_offload_rsp()
5356 netdev_dbg(adapter->netdev, "large_tx_ipv6 = %d\n", in handle_query_ip_offload_rsp()
5358 netdev_dbg(adapter->netdev, "large_rx_ipv4 = %d\n", in handle_query_ip_offload_rsp()
5360 netdev_dbg(adapter->netdev, "large_rx_ipv6 = %d\n", in handle_query_ip_offload_rsp()
5362 netdev_dbg(adapter->netdev, "max_ipv4_hdr_sz = %d\n", in handle_query_ip_offload_rsp()
5364 netdev_dbg(adapter->netdev, "max_ipv6_hdr_sz = %d\n", in handle_query_ip_offload_rsp()
5366 netdev_dbg(adapter->netdev, "max_tcp_hdr_size = %d\n", in handle_query_ip_offload_rsp()
5368 netdev_dbg(adapter->netdev, "max_udp_hdr_size = %d\n", in handle_query_ip_offload_rsp()
5370 netdev_dbg(adapter->netdev, "max_large_tx_size = %d\n", in handle_query_ip_offload_rsp()
5372 netdev_dbg(adapter->netdev, "max_large_rx_size = %d\n", in handle_query_ip_offload_rsp()
5374 netdev_dbg(adapter->netdev, "ipv6_ext_hdr = %d\n", in handle_query_ip_offload_rsp()
5376 netdev_dbg(adapter->netdev, "tcp_pseudosum_req = %d\n", in handle_query_ip_offload_rsp()
5378 netdev_dbg(adapter->netdev, "num_ipv6_ext_hd = %d\n", in handle_query_ip_offload_rsp()
5380 netdev_dbg(adapter->netdev, "off_ipv6_ext_hd = %d\n", in handle_query_ip_offload_rsp()
5383 send_control_ip_offload(adapter); in handle_query_ip_offload_rsp()
5390 return "adapter problem"; in ibmvnic_fw_err_cause()
5409 struct ibmvnic_adapter *adapter) in handle_error_indication() argument
5411 struct device *dev = &adapter->vdev->dev; in handle_error_indication()
5423 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_error_indication()
5425 ibmvnic_reset(adapter, VNIC_RESET_NON_FATAL); in handle_error_indication()
5429 struct ibmvnic_adapter *adapter) in handle_change_mac_rsp() argument
5431 struct net_device *netdev = adapter->netdev; in handle_change_mac_rsp()
5432 struct device *dev = &adapter->vdev->dev; in handle_change_mac_rsp()
5444 ether_addr_copy(adapter->mac_addr, in handle_change_mac_rsp()
5447 complete(&adapter->fw_done); in handle_change_mac_rsp()
5452 struct ibmvnic_adapter *adapter) in handle_request_cap_rsp() argument
5454 struct device *dev = &adapter->vdev->dev; in handle_request_cap_rsp()
5458 atomic_dec(&adapter->running_cap_crqs); in handle_request_cap_rsp()
5459 netdev_dbg(adapter->netdev, "Outstanding request-caps: %d\n", in handle_request_cap_rsp()
5460 atomic_read(&adapter->running_cap_crqs)); in handle_request_cap_rsp()
5463 req_value = &adapter->req_tx_queues; in handle_request_cap_rsp()
5467 req_value = &adapter->req_rx_queues; in handle_request_cap_rsp()
5471 req_value = &adapter->req_rx_add_queues; in handle_request_cap_rsp()
5475 req_value = &adapter->req_tx_entries_per_subcrq; in handle_request_cap_rsp()
5479 req_value = &adapter->req_rx_add_entries_per_subcrq; in handle_request_cap_rsp()
5483 req_value = &adapter->req_mtu; in handle_request_cap_rsp()
5487 req_value = &adapter->promisc; in handle_request_cap_rsp()
5509 *req_value = adapter->fallback.mtu; in handle_request_cap_rsp()
5515 send_request_cap(adapter, 1); in handle_request_cap_rsp()
5524 if (atomic_read(&adapter->running_cap_crqs) == 0) in handle_request_cap_rsp()
5525 send_query_ip_offload(adapter); in handle_request_cap_rsp()
5529 struct ibmvnic_adapter *adapter) in handle_login_rsp() argument
5531 struct device *dev = &adapter->vdev->dev; in handle_login_rsp()
5532 struct net_device *netdev = adapter->netdev; in handle_login_rsp()
5533 struct ibmvnic_login_rsp_buffer *login_rsp = adapter->login_rsp_buf; in handle_login_rsp()
5534 struct ibmvnic_login_buffer *login = adapter->login_buf; in handle_login_rsp()
5546 if (!adapter->login_pending) { in handle_login_rsp()
5550 adapter->login_pending = false; in handle_login_rsp()
5557 adapter->init_done_rc = login_rsp_crq->generic.rc.code; in handle_login_rsp()
5558 complete(&adapter->init_done); in handle_login_rsp()
5562 if (adapter->failover_pending) { in handle_login_rsp()
5563 adapter->init_done_rc = -EAGAIN; in handle_login_rsp()
5565 complete(&adapter->init_done); in handle_login_rsp()
5570 netdev->mtu = adapter->req_mtu - ETH_HLEN; in handle_login_rsp()
5572 netdev_dbg(adapter->netdev, "Login Response Buffer:\n"); in handle_login_rsp()
5573 ibmvnic_print_hex_dump(netdev, adapter->login_rsp_buf, in handle_login_rsp()
5574 adapter->login_rsp_buf_sz); in handle_login_rsp()
5579 adapter->req_rx_add_queues != in handle_login_rsp()
5582 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_login_rsp()
5598 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_login_rsp()
5602 size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
5603 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size)); in handle_login_rsp()
5607 adapter->cur_rx_buf_sz = be64_to_cpu(size_array[0]); in handle_login_rsp()
5609 num_tx_pools = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs); in handle_login_rsp()
5610 num_rx_pools = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); in handle_login_rsp()
5612 tx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
5613 be32_to_cpu(adapter->login_rsp_buf->off_txsubm_subcrqs)); in handle_login_rsp()
5614 rx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
5615 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_subcrqs)); in handle_login_rsp()
5618 adapter->tx_scrq[i]->handle = tx_handle_array[i]; in handle_login_rsp()
5621 adapter->rx_scrq[i]->handle = rx_handle_array[i]; in handle_login_rsp()
5623 adapter->num_active_tx_scrqs = num_tx_pools; in handle_login_rsp()
5624 adapter->num_active_rx_scrqs = num_rx_pools; in handle_login_rsp()
5625 release_login_rsp_buffer(adapter); in handle_login_rsp()
5626 release_login_buffer(adapter); in handle_login_rsp()
5627 complete(&adapter->init_done); in handle_login_rsp()
5633 struct ibmvnic_adapter *adapter) in handle_request_unmap_rsp() argument
5635 struct device *dev = &adapter->vdev->dev; in handle_request_unmap_rsp()
5644 struct ibmvnic_adapter *adapter) in handle_query_map_rsp() argument
5646 struct net_device *netdev = adapter->netdev; in handle_query_map_rsp()
5647 struct device *dev = &adapter->vdev->dev; in handle_query_map_rsp()
5662 struct ibmvnic_adapter *adapter) in handle_query_cap_rsp() argument
5664 struct net_device *netdev = adapter->netdev; in handle_query_cap_rsp()
5665 struct device *dev = &adapter->vdev->dev; in handle_query_cap_rsp()
5668 atomic_dec(&adapter->running_cap_crqs); in handle_query_cap_rsp()
5670 atomic_read(&adapter->running_cap_crqs)); in handle_query_cap_rsp()
5679 adapter->min_tx_queues = in handle_query_cap_rsp()
5682 adapter->min_tx_queues); in handle_query_cap_rsp()
5685 adapter->min_rx_queues = in handle_query_cap_rsp()
5688 adapter->min_rx_queues); in handle_query_cap_rsp()
5691 adapter->min_rx_add_queues = in handle_query_cap_rsp()
5694 adapter->min_rx_add_queues); in handle_query_cap_rsp()
5697 adapter->max_tx_queues = in handle_query_cap_rsp()
5700 adapter->max_tx_queues); in handle_query_cap_rsp()
5703 adapter->max_rx_queues = in handle_query_cap_rsp()
5706 adapter->max_rx_queues); in handle_query_cap_rsp()
5709 adapter->max_rx_add_queues = in handle_query_cap_rsp()
5712 adapter->max_rx_add_queues); in handle_query_cap_rsp()
5715 adapter->min_tx_entries_per_subcrq = in handle_query_cap_rsp()
5718 adapter->min_tx_entries_per_subcrq); in handle_query_cap_rsp()
5721 adapter->min_rx_add_entries_per_subcrq = in handle_query_cap_rsp()
5724 adapter->min_rx_add_entries_per_subcrq); in handle_query_cap_rsp()
5727 adapter->max_tx_entries_per_subcrq = in handle_query_cap_rsp()
5730 adapter->max_tx_entries_per_subcrq); in handle_query_cap_rsp()
5733 adapter->max_rx_add_entries_per_subcrq = in handle_query_cap_rsp()
5736 adapter->max_rx_add_entries_per_subcrq); in handle_query_cap_rsp()
5739 adapter->tcp_ip_offload = in handle_query_cap_rsp()
5742 adapter->tcp_ip_offload); in handle_query_cap_rsp()
5745 adapter->promisc_supported = in handle_query_cap_rsp()
5748 adapter->promisc_supported); in handle_query_cap_rsp()
5751 adapter->min_mtu = be64_to_cpu(crq->query_capability.number); in handle_query_cap_rsp()
5752 netdev->min_mtu = adapter->min_mtu - ETH_HLEN; in handle_query_cap_rsp()
5753 netdev_dbg(netdev, "min_mtu = %lld\n", adapter->min_mtu); in handle_query_cap_rsp()
5756 adapter->max_mtu = be64_to_cpu(crq->query_capability.number); in handle_query_cap_rsp()
5757 netdev->max_mtu = adapter->max_mtu - ETH_HLEN; in handle_query_cap_rsp()
5758 netdev_dbg(netdev, "max_mtu = %lld\n", adapter->max_mtu); in handle_query_cap_rsp()
5761 adapter->max_multicast_filters = in handle_query_cap_rsp()
5764 adapter->max_multicast_filters); in handle_query_cap_rsp()
5767 adapter->vlan_header_insertion = in handle_query_cap_rsp()
5769 if (adapter->vlan_header_insertion) in handle_query_cap_rsp()
5772 adapter->vlan_header_insertion); in handle_query_cap_rsp()
5775 adapter->rx_vlan_header_insertion = in handle_query_cap_rsp()
5778 adapter->rx_vlan_header_insertion); in handle_query_cap_rsp()
5781 adapter->max_tx_sg_entries = in handle_query_cap_rsp()
5784 adapter->max_tx_sg_entries); in handle_query_cap_rsp()
5787 adapter->rx_sg_supported = in handle_query_cap_rsp()
5790 adapter->rx_sg_supported); in handle_query_cap_rsp()
5793 adapter->opt_tx_comp_sub_queues = in handle_query_cap_rsp()
5796 adapter->opt_tx_comp_sub_queues); in handle_query_cap_rsp()
5799 adapter->opt_rx_comp_queues = in handle_query_cap_rsp()
5802 adapter->opt_rx_comp_queues); in handle_query_cap_rsp()
5805 adapter->opt_rx_bufadd_q_per_rx_comp_q = in handle_query_cap_rsp()
5808 adapter->opt_rx_bufadd_q_per_rx_comp_q); in handle_query_cap_rsp()
5811 adapter->opt_tx_entries_per_subcrq = in handle_query_cap_rsp()
5814 adapter->opt_tx_entries_per_subcrq); in handle_query_cap_rsp()
5817 adapter->opt_rxba_entries_per_subcrq = in handle_query_cap_rsp()
5820 adapter->opt_rxba_entries_per_subcrq); in handle_query_cap_rsp()
5823 adapter->tx_rx_desc_req = crq->query_capability.number; in handle_query_cap_rsp()
5825 adapter->tx_rx_desc_req); in handle_query_cap_rsp()
5834 if (atomic_read(&adapter->running_cap_crqs) == 0) in handle_query_cap_rsp()
5835 send_request_cap(adapter, 0); in handle_query_cap_rsp()
5838 static int send_query_phys_parms(struct ibmvnic_adapter *adapter) in send_query_phys_parms() argument
5847 mutex_lock(&adapter->fw_lock); in send_query_phys_parms()
5848 adapter->fw_done_rc = 0; in send_query_phys_parms()
5849 reinit_completion(&adapter->fw_done); in send_query_phys_parms()
5851 rc = ibmvnic_send_crq(adapter, &crq); in send_query_phys_parms()
5853 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
5857 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in send_query_phys_parms()
5859 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
5863 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
5864 return adapter->fw_done_rc ? -EIO : 0; in send_query_phys_parms()
5868 struct ibmvnic_adapter *adapter) in handle_query_phys_parms_rsp() argument
5870 struct net_device *netdev = adapter->netdev; in handle_query_phys_parms_rsp()
5881 adapter->speed = SPEED_10; in handle_query_phys_parms_rsp()
5884 adapter->speed = SPEED_100; in handle_query_phys_parms_rsp()
5887 adapter->speed = SPEED_1000; in handle_query_phys_parms_rsp()
5890 adapter->speed = SPEED_10000; in handle_query_phys_parms_rsp()
5893 adapter->speed = SPEED_25000; in handle_query_phys_parms_rsp()
5896 adapter->speed = SPEED_40000; in handle_query_phys_parms_rsp()
5899 adapter->speed = SPEED_50000; in handle_query_phys_parms_rsp()
5902 adapter->speed = SPEED_100000; in handle_query_phys_parms_rsp()
5905 adapter->speed = SPEED_200000; in handle_query_phys_parms_rsp()
5910 adapter->speed = SPEED_UNKNOWN; in handle_query_phys_parms_rsp()
5913 adapter->duplex = DUPLEX_FULL; in handle_query_phys_parms_rsp()
5915 adapter->duplex = DUPLEX_HALF; in handle_query_phys_parms_rsp()
5917 adapter->duplex = DUPLEX_UNKNOWN; in handle_query_phys_parms_rsp()
5923 struct ibmvnic_adapter *adapter) in ibmvnic_handle_crq() argument
5926 struct net_device *netdev = adapter->netdev; in ibmvnic_handle_crq()
5927 struct device *dev = &adapter->vdev->dev; in ibmvnic_handle_crq()
5939 adapter->from_passive_init = true; in ibmvnic_handle_crq()
5943 adapter->login_pending = false; in ibmvnic_handle_crq()
5945 if (adapter->state == VNIC_DOWN) in ibmvnic_handle_crq()
5946 rc = ibmvnic_reset(adapter, VNIC_RESET_PASSIVE_INIT); in ibmvnic_handle_crq()
5948 rc = ibmvnic_reset(adapter, VNIC_RESET_FAILOVER); in ibmvnic_handle_crq()
5952 * reset either because the adapter was still in ibmvnic_handle_crq()
5957 * is already scheduled or the adapter is in ibmvnic_handle_crq()
5963 adapter->failover_pending = false; in ibmvnic_handle_crq()
5966 if (!completion_done(&adapter->init_done)) { in ibmvnic_handle_crq()
5967 if (!adapter->init_done_rc) in ibmvnic_handle_crq()
5968 adapter->init_done_rc = -EAGAIN; in ibmvnic_handle_crq()
5969 complete(&adapter->init_done); in ibmvnic_handle_crq()
5975 adapter->crq.active = true; in ibmvnic_handle_crq()
5976 send_version_xchg(adapter); in ibmvnic_handle_crq()
5984 adapter->crq.active = false; in ibmvnic_handle_crq()
5988 if (!completion_done(&adapter->fw_done)) { in ibmvnic_handle_crq()
5989 adapter->fw_done_rc = -EIO; in ibmvnic_handle_crq()
5990 complete(&adapter->fw_done); in ibmvnic_handle_crq()
5994 if (!completion_done(&adapter->init_done)) { in ibmvnic_handle_crq()
5995 adapter->init_done_rc = -EAGAIN; in ibmvnic_handle_crq()
5996 complete(&adapter->init_done); in ibmvnic_handle_crq()
5999 if (!completion_done(&adapter->stats_done)) in ibmvnic_handle_crq()
6000 complete(&adapter->stats_done); in ibmvnic_handle_crq()
6001 if (test_bit(0, &adapter->resetting)) in ibmvnic_handle_crq()
6002 adapter->force_reset_recovery = true; in ibmvnic_handle_crq()
6004 dev_info(dev, "Migrated, re-enabling adapter\n"); in ibmvnic_handle_crq()
6005 ibmvnic_reset(adapter, VNIC_RESET_MOBILITY); in ibmvnic_handle_crq()
6008 adapter->failover_pending = true; in ibmvnic_handle_crq()
6010 /* The adapter lost the connection */ in ibmvnic_handle_crq()
6011 dev_err(dev, "Virtual Adapter failed (rc=%d)\n", in ibmvnic_handle_crq()
6013 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in ibmvnic_handle_crq()
6035 send_query_cap(adapter); in ibmvnic_handle_crq()
6038 handle_query_cap_rsp(crq, adapter); in ibmvnic_handle_crq()
6041 handle_query_map_rsp(crq, adapter); in ibmvnic_handle_crq()
6044 adapter->fw_done_rc = crq->request_map_rsp.rc.code; in ibmvnic_handle_crq()
6045 complete(&adapter->fw_done); in ibmvnic_handle_crq()
6048 handle_request_unmap_rsp(crq, adapter); in ibmvnic_handle_crq()
6051 handle_request_cap_rsp(crq, adapter); in ibmvnic_handle_crq()
6055 handle_login_rsp(crq, adapter); in ibmvnic_handle_crq()
6062 adapter->logical_link_state = in ibmvnic_handle_crq()
6064 adapter->init_done_rc = crq->logical_link_state_rsp.rc.code; in ibmvnic_handle_crq()
6065 complete(&adapter->init_done); in ibmvnic_handle_crq()
6069 adapter->phys_link_state = in ibmvnic_handle_crq()
6071 adapter->logical_link_state = in ibmvnic_handle_crq()
6073 if (adapter->phys_link_state && adapter->logical_link_state) in ibmvnic_handle_crq()
6080 adapter->fw_done_rc = handle_change_mac_rsp(crq, adapter); in ibmvnic_handle_crq()
6084 handle_error_indication(crq, adapter); in ibmvnic_handle_crq()
6088 complete(&adapter->stats_done); in ibmvnic_handle_crq()
6092 handle_query_ip_offload_rsp(adapter); in ibmvnic_handle_crq()
6099 dma_unmap_single(dev, adapter->ip_offload_ctrl_tok, in ibmvnic_handle_crq()
6100 sizeof(adapter->ip_offload_ctrl), in ibmvnic_handle_crq()
6102 complete(&adapter->init_done); in ibmvnic_handle_crq()
6106 complete(&adapter->fw_done); in ibmvnic_handle_crq()
6109 handle_vpd_size_rsp(crq, adapter); in ibmvnic_handle_crq()
6112 handle_vpd_rsp(crq, adapter); in ibmvnic_handle_crq()
6115 adapter->fw_done_rc = handle_query_phys_parms_rsp(crq, adapter); in ibmvnic_handle_crq()
6116 complete(&adapter->fw_done); in ibmvnic_handle_crq()
6126 struct ibmvnic_adapter *adapter = instance; in ibmvnic_interrupt() local
6128 tasklet_schedule(&adapter->tasklet); in ibmvnic_interrupt()
6134 struct ibmvnic_adapter *adapter = from_tasklet(adapter, t, tasklet); in ibmvnic_tasklet() local
6135 struct ibmvnic_crq_queue *queue = &adapter->crq; in ibmvnic_tasklet()
6142 while ((crq = ibmvnic_next_crq(adapter)) != NULL) { in ibmvnic_tasklet()
6149 ibmvnic_handle_crq(crq, adapter); in ibmvnic_tasklet()
6156 static int ibmvnic_reenable_crq_queue(struct ibmvnic_adapter *adapter) in ibmvnic_reenable_crq_queue() argument
6158 struct vio_dev *vdev = adapter->vdev; in ibmvnic_reenable_crq_queue()
6166 dev_err(&vdev->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvnic_reenable_crq_queue()
6171 static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter) in ibmvnic_reset_crq() argument
6173 struct ibmvnic_crq_queue *crq = &adapter->crq; in ibmvnic_reset_crq()
6174 struct device *dev = &adapter->vdev->dev; in ibmvnic_reset_crq()
6175 struct vio_dev *vdev = adapter->vdev; in ibmvnic_reset_crq()
6196 /* Adapter is good, but other end is not ready */ in ibmvnic_reset_crq()
6197 dev_warn(dev, "Partner adapter not ready\n"); in ibmvnic_reset_crq()
6204 static void release_crq_queue(struct ibmvnic_adapter *adapter) in release_crq_queue() argument
6206 struct ibmvnic_crq_queue *crq = &adapter->crq; in release_crq_queue()
6207 struct vio_dev *vdev = adapter->vdev; in release_crq_queue()
6213 netdev_dbg(adapter->netdev, "Releasing CRQ\n"); in release_crq_queue()
6214 free_irq(vdev->irq, adapter); in release_crq_queue()
6215 tasklet_kill(&adapter->tasklet); in release_crq_queue()
6227 static int init_crq_queue(struct ibmvnic_adapter *adapter) in init_crq_queue() argument
6229 struct ibmvnic_crq_queue *crq = &adapter->crq; in init_crq_queue()
6230 struct device *dev = &adapter->vdev->dev; in init_crq_queue()
6231 struct vio_dev *vdev = adapter->vdev; in init_crq_queue()
6254 rc = ibmvnic_reset_crq(adapter); in init_crq_queue()
6258 dev_warn(dev, "Partner adapter not ready\n"); in init_crq_queue()
6260 dev_warn(dev, "Error %d opening adapter\n", rc); in init_crq_queue()
6266 tasklet_setup(&adapter->tasklet, (void *)ibmvnic_tasklet); in init_crq_queue()
6268 netdev_dbg(adapter->netdev, "registering irq 0x%x\n", vdev->irq); in init_crq_queue()
6270 adapter->vdev->unit_address); in init_crq_queue()
6271 rc = request_irq(vdev->irq, ibmvnic_interrupt, 0, crq->name, adapter); in init_crq_queue()
6288 tasklet_schedule(&adapter->tasklet); in init_crq_queue()
6293 tasklet_kill(&adapter->tasklet); in init_crq_queue()
6305 static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset) in ibmvnic_reset_init() argument
6307 struct device *dev = &adapter->vdev->dev; in ibmvnic_reset_init()
6309 u64 old_num_rx_queues = adapter->req_rx_queues; in ibmvnic_reset_init()
6310 u64 old_num_tx_queues = adapter->req_tx_queues; in ibmvnic_reset_init()
6313 adapter->from_passive_init = false; in ibmvnic_reset_init()
6315 rc = ibmvnic_send_crq_init(adapter); in ibmvnic_reset_init()
6321 if (!wait_for_completion_timeout(&adapter->init_done, timeout)) { in ibmvnic_reset_init()
6326 if (adapter->init_done_rc) { in ibmvnic_reset_init()
6327 release_crq_queue(adapter); in ibmvnic_reset_init()
6328 dev_err(dev, "CRQ-init failed, %d\n", adapter->init_done_rc); in ibmvnic_reset_init()
6329 return adapter->init_done_rc; in ibmvnic_reset_init()
6332 if (adapter->from_passive_init) { in ibmvnic_reset_init()
6333 adapter->state = VNIC_OPEN; in ibmvnic_reset_init()
6334 adapter->from_passive_init = false; in ibmvnic_reset_init()
6340 test_bit(0, &adapter->resetting) && !adapter->wait_for_reset && in ibmvnic_reset_init()
6341 adapter->reset_reason != VNIC_RESET_MOBILITY) { in ibmvnic_reset_init()
6342 if (adapter->req_rx_queues != old_num_rx_queues || in ibmvnic_reset_init()
6343 adapter->req_tx_queues != old_num_tx_queues) { in ibmvnic_reset_init()
6344 release_sub_crqs(adapter, 0); in ibmvnic_reset_init()
6345 rc = init_sub_crqs(adapter); in ibmvnic_reset_init()
6354 clean_tx_pools(adapter); in ibmvnic_reset_init()
6356 rc = reset_sub_crq_queues(adapter); in ibmvnic_reset_init()
6359 rc = init_sub_crqs(adapter); in ibmvnic_reset_init()
6364 release_crq_queue(adapter); in ibmvnic_reset_init()
6368 rc = init_sub_crq_irqs(adapter); in ibmvnic_reset_init()
6371 release_crq_queue(adapter); in ibmvnic_reset_init()
6381 struct ibmvnic_adapter *adapter; in ibmvnic_probe() local
6405 adapter = netdev_priv(netdev); in ibmvnic_probe()
6406 adapter->state = VNIC_PROBING; in ibmvnic_probe()
6408 adapter->vdev = dev; in ibmvnic_probe()
6409 adapter->netdev = netdev; in ibmvnic_probe()
6410 adapter->login_pending = false; in ibmvnic_probe()
6411 memset(&adapter->map_ids, 0, sizeof(adapter->map_ids)); in ibmvnic_probe()
6413 bitmap_set(adapter->map_ids, 0, 1); in ibmvnic_probe()
6415 ether_addr_copy(adapter->mac_addr, mac_addr_p); in ibmvnic_probe()
6416 eth_hw_addr_set(netdev, adapter->mac_addr); in ibmvnic_probe()
6422 INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset); in ibmvnic_probe()
6423 INIT_DELAYED_WORK(&adapter->ibmvnic_delayed_reset, in ibmvnic_probe()
6425 INIT_LIST_HEAD(&adapter->rwi_list); in ibmvnic_probe()
6426 spin_lock_init(&adapter->rwi_lock); in ibmvnic_probe()
6427 spin_lock_init(&adapter->state_lock); in ibmvnic_probe()
6428 mutex_init(&adapter->fw_lock); in ibmvnic_probe()
6429 init_completion(&adapter->probe_done); in ibmvnic_probe()
6430 init_completion(&adapter->init_done); in ibmvnic_probe()
6431 init_completion(&adapter->fw_done); in ibmvnic_probe()
6432 init_completion(&adapter->reset_done); in ibmvnic_probe()
6433 init_completion(&adapter->stats_done); in ibmvnic_probe()
6434 clear_bit(0, &adapter->resetting); in ibmvnic_probe()
6435 adapter->prev_rx_buf_sz = 0; in ibmvnic_probe()
6436 adapter->prev_mtu = 0; in ibmvnic_probe()
6440 reinit_init_done(adapter); in ibmvnic_probe()
6445 adapter->failover_pending = false; in ibmvnic_probe()
6451 release_crq_queue(adapter); in ibmvnic_probe()
6463 spin_lock_irqsave(&adapter->rwi_lock, flags); in ibmvnic_probe()
6464 flush_reset_queue(adapter); in ibmvnic_probe()
6465 spin_unlock_irqrestore(&adapter->rwi_lock, flags); in ibmvnic_probe()
6467 rc = init_crq_queue(adapter); in ibmvnic_probe()
6474 rc = ibmvnic_reset_init(adapter, false); in ibmvnic_probe()
6485 rc = init_stats_buffers(adapter); in ibmvnic_probe()
6489 rc = init_stats_token(adapter); in ibmvnic_probe()
6500 adapter->state = VNIC_PROBED; in ibmvnic_probe()
6501 netdev->mtu = adapter->req_mtu - ETH_HLEN; in ibmvnic_probe()
6502 netdev->min_mtu = adapter->min_mtu - ETH_HLEN; in ibmvnic_probe()
6503 netdev->max_mtu = adapter->max_mtu - ETH_HLEN; in ibmvnic_probe()
6505 adapter->state = VNIC_DOWN; in ibmvnic_probe()
6508 adapter->wait_for_reset = false; in ibmvnic_probe()
6509 adapter->last_reset_time = jiffies; in ibmvnic_probe()
6518 rc = ibmvnic_cpu_notif_add(adapter); in ibmvnic_probe()
6524 complete(&adapter->probe_done); in ibmvnic_probe()
6535 release_stats_token(adapter); in ibmvnic_probe()
6538 release_stats_buffers(adapter); in ibmvnic_probe()
6541 release_sub_crqs(adapter, 1); in ibmvnic_probe()
6542 release_crq_queue(adapter); in ibmvnic_probe()
6547 adapter->state = VNIC_REMOVING; in ibmvnic_probe()
6548 complete(&adapter->probe_done); in ibmvnic_probe()
6549 flush_work(&adapter->ibmvnic_reset); in ibmvnic_probe()
6550 flush_delayed_work(&adapter->ibmvnic_delayed_reset); in ibmvnic_probe()
6552 flush_reset_queue(adapter); in ibmvnic_probe()
6554 mutex_destroy(&adapter->fw_lock); in ibmvnic_probe()
6563 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_remove() local
6566 spin_lock_irqsave(&adapter->state_lock, flags); in ibmvnic_remove()
6575 spin_lock(&adapter->rwi_lock); in ibmvnic_remove()
6576 adapter->state = VNIC_REMOVING; in ibmvnic_remove()
6577 spin_unlock(&adapter->rwi_lock); in ibmvnic_remove()
6579 spin_unlock_irqrestore(&adapter->state_lock, flags); in ibmvnic_remove()
6581 ibmvnic_cpu_notif_remove(adapter); in ibmvnic_remove()
6583 flush_work(&adapter->ibmvnic_reset); in ibmvnic_remove()
6584 flush_delayed_work(&adapter->ibmvnic_delayed_reset); in ibmvnic_remove()
6589 release_resources(adapter); in ibmvnic_remove()
6590 release_rx_pools(adapter); in ibmvnic_remove()
6591 release_tx_pools(adapter); in ibmvnic_remove()
6592 release_sub_crqs(adapter, 1); in ibmvnic_remove()
6593 release_crq_queue(adapter); in ibmvnic_remove()
6595 release_stats_token(adapter); in ibmvnic_remove()
6596 release_stats_buffers(adapter); in ibmvnic_remove()
6598 adapter->state = VNIC_REMOVED; in ibmvnic_remove()
6601 mutex_destroy(&adapter->fw_lock); in ibmvnic_remove()
6611 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in failover_store() local
6619 rc = plpar_hcall(H_VIOCTL, retbuf, adapter->vdev->unit_address, in failover_store()
6630 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in failover_store()
6643 ibmvnic_reset(adapter, VNIC_RESET_FAILOVER); in failover_store()
6652 struct ibmvnic_adapter *adapter; in ibmvnic_get_desired_dma() local
6663 adapter = netdev_priv(netdev); in ibmvnic_get_desired_dma()
6668 for (i = 0; i < adapter->req_tx_queues + adapter->req_rx_queues; i++) in ibmvnic_get_desired_dma()
6671 for (i = 0; i < adapter->num_active_rx_pools; i++) in ibmvnic_get_desired_dma()
6672 ret += adapter->rx_pool[i].size * in ibmvnic_get_desired_dma()
6673 IOMMU_PAGE_ALIGN(adapter->rx_pool[i].buff_size, tbl); in ibmvnic_get_desired_dma()
6681 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_resume() local
6683 if (adapter->state != VNIC_OPEN) in ibmvnic_resume()
6686 tasklet_schedule(&adapter->tasklet); in ibmvnic_resume()