Lines Matching full:adapter
87 static int send_subcrq(struct ibmvnic_adapter *adapter, u64 remote_handle,
100 static void send_query_map(struct ibmvnic_adapter *adapter);
103 static int send_login(struct ibmvnic_adapter *adapter);
104 static void send_query_cap(struct ibmvnic_adapter *adapter);
106 static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter);
110 static int init_crq_queue(struct ibmvnic_adapter *adapter);
111 static int send_query_phys_parms(struct ibmvnic_adapter *adapter);
163 * @adapter: private device data
170 static int ibmvnic_wait_for_completion(struct ibmvnic_adapter *adapter, in ibmvnic_wait_for_completion() argument
178 netdev = adapter->netdev; in ibmvnic_wait_for_completion()
182 if (!adapter->crq.active) { in ibmvnic_wait_for_completion()
195 static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, in alloc_long_term_buff() argument
198 struct device *dev = &adapter->vdev->dev; in alloc_long_term_buff()
209 ltb->map_id = adapter->map_id; in alloc_long_term_buff()
210 adapter->map_id++; in alloc_long_term_buff()
212 mutex_lock(&adapter->fw_lock); in alloc_long_term_buff()
213 adapter->fw_done_rc = 0; in alloc_long_term_buff()
214 reinit_completion(&adapter->fw_done); in alloc_long_term_buff()
216 rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id); in alloc_long_term_buff()
222 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in alloc_long_term_buff()
230 if (adapter->fw_done_rc) { in alloc_long_term_buff()
232 adapter->fw_done_rc); in alloc_long_term_buff()
242 mutex_unlock(&adapter->fw_lock); in alloc_long_term_buff()
246 static void free_long_term_buff(struct ibmvnic_adapter *adapter, in free_long_term_buff() argument
249 struct device *dev = &adapter->vdev->dev; in free_long_term_buff()
258 if (adapter->reset_reason != VNIC_RESET_FAILOVER && in free_long_term_buff()
259 adapter->reset_reason != VNIC_RESET_MOBILITY && in free_long_term_buff()
260 adapter->reset_reason != VNIC_RESET_TIMEOUT) in free_long_term_buff()
261 send_request_unmap(adapter, ltb->map_id); in free_long_term_buff()
267 static int reset_long_term_buff(struct ibmvnic_adapter *adapter, in reset_long_term_buff() argument
270 struct device *dev = &adapter->vdev->dev; in reset_long_term_buff()
275 mutex_lock(&adapter->fw_lock); in reset_long_term_buff()
276 adapter->fw_done_rc = 0; in reset_long_term_buff()
278 reinit_completion(&adapter->fw_done); in reset_long_term_buff()
279 rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id); in reset_long_term_buff()
281 mutex_unlock(&adapter->fw_lock); in reset_long_term_buff()
285 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in reset_long_term_buff()
289 mutex_unlock(&adapter->fw_lock); in reset_long_term_buff()
293 if (adapter->fw_done_rc) { in reset_long_term_buff()
296 free_long_term_buff(adapter, ltb); in reset_long_term_buff()
297 mutex_unlock(&adapter->fw_lock); in reset_long_term_buff()
298 return alloc_long_term_buff(adapter, ltb, ltb->size); in reset_long_term_buff()
300 mutex_unlock(&adapter->fw_lock); in reset_long_term_buff()
304 static void deactivate_rx_pools(struct ibmvnic_adapter *adapter) in deactivate_rx_pools() argument
308 for (i = 0; i < adapter->num_active_rx_pools; i++) in deactivate_rx_pools()
309 adapter->rx_pool[i].active = 0; in deactivate_rx_pools()
312 static void replenish_rx_pool(struct ibmvnic_adapter *adapter, in replenish_rx_pool() argument
316 u64 handle = adapter->rx_scrq[pool->index]->handle; in replenish_rx_pool()
317 struct device *dev = &adapter->vdev->dev; in replenish_rx_pool()
336 adapter->replenish_no_mem++; in replenish_rx_pool()
375 lpar_rc = send_subcrq(adapter, handle, &sub_crq); in replenish_rx_pool()
380 adapter->replenish_add_buff_success++; in replenish_rx_pool()
393 adapter->replenish_add_buff_failure++; in replenish_rx_pool()
396 if (lpar_rc == H_CLOSED || adapter->failover_pending) { in replenish_rx_pool()
402 deactivate_rx_pools(adapter); in replenish_rx_pool()
403 netif_carrier_off(adapter->netdev); in replenish_rx_pool()
407 static void replenish_pools(struct ibmvnic_adapter *adapter) in replenish_pools() argument
411 adapter->replenish_task_cycles++; in replenish_pools()
412 for (i = 0; i < adapter->num_active_rx_pools; i++) { in replenish_pools()
413 if (adapter->rx_pool[i].active) in replenish_pools()
414 replenish_rx_pool(adapter, &adapter->rx_pool[i]); in replenish_pools()
417 netdev_dbg(adapter->netdev, "Replenished %d pools\n", i); in replenish_pools()
420 static void release_stats_buffers(struct ibmvnic_adapter *adapter) in release_stats_buffers() argument
422 kfree(adapter->tx_stats_buffers); in release_stats_buffers()
423 kfree(adapter->rx_stats_buffers); in release_stats_buffers()
424 adapter->tx_stats_buffers = NULL; in release_stats_buffers()
425 adapter->rx_stats_buffers = NULL; in release_stats_buffers()
428 static int init_stats_buffers(struct ibmvnic_adapter *adapter) in init_stats_buffers() argument
430 adapter->tx_stats_buffers = in init_stats_buffers()
434 if (!adapter->tx_stats_buffers) in init_stats_buffers()
437 adapter->rx_stats_buffers = in init_stats_buffers()
441 if (!adapter->rx_stats_buffers) in init_stats_buffers()
447 static void release_stats_token(struct ibmvnic_adapter *adapter) in release_stats_token() argument
449 struct device *dev = &adapter->vdev->dev; in release_stats_token()
451 if (!adapter->stats_token) in release_stats_token()
454 dma_unmap_single(dev, adapter->stats_token, in release_stats_token()
457 adapter->stats_token = 0; in release_stats_token()
460 static int init_stats_token(struct ibmvnic_adapter *adapter) in init_stats_token() argument
462 struct device *dev = &adapter->vdev->dev; in init_stats_token()
465 stok = dma_map_single(dev, &adapter->stats, in init_stats_token()
473 adapter->stats_token = stok; in init_stats_token()
474 netdev_dbg(adapter->netdev, "Stats token initialized (%llx)\n", stok); in init_stats_token()
478 static int reset_rx_pools(struct ibmvnic_adapter *adapter) in reset_rx_pools() argument
485 if (!adapter->rx_pool) in reset_rx_pools()
488 buff_size = adapter->cur_rx_buf_sz; in reset_rx_pools()
489 rx_scrqs = adapter->num_active_rx_pools; in reset_rx_pools()
491 rx_pool = &adapter->rx_pool[i]; in reset_rx_pools()
493 netdev_dbg(adapter->netdev, "Re-setting rx_pool[%d]\n", i); in reset_rx_pools()
496 free_long_term_buff(adapter, &rx_pool->long_term_buff); in reset_rx_pools()
498 rc = alloc_long_term_buff(adapter, in reset_rx_pools()
503 rc = reset_long_term_buff(adapter, in reset_rx_pools()
525 static void release_rx_pools(struct ibmvnic_adapter *adapter) in release_rx_pools() argument
530 if (!adapter->rx_pool) in release_rx_pools()
533 for (i = 0; i < adapter->num_active_rx_pools; i++) { in release_rx_pools()
534 rx_pool = &adapter->rx_pool[i]; in release_rx_pools()
536 netdev_dbg(adapter->netdev, "Releasing rx_pool[%d]\n", i); in release_rx_pools()
539 free_long_term_buff(adapter, &rx_pool->long_term_buff); in release_rx_pools()
554 kfree(adapter->rx_pool); in release_rx_pools()
555 adapter->rx_pool = NULL; in release_rx_pools()
556 adapter->num_active_rx_pools = 0; in release_rx_pools()
561 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in init_rx_pools() local
562 struct device *dev = &adapter->vdev->dev; in init_rx_pools()
568 rxadd_subcrqs = adapter->num_active_rx_scrqs; in init_rx_pools()
569 buff_size = adapter->cur_rx_buf_sz; in init_rx_pools()
571 adapter->rx_pool = kcalloc(rxadd_subcrqs, in init_rx_pools()
574 if (!adapter->rx_pool) { in init_rx_pools()
579 adapter->num_active_rx_pools = rxadd_subcrqs; in init_rx_pools()
582 rx_pool = &adapter->rx_pool[i]; in init_rx_pools()
584 netdev_dbg(adapter->netdev, in init_rx_pools()
586 i, adapter->req_rx_add_entries_per_subcrq, in init_rx_pools()
589 rx_pool->size = adapter->req_rx_add_entries_per_subcrq; in init_rx_pools()
597 release_rx_pools(adapter); in init_rx_pools()
606 release_rx_pools(adapter); in init_rx_pools()
610 if (alloc_long_term_buff(adapter, &rx_pool->long_term_buff, in init_rx_pools()
612 release_rx_pools(adapter); in init_rx_pools()
627 static int reset_one_tx_pool(struct ibmvnic_adapter *adapter, in reset_one_tx_pool() argument
632 rc = reset_long_term_buff(adapter, &tx_pool->long_term_buff); in reset_one_tx_pool()
649 static int reset_tx_pools(struct ibmvnic_adapter *adapter) in reset_tx_pools() argument
654 if (!adapter->tx_pool) in reset_tx_pools()
657 tx_scrqs = adapter->num_active_tx_pools; in reset_tx_pools()
659 rc = reset_one_tx_pool(adapter, &adapter->tso_pool[i]); in reset_tx_pools()
662 rc = reset_one_tx_pool(adapter, &adapter->tx_pool[i]); in reset_tx_pools()
670 static void release_vpd_data(struct ibmvnic_adapter *adapter) in release_vpd_data() argument
672 if (!adapter->vpd) in release_vpd_data()
675 kfree(adapter->vpd->buff); in release_vpd_data()
676 kfree(adapter->vpd); in release_vpd_data()
678 adapter->vpd = NULL; in release_vpd_data()
681 static void release_one_tx_pool(struct ibmvnic_adapter *adapter, in release_one_tx_pool() argument
686 free_long_term_buff(adapter, &tx_pool->long_term_buff); in release_one_tx_pool()
689 static void release_tx_pools(struct ibmvnic_adapter *adapter) in release_tx_pools() argument
693 if (!adapter->tx_pool) in release_tx_pools()
696 for (i = 0; i < adapter->num_active_tx_pools; i++) { in release_tx_pools()
697 release_one_tx_pool(adapter, &adapter->tx_pool[i]); in release_tx_pools()
698 release_one_tx_pool(adapter, &adapter->tso_pool[i]); in release_tx_pools()
701 kfree(adapter->tx_pool); in release_tx_pools()
702 adapter->tx_pool = NULL; in release_tx_pools()
703 kfree(adapter->tso_pool); in release_tx_pools()
704 adapter->tso_pool = NULL; in release_tx_pools()
705 adapter->num_active_tx_pools = 0; in release_tx_pools()
712 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in init_one_tx_pool() local
721 if (alloc_long_term_buff(adapter, &tx_pool->long_term_buff, in init_one_tx_pool()
742 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in init_tx_pools() local
746 tx_subcrqs = adapter->num_active_tx_scrqs; in init_tx_pools()
747 adapter->tx_pool = kcalloc(tx_subcrqs, in init_tx_pools()
749 if (!adapter->tx_pool) in init_tx_pools()
752 adapter->tso_pool = kcalloc(tx_subcrqs, in init_tx_pools()
754 if (!adapter->tso_pool) { in init_tx_pools()
755 kfree(adapter->tx_pool); in init_tx_pools()
756 adapter->tx_pool = NULL; in init_tx_pools()
760 adapter->num_active_tx_pools = tx_subcrqs; in init_tx_pools()
763 rc = init_one_tx_pool(netdev, &adapter->tx_pool[i], in init_tx_pools()
764 adapter->req_tx_entries_per_subcrq, in init_tx_pools()
765 adapter->req_mtu + VLAN_HLEN); in init_tx_pools()
767 release_tx_pools(adapter); in init_tx_pools()
771 rc = init_one_tx_pool(netdev, &adapter->tso_pool[i], in init_tx_pools()
775 release_tx_pools(adapter); in init_tx_pools()
783 static void ibmvnic_napi_enable(struct ibmvnic_adapter *adapter) in ibmvnic_napi_enable() argument
787 if (adapter->napi_enabled) in ibmvnic_napi_enable()
790 for (i = 0; i < adapter->req_rx_queues; i++) in ibmvnic_napi_enable()
791 napi_enable(&adapter->napi[i]); in ibmvnic_napi_enable()
793 adapter->napi_enabled = true; in ibmvnic_napi_enable()
796 static void ibmvnic_napi_disable(struct ibmvnic_adapter *adapter) in ibmvnic_napi_disable() argument
800 if (!adapter->napi_enabled) in ibmvnic_napi_disable()
803 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_napi_disable()
804 netdev_dbg(adapter->netdev, "Disabling napi[%d]\n", i); in ibmvnic_napi_disable()
805 napi_disable(&adapter->napi[i]); in ibmvnic_napi_disable()
808 adapter->napi_enabled = false; in ibmvnic_napi_disable()
811 static int init_napi(struct ibmvnic_adapter *adapter) in init_napi() argument
815 adapter->napi = kcalloc(adapter->req_rx_queues, in init_napi()
817 if (!adapter->napi) in init_napi()
820 for (i = 0; i < adapter->req_rx_queues; i++) { in init_napi()
821 netdev_dbg(adapter->netdev, "Adding napi[%d]\n", i); in init_napi()
822 netif_napi_add(adapter->netdev, &adapter->napi[i], in init_napi()
826 adapter->num_active_rx_napi = adapter->req_rx_queues; in init_napi()
830 static void release_napi(struct ibmvnic_adapter *adapter) in release_napi() argument
834 if (!adapter->napi) in release_napi()
837 for (i = 0; i < adapter->num_active_rx_napi; i++) { in release_napi()
838 netdev_dbg(adapter->netdev, "Releasing napi[%d]\n", i); in release_napi()
839 netif_napi_del(&adapter->napi[i]); in release_napi()
842 kfree(adapter->napi); in release_napi()
843 adapter->napi = NULL; in release_napi()
844 adapter->num_active_rx_napi = 0; in release_napi()
845 adapter->napi_enabled = false; in release_napi()
850 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_login() local
864 adapter->init_done_rc = 0; in ibmvnic_login()
865 reinit_completion(&adapter->init_done); in ibmvnic_login()
866 rc = send_login(adapter); in ibmvnic_login()
870 if (!wait_for_completion_timeout(&adapter->init_done, in ibmvnic_login()
874 adapter->init_done_rc = 0; in ibmvnic_login()
879 if (adapter->init_done_rc == ABORTED) { in ibmvnic_login()
882 adapter->init_done_rc = 0; in ibmvnic_login()
888 } else if (adapter->init_done_rc == PARTIALSUCCESS) { in ibmvnic_login()
890 release_sub_crqs(adapter, 1); in ibmvnic_login()
895 adapter->init_done_rc = 0; in ibmvnic_login()
896 reinit_completion(&adapter->init_done); in ibmvnic_login()
897 send_query_cap(adapter); in ibmvnic_login()
898 if (!wait_for_completion_timeout(&adapter->init_done, in ibmvnic_login()
905 rc = init_sub_crqs(adapter); in ibmvnic_login()
912 rc = init_sub_crq_irqs(adapter); in ibmvnic_login()
918 } else if (adapter->init_done_rc) { in ibmvnic_login()
919 netdev_warn(netdev, "Adapter login failed\n"); in ibmvnic_login()
924 __ibmvnic_set_mac(netdev, adapter->mac_addr); in ibmvnic_login()
926 netdev_dbg(netdev, "[S:%d] Login succeeded\n", adapter->state); in ibmvnic_login()
930 static void release_login_buffer(struct ibmvnic_adapter *adapter) in release_login_buffer() argument
932 if (!adapter->login_buf) in release_login_buffer()
935 dma_unmap_single(&adapter->vdev->dev, adapter->login_buf_token, in release_login_buffer()
936 adapter->login_buf_sz, DMA_TO_DEVICE); in release_login_buffer()
937 kfree(adapter->login_buf); in release_login_buffer()
938 adapter->login_buf = NULL; in release_login_buffer()
941 static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter) in release_login_rsp_buffer() argument
943 if (!adapter->login_rsp_buf) in release_login_rsp_buffer()
946 dma_unmap_single(&adapter->vdev->dev, adapter->login_rsp_buf_token, in release_login_rsp_buffer()
947 adapter->login_rsp_buf_sz, DMA_FROM_DEVICE); in release_login_rsp_buffer()
948 kfree(adapter->login_rsp_buf); in release_login_rsp_buffer()
949 adapter->login_rsp_buf = NULL; in release_login_rsp_buffer()
952 static void release_resources(struct ibmvnic_adapter *adapter) in release_resources() argument
954 release_vpd_data(adapter); in release_resources()
956 release_tx_pools(adapter); in release_resources()
957 release_rx_pools(adapter); in release_resources()
959 release_napi(adapter); in release_resources()
960 release_login_buffer(adapter); in release_resources()
961 release_login_rsp_buffer(adapter); in release_resources()
964 static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state) in set_link_state() argument
966 struct net_device *netdev = adapter->netdev; in set_link_state()
982 reinit_completion(&adapter->init_done); in set_link_state()
983 rc = ibmvnic_send_crq(adapter, &crq); in set_link_state()
989 if (!wait_for_completion_timeout(&adapter->init_done, in set_link_state()
995 if (adapter->init_done_rc == PARTIALSUCCESS) { in set_link_state()
999 } else if (adapter->init_done_rc) { in set_link_state()
1001 adapter->init_done_rc); in set_link_state()
1002 return adapter->init_done_rc; in set_link_state()
1011 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in set_real_num_queues() local
1015 adapter->req_tx_queues, adapter->req_rx_queues); in set_real_num_queues()
1017 rc = netif_set_real_num_tx_queues(netdev, adapter->req_tx_queues); in set_real_num_queues()
1023 rc = netif_set_real_num_rx_queues(netdev, adapter->req_rx_queues); in set_real_num_queues()
1030 static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter) in ibmvnic_get_vpd() argument
1032 struct device *dev = &adapter->vdev->dev; in ibmvnic_get_vpd()
1037 if (adapter->vpd->buff) in ibmvnic_get_vpd()
1038 len = adapter->vpd->len; in ibmvnic_get_vpd()
1040 mutex_lock(&adapter->fw_lock); in ibmvnic_get_vpd()
1041 adapter->fw_done_rc = 0; in ibmvnic_get_vpd()
1042 reinit_completion(&adapter->fw_done); in ibmvnic_get_vpd()
1046 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_vpd()
1048 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1052 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in ibmvnic_get_vpd()
1055 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1058 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1060 if (!adapter->vpd->len) in ibmvnic_get_vpd()
1063 if (!adapter->vpd->buff) in ibmvnic_get_vpd()
1064 adapter->vpd->buff = kzalloc(adapter->vpd->len, GFP_KERNEL); in ibmvnic_get_vpd()
1065 else if (adapter->vpd->len != len) in ibmvnic_get_vpd()
1066 adapter->vpd->buff = in ibmvnic_get_vpd()
1067 krealloc(adapter->vpd->buff, in ibmvnic_get_vpd()
1068 adapter->vpd->len, GFP_KERNEL); in ibmvnic_get_vpd()
1070 if (!adapter->vpd->buff) { in ibmvnic_get_vpd()
1075 adapter->vpd->dma_addr = in ibmvnic_get_vpd()
1076 dma_map_single(dev, adapter->vpd->buff, adapter->vpd->len, in ibmvnic_get_vpd()
1078 if (dma_mapping_error(dev, adapter->vpd->dma_addr)) { in ibmvnic_get_vpd()
1080 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1081 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1085 mutex_lock(&adapter->fw_lock); in ibmvnic_get_vpd()
1086 adapter->fw_done_rc = 0; in ibmvnic_get_vpd()
1087 reinit_completion(&adapter->fw_done); in ibmvnic_get_vpd()
1091 crq.get_vpd.ioba = cpu_to_be32(adapter->vpd->dma_addr); in ibmvnic_get_vpd()
1092 crq.get_vpd.len = cpu_to_be32((u32)adapter->vpd->len); in ibmvnic_get_vpd()
1093 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_vpd()
1095 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1096 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1097 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1101 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in ibmvnic_get_vpd()
1104 kfree(adapter->vpd->buff); in ibmvnic_get_vpd()
1105 adapter->vpd->buff = NULL; in ibmvnic_get_vpd()
1106 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1110 mutex_unlock(&adapter->fw_lock); in ibmvnic_get_vpd()
1114 static int init_resources(struct ibmvnic_adapter *adapter) in init_resources() argument
1116 struct net_device *netdev = adapter->netdev; in init_resources()
1123 adapter->vpd = kzalloc(sizeof(*adapter->vpd), GFP_KERNEL); in init_resources()
1124 if (!adapter->vpd) in init_resources()
1128 rc = ibmvnic_get_vpd(adapter); in init_resources()
1134 adapter->map_id = 1; in init_resources()
1136 rc = init_napi(adapter); in init_resources()
1140 send_query_map(adapter); in init_resources()
1152 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_open() local
1153 enum vnic_state prev_state = adapter->state; in __ibmvnic_open()
1156 adapter->state = VNIC_OPENING; in __ibmvnic_open()
1157 replenish_pools(adapter); in __ibmvnic_open()
1158 ibmvnic_napi_enable(adapter); in __ibmvnic_open()
1163 for (i = 0; i < adapter->req_rx_queues; i++) { in __ibmvnic_open()
1166 enable_irq(adapter->rx_scrq[i]->irq); in __ibmvnic_open()
1167 enable_scrq_irq(adapter, adapter->rx_scrq[i]); in __ibmvnic_open()
1170 for (i = 0; i < adapter->req_tx_queues; i++) { in __ibmvnic_open()
1173 enable_irq(adapter->tx_scrq[i]->irq); in __ibmvnic_open()
1174 enable_scrq_irq(adapter, adapter->tx_scrq[i]); in __ibmvnic_open()
1177 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP); in __ibmvnic_open()
1179 ibmvnic_napi_disable(adapter); in __ibmvnic_open()
1180 release_resources(adapter); in __ibmvnic_open()
1187 for (i = 0; i < adapter->req_rx_queues; i++) in __ibmvnic_open()
1188 napi_schedule(&adapter->napi[i]); in __ibmvnic_open()
1191 adapter->state = VNIC_OPEN; in __ibmvnic_open()
1197 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_open() local
1203 if (adapter->failover_pending) { in ibmvnic_open()
1204 adapter->state = VNIC_OPEN; in ibmvnic_open()
1208 if (adapter->state != VNIC_CLOSED) { in ibmvnic_open()
1213 rc = init_resources(adapter); in ibmvnic_open()
1216 release_resources(adapter); in ibmvnic_open()
1228 if (rc && adapter->failover_pending) { in ibmvnic_open()
1229 adapter->state = VNIC_OPEN; in ibmvnic_open()
1235 static void clean_rx_pools(struct ibmvnic_adapter *adapter) in clean_rx_pools() argument
1243 if (!adapter->rx_pool) in clean_rx_pools()
1246 rx_scrqs = adapter->num_active_rx_pools; in clean_rx_pools()
1247 rx_entries = adapter->req_rx_add_entries_per_subcrq; in clean_rx_pools()
1251 rx_pool = &adapter->rx_pool[i]; in clean_rx_pools()
1255 netdev_dbg(adapter->netdev, "Cleaning rx_pool[%d]\n", i); in clean_rx_pools()
1266 static void clean_one_tx_pool(struct ibmvnic_adapter *adapter, in clean_one_tx_pool() argument
1287 static void clean_tx_pools(struct ibmvnic_adapter *adapter) in clean_tx_pools() argument
1292 if (!adapter->tx_pool || !adapter->tso_pool) in clean_tx_pools()
1295 tx_scrqs = adapter->num_active_tx_pools; in clean_tx_pools()
1299 netdev_dbg(adapter->netdev, "Cleaning tx_pool[%d]\n", i); in clean_tx_pools()
1300 clean_one_tx_pool(adapter, &adapter->tx_pool[i]); in clean_tx_pools()
1301 clean_one_tx_pool(adapter, &adapter->tso_pool[i]); in clean_tx_pools()
1305 static void ibmvnic_disable_irqs(struct ibmvnic_adapter *adapter) in ibmvnic_disable_irqs() argument
1307 struct net_device *netdev = adapter->netdev; in ibmvnic_disable_irqs()
1310 if (adapter->tx_scrq) { in ibmvnic_disable_irqs()
1311 for (i = 0; i < adapter->req_tx_queues; i++) in ibmvnic_disable_irqs()
1312 if (adapter->tx_scrq[i]->irq) { in ibmvnic_disable_irqs()
1315 disable_scrq_irq(adapter, adapter->tx_scrq[i]); in ibmvnic_disable_irqs()
1316 disable_irq(adapter->tx_scrq[i]->irq); in ibmvnic_disable_irqs()
1320 if (adapter->rx_scrq) { in ibmvnic_disable_irqs()
1321 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_disable_irqs()
1322 if (adapter->rx_scrq[i]->irq) { in ibmvnic_disable_irqs()
1325 disable_scrq_irq(adapter, adapter->rx_scrq[i]); in ibmvnic_disable_irqs()
1326 disable_irq(adapter->rx_scrq[i]->irq); in ibmvnic_disable_irqs()
1334 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_cleanup() local
1337 if (test_bit(0, &adapter->resetting)) in ibmvnic_cleanup()
1342 ibmvnic_napi_disable(adapter); in ibmvnic_cleanup()
1343 ibmvnic_disable_irqs(adapter); in ibmvnic_cleanup()
1345 clean_rx_pools(adapter); in ibmvnic_cleanup()
1346 clean_tx_pools(adapter); in ibmvnic_cleanup()
1351 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_close() local
1354 adapter->state = VNIC_CLOSING; in __ibmvnic_close()
1355 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); in __ibmvnic_close()
1356 adapter->state = VNIC_CLOSED; in __ibmvnic_close()
1362 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_close() local
1366 adapter->state, adapter->failover_pending, in ibmvnic_close()
1367 adapter->force_reset_recovery); in ibmvnic_close()
1372 if (adapter->failover_pending) { in ibmvnic_close()
1373 adapter->state = VNIC_CLOSED; in ibmvnic_close()
1536 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_xmit() local
1538 u8 *hdrs = (u8 *)&adapter->tx_rx_desc_req; in ibmvnic_xmit()
1539 struct device *dev = &adapter->vdev->dev; in ibmvnic_xmit()
1560 if (test_bit(0, &adapter->resetting)) { in ibmvnic_xmit()
1576 tx_pool = &adapter->tso_pool[queue_num]; in ibmvnic_xmit()
1578 tx_pool = &adapter->tx_pool[queue_num]; in ibmvnic_xmit()
1580 tx_scrq = adapter->tx_scrq[queue_num]; in ibmvnic_xmit()
1651 if (adapter->vlan_header_insertion && skb_vlan_tag_present(skb)) { in ibmvnic_xmit()
1697 lpar_rc = send_subcrq_indirect(adapter, handle, in ibmvnic_xmit()
1704 lpar_rc = send_subcrq(adapter, handle, in ibmvnic_xmit()
1713 if (lpar_rc == H_CLOSED || adapter->failover_pending) { in ibmvnic_xmit()
1730 >= adapter->req_tx_entries_per_subcrq) { in ibmvnic_xmit()
1753 adapter->tx_send_failed += tx_send_failed; in ibmvnic_xmit()
1754 adapter->tx_map_failed += tx_map_failed; in ibmvnic_xmit()
1755 adapter->tx_stats_buffers[queue_num].packets += tx_packets; in ibmvnic_xmit()
1756 adapter->tx_stats_buffers[queue_num].bytes += tx_bytes; in ibmvnic_xmit()
1757 adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped; in ibmvnic_xmit()
1764 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_multi() local
1773 if (!adapter->promisc_supported) in ibmvnic_set_multi()
1782 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
1789 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
1799 ibmvnic_send_crq(adapter, &crq); in ibmvnic_set_multi()
1807 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in __ibmvnic_set_mac() local
1821 mutex_lock(&adapter->fw_lock); in __ibmvnic_set_mac()
1822 adapter->fw_done_rc = 0; in __ibmvnic_set_mac()
1823 reinit_completion(&adapter->fw_done); in __ibmvnic_set_mac()
1825 rc = ibmvnic_send_crq(adapter, &crq); in __ibmvnic_set_mac()
1828 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
1832 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in __ibmvnic_set_mac()
1834 if (rc || adapter->fw_done_rc) { in __ibmvnic_set_mac()
1836 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
1839 mutex_unlock(&adapter->fw_lock); in __ibmvnic_set_mac()
1842 ether_addr_copy(adapter->mac_addr, netdev->dev_addr); in __ibmvnic_set_mac()
1848 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_mac() local
1856 ether_addr_copy(adapter->mac_addr, addr->sa_data); in ibmvnic_set_mac()
1857 if (adapter->state != VNIC_PROBED) in ibmvnic_set_mac()
1867 static int do_change_param_reset(struct ibmvnic_adapter *adapter, in do_change_param_reset() argument
1871 struct net_device *netdev = adapter->netdev; in do_change_param_reset()
1874 netdev_dbg(adapter->netdev, "Change param resetting driver (%d)\n", in do_change_param_reset()
1878 adapter->reset_reason = rwi->reset_reason; in do_change_param_reset()
1888 release_resources(adapter); in do_change_param_reset()
1889 release_sub_crqs(adapter, 1); in do_change_param_reset()
1890 release_crq_queue(adapter); in do_change_param_reset()
1892 adapter->state = VNIC_PROBED; in do_change_param_reset()
1894 rc = init_crq_queue(adapter); in do_change_param_reset()
1897 netdev_err(adapter->netdev, in do_change_param_reset()
1902 rc = ibmvnic_reset_init(adapter, true); in do_change_param_reset()
1908 /* If the adapter was in PROBE state prior to the reset, in do_change_param_reset()
1919 rc = init_resources(adapter); in do_change_param_reset()
1923 ibmvnic_disable_irqs(adapter); in do_change_param_reset()
1925 adapter->state = VNIC_CLOSED; in do_change_param_reset()
1940 for (i = 0; i < adapter->req_rx_queues; i++) in do_change_param_reset()
1941 napi_schedule(&adapter->napi[i]); in do_change_param_reset()
1945 adapter->state = reset_state; in do_change_param_reset()
1953 static int do_reset(struct ibmvnic_adapter *adapter, in do_reset() argument
1958 struct net_device *netdev = adapter->netdev; in do_reset()
1961 netdev_dbg(adapter->netdev, in do_reset()
1963 adapter->state, adapter->failover_pending, in do_reset()
1973 adapter->failover_pending = false; in do_reset()
1976 adapter->reset_reason = rwi->reset_reason; in do_reset()
1978 old_num_rx_queues = adapter->req_rx_queues; in do_reset()
1979 old_num_tx_queues = adapter->req_tx_queues; in do_reset()
1980 old_num_rx_slots = adapter->req_rx_add_entries_per_subcrq; in do_reset()
1981 old_num_tx_slots = adapter->req_tx_entries_per_subcrq; in do_reset()
1986 adapter->reset_reason != VNIC_RESET_MOBILITY && in do_reset()
1987 adapter->reset_reason != VNIC_RESET_FAILOVER) { in do_reset()
1988 adapter->state = VNIC_CLOSING; in do_reset()
1996 rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); in do_reset()
2001 if (adapter->state != VNIC_CLOSING) { in do_reset()
2006 adapter->state = VNIC_CLOSED; in do_reset()
2009 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) { in do_reset()
2013 adapter->state = VNIC_PROBED; in do_reset()
2015 if (adapter->reset_reason == VNIC_RESET_MOBILITY) { in do_reset()
2016 rc = ibmvnic_reenable_crq_queue(adapter); in do_reset()
2017 release_sub_crqs(adapter, 1); in do_reset()
2019 rc = ibmvnic_reset_crq(adapter); in do_reset()
2021 rc = vio_enable_interrupts(adapter->vdev); in do_reset()
2023 netdev_err(adapter->netdev, in do_reset()
2030 netdev_err(adapter->netdev, in do_reset()
2035 rc = ibmvnic_reset_init(adapter, true); in do_reset()
2041 /* If the adapter was in PROBE state prior to the reset, in do_reset()
2054 if (adapter->req_rx_queues != old_num_rx_queues || in do_reset()
2055 adapter->req_tx_queues != old_num_tx_queues || in do_reset()
2056 adapter->req_rx_add_entries_per_subcrq != in do_reset()
2058 adapter->req_tx_entries_per_subcrq != in do_reset()
2060 !adapter->rx_pool || in do_reset()
2061 !adapter->tso_pool || in do_reset()
2062 !adapter->tx_pool) { in do_reset()
2063 release_rx_pools(adapter); in do_reset()
2064 release_tx_pools(adapter); in do_reset()
2065 release_napi(adapter); in do_reset()
2066 release_vpd_data(adapter); in do_reset()
2068 rc = init_resources(adapter); in do_reset()
2073 rc = reset_tx_pools(adapter); in do_reset()
2075 netdev_dbg(adapter->netdev, "reset tx pools failed (%d)\n", in do_reset()
2080 rc = reset_rx_pools(adapter); in do_reset()
2082 netdev_dbg(adapter->netdev, "reset rx pools failed (%d)\n", in do_reset()
2087 ibmvnic_disable_irqs(adapter); in do_reset()
2089 adapter->state = VNIC_CLOSED; in do_reset()
2105 if (adapter->reset_reason == VNIC_RESET_FAILOVER || in do_reset()
2106 adapter->reset_reason == VNIC_RESET_MOBILITY) { in do_reset()
2114 /* restore the adapter state if reset failed */ in do_reset()
2116 adapter->state = reset_state; in do_reset()
2119 netdev_dbg(adapter->netdev, "[S:%d FOP:%d] Reset done, rc %d\n", in do_reset()
2120 adapter->state, adapter->failover_pending, rc); in do_reset()
2124 static int do_hard_reset(struct ibmvnic_adapter *adapter, in do_hard_reset() argument
2127 struct net_device *netdev = adapter->netdev; in do_hard_reset()
2130 netdev_dbg(adapter->netdev, "Hard resetting driver (%d)\n", in do_hard_reset()
2134 adapter->reset_reason = rwi->reset_reason; in do_hard_reset()
2137 release_resources(adapter); in do_hard_reset()
2138 release_sub_crqs(adapter, 0); in do_hard_reset()
2139 release_crq_queue(adapter); in do_hard_reset()
2144 adapter->state = VNIC_PROBED; in do_hard_reset()
2146 reinit_completion(&adapter->init_done); in do_hard_reset()
2147 rc = init_crq_queue(adapter); in do_hard_reset()
2149 netdev_err(adapter->netdev, in do_hard_reset()
2154 rc = ibmvnic_reset_init(adapter, false); in do_hard_reset()
2158 /* If the adapter was in PROBE state prior to the reset, in do_hard_reset()
2168 rc = init_resources(adapter); in do_hard_reset()
2172 ibmvnic_disable_irqs(adapter); in do_hard_reset()
2173 adapter->state = VNIC_CLOSED; in do_hard_reset()
2187 /* restore adapter state if reset failed */ in do_hard_reset()
2189 adapter->state = reset_state; in do_hard_reset()
2190 netdev_dbg(adapter->netdev, "[S:%d FOP:%d] Hard reset done, rc %d\n", in do_hard_reset()
2191 adapter->state, adapter->failover_pending, rc); in do_hard_reset()
2195 static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter) in get_next_rwi() argument
2200 spin_lock_irqsave(&adapter->rwi_lock, flags); in get_next_rwi()
2202 if (!list_empty(&adapter->rwi_list)) { in get_next_rwi()
2203 rwi = list_first_entry(&adapter->rwi_list, struct ibmvnic_rwi, in get_next_rwi()
2210 spin_unlock_irqrestore(&adapter->rwi_lock, flags); in get_next_rwi()
2217 struct ibmvnic_adapter *adapter; in __ibmvnic_reset() local
2223 adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); in __ibmvnic_reset()
2225 if (test_and_set_bit_lock(0, &adapter->resetting)) { in __ibmvnic_reset()
2226 schedule_delayed_work(&adapter->ibmvnic_delayed_reset, in __ibmvnic_reset()
2231 rwi = get_next_rwi(adapter); in __ibmvnic_reset()
2233 spin_lock_irqsave(&adapter->state_lock, flags); in __ibmvnic_reset()
2235 if (adapter->state == VNIC_REMOVING || in __ibmvnic_reset()
2236 adapter->state == VNIC_REMOVED) { in __ibmvnic_reset()
2237 spin_unlock_irqrestore(&adapter->state_lock, flags); in __ibmvnic_reset()
2244 reset_state = adapter->state; in __ibmvnic_reset()
2247 spin_unlock_irqrestore(&adapter->state_lock, flags); in __ibmvnic_reset()
2251 rc = do_change_param_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
2252 } else if (adapter->force_reset_recovery) { in __ibmvnic_reset()
2258 adapter->failover_pending = false; in __ibmvnic_reset()
2261 if (adapter->wait_for_reset) { in __ibmvnic_reset()
2263 adapter->force_reset_recovery = false; in __ibmvnic_reset()
2264 rc = do_hard_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
2267 adapter->force_reset_recovery = false; in __ibmvnic_reset()
2268 rc = do_hard_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
2273 netdev_dbg(adapter->netdev, in __ibmvnic_reset()
2275 adapter->state); in __ibmvnic_reset()
2280 rc = do_reset(adapter, rwi, reset_state); in __ibmvnic_reset()
2283 adapter->last_reset_time = jiffies; in __ibmvnic_reset()
2286 netdev_dbg(adapter->netdev, "Reset failed, rc=%d\n", rc); in __ibmvnic_reset()
2288 rwi = get_next_rwi(adapter); in __ibmvnic_reset()
2292 adapter->force_reset_recovery = true; in __ibmvnic_reset()
2295 if (adapter->wait_for_reset) { in __ibmvnic_reset()
2296 adapter->reset_done_rc = rc; in __ibmvnic_reset()
2297 complete(&adapter->reset_done); in __ibmvnic_reset()
2300 clear_bit_unlock(0, &adapter->resetting); in __ibmvnic_reset()
2302 netdev_dbg(adapter->netdev, in __ibmvnic_reset()
2304 adapter->state, adapter->force_reset_recovery, in __ibmvnic_reset()
2305 adapter->wait_for_reset); in __ibmvnic_reset()
2310 struct ibmvnic_adapter *adapter; in __ibmvnic_delayed_reset() local
2312 adapter = container_of(work, struct ibmvnic_adapter, in __ibmvnic_delayed_reset()
2314 __ibmvnic_reset(&adapter->ibmvnic_reset); in __ibmvnic_delayed_reset()
2317 static int ibmvnic_reset(struct ibmvnic_adapter *adapter, in ibmvnic_reset() argument
2322 struct net_device *netdev = adapter->netdev; in ibmvnic_reset()
2326 spin_lock_irqsave(&adapter->rwi_lock, flags); in ibmvnic_reset()
2334 if (adapter->state == VNIC_REMOVING || in ibmvnic_reset()
2335 adapter->state == VNIC_REMOVED || in ibmvnic_reset()
2336 (adapter->failover_pending && reason != VNIC_RESET_FAILOVER)) { in ibmvnic_reset()
2338 netdev_dbg(netdev, "Adapter removing or pending failover, skipping reset\n"); in ibmvnic_reset()
2342 if (adapter->state == VNIC_PROBING) { in ibmvnic_reset()
2343 netdev_warn(netdev, "Adapter reset during probe\n"); in ibmvnic_reset()
2344 adapter->init_done_rc = EAGAIN; in ibmvnic_reset()
2349 list_for_each(entry, &adapter->rwi_list) { in ibmvnic_reset()
2367 if (adapter->force_reset_recovery && !list_empty(&adapter->rwi_list)) { in ibmvnic_reset()
2368 list_for_each_safe(entry, tmp_entry, &adapter->rwi_list) { in ibmvnic_reset()
2374 list_add_tail(&rwi->list, &adapter->rwi_list); in ibmvnic_reset()
2375 netdev_dbg(adapter->netdev, "Scheduling reset (reason %d)\n", reason); in ibmvnic_reset()
2376 schedule_work(&adapter->ibmvnic_reset); in ibmvnic_reset()
2381 spin_unlock_irqrestore(&adapter->rwi_lock, flags); in ibmvnic_reset()
2391 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_tx_timeout() local
2393 if (test_bit(0, &adapter->resetting)) { in ibmvnic_tx_timeout()
2394 netdev_err(adapter->netdev, in ibmvnic_tx_timeout()
2395 "Adapter is resetting, skip timeout reset\n"); in ibmvnic_tx_timeout()
2401 if (time_before(jiffies, (adapter->last_reset_time + dev->watchdog_timeo))) { in ibmvnic_tx_timeout()
2405 ibmvnic_reset(adapter, VNIC_RESET_TIMEOUT); in ibmvnic_tx_timeout()
2408 static void remove_buff_from_pool(struct ibmvnic_adapter *adapter, in remove_buff_from_pool() argument
2411 struct ibmvnic_rx_pool *pool = &adapter->rx_pool[rx_buff->pool_index]; in remove_buff_from_pool()
2424 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_poll() local
2425 int scrq_num = (int)(napi - adapter->napi); in ibmvnic_poll()
2437 if (unlikely(test_bit(0, &adapter->resetting) && in ibmvnic_poll()
2438 adapter->reset_reason != VNIC_RESET_NON_FATAL)) { in ibmvnic_poll()
2439 enable_scrq_irq(adapter, adapter->rx_scrq[scrq_num]); in ibmvnic_poll()
2444 if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num])) in ibmvnic_poll()
2452 next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]); in ibmvnic_poll()
2463 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
2468 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
2484 if (adapter->rx_vlan_header_insertion && in ibmvnic_poll()
2491 remove_buff_from_pool(adapter, rx_buff); in ibmvnic_poll()
2506 adapter->rx_stats_buffers[scrq_num].packets++; in ibmvnic_poll()
2507 adapter->rx_stats_buffers[scrq_num].bytes += length; in ibmvnic_poll()
2511 if (adapter->state != VNIC_CLOSING) in ibmvnic_poll()
2512 replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]); in ibmvnic_poll()
2515 enable_scrq_irq(adapter, adapter->rx_scrq[scrq_num]); in ibmvnic_poll()
2517 if (pending_scrq(adapter, adapter->rx_scrq[scrq_num]) && in ibmvnic_poll()
2519 disable_scrq_irq(adapter, adapter->rx_scrq[scrq_num]); in ibmvnic_poll()
2526 static int wait_for_reset(struct ibmvnic_adapter *adapter) in wait_for_reset() argument
2530 adapter->fallback.mtu = adapter->req_mtu; in wait_for_reset()
2531 adapter->fallback.rx_queues = adapter->req_rx_queues; in wait_for_reset()
2532 adapter->fallback.tx_queues = adapter->req_tx_queues; in wait_for_reset()
2533 adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq; in wait_for_reset()
2534 adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq; in wait_for_reset()
2536 reinit_completion(&adapter->reset_done); in wait_for_reset()
2537 adapter->wait_for_reset = true; in wait_for_reset()
2538 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); in wait_for_reset()
2544 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, 60000); in wait_for_reset()
2551 if (adapter->reset_done_rc) { in wait_for_reset()
2553 adapter->desired.mtu = adapter->fallback.mtu; in wait_for_reset()
2554 adapter->desired.rx_queues = adapter->fallback.rx_queues; in wait_for_reset()
2555 adapter->desired.tx_queues = adapter->fallback.tx_queues; in wait_for_reset()
2556 adapter->desired.rx_entries = adapter->fallback.rx_entries; in wait_for_reset()
2557 adapter->desired.tx_entries = adapter->fallback.tx_entries; in wait_for_reset()
2559 reinit_completion(&adapter->reset_done); in wait_for_reset()
2560 adapter->wait_for_reset = true; in wait_for_reset()
2561 rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); in wait_for_reset()
2566 rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, in wait_for_reset()
2574 adapter->wait_for_reset = false; in wait_for_reset()
2581 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_change_mtu() local
2583 adapter->desired.mtu = new_mtu + ETH_HLEN; in ibmvnic_change_mtu()
2585 return wait_for_reset(adapter); in ibmvnic_change_mtu()
2622 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_link_ksettings() local
2625 rc = send_query_phys_parms(adapter); in ibmvnic_get_link_ksettings()
2627 adapter->speed = SPEED_UNKNOWN; in ibmvnic_get_link_ksettings()
2628 adapter->duplex = DUPLEX_UNKNOWN; in ibmvnic_get_link_ksettings()
2630 cmd->base.speed = adapter->speed; in ibmvnic_get_link_ksettings()
2631 cmd->base.duplex = adapter->duplex; in ibmvnic_get_link_ksettings()
2642 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_drvinfo() local
2646 strlcpy(info->fw_version, adapter->fw_version, in ibmvnic_get_drvinfo()
2652 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_msglevel() local
2654 return adapter->msg_enable; in ibmvnic_get_msglevel()
2659 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_msglevel() local
2661 adapter->msg_enable = data; in ibmvnic_set_msglevel()
2666 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_link() local
2671 return adapter->logical_link_state; in ibmvnic_get_link()
2677 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_ringparam() local
2679 ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq; in ibmvnic_get_ringparam()
2680 ring->tx_max_pending = adapter->max_tx_entries_per_subcrq; in ibmvnic_get_ringparam()
2683 ring->rx_pending = adapter->req_rx_add_entries_per_subcrq; in ibmvnic_get_ringparam()
2684 ring->tx_pending = adapter->req_tx_entries_per_subcrq; in ibmvnic_get_ringparam()
2692 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_ringparam() local
2694 if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq || in ibmvnic_set_ringparam()
2695 ring->tx_pending > adapter->max_tx_entries_per_subcrq) { in ibmvnic_set_ringparam()
2698 adapter->max_rx_add_entries_per_subcrq); in ibmvnic_set_ringparam()
2700 adapter->max_tx_entries_per_subcrq); in ibmvnic_set_ringparam()
2704 adapter->desired.rx_entries = ring->rx_pending; in ibmvnic_set_ringparam()
2705 adapter->desired.tx_entries = ring->tx_pending; in ibmvnic_set_ringparam()
2707 return wait_for_reset(adapter); in ibmvnic_set_ringparam()
2713 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_get_channels() local
2715 channels->max_rx = adapter->max_rx_queues; in ibmvnic_get_channels()
2716 channels->max_tx = adapter->max_tx_queues; in ibmvnic_get_channels()
2719 channels->rx_count = adapter->req_rx_queues; in ibmvnic_get_channels()
2720 channels->tx_count = adapter->req_tx_queues; in ibmvnic_get_channels()
2728 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_set_channels() local
2730 adapter->desired.rx_queues = channels->rx_count; in ibmvnic_set_channels()
2731 adapter->desired.tx_queues = channels->tx_count; in ibmvnic_set_channels()
2733 return wait_for_reset(adapter); in ibmvnic_set_channels()
2738 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_strings() local
2747 for (i = 0; i < adapter->req_tx_queues; i++) { in ibmvnic_get_strings()
2758 for (i = 0; i < adapter->req_rx_queues; i++) { in ibmvnic_get_strings()
2772 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_sset_count() local
2777 adapter->req_tx_queues * NUM_TX_STATS + in ibmvnic_get_sset_count()
2778 adapter->req_rx_queues * NUM_RX_STATS; in ibmvnic_get_sset_count()
2787 struct ibmvnic_adapter *adapter = netdev_priv(dev); in ibmvnic_get_ethtool_stats() local
2795 crq.request_statistics.ioba = cpu_to_be32(adapter->stats_token); in ibmvnic_get_ethtool_stats()
2800 reinit_completion(&adapter->stats_done); in ibmvnic_get_ethtool_stats()
2801 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_get_ethtool_stats()
2804 rc = ibmvnic_wait_for_completion(adapter, &adapter->stats_done, 10000); in ibmvnic_get_ethtool_stats()
2810 (adapter, ibmvnic_stats[i].offset)); in ibmvnic_get_ethtool_stats()
2812 for (j = 0; j < adapter->req_tx_queues; j++) { in ibmvnic_get_ethtool_stats()
2813 data[i] = adapter->tx_stats_buffers[j].packets; in ibmvnic_get_ethtool_stats()
2815 data[i] = adapter->tx_stats_buffers[j].bytes; in ibmvnic_get_ethtool_stats()
2817 data[i] = adapter->tx_stats_buffers[j].dropped_packets; in ibmvnic_get_ethtool_stats()
2821 for (j = 0; j < adapter->req_rx_queues; j++) { in ibmvnic_get_ethtool_stats()
2822 data[i] = adapter->rx_stats_buffers[j].packets; in ibmvnic_get_ethtool_stats()
2824 data[i] = adapter->rx_stats_buffers[j].bytes; in ibmvnic_get_ethtool_stats()
2826 data[i] = adapter->rx_stats_buffers[j].interrupts; in ibmvnic_get_ethtool_stats()
2848 static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter, in reset_one_sub_crq_queue() argument
2854 netdev_dbg(adapter->netdev, "Invalid scrq reset.\n"); in reset_one_sub_crq_queue()
2868 netdev_dbg(adapter->netdev, "Invalid scrq reset\n"); in reset_one_sub_crq_queue()
2872 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in reset_one_sub_crq_queue()
2877 static int reset_sub_crq_queues(struct ibmvnic_adapter *adapter) in reset_sub_crq_queues() argument
2881 if (!adapter->tx_scrq || !adapter->rx_scrq) in reset_sub_crq_queues()
2884 for (i = 0; i < adapter->req_tx_queues; i++) { in reset_sub_crq_queues()
2885 netdev_dbg(adapter->netdev, "Re-setting tx_scrq[%d]\n", i); in reset_sub_crq_queues()
2886 rc = reset_one_sub_crq_queue(adapter, adapter->tx_scrq[i]); in reset_sub_crq_queues()
2891 for (i = 0; i < adapter->req_rx_queues; i++) { in reset_sub_crq_queues()
2892 netdev_dbg(adapter->netdev, "Re-setting rx_scrq[%d]\n", i); in reset_sub_crq_queues()
2893 rc = reset_one_sub_crq_queue(adapter, adapter->rx_scrq[i]); in reset_sub_crq_queues()
2901 static void release_sub_crq_queue(struct ibmvnic_adapter *adapter, in release_sub_crq_queue() argument
2905 struct device *dev = &adapter->vdev->dev; in release_sub_crq_queue()
2908 netdev_dbg(adapter->netdev, "Releasing sub-CRQ\n"); in release_sub_crq_queue()
2914 adapter->vdev->unit_address, in release_sub_crq_queue()
2919 netdev_err(adapter->netdev, in release_sub_crq_queue()
2932 *adapter) in init_sub_crq_queue()
2934 struct device *dev = &adapter->vdev->dev; in init_sub_crq_queue()
2956 rc = h_reg_sub_crq(adapter->vdev->unit_address, scrq->msg_token, in init_sub_crq_queue()
2960 rc = ibmvnic_reset_crq(adapter); in init_sub_crq_queue()
2963 dev_warn(dev, "Partner adapter not ready, waiting.\n"); in init_sub_crq_queue()
2969 scrq->adapter = adapter; in init_sub_crq_queue()
2973 netdev_dbg(adapter->netdev, in init_sub_crq_queue()
2990 static void release_sub_crqs(struct ibmvnic_adapter *adapter, bool do_h_free) in release_sub_crqs() argument
2994 if (adapter->tx_scrq) { in release_sub_crqs()
2995 for (i = 0; i < adapter->num_active_tx_scrqs; i++) { in release_sub_crqs()
2996 if (!adapter->tx_scrq[i]) in release_sub_crqs()
2999 netdev_dbg(adapter->netdev, "Releasing tx_scrq[%d]\n", in release_sub_crqs()
3001 if (adapter->tx_scrq[i]->irq) { in release_sub_crqs()
3002 free_irq(adapter->tx_scrq[i]->irq, in release_sub_crqs()
3003 adapter->tx_scrq[i]); in release_sub_crqs()
3004 irq_dispose_mapping(adapter->tx_scrq[i]->irq); in release_sub_crqs()
3005 adapter->tx_scrq[i]->irq = 0; in release_sub_crqs()
3008 release_sub_crq_queue(adapter, adapter->tx_scrq[i], in release_sub_crqs()
3012 kfree(adapter->tx_scrq); in release_sub_crqs()
3013 adapter->tx_scrq = NULL; in release_sub_crqs()
3014 adapter->num_active_tx_scrqs = 0; in release_sub_crqs()
3017 if (adapter->rx_scrq) { in release_sub_crqs()
3018 for (i = 0; i < adapter->num_active_rx_scrqs; i++) { in release_sub_crqs()
3019 if (!adapter->rx_scrq[i]) in release_sub_crqs()
3022 netdev_dbg(adapter->netdev, "Releasing rx_scrq[%d]\n", in release_sub_crqs()
3024 if (adapter->rx_scrq[i]->irq) { in release_sub_crqs()
3025 free_irq(adapter->rx_scrq[i]->irq, in release_sub_crqs()
3026 adapter->rx_scrq[i]); in release_sub_crqs()
3027 irq_dispose_mapping(adapter->rx_scrq[i]->irq); in release_sub_crqs()
3028 adapter->rx_scrq[i]->irq = 0; in release_sub_crqs()
3031 release_sub_crq_queue(adapter, adapter->rx_scrq[i], in release_sub_crqs()
3035 kfree(adapter->rx_scrq); in release_sub_crqs()
3036 adapter->rx_scrq = NULL; in release_sub_crqs()
3037 adapter->num_active_rx_scrqs = 0; in release_sub_crqs()
3041 static int disable_scrq_irq(struct ibmvnic_adapter *adapter, in disable_scrq_irq() argument
3044 struct device *dev = &adapter->vdev->dev; in disable_scrq_irq()
3047 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in disable_scrq_irq()
3055 static int enable_scrq_irq(struct ibmvnic_adapter *adapter, in enable_scrq_irq() argument
3058 struct device *dev = &adapter->vdev->dev; in enable_scrq_irq()
3066 if (test_bit(0, &adapter->resetting) && in enable_scrq_irq()
3067 adapter->reset_reason == VNIC_RESET_MOBILITY) { in enable_scrq_irq()
3079 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in enable_scrq_irq()
3087 static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter, in ibmvnic_complete_tx() argument
3090 struct device *dev = &adapter->vdev->dev; in ibmvnic_complete_tx()
3098 while (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
3109 next = ibmvnic_next_scrq(adapter, scrq); in ibmvnic_complete_tx()
3116 tx_pool = &adapter->tso_pool[pool]; in ibmvnic_complete_tx()
3119 tx_pool = &adapter->tx_pool[pool]; in ibmvnic_complete_tx()
3147 (adapter->req_tx_entries_per_subcrq / 2) && in ibmvnic_complete_tx()
3148 __netif_subqueue_stopped(adapter->netdev, in ibmvnic_complete_tx()
3150 netif_wake_subqueue(adapter->netdev, scrq->pool_index); in ibmvnic_complete_tx()
3151 netdev_dbg(adapter->netdev, "Started queue %d\n", in ibmvnic_complete_tx()
3156 enable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
3158 if (pending_scrq(adapter, scrq)) { in ibmvnic_complete_tx()
3159 disable_scrq_irq(adapter, scrq); in ibmvnic_complete_tx()
3169 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_tx() local
3171 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_tx()
3172 ibmvnic_complete_tx(adapter, scrq); in ibmvnic_interrupt_tx()
3180 struct ibmvnic_adapter *adapter = scrq->adapter; in ibmvnic_interrupt_rx() local
3185 if (unlikely(adapter->state != VNIC_OPEN)) in ibmvnic_interrupt_rx()
3188 adapter->rx_stats_buffers[scrq->scrq_num].interrupts++; in ibmvnic_interrupt_rx()
3190 if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) { in ibmvnic_interrupt_rx()
3191 disable_scrq_irq(adapter, scrq); in ibmvnic_interrupt_rx()
3192 __napi_schedule(&adapter->napi[scrq->scrq_num]); in ibmvnic_interrupt_rx()
3198 static int init_sub_crq_irqs(struct ibmvnic_adapter *adapter) in init_sub_crq_irqs() argument
3200 struct device *dev = &adapter->vdev->dev; in init_sub_crq_irqs()
3205 for (i = 0; i < adapter->req_tx_queues; i++) { in init_sub_crq_irqs()
3206 netdev_dbg(adapter->netdev, "Initializing tx_scrq[%d] irq\n", in init_sub_crq_irqs()
3208 scrq = adapter->tx_scrq[i]; in init_sub_crq_irqs()
3218 adapter->vdev->unit_address, i); in init_sub_crq_irqs()
3230 for (i = 0; i < adapter->req_rx_queues; i++) { in init_sub_crq_irqs()
3231 netdev_dbg(adapter->netdev, "Initializing rx_scrq[%d] irq\n", in init_sub_crq_irqs()
3233 scrq = adapter->rx_scrq[i]; in init_sub_crq_irqs()
3241 adapter->vdev->unit_address, i); in init_sub_crq_irqs()
3255 free_irq(adapter->rx_scrq[j]->irq, adapter->rx_scrq[j]); in init_sub_crq_irqs()
3256 irq_dispose_mapping(adapter->rx_scrq[j]->irq); in init_sub_crq_irqs()
3258 i = adapter->req_tx_queues; in init_sub_crq_irqs()
3261 free_irq(adapter->tx_scrq[j]->irq, adapter->tx_scrq[j]); in init_sub_crq_irqs()
3262 irq_dispose_mapping(adapter->tx_scrq[j]->irq); in init_sub_crq_irqs()
3264 release_sub_crqs(adapter, 1); in init_sub_crq_irqs()
3268 static int init_sub_crqs(struct ibmvnic_adapter *adapter) in init_sub_crqs() argument
3270 struct device *dev = &adapter->vdev->dev; in init_sub_crqs()
3277 total_queues = adapter->req_tx_queues + adapter->req_rx_queues; in init_sub_crqs()
3284 allqueues[i] = init_sub_crq_queue(adapter); in init_sub_crqs()
3294 adapter->min_tx_queues + adapter->min_rx_queues) { in init_sub_crqs()
3301 netdev_dbg(adapter->netdev, "Reducing number of queues\n"); in init_sub_crqs()
3304 if (adapter->req_rx_queues > adapter->min_rx_queues) in init_sub_crqs()
3305 adapter->req_rx_queues--; in init_sub_crqs()
3310 if (adapter->req_tx_queues > adapter->min_tx_queues) in init_sub_crqs()
3311 adapter->req_tx_queues--; in init_sub_crqs()
3318 adapter->tx_scrq = kcalloc(adapter->req_tx_queues, in init_sub_crqs()
3319 sizeof(*adapter->tx_scrq), GFP_KERNEL); in init_sub_crqs()
3320 if (!adapter->tx_scrq) in init_sub_crqs()
3323 for (i = 0; i < adapter->req_tx_queues; i++) { in init_sub_crqs()
3324 adapter->tx_scrq[i] = allqueues[i]; in init_sub_crqs()
3325 adapter->tx_scrq[i]->pool_index = i; in init_sub_crqs()
3326 adapter->num_active_tx_scrqs++; in init_sub_crqs()
3329 adapter->rx_scrq = kcalloc(adapter->req_rx_queues, in init_sub_crqs()
3330 sizeof(*adapter->rx_scrq), GFP_KERNEL); in init_sub_crqs()
3331 if (!adapter->rx_scrq) in init_sub_crqs()
3334 for (i = 0; i < adapter->req_rx_queues; i++) { in init_sub_crqs()
3335 adapter->rx_scrq[i] = allqueues[i + adapter->req_tx_queues]; in init_sub_crqs()
3336 adapter->rx_scrq[i]->scrq_num = i; in init_sub_crqs()
3337 adapter->num_active_rx_scrqs++; in init_sub_crqs()
3344 kfree(adapter->tx_scrq); in init_sub_crqs()
3345 adapter->tx_scrq = NULL; in init_sub_crqs()
3348 release_sub_crq_queue(adapter, allqueues[i], 1); in init_sub_crqs()
3353 static void send_request_cap(struct ibmvnic_adapter *adapter, int retry) in send_request_cap() argument
3355 struct device *dev = &adapter->vdev->dev; in send_request_cap()
3365 if (!(adapter->netdev->flags & IFF_PROMISC) || in send_request_cap()
3366 adapter->promisc_supported) in send_request_cap()
3375 atomic_set(&adapter->running_cap_crqs, cap_reqs); in send_request_cap()
3377 if (adapter->min_tx_entries_per_subcrq > entries_page || in send_request_cap()
3378 adapter->min_rx_add_entries_per_subcrq > entries_page) { in send_request_cap()
3383 if (adapter->desired.mtu) in send_request_cap()
3384 adapter->req_mtu = adapter->desired.mtu; in send_request_cap()
3386 adapter->req_mtu = adapter->netdev->mtu + ETH_HLEN; in send_request_cap()
3388 if (!adapter->desired.tx_entries) in send_request_cap()
3389 adapter->desired.tx_entries = in send_request_cap()
3390 adapter->max_tx_entries_per_subcrq; in send_request_cap()
3391 if (!adapter->desired.rx_entries) in send_request_cap()
3392 adapter->desired.rx_entries = in send_request_cap()
3393 adapter->max_rx_add_entries_per_subcrq; in send_request_cap()
3396 (adapter->req_mtu + IBMVNIC_BUFFER_HLEN); in send_request_cap()
3398 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) * in send_request_cap()
3399 adapter->desired.tx_entries > IBMVNIC_MAX_LTB_SIZE) { in send_request_cap()
3400 adapter->desired.tx_entries = max_entries; in send_request_cap()
3403 if ((adapter->req_mtu + IBMVNIC_BUFFER_HLEN) * in send_request_cap()
3404 adapter->desired.rx_entries > IBMVNIC_MAX_LTB_SIZE) { in send_request_cap()
3405 adapter->desired.rx_entries = max_entries; in send_request_cap()
3408 if (adapter->desired.tx_entries) in send_request_cap()
3409 adapter->req_tx_entries_per_subcrq = in send_request_cap()
3410 adapter->desired.tx_entries; in send_request_cap()
3412 adapter->req_tx_entries_per_subcrq = in send_request_cap()
3413 adapter->max_tx_entries_per_subcrq; in send_request_cap()
3415 if (adapter->desired.rx_entries) in send_request_cap()
3416 adapter->req_rx_add_entries_per_subcrq = in send_request_cap()
3417 adapter->desired.rx_entries; in send_request_cap()
3419 adapter->req_rx_add_entries_per_subcrq = in send_request_cap()
3420 adapter->max_rx_add_entries_per_subcrq; in send_request_cap()
3422 if (adapter->desired.tx_queues) in send_request_cap()
3423 adapter->req_tx_queues = in send_request_cap()
3424 adapter->desired.tx_queues; in send_request_cap()
3426 adapter->req_tx_queues = in send_request_cap()
3427 adapter->opt_tx_comp_sub_queues; in send_request_cap()
3429 if (adapter->desired.rx_queues) in send_request_cap()
3430 adapter->req_rx_queues = in send_request_cap()
3431 adapter->desired.rx_queues; in send_request_cap()
3433 adapter->req_rx_queues = in send_request_cap()
3434 adapter->opt_rx_comp_queues; in send_request_cap()
3436 adapter->req_rx_add_queues = adapter->max_rx_add_queues; in send_request_cap()
3438 atomic_add(cap_reqs, &adapter->running_cap_crqs); in send_request_cap()
3445 crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues); in send_request_cap()
3447 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3450 crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues); in send_request_cap()
3452 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3455 crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues); in send_request_cap()
3457 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3462 cpu_to_be64(adapter->req_tx_entries_per_subcrq); in send_request_cap()
3464 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3469 cpu_to_be64(adapter->req_rx_add_entries_per_subcrq); in send_request_cap()
3471 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3474 crq.request_capability.number = cpu_to_be64(adapter->req_mtu); in send_request_cap()
3476 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3478 if (adapter->netdev->flags & IFF_PROMISC) { in send_request_cap()
3479 if (adapter->promisc_supported) { in send_request_cap()
3484 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3491 ibmvnic_send_crq(adapter, &crq); in send_request_cap()
3500 static int pending_scrq(struct ibmvnic_adapter *adapter, in pending_scrq() argument
3511 static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter, in ibmvnic_next_scrq() argument
3535 static union ibmvnic_crq *ibmvnic_next_crq(struct ibmvnic_adapter *adapter) in ibmvnic_next_crq() argument
3537 struct ibmvnic_crq_queue *queue = &adapter->crq; in ibmvnic_next_crq()
3556 "%s failed: Send request is malformed or adapter failover pending. (rc=%d)\n", in print_subcrq_error()
3561 "%s failed: Backing queue closed. Adapter is down or failover pending. (rc=%d)\n", in print_subcrq_error()
3570 static int send_subcrq(struct ibmvnic_adapter *adapter, u64 remote_handle, in send_subcrq() argument
3573 unsigned int ua = adapter->vdev->unit_address; in send_subcrq()
3574 struct device *dev = &adapter->vdev->dev; in send_subcrq()
3578 netdev_dbg(adapter->netdev, in send_subcrq()
3602 static int send_subcrq_indirect(struct ibmvnic_adapter *adapter, in send_subcrq_indirect() argument
3605 unsigned int ua = adapter->vdev->unit_address; in send_subcrq_indirect()
3606 struct device *dev = &adapter->vdev->dev; in send_subcrq_indirect()
3621 static int ibmvnic_send_crq(struct ibmvnic_adapter *adapter, in ibmvnic_send_crq() argument
3624 unsigned int ua = adapter->vdev->unit_address; in ibmvnic_send_crq()
3625 struct device *dev = &adapter->vdev->dev; in ibmvnic_send_crq()
3629 netdev_dbg(adapter->netdev, "Sending CRQ: %016lx %016lx\n", in ibmvnic_send_crq()
3633 if (!adapter->crq.active && in ibmvnic_send_crq()
3658 static int ibmvnic_send_crq_init(struct ibmvnic_adapter *adapter) in ibmvnic_send_crq_init() argument
3660 struct device *dev = &adapter->vdev->dev; in ibmvnic_send_crq_init()
3668 netdev_dbg(adapter->netdev, "Sending CRQ init\n"); in ibmvnic_send_crq_init()
3671 rc = ibmvnic_send_crq(adapter, &crq); in ibmvnic_send_crq_init()
3687 static int send_version_xchg(struct ibmvnic_adapter *adapter) in send_version_xchg() argument
3696 return ibmvnic_send_crq(adapter, &crq); in send_version_xchg()
3705 static int vnic_client_data_len(struct ibmvnic_adapter *adapter) in vnic_client_data_len() argument
3716 len += strlen(adapter->netdev->name) + 1; in vnic_client_data_len()
3721 static void vnic_add_client_data(struct ibmvnic_adapter *adapter, in vnic_add_client_data() argument
3743 len = strlen(adapter->netdev->name) + 1; in vnic_add_client_data()
3745 strncpy(vlcd->name, adapter->netdev->name, len); in vnic_add_client_data()
3748 static int send_login(struct ibmvnic_adapter *adapter) in send_login() argument
3752 struct device *dev = &adapter->vdev->dev; in send_login()
3765 if (!adapter->tx_scrq || !adapter->rx_scrq) { in send_login()
3766 netdev_err(adapter->netdev, in send_login()
3771 release_login_buffer(adapter); in send_login()
3772 release_login_rsp_buffer(adapter); in send_login()
3774 client_data_len = vnic_client_data_len(adapter); in send_login()
3778 sizeof(u64) * (adapter->req_tx_queues + adapter->req_rx_queues) + in send_login()
3793 sizeof(u64) * adapter->req_tx_queues + in send_login()
3794 sizeof(u64) * adapter->req_rx_queues + in send_login()
3795 sizeof(u64) * adapter->req_rx_queues + in send_login()
3809 adapter->login_buf = login_buffer; in send_login()
3810 adapter->login_buf_token = buffer_token; in send_login()
3811 adapter->login_buf_sz = buffer_size; in send_login()
3812 adapter->login_rsp_buf = login_rsp_buffer; in send_login()
3813 adapter->login_rsp_buf_token = rsp_buffer_token; in send_login()
3814 adapter->login_rsp_buf_sz = rsp_buffer_size; in send_login()
3818 login_buffer->num_txcomp_subcrqs = cpu_to_be32(adapter->req_tx_queues); in send_login()
3821 login_buffer->num_rxcomp_subcrqs = cpu_to_be32(adapter->req_rx_queues); in send_login()
3824 sizeof(u64) * adapter->req_tx_queues); in send_login()
3832 sizeof(u64) * adapter->req_tx_queues); in send_login()
3834 for (i = 0; i < adapter->req_tx_queues; i++) { in send_login()
3835 if (adapter->tx_scrq[i]) { in send_login()
3836 tx_list_p[i] = cpu_to_be64(adapter->tx_scrq[i]-> in send_login()
3841 for (i = 0; i < adapter->req_rx_queues; i++) { in send_login()
3842 if (adapter->rx_scrq[i]) { in send_login()
3843 rx_list_p[i] = cpu_to_be64(adapter->rx_scrq[i]-> in send_login()
3850 ((char *)rx_list_p + (sizeof(u64) * adapter->req_rx_queues)); in send_login()
3855 vnic_add_client_data(adapter, vlcd); in send_login()
3857 netdev_dbg(adapter->netdev, "Login Buffer:\n"); in send_login()
3858 for (i = 0; i < (adapter->login_buf_sz - 1) / 8 + 1; i++) { in send_login()
3859 netdev_dbg(adapter->netdev, "%016lx\n", in send_login()
3860 ((unsigned long int *)(adapter->login_buf))[i]); in send_login()
3869 adapter->login_pending = true; in send_login()
3870 rc = ibmvnic_send_crq(adapter, &crq); in send_login()
3872 adapter->login_pending = false; in send_login()
3873 netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc); in send_login()
3884 adapter->login_rsp_buf = NULL; in send_login()
3889 adapter->login_buf = NULL; in send_login()
3894 static int send_request_map(struct ibmvnic_adapter *adapter, dma_addr_t addr, in send_request_map() argument
3905 return ibmvnic_send_crq(adapter, &crq); in send_request_map()
3908 static int send_request_unmap(struct ibmvnic_adapter *adapter, u8 map_id) in send_request_unmap() argument
3916 return ibmvnic_send_crq(adapter, &crq); in send_request_unmap()
3919 static void send_query_map(struct ibmvnic_adapter *adapter) in send_query_map() argument
3926 ibmvnic_send_crq(adapter, &crq); in send_query_map()
3930 static void send_query_cap(struct ibmvnic_adapter *adapter) in send_query_cap() argument
3941 atomic_set(&adapter->running_cap_crqs, cap_reqs); in send_query_cap()
3948 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3952 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3956 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3960 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3964 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3968 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3973 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3978 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3983 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3988 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3992 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
3996 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4000 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4004 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4008 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4012 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4016 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4020 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4024 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4028 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4032 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4037 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4042 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4047 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4052 ibmvnic_send_crq(adapter, &crq); in send_query_cap()
4061 static void send_query_ip_offload(struct ibmvnic_adapter *adapter) in send_query_ip_offload() argument
4064 struct device *dev = &adapter->vdev->dev; in send_query_ip_offload()
4067 adapter->ip_offload_tok = in send_query_ip_offload()
4069 &adapter->ip_offload_buf, in send_query_ip_offload()
4073 if (dma_mapping_error(dev, adapter->ip_offload_tok)) { in send_query_ip_offload()
4084 cpu_to_be32(adapter->ip_offload_tok); in send_query_ip_offload()
4086 ibmvnic_send_crq(adapter, &crq); in send_query_ip_offload()
4089 static void send_control_ip_offload(struct ibmvnic_adapter *adapter) in send_control_ip_offload() argument
4091 struct ibmvnic_control_ip_offload_buffer *ctrl_buf = &adapter->ip_offload_ctrl; in send_control_ip_offload()
4092 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; in send_control_ip_offload()
4093 struct device *dev = &adapter->vdev->dev; in send_control_ip_offload()
4097 adapter->ip_offload_ctrl_tok = in send_control_ip_offload()
4100 sizeof(adapter->ip_offload_ctrl), in send_control_ip_offload()
4103 if (dma_mapping_error(dev, adapter->ip_offload_ctrl_tok)) { in send_control_ip_offload()
4108 ctrl_buf->len = cpu_to_be32(sizeof(adapter->ip_offload_ctrl)); in send_control_ip_offload()
4123 if (adapter->state != VNIC_PROBING) { in send_control_ip_offload()
4124 old_hw_features = adapter->netdev->hw_features; in send_control_ip_offload()
4125 adapter->netdev->hw_features = 0; in send_control_ip_offload()
4128 adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO; in send_control_ip_offload()
4131 adapter->netdev->hw_features |= NETIF_F_IP_CSUM; in send_control_ip_offload()
4134 adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM; in send_control_ip_offload()
4136 if ((adapter->netdev->features & in send_control_ip_offload()
4138 adapter->netdev->hw_features |= NETIF_F_RXCSUM; in send_control_ip_offload()
4141 adapter->netdev->hw_features |= NETIF_F_TSO; in send_control_ip_offload()
4143 adapter->netdev->hw_features |= NETIF_F_TSO6; in send_control_ip_offload()
4145 if (adapter->state == VNIC_PROBING) { in send_control_ip_offload()
4146 adapter->netdev->features |= adapter->netdev->hw_features; in send_control_ip_offload()
4147 } else if (old_hw_features != adapter->netdev->hw_features) { in send_control_ip_offload()
4151 adapter->netdev->features &= adapter->netdev->hw_features; in send_control_ip_offload()
4153 tmp = (old_hw_features ^ adapter->netdev->hw_features) & in send_control_ip_offload()
4154 adapter->netdev->hw_features; in send_control_ip_offload()
4155 adapter->netdev->features |= in send_control_ip_offload()
4156 tmp & adapter->netdev->wanted_features; in send_control_ip_offload()
4163 cpu_to_be32(sizeof(adapter->ip_offload_ctrl)); in send_control_ip_offload()
4164 crq.control_ip_offload.ioba = cpu_to_be32(adapter->ip_offload_ctrl_tok); in send_control_ip_offload()
4165 ibmvnic_send_crq(adapter, &crq); in send_control_ip_offload()
4169 struct ibmvnic_adapter *adapter) in handle_vpd_size_rsp() argument
4171 struct device *dev = &adapter->vdev->dev; in handle_vpd_size_rsp()
4176 complete(&adapter->fw_done); in handle_vpd_size_rsp()
4180 adapter->vpd->len = be64_to_cpu(crq->get_vpd_size_rsp.len); in handle_vpd_size_rsp()
4181 complete(&adapter->fw_done); in handle_vpd_size_rsp()
4185 struct ibmvnic_adapter *adapter) in handle_vpd_rsp() argument
4187 struct device *dev = &adapter->vdev->dev; in handle_vpd_rsp()
4191 memset(adapter->fw_version, 0, 32); in handle_vpd_rsp()
4193 dma_unmap_single(dev, adapter->vpd->dma_addr, adapter->vpd->len, in handle_vpd_rsp()
4205 substr = strnstr(adapter->vpd->buff, "RM", adapter->vpd->len); in handle_vpd_rsp()
4212 if ((substr + 2) < (adapter->vpd->buff + adapter->vpd->len)) { in handle_vpd_rsp()
4219 /* copy firmware version string from vpd into adapter */ in handle_vpd_rsp()
4221 (adapter->vpd->buff + adapter->vpd->len)) { in handle_vpd_rsp()
4222 strncpy((char *)adapter->fw_version, substr + 3, fw_level_len); in handle_vpd_rsp()
4228 if (adapter->fw_version[0] == '\0') in handle_vpd_rsp()
4229 strncpy((char *)adapter->fw_version, "N/A", 3 * sizeof(char)); in handle_vpd_rsp()
4230 complete(&adapter->fw_done); in handle_vpd_rsp()
4233 static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter) in handle_query_ip_offload_rsp() argument
4235 struct device *dev = &adapter->vdev->dev; in handle_query_ip_offload_rsp()
4236 struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; in handle_query_ip_offload_rsp()
4239 dma_unmap_single(dev, adapter->ip_offload_tok, in handle_query_ip_offload_rsp()
4240 sizeof(adapter->ip_offload_buf), DMA_FROM_DEVICE); in handle_query_ip_offload_rsp()
4242 netdev_dbg(adapter->netdev, "Query IP Offload Buffer:\n"); in handle_query_ip_offload_rsp()
4243 for (i = 0; i < (sizeof(adapter->ip_offload_buf) - 1) / 8 + 1; i++) in handle_query_ip_offload_rsp()
4244 netdev_dbg(adapter->netdev, "%016lx\n", in handle_query_ip_offload_rsp()
4247 netdev_dbg(adapter->netdev, "ipv4_chksum = %d\n", buf->ipv4_chksum); in handle_query_ip_offload_rsp()
4248 netdev_dbg(adapter->netdev, "ipv6_chksum = %d\n", buf->ipv6_chksum); in handle_query_ip_offload_rsp()
4249 netdev_dbg(adapter->netdev, "tcp_ipv4_chksum = %d\n", in handle_query_ip_offload_rsp()
4251 netdev_dbg(adapter->netdev, "tcp_ipv6_chksum = %d\n", in handle_query_ip_offload_rsp()
4253 netdev_dbg(adapter->netdev, "udp_ipv4_chksum = %d\n", in handle_query_ip_offload_rsp()
4255 netdev_dbg(adapter->netdev, "udp_ipv6_chksum = %d\n", in handle_query_ip_offload_rsp()
4257 netdev_dbg(adapter->netdev, "large_tx_ipv4 = %d\n", in handle_query_ip_offload_rsp()
4259 netdev_dbg(adapter->netdev, "large_tx_ipv6 = %d\n", in handle_query_ip_offload_rsp()
4261 netdev_dbg(adapter->netdev, "large_rx_ipv4 = %d\n", in handle_query_ip_offload_rsp()
4263 netdev_dbg(adapter->netdev, "large_rx_ipv6 = %d\n", in handle_query_ip_offload_rsp()
4265 netdev_dbg(adapter->netdev, "max_ipv4_hdr_sz = %d\n", in handle_query_ip_offload_rsp()
4267 netdev_dbg(adapter->netdev, "max_ipv6_hdr_sz = %d\n", in handle_query_ip_offload_rsp()
4269 netdev_dbg(adapter->netdev, "max_tcp_hdr_size = %d\n", in handle_query_ip_offload_rsp()
4271 netdev_dbg(adapter->netdev, "max_udp_hdr_size = %d\n", in handle_query_ip_offload_rsp()
4273 netdev_dbg(adapter->netdev, "max_large_tx_size = %d\n", in handle_query_ip_offload_rsp()
4275 netdev_dbg(adapter->netdev, "max_large_rx_size = %d\n", in handle_query_ip_offload_rsp()
4277 netdev_dbg(adapter->netdev, "ipv6_ext_hdr = %d\n", in handle_query_ip_offload_rsp()
4279 netdev_dbg(adapter->netdev, "tcp_pseudosum_req = %d\n", in handle_query_ip_offload_rsp()
4281 netdev_dbg(adapter->netdev, "num_ipv6_ext_hd = %d\n", in handle_query_ip_offload_rsp()
4283 netdev_dbg(adapter->netdev, "off_ipv6_ext_hd = %d\n", in handle_query_ip_offload_rsp()
4286 send_control_ip_offload(adapter); in handle_query_ip_offload_rsp()
4293 return "adapter problem"; in ibmvnic_fw_err_cause()
4312 struct ibmvnic_adapter *adapter) in handle_error_indication() argument
4314 struct device *dev = &adapter->vdev->dev; in handle_error_indication()
4326 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_error_indication()
4328 ibmvnic_reset(adapter, VNIC_RESET_NON_FATAL); in handle_error_indication()
4332 struct ibmvnic_adapter *adapter) in handle_change_mac_rsp() argument
4334 struct net_device *netdev = adapter->netdev; in handle_change_mac_rsp()
4335 struct device *dev = &adapter->vdev->dev; in handle_change_mac_rsp()
4348 ether_addr_copy(adapter->mac_addr, in handle_change_mac_rsp()
4351 complete(&adapter->fw_done); in handle_change_mac_rsp()
4356 struct ibmvnic_adapter *adapter) in handle_request_cap_rsp() argument
4358 struct device *dev = &adapter->vdev->dev; in handle_request_cap_rsp()
4362 atomic_dec(&adapter->running_cap_crqs); in handle_request_cap_rsp()
4363 netdev_dbg(adapter->netdev, "Outstanding request-caps: %d\n", in handle_request_cap_rsp()
4364 atomic_read(&adapter->running_cap_crqs)); in handle_request_cap_rsp()
4367 req_value = &adapter->req_tx_queues; in handle_request_cap_rsp()
4371 req_value = &adapter->req_rx_queues; in handle_request_cap_rsp()
4375 req_value = &adapter->req_rx_add_queues; in handle_request_cap_rsp()
4379 req_value = &adapter->req_tx_entries_per_subcrq; in handle_request_cap_rsp()
4383 req_value = &adapter->req_rx_add_entries_per_subcrq; in handle_request_cap_rsp()
4387 req_value = &adapter->req_mtu; in handle_request_cap_rsp()
4391 req_value = &adapter->promisc; in handle_request_cap_rsp()
4413 *req_value = adapter->fallback.mtu; in handle_request_cap_rsp()
4419 send_request_cap(adapter, 1); in handle_request_cap_rsp()
4428 if (atomic_read(&adapter->running_cap_crqs) == 0) { in handle_request_cap_rsp()
4429 adapter->wait_capability = false; in handle_request_cap_rsp()
4430 send_query_ip_offload(adapter); in handle_request_cap_rsp()
4435 struct ibmvnic_adapter *adapter) in handle_login_rsp() argument
4437 struct device *dev = &adapter->vdev->dev; in handle_login_rsp()
4438 struct net_device *netdev = adapter->netdev; in handle_login_rsp()
4439 struct ibmvnic_login_rsp_buffer *login_rsp = adapter->login_rsp_buf; in handle_login_rsp()
4440 struct ibmvnic_login_buffer *login = adapter->login_buf; in handle_login_rsp()
4452 if (!adapter->login_pending) { in handle_login_rsp()
4456 adapter->login_pending = false; in handle_login_rsp()
4463 adapter->init_done_rc = login_rsp_crq->generic.rc.code; in handle_login_rsp()
4464 complete(&adapter->init_done); in handle_login_rsp()
4468 if (adapter->failover_pending) { in handle_login_rsp()
4469 adapter->init_done_rc = -EAGAIN; in handle_login_rsp()
4471 complete(&adapter->init_done); in handle_login_rsp()
4476 netdev->mtu = adapter->req_mtu - ETH_HLEN; in handle_login_rsp()
4478 netdev_dbg(adapter->netdev, "Login Response Buffer:\n"); in handle_login_rsp()
4479 for (i = 0; i < (adapter->login_rsp_buf_sz - 1) / 8 + 1; i++) { in handle_login_rsp()
4480 netdev_dbg(adapter->netdev, "%016lx\n", in handle_login_rsp()
4481 ((unsigned long int *)(adapter->login_rsp_buf))[i]); in handle_login_rsp()
4487 adapter->req_rx_add_queues != in handle_login_rsp()
4490 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_login_rsp()
4506 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in handle_login_rsp()
4510 size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
4511 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size)); in handle_login_rsp()
4515 adapter->cur_rx_buf_sz = be64_to_cpu(size_array[0]); in handle_login_rsp()
4517 num_tx_pools = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs); in handle_login_rsp()
4518 num_rx_pools = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); in handle_login_rsp()
4520 tx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
4521 be32_to_cpu(adapter->login_rsp_buf->off_txsubm_subcrqs)); in handle_login_rsp()
4522 rx_handle_array = (u64 *)((u8 *)(adapter->login_rsp_buf) + in handle_login_rsp()
4523 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_subcrqs)); in handle_login_rsp()
4526 adapter->tx_scrq[i]->handle = tx_handle_array[i]; in handle_login_rsp()
4529 adapter->rx_scrq[i]->handle = rx_handle_array[i]; in handle_login_rsp()
4531 adapter->num_active_tx_scrqs = num_tx_pools; in handle_login_rsp()
4532 adapter->num_active_rx_scrqs = num_rx_pools; in handle_login_rsp()
4533 release_login_rsp_buffer(adapter); in handle_login_rsp()
4534 release_login_buffer(adapter); in handle_login_rsp()
4535 complete(&adapter->init_done); in handle_login_rsp()
4541 struct ibmvnic_adapter *adapter) in handle_request_unmap_rsp() argument
4543 struct device *dev = &adapter->vdev->dev; in handle_request_unmap_rsp()
4552 struct ibmvnic_adapter *adapter) in handle_query_map_rsp() argument
4554 struct net_device *netdev = adapter->netdev; in handle_query_map_rsp()
4555 struct device *dev = &adapter->vdev->dev; in handle_query_map_rsp()
4569 struct ibmvnic_adapter *adapter) in handle_query_cap_rsp() argument
4571 struct net_device *netdev = adapter->netdev; in handle_query_cap_rsp()
4572 struct device *dev = &adapter->vdev->dev; in handle_query_cap_rsp()
4575 atomic_dec(&adapter->running_cap_crqs); in handle_query_cap_rsp()
4577 atomic_read(&adapter->running_cap_crqs)); in handle_query_cap_rsp()
4586 adapter->min_tx_queues = in handle_query_cap_rsp()
4589 adapter->min_tx_queues); in handle_query_cap_rsp()
4592 adapter->min_rx_queues = in handle_query_cap_rsp()
4595 adapter->min_rx_queues); in handle_query_cap_rsp()
4598 adapter->min_rx_add_queues = in handle_query_cap_rsp()
4601 adapter->min_rx_add_queues); in handle_query_cap_rsp()
4604 adapter->max_tx_queues = in handle_query_cap_rsp()
4607 adapter->max_tx_queues); in handle_query_cap_rsp()
4610 adapter->max_rx_queues = in handle_query_cap_rsp()
4613 adapter->max_rx_queues); in handle_query_cap_rsp()
4616 adapter->max_rx_add_queues = in handle_query_cap_rsp()
4619 adapter->max_rx_add_queues); in handle_query_cap_rsp()
4622 adapter->min_tx_entries_per_subcrq = in handle_query_cap_rsp()
4625 adapter->min_tx_entries_per_subcrq); in handle_query_cap_rsp()
4628 adapter->min_rx_add_entries_per_subcrq = in handle_query_cap_rsp()
4631 adapter->min_rx_add_entries_per_subcrq); in handle_query_cap_rsp()
4634 adapter->max_tx_entries_per_subcrq = in handle_query_cap_rsp()
4637 adapter->max_tx_entries_per_subcrq); in handle_query_cap_rsp()
4640 adapter->max_rx_add_entries_per_subcrq = in handle_query_cap_rsp()
4643 adapter->max_rx_add_entries_per_subcrq); in handle_query_cap_rsp()
4646 adapter->tcp_ip_offload = in handle_query_cap_rsp()
4649 adapter->tcp_ip_offload); in handle_query_cap_rsp()
4652 adapter->promisc_supported = in handle_query_cap_rsp()
4655 adapter->promisc_supported); in handle_query_cap_rsp()
4658 adapter->min_mtu = be64_to_cpu(crq->query_capability.number); in handle_query_cap_rsp()
4659 netdev->min_mtu = adapter->min_mtu - ETH_HLEN; in handle_query_cap_rsp()
4660 netdev_dbg(netdev, "min_mtu = %lld\n", adapter->min_mtu); in handle_query_cap_rsp()
4663 adapter->max_mtu = be64_to_cpu(crq->query_capability.number); in handle_query_cap_rsp()
4664 netdev->max_mtu = adapter->max_mtu - ETH_HLEN; in handle_query_cap_rsp()
4665 netdev_dbg(netdev, "max_mtu = %lld\n", adapter->max_mtu); in handle_query_cap_rsp()
4668 adapter->max_multicast_filters = in handle_query_cap_rsp()
4671 adapter->max_multicast_filters); in handle_query_cap_rsp()
4674 adapter->vlan_header_insertion = in handle_query_cap_rsp()
4676 if (adapter->vlan_header_insertion) in handle_query_cap_rsp()
4679 adapter->vlan_header_insertion); in handle_query_cap_rsp()
4682 adapter->rx_vlan_header_insertion = in handle_query_cap_rsp()
4685 adapter->rx_vlan_header_insertion); in handle_query_cap_rsp()
4688 adapter->max_tx_sg_entries = in handle_query_cap_rsp()
4691 adapter->max_tx_sg_entries); in handle_query_cap_rsp()
4694 adapter->rx_sg_supported = in handle_query_cap_rsp()
4697 adapter->rx_sg_supported); in handle_query_cap_rsp()
4700 adapter->opt_tx_comp_sub_queues = in handle_query_cap_rsp()
4703 adapter->opt_tx_comp_sub_queues); in handle_query_cap_rsp()
4706 adapter->opt_rx_comp_queues = in handle_query_cap_rsp()
4709 adapter->opt_rx_comp_queues); in handle_query_cap_rsp()
4712 adapter->opt_rx_bufadd_q_per_rx_comp_q = in handle_query_cap_rsp()
4715 adapter->opt_rx_bufadd_q_per_rx_comp_q); in handle_query_cap_rsp()
4718 adapter->opt_tx_entries_per_subcrq = in handle_query_cap_rsp()
4721 adapter->opt_tx_entries_per_subcrq); in handle_query_cap_rsp()
4724 adapter->opt_rxba_entries_per_subcrq = in handle_query_cap_rsp()
4727 adapter->opt_rxba_entries_per_subcrq); in handle_query_cap_rsp()
4730 adapter->tx_rx_desc_req = crq->query_capability.number; in handle_query_cap_rsp()
4732 adapter->tx_rx_desc_req); in handle_query_cap_rsp()
4741 if (atomic_read(&adapter->running_cap_crqs) == 0) { in handle_query_cap_rsp()
4742 adapter->wait_capability = false; in handle_query_cap_rsp()
4743 send_request_cap(adapter, 0); in handle_query_cap_rsp()
4747 static int send_query_phys_parms(struct ibmvnic_adapter *adapter) in send_query_phys_parms() argument
4756 mutex_lock(&adapter->fw_lock); in send_query_phys_parms()
4757 adapter->fw_done_rc = 0; in send_query_phys_parms()
4758 reinit_completion(&adapter->fw_done); in send_query_phys_parms()
4760 rc = ibmvnic_send_crq(adapter, &crq); in send_query_phys_parms()
4762 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
4766 rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000); in send_query_phys_parms()
4768 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
4772 mutex_unlock(&adapter->fw_lock); in send_query_phys_parms()
4773 return adapter->fw_done_rc ? -EIO : 0; in send_query_phys_parms()
4777 struct ibmvnic_adapter *adapter) in handle_query_phys_parms_rsp() argument
4779 struct net_device *netdev = adapter->netdev; in handle_query_phys_parms_rsp()
4790 adapter->speed = SPEED_10; in handle_query_phys_parms_rsp()
4793 adapter->speed = SPEED_100; in handle_query_phys_parms_rsp()
4796 adapter->speed = SPEED_1000; in handle_query_phys_parms_rsp()
4799 adapter->speed = SPEED_10000; in handle_query_phys_parms_rsp()
4802 adapter->speed = SPEED_25000; in handle_query_phys_parms_rsp()
4805 adapter->speed = SPEED_40000; in handle_query_phys_parms_rsp()
4808 adapter->speed = SPEED_50000; in handle_query_phys_parms_rsp()
4811 adapter->speed = SPEED_100000; in handle_query_phys_parms_rsp()
4814 adapter->speed = SPEED_200000; in handle_query_phys_parms_rsp()
4819 adapter->speed = SPEED_UNKNOWN; in handle_query_phys_parms_rsp()
4822 adapter->duplex = DUPLEX_FULL; in handle_query_phys_parms_rsp()
4824 adapter->duplex = DUPLEX_HALF; in handle_query_phys_parms_rsp()
4826 adapter->duplex = DUPLEX_UNKNOWN; in handle_query_phys_parms_rsp()
4832 struct ibmvnic_adapter *adapter) in ibmvnic_handle_crq() argument
4835 struct net_device *netdev = adapter->netdev; in ibmvnic_handle_crq()
4836 struct device *dev = &adapter->vdev->dev; in ibmvnic_handle_crq()
4848 adapter->from_passive_init = true; in ibmvnic_handle_crq()
4852 adapter->login_pending = false; in ibmvnic_handle_crq()
4854 if (!completion_done(&adapter->init_done)) { in ibmvnic_handle_crq()
4855 complete(&adapter->init_done); in ibmvnic_handle_crq()
4856 adapter->init_done_rc = -EIO; in ibmvnic_handle_crq()
4858 rc = ibmvnic_reset(adapter, VNIC_RESET_FAILOVER); in ibmvnic_handle_crq()
4861 * reset either because the adapter was still in ibmvnic_handle_crq()
4866 * is already scheduled or the adapter is in ibmvnic_handle_crq()
4872 adapter->failover_pending = false; in ibmvnic_handle_crq()
4877 adapter->crq.active = true; in ibmvnic_handle_crq()
4878 send_version_xchg(adapter); in ibmvnic_handle_crq()
4886 adapter->crq.active = false; in ibmvnic_handle_crq()
4890 if (!completion_done(&adapter->fw_done)) { in ibmvnic_handle_crq()
4891 adapter->fw_done_rc = -EIO; in ibmvnic_handle_crq()
4892 complete(&adapter->fw_done); in ibmvnic_handle_crq()
4896 if (!completion_done(&adapter->init_done)) { in ibmvnic_handle_crq()
4897 adapter->init_done_rc = -EAGAIN; in ibmvnic_handle_crq()
4898 complete(&adapter->init_done); in ibmvnic_handle_crq()
4901 if (!completion_done(&adapter->stats_done)) in ibmvnic_handle_crq()
4902 complete(&adapter->stats_done); in ibmvnic_handle_crq()
4903 if (test_bit(0, &adapter->resetting)) in ibmvnic_handle_crq()
4904 adapter->force_reset_recovery = true; in ibmvnic_handle_crq()
4906 dev_info(dev, "Migrated, re-enabling adapter\n"); in ibmvnic_handle_crq()
4907 ibmvnic_reset(adapter, VNIC_RESET_MOBILITY); in ibmvnic_handle_crq()
4910 adapter->failover_pending = true; in ibmvnic_handle_crq()
4912 /* The adapter lost the connection */ in ibmvnic_handle_crq()
4913 dev_err(dev, "Virtual Adapter failed (rc=%d)\n", in ibmvnic_handle_crq()
4915 ibmvnic_reset(adapter, VNIC_RESET_FATAL); in ibmvnic_handle_crq()
4937 send_query_cap(adapter); in ibmvnic_handle_crq()
4940 handle_query_cap_rsp(crq, adapter); in ibmvnic_handle_crq()
4943 handle_query_map_rsp(crq, adapter); in ibmvnic_handle_crq()
4946 adapter->fw_done_rc = crq->request_map_rsp.rc.code; in ibmvnic_handle_crq()
4947 complete(&adapter->fw_done); in ibmvnic_handle_crq()
4950 handle_request_unmap_rsp(crq, adapter); in ibmvnic_handle_crq()
4953 handle_request_cap_rsp(crq, adapter); in ibmvnic_handle_crq()
4957 handle_login_rsp(crq, adapter); in ibmvnic_handle_crq()
4964 adapter->logical_link_state = in ibmvnic_handle_crq()
4966 adapter->init_done_rc = crq->logical_link_state_rsp.rc.code; in ibmvnic_handle_crq()
4967 complete(&adapter->init_done); in ibmvnic_handle_crq()
4971 adapter->phys_link_state = in ibmvnic_handle_crq()
4973 adapter->logical_link_state = in ibmvnic_handle_crq()
4975 if (adapter->phys_link_state && adapter->logical_link_state) in ibmvnic_handle_crq()
4982 adapter->fw_done_rc = handle_change_mac_rsp(crq, adapter); in ibmvnic_handle_crq()
4986 handle_error_indication(crq, adapter); in ibmvnic_handle_crq()
4990 complete(&adapter->stats_done); in ibmvnic_handle_crq()
4994 handle_query_ip_offload_rsp(adapter); in ibmvnic_handle_crq()
5001 dma_unmap_single(dev, adapter->ip_offload_ctrl_tok, in ibmvnic_handle_crq()
5002 sizeof(adapter->ip_offload_ctrl), in ibmvnic_handle_crq()
5004 complete(&adapter->init_done); in ibmvnic_handle_crq()
5008 complete(&adapter->fw_done); in ibmvnic_handle_crq()
5011 handle_vpd_size_rsp(crq, adapter); in ibmvnic_handle_crq()
5014 handle_vpd_rsp(crq, adapter); in ibmvnic_handle_crq()
5017 adapter->fw_done_rc = handle_query_phys_parms_rsp(crq, adapter); in ibmvnic_handle_crq()
5018 complete(&adapter->fw_done); in ibmvnic_handle_crq()
5028 struct ibmvnic_adapter *adapter = instance; in ibmvnic_interrupt() local
5030 tasklet_schedule(&adapter->tasklet); in ibmvnic_interrupt()
5036 struct ibmvnic_adapter *adapter = from_tasklet(adapter, t, tasklet); in ibmvnic_tasklet() local
5037 struct ibmvnic_crq_queue *queue = &adapter->crq; in ibmvnic_tasklet()
5045 while ((crq = ibmvnic_next_crq(adapter)) != NULL) { in ibmvnic_tasklet()
5052 ibmvnic_handle_crq(crq, adapter); in ibmvnic_tasklet()
5059 if (atomic_read(&adapter->running_cap_crqs) != 0) in ibmvnic_tasklet()
5060 adapter->wait_capability = true; in ibmvnic_tasklet()
5064 static int ibmvnic_reenable_crq_queue(struct ibmvnic_adapter *adapter) in ibmvnic_reenable_crq_queue() argument
5066 struct vio_dev *vdev = adapter->vdev; in ibmvnic_reenable_crq_queue()
5074 dev_err(&vdev->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvnic_reenable_crq_queue()
5079 static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter) in ibmvnic_reset_crq() argument
5081 struct ibmvnic_crq_queue *crq = &adapter->crq; in ibmvnic_reset_crq()
5082 struct device *dev = &adapter->vdev->dev; in ibmvnic_reset_crq()
5083 struct vio_dev *vdev = adapter->vdev; in ibmvnic_reset_crq()
5104 /* Adapter is good, but other end is not ready */ in ibmvnic_reset_crq()
5105 dev_warn(dev, "Partner adapter not ready\n"); in ibmvnic_reset_crq()
5112 static void release_crq_queue(struct ibmvnic_adapter *adapter) in release_crq_queue() argument
5114 struct ibmvnic_crq_queue *crq = &adapter->crq; in release_crq_queue()
5115 struct vio_dev *vdev = adapter->vdev; in release_crq_queue()
5121 netdev_dbg(adapter->netdev, "Releasing CRQ\n"); in release_crq_queue()
5122 free_irq(vdev->irq, adapter); in release_crq_queue()
5123 tasklet_kill(&adapter->tasklet); in release_crq_queue()
5135 static int init_crq_queue(struct ibmvnic_adapter *adapter) in init_crq_queue() argument
5137 struct ibmvnic_crq_queue *crq = &adapter->crq; in init_crq_queue()
5138 struct device *dev = &adapter->vdev->dev; in init_crq_queue()
5139 struct vio_dev *vdev = adapter->vdev; in init_crq_queue()
5162 rc = ibmvnic_reset_crq(adapter); in init_crq_queue()
5166 dev_warn(dev, "Partner adapter not ready\n"); in init_crq_queue()
5168 dev_warn(dev, "Error %d opening adapter\n", rc); in init_crq_queue()
5174 tasklet_setup(&adapter->tasklet, (void *)ibmvnic_tasklet); in init_crq_queue()
5176 netdev_dbg(adapter->netdev, "registering irq 0x%x\n", vdev->irq); in init_crq_queue()
5178 adapter->vdev->unit_address); in init_crq_queue()
5179 rc = request_irq(vdev->irq, ibmvnic_interrupt, 0, crq->name, adapter); in init_crq_queue()
5196 tasklet_schedule(&adapter->tasklet); in init_crq_queue()
5201 tasklet_kill(&adapter->tasklet); in init_crq_queue()
5213 static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset) in ibmvnic_reset_init() argument
5215 struct device *dev = &adapter->vdev->dev; in ibmvnic_reset_init()
5217 u64 old_num_rx_queues = adapter->req_rx_queues; in ibmvnic_reset_init()
5218 u64 old_num_tx_queues = adapter->req_tx_queues; in ibmvnic_reset_init()
5221 adapter->from_passive_init = false; in ibmvnic_reset_init()
5224 reinit_completion(&adapter->init_done); in ibmvnic_reset_init()
5226 adapter->init_done_rc = 0; in ibmvnic_reset_init()
5227 rc = ibmvnic_send_crq_init(adapter); in ibmvnic_reset_init()
5233 if (!wait_for_completion_timeout(&adapter->init_done, timeout)) { in ibmvnic_reset_init()
5238 if (adapter->init_done_rc) { in ibmvnic_reset_init()
5239 release_crq_queue(adapter); in ibmvnic_reset_init()
5240 return adapter->init_done_rc; in ibmvnic_reset_init()
5243 if (adapter->from_passive_init) { in ibmvnic_reset_init()
5244 adapter->state = VNIC_OPEN; in ibmvnic_reset_init()
5245 adapter->from_passive_init = false; in ibmvnic_reset_init()
5250 test_bit(0, &adapter->resetting) && !adapter->wait_for_reset && in ibmvnic_reset_init()
5251 adapter->reset_reason != VNIC_RESET_MOBILITY) { in ibmvnic_reset_init()
5252 if (adapter->req_rx_queues != old_num_rx_queues || in ibmvnic_reset_init()
5253 adapter->req_tx_queues != old_num_tx_queues) { in ibmvnic_reset_init()
5254 release_sub_crqs(adapter, 0); in ibmvnic_reset_init()
5255 rc = init_sub_crqs(adapter); in ibmvnic_reset_init()
5264 clean_tx_pools(adapter); in ibmvnic_reset_init()
5266 rc = reset_sub_crq_queues(adapter); in ibmvnic_reset_init()
5269 rc = init_sub_crqs(adapter); in ibmvnic_reset_init()
5274 release_crq_queue(adapter); in ibmvnic_reset_init()
5278 rc = init_sub_crq_irqs(adapter); in ibmvnic_reset_init()
5281 release_crq_queue(adapter); in ibmvnic_reset_init()
5291 struct ibmvnic_adapter *adapter; in ibmvnic_probe() local
5313 adapter = netdev_priv(netdev); in ibmvnic_probe()
5314 adapter->state = VNIC_PROBING; in ibmvnic_probe()
5316 adapter->vdev = dev; in ibmvnic_probe()
5317 adapter->netdev = netdev; in ibmvnic_probe()
5318 adapter->login_pending = false; in ibmvnic_probe()
5320 ether_addr_copy(adapter->mac_addr, mac_addr_p); in ibmvnic_probe()
5321 ether_addr_copy(netdev->dev_addr, adapter->mac_addr); in ibmvnic_probe()
5327 spin_lock_init(&adapter->stats_lock); in ibmvnic_probe()
5329 INIT_WORK(&adapter->ibmvnic_reset, __ibmvnic_reset); in ibmvnic_probe()
5330 INIT_DELAYED_WORK(&adapter->ibmvnic_delayed_reset, in ibmvnic_probe()
5332 INIT_LIST_HEAD(&adapter->rwi_list); in ibmvnic_probe()
5333 spin_lock_init(&adapter->rwi_lock); in ibmvnic_probe()
5334 spin_lock_init(&adapter->state_lock); in ibmvnic_probe()
5335 mutex_init(&adapter->fw_lock); in ibmvnic_probe()
5336 init_completion(&adapter->init_done); in ibmvnic_probe()
5337 init_completion(&adapter->fw_done); in ibmvnic_probe()
5338 init_completion(&adapter->reset_done); in ibmvnic_probe()
5339 init_completion(&adapter->stats_done); in ibmvnic_probe()
5340 clear_bit(0, &adapter->resetting); in ibmvnic_probe()
5343 rc = init_crq_queue(adapter); in ibmvnic_probe()
5350 rc = ibmvnic_reset_init(adapter, false); in ibmvnic_probe()
5355 rc = init_stats_buffers(adapter); in ibmvnic_probe()
5359 rc = init_stats_token(adapter); in ibmvnic_probe()
5363 netdev->mtu = adapter->req_mtu - ETH_HLEN; in ibmvnic_probe()
5364 netdev->min_mtu = adapter->min_mtu - ETH_HLEN; in ibmvnic_probe()
5365 netdev->max_mtu = adapter->max_mtu - ETH_HLEN; in ibmvnic_probe()
5373 adapter->state = VNIC_PROBED; in ibmvnic_probe()
5375 adapter->wait_for_reset = false; in ibmvnic_probe()
5376 adapter->last_reset_time = jiffies; in ibmvnic_probe()
5391 release_stats_token(adapter); in ibmvnic_probe()
5394 release_stats_buffers(adapter); in ibmvnic_probe()
5397 release_sub_crqs(adapter, 1); in ibmvnic_probe()
5398 release_crq_queue(adapter); in ibmvnic_probe()
5399 mutex_destroy(&adapter->fw_lock); in ibmvnic_probe()
5408 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_remove() local
5411 spin_lock_irqsave(&adapter->state_lock, flags); in ibmvnic_remove()
5420 spin_lock(&adapter->rwi_lock); in ibmvnic_remove()
5421 adapter->state = VNIC_REMOVING; in ibmvnic_remove()
5422 spin_unlock(&adapter->rwi_lock); in ibmvnic_remove()
5424 spin_unlock_irqrestore(&adapter->state_lock, flags); in ibmvnic_remove()
5426 flush_work(&adapter->ibmvnic_reset); in ibmvnic_remove()
5427 flush_delayed_work(&adapter->ibmvnic_delayed_reset); in ibmvnic_remove()
5432 release_resources(adapter); in ibmvnic_remove()
5433 release_sub_crqs(adapter, 1); in ibmvnic_remove()
5434 release_crq_queue(adapter); in ibmvnic_remove()
5436 release_stats_token(adapter); in ibmvnic_remove()
5437 release_stats_buffers(adapter); in ibmvnic_remove()
5439 adapter->state = VNIC_REMOVED; in ibmvnic_remove()
5442 mutex_destroy(&adapter->fw_lock); in ibmvnic_remove()
5454 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in failover_store() local
5462 rc = plpar_hcall(H_VIOCTL, retbuf, adapter->vdev->unit_address, in failover_store()
5473 rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address, in failover_store()
5489 struct ibmvnic_adapter *adapter; in ibmvnic_get_desired_dma() local
5500 adapter = netdev_priv(netdev); in ibmvnic_get_desired_dma()
5505 for (i = 0; i < adapter->req_tx_queues + adapter->req_rx_queues; i++) in ibmvnic_get_desired_dma()
5508 for (i = 0; i < adapter->num_active_rx_pools; i++) in ibmvnic_get_desired_dma()
5509 ret += adapter->rx_pool[i].size * in ibmvnic_get_desired_dma()
5510 IOMMU_PAGE_ALIGN(adapter->rx_pool[i].buff_size, tbl); in ibmvnic_get_desired_dma()
5518 struct ibmvnic_adapter *adapter = netdev_priv(netdev); in ibmvnic_resume() local
5520 if (adapter->state != VNIC_OPEN) in ibmvnic_resume()
5523 tasklet_schedule(&adapter->tasklet); in ibmvnic_resume()