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: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Ron Mercer 2007-03-26 13:43:00 -07:00 committed by Jeff Garzik
parent f67cac0190
commit b3b1514c90
2 changed files with 16 additions and 16 deletions

View file

@ -1933,17 +1933,18 @@ 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;
} }
} }
skb2->dev = qdev->ndev; skb2->dev = qdev->ndev;
skb2->protocol = eth_type_trans(skb2, qdev->ndev); skb2->protocol = eth_type_trans(skb2, qdev->ndev);
@ -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)
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)
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 {

View file

@ -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 \