Lines Matching full:adapter
121 static inline bool be_is_mc(struct be_adapter *adapter) { in be_is_mc() argument
122 return (adapter->function_mode & FLEX10_MODE || in be_is_mc()
123 adapter->function_mode & VNIC_MODE || in be_is_mc()
124 adapter->function_mode & UMC_ENABLED); in be_is_mc()
127 static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q) in be_queue_free() argument
131 dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, in be_queue_free()
135 static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q, in be_queue_alloc() argument
144 mem->va = dma_alloc_coherent(&adapter->pdev->dev, mem->size, &mem->dma, in be_queue_alloc()
152 static void be_intr_set(struct be_adapter *adapter, bool enable) in be_intr_set() argument
156 if (adapter->eeh_err) in be_intr_set()
159 pci_read_config_dword(adapter->pdev, PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET, in be_intr_set()
170 pci_write_config_dword(adapter->pdev, in be_intr_set()
174 static void be_rxq_notify(struct be_adapter *adapter, u16 qid, u16 posted) in be_rxq_notify() argument
181 iowrite32(val, adapter->db + DB_RQ_OFFSET); in be_rxq_notify()
184 static void be_txq_notify(struct be_adapter *adapter, u16 qid, u16 posted) in be_txq_notify() argument
191 iowrite32(val, adapter->db + DB_TXULP1_OFFSET); in be_txq_notify()
194 static void be_eq_notify(struct be_adapter *adapter, u16 qid, in be_eq_notify() argument
202 if (adapter->eeh_err) in be_eq_notify()
211 iowrite32(val, adapter->db + DB_EQ_OFFSET); in be_eq_notify()
214 void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, u16 num_popped) in be_cq_notify() argument
221 if (adapter->eeh_err) in be_cq_notify()
227 iowrite32(val, adapter->db + DB_CQ_OFFSET); in be_cq_notify()
232 struct be_adapter *adapter = netdev_priv(netdev); in be_mac_addr_set() local
236 u32 pmac_id = adapter->pmac_id; in be_mac_addr_set()
241 status = be_cmd_mac_addr_query(adapter, current_mac, in be_mac_addr_set()
243 adapter->if_handle, 0); in be_mac_addr_set()
248 status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, in be_mac_addr_set()
249 adapter->if_handle, &adapter->pmac_id, 0); in be_mac_addr_set()
253 be_cmd_pmac_del(adapter, adapter->if_handle, pmac_id, 0); in be_mac_addr_set()
258 dev_err(&adapter->pdev->dev, "MAC %pM set Failed\n", addr->sa_data); in be_mac_addr_set()
262 static void populate_be2_stats(struct be_adapter *adapter) in populate_be2_stats() argument
264 struct be_hw_stats_v0 *hw_stats = hw_stats_from_cmd(adapter); in populate_be2_stats()
268 &rxf_stats->port[adapter->port_num]; in populate_be2_stats()
269 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be2_stats()
296 if (adapter->port_num) in populate_be2_stats()
308 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be2_stats()
311 static void populate_be3_stats(struct be_adapter *adapter) in populate_be3_stats() argument
313 struct be_hw_stats_v1 *hw_stats = hw_stats_from_cmd(adapter); in populate_be3_stats()
317 &rxf_stats->port[adapter->port_num]; in populate_be3_stats()
318 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_be3_stats()
355 adapter->drv_stats.eth_red_drops = pmem_sts->eth_red_drops; in populate_be3_stats()
358 static void populate_lancer_stats(struct be_adapter *adapter) in populate_lancer_stats() argument
361 struct be_drv_stats *drvs = &adapter->drv_stats; in populate_lancer_stats()
363 pport_stats_from_cmd(adapter); in populate_lancer_stats()
408 void be_parse_stats(struct be_adapter *adapter) in be_parse_stats() argument
410 struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter); in be_parse_stats()
414 if (adapter->generation == BE_GEN3) { in be_parse_stats()
415 if (lancer_chip(adapter)) in be_parse_stats()
416 populate_lancer_stats(adapter); in be_parse_stats()
418 populate_be3_stats(adapter); in be_parse_stats()
420 populate_be2_stats(adapter); in be_parse_stats()
424 for_all_rx_queues(adapter, rxo, i) { in be_parse_stats()
436 struct be_adapter *adapter = netdev_priv(netdev); in be_get_stats64() local
437 struct be_drv_stats *drvs = &adapter->drv_stats; in be_get_stats64()
444 for_all_rx_queues(adapter, rxo, i) { in be_get_stats64()
458 for_all_tx_queues(adapter, txo, i) { in be_get_stats64()
499 void be_link_status_update(struct be_adapter *adapter, u8 link_status) in be_link_status_update() argument
501 struct net_device *netdev = adapter->netdev; in be_link_status_update()
503 if (!(adapter->flags & BE_FLAGS_LINK_STATUS_INIT)) { in be_link_status_update()
505 adapter->flags |= BE_FLAGS_LINK_STATUS_INIT; in be_link_status_update()
530 static u32 wrb_cnt_for_skb(struct be_adapter *adapter, struct sk_buff *skb, in wrb_cnt_for_skb() argument
539 if (lancer_chip(adapter) || !(cnt & 1)) { in wrb_cnt_for_skb()
557 static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter, in be_get_tx_vlan_tag() argument
566 if (!(adapter->vlan_prio_bmap & (1 << vlan_prio))) in be_get_tx_vlan_tag()
568 adapter->recommended_prio; in be_get_tx_vlan_tag()
573 static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, in wrb_fill_hdr() argument
586 if (skb_is_gso_v6(skb) && !lancer_chip(adapter)) in wrb_fill_hdr()
588 if (lancer_chip(adapter) && adapter->sli_family == in wrb_fill_hdr()
607 vlan_tag = be_get_tx_vlan_tag(adapter, skb); in wrb_fill_hdr()
634 static int make_tx_wrbs(struct be_adapter *adapter, struct be_queue_info *txq, in make_tx_wrbs() argument
639 struct device *dev = &adapter->pdev->dev; in make_tx_wrbs()
684 wrb_fill_hdr(adapter, hdr, first_skb, wrb_cnt, copied); in make_tx_wrbs()
703 struct be_adapter *adapter = netdev_priv(netdev); in be_xmit() local
704 struct be_tx_obj *txo = &adapter->tx_obj[skb_get_queue_mapping(skb)]; in be_xmit()
722 skb = __vlan_put_tag(skb, be_get_tx_vlan_tag(adapter, skb)); in be_xmit()
729 wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb); in be_xmit()
731 copied = make_tx_wrbs(adapter, txq, skb, wrb_cnt, dummy_wrb); in be_xmit()
748 be_txq_notify(adapter, txq->id, wrb_cnt); in be_xmit()
762 struct be_adapter *adapter = netdev_priv(netdev); in be_change_mtu() local
766 dev_info(&adapter->pdev->dev, in be_change_mtu()
772 dev_info(&adapter->pdev->dev, "MTU changed from %d to %d bytes\n", in be_change_mtu()
782 static int be_vid_config(struct be_adapter *adapter, bool vf, u32 vf_num) in be_vid_config() argument
784 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf_num]; in be_vid_config()
791 status = be_cmd_vlan_config(adapter, vf_cfg->if_handle, vtag, in be_vid_config()
796 if (adapter->promiscuous) in be_vid_config()
799 if (adapter->vlans_added <= adapter->max_vlans) { in be_vid_config()
802 if (adapter->vlan_tag[i]) { in be_vid_config()
807 status = be_cmd_vlan_config(adapter, adapter->if_handle, in be_vid_config()
810 status = be_cmd_vlan_config(adapter, adapter->if_handle, in be_vid_config()
819 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_add_vid() local
822 if (!be_physfn(adapter)) { in be_vlan_add_vid()
827 adapter->vlan_tag[vid] = 1; in be_vlan_add_vid()
828 if (adapter->vlans_added <= (adapter->max_vlans + 1)) in be_vlan_add_vid()
829 status = be_vid_config(adapter, false, 0); in be_vlan_add_vid()
832 adapter->vlans_added++; in be_vlan_add_vid()
834 adapter->vlan_tag[vid] = 0; in be_vlan_add_vid()
841 struct be_adapter *adapter = netdev_priv(netdev); in be_vlan_rem_vid() local
844 if (!be_physfn(adapter)) { in be_vlan_rem_vid()
849 adapter->vlan_tag[vid] = 0; in be_vlan_rem_vid()
850 if (adapter->vlans_added <= adapter->max_vlans) in be_vlan_rem_vid()
851 status = be_vid_config(adapter, false, 0); in be_vlan_rem_vid()
854 adapter->vlans_added--; in be_vlan_rem_vid()
856 adapter->vlan_tag[vid] = 1; in be_vlan_rem_vid()
863 struct be_adapter *adapter = netdev_priv(netdev); in be_set_rx_mode() local
866 be_cmd_rx_filter(adapter, IFF_PROMISC, ON); in be_set_rx_mode()
867 adapter->promiscuous = true; in be_set_rx_mode()
872 if (adapter->promiscuous) { in be_set_rx_mode()
873 adapter->promiscuous = false; in be_set_rx_mode()
874 be_cmd_rx_filter(adapter, IFF_PROMISC, OFF); in be_set_rx_mode()
876 if (adapter->vlans_added) in be_set_rx_mode()
877 be_vid_config(adapter, false, 0); in be_set_rx_mode()
883 be_cmd_rx_filter(adapter, IFF_ALLMULTI, ON); in be_set_rx_mode()
887 be_cmd_rx_filter(adapter, IFF_MULTICAST, ON); in be_set_rx_mode()
894 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_mac() local
895 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_set_vf_mac()
898 if (!sriov_enabled(adapter)) in be_set_vf_mac()
901 if (!is_valid_ether_addr(mac) || vf >= adapter->num_vfs) in be_set_vf_mac()
904 if (lancer_chip(adapter)) { in be_set_vf_mac()
905 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); in be_set_vf_mac()
907 status = be_cmd_pmac_del(adapter, vf_cfg->if_handle, in be_set_vf_mac()
910 status = be_cmd_pmac_add(adapter, mac, vf_cfg->if_handle, in be_set_vf_mac()
915 dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n", in be_set_vf_mac()
926 struct be_adapter *adapter = netdev_priv(netdev); in be_get_vf_config() local
927 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf]; in be_get_vf_config()
929 if (!sriov_enabled(adapter)) in be_get_vf_config()
932 if (vf >= adapter->num_vfs) in be_get_vf_config()
947 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_vlan() local
950 if (!sriov_enabled(adapter)) in be_set_vf_vlan()
953 if (vf >= adapter->num_vfs || vlan > 4095) in be_set_vf_vlan()
957 adapter->vf_cfg[vf].vlan_tag = vlan; in be_set_vf_vlan()
958 adapter->vlans_added++; in be_set_vf_vlan()
960 adapter->vf_cfg[vf].vlan_tag = 0; in be_set_vf_vlan()
961 adapter->vlans_added--; in be_set_vf_vlan()
964 status = be_vid_config(adapter, true, vf); in be_set_vf_vlan()
967 dev_info(&adapter->pdev->dev, in be_set_vf_vlan()
975 struct be_adapter *adapter = netdev_priv(netdev); in be_set_vf_tx_rate() local
978 if (!sriov_enabled(adapter)) in be_set_vf_tx_rate()
981 if (vf >= adapter->num_vfs) in be_set_vf_tx_rate()
985 dev_err(&adapter->pdev->dev, in be_set_vf_tx_rate()
990 status = be_cmd_set_qos(adapter, rate / 10, vf + 1); in be_set_vf_tx_rate()
993 dev_err(&adapter->pdev->dev, in be_set_vf_tx_rate()
996 adapter->vf_cfg[vf].tx_rate = rate; in be_set_vf_tx_rate()
1000 static void be_rx_eqd_update(struct be_adapter *adapter, struct be_rx_obj *rxo) in be_rx_eqd_update() argument
1039 be_cmd_modify_eqd(adapter, rx_eq->q.id, eqd); in be_rx_eqd_update()
1069 get_rx_page_info(struct be_adapter *adapter, in get_rx_page_info() argument
1080 dma_unmap_page(&adapter->pdev->dev, in get_rx_page_info()
1082 adapter->big_page_size, DMA_FROM_DEVICE); in get_rx_page_info()
1091 static void be_rx_compl_discard(struct be_adapter *adapter, in be_rx_compl_discard() argument
1100 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx); in be_rx_compl_discard()
1111 static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo, in skb_fill_rx_data() argument
1120 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx); in skb_fill_rx_data()
1157 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx); in skb_fill_rx_data()
1185 static void be_rx_compl_process(struct be_adapter *adapter, in be_rx_compl_process() argument
1189 struct net_device *netdev = adapter->netdev; in be_rx_compl_process()
1195 be_rx_compl_discard(adapter, rxo, rxcp); in be_rx_compl_process()
1199 skb_fill_rx_data(adapter, rxo, skb, rxcp); in be_rx_compl_process()
1207 if (adapter->netdev->features & NETIF_F_RXHASH) in be_rx_compl_process()
1218 static void be_rx_compl_process_gro(struct be_adapter *adapter, in be_rx_compl_process_gro() argument
1231 be_rx_compl_discard(adapter, rxo, rxcp); in be_rx_compl_process_gro()
1237 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx); in be_rx_compl_process_gro()
1264 if (adapter->netdev->features & NETIF_F_RXHASH) in be_rx_compl_process_gro()
1273 static void be_parse_rx_compl_v1(struct be_adapter *adapter, in be_parse_rx_compl_v1() argument
1306 static void be_parse_rx_compl_v0(struct be_adapter *adapter, in be_parse_rx_compl_v0() argument
1343 struct be_adapter *adapter = rxo->adapter; in be_rx_compl_get() local
1353 if (adapter->be3_native) in be_rx_compl_get()
1354 be_parse_rx_compl_v1(adapter, compl, rxcp); in be_rx_compl_get()
1356 be_parse_rx_compl_v0(adapter, compl, rxcp); in be_rx_compl_get()
1361 if ((adapter->function_mode & FLEX10_MODE) && !rxcp->vtm) in be_rx_compl_get()
1364 if (!lancer_chip(adapter)) in be_rx_compl_get()
1367 if (adapter->pvid == (rxcp->vlan_tag & VLAN_VID_MASK) && in be_rx_compl_get()
1368 !adapter->vlan_tag[rxcp->vlan_tag]) in be_rx_compl_get()
1394 struct be_adapter *adapter = rxo->adapter; in be_post_rx_frags() local
1406 pagep = be_alloc_pages(adapter->big_page_size, gfp); in be_post_rx_frags()
1411 page_dmaaddr = dma_map_page(&adapter->pdev->dev, pagep, in be_post_rx_frags()
1412 0, adapter->big_page_size, in be_post_rx_frags()
1430 adapter->big_page_size) { in be_post_rx_frags()
1444 be_rxq_notify(adapter, rxq->id, posted); in be_post_rx_frags()
1467 static u16 be_tx_compl_process(struct be_adapter *adapter, in be_tx_compl_process() argument
1487 unmap_tx_frag(&adapter->pdev->dev, wrb, in be_tx_compl_process()
1512 static int event_handle(struct be_adapter *adapter, in event_handle() argument
1530 be_eq_notify(adapter, eq_obj->q.id, rearm, true, num); in event_handle()
1539 static void be_eq_clean(struct be_adapter *adapter, in be_eq_clean() argument
1551 be_eq_notify(adapter, eq_obj->q.id, false, true, num); in be_eq_clean()
1554 static void be_rx_q_clean(struct be_adapter *adapter, struct be_rx_obj *rxo) in be_rx_q_clean() argument
1564 be_rx_compl_discard(adapter, rxo, rxcp); in be_rx_q_clean()
1565 be_cq_notify(adapter, rx_cq->id, false, 1); in be_rx_q_clean()
1571 page_info = get_rx_page_info(adapter, rxo, tail); in be_rx_q_clean()
1579 static void be_tx_compl_clean(struct be_adapter *adapter, in be_tx_compl_clean() argument
1595 num_wrbs += be_tx_compl_process(adapter, txo, end_idx); in be_tx_compl_clean()
1599 be_cq_notify(adapter, tx_cq->id, false, cmpl); in be_tx_compl_clean()
1612 dev_err(&adapter->pdev->dev, "%d pending tx-completions\n", in be_tx_compl_clean()
1620 wrb_cnt_for_skb(adapter, sent_skb, &dummy_wrb) - 1, in be_tx_compl_clean()
1622 num_wrbs = be_tx_compl_process(adapter, txo, end_idx); in be_tx_compl_clean()
1627 static void be_mcc_queues_destroy(struct be_adapter *adapter) in be_mcc_queues_destroy() argument
1631 q = &adapter->mcc_obj.q; in be_mcc_queues_destroy()
1633 be_cmd_q_destroy(adapter, q, QTYPE_MCCQ); in be_mcc_queues_destroy()
1634 be_queue_free(adapter, q); in be_mcc_queues_destroy()
1636 q = &adapter->mcc_obj.cq; in be_mcc_queues_destroy()
1638 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_mcc_queues_destroy()
1639 be_queue_free(adapter, q); in be_mcc_queues_destroy()
1643 static int be_mcc_queues_create(struct be_adapter *adapter) in be_mcc_queues_create() argument
1648 cq = &adapter->mcc_obj.cq; in be_mcc_queues_create()
1649 if (be_queue_alloc(adapter, cq, MCC_CQ_LEN, in be_mcc_queues_create()
1654 if (be_cmd_cq_create(adapter, cq, &adapter->tx_eq.q, false, true, 0)) in be_mcc_queues_create()
1658 q = &adapter->mcc_obj.q; in be_mcc_queues_create()
1659 if (be_queue_alloc(adapter, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb))) in be_mcc_queues_create()
1663 if (be_cmd_mccq_create(adapter, q, cq)) in be_mcc_queues_create()
1669 be_queue_free(adapter, q); in be_mcc_queues_create()
1671 be_cmd_q_destroy(adapter, cq, QTYPE_CQ); in be_mcc_queues_create()
1673 be_queue_free(adapter, cq); in be_mcc_queues_create()
1678 static void be_tx_queues_destroy(struct be_adapter *adapter) in be_tx_queues_destroy() argument
1684 for_all_tx_queues(adapter, txo, i) { in be_tx_queues_destroy()
1687 be_cmd_q_destroy(adapter, q, QTYPE_TXQ); in be_tx_queues_destroy()
1688 be_queue_free(adapter, q); in be_tx_queues_destroy()
1692 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_tx_queues_destroy()
1693 be_queue_free(adapter, q); in be_tx_queues_destroy()
1697 be_eq_clean(adapter, &adapter->tx_eq); in be_tx_queues_destroy()
1699 q = &adapter->tx_eq.q; in be_tx_queues_destroy()
1701 be_cmd_q_destroy(adapter, q, QTYPE_EQ); in be_tx_queues_destroy()
1702 be_queue_free(adapter, q); in be_tx_queues_destroy()
1705 static int be_num_txqs_want(struct be_adapter *adapter) in be_num_txqs_want() argument
1707 if (sriov_enabled(adapter) || be_is_mc(adapter) || in be_num_txqs_want()
1708 lancer_chip(adapter) || !be_physfn(adapter) || in be_num_txqs_want()
1709 adapter->generation == BE_GEN2) in be_num_txqs_want()
1716 static int be_tx_queues_create(struct be_adapter *adapter) in be_tx_queues_create() argument
1722 adapter->num_tx_qs = be_num_txqs_want(adapter); in be_tx_queues_create()
1723 if (adapter->num_tx_qs != MAX_TX_QS) { in be_tx_queues_create()
1725 netif_set_real_num_tx_queues(adapter->netdev, in be_tx_queues_create()
1726 adapter->num_tx_qs); in be_tx_queues_create()
1730 adapter->tx_eq.max_eqd = 0; in be_tx_queues_create()
1731 adapter->tx_eq.min_eqd = 0; in be_tx_queues_create()
1732 adapter->tx_eq.cur_eqd = 96; in be_tx_queues_create()
1733 adapter->tx_eq.enable_aic = false; in be_tx_queues_create()
1735 eq = &adapter->tx_eq.q; in be_tx_queues_create()
1736 if (be_queue_alloc(adapter, eq, EVNT_Q_LEN, in be_tx_queues_create()
1740 if (be_cmd_eq_create(adapter, eq, adapter->tx_eq.cur_eqd)) in be_tx_queues_create()
1742 adapter->tx_eq.eq_idx = adapter->eq_next_idx++; in be_tx_queues_create()
1744 for_all_tx_queues(adapter, txo, i) { in be_tx_queues_create()
1746 if (be_queue_alloc(adapter, cq, TX_CQ_LEN, in be_tx_queues_create()
1750 if (be_cmd_cq_create(adapter, cq, eq, false, false, 3)) in be_tx_queues_create()
1754 if (be_queue_alloc(adapter, q, TX_Q_LEN, in be_tx_queues_create()
1761 be_tx_queues_destroy(adapter); in be_tx_queues_create()
1765 static void be_rx_queues_destroy(struct be_adapter *adapter) in be_rx_queues_destroy() argument
1771 for_all_rx_queues(adapter, rxo, i) { in be_rx_queues_destroy()
1772 be_queue_free(adapter, &rxo->q); in be_rx_queues_destroy()
1776 be_cmd_q_destroy(adapter, q, QTYPE_CQ); in be_rx_queues_destroy()
1777 be_queue_free(adapter, q); in be_rx_queues_destroy()
1781 be_cmd_q_destroy(adapter, q, QTYPE_EQ); in be_rx_queues_destroy()
1782 be_queue_free(adapter, q); in be_rx_queues_destroy()
1786 static u32 be_num_rxqs_want(struct be_adapter *adapter) in be_num_rxqs_want() argument
1788 if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && in be_num_rxqs_want()
1789 !sriov_enabled(adapter) && be_physfn(adapter)) { in be_num_rxqs_want()
1792 dev_warn(&adapter->pdev->dev, in be_num_rxqs_want()
1798 static int be_rx_queues_create(struct be_adapter *adapter) in be_rx_queues_create() argument
1804 adapter->num_rx_qs = min(be_num_rxqs_want(adapter), in be_rx_queues_create()
1805 msix_enabled(adapter) ? in be_rx_queues_create()
1806 adapter->num_msix_vec - 1 : 1); in be_rx_queues_create()
1807 if (adapter->num_rx_qs != MAX_RX_QS) in be_rx_queues_create()
1808 dev_warn(&adapter->pdev->dev, in be_rx_queues_create()
1809 "Can create only %d RX queues", adapter->num_rx_qs); in be_rx_queues_create()
1811 adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE; in be_rx_queues_create()
1812 for_all_rx_queues(adapter, rxo, i) { in be_rx_queues_create()
1813 rxo->adapter = adapter; in be_rx_queues_create()
1819 rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN, in be_rx_queues_create()
1824 rc = be_cmd_eq_create(adapter, eq, rxo->rx_eq.cur_eqd); in be_rx_queues_create()
1828 rxo->rx_eq.eq_idx = adapter->eq_next_idx++; in be_rx_queues_create()
1832 rc = be_queue_alloc(adapter, cq, RX_CQ_LEN, in be_rx_queues_create()
1837 rc = be_cmd_cq_create(adapter, cq, eq, false, false, 3); in be_rx_queues_create()
1843 rc = be_queue_alloc(adapter, q, RX_Q_LEN, in be_rx_queues_create()
1852 be_rx_queues_destroy(adapter); in be_rx_queues_create()
1867 struct be_adapter *adapter = dev; in be_intx() local
1871 if (lancer_chip(adapter)) { in be_intx()
1872 if (event_peek(&adapter->tx_eq)) in be_intx()
1873 tx = event_handle(adapter, &adapter->tx_eq, false); in be_intx()
1874 for_all_rx_queues(adapter, rxo, i) { in be_intx()
1876 rx |= event_handle(adapter, &rxo->rx_eq, true); in be_intx()
1883 isr = ioread32(adapter->csr + CEV_ISR0_OFFSET + in be_intx()
1884 (adapter->tx_eq.q.id / 8) * CEV_ISR_SIZE); in be_intx()
1888 if ((1 << adapter->tx_eq.eq_idx & isr)) in be_intx()
1889 event_handle(adapter, &adapter->tx_eq, false); in be_intx()
1891 for_all_rx_queues(adapter, rxo, i) { in be_intx()
1893 event_handle(adapter, &rxo->rx_eq, true); in be_intx()
1903 struct be_adapter *adapter = rxo->adapter; in be_msix_rx() local
1905 event_handle(adapter, &rxo->rx_eq, true); in be_msix_rx()
1912 struct be_adapter *adapter = dev; in be_msix_tx_mcc() local
1914 event_handle(adapter, &adapter->tx_eq, false); in be_msix_tx_mcc()
1928 struct be_adapter *adapter = rxo->adapter; in be_poll_rx() local
1945 be_rx_compl_discard(adapter, rxo, rxcp); in be_poll_rx()
1952 if (unlikely(rxcp->port != adapter->port_num && in be_poll_rx()
1953 !lancer_chip(adapter))) { in be_poll_rx()
1954 be_rx_compl_discard(adapter, rxo, rxcp); in be_poll_rx()
1959 be_rx_compl_process_gro(adapter, rxo, rxcp); in be_poll_rx()
1961 be_rx_compl_process(adapter, rxo, rxcp); in be_poll_rx()
1966 be_cq_notify(adapter, rx_cq->id, false, work_done); in be_poll_rx()
1976 be_cq_notify(adapter, rx_cq->id, true, 0); in be_poll_rx()
1987 struct be_adapter *adapter = in be_poll_tx_mcc() local
1989 struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; in be_poll_tx_mcc()
1996 for_all_tx_queues(adapter, txo, i) { in be_poll_tx_mcc()
2000 num_wrbs += be_tx_compl_process(adapter, txo, in be_poll_tx_mcc()
2006 be_cq_notify(adapter, txo->cq.id, true, tx_compl); in be_poll_tx_mcc()
2012 if (__netif_subqueue_stopped(adapter->netdev, i) && in be_poll_tx_mcc()
2014 netif_wake_subqueue(adapter->netdev, i); in be_poll_tx_mcc()
2023 mcc_compl = be_process_mcc(adapter, &status); in be_poll_tx_mcc()
2026 be_cq_notify(adapter, mcc_obj->cq.id, true, mcc_compl); in be_poll_tx_mcc()
2032 if (lancer_chip(adapter) && !msix_enabled(adapter)) { in be_poll_tx_mcc()
2033 for_all_tx_queues(adapter, txo, i) in be_poll_tx_mcc()
2034 be_cq_notify(adapter, txo->cq.id, true, 0); in be_poll_tx_mcc()
2036 be_cq_notify(adapter, mcc_obj->cq.id, true, 0); in be_poll_tx_mcc()
2039 be_eq_notify(adapter, tx_eq->q.id, true, false, 0); in be_poll_tx_mcc()
2040 adapter->drv_stats.tx_events++; in be_poll_tx_mcc()
2044 void be_detect_dump_ue(struct be_adapter *adapter) in be_detect_dump_ue() argument
2050 if (adapter->eeh_err || adapter->ue_detected) in be_detect_dump_ue()
2053 if (lancer_chip(adapter)) { in be_detect_dump_ue()
2054 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in be_detect_dump_ue()
2056 sliport_err1 = ioread32(adapter->db + in be_detect_dump_ue()
2058 sliport_err2 = ioread32(adapter->db + in be_detect_dump_ue()
2062 pci_read_config_dword(adapter->pdev, in be_detect_dump_ue()
2064 pci_read_config_dword(adapter->pdev, in be_detect_dump_ue()
2066 pci_read_config_dword(adapter->pdev, in be_detect_dump_ue()
2068 pci_read_config_dword(adapter->pdev, in be_detect_dump_ue()
2077 adapter->ue_detected = true; in be_detect_dump_ue()
2078 adapter->eeh_err = true; in be_detect_dump_ue()
2079 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2086 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2093 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2099 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2101 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2103 dev_err(&adapter->pdev->dev, in be_detect_dump_ue()
2108 static void be_msix_disable(struct be_adapter *adapter) in be_msix_disable() argument
2110 if (msix_enabled(adapter)) { in be_msix_disable()
2111 pci_disable_msix(adapter->pdev); in be_msix_disable()
2112 adapter->num_msix_vec = 0; in be_msix_disable()
2116 static void be_msix_enable(struct be_adapter *adapter) in be_msix_enable() argument
2121 num_vec = be_num_rxqs_want(adapter) + 1; in be_msix_enable()
2124 adapter->msix_entries[i].entry = i; in be_msix_enable()
2126 status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec); in be_msix_enable()
2131 if (pci_enable_msix(adapter->pdev, adapter->msix_entries, in be_msix_enable()
2137 adapter->num_msix_vec = num_vec; in be_msix_enable()
2141 static int be_sriov_enable(struct be_adapter *adapter) in be_sriov_enable() argument
2143 be_check_sriov_fn_type(adapter); in be_sriov_enable()
2146 if (be_physfn(adapter) && num_vfs) { in be_sriov_enable()
2150 pos = pci_find_ext_capability(adapter->pdev, in be_sriov_enable()
2152 pci_read_config_word(adapter->pdev, in be_sriov_enable()
2155 adapter->num_vfs = min_t(u16, num_vfs, dev_vfs); in be_sriov_enable()
2156 if (adapter->num_vfs != num_vfs) in be_sriov_enable()
2157 dev_info(&adapter->pdev->dev, in be_sriov_enable()
2159 adapter->num_vfs, num_vfs); in be_sriov_enable()
2161 status = pci_enable_sriov(adapter->pdev, adapter->num_vfs); in be_sriov_enable()
2163 adapter->num_vfs = 0; in be_sriov_enable()
2165 if (adapter->num_vfs) { in be_sriov_enable()
2166 adapter->vf_cfg = kcalloc(num_vfs, in be_sriov_enable()
2169 if (!adapter->vf_cfg) in be_sriov_enable()
2177 static void be_sriov_disable(struct be_adapter *adapter) in be_sriov_disable() argument
2180 if (sriov_enabled(adapter)) { in be_sriov_disable()
2181 pci_disable_sriov(adapter->pdev); in be_sriov_disable()
2182 kfree(adapter->vf_cfg); in be_sriov_disable()
2183 adapter->num_vfs = 0; in be_sriov_disable()
2188 static inline int be_msix_vec_get(struct be_adapter *adapter, in be_msix_vec_get() argument
2191 return adapter->msix_entries[eq_obj->eq_idx].vector; in be_msix_vec_get()
2194 static int be_request_irq(struct be_adapter *adapter, in be_request_irq() argument
2198 struct net_device *netdev = adapter->netdev; in be_request_irq()
2202 vec = be_msix_vec_get(adapter, eq_obj); in be_request_irq()
2206 static void be_free_irq(struct be_adapter *adapter, struct be_eq_obj *eq_obj, in be_free_irq() argument
2209 int vec = be_msix_vec_get(adapter, eq_obj); in be_free_irq()
2213 static int be_msix_register(struct be_adapter *adapter) in be_msix_register() argument
2219 status = be_request_irq(adapter, &adapter->tx_eq, be_msix_tx_mcc, "tx", in be_msix_register()
2220 adapter); in be_msix_register()
2224 for_all_rx_queues(adapter, rxo, i) { in be_msix_register()
2226 status = be_request_irq(adapter, &rxo->rx_eq, be_msix_rx, in be_msix_register()
2235 be_free_irq(adapter, &adapter->tx_eq, adapter); in be_msix_register()
2237 for (i--, rxo = &adapter->rx_obj[i]; i >= 0; i--, rxo--) in be_msix_register()
2238 be_free_irq(adapter, &rxo->rx_eq, rxo); in be_msix_register()
2241 dev_warn(&adapter->pdev->dev, in be_msix_register()
2243 be_msix_disable(adapter); in be_msix_register()
2247 static int be_irq_register(struct be_adapter *adapter) in be_irq_register() argument
2249 struct net_device *netdev = adapter->netdev; in be_irq_register()
2252 if (msix_enabled(adapter)) { in be_irq_register()
2253 status = be_msix_register(adapter); in be_irq_register()
2257 if (!be_physfn(adapter)) in be_irq_register()
2262 netdev->irq = adapter->pdev->irq; in be_irq_register()
2264 adapter); in be_irq_register()
2266 dev_err(&adapter->pdev->dev, in be_irq_register()
2271 adapter->isr_registered = true; in be_irq_register()
2275 static void be_irq_unregister(struct be_adapter *adapter) in be_irq_unregister() argument
2277 struct net_device *netdev = adapter->netdev; in be_irq_unregister()
2281 if (!adapter->isr_registered) in be_irq_unregister()
2285 if (!msix_enabled(adapter)) { in be_irq_unregister()
2286 free_irq(netdev->irq, adapter); in be_irq_unregister()
2291 be_free_irq(adapter, &adapter->tx_eq, adapter); in be_irq_unregister()
2293 for_all_rx_queues(adapter, rxo, i) in be_irq_unregister()
2294 be_free_irq(adapter, &rxo->rx_eq, rxo); in be_irq_unregister()
2297 adapter->isr_registered = false; in be_irq_unregister()
2300 static void be_rx_queues_clear(struct be_adapter *adapter) in be_rx_queues_clear() argument
2306 for_all_rx_queues(adapter, rxo, i) { in be_rx_queues_clear()
2309 be_cmd_rxq_destroy(adapter, q); in be_rx_queues_clear()
2315 be_rx_q_clean(adapter, rxo); in be_rx_queues_clear()
2321 be_eq_clean(adapter, &rxo->rx_eq); in be_rx_queues_clear()
2327 struct be_adapter *adapter = netdev_priv(netdev); in be_close() local
2330 struct be_eq_obj *tx_eq = &adapter->tx_eq; in be_close()
2333 be_async_mcc_disable(adapter); in be_close()
2335 if (!lancer_chip(adapter)) in be_close()
2336 be_intr_set(adapter, false); in be_close()
2338 for_all_rx_queues(adapter, rxo, i) in be_close()
2343 if (lancer_chip(adapter)) { in be_close()
2344 be_cq_notify(adapter, adapter->mcc_obj.cq.id, false, 0); in be_close()
2345 for_all_rx_queues(adapter, rxo, i) in be_close()
2346 be_cq_notify(adapter, rxo->cq.id, false, 0); in be_close()
2347 for_all_tx_queues(adapter, txo, i) in be_close()
2348 be_cq_notify(adapter, txo->cq.id, false, 0); in be_close()
2351 if (msix_enabled(adapter)) { in be_close()
2352 vec = be_msix_vec_get(adapter, tx_eq); in be_close()
2355 for_all_rx_queues(adapter, rxo, i) { in be_close()
2356 vec = be_msix_vec_get(adapter, &rxo->rx_eq); in be_close()
2362 be_irq_unregister(adapter); in be_close()
2367 for_all_tx_queues(adapter, txo, i) in be_close()
2368 be_tx_compl_clean(adapter, txo); in be_close()
2370 be_rx_queues_clear(adapter); in be_close()
2374 static int be_rx_queues_setup(struct be_adapter *adapter) in be_rx_queues_setup() argument
2380 for_all_rx_queues(adapter, rxo, i) { in be_rx_queues_setup()
2381 rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, in be_rx_queues_setup()
2383 adapter->if_handle, in be_rx_queues_setup()
2389 if (be_multi_rxq(adapter)) { in be_rx_queues_setup()
2390 for (j = 0; j < 128; j += adapter->num_rx_qs - 1) { in be_rx_queues_setup()
2391 for_all_rss_queues(adapter, rxo, i) { in be_rx_queues_setup()
2397 rc = be_cmd_rss_config(adapter, rsstable, 128); in be_rx_queues_setup()
2404 for_all_rx_queues(adapter, rxo, i) { in be_rx_queues_setup()
2413 struct be_adapter *adapter = netdev_priv(netdev); in be_open() local
2414 struct be_eq_obj *tx_eq = &adapter->tx_eq; in be_open()
2419 status = be_rx_queues_setup(adapter); in be_open()
2425 be_irq_register(adapter); in be_open()
2427 if (!lancer_chip(adapter)) in be_open()
2428 be_intr_set(adapter, true); in be_open()
2431 for_all_rx_queues(adapter, rxo, i) { in be_open()
2432 be_eq_notify(adapter, rxo->rx_eq.q.id, true, false, 0); in be_open()
2433 be_cq_notify(adapter, rxo->cq.id, true, 0); in be_open()
2435 be_eq_notify(adapter, tx_eq->q.id, true, false, 0); in be_open()
2438 be_async_mcc_enable(adapter); in be_open()
2440 status = be_cmd_link_status_query(adapter, NULL, NULL, in be_open()
2443 be_link_status_update(adapter, link_status); in be_open()
2447 be_close(adapter->netdev); in be_open()
2451 static int be_setup_wol(struct be_adapter *adapter, bool enable) in be_setup_wol() argument
2460 cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma, in be_setup_wol()
2467 status = pci_write_config_dword(adapter->pdev, in be_setup_wol()
2470 dev_err(&adapter->pdev->dev, in be_setup_wol()
2472 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, in be_setup_wol()
2476 status = be_cmd_enable_magic_wol(adapter, in be_setup_wol()
2477 adapter->netdev->dev_addr, &cmd); in be_setup_wol()
2478 pci_enable_wake(adapter->pdev, PCI_D3hot, 1); in be_setup_wol()
2479 pci_enable_wake(adapter->pdev, PCI_D3cold, 1); in be_setup_wol()
2481 status = be_cmd_enable_magic_wol(adapter, mac, &cmd); in be_setup_wol()
2482 pci_enable_wake(adapter->pdev, PCI_D3hot, 0); in be_setup_wol()
2483 pci_enable_wake(adapter->pdev, PCI_D3cold, 0); in be_setup_wol()
2486 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); in be_setup_wol()
2496 static inline int be_vf_eth_addr_config(struct be_adapter *adapter) in be_vf_eth_addr_config() argument
2503 be_vf_eth_addr_generate(adapter, mac); in be_vf_eth_addr_config()
2505 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_eth_addr_config()
2506 if (lancer_chip(adapter)) { in be_vf_eth_addr_config()
2507 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); in be_vf_eth_addr_config()
2509 status = be_cmd_pmac_add(adapter, mac, in be_vf_eth_addr_config()
2515 dev_err(&adapter->pdev->dev, in be_vf_eth_addr_config()
2525 static void be_vf_clear(struct be_adapter *adapter) in be_vf_clear() argument
2530 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_clear()
2531 if (lancer_chip(adapter)) in be_vf_clear()
2532 be_cmd_set_mac_list(adapter, NULL, 0, vf + 1); in be_vf_clear()
2534 be_cmd_pmac_del(adapter, vf_cfg->if_handle, in be_vf_clear()
2537 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1); in be_vf_clear()
2541 static int be_clear(struct be_adapter *adapter) in be_clear() argument
2543 if (sriov_enabled(adapter)) in be_clear()
2544 be_vf_clear(adapter); in be_clear()
2546 be_cmd_if_destroy(adapter, adapter->if_handle, 0); in be_clear()
2548 be_mcc_queues_destroy(adapter); in be_clear()
2549 be_rx_queues_destroy(adapter); in be_clear()
2550 be_tx_queues_destroy(adapter); in be_clear()
2553 be_cmd_fw_clean(adapter); in be_clear()
2557 static void be_vf_setup_init(struct be_adapter *adapter) in be_vf_setup_init() argument
2562 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup_init()
2568 static int be_vf_setup(struct be_adapter *adapter) in be_vf_setup() argument
2575 be_vf_setup_init(adapter); in be_vf_setup()
2579 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
2580 status = be_cmd_if_create(adapter, cap_flags, en_flags, NULL, in be_vf_setup()
2586 status = be_vf_eth_addr_config(adapter); in be_vf_setup()
2590 for_all_vfs(adapter, vf_cfg, vf) { in be_vf_setup()
2591 status = be_cmd_link_status_query(adapter, NULL, &lnk_speed, in be_vf_setup()
2602 static void be_setup_init(struct be_adapter *adapter) in be_setup_init() argument
2604 adapter->vlan_prio_bmap = 0xff; in be_setup_init()
2605 adapter->link_speed = -1; in be_setup_init()
2606 adapter->if_handle = -1; in be_setup_init()
2607 adapter->be3_native = false; in be_setup_init()
2608 adapter->promiscuous = false; in be_setup_init()
2609 adapter->eq_next_idx = 0; in be_setup_init()
2612 static int be_configure_mac_from_list(struct be_adapter *adapter, u8 *mac) in be_configure_mac_from_list() argument
2615 int status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id); in be_configure_mac_from_list()
2618 status = be_cmd_mac_addr_query(adapter, mac, in be_configure_mac_from_list()
2620 false, adapter->if_handle, pmac_id); in be_configure_mac_from_list()
2623 status = be_cmd_pmac_add(adapter, mac, adapter->if_handle, in be_configure_mac_from_list()
2624 &adapter->pmac_id, 0); in be_configure_mac_from_list()
2629 static int be_setup(struct be_adapter *adapter) in be_setup() argument
2631 struct net_device *netdev = adapter->netdev; in be_setup()
2638 be_setup_init(adapter); in be_setup()
2640 be_cmd_req_native_mode(adapter); in be_setup()
2642 status = be_tx_queues_create(adapter); in be_setup()
2646 status = be_rx_queues_create(adapter); in be_setup()
2650 status = be_mcc_queues_create(adapter); in be_setup()
2655 status = be_cmd_mac_addr_query(adapter, mac, MAC_ADDRESS_TYPE_NETWORK, in be_setup()
2659 memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); in be_setup()
2660 memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); in be_setup()
2667 if (adapter->function_caps & BE_FUNCTION_CAPS_RSS) { in be_setup()
2671 status = be_cmd_if_create(adapter, cap_flags, en_flags, in be_setup()
2672 netdev->dev_addr, &adapter->if_handle, in be_setup()
2673 &adapter->pmac_id, 0); in be_setup()
2677 for_all_tx_queues(adapter, txo, i) { in be_setup()
2678 status = be_cmd_txq_create(adapter, &txo->q, &txo->cq); in be_setup()
2687 if (!be_physfn(adapter)) { in be_setup()
2688 if (lancer_chip(adapter)) in be_setup()
2689 status = be_configure_mac_from_list(adapter, mac); in be_setup()
2691 status = be_cmd_mac_addr_query(adapter, mac, in be_setup()
2693 adapter->if_handle, 0); in be_setup()
2695 memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); in be_setup()
2696 memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); in be_setup()
2700 be_cmd_get_fw_ver(adapter, adapter->fw_ver, NULL); in be_setup()
2702 status = be_vid_config(adapter, false, 0); in be_setup()
2706 be_set_rx_mode(adapter->netdev); in be_setup()
2708 status = be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); in be_setup()
2710 if (status && (be_physfn(adapter) || !lancer_chip(adapter))) in be_setup()
2713 if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) { in be_setup()
2714 status = be_cmd_set_flow_control(adapter, adapter->tx_fc, in be_setup()
2715 adapter->rx_fc); in be_setup()
2717 if (status && (be_physfn(adapter) || !lancer_chip(adapter))) in be_setup()
2721 pcie_set_readrq(adapter->pdev, 4096); in be_setup()
2723 if (sriov_enabled(adapter)) { in be_setup()
2724 status = be_vf_setup(adapter); in be_setup()
2731 be_clear(adapter); in be_setup()
2738 struct be_adapter *adapter = netdev_priv(netdev); in be_netpoll() local
2742 event_handle(adapter, &adapter->tx_eq, false); in be_netpoll()
2743 for_all_rx_queues(adapter, rxo, i) in be_netpoll()
2744 event_handle(adapter, &rxo->rx_eq, true); in be_netpoll()
2749 static bool be_flash_redboot(struct be_adapter *adapter, in be_flash_redboot() argument
2761 status = be_cmd_get_flash_crc(adapter, flashed_crc, in be_flash_redboot()
2764 dev_err(&adapter->pdev->dev, in be_flash_redboot()
2776 static bool phy_flashing_required(struct be_adapter *adapter) in phy_flashing_required() argument
2781 status = be_cmd_get_phy_info(adapter, &phy_info); in phy_flashing_required()
2791 static int be_flash_data(struct be_adapter *adapter, in be_flash_data() argument
2845 if (adapter->generation == BE_GEN3) { in be_flash_data()
2856 memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) in be_flash_data()
2859 if (!phy_flashing_required(adapter)) in be_flash_data()
2863 (!be_flash_redboot(adapter, fw->data, in be_flash_data()
2892 status = be_cmd_write_flashrom(adapter, flash_cmd, in be_flash_data()
2899 dev_err(&adapter->pdev->dev, in be_flash_data()
2920 static int lancer_fw_download(struct be_adapter *adapter, in lancer_fw_download() argument
2936 dev_err(&adapter->pdev->dev, in lancer_fw_download()
2945 flash_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, flash_cmd.size, in lancer_fw_download()
2949 dev_err(&adapter->pdev->dev, in lancer_fw_download()
2965 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
2979 status = lancer_cmd_write_object(adapter, &flash_cmd, in lancer_fw_download()
2984 dma_free_coherent(&adapter->pdev->dev, flash_cmd.size, flash_cmd.va, in lancer_fw_download()
2987 dev_err(&adapter->pdev->dev, in lancer_fw_download()
2994 dev_info(&adapter->pdev->dev, "Firmware flashed successfully\n"); in lancer_fw_download()
2999 static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) in be_fw_download() argument
3012 flash_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, flash_cmd.size, in be_fw_download()
3016 dev_err(&adapter->pdev->dev, in be_fw_download()
3021 if ((adapter->generation == BE_GEN3) && in be_fw_download()
3030 status = be_flash_data(adapter, fw, &flash_cmd, in be_fw_download()
3033 } else if ((adapter->generation == BE_GEN2) && in be_fw_download()
3035 status = be_flash_data(adapter, fw, &flash_cmd, 0); in be_fw_download()
3037 dev_err(&adapter->pdev->dev, in be_fw_download()
3042 dma_free_coherent(&adapter->pdev->dev, flash_cmd.size, flash_cmd.va, in be_fw_download()
3045 dev_err(&adapter->pdev->dev, "Firmware load error\n"); in be_fw_download()
3049 dev_info(&adapter->pdev->dev, "Firmware flashed successfully\n"); in be_fw_download()
3055 int be_load_fw(struct be_adapter *adapter, u8 *fw_file) in be_load_fw() argument
3060 if (!netif_running(adapter->netdev)) { in be_load_fw()
3061 dev_err(&adapter->pdev->dev, in be_load_fw()
3066 status = request_firmware(&fw, fw_file, &adapter->pdev->dev); in be_load_fw()
3070 dev_info(&adapter->pdev->dev, "Flashing firmware file %s\n", fw_file); in be_load_fw()
3072 if (lancer_chip(adapter)) in be_load_fw()
3073 status = lancer_fw_download(adapter, fw); in be_load_fw()
3075 status = be_fw_download(adapter, fw); in be_load_fw()
3104 struct be_adapter *adapter = netdev_priv(netdev); in be_netdev_init() local
3111 if (be_multi_rxq(adapter)) in be_netdev_init()
3128 for_all_rx_queues(adapter, rxo, i) in be_netdev_init()
3132 netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx_mcc, in be_netdev_init()
3136 static void be_unmap_pci_bars(struct be_adapter *adapter) in be_unmap_pci_bars() argument
3138 if (adapter->csr) in be_unmap_pci_bars()
3139 iounmap(adapter->csr); in be_unmap_pci_bars()
3140 if (adapter->db) in be_unmap_pci_bars()
3141 iounmap(adapter->db); in be_unmap_pci_bars()
3144 static int be_map_pci_bars(struct be_adapter *adapter) in be_map_pci_bars() argument
3149 if (lancer_chip(adapter)) { in be_map_pci_bars()
3150 addr = ioremap_nocache(pci_resource_start(adapter->pdev, 0), in be_map_pci_bars()
3151 pci_resource_len(adapter->pdev, 0)); in be_map_pci_bars()
3154 adapter->db = addr; in be_map_pci_bars()
3158 if (be_physfn(adapter)) { in be_map_pci_bars()
3159 addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), in be_map_pci_bars()
3160 pci_resource_len(adapter->pdev, 2)); in be_map_pci_bars()
3163 adapter->csr = addr; in be_map_pci_bars()
3166 if (adapter->generation == BE_GEN2) { in be_map_pci_bars()
3169 if (be_physfn(adapter)) in be_map_pci_bars()
3174 addr = ioremap_nocache(pci_resource_start(adapter->pdev, db_reg), in be_map_pci_bars()
3175 pci_resource_len(adapter->pdev, db_reg)); in be_map_pci_bars()
3178 adapter->db = addr; in be_map_pci_bars()
3182 be_unmap_pci_bars(adapter); in be_map_pci_bars()
3187 static void be_ctrl_cleanup(struct be_adapter *adapter) in be_ctrl_cleanup() argument
3189 struct be_dma_mem *mem = &adapter->mbox_mem_alloced; in be_ctrl_cleanup()
3191 be_unmap_pci_bars(adapter); in be_ctrl_cleanup()
3194 dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, in be_ctrl_cleanup()
3197 mem = &adapter->rx_filter; in be_ctrl_cleanup()
3199 dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, in be_ctrl_cleanup()
3203 static int be_ctrl_init(struct be_adapter *adapter) in be_ctrl_init() argument
3205 struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; in be_ctrl_init()
3206 struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; in be_ctrl_init()
3207 struct be_dma_mem *rx_filter = &adapter->rx_filter; in be_ctrl_init()
3210 status = be_map_pci_bars(adapter); in be_ctrl_init()
3215 mbox_mem_alloc->va = dma_alloc_coherent(&adapter->pdev->dev, in be_ctrl_init()
3229 rx_filter->va = dma_alloc_coherent(&adapter->pdev->dev, rx_filter->size, in be_ctrl_init()
3237 mutex_init(&adapter->mbox_lock); in be_ctrl_init()
3238 spin_lock_init(&adapter->mcc_lock); in be_ctrl_init()
3239 spin_lock_init(&adapter->mcc_cq_lock); in be_ctrl_init()
3241 init_completion(&adapter->flash_compl); in be_ctrl_init()
3242 pci_save_state(adapter->pdev); in be_ctrl_init()
3246 dma_free_coherent(&adapter->pdev->dev, mbox_mem_alloc->size, in be_ctrl_init()
3250 be_unmap_pci_bars(adapter); in be_ctrl_init()
3256 static void be_stats_cleanup(struct be_adapter *adapter) in be_stats_cleanup() argument
3258 struct be_dma_mem *cmd = &adapter->stats_cmd; in be_stats_cleanup()
3261 dma_free_coherent(&adapter->pdev->dev, cmd->size, in be_stats_cleanup()
3265 static int be_stats_init(struct be_adapter *adapter) in be_stats_init() argument
3267 struct be_dma_mem *cmd = &adapter->stats_cmd; in be_stats_init()
3269 if (adapter->generation == BE_GEN2) { in be_stats_init()
3272 if (lancer_chip(adapter)) in be_stats_init()
3277 cmd->va = dma_alloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, in be_stats_init()
3287 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_remove() local
3289 if (!adapter) in be_remove()
3292 cancel_delayed_work_sync(&adapter->work); in be_remove()
3294 unregister_netdev(adapter->netdev); in be_remove()
3296 be_clear(adapter); in be_remove()
3298 be_stats_cleanup(adapter); in be_remove()
3300 be_ctrl_cleanup(adapter); in be_remove()
3302 be_sriov_disable(adapter); in be_remove()
3304 be_msix_disable(adapter); in be_remove()
3310 free_netdev(adapter->netdev); in be_remove()
3313 static int be_get_config(struct be_adapter *adapter) in be_get_config() argument
3317 status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, in be_get_config()
3318 &adapter->function_mode, &adapter->function_caps); in be_get_config()
3322 if (adapter->function_mode & FLEX10_MODE) in be_get_config()
3323 adapter->max_vlans = BE_NUM_VLANS_SUPPORTED/4; in be_get_config()
3325 adapter->max_vlans = BE_NUM_VLANS_SUPPORTED; in be_get_config()
3327 status = be_cmd_get_cntl_attributes(adapter); in be_get_config()
3334 static int be_dev_family_check(struct be_adapter *adapter) in be_dev_family_check() argument
3336 struct pci_dev *pdev = adapter->pdev; in be_dev_family_check()
3342 adapter->generation = BE_GEN2; in be_dev_family_check()
3347 adapter->generation = BE_GEN3; in be_dev_family_check()
3360 adapter->sli_family = ((sli_intf & SLI_INTF_FAMILY_MASK) >> in be_dev_family_check()
3362 adapter->generation = BE_GEN3; in be_dev_family_check()
3365 adapter->generation = 0; in be_dev_family_check()
3370 static int lancer_wait_ready(struct be_adapter *adapter) in lancer_wait_ready() argument
3377 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in lancer_wait_ready()
3390 static int lancer_test_and_set_rdy_state(struct be_adapter *adapter) in lancer_test_and_set_rdy_state() argument
3394 status = lancer_wait_ready(adapter); in lancer_test_and_set_rdy_state()
3396 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in lancer_test_and_set_rdy_state()
3401 adapter->db + SLIPORT_CONTROL_OFFSET); in lancer_test_and_set_rdy_state()
3403 /* check adapter has corrected the error */ in lancer_test_and_set_rdy_state()
3404 status = lancer_wait_ready(adapter); in lancer_test_and_set_rdy_state()
3405 sliport_status = ioread32(adapter->db + in lancer_test_and_set_rdy_state()
3418 static void lancer_test_and_recover_fn_err(struct be_adapter *adapter) in lancer_test_and_recover_fn_err() argument
3423 if (adapter->eeh_err || adapter->ue_detected) in lancer_test_and_recover_fn_err()
3426 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET); in lancer_test_and_recover_fn_err()
3429 dev_err(&adapter->pdev->dev, in lancer_test_and_recover_fn_err()
3430 "Adapter in error state." in lancer_test_and_recover_fn_err()
3433 status = lancer_test_and_set_rdy_state(adapter); in lancer_test_and_recover_fn_err()
3437 netif_device_detach(adapter->netdev); in lancer_test_and_recover_fn_err()
3439 if (netif_running(adapter->netdev)) in lancer_test_and_recover_fn_err()
3440 be_close(adapter->netdev); in lancer_test_and_recover_fn_err()
3442 be_clear(adapter); in lancer_test_and_recover_fn_err()
3444 adapter->fw_timeout = false; in lancer_test_and_recover_fn_err()
3446 status = be_setup(adapter); in lancer_test_and_recover_fn_err()
3450 if (netif_running(adapter->netdev)) { in lancer_test_and_recover_fn_err()
3451 status = be_open(adapter->netdev); in lancer_test_and_recover_fn_err()
3456 netif_device_attach(adapter->netdev); in lancer_test_and_recover_fn_err()
3458 dev_err(&adapter->pdev->dev, in lancer_test_and_recover_fn_err()
3459 "Adapter error recovery succeeded\n"); in lancer_test_and_recover_fn_err()
3463 dev_err(&adapter->pdev->dev, in lancer_test_and_recover_fn_err()
3464 "Adapter error recovery failed\n"); in lancer_test_and_recover_fn_err()
3469 struct be_adapter *adapter = in be_worker() local
3474 if (lancer_chip(adapter)) in be_worker()
3475 lancer_test_and_recover_fn_err(adapter); in be_worker()
3477 be_detect_dump_ue(adapter); in be_worker()
3481 if (!netif_running(adapter->netdev)) { in be_worker()
3484 mcc_compl = be_process_mcc(adapter, &status); in be_worker()
3487 struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; in be_worker()
3488 be_cq_notify(adapter, mcc_obj->cq.id, false, mcc_compl); in be_worker()
3494 if (!adapter->stats_cmd_sent) { in be_worker()
3495 if (lancer_chip(adapter)) in be_worker()
3496 lancer_cmd_get_pport_stats(adapter, in be_worker()
3497 &adapter->stats_cmd); in be_worker()
3499 be_cmd_get_stats(adapter, &adapter->stats_cmd); in be_worker()
3502 for_all_rx_queues(adapter, rxo, i) { in be_worker()
3503 be_rx_eqd_update(adapter, rxo); in be_worker()
3512 adapter->work_counter++; in be_worker()
3513 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); in be_worker()
3520 struct be_adapter *adapter; in be_probe() local
3537 adapter = netdev_priv(netdev); in be_probe()
3538 adapter->pdev = pdev; in be_probe()
3539 pci_set_drvdata(pdev, adapter); in be_probe()
3541 status = be_dev_family_check(adapter); in be_probe()
3545 adapter->netdev = netdev; in be_probe()
3559 status = be_sriov_enable(adapter); in be_probe()
3563 status = be_ctrl_init(adapter); in be_probe()
3567 if (lancer_chip(adapter)) { in be_probe()
3568 status = lancer_wait_ready(adapter); in be_probe()
3571 adapter->db + SLIPORT_CONTROL_OFFSET); in be_probe()
3572 status = lancer_test_and_set_rdy_state(adapter); in be_probe()
3575 dev_err(&pdev->dev, "Adapter in non recoverable error\n"); in be_probe()
3581 if (be_physfn(adapter)) { in be_probe()
3582 status = be_cmd_POST(adapter); in be_probe()
3588 status = be_cmd_fw_init(adapter); in be_probe()
3592 status = be_cmd_reset_function(adapter); in be_probe()
3596 status = be_stats_init(adapter); in be_probe()
3600 status = be_get_config(adapter); in be_probe()
3607 if (!lancer_chip(adapter)) in be_probe()
3608 be_intr_set(adapter, false); in be_probe()
3610 be_msix_enable(adapter); in be_probe()
3612 INIT_DELAYED_WORK(&adapter->work, be_worker); in be_probe()
3613 adapter->rx_fc = adapter->tx_fc = true; in be_probe()
3615 status = be_setup(adapter); in be_probe()
3624 dev_info(&pdev->dev, "%s port %d\n", nic_name(pdev), adapter->port_num); in be_probe()
3626 schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); in be_probe()
3630 be_clear(adapter); in be_probe()
3632 be_msix_disable(adapter); in be_probe()
3634 be_stats_cleanup(adapter); in be_probe()
3636 be_ctrl_cleanup(adapter); in be_probe()
3638 be_sriov_disable(adapter); in be_probe()
3653 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_suspend() local
3654 struct net_device *netdev = adapter->netdev; in be_suspend()
3656 cancel_delayed_work_sync(&adapter->work); in be_suspend()
3657 if (adapter->wol) in be_suspend()
3658 be_setup_wol(adapter, true); in be_suspend()
3666 be_clear(adapter); in be_suspend()
3668 be_msix_disable(adapter); in be_suspend()
3678 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_resume() local
3679 struct net_device *netdev = adapter->netdev; in be_resume()
3690 be_msix_enable(adapter); in be_resume()
3692 status = be_cmd_fw_init(adapter); in be_resume()
3696 be_setup(adapter); in be_resume()
3704 if (adapter->wol) in be_resume()
3705 be_setup_wol(adapter, false); in be_resume()
3707 schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); in be_resume()
3716 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_shutdown() local
3718 if (!adapter) in be_shutdown()
3721 cancel_delayed_work_sync(&adapter->work); in be_shutdown()
3723 netif_device_detach(adapter->netdev); in be_shutdown()
3725 if (adapter->wol) in be_shutdown()
3726 be_setup_wol(adapter, true); in be_shutdown()
3728 be_cmd_reset_function(adapter); in be_shutdown()
3736 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_err_detected() local
3737 struct net_device *netdev = adapter->netdev; in be_eeh_err_detected()
3739 dev_err(&adapter->pdev->dev, "EEH error detected\n"); in be_eeh_err_detected()
3741 adapter->eeh_err = true; in be_eeh_err_detected()
3750 be_clear(adapter); in be_eeh_err_detected()
3762 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_reset() local
3765 dev_info(&adapter->pdev->dev, "EEH reset\n"); in be_eeh_reset()
3766 adapter->eeh_err = false; in be_eeh_reset()
3767 adapter->ue_detected = false; in be_eeh_reset()
3768 adapter->fw_timeout = false; in be_eeh_reset()
3779 status = be_cmd_POST(adapter); in be_eeh_reset()
3789 struct be_adapter *adapter = pci_get_drvdata(pdev); in be_eeh_resume() local
3790 struct net_device *netdev = adapter->netdev; in be_eeh_resume()
3792 dev_info(&adapter->pdev->dev, "EEH resume\n"); in be_eeh_resume()
3797 status = be_cmd_fw_init(adapter); in be_eeh_resume()
3801 status = be_setup(adapter); in be_eeh_resume()
3813 dev_err(&adapter->pdev->dev, "EEH resume failed\n"); in be_eeh_resume()