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 (be_check_error(adapter, BE_ERROR_EEH)) 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
194 if (be_check_error(adapter, BE_ERROR_HW)) in be_rxq_notify()
201 iowrite32(val, adapter->db + DB_RQ_OFFSET); in be_rxq_notify()
204 static void be_txq_notify(struct be_adapter *adapter, struct be_tx_obj *txo, in be_txq_notify() argument
209 if (be_check_error(adapter, BE_ERROR_HW)) in be_txq_notify()
216 iowrite32(val, adapter->db + txo->db_offset); in be_txq_notify()
219 static void be_eq_notify(struct be_adapter *adapter, u16 qid, in be_eq_notify() argument
228 if (be_check_error(adapter, BE_ERROR_HW)) in be_eq_notify()
238 iowrite32(val, adapter->db + DB_EQ_OFFSET); in be_eq_notify()
241 void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, u16 num_popped) in be_cq_notify() argument
249 if (be_check_error(adapter, BE_ERROR_HW)) in be_cq_notify()
255 iowrite32(val, adapter->db + DB_CQ_OFFSET); in be_cq_notify()
260 struct be_adapter *adapter = netdev_priv(netdev); in be_mac_addr_set() local
261 struct device *dev = &adapter->pdev->dev; in be_mac_addr_set()
265 u32 old_pmac_id = adapter->pmac_id[0], curr_pmac_id = 0; in be_mac_addr_set()
286 status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, in be_mac_addr_set()
287 adapter->if_handle, &adapter->pmac_id[0], 0); in be_mac_addr_set()
289 curr_pmac_id = adapter->pmac_id[0]; in be_mac_addr_set()
294 if (adapter->pmac_id[0] != old_pmac_id) in be_mac_addr_set()
295 be_cmd_pmac_del(adapter, adapter->if_handle, in be_mac_addr_set()
302 status = be_cmd_get_active_mac(adapter, curr_pmac_id, mac, in be_mac_addr_set()
303 adapter->if_handle, true, 0); in be_mac_addr_set()
324 static void *hw_stats_from_cmd(struct be_adapter *adapter) in hw_stats_from_cmd() argument
326 if (BE2_chip(adapter)) { in hw_stats_from_cmd()
327 struct be_cmd_resp_get_stats_v0 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
330 } else if (BE3_chip(adapter)) { in hw_stats_from_cmd()
331 struct be_cmd_resp_get_stats_v1 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
335 struct be_cmd_resp_get_stats_v2 *cmd = adapter->stats_cmd.va; in hw_stats_from_cmd()
342 static void *be_erx_stats_from_cmd(struct be_adapter *adapter) in be_erx_stats_from_cmd() argument
344 if (BE2_chip(adapter)) { in be_erx_stats_from_cmd()
345 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
348 } else if (BE3_chip(adapter)) { in be_erx_stats_from_cmd()
349 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
353 struct be_hw_stats_v2 *hw_stats = hw_stats_from_cmd(adapter); in be_erx_stats_from_cmd()
359 static void populate_be_v0_stats(struct be_adapter *adapter) in populate_be_v0_stats() argument
361 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v0_stats()
365 &rxf_stats->port[adapter->port_num]; in populate_be_v0_stats()
366 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v0_stats()
395 if (adapter->port_num) in populate_be_v0_stats()
405 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v0_stats()
408 static void populate_be_v1_stats(struct be_adapter *adapter) in populate_be_v1_stats() argument
410 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v1_stats()
414 &rxf_stats->port[adapter->port_num]; in populate_be_v1_stats()
415 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v1_stats()
451 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v1_stats()
454 static void populate_be_v2_stats(struct be_adapter *adapter) in populate_be_v2_stats() argument
456 struct be_hw_stats_v2 *hw_stats = hw_stats_from_cmd(adapter); in populate_be_v2_stats()
460 &rxf_stats->port[adapter->port_num]; in populate_be_v2_stats()
461 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be_v2_stats()
497 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be_v2_stats()
498 if (be_roce_supported(adapter)) { in populate_be_v2_stats()
508 static void populate_lancer_stats(struct be_adapter *adapter) in populate_lancer_stats() argument
510 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_lancer_stats()
511 struct lancer_pport_stats *pport_stats = pport_stats_from_cmd(adapter); in populate_lancer_stats()
557 static void populate_erx_stats(struct be_adapter *adapter, in populate_erx_stats() argument
560 if (!BEx_chip(adapter)) in populate_erx_stats()
570 void be_parse_stats(struct be_adapter *adapter) in be_parse_stats() argument
572 struct be_erx_stats_v2 *erx = be_erx_stats_from_cmd(adapter); in be_parse_stats()
577 if (lancer_chip(adapter)) { in be_parse_stats()
578 populate_lancer_stats(adapter); in be_parse_stats()
580 if (BE2_chip(adapter)) in be_parse_stats()
581 populate_be_v0_stats(adapter); in be_parse_stats()
582 else if (BE3_chip(adapter)) in be_parse_stats()
584 populate_be_v1_stats(adapter); in be_parse_stats()
586 populate_be_v2_stats(adapter); in be_parse_stats()
589 for_all_rx_queues(adapter, rxo, i) { in be_parse_stats()
591 populate_erx_stats(adapter, rxo, erx_stat); in be_parse_stats()
599 struct be_adapter *adapter = netdev_priv(netdev); in be_get_stats64() local
600 struct be_drv_stats *drvs = &adapter->drv_stats; in be_get_stats64()
607 for_all_rx_queues(adapter, rxo, i) { in be_get_stats64()
622 for_all_tx_queues(adapter, txo, i) { in be_get_stats64()
664 void be_link_status_update(struct be_adapter *adapter, u8 link_status) in be_link_status_update() argument
666 struct net_device *netdev = adapter->netdev; in be_link_status_update()
668 if (!(adapter->flags & BE_FLAGS_LINK_STATUS_INIT)) { in be_link_status_update()
670 adapter->flags |= BE_FLAGS_LINK_STATUS_INIT; in be_link_status_update()
721 static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter, in be_get_tx_vlan_tag() argument
730 if (!(adapter->vlan_prio_bmap & (1 << vlan_prio))) in be_get_tx_vlan_tag()
732 adapter->recommended_prio; in be_get_tx_vlan_tag()
765 static void be_get_wrb_params_from_skb(struct be_adapter *adapter, in be_get_wrb_params_from_skb() argument
774 if (skb_is_gso_v6(skb) && !lancer_chip(adapter)) in be_get_wrb_params_from_skb()
791 wrb_params->vlan_tag = be_get_tx_vlan_tag(adapter, skb); in be_get_wrb_params_from_skb()
797 static void wrb_fill_hdr(struct be_adapter *adapter, in wrb_fill_hdr() argument
861 static void be_tx_setup_wrb_hdr(struct be_adapter *adapter, in be_tx_setup_wrb_hdr() argument
870 wrb_fill_hdr(adapter, hdr, wrb_params, skb); in be_tx_setup_wrb_hdr()
897 static void be_xmit_restore(struct be_adapter *adapter, in be_xmit_restore() argument
905 dev = &adapter->pdev->dev; in be_xmit_restore()
925 static u32 be_xmit_enqueue(struct be_adapter *adapter, struct be_tx_obj *txo, in be_xmit_enqueue() argument
930 struct device *dev = &adapter->pdev->dev; in be_xmit_enqueue()
961 be_tx_setup_wrb_hdr(adapter, txo, wrb_params, skb, head); in be_xmit_enqueue()
967 adapter->drv_stats.dma_map_errors++; in be_xmit_enqueue()
968 be_xmit_restore(adapter, txo, head, map_single, copied); in be_xmit_enqueue()
972 static inline int qnq_async_evt_rcvd(struct be_adapter *adapter) in qnq_async_evt_rcvd() argument
974 return adapter->flags & BE_FLAGS_QNQ_ASYNC_EVT_RCVD; in qnq_async_evt_rcvd()
977 static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, in be_insert_vlan_in_pkt() argument
989 vlan_tag = be_get_tx_vlan_tag(adapter, skb); in be_insert_vlan_in_pkt()
991 if (qnq_async_evt_rcvd(adapter) && adapter->pvid) { in be_insert_vlan_in_pkt()
993 vlan_tag = adapter->pvid; in be_insert_vlan_in_pkt()
1009 if (adapter->qnq_vid) { in be_insert_vlan_in_pkt()
1010 vlan_tag = adapter->qnq_vid; in be_insert_vlan_in_pkt()
1043 static int be_vlan_tag_tx_chk(struct be_adapter *adapter, struct sk_buff *skb) in be_vlan_tag_tx_chk() argument
1045 return skb_vlan_tag_present(skb) || adapter->pvid || adapter->qnq_vid; in be_vlan_tag_tx_chk()
1048 static int be_ipv6_tx_stall_chk(struct be_adapter *adapter, struct sk_buff *skb) in be_ipv6_tx_stall_chk() argument
1050 return BE3_chip(adapter) && be_ipv6_exthdr_check(skb); in be_ipv6_tx_stall_chk()
1053 static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, in be_lancer_xmit_workarounds() argument
1069 (lancer_chip(adapter) || skb_vlan_tag_present(skb)) && in be_lancer_xmit_workarounds()
1078 if (be_pvid_tagging_enabled(adapter) && in be_lancer_xmit_workarounds()
1088 skb = be_insert_vlan_in_pkt(adapter, skb, wrb_params); in be_lancer_xmit_workarounds()
1097 if (unlikely(be_ipv6_tx_stall_chk(adapter, skb) && in be_lancer_xmit_workarounds()
1098 (adapter->pvid || adapter->qnq_vid) && in be_lancer_xmit_workarounds()
1099 !qnq_async_evt_rcvd(adapter))) in be_lancer_xmit_workarounds()
1108 if (be_ipv6_tx_stall_chk(adapter, skb) && in be_lancer_xmit_workarounds()
1109 be_vlan_tag_tx_chk(adapter, skb)) { in be_lancer_xmit_workarounds()
1110 skb = be_insert_vlan_in_pkt(adapter, skb, wrb_params); in be_lancer_xmit_workarounds()
1122 static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, in be_xmit_workarounds() argument
1136 if (BEx_chip(adapter) || lancer_chip(adapter)) { in be_xmit_workarounds()
1137 skb = be_lancer_xmit_workarounds(adapter, skb, wrb_params); in be_xmit_workarounds()
1145 static void be_xmit_flush(struct be_adapter *adapter, struct be_tx_obj *txo) in be_xmit_flush() argument
1155 if (!lancer_chip(adapter) && (txo->pend_wrb_cnt & 1)) { in be_xmit_flush()
1165 be_txq_notify(adapter, txo, txo->pend_wrb_cnt); in be_xmit_flush()
1177 #define is_mc_allowed_on_bmc(adapter, eh) \ argument
1178 (!is_multicast_filt_enabled(adapter) && \
1182 #define is_bc_allowed_on_bmc(adapter, eh) \ argument
1183 (!is_broadcast_filt_enabled(adapter) && \
1186 #define is_arp_allowed_on_bmc(adapter, skb) \ argument
1187 (is_arp(skb) && is_arp_filt_enabled(adapter))
1189 #define is_broadcast_packet(eh, adapter) \ argument
1191 !compare_ether_addr(eh->h_dest, adapter->netdev->broadcast))
1195 #define is_arp_filt_enabled(adapter) \ argument
1196 (adapter->bmc_filt_mask & (BMC_FILT_BROADCAST_ARP))
1198 #define is_dhcp_client_filt_enabled(adapter) \ argument
1199 (adapter->bmc_filt_mask & BMC_FILT_BROADCAST_DHCP_CLIENT)
1201 #define is_dhcp_srvr_filt_enabled(adapter) \ argument
1202 (adapter->bmc_filt_mask & BMC_FILT_BROADCAST_DHCP_SERVER)
1204 #define is_nbios_filt_enabled(adapter) \ argument
1205 (adapter->bmc_filt_mask & BMC_FILT_BROADCAST_NET_BIOS)
1207 #define is_ipv6_na_filt_enabled(adapter) \ argument
1208 (adapter->bmc_filt_mask & \
1211 #define is_ipv6_ra_filt_enabled(adapter) \ argument
1212 (adapter->bmc_filt_mask & BMC_FILT_MULTICAST_IPV6_RA)
1214 #define is_ipv6_ras_filt_enabled(adapter) \ argument
1215 (adapter->bmc_filt_mask & BMC_FILT_MULTICAST_IPV6_RAS)
1217 #define is_broadcast_filt_enabled(adapter) \ argument
1218 (adapter->bmc_filt_mask & BMC_FILT_BROADCAST)
1220 #define is_multicast_filt_enabled(adapter) \ argument
1221 (adapter->bmc_filt_mask & BMC_FILT_MULTICAST)
1223 static bool be_send_pkt_to_bmc(struct be_adapter *adapter, in be_send_pkt_to_bmc() argument
1229 if (!be_is_os2bmc_enabled(adapter)) in be_send_pkt_to_bmc()
1235 if (is_mc_allowed_on_bmc(adapter, eh) || in be_send_pkt_to_bmc()
1236 is_bc_allowed_on_bmc(adapter, eh) || in be_send_pkt_to_bmc()
1237 is_arp_allowed_on_bmc(adapter, (*skb))) { in be_send_pkt_to_bmc()
1251 os2bmc = is_ipv6_ra_filt_enabled(adapter); in be_send_pkt_to_bmc()
1254 os2bmc = is_ipv6_na_filt_enabled(adapter); in be_send_pkt_to_bmc()
1267 os2bmc = is_dhcp_client_filt_enabled(adapter); in be_send_pkt_to_bmc()
1270 os2bmc = is_dhcp_srvr_filt_enabled(adapter); in be_send_pkt_to_bmc()
1274 os2bmc = is_nbios_filt_enabled(adapter); in be_send_pkt_to_bmc()
1277 os2bmc = is_ipv6_ras_filt_enabled(adapter); in be_send_pkt_to_bmc()
1288 *skb = be_insert_vlan_in_pkt(adapter, *skb, NULL); in be_send_pkt_to_bmc()
1295 struct be_adapter *adapter = netdev_priv(netdev); in be_xmit() local
1297 struct be_tx_obj *txo = &adapter->tx_obj[q_idx]; in be_xmit()
1302 skb = be_xmit_workarounds(adapter, skb, &wrb_params); in be_xmit()
1306 be_get_wrb_params_from_skb(adapter, skb, &wrb_params); in be_xmit()
1308 wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params); in be_xmit()
1317 if (be_send_pkt_to_bmc(adapter, &skb)) { in be_xmit()
1319 wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params); in be_xmit()
1332 be_xmit_flush(adapter, txo); in be_xmit()
1339 be_xmit_flush(adapter, txo); in be_xmit()
1346 struct be_adapter *adapter = netdev_priv(netdev); in be_change_mtu() local
1347 struct device *dev = &adapter->pdev->dev; in be_change_mtu()
1361 static inline bool be_in_all_promisc(struct be_adapter *adapter) in be_in_all_promisc() argument
1363 return (adapter->if_flags & BE_IF_FLAGS_ALL_PROMISCUOUS) == in be_in_all_promisc()
1367 static int be_set_vlan_promisc(struct be_adapter *adapter) in be_set_vlan_promisc() argument
1369 struct device *dev = &adapter->pdev->dev; in be_set_vlan_promisc()
1372 if (adapter->if_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS) in be_set_vlan_promisc()
1375 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS, ON); in be_set_vlan_promisc()
1378 adapter->if_flags |= BE_IF_FLAGS_VLAN_PROMISCUOUS; in be_set_vlan_promisc()
1385 static int be_clear_vlan_promisc(struct be_adapter *adapter) in be_clear_vlan_promisc() argument
1387 struct device *dev = &adapter->pdev->dev; in be_clear_vlan_promisc()
1390 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS, OFF); in be_clear_vlan_promisc()
1393 adapter->if_flags &= ~BE_IF_FLAGS_VLAN_PROMISCUOUS; in be_clear_vlan_promisc()
1402 static int be_vid_config(struct be_adapter *adapter) in be_vid_config() argument
1404 struct device *dev = &adapter->pdev->dev; in be_vid_config()
1410 if (be_in_all_promisc(adapter)) in be_vid_config()
1413 if (adapter->vlans_added > be_max_vlans(adapter)) in be_vid_config()
1414 return be_set_vlan_promisc(adapter); in be_vid_config()
1417 for_each_set_bit(i, adapter->vids, VLAN_N_VID) in be_vid_config()
1420 status = be_cmd_vlan_config(adapter, adapter->if_handle, vids, num, 0); in be_vid_config()
1427 return be_set_vlan_promisc(adapter); in be_vid_config()
1428 } else if (adapter->if_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS) { in be_vid_config()
1429 status = be_clear_vlan_promisc(adapter); in be_vid_config()
1436 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_add_vid() local
1440 if (lancer_chip(adapter) && vid == 0) in be_vlan_add_vid()
1443 if (test_bit(vid, adapter->vids)) in be_vlan_add_vid()
1446 set_bit(vid, adapter->vids); in be_vlan_add_vid()
1447 adapter->vlans_added++; in be_vlan_add_vid()
1449 status = be_vid_config(adapter); in be_vlan_add_vid()
1451 adapter->vlans_added--; in be_vlan_add_vid()
1452 clear_bit(vid, adapter->vids); in be_vlan_add_vid()
1460 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_rem_vid() local
1463 if (lancer_chip(adapter) && vid == 0) in be_vlan_rem_vid()
1466 clear_bit(vid, adapter->vids); in be_vlan_rem_vid()
1467 adapter->vlans_added--; in be_vlan_rem_vid()
1469 return be_vid_config(adapter); in be_vlan_rem_vid()
1472 static void be_clear_all_promisc(struct be_adapter *adapter) in be_clear_all_promisc() argument
1474 be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, OFF); in be_clear_all_promisc()
1475 adapter->if_flags &= ~BE_IF_FLAGS_ALL_PROMISCUOUS; in be_clear_all_promisc()
1478 static void be_set_all_promisc(struct be_adapter *adapter) in be_set_all_promisc() argument
1480 be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, ON); in be_set_all_promisc()
1481 adapter->if_flags |= BE_IF_FLAGS_ALL_PROMISCUOUS; in be_set_all_promisc()
1484 static void be_set_mc_promisc(struct be_adapter *adapter) in be_set_mc_promisc() argument
1488 if (adapter->if_flags & BE_IF_FLAGS_MCAST_PROMISCUOUS) in be_set_mc_promisc()
1491 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MCAST_PROMISCUOUS, ON); in be_set_mc_promisc()
1493 adapter->if_flags |= BE_IF_FLAGS_MCAST_PROMISCUOUS; in be_set_mc_promisc()
1496 static void be_set_mc_list(struct be_adapter *adapter) in be_set_mc_list() argument
1500 status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MULTICAST, ON); in be_set_mc_list()
1502 adapter->if_flags &= ~BE_IF_FLAGS_MCAST_PROMISCUOUS; in be_set_mc_list()
1504 be_set_mc_promisc(adapter); in be_set_mc_list()
1507 static void be_set_uc_list(struct be_adapter *adapter) in be_set_uc_list() argument
1512 for (; adapter->uc_macs > 0; adapter->uc_macs--, i++) in be_set_uc_list()
1513 be_cmd_pmac_del(adapter, adapter->if_handle, in be_set_uc_list()
1514 adapter->pmac_id[i], 0); in be_set_uc_list()
1516 if (netdev_uc_count(adapter->netdev) > be_max_uc(adapter)) { in be_set_uc_list()
1517 be_set_all_promisc(adapter); in be_set_uc_list()
1521 netdev_for_each_uc_addr(ha, adapter->netdev) { in be_set_uc_list()
1522 adapter->uc_macs++; /* First slot is for Primary MAC */ in be_set_uc_list()
1523 be_cmd_pmac_add(adapter, (u8 *)ha->addr, adapter->if_handle, in be_set_uc_list()
1524 &adapter->pmac_id[adapter->uc_macs], 0); in be_set_uc_list()
1528 static void be_clear_uc_list(struct be_adapter *adapter) in be_clear_uc_list() argument
1532 for (i = 1; i < (adapter->uc_macs + 1); i++) in be_clear_uc_list()
1533 be_cmd_pmac_del(adapter, adapter->if_handle, in be_clear_uc_list()
1534 adapter->pmac_id[i], 0); in be_clear_uc_list()
1535 adapter->uc_macs = 0; in be_clear_uc_list()
1540 struct be_adapter *adapter = netdev_priv(netdev); in be_set_rx_mode() local
1543 be_set_all_promisc(adapter); in be_set_rx_mode()
1548 if (be_in_all_promisc(adapter)) { in be_set_rx_mode()
1549 be_clear_all_promisc(adapter); in be_set_rx_mode()
1550 if (adapter->vlans_added) in be_set_rx_mode()
1551 be_vid_config(adapter); in be_set_rx_mode()
1556 netdev_mc_count(netdev) > be_max_mc(adapter)) { in be_set_rx_mode()
1557 be_set_mc_promisc(adapter); in be_set_rx_mode()
1561 if (netdev_uc_count(netdev) != adapter->uc_macs) in be_set_rx_mode()
1562 be_set_uc_list(adapter); in be_set_rx_mode()
1564 be_set_mc_list(adapter); in be_set_rx_mode()
1569 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_mac() local
1570 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_mac()
1573 if (!sriov_enabled(adapter)) in be_set_vf_mac()
1576 if (!is_valid_ether_addr(mac) || vf >= adapter->num_vfs) in be_set_vf_mac()
1585 if (BEx_chip(adapter)) { in be_set_vf_mac()
1586 be_cmd_pmac_del(adapter, vf_cfg->if_handle, vf_cfg->pmac_id, in be_set_vf_mac()
1589 status = be_cmd_pmac_add(adapter, mac, vf_cfg->if_handle, in be_set_vf_mac()
1592 status = be_cmd_set_mac(adapter, mac, vf_cfg->if_handle, in be_set_vf_mac()
1597 dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed: %#x", in be_set_vf_mac()
1610 struct be_adapter *adapter = netdev_priv(netdev); in be_get_vf_config() local
1611 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_get_vf_config()
1613 if (!sriov_enabled(adapter)) in be_get_vf_config()
1616 if (vf >= adapter->num_vfs) in be_get_vf_config()
1625 vi->linkstate = adapter->vf_cfg[vf].plink_tracking; in be_get_vf_config()
1626 vi->spoofchk = adapter->vf_cfg[vf].spoofchk; in be_get_vf_config()
1631 static int be_set_vf_tvt(struct be_adapter *adapter, int vf, u16 vlan) in be_set_vf_tvt() argument
1633 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_tvt()
1639 status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, vf_if_id, 0, 0); in be_set_vf_tvt()
1645 status = be_cmd_vlan_config(adapter, vf_if_id, vids, 1, vf + 1); in be_set_vf_tvt()
1647 dev_info(&adapter->pdev->dev, in be_set_vf_tvt()
1652 status = be_cmd_set_fn_privileges(adapter, vf_cfg->privileges & in be_set_vf_tvt()
1660 static int be_clear_vf_tvt(struct be_adapter *adapter, int vf) in be_clear_vf_tvt() argument
1662 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_clear_vf_tvt()
1663 struct device *dev = &adapter->pdev->dev; in be_clear_vf_tvt()
1667 status = be_cmd_set_hsw_config(adapter, BE_RESET_VLAN_TAG_ID, vf + 1, in be_clear_vf_tvt()
1674 status = be_cmd_set_fn_privileges(adapter, vf_cfg->privileges | in be_clear_vf_tvt()
1689 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_vlan() local
1690 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_vlan()
1693 if (!sriov_enabled(adapter)) in be_set_vf_vlan()
1696 if (vf >= adapter->num_vfs || vlan > 4095 || qos > 7) in be_set_vf_vlan()
1701 status = be_set_vf_tvt(adapter, vf, vlan); in be_set_vf_vlan()
1703 status = be_clear_vf_tvt(adapter, vf); in be_set_vf_vlan()
1707 dev_err(&adapter->pdev->dev, in be_set_vf_vlan()
1720 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_tx_rate() local
1721 struct device *dev = &adapter->pdev->dev; in be_set_vf_tx_rate()
1726 if (!sriov_enabled(adapter)) in be_set_vf_tx_rate()
1729 if (vf >= adapter->num_vfs) in be_set_vf_tx_rate()
1738 status = be_cmd_link_status_query(adapter, &link_speed, in be_set_vf_tx_rate()
1758 if (skyhawk_chip(adapter) && (max_tx_rate % percent_rate)) { in be_set_vf_tx_rate()
1766 status = be_cmd_config_qos(adapter, max_tx_rate, link_speed, vf + 1); in be_set_vf_tx_rate()
1770 adapter->vf_cfg[vf].tx_rate = max_tx_rate; in be_set_vf_tx_rate()
1782 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_link_state() local
1785 if (!sriov_enabled(adapter)) in be_set_vf_link_state()
1788 if (vf >= adapter->num_vfs) in be_set_vf_link_state()
1791 status = be_cmd_set_logical_link_config(adapter, link_state, vf+1); in be_set_vf_link_state()
1793 dev_err(&adapter->pdev->dev, in be_set_vf_link_state()
1798 adapter->vf_cfg[vf].plink_tracking = link_state; in be_set_vf_link_state()
1805 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_spoofchk() local
1806 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_spoofchk()
1810 if (!sriov_enabled(adapter)) in be_set_vf_spoofchk()
1813 if (vf >= adapter->num_vfs) in be_set_vf_spoofchk()
1816 if (BEx_chip(adapter)) in be_set_vf_spoofchk()
1824 status = be_cmd_set_hsw_config(adapter, 0, vf + 1, vf_cfg->if_handle, in be_set_vf_spoofchk()
1827 dev_err(&adapter->pdev->dev, in be_set_vf_spoofchk()
1846 struct be_adapter *adapter = eqo->adapter; in be_get_new_eqd() local
1856 aic = &adapter->aic_obj[eqo->idx]; in be_get_new_eqd()
1864 for_all_rx_queues_on_eq(adapter, eqo, rxo, i) { in be_get_new_eqd()
1871 for_all_tx_queues_on_eq(adapter, eqo, txo, i) { in be_get_new_eqd()
1908 struct be_adapter *adapter = eqo->adapter; in be_get_eq_delay_mult_enc() local
1909 struct be_aic_obj *aic = &adapter->aic_obj[eqo->idx]; in be_get_eq_delay_mult_enc()
1937 void be_eqd_update(struct be_adapter *adapter, bool force_update) in be_eqd_update() argument
1944 for_all_evt_queues(adapter, eqo, i) { in be_eqd_update()
1945 aic = &adapter->aic_obj[eqo->idx]; in be_eqd_update()
1956 be_cmd_modify_eqd(adapter, set_eqd, num); in be_eqd_update()
1988 struct be_adapter *adapter = rxo->adapter; in get_rx_page_info() local
1997 dma_unmap_page(&adapter->pdev->dev, in get_rx_page_info()
1999 adapter->big_page_size, DMA_FROM_DEVICE); in get_rx_page_info()
2002 dma_sync_single_for_cpu(&adapter->pdev->dev, in get_rx_page_info()
2105 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_process() local
2106 struct net_device *netdev = adapter->netdev; in be_rx_compl_process()
2124 skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]); in be_rx_compl_process()
2142 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_process_gro() local
2182 skb_record_rx_queue(skb, rxo - &adapter->rx_obj[0]); in be_rx_compl_process_gro()
2183 if (adapter->netdev->features & NETIF_F_RXHASH) in be_rx_compl_process_gro()
2244 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_get() local
2254 if (adapter->be3_native) in be_rx_compl_get()
2267 if (be_is_qnq_mode(adapter) && !rxcp->qnq) in be_rx_compl_get()
2270 if (!lancer_chip(adapter)) in be_rx_compl_get()
2273 if (adapter->pvid == (rxcp->vlan_tag & VLAN_VID_MASK) && in be_rx_compl_get()
2274 !test_bit(rxcp->vlan_tag, adapter->vids)) in be_rx_compl_get()
2300 struct be_adapter *adapter = rxo->adapter; in be_post_rx_frags() local
2304 struct device *dev = &adapter->pdev->dev; in be_post_rx_frags()
2312 pagep = be_alloc_pages(adapter->big_page_size, gfp); in be_post_rx_frags()
2318 adapter->big_page_size, in be_post_rx_frags()
2323 adapter->drv_stats.dma_map_errors++; in be_post_rx_frags()
2341 adapter->big_page_size) { in be_post_rx_frags()
2368 be_rxq_notify(adapter, rxq->id, notify); in be_post_rx_frags()
2398 static u16 be_tx_compl_process(struct be_adapter *adapter, in be_tx_compl_process() argument
2421 unmap_tx_frag(&adapter->pdev->dev, wrb, in be_tx_compl_process()
2457 be_eq_notify(eqo->adapter, eqo->q.id, false, true, num, 0); in be_eq_clean()
2480 struct be_adapter *adapter = rxo->adapter; in be_rx_cq_clean() local
2492 if (lancer_chip(adapter)) in be_rx_cq_clean()
2496 be_check_error(adapter, in be_rx_cq_clean()
2498 dev_warn(&adapter->pdev->dev, in be_rx_cq_clean()
2502 be_cq_notify(adapter, rx_cq->id, true, 0); in be_rx_cq_clean()
2506 be_cq_notify(adapter, rx_cq->id, false, 1); in be_rx_cq_clean()
2513 be_cq_notify(adapter, rx_cq->id, false, 0); in be_rx_cq_clean()
2516 static void be_tx_compl_clean(struct be_adapter *adapter) in be_tx_compl_clean() argument
2519 struct device *dev = &adapter->pdev->dev; in be_tx_compl_clean()
2527 pending_txqs = adapter->num_tx_qs; in be_tx_compl_clean()
2529 for_all_tx_queues(adapter, txo, i) { in be_tx_compl_clean()
2535 be_tx_compl_process(adapter, txo, in be_tx_compl_clean()
2540 be_cq_notify(adapter, txo->cq.id, false, cmpl); in be_tx_compl_clean()
2549 be_check_error(adapter, BE_ERROR_HW)) in be_tx_compl_clean()
2556 for_all_tx_queues(adapter, txo, i) { in be_tx_compl_clean()
2569 num_wrbs = be_tx_compl_process(adapter, txo, end_idx); in be_tx_compl_clean()
2582 static void be_evt_queues_destroy(struct be_adapter *adapter) in be_evt_queues_destroy() argument
2587 for_all_evt_queues(adapter, eqo, i) { in be_evt_queues_destroy()
2590 be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ); in be_evt_queues_destroy()
2595 be_queue_free(adapter, &eqo->q); in be_evt_queues_destroy()
2599 static int be_evt_queues_create(struct be_adapter *adapter) in be_evt_queues_create() argument
2606 adapter->num_evt_qs = min_t(u16, num_irqs(adapter), in be_evt_queues_create()
2607 adapter->cfg_num_qs); in be_evt_queues_create()
2609 for_all_evt_queues(adapter, eqo, i) { in be_evt_queues_create()
2610 int numa_node = dev_to_node(&adapter->pdev->dev); in be_evt_queues_create()
2612 aic = &adapter->aic_obj[i]; in be_evt_queues_create()
2613 eqo->adapter = adapter; in be_evt_queues_create()
2619 rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN, in be_evt_queues_create()
2624 rc = be_cmd_eq_create(adapter, eqo); in be_evt_queues_create()
2632 netif_napi_add(adapter->netdev, &eqo->napi, be_poll, in be_evt_queues_create()
2639 static void be_mcc_queues_destroy(struct be_adapter *adapter) in be_mcc_queues_destroy() argument
2643 q = &adapter->mcc_obj.q; in be_mcc_queues_destroy()
2645 be_cmd_q_destroy(adapter, q, QTYPE_MCCQ); in be_mcc_queues_destroy()
2646 be_queue_free(adapter, q); in be_mcc_queues_destroy()
2648 q = &adapter->mcc_obj.cq; in be_mcc_queues_destroy()
2650 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_mcc_queues_destroy()
2651 be_queue_free(adapter, q); in be_mcc_queues_destroy()
2655 static int be_mcc_queues_create(struct be_adapter *adapter) in be_mcc_queues_create() argument
2659 cq = &adapter->mcc_obj.cq; in be_mcc_queues_create()
2660 if (be_queue_alloc(adapter, cq, MCC_CQ_LEN, in be_mcc_queues_create()
2665 if (be_cmd_cq_create(adapter, cq, &mcc_eqo(adapter)->q, true, 0)) in be_mcc_queues_create()
2668 q = &adapter->mcc_obj.q; in be_mcc_queues_create()
2669 if (be_queue_alloc(adapter, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb))) in be_mcc_queues_create()
2672 if (be_cmd_mccq_create(adapter, q, cq)) in be_mcc_queues_create()
2678 be_queue_free(adapter, q); in be_mcc_queues_create()
2680 be_cmd_q_destroy(adapter, cq, QTYPE_CQ); in be_mcc_queues_create()
2682 be_queue_free(adapter, cq); in be_mcc_queues_create()
2687 static void be_tx_queues_destroy(struct be_adapter *adapter) in be_tx_queues_destroy() argument
2693 for_all_tx_queues(adapter, txo, i) { in be_tx_queues_destroy()
2696 be_cmd_q_destroy(adapter, q, QTYPE_TXQ); in be_tx_queues_destroy()
2697 be_queue_free(adapter, q); in be_tx_queues_destroy()
2701 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_tx_queues_destroy()
2702 be_queue_free(adapter, q); in be_tx_queues_destroy()
2706 static int be_tx_qs_create(struct be_adapter *adapter) in be_tx_qs_create() argument
2713 adapter->num_tx_qs = min(adapter->num_evt_qs, be_max_txqs(adapter)); in be_tx_qs_create()
2715 for_all_tx_queues(adapter, txo, i) { in be_tx_qs_create()
2717 status = be_queue_alloc(adapter, cq, TX_CQ_LEN, in be_tx_qs_create()
2728 eqo = &adapter->eq_obj[i % adapter->num_evt_qs]; in be_tx_qs_create()
2729 status = be_cmd_cq_create(adapter, cq, &eqo->q, false, 3); in be_tx_qs_create()
2733 status = be_queue_alloc(adapter, &txo->q, TX_Q_LEN, in be_tx_qs_create()
2738 status = be_cmd_txq_create(adapter, txo); in be_tx_qs_create()
2742 netif_set_xps_queue(adapter->netdev, eqo->affinity_mask, in be_tx_qs_create()
2746 dev_info(&adapter->pdev->dev, "created %d TX queue(s)\n", in be_tx_qs_create()
2747 adapter->num_tx_qs); in be_tx_qs_create()
2751 static void be_rx_cqs_destroy(struct be_adapter *adapter) in be_rx_cqs_destroy() argument
2757 for_all_rx_queues(adapter, rxo, i) { in be_rx_cqs_destroy()
2760 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_rx_cqs_destroy()
2761 be_queue_free(adapter, q); in be_rx_cqs_destroy()
2765 static int be_rx_cqs_create(struct be_adapter *adapter) in be_rx_cqs_create() argument
2772 adapter->num_rss_qs = adapter->num_evt_qs; in be_rx_cqs_create()
2775 if (adapter->num_rss_qs <= 1) in be_rx_cqs_create()
2776 adapter->num_rss_qs = 0; in be_rx_cqs_create()
2778 adapter->num_rx_qs = adapter->num_rss_qs + adapter->need_def_rxq; in be_rx_cqs_create()
2783 if (adapter->num_rx_qs == 0) in be_rx_cqs_create()
2784 adapter->num_rx_qs = 1; in be_rx_cqs_create()
2786 adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE; in be_rx_cqs_create()
2787 for_all_rx_queues(adapter, rxo, i) { in be_rx_cqs_create()
2788 rxo->adapter = adapter; in be_rx_cqs_create()
2790 rc = be_queue_alloc(adapter, cq, RX_CQ_LEN, in be_rx_cqs_create()
2796 eq = &adapter->eq_obj[i % adapter->num_evt_qs].q; in be_rx_cqs_create()
2797 rc = be_cmd_cq_create(adapter, cq, eq, false, 3); in be_rx_cqs_create()
2802 dev_info(&adapter->pdev->dev, in be_rx_cqs_create()
2803 "created %d RX queue(s)\n", adapter->num_rx_qs); in be_rx_cqs_create()
2810 struct be_adapter *adapter = eqo->adapter; in be_intx() local
2827 be_eq_notify(adapter, eqo->q.id, false, true, num_evts, 0); in be_intx()
2843 be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0, 0); in be_msix()
2856 struct be_adapter *adapter = rxo->adapter; in be_process_rx() local
2880 if (unlikely(rxcp->port != adapter->port_num && in be_process_rx()
2881 !lancer_chip(adapter))) { in be_process_rx()
2898 be_cq_notify(adapter, rx_cq->id, true, work_done); in be_process_rx()
2950 static void be_process_tx(struct be_adapter *adapter, struct be_tx_obj *txo, in be_process_tx() argument
2957 num_wrbs += be_tx_compl_process(adapter, txo, txcp->end_index); in be_process_tx()
2961 if (lancer_chip(adapter)) in be_process_tx()
2969 be_cq_notify(adapter, txo->cq.id, true, work_done); in be_process_tx()
2974 if (__netif_subqueue_stopped(adapter->netdev, idx) && in be_process_tx()
2976 netif_wake_subqueue(adapter->netdev, idx); in be_process_tx()
3088 struct be_adapter *adapter = eqo->adapter; in be_poll() local
3096 for_all_tx_queues_on_eq(adapter, eqo, txo, i) in be_poll()
3097 be_process_tx(adapter, txo, i); in be_poll()
3104 for_all_rx_queues_on_eq(adapter, eqo, rxo, i) { in be_poll()
3114 be_process_mcc(adapter); in be_poll()
3122 if (skyhawk_chip(adapter)) in be_poll()
3125 be_eq_notify(adapter, eqo->q.id, true, false, num_evts, in be_poll()
3129 be_eq_notify(adapter, eqo->q.id, false, false, num_evts, 0); in be_poll()
3138 struct be_adapter *adapter = eqo->adapter; in be_busy_poll() local
3145 for_all_rx_queues_on_eq(adapter, eqo, rxo, i) { in be_busy_poll()
3156 void be_detect_error(struct be_adapter *adapter) in be_detect_error() argument
3161 struct device *dev = &adapter->pdev->dev; in be_detect_error()
3163 if (be_check_error(adapter, BE_ERROR_HW)) in be_detect_error()
3166 if (lancer_chip(adapter)) { in be_detect_error()
3167 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in be_detect_error()
3169 be_set_error(adapter, BE_ERROR_UE); in be_detect_error()
3170 sliport_err1 = ioread32(adapter->db + in be_detect_error()
3172 sliport_err2 = ioread32(adapter->db + in be_detect_error()
3189 ue_lo = ioread32(adapter->pcicfg + PCICFG_UE_STATUS_LOW); in be_detect_error()
3190 ue_hi = ioread32(adapter->pcicfg + PCICFG_UE_STATUS_HIGH); in be_detect_error()
3191 ue_lo_mask = ioread32(adapter->pcicfg + in be_detect_error()
3193 ue_hi_mask = ioread32(adapter->pcicfg + in be_detect_error()
3208 if (skyhawk_chip(adapter)) in be_detect_error()
3209 be_set_error(adapter, BE_ERROR_UE); in be_detect_error()
3225 static void be_msix_disable(struct be_adapter *adapter) in be_msix_disable() argument
3227 if (msix_enabled(adapter)) { in be_msix_disable()
3228 pci_disable_msix(adapter->pdev); in be_msix_disable()
3229 adapter->num_msix_vec = 0; in be_msix_disable()
3230 adapter->num_msix_roce_vec = 0; in be_msix_disable()
3234 static int be_msix_enable(struct be_adapter *adapter) in be_msix_enable() argument
3237 struct device *dev = &adapter->pdev->dev; in be_msix_enable()
3243 if (be_roce_supported(adapter)) in be_msix_enable()
3244 num_vec = min_t(int, 2 * be_max_eqs(adapter), in be_msix_enable()
3247 num_vec = adapter->cfg_num_qs; in be_msix_enable()
3250 adapter->msix_entries[i].entry = i; in be_msix_enable()
3252 num_vec = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, in be_msix_enable()
3257 if (be_roce_supported(adapter) && num_vec > MIN_MSIX_VECTORS) { in be_msix_enable()
3258 adapter->num_msix_roce_vec = num_vec / 2; in be_msix_enable()
3260 adapter->num_msix_roce_vec); in be_msix_enable()
3263 adapter->num_msix_vec = num_vec - adapter->num_msix_roce_vec; in be_msix_enable()
3266 adapter->num_msix_vec); in be_msix_enable()
3273 if (be_virtfn(adapter)) in be_msix_enable()
3278 static inline int be_msix_vec_get(struct be_adapter *adapter, in be_msix_vec_get() argument
3281 return adapter->msix_entries[eqo->msix_idx].vector; in be_msix_vec_get()
3284 static int be_msix_register(struct be_adapter *adapter) in be_msix_register() argument
3286 struct net_device *netdev = adapter->netdev; in be_msix_register()
3290 for_all_evt_queues(adapter, eqo, i) { in be_msix_register()
3292 vec = be_msix_vec_get(adapter, eqo); in be_msix_register()
3303 eqo = &adapter->eq_obj[i]; in be_msix_register()
3304 free_irq(be_msix_vec_get(adapter, eqo), eqo); in be_msix_register()
3306 dev_warn(&adapter->pdev->dev, "MSIX Request IRQ failed - err %d\n", in be_msix_register()
3308 be_msix_disable(adapter); in be_msix_register()
3312 static int be_irq_register(struct be_adapter *adapter) in be_irq_register() argument
3314 struct net_device *netdev = adapter->netdev; in be_irq_register()
3317 if (msix_enabled(adapter)) { in be_irq_register()
3318 status = be_msix_register(adapter); in be_irq_register()
3322 if (be_virtfn(adapter)) in be_irq_register()
3327 netdev->irq = adapter->pdev->irq; in be_irq_register()
3329 &adapter->eq_obj[0]); in be_irq_register()
3331 dev_err(&adapter->pdev->dev, in be_irq_register()
3336 adapter->isr_registered = true; in be_irq_register()
3340 static void be_irq_unregister(struct be_adapter *adapter) in be_irq_unregister() argument
3342 struct net_device *netdev = adapter->netdev; in be_irq_unregister()
3346 if (!adapter->isr_registered) in be_irq_unregister()
3350 if (!msix_enabled(adapter)) { in be_irq_unregister()
3351 free_irq(netdev->irq, &adapter->eq_obj[0]); in be_irq_unregister()
3356 for_all_evt_queues(adapter, eqo, i) { in be_irq_unregister()
3357 vec = be_msix_vec_get(adapter, eqo); in be_irq_unregister()
3363 adapter->isr_registered = false; in be_irq_unregister()
3366 static void be_rx_qs_destroy(struct be_adapter *adapter) in be_rx_qs_destroy() argument
3372 for_all_rx_queues(adapter, rxo, i) { in be_rx_qs_destroy()
3381 if (lancer_chip(adapter)) { in be_rx_qs_destroy()
3388 be_cmd_rxq_destroy(adapter, q); in be_rx_qs_destroy()
3392 be_queue_free(adapter, q); in be_rx_qs_destroy()
3396 static void be_disable_if_filters(struct be_adapter *adapter) in be_disable_if_filters() argument
3398 be_cmd_pmac_del(adapter, adapter->if_handle, in be_disable_if_filters()
3399 adapter->pmac_id[0], 0); in be_disable_if_filters()
3401 be_clear_uc_list(adapter); in be_disable_if_filters()
3417 if (lancer_chip(adapter)) { in be_disable_if_filters()
3418 be_cmd_rx_filter(adapter, BE_IF_ALL_FILT_FLAGS, OFF); in be_disable_if_filters()
3419 adapter->if_flags &= ~BE_IF_ALL_FILT_FLAGS; in be_disable_if_filters()
3425 struct be_adapter *adapter = netdev_priv(netdev); in be_close() local
3432 if (!(adapter->flags & BE_FLAGS_SETUP_DONE)) in be_close()
3435 be_disable_if_filters(adapter); in be_close()
3437 if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { in be_close()
3438 for_all_evt_queues(adapter, eqo, i) { in be_close()
3442 adapter->flags &= ~BE_FLAGS_NAPI_ENABLED; in be_close()
3445 be_async_mcc_disable(adapter); in be_close()
3451 be_tx_compl_clean(adapter); in be_close()
3453 be_rx_qs_destroy(adapter); in be_close()
3455 for_all_evt_queues(adapter, eqo, i) { in be_close()
3456 if (msix_enabled(adapter)) in be_close()
3457 synchronize_irq(be_msix_vec_get(adapter, eqo)); in be_close()
3463 be_irq_unregister(adapter); in be_close()
3468 static int be_rx_qs_create(struct be_adapter *adapter) in be_rx_qs_create() argument
3470 struct rss_info *rss = &adapter->rss_info; in be_rx_qs_create()
3475 for_all_rx_queues(adapter, rxo, i) { in be_rx_qs_create()
3476 rc = be_queue_alloc(adapter, &rxo->q, RX_Q_LEN, in be_rx_qs_create()
3482 if (adapter->need_def_rxq || !adapter->num_rss_qs) { in be_rx_qs_create()
3483 rxo = default_rxo(adapter); in be_rx_qs_create()
3484 rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, in be_rx_qs_create()
3485 rx_frag_size, adapter->if_handle, in be_rx_qs_create()
3491 for_all_rss_queues(adapter, rxo, i) { in be_rx_qs_create()
3492 rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, in be_rx_qs_create()
3493 rx_frag_size, adapter->if_handle, in be_rx_qs_create()
3499 if (be_multi_rxq(adapter)) { in be_rx_qs_create()
3500 for (j = 0; j < RSS_INDIR_TABLE_LEN; j += adapter->num_rss_qs) { in be_rx_qs_create()
3501 for_all_rss_queues(adapter, rxo, i) { in be_rx_qs_create()
3511 if (!BEx_chip(adapter)) in be_rx_qs_create()
3520 rc = be_cmd_rss_config(adapter, rss->rsstable, rss->rss_flags, in be_rx_qs_create()
3532 for_all_rx_queues(adapter, rxo, i) in be_rx_qs_create()
3538 static int be_enable_if_filters(struct be_adapter *adapter) in be_enable_if_filters() argument
3542 status = be_cmd_rx_filter(adapter, BE_IF_EN_FLAGS, ON); in be_enable_if_filters()
3547 if (!(BEx_chip(adapter) && be_virtfn(adapter))) { in be_enable_if_filters()
3548 status = be_cmd_pmac_add(adapter, adapter->netdev->dev_addr, in be_enable_if_filters()
3549 adapter->if_handle, in be_enable_if_filters()
3550 &adapter->pmac_id[0], 0); in be_enable_if_filters()
3555 if (adapter->vlans_added) in be_enable_if_filters()
3556 be_vid_config(adapter); in be_enable_if_filters()
3558 be_set_rx_mode(adapter->netdev); in be_enable_if_filters()
3565 struct be_adapter *adapter = netdev_priv(netdev); in be_open() local
3572 status = be_rx_qs_create(adapter); in be_open()
3576 status = be_enable_if_filters(adapter); in be_open()
3580 status = be_irq_register(adapter); in be_open()
3584 for_all_rx_queues(adapter, rxo, i) in be_open()
3585 be_cq_notify(adapter, rxo->cq.id, true, 0); in be_open()
3587 for_all_tx_queues(adapter, txo, i) in be_open()
3588 be_cq_notify(adapter, txo->cq.id, true, 0); in be_open()
3590 be_async_mcc_enable(adapter); in be_open()
3592 for_all_evt_queues(adapter, eqo, i) { in be_open()
3595 be_eq_notify(adapter, eqo->q.id, true, true, 0, 0); in be_open()
3597 adapter->flags |= BE_FLAGS_NAPI_ENABLED; in be_open()
3599 status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); in be_open()
3601 be_link_status_update(adapter, link_status); in be_open()
3605 if (skyhawk_chip(adapter)) in be_open()
3611 be_close(adapter->netdev); in be_open()
3615 static int be_setup_wol(struct be_adapter *adapter, bool enable) in be_setup_wol() argument
3617 struct device *dev = &adapter->pdev->dev; in be_setup_wol()
3630 status = pci_write_config_dword(adapter->pdev, in be_setup_wol()
3638 ether_addr_copy(mac, adapter->netdev->dev_addr); in be_setup_wol()
3641 status = be_cmd_enable_magic_wol(adapter, mac, &cmd); in be_setup_wol()
3642 pci_enable_wake(adapter->pdev, PCI_D3hot, enable); in be_setup_wol()
3643 pci_enable_wake(adapter->pdev, PCI_D3cold, enable); in be_setup_wol()
3649 static void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac) in be_vf_eth_addr_generate() argument
3653 addr = jhash(adapter->netdev->dev_addr, ETH_ALEN, 0); in be_vf_eth_addr_generate()
3659 memcpy(mac, adapter->netdev->dev_addr, 3); in be_vf_eth_addr_generate()
3668 static int be_vf_eth_addr_config(struct be_adapter *adapter) in be_vf_eth_addr_config() argument
3675 be_vf_eth_addr_generate(adapter, mac); in be_vf_eth_addr_config()
3677 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_eth_addr_config()
3678 if (BEx_chip(adapter)) in be_vf_eth_addr_config()
3679 status = be_cmd_pmac_add(adapter, mac, in be_vf_eth_addr_config()
3683 status = be_cmd_set_mac(adapter, mac, vf_cfg->if_handle, in be_vf_eth_addr_config()
3687 dev_err(&adapter->pdev->dev, in be_vf_eth_addr_config()
3698 static int be_vfs_mac_query(struct be_adapter *adapter) in be_vfs_mac_query() argument
3704 for_all_vfs(adapter, vf_cfg, vf) { in be_vfs_mac_query()
3705 status = be_cmd_get_active_mac(adapter, vf_cfg->pmac_id, in be_vfs_mac_query()
3715 static void be_vf_clear(struct be_adapter *adapter) in be_vf_clear() argument
3720 if (pci_vfs_assigned(adapter->pdev)) { in be_vf_clear()
3721 dev_warn(&adapter->pdev->dev, in be_vf_clear()
3726 pci_disable_sriov(adapter->pdev); in be_vf_clear()
3728 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_clear()
3729 if (BEx_chip(adapter)) in be_vf_clear()
3730 be_cmd_pmac_del(adapter, vf_cfg->if_handle, in be_vf_clear()
3733 be_cmd_set_mac(adapter, NULL, vf_cfg->if_handle, in be_vf_clear()
3736 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1); in be_vf_clear()
3739 kfree(adapter->vf_cfg); in be_vf_clear()
3740 adapter->num_vfs = 0; in be_vf_clear()
3741 adapter->flags &= ~BE_FLAGS_SRIOV_ENABLED; in be_vf_clear()
3744 static void be_clear_queues(struct be_adapter *adapter) in be_clear_queues() argument
3746 be_mcc_queues_destroy(adapter); in be_clear_queues()
3747 be_rx_cqs_destroy(adapter); in be_clear_queues()
3748 be_tx_queues_destroy(adapter); in be_clear_queues()
3749 be_evt_queues_destroy(adapter); in be_clear_queues()
3752 static void be_cancel_worker(struct be_adapter *adapter) in be_cancel_worker() argument
3754 if (adapter->flags & BE_FLAGS_WORKER_SCHEDULED) { in be_cancel_worker()
3755 cancel_delayed_work_sync(&adapter->work); in be_cancel_worker()
3756 adapter->flags &= ~BE_FLAGS_WORKER_SCHEDULED; in be_cancel_worker()
3760 static void be_cancel_err_detection(struct be_adapter *adapter) in be_cancel_err_detection() argument
3762 if (adapter->flags & BE_FLAGS_ERR_DETECTION_SCHEDULED) { in be_cancel_err_detection()
3763 cancel_delayed_work_sync(&adapter->be_err_detection_work); in be_cancel_err_detection()
3764 adapter->flags &= ~BE_FLAGS_ERR_DETECTION_SCHEDULED; in be_cancel_err_detection()
3769 static void be_disable_vxlan_offloads(struct be_adapter *adapter) in be_disable_vxlan_offloads() argument
3771 struct net_device *netdev = adapter->netdev; in be_disable_vxlan_offloads()
3773 if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) in be_disable_vxlan_offloads()
3774 be_cmd_manage_iface(adapter, adapter->if_handle, in be_disable_vxlan_offloads()
3777 if (adapter->vxlan_port) in be_disable_vxlan_offloads()
3778 be_cmd_set_vxlan_port(adapter, 0); in be_disable_vxlan_offloads()
3780 adapter->flags &= ~BE_FLAGS_VXLAN_OFFLOADS; in be_disable_vxlan_offloads()
3781 adapter->vxlan_port = 0; in be_disable_vxlan_offloads()
3789 static u16 be_calculate_vf_qs(struct be_adapter *adapter, u16 num_vfs) in be_calculate_vf_qs() argument
3791 struct be_resources res = adapter->pool_res; in be_calculate_vf_qs()
3797 if (num_vfs && !be_is_mc(adapter)) { in be_calculate_vf_qs()
3802 if (num_vfs < (be_max_vfs(adapter) - 8)) in be_calculate_vf_qs()
3817 static int be_clear(struct be_adapter *adapter) in be_clear() argument
3819 struct pci_dev *pdev = adapter->pdev; in be_clear()
3822 be_cancel_worker(adapter); in be_clear()
3824 if (sriov_enabled(adapter)) in be_clear()
3825 be_vf_clear(adapter); in be_clear()
3830 if (skyhawk_chip(adapter) && be_physfn(adapter) && in be_clear()
3832 num_vf_qs = be_calculate_vf_qs(adapter, in be_clear()
3834 be_cmd_set_sriov_config(adapter, adapter->pool_res, in be_clear()
3840 be_disable_vxlan_offloads(adapter); in be_clear()
3842 kfree(adapter->pmac_id); in be_clear()
3843 adapter->pmac_id = NULL; in be_clear()
3845 be_cmd_if_destroy(adapter, adapter->if_handle, 0); in be_clear()
3847 be_clear_queues(adapter); in be_clear()
3849 be_msix_disable(adapter); in be_clear()
3850 adapter->flags &= ~BE_FLAGS_SETUP_DONE; in be_clear()
3854 static int be_vfs_if_create(struct be_adapter *adapter) in be_vfs_if_create() argument
3865 for_all_vfs(adapter, vf_cfg, vf) { in be_vfs_if_create()
3866 if (!BE3_chip(adapter)) { in be_vfs_if_create()
3867 status = be_cmd_get_profile_config(adapter, &res, in be_vfs_if_create()
3883 status = be_cmd_if_create(adapter, cap_flags, en_flags, in be_vfs_if_create()
3892 static int be_vf_setup_init(struct be_adapter *adapter) in be_vf_setup_init() argument
3897 adapter->vf_cfg = kcalloc(adapter->num_vfs, sizeof(*vf_cfg), in be_vf_setup_init()
3899 if (!adapter->vf_cfg) in be_vf_setup_init()
3902 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup_init()
3909 static int be_vf_setup(struct be_adapter *adapter) in be_vf_setup() argument
3911 struct device *dev = &adapter->pdev->dev; in be_vf_setup()
3916 old_vfs = pci_num_vf(adapter->pdev); in be_vf_setup()
3918 status = be_vf_setup_init(adapter); in be_vf_setup()
3923 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
3924 status = be_cmd_get_if_id(adapter, vf_cfg, vf); in be_vf_setup()
3929 status = be_vfs_mac_query(adapter); in be_vf_setup()
3933 status = be_vfs_if_create(adapter); in be_vf_setup()
3937 status = be_vf_eth_addr_config(adapter); in be_vf_setup()
3942 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
3944 status = be_cmd_get_fn_privileges(adapter, &vf_cfg->privileges, in be_vf_setup()
3947 status = be_cmd_set_fn_privileges(adapter, in be_vf_setup()
3960 be_cmd_config_qos(adapter, 0, 0, vf + 1); in be_vf_setup()
3962 status = be_cmd_get_hsw_config(adapter, NULL, vf + 1, in be_vf_setup()
3969 be_cmd_enable_vf(adapter, vf + 1); in be_vf_setup()
3970 be_cmd_set_logical_link_config(adapter, in be_vf_setup()
3977 status = pci_enable_sriov(adapter->pdev, adapter->num_vfs); in be_vf_setup()
3980 adapter->num_vfs = 0; in be_vf_setup()
3985 adapter->flags |= BE_FLAGS_SRIOV_ENABLED; in be_vf_setup()
3989 be_vf_clear(adapter); in be_vf_setup()
4010 static void BEx_get_resources(struct be_adapter *adapter, in BEx_get_resources() argument
4013 bool use_sriov = adapter->num_vfs ? 1 : 0; in BEx_get_resources()
4015 if (be_physfn(adapter)) in BEx_get_resources()
4020 adapter->mc_type = be_convert_mc_type(adapter->function_mode); in BEx_get_resources()
4022 if (be_is_mc(adapter)) { in BEx_get_resources()
4026 if (be_is_qnq_mode(adapter)) in BEx_get_resources()
4043 if (BE2_chip(adapter) || use_sriov || (adapter->port_num > 1) || in BEx_get_resources()
4044 be_virtfn(adapter) || in BEx_get_resources()
4045 (be_is_mc(adapter) && in BEx_get_resources()
4046 !(adapter->function_caps & BE_FUNCTION_CAPS_RSS))) { in BEx_get_resources()
4048 } else if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { in BEx_get_resources()
4054 be_cmd_get_profile_config(adapter, &super_nic_res, in BEx_get_resources()
4062 if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && in BEx_get_resources()
4063 !use_sriov && be_physfn(adapter)) in BEx_get_resources()
4064 res->max_rss_qs = (adapter->be3_native) ? in BEx_get_resources()
4068 if (be_physfn(adapter)) in BEx_get_resources()
4069 res->max_evt_qs = (be_max_vfs(adapter) > 0) ? in BEx_get_resources()
4076 if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) in BEx_get_resources()
4080 static void be_setup_init(struct be_adapter *adapter) in be_setup_init() argument
4082 adapter->vlan_prio_bmap = 0xff; in be_setup_init()
4083 adapter->phy.link_speed = -1; in be_setup_init()
4084 adapter->if_handle = -1; in be_setup_init()
4085 adapter->be3_native = false; in be_setup_init()
4086 adapter->if_flags = 0; in be_setup_init()
4087 if (be_physfn(adapter)) in be_setup_init()
4088 adapter->cmd_privileges = MAX_PRIVILEGES; in be_setup_init()
4090 adapter->cmd_privileges = MIN_PRIVILEGES; in be_setup_init()
4093 static int be_get_sriov_config(struct be_adapter *adapter) in be_get_sriov_config() argument
4098 be_cmd_get_profile_config(adapter, &res, RESOURCE_LIMITS, 0); in be_get_sriov_config()
4101 if (BE3_chip(adapter) && !res.max_vfs) { in be_get_sriov_config()
4102 max_vfs = pci_sriov_get_totalvfs(adapter->pdev); in be_get_sriov_config()
4106 adapter->pool_res = res; in be_get_sriov_config()
4112 old_vfs = pci_num_vf(adapter->pdev); in be_get_sriov_config()
4114 dev_info(&adapter->pdev->dev, "%d VFs are already enabled\n", in be_get_sriov_config()
4117 adapter->pool_res.max_vfs = in be_get_sriov_config()
4118 pci_sriov_get_totalvfs(adapter->pdev); in be_get_sriov_config()
4119 adapter->num_vfs = old_vfs; in be_get_sriov_config()
4125 static void be_alloc_sriov_res(struct be_adapter *adapter) in be_alloc_sriov_res() argument
4127 int old_vfs = pci_num_vf(adapter->pdev); in be_alloc_sriov_res()
4131 be_get_sriov_config(adapter); in be_alloc_sriov_res()
4134 pci_sriov_set_totalvfs(adapter->pdev, be_max_vfs(adapter)); in be_alloc_sriov_res()
4141 if (skyhawk_chip(adapter) && be_max_vfs(adapter) && !old_vfs) { in be_alloc_sriov_res()
4142 num_vf_qs = be_calculate_vf_qs(adapter, 0); in be_alloc_sriov_res()
4143 status = be_cmd_set_sriov_config(adapter, adapter->pool_res, 0, in be_alloc_sriov_res()
4146 dev_err(&adapter->pdev->dev, in be_alloc_sriov_res()
4151 static int be_get_resources(struct be_adapter *adapter) in be_get_resources() argument
4153 struct device *dev = &adapter->pdev->dev; in be_get_resources()
4157 if (BEx_chip(adapter)) { in be_get_resources()
4158 BEx_get_resources(adapter, &res); in be_get_resources()
4159 adapter->res = res; in be_get_resources()
4166 if (!BEx_chip(adapter)) { in be_get_resources()
4167 status = be_cmd_get_func_config(adapter, &res); in be_get_resources()
4177 if (be_roce_supported(adapter)) in be_get_resources()
4179 adapter->res = res; in be_get_resources()
4185 adapter->need_def_rxq = (be_if_cap_flags(adapter) & in be_get_resources()
4189 be_max_txqs(adapter), be_max_rxqs(adapter), in be_get_resources()
4190 be_max_rss(adapter), be_max_eqs(adapter), in be_get_resources()
4191 be_max_vfs(adapter)); in be_get_resources()
4193 be_max_uc(adapter), be_max_mc(adapter), in be_get_resources()
4194 be_max_vlans(adapter)); in be_get_resources()
4197 adapter->cfg_num_qs = min_t(u16, netif_get_num_default_rss_queues(), in be_get_resources()
4198 be_max_qs(adapter)); in be_get_resources()
4202 static int be_get_config(struct be_adapter *adapter) in be_get_config() argument
4207 status = be_cmd_query_fw_cfg(adapter); in be_get_config()
4211 if (BEx_chip(adapter)) { in be_get_config()
4212 level = be_cmd_get_fw_log_level(adapter); in be_get_config()
4213 adapter->msg_enable = in be_get_config()
4217 be_cmd_get_acpi_wol_cap(adapter); in be_get_config()
4219 be_cmd_query_port_name(adapter); in be_get_config()
4221 if (be_physfn(adapter)) { in be_get_config()
4222 status = be_cmd_get_active_profile(adapter, &profile_id); in be_get_config()
4224 dev_info(&adapter->pdev->dev, in be_get_config()
4228 status = be_get_resources(adapter); in be_get_config()
4232 adapter->pmac_id = kcalloc(be_max_uc(adapter), in be_get_config()
4233 sizeof(*adapter->pmac_id), GFP_KERNEL); in be_get_config()
4234 if (!adapter->pmac_id) in be_get_config()
4240 static int be_mac_setup(struct be_adapter *adapter) in be_mac_setup() argument
4245 if (is_zero_ether_addr(adapter->netdev->dev_addr)) { in be_mac_setup()
4246 status = be_cmd_get_perm_mac(adapter, mac); in be_mac_setup()
4250 memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); in be_mac_setup()
4251 memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); in be_mac_setup()
4257 static void be_schedule_worker(struct be_adapter *adapter) in be_schedule_worker() argument
4259 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); in be_schedule_worker()
4260 adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; in be_schedule_worker()
4263 static void be_schedule_err_detection(struct be_adapter *adapter) in be_schedule_err_detection() argument
4265 schedule_delayed_work(&adapter->be_err_detection_work, in be_schedule_err_detection()
4267 adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED; in be_schedule_err_detection()
4270 static int be_setup_queues(struct be_adapter *adapter) in be_setup_queues() argument
4272 struct net_device *netdev = adapter->netdev; in be_setup_queues()
4275 status = be_evt_queues_create(adapter); in be_setup_queues()
4279 status = be_tx_qs_create(adapter); in be_setup_queues()
4283 status = be_rx_cqs_create(adapter); in be_setup_queues()
4287 status = be_mcc_queues_create(adapter); in be_setup_queues()
4291 status = netif_set_real_num_rx_queues(netdev, adapter->num_rx_qs); in be_setup_queues()
4295 status = netif_set_real_num_tx_queues(netdev, adapter->num_tx_qs); in be_setup_queues()
4301 dev_err(&adapter->pdev->dev, "queue_setup failed\n"); in be_setup_queues()
4305 int be_update_queues(struct be_adapter *adapter) in be_update_queues() argument
4307 struct net_device *netdev = adapter->netdev; in be_update_queues()
4313 be_cancel_worker(adapter); in be_update_queues()
4318 if (!adapter->num_msix_roce_vec) in be_update_queues()
4319 be_msix_disable(adapter); in be_update_queues()
4321 be_clear_queues(adapter); in be_update_queues()
4323 if (!msix_enabled(adapter)) { in be_update_queues()
4324 status = be_msix_enable(adapter); in be_update_queues()
4329 status = be_setup_queues(adapter); in be_update_queues()
4333 be_schedule_worker(adapter); in be_update_queues()
4353 static bool be_reset_required(struct be_adapter *adapter) in be_reset_required() argument
4355 return pci_num_vf(adapter->pdev) ? false : true; in be_reset_required()
4359 static int be_func_init(struct be_adapter *adapter) in be_func_init() argument
4363 status = be_fw_wait_ready(adapter); in be_func_init()
4367 if (be_reset_required(adapter)) { in be_func_init()
4368 status = be_cmd_reset_function(adapter); in be_func_init()
4376 be_clear_error(adapter, BE_CLEAR_ALL); in be_func_init()
4380 status = be_cmd_fw_init(adapter); in be_func_init()
4385 be_intr_set(adapter, true); in be_func_init()
4390 static int be_setup(struct be_adapter *adapter) in be_setup() argument
4392 struct device *dev = &adapter->pdev->dev; in be_setup()
4396 status = be_func_init(adapter); in be_setup()
4400 be_setup_init(adapter); in be_setup()
4402 if (!lancer_chip(adapter)) in be_setup()
4403 be_cmd_req_native_mode(adapter); in be_setup()
4406 status = be_cmd_get_cntl_attributes(adapter); in be_setup()
4410 if (!BE2_chip(adapter) && be_physfn(adapter)) in be_setup()
4411 be_alloc_sriov_res(adapter); in be_setup()
4413 status = be_get_config(adapter); in be_setup()
4417 status = be_msix_enable(adapter); in be_setup()
4423 en_flags = en_flags & be_if_cap_flags(adapter); in be_setup()
4424 status = be_cmd_if_create(adapter, be_if_cap_flags(adapter), en_flags, in be_setup()
4425 &adapter->if_handle, 0); in be_setup()
4431 status = be_setup_queues(adapter); in be_setup()
4436 be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0); in be_setup()
4438 status = be_mac_setup(adapter); in be_setup()
4442 be_cmd_get_fw_ver(adapter); in be_setup()
4443 dev_info(dev, "FW version is %s\n", adapter->fw_ver); in be_setup()
4445 if (BE2_chip(adapter) && fw_major_num(adapter->fw_ver) < 4) { in be_setup()
4447 adapter->fw_ver); in be_setup()
4451 status = be_cmd_set_flow_control(adapter, adapter->tx_fc, in be_setup()
4452 adapter->rx_fc); in be_setup()
4454 be_cmd_get_flow_control(adapter, &adapter->tx_fc, in be_setup()
4455 &adapter->rx_fc); in be_setup()
4457 dev_info(&adapter->pdev->dev, "HW Flow control - TX:%d RX:%d\n", in be_setup()
4458 adapter->tx_fc, adapter->rx_fc); in be_setup()
4460 if (be_physfn(adapter)) in be_setup()
4461 be_cmd_set_logical_link_config(adapter, in be_setup()
4464 if (adapter->num_vfs) in be_setup()
4465 be_vf_setup(adapter); in be_setup()
4467 status = be_cmd_get_phy_info(adapter); in be_setup()
4468 if (!status && be_pause_supported(adapter)) in be_setup()
4469 adapter->phy.fc_autoneg = 1; in be_setup()
4471 be_schedule_worker(adapter); in be_setup()
4472 adapter->flags |= BE_FLAGS_SETUP_DONE; in be_setup()
4475 be_clear(adapter); in be_setup()
4482 struct be_adapter *adapter = netdev_priv(netdev); in be_netpoll() local
4486 for_all_evt_queues(adapter, eqo, i) { in be_netpoll()
4487 be_eq_notify(eqo->adapter, eqo->q.id, false, true, 0, 0); in be_netpoll()
4495 static bool phy_flashing_required(struct be_adapter *adapter) in phy_flashing_required() argument
4497 return (adapter->phy.phy_type == PHY_TYPE_TN_8022 && in phy_flashing_required()
4498 adapter->phy.interface_type == PHY_TYPE_BASET_10GB); in phy_flashing_required()
4501 static bool is_comp_in_ufi(struct be_adapter *adapter, in is_comp_in_ufi() argument
4507 if (BE2_chip(adapter)) in is_comp_in_ufi()
4523 static struct flash_section_info *get_fsec_info(struct be_adapter *adapter, in get_fsec_info() argument
4540 static int be_check_flash_crc(struct be_adapter *adapter, const u8 *p, in be_check_flash_crc() argument
4548 status = be_cmd_get_flash_crc(adapter, crc, img_optype, img_offset, in be_check_flash_crc()
4564 static int be_flash(struct be_adapter *adapter, const u8 *img, in be_flash() argument
4591 status = be_cmd_write_flashrom(adapter, flash_cmd, optype, in be_flash()
4606 static int be_flash_BEx(struct be_adapter *adapter, in be_flash_BEx() argument
4611 struct device *dev = &adapter->pdev->dev; in be_flash_BEx()
4660 if (BE3_chip(adapter)) { in be_flash_BEx()
4672 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); in be_flash_BEx()
4678 if (!is_comp_in_ufi(adapter, fsec, pflashcomp[i].img_type)) in be_flash_BEx()
4682 memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) in be_flash_BEx()
4686 !phy_flashing_required(adapter)) in be_flash_BEx()
4690 status = be_check_flash_crc(adapter, fw->data, in be_flash_BEx()
4712 status = be_flash(adapter, p, flash_cmd, pflashcomp[i].optype, in be_flash_BEx()
4775 static int be_flash_skyhawk(struct be_adapter *adapter, in be_flash_skyhawk() argument
4781 struct device *dev = &adapter->pdev->dev; in be_flash_skyhawk()
4789 fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw); in be_flash_skyhawk()
4817 status = be_check_flash_crc(adapter, fw->data, img_offset, in be_flash_skyhawk()
4856 status = be_flash(adapter, p, flash_cmd, flash_optype, img_size, in be_flash_skyhawk()
4886 static int lancer_fw_download(struct be_adapter *adapter, in lancer_fw_download() argument
4891 struct device *dev = &adapter->pdev->dev; in lancer_fw_download()
4926 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
4941 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
4958 status = lancer_physdev_ctrl(adapter, in lancer_fw_download()
4974 static bool be_check_ufi_compatibility(struct be_adapter *adapter, in be_check_ufi_compatibility() argument
4978 dev_err(&adapter->pdev->dev, "Invalid FW UFI file"); in be_check_ufi_compatibility()
4987 if (!skyhawk_chip(adapter)) in be_check_ufi_compatibility()
4991 if (!BE3_chip(adapter)) in be_check_ufi_compatibility()
4995 if (!BE2_chip(adapter)) in be_check_ufi_compatibility()
5007 if (BEx_chip(adapter) && fhdr->asic_type_rev == 0) in be_check_ufi_compatibility()
5008 return adapter->asic_rev < 0x10; in be_check_ufi_compatibility()
5010 return (fhdr->asic_type_rev >= adapter->asic_rev); in be_check_ufi_compatibility()
5013 static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) in be_fw_download() argument
5015 struct device *dev = &adapter->pdev->dev; in be_fw_download()
5022 if (!be_check_ufi_compatibility(adapter, fhdr3)) { in be_fw_download()
5038 if (!BE2_chip(adapter) && in be_fw_download()
5042 if (skyhawk_chip(adapter)) in be_fw_download()
5043 status = be_flash_skyhawk(adapter, fw, &flash_cmd, in be_fw_download()
5046 status = be_flash_BEx(adapter, fw, &flash_cmd, in be_fw_download()
5057 int be_load_fw(struct be_adapter *adapter, u8 *fw_file) in be_load_fw() argument
5062 if (!netif_running(adapter->netdev)) { in be_load_fw()
5063 dev_err(&adapter->pdev->dev, in be_load_fw()
5068 status = request_firmware(&fw, fw_file, &adapter->pdev->dev); in be_load_fw()
5072 dev_info(&adapter->pdev->dev, "Flashing firmware file %s\n", fw_file); in be_load_fw()
5074 if (lancer_chip(adapter)) in be_load_fw()
5075 status = lancer_fw_download(adapter, fw); in be_load_fw()
5077 status = be_fw_download(adapter, fw); in be_load_fw()
5080 be_cmd_get_fw_ver(adapter); in be_load_fw()
5090 struct be_adapter *adapter = netdev_priv(dev); in be_ndo_bridge_setlink() local
5096 if (!sriov_enabled(adapter)) in be_ndo_bridge_setlink()
5114 status = be_cmd_set_hsw_config(adapter, 0, 0, in be_ndo_bridge_setlink()
5115 adapter->if_handle, in be_ndo_bridge_setlink()
5122 dev_info(&adapter->pdev->dev, "enabled switch mode: %s\n", in be_ndo_bridge_setlink()
5128 dev_err(&adapter->pdev->dev, "Failed to set switch mode %s\n", in be_ndo_bridge_setlink()
5138 struct be_adapter *adapter = netdev_priv(dev); in be_ndo_bridge_getlink() local
5143 if (BEx_chip(adapter) || lancer_chip(adapter)) { in be_ndo_bridge_getlink()
5146 status = be_cmd_get_hsw_config(adapter, NULL, 0, in be_ndo_bridge_getlink()
5147 adapter->if_handle, &hsw_mode, in be_ndo_bridge_getlink()
5180 struct be_adapter *adapter = netdev_priv(netdev); in be_add_vxlan_port() local
5181 struct device *dev = &adapter->pdev->dev; in be_add_vxlan_port()
5184 if (lancer_chip(adapter) || BEx_chip(adapter) || be_is_mc(adapter)) in be_add_vxlan_port()
5187 if (adapter->vxlan_port == port && adapter->vxlan_port_count) { in be_add_vxlan_port()
5188 adapter->vxlan_port_aliases++; in be_add_vxlan_port()
5192 if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) { in be_add_vxlan_port()
5196 adapter->vxlan_port_count++; in be_add_vxlan_port()
5200 if (adapter->vxlan_port_count++ >= 1) in be_add_vxlan_port()
5203 status = be_cmd_manage_iface(adapter, adapter->if_handle, in be_add_vxlan_port()
5210 status = be_cmd_set_vxlan_port(adapter, port); in be_add_vxlan_port()
5215 adapter->flags |= BE_FLAGS_VXLAN_OFFLOADS; in be_add_vxlan_port()
5216 adapter->vxlan_port = port; in be_add_vxlan_port()
5228 be_disable_vxlan_offloads(adapter); in be_add_vxlan_port()
5234 struct be_adapter *adapter = netdev_priv(netdev); in be_del_vxlan_port() local
5236 if (lancer_chip(adapter) || BEx_chip(adapter) || be_is_mc(adapter)) in be_del_vxlan_port()
5239 if (adapter->vxlan_port != port) in be_del_vxlan_port()
5242 if (adapter->vxlan_port_aliases) { in be_del_vxlan_port()
5243 adapter->vxlan_port_aliases--; in be_del_vxlan_port()
5247 be_disable_vxlan_offloads(adapter); in be_del_vxlan_port()
5249 dev_info(&adapter->pdev->dev, in be_del_vxlan_port()
5253 adapter->vxlan_port_count--; in be_del_vxlan_port()
5260 struct be_adapter *adapter = netdev_priv(dev); in be_features_check() local
5267 !(adapter->flags & BE_FLAGS_VXLAN_OFFLOADS)) in be_features_check()
5302 struct be_adapter *adapter = netdev_priv(dev); in be_get_phys_port_id() local
5308 ppid->id[0] = adapter->hba_port_num + 1; in be_get_phys_port_id()
5312 memcpy(id, &adapter->serial_num[i], CNTL_SERIAL_NUM_WORD_SZ); in be_get_phys_port_id()
5354 struct be_adapter *adapter = netdev_priv(netdev); in be_netdev_init() local
5359 if (be_multi_rxq(adapter)) in be_netdev_init()
5379 static void be_cleanup(struct be_adapter *adapter) in be_cleanup() argument
5381 struct net_device *netdev = adapter->netdev; in be_cleanup()
5389 be_clear(adapter); in be_cleanup()
5392 static int be_resume(struct be_adapter *adapter) in be_resume() argument
5394 struct net_device *netdev = adapter->netdev; in be_resume()
5397 status = be_setup(adapter); in be_resume()
5412 static int be_err_recover(struct be_adapter *adapter) in be_err_recover() argument
5414 struct device *dev = &adapter->pdev->dev; in be_err_recover()
5417 status = be_resume(adapter); in be_err_recover()
5424 if (be_physfn(adapter)) in be_err_recover()
5434 struct be_adapter *adapter = in be_err_detection_task() local
5439 be_detect_error(adapter); in be_err_detection_task()
5441 if (be_check_error(adapter, BE_ERROR_HW)) { in be_err_detection_task()
5442 be_cleanup(adapter); in be_err_detection_task()
5445 if (lancer_chip(adapter)) in be_err_detection_task()
5446 status = be_err_recover(adapter); in be_err_detection_task()
5450 if (!status || be_virtfn(adapter)) in be_err_detection_task()
5451 be_schedule_err_detection(adapter); in be_err_detection_task()
5454 static void be_log_sfp_info(struct be_adapter *adapter) in be_log_sfp_info() argument
5458 status = be_cmd_query_sfp_info(adapter); in be_log_sfp_info()
5460 dev_err(&adapter->pdev->dev, in be_log_sfp_info()
5462 adapter->port_name, adapter->phy.vendor_name, in be_log_sfp_info()
5463 adapter->phy.vendor_pn); in be_log_sfp_info()
5465 adapter->flags &= ~BE_FLAGS_EVT_INCOMPATIBLE_SFP; in be_log_sfp_info()
5470 struct be_adapter *adapter = in be_worker() local
5478 if (!netif_running(adapter->netdev)) { in be_worker()
5480 be_process_mcc(adapter); in be_worker()
5485 if (!adapter->stats_cmd_sent) { in be_worker()
5486 if (lancer_chip(adapter)) in be_worker()
5487 lancer_cmd_get_pport_stats(adapter, in be_worker()
5488 &adapter->stats_cmd); in be_worker()
5490 be_cmd_get_stats(adapter, &adapter->stats_cmd); in be_worker()
5493 if (be_physfn(adapter) && in be_worker()
5494 MODULO(adapter->work_counter, adapter->be_get_temp_freq) == 0) in be_worker()
5495 be_cmd_get_die_temperature(adapter); in be_worker()
5497 for_all_rx_queues(adapter, rxo, i) { in be_worker()
5506 if (!skyhawk_chip(adapter)) in be_worker()
5507 be_eqd_update(adapter, false); in be_worker()
5509 if (adapter->flags & BE_FLAGS_EVT_INCOMPATIBLE_SFP) in be_worker()
5510 be_log_sfp_info(adapter); in be_worker()
5513 adapter->work_counter++; in be_worker()
5514 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); in be_worker()
5517 static void be_unmap_pci_bars(struct be_adapter *adapter) in be_unmap_pci_bars() argument
5519 if (adapter->csr) in be_unmap_pci_bars()
5520 pci_iounmap(adapter->pdev, adapter->csr); in be_unmap_pci_bars()
5521 if (adapter->db) in be_unmap_pci_bars()
5522 pci_iounmap(adapter->pdev, adapter->db); in be_unmap_pci_bars()
5525 static int db_bar(struct be_adapter *adapter) in db_bar() argument
5527 if (lancer_chip(adapter) || be_virtfn(adapter)) in db_bar()
5533 static int be_roce_map_pci_bars(struct be_adapter *adapter) in be_roce_map_pci_bars() argument
5535 if (skyhawk_chip(adapter)) { in be_roce_map_pci_bars()
5536 adapter->roce_db.size = 4096; in be_roce_map_pci_bars()
5537 adapter->roce_db.io_addr = pci_resource_start(adapter->pdev, in be_roce_map_pci_bars()
5538 db_bar(adapter)); in be_roce_map_pci_bars()
5539 adapter->roce_db.total_size = pci_resource_len(adapter->pdev, in be_roce_map_pci_bars()
5540 db_bar(adapter)); in be_roce_map_pci_bars()
5545 static int be_map_pci_bars(struct be_adapter *adapter) in be_map_pci_bars() argument
5547 struct pci_dev *pdev = adapter->pdev; in be_map_pci_bars()
5551 pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); in be_map_pci_bars()
5552 adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >> in be_map_pci_bars()
5554 adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; in be_map_pci_bars()
5556 if (BEx_chip(adapter) && be_physfn(adapter)) { in be_map_pci_bars()
5557 adapter->csr = pci_iomap(pdev, 2, 0); in be_map_pci_bars()
5558 if (!adapter->csr) in be_map_pci_bars()
5562 addr = pci_iomap(pdev, db_bar(adapter), 0); in be_map_pci_bars()
5565 adapter->db = addr; in be_map_pci_bars()
5567 if (skyhawk_chip(adapter) || BEx_chip(adapter)) { in be_map_pci_bars()
5568 if (be_physfn(adapter)) { in be_map_pci_bars()
5570 addr = pci_iomap(pdev, BE2_chip(adapter) ? 1 : 0, 0); in be_map_pci_bars()
5573 adapter->pcicfg = addr; in be_map_pci_bars()
5575 adapter->pcicfg = adapter->db + SRIOV_VF_PCICFG_OFFSET; in be_map_pci_bars()
5579 be_roce_map_pci_bars(adapter); in be_map_pci_bars()
5584 be_unmap_pci_bars(adapter); in be_map_pci_bars()
5588 static void be_drv_cleanup(struct be_adapter *adapter) in be_drv_cleanup() argument
5590 struct be_dma_mem *mem = &adapter->mbox_mem_alloced; in be_drv_cleanup()
5591 struct device *dev = &adapter->pdev->dev; in be_drv_cleanup()
5596 mem = &adapter->rx_filter; in be_drv_cleanup()
5600 mem = &adapter->stats_cmd; in be_drv_cleanup()
5606 static int be_drv_init(struct be_adapter *adapter) in be_drv_init() argument
5608 struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; in be_drv_init()
5609 struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; in be_drv_init()
5610 struct be_dma_mem *rx_filter = &adapter->rx_filter; in be_drv_init()
5611 struct be_dma_mem *stats_cmd = &adapter->stats_cmd; in be_drv_init()
5612 struct device *dev = &adapter->pdev->dev; in be_drv_init()
5634 if (lancer_chip(adapter)) in be_drv_init()
5636 else if (BE2_chip(adapter)) in be_drv_init()
5638 else if (BE3_chip(adapter)) in be_drv_init()
5649 mutex_init(&adapter->mbox_lock); in be_drv_init()
5650 spin_lock_init(&adapter->mcc_lock); in be_drv_init()
5651 spin_lock_init(&adapter->mcc_cq_lock); in be_drv_init()
5652 init_completion(&adapter->et_cmd_compl); in be_drv_init()
5654 pci_save_state(adapter->pdev); in be_drv_init()
5656 INIT_DELAYED_WORK(&adapter->work, be_worker); in be_drv_init()
5657 INIT_DELAYED_WORK(&adapter->be_err_detection_work, in be_drv_init()
5660 adapter->rx_fc = true; in be_drv_init()
5661 adapter->tx_fc = true; in be_drv_init()
5664 adapter->be_get_temp_freq = 64; in be_drv_init()
5678 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_remove() local
5680 if (!adapter) in be_remove()
5683 be_roce_dev_remove(adapter); in be_remove()
5684 be_intr_set(adapter, false); in be_remove()
5686 be_cancel_err_detection(adapter); in be_remove()
5688 unregister_netdev(adapter->netdev); in be_remove()
5690 be_clear(adapter); in be_remove()
5693 be_cmd_fw_clean(adapter); in be_remove()
5695 be_unmap_pci_bars(adapter); in be_remove()
5696 be_drv_cleanup(adapter); in be_remove()
5703 free_netdev(adapter->netdev); in be_remove()
5710 struct be_adapter *adapter = dev_get_drvdata(dev); in be_hwmon_show_temp() local
5713 if (adapter->hwmon_info.be_on_die_temp == BE_INVALID_DIE_TEMP) in be_hwmon_show_temp()
5717 adapter->hwmon_info.be_on_die_temp * 1000); in be_hwmon_show_temp()
5730 static char *mc_name(struct be_adapter *adapter) in mc_name() argument
5734 switch (adapter->mc_type) { in mc_name()
5760 static inline char *func_name(struct be_adapter *adapter) in func_name() argument
5762 return be_physfn(adapter) ? "PF" : "VF"; in func_name()
5787 struct be_adapter *adapter; in be_probe() local
5802 netdev = alloc_etherdev_mqs(sizeof(*adapter), MAX_TX_QS, MAX_RX_QS); in be_probe()
5807 adapter = netdev_priv(netdev); in be_probe()
5808 adapter->pdev = pdev; in be_probe()
5809 pci_set_drvdata(pdev, adapter); in be_probe()
5810 adapter->netdev = netdev; in be_probe()
5828 status = be_map_pci_bars(adapter); in be_probe()
5832 status = be_drv_init(adapter); in be_probe()
5836 status = be_setup(adapter); in be_probe()
5845 be_roce_dev_add(adapter); in be_probe()
5847 be_schedule_err_detection(adapter); in be_probe()
5850 if (be_physfn(adapter) && IS_ENABLED(CONFIG_BE2NET_HWMON)) { in be_probe()
5851 adapter->hwmon_info.hwmon_dev = in be_probe()
5854 adapter, in be_probe()
5856 adapter->hwmon_info.be_on_die_temp = BE_INVALID_DIE_TEMP; in be_probe()
5860 func_name(adapter), mc_name(adapter), adapter->port_name); in be_probe()
5865 be_clear(adapter); in be_probe()
5867 be_drv_cleanup(adapter); in be_probe()
5869 be_unmap_pci_bars(adapter); in be_probe()
5883 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_suspend() local
5885 if (adapter->wol_en) in be_suspend()
5886 be_setup_wol(adapter, true); in be_suspend()
5888 be_intr_set(adapter, false); in be_suspend()
5889 be_cancel_err_detection(adapter); in be_suspend()
5891 be_cleanup(adapter); in be_suspend()
5901 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_pci_resume() local
5910 status = be_resume(adapter); in be_pci_resume()
5914 be_schedule_err_detection(adapter); in be_pci_resume()
5916 if (adapter->wol_en) in be_pci_resume()
5917 be_setup_wol(adapter, false); in be_pci_resume()
5927 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_shutdown() local
5929 if (!adapter) in be_shutdown()
5932 be_roce_dev_shutdown(adapter); in be_shutdown()
5933 cancel_delayed_work_sync(&adapter->work); in be_shutdown()
5934 be_cancel_err_detection(adapter); in be_shutdown()
5936 netif_device_detach(adapter->netdev); in be_shutdown()
5938 be_cmd_reset_function(adapter); in be_shutdown()
5946 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_err_detected() local
5948 dev_err(&adapter->pdev->dev, "EEH error detected\n"); in be_eeh_err_detected()
5950 if (!be_check_error(adapter, BE_ERROR_EEH)) { in be_eeh_err_detected()
5951 be_set_error(adapter, BE_ERROR_EEH); in be_eeh_err_detected()
5953 be_cancel_err_detection(adapter); in be_eeh_err_detected()
5955 be_cleanup(adapter); in be_eeh_err_detected()
5977 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_reset() local
5980 dev_info(&adapter->pdev->dev, "EEH reset\n"); in be_eeh_reset()
5990 dev_info(&adapter->pdev->dev, in be_eeh_reset()
5992 status = be_fw_wait_ready(adapter); in be_eeh_reset()
5997 be_clear_error(adapter, BE_CLEAR_ALL); in be_eeh_reset()
6004 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_resume() local
6006 dev_info(&adapter->pdev->dev, "EEH resume\n"); in be_eeh_resume()
6010 status = be_resume(adapter); in be_eeh_resume()
6014 be_schedule_err_detection(adapter); in be_eeh_resume()
6017 dev_err(&adapter->pdev->dev, "EEH resume failed\n"); in be_eeh_resume()
6022 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_pci_sriov_configure() local
6027 be_vf_clear(adapter); in be_pci_sriov_configure()
6029 adapter->num_vfs = num_vfs; in be_pci_sriov_configure()
6031 if (adapter->num_vfs == 0 && pci_vfs_assigned(pdev)) { in be_pci_sriov_configure()
6045 if (skyhawk_chip(adapter) && !pci_num_vf(pdev)) { in be_pci_sriov_configure()
6046 num_vf_qs = be_calculate_vf_qs(adapter, adapter->num_vfs); in be_pci_sriov_configure()
6047 status = be_cmd_set_sriov_config(adapter, adapter->pool_res, in be_pci_sriov_configure()
6048 adapter->num_vfs, num_vf_qs); in be_pci_sriov_configure()
6054 status = be_get_resources(adapter); in be_pci_sriov_configure()
6060 status = be_update_queues(adapter); in be_pci_sriov_configure()
6065 if (adapter->num_vfs) in be_pci_sriov_configure()
6066 status = be_vf_setup(adapter); in be_pci_sriov_configure()
6069 return adapter->num_vfs; in be_pci_sriov_configure()