| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2016 Chelsio Communications, Inc. |
|---|
| 3 | | - * |
|---|
| 4 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 5 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 6 | | - * published by the Free Software Foundation. |
|---|
| 7 | 4 | */ |
|---|
| 8 | 5 | |
|---|
| 9 | 6 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 878 | 875 | return 0; |
|---|
| 879 | 876 | |
|---|
| 880 | 877 | if (caps & DCB_CAP_DCBX_VER_IEEE) { |
|---|
| 881 | | - iscsi_dcb_app.selector = IEEE_8021QAZ_APP_SEL_ANY; |
|---|
| 882 | | - |
|---|
| 878 | + iscsi_dcb_app.selector = IEEE_8021QAZ_APP_SEL_STREAM; |
|---|
| 883 | 879 | ret = dcb_ieee_getapp_mask(ndev, &iscsi_dcb_app); |
|---|
| 884 | | - |
|---|
| 880 | + if (!ret) { |
|---|
| 881 | + iscsi_dcb_app.selector = IEEE_8021QAZ_APP_SEL_ANY; |
|---|
| 882 | + ret = dcb_ieee_getapp_mask(ndev, &iscsi_dcb_app); |
|---|
| 883 | + } |
|---|
| 885 | 884 | } else if (caps & DCB_CAP_DCBX_VER_CEE) { |
|---|
| 886 | 885 | iscsi_dcb_app.selector = DCB_APP_IDTYPE_PORTNUM; |
|---|
| 887 | 886 | |
|---|
| .. | .. |
|---|
| 935 | 934 | goto out; |
|---|
| 936 | 935 | csk->mtu = ndev->mtu; |
|---|
| 937 | 936 | csk->tx_chan = cxgb4_port_chan(ndev); |
|---|
| 938 | | - csk->smac_idx = cxgb4_tp_smt_idx(cdev->lldi.adapter_type, |
|---|
| 939 | | - cxgb4_port_viid(ndev)); |
|---|
| 937 | + csk->smac_idx = |
|---|
| 938 | + ((struct port_info *)netdev_priv(ndev))->smt_idx; |
|---|
| 940 | 939 | step = cdev->lldi.ntxq / |
|---|
| 941 | 940 | cdev->lldi.nchan; |
|---|
| 942 | 941 | csk->txq_idx = cxgb4_port_idx(ndev) * step; |
|---|
| .. | .. |
|---|
| 971 | 970 | port_id = cxgb4_port_idx(ndev); |
|---|
| 972 | 971 | csk->mtu = dst_mtu(dst); |
|---|
| 973 | 972 | csk->tx_chan = cxgb4_port_chan(ndev); |
|---|
| 974 | | - csk->smac_idx = cxgb4_tp_smt_idx(cdev->lldi.adapter_type, |
|---|
| 975 | | - cxgb4_port_viid(ndev)); |
|---|
| 973 | + csk->smac_idx = |
|---|
| 974 | + ((struct port_info *)netdev_priv(ndev))->smt_idx; |
|---|
| 976 | 975 | step = cdev->lldi.ntxq / |
|---|
| 977 | 976 | cdev->lldi.nports; |
|---|
| 978 | 977 | csk->txq_idx = (port_id * step) + |
|---|
| .. | .. |
|---|
| 1361 | 1360 | cxgbit_sock_reset_wr_list(csk); |
|---|
| 1362 | 1361 | spin_lock_init(&csk->lock); |
|---|
| 1363 | 1362 | init_waitqueue_head(&csk->waitq); |
|---|
| 1364 | | - init_waitqueue_head(&csk->ack_waitq); |
|---|
| 1365 | 1363 | csk->lock_owner = false; |
|---|
| 1366 | 1364 | |
|---|
| 1367 | 1365 | if (cxgbit_alloc_csk_skb(csk)) { |
|---|
| .. | .. |
|---|
| 1486 | 1484 | return flowclen16; |
|---|
| 1487 | 1485 | } |
|---|
| 1488 | 1486 | |
|---|
| 1487 | +static int |
|---|
| 1488 | +cxgbit_send_tcb_skb(struct cxgbit_sock *csk, struct sk_buff *skb) |
|---|
| 1489 | +{ |
|---|
| 1490 | + spin_lock_bh(&csk->lock); |
|---|
| 1491 | + if (unlikely(csk->com.state != CSK_STATE_ESTABLISHED)) { |
|---|
| 1492 | + spin_unlock_bh(&csk->lock); |
|---|
| 1493 | + pr_err("%s: csk 0x%p, tid %u, state %u\n", |
|---|
| 1494 | + __func__, csk, csk->tid, csk->com.state); |
|---|
| 1495 | + __kfree_skb(skb); |
|---|
| 1496 | + return -1; |
|---|
| 1497 | + } |
|---|
| 1498 | + |
|---|
| 1499 | + cxgbit_get_csk(csk); |
|---|
| 1500 | + cxgbit_init_wr_wait(&csk->com.wr_wait); |
|---|
| 1501 | + cxgbit_ofld_send(csk->com.cdev, skb); |
|---|
| 1502 | + spin_unlock_bh(&csk->lock); |
|---|
| 1503 | + |
|---|
| 1504 | + return 0; |
|---|
| 1505 | +} |
|---|
| 1506 | + |
|---|
| 1489 | 1507 | int cxgbit_setup_conn_digest(struct cxgbit_sock *csk) |
|---|
| 1490 | 1508 | { |
|---|
| 1491 | 1509 | struct sk_buff *skb; |
|---|
| .. | .. |
|---|
| 1511 | 1529 | (dcrc ? ULP_CRC_DATA : 0)) << 4); |
|---|
| 1512 | 1530 | set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->ctrlq_idx); |
|---|
| 1513 | 1531 | |
|---|
| 1514 | | - cxgbit_get_csk(csk); |
|---|
| 1515 | | - cxgbit_init_wr_wait(&csk->com.wr_wait); |
|---|
| 1516 | | - |
|---|
| 1517 | | - cxgbit_ofld_send(csk->com.cdev, skb); |
|---|
| 1532 | + if (cxgbit_send_tcb_skb(csk, skb)) |
|---|
| 1533 | + return -1; |
|---|
| 1518 | 1534 | |
|---|
| 1519 | 1535 | ret = cxgbit_wait_for_reply(csk->com.cdev, |
|---|
| 1520 | 1536 | &csk->com.wr_wait, |
|---|
| .. | .. |
|---|
| 1546 | 1562 | req->val = cpu_to_be64(pg_idx << 8); |
|---|
| 1547 | 1563 | set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->ctrlq_idx); |
|---|
| 1548 | 1564 | |
|---|
| 1549 | | - cxgbit_get_csk(csk); |
|---|
| 1550 | | - cxgbit_init_wr_wait(&csk->com.wr_wait); |
|---|
| 1551 | | - |
|---|
| 1552 | | - cxgbit_ofld_send(csk->com.cdev, skb); |
|---|
| 1565 | + if (cxgbit_send_tcb_skb(csk, skb)) |
|---|
| 1566 | + return -1; |
|---|
| 1553 | 1567 | |
|---|
| 1554 | 1568 | ret = cxgbit_wait_for_reply(csk->com.cdev, |
|---|
| 1555 | 1569 | &csk->com.wr_wait, |
|---|
| .. | .. |
|---|
| 1872 | 1886 | if (csk->snd_una != snd_una) { |
|---|
| 1873 | 1887 | csk->snd_una = snd_una; |
|---|
| 1874 | 1888 | dst_confirm(csk->dst); |
|---|
| 1875 | | - wake_up(&csk->ack_waitq); |
|---|
| 1876 | 1889 | } |
|---|
| 1877 | 1890 | } |
|---|
| 1878 | 1891 | |
|---|