mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
Merge branches 'cxgb3', 'ipoib', 'misc' and 'nes' into for-next
This commit is contained in:
commit
0636b33c5f
@ -2953,6 +2953,9 @@ static void ib_mad_remove_device(struct ib_device *device)
|
|||||||
{
|
{
|
||||||
int i, num_ports, cur_port;
|
int i, num_ports, cur_port;
|
||||||
|
|
||||||
|
if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB)
|
||||||
|
return;
|
||||||
|
|
||||||
if (device->node_type == RDMA_NODE_IB_SWITCH) {
|
if (device->node_type == RDMA_NODE_IB_SWITCH) {
|
||||||
num_ports = 1;
|
num_ports = 1;
|
||||||
cur_port = 0;
|
cur_port = 0;
|
||||||
|
@ -1899,9 +1899,14 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
|
|||||||
u16 wqe_fragment_index;
|
u16 wqe_fragment_index;
|
||||||
u64 wqe_frag;
|
u64 wqe_frag;
|
||||||
u32 cqp_head;
|
u32 cqp_head;
|
||||||
|
u32 wqm_cfg0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* clear wqe stall before destroying NIC QP */
|
||||||
|
wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0);
|
||||||
|
nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF);
|
||||||
|
|
||||||
/* Free remaining NIC receive buffers */
|
/* Free remaining NIC receive buffers */
|
||||||
while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) {
|
while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) {
|
||||||
nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail];
|
nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail];
|
||||||
@ -2020,6 +2025,9 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
|
|||||||
|
|
||||||
pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase,
|
pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase,
|
||||||
nesvnic->nic_pbase);
|
nesvnic->nic_pbase);
|
||||||
|
|
||||||
|
/* restore old wqm_cfg0 value */
|
||||||
|
nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -160,6 +160,7 @@ enum indexed_regs {
|
|||||||
NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004,
|
NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004,
|
||||||
NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008,
|
NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008,
|
||||||
NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c,
|
NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c,
|
||||||
|
NES_IDX_WQM_CONFIG0 = 0x5000,
|
||||||
NES_IDX_WQM_CONFIG1 = 0x5004,
|
NES_IDX_WQM_CONFIG1 = 0x5004,
|
||||||
NES_IDX_CM_CONFIG = 0x5100,
|
NES_IDX_CM_CONFIG = 0x5100,
|
||||||
NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000,
|
NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000,
|
||||||
|
@ -1595,7 +1595,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
|
|||||||
struct nes_vnic *nesvnic;
|
struct nes_vnic *nesvnic;
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct nic_qp_map *curr_qp_map;
|
struct nic_qp_map *curr_qp_map;
|
||||||
u32 u32temp;
|
|
||||||
u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index];
|
u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index];
|
||||||
|
|
||||||
netdev = alloc_etherdev(sizeof(struct nes_vnic));
|
netdev = alloc_etherdev(sizeof(struct nes_vnic));
|
||||||
@ -1707,6 +1706,10 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
|
|||||||
((phy_type == NES_PHY_TYPE_PUMA_1G) &&
|
((phy_type == NES_PHY_TYPE_PUMA_1G) &&
|
||||||
(((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) ||
|
(((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) ||
|
||||||
((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) {
|
((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) {
|
||||||
|
u32 u32temp;
|
||||||
|
u32 link_mask;
|
||||||
|
u32 link_val;
|
||||||
|
|
||||||
u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
|
u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
|
||||||
(0x200 * (nesdev->mac_index & 1)));
|
(0x200 * (nesdev->mac_index & 1)));
|
||||||
if (phy_type != NES_PHY_TYPE_PUMA_1G) {
|
if (phy_type != NES_PHY_TYPE_PUMA_1G) {
|
||||||
@ -1715,13 +1718,36 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
|
|||||||
(0x200 * (nesdev->mac_index & 1)), u32temp);
|
(0x200 * (nesdev->mac_index & 1)), u32temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check and set linkup here. This is for back to back */
|
||||||
|
/* configuration where second port won't get link interrupt */
|
||||||
|
switch (phy_type) {
|
||||||
|
case NES_PHY_TYPE_PUMA_1G:
|
||||||
|
if (nesdev->mac_index < 2) {
|
||||||
|
link_mask = 0x01010000;
|
||||||
|
link_val = 0x01010000;
|
||||||
|
} else {
|
||||||
|
link_mask = 0x02020000;
|
||||||
|
link_val = 0x02020000;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
link_mask = 0x0f1f0000;
|
||||||
|
link_val = 0x0f0f0000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32temp = nes_read_indexed(nesdev,
|
||||||
|
NES_IDX_PHY_PCS_CONTROL_STATUS0 +
|
||||||
|
(0x200 * (nesdev->mac_index & 1)));
|
||||||
|
if ((u32temp & link_mask) == link_val)
|
||||||
|
nesvnic->linkup = 1;
|
||||||
|
|
||||||
/* clear the MAC interrupt status, assumes direct logical to physical mapping */
|
/* clear the MAC interrupt status, assumes direct logical to physical mapping */
|
||||||
u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
|
u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
|
||||||
nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
|
nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
|
||||||
nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
|
nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
|
||||||
|
|
||||||
nes_init_phy(nesdev);
|
nes_init_phy(nesdev);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return netdev;
|
return netdev;
|
||||||
|
@ -1323,6 +1323,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
|||||||
nesqp->nesqp_context->aeq_token_low = cpu_to_le32((u32)((unsigned long)(nesqp)));
|
nesqp->nesqp_context->aeq_token_low = cpu_to_le32((u32)((unsigned long)(nesqp)));
|
||||||
nesqp->nesqp_context->aeq_token_high = cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp))));
|
nesqp->nesqp_context->aeq_token_high = cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp))));
|
||||||
nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM |
|
nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM |
|
||||||
|
NES_QPCONTEXT_ORDIRD_AAH |
|
||||||
((((u32)nesadapter->max_irrq_wr) <<
|
((((u32)nesadapter->max_irrq_wr) <<
|
||||||
NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK));
|
NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK));
|
||||||
if (disable_mpa_crc) {
|
if (disable_mpa_crc) {
|
||||||
|
@ -708,6 +708,7 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
|
|||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||||
struct ipoib_cm_tx_buf *tx_req;
|
struct ipoib_cm_tx_buf *tx_req;
|
||||||
u64 addr;
|
u64 addr;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (unlikely(skb->len > tx->mtu)) {
|
if (unlikely(skb->len > tx->mtu)) {
|
||||||
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
|
ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
|
||||||
@ -739,9 +740,10 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
|
|||||||
|
|
||||||
tx_req->mapping = addr;
|
tx_req->mapping = addr;
|
||||||
|
|
||||||
if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
|
rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
|
||||||
addr, skb->len))) {
|
addr, skb->len);
|
||||||
ipoib_warn(priv, "post_send failed\n");
|
if (unlikely(rc)) {
|
||||||
|
ipoib_warn(priv, "post_send failed, error %d\n", rc);
|
||||||
++dev->stats.tx_errors;
|
++dev->stats.tx_errors;
|
||||||
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
|
ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
@ -752,6 +754,8 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
|
|||||||
if (++priv->tx_outstanding == ipoib_sendq_size) {
|
if (++priv->tx_outstanding == ipoib_sendq_size) {
|
||||||
ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
|
ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
|
||||||
tx->qp->qp_num);
|
tx->qp->qp_num);
|
||||||
|
if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP))
|
||||||
|
ipoib_warn(priv, "request notify on send CQ failed\n");
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -529,7 +529,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
|
|||||||
{
|
{
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||||
struct ipoib_tx_buf *tx_req;
|
struct ipoib_tx_buf *tx_req;
|
||||||
int hlen;
|
int hlen, rc;
|
||||||
void *phead;
|
void *phead;
|
||||||
|
|
||||||
if (skb_is_gso(skb)) {
|
if (skb_is_gso(skb)) {
|
||||||
@ -585,9 +585,10 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
|
|||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
|
rc = post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
|
||||||
address->ah, qpn, tx_req, phead, hlen))) {
|
address->ah, qpn, tx_req, phead, hlen);
|
||||||
ipoib_warn(priv, "post_send failed\n");
|
if (unlikely(rc)) {
|
||||||
|
ipoib_warn(priv, "post_send failed, error %d\n", rc);
|
||||||
++dev->stats.tx_errors;
|
++dev->stats.tx_errors;
|
||||||
--priv->tx_outstanding;
|
--priv->tx_outstanding;
|
||||||
ipoib_dma_unmap_tx(priv->ca, tx_req);
|
ipoib_dma_unmap_tx(priv->ca, tx_req);
|
||||||
|
Loading…
Reference in New Issue
Block a user