]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.drivers/netxen-fix-link-speed-reporting-for-some-boards.patch
Reenabled linux-xen and xen-image build
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / netxen-fix-link-speed-reporting-for-some-boards.patch
1 From c7860a2aec571ea95d3ad19b8d9775b27828baac Mon Sep 17 00:00:00 2001
2 From: Dhananjay Phadke <dhananjay@netxen.com>
3 Date: Wed, 14 Jan 2009 20:48:32 -0800
4 Subject: netxen: fix link speed reporting for some boards
5 Acked-by: Karsten Keil <kkeil@novell.com>
6 Reference: bnc#472416
7
8 o Read negotiated link speed when link state changes.
9 o Fix link speed reporting for hybrid nic boards, which have both 1Gbps and
10 10Gbps ports.
11
12 Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
13 Signed-off-by: David S. Miller <davem@davemloft.net>
14 ---
15 drivers/net/netxen/netxen_nic.h | 3 ++-
16 drivers/net/netxen/netxen_nic_ethtool.c | 31 +++++++++++++++++++++++--------
17 drivers/net/netxen/netxen_nic_hw.c | 28 ++++++++++++++++++++--------
18 drivers/net/netxen/netxen_nic_main.c | 14 +++++++++++++-
19 4 files changed, 58 insertions(+), 18 deletions(-)
20
21 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic.h
22 ===================================================================
23 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic.h
24 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic.h
25 @@ -499,7 +499,8 @@ typedef enum {
26 NETXEN_BRDTYPE_P3_10G_SFP_CT = 0x002a,
27 NETXEN_BRDTYPE_P3_10G_SFP_QT = 0x002b,
28 NETXEN_BRDTYPE_P3_10G_CX4 = 0x0031,
29 - NETXEN_BRDTYPE_P3_10G_XFP = 0x0032
30 + NETXEN_BRDTYPE_P3_10G_XFP = 0x0032,
31 + NETXEN_BRDTYPE_P3_10G_TP = 0x0080
32
33 } netxen_brdtype_t;
34
35 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_ethtool.c
36 ===================================================================
37 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_ethtool.c
38 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_ethtool.c
39 @@ -136,11 +136,9 @@ netxen_nic_get_settings(struct net_devic
40
41 ecmd->port = PORT_TP;
42
43 - if (netif_running(dev)) {
44 - ecmd->speed = adapter->link_speed;
45 - ecmd->duplex = adapter->link_duplex;
46 - ecmd->autoneg = adapter->link_autoneg;
47 - }
48 + ecmd->speed = adapter->link_speed;
49 + ecmd->duplex = adapter->link_duplex;
50 + ecmd->autoneg = adapter->link_autoneg;
51
52 } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
53 u32 val;
54 @@ -171,7 +169,7 @@ netxen_nic_get_settings(struct net_devic
55 } else
56 return -EIO;
57
58 - ecmd->phy_address = adapter->portnum;
59 + ecmd->phy_address = adapter->physical_port;
60 ecmd->transceiver = XCVR_EXTERNAL;
61
62 switch ((netxen_brdtype_t) boardinfo->board_type) {
63 @@ -180,13 +178,13 @@ netxen_nic_get_settings(struct net_devic
64 case NETXEN_BRDTYPE_P3_REF_QG:
65 case NETXEN_BRDTYPE_P3_4_GB:
66 case NETXEN_BRDTYPE_P3_4_GB_MM:
67 - case NETXEN_BRDTYPE_P3_10000_BASE_T:
68
69 ecmd->supported |= SUPPORTED_Autoneg;
70 ecmd->advertising |= ADVERTISED_Autoneg;
71 case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
72 case NETXEN_BRDTYPE_P3_10G_CX4:
73 case NETXEN_BRDTYPE_P3_10G_CX4_LP:
74 + case NETXEN_BRDTYPE_P3_10000_BASE_T:
75 ecmd->supported |= SUPPORTED_TP;
76 ecmd->advertising |= ADVERTISED_TP;
77 ecmd->port = PORT_TP;
78 @@ -204,16 +202,33 @@ netxen_nic_get_settings(struct net_devic
79 ecmd->port = PORT_FIBRE;
80 ecmd->autoneg = AUTONEG_DISABLE;
81 break;
82 - case NETXEN_BRDTYPE_P2_SB31_10G:
83 case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
84 case NETXEN_BRDTYPE_P3_10G_SFP_CT:
85 case NETXEN_BRDTYPE_P3_10G_SFP_QT:
86 + ecmd->advertising |= ADVERTISED_TP;
87 + ecmd->supported |= SUPPORTED_TP;
88 + case NETXEN_BRDTYPE_P2_SB31_10G:
89 case NETXEN_BRDTYPE_P3_10G_XFP:
90 ecmd->supported |= SUPPORTED_FIBRE;
91 ecmd->advertising |= ADVERTISED_FIBRE;
92 ecmd->port = PORT_FIBRE;
93 ecmd->autoneg = AUTONEG_DISABLE;
94 break;
95 + case NETXEN_BRDTYPE_P3_10G_TP:
96 + if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
97 + ecmd->autoneg = AUTONEG_DISABLE;
98 + ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
99 + ecmd->advertising |=
100 + (ADVERTISED_FIBRE | ADVERTISED_TP);
101 + ecmd->port = PORT_FIBRE;
102 + } else {
103 + ecmd->autoneg = AUTONEG_ENABLE;
104 + ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg);
105 + ecmd->advertising |=
106 + (ADVERTISED_TP | ADVERTISED_Autoneg);
107 + ecmd->port = PORT_TP;
108 + }
109 + break;
110 default:
111 printk(KERN_ERR "netxen-nic: Unsupported board model %d\n",
112 (netxen_brdtype_t) boardinfo->board_type);
113 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_hw.c
114 ===================================================================
115 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_hw.c
116 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_hw.c
117 @@ -2036,7 +2036,13 @@ int netxen_nic_get_board_info(struct net
118 rv = -1;
119 }
120
121 - DPRINTK(INFO, "Discovered board type:0x%x ", boardinfo->board_type);
122 + if (boardinfo->board_type == NETXEN_BRDTYPE_P3_4_GB_MM) {
123 + u32 gpio = netxen_nic_reg_read(adapter,
124 + NETXEN_ROMUSB_GLB_PAD_GPIO_I);
125 + if ((gpio & 0x8000) == 0)
126 + boardinfo->board_type = NETXEN_BRDTYPE_P3_10G_TP;
127 + }
128 +
129 switch ((netxen_brdtype_t) boardinfo->board_type) {
130 case NETXEN_BRDTYPE_P2_SB35_4G:
131 adapter->ahw.board_type = NETXEN_NIC_GBE;
132 @@ -2055,7 +2061,6 @@ int netxen_nic_get_board_info(struct net
133 case NETXEN_BRDTYPE_P3_10G_SFP_QT:
134 case NETXEN_BRDTYPE_P3_10G_XFP:
135 case NETXEN_BRDTYPE_P3_10000_BASE_T:
136 -
137 adapter->ahw.board_type = NETXEN_NIC_XGBE;
138 break;
139 case NETXEN_BRDTYPE_P1_BD:
140 @@ -2065,9 +2070,12 @@ int netxen_nic_get_board_info(struct net
141 case NETXEN_BRDTYPE_P3_REF_QG:
142 case NETXEN_BRDTYPE_P3_4_GB:
143 case NETXEN_BRDTYPE_P3_4_GB_MM:
144 -
145 adapter->ahw.board_type = NETXEN_NIC_GBE;
146 break;
147 + case NETXEN_BRDTYPE_P3_10G_TP:
148 + adapter->ahw.board_type = (adapter->portnum < 2) ?
149 + NETXEN_NIC_XGBE : NETXEN_NIC_GBE;
150 + break;
151 default:
152 printk("%s: Unknown(%x)\n", netxen_nic_driver_name,
153 boardinfo->board_type);
154 @@ -2112,12 +2120,16 @@ void netxen_nic_set_link_parameters(stru
155 {
156 __u32 status;
157 __u32 autoneg;
158 - __u32 mode;
159 __u32 port_mode;
160
161 - netxen_nic_read_w0(adapter, NETXEN_NIU_MODE, &mode);
162 - if (netxen_get_niu_enable_ge(mode)) { /* Gb 10/100/1000 Mbps mode */
163 + if (!netif_carrier_ok(adapter->netdev)) {
164 + adapter->link_speed = 0;
165 + adapter->link_duplex = -1;
166 + adapter->link_autoneg = AUTONEG_ENABLE;
167 + return;
168 + }
169
170 + if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
171 adapter->hw_read_wx(adapter,
172 NETXEN_PORT_MODE_ADDR, &port_mode, 4);
173 if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
174 @@ -2143,7 +2155,7 @@ void netxen_nic_set_link_parameters(stru
175 adapter->link_speed = SPEED_1000;
176 break;
177 default:
178 - adapter->link_speed = -1;
179 + adapter->link_speed = 0;
180 break;
181 }
182 switch (netxen_get_phy_duplex(status)) {
183 @@ -2166,7 +2178,7 @@ void netxen_nic_set_link_parameters(stru
184 goto link_down;
185 } else {
186 link_down:
187 - adapter->link_speed = -1;
188 + adapter->link_speed = 0;
189 adapter->link_duplex = -1;
190 }
191 }
192 Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c
193 ===================================================================
194 --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_main.c
195 +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c
196 @@ -243,7 +243,7 @@ static void netxen_check_options(struct
197 case NETXEN_BRDTYPE_P3_4_GB:
198 case NETXEN_BRDTYPE_P3_4_GB_MM:
199 adapter->msix_supported = !!use_msi_x;
200 - adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
201 + adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
202 break;
203
204 case NETXEN_BRDTYPE_P2_SB35_4G:
205 @@ -252,6 +252,14 @@ static void netxen_check_options(struct
206 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
207 break;
208
209 + case NETXEN_BRDTYPE_P3_10G_TP:
210 + adapter->msix_supported = !!use_msi_x;
211 + if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
212 + adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
213 + else
214 + adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
215 + break;
216 +
217 default:
218 adapter->msix_supported = 0;
219 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
220 @@ -1385,6 +1393,8 @@ static void netxen_nic_handle_phy_intr(s
221 netif_carrier_off(netdev);
222 netif_stop_queue(netdev);
223 }
224 +
225 + netxen_nic_set_link_parameters(adapter);
226 } else if (!adapter->ahw.linkup && linkup) {
227 printk(KERN_INFO "%s: %s NIC Link is up\n",
228 netxen_nic_driver_name, netdev->name);
229 @@ -1393,6 +1403,8 @@ static void netxen_nic_handle_phy_intr(s
230 netif_carrier_on(netdev);
231 netif_wake_queue(netdev);
232 }
233 +
234 + netxen_nic_set_link_parameters(adapter);
235 }
236 }
237