diff options
Diffstat (limited to 'drivers/net/ehea/ehea_main.c')
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 41bd7aeafd82..809ccc9ff09c 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/udp.h> | 32 | #include <linux/udp.h> |
33 | #include <linux/if.h> | 33 | #include <linux/if.h> |
34 | #include <linux/list.h> | 34 | #include <linux/list.h> |
35 | #include <linux/slab.h> | ||
35 | #include <linux/if_ether.h> | 36 | #include <linux/if_ether.h> |
36 | #include <linux/notifier.h> | 37 | #include <linux/notifier.h> |
37 | #include <linux/reboot.h> | 38 | #include <linux/reboot.h> |
@@ -189,8 +190,8 @@ static void ehea_update_firmware_handles(void) | |||
189 | for (k = 0; k < EHEA_MAX_PORTS; k++) { | 190 | for (k = 0; k < EHEA_MAX_PORTS; k++) { |
190 | struct ehea_port *port = adapter->port[k]; | 191 | struct ehea_port *port = adapter->port[k]; |
191 | 192 | ||
192 | if (!port || (port->state != EHEA_PORT_UP) | 193 | if (!port || (port->state != EHEA_PORT_UP) || |
193 | || (num_ports == 0)) | 194 | (num_ports == 0)) |
194 | continue; | 195 | continue; |
195 | 196 | ||
196 | for (l = 0; | 197 | for (l = 0; |
@@ -447,7 +448,9 @@ static int ehea_refill_rq_def(struct ehea_port_res *pr, | |||
447 | max_index_mask = q_skba->len - 1; | 448 | max_index_mask = q_skba->len - 1; |
448 | for (i = 0; i < fill_wqes; i++) { | 449 | for (i = 0; i < fill_wqes; i++) { |
449 | u64 tmp_addr; | 450 | u64 tmp_addr; |
450 | struct sk_buff *skb = netdev_alloc_skb(dev, packet_size); | 451 | struct sk_buff *skb; |
452 | |||
453 | skb = netdev_alloc_skb_ip_align(dev, packet_size); | ||
451 | if (!skb) { | 454 | if (!skb) { |
452 | q_skba->os_skbs = fill_wqes - i; | 455 | q_skba->os_skbs = fill_wqes - i; |
453 | if (q_skba->os_skbs == q_skba->len - 2) { | 456 | if (q_skba->os_skbs == q_skba->len - 2) { |
@@ -457,7 +460,6 @@ static int ehea_refill_rq_def(struct ehea_port_res *pr, | |||
457 | } | 460 | } |
458 | break; | 461 | break; |
459 | } | 462 | } |
460 | skb_reserve(skb, NET_IP_ALIGN); | ||
461 | 463 | ||
462 | skb_arr[index] = skb; | 464 | skb_arr[index] = skb; |
463 | tmp_addr = ehea_map_vaddr(skb->data); | 465 | tmp_addr = ehea_map_vaddr(skb->data); |
@@ -500,7 +502,7 @@ static int ehea_refill_rq2(struct ehea_port_res *pr, int nr_of_wqes) | |||
500 | { | 502 | { |
501 | return ehea_refill_rq_def(pr, &pr->rq2_skba, 2, | 503 | return ehea_refill_rq_def(pr, &pr->rq2_skba, 2, |
502 | nr_of_wqes, EHEA_RWQE2_TYPE, | 504 | nr_of_wqes, EHEA_RWQE2_TYPE, |
503 | EHEA_RQ2_PKT_SIZE + NET_IP_ALIGN); | 505 | EHEA_RQ2_PKT_SIZE); |
504 | } | 506 | } |
505 | 507 | ||
506 | 508 | ||
@@ -508,7 +510,7 @@ static int ehea_refill_rq3(struct ehea_port_res *pr, int nr_of_wqes) | |||
508 | { | 510 | { |
509 | return ehea_refill_rq_def(pr, &pr->rq3_skba, 3, | 511 | return ehea_refill_rq_def(pr, &pr->rq3_skba, 3, |
510 | nr_of_wqes, EHEA_RWQE3_TYPE, | 512 | nr_of_wqes, EHEA_RWQE3_TYPE, |
511 | EHEA_MAX_PACKET_SIZE + NET_IP_ALIGN); | 513 | EHEA_MAX_PACKET_SIZE); |
512 | } | 514 | } |
513 | 515 | ||
514 | static inline int ehea_check_cqe(struct ehea_cqe *cqe, int *rq_num) | 516 | static inline int ehea_check_cqe(struct ehea_cqe *cqe, int *rq_num) |
@@ -656,8 +658,8 @@ static int get_skb_hdr(struct sk_buff *skb, void **iphdr, | |||
656 | static void ehea_proc_skb(struct ehea_port_res *pr, struct ehea_cqe *cqe, | 658 | static void ehea_proc_skb(struct ehea_port_res *pr, struct ehea_cqe *cqe, |
657 | struct sk_buff *skb) | 659 | struct sk_buff *skb) |
658 | { | 660 | { |
659 | int vlan_extracted = (cqe->status & EHEA_CQE_VLAN_TAG_XTRACT) | 661 | int vlan_extracted = ((cqe->status & EHEA_CQE_VLAN_TAG_XTRACT) && |
660 | && pr->port->vgrp; | 662 | pr->port->vgrp); |
661 | 663 | ||
662 | if (use_lro) { | 664 | if (use_lro) { |
663 | if (vlan_extracted) | 665 | if (vlan_extracted) |
@@ -1388,8 +1390,8 @@ out: | |||
1388 | 1390 | ||
1389 | int ehea_rem_smrs(struct ehea_port_res *pr) | 1391 | int ehea_rem_smrs(struct ehea_port_res *pr) |
1390 | { | 1392 | { |
1391 | if ((ehea_rem_mr(&pr->send_mr)) | 1393 | if ((ehea_rem_mr(&pr->send_mr)) || |
1392 | || (ehea_rem_mr(&pr->recv_mr))) | 1394 | (ehea_rem_mr(&pr->recv_mr))) |
1393 | return -EIO; | 1395 | return -EIO; |
1394 | else | 1396 | else |
1395 | return 0; | 1397 | return 0; |
@@ -1966,7 +1968,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
1966 | { | 1968 | { |
1967 | struct ehea_port *port = netdev_priv(dev); | 1969 | struct ehea_port *port = netdev_priv(dev); |
1968 | struct dev_mc_list *k_mcl_entry; | 1970 | struct dev_mc_list *k_mcl_entry; |
1969 | int ret, i; | 1971 | int ret; |
1970 | 1972 | ||
1971 | if (dev->flags & IFF_PROMISC) { | 1973 | if (dev->flags & IFF_PROMISC) { |
1972 | ehea_promiscuous(dev, 1); | 1974 | ehea_promiscuous(dev, 1); |
@@ -1980,7 +1982,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
1980 | } | 1982 | } |
1981 | ehea_allmulti(dev, 0); | 1983 | ehea_allmulti(dev, 0); |
1982 | 1984 | ||
1983 | if (dev->mc_count) { | 1985 | if (!netdev_mc_empty(dev)) { |
1984 | ret = ehea_drop_multicast_list(dev); | 1986 | ret = ehea_drop_multicast_list(dev); |
1985 | if (ret) { | 1987 | if (ret) { |
1986 | /* Dropping the current multicast list failed. | 1988 | /* Dropping the current multicast list failed. |
@@ -1989,15 +1991,14 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
1989 | ehea_allmulti(dev, 1); | 1991 | ehea_allmulti(dev, 1); |
1990 | } | 1992 | } |
1991 | 1993 | ||
1992 | if (dev->mc_count > port->adapter->max_mc_mac) { | 1994 | if (netdev_mc_count(dev) > port->adapter->max_mc_mac) { |
1993 | ehea_info("Mcast registration limit reached (0x%llx). " | 1995 | ehea_info("Mcast registration limit reached (0x%llx). " |
1994 | "Use ALLMULTI!", | 1996 | "Use ALLMULTI!", |
1995 | port->adapter->max_mc_mac); | 1997 | port->adapter->max_mc_mac); |
1996 | goto out; | 1998 | goto out; |
1997 | } | 1999 | } |
1998 | 2000 | ||
1999 | for (i = 0, k_mcl_entry = dev->mc_list; i < dev->mc_count; i++, | 2001 | netdev_for_each_mc_addr(k_mcl_entry, dev) |
2000 | k_mcl_entry = k_mcl_entry->next) | ||
2001 | ehea_add_multicast_entry(port, k_mcl_entry->dmi_addr); | 2002 | ehea_add_multicast_entry(port, k_mcl_entry->dmi_addr); |
2002 | 2003 | ||
2003 | } | 2004 | } |
@@ -2030,8 +2031,8 @@ static void ehea_xmit2(struct sk_buff *skb, struct net_device *dev, | |||
2030 | write_ip_start_end(swqe, skb); | 2031 | write_ip_start_end(swqe, skb); |
2031 | 2032 | ||
2032 | if (iph->protocol == IPPROTO_UDP) { | 2033 | if (iph->protocol == IPPROTO_UDP) { |
2033 | if ((iph->frag_off & IP_MF) | 2034 | if ((iph->frag_off & IP_MF) || |
2034 | || (iph->frag_off & IP_OFFSET)) | 2035 | (iph->frag_off & IP_OFFSET)) |
2035 | /* IP fragment, so don't change cs */ | 2036 | /* IP fragment, so don't change cs */ |
2036 | swqe->tx_control &= ~EHEA_SWQE_TCP_CHECKSUM; | 2037 | swqe->tx_control &= ~EHEA_SWQE_TCP_CHECKSUM; |
2037 | else | 2038 | else |
@@ -2076,8 +2077,8 @@ static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev, | |||
2076 | write_tcp_offset_end(swqe, skb); | 2077 | write_tcp_offset_end(swqe, skb); |
2077 | 2078 | ||
2078 | } else if (iph->protocol == IPPROTO_UDP) { | 2079 | } else if (iph->protocol == IPPROTO_UDP) { |
2079 | if ((iph->frag_off & IP_MF) | 2080 | if ((iph->frag_off & IP_MF) || |
2080 | || (iph->frag_off & IP_OFFSET)) | 2081 | (iph->frag_off & IP_OFFSET)) |
2081 | /* IP fragment, so don't change cs */ | 2082 | /* IP fragment, so don't change cs */ |
2082 | swqe->tx_control |= EHEA_SWQE_CRC | 2083 | swqe->tx_control |= EHEA_SWQE_CRC |
2083 | | EHEA_SWQE_IMM_DATA_PRESENT; | 2084 | | EHEA_SWQE_IMM_DATA_PRESENT; |