diff options
Diffstat (limited to 'drivers/net/qla3xxx.c')
-rwxr-xr-x | drivers/net/qla3xxx.c | 110 |
1 files changed, 48 insertions, 62 deletions
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index d3f65dab306c..a8246eb2f8d9 100755 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -1691,6 +1691,27 @@ static int ql_populate_free_queue(struct ql3_adapter *qdev) | |||
1691 | /* | 1691 | /* |
1692 | * Caller holds hw_lock. | 1692 | * Caller holds hw_lock. |
1693 | */ | 1693 | */ |
1694 | static void ql_update_small_bufq_prod_index(struct ql3_adapter *qdev) | ||
1695 | { | ||
1696 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; | ||
1697 | if (qdev->small_buf_release_cnt >= 16) { | ||
1698 | while (qdev->small_buf_release_cnt >= 16) { | ||
1699 | qdev->small_buf_q_producer_index++; | ||
1700 | |||
1701 | if (qdev->small_buf_q_producer_index == | ||
1702 | NUM_SBUFQ_ENTRIES) | ||
1703 | qdev->small_buf_q_producer_index = 0; | ||
1704 | qdev->small_buf_release_cnt -= 8; | ||
1705 | } | ||
1706 | wmb(); | ||
1707 | writel(qdev->small_buf_q_producer_index, | ||
1708 | &port_regs->CommonRegs.rxSmallQProducerIndex); | ||
1709 | } | ||
1710 | } | ||
1711 | |||
1712 | /* | ||
1713 | * Caller holds hw_lock. | ||
1714 | */ | ||
1694 | static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) | 1715 | static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) |
1695 | { | 1716 | { |
1696 | struct bufq_addr_element *lrg_buf_q_ele; | 1717 | struct bufq_addr_element *lrg_buf_q_ele; |
@@ -1732,13 +1753,10 @@ static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) | |||
1732 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; | 1753 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; |
1733 | } | 1754 | } |
1734 | } | 1755 | } |
1735 | 1756 | wmb(); | |
1736 | qdev->lrg_buf_next_free = lrg_buf_q_ele; | 1757 | qdev->lrg_buf_next_free = lrg_buf_q_ele; |
1737 | 1758 | writel(qdev->lrg_buf_q_producer_index, | |
1738 | ql_write_common_reg(qdev, | 1759 | &port_regs->CommonRegs.rxLargeQProducerIndex); |
1739 | &port_regs->CommonRegs. | ||
1740 | rxLargeQProducerIndex, | ||
1741 | qdev->lrg_buf_q_producer_index); | ||
1742 | } | 1760 | } |
1743 | } | 1761 | } |
1744 | 1762 | ||
@@ -1915,17 +1933,18 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1915 | u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum); | 1933 | u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum); |
1916 | if (checksum & | 1934 | if (checksum & |
1917 | (IB_IP_IOCB_RSP_3032_ICE | | 1935 | (IB_IP_IOCB_RSP_3032_ICE | |
1918 | IB_IP_IOCB_RSP_3032_CE | | 1936 | IB_IP_IOCB_RSP_3032_CE)) { |
1919 | IB_IP_IOCB_RSP_3032_NUC)) { | ||
1920 | printk(KERN_ERR | 1937 | printk(KERN_ERR |
1921 | "%s: Bad checksum for this %s packet, checksum = %x.\n", | 1938 | "%s: Bad checksum for this %s packet, checksum = %x.\n", |
1922 | __func__, | 1939 | __func__, |
1923 | ((checksum & | 1940 | ((checksum & |
1924 | IB_IP_IOCB_RSP_3032_TCP) ? "TCP" : | 1941 | IB_IP_IOCB_RSP_3032_TCP) ? "TCP" : |
1925 | "UDP"),checksum); | 1942 | "UDP"),checksum); |
1926 | } else if (checksum & IB_IP_IOCB_RSP_3032_TCP) { | 1943 | } else if ((checksum & IB_IP_IOCB_RSP_3032_TCP) || |
1944 | (checksum & IB_IP_IOCB_RSP_3032_UDP && | ||
1945 | !(checksum & IB_IP_IOCB_RSP_3032_NUC))) { | ||
1927 | skb2->ip_summed = CHECKSUM_UNNECESSARY; | 1946 | skb2->ip_summed = CHECKSUM_UNNECESSARY; |
1928 | } | 1947 | } |
1929 | } | 1948 | } |
1930 | skb2->dev = qdev->ndev; | 1949 | skb2->dev = qdev->ndev; |
1931 | skb2->protocol = eth_type_trans(skb2, qdev->ndev); | 1950 | skb2->protocol = eth_type_trans(skb2, qdev->ndev); |
@@ -1944,16 +1963,12 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1944 | static int ql_tx_rx_clean(struct ql3_adapter *qdev, | 1963 | static int ql_tx_rx_clean(struct ql3_adapter *qdev, |
1945 | int *tx_cleaned, int *rx_cleaned, int work_to_do) | 1964 | int *tx_cleaned, int *rx_cleaned, int work_to_do) |
1946 | { | 1965 | { |
1947 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; | ||
1948 | struct net_rsp_iocb *net_rsp; | 1966 | struct net_rsp_iocb *net_rsp; |
1949 | struct net_device *ndev = qdev->ndev; | 1967 | struct net_device *ndev = qdev->ndev; |
1950 | unsigned long hw_flags; | ||
1951 | int work_done = 0; | 1968 | int work_done = 0; |
1952 | 1969 | ||
1953 | u32 rsp_producer_index = le32_to_cpu(*(qdev->prsp_producer_index)); | ||
1954 | |||
1955 | /* While there are entries in the completion queue. */ | 1970 | /* While there are entries in the completion queue. */ |
1956 | while ((rsp_producer_index != | 1971 | while ((le32_to_cpu(*(qdev->prsp_producer_index)) != |
1957 | qdev->rsp_consumer_index) && (work_done < work_to_do)) { | 1972 | qdev->rsp_consumer_index) && (work_done < work_to_do)) { |
1958 | 1973 | ||
1959 | net_rsp = qdev->rsp_current; | 1974 | net_rsp = qdev->rsp_current; |
@@ -2009,33 +2024,7 @@ static int ql_tx_rx_clean(struct ql3_adapter *qdev, | |||
2009 | work_done = *tx_cleaned + *rx_cleaned; | 2024 | work_done = *tx_cleaned + *rx_cleaned; |
2010 | } | 2025 | } |
2011 | 2026 | ||
2012 | if(work_done) { | 2027 | return work_done; |
2013 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | ||
2014 | |||
2015 | ql_update_lrg_bufq_prod_index(qdev); | ||
2016 | |||
2017 | if (qdev->small_buf_release_cnt >= 16) { | ||
2018 | while (qdev->small_buf_release_cnt >= 16) { | ||
2019 | qdev->small_buf_q_producer_index++; | ||
2020 | |||
2021 | if (qdev->small_buf_q_producer_index == | ||
2022 | NUM_SBUFQ_ENTRIES) | ||
2023 | qdev->small_buf_q_producer_index = 0; | ||
2024 | qdev->small_buf_release_cnt -= 8; | ||
2025 | } | ||
2026 | |||
2027 | wmb(); | ||
2028 | ql_write_common_reg(qdev, | ||
2029 | &port_regs->CommonRegs. | ||
2030 | rxSmallQProducerIndex, | ||
2031 | qdev->small_buf_q_producer_index); | ||
2032 | |||
2033 | } | ||
2034 | |||
2035 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | ||
2036 | } | ||
2037 | |||
2038 | return *tx_cleaned + *rx_cleaned; | ||
2039 | } | 2028 | } |
2040 | 2029 | ||
2041 | static int ql_poll(struct net_device *ndev, int *budget) | 2030 | static int ql_poll(struct net_device *ndev, int *budget) |
@@ -2059,9 +2048,10 @@ quit_polling: | |||
2059 | netif_rx_complete(ndev); | 2048 | netif_rx_complete(ndev); |
2060 | 2049 | ||
2061 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | 2050 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); |
2062 | ql_write_common_reg(qdev, | 2051 | ql_update_small_bufq_prod_index(qdev); |
2063 | &port_regs->CommonRegs.rspQConsumerIndex, | 2052 | ql_update_lrg_bufq_prod_index(qdev); |
2064 | qdev->rsp_consumer_index); | 2053 | writel(qdev->rsp_consumer_index, |
2054 | &port_regs->CommonRegs.rspQConsumerIndex); | ||
2065 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | 2055 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); |
2066 | 2056 | ||
2067 | ql_enable_interrupts(qdev); | 2057 | ql_enable_interrupts(qdev); |
@@ -2217,12 +2207,7 @@ static int ql_send_map(struct ql3_adapter *qdev, | |||
2217 | int seg_cnt, seg = 0; | 2207 | int seg_cnt, seg = 0; |
2218 | int frag_cnt = (int)skb_shinfo(skb)->nr_frags; | 2208 | int frag_cnt = (int)skb_shinfo(skb)->nr_frags; |
2219 | 2209 | ||
2220 | seg_cnt = tx_cb->seg_count = ql_get_seg_count(qdev, | 2210 | seg_cnt = tx_cb->seg_count; |
2221 | (skb_shinfo(skb)->nr_frags)); | ||
2222 | if(seg_cnt == -1) { | ||
2223 | printk(KERN_ERR PFX"%s: invalid segment count!\n",__func__); | ||
2224 | return NETDEV_TX_BUSY; | ||
2225 | } | ||
2226 | /* | 2211 | /* |
2227 | * Map the skb buffer first. | 2212 | * Map the skb buffer first. |
2228 | */ | 2213 | */ |
@@ -2278,7 +2263,7 @@ static int ql_send_map(struct ql3_adapter *qdev, | |||
2278 | pci_unmap_addr_set(&tx_cb->map[seg], mapaddr, | 2263 | pci_unmap_addr_set(&tx_cb->map[seg], mapaddr, |
2279 | map); | 2264 | map); |
2280 | pci_unmap_len_set(&tx_cb->map[seg], maplen, | 2265 | pci_unmap_len_set(&tx_cb->map[seg], maplen, |
2281 | len); | 2266 | sizeof(struct oal)); |
2282 | oal_entry = (struct oal_entry *)oal; | 2267 | oal_entry = (struct oal_entry *)oal; |
2283 | oal++; | 2268 | oal++; |
2284 | seg++; | 2269 | seg++; |
@@ -2380,6 +2365,7 @@ static int ql3xxx_send(struct sk_buff *skb, struct net_device *ndev) | |||
2380 | } | 2365 | } |
2381 | 2366 | ||
2382 | mac_iocb_ptr = tx_cb->queue_entry; | 2367 | mac_iocb_ptr = tx_cb->queue_entry; |
2368 | memset((void *)mac_iocb_ptr, 0, sizeof(struct ob_mac_iocb_req)); | ||
2383 | mac_iocb_ptr->opcode = qdev->mac_ob_opcode; | 2369 | mac_iocb_ptr->opcode = qdev->mac_ob_opcode; |
2384 | mac_iocb_ptr->flags = OB_MAC_IOCB_REQ_X; | 2370 | mac_iocb_ptr->flags = OB_MAC_IOCB_REQ_X; |
2385 | mac_iocb_ptr->flags |= qdev->mb_bit_mask; | 2371 | mac_iocb_ptr->flags |= qdev->mb_bit_mask; |
@@ -3054,15 +3040,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3054 | goto out; | 3040 | goto out; |
3055 | } | 3041 | } |
3056 | 3042 | ||
3057 | if (qdev->mac_index) | ||
3058 | ql_write_page0_reg(qdev, | ||
3059 | &port_regs->mac1MaxFrameLengthReg, | ||
3060 | qdev->max_frame_size); | ||
3061 | else | ||
3062 | ql_write_page0_reg(qdev, | ||
3063 | &port_regs->mac0MaxFrameLengthReg, | ||
3064 | qdev->max_frame_size); | ||
3065 | |||
3066 | value = qdev->nvram_data.tcpMaxWindowSize; | 3043 | value = qdev->nvram_data.tcpMaxWindowSize; |
3067 | ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value); | 3044 | ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value); |
3068 | 3045 | ||
@@ -3082,6 +3059,14 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3082 | ql_sem_unlock(qdev, QL_FLASH_SEM_MASK); | 3059 | ql_sem_unlock(qdev, QL_FLASH_SEM_MASK); |
3083 | } | 3060 | } |
3084 | 3061 | ||
3062 | if (qdev->mac_index) | ||
3063 | ql_write_page0_reg(qdev, | ||
3064 | &port_regs->mac1MaxFrameLengthReg, | ||
3065 | qdev->max_frame_size); | ||
3066 | else | ||
3067 | ql_write_page0_reg(qdev, | ||
3068 | &port_regs->mac0MaxFrameLengthReg, | ||
3069 | qdev->max_frame_size); | ||
3085 | 3070 | ||
3086 | if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK, | 3071 | if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK, |
3087 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) * | 3072 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) * |
@@ -3152,7 +3137,8 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3152 | if (qdev->device_id == QL3032_DEVICE_ID) { | 3137 | if (qdev->device_id == QL3032_DEVICE_ID) { |
3153 | value = | 3138 | value = |
3154 | (QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE | | 3139 | (QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE | |
3155 | QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4); | 3140 | QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4 | |
3141 | QL3032_PORT_CONTROL_ET); | ||
3156 | ql_write_page0_reg(qdev, &port_regs->functionControl, | 3142 | ql_write_page0_reg(qdev, &port_regs->functionControl, |
3157 | ((value << 16) | value)); | 3143 | ((value << 16) | value)); |
3158 | } else { | 3144 | } else { |