Commit b3b1514c authored by Ron Mercer's avatar Ron Mercer Committed by Jeff Garzik

qla3xxx: bugfix: Jumbo frame handling.

Fixed rx checksum bits. Turn on TCP processing for rx checksum.
Fixed max frame length register write.  It wasn't getting set
in multi-port system. Set rx buffer queue length properly
for jumbo frames.
Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent f67cac01
...@@ -1933,15 +1933,16 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, ...@@ -1933,15 +1933,16 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev,
u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum); u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum);
if (checksum & if (checksum &
(IB_IP_IOCB_RSP_3032_ICE | (IB_IP_IOCB_RSP_3032_ICE |
IB_IP_IOCB_RSP_3032_CE | IB_IP_IOCB_RSP_3032_CE)) {
IB_IP_IOCB_RSP_3032_NUC)) {
printk(KERN_ERR printk(KERN_ERR
"%s: Bad checksum for this %s packet, checksum = %x.\n", "%s: Bad checksum for this %s packet, checksum = %x.\n",
__func__, __func__,
((checksum & ((checksum &
IB_IP_IOCB_RSP_3032_TCP) ? "TCP" : IB_IP_IOCB_RSP_3032_TCP) ? "TCP" :
"UDP"),checksum); "UDP"),checksum);
} else if (checksum & IB_IP_IOCB_RSP_3032_TCP) { } else if ((checksum & IB_IP_IOCB_RSP_3032_TCP) ||
(checksum & IB_IP_IOCB_RSP_3032_UDP &&
!(checksum & IB_IP_IOCB_RSP_3032_NUC))) {
skb2->ip_summed = CHECKSUM_UNNECESSARY; skb2->ip_summed = CHECKSUM_UNNECESSARY;
} }
} }
...@@ -3039,15 +3040,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) ...@@ -3039,15 +3040,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
goto out; goto out;
} }
if (qdev->mac_index)
ql_write_page0_reg(qdev,
&port_regs->mac1MaxFrameLengthReg,
qdev->max_frame_size);
else
ql_write_page0_reg(qdev,
&port_regs->mac0MaxFrameLengthReg,
qdev->max_frame_size);
value = qdev->nvram_data.tcpMaxWindowSize; value = qdev->nvram_data.tcpMaxWindowSize;
ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value); ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value);
...@@ -3067,6 +3059,14 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) ...@@ -3067,6 +3059,14 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
ql_sem_unlock(qdev, QL_FLASH_SEM_MASK); ql_sem_unlock(qdev, QL_FLASH_SEM_MASK);
} }
if (qdev->mac_index)
ql_write_page0_reg(qdev,
&port_regs->mac1MaxFrameLengthReg,
qdev->max_frame_size);
else
ql_write_page0_reg(qdev,
&port_regs->mac0MaxFrameLengthReg,
qdev->max_frame_size);
if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK, if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
(QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) * (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
...@@ -3137,7 +3137,8 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) ...@@ -3137,7 +3137,8 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
if (qdev->device_id == QL3032_DEVICE_ID) { if (qdev->device_id == QL3032_DEVICE_ID) {
value = value =
(QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE | (QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE |
QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4); QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4 |
QL3032_PORT_CONTROL_ET);
ql_write_page0_reg(qdev, &port_regs->functionControl, ql_write_page0_reg(qdev, &port_regs->functionControl,
((value << 16) | value)); ((value << 16) | value));
} else { } else {
......
...@@ -1014,8 +1014,7 @@ struct eeprom_data { ...@@ -1014,8 +1014,7 @@ struct eeprom_data {
/* Transmit and Receive Buffers */ /* Transmit and Receive Buffers */
#define NUM_LBUFQ_ENTRIES 128 #define NUM_LBUFQ_ENTRIES 128
#define JUMBO_NUM_LBUFQ_ENTRIES \ #define JUMBO_NUM_LBUFQ_ENTRIES 32
(NUM_LBUFQ_ENTRIES/(JUMBO_MTU_SIZE/NORMAL_MTU_SIZE))
#define NUM_SBUFQ_ENTRIES 64 #define NUM_SBUFQ_ENTRIES 64
#define QL_SMALL_BUFFER_SIZE 32 #define QL_SMALL_BUFFER_SIZE 32
#define QL_ADDR_ELE_PER_BUFQ_ENTRY \ #define QL_ADDR_ELE_PER_BUFQ_ENTRY \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment