Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: RDMA/nes: Fix hang with modified FIN handling on A0 cards RDMA/nes: Change state to closing after FIN RDMA/nes: Fix double CLOSE event indication crash RDMA/nes: Write correct register write to set TX pause param RDMA/cxgb3: Don't exceed the max HW CQ depth
This commit is contained in:
Коммит
26a94e81de
|
@ -53,7 +53,7 @@
|
||||||
#define T3_MAX_PBL_SIZE 256
|
#define T3_MAX_PBL_SIZE 256
|
||||||
#define T3_MAX_RQ_SIZE 1024
|
#define T3_MAX_RQ_SIZE 1024
|
||||||
#define T3_MAX_QP_DEPTH (T3_MAX_RQ_SIZE-1)
|
#define T3_MAX_QP_DEPTH (T3_MAX_RQ_SIZE-1)
|
||||||
#define T3_MAX_CQ_DEPTH 262144
|
#define T3_MAX_CQ_DEPTH 65536
|
||||||
#define T3_MAX_NUM_STAG (1<<15)
|
#define T3_MAX_NUM_STAG (1<<15)
|
||||||
#define T3_MAX_MR_SIZE 0x100000000ULL
|
#define T3_MAX_MR_SIZE 0x100000000ULL
|
||||||
#define T3_PAGESIZE_MASK 0xffff000 /* 4KB-128MB */
|
#define T3_PAGESIZE_MASK 0xffff000 /* 4KB-128MB */
|
||||||
|
|
|
@ -502,7 +502,9 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||||
static void nes_retrans_expired(struct nes_cm_node *cm_node)
|
static void nes_retrans_expired(struct nes_cm_node *cm_node)
|
||||||
{
|
{
|
||||||
struct iw_cm_id *cm_id = cm_node->cm_id;
|
struct iw_cm_id *cm_id = cm_node->cm_id;
|
||||||
switch (cm_node->state) {
|
enum nes_cm_node_state state = cm_node->state;
|
||||||
|
cm_node->state = NES_CM_STATE_CLOSED;
|
||||||
|
switch (state) {
|
||||||
case NES_CM_STATE_SYN_RCVD:
|
case NES_CM_STATE_SYN_RCVD:
|
||||||
case NES_CM_STATE_CLOSING:
|
case NES_CM_STATE_CLOSING:
|
||||||
rem_ref_cm_node(cm_node->cm_core, cm_node);
|
rem_ref_cm_node(cm_node->cm_core, cm_node);
|
||||||
|
@ -511,7 +513,6 @@ static void nes_retrans_expired(struct nes_cm_node *cm_node)
|
||||||
case NES_CM_STATE_FIN_WAIT1:
|
case NES_CM_STATE_FIN_WAIT1:
|
||||||
if (cm_node->cm_id)
|
if (cm_node->cm_id)
|
||||||
cm_id->rem_ref(cm_id);
|
cm_id->rem_ref(cm_id);
|
||||||
cm_node->state = NES_CM_STATE_CLOSED;
|
|
||||||
send_reset(cm_node, NULL);
|
send_reset(cm_node, NULL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1439,9 +1440,6 @@ static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||||
break;
|
break;
|
||||||
case NES_CM_STATE_MPAREQ_RCVD:
|
case NES_CM_STATE_MPAREQ_RCVD:
|
||||||
passive_state = atomic_add_return(1, &cm_node->passive_state);
|
passive_state = atomic_add_return(1, &cm_node->passive_state);
|
||||||
if (passive_state == NES_SEND_RESET_EVENT)
|
|
||||||
create_event(cm_node, NES_CM_EVENT_RESET);
|
|
||||||
cm_node->state = NES_CM_STATE_CLOSED;
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
break;
|
break;
|
||||||
case NES_CM_STATE_ESTABLISHED:
|
case NES_CM_STATE_ESTABLISHED:
|
||||||
|
@ -1456,6 +1454,7 @@ static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||||
case NES_CM_STATE_CLOSED:
|
case NES_CM_STATE_CLOSED:
|
||||||
drop_packet(skb);
|
drop_packet(skb);
|
||||||
break;
|
break;
|
||||||
|
case NES_CM_STATE_FIN_WAIT2:
|
||||||
case NES_CM_STATE_FIN_WAIT1:
|
case NES_CM_STATE_FIN_WAIT1:
|
||||||
case NES_CM_STATE_LAST_ACK:
|
case NES_CM_STATE_LAST_ACK:
|
||||||
cm_node->cm_id->rem_ref(cm_node->cm_id);
|
cm_node->cm_id->rem_ref(cm_node->cm_id);
|
||||||
|
@ -2777,6 +2776,12 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
passive_state = atomic_add_return(1, &cm_node->passive_state);
|
||||||
|
if (passive_state == NES_SEND_RESET_EVENT) {
|
||||||
|
rem_ref_cm_node(cm_node->cm_core, cm_node);
|
||||||
|
return -ECONNRESET;
|
||||||
|
}
|
||||||
|
|
||||||
/* associate the node with the QP */
|
/* associate the node with the QP */
|
||||||
nesqp->cm_node = (void *)cm_node;
|
nesqp->cm_node = (void *)cm_node;
|
||||||
cm_node->nesqp = nesqp;
|
cm_node->nesqp = nesqp;
|
||||||
|
@ -2979,9 +2984,6 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||||
printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
|
printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
|
||||||
"ret=%d\n", __func__, __LINE__, ret);
|
"ret=%d\n", __func__, __LINE__, ret);
|
||||||
|
|
||||||
passive_state = atomic_add_return(1, &cm_node->passive_state);
|
|
||||||
if (passive_state == NES_SEND_RESET_EVENT)
|
|
||||||
create_event(cm_node, NES_CM_EVENT_RESET);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3468,6 +3468,19 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
|
||||||
return; /* Ignore it, wait for close complete */
|
return; /* Ignore it, wait for close complete */
|
||||||
|
|
||||||
if (atomic_inc_return(&nesqp->close_timer_started) == 1) {
|
if (atomic_inc_return(&nesqp->close_timer_started) == 1) {
|
||||||
|
if ((tcp_state == NES_AEQE_TCP_STATE_CLOSE_WAIT) &&
|
||||||
|
(nesqp->ibqp_state == IB_QPS_RTS) &&
|
||||||
|
((nesadapter->eeprom_version >> 16) != NES_A0)) {
|
||||||
|
spin_lock_irqsave(&nesqp->lock, flags);
|
||||||
|
nesqp->hw_iwarp_state = iwarp_state;
|
||||||
|
nesqp->hw_tcp_state = tcp_state;
|
||||||
|
nesqp->last_aeq = async_event_id;
|
||||||
|
next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
|
||||||
|
nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_CLOSING;
|
||||||
|
spin_unlock_irqrestore(&nesqp->lock, flags);
|
||||||
|
nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 0, 0);
|
||||||
|
nes_cm_disconn(nesqp);
|
||||||
|
}
|
||||||
nesqp->cm_id->add_ref(nesqp->cm_id);
|
nesqp->cm_id->add_ref(nesqp->cm_id);
|
||||||
schedule_nes_timer(nesqp->cm_node, (struct sk_buff *)nesqp,
|
schedule_nes_timer(nesqp->cm_node, (struct sk_buff *)nesqp,
|
||||||
NES_TIMER_TYPE_CLOSE, 1, 0);
|
NES_TIMER_TYPE_CLOSE, 1, 0);
|
||||||
|
@ -3477,7 +3490,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
|
||||||
nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
|
nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
|
||||||
async_event_id, nesqp->last_aeq, tcp_state);
|
async_event_id, nesqp->last_aeq, tcp_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NES_AEQE_AEID_LLP_CLOSE_COMPLETE:
|
case NES_AEQE_AEID_LLP_CLOSE_COMPLETE:
|
||||||
if (nesqp->term_flags) {
|
if (nesqp->term_flags) {
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#define NES_PHY_TYPE_KR 9
|
#define NES_PHY_TYPE_KR 9
|
||||||
|
|
||||||
#define NES_MULTICAST_PF_MAX 8
|
#define NES_MULTICAST_PF_MAX 8
|
||||||
|
#define NES_A0 3
|
||||||
|
|
||||||
enum pci_regs {
|
enum pci_regs {
|
||||||
NES_INT_STAT = 0x0000,
|
NES_INT_STAT = 0x0000,
|
||||||
|
|
|
@ -1446,14 +1446,14 @@ static int nes_netdev_set_pauseparam(struct net_device *netdev,
|
||||||
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
|
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
|
||||||
u32temp |= NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
|
u32temp |= NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
|
||||||
nes_write_indexed(nesdev,
|
nes_write_indexed(nesdev,
|
||||||
NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE + (nesdev->mac_index*0x200), u32temp);
|
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
|
||||||
nesdev->disable_tx_flow_control = 0;
|
nesdev->disable_tx_flow_control = 0;
|
||||||
} else if ((et_pauseparam->tx_pause == 0) && (nesdev->disable_tx_flow_control == 0)) {
|
} else if ((et_pauseparam->tx_pause == 0) && (nesdev->disable_tx_flow_control == 0)) {
|
||||||
u32temp = nes_read_indexed(nesdev,
|
u32temp = nes_read_indexed(nesdev,
|
||||||
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
|
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200));
|
||||||
u32temp &= ~NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
|
u32temp &= ~NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE;
|
||||||
nes_write_indexed(nesdev,
|
nes_write_indexed(nesdev,
|
||||||
NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE + (nesdev->mac_index*0x200), u32temp);
|
NES_IDX_MAC_TX_CONFIG + (nesdev->mac_index*0x200), u32temp);
|
||||||
nesdev->disable_tx_flow_control = 1;
|
nesdev->disable_tx_flow_control = 1;
|
||||||
}
|
}
|
||||||
if ((et_pauseparam->rx_pause == 1) && (nesdev->disable_rx_flow_control == 1)) {
|
if ((et_pauseparam->rx_pause == 1) && (nesdev->disable_rx_flow_control == 1)) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче