Lines Matching refs:adapter
128 static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q) in be_queue_free() argument
133 dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, in be_queue_free()
139 static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q, in be_queue_alloc() argument
148 mem->va = dma_zalloc_coherent(&adapter->pdev->dev, mem->size, &mem->dma, in be_queue_alloc()
155 static void be_reg_intr_set(struct be_adapter *adapter, bool enable) in be_reg_intr_set() argument
159 pci_read_config_dword(adapter->pdev, PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET, in be_reg_intr_set()
170 pci_write_config_dword(adapter->pdev, in be_reg_intr_set()
174 static void be_intr_set(struct be_adapter *adapter, bool enable) in be_intr_set() argument
179 if (lancer_chip(adapter)) in be_intr_set()
182 if (adapter->eeh_error) in be_intr_set()
185 status = be_cmd_intr_set(adapter, enable); in be_intr_set()
187 be_reg_intr_set(adapter, enable); in be_intr_set()
190 static void be_rxq_notify(struct be_adapter *adapter, u16 qid, u16 posted) in be_rxq_notify() argument
198 iowrite32(val, adapter->db + DB_RQ_OFFSET); in be_rxq_notify()
201 static void be_txq_notify(struct be_adapter *adapter, struct be_tx_obj *txo, in be_txq_notify() argument
210 iowrite32(val, adapter->db + txo->db_offset); in be_txq_notify()
213 static void be_eq_notify(struct be_adapter *adapter, u16 qid, in be_eq_notify() argument
221 if (adapter->eeh_error) in be_eq_notify()
230 iowrite32(val, adapter->db + DB_EQ_OFFSET); in be_eq_notify()
233 void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, u16 num_popped) in be_cq_notify() argument
241 if (adapter->eeh_error) in be_cq_notify()
247 iowrite32(val, adapter->db + DB_CQ_OFFSET); in be_cq_notify()
252 struct be_adapter *adapter = netdev_priv(netdev); in be_mac_addr_set() local
253 struct device *dev = &adapter->pdev->dev; in be_mac_addr_set()
257 u32 old_pmac_id = adapter->pmac_id[0], curr_pmac_id = 0; in be_mac_addr_set()
274 status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, in be_mac_addr_set()
275 adapter->if_handle, &adapter->pmac_id[0], 0); in be_mac_addr_set()
277 curr_pmac_id = adapter->pmac_id[0]; in be_mac_addr_set()
282 if (adapter->pmac_id[0] != old_pmac_id) in be_mac_addr_set()
283 be_cmd_pmac_del(adapter, adapter->if_handle, in be_mac_addr_set()
290 status = be_cmd_get_active_mac(adapter, curr_pmac_id, mac, in be_mac_addr_set()
291 adapter->if_handle, true, 0); in be_mac_addr_set()
312 static void *hw_stats_from_cmd(struct be_adapter *adapter) in hw_stats_from_cmd() argument
314 if (BE2_chip(adapter)) { in hw_stats_from_cmd()
315 struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
318 } else if (BE3_chip(adapter)) { in hw_stats_from_cmd()
319 struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
323 struct be_cmd_resp_get_stats_v2 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
330 static void *be_erx_stats_from_cmd(struct be_adapter *adapter) in be_erx_stats_from_cmd() argument
332 if (BE2_chip(adapter)) { in be_erx_stats_from_cmd()
333 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
336 } else if (BE3_chip(adapter)) { in be_erx_stats_from_cmd()
337 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
341 struct be_hw_stats_v2 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
347 static void populate_be_v0_stats(struct be_adapter *adapter) in populate_be_v0_stats() argument
349 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v0_stats()
353 &rxf_stats->port[adapter->port_num]; in populate_be_v0_stats()
354 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v0_stats()
383 if (adapter->port_num) in populate_be_v0_stats()
393 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v0_stats()
396 static void populate_be_v1_stats(struct be_adapter *adapter) in populate_be_v1_stats() argument
398 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v1_stats()
402 &rxf_stats->port[adapter->port_num]; in populate_be_v1_stats()
403 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v1_stats()
439 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v1_stats()
442 static void populate_be_v2_stats(struct be_adapter *adapter) in populate_be_v2_stats() argument
444 struct be_hw_stats_v2 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v2_stats()
448 &rxf_stats->port[adapter->port_num]; in populate_be_v2_stats()
449 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v2_stats()
485 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v2_stats()
486 if (be_roce_supported(adapter)) { in populate_be_v2_stats()
496 static void populate_lancer_stats(struct be_adapter *adapter) in populate_lancer_stats() argument
498 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_lancer_stats()
499 struct lancer_pport_stats *pport_stats = pport_stats_from_cmd(adapter); in populate_lancer_stats()
545 static void populate_erx_stats(struct be_adapter *adapter, in populate_erx_stats() argument
548 if (!BEx_chip(adapter)) in populate_erx_stats()
558 void be_parse_stats(struct be_adapter *adapter) in be_parse_stats() argument
560 struct be_erx_stats_v2 *erx = be_erx_stats_from_cmd(adapter); in be_parse_stats()
565 if (lancer_chip(adapter)) { in be_parse_stats()
566 populate_lancer_stats(adapter); in be_parse_stats()
568 if (BE2_chip(adapter)) in be_parse_stats()
569 populate_be_v0_stats(adapter); in be_parse_stats()
570 else if (BE3_chip(adapter)) in be_parse_stats()
572 populate_be_v1_stats(adapter); in be_parse_stats()
574 populate_be_v2_stats(adapter); in be_parse_stats()
577 for_all_rx_queues(adapter, rxo, i) { in be_parse_stats()
579 populate_erx_stats(adapter, rxo, erx_stat); in be_parse_stats()
587 struct be_adapter *adapter = netdev_priv(netdev); in be_get_stats64() local
588 struct be_drv_stats *drvs = &adapter->drv_stats; in be_get_stats64()
595 for_all_rx_queues(adapter, rxo, i) { in be_get_stats64()
610 for_all_tx_queues(adapter, txo, i) { in be_get_stats64()
652 void be_link_status_update(struct be_adapter *adapter, u8 link_status) in be_link_status_update() argument
654 struct net_device *netdev = adapter->netdev; in be_link_status_update()
656 if (!(adapter->flags & BE_FLAGS_LINK_STATUS_INIT)) { in be_link_status_update()
658 adapter->flags |= BE_FLAGS_LINK_STATUS_INIT; in be_link_status_update()
704 static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter, in be_get_tx_vlan_tag() argument
713 if (!(adapter->vlan_prio_bmap & (1 << vlan_prio))) in be_get_tx_vlan_tag()
715 adapter->recommended_prio; in be_get_tx_vlan_tag()
748 static void be_get_wrb_params_from_skb(struct be_adapter *adapter, in be_get_wrb_params_from_skb() argument
757 if (skb_is_gso_v6(skb) && !lancer_chip(adapter)) in be_get_wrb_params_from_skb()
774 wrb_params->vlan_tag = be_get_tx_vlan_tag(adapter, skb); in be_get_wrb_params_from_skb()
780 static void wrb_fill_hdr(struct be_adapter *adapter, in wrb_fill_hdr() argument
842 static void be_tx_setup_wrb_hdr(struct be_adapter *adapter, in be_tx_setup_wrb_hdr() argument
851 wrb_fill_hdr(adapter, hdr, wrb_params, skb); in be_tx_setup_wrb_hdr()
878 static void be_xmit_restore(struct be_adapter *adapter, in be_xmit_restore() argument
886 dev = &adapter->pdev->dev; in be_xmit_restore()
906 static u32 be_xmit_enqueue(struct be_adapter *adapter, struct be_tx_obj *txo, in be_xmit_enqueue() argument
911 struct device *dev = &adapter->pdev->dev; in be_xmit_enqueue()
942 be_tx_setup_wrb_hdr(adapter, txo, wrb_params, skb, head); in be_xmit_enqueue()
948 adapter->drv_stats.dma_map_errors++; in be_xmit_enqueue()
949 be_xmit_restore(adapter, txo, head, map_single, copied); in be_xmit_enqueue()
953 static inline int qnq_async_evt_rcvd(struct be_adapter *adapter) in qnq_async_evt_rcvd() argument
955 return adapter->flags & BE_FLAGS_QNQ_ASYNC_EVT_RCVD; in qnq_async_evt_rcvd()
958 static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, in be_insert_vlan_in_pkt() argument
970 vlan_tag = be_get_tx_vlan_tag(adapter, skb); in be_insert_vlan_in_pkt()
972 if (qnq_async_evt_rcvd(adapter) && adapter->pvid) { in be_insert_vlan_in_pkt()
974 vlan_tag = adapter->pvid; in be_insert_vlan_in_pkt()
990 if (adapter->qnq_vid) { in be_insert_vlan_in_pkt()
991 vlan_tag = adapter->qnq_vid; in be_insert_vlan_in_pkt()
1024 static int be_vlan_tag_tx_chk(struct be_adapter *adapter, struct sk_buff *skb) in be_vlan_tag_tx_chk() argument
1026 return skb_vlan_tag_present(skb) || adapter->pvid || adapter->qnq_vid; in be_vlan_tag_tx_chk()
1029 static int be_ipv6_tx_stall_chk(struct be_adapter *adapter, struct sk_buff *skb) in be_ipv6_tx_stall_chk() argument
1031 return BE3_chip(adapter) && be_ipv6_exthdr_check(skb); in be_ipv6_tx_stall_chk()
1034 static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, in be_lancer_xmit_workarounds() argument
1050 (lancer_chip(adapter) || skb_vlan_tag_present(skb)) && in be_lancer_xmit_workarounds()
1059 if (be_pvid_tagging_enabled(adapter) && in be_lancer_xmit_workarounds()
1069 skb = be_insert_vlan_in_pkt(adapter, skb, wrb_params); in be_lancer_xmit_workarounds()
1078 if (unlikely(be_ipv6_tx_stall_chk(adapter, skb) && in be_lancer_xmit_workarounds()
1079 (adapter->pvid || adapter->qnq_vid) && in be_lancer_xmit_workarounds()
1080 !qnq_async_evt_rcvd(adapter))) in be_lancer_xmit_workarounds()
1089 if (be_ipv6_tx_stall_chk(adapter, skb) && in be_lancer_xmit_workarounds()
1090 be_vlan_tag_tx_chk(adapter, skb)) { in be_lancer_xmit_workarounds()
1091 skb = be_insert_vlan_in_pkt(adapter, skb, wrb_params); in be_lancer_xmit_workarounds()
1103 static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, in be_xmit_workarounds() argument
1111 if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { in be_xmit_workarounds()
1116 if (BEx_chip(adapter) || lancer_chip(adapter)) { in be_xmit_workarounds()
1117 skb = be_lancer_xmit_workarounds(adapter, skb, wrb_params); in be_xmit_workarounds()
1125 static void be_xmit_flush(struct be_adapter *adapter, struct be_tx_obj *txo) in be_xmit_flush() argument
1135 if (!lancer_chip(adapter) && (txo->pend_wrb_cnt & 1)) { in be_xmit_flush()
1145 be_txq_notify(adapter, txo, txo->pend_wrb_cnt); in be_xmit_flush()
1151 struct be_adapter *adapter = netdev_priv(netdev); in be_xmit() local
1153 struct be_tx_obj *txo = &adapter->tx_obj[q_idx]; in be_xmit()
1158 skb = be_xmit_workarounds(adapter, skb, &wrb_params); in be_xmit()
1162 be_get_wrb_params_from_skb(adapter, skb, &wrb_params); in be_xmit()
1164 wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params); in be_xmit()
1176 be_xmit_flush(adapter, txo); in be_xmit()
1183 be_xmit_flush(adapter, txo); in be_xmit()
1190 struct be_adapter *adapter = netdev_priv(netdev); in be_change_mtu() local
1191 struct device *dev = &adapter->pdev->dev; in be_change_mtu()
1205 static inline bool be_in_all_promisc(struct be_adapter *adapter) in be_in_all_promisc() argument
1207 return (adapter->if_flags & BE_IF_FLAGS_ALL_PROMISCUOUS) == in be_in_all_promisc()
1211 static int be_set_vlan_promisc(struct be_adapter *adapter) in be_set_vlan_promisc() argument
1213 struct device *dev = &adapter->pdev->dev; in be_set_vlan_promisc()
1216 if (adapter->if_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS) in be_set_vlan_promisc()
1219 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS, ON); in be_set_vlan_promisc()
1222 adapter->if_flags |= BE_IF_FLAGS_VLAN_PROMISCUOUS; in be_set_vlan_promisc()
1229 static int be_clear_vlan_promisc(struct be_adapter *adapter) in be_clear_vlan_promisc() argument
1231 struct device *dev = &adapter->pdev->dev; in be_clear_vlan_promisc()
1234 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS, OFF); in be_clear_vlan_promisc()
1237 adapter->if_flags &= ~BE_IF_FLAGS_VLAN_PROMISCUOUS; in be_clear_vlan_promisc()
1246 static int be_vid_config(struct be_adapter *adapter) in be_vid_config() argument
1248 struct device *dev = &adapter->pdev->dev; in be_vid_config()
1254 if (be_in_all_promisc(adapter)) in be_vid_config()
1257 if (adapter->vlans_added > be_max_vlans(adapter)) in be_vid_config()
1258 return be_set_vlan_promisc(adapter); in be_vid_config()
1261 for_each_set_bit(i, adapter->vids, VLAN_N_VID) in be_vid_config()
1264 status = be_cmd_vlan_config(adapter, adapter->if_handle, vids, num, 0); in be_vid_config()
1270 return be_set_vlan_promisc(adapter); in be_vid_config()
1271 } else if (adapter->if_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS) { in be_vid_config()
1272 status = be_clear_vlan_promisc(adapter); in be_vid_config()
1279 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_add_vid() local
1283 if (lancer_chip(adapter) && vid == 0) in be_vlan_add_vid()
1286 if (test_bit(vid, adapter->vids)) in be_vlan_add_vid()
1289 set_bit(vid, adapter->vids); in be_vlan_add_vid()
1290 adapter->vlans_added++; in be_vlan_add_vid()
1292 status = be_vid_config(adapter); in be_vlan_add_vid()
1294 adapter->vlans_added--; in be_vlan_add_vid()
1295 clear_bit(vid, adapter->vids); in be_vlan_add_vid()
1303 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_rem_vid() local
1306 if (lancer_chip(adapter) && vid == 0) in be_vlan_rem_vid()
1309 clear_bit(vid, adapter->vids); in be_vlan_rem_vid()
1310 adapter->vlans_added--; in be_vlan_rem_vid()
1312 return be_vid_config(adapter); in be_vlan_rem_vid()
1315 static void be_clear_all_promisc(struct be_adapter *adapter) in be_clear_all_promisc() argument
1317 be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, OFF); in be_clear_all_promisc()
1318 adapter->if_flags &= ~BE_IF_FLAGS_ALL_PROMISCUOUS; in be_clear_all_promisc()
1321 static void be_set_all_promisc(struct be_adapter *adapter) in be_set_all_promisc() argument
1323 be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, ON); in be_set_all_promisc()
1324 adapter->if_flags |= BE_IF_FLAGS_ALL_PROMISCUOUS; in be_set_all_promisc()
1327 static void be_set_mc_promisc(struct be_adapter *adapter) in be_set_mc_promisc() argument
1331 if (adapter->if_flags & BE_IF_FLAGS_MCAST_PROMISCUOUS) in be_set_mc_promisc()
1334 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MCAST_PROMISCUOUS, ON); in be_set_mc_promisc()
1336 adapter->if_flags |= BE_IF_FLAGS_MCAST_PROMISCUOUS; in be_set_mc_promisc()
1339 static void be_set_mc_list(struct be_adapter *adapter) in be_set_mc_list() argument
1343 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MULTICAST, ON); in be_set_mc_list()
1345 adapter->if_flags &= ~BE_IF_FLAGS_MCAST_PROMISCUOUS; in be_set_mc_list()
1347 be_set_mc_promisc(adapter); in be_set_mc_list()
1350 static void be_set_uc_list(struct be_adapter *adapter) in be_set_uc_list() argument
1355 for (; adapter->uc_macs > 0; adapter->uc_macs--, i++) in be_set_uc_list()
1356 be_cmd_pmac_del(adapter, adapter->if_handle, in be_set_uc_list()
1357 adapter->pmac_id[i], 0); in be_set_uc_list()
1359 if (netdev_uc_count(adapter->netdev) > be_max_uc(adapter)) { in be_set_uc_list()
1360 be_set_all_promisc(adapter); in be_set_uc_list()
1364 netdev_for_each_uc_addr(ha, adapter->netdev) { in be_set_uc_list()
1365 adapter->uc_macs++; /* First slot is for Primary MAC */ in be_set_uc_list()
1366 be_cmd_pmac_add(adapter, (u8 *)ha->addr, adapter->if_handle, in be_set_uc_list()
1367 &adapter->pmac_id[adapter->uc_macs], 0); in be_set_uc_list()
1371 static void be_clear_uc_list(struct be_adapter *adapter) in be_clear_uc_list() argument
1375 for (i = 1; i < (adapter->uc_macs + 1); i++) in be_clear_uc_list()
1376 be_cmd_pmac_del(adapter, adapter->if_handle, in be_clear_uc_list()
1377 adapter->pmac_id[i], 0); in be_clear_uc_list()
1378 adapter->uc_macs = 0; in be_clear_uc_list()
1383 struct be_adapter *adapter = netdev_priv(netdev); in be_set_rx_mode() local
1386 be_set_all_promisc(adapter); in be_set_rx_mode()
1391 if (be_in_all_promisc(adapter)) { in be_set_rx_mode()
1392 be_clear_all_promisc(adapter); in be_set_rx_mode()
1393 if (adapter->vlans_added) in be_set_rx_mode()
1394 be_vid_config(adapter); in be_set_rx_mode()
1399 netdev_mc_count(netdev) > be_max_mc(adapter)) { in be_set_rx_mode()
1400 be_set_mc_promisc(adapter); in be_set_rx_mode()
1404 if (netdev_uc_count(netdev) != adapter->uc_macs) in be_set_rx_mode()
1405 be_set_uc_list(adapter); in be_set_rx_mode()
1407 be_set_mc_list(adapter); in be_set_rx_mode()
1412 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_mac() local
1413 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_mac()
1416 if (!sriov_enabled(adapter)) in be_set_vf_mac()
1419 if (!is_valid_ether_addr(mac) || vf >= adapter->num_vfs) in be_set_vf_mac()
1428 if (BEx_chip(adapter)) { in be_set_vf_mac()
1429 be_cmd_pmac_del(adapter, vf_cfg->if_handle, vf_cfg->pmac_id, in be_set_vf_mac()
1432 status = be_cmd_pmac_add(adapter, mac, vf_cfg->if_handle, in be_set_vf_mac()
1435 status = be_cmd_set_mac(adapter, mac, vf_cfg->if_handle, in be_set_vf_mac()
1440 dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed: %#x", in be_set_vf_mac()
1453 struct be_adapter *adapter = netdev_priv(netdev); in be_get_vf_config() local
1454 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_get_vf_config()
1456 if (!sriov_enabled(adapter)) in be_get_vf_config()
1459 if (vf >= adapter->num_vfs) in be_get_vf_config()
1468 vi->linkstate = adapter->vf_cfg[vf].plink_tracking; in be_get_vf_config()
1473 static int be_set_vf_tvt(struct be_adapter *adapter, int vf, u16 vlan) in be_set_vf_tvt() argument
1475 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_tvt()
1481 status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, vf_if_id, 0); in be_set_vf_tvt()
1487 status = be_cmd_vlan_config(adapter, vf_if_id, vids, 1, vf + 1); in be_set_vf_tvt()
1489 dev_info(&adapter->pdev->dev, in be_set_vf_tvt()
1494 status = be_cmd_set_fn_privileges(adapter, vf_cfg->privileges & in be_set_vf_tvt()
1502 static int be_clear_vf_tvt(struct be_adapter *adapter, int vf) in be_clear_vf_tvt() argument
1504 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_clear_vf_tvt()
1505 struct device *dev = &adapter->pdev->dev; in be_clear_vf_tvt()
1509 status = be_cmd_set_hsw_config(adapter, BE_RESET_VLAN_TAG_ID, vf + 1, in be_clear_vf_tvt()
1516 status = be_cmd_set_fn_privileges(adapter, vf_cfg->privileges | in be_clear_vf_tvt()
1531 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_vlan() local
1532 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_vlan()
1535 if (!sriov_enabled(adapter)) in be_set_vf_vlan()
1538 if (vf >= adapter->num_vfs || vlan > 4095 || qos > 7) in be_set_vf_vlan()
1543 status = be_set_vf_tvt(adapter, vf, vlan); in be_set_vf_vlan()
1545 status = be_clear_vf_tvt(adapter, vf); in be_set_vf_vlan()
1549 dev_err(&adapter->pdev->dev, in be_set_vf_vlan()
1562 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_tx_rate() local
1563 struct device *dev = &adapter->pdev->dev; in be_set_vf_tx_rate()
1568 if (!sriov_enabled(adapter)) in be_set_vf_tx_rate()
1571 if (vf >= adapter->num_vfs) in be_set_vf_tx_rate()
1580 status = be_cmd_link_status_query(adapter, &link_speed, in be_set_vf_tx_rate()
1600 if (skyhawk_chip(adapter) && (max_tx_rate % percent_rate)) { in be_set_vf_tx_rate()
1608 status = be_cmd_config_qos(adapter, max_tx_rate, link_speed, vf + 1); in be_set_vf_tx_rate()
1612 adapter->vf_cfg[vf].tx_rate = max_tx_rate; in be_set_vf_tx_rate()
1624 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_link_state() local
1627 if (!sriov_enabled(adapter)) in be_set_vf_link_state()
1630 if (vf >= adapter->num_vfs) in be_set_vf_link_state()
1633 status = be_cmd_set_logical_link_config(adapter, link_state, vf+1); in be_set_vf_link_state()
1635 dev_err(&adapter->pdev->dev, in be_set_vf_link_state()
1640 adapter->vf_cfg[vf].plink_tracking = link_state; in be_set_vf_link_state()
1653 static void be_eqd_update(struct be_adapter *adapter) in be_eqd_update() argument
1665 for_all_evt_queues(adapter, eqo, i) { in be_eqd_update()
1666 aic = &adapter->aic_obj[eqo->idx]; in be_eqd_update()
1674 rxo = &adapter->rx_obj[eqo->idx]; in be_eqd_update()
1680 txo = &adapter->tx_obj[eqo->idx]; in be_eqd_update()
1716 be_cmd_modify_eqd(adapter, set_eqd, num); in be_eqd_update()
1746 struct be_adapter *adapter = rxo->adapter; in get_rx_page_info() local
1755 dma_unmap_page(&adapter->pdev->dev, in get_rx_page_info()
1757 adapter->big_page_size, DMA_FROM_DEVICE); in get_rx_page_info()
1760 dma_sync_single_for_cpu(&adapter->pdev->dev, in get_rx_page_info()
1863 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_process() local
1864 struct net_device *netdev = adapter->netdev; in be_rx_compl_process()
1882 skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]); in be_rx_compl_process()
1900 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_process_gro() local
1940 skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]); in be_rx_compl_process_gro()
1941 if (adapter->netdev->features & NETIF_F_RXHASH) in be_rx_compl_process_gro()
2002 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_get() local
2012 if (adapter->be3_native) in be_rx_compl_get()
2025 if (be_is_qnq_mode(adapter) && !rxcp->qnq) in be_rx_compl_get()
2028 if (!lancer_chip(adapter)) in be_rx_compl_get()
2031 if (adapter->pvid == (rxcp->vlan_tag & VLAN_VID_MASK) && in be_rx_compl_get()
2032 !test_bit(rxcp->vlan_tag, adapter->vids)) in be_rx_compl_get()
2058 struct be_adapter *adapter = rxo->adapter; in be_post_rx_frags() local
2062 struct device *dev = &adapter->pdev->dev; in be_post_rx_frags()
2070 pagep = be_alloc_pages(adapter->big_page_size, gfp); in be_post_rx_frags()
2076 adapter->big_page_size, in be_post_rx_frags()
2081 adapter->drv_stats.dma_map_errors++; in be_post_rx_frags()
2099 adapter->big_page_size) { in be_post_rx_frags()
2126 be_rxq_notify(adapter, rxq->id, notify); in be_post_rx_frags()
2156 static u16 be_tx_compl_process(struct be_adapter *adapter, in be_tx_compl_process() argument
2179 unmap_tx_frag(&adapter->pdev->dev, wrb, in be_tx_compl_process()
2215 be_eq_notify(eqo->adapter, eqo->q.id, false, true, num); in be_eq_clean()
2224 struct be_adapter *adapter = rxo->adapter; in be_rx_cq_clean() local
2236 if (lancer_chip(adapter)) in be_rx_cq_clean()
2239 if (flush_wait++ > 10 || be_hw_error(adapter)) { in be_rx_cq_clean()
2240 dev_warn(&adapter->pdev->dev, in be_rx_cq_clean()
2244 be_cq_notify(adapter, rx_cq->id, true, 0); in be_rx_cq_clean()
2248 be_cq_notify(adapter, rx_cq->id, false, 1); in be_rx_cq_clean()
2255 be_cq_notify(adapter, rx_cq->id, false, 0); in be_rx_cq_clean()
2268 static void be_tx_compl_clean(struct be_adapter *adapter) in be_tx_compl_clean() argument
2271 struct device *dev = &adapter->pdev->dev; in be_tx_compl_clean()
2279 pending_txqs = adapter->num_tx_qs; in be_tx_compl_clean()
2281 for_all_tx_queues(adapter, txo, i) { in be_tx_compl_clean()
2287 be_tx_compl_process(adapter, txo, in be_tx_compl_clean()
2292 be_cq_notify(adapter, txo->cq.id, false, cmpl); in be_tx_compl_clean()
2300 if (pending_txqs == 0 || ++timeo > 10 || be_hw_error(adapter)) in be_tx_compl_clean()
2307 for_all_tx_queues(adapter, txo, i) { in be_tx_compl_clean()
2320 num_wrbs = be_tx_compl_process(adapter, txo, end_idx); in be_tx_compl_clean()
2333 static void be_evt_queues_destroy(struct be_adapter *adapter) in be_evt_queues_destroy() argument
2338 for_all_evt_queues(adapter, eqo, i) { in be_evt_queues_destroy()
2341 be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ); in be_evt_queues_destroy()
2346 be_queue_free(adapter, &eqo->q); in be_evt_queues_destroy()
2350 static int be_evt_queues_create(struct be_adapter *adapter) in be_evt_queues_create() argument
2357 adapter->num_evt_qs = min_t(u16, num_irqs(adapter), in be_evt_queues_create()
2358 adapter->cfg_num_qs); in be_evt_queues_create()
2360 for_all_evt_queues(adapter, eqo, i) { in be_evt_queues_create()
2361 int numa_node = dev_to_node(&adapter->pdev->dev); in be_evt_queues_create()
2366 netif_napi_add(adapter->netdev, &eqo->napi, be_poll, in be_evt_queues_create()
2369 aic = &adapter->aic_obj[i]; in be_evt_queues_create()
2370 eqo->adapter = adapter; in be_evt_queues_create()
2376 rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN, in be_evt_queues_create()
2381 rc = be_cmd_eq_create(adapter, eqo); in be_evt_queues_create()
2388 static void be_mcc_queues_destroy(struct be_adapter *adapter) in be_mcc_queues_destroy() argument
2392 q = &adapter->mcc_obj.q; in be_mcc_queues_destroy()
2394 be_cmd_q_destroy(adapter, q, QTYPE_MCCQ); in be_mcc_queues_destroy()
2395 be_queue_free(adapter, q); in be_mcc_queues_destroy()
2397 q = &adapter->mcc_obj.cq; in be_mcc_queues_destroy()
2399 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_mcc_queues_destroy()
2400 be_queue_free(adapter, q); in be_mcc_queues_destroy()
2404 static int be_mcc_queues_create(struct be_adapter *adapter) in be_mcc_queues_create() argument
2408 cq = &adapter->mcc_obj.cq; in be_mcc_queues_create()
2409 if (be_queue_alloc(adapter, cq, MCC_CQ_LEN, in be_mcc_queues_create()
2414 if (be_cmd_cq_create(adapter, cq, &mcc_eqo(adapter)->q, true, 0)) in be_mcc_queues_create()
2417 q = &adapter->mcc_obj.q; in be_mcc_queues_create()
2418 if (be_queue_alloc(adapter, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb))) in be_mcc_queues_create()
2421 if (be_cmd_mccq_create(adapter, q, cq)) in be_mcc_queues_create()
2427 be_queue_free(adapter, q); in be_mcc_queues_create()
2429 be_cmd_q_destroy(adapter, cq, QTYPE_CQ); in be_mcc_queues_create()
2431 be_queue_free(adapter, cq); in be_mcc_queues_create()
2436 static void be_tx_queues_destroy(struct be_adapter *adapter) in be_tx_queues_destroy() argument
2442 for_all_tx_queues(adapter, txo, i) { in be_tx_queues_destroy()
2445 be_cmd_q_destroy(adapter, q, QTYPE_TXQ); in be_tx_queues_destroy()
2446 be_queue_free(adapter, q); in be_tx_queues_destroy()
2450 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_tx_queues_destroy()
2451 be_queue_free(adapter, q); in be_tx_queues_destroy()
2455 static int be_tx_qs_create(struct be_adapter *adapter) in be_tx_qs_create() argument
2462 adapter->num_tx_qs = min(adapter->num_evt_qs, be_max_txqs(adapter)); in be_tx_qs_create()
2464 for_all_tx_queues(adapter, txo, i) { in be_tx_qs_create()
2466 status = be_queue_alloc(adapter, cq, TX_CQ_LEN, in be_tx_qs_create()
2477 eqo = &adapter->eq_obj[i % adapter->num_evt_qs]; in be_tx_qs_create()
2478 status = be_cmd_cq_create(adapter, cq, &eqo->q, false, 3); in be_tx_qs_create()
2482 status = be_queue_alloc(adapter, &txo->q, TX_Q_LEN, in be_tx_qs_create()
2487 status = be_cmd_txq_create(adapter, txo); in be_tx_qs_create()
2491 netif_set_xps_queue(adapter->netdev, eqo->affinity_mask, in be_tx_qs_create()
2495 dev_info(&adapter->pdev->dev, "created %d TX queue(s)\n", in be_tx_qs_create()
2496 adapter->num_tx_qs); in be_tx_qs_create()
2500 static void be_rx_cqs_destroy(struct be_adapter *adapter) in be_rx_cqs_destroy() argument
2506 for_all_rx_queues(adapter, rxo, i) { in be_rx_cqs_destroy()
2509 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_rx_cqs_destroy()
2510 be_queue_free(adapter, q); in be_rx_cqs_destroy()
2514 static int be_rx_cqs_create(struct be_adapter *adapter) in be_rx_cqs_create() argument
2521 adapter->num_rss_qs = adapter->num_evt_qs; in be_rx_cqs_create()
2524 if (adapter->num_rss_qs <= 1) in be_rx_cqs_create()
2525 adapter->num_rss_qs = 0; in be_rx_cqs_create()
2527 adapter->num_rx_qs = adapter->num_rss_qs + adapter->need_def_rxq; in be_rx_cqs_create()
2532 if (adapter->num_rx_qs == 0) in be_rx_cqs_create()
2533 adapter->num_rx_qs = 1; in be_rx_cqs_create()
2535 adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE; in be_rx_cqs_create()
2536 for_all_rx_queues(adapter, rxo, i) { in be_rx_cqs_create()
2537 rxo->adapter = adapter; in be_rx_cqs_create()
2539 rc = be_queue_alloc(adapter, cq, RX_CQ_LEN, in be_rx_cqs_create()
2545 eq = &adapter->eq_obj[i % adapter->num_evt_qs].q; in be_rx_cqs_create()
2546 rc = be_cmd_cq_create(adapter, cq, eq, false, 3); in be_rx_cqs_create()
2551 dev_info(&adapter->pdev->dev, in be_rx_cqs_create()
2552 "created %d RX queue(s)\n", adapter->num_rx_qs); in be_rx_cqs_create()
2559 struct be_adapter *adapter = eqo->adapter; in be_intx() local
2576 be_eq_notify(adapter, eqo->q.id, false, true, num_evts); in be_intx()
2592 be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0); in be_msix()
2605 struct be_adapter *adapter = rxo->adapter; in be_process_rx() local
2629 if (unlikely(rxcp->port != adapter->port_num && in be_process_rx()
2630 !lancer_chip(adapter))) { in be_process_rx()
2647 be_cq_notify(adapter, rx_cq->id, true, work_done); in be_process_rx()
2699 static void be_process_tx(struct be_adapter *adapter, struct be_tx_obj *txo, in be_process_tx() argument
2706 num_wrbs += be_tx_compl_process(adapter, txo, txcp->end_index); in be_process_tx()
2710 if (lancer_chip(adapter)) in be_process_tx()
2718 be_cq_notify(adapter, txo->cq.id, true, work_done); in be_process_tx()
2723 if (__netif_subqueue_stopped(adapter->netdev, idx) && in be_process_tx()
2725 netif_wake_subqueue(adapter->netdev, idx); in be_process_tx()
2837 struct be_adapter *adapter = eqo->adapter; in be_poll() local
2844 for_all_tx_queues_on_eq(adapter, eqo, txo, i) in be_poll()
2845 be_process_tx(adapter, txo, i); in be_poll()
2852 for_all_rx_queues_on_eq(adapter, eqo, rxo, i) { in be_poll()
2862 be_process_mcc(adapter); in be_poll()
2866 be_eq_notify(adapter, eqo->q.id, true, false, num_evts); in be_poll()
2869 be_eq_notify(adapter, eqo->q.id, false, false, num_evts); in be_poll()
2878 struct be_adapter *adapter = eqo->adapter; in be_busy_poll() local
2885 for_all_rx_queues_on_eq(adapter, eqo, rxo, i) { in be_busy_poll()
2896 void be_detect_error(struct be_adapter *adapter) in be_detect_error() argument
2902 struct device *dev = &adapter->pdev->dev; in be_detect_error()
2903 struct net_device *netdev = adapter->netdev; in be_detect_error()
2905 if (be_hw_error(adapter)) in be_detect_error()
2908 if (lancer_chip(adapter)) { in be_detect_error()
2909 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in be_detect_error()
2911 sliport_err1 = ioread32(adapter->db + in be_detect_error()
2913 sliport_err2 = ioread32(adapter->db + in be_detect_error()
2915 adapter->hw_error = true; in be_detect_error()
2932 ue_lo = ioread32(adapter->pcicfg + PCICFG_UE_STATUS_LOW); in be_detect_error()
2933 ue_hi = ioread32(adapter->pcicfg + PCICFG_UE_STATUS_HIGH); in be_detect_error()
2934 ue_lo_mask = ioread32(adapter->pcicfg + in be_detect_error()
2936 ue_hi_mask = ioread32(adapter->pcicfg + in be_detect_error()
2952 if (skyhawk_chip(adapter)) in be_detect_error()
2953 adapter->hw_error = true; in be_detect_error()
2970 static void be_msix_disable(struct be_adapter *adapter) in be_msix_disable() argument
2972 if (msix_enabled(adapter)) { in be_msix_disable()
2973 pci_disable_msix(adapter->pdev); in be_msix_disable()
2974 adapter->num_msix_vec = 0; in be_msix_disable()
2975 adapter->num_msix_roce_vec = 0; in be_msix_disable()
2979 static int be_msix_enable(struct be_adapter *adapter) in be_msix_enable() argument
2982 struct device *dev = &adapter->pdev->dev; in be_msix_enable()
2988 if (be_roce_supported(adapter)) in be_msix_enable()
2989 num_vec = min_t(int, 2 * be_max_eqs(adapter), in be_msix_enable()
2992 num_vec = adapter->cfg_num_qs; in be_msix_enable()
2995 adapter->msix_entries[i].entry = i; in be_msix_enable()
2997 num_vec = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, in be_msix_enable()
3002 if (be_roce_supported(adapter) && num_vec > MIN_MSIX_VECTORS) { in be_msix_enable()
3003 adapter->num_msix_roce_vec = num_vec / 2; in be_msix_enable()
3005 adapter->num_msix_roce_vec); in be_msix_enable()
3008 adapter->num_msix_vec = num_vec - adapter->num_msix_roce_vec; in be_msix_enable()
3011 adapter->num_msix_vec); in be_msix_enable()
3018 if (!be_physfn(adapter)) in be_msix_enable()
3023 static inline int be_msix_vec_get(struct be_adapter *adapter, in be_msix_vec_get() argument
3026 return adapter->msix_entries[eqo->msix_idx].vector; in be_msix_vec_get()
3029 static int be_msix_register(struct be_adapter *adapter) in be_msix_register() argument
3031 struct net_device *netdev = adapter->netdev; in be_msix_register()
3035 for_all_evt_queues(adapter, eqo, i) { in be_msix_register()
3037 vec = be_msix_vec_get(adapter, eqo); in be_msix_register()
3047 for (i--, eqo = &adapter->eq_obj[i]; i >= 0; i--, eqo--) in be_msix_register()
3048 free_irq(be_msix_vec_get(adapter, eqo), eqo); in be_msix_register()
3049 dev_warn(&adapter->pdev->dev, "MSIX Request IRQ failed - err %d\n", in be_msix_register()
3051 be_msix_disable(adapter); in be_msix_register()
3055 static int be_irq_register(struct be_adapter *adapter) in be_irq_register() argument
3057 struct net_device *netdev = adapter->netdev; in be_irq_register()
3060 if (msix_enabled(adapter)) { in be_irq_register()
3061 status = be_msix_register(adapter); in be_irq_register()
3065 if (!be_physfn(adapter)) in be_irq_register()
3070 netdev->irq = adapter->pdev->irq; in be_irq_register()
3072 &adapter->eq_obj[0]); in be_irq_register()
3074 dev_err(&adapter->pdev->dev, in be_irq_register()
3079 adapter->isr_registered = true; in be_irq_register()
3083 static void be_irq_unregister(struct be_adapter *adapter) in be_irq_unregister() argument
3085 struct net_device *netdev = adapter->netdev; in be_irq_unregister()
3089 if (!adapter->isr_registered) in be_irq_unregister()
3093 if (!msix_enabled(adapter)) { in be_irq_unregister()
3094 free_irq(netdev->irq, &adapter->eq_obj[0]); in be_irq_unregister()
3099 for_all_evt_queues(adapter, eqo, i) { in be_irq_unregister()
3100 vec = be_msix_vec_get(adapter, eqo); in be_irq_unregister()
3106 adapter->isr_registered = false; in be_irq_unregister()
3109 static void be_rx_qs_destroy(struct be_adapter *adapter) in be_rx_qs_destroy() argument
3115 for_all_rx_queues(adapter, rxo, i) { in be_rx_qs_destroy()
3118 be_cmd_rxq_destroy(adapter, q); in be_rx_qs_destroy()
3121 be_queue_free(adapter, q); in be_rx_qs_destroy()
3127 struct be_adapter *adapter = netdev_priv(netdev); in be_close() local
3134 if (!(adapter->flags & BE_FLAGS_SETUP_DONE)) in be_close()
3137 be_roce_dev_close(adapter); in be_close()
3139 if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { in be_close()
3140 for_all_evt_queues(adapter, eqo, i) { in be_close()
3144 adapter->flags &= ~BE_FLAGS_NAPI_ENABLED; in be_close()
3147 be_async_mcc_disable(adapter); in be_close()
3153 be_tx_compl_clean(adapter); in be_close()
3155 be_rx_qs_destroy(adapter); in be_close()
3156 be_clear_uc_list(adapter); in be_close()
3158 for_all_evt_queues(adapter, eqo, i) { in be_close()
3159 if (msix_enabled(adapter)) in be_close()
3160 synchronize_irq(be_msix_vec_get(adapter, eqo)); in be_close()
3166 be_irq_unregister(adapter); in be_close()
3171 static int be_rx_qs_create(struct be_adapter *adapter) in be_rx_qs_create() argument
3173 struct rss_info *rss = &adapter->rss_info; in be_rx_qs_create()
3178 for_all_rx_queues(adapter, rxo, i) { in be_rx_qs_create()
3179 rc = be_queue_alloc(adapter, &rxo->q, RX_Q_LEN, in be_rx_qs_create()
3185 if (adapter->need_def_rxq || !adapter->num_rss_qs) { in be_rx_qs_create()
3186 rxo = default_rxo(adapter); in be_rx_qs_create()
3187 rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, in be_rx_qs_create()
3188 rx_frag_size, adapter->if_handle, in be_rx_qs_create()
3194 for_all_rss_queues(adapter, rxo, i) { in be_rx_qs_create()
3195 rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, in be_rx_qs_create()
3196 rx_frag_size, adapter->if_handle, in be_rx_qs_create()
3202 if (be_multi_rxq(adapter)) { in be_rx_qs_create()
3203 for (j = 0; j < RSS_INDIR_TABLE_LEN; j += adapter->num_rss_qs) { in be_rx_qs_create()
3204 for_all_rss_queues(adapter, rxo, i) { in be_rx_qs_create()
3214 if (!BEx_chip(adapter)) in be_rx_qs_create()
3223 rc = be_cmd_rss_config(adapter, rss->rsstable, rss->rss_flags, in be_rx_qs_create()
3233 for_all_rx_queues(adapter, rxo, i) in be_rx_qs_create()
3240 struct be_adapter *adapter = netdev_priv(netdev); in be_open() local
3247 status = be_rx_qs_create(adapter); in be_open()
3251 status = be_irq_register(adapter); in be_open()
3255 for_all_rx_queues(adapter, rxo, i) in be_open()
3256 be_cq_notify(adapter, rxo->cq.id, true, 0); in be_open()
3258 for_all_tx_queues(adapter, txo, i) in be_open()
3259 be_cq_notify(adapter, txo->cq.id, true, 0); in be_open()
3261 be_async_mcc_enable(adapter); in be_open()
3263 for_all_evt_queues(adapter, eqo, i) { in be_open()
3266 be_eq_notify(adapter, eqo->q.id, true, true, 0); in be_open()
3268 adapter->flags |= BE_FLAGS_NAPI_ENABLED; in be_open()
3270 status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); in be_open()
3272 be_link_status_update(adapter, link_status); in be_open()
3275 be_roce_dev_open(adapter); in be_open()
3278 if (skyhawk_chip(adapter)) in be_open()
3284 be_close(adapter->netdev); in be_open()
3288 static int be_setup_wol(struct be_adapter *adapter, bool enable) in be_setup_wol() argument
3297 cmd.va = dma_zalloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma, in be_setup_wol()
3303 status = pci_write_config_dword(adapter->pdev, in be_setup_wol()
3307 dev_err(&adapter->pdev->dev, in be_setup_wol()
3309 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, in be_setup_wol()
3313 status = be_cmd_enable_magic_wol(adapter, in be_setup_wol()
3314 adapter->netdev->dev_addr, in be_setup_wol()
3316 pci_enable_wake(adapter->pdev, PCI_D3hot, 1); in be_setup_wol()
3317 pci_enable_wake(adapter->pdev, PCI_D3cold, 1); in be_setup_wol()
3319 status = be_cmd_enable_magic_wol(adapter, mac, &cmd); in be_setup_wol()
3320 pci_enable_wake(adapter->pdev, PCI_D3hot, 0); in be_setup_wol()
3321 pci_enable_wake(adapter->pdev, PCI_D3cold, 0); in be_setup_wol()
3324 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); in be_setup_wol()
3328 static void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac) in be_vf_eth_addr_generate() argument
3332 addr = jhash(adapter->netdev->dev_addr, ETH_ALEN, 0); in be_vf_eth_addr_generate()
3338 memcpy(mac, adapter->netdev->dev_addr, 3); in be_vf_eth_addr_generate()
3347 static int be_vf_eth_addr_config(struct be_adapter *adapter) in be_vf_eth_addr_config() argument
3354 be_vf_eth_addr_generate(adapter, mac); in be_vf_eth_addr_config()
3356 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_eth_addr_config()
3357 if (BEx_chip(adapter)) in be_vf_eth_addr_config()
3358 status = be_cmd_pmac_add(adapter, mac, in be_vf_eth_addr_config()
3362 status = be_cmd_set_mac(adapter, mac, vf_cfg->if_handle, in be_vf_eth_addr_config()
3366 dev_err(&adapter->pdev->dev, in be_vf_eth_addr_config()
3377 static int be_vfs_mac_query(struct be_adapter *adapter) in be_vfs_mac_query() argument
3383 for_all_vfs(adapter, vf_cfg, vf) { in be_vfs_mac_query()
3384 status = be_cmd_get_active_mac(adapter, vf_cfg->pmac_id, in be_vfs_mac_query()
3394 static void be_vf_clear(struct be_adapter *adapter) in be_vf_clear() argument
3399 if (pci_vfs_assigned(adapter->pdev)) { in be_vf_clear()
3400 dev_warn(&adapter->pdev->dev, in be_vf_clear()
3405 pci_disable_sriov(adapter->pdev); in be_vf_clear()
3407 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_clear()
3408 if (BEx_chip(adapter)) in be_vf_clear()
3409 be_cmd_pmac_del(adapter, vf_cfg->if_handle, in be_vf_clear()
3412 be_cmd_set_mac(adapter, NULL, vf_cfg->if_handle, in be_vf_clear()
3415 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1); in be_vf_clear()
3418 kfree(adapter->vf_cfg); in be_vf_clear()
3419 adapter->num_vfs = 0; in be_vf_clear()
3420 adapter->flags &= ~BE_FLAGS_SRIOV_ENABLED; in be_vf_clear()
3423 static void be_clear_queues(struct be_adapter *adapter) in be_clear_queues() argument
3425 be_mcc_queues_destroy(adapter); in be_clear_queues()
3426 be_rx_cqs_destroy(adapter); in be_clear_queues()
3427 be_tx_queues_destroy(adapter); in be_clear_queues()
3428 be_evt_queues_destroy(adapter); in be_clear_queues()
3431 static void be_cancel_worker(struct be_adapter *adapter) in be_cancel_worker() argument
3433 if (adapter->flags & BE_FLAGS_WORKER_SCHEDULED) { in be_cancel_worker()
3434 cancel_delayed_work_sync(&adapter->work); in be_cancel_worker()
3435 adapter->flags &= ~BE_FLAGS_WORKER_SCHEDULED; in be_cancel_worker()
3439 static void be_cancel_err_detection(struct be_adapter *adapter) in be_cancel_err_detection() argument
3441 if (adapter->flags & BE_FLAGS_ERR_DETECTION_SCHEDULED) { in be_cancel_err_detection()
3442 cancel_delayed_work_sync(&adapter->be_err_detection_work); in be_cancel_err_detection()
3443 adapter->flags &= ~BE_FLAGS_ERR_DETECTION_SCHEDULED; in be_cancel_err_detection()
3447 static void be_mac_clear(struct be_adapter *adapter) in be_mac_clear() argument
3449 if (adapter->pmac_id) { in be_mac_clear()
3450 be_cmd_pmac_del(adapter, adapter->if_handle, in be_mac_clear()
3451 adapter->pmac_id[0], 0); in be_mac_clear()
3452 kfree(adapter->pmac_id); in be_mac_clear()
3453 adapter->pmac_id = NULL; in be_mac_clear()
3458 static void be_disable_vxlan_offloads(struct be_adapter *adapter) in be_disable_vxlan_offloads() argument
3460 struct net_device *netdev = adapter->netdev; in be_disable_vxlan_offloads()
3462 if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) in be_disable_vxlan_offloads()
3463 be_cmd_manage_iface(adapter, adapter->if_handle, in be_disable_vxlan_offloads()
3466 if (adapter->vxlan_port) in be_disable_vxlan_offloads()
3467 be_cmd_set_vxlan_port(adapter, 0); in be_disable_vxlan_offloads()
3469 adapter->flags &= ~BE_FLAGS_VXLAN_OFFLOADS; in be_disable_vxlan_offloads()
3470 adapter->vxlan_port = 0; in be_disable_vxlan_offloads()
3478 static u16 be_calculate_vf_qs(struct be_adapter *adapter, u16 num_vfs) in be_calculate_vf_qs() argument
3480 struct be_resources res = adapter->pool_res; in be_calculate_vf_qs()
3486 if (num_vfs && !be_is_mc(adapter)) { in be_calculate_vf_qs()
3491 if (num_vfs < (be_max_vfs(adapter) - 8)) in be_calculate_vf_qs()
3506 static int be_clear(struct be_adapter *adapter) in be_clear() argument
3508 struct pci_dev *pdev = adapter->pdev; in be_clear()
3511 be_cancel_worker(adapter); in be_clear()
3513 if (sriov_enabled(adapter)) in be_clear()
3514 be_vf_clear(adapter); in be_clear()
3519 if (skyhawk_chip(adapter) && be_physfn(adapter) && in be_clear()
3521 num_vf_qs = be_calculate_vf_qs(adapter, in be_clear()
3523 be_cmd_set_sriov_config(adapter, adapter->pool_res, in be_clear()
3529 be_disable_vxlan_offloads(adapter); in be_clear()
3532 be_mac_clear(adapter); in be_clear()
3534 be_cmd_if_destroy(adapter, adapter->if_handle, 0); in be_clear()
3536 be_clear_queues(adapter); in be_clear()
3538 be_msix_disable(adapter); in be_clear()
3539 adapter->flags &= ~BE_FLAGS_SETUP_DONE; in be_clear()
3543 static int be_if_create(struct be_adapter *adapter, u32 *if_handle, in be_if_create() argument
3554 return be_cmd_if_create(adapter, cap_flags, en_flags, if_handle, vf); in be_if_create()
3557 static int be_vfs_if_create(struct be_adapter *adapter) in be_vfs_if_create() argument
3568 for_all_vfs(adapter, vf_cfg, vf) { in be_vfs_if_create()
3569 if (!BE3_chip(adapter)) { in be_vfs_if_create()
3570 status = be_cmd_get_profile_config(adapter, &res, in be_vfs_if_create()
3582 status = be_if_create(adapter, &vf_cfg->if_handle, in be_vfs_if_create()
3591 static int be_vf_setup_init(struct be_adapter *adapter) in be_vf_setup_init() argument
3596 adapter->vf_cfg = kcalloc(adapter->num_vfs, sizeof(*vf_cfg), in be_vf_setup_init()
3598 if (!adapter->vf_cfg) in be_vf_setup_init()
3601 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup_init()
3608 static int be_vf_setup(struct be_adapter *adapter) in be_vf_setup() argument
3610 struct device *dev = &adapter->pdev->dev; in be_vf_setup()
3614 old_vfs = pci_num_vf(adapter->pdev); in be_vf_setup()
3616 status = be_vf_setup_init(adapter); in be_vf_setup()
3621 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
3622 status = be_cmd_get_if_id(adapter, vf_cfg, vf); in be_vf_setup()
3627 status = be_vfs_mac_query(adapter); in be_vf_setup()
3631 status = be_vfs_if_create(adapter); in be_vf_setup()
3635 status = be_vf_eth_addr_config(adapter); in be_vf_setup()
3640 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
3642 status = be_cmd_get_fn_privileges(adapter, &vf_cfg->privileges, in be_vf_setup()
3645 status = be_cmd_set_fn_privileges(adapter, in be_vf_setup()
3658 be_cmd_config_qos(adapter, 0, 0, vf + 1); in be_vf_setup()
3661 be_cmd_enable_vf(adapter, vf + 1); in be_vf_setup()
3662 be_cmd_set_logical_link_config(adapter, in be_vf_setup()
3669 status = pci_enable_sriov(adapter->pdev, adapter->num_vfs); in be_vf_setup()
3672 adapter->num_vfs = 0; in be_vf_setup()
3677 adapter->flags |= BE_FLAGS_SRIOV_ENABLED; in be_vf_setup()
3681 be_vf_clear(adapter); in be_vf_setup()
3702 static void BEx_get_resources(struct be_adapter *adapter, in BEx_get_resources() argument
3705 bool use_sriov = adapter->num_vfs ? 1 : 0; in BEx_get_resources()
3707 if (be_physfn(adapter)) in BEx_get_resources()
3712 adapter->mc_type = be_convert_mc_type(adapter->function_mode); in BEx_get_resources()
3714 if (be_is_mc(adapter)) { in BEx_get_resources()
3718 if (be_is_qnq_mode(adapter)) in BEx_get_resources()
3735 if (BE2_chip(adapter) || use_sriov || (adapter->port_num > 1) || in BEx_get_resources()
3736 !be_physfn(adapter) || (be_is_mc(adapter) && in BEx_get_resources()
3737 !(adapter->function_caps & BE_FUNCTION_CAPS_RSS))) { in BEx_get_resources()
3739 } else if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { in BEx_get_resources()
3745 be_cmd_get_profile_config(adapter, &super_nic_res, in BEx_get_resources()
3753 if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && in BEx_get_resources()
3754 !use_sriov && be_physfn(adapter)) in BEx_get_resources()
3755 res->max_rss_qs = (adapter->be3_native) ? in BEx_get_resources()
3759 if (be_physfn(adapter)) in BEx_get_resources()
3760 res->max_evt_qs = (be_max_vfs(adapter) > 0) ? in BEx_get_resources()
3767 if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) in BEx_get_resources()
3771 static void be_setup_init(struct be_adapter *adapter) in be_setup_init() argument
3773 adapter->vlan_prio_bmap = 0xff; in be_setup_init()
3774 adapter->phy.link_speed = -1; in be_setup_init()
3775 adapter->if_handle = -1; in be_setup_init()
3776 adapter->be3_native = false; in be_setup_init()
3777 adapter->if_flags = 0; in be_setup_init()
3778 if (be_physfn(adapter)) in be_setup_init()
3779 adapter->cmd_privileges = MAX_PRIVILEGES; in be_setup_init()
3781 adapter->cmd_privileges = MIN_PRIVILEGES; in be_setup_init()
3784 static int be_get_sriov_config(struct be_adapter *adapter) in be_get_sriov_config() argument
3789 be_cmd_get_profile_config(adapter, &res, RESOURCE_LIMITS, 0); in be_get_sriov_config()
3792 if (BE3_chip(adapter) && !res.max_vfs) { in be_get_sriov_config()
3793 max_vfs = pci_sriov_get_totalvfs(adapter->pdev); in be_get_sriov_config()
3797 adapter->pool_res = res; in be_get_sriov_config()
3803 old_vfs = pci_num_vf(adapter->pdev); in be_get_sriov_config()
3805 dev_info(&adapter->pdev->dev, "%d VFs are already enabled\n", in be_get_sriov_config()
3808 adapter->pool_res.max_vfs = in be_get_sriov_config()
3809 pci_sriov_get_totalvfs(adapter->pdev); in be_get_sriov_config()
3810 adapter->num_vfs = old_vfs; in be_get_sriov_config()
3816 static void be_alloc_sriov_res(struct be_adapter *adapter) in be_alloc_sriov_res() argument
3818 int old_vfs = pci_num_vf(adapter->pdev); in be_alloc_sriov_res()
3822 be_get_sriov_config(adapter); in be_alloc_sriov_res()
3825 pci_sriov_set_totalvfs(adapter->pdev, be_max_vfs(adapter)); in be_alloc_sriov_res()
3832 if (skyhawk_chip(adapter) && be_max_vfs(adapter) && !old_vfs) { in be_alloc_sriov_res()
3833 num_vf_qs = be_calculate_vf_qs(adapter, 0); in be_alloc_sriov_res()
3834 status = be_cmd_set_sriov_config(adapter, adapter->pool_res, 0, in be_alloc_sriov_res()
3837 dev_err(&adapter->pdev->dev, in be_alloc_sriov_res()
3842 static int be_get_resources(struct be_adapter *adapter) in be_get_resources() argument
3844 struct device *dev = &adapter->pdev->dev; in be_get_resources()
3848 if (BEx_chip(adapter)) { in be_get_resources()
3849 BEx_get_resources(adapter, &res); in be_get_resources()
3850 adapter->res = res; in be_get_resources()
3857 if (!BEx_chip(adapter)) { in be_get_resources()
3858 status = be_cmd_get_func_config(adapter, &res); in be_get_resources()
3868 if (be_roce_supported(adapter)) in be_get_resources()
3870 adapter->res = res; in be_get_resources()
3876 adapter->need_def_rxq = (be_if_cap_flags(adapter) & in be_get_resources()
3880 be_max_txqs(adapter), be_max_rxqs(adapter), in be_get_resources()
3881 be_max_rss(adapter), be_max_eqs(adapter), in be_get_resources()
3882 be_max_vfs(adapter)); in be_get_resources()
3884 be_max_uc(adapter), be_max_mc(adapter), in be_get_resources()
3885 be_max_vlans(adapter)); in be_get_resources()
3888 adapter->cfg_num_qs = min_t(u16, netif_get_num_default_rss_queues(), in be_get_resources()
3889 be_max_qs(adapter)); in be_get_resources()
3893 static int be_get_config(struct be_adapter *adapter) in be_get_config() argument
3898 status = be_cmd_get_cntl_attributes(adapter); in be_get_config()
3902 status = be_cmd_query_fw_cfg(adapter); in be_get_config()
3906 if (BEx_chip(adapter)) { in be_get_config()
3907 level = be_cmd_get_fw_log_level(adapter); in be_get_config()
3908 adapter->msg_enable = in be_get_config()
3912 be_cmd_get_acpi_wol_cap(adapter); in be_get_config()
3914 be_cmd_query_port_name(adapter); in be_get_config()
3916 if (be_physfn(adapter)) { in be_get_config()
3917 status = be_cmd_get_active_profile(adapter, &profile_id); in be_get_config()
3919 dev_info(&adapter->pdev->dev, in be_get_config()
3923 status = be_get_resources(adapter); in be_get_config()
3927 adapter->pmac_id = kcalloc(be_max_uc(adapter), in be_get_config()
3928 sizeof(*adapter->pmac_id), GFP_KERNEL); in be_get_config()
3929 if (!adapter->pmac_id) in be_get_config()
3935 static int be_mac_setup(struct be_adapter *adapter) in be_mac_setup() argument
3940 if (is_zero_ether_addr(adapter->netdev->dev_addr)) { in be_mac_setup()
3941 status = be_cmd_get_perm_mac(adapter, mac); in be_mac_setup()
3945 memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); in be_mac_setup()
3946 memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); in be_mac_setup()
3949 memcpy(mac, adapter->netdev->dev_addr, ETH_ALEN); in be_mac_setup()
3953 if (!(BEx_chip(adapter) && be_virtfn(adapter))) in be_mac_setup()
3954 be_cmd_pmac_add(adapter, mac, adapter->if_handle, in be_mac_setup()
3955 &adapter->pmac_id[0], 0); in be_mac_setup()
3959 static void be_schedule_worker(struct be_adapter *adapter) in be_schedule_worker() argument
3961 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); in be_schedule_worker()
3962 adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; in be_schedule_worker()
3965 static void be_schedule_err_detection(struct be_adapter *adapter) in be_schedule_err_detection() argument
3967 schedule_delayed_work(&adapter->be_err_detection_work, in be_schedule_err_detection()
3969 adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED; in be_schedule_err_detection()
3972 static int be_setup_queues(struct be_adapter *adapter) in be_setup_queues() argument
3974 struct net_device *netdev = adapter->netdev; in be_setup_queues()
3977 status = be_evt_queues_create(adapter); in be_setup_queues()
3981 status = be_tx_qs_create(adapter); in be_setup_queues()
3985 status = be_rx_cqs_create(adapter); in be_setup_queues()
3989 status = be_mcc_queues_create(adapter); in be_setup_queues()
3993 status = netif_set_real_num_rx_queues(netdev, adapter->num_rx_qs); in be_setup_queues()
3997 status = netif_set_real_num_tx_queues(netdev, adapter->num_tx_qs); in be_setup_queues()
4003 dev_err(&adapter->pdev->dev, "queue_setup failed\n"); in be_setup_queues()
4007 int be_update_queues(struct be_adapter *adapter) in be_update_queues() argument
4009 struct net_device *netdev = adapter->netdev; in be_update_queues()
4015 be_cancel_worker(adapter); in be_update_queues()
4020 if (!adapter->num_msix_roce_vec) in be_update_queues()
4021 be_msix_disable(adapter); in be_update_queues()
4023 be_clear_queues(adapter); in be_update_queues()
4025 if (!msix_enabled(adapter)) { in be_update_queues()
4026 status = be_msix_enable(adapter); in be_update_queues()
4031 status = be_setup_queues(adapter); in be_update_queues()
4035 be_schedule_worker(adapter); in be_update_queues()
4055 static bool be_reset_required(struct be_adapter *adapter) in be_reset_required() argument
4057 return pci_num_vf(adapter->pdev) ? false : true; in be_reset_required()
4061 static int be_func_init(struct be_adapter *adapter) in be_func_init() argument
4065 status = be_fw_wait_ready(adapter); in be_func_init()
4069 if (be_reset_required(adapter)) { in be_func_init()
4070 status = be_cmd_reset_function(adapter); in be_func_init()
4078 be_clear_all_error(adapter); in be_func_init()
4082 status = be_cmd_fw_init(adapter); in be_func_init()
4087 be_intr_set(adapter, true); in be_func_init()
4092 static int be_setup(struct be_adapter *adapter) in be_setup() argument
4094 struct device *dev = &adapter->pdev->dev; in be_setup()
4097 status = be_func_init(adapter); in be_setup()
4101 be_setup_init(adapter); in be_setup()
4103 if (!lancer_chip(adapter)) in be_setup()
4104 be_cmd_req_native_mode(adapter); in be_setup()
4106 if (!BE2_chip(adapter) && be_physfn(adapter)) in be_setup()
4107 be_alloc_sriov_res(adapter); in be_setup()
4109 status = be_get_config(adapter); in be_setup()
4113 status = be_msix_enable(adapter); in be_setup()
4117 status = be_if_create(adapter, &adapter->if_handle, in be_setup()
4118 be_if_cap_flags(adapter), 0); in be_setup()
4124 status = be_setup_queues(adapter); in be_setup()
4129 be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0); in be_setup()
4131 status = be_mac_setup(adapter); in be_setup()
4135 be_cmd_get_fw_ver(adapter); in be_setup()
4136 dev_info(dev, "FW version is %s\n", adapter->fw_ver); in be_setup()
4138 if (BE2_chip(adapter) && fw_major_num(adapter->fw_ver) < 4) { in be_setup()
4140 adapter->fw_ver); in be_setup()
4144 if (adapter->vlans_added) in be_setup()
4145 be_vid_config(adapter); in be_setup()
4147 be_set_rx_mode(adapter->netdev); in be_setup()
4149 status = be_cmd_set_flow_control(adapter, adapter->tx_fc, in be_setup()
4150 adapter->rx_fc); in be_setup()
4152 be_cmd_get_flow_control(adapter, &adapter->tx_fc, in be_setup()
4153 &adapter->rx_fc); in be_setup()
4155 dev_info(&adapter->pdev->dev, "HW Flow control - TX:%d RX:%d\n", in be_setup()
4156 adapter->tx_fc, adapter->rx_fc); in be_setup()
4158 if (be_physfn(adapter)) in be_setup()
4159 be_cmd_set_logical_link_config(adapter, in be_setup()
4162 if (adapter->num_vfs) in be_setup()
4163 be_vf_setup(adapter); in be_setup()
4165 status = be_cmd_get_phy_info(adapter); in be_setup()
4166 if (!status && be_pause_supported(adapter)) in be_setup()
4167 adapter->phy.fc_autoneg = 1; in be_setup()
4169 be_schedule_worker(adapter); in be_setup()
4170 adapter->flags |= BE_FLAGS_SETUP_DONE; in be_setup()
4173 be_clear(adapter); in be_setup()
4180 struct be_adapter *adapter = netdev_priv(netdev); in be_netpoll() local
4184 for_all_evt_queues(adapter, eqo, i) { in be_netpoll()
4185 be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0); in be_netpoll()
4193 static bool phy_flashing_required(struct be_adapter *adapter) in phy_flashing_required() argument
4195 return (adapter->phy.phy_type == PHY_TYPE_TN_8022 && in phy_flashing_required()
4196 adapter->phy.interface_type == PHY_TYPE_BASET_10GB); in phy_flashing_required()
4199 static bool is_comp_in_ufi(struct be_adapter *adapter, in is_comp_in_ufi() argument
4205 if (BE2_chip(adapter)) in is_comp_in_ufi()
4221 static struct flash_section_info *get_fsec_info(struct be_adapter *adapter, in get_fsec_info() argument
4238 static int be_check_flash_crc(struct be_adapter *adapter, const u8 *p, in be_check_flash_crc() argument
4246 status = be_cmd_get_flash_crc(adapter, crc, img_optype, img_offset, in be_check_flash_crc()
4262 static int be_flash(struct be_adapter *adapter, const u8 *img, in be_flash() argument
4289 status = be_cmd_write_flashrom(adapter, flash_cmd, optype, in be_flash()
4304 static int be_flash_BEx(struct be_adapter *adapter, in be_flash_BEx() argument
4309 struct device *dev = &adapter->pdev->dev; in be_flash_BEx()
4358 if (BE3_chip(adapter)) { in be_flash_BEx()
4370 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); in be_flash_BEx()
4376 if (!is_comp_in_ufi(adapter, fsec, pflashcomp[i].img_type)) in be_flash_BEx()
4380 memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) in be_flash_BEx()
4384 !phy_flashing_required(adapter)) in be_flash_BEx()
4388 status = be_check_flash_crc(adapter, fw->data, in be_flash_BEx()
4410 status = be_flash(adapter, p, flash_cmd, pflashcomp[i].optype, in be_flash_BEx()
4473 static int be_flash_skyhawk(struct be_adapter *adapter, in be_flash_skyhawk() argument
4479 struct device *dev = &adapter->pdev->dev; in be_flash_skyhawk()
4487 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); in be_flash_skyhawk()
4515 status = be_check_flash_crc(adapter, fw->data, img_offset, in be_flash_skyhawk()
4554 status = be_flash(adapter, p, flash_cmd, flash_optype, img_size, in be_flash_skyhawk()
4584 static int lancer_fw_download(struct be_adapter *adapter, in lancer_fw_download() argument
4589 struct device *dev = &adapter->pdev->dev; in lancer_fw_download()
4624 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
4639 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
4656 status = lancer_physdev_ctrl(adapter, in lancer_fw_download()
4675 static int be_get_ufi_type(struct be_adapter *adapter, in be_get_ufi_type() argument
4679 dev_err(&adapter->pdev->dev, "Invalid FW UFI file"); in be_get_ufi_type()
4705 static bool be_check_ufi_compatibility(struct be_adapter *adapter, in be_check_ufi_compatibility() argument
4708 int ufi_type = be_get_ufi_type(adapter, fhdr); in be_check_ufi_compatibility()
4712 return skyhawk_chip(adapter); in be_check_ufi_compatibility()
4714 return (skyhawk_chip(adapter) && in be_check_ufi_compatibility()
4715 adapter->asic_rev < ASIC_REV_P2); in be_check_ufi_compatibility()
4717 return BE3_chip(adapter); in be_check_ufi_compatibility()
4719 return (BE3_chip(adapter) && adapter->asic_rev < ASIC_REV_B0); in be_check_ufi_compatibility()
4721 return BE2_chip(adapter); in be_check_ufi_compatibility()
4727 static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) in be_fw_download() argument
4729 struct device *dev = &adapter->pdev->dev; in be_fw_download()
4736 if (!be_check_ufi_compatibility(adapter, fhdr3)) { in be_fw_download()
4752 if (!BE2_chip(adapter) && in be_fw_download()
4756 if (skyhawk_chip(adapter)) in be_fw_download()
4757 status = be_flash_skyhawk(adapter, fw, &flash_cmd, in be_fw_download()
4760 status = be_flash_BEx(adapter, fw, &flash_cmd, in be_fw_download()
4771 int be_load_fw(struct be_adapter *adapter, u8 *fw_file) in be_load_fw() argument
4776 if (!netif_running(adapter->netdev)) { in be_load_fw()
4777 dev_err(&adapter->pdev->dev, in be_load_fw()
4782 status = request_firmware(&fw, fw_file, &adapter->pdev->dev); in be_load_fw()
4786 dev_info(&adapter->pdev->dev, "Flashing firmware file %s\n", fw_file); in be_load_fw()
4788 if (lancer_chip(adapter)) in be_load_fw()
4789 status = lancer_fw_download(adapter, fw); in be_load_fw()
4791 status = be_fw_download(adapter, fw); in be_load_fw()
4794 be_cmd_get_fw_ver(adapter); in be_load_fw()
4804 struct be_adapter *adapter = netdev_priv(dev); in be_ndo_bridge_setlink() local
4810 if (!sriov_enabled(adapter)) in be_ndo_bridge_setlink()
4828 status = be_cmd_set_hsw_config(adapter, 0, 0, in be_ndo_bridge_setlink()
4829 adapter->if_handle, in be_ndo_bridge_setlink()
4836 dev_info(&adapter->pdev->dev, "enabled switch mode: %s\n", in be_ndo_bridge_setlink()
4842 dev_err(&adapter->pdev->dev, "Failed to set switch mode %s\n", in be_ndo_bridge_setlink()
4852 struct be_adapter *adapter = netdev_priv(dev); in be_ndo_bridge_getlink() local
4856 if (!sriov_enabled(adapter)) in be_ndo_bridge_getlink()
4860 if (BEx_chip(adapter) || lancer_chip(adapter)) { in be_ndo_bridge_getlink()
4863 status = be_cmd_get_hsw_config(adapter, NULL, 0, in be_ndo_bridge_getlink()
4864 adapter->if_handle, &hsw_mode); in be_ndo_bridge_getlink()
4893 struct be_adapter *adapter = netdev_priv(netdev); in be_add_vxlan_port() local
4894 struct device *dev = &adapter->pdev->dev; in be_add_vxlan_port()
4897 if (lancer_chip(adapter) || BEx_chip(adapter)) in be_add_vxlan_port()
4900 if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) { in be_add_vxlan_port()
4904 adapter->vxlan_port_count++; in be_add_vxlan_port()
4908 if (adapter->vxlan_port_count++ >= 1) in be_add_vxlan_port()
4911 status = be_cmd_manage_iface(adapter, adapter->if_handle, in be_add_vxlan_port()
4918 status = be_cmd_set_vxlan_port(adapter, port); in be_add_vxlan_port()
4923 adapter->flags |= BE_FLAGS_VXLAN_OFFLOADS; in be_add_vxlan_port()
4924 adapter->vxlan_port = port; in be_add_vxlan_port()
4936 be_disable_vxlan_offloads(adapter); in be_add_vxlan_port()
4942 struct be_adapter *adapter = netdev_priv(netdev); in be_del_vxlan_port() local
4944 if (lancer_chip(adapter) || BEx_chip(adapter)) in be_del_vxlan_port()
4947 if (adapter->vxlan_port != port) in be_del_vxlan_port()
4950 be_disable_vxlan_offloads(adapter); in be_del_vxlan_port()
4952 dev_info(&adapter->pdev->dev, in be_del_vxlan_port()
4956 adapter->vxlan_port_count--; in be_del_vxlan_port()
4963 struct be_adapter *adapter = netdev_priv(dev); in be_features_check() local
4970 !(adapter->flags & BE_FLAGS_VXLAN_OFFLOADS)) in be_features_check()
5034 struct be_adapter *adapter = netdev_priv(netdev); in be_netdev_init() local
5039 if (be_multi_rxq(adapter)) in be_netdev_init()
5059 static void be_cleanup(struct be_adapter *adapter) in be_cleanup() argument
5061 struct net_device *netdev = adapter->netdev; in be_cleanup()
5069 be_clear(adapter); in be_cleanup()
5072 static int be_resume(struct be_adapter *adapter) in be_resume() argument
5074 struct net_device *netdev = adapter->netdev; in be_resume()
5077 status = be_setup(adapter); in be_resume()
5092 static int be_err_recover(struct be_adapter *adapter) in be_err_recover() argument
5094 struct device *dev = &adapter->pdev->dev; in be_err_recover()
5097 status = be_resume(adapter); in be_err_recover()
5104 if (be_physfn(adapter)) in be_err_recover()
5114 struct be_adapter *adapter = in be_err_detection_task() local
5119 be_detect_error(adapter); in be_err_detection_task()
5121 if (adapter->hw_error) { in be_err_detection_task()
5122 be_cleanup(adapter); in be_err_detection_task()
5125 if (lancer_chip(adapter)) in be_err_detection_task()
5126 status = be_err_recover(adapter); in be_err_detection_task()
5130 if (!status || be_virtfn(adapter)) in be_err_detection_task()
5131 be_schedule_err_detection(adapter); in be_err_detection_task()
5134 static void be_log_sfp_info(struct be_adapter *adapter) in be_log_sfp_info() argument
5138 status = be_cmd_query_sfp_info(adapter); in be_log_sfp_info()
5140 dev_err(&adapter->pdev->dev, in be_log_sfp_info()
5142 adapter->port_name, adapter->phy.vendor_name, in be_log_sfp_info()
5143 adapter->phy.vendor_pn); in be_log_sfp_info()
5145 adapter->flags &= ~BE_FLAGS_EVT_INCOMPATIBLE_SFP; in be_log_sfp_info()
5150 struct be_adapter *adapter = in be_worker() local
5158 if (!netif_running(adapter->netdev)) { in be_worker()
5160 be_process_mcc(adapter); in be_worker()
5165 if (!adapter->stats_cmd_sent) { in be_worker()
5166 if (lancer_chip(adapter)) in be_worker()
5167 lancer_cmd_get_pport_stats(adapter, in be_worker()
5168 &adapter->stats_cmd); in be_worker()
5170 be_cmd_get_stats(adapter, &adapter->stats_cmd); in be_worker()
5173 if (be_physfn(adapter) && in be_worker()
5174 MODULO(adapter->work_counter, adapter->be_get_temp_freq) == 0) in be_worker()
5175 be_cmd_get_die_temperature(adapter); in be_worker()
5177 for_all_rx_queues(adapter, rxo, i) { in be_worker()
5185 be_eqd_update(adapter); in be_worker()
5187 if (adapter->flags & BE_FLAGS_EVT_INCOMPATIBLE_SFP) in be_worker()
5188 be_log_sfp_info(adapter); in be_worker()
5191 adapter->work_counter++; in be_worker()
5192 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); in be_worker()
5195 static void be_unmap_pci_bars(struct be_adapter *adapter) in be_unmap_pci_bars() argument
5197 if (adapter->csr) in be_unmap_pci_bars()
5198 pci_iounmap(adapter->pdev, adapter->csr); in be_unmap_pci_bars()
5199 if (adapter->db) in be_unmap_pci_bars()
5200 pci_iounmap(adapter->pdev, adapter->db); in be_unmap_pci_bars()
5203 static int db_bar(struct be_adapter *adapter) in db_bar() argument
5205 if (lancer_chip(adapter) || !be_physfn(adapter)) in db_bar()
5211 static int be_roce_map_pci_bars(struct be_adapter *adapter) in be_roce_map_pci_bars() argument
5213 if (skyhawk_chip(adapter)) { in be_roce_map_pci_bars()
5214 adapter->roce_db.size = 4096; in be_roce_map_pci_bars()
5215 adapter->roce_db.io_addr = pci_resource_start(adapter->pdev, in be_roce_map_pci_bars()
5216 db_bar(adapter)); in be_roce_map_pci_bars()
5217 adapter->roce_db.total_size = pci_resource_len(adapter->pdev, in be_roce_map_pci_bars()
5218 db_bar(adapter)); in be_roce_map_pci_bars()
5223 static int be_map_pci_bars(struct be_adapter *adapter) in be_map_pci_bars() argument
5225 struct pci_dev *pdev = adapter->pdev; in be_map_pci_bars()
5229 pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); in be_map_pci_bars()
5230 adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >> in be_map_pci_bars()
5232 adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; in be_map_pci_bars()
5234 if (BEx_chip(adapter) && be_physfn(adapter)) { in be_map_pci_bars()
5235 adapter->csr = pci_iomap(pdev, 2, 0); in be_map_pci_bars()
5236 if (!adapter->csr) in be_map_pci_bars()
5240 addr = pci_iomap(pdev, db_bar(adapter), 0); in be_map_pci_bars()
5243 adapter->db = addr; in be_map_pci_bars()
5245 if (skyhawk_chip(adapter) || BEx_chip(adapter)) { in be_map_pci_bars()
5246 if (be_physfn(adapter)) { in be_map_pci_bars()
5248 addr = pci_iomap(pdev, BE2_chip(adapter) ? 1 : 0, 0); in be_map_pci_bars()
5251 adapter->pcicfg = addr; in be_map_pci_bars()
5253 adapter->pcicfg = adapter->db + SRIOV_VF_PCICFG_OFFSET; in be_map_pci_bars()
5257 be_roce_map_pci_bars(adapter); in be_map_pci_bars()
5262 be_unmap_pci_bars(adapter); in be_map_pci_bars()
5266 static void be_drv_cleanup(struct be_adapter *adapter) in be_drv_cleanup() argument
5268 struct be_dma_mem *mem = &adapter->mbox_mem_alloced; in be_drv_cleanup()
5269 struct device *dev = &adapter->pdev->dev; in be_drv_cleanup()
5274 mem = &adapter->rx_filter; in be_drv_cleanup()
5278 mem = &adapter->stats_cmd; in be_drv_cleanup()
5284 static int be_drv_init(struct be_adapter *adapter) in be_drv_init() argument
5286 struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; in be_drv_init()
5287 struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; in be_drv_init()
5288 struct be_dma_mem *rx_filter = &adapter->rx_filter; in be_drv_init()
5289 struct be_dma_mem *stats_cmd = &adapter->stats_cmd; in be_drv_init()
5290 struct device *dev = &adapter->pdev->dev; in be_drv_init()
5312 if (lancer_chip(adapter)) in be_drv_init()
5314 else if (BE2_chip(adapter)) in be_drv_init()
5316 else if (BE3_chip(adapter)) in be_drv_init()
5327 mutex_init(&adapter->mbox_lock); in be_drv_init()
5328 spin_lock_init(&adapter->mcc_lock); in be_drv_init()
5329 spin_lock_init(&adapter->mcc_cq_lock); in be_drv_init()
5330 init_completion(&adapter->et_cmd_compl); in be_drv_init()
5332 pci_save_state(adapter->pdev); in be_drv_init()
5334 INIT_DELAYED_WORK(&adapter->work, be_worker); in be_drv_init()
5335 INIT_DELAYED_WORK(&adapter->be_err_detection_work, in be_drv_init()
5338 adapter->rx_fc = true; in be_drv_init()
5339 adapter->tx_fc = true; in be_drv_init()
5342 adapter->be_get_temp_freq = 64; in be_drv_init()
5356 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_remove() local
5358 if (!adapter) in be_remove()
5361 be_roce_dev_remove(adapter); in be_remove()
5362 be_intr_set(adapter, false); in be_remove()
5364 be_cancel_err_detection(adapter); in be_remove()
5366 unregister_netdev(adapter->netdev); in be_remove()
5368 be_clear(adapter); in be_remove()
5371 be_cmd_fw_clean(adapter); in be_remove()
5373 be_unmap_pci_bars(adapter); in be_remove()
5374 be_drv_cleanup(adapter); in be_remove()
5381 free_netdev(adapter->netdev); in be_remove()
5384 static char *mc_name(struct be_adapter *adapter) in mc_name() argument
5388 switch (adapter->mc_type) { in mc_name()
5414 static inline char *func_name(struct be_adapter *adapter) in func_name() argument
5416 return be_physfn(adapter) ? "PF" : "VF"; in func_name()
5441 struct be_adapter *adapter; in be_probe() local
5456 netdev = alloc_etherdev_mqs(sizeof(*adapter), MAX_TX_QS, MAX_RX_QS); in be_probe()
5461 adapter = netdev_priv(netdev); in be_probe()
5462 adapter->pdev = pdev; in be_probe()
5463 pci_set_drvdata(pdev, adapter); in be_probe()
5464 adapter->netdev = netdev; in be_probe()
5482 status = be_map_pci_bars(adapter); in be_probe()
5486 status = be_drv_init(adapter); in be_probe()
5490 status = be_setup(adapter); in be_probe()
5499 be_roce_dev_add(adapter); in be_probe()
5501 be_schedule_err_detection(adapter); in be_probe()
5504 func_name(adapter), mc_name(adapter), adapter->port_name); in be_probe()
5509 be_clear(adapter); in be_probe()
5511 be_drv_cleanup(adapter); in be_probe()
5513 be_unmap_pci_bars(adapter); in be_probe()
5527 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_suspend() local
5529 if (adapter->wol_en) in be_suspend()
5530 be_setup_wol(adapter, true); in be_suspend()
5532 be_intr_set(adapter, false); in be_suspend()
5533 be_cancel_err_detection(adapter); in be_suspend()
5535 be_cleanup(adapter); in be_suspend()
5545 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_pci_resume() local
5555 status = be_resume(adapter); in be_pci_resume()
5559 be_schedule_err_detection(adapter); in be_pci_resume()
5561 if (adapter->wol_en) in be_pci_resume()
5562 be_setup_wol(adapter, false); in be_pci_resume()
5572 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_shutdown() local
5574 if (!adapter) in be_shutdown()
5577 be_roce_dev_shutdown(adapter); in be_shutdown()
5578 cancel_delayed_work_sync(&adapter->work); in be_shutdown()
5579 be_cancel_err_detection(adapter); in be_shutdown()
5581 netif_device_detach(adapter->netdev); in be_shutdown()
5583 be_cmd_reset_function(adapter); in be_shutdown()
5591 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_err_detected() local
5593 dev_err(&adapter->pdev->dev, "EEH error detected\n"); in be_eeh_err_detected()
5595 if (!adapter->eeh_error) { in be_eeh_err_detected()
5596 adapter->eeh_error = true; in be_eeh_err_detected()
5598 be_cancel_err_detection(adapter); in be_eeh_err_detected()
5600 be_cleanup(adapter); in be_eeh_err_detected()
5622 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_reset() local
5625 dev_info(&adapter->pdev->dev, "EEH reset\n"); in be_eeh_reset()
5636 dev_info(&adapter->pdev->dev, in be_eeh_reset()
5638 status = be_fw_wait_ready(adapter); in be_eeh_reset()
5643 be_clear_all_error(adapter); in be_eeh_reset()
5650 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_resume() local
5652 dev_info(&adapter->pdev->dev, "EEH resume\n"); in be_eeh_resume()
5656 status = be_resume(adapter); in be_eeh_resume()
5660 be_schedule_err_detection(adapter); in be_eeh_resume()
5663 dev_err(&adapter->pdev->dev, "EEH resume failed\n"); in be_eeh_resume()
5668 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_pci_sriov_configure() local
5673 be_vf_clear(adapter); in be_pci_sriov_configure()
5675 adapter->num_vfs = num_vfs; in be_pci_sriov_configure()
5677 if (adapter->num_vfs == 0 && pci_vfs_assigned(pdev)) { in be_pci_sriov_configure()
5691 if (skyhawk_chip(adapter) && !pci_num_vf(pdev)) { in be_pci_sriov_configure()
5692 num_vf_qs = be_calculate_vf_qs(adapter, adapter->num_vfs); in be_pci_sriov_configure()
5693 status = be_cmd_set_sriov_config(adapter, adapter->pool_res, in be_pci_sriov_configure()
5694 adapter->num_vfs, num_vf_qs); in be_pci_sriov_configure()
5700 status = be_get_resources(adapter); in be_pci_sriov_configure()
5706 status = be_update_queues(adapter); in be_pci_sriov_configure()
5711 if (adapter->num_vfs) in be_pci_sriov_configure()
5712 status = be_vf_setup(adapter); in be_pci_sriov_configure()
5715 return adapter->num_vfs; in be_pci_sriov_configure()