bnxt.c (c3bdd5e65185f46150b3bac103b3854040487857) | bnxt.c (c43f1255b866b423d2381f77eaa2cbc64a9c49aa) |
---|---|
1/* Broadcom NetXtreme-C/E network driver. 2 * 3 * Copyright (c) 2014-2016 Broadcom Corporation 4 * Copyright (c) 2016-2019 Broadcom Limited 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation. --- 537 unchanged lines hidden (view full) --- 546 netdev_tx_sent_queue(txq, skb->len); 547 548 /* Sync BD data before updating doorbell */ 549 wmb(); 550 551 prod = NEXT_TX(prod); 552 txr->tx_prod = prod; 553 | 1/* Broadcom NetXtreme-C/E network driver. 2 * 3 * Copyright (c) 2014-2016 Broadcom Corporation 4 * Copyright (c) 2016-2019 Broadcom Limited 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation. --- 537 unchanged lines hidden (view full) --- 546 netdev_tx_sent_queue(txq, skb->len); 547 548 /* Sync BD data before updating doorbell */ 549 wmb(); 550 551 prod = NEXT_TX(prod); 552 txr->tx_prod = prod; 553 |
554 if (!skb->xmit_more || netif_xmit_stopped(txq)) | 554 if (!netdev_xmit_more() || netif_xmit_stopped(txq)) |
555 bnxt_db_write(bp, &txr->tx_db, prod); 556 557tx_done: 558 559 mmiowb(); 560 561 if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) { | 555 bnxt_db_write(bp, &txr->tx_db, prod); 556 557tx_done: 558 559 mmiowb(); 560 561 if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) { |
562 if (skb->xmit_more && !tx_buf->is_push) | 562 if (netdev_xmit_more() && !tx_buf->is_push) |
563 bnxt_db_write(bp, &txr->tx_db, prod); 564 565 netif_tx_stop_queue(txq); 566 567 /* netif_tx_stop_queue() must be done before checking 568 * tx index in bnxt_tx_avail() below, because in 569 * bnxt_tx_int(), we update tx index before checking for 570 * netif_tx_queue_stopped(). --- 323 unchanged lines hidden (view full) --- 894 bnxt_reuse_rx_data(rxr, cons, data); 895 return NULL; 896 } 897 dma_addr -= bp->rx_dma_offset; 898 dma_unmap_page_attrs(&bp->pdev->dev, dma_addr, PAGE_SIZE, bp->rx_dir, 899 DMA_ATTR_WEAK_ORDERING); 900 901 if (unlikely(!payload)) | 563 bnxt_db_write(bp, &txr->tx_db, prod); 564 565 netif_tx_stop_queue(txq); 566 567 /* netif_tx_stop_queue() must be done before checking 568 * tx index in bnxt_tx_avail() below, because in 569 * bnxt_tx_int(), we update tx index before checking for 570 * netif_tx_queue_stopped(). --- 323 unchanged lines hidden (view full) --- 894 bnxt_reuse_rx_data(rxr, cons, data); 895 return NULL; 896 } 897 dma_addr -= bp->rx_dma_offset; 898 dma_unmap_page_attrs(&bp->pdev->dev, dma_addr, PAGE_SIZE, bp->rx_dir, 899 DMA_ATTR_WEAK_ORDERING); 900 901 if (unlikely(!payload)) |
902 payload = eth_get_headlen(data_ptr, len); | 902 payload = eth_get_headlen(bp->dev, data_ptr, len); |
903 904 skb = napi_alloc_skb(&rxr->bnapi->napi, payload); 905 if (!skb) { 906 __free_page(page); 907 return NULL; 908 } 909 910 off = (void *)data_ptr - page_address(page); --- 217 unchanged lines hidden (view full) --- 1128 1129 cons = tpa_start->rx_tpa_start_cmp_opaque; 1130 prod = rxr->rx_prod; 1131 cons_rx_buf = &rxr->rx_buf_ring[cons]; 1132 prod_rx_buf = &rxr->rx_buf_ring[prod]; 1133 tpa_info = &rxr->rx_tpa[agg_id]; 1134 1135 if (unlikely(cons != rxr->rx_next_cons)) { | 903 904 skb = napi_alloc_skb(&rxr->bnapi->napi, payload); 905 if (!skb) { 906 __free_page(page); 907 return NULL; 908 } 909 910 off = (void *)data_ptr - page_address(page); --- 217 unchanged lines hidden (view full) --- 1128 1129 cons = tpa_start->rx_tpa_start_cmp_opaque; 1130 prod = rxr->rx_prod; 1131 cons_rx_buf = &rxr->rx_buf_ring[cons]; 1132 prod_rx_buf = &rxr->rx_buf_ring[prod]; 1133 tpa_info = &rxr->rx_tpa[agg_id]; 1134 1135 if (unlikely(cons != rxr->rx_next_cons)) { |
1136 netdev_warn(bp->dev, "TPA cons %x != expected cons %x\n", 1137 cons, rxr->rx_next_cons); |
|
1136 bnxt_sched_reset(bp, rxr); 1137 return; 1138 } 1139 /* Store cfa_code in tpa_info to use in tpa_end 1140 * completion processing. 1141 */ 1142 tpa_info->cfa_code = TPA_START_CFA_CODE(tpa_start1); 1143 prod_rx_buf->data = tpa_info->data; --- 436 unchanged lines hidden (view full) --- 1580 bnxt_deliver_skb(bp, bnapi, skb); 1581 rc = 1; 1582 } 1583 *event |= BNXT_RX_EVENT; 1584 goto next_rx_no_prod_no_len; 1585 } 1586 1587 cons = rxcmp->rx_cmp_opaque; | 1138 bnxt_sched_reset(bp, rxr); 1139 return; 1140 } 1141 /* Store cfa_code in tpa_info to use in tpa_end 1142 * completion processing. 1143 */ 1144 tpa_info->cfa_code = TPA_START_CFA_CODE(tpa_start1); 1145 prod_rx_buf->data = tpa_info->data; --- 436 unchanged lines hidden (view full) --- 1582 bnxt_deliver_skb(bp, bnapi, skb); 1583 rc = 1; 1584 } 1585 *event |= BNXT_RX_EVENT; 1586 goto next_rx_no_prod_no_len; 1587 } 1588 1589 cons = rxcmp->rx_cmp_opaque; |
1588 rx_buf = &rxr->rx_buf_ring[cons]; 1589 data = rx_buf->data; 1590 data_ptr = rx_buf->data_ptr; | |
1591 if (unlikely(cons != rxr->rx_next_cons)) { 1592 int rc1 = bnxt_discard_rx(bp, cpr, raw_cons, rxcmp); 1593 | 1590 if (unlikely(cons != rxr->rx_next_cons)) { 1591 int rc1 = bnxt_discard_rx(bp, cpr, raw_cons, rxcmp); 1592 |
1593 netdev_warn(bp->dev, "RX cons %x != expected cons %x\n", 1594 cons, rxr->rx_next_cons); |
|
1594 bnxt_sched_reset(bp, rxr); 1595 return rc1; 1596 } | 1595 bnxt_sched_reset(bp, rxr); 1596 return rc1; 1597 } |
1598 rx_buf = &rxr->rx_buf_ring[cons]; 1599 data = rx_buf->data; 1600 data_ptr = rx_buf->data_ptr; |
|
1597 prefetch(data_ptr); 1598 1599 misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1); 1600 agg_bufs = (misc & RX_CMP_AGG_BUFS) >> RX_CMP_AGG_BUFS_SHIFT; 1601 1602 if (agg_bufs) { 1603 if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, &tmp_raw_cons)) 1604 return -EBUSY; 1605 1606 cp_cons = NEXT_CMP(cp_cons); 1607 *event |= BNXT_AGG_EVENT; 1608 } 1609 *event |= BNXT_RX_EVENT; 1610 1611 rx_buf->data = NULL; 1612 if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L2_ERRORS) { | 1601 prefetch(data_ptr); 1602 1603 misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1); 1604 agg_bufs = (misc & RX_CMP_AGG_BUFS) >> RX_CMP_AGG_BUFS_SHIFT; 1605 1606 if (agg_bufs) { 1607 if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, &tmp_raw_cons)) 1608 return -EBUSY; 1609 1610 cp_cons = NEXT_CMP(cp_cons); 1611 *event |= BNXT_AGG_EVENT; 1612 } 1613 *event |= BNXT_RX_EVENT; 1614 1615 rx_buf->data = NULL; 1616 if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L2_ERRORS) { |
1617 u32 rx_err = le32_to_cpu(rxcmp1->rx_cmp_cfa_code_errors_v2); 1618 |
|
1613 bnxt_reuse_rx_data(rxr, cons, data); 1614 if (agg_bufs) 1615 bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs); 1616 1617 rc = -EIO; | 1619 bnxt_reuse_rx_data(rxr, cons, data); 1620 if (agg_bufs) 1621 bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs); 1622 1623 rc = -EIO; |
1624 if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) { 1625 netdev_warn(bp->dev, "RX buffer error %x\n", rx_err); 1626 bnxt_sched_reset(bp, rxr); 1627 } |
|
1618 goto next_rx; 1619 } 1620 1621 len = le32_to_cpu(rxcmp->rx_cmp_len_flags_type) >> RX_CMP_LEN_SHIFT; 1622 dma_addr = rx_buf->mapping; 1623 1624 if (bnxt_rx_xdp(bp, rxr, cons, data, &data_ptr, &len, event)) { 1625 rc = 1; --- 8417 unchanged lines hidden (view full) --- 10043 rc = bnxt_hwrm_set_br_mode(bp, mode); 10044 if (!rc) 10045 bp->br_mode = mode; 10046 break; 10047 } 10048 return rc; 10049} 10050 | 1628 goto next_rx; 1629 } 1630 1631 len = le32_to_cpu(rxcmp->rx_cmp_len_flags_type) >> RX_CMP_LEN_SHIFT; 1632 dma_addr = rx_buf->mapping; 1633 1634 if (bnxt_rx_xdp(bp, rxr, cons, data, &data_ptr, &len, event)) { 1635 rc = 1; --- 8417 unchanged lines hidden (view full) --- 10053 rc = bnxt_hwrm_set_br_mode(bp, mode); 10054 if (!rc) 10055 bp->br_mode = mode; 10056 break; 10057 } 10058 return rc; 10059} 10060 |
10051static int bnxt_get_phys_port_name(struct net_device *dev, char *buf, 10052 size_t len) 10053{ 10054 struct bnxt *bp = netdev_priv(dev); 10055 int rc; 10056 10057 /* The PF and it's VF-reps only support the switchdev framework */ 10058 if (!BNXT_PF(bp)) 10059 return -EOPNOTSUPP; 10060 10061 rc = snprintf(buf, len, "p%d", bp->pf.port_id); 10062 10063 if (rc >= len) 10064 return -EOPNOTSUPP; 10065 return 0; 10066} 10067 | |
10068int bnxt_get_port_parent_id(struct net_device *dev, 10069 struct netdev_phys_item_id *ppid) 10070{ 10071 struct bnxt *bp = netdev_priv(dev); 10072 10073 if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV) 10074 return -EOPNOTSUPP; 10075 10076 /* The PF and it's VF-reps only support the switchdev framework */ 10077 if (!BNXT_PF(bp)) 10078 return -EOPNOTSUPP; 10079 10080 ppid->id_len = sizeof(bp->switch_id); 10081 memcpy(ppid->id, bp->switch_id, ppid->id_len); 10082 10083 return 0; 10084} 10085 | 10061int bnxt_get_port_parent_id(struct net_device *dev, 10062 struct netdev_phys_item_id *ppid) 10063{ 10064 struct bnxt *bp = netdev_priv(dev); 10065 10066 if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV) 10067 return -EOPNOTSUPP; 10068 10069 /* The PF and it's VF-reps only support the switchdev framework */ 10070 if (!BNXT_PF(bp)) 10071 return -EOPNOTSUPP; 10072 10073 ppid->id_len = sizeof(bp->switch_id); 10074 memcpy(ppid->id, bp->switch_id, ppid->id_len); 10075 10076 return 0; 10077} 10078 |
10079static struct devlink_port *bnxt_get_devlink_port(struct net_device *dev) 10080{ 10081 struct bnxt *bp = netdev_priv(dev); 10082 10083 return &bp->dl_port; 10084} 10085 |
|
10086static const struct net_device_ops bnxt_netdev_ops = { 10087 .ndo_open = bnxt_open, 10088 .ndo_start_xmit = bnxt_start_xmit, 10089 .ndo_stop = bnxt_close, 10090 .ndo_get_stats64 = bnxt_get_stats64, 10091 .ndo_set_rx_mode = bnxt_set_rx_mode, 10092 .ndo_do_ioctl = bnxt_ioctl, 10093 .ndo_validate_addr = eth_validate_addr, --- 15 unchanged lines hidden (view full) --- 10109#ifdef CONFIG_RFS_ACCEL 10110 .ndo_rx_flow_steer = bnxt_rx_flow_steer, 10111#endif 10112 .ndo_udp_tunnel_add = bnxt_udp_tunnel_add, 10113 .ndo_udp_tunnel_del = bnxt_udp_tunnel_del, 10114 .ndo_bpf = bnxt_xdp, 10115 .ndo_bridge_getlink = bnxt_bridge_getlink, 10116 .ndo_bridge_setlink = bnxt_bridge_setlink, | 10086static const struct net_device_ops bnxt_netdev_ops = { 10087 .ndo_open = bnxt_open, 10088 .ndo_start_xmit = bnxt_start_xmit, 10089 .ndo_stop = bnxt_close, 10090 .ndo_get_stats64 = bnxt_get_stats64, 10091 .ndo_set_rx_mode = bnxt_set_rx_mode, 10092 .ndo_do_ioctl = bnxt_ioctl, 10093 .ndo_validate_addr = eth_validate_addr, --- 15 unchanged lines hidden (view full) --- 10109#ifdef CONFIG_RFS_ACCEL 10110 .ndo_rx_flow_steer = bnxt_rx_flow_steer, 10111#endif 10112 .ndo_udp_tunnel_add = bnxt_udp_tunnel_add, 10113 .ndo_udp_tunnel_del = bnxt_udp_tunnel_del, 10114 .ndo_bpf = bnxt_xdp, 10115 .ndo_bridge_getlink = bnxt_bridge_getlink, 10116 .ndo_bridge_setlink = bnxt_bridge_setlink, |
10117 .ndo_get_port_parent_id = bnxt_get_port_parent_id, 10118 .ndo_get_phys_port_name = bnxt_get_phys_port_name | 10117 .ndo_get_devlink_port = bnxt_get_devlink_port, |
10119}; 10120 10121static void bnxt_remove_one(struct pci_dev *pdev) 10122{ 10123 struct net_device *dev = pci_get_drvdata(pdev); 10124 struct bnxt *bp = netdev_priv(dev); 10125 10126 if (BNXT_PF(bp)) { --- 307 unchanged lines hidden (view full) --- 10434 eth_hw_addr_random(bp->dev); 10435 } 10436 rc = bnxt_approve_mac(bp, bp->dev->dev_addr, strict_approval); 10437#endif 10438 } 10439 return rc; 10440} 10441 | 10118}; 10119 10120static void bnxt_remove_one(struct pci_dev *pdev) 10121{ 10122 struct net_device *dev = pci_get_drvdata(pdev); 10123 struct bnxt *bp = netdev_priv(dev); 10124 10125 if (BNXT_PF(bp)) { --- 307 unchanged lines hidden (view full) --- 10433 eth_hw_addr_random(bp->dev); 10434 } 10435 rc = bnxt_approve_mac(bp, bp->dev->dev_addr, strict_approval); 10436#endif 10437 } 10438 return rc; 10439} 10440 |
10441static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[]) 10442{ 10443 struct pci_dev *pdev = bp->pdev; 10444 int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN); 10445 u32 dw; 10446 10447 if (!pos) { 10448 netdev_info(bp->dev, "Unable do read adapter's DSN"); 10449 return -EOPNOTSUPP; 10450 } 10451 10452 /* DSN (two dw) is at an offset of 4 from the cap pos */ 10453 pos += 4; 10454 pci_read_config_dword(pdev, pos, &dw); 10455 put_unaligned_le32(dw, &dsn[0]); 10456 pci_read_config_dword(pdev, pos + 4, &dw); 10457 put_unaligned_le32(dw, &dsn[4]); 10458 return 0; 10459} 10460 |
|
10442static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 10443{ 10444 static int version_printed; 10445 struct net_device *dev; 10446 struct bnxt *bp; 10447 int rc, max_irqs; 10448 10449 if (pci_is_bridge(pdev)) --- 124 unchanged lines hidden (view full) --- 10574 } 10575 rc = bnxt_init_mac_addr(bp); 10576 if (rc) { 10577 dev_err(&pdev->dev, "Unable to initialize mac address.\n"); 10578 rc = -EADDRNOTAVAIL; 10579 goto init_err_pci_clean; 10580 } 10581 | 10461static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 10462{ 10463 static int version_printed; 10464 struct net_device *dev; 10465 struct bnxt *bp; 10466 int rc, max_irqs; 10467 10468 if (pci_is_bridge(pdev)) --- 124 unchanged lines hidden (view full) --- 10593 } 10594 rc = bnxt_init_mac_addr(bp); 10595 if (rc) { 10596 dev_err(&pdev->dev, "Unable to initialize mac address.\n"); 10597 rc = -EADDRNOTAVAIL; 10598 goto init_err_pci_clean; 10599 } 10600 |
10601 /* Read the adapter's DSN to use as the eswitch switch_id */ 10602 rc = bnxt_pcie_dsn_get(bp, bp->switch_id); 10603 if (rc) 10604 goto init_err_pci_clean; 10605 |
|
10582 bnxt_hwrm_func_qcfg(bp); 10583 bnxt_hwrm_vnic_qcaps(bp); 10584 bnxt_hwrm_port_led_qcaps(bp); 10585 bnxt_ethtool_init(bp); 10586 bnxt_dcb_init(bp); 10587 10588 /* MTU range: 60 - FW defined max */ 10589 dev->min_mtu = ETH_ZLEN; --- 316 unchanged lines hidden --- | 10606 bnxt_hwrm_func_qcfg(bp); 10607 bnxt_hwrm_vnic_qcaps(bp); 10608 bnxt_hwrm_port_led_qcaps(bp); 10609 bnxt_ethtool_init(bp); 10610 bnxt_dcb_init(bp); 10611 10612 /* MTU range: 60 - FW defined max */ 10613 dev->min_mtu = ETH_ZLEN; --- 316 unchanged lines hidden --- |