|
@@ -38,6 +38,7 @@
|
|
|
#include <linux/ip.h>
|
|
|
#include <linux/tcp.h>
|
|
|
#include <linux/if_vlan.h>
|
|
|
+#include <linux/inet_lro.h>
|
|
|
|
|
|
#include "nes.h"
|
|
|
|
|
@@ -832,7 +833,7 @@ static void nes_init_csr_ne020(struct nes_device *nesdev, u8 hw_rev, u8 port_cou
|
|
|
nes_write_indexed(nesdev, 0x00000900, 0x20000001);
|
|
|
nes_write_indexed(nesdev, 0x000060C0, 0x0000028e);
|
|
|
nes_write_indexed(nesdev, 0x000060C8, 0x00000020);
|
|
|
- //
|
|
|
+
|
|
|
nes_write_indexed(nesdev, 0x000001EC, 0x7b2625a0);
|
|
|
/* nes_write_indexed(nesdev, 0x000001EC, 0x5f2625a0); */
|
|
|
|
|
@@ -1207,11 +1208,16 @@ int nes_init_phy(struct nes_device *nesdev)
|
|
|
{
|
|
|
struct nes_adapter *nesadapter = nesdev->nesadapter;
|
|
|
u32 counter = 0;
|
|
|
+ u32 sds_common_control0;
|
|
|
u32 mac_index = nesdev->mac_index;
|
|
|
- u32 tx_config;
|
|
|
+ u32 tx_config = 0;
|
|
|
u16 phy_data;
|
|
|
+ u32 temp_phy_data = 0;
|
|
|
+ u32 temp_phy_data2 = 0;
|
|
|
+ u32 i = 0;
|
|
|
|
|
|
- if (nesadapter->OneG_Mode) {
|
|
|
+ if ((nesadapter->OneG_Mode) &&
|
|
|
+ (nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) {
|
|
|
nes_debug(NES_DBG_PHY, "1G PHY, mac_index = %d.\n", mac_index);
|
|
|
if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_1G) {
|
|
|
printk(PFX "%s: Programming mdc config for 1G\n", __func__);
|
|
@@ -1223,7 +1229,7 @@ int nes_init_phy(struct nes_device *nesdev)
|
|
|
nes_read_1G_phy_reg(nesdev, 1, nesadapter->phy_index[mac_index], &phy_data);
|
|
|
nes_debug(NES_DBG_PHY, "Phy data from register 1 phy address %u = 0x%X.\n",
|
|
|
nesadapter->phy_index[mac_index], phy_data);
|
|
|
- nes_write_1G_phy_reg(nesdev, 23, nesadapter->phy_index[mac_index], 0xb000);
|
|
|
+ nes_write_1G_phy_reg(nesdev, 23, nesadapter->phy_index[mac_index], 0xb000);
|
|
|
|
|
|
/* Reset the PHY */
|
|
|
nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], 0x8000);
|
|
@@ -1277,12 +1283,126 @@ int nes_init_phy(struct nes_device *nesdev)
|
|
|
nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], &phy_data);
|
|
|
nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], phy_data | 0x0300);
|
|
|
} else {
|
|
|
- if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_IRIS) {
|
|
|
+ if ((nesadapter->phy_type[mac_index] == NES_PHY_TYPE_IRIS) ||
|
|
|
+ (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_ARGUS)) {
|
|
|
/* setup 10G MDIO operation */
|
|
|
tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG);
|
|
|
tx_config |= 0x14;
|
|
|
nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config);
|
|
|
}
|
|
|
+ if ((nesadapter->phy_type[mac_index] == NES_PHY_TYPE_ARGUS)) {
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee);
|
|
|
+
|
|
|
+ temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ mdelay(10);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee);
|
|
|
+ temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * if firmware is already running (like from a
|
|
|
+ * driver un-load/load, don't do anything.
|
|
|
+ */
|
|
|
+ if (temp_phy_data == temp_phy_data2) {
|
|
|
+ /* configure QT2505 AMCC PHY */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0x0000, 0x8000);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc300, 0x0000);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc302, 0x0044);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc318, 0x0052);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc319, 0x0008);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc31a, 0x0098);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0026, 0x0E00);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0027, 0x0000);
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0028, 0xA528);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * remove micro from reset; chip boots from ROM,
|
|
|
+ * uploads EEPROM f/w image, uC executes f/w
|
|
|
+ */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc300, 0x0002);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * wait for heart beat to start to
|
|
|
+ * know loading is done
|
|
|
+ */
|
|
|
+ counter = 0;
|
|
|
+ do {
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee);
|
|
|
+ temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ if (counter++ > 1000) {
|
|
|
+ nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from heartbeat check <this is bad!!!> \n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mdelay(100);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee);
|
|
|
+ temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ } while ((temp_phy_data2 == temp_phy_data));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * wait for tracking to start to know
|
|
|
+ * f/w is good to go
|
|
|
+ */
|
|
|
+ counter = 0;
|
|
|
+ do {
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7fd);
|
|
|
+ temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ if (counter++ > 1000) {
|
|
|
+ nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from status check <this is bad!!!> \n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mdelay(1000);
|
|
|
+ /*
|
|
|
+ * nes_debug(NES_DBG_PHY, "AMCC PHY- phy_status not ready yet = 0x%02X\n",
|
|
|
+ * temp_phy_data);
|
|
|
+ */
|
|
|
+ } while (((temp_phy_data & 0xff) != 0x50) && ((temp_phy_data & 0xff) != 0x70));
|
|
|
+
|
|
|
+ /* set LOS Control invert RXLOSB_I_PADINV */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd003, 0x0000);
|
|
|
+ /* set LOS Control to mask of RXLOSB_I */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc314, 0x0042);
|
|
|
+ /* set LED1 to input mode (LED1 and LED2 share same LED) */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd006, 0x0007);
|
|
|
+ /* set LED2 to RX link_status and activity */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd007, 0x000A);
|
|
|
+ /* set LED3 to RX link_status */
|
|
|
+ nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd008, 0x0009);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * reset the res-calibration on t2
|
|
|
+ * serdes; ensures it is stable after
|
|
|
+ * the amcc phy is stable
|
|
|
+ */
|
|
|
+
|
|
|
+ sds_common_control0 = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0);
|
|
|
+ sds_common_control0 |= 0x1;
|
|
|
+ nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds_common_control0);
|
|
|
+
|
|
|
+ /* release the res-calibration reset */
|
|
|
+ sds_common_control0 &= 0xfffffffe;
|
|
|
+ nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds_common_control0);
|
|
|
+
|
|
|
+ i = 0;
|
|
|
+ while (((nes_read32(nesdev->regs + NES_SOFTWARE_RESET) & 0x00000040) != 0x00000040)
|
|
|
+ && (i++ < 5000)) {
|
|
|
+ /* mdelay(1); */
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * wait for link train done before moving on,
|
|
|
+ * or will get an interupt storm
|
|
|
+ */
|
|
|
+ counter = 0;
|
|
|
+ do {
|
|
|
+ temp_phy_data = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
|
|
|
+ (0x200 * (nesdev->mac_index & 1)));
|
|
|
+ if (counter++ > 1000) {
|
|
|
+ nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from link train wait <this is bad, link didnt train!!!>\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mdelay(1);
|
|
|
+ } while (((temp_phy_data & 0x0f1f0000) != 0x0f0f0000));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -1375,6 +1495,25 @@ static void nes_rq_wqes_timeout(unsigned long parm)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int nes_lro_get_skb_hdr(struct sk_buff *skb, void **iphdr,
|
|
|
+ void **tcph, u64 *hdr_flags, void *priv)
|
|
|
+{
|
|
|
+ unsigned int ip_len;
|
|
|
+ struct iphdr *iph;
|
|
|
+ skb_reset_network_header(skb);
|
|
|
+ iph = ip_hdr(skb);
|
|
|
+ if (iph->protocol != IPPROTO_TCP)
|
|
|
+ return -1;
|
|
|
+ ip_len = ip_hdrlen(skb);
|
|
|
+ skb_set_transport_header(skb, ip_len);
|
|
|
+ *tcph = tcp_hdr(skb);
|
|
|
+
|
|
|
+ *hdr_flags = LRO_IPV4 | LRO_TCP;
|
|
|
+ *iphdr = iph;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* nes_init_nic_qp
|
|
|
*/
|
|
@@ -1520,10 +1659,10 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
|
|
|
}
|
|
|
|
|
|
u64temp = (u64)nesvnic->nic.sq_pbase;
|
|
|
- nic_context->context_words[NES_NIC_CTX_SQ_LOW_IDX] = cpu_to_le32((u32)u64temp);
|
|
|
+ nic_context->context_words[NES_NIC_CTX_SQ_LOW_IDX] = cpu_to_le32((u32)u64temp);
|
|
|
nic_context->context_words[NES_NIC_CTX_SQ_HIGH_IDX] = cpu_to_le32((u32)(u64temp >> 32));
|
|
|
u64temp = (u64)nesvnic->nic.rq_pbase;
|
|
|
- nic_context->context_words[NES_NIC_CTX_RQ_LOW_IDX] = cpu_to_le32((u32)u64temp);
|
|
|
+ nic_context->context_words[NES_NIC_CTX_RQ_LOW_IDX] = cpu_to_le32((u32)u64temp);
|
|
|
nic_context->context_words[NES_NIC_CTX_RQ_HIGH_IDX] = cpu_to_le32((u32)(u64temp >> 32));
|
|
|
|
|
|
cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] = cpu_to_le32(NES_CQP_CREATE_QP |
|
|
@@ -1575,7 +1714,7 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
|
|
|
nic_rqe = &nesvnic->nic.rq_vbase[counter];
|
|
|
nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_1_0_IDX] = cpu_to_le32(nesvnic->max_frame_size);
|
|
|
nic_rqe->wqe_words[NES_NIC_RQ_WQE_LENGTH_3_2_IDX] = 0;
|
|
|
- nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX] = cpu_to_le32((u32)pmem);
|
|
|
+ nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX] = cpu_to_le32((u32)pmem);
|
|
|
nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_HIGH_IDX] = cpu_to_le32((u32)((u64)pmem >> 32));
|
|
|
nesvnic->nic.rx_skb[counter] = skb;
|
|
|
}
|
|
@@ -1592,15 +1731,21 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
|
|
|
nesvnic->rq_wqes_timer.function = nes_rq_wqes_timeout;
|
|
|
nesvnic->rq_wqes_timer.data = (unsigned long)nesvnic;
|
|
|
nes_debug(NES_DBG_INIT, "NAPI support Enabled\n");
|
|
|
-
|
|
|
if (nesdev->nesadapter->et_use_adaptive_rx_coalesce)
|
|
|
{
|
|
|
nes_nic_init_timer(nesdev);
|
|
|
if (netdev->mtu > 1500)
|
|
|
jumbomode = 1;
|
|
|
- nes_nic_init_timer_defaults(nesdev, jumbomode);
|
|
|
- }
|
|
|
-
|
|
|
+ nes_nic_init_timer_defaults(nesdev, jumbomode);
|
|
|
+ }
|
|
|
+ nesvnic->lro_mgr.max_aggr = NES_LRO_MAX_AGGR;
|
|
|
+ nesvnic->lro_mgr.max_desc = NES_MAX_LRO_DESCRIPTORS;
|
|
|
+ nesvnic->lro_mgr.lro_arr = nesvnic->lro_desc;
|
|
|
+ nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr;
|
|
|
+ nesvnic->lro_mgr.features = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID;
|
|
|
+ nesvnic->lro_mgr.dev = netdev;
|
|
|
+ nesvnic->lro_mgr.ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
+ nesvnic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1620,8 +1765,8 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
|
|
|
|
|
|
/* Free remaining NIC receive buffers */
|
|
|
while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) {
|
|
|
- nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail];
|
|
|
- wqe_frag = (u64)le32_to_cpu(nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX]);
|
|
|
+ nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail];
|
|
|
+ wqe_frag = (u64)le32_to_cpu(nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_LOW_IDX]);
|
|
|
wqe_frag |= ((u64)le32_to_cpu(nic_rqe->wqe_words[NES_NIC_RQ_WQE_FRAG0_HIGH_IDX])) << 32;
|
|
|
pci_unmap_single(nesdev->pcidev, (dma_addr_t)wqe_frag,
|
|
|
nesvnic->max_frame_size, PCI_DMA_FROMDEVICE);
|
|
@@ -1704,17 +1849,17 @@ int nes_napi_isr(struct nes_device *nesdev)
|
|
|
/* iff NIC, process here, else wait for DPC */
|
|
|
if ((int_stat) && ((int_stat & 0x0000ff00) == int_stat)) {
|
|
|
nesdev->napi_isr_ran = 0;
|
|
|
- nes_write32(nesdev->regs+NES_INT_STAT,
|
|
|
- (int_stat &
|
|
|
- ~(NES_INT_INTF|NES_INT_TIMER|NES_INT_MAC0|NES_INT_MAC1|NES_INT_MAC2|NES_INT_MAC3)));
|
|
|
+ nes_write32(nesdev->regs + NES_INT_STAT,
|
|
|
+ (int_stat &
|
|
|
+ ~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0 | NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3)));
|
|
|
|
|
|
/* Process the CEQs */
|
|
|
nes_process_ceq(nesdev, &nesdev->nesadapter->ceq[nesdev->nic_ceq_index]);
|
|
|
|
|
|
if (unlikely((((nesadapter->et_rx_coalesce_usecs_irq) &&
|
|
|
- (!nesadapter->et_use_adaptive_rx_coalesce)) ||
|
|
|
- ((nesadapter->et_use_adaptive_rx_coalesce) &&
|
|
|
- (nesdev->deepcq_count > nesadapter->et_pkt_rate_low)))) ) {
|
|
|
+ (!nesadapter->et_use_adaptive_rx_coalesce)) ||
|
|
|
+ ((nesadapter->et_use_adaptive_rx_coalesce) &&
|
|
|
+ (nesdev->deepcq_count > nesadapter->et_pkt_rate_low))))) {
|
|
|
if ((nesdev->int_req & NES_INT_TIMER) == 0) {
|
|
|
/* Enable Periodic timer interrupts */
|
|
|
nesdev->int_req |= NES_INT_TIMER;
|
|
@@ -1792,12 +1937,12 @@ void nes_dpc(unsigned long param)
|
|
|
}
|
|
|
|
|
|
if (int_stat) {
|
|
|
- if (int_stat & ~(NES_INT_INTF|NES_INT_TIMER|NES_INT_MAC0|
|
|
|
- NES_INT_MAC1|NES_INT_MAC2|NES_INT_MAC3)) {
|
|
|
+ if (int_stat & ~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0|
|
|
|
+ NES_INT_MAC1|NES_INT_MAC2 | NES_INT_MAC3)) {
|
|
|
/* Ack the interrupts */
|
|
|
nes_write32(nesdev->regs+NES_INT_STAT,
|
|
|
- (int_stat & ~(NES_INT_INTF|NES_INT_TIMER|NES_INT_MAC0|
|
|
|
- NES_INT_MAC1|NES_INT_MAC2|NES_INT_MAC3)));
|
|
|
+ (int_stat & ~(NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0|
|
|
|
+ NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3)));
|
|
|
}
|
|
|
|
|
|
temp_int_stat = int_stat;
|
|
@@ -1862,8 +2007,8 @@ void nes_dpc(unsigned long param)
|
|
|
}
|
|
|
}
|
|
|
/* Don't use the interface interrupt bit stay in loop */
|
|
|
- int_stat &= ~NES_INT_INTF|NES_INT_TIMER|NES_INT_MAC0|
|
|
|
- NES_INT_MAC1|NES_INT_MAC2|NES_INT_MAC3;
|
|
|
+ int_stat &= ~NES_INT_INTF | NES_INT_TIMER | NES_INT_MAC0 |
|
|
|
+ NES_INT_MAC1 | NES_INT_MAC2 | NES_INT_MAC3;
|
|
|
} while ((int_stat != 0) && (loop_counter++ < MAX_DPC_ITERATIONS));
|
|
|
|
|
|
if (timer_ints == 1) {
|
|
@@ -1874,9 +2019,9 @@ void nes_dpc(unsigned long param)
|
|
|
nesdev->timer_only_int_count = 0;
|
|
|
nesdev->int_req &= ~NES_INT_TIMER;
|
|
|
nes_write32(nesdev->regs + NES_INTF_INT_MASK, ~(nesdev->intf_int_req));
|
|
|
- nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req);
|
|
|
+ nes_write32(nesdev->regs + NES_INT_MASK, ~nesdev->int_req);
|
|
|
} else {
|
|
|
- nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff|(~nesdev->int_req));
|
|
|
+ nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
|
|
|
}
|
|
|
} else {
|
|
|
if (unlikely(nesadapter->et_use_adaptive_rx_coalesce))
|
|
@@ -1884,7 +2029,7 @@ void nes_dpc(unsigned long param)
|
|
|
nes_nic_init_timer(nesdev);
|
|
|
}
|
|
|
nesdev->timer_only_int_count = 0;
|
|
|
- nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff|(~nesdev->int_req));
|
|
|
+ nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff | (~nesdev->int_req));
|
|
|
}
|
|
|
} else {
|
|
|
nesdev->timer_only_int_count = 0;
|
|
@@ -1933,7 +2078,7 @@ static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq)
|
|
|
do {
|
|
|
if (le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX]) &
|
|
|
NES_CEQE_VALID) {
|
|
|
- u64temp = (((u64)(le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX])))<<32) |
|
|
|
+ u64temp = (((u64)(le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_HIGH_IDX]))) << 32) |
|
|
|
((u64)(le32_to_cpu(ceq->ceq_vbase[head].ceqe_words[NES_CEQE_CQ_CTX_LOW_IDX])));
|
|
|
u64temp <<= 1;
|
|
|
cq = *((struct nes_hw_cq **)&u64temp);
|
|
@@ -1961,7 +2106,7 @@ static void nes_process_ceq(struct nes_device *nesdev, struct nes_hw_ceq *ceq)
|
|
|
*/
|
|
|
static void nes_process_aeq(struct nes_device *nesdev, struct nes_hw_aeq *aeq)
|
|
|
{
|
|
|
-// u64 u64temp;
|
|
|
+ /* u64 u64temp; */
|
|
|
u32 head;
|
|
|
u32 aeq_size;
|
|
|
u32 aeqe_misc;
|
|
@@ -1980,8 +2125,10 @@ static void nes_process_aeq(struct nes_device *nesdev, struct nes_hw_aeq *aeq)
|
|
|
if (aeqe_misc & (NES_AEQE_QP|NES_AEQE_CQ)) {
|
|
|
if (aeqe_cq_id >= NES_FIRST_QPN) {
|
|
|
/* dealing with an accelerated QP related AE */
|
|
|
-// u64temp = (((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX])))<<32) |
|
|
|
-// ((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX])));
|
|
|
+ /*
|
|
|
+ * u64temp = (((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX]))) << 32) |
|
|
|
+ * ((u64)(le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX])));
|
|
|
+ */
|
|
|
nes_process_iwarp_aeqe(nesdev, (struct nes_hw_aeqe *)aeqe);
|
|
|
} else {
|
|
|
/* TODO: dealing with a CQP related AE */
|
|
@@ -2081,6 +2228,8 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
|
|
u32 u32temp;
|
|
|
u16 phy_data;
|
|
|
u16 temp_phy_data;
|
|
|
+ u32 pcs_val = 0x0f0f0000;
|
|
|
+ u32 pcs_mask = 0x0f1f0000;
|
|
|
|
|
|
spin_lock_irqsave(&nesadapter->phy_lock, flags);
|
|
|
if (nesadapter->mac_sw_state[mac_number] != NES_MAC_SW_IDLE) {
|
|
@@ -2144,13 +2293,30 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
|
|
nes_debug(NES_DBG_PHY, "Eth SERDES Common Status: 0=0x%08X, 1=0x%08X\n",
|
|
|
nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0),
|
|
|
nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_STATUS0+0x200));
|
|
|
- pcs_control_status = nes_read_indexed(nesdev,
|
|
|
- NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index&1)*0x200));
|
|
|
- pcs_control_status = nes_read_indexed(nesdev,
|
|
|
- NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index&1)*0x200));
|
|
|
+
|
|
|
+ if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_PUMA_1G) {
|
|
|
+ switch (mac_index) {
|
|
|
+ case 1:
|
|
|
+ case 3:
|
|
|
+ pcs_control_status = nes_read_indexed(nesdev,
|
|
|
+ NES_IDX_PHY_PCS_CONTROL_STATUS0 + 0x200);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pcs_control_status = nes_read_indexed(nesdev,
|
|
|
+ NES_IDX_PHY_PCS_CONTROL_STATUS0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pcs_control_status = nes_read_indexed(nesdev,
|
|
|
+ NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index & 1) * 0x200));
|
|
|
+ pcs_control_status = nes_read_indexed(nesdev,
|
|
|
+ NES_IDX_PHY_PCS_CONTROL_STATUS0 + ((mac_index & 1) * 0x200));
|
|
|
+ }
|
|
|
+
|
|
|
nes_debug(NES_DBG_PHY, "PCS PHY Control/Status%u: 0x%08X\n",
|
|
|
mac_index, pcs_control_status);
|
|
|
- if (nesadapter->OneG_Mode) {
|
|
|
+ if ((nesadapter->OneG_Mode) &&
|
|
|
+ (nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) {
|
|
|
u32temp = 0x01010000;
|
|
|
if (nesadapter->port_count > 2) {
|
|
|
u32temp |= 0x02020000;
|
|
@@ -2159,24 +2325,59 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
|
|
phy_data = 0;
|
|
|
nes_debug(NES_DBG_PHY, "PCS says the link is down\n");
|
|
|
}
|
|
|
- } else if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_IRIS) {
|
|
|
- nes_read_10G_phy_reg(nesdev, 1, nesadapter->phy_index[mac_index]);
|
|
|
- temp_phy_data = (u16)nes_read_indexed(nesdev,
|
|
|
- NES_IDX_MAC_MDIO_CONTROL);
|
|
|
- u32temp = 20;
|
|
|
- do {
|
|
|
- nes_read_10G_phy_reg(nesdev, 1, nesadapter->phy_index[mac_index]);
|
|
|
- phy_data = (u16)nes_read_indexed(nesdev,
|
|
|
- NES_IDX_MAC_MDIO_CONTROL);
|
|
|
- if ((phy_data == temp_phy_data) || (!(--u32temp)))
|
|
|
- break;
|
|
|
- temp_phy_data = phy_data;
|
|
|
- } while (1);
|
|
|
- nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n",
|
|
|
- __func__, phy_data, nesadapter->mac_link_down ? "DOWN" : "UP");
|
|
|
-
|
|
|
} else {
|
|
|
- phy_data = (0x0f0f0000 == (pcs_control_status & 0x0f1f0000)) ? 4 : 0;
|
|
|
+ switch (nesadapter->phy_type[mac_index]) {
|
|
|
+ case NES_PHY_TYPE_IRIS:
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1);
|
|
|
+ temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ u32temp = 20;
|
|
|
+ do {
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1);
|
|
|
+ phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ if ((phy_data == temp_phy_data) || (!(--u32temp)))
|
|
|
+ break;
|
|
|
+ temp_phy_data = phy_data;
|
|
|
+ } while (1);
|
|
|
+ nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n",
|
|
|
+ __func__, phy_data, nesadapter->mac_link_down[mac_index] ? "DOWN" : "UP");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case NES_PHY_TYPE_ARGUS:
|
|
|
+ /* clear the alarms */
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0x0008);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc001);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc002);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc005);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc006);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9003);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9004);
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9005);
|
|
|
+ /* check link status */
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1);
|
|
|
+ temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ u32temp = 100;
|
|
|
+ do {
|
|
|
+ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1);
|
|
|
+
|
|
|
+ phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
|
|
+ if ((phy_data == temp_phy_data) || (!(--u32temp)))
|
|
|
+ break;
|
|
|
+ temp_phy_data = phy_data;
|
|
|
+ } while (1);
|
|
|
+ nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n",
|
|
|
+ __func__, phy_data, nesadapter->mac_link_down ? "DOWN" : "UP");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case NES_PHY_TYPE_PUMA_1G:
|
|
|
+ if (mac_index < 2)
|
|
|
+ pcs_val = pcs_mask = 0x01010000;
|
|
|
+ else
|
|
|
+ pcs_val = pcs_mask = 0x02020000;
|
|
|
+ /* fall through */
|
|
|
+ default:
|
|
|
+ phy_data = (pcs_val == (pcs_control_status & pcs_mask)) ? 0x4 : 0x0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (phy_data & 0x0004) {
|
|
@@ -2185,8 +2386,8 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
|
|
nes_debug(NES_DBG_PHY, "The Link is UP!!. linkup was %d\n",
|
|
|
nesvnic->linkup);
|
|
|
if (nesvnic->linkup == 0) {
|
|
|
- printk(PFX "The Link is now up for port %u, netdev %p.\n",
|
|
|
- mac_index, nesvnic->netdev);
|
|
|
+ printk(PFX "The Link is now up for port %s, netdev %p.\n",
|
|
|
+ nesvnic->netdev->name, nesvnic->netdev);
|
|
|
if (netif_queue_stopped(nesvnic->netdev))
|
|
|
netif_start_queue(nesvnic->netdev);
|
|
|
nesvnic->linkup = 1;
|
|
@@ -2199,8 +2400,8 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
|
|
nes_debug(NES_DBG_PHY, "The Link is Down!!. linkup was %d\n",
|
|
|
nesvnic->linkup);
|
|
|
if (nesvnic->linkup == 1) {
|
|
|
- printk(PFX "The Link is now down for port %u, netdev %p.\n",
|
|
|
- mac_index, nesvnic->netdev);
|
|
|
+ printk(PFX "The Link is now down for port %s, netdev %p.\n",
|
|
|
+ nesvnic->netdev->name, nesvnic->netdev);
|
|
|
if (!(netif_queue_stopped(nesvnic->netdev)))
|
|
|
netif_stop_queue(nesvnic->netdev);
|
|
|
nesvnic->linkup = 0;
|
|
@@ -2254,10 +2455,13 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
u16 pkt_type;
|
|
|
u16 rqes_processed = 0;
|
|
|
u8 sq_cqes = 0;
|
|
|
+ u8 nes_use_lro = 0;
|
|
|
|
|
|
head = cq->cq_head;
|
|
|
cq_size = cq->cq_size;
|
|
|
cq->cqes_pending = 1;
|
|
|
+ if (nesvnic->netdev->features & NETIF_F_LRO)
|
|
|
+ nes_use_lro = 1;
|
|
|
do {
|
|
|
if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) &
|
|
|
NES_NIC_CQE_VALID) {
|
|
@@ -2272,8 +2476,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
/* bump past the vlan tag */
|
|
|
wqe_fragment_length++;
|
|
|
if (le16_to_cpu(wqe_fragment_length[wqe_fragment_index]) != 0) {
|
|
|
- u64temp = (u64) le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX+wqe_fragment_index*2]);
|
|
|
- u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX+wqe_fragment_index*2]))<<32;
|
|
|
+ u64temp = (u64) le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX +
|
|
|
+ wqe_fragment_index * 2]);
|
|
|
+ u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX +
|
|
|
+ wqe_fragment_index * 2])) << 32;
|
|
|
bus_address = (dma_addr_t)u64temp;
|
|
|
if (test_and_clear_bit(nesnic->sq_tail, nesnic->first_frag_overflow)) {
|
|
|
pci_unmap_single(nesdev->pcidev,
|
|
@@ -2283,8 +2489,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
}
|
|
|
for (; wqe_fragment_index < 5; wqe_fragment_index++) {
|
|
|
if (wqe_fragment_length[wqe_fragment_index]) {
|
|
|
- u64temp = le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX+wqe_fragment_index*2]);
|
|
|
- u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX+wqe_fragment_index*2]))<<32;
|
|
|
+ u64temp = le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_LOW_IDX +
|
|
|
+ wqe_fragment_index * 2]);
|
|
|
+ u64temp += ((u64)le32_to_cpu(nic_sqe->wqe_words[NES_NIC_SQ_WQE_FRAG0_HIGH_IDX
|
|
|
+ + wqe_fragment_index * 2])) <<32;
|
|
|
bus_address = (dma_addr_t)u64temp;
|
|
|
pci_unmap_page(nesdev->pcidev,
|
|
|
bus_address,
|
|
@@ -2331,7 +2539,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
if (atomic_read(&nesvnic->rx_skbs_needed) > (nesvnic->nic.rq_size>>1)) {
|
|
|
nes_write32(nesdev->regs+NES_CQE_ALLOC,
|
|
|
cq->cq_number | (cqe_count << 16));
|
|
|
-// nesadapter->tune_timer.cq_count += cqe_count;
|
|
|
+ /* nesadapter->tune_timer.cq_count += cqe_count; */
|
|
|
nesdev->currcq_count += cqe_count;
|
|
|
cqe_count = 0;
|
|
|
nes_replenish_nic_rq(nesvnic);
|
|
@@ -2379,9 +2587,16 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
>> 16);
|
|
|
nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n",
|
|
|
nesvnic->netdev->name, vlan_tag);
|
|
|
- nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag);
|
|
|
+ if (nes_use_lro)
|
|
|
+ lro_vlan_hwaccel_receive_skb(&nesvnic->lro_mgr, rx_skb,
|
|
|
+ nesvnic->vlan_grp, vlan_tag, NULL);
|
|
|
+ else
|
|
|
+ nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag);
|
|
|
} else {
|
|
|
- nes_netif_rx(rx_skb);
|
|
|
+ if (nes_use_lro)
|
|
|
+ lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL);
|
|
|
+ else
|
|
|
+ nes_netif_rx(rx_skb);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2399,7 +2614,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
/* Replenish Nic CQ */
|
|
|
nes_write32(nesdev->regs+NES_CQE_ALLOC,
|
|
|
cq->cq_number | (cqe_count << 16));
|
|
|
-// nesdev->nesadapter->tune_timer.cq_count += cqe_count;
|
|
|
+ /* nesdev->nesadapter->tune_timer.cq_count += cqe_count; */
|
|
|
nesdev->currcq_count += cqe_count;
|
|
|
cqe_count = 0;
|
|
|
}
|
|
@@ -2413,26 +2628,27 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|
|
|
|
|
} while (1);
|
|
|
|
|
|
+ if (nes_use_lro)
|
|
|
+ lro_flush_all(&nesvnic->lro_mgr);
|
|
|
if (sq_cqes) {
|
|
|
barrier();
|
|
|
/* restart the queue if it had been stopped */
|
|
|
if (netif_queue_stopped(nesvnic->netdev))
|
|
|
netif_wake_queue(nesvnic->netdev);
|
|
|
}
|
|
|
-
|
|
|
cq->cq_head = head;
|
|
|
/* nes_debug(NES_DBG_CQ, "CQ%u Processed = %u cqes, new head = %u.\n",
|
|
|
cq->cq_number, cqe_count, cq->cq_head); */
|
|
|
cq->cqe_allocs_pending = cqe_count;
|
|
|
if (unlikely(nesadapter->et_use_adaptive_rx_coalesce))
|
|
|
{
|
|
|
-// nesdev->nesadapter->tune_timer.cq_count += cqe_count;
|
|
|
+ /* nesdev->nesadapter->tune_timer.cq_count += cqe_count; */
|
|
|
nesdev->currcq_count += cqe_count;
|
|
|
nes_nic_tune_timer(nesdev);
|
|
|
}
|
|
|
if (atomic_read(&nesvnic->rx_skbs_needed))
|
|
|
nes_replenish_nic_rq(nesvnic);
|
|
|
- }
|
|
|
+}
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -2461,7 +2677,7 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
|
|
|
|
|
|
if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX]) & NES_CQE_VALID) {
|
|
|
u64temp = (((u64)(le32_to_cpu(cq->cq_vbase[head].
|
|
|
- cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX])))<<32) |
|
|
|
+ cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX]))) << 32) |
|
|
|
((u64)(le32_to_cpu(cq->cq_vbase[head].
|
|
|
cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX])));
|
|
|
cqp = *((struct nes_hw_cqp **)&u64temp);
|
|
@@ -2478,7 +2694,7 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
|
|
|
}
|
|
|
|
|
|
u64temp = (((u64)(le32_to_cpu(nesdev->cqp.sq_vbase[cqp->sq_tail].
|
|
|
- wqe_words[NES_CQP_WQE_COMP_SCRATCH_HIGH_IDX])))<<32) |
|
|
|
+ wqe_words[NES_CQP_WQE_COMP_SCRATCH_HIGH_IDX]))) << 32) |
|
|
|
((u64)(le32_to_cpu(nesdev->cqp.sq_vbase[cqp->sq_tail].
|
|
|
wqe_words[NES_CQP_WQE_COMP_SCRATCH_LOW_IDX])));
|
|
|
cqp_request = *((struct nes_cqp_request **)&u64temp);
|
|
@@ -2515,7 +2731,7 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
|
|
|
} else {
|
|
|
nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
|
|
|
cqp_request,
|
|
|
- le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f);
|
|
|
+ le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f);
|
|
|
if (cqp_request->dynamic) {
|
|
|
kfree(cqp_request);
|
|
|
} else {
|
|
@@ -2529,7 +2745,7 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
|
|
|
}
|
|
|
|
|
|
cq->cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX] = 0;
|
|
|
- nes_write32(nesdev->regs+NES_CQE_ALLOC, cq->cq_number | (1 << 16));
|
|
|
+ nes_write32(nesdev->regs + NES_CQE_ALLOC, cq->cq_number | (1 << 16));
|
|
|
if (++cqp->sq_tail >= cqp->sq_size)
|
|
|
cqp->sq_tail = 0;
|
|
|
|
|
@@ -2598,13 +2814,13 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
|
|
|
nes_debug(NES_DBG_AEQ, "\n");
|
|
|
aeq_info = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_MISC_IDX]);
|
|
|
if ((NES_AEQE_INBOUND_RDMA&aeq_info) || (!(NES_AEQE_QP&aeq_info))) {
|
|
|
- context = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX]);
|
|
|
+ context = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX]);
|
|
|
context += ((u64)le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX])) << 32;
|
|
|
} else {
|
|
|
aeqe_context = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_LOW_IDX]);
|
|
|
aeqe_context += ((u64)le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_CTXT_HIGH_IDX])) << 32;
|
|
|
context = (unsigned long)nesadapter->qp_table[le32_to_cpu(
|
|
|
- aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX])-NES_FIRST_QPN];
|
|
|
+ aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]) - NES_FIRST_QPN];
|
|
|
BUG_ON(!context);
|
|
|
}
|
|
|
|
|
@@ -2617,7 +2833,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
|
|
|
le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]), aeqe,
|
|
|
nes_tcp_state_str[tcp_state], nes_iwarp_state_str[iwarp_state]);
|
|
|
|
|
|
-
|
|
|
switch (async_event_id) {
|
|
|
case NES_AEQE_AEID_LLP_FIN_RECEIVED:
|
|
|
nesqp = *((struct nes_qp **)&context);
|
|
@@ -3021,7 +3236,7 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr,
|
|
|
cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] |= cpu_to_le32(NES_CQP_ARP_VALID);
|
|
|
cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = cpu_to_le32(
|
|
|
(((u32)mac_addr[2]) << 24) | (((u32)mac_addr[3]) << 16) |
|
|
|
- (((u32)mac_addr[4]) << 8) | (u32)mac_addr[5]);
|
|
|
+ (((u32)mac_addr[4]) << 8) | (u32)mac_addr[5]);
|
|
|
cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = cpu_to_le32(
|
|
|
(((u32)mac_addr[0]) << 16) | (u32)mac_addr[1]);
|
|
|
} else {
|