diff options
83 files changed, 898 insertions, 1045 deletions
diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index 02e56d447a8f..c485ee028bd9 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX | |||
@@ -84,9 +84,6 @@ policy-routing.txt | |||
84 | - IP policy-based routing | 84 | - IP policy-based routing |
85 | ray_cs.txt | 85 | ray_cs.txt |
86 | - Raylink Wireless LAN card driver info. | 86 | - Raylink Wireless LAN card driver info. |
87 | sk98lin.txt | ||
88 | - Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit | ||
89 | Ethernet Adapter family driver info | ||
90 | skfp.txt | 87 | skfp.txt |
91 | - SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info. | 88 | - SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info. |
92 | smc9.txt | 89 | smc9.txt |
diff --git a/Documentation/networking/sk98lin.txt b/Documentation/networking/sk98lin.txt deleted file mode 100644 index 8590a954df1d..000000000000 --- a/Documentation/networking/sk98lin.txt +++ /dev/null | |||
@@ -1,568 +0,0 @@ | |||
1 | (C)Copyright 1999-2004 Marvell(R). | ||
2 | All rights reserved | ||
3 | =========================================================================== | ||
4 | |||
5 | sk98lin.txt created 13-Feb-2004 | ||
6 | |||
7 | Readme File for sk98lin v6.23 | ||
8 | Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX | ||
9 | |||
10 | This file contains | ||
11 | 1 Overview | ||
12 | 2 Required Files | ||
13 | 3 Installation | ||
14 | 3.1 Driver Installation | ||
15 | 3.2 Inclusion of adapter at system start | ||
16 | 4 Driver Parameters | ||
17 | 4.1 Per-Port Parameters | ||
18 | 4.2 Adapter Parameters | ||
19 | 5 Large Frame Support | ||
20 | 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) | ||
21 | 7 Troubleshooting | ||
22 | |||
23 | =========================================================================== | ||
24 | |||
25 | |||
26 | 1 Overview | ||
27 | =========== | ||
28 | |||
29 | The sk98lin driver supports the Marvell Yukon and SysKonnect | ||
30 | SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has | ||
31 | been tested with Linux on Intel/x86 machines. | ||
32 | *** | ||
33 | |||
34 | |||
35 | 2 Required Files | ||
36 | ================= | ||
37 | |||
38 | The linux kernel source. | ||
39 | No additional files required. | ||
40 | *** | ||
41 | |||
42 | |||
43 | 3 Installation | ||
44 | =============== | ||
45 | |||
46 | It is recommended to download the latest version of the driver from the | ||
47 | SysKonnect web site www.syskonnect.com. If you have downloaded the latest | ||
48 | driver, the Linux kernel has to be patched before the driver can be | ||
49 | installed. For details on how to patch a Linux kernel, refer to the | ||
50 | patch.txt file. | ||
51 | |||
52 | 3.1 Driver Installation | ||
53 | ------------------------ | ||
54 | |||
55 | The following steps describe the actions that are required to install | ||
56 | the driver and to start it manually. These steps should be carried | ||
57 | out for the initial driver setup. Once confirmed to be ok, they can | ||
58 | be included in the system start. | ||
59 | |||
60 | NOTE 1: To perform the following tasks you need 'root' access. | ||
61 | |||
62 | NOTE 2: In case of problems, please read the section "Troubleshooting" | ||
63 | below. | ||
64 | |||
65 | The driver can either be integrated into the kernel or it can be compiled | ||
66 | as a module. Select the appropriate option during the kernel | ||
67 | configuration. | ||
68 | |||
69 | Compile/use the driver as a module | ||
70 | ---------------------------------- | ||
71 | To compile the driver, go to the directory /usr/src/linux and | ||
72 | execute the command "make menuconfig" or "make xconfig" and proceed as | ||
73 | follows: | ||
74 | |||
75 | To integrate the driver permanently into the kernel, proceed as follows: | ||
76 | |||
77 | 1. Select the menu "Network device support" and then "Ethernet(1000Mbit)" | ||
78 | 2. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" | ||
79 | with (*) | ||
80 | 3. Build a new kernel when the configuration of the above options is | ||
81 | finished. | ||
82 | 4. Install the new kernel. | ||
83 | 5. Reboot your system. | ||
84 | |||
85 | To use the driver as a module, proceed as follows: | ||
86 | |||
87 | 1. Enable 'loadable module support' in the kernel. | ||
88 | 2. For automatic driver start, enable the 'Kernel module loader'. | ||
89 | 3. Select the menu "Network device support" and then "Ethernet(1000Mbit)" | ||
90 | 4. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" | ||
91 | with (M) | ||
92 | 5. Execute the command "make modules". | ||
93 | 6. Execute the command "make modules_install". | ||
94 | The appropriate modules will be installed. | ||
95 | 7. Reboot your system. | ||
96 | |||
97 | |||
98 | Load the module manually | ||
99 | ------------------------ | ||
100 | To load the module manually, proceed as follows: | ||
101 | |||
102 | 1. Enter "modprobe sk98lin". | ||
103 | 2. If a Marvell Yukon or SysKonnect SK-98xx adapter is installed in | ||
104 | your computer and you have a /proc file system, execute the command: | ||
105 | "ls /proc/net/sk98lin/" | ||
106 | This should produce an output containing a line with the following | ||
107 | format: | ||
108 | eth0 eth1 ... | ||
109 | which indicates that your adapter has been found and initialized. | ||
110 | |||
111 | NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx | ||
112 | adapter installed, the adapters will be listed as 'eth0', | ||
113 | 'eth1', 'eth2', etc. | ||
114 | For each adapter, repeat steps 3 and 4 below. | ||
115 | |||
116 | NOTE 2: If you have other Ethernet adapters installed, your Marvell | ||
117 | Yukon or SysKonnect SK-98xx adapter will be mapped to the | ||
118 | next available number, e.g. 'eth1'. The mapping is executed | ||
119 | automatically. | ||
120 | The module installation message (displayed either in a system | ||
121 | log file or on the console) prints a line for each adapter | ||
122 | found containing the corresponding 'ethX'. | ||
123 | |||
124 | 3. Select an IP address and assign it to the respective adapter by | ||
125 | entering: | ||
126 | ifconfig eth0 <ip-address> | ||
127 | With this command, the adapter is connected to the Ethernet. | ||
128 | |||
129 | SK-98xx Gigabit Ethernet Server Adapters: The yellow LED on the adapter | ||
130 | is now active, the link status LED of the primary port is active and | ||
131 | the link status LED of the secondary port (on dual port adapters) is | ||
132 | blinking (if the ports are connected to a switch or hub). | ||
133 | SK-98xx V2.0 Gigabit Ethernet Adapters: The link status LED is active. | ||
134 | In addition, you will receive a status message on the console stating | ||
135 | "ethX: network connection up using port Y" and showing the selected | ||
136 | connection parameters (x stands for the ethernet device number | ||
137 | (0,1,2, etc), y stands for the port name (A or B)). | ||
138 | |||
139 | NOTE: If you are in doubt about IP addresses, ask your network | ||
140 | administrator for assistance. | ||
141 | |||
142 | 4. Your adapter should now be fully operational. | ||
143 | Use 'ping <otherstation>' to verify the connection to other computers | ||
144 | on your network. | ||
145 | 5. To check the adapter configuration view /proc/net/sk98lin/[devicename]. | ||
146 | For example by executing: | ||
147 | "cat /proc/net/sk98lin/eth0" | ||
148 | |||
149 | Unload the module | ||
150 | ----------------- | ||
151 | To stop and unload the driver modules, proceed as follows: | ||
152 | |||
153 | 1. Execute the command "ifconfig eth0 down". | ||
154 | 2. Execute the command "rmmod sk98lin". | ||
155 | |||
156 | 3.2 Inclusion of adapter at system start | ||
157 | ----------------------------------------- | ||
158 | |||
159 | Since a large number of different Linux distributions are | ||
160 | available, we are unable to describe a general installation procedure | ||
161 | for the driver module. | ||
162 | Because the driver is now integrated in the kernel, installation should | ||
163 | be easy, using the standard mechanism of your distribution. | ||
164 | Refer to the distribution's manual for installation of ethernet adapters. | ||
165 | |||
166 | *** | ||
167 | |||
168 | 4 Driver Parameters | ||
169 | ==================== | ||
170 | |||
171 | Parameters can be set at the command line after the module has been | ||
172 | loaded with the command 'modprobe'. | ||
173 | In some distributions, the configuration tools are able to pass parameters | ||
174 | to the driver module. | ||
175 | |||
176 | If you use the kernel module loader, you can set driver parameters | ||
177 | in the file /etc/modprobe.conf (or /etc/modules.conf in 2.4 or earlier). | ||
178 | To set the driver parameters in this file, proceed as follows: | ||
179 | |||
180 | 1. Insert a line of the form : | ||
181 | options sk98lin ... | ||
182 | For "...", the same syntax is required as described for the command | ||
183 | line parameters of modprobe below. | ||
184 | 2. To activate the new parameters, either reboot your computer | ||
185 | or | ||
186 | unload and reload the driver. | ||
187 | The syntax of the driver parameters is: | ||
188 | |||
189 | modprobe sk98lin parameter=value1[,value2[,value3...]] | ||
190 | |||
191 | where value1 refers to the first adapter, value2 to the second etc. | ||
192 | |||
193 | NOTE: All parameters are case sensitive. Write them exactly as shown | ||
194 | below. | ||
195 | |||
196 | Example: | ||
197 | Suppose you have two adapters. You want to set auto-negotiation | ||
198 | on the first adapter to ON and on the second adapter to OFF. | ||
199 | You also want to set DuplexCapabilities on the first adapter | ||
200 | to FULL, and on the second adapter to HALF. | ||
201 | Then, you must enter: | ||
202 | |||
203 | modprobe sk98lin AutoNeg_A=On,Off DupCap_A=Full,Half | ||
204 | |||
205 | NOTE: The number of adapters that can be configured this way is | ||
206 | limited in the driver (file skge.c, constant SK_MAX_CARD_PARAM). | ||
207 | The current limit is 16. If you happen to install | ||
208 | more adapters, adjust this and recompile. | ||
209 | |||
210 | |||
211 | 4.1 Per-Port Parameters | ||
212 | ------------------------ | ||
213 | |||
214 | These settings are available for each port on the adapter. | ||
215 | In the following description, '?' stands for the port for | ||
216 | which you set the parameter (A or B). | ||
217 | |||
218 | Speed | ||
219 | ----- | ||
220 | Parameter: Speed_? | ||
221 | Values: 10, 100, 1000, Auto | ||
222 | Default: Auto | ||
223 | |||
224 | This parameter is used to set the speed capabilities. It is only valid | ||
225 | for the SK-98xx V2.0 copper adapters. | ||
226 | Usually, the speed is negotiated between the two ports during link | ||
227 | establishment. If this fails, a port can be forced to a specific setting | ||
228 | with this parameter. | ||
229 | |||
230 | Auto-Negotiation | ||
231 | ---------------- | ||
232 | Parameter: AutoNeg_? | ||
233 | Values: On, Off, Sense | ||
234 | Default: On | ||
235 | |||
236 | The "Sense"-mode automatically detects whether the link partner supports | ||
237 | auto-negotiation or not. | ||
238 | |||
239 | Duplex Capabilities | ||
240 | ------------------- | ||
241 | Parameter: DupCap_? | ||
242 | Values: Half, Full, Both | ||
243 | Default: Both | ||
244 | |||
245 | This parameters is only relevant if auto-negotiation for this port is | ||
246 | not set to "Sense". If auto-negotiation is set to "On", all three values | ||
247 | are possible. If it is set to "Off", only "Full" and "Half" are allowed. | ||
248 | This parameter is useful if your link partner does not support all | ||
249 | possible combinations. | ||
250 | |||
251 | Flow Control | ||
252 | ------------ | ||
253 | Parameter: FlowCtrl_? | ||
254 | Values: Sym, SymOrRem, LocSend, None | ||
255 | Default: SymOrRem | ||
256 | |||
257 | This parameter can be used to set the flow control capabilities the | ||
258 | port reports during auto-negotiation. It can be set for each port | ||
259 | individually. | ||
260 | Possible modes: | ||
261 | -- Sym = Symmetric: both link partners are allowed to send | ||
262 | PAUSE frames | ||
263 | -- SymOrRem = SymmetricOrRemote: both or only remote partner | ||
264 | are allowed to send PAUSE frames | ||
265 | -- LocSend = LocalSend: only local link partner is allowed | ||
266 | to send PAUSE frames | ||
267 | -- None = no link partner is allowed to send PAUSE frames | ||
268 | |||
269 | NOTE: This parameter is ignored if auto-negotiation is set to "Off". | ||
270 | |||
271 | Role in Master-Slave-Negotiation (1000Base-T only) | ||
272 | -------------------------------------------------- | ||
273 | Parameter: Role_? | ||
274 | Values: Auto, Master, Slave | ||
275 | Default: Auto | ||
276 | |||
277 | This parameter is only valid for the SK-9821 and SK-9822 adapters. | ||
278 | For two 1000Base-T ports to communicate, one must take the role of the | ||
279 | master (providing timing information), while the other must be the | ||
280 | slave. Usually, this is negotiated between the two ports during link | ||
281 | establishment. If this fails, a port can be forced to a specific setting | ||
282 | with this parameter. | ||
283 | |||
284 | |||
285 | 4.2 Adapter Parameters | ||
286 | ----------------------- | ||
287 | |||
288 | Connection Type (SK-98xx V2.0 copper adapters only) | ||
289 | --------------- | ||
290 | Parameter: ConType | ||
291 | Values: Auto, 100FD, 100HD, 10FD, 10HD | ||
292 | Default: Auto | ||
293 | |||
294 | The parameter 'ConType' is a combination of all five per-port parameters | ||
295 | within one single parameter. This simplifies the configuration of both ports | ||
296 | of an adapter card! The different values of this variable reflect the most | ||
297 | meaningful combinations of port parameters. | ||
298 | |||
299 | The following table shows the values of 'ConType' and the corresponding | ||
300 | combinations of the per-port parameters: | ||
301 | |||
302 | ConType | DupCap AutoNeg FlowCtrl Role Speed | ||
303 | ----------+------------------------------------------------------ | ||
304 | Auto | Both On SymOrRem Auto Auto | ||
305 | 100FD | Full Off None Auto (ignored) 100 | ||
306 | 100HD | Half Off None Auto (ignored) 100 | ||
307 | 10FD | Full Off None Auto (ignored) 10 | ||
308 | 10HD | Half Off None Auto (ignored) 10 | ||
309 | |||
310 | Stating any other port parameter together with this 'ConType' variable | ||
311 | will result in a merged configuration of those settings. This due to | ||
312 | the fact, that the per-port parameters (e.g. Speed_? ) have a higher | ||
313 | priority than the combined variable 'ConType'. | ||
314 | |||
315 | NOTE: This parameter is always used on both ports of the adapter card. | ||
316 | |||
317 | Interrupt Moderation | ||
318 | -------------------- | ||
319 | Parameter: Moderation | ||
320 | Values: None, Static, Dynamic | ||
321 | Default: None | ||
322 | |||
323 | Interrupt moderation is employed to limit the maximum number of interrupts | ||
324 | the driver has to serve. That is, one or more interrupts (which indicate any | ||
325 | transmit or receive packet to be processed) are queued until the driver | ||
326 | processes them. When queued interrupts are to be served, is determined by the | ||
327 | 'IntsPerSec' parameter, which is explained later below. | ||
328 | |||
329 | Possible modes: | ||
330 | |||
331 | -- None - No interrupt moderation is applied on the adapter card. | ||
332 | Therefore, each transmit or receive interrupt is served immediately | ||
333 | as soon as it appears on the interrupt line of the adapter card. | ||
334 | |||
335 | -- Static - Interrupt moderation is applied on the adapter card. | ||
336 | All transmit and receive interrupts are queued until a complete | ||
337 | moderation interval ends. If such a moderation interval ends, all | ||
338 | queued interrupts are processed in one big bunch without any delay. | ||
339 | The term 'static' reflects the fact, that interrupt moderation is | ||
340 | always enabled, regardless how much network load is currently | ||
341 | passing via a particular interface. In addition, the duration of | ||
342 | the moderation interval has a fixed length that never changes while | ||
343 | the driver is operational. | ||
344 | |||
345 | -- Dynamic - Interrupt moderation might be applied on the adapter card, | ||
346 | depending on the load of the system. If the driver detects that the | ||
347 | system load is too high, the driver tries to shield the system against | ||
348 | too much network load by enabling interrupt moderation. If - at a later | ||
349 | time - the CPU utilization decreases again (or if the network load is | ||
350 | negligible) the interrupt moderation will automatically be disabled. | ||
351 | |||
352 | Interrupt moderation should be used when the driver has to handle one or more | ||
353 | interfaces with a high network load, which - as a consequence - leads also to a | ||
354 | high CPU utilization. When moderation is applied in such high network load | ||
355 | situations, CPU load might be reduced by 20-30%. | ||
356 | |||
357 | NOTE: The drawback of using interrupt moderation is an increase of the round- | ||
358 | trip-time (RTT), due to the queueing and serving of interrupts at dedicated | ||
359 | moderation times. | ||
360 | |||
361 | Interrupts per second | ||
362 | --------------------- | ||
363 | Parameter: IntsPerSec | ||
364 | Values: 30...40000 (interrupts per second) | ||
365 | Default: 2000 | ||
366 | |||
367 | This parameter is only used if either static or dynamic interrupt moderation | ||
368 | is used on a network adapter card. Using this parameter if no moderation is | ||
369 | applied will lead to no action performed. | ||
370 | |||
371 | This parameter determines the length of any interrupt moderation interval. | ||
372 | Assuming that static interrupt moderation is to be used, an 'IntsPerSec' | ||
373 | parameter value of 2000 will lead to an interrupt moderation interval of | ||
374 | 500 microseconds. | ||
375 | |||
376 | NOTE: The duration of the moderation interval is to be chosen with care. | ||
377 | At first glance, selecting a very long duration (e.g. only 100 interrupts per | ||
378 | second) seems to be meaningful, but the increase of packet-processing delay | ||
379 | is tremendous. On the other hand, selecting a very short moderation time might | ||
380 | compensate the use of any moderation being applied. | ||
381 | |||
382 | |||
383 | Preferred Port | ||
384 | -------------- | ||
385 | Parameter: PrefPort | ||
386 | Values: A, B | ||
387 | Default: A | ||
388 | |||
389 | This is used to force the preferred port to A or B (on dual-port network | ||
390 | adapters). The preferred port is the one that is used if both are detected | ||
391 | as fully functional. | ||
392 | |||
393 | RLMT Mode (Redundant Link Management Technology) | ||
394 | ------------------------------------------------ | ||
395 | Parameter: RlmtMode | ||
396 | Values: CheckLinkState,CheckLocalPort, CheckSeg, DualNet | ||
397 | Default: CheckLinkState | ||
398 | |||
399 | RLMT monitors the status of the port. If the link of the active port | ||
400 | fails, RLMT switches immediately to the standby link. The virtual link is | ||
401 | maintained as long as at least one 'physical' link is up. | ||
402 | |||
403 | Possible modes: | ||
404 | |||
405 | -- CheckLinkState - Check link state only: RLMT uses the link state | ||
406 | reported by the adapter hardware for each individual port to | ||
407 | determine whether a port can be used for all network traffic or | ||
408 | not. | ||
409 | |||
410 | -- CheckLocalPort - In this mode, RLMT monitors the network path | ||
411 | between the two ports of an adapter by regularly exchanging packets | ||
412 | between them. This mode requires a network configuration in which | ||
413 | the two ports are able to "see" each other (i.e. there must not be | ||
414 | any router between the ports). | ||
415 | |||
416 | -- CheckSeg - Check local port and segmentation: This mode supports the | ||
417 | same functions as the CheckLocalPort mode and additionally checks | ||
418 | network segmentation between the ports. Therefore, this mode is only | ||
419 | to be used if Gigabit Ethernet switches are installed on the network | ||
420 | that have been configured to use the Spanning Tree protocol. | ||
421 | |||
422 | -- DualNet - In this mode, ports A and B are used as separate devices. | ||
423 | If you have a dual port adapter, port A will be configured as eth0 | ||
424 | and port B as eth1. Both ports can be used independently with | ||
425 | distinct IP addresses. The preferred port setting is not used. | ||
426 | RLMT is turned off. | ||
427 | |||
428 | NOTE: RLMT modes CLP and CLPSS are designed to operate in configurations | ||
429 | where a network path between the ports on one adapter exists. | ||
430 | Moreover, they are not designed to work where adapters are connected | ||
431 | back-to-back. | ||
432 | *** | ||
433 | |||
434 | |||
435 | 5 Large Frame Support | ||
436 | ====================== | ||
437 | |||
438 | The driver supports large frames (also called jumbo frames). Using large | ||
439 | frames can result in an improved throughput if transferring large amounts | ||
440 | of data. | ||
441 | To enable large frames, set the MTU (maximum transfer unit) of the | ||
442 | interface to the desired value (up to 9000), execute the following | ||
443 | command: | ||
444 | ifconfig eth0 mtu 9000 | ||
445 | This will only work if you have two adapters connected back-to-back | ||
446 | or if you use a switch that supports large frames. When using a switch, | ||
447 | it should be configured to allow large frames and auto-negotiation should | ||
448 | be set to OFF. The setting must be configured on all adapters that can be | ||
449 | reached by the large frames. If one adapter is not set to receive large | ||
450 | frames, it will simply drop them. | ||
451 | |||
452 | You can switch back to the standard ethernet frame size by executing the | ||
453 | following command: | ||
454 | ifconfig eth0 mtu 1500 | ||
455 | |||
456 | To permanently configure this setting, add a script with the 'ifconfig' | ||
457 | line to the system startup sequence (named something like "S99sk98lin" | ||
458 | in /etc/rc.d/rc2.d). | ||
459 | *** | ||
460 | |||
461 | |||
462 | 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) | ||
463 | ================================================================== | ||
464 | |||
465 | The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and | ||
466 | Link Aggregation according to IEEE standards 802.1, 802.1q, and 802.3ad. | ||
467 | These features are only available after installation of open source | ||
468 | modules available on the Internet: | ||
469 | For VLAN go to: http://www.candelatech.com/~greear/vlan.html | ||
470 | For Link Aggregation go to: http://www.st.rim.or.jp/~yumo | ||
471 | |||
472 | NOTE: SysKonnect GmbH does not offer any support for these open source | ||
473 | modules and does not take the responsibility for any kind of | ||
474 | failures or problems arising in connection with these modules. | ||
475 | |||
476 | NOTE: Configuring Link Aggregation on a SysKonnect dual link adapter may | ||
477 | cause problems when unloading the driver. | ||
478 | |||
479 | |||
480 | 7 Troubleshooting | ||
481 | ================== | ||
482 | |||
483 | If any problems occur during the installation process, check the | ||
484 | following list: | ||
485 | |||
486 | |||
487 | Problem: The SK-98xx adapter cannot be found by the driver. | ||
488 | Solution: In /proc/pci search for the following entry: | ||
489 | 'Ethernet controller: SysKonnect SK-98xx ...' | ||
490 | If this entry exists, the SK-98xx or SK-98xx V2.0 adapter has | ||
491 | been found by the system and should be operational. | ||
492 | If this entry does not exist or if the file '/proc/pci' is not | ||
493 | found, there may be a hardware problem or the PCI support may | ||
494 | not be enabled in your kernel. | ||
495 | The adapter can be checked using the diagnostics program which | ||
496 | is available on the SysKonnect web site: | ||
497 | www.syskonnect.com | ||
498 | |||
499 | Some COMPAQ machines have problems dealing with PCI under Linux. | ||
500 | This problem is described in the 'PCI howto' document | ||
501 | (included in some distributions or available from the | ||
502 | web, e.g. at 'www.linux.org'). | ||
503 | |||
504 | |||
505 | Problem: Programs such as 'ifconfig' or 'route' cannot be found or the | ||
506 | error message 'Operation not permitted' is displayed. | ||
507 | Reason: You are not logged in as user 'root'. | ||
508 | Solution: Logout and login as 'root' or change to 'root' via 'su'. | ||
509 | |||
510 | |||
511 | Problem: Upon use of the command 'ping <address>' the message | ||
512 | "ping: sendto: Network is unreachable" is displayed. | ||
513 | Reason: Your route is not set correctly. | ||
514 | Solution: If you are using RedHat, you probably forgot to set up the | ||
515 | route in the 'network configuration'. | ||
516 | Check the existing routes with the 'route' command and check | ||
517 | if an entry for 'eth0' exists, and if so, if it is set correctly. | ||
518 | |||
519 | |||
520 | Problem: The driver can be started, the adapter is connected to the | ||
521 | network, but you cannot receive or transmit any packets; | ||
522 | e.g. 'ping' does not work. | ||
523 | Reason: There is an incorrect route in your routing table. | ||
524 | Solution: Check the routing table with the command 'route' and read the | ||
525 | manual help pages dealing with routes (enter 'man route'). | ||
526 | |||
527 | NOTE: Although the 2.2.x kernel versions generate the routing entry | ||
528 | automatically, problems of this kind may occur here as well. We've | ||
529 | come across a situation in which the driver started correctly at | ||
530 | system start, but after the driver has been removed and reloaded, | ||
531 | the route of the adapter's network pointed to the 'dummy0'device | ||
532 | and had to be corrected manually. | ||
533 | |||
534 | |||
535 | Problem: Your computer should act as a router between multiple | ||
536 | IP subnetworks (using multiple adapters), but computers in | ||
537 | other subnetworks cannot be reached. | ||
538 | Reason: Either the router's kernel is not configured for IP forwarding | ||
539 | or the routing table and gateway configuration of at least one | ||
540 | computer is not working. | ||
541 | |||
542 | Problem: Upon driver start, the following error message is displayed: | ||
543 | "eth0: -- ERROR -- | ||
544 | Class: internal Software error | ||
545 | Nr: 0xcc | ||
546 | Msg: SkGeInitPort() cannot init running ports" | ||
547 | Reason: You are using a driver compiled for single processor machines | ||
548 | on a multiprocessor machine with SMP (Symmetric MultiProcessor) | ||
549 | kernel. | ||
550 | Solution: Configure your kernel appropriately and recompile the kernel or | ||
551 | the modules. | ||
552 | |||
553 | |||
554 | |||
555 | If your problem is not listed here, please contact SysKonnect's technical | ||
556 | support for help (linux@syskonnect.de). | ||
557 | When contacting our technical support, please ensure that the following | ||
558 | information is available: | ||
559 | - System Manufacturer and HW Informations (CPU, Memory... ) | ||
560 | - PCI-Boards in your system | ||
561 | - Distribution | ||
562 | - Kernel version | ||
563 | - Driver version | ||
564 | *** | ||
565 | |||
566 | |||
567 | |||
568 | ***End of Readme File*** | ||
diff --git a/arch/sparc64/kernel/iommu.c b/arch/sparc64/kernel/iommu.c index b781d3d54fb8..756fa24eeefa 100644 --- a/arch/sparc64/kernel/iommu.c +++ b/arch/sparc64/kernel/iommu.c | |||
@@ -516,9 +516,11 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, | |||
516 | unsigned long flags, handle, prot, ctx; | 516 | unsigned long flags, handle, prot, ctx; |
517 | dma_addr_t dma_next = 0, dma_addr; | 517 | dma_addr_t dma_next = 0, dma_addr; |
518 | unsigned int max_seg_size; | 518 | unsigned int max_seg_size; |
519 | unsigned long seg_boundary_size; | ||
519 | int outcount, incount, i; | 520 | int outcount, incount, i; |
520 | struct strbuf *strbuf; | 521 | struct strbuf *strbuf; |
521 | struct iommu *iommu; | 522 | struct iommu *iommu; |
523 | unsigned long base_shift; | ||
522 | 524 | ||
523 | BUG_ON(direction == DMA_NONE); | 525 | BUG_ON(direction == DMA_NONE); |
524 | 526 | ||
@@ -549,8 +551,11 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, | |||
549 | outs->dma_length = 0; | 551 | outs->dma_length = 0; |
550 | 552 | ||
551 | max_seg_size = dma_get_max_seg_size(dev); | 553 | max_seg_size = dma_get_max_seg_size(dev); |
554 | seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, | ||
555 | IO_PAGE_SIZE) >> IO_PAGE_SHIFT; | ||
556 | base_shift = iommu->page_table_map_base >> IO_PAGE_SHIFT; | ||
552 | for_each_sg(sglist, s, nelems, i) { | 557 | for_each_sg(sglist, s, nelems, i) { |
553 | unsigned long paddr, npages, entry, slen; | 558 | unsigned long paddr, npages, entry, out_entry = 0, slen; |
554 | iopte_t *base; | 559 | iopte_t *base; |
555 | 560 | ||
556 | slen = s->length; | 561 | slen = s->length; |
@@ -593,7 +598,9 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, | |||
593 | * - allocated dma_addr isn't contiguous to previous allocation | 598 | * - allocated dma_addr isn't contiguous to previous allocation |
594 | */ | 599 | */ |
595 | if ((dma_addr != dma_next) || | 600 | if ((dma_addr != dma_next) || |
596 | (outs->dma_length + s->length > max_seg_size)) { | 601 | (outs->dma_length + s->length > max_seg_size) || |
602 | (is_span_boundary(out_entry, base_shift, | ||
603 | seg_boundary_size, outs, s))) { | ||
597 | /* Can't merge: create a new segment */ | 604 | /* Can't merge: create a new segment */ |
598 | segstart = s; | 605 | segstart = s; |
599 | outcount++; | 606 | outcount++; |
@@ -607,6 +614,7 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, | |||
607 | /* This is a new segment, fill entries */ | 614 | /* This is a new segment, fill entries */ |
608 | outs->dma_address = dma_addr; | 615 | outs->dma_address = dma_addr; |
609 | outs->dma_length = slen; | 616 | outs->dma_length = slen; |
617 | out_entry = entry; | ||
610 | } | 618 | } |
611 | 619 | ||
612 | /* Calculate next page pointer for contiguous check */ | 620 | /* Calculate next page pointer for contiguous check */ |
diff --git a/arch/sparc64/kernel/iommu_common.h b/arch/sparc64/kernel/iommu_common.h index 0713bd58499c..f3575a614fa2 100644 --- a/arch/sparc64/kernel/iommu_common.h +++ b/arch/sparc64/kernel/iommu_common.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/scatterlist.h> | 13 | #include <linux/scatterlist.h> |
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <linux/iommu-helper.h> | ||
15 | 16 | ||
16 | #include <asm/iommu.h> | 17 | #include <asm/iommu.h> |
17 | #include <asm/scatterlist.h> | 18 | #include <asm/scatterlist.h> |
@@ -45,17 +46,16 @@ static inline unsigned long iommu_num_pages(unsigned long vaddr, | |||
45 | return npages; | 46 | return npages; |
46 | } | 47 | } |
47 | 48 | ||
48 | static inline unsigned long calc_npages(struct scatterlist *sglist, int nelems) | 49 | static inline int is_span_boundary(unsigned long entry, |
50 | unsigned long shift, | ||
51 | unsigned long boundary_size, | ||
52 | struct scatterlist *outs, | ||
53 | struct scatterlist *sg) | ||
49 | { | 54 | { |
50 | unsigned long i, npages = 0; | 55 | unsigned long paddr = SG_ENT_PHYS_ADDRESS(outs); |
51 | struct scatterlist *sg; | 56 | int nr = iommu_num_pages(paddr, outs->dma_length + sg->length); |
52 | 57 | ||
53 | for_each_sg(sglist, sg, nelems, i) { | 58 | return iommu_is_span_boundary(entry, nr, shift, boundary_size); |
54 | unsigned long paddr = SG_ENT_PHYS_ADDRESS(sg); | ||
55 | npages += iommu_num_pages(paddr, sg->length); | ||
56 | } | ||
57 | |||
58 | return npages; | ||
59 | } | 59 | } |
60 | 60 | ||
61 | extern unsigned long iommu_range_alloc(struct device *dev, | 61 | extern unsigned long iommu_range_alloc(struct device *dev, |
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c index ddca6c6c0b49..01839706bd52 100644 --- a/arch/sparc64/kernel/pci_sun4v.c +++ b/arch/sparc64/kernel/pci_sun4v.c | |||
@@ -335,8 +335,10 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, | |||
335 | unsigned long flags, handle, prot; | 335 | unsigned long flags, handle, prot; |
336 | dma_addr_t dma_next = 0, dma_addr; | 336 | dma_addr_t dma_next = 0, dma_addr; |
337 | unsigned int max_seg_size; | 337 | unsigned int max_seg_size; |
338 | unsigned long seg_boundary_size; | ||
338 | int outcount, incount, i; | 339 | int outcount, incount, i; |
339 | struct iommu *iommu; | 340 | struct iommu *iommu; |
341 | unsigned long base_shift; | ||
340 | long err; | 342 | long err; |
341 | 343 | ||
342 | BUG_ON(direction == DMA_NONE); | 344 | BUG_ON(direction == DMA_NONE); |
@@ -362,8 +364,11 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, | |||
362 | iommu_batch_start(dev, prot, ~0UL); | 364 | iommu_batch_start(dev, prot, ~0UL); |
363 | 365 | ||
364 | max_seg_size = dma_get_max_seg_size(dev); | 366 | max_seg_size = dma_get_max_seg_size(dev); |
367 | seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, | ||
368 | IO_PAGE_SIZE) >> IO_PAGE_SHIFT; | ||
369 | base_shift = iommu->page_table_map_base >> IO_PAGE_SHIFT; | ||
365 | for_each_sg(sglist, s, nelems, i) { | 370 | for_each_sg(sglist, s, nelems, i) { |
366 | unsigned long paddr, npages, entry, slen; | 371 | unsigned long paddr, npages, entry, out_entry = 0, slen; |
367 | 372 | ||
368 | slen = s->length; | 373 | slen = s->length; |
369 | /* Sanity check */ | 374 | /* Sanity check */ |
@@ -406,7 +411,9 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, | |||
406 | * - allocated dma_addr isn't contiguous to previous allocation | 411 | * - allocated dma_addr isn't contiguous to previous allocation |
407 | */ | 412 | */ |
408 | if ((dma_addr != dma_next) || | 413 | if ((dma_addr != dma_next) || |
409 | (outs->dma_length + s->length > max_seg_size)) { | 414 | (outs->dma_length + s->length > max_seg_size) || |
415 | (is_span_boundary(out_entry, base_shift, | ||
416 | seg_boundary_size, outs, s))) { | ||
410 | /* Can't merge: create a new segment */ | 417 | /* Can't merge: create a new segment */ |
411 | segstart = s; | 418 | segstart = s; |
412 | outcount++; | 419 | outcount++; |
@@ -420,6 +427,7 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, | |||
420 | /* This is a new segment, fill entries */ | 427 | /* This is a new segment, fill entries */ |
421 | outs->dma_address = dma_addr; | 428 | outs->dma_address = dma_addr; |
422 | outs->dma_length = slen; | 429 | outs->dma_length = slen; |
430 | out_entry = entry; | ||
423 | } | 431 | } |
424 | 432 | ||
425 | /* Calculate next page pointer for contiguous check */ | 433 | /* Calculate next page pointer for contiguous check */ |
diff --git a/arch/sparc64/mm/tlb.c b/arch/sparc64/mm/tlb.c index a0f000b293de..ae24919cba7c 100644 --- a/arch/sparc64/mm/tlb.c +++ b/arch/sparc64/mm/tlb.c | |||
@@ -23,11 +23,8 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers) = { 0, }; | |||
23 | 23 | ||
24 | void flush_tlb_pending(void) | 24 | void flush_tlb_pending(void) |
25 | { | 25 | { |
26 | struct mmu_gather *mp; | 26 | struct mmu_gather *mp = &get_cpu_var(mmu_gathers); |
27 | 27 | ||
28 | preempt_disable(); | ||
29 | |||
30 | mp = &__get_cpu_var(mmu_gathers); | ||
31 | if (mp->tlb_nr) { | 28 | if (mp->tlb_nr) { |
32 | flush_tsb_user(mp); | 29 | flush_tsb_user(mp); |
33 | 30 | ||
@@ -43,7 +40,7 @@ void flush_tlb_pending(void) | |||
43 | mp->tlb_nr = 0; | 40 | mp->tlb_nr = 0; |
44 | } | 41 | } |
45 | 42 | ||
46 | preempt_enable(); | 43 | put_cpu_var(mmu_gathers); |
47 | } | 44 | } |
48 | 45 | ||
49 | void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig) | 46 | void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig) |
diff --git a/block/blk-settings.c b/block/blk-settings.c index 1344a0ea5cc6..5713f7e5cbd2 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c | |||
@@ -140,7 +140,7 @@ void blk_queue_bounce_limit(struct request_queue *q, u64 dma_addr) | |||
140 | /* Assume anything <= 4GB can be handled by IOMMU. | 140 | /* Assume anything <= 4GB can be handled by IOMMU. |
141 | Actually some IOMMUs can handle everything, but I don't | 141 | Actually some IOMMUs can handle everything, but I don't |
142 | know of a way to test this here. */ | 142 | know of a way to test this here. */ |
143 | if (b_pfn <= (min_t(u64, 0xffffffff, BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) | 143 | if (b_pfn < (min_t(u64, 0x100000000UL, BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) |
144 | dma = 1; | 144 | dma = 1; |
145 | q->bounce_pfn = max_low_pfn; | 145 | q->bounce_pfn = max_low_pfn; |
146 | #else | 146 | #else |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 0f962ecae91f..f26da2bfcc15 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1143,24 +1143,37 @@ static void cfq_put_queue(struct cfq_queue *cfqq) | |||
1143 | } | 1143 | } |
1144 | 1144 | ||
1145 | /* | 1145 | /* |
1146 | * Call func for each cic attached to this ioc. Returns number of cic's seen. | 1146 | * Call func for each cic attached to this ioc. |
1147 | */ | 1147 | */ |
1148 | static unsigned int | 1148 | static void |
1149 | call_for_each_cic(struct io_context *ioc, | 1149 | call_for_each_cic(struct io_context *ioc, |
1150 | void (*func)(struct io_context *, struct cfq_io_context *)) | 1150 | void (*func)(struct io_context *, struct cfq_io_context *)) |
1151 | { | 1151 | { |
1152 | struct cfq_io_context *cic; | 1152 | struct cfq_io_context *cic; |
1153 | struct hlist_node *n; | 1153 | struct hlist_node *n; |
1154 | int called = 0; | ||
1155 | 1154 | ||
1156 | rcu_read_lock(); | 1155 | rcu_read_lock(); |
1157 | hlist_for_each_entry_rcu(cic, n, &ioc->cic_list, cic_list) { | 1156 | hlist_for_each_entry_rcu(cic, n, &ioc->cic_list, cic_list) |
1158 | func(ioc, cic); | 1157 | func(ioc, cic); |
1159 | called++; | ||
1160 | } | ||
1161 | rcu_read_unlock(); | 1158 | rcu_read_unlock(); |
1159 | } | ||
1160 | |||
1161 | static void cfq_cic_free_rcu(struct rcu_head *head) | ||
1162 | { | ||
1163 | struct cfq_io_context *cic; | ||
1164 | |||
1165 | cic = container_of(head, struct cfq_io_context, rcu_head); | ||
1166 | |||
1167 | kmem_cache_free(cfq_ioc_pool, cic); | ||
1168 | elv_ioc_count_dec(ioc_count); | ||
1169 | |||
1170 | if (ioc_gone && !elv_ioc_count_read(ioc_count)) | ||
1171 | complete(ioc_gone); | ||
1172 | } | ||
1162 | 1173 | ||
1163 | return called; | 1174 | static void cfq_cic_free(struct cfq_io_context *cic) |
1175 | { | ||
1176 | call_rcu(&cic->rcu_head, cfq_cic_free_rcu); | ||
1164 | } | 1177 | } |
1165 | 1178 | ||
1166 | static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic) | 1179 | static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic) |
@@ -1174,24 +1187,18 @@ static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic) | |||
1174 | hlist_del_rcu(&cic->cic_list); | 1187 | hlist_del_rcu(&cic->cic_list); |
1175 | spin_unlock_irqrestore(&ioc->lock, flags); | 1188 | spin_unlock_irqrestore(&ioc->lock, flags); |
1176 | 1189 | ||
1177 | kmem_cache_free(cfq_ioc_pool, cic); | 1190 | cfq_cic_free(cic); |
1178 | } | 1191 | } |
1179 | 1192 | ||
1180 | static void cfq_free_io_context(struct io_context *ioc) | 1193 | static void cfq_free_io_context(struct io_context *ioc) |
1181 | { | 1194 | { |
1182 | int freed; | ||
1183 | |||
1184 | /* | 1195 | /* |
1185 | * ioc->refcount is zero here, so no more cic's are allowed to be | 1196 | * ioc->refcount is zero here, or we are called from elv_unregister(), |
1186 | * linked into this ioc. So it should be ok to iterate over the known | 1197 | * so no more cic's are allowed to be linked into this ioc. So it |
1187 | * list, we will see all cic's since no new ones are added. | 1198 | * should be ok to iterate over the known list, we will see all cic's |
1199 | * since no new ones are added. | ||
1188 | */ | 1200 | */ |
1189 | freed = call_for_each_cic(ioc, cic_free_func); | 1201 | call_for_each_cic(ioc, cic_free_func); |
1190 | |||
1191 | elv_ioc_count_mod(ioc_count, -freed); | ||
1192 | |||
1193 | if (ioc_gone && !elv_ioc_count_read(ioc_count)) | ||
1194 | complete(ioc_gone); | ||
1195 | } | 1202 | } |
1196 | 1203 | ||
1197 | static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq) | 1204 | static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq) |
@@ -1458,15 +1465,6 @@ cfq_get_queue(struct cfq_data *cfqd, int is_sync, struct io_context *ioc, | |||
1458 | return cfqq; | 1465 | return cfqq; |
1459 | } | 1466 | } |
1460 | 1467 | ||
1461 | static void cfq_cic_free(struct cfq_io_context *cic) | ||
1462 | { | ||
1463 | kmem_cache_free(cfq_ioc_pool, cic); | ||
1464 | elv_ioc_count_dec(ioc_count); | ||
1465 | |||
1466 | if (ioc_gone && !elv_ioc_count_read(ioc_count)) | ||
1467 | complete(ioc_gone); | ||
1468 | } | ||
1469 | |||
1470 | /* | 1468 | /* |
1471 | * We drop cfq io contexts lazily, so we may find a dead one. | 1469 | * We drop cfq io contexts lazily, so we may find a dead one. |
1472 | */ | 1470 | */ |
@@ -2138,7 +2136,7 @@ static int __init cfq_slab_setup(void) | |||
2138 | if (!cfq_pool) | 2136 | if (!cfq_pool) |
2139 | goto fail; | 2137 | goto fail; |
2140 | 2138 | ||
2141 | cfq_ioc_pool = KMEM_CACHE(cfq_io_context, SLAB_DESTROY_BY_RCU); | 2139 | cfq_ioc_pool = KMEM_CACHE(cfq_io_context, 0); |
2142 | if (!cfq_ioc_pool) | 2140 | if (!cfq_ioc_pool) |
2143 | goto fail; | 2141 | goto fail; |
2144 | 2142 | ||
@@ -2286,7 +2284,6 @@ static void __exit cfq_exit(void) | |||
2286 | smp_wmb(); | 2284 | smp_wmb(); |
2287 | if (elv_ioc_count_read(ioc_count)) | 2285 | if (elv_ioc_count_read(ioc_count)) |
2288 | wait_for_completion(ioc_gone); | 2286 | wait_for_completion(ioc_gone); |
2289 | synchronize_rcu(); | ||
2290 | cfq_slab_kill(); | 2287 | cfq_slab_kill(); |
2291 | } | 2288 | } |
2292 | 2289 | ||
diff --git a/crypto/xcbc.c b/crypto/xcbc.c index 2feb0f239c38..b63b633e549c 100644 --- a/crypto/xcbc.c +++ b/crypto/xcbc.c | |||
@@ -116,13 +116,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, | |||
116 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | 116 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); |
117 | struct crypto_cipher *tfm = ctx->child; | 117 | struct crypto_cipher *tfm = ctx->child; |
118 | int bs = crypto_hash_blocksize(parent); | 118 | int bs = crypto_hash_blocksize(parent); |
119 | unsigned int i = 0; | ||
120 | 119 | ||
121 | do { | 120 | for (;;) { |
122 | 121 | struct page *pg = sg_page(sg); | |
123 | struct page *pg = sg_page(&sg[i]); | 122 | unsigned int offset = sg->offset; |
124 | unsigned int offset = sg[i].offset; | 123 | unsigned int slen = sg->length; |
125 | unsigned int slen = sg[i].length; | ||
126 | 124 | ||
127 | if (unlikely(slen > nbytes)) | 125 | if (unlikely(slen > nbytes)) |
128 | slen = nbytes; | 126 | slen = nbytes; |
@@ -182,8 +180,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, | |||
182 | offset = 0; | 180 | offset = 0; |
183 | pg++; | 181 | pg++; |
184 | } | 182 | } |
185 | i++; | 183 | |
186 | } while (nbytes>0); | 184 | if (!nbytes) |
185 | break; | ||
186 | sg = scatterwalk_sg_next(sg); | ||
187 | } | ||
187 | 188 | ||
188 | return 0; | 189 | return 0; |
189 | } | 190 | } |
diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 47c57a4294b7..98099f526d82 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c | |||
@@ -978,6 +978,7 @@ static int fs_open(struct atm_vcc *atm_vcc) | |||
978 | /* Docs are vague about this atm_hdr field. By the way, the FS | 978 | /* Docs are vague about this atm_hdr field. By the way, the FS |
979 | * chip makes odd errors if lower bits are set.... -- REW */ | 979 | * chip makes odd errors if lower bits are set.... -- REW */ |
980 | tc->atm_hdr = (vpi << 20) | (vci << 4); | 980 | tc->atm_hdr = (vpi << 20) | (vci << 4); |
981 | tmc0 = 0; | ||
981 | { | 982 | { |
982 | int pcr = atm_pcr_goal (txtp); | 983 | int pcr = atm_pcr_goal (txtp); |
983 | 984 | ||
diff --git a/drivers/atm/he.c b/drivers/atm/he.c index 2e3395b7e8c1..ffc4a5a41946 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c | |||
@@ -3000,8 +3000,7 @@ he_proc_read(struct atm_dev *dev, loff_t *pos, char *page) | |||
3000 | 3000 | ||
3001 | /* eeprom routines -- see 4.7 */ | 3001 | /* eeprom routines -- see 4.7 */ |
3002 | 3002 | ||
3003 | u8 | 3003 | static u8 read_prom_byte(struct he_dev *he_dev, int addr) |
3004 | read_prom_byte(struct he_dev *he_dev, int addr) | ||
3005 | { | 3004 | { |
3006 | u32 val = 0, tmp_read = 0; | 3005 | u32 val = 0, tmp_read = 0; |
3007 | int i, j = 0; | 3006 | int i, j = 0; |
diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c index b967919fb7e2..28d77b5195de 100644 --- a/drivers/atm/idt77252.c +++ b/drivers/atm/idt77252.c | |||
@@ -2016,8 +2016,7 @@ idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam) | |||
2016 | return 0; | 2016 | return 0; |
2017 | } | 2017 | } |
2018 | 2018 | ||
2019 | int | 2019 | static int idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb) |
2020 | idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb) | ||
2021 | { | 2020 | { |
2022 | return idt77252_send_skb(vcc, skb, 0); | 2021 | return idt77252_send_skb(vcc, skb, 0); |
2023 | } | 2022 | } |
@@ -3072,8 +3071,7 @@ idt77252_dev_open(struct idt77252_dev *card) | |||
3072 | return 0; | 3071 | return 0; |
3073 | } | 3072 | } |
3074 | 3073 | ||
3075 | void | 3074 | static void idt77252_dev_close(struct atm_dev *dev) |
3076 | idt77252_dev_close(struct atm_dev *dev) | ||
3077 | { | 3075 | { |
3078 | struct idt77252_dev *card = dev->dev_data; | 3076 | struct idt77252_dev *card = dev->dev_data; |
3079 | u32 conf; | 3077 | u32 conf; |
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index ef52452640e0..670c093ed25f 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
@@ -958,6 +958,7 @@ static void ia_suni_pm7345_init (IADEV *iadev) | |||
958 | 958 | ||
959 | /***************************** IA_LIB END *****************************/ | 959 | /***************************** IA_LIB END *****************************/ |
960 | 960 | ||
961 | #ifdef CONFIG_ATM_IA_DEBUG | ||
961 | static int tcnter = 0; | 962 | static int tcnter = 0; |
962 | static void xdump( u_char* cp, int length, char* prefix ) | 963 | static void xdump( u_char* cp, int length, char* prefix ) |
963 | { | 964 | { |
@@ -992,6 +993,7 @@ static void xdump( u_char* cp, int length, char* prefix ) | |||
992 | } | 993 | } |
993 | 994 | ||
994 | } /* close xdump(... */ | 995 | } /* close xdump(... */ |
996 | #endif /* CONFIG_ATM_IA_DEBUG */ | ||
995 | 997 | ||
996 | 998 | ||
997 | static struct atm_dev *ia_boards = NULL; | 999 | static struct atm_dev *ia_boards = NULL; |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index fe7b5ec09708..3a0b20afec7b 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2635,7 +2635,7 @@ config NIU | |||
2635 | 2635 | ||
2636 | config PASEMI_MAC | 2636 | config PASEMI_MAC |
2637 | tristate "PA Semi 1/10Gbit MAC" | 2637 | tristate "PA Semi 1/10Gbit MAC" |
2638 | depends on PPC64 && PCI | 2638 | depends on PPC_PASEMI && PCI |
2639 | select PHYLIB | 2639 | select PHYLIB |
2640 | select INET_LRO | 2640 | select INET_LRO |
2641 | help | 2641 | help |
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index c993a32b3f50..26b2dd5016cd 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
@@ -575,7 +575,6 @@ adjust_head: | |||
575 | static int bf537mac_hard_start_xmit(struct sk_buff *skb, | 575 | static int bf537mac_hard_start_xmit(struct sk_buff *skb, |
576 | struct net_device *dev) | 576 | struct net_device *dev) |
577 | { | 577 | { |
578 | struct bf537mac_local *lp = netdev_priv(dev); | ||
579 | unsigned int data; | 578 | unsigned int data; |
580 | 579 | ||
581 | current_tx_ptr->skb = skb; | 580 | current_tx_ptr->skb = skb; |
@@ -634,7 +633,6 @@ out: | |||
634 | static void bf537mac_rx(struct net_device *dev) | 633 | static void bf537mac_rx(struct net_device *dev) |
635 | { | 634 | { |
636 | struct sk_buff *skb, *new_skb; | 635 | struct sk_buff *skb, *new_skb; |
637 | struct bf537mac_local *lp = netdev_priv(dev); | ||
638 | unsigned short len; | 636 | unsigned short len; |
639 | 637 | ||
640 | /* allocate a new skb for next time receive */ | 638 | /* allocate a new skb for next time receive */ |
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 90a1f31e8e63..979c2d05ff9c 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -341,6 +341,7 @@ static ssize_t bonding_store_slaves(struct device *d, | |||
341 | 341 | ||
342 | if (command[0] == '-') { | 342 | if (command[0] == '-') { |
343 | dev = NULL; | 343 | dev = NULL; |
344 | original_mtu = 0; | ||
344 | bond_for_each_slave(bond, slave, i) | 345 | bond_for_each_slave(bond, slave, i) |
345 | if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { | 346 | if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) { |
346 | dev = slave->dev; | 347 | dev = slave->dev; |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 6f7e3fde9e7c..980c2c229a71 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -1854,6 +1854,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1854 | struct ring_desc* start_tx; | 1854 | struct ring_desc* start_tx; |
1855 | struct ring_desc* prev_tx; | 1855 | struct ring_desc* prev_tx; |
1856 | struct nv_skb_map* prev_tx_ctx; | 1856 | struct nv_skb_map* prev_tx_ctx; |
1857 | unsigned long flags; | ||
1857 | 1858 | ||
1858 | /* add fragments to entries count */ | 1859 | /* add fragments to entries count */ |
1859 | for (i = 0; i < fragments; i++) { | 1860 | for (i = 0; i < fragments; i++) { |
@@ -1863,10 +1864,10 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1863 | 1864 | ||
1864 | empty_slots = nv_get_empty_tx_slots(np); | 1865 | empty_slots = nv_get_empty_tx_slots(np); |
1865 | if (unlikely(empty_slots <= entries)) { | 1866 | if (unlikely(empty_slots <= entries)) { |
1866 | spin_lock_irq(&np->lock); | 1867 | spin_lock_irqsave(&np->lock, flags); |
1867 | netif_stop_queue(dev); | 1868 | netif_stop_queue(dev); |
1868 | np->tx_stop = 1; | 1869 | np->tx_stop = 1; |
1869 | spin_unlock_irq(&np->lock); | 1870 | spin_unlock_irqrestore(&np->lock, flags); |
1870 | return NETDEV_TX_BUSY; | 1871 | return NETDEV_TX_BUSY; |
1871 | } | 1872 | } |
1872 | 1873 | ||
@@ -1929,13 +1930,13 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1929 | tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ? | 1930 | tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ? |
1930 | NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0; | 1931 | NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0; |
1931 | 1932 | ||
1932 | spin_lock_irq(&np->lock); | 1933 | spin_lock_irqsave(&np->lock, flags); |
1933 | 1934 | ||
1934 | /* set tx flags */ | 1935 | /* set tx flags */ |
1935 | start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra); | 1936 | start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra); |
1936 | np->put_tx.orig = put_tx; | 1937 | np->put_tx.orig = put_tx; |
1937 | 1938 | ||
1938 | spin_unlock_irq(&np->lock); | 1939 | spin_unlock_irqrestore(&np->lock, flags); |
1939 | 1940 | ||
1940 | dprintk(KERN_DEBUG "%s: nv_start_xmit: entries %d queued for transmission. tx_flags_extra: %x\n", | 1941 | dprintk(KERN_DEBUG "%s: nv_start_xmit: entries %d queued for transmission. tx_flags_extra: %x\n", |
1941 | dev->name, entries, tx_flags_extra); | 1942 | dev->name, entries, tx_flags_extra); |
@@ -1971,6 +1972,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
1971 | struct ring_desc_ex* prev_tx; | 1972 | struct ring_desc_ex* prev_tx; |
1972 | struct nv_skb_map* prev_tx_ctx; | 1973 | struct nv_skb_map* prev_tx_ctx; |
1973 | struct nv_skb_map* start_tx_ctx; | 1974 | struct nv_skb_map* start_tx_ctx; |
1975 | unsigned long flags; | ||
1974 | 1976 | ||
1975 | /* add fragments to entries count */ | 1977 | /* add fragments to entries count */ |
1976 | for (i = 0; i < fragments; i++) { | 1978 | for (i = 0; i < fragments; i++) { |
@@ -1980,10 +1982,10 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
1980 | 1982 | ||
1981 | empty_slots = nv_get_empty_tx_slots(np); | 1983 | empty_slots = nv_get_empty_tx_slots(np); |
1982 | if (unlikely(empty_slots <= entries)) { | 1984 | if (unlikely(empty_slots <= entries)) { |
1983 | spin_lock_irq(&np->lock); | 1985 | spin_lock_irqsave(&np->lock, flags); |
1984 | netif_stop_queue(dev); | 1986 | netif_stop_queue(dev); |
1985 | np->tx_stop = 1; | 1987 | np->tx_stop = 1; |
1986 | spin_unlock_irq(&np->lock); | 1988 | spin_unlock_irqrestore(&np->lock, flags); |
1987 | return NETDEV_TX_BUSY; | 1989 | return NETDEV_TX_BUSY; |
1988 | } | 1990 | } |
1989 | 1991 | ||
@@ -2059,7 +2061,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
2059 | start_tx->txvlan = 0; | 2061 | start_tx->txvlan = 0; |
2060 | } | 2062 | } |
2061 | 2063 | ||
2062 | spin_lock_irq(&np->lock); | 2064 | spin_lock_irqsave(&np->lock, flags); |
2063 | 2065 | ||
2064 | if (np->tx_limit) { | 2066 | if (np->tx_limit) { |
2065 | /* Limit the number of outstanding tx. Setup all fragments, but | 2067 | /* Limit the number of outstanding tx. Setup all fragments, but |
@@ -2085,7 +2087,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
2085 | start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra); | 2087 | start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra); |
2086 | np->put_tx.ex = put_tx; | 2088 | np->put_tx.ex = put_tx; |
2087 | 2089 | ||
2088 | spin_unlock_irq(&np->lock); | 2090 | spin_unlock_irqrestore(&np->lock, flags); |
2089 | 2091 | ||
2090 | dprintk(KERN_DEBUG "%s: nv_start_xmit_optimized: entries %d queued for transmission. tx_flags_extra: %x\n", | 2092 | dprintk(KERN_DEBUG "%s: nv_start_xmit_optimized: entries %d queued for transmission. tx_flags_extra: %x\n", |
2091 | dev->name, entries, tx_flags_extra); | 2093 | dev->name, entries, tx_flags_extra); |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 0789802d59ed..378a23963495 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
@@ -1242,8 +1242,8 @@ static int emac_close(struct net_device *ndev) | |||
1242 | static inline u16 emac_tx_csum(struct emac_instance *dev, | 1242 | static inline u16 emac_tx_csum(struct emac_instance *dev, |
1243 | struct sk_buff *skb) | 1243 | struct sk_buff *skb) |
1244 | { | 1244 | { |
1245 | if (emac_has_feature(dev, EMAC_FTR_HAS_TAH && | 1245 | if (emac_has_feature(dev, EMAC_FTR_HAS_TAH) && |
1246 | skb->ip_summed == CHECKSUM_PARTIAL)) { | 1246 | (skb->ip_summed == CHECKSUM_PARTIAL)) { |
1247 | ++dev->stats.tx_packets_csum; | 1247 | ++dev->stats.tx_packets_csum; |
1248 | return EMAC_TX_CTRL_TAH_CSUM; | 1248 | return EMAC_TX_CTRL_TAH_CSUM; |
1249 | } | 1249 | } |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 3c915b82e199..c082cf0b1ac6 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -84,7 +84,7 @@ | |||
84 | #include "s2io.h" | 84 | #include "s2io.h" |
85 | #include "s2io-regs.h" | 85 | #include "s2io-regs.h" |
86 | 86 | ||
87 | #define DRV_VERSION "2.0.26.15-2" | 87 | #define DRV_VERSION "2.0.26.20" |
88 | 88 | ||
89 | /* S2io Driver name & version. */ | 89 | /* S2io Driver name & version. */ |
90 | static char s2io_driver_name[] = "Neterion"; | 90 | static char s2io_driver_name[] = "Neterion"; |
diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c index 206918bad539..da2206f6021d 100644 --- a/drivers/net/tulip/eeprom.c +++ b/drivers/net/tulip/eeprom.c | |||
@@ -343,6 +343,12 @@ int __devinit tulip_read_eeprom(struct net_device *dev, int location, int addr_l | |||
343 | void __iomem *ee_addr = tp->base_addr + CSR9; | 343 | void __iomem *ee_addr = tp->base_addr + CSR9; |
344 | int read_cmd = location | (EE_READ_CMD << addr_len); | 344 | int read_cmd = location | (EE_READ_CMD << addr_len); |
345 | 345 | ||
346 | /* If location is past the end of what we can address, don't | ||
347 | * read some other location (ie truncate). Just return zero. | ||
348 | */ | ||
349 | if (location > (1 << addr_len) - 1) | ||
350 | return 0; | ||
351 | |||
346 | iowrite32(EE_ENB & ~EE_CS, ee_addr); | 352 | iowrite32(EE_ENB & ~EE_CS, ee_addr); |
347 | iowrite32(EE_ENB, ee_addr); | 353 | iowrite32(EE_ENB, ee_addr); |
348 | 354 | ||
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index ed600bf56e78..82f404b76d81 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
@@ -1437,6 +1437,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, | |||
1437 | EEPROM. | 1437 | EEPROM. |
1438 | */ | 1438 | */ |
1439 | ee_data = tp->eeprom; | 1439 | ee_data = tp->eeprom; |
1440 | memset(ee_data, 0, sizeof(tp->eeprom)); | ||
1440 | sum = 0; | 1441 | sum = 0; |
1441 | if (chip_idx == LC82C168) { | 1442 | if (chip_idx == LC82C168) { |
1442 | for (i = 0; i < 3; i++) { | 1443 | for (i = 0; i < 3; i++) { |
@@ -1458,8 +1459,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, | |||
1458 | /* A serial EEPROM interface, we read now and sort it out later. */ | 1459 | /* A serial EEPROM interface, we read now and sort it out later. */ |
1459 | int sa_offset = 0; | 1460 | int sa_offset = 0; |
1460 | int ee_addr_size = tulip_read_eeprom(dev, 0xff, 8) & 0x40000 ? 8 : 6; | 1461 | int ee_addr_size = tulip_read_eeprom(dev, 0xff, 8) & 0x40000 ? 8 : 6; |
1462 | int ee_max_addr = ((1 << ee_addr_size) - 1) * sizeof(u16); | ||
1461 | 1463 | ||
1462 | for (i = 0; i < sizeof(tp->eeprom); i+=2) { | 1464 | if (ee_max_addr > sizeof(tp->eeprom)) |
1465 | ee_max_addr = sizeof(tp->eeprom); | ||
1466 | |||
1467 | for (i = 0; i < ee_max_addr ; i += sizeof(u16)) { | ||
1463 | u16 data = tulip_read_eeprom(dev, i/2, ee_addr_size); | 1468 | u16 data = tulip_read_eeprom(dev, i/2, ee_addr_size); |
1464 | ee_data[i] = data & 0xff; | 1469 | ee_data[i] = data & 0xff; |
1465 | ee_data[i + 1] = data >> 8; | 1470 | ee_data[i + 1] = data >> 8; |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index a12c9c41b217..0604f3faf043 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -129,7 +129,7 @@ config USB_USBNET | |||
129 | 129 | ||
130 | config USB_NET_AX8817X | 130 | config USB_NET_AX8817X |
131 | tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters" | 131 | tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters" |
132 | depends on USB_USBNET && NET_ETHERNET | 132 | depends on USB_USBNET |
133 | select CRC32 | 133 | select CRC32 |
134 | default y | 134 | default y |
135 | help | 135 | help |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 0343b00cf1fd..01660f68943a 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -354,7 +354,7 @@ static void dm9601_set_multicast(struct net_device *net) | |||
354 | struct dev_mc_list *mc_list = net->mc_list; | 354 | struct dev_mc_list *mc_list = net->mc_list; |
355 | int i; | 355 | int i; |
356 | 356 | ||
357 | for (i = 0; i < net->mc_count; i++) { | 357 | for (i = 0; i < net->mc_count; i++, mc_list = mc_list->next) { |
358 | u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26; | 358 | u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26; |
359 | hashes[crc >> 3] |= 1 << (crc & 0x7); | 359 | hashes[crc >> 3] |= 1 << (crc & 0x7); |
360 | } | 360 | } |
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index d1ed68a11e70..b588c890ea70 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
@@ -1128,12 +1128,8 @@ pegasus_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
1128 | { | 1128 | { |
1129 | pegasus_t *pegasus; | 1129 | pegasus_t *pegasus; |
1130 | 1130 | ||
1131 | if (in_atomic()) | ||
1132 | return 0; | ||
1133 | |||
1134 | pegasus = netdev_priv(dev); | 1131 | pegasus = netdev_priv(dev); |
1135 | mii_ethtool_gset(&pegasus->mii, ecmd); | 1132 | mii_ethtool_gset(&pegasus->mii, ecmd); |
1136 | |||
1137 | return 0; | 1133 | return 0; |
1138 | } | 1134 | } |
1139 | 1135 | ||
diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c index fb37b8095231..824df3b5ea49 100644 --- a/drivers/net/wan/lapbether.c +++ b/drivers/net/wan/lapbether.c | |||
@@ -58,7 +58,7 @@ struct lapbethdev { | |||
58 | struct net_device_stats stats; /* some statistics */ | 58 | struct net_device_stats stats; /* some statistics */ |
59 | }; | 59 | }; |
60 | 60 | ||
61 | static struct list_head lapbeth_devices = LIST_HEAD_INIT(lapbeth_devices); | 61 | static LIST_HEAD(lapbeth_devices); |
62 | 62 | ||
63 | /* ------------------------------------------------------------------------ */ | 63 | /* ------------------------------------------------------------------------ */ |
64 | 64 | ||
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index cfbc1a26f601..948eb1fe916b 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
@@ -619,6 +619,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring, | |||
619 | } | 619 | } |
620 | 620 | ||
621 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { | 621 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { |
622 | b43err(ring->dev->wl, "RX DMA buffer allocation failed\n"); | ||
622 | dev_kfree_skb_any(skb); | 623 | dev_kfree_skb_any(skb); |
623 | return -EIO; | 624 | return -EIO; |
624 | } | 625 | } |
@@ -874,8 +875,12 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
874 | DMA_TO_DEVICE); | 875 | DMA_TO_DEVICE); |
875 | 876 | ||
876 | if (b43_dma_mapping_error(ring, dma_test, | 877 | if (b43_dma_mapping_error(ring, dma_test, |
877 | b43_txhdr_size(dev), 1)) | 878 | b43_txhdr_size(dev), 1)) { |
879 | |||
880 | b43err(dev->wl, | ||
881 | "TXHDR DMA allocation failed\n"); | ||
878 | goto err_kfree_txhdr_cache; | 882 | goto err_kfree_txhdr_cache; |
883 | } | ||
879 | } | 884 | } |
880 | 885 | ||
881 | dma_unmap_single(dev->dev->dev, | 886 | dma_unmap_single(dev->dev->dev, |
diff --git a/drivers/net/wireless/b43/pcmcia.c b/drivers/net/wireless/b43/pcmcia.c index b79a6bd5396d..371e4a119511 100644 --- a/drivers/net/wireless/b43/pcmcia.c +++ b/drivers/net/wireless/b43/pcmcia.c | |||
@@ -91,6 +91,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev) | |||
91 | 91 | ||
92 | dev->conf.ConfigBase = parse.config.base; | 92 | dev->conf.ConfigBase = parse.config.base; |
93 | dev->conf.Present = parse.config.rmask[0]; | 93 | dev->conf.Present = parse.config.rmask[0]; |
94 | dev->conf.Attributes = CONF_ENABLE_IRQ; | ||
95 | dev->conf.IntType = INT_MEMORY_AND_IO; | ||
94 | 96 | ||
95 | dev->io.BasePort2 = 0; | 97 | dev->io.BasePort2 = 0; |
96 | dev->io.NumPorts2 = 0; | 98 | dev->io.NumPorts2 = 0; |
@@ -112,8 +114,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev) | |||
112 | if (res != CS_SUCCESS) | 114 | if (res != CS_SUCCESS) |
113 | goto err_disable; | 115 | goto err_disable; |
114 | 116 | ||
115 | dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FIRST_SHARED; | 117 | dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
116 | dev->irq.IRQInfo1 = IRQ_LEVEL_ID | IRQ_SHARE_ID; | 118 | dev->irq.IRQInfo1 = IRQ_LEVEL_ID; |
117 | dev->irq.Handler = NULL; /* The handler is registered later. */ | 119 | dev->irq.Handler = NULL; /* The handler is registered later. */ |
118 | dev->irq.Instance = NULL; | 120 | dev->irq.Instance = NULL; |
119 | res = pcmcia_request_irq(dev, &dev->irq); | 121 | res = pcmcia_request_irq(dev, &dev->irq); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index d727de8b96fe..65767570be68 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(struct iwl4965_priv *priv, | |||
4589 | 4589 | ||
4590 | if (sta_ht_inf) { | 4590 | if (sta_ht_inf) { |
4591 | if ((!sta_ht_inf->ht_supported) || | 4591 | if ((!sta_ht_inf->ht_supported) || |
4592 | (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)) | 4592 | (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))) |
4593 | return 0; | 4593 | return 0; |
4594 | } | 4594 | } |
4595 | 4595 | ||
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 5a9cadb97503..038c66a98f15 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
@@ -677,9 +677,7 @@ sbi_get_int_status_exit: | |||
677 | 677 | ||
678 | /* Card has a command result for us */ | 678 | /* Card has a command result for us */ |
679 | if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) { | 679 | if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) { |
680 | spin_lock(&priv->driver_lock); | ||
681 | ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len); | 680 | ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len); |
682 | spin_unlock(&priv->driver_lock); | ||
683 | if (ret < 0) | 681 | if (ret < 0) |
684 | lbs_pr_err("could not receive cmd from card\n"); | 682 | lbs_pr_err("could not receive cmd from card\n"); |
685 | } | 683 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index bd305f7f3efd..e873a39fcce3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1393,11 +1393,20 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state) | |||
1393 | 1393 | ||
1394 | exit: | 1394 | exit: |
1395 | /* | 1395 | /* |
1396 | * Set device mode to sleep for power management. | 1396 | * Set device mode to sleep for power management, |
1397 | * on some hardware this call seems to consistently fail. | ||
1398 | * From the specifications it is hard to tell why it fails, | ||
1399 | * and if this is a "bad thing". | ||
1400 | * Overall it is safe to just ignore the failure and | ||
1401 | * continue suspending. The only downside is that the | ||
1402 | * device will not be in optimal power save mode, but with | ||
1403 | * the radio and the other components already disabled the | ||
1404 | * device is as good as disabled. | ||
1397 | */ | 1405 | */ |
1398 | retval = rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_SLEEP); | 1406 | retval = rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_SLEEP); |
1399 | if (retval) | 1407 | if (retval) |
1400 | return retval; | 1408 | WARNING(rt2x00dev, "Device failed to enter sleep state, " |
1409 | "continue suspending.\n"); | ||
1401 | 1410 | ||
1402 | return 0; | 1411 | return 0; |
1403 | } | 1412 | } |
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 880c78bff0e1..ed7e0a1fc34d 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
@@ -218,18 +218,24 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev) | |||
218 | 218 | ||
219 | get_device(&shost->shost_gendev); | 219 | get_device(&shost->shost_gendev); |
220 | 220 | ||
221 | if (shost->transportt->host_size && | 221 | if (shost->transportt->host_size) { |
222 | (shost->shost_data = kzalloc(shost->transportt->host_size, | 222 | shost->shost_data = kzalloc(shost->transportt->host_size, |
223 | GFP_KERNEL)) == NULL) | 223 | GFP_KERNEL); |
224 | goto out_del_classdev; | 224 | if (shost->shost_data == NULL) { |
225 | error = -ENOMEM; | ||
226 | goto out_del_classdev; | ||
227 | } | ||
228 | } | ||
225 | 229 | ||
226 | if (shost->transportt->create_work_queue) { | 230 | if (shost->transportt->create_work_queue) { |
227 | snprintf(shost->work_q_name, KOBJ_NAME_LEN, "scsi_wq_%d", | 231 | snprintf(shost->work_q_name, KOBJ_NAME_LEN, "scsi_wq_%d", |
228 | shost->host_no); | 232 | shost->host_no); |
229 | shost->work_q = create_singlethread_workqueue( | 233 | shost->work_q = create_singlethread_workqueue( |
230 | shost->work_q_name); | 234 | shost->work_q_name); |
231 | if (!shost->work_q) | 235 | if (!shost->work_q) { |
236 | error = -EINVAL; | ||
232 | goto out_free_shost_data; | 237 | goto out_free_shost_data; |
238 | } | ||
233 | } | 239 | } |
234 | 240 | ||
235 | error = scsi_sysfs_add_host(shost); | 241 | error = scsi_sysfs_add_host(shost); |
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 31b9af224243..709a6f75ca9d 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c | |||
@@ -295,11 +295,14 @@ static void sas_discover_domain(struct work_struct *work) | |||
295 | case FANOUT_DEV: | 295 | case FANOUT_DEV: |
296 | error = sas_discover_root_expander(dev); | 296 | error = sas_discover_root_expander(dev); |
297 | break; | 297 | break; |
298 | #ifdef CONFIG_SCSI_SAS_ATA | ||
299 | case SATA_DEV: | 298 | case SATA_DEV: |
300 | case SATA_PM: | 299 | case SATA_PM: |
300 | #ifdef CONFIG_SCSI_SAS_ATA | ||
301 | error = sas_discover_sata(dev); | 301 | error = sas_discover_sata(dev); |
302 | break; | 302 | break; |
303 | #else | ||
304 | SAS_DPRINTK("ATA device seen but CONFIG_SCSI_SAS_ATA=N so cannot attach\n"); | ||
305 | /* Fall through */ | ||
303 | #endif | 306 | #endif |
304 | default: | 307 | default: |
305 | error = -ENXIO; | 308 | error = -ENXIO; |
diff --git a/drivers/scsi/mvsas.c b/drivers/scsi/mvsas.c index 5ec0665b3a3d..e55b9037adb2 100644 --- a/drivers/scsi/mvsas.c +++ b/drivers/scsi/mvsas.c | |||
@@ -37,11 +37,13 @@ | |||
37 | #include <linux/dma-mapping.h> | 37 | #include <linux/dma-mapping.h> |
38 | #include <linux/ctype.h> | 38 | #include <linux/ctype.h> |
39 | #include <scsi/libsas.h> | 39 | #include <scsi/libsas.h> |
40 | #include <scsi/scsi_tcq.h> | ||
41 | #include <scsi/sas_ata.h> | ||
40 | #include <asm/io.h> | 42 | #include <asm/io.h> |
41 | 43 | ||
42 | #define DRV_NAME "mvsas" | 44 | #define DRV_NAME "mvsas" |
43 | #define DRV_VERSION "0.5.1" | 45 | #define DRV_VERSION "0.5.2" |
44 | #define _MV_DUMP 0 | 46 | #define _MV_DUMP 0 |
45 | #define MVS_DISABLE_NVRAM | 47 | #define MVS_DISABLE_NVRAM |
46 | #define MVS_DISABLE_MSI | 48 | #define MVS_DISABLE_MSI |
47 | 49 | ||
@@ -52,7 +54,7 @@ | |||
52 | readl(regs + MVS_##reg); \ | 54 | readl(regs + MVS_##reg); \ |
53 | } while (0) | 55 | } while (0) |
54 | 56 | ||
55 | #define MVS_ID_NOT_MAPPED 0xff | 57 | #define MVS_ID_NOT_MAPPED 0x7f |
56 | #define MVS_CHIP_SLOT_SZ (1U << mvi->chip->slot_width) | 58 | #define MVS_CHIP_SLOT_SZ (1U << mvi->chip->slot_width) |
57 | 59 | ||
58 | /* offset for D2H FIS in the Received FIS List Structure */ | 60 | /* offset for D2H FIS in the Received FIS List Structure */ |
@@ -84,6 +86,7 @@ enum driver_configuration { | |||
84 | MVS_RX_FIS_COUNT = 17, /* Optional rx'd FISs (max 17) */ | 86 | MVS_RX_FIS_COUNT = 17, /* Optional rx'd FISs (max 17) */ |
85 | 87 | ||
86 | MVS_QUEUE_SIZE = 30, /* Support Queue depth */ | 88 | MVS_QUEUE_SIZE = 30, /* Support Queue depth */ |
89 | MVS_CAN_QUEUE = MVS_SLOTS - 1, /* SCSI Queue depth */ | ||
87 | }; | 90 | }; |
88 | 91 | ||
89 | /* unchangeable hardware details */ | 92 | /* unchangeable hardware details */ |
@@ -358,7 +361,20 @@ enum hw_register_bits { | |||
358 | 361 | ||
359 | /* VSR */ | 362 | /* VSR */ |
360 | /* PHYMODE 6 (CDB) */ | 363 | /* PHYMODE 6 (CDB) */ |
361 | PHY_MODE6_DTL_SPEED = (1U << 27), | 364 | PHY_MODE6_LATECLK = (1U << 29), /* Lock Clock */ |
365 | PHY_MODE6_DTL_SPEED = (1U << 27), /* Digital Loop Speed */ | ||
366 | PHY_MODE6_FC_ORDER = (1U << 26), /* Fibre Channel Mode Order*/ | ||
367 | PHY_MODE6_MUCNT_EN = (1U << 24), /* u Count Enable */ | ||
368 | PHY_MODE6_SEL_MUCNT_LEN = (1U << 22), /* Training Length Select */ | ||
369 | PHY_MODE6_SELMUPI = (1U << 20), /* Phase Multi Select (init) */ | ||
370 | PHY_MODE6_SELMUPF = (1U << 18), /* Phase Multi Select (final) */ | ||
371 | PHY_MODE6_SELMUFF = (1U << 16), /* Freq Loop Multi Sel(final) */ | ||
372 | PHY_MODE6_SELMUFI = (1U << 14), /* Freq Loop Multi Sel(init) */ | ||
373 | PHY_MODE6_FREEZE_LOOP = (1U << 12), /* Freeze Rx CDR Loop */ | ||
374 | PHY_MODE6_INT_RXFOFFS = (1U << 3), /* Rx CDR Freq Loop Enable */ | ||
375 | PHY_MODE6_FRC_RXFOFFS = (1U << 2), /* Initial Rx CDR Offset */ | ||
376 | PHY_MODE6_STAU_0D8 = (1U << 1), /* Rx CDR Freq Loop Saturate */ | ||
377 | PHY_MODE6_RXSAT_DIS = (1U << 0), /* Saturate Ctl */ | ||
362 | }; | 378 | }; |
363 | 379 | ||
364 | enum mvs_info_flags { | 380 | enum mvs_info_flags { |
@@ -511,7 +527,43 @@ enum status_buffer { | |||
511 | }; | 527 | }; |
512 | 528 | ||
513 | enum error_info_rec { | 529 | enum error_info_rec { |
514 | CMD_ISS_STPD = (1U << 31), /* Cmd Issue Stopped */ | 530 | CMD_ISS_STPD = (1U << 31), /* Cmd Issue Stopped */ |
531 | CMD_PI_ERR = (1U << 30), /* Protection info error. see flags2 */ | ||
532 | RSP_OVER = (1U << 29), /* rsp buffer overflow */ | ||
533 | RETRY_LIM = (1U << 28), /* FIS/frame retry limit exceeded */ | ||
534 | UNK_FIS = (1U << 27), /* unknown FIS */ | ||
535 | DMA_TERM = (1U << 26), /* DMA terminate primitive rx'd */ | ||
536 | SYNC_ERR = (1U << 25), /* SYNC rx'd during frame xmit */ | ||
537 | TFILE_ERR = (1U << 24), /* SATA taskfile Error bit set */ | ||
538 | R_ERR = (1U << 23), /* SATA returned R_ERR prim */ | ||
539 | RD_OFS = (1U << 20), /* Read DATA frame invalid offset */ | ||
540 | XFER_RDY_OFS = (1U << 19), /* XFER_RDY offset error */ | ||
541 | UNEXP_XFER_RDY = (1U << 18), /* unexpected XFER_RDY error */ | ||
542 | DATA_OVER_UNDER = (1U << 16), /* data overflow/underflow */ | ||
543 | INTERLOCK = (1U << 15), /* interlock error */ | ||
544 | NAK = (1U << 14), /* NAK rx'd */ | ||
545 | ACK_NAK_TO = (1U << 13), /* ACK/NAK timeout */ | ||
546 | CXN_CLOSED = (1U << 12), /* cxn closed w/out ack/nak */ | ||
547 | OPEN_TO = (1U << 11), /* I_T nexus lost, open cxn timeout */ | ||
548 | PATH_BLOCKED = (1U << 10), /* I_T nexus lost, pathway blocked */ | ||
549 | NO_DEST = (1U << 9), /* I_T nexus lost, no destination */ | ||
550 | STP_RES_BSY = (1U << 8), /* STP resources busy */ | ||
551 | BREAK = (1U << 7), /* break received */ | ||
552 | BAD_DEST = (1U << 6), /* bad destination */ | ||
553 | BAD_PROTO = (1U << 5), /* protocol not supported */ | ||
554 | BAD_RATE = (1U << 4), /* cxn rate not supported */ | ||
555 | WRONG_DEST = (1U << 3), /* wrong destination error */ | ||
556 | CREDIT_TO = (1U << 2), /* credit timeout */ | ||
557 | WDOG_TO = (1U << 1), /* watchdog timeout */ | ||
558 | BUF_PAR = (1U << 0), /* buffer parity error */ | ||
559 | }; | ||
560 | |||
561 | enum error_info_rec_2 { | ||
562 | SLOT_BSY_ERR = (1U << 31), /* Slot Busy Error */ | ||
563 | GRD_CHK_ERR = (1U << 14), /* Guard Check Error */ | ||
564 | APP_CHK_ERR = (1U << 13), /* Application Check error */ | ||
565 | REF_CHK_ERR = (1U << 12), /* Reference Check Error */ | ||
566 | USR_BLK_NM = (1U << 0), /* User Block Number */ | ||
515 | }; | 567 | }; |
516 | 568 | ||
517 | struct mvs_chip_info { | 569 | struct mvs_chip_info { |
@@ -543,28 +595,12 @@ struct mvs_cmd_hdr { | |||
543 | __le32 reserved[4]; | 595 | __le32 reserved[4]; |
544 | }; | 596 | }; |
545 | 597 | ||
546 | struct mvs_slot_info { | ||
547 | struct sas_task *task; | ||
548 | u32 n_elem; | ||
549 | u32 tx; | ||
550 | |||
551 | /* DMA buffer for storing cmd tbl, open addr frame, status buffer, | ||
552 | * and PRD table | ||
553 | */ | ||
554 | void *buf; | ||
555 | dma_addr_t buf_dma; | ||
556 | #if _MV_DUMP | ||
557 | u32 cmd_size; | ||
558 | #endif | ||
559 | |||
560 | void *response; | ||
561 | }; | ||
562 | |||
563 | struct mvs_port { | 598 | struct mvs_port { |
564 | struct asd_sas_port sas_port; | 599 | struct asd_sas_port sas_port; |
565 | u8 port_attached; | 600 | u8 port_attached; |
566 | u8 taskfileset; | 601 | u8 taskfileset; |
567 | u8 wide_port_phymap; | 602 | u8 wide_port_phymap; |
603 | struct list_head list; | ||
568 | }; | 604 | }; |
569 | 605 | ||
570 | struct mvs_phy { | 606 | struct mvs_phy { |
@@ -582,6 +618,27 @@ struct mvs_phy { | |||
582 | u32 frame_rcvd_size; | 618 | u32 frame_rcvd_size; |
583 | u8 frame_rcvd[32]; | 619 | u8 frame_rcvd[32]; |
584 | u8 phy_attached; | 620 | u8 phy_attached; |
621 | enum sas_linkrate minimum_linkrate; | ||
622 | enum sas_linkrate maximum_linkrate; | ||
623 | }; | ||
624 | |||
625 | struct mvs_slot_info { | ||
626 | struct list_head list; | ||
627 | struct sas_task *task; | ||
628 | u32 n_elem; | ||
629 | u32 tx; | ||
630 | |||
631 | /* DMA buffer for storing cmd tbl, open addr frame, status buffer, | ||
632 | * and PRD table | ||
633 | */ | ||
634 | void *buf; | ||
635 | dma_addr_t buf_dma; | ||
636 | #if _MV_DUMP | ||
637 | u32 cmd_size; | ||
638 | #endif | ||
639 | |||
640 | void *response; | ||
641 | struct mvs_port *port; | ||
585 | }; | 642 | }; |
586 | 643 | ||
587 | struct mvs_info { | 644 | struct mvs_info { |
@@ -612,21 +669,14 @@ struct mvs_info { | |||
612 | 669 | ||
613 | const struct mvs_chip_info *chip; | 670 | const struct mvs_chip_info *chip; |
614 | 671 | ||
615 | unsigned long tags[MVS_SLOTS]; | 672 | u8 tags[MVS_SLOTS]; |
616 | struct mvs_slot_info slot_info[MVS_SLOTS]; | 673 | struct mvs_slot_info slot_info[MVS_SLOTS]; |
617 | /* further per-slot information */ | 674 | /* further per-slot information */ |
618 | struct mvs_phy phy[MVS_MAX_PHYS]; | 675 | struct mvs_phy phy[MVS_MAX_PHYS]; |
619 | struct mvs_port port[MVS_MAX_PHYS]; | 676 | struct mvs_port port[MVS_MAX_PHYS]; |
620 | 677 | #ifdef MVS_USE_TASKLET | |
621 | u32 can_queue; /* per adapter */ | 678 | struct tasklet_struct tasklet; |
622 | u32 tag_out; /*Get*/ | 679 | #endif |
623 | u32 tag_in; /*Give*/ | ||
624 | }; | ||
625 | |||
626 | struct mvs_queue_task { | ||
627 | struct list_head list; | ||
628 | |||
629 | void *uldd_task; | ||
630 | }; | 680 | }; |
631 | 681 | ||
632 | static int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, | 682 | static int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, |
@@ -641,10 +691,11 @@ static u32 mvs_read_port_irq_mask(struct mvs_info *mvi, u32 port); | |||
641 | static u32 mvs_is_phy_ready(struct mvs_info *mvi, int i); | 691 | static u32 mvs_is_phy_ready(struct mvs_info *mvi, int i); |
642 | static void mvs_detect_porttype(struct mvs_info *mvi, int i); | 692 | static void mvs_detect_porttype(struct mvs_info *mvi, int i); |
643 | static void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st); | 693 | static void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st); |
694 | static void mvs_release_task(struct mvs_info *mvi, int phy_no); | ||
644 | 695 | ||
645 | static int mvs_scan_finished(struct Scsi_Host *, unsigned long); | 696 | static int mvs_scan_finished(struct Scsi_Host *, unsigned long); |
646 | static void mvs_scan_start(struct Scsi_Host *); | 697 | static void mvs_scan_start(struct Scsi_Host *); |
647 | static int mvs_sas_slave_alloc(struct scsi_device *scsi_dev); | 698 | static int mvs_slave_configure(struct scsi_device *sdev); |
648 | 699 | ||
649 | static struct scsi_transport_template *mvs_stt; | 700 | static struct scsi_transport_template *mvs_stt; |
650 | 701 | ||
@@ -659,7 +710,7 @@ static struct scsi_host_template mvs_sht = { | |||
659 | .name = DRV_NAME, | 710 | .name = DRV_NAME, |
660 | .queuecommand = sas_queuecommand, | 711 | .queuecommand = sas_queuecommand, |
661 | .target_alloc = sas_target_alloc, | 712 | .target_alloc = sas_target_alloc, |
662 | .slave_configure = sas_slave_configure, | 713 | .slave_configure = mvs_slave_configure, |
663 | .slave_destroy = sas_slave_destroy, | 714 | .slave_destroy = sas_slave_destroy, |
664 | .scan_finished = mvs_scan_finished, | 715 | .scan_finished = mvs_scan_finished, |
665 | .scan_start = mvs_scan_start, | 716 | .scan_start = mvs_scan_start, |
@@ -674,7 +725,7 @@ static struct scsi_host_template mvs_sht = { | |||
674 | .use_clustering = ENABLE_CLUSTERING, | 725 | .use_clustering = ENABLE_CLUSTERING, |
675 | .eh_device_reset_handler = sas_eh_device_reset_handler, | 726 | .eh_device_reset_handler = sas_eh_device_reset_handler, |
676 | .eh_bus_reset_handler = sas_eh_bus_reset_handler, | 727 | .eh_bus_reset_handler = sas_eh_bus_reset_handler, |
677 | .slave_alloc = mvs_sas_slave_alloc, | 728 | .slave_alloc = sas_slave_alloc, |
678 | .target_destroy = sas_target_destroy, | 729 | .target_destroy = sas_target_destroy, |
679 | .ioctl = sas_ioctl, | 730 | .ioctl = sas_ioctl, |
680 | }; | 731 | }; |
@@ -709,10 +760,10 @@ static void mvs_hexdump(u32 size, u8 *data, u32 baseaddr) | |||
709 | printk("\n"); | 760 | printk("\n"); |
710 | } | 761 | } |
711 | 762 | ||
763 | #if _MV_DUMP | ||
712 | static void mvs_hba_sb_dump(struct mvs_info *mvi, u32 tag, | 764 | static void mvs_hba_sb_dump(struct mvs_info *mvi, u32 tag, |
713 | enum sas_protocol proto) | 765 | enum sas_protocol proto) |
714 | { | 766 | { |
715 | #if _MV_DUMP | ||
716 | u32 offset; | 767 | u32 offset; |
717 | struct pci_dev *pdev = mvi->pdev; | 768 | struct pci_dev *pdev = mvi->pdev; |
718 | struct mvs_slot_info *slot = &mvi->slot_info[tag]; | 769 | struct mvs_slot_info *slot = &mvi->slot_info[tag]; |
@@ -723,14 +774,14 @@ static void mvs_hba_sb_dump(struct mvs_info *mvi, u32 tag, | |||
723 | tag); | 774 | tag); |
724 | mvs_hexdump(32, (u8 *) slot->response, | 775 | mvs_hexdump(32, (u8 *) slot->response, |
725 | (u32) slot->buf_dma + offset); | 776 | (u32) slot->buf_dma + offset); |
726 | #endif | ||
727 | } | 777 | } |
778 | #endif | ||
728 | 779 | ||
729 | static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag, | 780 | static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag, |
730 | enum sas_protocol proto) | 781 | enum sas_protocol proto) |
731 | { | 782 | { |
732 | #if _MV_DUMP | 783 | #if _MV_DUMP |
733 | u32 sz, w_ptr, r_ptr; | 784 | u32 sz, w_ptr; |
734 | u64 addr; | 785 | u64 addr; |
735 | void __iomem *regs = mvi->regs; | 786 | void __iomem *regs = mvi->regs; |
736 | struct pci_dev *pdev = mvi->pdev; | 787 | struct pci_dev *pdev = mvi->pdev; |
@@ -738,12 +789,10 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag, | |||
738 | 789 | ||
739 | /*Delivery Queue */ | 790 | /*Delivery Queue */ |
740 | sz = mr32(TX_CFG) & TX_RING_SZ_MASK; | 791 | sz = mr32(TX_CFG) & TX_RING_SZ_MASK; |
741 | w_ptr = mr32(TX_PROD_IDX) & TX_RING_SZ_MASK; | 792 | w_ptr = slot->tx; |
742 | r_ptr = mr32(TX_CONS_IDX) & TX_RING_SZ_MASK; | ||
743 | addr = mr32(TX_HI) << 16 << 16 | mr32(TX_LO); | 793 | addr = mr32(TX_HI) << 16 << 16 | mr32(TX_LO); |
744 | dev_printk(KERN_DEBUG, &pdev->dev, | 794 | dev_printk(KERN_DEBUG, &pdev->dev, |
745 | "Delivery Queue Size=%04d , WRT_PTR=%04X , RD_PTR=%04X\n", | 795 | "Delivery Queue Size=%04d , WRT_PTR=%04X\n", sz, w_ptr); |
746 | sz, w_ptr, r_ptr); | ||
747 | dev_printk(KERN_DEBUG, &pdev->dev, | 796 | dev_printk(KERN_DEBUG, &pdev->dev, |
748 | "Delivery Queue Base Address=0x%llX (PA)" | 797 | "Delivery Queue Base Address=0x%llX (PA)" |
749 | "(tx_dma=0x%llX), Entry=%04d\n", | 798 | "(tx_dma=0x%llX), Entry=%04d\n", |
@@ -751,11 +800,11 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag, | |||
751 | mvs_hexdump(sizeof(u32), (u8 *)(&mvi->tx[mvi->tx_prod]), | 800 | mvs_hexdump(sizeof(u32), (u8 *)(&mvi->tx[mvi->tx_prod]), |
752 | (u32) mvi->tx_dma + sizeof(u32) * w_ptr); | 801 | (u32) mvi->tx_dma + sizeof(u32) * w_ptr); |
753 | /*Command List */ | 802 | /*Command List */ |
754 | addr = mr32(CMD_LIST_HI) << 16 << 16 | mr32(CMD_LIST_LO); | 803 | addr = mvi->slot_dma; |
755 | dev_printk(KERN_DEBUG, &pdev->dev, | 804 | dev_printk(KERN_DEBUG, &pdev->dev, |
756 | "Command List Base Address=0x%llX (PA)" | 805 | "Command List Base Address=0x%llX (PA)" |
757 | "(slot_dma=0x%llX), Header=%03d\n", | 806 | "(slot_dma=0x%llX), Header=%03d\n", |
758 | addr, mvi->slot_dma, tag); | 807 | addr, slot->buf_dma, tag); |
759 | dev_printk(KERN_DEBUG, &pdev->dev, "Command Header[%03d]:\n", tag); | 808 | dev_printk(KERN_DEBUG, &pdev->dev, "Command Header[%03d]:\n", tag); |
760 | /*mvs_cmd_hdr */ | 809 | /*mvs_cmd_hdr */ |
761 | mvs_hexdump(sizeof(struct mvs_cmd_hdr), (u8 *)(&mvi->slot[tag]), | 810 | mvs_hexdump(sizeof(struct mvs_cmd_hdr), (u8 *)(&mvi->slot[tag]), |
@@ -779,7 +828,7 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag, | |||
779 | 828 | ||
780 | static void mvs_hba_cq_dump(struct mvs_info *mvi) | 829 | static void mvs_hba_cq_dump(struct mvs_info *mvi) |
781 | { | 830 | { |
782 | #if _MV_DUMP | 831 | #if (_MV_DUMP > 2) |
783 | u64 addr; | 832 | u64 addr; |
784 | void __iomem *regs = mvi->regs; | 833 | void __iomem *regs = mvi->regs; |
785 | struct pci_dev *pdev = mvi->pdev; | 834 | struct pci_dev *pdev = mvi->pdev; |
@@ -788,8 +837,8 @@ static void mvs_hba_cq_dump(struct mvs_info *mvi) | |||
788 | 837 | ||
789 | /*Completion Queue */ | 838 | /*Completion Queue */ |
790 | addr = mr32(RX_HI) << 16 << 16 | mr32(RX_LO); | 839 | addr = mr32(RX_HI) << 16 << 16 | mr32(RX_LO); |
791 | dev_printk(KERN_DEBUG, &pdev->dev, "Completion Task = 0x%08X\n", | 840 | dev_printk(KERN_DEBUG, &pdev->dev, "Completion Task = 0x%p\n", |
792 | (u32) mvi->slot_info[rx_desc & RXQ_SLOT_MASK].task); | 841 | mvi->slot_info[rx_desc & RXQ_SLOT_MASK].task); |
793 | dev_printk(KERN_DEBUG, &pdev->dev, | 842 | dev_printk(KERN_DEBUG, &pdev->dev, |
794 | "Completion List Base Address=0x%llX (PA), " | 843 | "Completion List Base Address=0x%llX (PA), " |
795 | "CQ_Entry=%04d, CQ_WP=0x%08X\n", | 844 | "CQ_Entry=%04d, CQ_WP=0x%08X\n", |
@@ -854,34 +903,53 @@ static int pci_go_64(struct pci_dev *pdev) | |||
854 | return rc; | 903 | return rc; |
855 | } | 904 | } |
856 | 905 | ||
906 | static int mvs_find_tag(struct mvs_info *mvi, struct sas_task *task, u32 *tag) | ||
907 | { | ||
908 | if (task->lldd_task) { | ||
909 | struct mvs_slot_info *slot; | ||
910 | slot = (struct mvs_slot_info *) task->lldd_task; | ||
911 | *tag = slot - mvi->slot_info; | ||
912 | return 1; | ||
913 | } | ||
914 | return 0; | ||
915 | } | ||
916 | |||
857 | static void mvs_tag_clear(struct mvs_info *mvi, u32 tag) | 917 | static void mvs_tag_clear(struct mvs_info *mvi, u32 tag) |
858 | { | 918 | { |
859 | mvi->tag_in = (mvi->tag_in + 1) & (MVS_SLOTS - 1); | 919 | void *bitmap = (void *) &mvi->tags; |
860 | mvi->tags[mvi->tag_in] = tag; | 920 | clear_bit(tag, bitmap); |
861 | } | 921 | } |
862 | 922 | ||
863 | static void mvs_tag_free(struct mvs_info *mvi, u32 tag) | 923 | static void mvs_tag_free(struct mvs_info *mvi, u32 tag) |
864 | { | 924 | { |
865 | mvi->tag_out = (mvi->tag_out - 1) & (MVS_SLOTS - 1); | 925 | mvs_tag_clear(mvi, tag); |
926 | } | ||
927 | |||
928 | static void mvs_tag_set(struct mvs_info *mvi, unsigned int tag) | ||
929 | { | ||
930 | void *bitmap = (void *) &mvi->tags; | ||
931 | set_bit(tag, bitmap); | ||
866 | } | 932 | } |
867 | 933 | ||
868 | static int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out) | 934 | static int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out) |
869 | { | 935 | { |
870 | if (mvi->tag_out != mvi->tag_in) { | 936 | unsigned int index, tag; |
871 | *tag_out = mvi->tags[mvi->tag_out]; | 937 | void *bitmap = (void *) &mvi->tags; |
872 | mvi->tag_out = (mvi->tag_out + 1) & (MVS_SLOTS - 1); | 938 | |
873 | return 0; | 939 | index = find_first_zero_bit(bitmap, MVS_SLOTS); |
874 | } | 940 | tag = index; |
875 | return -EBUSY; | 941 | if (tag >= MVS_SLOTS) |
942 | return -SAS_QUEUE_FULL; | ||
943 | mvs_tag_set(mvi, tag); | ||
944 | *tag_out = tag; | ||
945 | return 0; | ||
876 | } | 946 | } |
877 | 947 | ||
878 | static void mvs_tag_init(struct mvs_info *mvi) | 948 | static void mvs_tag_init(struct mvs_info *mvi) |
879 | { | 949 | { |
880 | int i; | 950 | int i; |
881 | for (i = 0; i < MVS_SLOTS; ++i) | 951 | for (i = 0; i < MVS_SLOTS; ++i) |
882 | mvi->tags[i] = i; | 952 | mvs_tag_clear(mvi, i); |
883 | mvi->tag_out = 0; | ||
884 | mvi->tag_in = MVS_SLOTS - 1; | ||
885 | } | 953 | } |
886 | 954 | ||
887 | #ifndef MVS_DISABLE_NVRAM | 955 | #ifndef MVS_DISABLE_NVRAM |
@@ -1013,10 +1081,21 @@ err_out: | |||
1013 | static void mvs_bytes_dmaed(struct mvs_info *mvi, int i) | 1081 | static void mvs_bytes_dmaed(struct mvs_info *mvi, int i) |
1014 | { | 1082 | { |
1015 | struct mvs_phy *phy = &mvi->phy[i]; | 1083 | struct mvs_phy *phy = &mvi->phy[i]; |
1084 | struct asd_sas_phy *sas_phy = mvi->sas.sas_phy[i]; | ||
1016 | 1085 | ||
1017 | if (!phy->phy_attached) | 1086 | if (!phy->phy_attached) |
1018 | return; | 1087 | return; |
1019 | 1088 | ||
1089 | if (sas_phy->phy) { | ||
1090 | struct sas_phy *sphy = sas_phy->phy; | ||
1091 | |||
1092 | sphy->negotiated_linkrate = sas_phy->linkrate; | ||
1093 | sphy->minimum_linkrate = phy->minimum_linkrate; | ||
1094 | sphy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS; | ||
1095 | sphy->maximum_linkrate = phy->maximum_linkrate; | ||
1096 | sphy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS; | ||
1097 | } | ||
1098 | |||
1020 | if (phy->phy_type & PORT_TYPE_SAS) { | 1099 | if (phy->phy_type & PORT_TYPE_SAS) { |
1021 | struct sas_identify_frame *id; | 1100 | struct sas_identify_frame *id; |
1022 | 1101 | ||
@@ -1053,80 +1132,149 @@ static void mvs_scan_start(struct Scsi_Host *shost) | |||
1053 | } | 1132 | } |
1054 | } | 1133 | } |
1055 | 1134 | ||
1056 | static int mvs_sas_slave_alloc(struct scsi_device *scsi_dev) | 1135 | static int mvs_slave_configure(struct scsi_device *sdev) |
1057 | { | 1136 | { |
1058 | int rc; | 1137 | struct domain_device *dev = sdev_to_domain_dev(sdev); |
1138 | int ret = sas_slave_configure(sdev); | ||
1059 | 1139 | ||
1060 | rc = sas_slave_alloc(scsi_dev); | 1140 | if (ret) |
1141 | return ret; | ||
1061 | 1142 | ||
1062 | return rc; | 1143 | if (dev_is_sata(dev)) { |
1144 | /* struct ata_port *ap = dev->sata_dev.ap; */ | ||
1145 | /* struct ata_device *adev = ap->link.device; */ | ||
1146 | |||
1147 | /* clamp at no NCQ for the time being */ | ||
1148 | /* adev->flags |= ATA_DFLAG_NCQ_OFF; */ | ||
1149 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, 1); | ||
1150 | } | ||
1151 | return 0; | ||
1063 | } | 1152 | } |
1064 | 1153 | ||
1065 | static void mvs_int_port(struct mvs_info *mvi, int port_no, u32 events) | 1154 | static void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events) |
1066 | { | 1155 | { |
1067 | struct pci_dev *pdev = mvi->pdev; | 1156 | struct pci_dev *pdev = mvi->pdev; |
1068 | struct sas_ha_struct *sas_ha = &mvi->sas; | 1157 | struct sas_ha_struct *sas_ha = &mvi->sas; |
1069 | struct mvs_phy *phy = &mvi->phy[port_no]; | 1158 | struct mvs_phy *phy = &mvi->phy[phy_no]; |
1070 | struct asd_sas_phy *sas_phy = &phy->sas_phy; | 1159 | struct asd_sas_phy *sas_phy = &phy->sas_phy; |
1071 | 1160 | ||
1072 | phy->irq_status = mvs_read_port_irq_stat(mvi, port_no); | 1161 | phy->irq_status = mvs_read_port_irq_stat(mvi, phy_no); |
1073 | /* | 1162 | /* |
1074 | * events is port event now , | 1163 | * events is port event now , |
1075 | * we need check the interrupt status which belongs to per port. | 1164 | * we need check the interrupt status which belongs to per port. |
1076 | */ | 1165 | */ |
1077 | dev_printk(KERN_DEBUG, &pdev->dev, | 1166 | dev_printk(KERN_DEBUG, &pdev->dev, |
1078 | "Port %d Event = %X\n", | 1167 | "Port %d Event = %X\n", |
1079 | port_no, phy->irq_status); | 1168 | phy_no, phy->irq_status); |
1080 | 1169 | ||
1081 | if (phy->irq_status & (PHYEV_POOF | PHYEV_DEC_ERR)) { | 1170 | if (phy->irq_status & (PHYEV_POOF | PHYEV_DEC_ERR)) { |
1082 | if (!mvs_is_phy_ready(mvi, port_no)) { | 1171 | mvs_release_task(mvi, phy_no); |
1172 | if (!mvs_is_phy_ready(mvi, phy_no)) { | ||
1083 | sas_phy_disconnected(sas_phy); | 1173 | sas_phy_disconnected(sas_phy); |
1084 | sas_ha->notify_phy_event(sas_phy, PHYE_LOSS_OF_SIGNAL); | 1174 | sas_ha->notify_phy_event(sas_phy, PHYE_LOSS_OF_SIGNAL); |
1175 | dev_printk(KERN_INFO, &pdev->dev, | ||
1176 | "Port %d Unplug Notice\n", phy_no); | ||
1177 | |||
1085 | } else | 1178 | } else |
1086 | mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET, NULL); | 1179 | mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET, NULL); |
1087 | } | 1180 | } |
1088 | if (!(phy->irq_status & PHYEV_DEC_ERR)) { | 1181 | if (!(phy->irq_status & PHYEV_DEC_ERR)) { |
1089 | if (phy->irq_status & PHYEV_COMWAKE) { | 1182 | if (phy->irq_status & PHYEV_COMWAKE) { |
1090 | u32 tmp = mvs_read_port_irq_mask(mvi, port_no); | 1183 | u32 tmp = mvs_read_port_irq_mask(mvi, phy_no); |
1091 | mvs_write_port_irq_mask(mvi, port_no, | 1184 | mvs_write_port_irq_mask(mvi, phy_no, |
1092 | tmp | PHYEV_SIG_FIS); | 1185 | tmp | PHYEV_SIG_FIS); |
1093 | } | 1186 | } |
1094 | if (phy->irq_status & (PHYEV_SIG_FIS | PHYEV_ID_DONE)) { | 1187 | if (phy->irq_status & (PHYEV_SIG_FIS | PHYEV_ID_DONE)) { |
1095 | phy->phy_status = mvs_is_phy_ready(mvi, port_no); | 1188 | phy->phy_status = mvs_is_phy_ready(mvi, phy_no); |
1096 | if (phy->phy_status) { | 1189 | if (phy->phy_status) { |
1097 | mvs_detect_porttype(mvi, port_no); | 1190 | mvs_detect_porttype(mvi, phy_no); |
1098 | 1191 | ||
1099 | if (phy->phy_type & PORT_TYPE_SATA) { | 1192 | if (phy->phy_type & PORT_TYPE_SATA) { |
1100 | u32 tmp = mvs_read_port_irq_mask(mvi, | 1193 | u32 tmp = mvs_read_port_irq_mask(mvi, |
1101 | port_no); | 1194 | phy_no); |
1102 | tmp &= ~PHYEV_SIG_FIS; | 1195 | tmp &= ~PHYEV_SIG_FIS; |
1103 | mvs_write_port_irq_mask(mvi, | 1196 | mvs_write_port_irq_mask(mvi, |
1104 | port_no, tmp); | 1197 | phy_no, tmp); |
1105 | } | 1198 | } |
1106 | 1199 | ||
1107 | mvs_update_phyinfo(mvi, port_no, 0); | 1200 | mvs_update_phyinfo(mvi, phy_no, 0); |
1108 | sas_ha->notify_phy_event(sas_phy, | 1201 | sas_ha->notify_phy_event(sas_phy, |
1109 | PHYE_OOB_DONE); | 1202 | PHYE_OOB_DONE); |
1110 | mvs_bytes_dmaed(mvi, port_no); | 1203 | mvs_bytes_dmaed(mvi, phy_no); |
1111 | } else { | 1204 | } else { |
1112 | dev_printk(KERN_DEBUG, &pdev->dev, | 1205 | dev_printk(KERN_DEBUG, &pdev->dev, |
1113 | "plugin interrupt but phy is gone\n"); | 1206 | "plugin interrupt but phy is gone\n"); |
1114 | mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET, | 1207 | mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET, |
1115 | NULL); | 1208 | NULL); |
1116 | } | 1209 | } |
1117 | } else if (phy->irq_status & PHYEV_BROAD_CH) | 1210 | } else if (phy->irq_status & PHYEV_BROAD_CH) { |
1211 | mvs_release_task(mvi, phy_no); | ||
1118 | sas_ha->notify_port_event(sas_phy, | 1212 | sas_ha->notify_port_event(sas_phy, |
1119 | PORTE_BROADCAST_RCVD); | 1213 | PORTE_BROADCAST_RCVD); |
1214 | } | ||
1120 | } | 1215 | } |
1121 | mvs_write_port_irq_stat(mvi, port_no, phy->irq_status); | 1216 | mvs_write_port_irq_stat(mvi, phy_no, phy->irq_status); |
1122 | } | 1217 | } |
1123 | 1218 | ||
1124 | static void mvs_int_sata(struct mvs_info *mvi) | 1219 | static void mvs_int_sata(struct mvs_info *mvi) |
1125 | { | 1220 | { |
1126 | /* FIXME */ | 1221 | u32 tmp; |
1222 | void __iomem *regs = mvi->regs; | ||
1223 | tmp = mr32(INT_STAT_SRS); | ||
1224 | mw32(INT_STAT_SRS, tmp & 0xFFFF); | ||
1225 | } | ||
1226 | |||
1227 | static void mvs_slot_reset(struct mvs_info *mvi, struct sas_task *task, | ||
1228 | u32 slot_idx) | ||
1229 | { | ||
1230 | void __iomem *regs = mvi->regs; | ||
1231 | struct domain_device *dev = task->dev; | ||
1232 | struct asd_sas_port *sas_port = dev->port; | ||
1233 | struct mvs_port *port = mvi->slot_info[slot_idx].port; | ||
1234 | u32 reg_set, phy_mask; | ||
1235 | |||
1236 | if (!sas_protocol_ata(task->task_proto)) { | ||
1237 | reg_set = 0; | ||
1238 | phy_mask = (port->wide_port_phymap) ? port->wide_port_phymap : | ||
1239 | sas_port->phy_mask; | ||
1240 | } else { | ||
1241 | reg_set = port->taskfileset; | ||
1242 | phy_mask = sas_port->phy_mask; | ||
1243 | } | ||
1244 | mvi->tx[mvi->tx_prod] = cpu_to_le32(TXQ_MODE_I | slot_idx | | ||
1245 | (TXQ_CMD_SLOT_RESET << TXQ_CMD_SHIFT) | | ||
1246 | (phy_mask << TXQ_PHY_SHIFT) | | ||
1247 | (reg_set << TXQ_SRS_SHIFT)); | ||
1248 | |||
1249 | mw32(TX_PROD_IDX, mvi->tx_prod); | ||
1250 | mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1); | ||
1251 | } | ||
1252 | |||
1253 | static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task, | ||
1254 | u32 slot_idx, int err) | ||
1255 | { | ||
1256 | struct mvs_port *port = mvi->slot_info[slot_idx].port; | ||
1257 | struct task_status_struct *tstat = &task->task_status; | ||
1258 | struct ata_task_resp *resp = (struct ata_task_resp *)tstat->buf; | ||
1259 | int stat = SAM_GOOD; | ||
1260 | |||
1261 | resp->frame_len = sizeof(struct dev_to_host_fis); | ||
1262 | memcpy(&resp->ending_fis[0], | ||
1263 | SATA_RECEIVED_D2H_FIS(port->taskfileset), | ||
1264 | sizeof(struct dev_to_host_fis)); | ||
1265 | tstat->buf_valid_size = sizeof(*resp); | ||
1266 | if (unlikely(err)) | ||
1267 | stat = SAS_PROTO_RESPONSE; | ||
1268 | return stat; | ||
1127 | } | 1269 | } |
1128 | 1270 | ||
1129 | static void mvs_slot_free(struct mvs_info *mvi, struct sas_task *task, | 1271 | static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc) |
1272 | { | ||
1273 | u32 slot_idx = rx_desc & RXQ_SLOT_MASK; | ||
1274 | mvs_tag_clear(mvi, slot_idx); | ||
1275 | } | ||
1276 | |||
1277 | static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, | ||
1130 | struct mvs_slot_info *slot, u32 slot_idx) | 1278 | struct mvs_slot_info *slot, u32 slot_idx) |
1131 | { | 1279 | { |
1132 | if (!sas_protocol_ata(task->task_proto)) | 1280 | if (!sas_protocol_ata(task->task_proto)) |
@@ -1149,38 +1297,58 @@ static void mvs_slot_free(struct mvs_info *mvi, struct sas_task *task, | |||
1149 | /* do nothing */ | 1297 | /* do nothing */ |
1150 | break; | 1298 | break; |
1151 | } | 1299 | } |
1152 | 1300 | list_del(&slot->list); | |
1301 | task->lldd_task = NULL; | ||
1153 | slot->task = NULL; | 1302 | slot->task = NULL; |
1154 | mvs_tag_clear(mvi, slot_idx); | 1303 | slot->port = NULL; |
1155 | } | 1304 | } |
1156 | 1305 | ||
1157 | static void mvs_slot_err(struct mvs_info *mvi, struct sas_task *task, | 1306 | static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task, |
1158 | u32 slot_idx) | 1307 | u32 slot_idx) |
1159 | { | 1308 | { |
1160 | struct mvs_slot_info *slot = &mvi->slot_info[slot_idx]; | 1309 | struct mvs_slot_info *slot = &mvi->slot_info[slot_idx]; |
1161 | u64 err_dw0 = *(u32 *) slot->response; | 1310 | u32 err_dw0 = le32_to_cpu(*(u32 *) (slot->response)); |
1162 | void __iomem *regs = mvi->regs; | 1311 | u32 err_dw1 = le32_to_cpu(*(u32 *) (slot->response + 4)); |
1163 | u32 tmp; | 1312 | int stat = SAM_CHECK_COND; |
1164 | 1313 | ||
1165 | if (err_dw0 & CMD_ISS_STPD) | 1314 | if (err_dw1 & SLOT_BSY_ERR) { |
1166 | if (sas_protocol_ata(task->task_proto)) { | 1315 | stat = SAS_QUEUE_FULL; |
1167 | tmp = mr32(INT_STAT_SRS); | 1316 | mvs_slot_reset(mvi, task, slot_idx); |
1168 | mw32(INT_STAT_SRS, tmp & 0xFFFF); | 1317 | } |
1169 | } | 1318 | switch (task->task_proto) { |
1319 | case SAS_PROTOCOL_SSP: | ||
1320 | break; | ||
1321 | case SAS_PROTOCOL_SMP: | ||
1322 | break; | ||
1323 | case SAS_PROTOCOL_SATA: | ||
1324 | case SAS_PROTOCOL_STP: | ||
1325 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: | ||
1326 | if (err_dw0 & TFILE_ERR) | ||
1327 | stat = mvs_sata_done(mvi, task, slot_idx, 1); | ||
1328 | break; | ||
1329 | default: | ||
1330 | break; | ||
1331 | } | ||
1170 | 1332 | ||
1171 | mvs_hba_sb_dump(mvi, slot_idx, task->task_proto); | 1333 | mvs_hexdump(16, (u8 *) slot->response, 0); |
1334 | return stat; | ||
1172 | } | 1335 | } |
1173 | 1336 | ||
1174 | static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc) | 1337 | static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags) |
1175 | { | 1338 | { |
1176 | u32 slot_idx = rx_desc & RXQ_SLOT_MASK; | 1339 | u32 slot_idx = rx_desc & RXQ_SLOT_MASK; |
1177 | struct mvs_slot_info *slot = &mvi->slot_info[slot_idx]; | 1340 | struct mvs_slot_info *slot = &mvi->slot_info[slot_idx]; |
1178 | struct sas_task *task = slot->task; | 1341 | struct sas_task *task = slot->task; |
1179 | struct task_status_struct *tstat = &task->task_status; | 1342 | struct task_status_struct *tstat; |
1180 | struct mvs_port *port = &mvi->port[task->dev->port->id]; | 1343 | struct mvs_port *port; |
1181 | bool aborted; | 1344 | bool aborted; |
1182 | void *to; | 1345 | void *to; |
1183 | 1346 | ||
1347 | if (unlikely(!task || !task->lldd_task)) | ||
1348 | return -1; | ||
1349 | |||
1350 | mvs_hba_cq_dump(mvi); | ||
1351 | |||
1184 | spin_lock(&task->task_state_lock); | 1352 | spin_lock(&task->task_state_lock); |
1185 | aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED; | 1353 | aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED; |
1186 | if (!aborted) { | 1354 | if (!aborted) { |
@@ -1190,22 +1358,27 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc) | |||
1190 | } | 1358 | } |
1191 | spin_unlock(&task->task_state_lock); | 1359 | spin_unlock(&task->task_state_lock); |
1192 | 1360 | ||
1193 | if (aborted) | 1361 | if (aborted) { |
1362 | mvs_slot_task_free(mvi, task, slot, slot_idx); | ||
1363 | mvs_slot_free(mvi, rx_desc); | ||
1194 | return -1; | 1364 | return -1; |
1365 | } | ||
1195 | 1366 | ||
1367 | port = slot->port; | ||
1368 | tstat = &task->task_status; | ||
1196 | memset(tstat, 0, sizeof(*tstat)); | 1369 | memset(tstat, 0, sizeof(*tstat)); |
1197 | tstat->resp = SAS_TASK_COMPLETE; | 1370 | tstat->resp = SAS_TASK_COMPLETE; |
1198 | 1371 | ||
1199 | 1372 | if (unlikely(!port->port_attached || flags)) { | |
1200 | if (unlikely(!port->port_attached)) { | 1373 | mvs_slot_err(mvi, task, slot_idx); |
1201 | tstat->stat = SAS_PHY_DOWN; | 1374 | if (!sas_protocol_ata(task->task_proto)) |
1375 | tstat->stat = SAS_PHY_DOWN; | ||
1202 | goto out; | 1376 | goto out; |
1203 | } | 1377 | } |
1204 | 1378 | ||
1205 | /* error info record present */ | 1379 | /* error info record present */ |
1206 | if ((rx_desc & RXQ_ERR) && (*(u64 *) slot->response)) { | 1380 | if (unlikely((rx_desc & RXQ_ERR) && (*(u64 *) slot->response))) { |
1207 | tstat->stat = SAM_CHECK_COND; | 1381 | tstat->stat = mvs_slot_err(mvi, task, slot_idx); |
1208 | mvs_slot_err(mvi, task, slot_idx); | ||
1209 | goto out; | 1382 | goto out; |
1210 | } | 1383 | } |
1211 | 1384 | ||
@@ -1242,21 +1415,7 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc) | |||
1242 | case SAS_PROTOCOL_SATA: | 1415 | case SAS_PROTOCOL_SATA: |
1243 | case SAS_PROTOCOL_STP: | 1416 | case SAS_PROTOCOL_STP: |
1244 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: { | 1417 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: { |
1245 | struct ata_task_resp *resp = | 1418 | tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0); |
1246 | (struct ata_task_resp *)tstat->buf; | ||
1247 | |||
1248 | if ((rx_desc & (RXQ_DONE | RXQ_ERR | RXQ_ATTN)) == | ||
1249 | RXQ_DONE) | ||
1250 | tstat->stat = SAM_GOOD; | ||
1251 | else | ||
1252 | tstat->stat = SAM_CHECK_COND; | ||
1253 | |||
1254 | resp->frame_len = sizeof(struct dev_to_host_fis); | ||
1255 | memcpy(&resp->ending_fis[0], | ||
1256 | SATA_RECEIVED_D2H_FIS(port->taskfileset), | ||
1257 | sizeof(struct dev_to_host_fis)); | ||
1258 | if (resp->ending_fis[2] & ATA_ERR) | ||
1259 | mvs_hexdump(16, resp->ending_fis, 0); | ||
1260 | break; | 1419 | break; |
1261 | } | 1420 | } |
1262 | 1421 | ||
@@ -1266,11 +1425,34 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc) | |||
1266 | } | 1425 | } |
1267 | 1426 | ||
1268 | out: | 1427 | out: |
1269 | mvs_slot_free(mvi, task, slot, slot_idx); | 1428 | mvs_slot_task_free(mvi, task, slot, slot_idx); |
1429 | if (unlikely(tstat->stat != SAS_QUEUE_FULL)) | ||
1430 | mvs_slot_free(mvi, rx_desc); | ||
1431 | |||
1432 | spin_unlock(&mvi->lock); | ||
1270 | task->task_done(task); | 1433 | task->task_done(task); |
1434 | spin_lock(&mvi->lock); | ||
1271 | return tstat->stat; | 1435 | return tstat->stat; |
1272 | } | 1436 | } |
1273 | 1437 | ||
1438 | static void mvs_release_task(struct mvs_info *mvi, int phy_no) | ||
1439 | { | ||
1440 | struct list_head *pos, *n; | ||
1441 | struct mvs_slot_info *slot; | ||
1442 | struct mvs_phy *phy = &mvi->phy[phy_no]; | ||
1443 | struct mvs_port *port = phy->port; | ||
1444 | u32 rx_desc; | ||
1445 | |||
1446 | if (!port) | ||
1447 | return; | ||
1448 | |||
1449 | list_for_each_safe(pos, n, &port->list) { | ||
1450 | slot = container_of(pos, struct mvs_slot_info, list); | ||
1451 | rx_desc = (u32) (slot - mvi->slot_info); | ||
1452 | mvs_slot_complete(mvi, rx_desc, 1); | ||
1453 | } | ||
1454 | } | ||
1455 | |||
1274 | static void mvs_int_full(struct mvs_info *mvi) | 1456 | static void mvs_int_full(struct mvs_info *mvi) |
1275 | { | 1457 | { |
1276 | void __iomem *regs = mvi->regs; | 1458 | void __iomem *regs = mvi->regs; |
@@ -1305,40 +1487,43 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear) | |||
1305 | * we don't have to stall the CPU reading that register. | 1487 | * we don't have to stall the CPU reading that register. |
1306 | * The actual RX ring is offset by one dword, due to this. | 1488 | * The actual RX ring is offset by one dword, due to this. |
1307 | */ | 1489 | */ |
1308 | rx_prod_idx = mr32(RX_CONS_IDX) & RX_RING_SZ_MASK; | 1490 | rx_prod_idx = mvi->rx_cons; |
1309 | if (rx_prod_idx == 0xfff) { /* h/w hasn't touched RX ring yet */ | 1491 | mvi->rx_cons = le32_to_cpu(mvi->rx[0]); |
1310 | mvi->rx_cons = 0xfff; | 1492 | if (mvi->rx_cons == 0xfff) /* h/w hasn't touched RX ring yet */ |
1311 | return 0; | 1493 | return 0; |
1312 | } | ||
1313 | 1494 | ||
1314 | /* The CMPL_Q may come late, read from register and try again | 1495 | /* The CMPL_Q may come late, read from register and try again |
1315 | * note: if coalescing is enabled, | 1496 | * note: if coalescing is enabled, |
1316 | * it will need to read from register every time for sure | 1497 | * it will need to read from register every time for sure |
1317 | */ | 1498 | */ |
1318 | if (mvi->rx_cons == rx_prod_idx) | 1499 | if (mvi->rx_cons == rx_prod_idx) |
1319 | return 0; | 1500 | mvi->rx_cons = mr32(RX_CONS_IDX) & RX_RING_SZ_MASK; |
1320 | 1501 | ||
1321 | if (mvi->rx_cons == 0xfff) | 1502 | if (mvi->rx_cons == rx_prod_idx) |
1322 | mvi->rx_cons = MVS_RX_RING_SZ - 1; | 1503 | return 0; |
1323 | 1504 | ||
1324 | while (mvi->rx_cons != rx_prod_idx) { | 1505 | while (mvi->rx_cons != rx_prod_idx) { |
1325 | 1506 | ||
1326 | /* increment our internal RX consumer pointer */ | 1507 | /* increment our internal RX consumer pointer */ |
1327 | mvi->rx_cons = (mvi->rx_cons + 1) & (MVS_RX_RING_SZ - 1); | 1508 | rx_prod_idx = (rx_prod_idx + 1) & (MVS_RX_RING_SZ - 1); |
1328 | 1509 | ||
1329 | rx_desc = le32_to_cpu(mvi->rx[mvi->rx_cons + 1]); | 1510 | rx_desc = le32_to_cpu(mvi->rx[rx_prod_idx + 1]); |
1330 | |||
1331 | mvs_hba_cq_dump(mvi); | ||
1332 | 1511 | ||
1333 | if (likely(rx_desc & RXQ_DONE)) | 1512 | if (likely(rx_desc & RXQ_DONE)) |
1334 | mvs_slot_complete(mvi, rx_desc); | 1513 | mvs_slot_complete(mvi, rx_desc, 0); |
1335 | if (rx_desc & RXQ_ATTN) { | 1514 | if (rx_desc & RXQ_ATTN) { |
1336 | attn = true; | 1515 | attn = true; |
1337 | dev_printk(KERN_DEBUG, &pdev->dev, "ATTN %X\n", | 1516 | dev_printk(KERN_DEBUG, &pdev->dev, "ATTN %X\n", |
1338 | rx_desc); | 1517 | rx_desc); |
1339 | } else if (rx_desc & RXQ_ERR) { | 1518 | } else if (rx_desc & RXQ_ERR) { |
1519 | if (!(rx_desc & RXQ_DONE)) | ||
1520 | mvs_slot_complete(mvi, rx_desc, 0); | ||
1340 | dev_printk(KERN_DEBUG, &pdev->dev, "RXQ_ERR %X\n", | 1521 | dev_printk(KERN_DEBUG, &pdev->dev, "RXQ_ERR %X\n", |
1341 | rx_desc); | 1522 | rx_desc); |
1523 | } else if (rx_desc & RXQ_SLOT_RESET) { | ||
1524 | dev_printk(KERN_DEBUG, &pdev->dev, "Slot reset[%X]\n", | ||
1525 | rx_desc); | ||
1526 | mvs_slot_free(mvi, rx_desc); | ||
1342 | } | 1527 | } |
1343 | } | 1528 | } |
1344 | 1529 | ||
@@ -1348,6 +1533,23 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear) | |||
1348 | return 0; | 1533 | return 0; |
1349 | } | 1534 | } |
1350 | 1535 | ||
1536 | #ifdef MVS_USE_TASKLET | ||
1537 | static void mvs_tasklet(unsigned long data) | ||
1538 | { | ||
1539 | struct mvs_info *mvi = (struct mvs_info *) data; | ||
1540 | unsigned long flags; | ||
1541 | |||
1542 | spin_lock_irqsave(&mvi->lock, flags); | ||
1543 | |||
1544 | #ifdef MVS_DISABLE_MSI | ||
1545 | mvs_int_full(mvi); | ||
1546 | #else | ||
1547 | mvs_int_rx(mvi, true); | ||
1548 | #endif | ||
1549 | spin_unlock_irqrestore(&mvi->lock, flags); | ||
1550 | } | ||
1551 | #endif | ||
1552 | |||
1351 | static irqreturn_t mvs_interrupt(int irq, void *opaque) | 1553 | static irqreturn_t mvs_interrupt(int irq, void *opaque) |
1352 | { | 1554 | { |
1353 | struct mvs_info *mvi = opaque; | 1555 | struct mvs_info *mvi = opaque; |
@@ -1356,18 +1558,21 @@ static irqreturn_t mvs_interrupt(int irq, void *opaque) | |||
1356 | 1558 | ||
1357 | stat = mr32(GBL_INT_STAT); | 1559 | stat = mr32(GBL_INT_STAT); |
1358 | 1560 | ||
1359 | /* clear CMD_CMPLT ASAP */ | ||
1360 | mw32_f(INT_STAT, CINT_DONE); | ||
1361 | |||
1362 | if (stat == 0 || stat == 0xffffffff) | 1561 | if (stat == 0 || stat == 0xffffffff) |
1363 | return IRQ_NONE; | 1562 | return IRQ_NONE; |
1364 | 1563 | ||
1564 | /* clear CMD_CMPLT ASAP */ | ||
1565 | mw32_f(INT_STAT, CINT_DONE); | ||
1566 | |||
1567 | #ifndef MVS_USE_TASKLET | ||
1365 | spin_lock(&mvi->lock); | 1568 | spin_lock(&mvi->lock); |
1366 | 1569 | ||
1367 | mvs_int_full(mvi); | 1570 | mvs_int_full(mvi); |
1368 | 1571 | ||
1369 | spin_unlock(&mvi->lock); | 1572 | spin_unlock(&mvi->lock); |
1370 | 1573 | #else | |
1574 | tasklet_schedule(&mvi->tasklet); | ||
1575 | #endif | ||
1371 | return IRQ_HANDLED; | 1576 | return IRQ_HANDLED; |
1372 | } | 1577 | } |
1373 | 1578 | ||
@@ -1376,12 +1581,15 @@ static irqreturn_t mvs_msi_interrupt(int irq, void *opaque) | |||
1376 | { | 1581 | { |
1377 | struct mvs_info *mvi = opaque; | 1582 | struct mvs_info *mvi = opaque; |
1378 | 1583 | ||
1584 | #ifndef MVS_USE_TASKLET | ||
1379 | spin_lock(&mvi->lock); | 1585 | spin_lock(&mvi->lock); |
1380 | 1586 | ||
1381 | mvs_int_rx(mvi, true); | 1587 | mvs_int_rx(mvi, true); |
1382 | 1588 | ||
1383 | spin_unlock(&mvi->lock); | 1589 | spin_unlock(&mvi->lock); |
1384 | 1590 | #else | |
1591 | tasklet_schedule(&mvi->tasklet); | ||
1592 | #endif | ||
1385 | return IRQ_HANDLED; | 1593 | return IRQ_HANDLED; |
1386 | } | 1594 | } |
1387 | #endif | 1595 | #endif |
@@ -1576,15 +1784,19 @@ static u8 mvs_assign_reg_set(struct mvs_info *mvi, struct mvs_port *port) | |||
1576 | return MVS_ID_NOT_MAPPED; | 1784 | return MVS_ID_NOT_MAPPED; |
1577 | } | 1785 | } |
1578 | 1786 | ||
1579 | static u32 mvs_get_ncq_tag(struct sas_task *task) | 1787 | static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag) |
1580 | { | 1788 | { |
1581 | u32 tag = 0; | ||
1582 | struct ata_queued_cmd *qc = task->uldd_task; | 1789 | struct ata_queued_cmd *qc = task->uldd_task; |
1583 | 1790 | ||
1584 | if (qc) | 1791 | if (qc) { |
1585 | tag = qc->tag; | 1792 | if (qc->tf.command == ATA_CMD_FPDMA_WRITE || |
1793 | qc->tf.command == ATA_CMD_FPDMA_READ) { | ||
1794 | *tag = qc->tag; | ||
1795 | return 1; | ||
1796 | } | ||
1797 | } | ||
1586 | 1798 | ||
1587 | return tag; | 1799 | return 0; |
1588 | } | 1800 | } |
1589 | 1801 | ||
1590 | static int mvs_task_prep_ata(struct mvs_info *mvi, | 1802 | static int mvs_task_prep_ata(struct mvs_info *mvi, |
@@ -1628,11 +1840,9 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, | |||
1628 | hdr->flags = cpu_to_le32(flags); | 1840 | hdr->flags = cpu_to_le32(flags); |
1629 | 1841 | ||
1630 | /* FIXME: the low order order 5 bits for the TAG if enable NCQ */ | 1842 | /* FIXME: the low order order 5 bits for the TAG if enable NCQ */ |
1631 | if (task->ata_task.use_ncq) { | 1843 | if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr->tags)) |
1632 | hdr->tags = cpu_to_le32(mvs_get_ncq_tag(task)); | 1844 | task->ata_task.fis.sector_count |= hdr->tags << 3; |
1633 | /*Fill in task file */ | 1845 | else |
1634 | task->ata_task.fis.sector_count = hdr->tags << 3; | ||
1635 | } else | ||
1636 | hdr->tags = cpu_to_le32(tag); | 1846 | hdr->tags = cpu_to_le32(tag); |
1637 | hdr->data_len = cpu_to_le32(task->total_xfer_len); | 1847 | hdr->data_len = cpu_to_le32(task->total_xfer_len); |
1638 | 1848 | ||
@@ -1725,13 +1935,16 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi, | |||
1725 | u32 flags; | 1935 | u32 flags; |
1726 | u32 resp_len, req_len, i, tag = tei->tag; | 1936 | u32 resp_len, req_len, i, tag = tei->tag; |
1727 | const u32 max_resp_len = SB_RFB_MAX; | 1937 | const u32 max_resp_len = SB_RFB_MAX; |
1938 | u8 phy_mask; | ||
1728 | 1939 | ||
1729 | slot = &mvi->slot_info[tag]; | 1940 | slot = &mvi->slot_info[tag]; |
1730 | 1941 | ||
1942 | phy_mask = (port->wide_port_phymap) ? port->wide_port_phymap : | ||
1943 | task->dev->port->phy_mask; | ||
1731 | slot->tx = mvi->tx_prod; | 1944 | slot->tx = mvi->tx_prod; |
1732 | mvi->tx[mvi->tx_prod] = cpu_to_le32(TXQ_MODE_I | tag | | 1945 | mvi->tx[mvi->tx_prod] = cpu_to_le32(TXQ_MODE_I | tag | |
1733 | (TXQ_CMD_SSP << TXQ_CMD_SHIFT) | | 1946 | (TXQ_CMD_SSP << TXQ_CMD_SHIFT) | |
1734 | (port->wide_port_phymap << TXQ_PHY_SHIFT)); | 1947 | (phy_mask << TXQ_PHY_SHIFT)); |
1735 | 1948 | ||
1736 | flags = MCH_RETRY; | 1949 | flags = MCH_RETRY; |
1737 | if (task->ssp_task.enable_first_burst) { | 1950 | if (task->ssp_task.enable_first_burst) { |
@@ -1832,22 +2045,32 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags) | |||
1832 | void __iomem *regs = mvi->regs; | 2045 | void __iomem *regs = mvi->regs; |
1833 | struct mvs_task_exec_info tei; | 2046 | struct mvs_task_exec_info tei; |
1834 | struct sas_task *t = task; | 2047 | struct sas_task *t = task; |
2048 | struct mvs_slot_info *slot; | ||
1835 | u32 tag = 0xdeadbeef, rc, n_elem = 0; | 2049 | u32 tag = 0xdeadbeef, rc, n_elem = 0; |
1836 | unsigned long flags; | 2050 | unsigned long flags; |
1837 | u32 n = num, pass = 0; | 2051 | u32 n = num, pass = 0; |
1838 | 2052 | ||
1839 | spin_lock_irqsave(&mvi->lock, flags); | 2053 | spin_lock_irqsave(&mvi->lock, flags); |
1840 | |||
1841 | do { | 2054 | do { |
2055 | dev = t->dev; | ||
1842 | tei.port = &mvi->port[dev->port->id]; | 2056 | tei.port = &mvi->port[dev->port->id]; |
1843 | 2057 | ||
1844 | if (!tei.port->port_attached) { | 2058 | if (!tei.port->port_attached) { |
1845 | struct task_status_struct *ts = &t->task_status; | 2059 | if (sas_protocol_ata(t->task_proto)) { |
1846 | ts->stat = SAS_PHY_DOWN; | 2060 | rc = SAS_PHY_DOWN; |
1847 | t->task_done(t); | 2061 | goto out_done; |
1848 | rc = 0; | 2062 | } else { |
1849 | goto exec_exit; | 2063 | struct task_status_struct *ts = &t->task_status; |
2064 | ts->resp = SAS_TASK_UNDELIVERED; | ||
2065 | ts->stat = SAS_PHY_DOWN; | ||
2066 | t->task_done(t); | ||
2067 | if (n > 1) | ||
2068 | t = list_entry(t->list.next, | ||
2069 | struct sas_task, list); | ||
2070 | continue; | ||
2071 | } | ||
1850 | } | 2072 | } |
2073 | |||
1851 | if (!sas_protocol_ata(t->task_proto)) { | 2074 | if (!sas_protocol_ata(t->task_proto)) { |
1852 | if (t->num_scatter) { | 2075 | if (t->num_scatter) { |
1853 | n_elem = pci_map_sg(mvi->pdev, t->scatter, | 2076 | n_elem = pci_map_sg(mvi->pdev, t->scatter, |
@@ -1866,9 +2089,10 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags) | |||
1866 | if (rc) | 2089 | if (rc) |
1867 | goto err_out; | 2090 | goto err_out; |
1868 | 2091 | ||
1869 | mvi->slot_info[tag].task = t; | 2092 | slot = &mvi->slot_info[tag]; |
1870 | mvi->slot_info[tag].n_elem = n_elem; | 2093 | t->lldd_task = NULL; |
1871 | memset(mvi->slot_info[tag].buf, 0, MVS_SLOT_BUF_SZ); | 2094 | slot->n_elem = n_elem; |
2095 | memset(slot->buf, 0, MVS_SLOT_BUF_SZ); | ||
1872 | tei.task = t; | 2096 | tei.task = t; |
1873 | tei.hdr = &mvi->slot[tag]; | 2097 | tei.hdr = &mvi->slot[tag]; |
1874 | tei.tag = tag; | 2098 | tei.tag = tag; |
@@ -1897,28 +2121,26 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags) | |||
1897 | if (rc) | 2121 | if (rc) |
1898 | goto err_out_tag; | 2122 | goto err_out_tag; |
1899 | 2123 | ||
2124 | slot->task = t; | ||
2125 | slot->port = tei.port; | ||
2126 | t->lldd_task = (void *) slot; | ||
2127 | list_add_tail(&slot->list, &slot->port->list); | ||
1900 | /* TODO: select normal or high priority */ | 2128 | /* TODO: select normal or high priority */ |
1901 | 2129 | ||
1902 | spin_lock(&t->task_state_lock); | 2130 | spin_lock(&t->task_state_lock); |
1903 | t->task_state_flags |= SAS_TASK_AT_INITIATOR; | 2131 | t->task_state_flags |= SAS_TASK_AT_INITIATOR; |
1904 | spin_unlock(&t->task_state_lock); | 2132 | spin_unlock(&t->task_state_lock); |
1905 | 2133 | ||
1906 | if (n == 1) { | ||
1907 | spin_unlock_irqrestore(&mvi->lock, flags); | ||
1908 | mw32(TX_PROD_IDX, mvi->tx_prod); | ||
1909 | } | ||
1910 | mvs_hba_memory_dump(mvi, tag, t->task_proto); | 2134 | mvs_hba_memory_dump(mvi, tag, t->task_proto); |
1911 | 2135 | ||
1912 | ++pass; | 2136 | ++pass; |
1913 | mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1); | 2137 | mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1); |
1914 | 2138 | if (n > 1) | |
1915 | if (n == 1) | 2139 | t = list_entry(t->list.next, struct sas_task, list); |
1916 | break; | ||
1917 | |||
1918 | t = list_entry(t->list.next, struct sas_task, list); | ||
1919 | } while (--n); | 2140 | } while (--n); |
1920 | 2141 | ||
1921 | return 0; | 2142 | rc = 0; |
2143 | goto out_done; | ||
1922 | 2144 | ||
1923 | err_out_tag: | 2145 | err_out_tag: |
1924 | mvs_tag_free(mvi, tag); | 2146 | mvs_tag_free(mvi, tag); |
@@ -1928,7 +2150,7 @@ err_out: | |||
1928 | if (n_elem) | 2150 | if (n_elem) |
1929 | pci_unmap_sg(mvi->pdev, t->scatter, n_elem, | 2151 | pci_unmap_sg(mvi->pdev, t->scatter, n_elem, |
1930 | t->data_dir); | 2152 | t->data_dir); |
1931 | exec_exit: | 2153 | out_done: |
1932 | if (pass) | 2154 | if (pass) |
1933 | mw32(TX_PROD_IDX, (mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1)); | 2155 | mw32(TX_PROD_IDX, (mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1)); |
1934 | spin_unlock_irqrestore(&mvi->lock, flags); | 2156 | spin_unlock_irqrestore(&mvi->lock, flags); |
@@ -1937,42 +2159,59 @@ exec_exit: | |||
1937 | 2159 | ||
1938 | static int mvs_task_abort(struct sas_task *task) | 2160 | static int mvs_task_abort(struct sas_task *task) |
1939 | { | 2161 | { |
1940 | int rc = 1; | 2162 | int rc; |
1941 | unsigned long flags; | 2163 | unsigned long flags; |
1942 | struct mvs_info *mvi = task->dev->port->ha->lldd_ha; | 2164 | struct mvs_info *mvi = task->dev->port->ha->lldd_ha; |
1943 | struct pci_dev *pdev = mvi->pdev; | 2165 | struct pci_dev *pdev = mvi->pdev; |
2166 | int tag; | ||
1944 | 2167 | ||
1945 | spin_lock_irqsave(&task->task_state_lock, flags); | 2168 | spin_lock_irqsave(&task->task_state_lock, flags); |
1946 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { | 2169 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { |
1947 | rc = TMF_RESP_FUNC_COMPLETE; | 2170 | rc = TMF_RESP_FUNC_COMPLETE; |
2171 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1948 | goto out_done; | 2172 | goto out_done; |
1949 | } | 2173 | } |
1950 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 2174 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
1951 | 2175 | ||
1952 | /*FIXME*/ | ||
1953 | rc = TMF_RESP_FUNC_COMPLETE; | ||
1954 | |||
1955 | switch (task->task_proto) { | 2176 | switch (task->task_proto) { |
1956 | case SAS_PROTOCOL_SMP: | 2177 | case SAS_PROTOCOL_SMP: |
1957 | dev_printk(KERN_DEBUG, &pdev->dev, "SMP Abort! "); | 2178 | dev_printk(KERN_DEBUG, &pdev->dev, "SMP Abort! \n"); |
1958 | break; | 2179 | break; |
1959 | case SAS_PROTOCOL_SSP: | 2180 | case SAS_PROTOCOL_SSP: |
1960 | dev_printk(KERN_DEBUG, &pdev->dev, "SSP Abort! "); | 2181 | dev_printk(KERN_DEBUG, &pdev->dev, "SSP Abort! \n"); |
1961 | break; | 2182 | break; |
1962 | case SAS_PROTOCOL_SATA: | 2183 | case SAS_PROTOCOL_SATA: |
1963 | case SAS_PROTOCOL_STP: | 2184 | case SAS_PROTOCOL_STP: |
1964 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:{ | 2185 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:{ |
1965 | dev_printk(KERN_DEBUG, &pdev->dev, "STP Abort! " | 2186 | dev_printk(KERN_DEBUG, &pdev->dev, "STP Abort! \n"); |
1966 | "Dump D2H FIS: \n"); | 2187 | #if _MV_DUMP |
2188 | dev_printk(KERN_DEBUG, &pdev->dev, "Dump D2H FIS: \n"); | ||
1967 | mvs_hexdump(sizeof(struct host_to_dev_fis), | 2189 | mvs_hexdump(sizeof(struct host_to_dev_fis), |
1968 | (void *)&task->ata_task.fis, 0); | 2190 | (void *)&task->ata_task.fis, 0); |
1969 | dev_printk(KERN_DEBUG, &pdev->dev, "Dump ATAPI Cmd : \n"); | 2191 | dev_printk(KERN_DEBUG, &pdev->dev, "Dump ATAPI Cmd : \n"); |
1970 | mvs_hexdump(16, task->ata_task.atapi_packet, 0); | 2192 | mvs_hexdump(16, task->ata_task.atapi_packet, 0); |
2193 | #endif | ||
2194 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
2195 | if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET) { | ||
2196 | /* TODO */ | ||
2197 | ; | ||
2198 | } | ||
2199 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
1971 | break; | 2200 | break; |
1972 | } | 2201 | } |
1973 | default: | 2202 | default: |
1974 | break; | 2203 | break; |
1975 | } | 2204 | } |
2205 | |||
2206 | if (mvs_find_tag(mvi, task, &tag)) { | ||
2207 | spin_lock_irqsave(&mvi->lock, flags); | ||
2208 | mvs_slot_task_free(mvi, task, &mvi->slot_info[tag], tag); | ||
2209 | spin_unlock_irqrestore(&mvi->lock, flags); | ||
2210 | } | ||
2211 | if (!mvs_task_exec(task, 1, GFP_ATOMIC)) | ||
2212 | rc = TMF_RESP_FUNC_COMPLETE; | ||
2213 | else | ||
2214 | rc = TMF_RESP_FUNC_FAILED; | ||
1976 | out_done: | 2215 | out_done: |
1977 | return rc; | 2216 | return rc; |
1978 | } | 2217 | } |
@@ -2001,7 +2240,7 @@ static void mvs_free(struct mvs_info *mvi) | |||
2001 | mvi->rx_fis, mvi->rx_fis_dma); | 2240 | mvi->rx_fis, mvi->rx_fis_dma); |
2002 | if (mvi->rx) | 2241 | if (mvi->rx) |
2003 | dma_free_coherent(&mvi->pdev->dev, | 2242 | dma_free_coherent(&mvi->pdev->dev, |
2004 | sizeof(*mvi->rx) * MVS_RX_RING_SZ, | 2243 | sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1), |
2005 | mvi->rx, mvi->rx_dma); | 2244 | mvi->rx, mvi->rx_dma); |
2006 | if (mvi->slot) | 2245 | if (mvi->slot) |
2007 | dma_free_coherent(&mvi->pdev->dev, | 2246 | dma_free_coherent(&mvi->pdev->dev, |
@@ -2109,6 +2348,9 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev, | |||
2109 | return NULL; | 2348 | return NULL; |
2110 | 2349 | ||
2111 | spin_lock_init(&mvi->lock); | 2350 | spin_lock_init(&mvi->lock); |
2351 | #ifdef MVS_USE_TASKLET | ||
2352 | tasklet_init(&mvi->tasklet, mvs_tasklet, (unsigned long)mvi); | ||
2353 | #endif | ||
2112 | mvi->pdev = pdev; | 2354 | mvi->pdev = pdev; |
2113 | mvi->chip = chip; | 2355 | mvi->chip = chip; |
2114 | 2356 | ||
@@ -2132,6 +2374,10 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev, | |||
2132 | mvs_phy_init(mvi, i); | 2374 | mvs_phy_init(mvi, i); |
2133 | arr_phy[i] = &mvi->phy[i].sas_phy; | 2375 | arr_phy[i] = &mvi->phy[i].sas_phy; |
2134 | arr_port[i] = &mvi->port[i].sas_port; | 2376 | arr_port[i] = &mvi->port[i].sas_port; |
2377 | mvi->port[i].taskfileset = MVS_ID_NOT_MAPPED; | ||
2378 | mvi->port[i].wide_port_phymap = 0; | ||
2379 | mvi->port[i].port_attached = 0; | ||
2380 | INIT_LIST_HEAD(&mvi->port[i].list); | ||
2135 | } | 2381 | } |
2136 | 2382 | ||
2137 | SHOST_TO_SAS_HA(mvi->shost) = &mvi->sas; | 2383 | SHOST_TO_SAS_HA(mvi->shost) = &mvi->sas; |
@@ -2148,9 +2394,10 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev, | |||
2148 | mvi->sas.sas_phy = arr_phy; | 2394 | mvi->sas.sas_phy = arr_phy; |
2149 | mvi->sas.sas_port = arr_port; | 2395 | mvi->sas.sas_port = arr_port; |
2150 | mvi->sas.num_phys = chip->n_phy; | 2396 | mvi->sas.num_phys = chip->n_phy; |
2151 | mvi->sas.lldd_max_execute_num = MVS_CHIP_SLOT_SZ - 1; | 2397 | mvi->sas.lldd_max_execute_num = 1; |
2152 | mvi->sas.lldd_queue_size = MVS_QUEUE_SIZE; | 2398 | mvi->sas.lldd_queue_size = MVS_QUEUE_SIZE; |
2153 | mvi->can_queue = (MVS_CHIP_SLOT_SZ >> 1) - 1; | 2399 | mvi->shost->can_queue = MVS_CAN_QUEUE; |
2400 | mvi->shost->cmd_per_lun = MVS_SLOTS / mvi->sas.num_phys; | ||
2154 | mvi->sas.lldd_ha = mvi; | 2401 | mvi->sas.lldd_ha = mvi; |
2155 | mvi->sas.core.shost = mvi->shost; | 2402 | mvi->sas.core.shost = mvi->shost; |
2156 | 2403 | ||
@@ -2203,11 +2450,11 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev, | |||
2203 | memset(mvi->rx_fis, 0, MVS_RX_FISL_SZ); | 2450 | memset(mvi->rx_fis, 0, MVS_RX_FISL_SZ); |
2204 | 2451 | ||
2205 | mvi->rx = dma_alloc_coherent(&pdev->dev, | 2452 | mvi->rx = dma_alloc_coherent(&pdev->dev, |
2206 | sizeof(*mvi->rx) * MVS_RX_RING_SZ, | 2453 | sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1), |
2207 | &mvi->rx_dma, GFP_KERNEL); | 2454 | &mvi->rx_dma, GFP_KERNEL); |
2208 | if (!mvi->rx) | 2455 | if (!mvi->rx) |
2209 | goto err_out; | 2456 | goto err_out; |
2210 | memset(mvi->rx, 0, sizeof(*mvi->rx) * MVS_RX_RING_SZ); | 2457 | memset(mvi->rx, 0, sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1)); |
2211 | 2458 | ||
2212 | mvi->rx[0] = cpu_to_le32(0xfff); | 2459 | mvi->rx[0] = cpu_to_le32(0xfff); |
2213 | mvi->rx_cons = 0xfff; | 2460 | mvi->rx_cons = 0xfff; |
@@ -2357,7 +2604,7 @@ static void __devinit mvs_phy_hacks(struct mvs_info *mvi) | |||
2357 | mvs_cw32(regs, CMD_SAS_CTL0, tmp); | 2604 | mvs_cw32(regs, CMD_SAS_CTL0, tmp); |
2358 | 2605 | ||
2359 | /* workaround for WDTIMEOUT , set to 550 ms */ | 2606 | /* workaround for WDTIMEOUT , set to 550 ms */ |
2360 | mvs_cw32(regs, CMD_WD_TIMER, 0xffffff); | 2607 | mvs_cw32(regs, CMD_WD_TIMER, 0x86470); |
2361 | 2608 | ||
2362 | /* not to halt for different port op during wideport link change */ | 2609 | /* not to halt for different port op during wideport link change */ |
2363 | mvs_cw32(regs, CMD_APP_ERR_CONFIG, 0xffefbf7d); | 2610 | mvs_cw32(regs, CMD_APP_ERR_CONFIG, 0xffefbf7d); |
@@ -2465,17 +2712,16 @@ static u32 mvs_is_phy_ready(struct mvs_info *mvi, int i) | |||
2465 | { | 2712 | { |
2466 | u32 tmp; | 2713 | u32 tmp; |
2467 | struct mvs_phy *phy = &mvi->phy[i]; | 2714 | struct mvs_phy *phy = &mvi->phy[i]; |
2468 | struct mvs_port *port; | 2715 | struct mvs_port *port = phy->port;; |
2469 | 2716 | ||
2470 | tmp = mvs_read_phy_ctl(mvi, i); | 2717 | tmp = mvs_read_phy_ctl(mvi, i); |
2471 | 2718 | ||
2472 | if ((tmp & PHY_READY_MASK) && !(phy->irq_status & PHYEV_POOF)) { | 2719 | if ((tmp & PHY_READY_MASK) && !(phy->irq_status & PHYEV_POOF)) { |
2473 | if (!phy->port) | 2720 | if (!port) |
2474 | phy->phy_attached = 1; | 2721 | phy->phy_attached = 1; |
2475 | return tmp; | 2722 | return tmp; |
2476 | } | 2723 | } |
2477 | 2724 | ||
2478 | port = phy->port; | ||
2479 | if (port) { | 2725 | if (port) { |
2480 | if (phy->phy_type & PORT_TYPE_SAS) { | 2726 | if (phy->phy_type & PORT_TYPE_SAS) { |
2481 | port->wide_port_phymap &= ~(1U << i); | 2727 | port->wide_port_phymap &= ~(1U << i); |
@@ -2497,7 +2743,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i, | |||
2497 | { | 2743 | { |
2498 | struct mvs_phy *phy = &mvi->phy[i]; | 2744 | struct mvs_phy *phy = &mvi->phy[i]; |
2499 | struct pci_dev *pdev = mvi->pdev; | 2745 | struct pci_dev *pdev = mvi->pdev; |
2500 | u32 tmp, j; | 2746 | u32 tmp; |
2501 | u64 tmp64; | 2747 | u64 tmp64; |
2502 | 2748 | ||
2503 | mvs_write_port_cfg_addr(mvi, i, PHYR_IDENTIFY); | 2749 | mvs_write_port_cfg_addr(mvi, i, PHYR_IDENTIFY); |
@@ -2524,46 +2770,20 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i, | |||
2524 | sas_phy->linkrate = | 2770 | sas_phy->linkrate = |
2525 | (phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >> | 2771 | (phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >> |
2526 | PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET; | 2772 | PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET; |
2527 | 2773 | phy->minimum_linkrate = | |
2528 | /* Updated attached_sas_addr */ | 2774 | (phy->phy_status & |
2529 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI); | 2775 | PHY_MIN_SPP_PHYS_LINK_RATE_MASK) >> 8; |
2530 | phy->att_dev_sas_addr = | 2776 | phy->maximum_linkrate = |
2531 | (u64) mvs_read_port_cfg_data(mvi, i) << 32; | 2777 | (phy->phy_status & |
2532 | 2778 | PHY_MAX_SPP_PHYS_LINK_RATE_MASK) >> 12; | |
2533 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO); | ||
2534 | phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i); | ||
2535 | |||
2536 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
2537 | "phy[%d] Get Attached Address 0x%llX ," | ||
2538 | " SAS Address 0x%llX\n", | ||
2539 | i, phy->att_dev_sas_addr, phy->dev_sas_addr); | ||
2540 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
2541 | "Rate = %x , type = %d\n", | ||
2542 | sas_phy->linkrate, phy->phy_type); | ||
2543 | |||
2544 | #if 1 | ||
2545 | /* | ||
2546 | * If the device is capable of supporting a wide port | ||
2547 | * on its phys, it may configure the phys as a wide port. | ||
2548 | */ | ||
2549 | if (phy->phy_type & PORT_TYPE_SAS) | ||
2550 | for (j = 0; j < mvi->chip->n_phy && j != i; ++j) { | ||
2551 | if ((mvi->phy[j].phy_attached) && | ||
2552 | (mvi->phy[j].phy_type & PORT_TYPE_SAS)) | ||
2553 | if (phy->att_dev_sas_addr == | ||
2554 | mvi->phy[j].att_dev_sas_addr - 1) { | ||
2555 | phy->att_dev_sas_addr = | ||
2556 | mvi->phy[j].att_dev_sas_addr; | ||
2557 | break; | ||
2558 | } | ||
2559 | } | ||
2560 | |||
2561 | #endif | ||
2562 | |||
2563 | tmp64 = cpu_to_be64(phy->att_dev_sas_addr); | ||
2564 | memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE); | ||
2565 | 2779 | ||
2566 | if (phy->phy_type & PORT_TYPE_SAS) { | 2780 | if (phy->phy_type & PORT_TYPE_SAS) { |
2781 | /* Updated attached_sas_addr */ | ||
2782 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI); | ||
2783 | phy->att_dev_sas_addr = | ||
2784 | (u64) mvs_read_port_cfg_data(mvi, i) << 32; | ||
2785 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO); | ||
2786 | phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i); | ||
2567 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_DEV_INFO); | 2787 | mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_DEV_INFO); |
2568 | phy->att_dev_info = mvs_read_port_cfg_data(mvi, i); | 2788 | phy->att_dev_info = mvs_read_port_cfg_data(mvi, i); |
2569 | phy->identify.device_type = | 2789 | phy->identify.device_type = |
@@ -2582,6 +2802,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i, | |||
2582 | } else if (phy->phy_type & PORT_TYPE_SATA) { | 2802 | } else if (phy->phy_type & PORT_TYPE_SATA) { |
2583 | phy->identify.target_port_protocols = SAS_PROTOCOL_STP; | 2803 | phy->identify.target_port_protocols = SAS_PROTOCOL_STP; |
2584 | if (mvs_is_sig_fis_received(phy->irq_status)) { | 2804 | if (mvs_is_sig_fis_received(phy->irq_status)) { |
2805 | phy->att_dev_sas_addr = i; /* temp */ | ||
2585 | if (phy_st & PHY_OOB_DTCTD) | 2806 | if (phy_st & PHY_OOB_DTCTD) |
2586 | sas_phy->oob_mode = SATA_OOB_MODE; | 2807 | sas_phy->oob_mode = SATA_OOB_MODE; |
2587 | phy->frame_rcvd_size = | 2808 | phy->frame_rcvd_size = |
@@ -2591,20 +2812,34 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i, | |||
2591 | } else { | 2812 | } else { |
2592 | dev_printk(KERN_DEBUG, &pdev->dev, | 2813 | dev_printk(KERN_DEBUG, &pdev->dev, |
2593 | "No sig fis\n"); | 2814 | "No sig fis\n"); |
2815 | phy->phy_type &= ~(PORT_TYPE_SATA); | ||
2816 | goto out_done; | ||
2594 | } | 2817 | } |
2595 | } | 2818 | } |
2819 | tmp64 = cpu_to_be64(phy->att_dev_sas_addr); | ||
2820 | memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE); | ||
2821 | |||
2822 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
2823 | "phy[%d] Get Attached Address 0x%llX ," | ||
2824 | " SAS Address 0x%llX\n", | ||
2825 | i, phy->att_dev_sas_addr, phy->dev_sas_addr); | ||
2826 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
2827 | "Rate = %x , type = %d\n", | ||
2828 | sas_phy->linkrate, phy->phy_type); | ||
2829 | |||
2596 | /* workaround for HW phy decoding error on 1.5g disk drive */ | 2830 | /* workaround for HW phy decoding error on 1.5g disk drive */ |
2597 | mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE6); | 2831 | mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE6); |
2598 | tmp = mvs_read_port_vsr_data(mvi, i); | 2832 | tmp = mvs_read_port_vsr_data(mvi, i); |
2599 | if (((phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >> | 2833 | if (((phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >> |
2600 | PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET) == | 2834 | PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET) == |
2601 | SAS_LINK_RATE_1_5_GBPS) | 2835 | SAS_LINK_RATE_1_5_GBPS) |
2602 | tmp &= ~PHY_MODE6_DTL_SPEED; | 2836 | tmp &= ~PHY_MODE6_LATECLK; |
2603 | else | 2837 | else |
2604 | tmp |= PHY_MODE6_DTL_SPEED; | 2838 | tmp |= PHY_MODE6_LATECLK; |
2605 | mvs_write_port_vsr_data(mvi, i, tmp); | 2839 | mvs_write_port_vsr_data(mvi, i, tmp); |
2606 | 2840 | ||
2607 | } | 2841 | } |
2842 | out_done: | ||
2608 | if (get_st) | 2843 | if (get_st) |
2609 | mvs_write_port_irq_stat(mvi, i, phy->irq_status); | 2844 | mvs_write_port_irq_stat(mvi, i, phy->irq_status); |
2610 | } | 2845 | } |
@@ -2629,6 +2864,11 @@ static void mvs_port_formed(struct asd_sas_phy *sas_phy) | |||
2629 | spin_unlock_irqrestore(&mvi->lock, flags); | 2864 | spin_unlock_irqrestore(&mvi->lock, flags); |
2630 | } | 2865 | } |
2631 | 2866 | ||
2867 | static int mvs_I_T_nexus_reset(struct domain_device *dev) | ||
2868 | { | ||
2869 | return TMF_RESP_FUNC_FAILED; | ||
2870 | } | ||
2871 | |||
2632 | static int __devinit mvs_hw_init(struct mvs_info *mvi) | 2872 | static int __devinit mvs_hw_init(struct mvs_info *mvi) |
2633 | { | 2873 | { |
2634 | void __iomem *regs = mvi->regs; | 2874 | void __iomem *regs = mvi->regs; |
@@ -2790,13 +3030,12 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi) | |||
2790 | /* enable CMD/CMPL_Q/RESP mode */ | 3030 | /* enable CMD/CMPL_Q/RESP mode */ |
2791 | mw32(PCS, PCS_SATA_RETRY | PCS_FIS_RX_EN | PCS_CMD_EN); | 3031 | mw32(PCS, PCS_SATA_RETRY | PCS_FIS_RX_EN | PCS_CMD_EN); |
2792 | 3032 | ||
2793 | /* re-enable interrupts globally */ | ||
2794 | mvs_hba_interrupt_enable(mvi); | ||
2795 | |||
2796 | /* enable completion queue interrupt */ | 3033 | /* enable completion queue interrupt */ |
2797 | tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM); | 3034 | tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM | CINT_SRS); |
2798 | mw32(INT_MASK, tmp); | 3035 | mw32(INT_MASK, tmp); |
2799 | 3036 | ||
3037 | /* Enable SRS interrupt */ | ||
3038 | mw32(INT_MASK_SRS, 0xFF); | ||
2800 | return 0; | 3039 | return 0; |
2801 | } | 3040 | } |
2802 | 3041 | ||
@@ -2870,6 +3109,8 @@ static int __devinit mvs_pci_init(struct pci_dev *pdev, | |||
2870 | 3109 | ||
2871 | mvs_print_info(mvi); | 3110 | mvs_print_info(mvi); |
2872 | 3111 | ||
3112 | mvs_hba_interrupt_enable(mvi); | ||
3113 | |||
2873 | scsi_scan_host(mvi->shost); | 3114 | scsi_scan_host(mvi->shost); |
2874 | 3115 | ||
2875 | return 0; | 3116 | return 0; |
@@ -2915,12 +3156,22 @@ static struct sas_domain_function_template mvs_transport_ops = { | |||
2915 | .lldd_execute_task = mvs_task_exec, | 3156 | .lldd_execute_task = mvs_task_exec, |
2916 | .lldd_control_phy = mvs_phy_control, | 3157 | .lldd_control_phy = mvs_phy_control, |
2917 | .lldd_abort_task = mvs_task_abort, | 3158 | .lldd_abort_task = mvs_task_abort, |
2918 | .lldd_port_formed = mvs_port_formed | 3159 | .lldd_port_formed = mvs_port_formed, |
3160 | .lldd_I_T_nexus_reset = mvs_I_T_nexus_reset, | ||
2919 | }; | 3161 | }; |
2920 | 3162 | ||
2921 | static struct pci_device_id __devinitdata mvs_pci_table[] = { | 3163 | static struct pci_device_id __devinitdata mvs_pci_table[] = { |
2922 | { PCI_VDEVICE(MARVELL, 0x6320), chip_6320 }, | 3164 | { PCI_VDEVICE(MARVELL, 0x6320), chip_6320 }, |
2923 | { PCI_VDEVICE(MARVELL, 0x6340), chip_6440 }, | 3165 | { PCI_VDEVICE(MARVELL, 0x6340), chip_6440 }, |
3166 | { | ||
3167 | .vendor = PCI_VENDOR_ID_MARVELL, | ||
3168 | .device = 0x6440, | ||
3169 | .subvendor = PCI_ANY_ID, | ||
3170 | .subdevice = 0x6480, | ||
3171 | .class = 0, | ||
3172 | .class_mask = 0, | ||
3173 | .driver_data = chip_6480, | ||
3174 | }, | ||
2924 | { PCI_VDEVICE(MARVELL, 0x6440), chip_6440 }, | 3175 | { PCI_VDEVICE(MARVELL, 0x6440), chip_6440 }, |
2925 | { PCI_VDEVICE(MARVELL, 0x6480), chip_6480 }, | 3176 | { PCI_VDEVICE(MARVELL, 0x6480), chip_6480 }, |
2926 | 3177 | ||
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index b9b09a704584..ed83cdb6e67d 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -294,7 +294,6 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) | |||
294 | } | 294 | } |
295 | 295 | ||
296 | if (sdev->request_queue) { | 296 | if (sdev->request_queue) { |
297 | bsg_unregister_queue(sdev->request_queue); | ||
298 | sdev->request_queue->queuedata = NULL; | 297 | sdev->request_queue->queuedata = NULL; |
299 | /* user context needed to free queue */ | 298 | /* user context needed to free queue */ |
300 | scsi_free_queue(sdev->request_queue); | 299 | scsi_free_queue(sdev->request_queue); |
@@ -858,6 +857,7 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
858 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) | 857 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) |
859 | return; | 858 | return; |
860 | 859 | ||
860 | bsg_unregister_queue(sdev->request_queue); | ||
861 | class_device_unregister(&sdev->sdev_classdev); | 861 | class_device_unregister(&sdev->sdev_classdev); |
862 | transport_remove_device(dev); | 862 | transport_remove_device(dev); |
863 | device_del(dev); | 863 | device_del(dev); |
diff --git a/fs/afs/cell.c b/fs/afs/cell.c index 788865df1bc9..584bb0f9c36a 100644 --- a/fs/afs/cell.c +++ b/fs/afs/cell.c | |||
@@ -138,6 +138,7 @@ struct afs_cell *afs_cell_create(const char *name, char *vllist) | |||
138 | cell = afs_cell_alloc(name, vllist); | 138 | cell = afs_cell_alloc(name, vllist); |
139 | if (IS_ERR(cell)) { | 139 | if (IS_ERR(cell)) { |
140 | _leave(" = %ld", PTR_ERR(cell)); | 140 | _leave(" = %ld", PTR_ERR(cell)); |
141 | up_write(&afs_cells_sem); | ||
141 | return cell; | 142 | return cell; |
142 | } | 143 | } |
143 | 144 | ||
diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h index 1b4ccf25b4d2..cac4b364cd40 100644 --- a/include/linux/iocontext.h +++ b/include/linux/iocontext.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define IOCONTEXT_H | 2 | #define IOCONTEXT_H |
3 | 3 | ||
4 | #include <linux/radix-tree.h> | 4 | #include <linux/radix-tree.h> |
5 | #include <linux/rcupdate.h> | ||
5 | 6 | ||
6 | /* | 7 | /* |
7 | * This is the per-process anticipatory I/O scheduler state. | 8 | * This is the per-process anticipatory I/O scheduler state. |
@@ -54,6 +55,8 @@ struct cfq_io_context { | |||
54 | 55 | ||
55 | void (*dtor)(struct io_context *); /* destructor */ | 56 | void (*dtor)(struct io_context *); /* destructor */ |
56 | void (*exit)(struct io_context *); /* called on task exit */ | 57 | void (*exit)(struct io_context *); /* called on task exit */ |
58 | |||
59 | struct rcu_head rcu_head; | ||
57 | }; | 60 | }; |
58 | 61 | ||
59 | /* | 62 | /* |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a2f003239c85..ee81906b5164 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -383,9 +383,11 @@ static inline void __napi_complete(struct napi_struct *n) | |||
383 | 383 | ||
384 | static inline void napi_complete(struct napi_struct *n) | 384 | static inline void napi_complete(struct napi_struct *n) |
385 | { | 385 | { |
386 | local_irq_disable(); | 386 | unsigned long flags; |
387 | |||
388 | local_irq_save(flags); | ||
387 | __napi_complete(n); | 389 | __napi_complete(n); |
388 | local_irq_enable(); | 390 | local_irq_restore(flags); |
389 | } | 391 | } |
390 | 392 | ||
391 | /** | 393 | /** |
@@ -1072,12 +1074,14 @@ static inline int netif_is_multiqueue(const struct net_device *dev) | |||
1072 | } | 1074 | } |
1073 | 1075 | ||
1074 | /* Use this variant when it is known for sure that it | 1076 | /* Use this variant when it is known for sure that it |
1075 | * is executing from interrupt context. | 1077 | * is executing from hardware interrupt context or with hardware interrupts |
1078 | * disabled. | ||
1076 | */ | 1079 | */ |
1077 | extern void dev_kfree_skb_irq(struct sk_buff *skb); | 1080 | extern void dev_kfree_skb_irq(struct sk_buff *skb); |
1078 | 1081 | ||
1079 | /* Use this variant in places where it could be invoked | 1082 | /* Use this variant in places where it could be invoked |
1080 | * either from interrupt or non-interrupt context. | 1083 | * from either hardware interrupt or other context, with hardware interrupts |
1084 | * either disabled or enabled. | ||
1081 | */ | 1085 | */ |
1082 | extern void dev_kfree_skb_any(struct sk_buff *skb); | 1086 | extern void dev_kfree_skb_any(struct sk_buff *skb); |
1083 | 1087 | ||
diff --git a/include/net/llc.h b/include/net/llc.h index f5024583fc8b..7940da1606e7 100644 --- a/include/net/llc.h +++ b/include/net/llc.h | |||
@@ -65,7 +65,6 @@ struct llc_sap { | |||
65 | 65 | ||
66 | extern struct list_head llc_sap_list; | 66 | extern struct list_head llc_sap_list; |
67 | extern rwlock_t llc_sap_list_lock; | 67 | extern rwlock_t llc_sap_list_lock; |
68 | extern unsigned char llc_station_mac_sa[ETH_ALEN]; | ||
69 | 68 | ||
70 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, | 69 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, |
71 | struct packet_type *pt, struct net_device *orig_dev); | 70 | struct packet_type *pt, struct net_device *orig_dev); |
diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h index 4a8f58b17e43..75b8e2968c9b 100644 --- a/include/net/llc_pdu.h +++ b/include/net/llc_pdu.h | |||
@@ -381,7 +381,7 @@ static inline void llc_pdu_init_as_xid_cmd(struct sk_buff *skb, | |||
381 | xid_info->fmt_id = LLC_XID_FMT_ID; /* 0x81 */ | 381 | xid_info->fmt_id = LLC_XID_FMT_ID; /* 0x81 */ |
382 | xid_info->type = svcs_supported; | 382 | xid_info->type = svcs_supported; |
383 | xid_info->rw = rx_window << 1; /* size of receive window */ | 383 | xid_info->rw = rx_window << 1; /* size of receive window */ |
384 | skb_put(skb, 3); | 384 | skb_put(skb, sizeof(struct llc_xid_info)); |
385 | } | 385 | } |
386 | 386 | ||
387 | /** | 387 | /** |
@@ -406,7 +406,7 @@ static inline void llc_pdu_init_as_xid_rsp(struct sk_buff *skb, | |||
406 | xid_info->fmt_id = LLC_XID_FMT_ID; | 406 | xid_info->fmt_id = LLC_XID_FMT_ID; |
407 | xid_info->type = svcs_supported; | 407 | xid_info->type = svcs_supported; |
408 | xid_info->rw = rx_window << 1; | 408 | xid_info->rw = rx_window << 1; |
409 | skb_put(skb, 3); | 409 | skb_put(skb, sizeof(struct llc_xid_info)); |
410 | } | 410 | } |
411 | 411 | ||
412 | /* LLC Type 2 FRMR response information field format */ | 412 | /* LLC Type 2 FRMR response information field format */ |
diff --git a/include/net/llc_sap.h b/include/net/llc_sap.h index 2c56dbece729..ed25bec2f648 100644 --- a/include/net/llc_sap.h +++ b/include/net/llc_sap.h | |||
@@ -1,5 +1,8 @@ | |||
1 | #ifndef LLC_SAP_H | 1 | #ifndef LLC_SAP_H |
2 | #define LLC_SAP_H | 2 | #define LLC_SAP_H |
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
3 | /* | 6 | /* |
4 | * Copyright (c) 1997 by Procom Technology,Inc. | 7 | * Copyright (c) 1997 by Procom Technology,Inc. |
5 | * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> | 8 | * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> |
@@ -19,8 +22,8 @@ struct sock; | |||
19 | extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb); | 22 | extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb); |
20 | extern void llc_save_primitive(struct sock *sk, struct sk_buff* skb, | 23 | extern void llc_save_primitive(struct sock *sk, struct sk_buff* skb, |
21 | unsigned char prim); | 24 | unsigned char prim); |
22 | extern struct sk_buff *llc_alloc_frame(struct sock *sk, | 25 | extern struct sk_buff *llc_alloc_frame(struct sock *sk, struct net_device *dev, |
23 | struct net_device *dev); | 26 | u8 type, u32 data_size); |
24 | 27 | ||
25 | extern void llc_build_and_send_test_pkt(struct llc_sap *sap, | 28 | extern void llc_build_and_send_test_pkt(struct llc_sap *sap, |
26 | struct sk_buff *skb, | 29 | struct sk_buff *skb, |
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index dbc81b965096..b33410abfd6b 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -374,17 +374,35 @@ static void vlan_sync_address(struct net_device *dev, | |||
374 | memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN); | 374 | memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN); |
375 | } | 375 | } |
376 | 376 | ||
377 | static void __vlan_device_event(struct net_device *dev, unsigned long event) | ||
378 | { | ||
379 | switch (event) { | ||
380 | case NETDEV_CHANGENAME: | ||
381 | vlan_proc_rem_dev(dev); | ||
382 | if (vlan_proc_add_dev(dev) < 0) | ||
383 | pr_warning("8021q: failed to change proc name for %s\n", | ||
384 | dev->name); | ||
385 | break; | ||
386 | } | ||
387 | } | ||
388 | |||
377 | static int vlan_device_event(struct notifier_block *unused, unsigned long event, | 389 | static int vlan_device_event(struct notifier_block *unused, unsigned long event, |
378 | void *ptr) | 390 | void *ptr) |
379 | { | 391 | { |
380 | struct net_device *dev = ptr; | 392 | struct net_device *dev = ptr; |
381 | struct vlan_group *grp = __vlan_find_group(dev->ifindex); | 393 | struct vlan_group *grp; |
382 | int i, flgs; | 394 | int i, flgs; |
383 | struct net_device *vlandev; | 395 | struct net_device *vlandev; |
384 | 396 | ||
385 | if (dev->nd_net != &init_net) | 397 | if (dev->nd_net != &init_net) |
386 | return NOTIFY_DONE; | 398 | return NOTIFY_DONE; |
387 | 399 | ||
400 | if (is_vlan_dev(dev)) { | ||
401 | __vlan_device_event(dev, event); | ||
402 | goto out; | ||
403 | } | ||
404 | |||
405 | grp = __vlan_find_group(dev->ifindex); | ||
388 | if (!grp) | 406 | if (!grp) |
389 | goto out; | 407 | goto out; |
390 | 408 | ||
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 73efcc715ccb..51271aea402b 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
@@ -45,4 +45,9 @@ void vlan_netlink_fini(void); | |||
45 | 45 | ||
46 | extern struct rtnl_link_ops vlan_link_ops; | 46 | extern struct rtnl_link_ops vlan_link_ops; |
47 | 47 | ||
48 | static inline int is_vlan_dev(struct net_device *dev) | ||
49 | { | ||
50 | return dev->priv_flags & IFF_802_1Q_VLAN; | ||
51 | } | ||
52 | |||
48 | #endif /* !(__BEN_VLAN_802_1Q_INC__) */ | 53 | #endif /* !(__BEN_VLAN_802_1Q_INC__) */ |
diff --git a/net/8021q/vlanproc.c b/net/8021q/vlanproc.c index 146cfb0e9882..9671aa51af2c 100644 --- a/net/8021q/vlanproc.c +++ b/net/8021q/vlanproc.c | |||
@@ -210,11 +210,6 @@ int vlan_proc_rem_dev(struct net_device *vlandev) | |||
210 | * The following few functions build the content of /proc/net/vlan/config | 210 | * The following few functions build the content of /proc/net/vlan/config |
211 | */ | 211 | */ |
212 | 212 | ||
213 | static inline int is_vlan_dev(struct net_device *dev) | ||
214 | { | ||
215 | return dev->priv_flags & IFF_802_1Q_VLAN; | ||
216 | } | ||
217 | |||
218 | /* start read of /proc/net/vlan/config */ | 213 | /* start read of /proc/net/vlan/config */ |
219 | static void *vlan_seq_start(struct seq_file *seq, loff_t *pos) | 214 | static void *vlan_seq_start(struct seq_file *seq, loff_t *pos) |
220 | __acquires(dev_base_lock) | 215 | __acquires(dev_base_lock) |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 1220d8a41eb5..d366423c8392 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -53,6 +53,30 @@ | |||
53 | /* Bluetooth sockets */ | 53 | /* Bluetooth sockets */ |
54 | #define BT_MAX_PROTO 8 | 54 | #define BT_MAX_PROTO 8 |
55 | static struct net_proto_family *bt_proto[BT_MAX_PROTO]; | 55 | static struct net_proto_family *bt_proto[BT_MAX_PROTO]; |
56 | |||
57 | static struct lock_class_key bt_slock_key[BT_MAX_PROTO]; | ||
58 | static struct lock_class_key bt_lock_key[BT_MAX_PROTO]; | ||
59 | static const char *bt_key_strings[BT_MAX_PROTO] = { | ||
60 | "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP", | ||
61 | "sk_lock-AF_BLUETOOTH-BTPROTO_HCI", | ||
62 | "sk_lock-AF_BLUETOOTH-BTPROTO_SCO", | ||
63 | "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM", | ||
64 | "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP", | ||
65 | "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP", | ||
66 | "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP", | ||
67 | "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP", | ||
68 | }; | ||
69 | |||
70 | static const char *bt_slock_key_strings[BT_MAX_PROTO] = { | ||
71 | "slock-AF_BLUETOOTH-BTPROTO_L2CAP", | ||
72 | "slock-AF_BLUETOOTH-BTPROTO_HCI", | ||
73 | "slock-AF_BLUETOOTH-BTPROTO_SCO", | ||
74 | "slock-AF_BLUETOOTH-BTPROTO_RFCOMM", | ||
75 | "slock-AF_BLUETOOTH-BTPROTO_BNEP", | ||
76 | "slock-AF_BLUETOOTH-BTPROTO_CMTP", | ||
77 | "slock-AF_BLUETOOTH-BTPROTO_HIDP", | ||
78 | "slock-AF_BLUETOOTH-BTPROTO_AVDTP", | ||
79 | }; | ||
56 | static DEFINE_RWLOCK(bt_proto_lock); | 80 | static DEFINE_RWLOCK(bt_proto_lock); |
57 | 81 | ||
58 | int bt_sock_register(int proto, struct net_proto_family *ops) | 82 | int bt_sock_register(int proto, struct net_proto_family *ops) |
@@ -95,6 +119,21 @@ int bt_sock_unregister(int proto) | |||
95 | } | 119 | } |
96 | EXPORT_SYMBOL(bt_sock_unregister); | 120 | EXPORT_SYMBOL(bt_sock_unregister); |
97 | 121 | ||
122 | static void bt_reclassify_sock_lock(struct socket *sock, int proto) | ||
123 | { | ||
124 | struct sock *sk = sock->sk; | ||
125 | |||
126 | if (!sk) | ||
127 | return; | ||
128 | BUG_ON(sock_owned_by_user(sk)); | ||
129 | |||
130 | sock_lock_init_class_and_name(sk, | ||
131 | bt_slock_key_strings[proto], | ||
132 | &bt_slock_key[proto], | ||
133 | bt_key_strings[proto], | ||
134 | &bt_lock_key[proto]); | ||
135 | } | ||
136 | |||
98 | static int bt_sock_create(struct net *net, struct socket *sock, int proto) | 137 | static int bt_sock_create(struct net *net, struct socket *sock, int proto) |
99 | { | 138 | { |
100 | int err; | 139 | int err; |
@@ -117,6 +156,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto) | |||
117 | 156 | ||
118 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { | 157 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { |
119 | err = bt_proto[proto]->create(net, sock, proto); | 158 | err = bt_proto[proto]->create(net, sock, proto); |
159 | bt_reclassify_sock_lock(sock, proto); | ||
120 | module_put(bt_proto[proto]->owner); | 160 | module_put(bt_proto[proto]->owner); |
121 | } | 161 | } |
122 | 162 | ||
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index b5d4019d3572..1d36c093523b 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -84,7 +84,7 @@ static struct hci_sec_filter hci_sec_filter = { | |||
84 | }; | 84 | }; |
85 | 85 | ||
86 | static struct bt_sock_list hci_sk_list = { | 86 | static struct bt_sock_list hci_sk_list = { |
87 | .lock = RW_LOCK_UNLOCKED | 87 | .lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock) |
88 | }; | 88 | }; |
89 | 89 | ||
90 | /* Send frame to RAW socket */ | 90 | /* Send frame to RAW socket */ |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 34f8bf98bc05..2957df4b6c0b 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -62,7 +62,7 @@ static u32 l2cap_feat_mask = 0x0000; | |||
62 | static const struct proto_ops l2cap_sock_ops; | 62 | static const struct proto_ops l2cap_sock_ops; |
63 | 63 | ||
64 | static struct bt_sock_list l2cap_sk_list = { | 64 | static struct bt_sock_list l2cap_sk_list = { |
65 | .lock = RW_LOCK_UNLOCKED | 65 | .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock) |
66 | }; | 66 | }; |
67 | 67 | ||
68 | static void __l2cap_sock_close(struct sock *sk, int reason); | 68 | static void __l2cap_sock_close(struct sock *sk, int reason); |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 0c2c93735e93..eb62558e9b09 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -423,8 +423,8 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err) | |||
423 | 423 | ||
424 | rfcomm_dlc_lock(d); | 424 | rfcomm_dlc_lock(d); |
425 | d->state = BT_CLOSED; | 425 | d->state = BT_CLOSED; |
426 | d->state_change(d, err); | ||
427 | rfcomm_dlc_unlock(d); | 426 | rfcomm_dlc_unlock(d); |
427 | d->state_change(d, err); | ||
428 | 428 | ||
429 | skb_queue_purge(&d->tx_queue); | 429 | skb_queue_purge(&d->tx_queue); |
430 | rfcomm_dlc_unlink(d); | 430 | rfcomm_dlc_unlink(d); |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index c46d51035e77..af4e3934ee84 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -60,7 +60,7 @@ | |||
60 | static const struct proto_ops rfcomm_sock_ops; | 60 | static const struct proto_ops rfcomm_sock_ops; |
61 | 61 | ||
62 | static struct bt_sock_list rfcomm_sk_list = { | 62 | static struct bt_sock_list rfcomm_sk_list = { |
63 | .lock = RW_LOCK_UNLOCKED | 63 | .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock) |
64 | }; | 64 | }; |
65 | 65 | ||
66 | static void rfcomm_sock_close(struct sock *sk); | 66 | static void rfcomm_sock_close(struct sock *sk); |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index e4c779bb8d76..c3f749abb2d0 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -570,12 +570,7 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err) | |||
570 | return; | 570 | return; |
571 | 571 | ||
572 | rfcomm_dev_del(dev); | 572 | rfcomm_dev_del(dev); |
573 | /* We have to drop DLC lock here, otherwise | ||
574 | rfcomm_dev_put() will dead lock if it's | ||
575 | the last reference. */ | ||
576 | rfcomm_dlc_unlock(dlc); | ||
577 | rfcomm_dev_put(dev); | 573 | rfcomm_dev_put(dev); |
578 | rfcomm_dlc_lock(dlc); | ||
579 | } | 574 | } |
580 | } else | 575 | } else |
581 | tty_hangup(dev->tty); | 576 | tty_hangup(dev->tty); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index b91d3c81a73c..cd887cdca426 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -58,7 +58,7 @@ | |||
58 | static const struct proto_ops sco_sock_ops; | 58 | static const struct proto_ops sco_sock_ops; |
59 | 59 | ||
60 | static struct bt_sock_list sco_sk_list = { | 60 | static struct bt_sock_list sco_sk_list = { |
61 | .lock = RW_LOCK_UNLOCKED | 61 | .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock) |
62 | }; | 62 | }; |
63 | 63 | ||
64 | static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent); | 64 | static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent); |
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index f3ceca31aa45..4e73e5708e70 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
@@ -336,7 +336,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
336 | struct scatterlist *asg; | 336 | struct scatterlist *asg; |
337 | int err = -EINVAL; | 337 | int err = -EINVAL; |
338 | 338 | ||
339 | if (!pskb_may_pull(skb, sizeof(*esph))) | 339 | if (!pskb_may_pull(skb, sizeof(*esph) + crypto_aead_ivsize(aead))) |
340 | goto out; | 340 | goto out; |
341 | 341 | ||
342 | if (elen <= 0) | 342 | if (elen <= 0) |
diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 724d69aed031..a0a3c78cb5e0 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c | |||
@@ -86,7 +86,10 @@ EXPORT_SYMBOL(inet_frags_fini); | |||
86 | void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f) | 86 | void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f) |
87 | { | 87 | { |
88 | nf->low_thresh = 0; | 88 | nf->low_thresh = 0; |
89 | |||
90 | local_bh_disable(); | ||
89 | inet_frag_evictor(nf, f); | 91 | inet_frag_evictor(nf, f); |
92 | local_bh_enable(); | ||
90 | } | 93 | } |
91 | EXPORT_SYMBOL(inet_frags_exit_net); | 94 | EXPORT_SYMBOL(inet_frags_exit_net); |
92 | 95 | ||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 0b3b328d82db..a4506c8cfef0 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
@@ -85,7 +85,7 @@ int ip_forward(struct sk_buff *skb) | |||
85 | if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) | 85 | if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) |
86 | goto sr_failed; | 86 | goto sr_failed; |
87 | 87 | ||
88 | if (unlikely(skb->len > dst_mtu(&rt->u.dst) && | 88 | if (unlikely(skb->len > dst_mtu(&rt->u.dst) && !skb_is_gso(skb) && |
89 | (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) { | 89 | (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) { |
90 | IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); | 90 | IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); |
91 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, | 91 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index fe05da41d6ba..4dc162894cb2 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
@@ -588,11 +588,9 @@ static int __init ip_queue_init(void) | |||
588 | } | 588 | } |
589 | 589 | ||
590 | #ifdef CONFIG_PROC_FS | 590 | #ifdef CONFIG_PROC_FS |
591 | proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net); | 591 | proc = proc_create(IPQ_PROC_FS_NAME, 0, init_net.proc_net, |
592 | if (proc) { | 592 | &ip_queue_proc_fops); |
593 | proc->owner = THIS_MODULE; | 593 | if (!proc) { |
594 | proc->proc_fops = &ip_queue_proc_fops; | ||
595 | } else { | ||
596 | printk(KERN_ERR "ip_queue: failed to create proc entry\n"); | 594 | printk(KERN_ERR "ip_queue: failed to create proc entry\n"); |
597 | goto cleanup_ipqnl; | 595 | goto cleanup_ipqnl; |
598 | } | 596 | } |
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index c6cf84c77611..52926c8e3cc1 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | |||
@@ -167,14 +167,13 @@ clusterip_config_init(struct ipt_clusterip_tgt_info *i, __be32 ip, | |||
167 | 167 | ||
168 | /* create proc dir entry */ | 168 | /* create proc dir entry */ |
169 | sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip)); | 169 | sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip)); |
170 | c->pde = create_proc_entry(buffer, S_IWUSR|S_IRUSR, | 170 | c->pde = proc_create(buffer, S_IWUSR|S_IRUSR, |
171 | clusterip_procdir); | 171 | clusterip_procdir, &clusterip_proc_fops); |
172 | if (!c->pde) { | 172 | if (!c->pde) { |
173 | kfree(c); | 173 | kfree(c); |
174 | return NULL; | 174 | return NULL; |
175 | } | 175 | } |
176 | } | 176 | } |
177 | c->pde->proc_fops = &clusterip_proc_fops; | ||
178 | c->pde->data = c; | 177 | c->pde->data = c; |
179 | #endif | 178 | #endif |
180 | 179 | ||
diff --git a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c index 8e8f0425a8ed..50e06690eb5b 100644 --- a/net/ipv4/netfilter/ipt_recent.c +++ b/net/ipv4/netfilter/ipt_recent.c | |||
@@ -276,12 +276,11 @@ recent_mt_check(const char *tablename, const void *ip, | |||
276 | for (i = 0; i < ip_list_hash_size; i++) | 276 | for (i = 0; i < ip_list_hash_size; i++) |
277 | INIT_LIST_HEAD(&t->iphash[i]); | 277 | INIT_LIST_HEAD(&t->iphash[i]); |
278 | #ifdef CONFIG_PROC_FS | 278 | #ifdef CONFIG_PROC_FS |
279 | t->proc = create_proc_entry(t->name, ip_list_perms, proc_dir); | 279 | t->proc = proc_create(t->name, ip_list_perms, proc_dir, &recent_fops); |
280 | if (t->proc == NULL) { | 280 | if (t->proc == NULL) { |
281 | kfree(t); | 281 | kfree(t); |
282 | goto out; | 282 | goto out; |
283 | } | 283 | } |
284 | t->proc->proc_fops = &recent_fops; | ||
285 | t->proc->uid = ip_list_uid; | 284 | t->proc->uid = ip_list_uid; |
286 | t->proc->gid = ip_list_gid; | 285 | t->proc->gid = ip_list_gid; |
287 | t->proc->data = t; | 286 | t->proc->data = t; |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c index 089252e82c01..f500b0fdaef4 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c | |||
@@ -395,13 +395,10 @@ int __init nf_conntrack_ipv4_compat_init(void) | |||
395 | if (!proc_exp) | 395 | if (!proc_exp) |
396 | goto err2; | 396 | goto err2; |
397 | 397 | ||
398 | proc_stat = create_proc_entry("ip_conntrack", S_IRUGO, init_net.proc_net_stat); | 398 | proc_stat = proc_create("ip_conntrack", S_IRUGO, |
399 | init_net.proc_net_stat, &ct_cpu_seq_fops); | ||
399 | if (!proc_stat) | 400 | if (!proc_stat) |
400 | goto err3; | 401 | goto err3; |
401 | |||
402 | proc_stat->proc_fops = &ct_cpu_seq_fops; | ||
403 | proc_stat->owner = THIS_MODULE; | ||
404 | |||
405 | return 0; | 402 | return 0; |
406 | 403 | ||
407 | err3: | 404 | err3: |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 7ea1b67b6de1..1704c1474ea1 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1556,14 +1556,14 @@ static void *udp_seq_start(struct seq_file *seq, loff_t *pos) | |||
1556 | __acquires(udp_hash_lock) | 1556 | __acquires(udp_hash_lock) |
1557 | { | 1557 | { |
1558 | read_lock(&udp_hash_lock); | 1558 | read_lock(&udp_hash_lock); |
1559 | return *pos ? udp_get_idx(seq, *pos-1) : (void *)1; | 1559 | return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN; |
1560 | } | 1560 | } |
1561 | 1561 | ||
1562 | static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 1562 | static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
1563 | { | 1563 | { |
1564 | struct sock *sk; | 1564 | struct sock *sk; |
1565 | 1565 | ||
1566 | if (v == (void *)1) | 1566 | if (v == SEQ_START_TOKEN) |
1567 | sk = udp_get_idx(seq, 0); | 1567 | sk = udp_get_idx(seq, 0); |
1568 | else | 1568 | else |
1569 | sk = udp_get_next(seq, v); | 1569 | sk = udp_get_next(seq, v); |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 101e0e70ba27..e7a1882db048 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -776,6 +776,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i | |||
776 | struct inet6_dev *idev = ifp->idev; | 776 | struct inet6_dev *idev = ifp->idev; |
777 | struct in6_addr addr, *tmpaddr; | 777 | struct in6_addr addr, *tmpaddr; |
778 | unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_cstamp, tmp_tstamp; | 778 | unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_cstamp, tmp_tstamp; |
779 | unsigned long regen_advance; | ||
779 | int tmp_plen; | 780 | int tmp_plen; |
780 | int ret = 0; | 781 | int ret = 0; |
781 | int max_addresses; | 782 | int max_addresses; |
@@ -836,8 +837,23 @@ retry: | |||
836 | tmp_tstamp = ifp->tstamp; | 837 | tmp_tstamp = ifp->tstamp; |
837 | spin_unlock_bh(&ifp->lock); | 838 | spin_unlock_bh(&ifp->lock); |
838 | 839 | ||
840 | regen_advance = idev->cnf.regen_max_retry * | ||
841 | idev->cnf.dad_transmits * | ||
842 | idev->nd_parms->retrans_time / HZ; | ||
839 | write_unlock(&idev->lock); | 843 | write_unlock(&idev->lock); |
840 | 844 | ||
845 | /* A temporary address is created only if this calculated Preferred | ||
846 | * Lifetime is greater than REGEN_ADVANCE time units. In particular, | ||
847 | * an implementation must not create a temporary address with a zero | ||
848 | * Preferred Lifetime. | ||
849 | */ | ||
850 | if (tmp_prefered_lft <= regen_advance) { | ||
851 | in6_ifa_put(ifp); | ||
852 | in6_dev_put(idev); | ||
853 | ret = -1; | ||
854 | goto out; | ||
855 | } | ||
856 | |||
841 | addr_flags = IFA_F_TEMPORARY; | 857 | addr_flags = IFA_F_TEMPORARY; |
842 | /* set in addrconf_prefix_rcv() */ | 858 | /* set in addrconf_prefix_rcv() */ |
843 | if (ifp->flags & IFA_F_OPTIMISTIC) | 859 | if (ifp->flags & IFA_F_OPTIMISTIC) |
@@ -1831,6 +1847,9 @@ ok: | |||
1831 | * lifetimes of an existing temporary address | 1847 | * lifetimes of an existing temporary address |
1832 | * when processing a Prefix Information Option. | 1848 | * when processing a Prefix Information Option. |
1833 | */ | 1849 | */ |
1850 | if (ifp != ift->ifpub) | ||
1851 | continue; | ||
1852 | |||
1834 | spin_lock(&ift->lock); | 1853 | spin_lock(&ift->lock); |
1835 | flags = ift->flags; | 1854 | flags = ift->flags; |
1836 | if (ift->valid_lft > valid_lft && | 1855 | if (ift->valid_lft > valid_lft && |
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 0ec1402320ea..c6bb4c6d24b3 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -282,7 +282,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
282 | struct scatterlist *sg; | 282 | struct scatterlist *sg; |
283 | struct scatterlist *asg; | 283 | struct scatterlist *asg; |
284 | 284 | ||
285 | if (!pskb_may_pull(skb, sizeof(*esph))) { | 285 | if (!pskb_may_pull(skb, sizeof(*esph) + crypto_aead_ivsize(aead))) { |
286 | ret = -EINVAL; | 286 | ret = -EINVAL; |
287 | goto out; | 287 | goto out; |
288 | } | 288 | } |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 121d517bf91c..f204a7275a0d 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -436,10 +436,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
436 | } | 436 | } |
437 | 437 | ||
438 | if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6)) | 438 | if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6)) |
439 | goto out; | 439 | goto out_dst_release; |
440 | 440 | ||
441 | if (ip6_dst_lookup(sk, &dst2, &fl)) | 441 | if (ip6_dst_lookup(sk, &dst2, &fl)) |
442 | goto out; | 442 | goto out_dst_release; |
443 | 443 | ||
444 | err = xfrm_lookup(&dst2, &fl, sk, XFRM_LOOKUP_ICMP); | 444 | err = xfrm_lookup(&dst2, &fl, sk, XFRM_LOOKUP_ICMP); |
445 | if (err == -ENOENT) { | 445 | if (err == -ENOENT) { |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index 178aebc0427a..98ab4f459905 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -239,8 +239,7 @@ int ip6_mc_input(struct sk_buff *skb) | |||
239 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INMCASTPKTS); | 239 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INMCASTPKTS); |
240 | 240 | ||
241 | hdr = ipv6_hdr(skb); | 241 | hdr = ipv6_hdr(skb); |
242 | deliver = unlikely(skb->dev->flags & (IFF_PROMISC|IFF_ALLMULTI)) || | 242 | deliver = ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, NULL); |
243 | ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, NULL); | ||
244 | 243 | ||
245 | /* | 244 | /* |
246 | * IPv6 multicast router mode isnt currently supported. | 245 | * IPv6 multicast router mode isnt currently supported. |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index cc2f9afcf808..8d366f7f2a9a 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
@@ -591,11 +591,9 @@ static int __init ip6_queue_init(void) | |||
591 | } | 591 | } |
592 | 592 | ||
593 | #ifdef CONFIG_PROC_FS | 593 | #ifdef CONFIG_PROC_FS |
594 | proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net); | 594 | proc = proc_create(IPQ_PROC_FS_NAME, 0, init_net.proc_net, |
595 | if (proc) { | 595 | &ip6_queue_proc_fops); |
596 | proc->owner = THIS_MODULE; | 596 | if (!proc) { |
597 | proc->proc_fops = &ip6_queue_proc_fops; | ||
598 | } else { | ||
599 | printk(KERN_ERR "ip6_queue: failed to create proc entry\n"); | 597 | printk(KERN_ERR "ip6_queue: failed to create proc entry\n"); |
600 | goto cleanup_ipqnl; | 598 | goto cleanup_ipqnl; |
601 | } | 599 | } |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 2a0d698b24d5..24c0d03095bf 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -171,7 +171,9 @@ static __inline__ void fq_kill(struct nf_ct_frag6_queue *fq) | |||
171 | 171 | ||
172 | static void nf_ct_frag6_evictor(void) | 172 | static void nf_ct_frag6_evictor(void) |
173 | { | 173 | { |
174 | local_bh_disable(); | ||
174 | inet_frag_evictor(&nf_init_frags, &nf_frags); | 175 | inet_frag_evictor(&nf_init_frags, &nf_frags); |
176 | local_bh_enable(); | ||
175 | } | 177 | } |
176 | 178 | ||
177 | static void nf_ct_frag6_expire(unsigned long data) | 179 | static void nf_ct_frag6_expire(unsigned long data) |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 46cf962f7f88..8c50eb430c19 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -155,6 +155,9 @@ static int llc_ui_create(struct net *net, struct socket *sock, int protocol) | |||
155 | struct sock *sk; | 155 | struct sock *sk; |
156 | int rc = -ESOCKTNOSUPPORT; | 156 | int rc = -ESOCKTNOSUPPORT; |
157 | 157 | ||
158 | if (!capable(CAP_NET_RAW)) | ||
159 | return -EPERM; | ||
160 | |||
158 | if (net != &init_net) | 161 | if (net != &init_net) |
159 | return -EAFNOSUPPORT; | 162 | return -EAFNOSUPPORT; |
160 | 163 | ||
diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c index 860140caa6e0..71a00225bdb3 100644 --- a/net/llc/llc_c_ac.c +++ b/net/llc/llc_c_ac.c | |||
@@ -198,7 +198,7 @@ int llc_conn_ac_send_disc_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) | |||
198 | { | 198 | { |
199 | int rc = -ENOBUFS; | 199 | int rc = -ENOBUFS; |
200 | struct llc_sock *llc = llc_sk(sk); | 200 | struct llc_sock *llc = llc_sk(sk); |
201 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 201 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
202 | 202 | ||
203 | if (nskb) { | 203 | if (nskb) { |
204 | struct llc_sap *sap = llc->sap; | 204 | struct llc_sap *sap = llc->sap; |
@@ -223,7 +223,7 @@ int llc_conn_ac_send_dm_rsp_f_set_p(struct sock *sk, struct sk_buff *skb) | |||
223 | { | 223 | { |
224 | int rc = -ENOBUFS; | 224 | int rc = -ENOBUFS; |
225 | struct llc_sock *llc = llc_sk(sk); | 225 | struct llc_sock *llc = llc_sk(sk); |
226 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 226 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
227 | 227 | ||
228 | if (nskb) { | 228 | if (nskb) { |
229 | struct llc_sap *sap = llc->sap; | 229 | struct llc_sap *sap = llc->sap; |
@@ -249,7 +249,7 @@ int llc_conn_ac_send_dm_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) | |||
249 | { | 249 | { |
250 | int rc = -ENOBUFS; | 250 | int rc = -ENOBUFS; |
251 | struct llc_sock *llc = llc_sk(sk); | 251 | struct llc_sock *llc = llc_sk(sk); |
252 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 252 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
253 | 253 | ||
254 | if (nskb) { | 254 | if (nskb) { |
255 | struct llc_sap *sap = llc->sap; | 255 | struct llc_sap *sap = llc->sap; |
@@ -282,7 +282,8 @@ int llc_conn_ac_send_frmr_rsp_f_set_x(struct sock *sk, struct sk_buff *skb) | |||
282 | llc_pdu_decode_pf_bit(skb, &f_bit); | 282 | llc_pdu_decode_pf_bit(skb, &f_bit); |
283 | else | 283 | else |
284 | f_bit = 0; | 284 | f_bit = 0; |
285 | nskb = llc_alloc_frame(sk, llc->dev); | 285 | nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, |
286 | sizeof(struct llc_frmr_info)); | ||
286 | if (nskb) { | 287 | if (nskb) { |
287 | struct llc_sap *sap = llc->sap; | 288 | struct llc_sap *sap = llc->sap; |
288 | 289 | ||
@@ -306,7 +307,8 @@ int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock *sk, struct sk_buff *skb) | |||
306 | { | 307 | { |
307 | int rc = -ENOBUFS; | 308 | int rc = -ENOBUFS; |
308 | struct llc_sock *llc = llc_sk(sk); | 309 | struct llc_sock *llc = llc_sk(sk); |
309 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 310 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, |
311 | sizeof(struct llc_frmr_info)); | ||
310 | 312 | ||
311 | if (nskb) { | 313 | if (nskb) { |
312 | struct llc_sap *sap = llc->sap; | 314 | struct llc_sap *sap = llc->sap; |
@@ -336,7 +338,8 @@ int llc_conn_ac_resend_frmr_rsp_f_set_p(struct sock *sk, struct sk_buff *skb) | |||
336 | struct llc_sock *llc = llc_sk(sk); | 338 | struct llc_sock *llc = llc_sk(sk); |
337 | 339 | ||
338 | llc_pdu_decode_pf_bit(skb, &f_bit); | 340 | llc_pdu_decode_pf_bit(skb, &f_bit); |
339 | nskb = llc_alloc_frame(sk, llc->dev); | 341 | nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, |
342 | sizeof(struct llc_frmr_info)); | ||
340 | if (nskb) { | 343 | if (nskb) { |
341 | struct llc_sap *sap = llc->sap; | 344 | struct llc_sap *sap = llc->sap; |
342 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); | 345 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); |
@@ -424,7 +427,7 @@ int llc_conn_ac_resend_i_xxx_x_set_0_or_send_rr(struct sock *sk, | |||
424 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); | 427 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); |
425 | int rc = -ENOBUFS; | 428 | int rc = -ENOBUFS; |
426 | struct llc_sock *llc = llc_sk(sk); | 429 | struct llc_sock *llc = llc_sk(sk); |
427 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 430 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
428 | 431 | ||
429 | if (nskb) { | 432 | if (nskb) { |
430 | struct llc_sap *sap = llc->sap; | 433 | struct llc_sap *sap = llc->sap; |
@@ -459,7 +462,7 @@ int llc_conn_ac_send_rej_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) | |||
459 | { | 462 | { |
460 | int rc = -ENOBUFS; | 463 | int rc = -ENOBUFS; |
461 | struct llc_sock *llc = llc_sk(sk); | 464 | struct llc_sock *llc = llc_sk(sk); |
462 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 465 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
463 | 466 | ||
464 | if (nskb) { | 467 | if (nskb) { |
465 | struct llc_sap *sap = llc->sap; | 468 | struct llc_sap *sap = llc->sap; |
@@ -483,7 +486,7 @@ int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) | |||
483 | { | 486 | { |
484 | int rc = -ENOBUFS; | 487 | int rc = -ENOBUFS; |
485 | struct llc_sock *llc = llc_sk(sk); | 488 | struct llc_sock *llc = llc_sk(sk); |
486 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 489 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
487 | 490 | ||
488 | if (nskb) { | 491 | if (nskb) { |
489 | struct llc_sap *sap = llc->sap; | 492 | struct llc_sap *sap = llc->sap; |
@@ -507,7 +510,7 @@ int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) | |||
507 | { | 510 | { |
508 | int rc = -ENOBUFS; | 511 | int rc = -ENOBUFS; |
509 | struct llc_sock *llc = llc_sk(sk); | 512 | struct llc_sock *llc = llc_sk(sk); |
510 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 513 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
511 | 514 | ||
512 | if (nskb) { | 515 | if (nskb) { |
513 | struct llc_sap *sap = llc->sap; | 516 | struct llc_sap *sap = llc->sap; |
@@ -531,7 +534,7 @@ int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) | |||
531 | { | 534 | { |
532 | int rc = -ENOBUFS; | 535 | int rc = -ENOBUFS; |
533 | struct llc_sock *llc = llc_sk(sk); | 536 | struct llc_sock *llc = llc_sk(sk); |
534 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 537 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
535 | 538 | ||
536 | if (nskb) { | 539 | if (nskb) { |
537 | struct llc_sap *sap = llc->sap; | 540 | struct llc_sap *sap = llc->sap; |
@@ -555,7 +558,7 @@ int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) | |||
555 | { | 558 | { |
556 | int rc = -ENOBUFS; | 559 | int rc = -ENOBUFS; |
557 | struct llc_sock *llc = llc_sk(sk); | 560 | struct llc_sock *llc = llc_sk(sk); |
558 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 561 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
559 | 562 | ||
560 | if (nskb) { | 563 | if (nskb) { |
561 | struct llc_sap *sap = llc->sap; | 564 | struct llc_sap *sap = llc->sap; |
@@ -579,7 +582,7 @@ int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) | |||
579 | { | 582 | { |
580 | int rc = -ENOBUFS; | 583 | int rc = -ENOBUFS; |
581 | struct llc_sock *llc = llc_sk(sk); | 584 | struct llc_sock *llc = llc_sk(sk); |
582 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 585 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
583 | 586 | ||
584 | if (nskb) { | 587 | if (nskb) { |
585 | struct llc_sap *sap = llc->sap; | 588 | struct llc_sap *sap = llc->sap; |
@@ -615,7 +618,7 @@ int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) | |||
615 | { | 618 | { |
616 | int rc = -ENOBUFS; | 619 | int rc = -ENOBUFS; |
617 | struct llc_sock *llc = llc_sk(sk); | 620 | struct llc_sock *llc = llc_sk(sk); |
618 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 621 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
619 | 622 | ||
620 | if (nskb) { | 623 | if (nskb) { |
621 | struct llc_sap *sap = llc->sap; | 624 | struct llc_sap *sap = llc->sap; |
@@ -639,7 +642,7 @@ int llc_conn_ac_send_rr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) | |||
639 | { | 642 | { |
640 | int rc = -ENOBUFS; | 643 | int rc = -ENOBUFS; |
641 | struct llc_sock *llc = llc_sk(sk); | 644 | struct llc_sock *llc = llc_sk(sk); |
642 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 645 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
643 | 646 | ||
644 | if (nskb) { | 647 | if (nskb) { |
645 | struct llc_sap *sap = llc->sap; | 648 | struct llc_sap *sap = llc->sap; |
@@ -663,7 +666,7 @@ int llc_conn_ac_send_rr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) | |||
663 | { | 666 | { |
664 | int rc = -ENOBUFS; | 667 | int rc = -ENOBUFS; |
665 | struct llc_sock *llc = llc_sk(sk); | 668 | struct llc_sock *llc = llc_sk(sk); |
666 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 669 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
667 | 670 | ||
668 | if (nskb) { | 671 | if (nskb) { |
669 | struct llc_sap *sap = llc->sap; | 672 | struct llc_sap *sap = llc->sap; |
@@ -688,7 +691,7 @@ int llc_conn_ac_send_ack_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) | |||
688 | { | 691 | { |
689 | int rc = -ENOBUFS; | 692 | int rc = -ENOBUFS; |
690 | struct llc_sock *llc = llc_sk(sk); | 693 | struct llc_sock *llc = llc_sk(sk); |
691 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 694 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
692 | 695 | ||
693 | if (nskb) { | 696 | if (nskb) { |
694 | struct llc_sap *sap = llc->sap; | 697 | struct llc_sap *sap = llc->sap; |
@@ -712,7 +715,7 @@ int llc_conn_ac_send_rr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) | |||
712 | { | 715 | { |
713 | int rc = -ENOBUFS; | 716 | int rc = -ENOBUFS; |
714 | struct llc_sock *llc = llc_sk(sk); | 717 | struct llc_sock *llc = llc_sk(sk); |
715 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 718 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
716 | 719 | ||
717 | if (nskb) { | 720 | if (nskb) { |
718 | struct llc_sap *sap = llc->sap; | 721 | struct llc_sap *sap = llc->sap; |
@@ -736,7 +739,7 @@ int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) | |||
736 | { | 739 | { |
737 | int rc = -ENOBUFS; | 740 | int rc = -ENOBUFS; |
738 | struct llc_sock *llc = llc_sk(sk); | 741 | struct llc_sock *llc = llc_sk(sk); |
739 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 742 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
740 | 743 | ||
741 | if (nskb) { | 744 | if (nskb) { |
742 | struct llc_sap *sap = llc->sap; | 745 | struct llc_sap *sap = llc->sap; |
@@ -770,7 +773,7 @@ int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) | |||
770 | { | 773 | { |
771 | int rc = -ENOBUFS; | 774 | int rc = -ENOBUFS; |
772 | struct llc_sock *llc = llc_sk(sk); | 775 | struct llc_sock *llc = llc_sk(sk); |
773 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 776 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
774 | 777 | ||
775 | if (nskb) { | 778 | if (nskb) { |
776 | struct llc_sap *sap = llc->sap; | 779 | struct llc_sap *sap = llc->sap; |
@@ -799,7 +802,7 @@ int llc_conn_ac_send_ua_rsp_f_set_p(struct sock *sk, struct sk_buff *skb) | |||
799 | u8 f_bit; | 802 | u8 f_bit; |
800 | int rc = -ENOBUFS; | 803 | int rc = -ENOBUFS; |
801 | struct llc_sock *llc = llc_sk(sk); | 804 | struct llc_sock *llc = llc_sk(sk); |
802 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 805 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0); |
803 | 806 | ||
804 | llc_pdu_decode_pf_bit(skb, &f_bit); | 807 | llc_pdu_decode_pf_bit(skb, &f_bit); |
805 | if (nskb) { | 808 | if (nskb) { |
@@ -956,7 +959,7 @@ static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock *sk, | |||
956 | { | 959 | { |
957 | int rc = -ENOBUFS; | 960 | int rc = -ENOBUFS; |
958 | struct llc_sock *llc = llc_sk(sk); | 961 | struct llc_sock *llc = llc_sk(sk); |
959 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); | 962 | struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0); |
960 | 963 | ||
961 | if (nskb) { | 964 | if (nskb) { |
962 | struct llc_sap *sap = llc->sap; | 965 | struct llc_sap *sap = llc->sap; |
diff --git a/net/llc/llc_core.c b/net/llc/llc_core.c index 248b5903bb13..50d5b10e23a2 100644 --- a/net/llc/llc_core.c +++ b/net/llc/llc_core.c | |||
@@ -25,8 +25,6 @@ | |||
25 | LIST_HEAD(llc_sap_list); | 25 | LIST_HEAD(llc_sap_list); |
26 | DEFINE_RWLOCK(llc_sap_list_lock); | 26 | DEFINE_RWLOCK(llc_sap_list_lock); |
27 | 27 | ||
28 | unsigned char llc_station_mac_sa[ETH_ALEN]; | ||
29 | |||
30 | /** | 28 | /** |
31 | * llc_sap_alloc - allocates and initializes sap. | 29 | * llc_sap_alloc - allocates and initializes sap. |
32 | * | 30 | * |
@@ -37,8 +35,8 @@ static struct llc_sap *llc_sap_alloc(void) | |||
37 | struct llc_sap *sap = kzalloc(sizeof(*sap), GFP_ATOMIC); | 35 | struct llc_sap *sap = kzalloc(sizeof(*sap), GFP_ATOMIC); |
38 | 36 | ||
39 | if (sap) { | 37 | if (sap) { |
38 | /* sap->laddr.mac - leave as a null, it's filled by bind */ | ||
40 | sap->state = LLC_SAP_STATE_ACTIVE; | 39 | sap->state = LLC_SAP_STATE_ACTIVE; |
41 | memcpy(sap->laddr.mac, llc_station_mac_sa, ETH_ALEN); | ||
42 | rwlock_init(&sap->sk_list.lock); | 40 | rwlock_init(&sap->sk_list.lock); |
43 | atomic_set(&sap->refcnt, 1); | 41 | atomic_set(&sap->refcnt, 1); |
44 | } | 42 | } |
@@ -167,10 +165,6 @@ static int __init llc_init(void) | |||
167 | if (dev != NULL) | 165 | if (dev != NULL) |
168 | dev = next_net_device(dev); | 166 | dev = next_net_device(dev); |
169 | 167 | ||
170 | if (dev != NULL) | ||
171 | memcpy(llc_station_mac_sa, dev->dev_addr, ETH_ALEN); | ||
172 | else | ||
173 | memset(llc_station_mac_sa, 0, ETH_ALEN); | ||
174 | dev_add_pack(&llc_packet_type); | 168 | dev_add_pack(&llc_packet_type); |
175 | dev_add_pack(&llc_tr_packet_type); | 169 | dev_add_pack(&llc_tr_packet_type); |
176 | return 0; | 170 | return 0; |
@@ -185,7 +179,6 @@ static void __exit llc_exit(void) | |||
185 | module_init(llc_init); | 179 | module_init(llc_init); |
186 | module_exit(llc_exit); | 180 | module_exit(llc_exit); |
187 | 181 | ||
188 | EXPORT_SYMBOL(llc_station_mac_sa); | ||
189 | EXPORT_SYMBOL(llc_sap_list); | 182 | EXPORT_SYMBOL(llc_sap_list); |
190 | EXPORT_SYMBOL(llc_sap_list_lock); | 183 | EXPORT_SYMBOL(llc_sap_list_lock); |
191 | EXPORT_SYMBOL(llc_sap_find); | 184 | EXPORT_SYMBOL(llc_sap_find); |
diff --git a/net/llc/llc_input.c b/net/llc/llc_input.c index c40c9b2a345a..bfd2567dd365 100644 --- a/net/llc/llc_input.c +++ b/net/llc/llc_input.c | |||
@@ -117,8 +117,12 @@ static inline int llc_fixup_skb(struct sk_buff *skb) | |||
117 | skb_pull(skb, llc_len); | 117 | skb_pull(skb, llc_len); |
118 | if (skb->protocol == htons(ETH_P_802_2)) { | 118 | if (skb->protocol == htons(ETH_P_802_2)) { |
119 | __be16 pdulen = eth_hdr(skb)->h_proto; | 119 | __be16 pdulen = eth_hdr(skb)->h_proto; |
120 | u16 data_size = ntohs(pdulen) - llc_len; | 120 | s32 data_size = ntohs(pdulen) - llc_len; |
121 | 121 | ||
122 | if (data_size < 0 || | ||
123 | ((skb_tail_pointer(skb) - | ||
124 | (u8 *)pdu) - llc_len) < data_size) | ||
125 | return 0; | ||
122 | if (unlikely(pskb_trim_rcsum(skb, data_size))) | 126 | if (unlikely(pskb_trim_rcsum(skb, data_size))) |
123 | return 0; | 127 | return 0; |
124 | } | 128 | } |
diff --git a/net/llc/llc_pdu.c b/net/llc/llc_pdu.c index fa8324396db3..2e6cb79196bb 100644 --- a/net/llc/llc_pdu.c +++ b/net/llc/llc_pdu.c | |||
@@ -241,7 +241,7 @@ void llc_pdu_init_as_frmr_rsp(struct sk_buff *skb, struct llc_pdu_sn *prev_pdu, | |||
241 | FRMR_INFO_SET_PDU_INFO_2LONG_IND(frmr_info, vzyxw); | 241 | FRMR_INFO_SET_PDU_INFO_2LONG_IND(frmr_info, vzyxw); |
242 | FRMR_INFO_SET_PDU_INVALID_Nr_IND(frmr_info, vzyxw); | 242 | FRMR_INFO_SET_PDU_INVALID_Nr_IND(frmr_info, vzyxw); |
243 | FRMR_INFO_SET_PDU_INVALID_Ns_IND(frmr_info, vzyxw); | 243 | FRMR_INFO_SET_PDU_INVALID_Ns_IND(frmr_info, vzyxw); |
244 | skb_put(skb, 5); | 244 | skb_put(skb, sizeof(struct llc_frmr_info)); |
245 | } | 245 | } |
246 | 246 | ||
247 | /** | 247 | /** |
diff --git a/net/llc/llc_s_ac.c b/net/llc/llc_s_ac.c index ac3d93b210d2..a94bd56bcac6 100644 --- a/net/llc/llc_s_ac.c +++ b/net/llc/llc_s_ac.c | |||
@@ -103,7 +103,8 @@ int llc_sap_action_send_xid_r(struct llc_sap *sap, struct sk_buff *skb) | |||
103 | llc_pdu_decode_sa(skb, mac_da); | 103 | llc_pdu_decode_sa(skb, mac_da); |
104 | llc_pdu_decode_da(skb, mac_sa); | 104 | llc_pdu_decode_da(skb, mac_sa); |
105 | llc_pdu_decode_ssap(skb, &dsap); | 105 | llc_pdu_decode_ssap(skb, &dsap); |
106 | nskb = llc_alloc_frame(NULL, skb->dev); | 106 | nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, |
107 | sizeof(struct llc_xid_info)); | ||
107 | if (!nskb) | 108 | if (!nskb) |
108 | goto out; | 109 | goto out; |
109 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, | 110 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, |
@@ -144,11 +145,15 @@ int llc_sap_action_send_test_r(struct llc_sap *sap, struct sk_buff *skb) | |||
144 | u8 mac_da[ETH_ALEN], mac_sa[ETH_ALEN], dsap; | 145 | u8 mac_da[ETH_ALEN], mac_sa[ETH_ALEN], dsap; |
145 | struct sk_buff *nskb; | 146 | struct sk_buff *nskb; |
146 | int rc = 1; | 147 | int rc = 1; |
148 | u32 data_size; | ||
147 | 149 | ||
148 | llc_pdu_decode_sa(skb, mac_da); | 150 | llc_pdu_decode_sa(skb, mac_da); |
149 | llc_pdu_decode_da(skb, mac_sa); | 151 | llc_pdu_decode_da(skb, mac_sa); |
150 | llc_pdu_decode_ssap(skb, &dsap); | 152 | llc_pdu_decode_ssap(skb, &dsap); |
151 | nskb = llc_alloc_frame(NULL, skb->dev); | 153 | |
154 | /* The test request command is type U (llc_len = 3) */ | ||
155 | data_size = ntohs(eth_hdr(skb)->h_proto) - 3; | ||
156 | nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, data_size); | ||
152 | if (!nskb) | 157 | if (!nskb) |
153 | goto out; | 158 | goto out; |
154 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, | 159 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, |
diff --git a/net/llc/llc_sap.c b/net/llc/llc_sap.c index 2525165e2e8f..e2ddde755019 100644 --- a/net/llc/llc_sap.c +++ b/net/llc/llc_sap.c | |||
@@ -24,20 +24,41 @@ | |||
24 | #include <net/tcp_states.h> | 24 | #include <net/tcp_states.h> |
25 | #include <linux/llc.h> | 25 | #include <linux/llc.h> |
26 | 26 | ||
27 | static int llc_mac_header_len(unsigned short devtype) | ||
28 | { | ||
29 | switch (devtype) { | ||
30 | case ARPHRD_ETHER: | ||
31 | case ARPHRD_LOOPBACK: | ||
32 | return sizeof(struct ethhdr); | ||
33 | #ifdef CONFIG_TR | ||
34 | case ARPHRD_IEEE802_TR: | ||
35 | return sizeof(struct trh_hdr); | ||
36 | #endif | ||
37 | } | ||
38 | return 0; | ||
39 | } | ||
40 | |||
27 | /** | 41 | /** |
28 | * llc_alloc_frame - allocates sk_buff for frame | 42 | * llc_alloc_frame - allocates sk_buff for frame |
29 | * @dev: network device this skb will be sent over | 43 | * @dev: network device this skb will be sent over |
44 | * @type: pdu type to allocate | ||
45 | * @data_size: data size to allocate | ||
30 | * | 46 | * |
31 | * Allocates an sk_buff for frame and initializes sk_buff fields. | 47 | * Allocates an sk_buff for frame and initializes sk_buff fields. |
32 | * Returns allocated skb or %NULL when out of memory. | 48 | * Returns allocated skb or %NULL when out of memory. |
33 | */ | 49 | */ |
34 | struct sk_buff *llc_alloc_frame(struct sock *sk, struct net_device *dev) | 50 | struct sk_buff *llc_alloc_frame(struct sock *sk, struct net_device *dev, |
51 | u8 type, u32 data_size) | ||
35 | { | 52 | { |
36 | struct sk_buff *skb = alloc_skb(128, GFP_ATOMIC); | 53 | int hlen = type == LLC_PDU_TYPE_U ? 3 : 4; |
54 | struct sk_buff *skb; | ||
55 | |||
56 | hlen += llc_mac_header_len(dev->type); | ||
57 | skb = alloc_skb(hlen + data_size, GFP_ATOMIC); | ||
37 | 58 | ||
38 | if (skb) { | 59 | if (skb) { |
39 | skb_reset_mac_header(skb); | 60 | skb_reset_mac_header(skb); |
40 | skb_reserve(skb, 50); | 61 | skb_reserve(skb, hlen); |
41 | skb_reset_network_header(skb); | 62 | skb_reset_network_header(skb); |
42 | skb_reset_transport_header(skb); | 63 | skb_reset_transport_header(skb); |
43 | skb->protocol = htons(ETH_P_802_2); | 64 | skb->protocol = htons(ETH_P_802_2); |
diff --git a/net/llc/llc_station.c b/net/llc/llc_station.c index 6f2ea2090322..83da13339490 100644 --- a/net/llc/llc_station.c +++ b/net/llc/llc_station.c | |||
@@ -253,13 +253,14 @@ static int llc_station_ac_inc_xid_r_cnt_by_1(struct sk_buff *skb) | |||
253 | static int llc_station_ac_send_null_dsap_xid_c(struct sk_buff *skb) | 253 | static int llc_station_ac_send_null_dsap_xid_c(struct sk_buff *skb) |
254 | { | 254 | { |
255 | int rc = 1; | 255 | int rc = 1; |
256 | struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev); | 256 | struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, |
257 | sizeof(struct llc_xid_info)); | ||
257 | 258 | ||
258 | if (!nskb) | 259 | if (!nskb) |
259 | goto out; | 260 | goto out; |
260 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, 0, LLC_PDU_CMD); | 261 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, 0, LLC_PDU_CMD); |
261 | llc_pdu_init_as_xid_cmd(nskb, LLC_XID_NULL_CLASS_2, 127); | 262 | llc_pdu_init_as_xid_cmd(nskb, LLC_XID_NULL_CLASS_2, 127); |
262 | rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, llc_station_mac_sa); | 263 | rc = llc_mac_hdr_init(nskb, skb->dev->dev_addr, skb->dev->dev_addr); |
263 | if (unlikely(rc)) | 264 | if (unlikely(rc)) |
264 | goto free; | 265 | goto free; |
265 | llc_station_send_pdu(nskb); | 266 | llc_station_send_pdu(nskb); |
@@ -274,7 +275,8 @@ static int llc_station_ac_send_xid_r(struct sk_buff *skb) | |||
274 | { | 275 | { |
275 | u8 mac_da[ETH_ALEN], dsap; | 276 | u8 mac_da[ETH_ALEN], dsap; |
276 | int rc = 1; | 277 | int rc = 1; |
277 | struct sk_buff* nskb = llc_alloc_frame(NULL, skb->dev); | 278 | struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, |
279 | sizeof(struct llc_xid_info)); | ||
278 | 280 | ||
279 | if (!nskb) | 281 | if (!nskb) |
280 | goto out; | 282 | goto out; |
@@ -283,7 +285,7 @@ static int llc_station_ac_send_xid_r(struct sk_buff *skb) | |||
283 | llc_pdu_decode_ssap(skb, &dsap); | 285 | llc_pdu_decode_ssap(skb, &dsap); |
284 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); | 286 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); |
285 | llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 127); | 287 | llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 127); |
286 | rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); | 288 | rc = llc_mac_hdr_init(nskb, skb->dev->dev_addr, mac_da); |
287 | if (unlikely(rc)) | 289 | if (unlikely(rc)) |
288 | goto free; | 290 | goto free; |
289 | llc_station_send_pdu(nskb); | 291 | llc_station_send_pdu(nskb); |
@@ -298,7 +300,12 @@ static int llc_station_ac_send_test_r(struct sk_buff *skb) | |||
298 | { | 300 | { |
299 | u8 mac_da[ETH_ALEN], dsap; | 301 | u8 mac_da[ETH_ALEN], dsap; |
300 | int rc = 1; | 302 | int rc = 1; |
301 | struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev); | 303 | u32 data_size; |
304 | struct sk_buff *nskb; | ||
305 | |||
306 | /* The test request command is type U (llc_len = 3) */ | ||
307 | data_size = ntohs(eth_hdr(skb)->h_proto) - 3; | ||
308 | nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, data_size); | ||
302 | 309 | ||
303 | if (!nskb) | 310 | if (!nskb) |
304 | goto out; | 311 | goto out; |
@@ -307,7 +314,7 @@ static int llc_station_ac_send_test_r(struct sk_buff *skb) | |||
307 | llc_pdu_decode_ssap(skb, &dsap); | 314 | llc_pdu_decode_ssap(skb, &dsap); |
308 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); | 315 | llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); |
309 | llc_pdu_init_as_test_rsp(nskb, skb); | 316 | llc_pdu_init_as_test_rsp(nskb, skb); |
310 | rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); | 317 | rc = llc_mac_hdr_init(nskb, skb->dev->dev_addr, mac_da); |
311 | if (unlikely(rc)) | 318 | if (unlikely(rc)) |
312 | goto free; | 319 | goto free; |
313 | llc_station_send_pdu(nskb); | 320 | llc_station_send_pdu(nskb); |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 28bcdf9fc3df..8e586390a2ef 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -286,6 +286,18 @@ static int ieee80211_open(struct net_device *dev) | |||
286 | if (need_hw_reconfig) | 286 | if (need_hw_reconfig) |
287 | ieee80211_hw_config(local); | 287 | ieee80211_hw_config(local); |
288 | 288 | ||
289 | /* | ||
290 | * ieee80211_sta_work is disabled while network interface | ||
291 | * is down. Therefore, some configuration changes may not | ||
292 | * yet be effective. Trigger execution of ieee80211_sta_work | ||
293 | * to fix this. | ||
294 | */ | ||
295 | if(sdata->vif.type == IEEE80211_IF_TYPE_STA || | ||
296 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | ||
297 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; | ||
298 | queue_work(local->hw.workqueue, &ifsta->work); | ||
299 | } | ||
300 | |||
289 | netif_start_queue(dev); | 301 | netif_start_queue(dev); |
290 | 302 | ||
291 | return 0; | 303 | return 0; |
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 9aeed5320228..e0c72d04584b 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -319,7 +319,7 @@ static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata, | |||
319 | struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; | 319 | struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; |
320 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; | 320 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; |
321 | bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0; | 321 | bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0; |
322 | bool preamble_mode = (erp_value & WLAN_ERP_BARKER_PREAMBLE) != 0; | 322 | bool use_short_preamble = (erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0; |
323 | DECLARE_MAC_BUF(mac); | 323 | DECLARE_MAC_BUF(mac); |
324 | u32 changed = 0; | 324 | u32 changed = 0; |
325 | 325 | ||
@@ -335,16 +335,15 @@ static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata, | |||
335 | changed |= BSS_CHANGED_ERP_CTS_PROT; | 335 | changed |= BSS_CHANGED_ERP_CTS_PROT; |
336 | } | 336 | } |
337 | 337 | ||
338 | if (preamble_mode != bss_conf->use_short_preamble) { | 338 | if (use_short_preamble != bss_conf->use_short_preamble) { |
339 | if (net_ratelimit()) { | 339 | if (net_ratelimit()) { |
340 | printk(KERN_DEBUG "%s: switched to %s barker preamble" | 340 | printk(KERN_DEBUG "%s: switched to %s barker preamble" |
341 | " (BSSID=%s)\n", | 341 | " (BSSID=%s)\n", |
342 | sdata->dev->name, | 342 | sdata->dev->name, |
343 | (preamble_mode == WLAN_ERP_PREAMBLE_SHORT) ? | 343 | use_short_preamble ? "short" : "long", |
344 | "short" : "long", | ||
345 | print_mac(mac, ifsta->bssid)); | 344 | print_mac(mac, ifsta->bssid)); |
346 | } | 345 | } |
347 | bss_conf->use_short_preamble = preamble_mode; | 346 | bss_conf->use_short_preamble = use_short_preamble; |
348 | changed |= BSS_CHANGED_ERP_PREAMBLE; | 347 | changed |= BSS_CHANGED_ERP_PREAMBLE; |
349 | } | 348 | } |
350 | 349 | ||
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index e88e96af613d..8599068050ec 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
@@ -395,7 +395,7 @@ EXPORT_SYMBOL_GPL(nf_ct_log_invalid); | |||
395 | static int __init nf_conntrack_standalone_init(void) | 395 | static int __init nf_conntrack_standalone_init(void) |
396 | { | 396 | { |
397 | #ifdef CONFIG_PROC_FS | 397 | #ifdef CONFIG_PROC_FS |
398 | struct proc_dir_entry *proc, *proc_stat; | 398 | struct proc_dir_entry *proc; |
399 | #endif | 399 | #endif |
400 | int ret = 0; | 400 | int ret = 0; |
401 | 401 | ||
@@ -407,12 +407,9 @@ static int __init nf_conntrack_standalone_init(void) | |||
407 | proc = proc_net_fops_create(&init_net, "nf_conntrack", 0440, &ct_file_ops); | 407 | proc = proc_net_fops_create(&init_net, "nf_conntrack", 0440, &ct_file_ops); |
408 | if (!proc) goto cleanup_init; | 408 | if (!proc) goto cleanup_init; |
409 | 409 | ||
410 | proc_stat = create_proc_entry("nf_conntrack", S_IRUGO, init_net.proc_net_stat); | 410 | if (!proc_create("nf_conntrack", S_IRUGO, |
411 | if (!proc_stat) | 411 | init_net.proc_net_stat, &ct_cpu_seq_fops)) |
412 | goto cleanup_proc; | 412 | goto cleanup_proc; |
413 | |||
414 | proc_stat->proc_fops = &ct_cpu_seq_fops; | ||
415 | proc_stat->owner = THIS_MODULE; | ||
416 | #endif | 413 | #endif |
417 | #ifdef CONFIG_SYSCTL | 414 | #ifdef CONFIG_SYSCTL |
418 | nf_ct_sysctl_header = register_sysctl_paths(nf_ct_path, | 415 | nf_ct_sysctl_header = register_sysctl_paths(nf_ct_path, |
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index cec9976aecbf..bc11d7092032 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c | |||
@@ -168,13 +168,9 @@ static const struct file_operations nflog_file_ops = { | |||
168 | int __init netfilter_log_init(void) | 168 | int __init netfilter_log_init(void) |
169 | { | 169 | { |
170 | #ifdef CONFIG_PROC_FS | 170 | #ifdef CONFIG_PROC_FS |
171 | struct proc_dir_entry *pde; | 171 | if (!proc_create("nf_log", S_IRUGO, |
172 | 172 | proc_net_netfilter, &nflog_file_ops)) | |
173 | pde = create_proc_entry("nf_log", S_IRUGO, proc_net_netfilter); | ||
174 | if (!pde) | ||
175 | return -1; | 173 | return -1; |
176 | |||
177 | pde->proc_fops = &nflog_file_ops; | ||
178 | #endif | 174 | #endif |
179 | return 0; | 175 | return 0; |
180 | } | 176 | } |
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index ddc80ea114cd..bbd26893c0c4 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c | |||
@@ -348,12 +348,9 @@ static const struct file_operations nfqueue_file_ops = { | |||
348 | int __init netfilter_queue_init(void) | 348 | int __init netfilter_queue_init(void) |
349 | { | 349 | { |
350 | #ifdef CONFIG_PROC_FS | 350 | #ifdef CONFIG_PROC_FS |
351 | struct proc_dir_entry *pde; | 351 | if (!proc_create("nf_queue", S_IRUGO, |
352 | 352 | proc_net_netfilter, &nfqueue_file_ops)) | |
353 | pde = create_proc_entry("nf_queue", S_IRUGO, proc_net_netfilter); | ||
354 | if (!pde) | ||
355 | return -1; | 353 | return -1; |
356 | pde->proc_fops = &nfqueue_file_ops; | ||
357 | #endif | 354 | #endif |
358 | return 0; | 355 | return 0; |
359 | } | 356 | } |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index bf3f19b21fe4..b8173af8c24a 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -923,9 +923,6 @@ static const struct file_operations nful_file_ops = { | |||
923 | static int __init nfnetlink_log_init(void) | 923 | static int __init nfnetlink_log_init(void) |
924 | { | 924 | { |
925 | int i, status = -ENOMEM; | 925 | int i, status = -ENOMEM; |
926 | #ifdef CONFIG_PROC_FS | ||
927 | struct proc_dir_entry *proc_nful; | ||
928 | #endif | ||
929 | 926 | ||
930 | for (i = 0; i < INSTANCE_BUCKETS; i++) | 927 | for (i = 0; i < INSTANCE_BUCKETS; i++) |
931 | INIT_HLIST_HEAD(&instance_table[i]); | 928 | INIT_HLIST_HEAD(&instance_table[i]); |
@@ -943,11 +940,9 @@ static int __init nfnetlink_log_init(void) | |||
943 | } | 940 | } |
944 | 941 | ||
945 | #ifdef CONFIG_PROC_FS | 942 | #ifdef CONFIG_PROC_FS |
946 | proc_nful = create_proc_entry("nfnetlink_log", 0440, | 943 | if (!proc_create("nfnetlink_log", 0440, |
947 | proc_net_netfilter); | 944 | proc_net_netfilter, &nful_file_ops)) |
948 | if (!proc_nful) | ||
949 | goto cleanup_subsys; | 945 | goto cleanup_subsys; |
950 | proc_nful->proc_fops = &nful_file_ops; | ||
951 | #endif | 946 | #endif |
952 | return status; | 947 | return status; |
953 | 948 | ||
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 012cb6910820..10522c04ed24 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
@@ -896,9 +896,6 @@ static const struct file_operations nfqnl_file_ops = { | |||
896 | static int __init nfnetlink_queue_init(void) | 896 | static int __init nfnetlink_queue_init(void) |
897 | { | 897 | { |
898 | int i, status = -ENOMEM; | 898 | int i, status = -ENOMEM; |
899 | #ifdef CONFIG_PROC_FS | ||
900 | struct proc_dir_entry *proc_nfqueue; | ||
901 | #endif | ||
902 | 899 | ||
903 | for (i = 0; i < INSTANCE_BUCKETS; i++) | 900 | for (i = 0; i < INSTANCE_BUCKETS; i++) |
904 | INIT_HLIST_HEAD(&instance_table[i]); | 901 | INIT_HLIST_HEAD(&instance_table[i]); |
@@ -911,11 +908,9 @@ static int __init nfnetlink_queue_init(void) | |||
911 | } | 908 | } |
912 | 909 | ||
913 | #ifdef CONFIG_PROC_FS | 910 | #ifdef CONFIG_PROC_FS |
914 | proc_nfqueue = create_proc_entry("nfnetlink_queue", 0440, | 911 | if (!proc_create("nfnetlink_queue", 0440, |
915 | proc_net_netfilter); | 912 | proc_net_netfilter, &nfqnl_file_ops)) |
916 | if (!proc_nfqueue) | ||
917 | goto cleanup_subsys; | 913 | goto cleanup_subsys; |
918 | proc_nfqueue->proc_fops = &nfqnl_file_ops; | ||
919 | #endif | 914 | #endif |
920 | 915 | ||
921 | register_netdevice_notifier(&nfqnl_dev_notifier); | 916 | register_netdevice_notifier(&nfqnl_dev_notifier); |
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 5418ce59ac3a..dc29007c52cd 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c | |||
@@ -237,14 +237,14 @@ static int htable_create_v0(struct xt_hashlimit_info *minfo, int family) | |||
237 | hinfo->family = family; | 237 | hinfo->family = family; |
238 | hinfo->rnd_initialized = 0; | 238 | hinfo->rnd_initialized = 0; |
239 | spin_lock_init(&hinfo->lock); | 239 | spin_lock_init(&hinfo->lock); |
240 | hinfo->pde = create_proc_entry(minfo->name, 0, | 240 | hinfo->pde = proc_create(minfo->name, 0, |
241 | family == AF_INET ? hashlimit_procdir4 : | 241 | family == AF_INET ? hashlimit_procdir4 : |
242 | hashlimit_procdir6); | 242 | hashlimit_procdir6, |
243 | &dl_file_ops); | ||
243 | if (!hinfo->pde) { | 244 | if (!hinfo->pde) { |
244 | vfree(hinfo); | 245 | vfree(hinfo); |
245 | return -1; | 246 | return -1; |
246 | } | 247 | } |
247 | hinfo->pde->proc_fops = &dl_file_ops; | ||
248 | hinfo->pde->data = hinfo; | 248 | hinfo->pde->data = hinfo; |
249 | 249 | ||
250 | setup_timer(&hinfo->timer, htable_gc, (unsigned long )hinfo); | 250 | setup_timer(&hinfo->timer, htable_gc, (unsigned long )hinfo); |
@@ -301,14 +301,14 @@ static int htable_create(struct xt_hashlimit_mtinfo1 *minfo, | |||
301 | hinfo->rnd_initialized = 0; | 301 | hinfo->rnd_initialized = 0; |
302 | spin_lock_init(&hinfo->lock); | 302 | spin_lock_init(&hinfo->lock); |
303 | 303 | ||
304 | hinfo->pde = create_proc_entry(minfo->name, 0, | 304 | hinfo->pde = proc_create(minfo->name, 0, |
305 | family == AF_INET ? hashlimit_procdir4 : | 305 | family == AF_INET ? hashlimit_procdir4 : |
306 | hashlimit_procdir6); | 306 | hashlimit_procdir6, |
307 | &dl_file_ops); | ||
307 | if (hinfo->pde == NULL) { | 308 | if (hinfo->pde == NULL) { |
308 | vfree(hinfo); | 309 | vfree(hinfo); |
309 | return -1; | 310 | return -1; |
310 | } | 311 | } |
311 | hinfo->pde->proc_fops = &dl_file_ops; | ||
312 | hinfo->pde->data = hinfo; | 312 | hinfo->pde->data = hinfo; |
313 | 313 | ||
314 | setup_timer(&hinfo->timer, htable_gc, (unsigned long)hinfo); | 314 | setup_timer(&hinfo->timer, htable_gc, (unsigned long)hinfo); |
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 4a31a81059ab..063cbc5c26b1 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -598,17 +598,24 @@ static int rose_release(struct socket *sock) | |||
598 | 598 | ||
599 | if (sk == NULL) return 0; | 599 | if (sk == NULL) return 0; |
600 | 600 | ||
601 | sock_hold(sk); | ||
602 | sock_orphan(sk); | ||
603 | lock_sock(sk); | ||
601 | rose = rose_sk(sk); | 604 | rose = rose_sk(sk); |
602 | 605 | ||
603 | switch (rose->state) { | 606 | switch (rose->state) { |
604 | case ROSE_STATE_0: | 607 | case ROSE_STATE_0: |
608 | release_sock(sk); | ||
605 | rose_disconnect(sk, 0, -1, -1); | 609 | rose_disconnect(sk, 0, -1, -1); |
610 | lock_sock(sk); | ||
606 | rose_destroy_socket(sk); | 611 | rose_destroy_socket(sk); |
607 | break; | 612 | break; |
608 | 613 | ||
609 | case ROSE_STATE_2: | 614 | case ROSE_STATE_2: |
610 | rose->neighbour->use--; | 615 | rose->neighbour->use--; |
616 | release_sock(sk); | ||
611 | rose_disconnect(sk, 0, -1, -1); | 617 | rose_disconnect(sk, 0, -1, -1); |
618 | lock_sock(sk); | ||
612 | rose_destroy_socket(sk); | 619 | rose_destroy_socket(sk); |
613 | break; | 620 | break; |
614 | 621 | ||
@@ -633,6 +640,8 @@ static int rose_release(struct socket *sock) | |||
633 | } | 640 | } |
634 | 641 | ||
635 | sock->sk = NULL; | 642 | sock->sk = NULL; |
643 | release_sock(sk); | ||
644 | sock_put(sk); | ||
636 | 645 | ||
637 | return 0; | 646 | return 0; |
638 | } | 647 | } |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 10b5c0887fff..b741618e4d54 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -184,10 +184,22 @@ static inline int qdisc_restart(struct net_device *dev) | |||
184 | 184 | ||
185 | void __qdisc_run(struct net_device *dev) | 185 | void __qdisc_run(struct net_device *dev) |
186 | { | 186 | { |
187 | do { | 187 | unsigned long start_time = jiffies; |
188 | if (!qdisc_restart(dev)) | 188 | |
189 | while (qdisc_restart(dev)) { | ||
190 | if (netif_queue_stopped(dev)) | ||
191 | break; | ||
192 | |||
193 | /* | ||
194 | * Postpone processing if | ||
195 | * 1. another process needs the CPU; | ||
196 | * 2. we've been doing it for too long. | ||
197 | */ | ||
198 | if (need_resched() || jiffies != start_time) { | ||
199 | netif_schedule(dev); | ||
189 | break; | 200 | break; |
190 | } while (!netif_queue_stopped(dev)); | 201 | } |
202 | } | ||
191 | 203 | ||
192 | clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state); | 204 | clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state); |
193 | } | 205 | } |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 41a049f50f58..c2fef7b12dc7 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1630,6 +1630,12 @@ static inline u32 file_to_av(struct file *file) | |||
1630 | else | 1630 | else |
1631 | av |= FILE__WRITE; | 1631 | av |= FILE__WRITE; |
1632 | } | 1632 | } |
1633 | if (!av) { | ||
1634 | /* | ||
1635 | * Special file opened with flags 3 for ioctl-only use. | ||
1636 | */ | ||
1637 | av = FILE__IOCTL; | ||
1638 | } | ||
1633 | 1639 | ||
1634 | return av; | 1640 | return av; |
1635 | } | 1641 | } |