aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ehea
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/ehea
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/ehea')
-rw-r--r--drivers/net/ehea/ehea_ethtool.c4
-rw-r--r--drivers/net/ehea/ehea_hcall.h51
-rw-r--r--drivers/net/ehea/ehea_main.c39
-rw-r--r--drivers/net/ehea/ehea_phyp.h1
-rw-r--r--drivers/net/ehea/ehea_qmr.c5
5 files changed, 25 insertions, 75 deletions
diff --git a/drivers/net/ehea/ehea_ethtool.c b/drivers/net/ehea/ehea_ethtool.c
index d76885223366..75b099ce49c9 100644
--- a/drivers/net/ehea/ehea_ethtool.c
+++ b/drivers/net/ehea/ehea_ethtool.c
@@ -118,7 +118,7 @@ doit:
118 ret = ehea_set_portspeed(port, sp); 118 ret = ehea_set_portspeed(port, sp);
119 119
120 if (!ret) 120 if (!ret)
121 ehea_info("%s: Port speed succesfully set: %dMbps " 121 ehea_info("%s: Port speed successfully set: %dMbps "
122 "%s Duplex", 122 "%s Duplex",
123 port->netdev->name, port->port_speed, 123 port->netdev->name, port->port_speed,
124 port->full_duplex == 1 ? "Full" : "Half"); 124 port->full_duplex == 1 ? "Full" : "Half");
@@ -134,7 +134,7 @@ static int ehea_nway_reset(struct net_device *dev)
134 ret = ehea_set_portspeed(port, EHEA_SPEED_AUTONEG); 134 ret = ehea_set_portspeed(port, EHEA_SPEED_AUTONEG);
135 135
136 if (!ret) 136 if (!ret)
137 ehea_info("%s: Port speed succesfully set: %dMbps " 137 ehea_info("%s: Port speed successfully set: %dMbps "
138 "%s Duplex", 138 "%s Duplex",
139 port->netdev->name, port->port_speed, 139 port->netdev->name, port->port_speed,
140 port->full_duplex == 1 ? "Full" : "Half"); 140 port->full_duplex == 1 ? "Full" : "Half");
diff --git a/drivers/net/ehea/ehea_hcall.h b/drivers/net/ehea/ehea_hcall.h
deleted file mode 100644
index 8e7d1c3edc60..000000000000
--- a/drivers/net/ehea/ehea_hcall.h
+++ /dev/null
@@ -1,51 +0,0 @@
1/*
2 * linux/drivers/net/ehea/ehea_hcall.h
3 *
4 * eHEA ethernet device driver for IBM eServer System p
5 *
6 * (C) Copyright IBM Corp. 2006
7 *
8 * Authors:
9 * Christoph Raisch <raisch@de.ibm.com>
10 * Jan-Bernd Themann <themann@de.ibm.com>
11 * Thomas Klein <tklein@de.ibm.com>
12 *
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2, or (at your option)
17 * any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 */
28
29#ifndef __EHEA_HCALL_H__
30#define __EHEA_HCALL_H__
31
32/**
33 * This file contains HCALL defines that are to be included in the appropriate
34 * kernel files later
35 */
36
37#define H_ALLOC_HEA_RESOURCE 0x278
38#define H_MODIFY_HEA_QP 0x250
39#define H_QUERY_HEA_QP 0x254
40#define H_QUERY_HEA 0x258
41#define H_QUERY_HEA_PORT 0x25C
42#define H_MODIFY_HEA_PORT 0x260
43#define H_REG_BCMC 0x264
44#define H_DEREG_BCMC 0x268
45#define H_REGISTER_HEA_RPAGES 0x26C
46#define H_DISABLE_AND_GET_HEA 0x270
47#define H_GET_HEA_INFO 0x274
48#define H_ADD_CONN 0x284
49#define H_DEL_CONN 0x288
50
51#endif /* __EHEA_HCALL_H__ */
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
514static inline int ehea_check_cqe(struct ehea_cqe *cqe, int *rq_num) 516static 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,
656static void ehea_proc_skb(struct ehea_port_res *pr, struct ehea_cqe *cqe, 658static 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
1389int ehea_rem_smrs(struct ehea_port_res *pr) 1391int 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;
diff --git a/drivers/net/ehea/ehea_phyp.h b/drivers/net/ehea/ehea_phyp.h
index f3628c803567..2f8174c248bc 100644
--- a/drivers/net/ehea/ehea_phyp.h
+++ b/drivers/net/ehea/ehea_phyp.h
@@ -33,7 +33,6 @@
33#include <asm/hvcall.h> 33#include <asm/hvcall.h>
34#include "ehea.h" 34#include "ehea.h"
35#include "ehea_hw.h" 35#include "ehea_hw.h"
36#include "ehea_hcall.h"
37 36
38/* Some abbreviations used here: 37/* Some abbreviations used here:
39 * 38 *
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c
index bc7c5b7abb88..a1b4c7e56367 100644
--- a/drivers/net/ehea/ehea_qmr.c
+++ b/drivers/net/ehea/ehea_qmr.c
@@ -27,6 +27,7 @@
27 */ 27 */
28 28
29#include <linux/mm.h> 29#include <linux/mm.h>
30#include <linux/slab.h>
30#include "ehea.h" 31#include "ehea.h"
31#include "ehea_phyp.h" 32#include "ehea_phyp.h"
32#include "ehea_qmr.h" 33#include "ehea_qmr.h"
@@ -837,8 +838,8 @@ static u64 ehea_reg_mr_section(int top, int dir, int idx, u64 *pt,
837 hret = ehea_h_register_rpage_mr(adapter->handle, mr->handle, 0, 838 hret = ehea_h_register_rpage_mr(adapter->handle, mr->handle, 0,
838 0, pt_abs, EHEA_MAX_RPAGE); 839 0, pt_abs, EHEA_MAX_RPAGE);
839 840
840 if ((hret != H_SUCCESS) 841 if ((hret != H_SUCCESS) &&
841 && (hret != H_PAGE_REGISTERED)) { 842 (hret != H_PAGE_REGISTERED)) {
842 ehea_h_free_resource(adapter->handle, mr->handle, 843 ehea_h_free_resource(adapter->handle, mr->handle,
843 FORCE_FREE); 844 FORCE_FREE);
844 ehea_error("register_rpage_mr failed"); 845 ehea_error("register_rpage_mr failed");