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 ---