]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
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 |