diff options
138 files changed, 2985 insertions, 1465 deletions
diff --git a/Documentation/usb/sn9c102.txt b/Documentation/usb/sn9c102.txt index cf9a1187edce..3f8a119db31b 100644 --- a/Documentation/usb/sn9c102.txt +++ b/Documentation/usb/sn9c102.txt | |||
@@ -297,6 +297,7 @@ Vendor ID Product ID | |||
297 | 0x0c45 0x602a | 297 | 0x0c45 0x602a |
298 | 0x0c45 0x602b | 298 | 0x0c45 0x602b |
299 | 0x0c45 0x602c | 299 | 0x0c45 0x602c |
300 | 0x0c45 0x602d | ||
300 | 0x0c45 0x6030 | 301 | 0x0c45 0x6030 |
301 | 0x0c45 0x6080 | 302 | 0x0c45 0x6080 |
302 | 0x0c45 0x6082 | 303 | 0x0c45 0x6082 |
@@ -333,6 +334,7 @@ Model Manufacturer | |||
333 | ----- ------------ | 334 | ----- ------------ |
334 | HV7131D Hynix Semiconductor, Inc. | 335 | HV7131D Hynix Semiconductor, Inc. |
335 | MI-0343 Micron Technology, Inc. | 336 | MI-0343 Micron Technology, Inc. |
337 | OV7630 OmniVision Technologies, Inc. | ||
336 | PAS106B PixArt Imaging, Inc. | 338 | PAS106B PixArt Imaging, Inc. |
337 | PAS202BCB PixArt Imaging, Inc. | 339 | PAS202BCB PixArt Imaging, Inc. |
338 | TAS5110C1B Taiwan Advanced Sensor Corporation | 340 | TAS5110C1B Taiwan Advanced Sensor Corporation |
@@ -470,9 +472,11 @@ order): | |||
470 | - Luca Capello for the donation of a webcam; | 472 | - Luca Capello for the donation of a webcam; |
471 | - Joao Rodrigo Fuzaro, Joao Limirio, Claudio Filho and Caio Begotti for the | 473 | - Joao Rodrigo Fuzaro, Joao Limirio, Claudio Filho and Caio Begotti for the |
472 | donation of a webcam; | 474 | donation of a webcam; |
475 | - Jon Hollstrom for the donation of a webcam; | ||
473 | - Carlos Eduardo Medaglia Dyonisio, who added the support for the PAS202BCB | 476 | - Carlos Eduardo Medaglia Dyonisio, who added the support for the PAS202BCB |
474 | image sensor; | 477 | image sensor; |
475 | - Stefano Mozzi, who donated 45 EU; | 478 | - Stefano Mozzi, who donated 45 EU; |
479 | - Andrew Pearce for the donation of a webcam; | ||
476 | - Bertrik Sikken, who reverse-engineered and documented the Huffman compression | 480 | - Bertrik Sikken, who reverse-engineered and documented the Huffman compression |
477 | algorithm used in the SN9C10x controllers and implemented the first decoder; | 481 | algorithm used in the SN9C10x controllers and implemented the first decoder; |
478 | - Mizuno Takafumi for the donation of a webcam; | 482 | - Mizuno Takafumi for the donation of a webcam; |
diff --git a/Documentation/usb/usbmon.txt b/Documentation/usb/usbmon.txt index 2f8431f92b77..f1896ee3bb2a 100644 --- a/Documentation/usb/usbmon.txt +++ b/Documentation/usb/usbmon.txt | |||
@@ -101,6 +101,13 @@ Here is the list of words, from left to right: | |||
101 | or 3 and 2 positions, correspondingly. | 101 | or 3 and 2 positions, correspondingly. |
102 | - URB Status. This field makes no sense for submissions, but is present | 102 | - URB Status. This field makes no sense for submissions, but is present |
103 | to help scripts with parsing. In error case, it contains the error code. | 103 | to help scripts with parsing. In error case, it contains the error code. |
104 | In case of a setup packet, it contains a Setup Tag. If scripts read a number | ||
105 | in this field, the proceed to read Data Length. Otherwise, they read | ||
106 | the setup packet before reading the Data Length. | ||
107 | - Setup packet, if present, consists of 5 words: one of each for bmRequestType, | ||
108 | bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0. | ||
109 | These words are safe to decode if Setup Tag was 's'. Otherwise, the setup | ||
110 | packet was present, but not captured, and the fields contain filler. | ||
104 | - Data Length. This is the actual length in the URB. | 111 | - Data Length. This is the actual length in the URB. |
105 | - Data tag. The usbmon may not always capture data, even if length is nonzero. | 112 | - Data tag. The usbmon may not always capture data, even if length is nonzero. |
106 | Only if tag is '=', the data words are present. | 113 | Only if tag is '=', the data words are present. |
@@ -125,25 +132,31 @@ class ParsedLine { | |||
125 | String data_str = st.nextToken(); | 132 | String data_str = st.nextToken(); |
126 | int len = data_str.length() / 2; | 133 | int len = data_str.length() / 2; |
127 | int i; | 134 | int i; |
135 | int b; // byte is signed, apparently?! XXX | ||
128 | for (i = 0; i < len; i++) { | 136 | for (i = 0; i < len; i++) { |
129 | data[data_len] = Byte.parseByte( | 137 | // data[data_len] = Byte.parseByte( |
130 | data_str.substring(i*2, i*2 + 2), | 138 | // data_str.substring(i*2, i*2 + 2), |
131 | 16); | 139 | // 16); |
140 | b = Integer.parseInt( | ||
141 | data_str.substring(i*2, i*2 + 2), | ||
142 | 16); | ||
143 | if (b >= 128) | ||
144 | b *= -1; | ||
145 | data[data_len] = (byte) b; | ||
132 | data_len++; | 146 | data_len++; |
133 | } | 147 | } |
134 | } | 148 | } |
135 | } | 149 | } |
136 | } | 150 | } |
137 | 151 | ||
138 | This format is obviously deficient. For example, the setup packet for control | 152 | This format may be changed in the future. |
139 | transfers is not delivered. This will change in the future. | ||
140 | 153 | ||
141 | Examples: | 154 | Examples: |
142 | 155 | ||
143 | An input control transfer to get a port status: | 156 | An input control transfer to get a port status. |
144 | 157 | ||
145 | d74ff9a0 2640288196 S Ci:001:00 -115 4 < | 158 | d5ea89a0 3575914555 S Ci:001:00 s a3 00 0000 0003 0004 4 < |
146 | d74ff9a0 2640288202 C Ci:001:00 0 4 = 01010100 | 159 | d5ea89a0 3575914560 C Ci:001:00 0 4 = 01050000 |
147 | 160 | ||
148 | An output bulk transfer to send a SCSI command 0x5E in a 31-byte Bulk wrapper | 161 | An output bulk transfer to send a SCSI command 0x5E in a 31-byte Bulk wrapper |
149 | to a storage device at address 5: | 162 | to a storage device at address 5: |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index c5739d6309df..083c5df42d35 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -596,6 +596,8 @@ source "fs/Kconfig.binfmt" | |||
596 | 596 | ||
597 | endmenu | 597 | endmenu |
598 | 598 | ||
599 | source "net/Kconfig" | ||
600 | |||
599 | source "drivers/Kconfig" | 601 | source "drivers/Kconfig" |
600 | 602 | ||
601 | source "fs/Kconfig" | 603 | source "fs/Kconfig" |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8752751f9985..45462714caf1 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -700,6 +700,8 @@ config APM | |||
700 | 700 | ||
701 | endmenu | 701 | endmenu |
702 | 702 | ||
703 | source "net/Kconfig" | ||
704 | |||
703 | menu "Device Drivers" | 705 | menu "Device Drivers" |
704 | 706 | ||
705 | source "drivers/base/Kconfig" | 707 | source "drivers/base/Kconfig" |
@@ -732,7 +734,7 @@ source "drivers/ieee1394/Kconfig" | |||
732 | 734 | ||
733 | source "drivers/message/i2o/Kconfig" | 735 | source "drivers/message/i2o/Kconfig" |
734 | 736 | ||
735 | source "net/Kconfig" | 737 | source "drivers/net/Kconfig" |
736 | 738 | ||
737 | source "drivers/isdn/Kconfig" | 739 | source "drivers/isdn/Kconfig" |
738 | 740 | ||
diff --git a/arch/arm26/Kconfig b/arch/arm26/Kconfig index dc0c1936969b..1f0373267306 100644 --- a/arch/arm26/Kconfig +++ b/arch/arm26/Kconfig | |||
@@ -183,6 +183,8 @@ source "mm/Kconfig" | |||
183 | 183 | ||
184 | endmenu | 184 | endmenu |
185 | 185 | ||
186 | source "net/Kconfig" | ||
187 | |||
186 | source "drivers/base/Kconfig" | 188 | source "drivers/base/Kconfig" |
187 | 189 | ||
188 | source "drivers/parport/Kconfig" | 190 | source "drivers/parport/Kconfig" |
@@ -193,7 +195,7 @@ source "drivers/block/Kconfig" | |||
193 | 195 | ||
194 | source "drivers/md/Kconfig" | 196 | source "drivers/md/Kconfig" |
195 | 197 | ||
196 | source "net/Kconfig" | 198 | source "drivers/net/Kconfig" |
197 | 199 | ||
198 | source "drivers/ide/Kconfig" | 200 | source "drivers/ide/Kconfig" |
199 | 201 | ||
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index f848e3761491..e5979d68e352 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
@@ -122,6 +122,8 @@ source arch/cris/arch-v10/Kconfig | |||
122 | 122 | ||
123 | endmenu | 123 | endmenu |
124 | 124 | ||
125 | source "net/Kconfig" | ||
126 | |||
125 | # bring in ETRAX built-in drivers | 127 | # bring in ETRAX built-in drivers |
126 | menu "Drivers for built-in interfaces" | 128 | menu "Drivers for built-in interfaces" |
127 | source arch/cris/arch-v10/drivers/Kconfig | 129 | source arch/cris/arch-v10/drivers/Kconfig |
@@ -149,7 +151,7 @@ source "drivers/ieee1394/Kconfig" | |||
149 | 151 | ||
150 | source "drivers/message/i2o/Kconfig" | 152 | source "drivers/message/i2o/Kconfig" |
151 | 153 | ||
152 | source "net/Kconfig" | 154 | source "drivers/net/Kconfig" |
153 | 155 | ||
154 | source "drivers/isdn/Kconfig" | 156 | source "drivers/isdn/Kconfig" |
155 | 157 | ||
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index c93f95146cc2..ec85c0d6c6da 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
@@ -346,6 +346,8 @@ source "fs/Kconfig.binfmt" | |||
346 | 346 | ||
347 | endmenu | 347 | endmenu |
348 | 348 | ||
349 | source "net/Kconfig" | ||
350 | |||
349 | source "drivers/Kconfig" | 351 | source "drivers/Kconfig" |
350 | 352 | ||
351 | source "fs/Kconfig" | 353 | source "fs/Kconfig" |
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 62a89e812e3e..375f2a8ff3b5 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig | |||
@@ -55,6 +55,8 @@ source "fs/Kconfig.binfmt" | |||
55 | 55 | ||
56 | endmenu | 56 | endmenu |
57 | 57 | ||
58 | source "net/Kconfig" | ||
59 | |||
58 | source "drivers/base/Kconfig" | 60 | source "drivers/base/Kconfig" |
59 | 61 | ||
60 | source "drivers/mtd/Kconfig" | 62 | source "drivers/mtd/Kconfig" |
@@ -65,7 +67,7 @@ source "drivers/ide/Kconfig" | |||
65 | 67 | ||
66 | source "arch/h8300/Kconfig.ide" | 68 | source "arch/h8300/Kconfig.ide" |
67 | 69 | ||
68 | source "net/Kconfig" | 70 | source "drivers/net/Kconfig" |
69 | 71 | ||
70 | # | 72 | # |
71 | # input - input/joystick depends on it. As does USB. | 73 | # input - input/joystick depends on it. As does USB. |
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 6c02336fe2e4..a801d9d48606 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -1285,6 +1285,8 @@ source "fs/Kconfig.binfmt" | |||
1285 | 1285 | ||
1286 | endmenu | 1286 | endmenu |
1287 | 1287 | ||
1288 | source "net/Kconfig" | ||
1289 | |||
1288 | source "drivers/Kconfig" | 1290 | source "drivers/Kconfig" |
1289 | 1291 | ||
1290 | source "fs/Kconfig" | 1292 | source "fs/Kconfig" |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 01b78e7f992e..2e08942339ad 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -423,6 +423,8 @@ endmenu | |||
423 | 423 | ||
424 | endif | 424 | endif |
425 | 425 | ||
426 | source "net/Kconfig" | ||
427 | |||
426 | source "drivers/Kconfig" | 428 | source "drivers/Kconfig" |
427 | 429 | ||
428 | source "fs/Kconfig" | 430 | source "fs/Kconfig" |
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index 42ca8a39798d..7772951df313 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig | |||
@@ -359,6 +359,8 @@ source "fs/Kconfig.binfmt" | |||
359 | 359 | ||
360 | endmenu | 360 | endmenu |
361 | 361 | ||
362 | source "net/Kconfig" | ||
363 | |||
362 | source "drivers/Kconfig" | 364 | source "drivers/Kconfig" |
363 | 365 | ||
364 | source "fs/Kconfig" | 366 | source "fs/Kconfig" |
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 691a2469ff36..178c4a3fbb72 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -450,6 +450,8 @@ source "drivers/zorro/Kconfig" | |||
450 | 450 | ||
451 | endmenu | 451 | endmenu |
452 | 452 | ||
453 | source "net/Kconfig" | ||
454 | |||
453 | source "drivers/Kconfig" | 455 | source "drivers/Kconfig" |
454 | 456 | ||
455 | menu "Character devices" | 457 | menu "Character devices" |
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index dbfcdc8e6087..117f183f0b43 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -575,6 +575,8 @@ config PM | |||
575 | 575 | ||
576 | endmenu | 576 | endmenu |
577 | 577 | ||
578 | source "net/Kconfig" | ||
579 | |||
578 | source "drivers/Kconfig" | 580 | source "drivers/Kconfig" |
579 | 581 | ||
580 | source "fs/Kconfig" | 582 | source "fs/Kconfig" |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index bd9de7b00c0a..b578239146b5 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -1640,6 +1640,8 @@ config PM | |||
1640 | 1640 | ||
1641 | endmenu | 1641 | endmenu |
1642 | 1642 | ||
1643 | source "net/Kconfig" | ||
1644 | |||
1643 | source "drivers/Kconfig" | 1645 | source "drivers/Kconfig" |
1644 | 1646 | ||
1645 | source "fs/Kconfig" | 1647 | source "fs/Kconfig" |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index ce327c799b44..1c2d87435233 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -190,6 +190,8 @@ source "fs/Kconfig.binfmt" | |||
190 | 190 | ||
191 | endmenu | 191 | endmenu |
192 | 192 | ||
193 | source "net/Kconfig" | ||
194 | |||
193 | source "drivers/Kconfig" | 195 | source "drivers/Kconfig" |
194 | 196 | ||
195 | source "fs/Kconfig" | 197 | source "fs/Kconfig" |
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig index 23b0d2f662c5..b833cbcd77f0 100644 --- a/arch/ppc/Kconfig +++ b/arch/ppc/Kconfig | |||
@@ -1355,6 +1355,8 @@ config PIN_TLB | |||
1355 | depends on ADVANCED_OPTIONS && 8xx | 1355 | depends on ADVANCED_OPTIONS && 8xx |
1356 | endmenu | 1356 | endmenu |
1357 | 1357 | ||
1358 | source "net/Kconfig" | ||
1359 | |||
1358 | source "drivers/Kconfig" | 1360 | source "drivers/Kconfig" |
1359 | 1361 | ||
1360 | source "fs/Kconfig" | 1362 | source "fs/Kconfig" |
diff --git a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig index f804f25232ac..fdd8afba7152 100644 --- a/arch/ppc64/Kconfig +++ b/arch/ppc64/Kconfig | |||
@@ -429,6 +429,8 @@ config CMDLINE | |||
429 | 429 | ||
430 | endmenu | 430 | endmenu |
431 | 431 | ||
432 | source "net/Kconfig" | ||
433 | |||
432 | source "drivers/Kconfig" | 434 | source "drivers/Kconfig" |
433 | 435 | ||
434 | source "fs/Kconfig" | 436 | source "fs/Kconfig" |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 6600ee87f896..477ac2758bd5 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -465,6 +465,8 @@ config KEXEC | |||
465 | 465 | ||
466 | endmenu | 466 | endmenu |
467 | 467 | ||
468 | source "net/Kconfig" | ||
469 | |||
468 | config PCMCIA | 470 | config PCMCIA |
469 | bool | 471 | bool |
470 | default n | 472 | default n |
@@ -475,7 +477,7 @@ source "drivers/scsi/Kconfig" | |||
475 | 477 | ||
476 | source "drivers/s390/Kconfig" | 478 | source "drivers/s390/Kconfig" |
477 | 479 | ||
478 | source "net/Kconfig" | 480 | source "drivers/net/Kconfig" |
479 | 481 | ||
480 | source "fs/Kconfig" | 482 | source "fs/Kconfig" |
481 | 483 | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index a7c8bfc11604..adc8109f8b77 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -784,6 +784,8 @@ config EMBEDDED_RAMDISK_IMAGE | |||
784 | 784 | ||
785 | endmenu | 785 | endmenu |
786 | 786 | ||
787 | source "net/Kconfig" | ||
788 | |||
787 | source "drivers/Kconfig" | 789 | source "drivers/Kconfig" |
788 | 790 | ||
789 | source "fs/Kconfig" | 791 | source "fs/Kconfig" |
diff --git a/arch/sh64/Kconfig b/arch/sh64/Kconfig index 708e59736a4d..4c3e5334adb3 100644 --- a/arch/sh64/Kconfig +++ b/arch/sh64/Kconfig | |||
@@ -268,6 +268,8 @@ source "fs/Kconfig.binfmt" | |||
268 | 268 | ||
269 | endmenu | 269 | endmenu |
270 | 270 | ||
271 | source "net/Kconfig" | ||
272 | |||
271 | source "drivers/Kconfig" | 273 | source "drivers/Kconfig" |
272 | 274 | ||
273 | source "fs/Kconfig" | 275 | source "fs/Kconfig" |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 7a117ef473c5..aca028aa29bf 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -268,6 +268,8 @@ source "mm/Kconfig" | |||
268 | 268 | ||
269 | endmenu | 269 | endmenu |
270 | 270 | ||
271 | source "net/Kconfig" | ||
272 | |||
271 | source "drivers/Kconfig" | 273 | source "drivers/Kconfig" |
272 | 274 | ||
273 | if !SUN4 | 275 | if !SUN4 |
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index 6a4733683f0f..140607870f13 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig | |||
@@ -525,6 +525,8 @@ source "mm/Kconfig" | |||
525 | 525 | ||
526 | endmenu | 526 | endmenu |
527 | 527 | ||
528 | source "net/Kconfig" | ||
529 | |||
528 | source "drivers/base/Kconfig" | 530 | source "drivers/base/Kconfig" |
529 | 531 | ||
530 | source "drivers/video/Kconfig" | 532 | source "drivers/video/Kconfig" |
@@ -551,7 +553,7 @@ endif | |||
551 | 553 | ||
552 | source "drivers/ieee1394/Kconfig" | 554 | source "drivers/ieee1394/Kconfig" |
553 | 555 | ||
554 | source "net/Kconfig" | 556 | source "drivers/net/Kconfig" |
555 | 557 | ||
556 | source "drivers/isdn/Kconfig" | 558 | source "drivers/isdn/Kconfig" |
557 | 559 | ||
diff --git a/arch/um/Kconfig b/arch/um/Kconfig index 6682c7883647..f945444df49c 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig | |||
@@ -275,6 +275,8 @@ endmenu | |||
275 | 275 | ||
276 | source "init/Kconfig" | 276 | source "init/Kconfig" |
277 | 277 | ||
278 | source "net/Kconfig" | ||
279 | |||
278 | source "drivers/base/Kconfig" | 280 | source "drivers/base/Kconfig" |
279 | 281 | ||
280 | source "arch/um/Kconfig_char" | 282 | source "arch/um/Kconfig_char" |
@@ -287,7 +289,7 @@ config NETDEVICES | |||
287 | 289 | ||
288 | source "arch/um/Kconfig_net" | 290 | source "arch/um/Kconfig_net" |
289 | 291 | ||
290 | source "net/Kconfig" | 292 | source "drivers/net/Kconfig" |
291 | 293 | ||
292 | source "fs/Kconfig" | 294 | source "fs/Kconfig" |
293 | 295 | ||
diff --git a/arch/v850/Kconfig b/arch/v850/Kconfig index 27febd6ffa80..89c053b6c2c4 100644 --- a/arch/v850/Kconfig +++ b/arch/v850/Kconfig | |||
@@ -250,6 +250,8 @@ source "fs/Kconfig.binfmt" | |||
250 | 250 | ||
251 | endmenu | 251 | endmenu |
252 | 252 | ||
253 | source "net/Kconfig" | ||
254 | |||
253 | ############################################################################# | 255 | ############################################################################# |
254 | 256 | ||
255 | source "drivers/base/Kconfig" | 257 | source "drivers/base/Kconfig" |
@@ -283,7 +285,7 @@ source "drivers/ieee1394/Kconfig" | |||
283 | 285 | ||
284 | source "drivers/message/i2o/Kconfig" | 286 | source "drivers/message/i2o/Kconfig" |
285 | 287 | ||
286 | source "net/Kconfig" | 288 | source "drivers/net/Kconfig" |
287 | 289 | ||
288 | source "drivers/isdn/Kconfig" | 290 | source "drivers/isdn/Kconfig" |
289 | 291 | ||
diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig index d09437b5c48f..4b8326177c52 100644 --- a/arch/x86_64/Kconfig +++ b/arch/x86_64/Kconfig | |||
@@ -515,6 +515,8 @@ config UID16 | |||
515 | 515 | ||
516 | endmenu | 516 | endmenu |
517 | 517 | ||
518 | source "net/Kconfig" | ||
519 | |||
518 | source drivers/Kconfig | 520 | source drivers/Kconfig |
519 | 521 | ||
520 | source "drivers/firmware/Kconfig" | 522 | source "drivers/firmware/Kconfig" |
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index c9b5d298e3c4..2b6257bec4c3 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
@@ -228,6 +228,8 @@ source "fs/Kconfig.binfmt" | |||
228 | 228 | ||
229 | endmenu | 229 | endmenu |
230 | 230 | ||
231 | source "net/Kconfig" | ||
232 | |||
231 | source "drivers/Kconfig" | 233 | source "drivers/Kconfig" |
232 | 234 | ||
233 | source "fs/Kconfig" | 235 | source "fs/Kconfig" |
diff --git a/drivers/Kconfig b/drivers/Kconfig index aed4a9b97c14..34efb2150e68 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig | |||
@@ -28,7 +28,7 @@ source "drivers/message/i2o/Kconfig" | |||
28 | 28 | ||
29 | source "drivers/macintosh/Kconfig" | 29 | source "drivers/macintosh/Kconfig" |
30 | 30 | ||
31 | source "net/Kconfig" | 31 | source "drivers/net/Kconfig" |
32 | 32 | ||
33 | source "drivers/isdn/Kconfig" | 33 | source "drivers/isdn/Kconfig" |
34 | 34 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 2b55687f6ee9..9a07ff7a7777 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -3,6 +3,8 @@ | |||
3 | # Network device configuration | 3 | # Network device configuration |
4 | # | 4 | # |
5 | 5 | ||
6 | menu "Network device support" | ||
7 | |||
6 | config NETDEVICES | 8 | config NETDEVICES |
7 | depends on NET | 9 | depends on NET |
8 | bool "Network device support" | 10 | bool "Network device support" |
@@ -2547,3 +2549,4 @@ config NETCONSOLE | |||
2547 | If you want to log kernel messages over the network, enable this. | 2549 | If you want to log kernel messages over the network, enable this. |
2548 | See <file:Documentation/networking/netconsole.txt> for details. | 2550 | See <file:Documentation/networking/netconsole.txt> for details. |
2549 | 2551 | ||
2552 | endmenu | ||
diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index 69c488d933a2..b14e89004c3a 100644 --- a/drivers/net/appletalk/Kconfig +++ b/drivers/net/appletalk/Kconfig | |||
@@ -1,6 +1,33 @@ | |||
1 | # | 1 | # |
2 | # Appletalk driver configuration | 2 | # Appletalk driver configuration |
3 | # | 3 | # |
4 | config ATALK | ||
5 | tristate "Appletalk protocol support" | ||
6 | select LLC | ||
7 | ---help--- | ||
8 | AppleTalk is the protocol that Apple computers can use to communicate | ||
9 | on a network. If your Linux box is connected to such a network and you | ||
10 | wish to connect to it, say Y. You will need to use the netatalk package | ||
11 | so that your Linux box can act as a print and file server for Macs as | ||
12 | well as access AppleTalk printers. Check out | ||
13 | <http://www.zettabyte.net/netatalk/> on the WWW for details. | ||
14 | EtherTalk is the name used for AppleTalk over Ethernet and the | ||
15 | cheaper and slower LocalTalk is AppleTalk over a proprietary Apple | ||
16 | network using serial links. EtherTalk and LocalTalk are fully | ||
17 | supported by Linux. | ||
18 | |||
19 | General information about how to connect Linux, Windows machines and | ||
20 | Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>. The | ||
21 | NET-3-HOWTO, available from | ||
22 | <http://www.tldp.org/docs.html#howto>, contains valuable | ||
23 | information as well. | ||
24 | |||
25 | To compile this driver as a module, choose M here: the module will be | ||
26 | called appletalk. You almost certainly want to compile it as a | ||
27 | module so you can restart your AppleTalk stack without rebooting | ||
28 | your machine. I hear that the GNU boycott of Apple is over, so | ||
29 | even politically correct people are allowed to say Y here. | ||
30 | |||
4 | config DEV_APPLETALK | 31 | config DEV_APPLETALK |
5 | bool "Appletalk interfaces support" | 32 | bool "Appletalk interfaces support" |
6 | depends on ATALK | 33 | depends on ATALK |
diff --git a/drivers/net/myri_sbus.c b/drivers/net/myri_sbus.c index aad5494c83cf..f0996ce5c268 100644 --- a/drivers/net/myri_sbus.c +++ b/drivers/net/myri_sbus.c | |||
@@ -369,7 +369,7 @@ static void myri_tx(struct myri_eth *mp, struct net_device *dev) | |||
369 | * assume 802.3 if the type field is short enough to be a length. | 369 | * assume 802.3 if the type field is short enough to be a length. |
370 | * This is normal practice and works for any 'now in use' protocol. | 370 | * This is normal practice and works for any 'now in use' protocol. |
371 | */ | 371 | */ |
372 | static unsigned short myri_type_trans(struct sk_buff *skb, struct net_device *dev) | 372 | static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev) |
373 | { | 373 | { |
374 | struct ethhdr *eth; | 374 | struct ethhdr *eth; |
375 | unsigned char *rawp; | 375 | unsigned char *rawp; |
diff --git a/drivers/net/plip.c b/drivers/net/plip.c index f4b62405d2e5..21537ee3a6a7 100644 --- a/drivers/net/plip.c +++ b/drivers/net/plip.c | |||
@@ -540,7 +540,7 @@ plip_receive(unsigned short nibble_timeout, struct net_device *dev, | |||
540 | * in far too many old systems not all even running Linux. | 540 | * in far too many old systems not all even running Linux. |
541 | */ | 541 | */ |
542 | 542 | ||
543 | static unsigned short plip_type_trans(struct sk_buff *skb, struct net_device *dev) | 543 | static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev) |
544 | { | 544 | { |
545 | struct ethhdr *eth; | 545 | struct ethhdr *eth; |
546 | unsigned char *rawp; | 546 | unsigned char *rawp; |
diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 7217d44e8854..2c83cca34b86 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c | |||
@@ -861,8 +861,7 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port, | |||
861 | /* | 861 | /* |
862 | * Mark it for our own raw sockets interface | 862 | * Mark it for our own raw sockets interface |
863 | */ | 863 | */ |
864 | static unsigned short farsync_type_trans(struct sk_buff *skb, | 864 | static __be16 farsync_type_trans(struct sk_buff *skb, struct net_device *dev) |
865 | struct net_device *dev) | ||
866 | { | 865 | { |
867 | skb->dev = dev; | 866 | skb->dev = dev; |
868 | skb->mac.raw = skb->data; | 867 | skb->mac.raw = skb->data; |
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index 87496843681a..48c03c11cd9a 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c | |||
@@ -91,8 +91,7 @@ static void cisco_keepalive_send(struct net_device *dev, u32 type, | |||
91 | 91 | ||
92 | 92 | ||
93 | 93 | ||
94 | static unsigned short cisco_type_trans(struct sk_buff *skb, | 94 | static __be16 cisco_type_trans(struct sk_buff *skb, struct net_device *dev) |
95 | struct net_device *dev) | ||
96 | { | 95 | { |
97 | hdlc_header *data = (hdlc_header*)skb->data; | 96 | hdlc_header *data = (hdlc_header*)skb->data; |
98 | 97 | ||
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index 7cd6195a2e46..b81263eaede0 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c | |||
@@ -66,8 +66,7 @@ static void ppp_close(struct net_device *dev) | |||
66 | 66 | ||
67 | 67 | ||
68 | 68 | ||
69 | static unsigned short ppp_type_trans(struct sk_buff *skb, | 69 | static __be16 ppp_type_trans(struct sk_buff *skb, struct net_device *dev) |
70 | struct net_device *dev) | ||
71 | { | 70 | { |
72 | return __constant_htons(ETH_P_WAN_PPP); | 71 | return __constant_htons(ETH_P_WAN_PPP); |
73 | } | 72 | } |
diff --git a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c index c41fb70b6929..9456d31cb1c1 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c | |||
@@ -24,8 +24,7 @@ | |||
24 | #include <linux/hdlc.h> | 24 | #include <linux/hdlc.h> |
25 | 25 | ||
26 | 26 | ||
27 | static unsigned short raw_type_trans(struct sk_buff *skb, | 27 | static __be16 raw_type_trans(struct sk_buff *skb, struct net_device *dev) |
28 | struct net_device *dev) | ||
29 | { | 28 | { |
30 | return __constant_htons(ETH_P_IP); | 29 | return __constant_htons(ETH_P_IP); |
31 | } | 30 | } |
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 3cb88c770037..8f4d2999af8e 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -2210,7 +2210,7 @@ no_mem: | |||
2210 | return NULL; | 2210 | return NULL; |
2211 | } | 2211 | } |
2212 | 2212 | ||
2213 | static inline unsigned short | 2213 | static inline __be16 |
2214 | qeth_type_trans(struct sk_buff *skb, struct net_device *dev) | 2214 | qeth_type_trans(struct sk_buff *skb, struct net_device *dev) |
2215 | { | 2215 | { |
2216 | struct qeth_card *card; | 2216 | struct qeth_card *card; |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index d79cd218a551..df014c2a7c54 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -65,12 +65,14 @@ obj-$(CONFIG_USB_EMI26) += misc/ | |||
65 | obj-$(CONFIG_USB_EMI62) += misc/ | 65 | obj-$(CONFIG_USB_EMI62) += misc/ |
66 | obj-$(CONFIG_USB_IDMOUSE) += misc/ | 66 | obj-$(CONFIG_USB_IDMOUSE) += misc/ |
67 | obj-$(CONFIG_USB_LCD) += misc/ | 67 | obj-$(CONFIG_USB_LCD) += misc/ |
68 | obj-$(CONFIG_USB_LD) += misc/ | ||
68 | obj-$(CONFIG_USB_LED) += misc/ | 69 | obj-$(CONFIG_USB_LED) += misc/ |
69 | obj-$(CONFIG_USB_LEGOTOWER) += misc/ | 70 | obj-$(CONFIG_USB_LEGOTOWER) += misc/ |
70 | obj-$(CONFIG_USB_RIO500) += misc/ | 71 | obj-$(CONFIG_USB_RIO500) += misc/ |
71 | obj-$(CONFIG_USB_TEST) += misc/ | 72 | obj-$(CONFIG_USB_TEST) += misc/ |
72 | obj-$(CONFIG_USB_USS720) += misc/ | 73 | obj-$(CONFIG_USB_USS720) += misc/ |
73 | obj-$(CONFIG_USB_PHIDGETSERVO) += misc/ | 74 | obj-$(CONFIG_USB_PHIDGETSERVO) += misc/ |
75 | obj-$(CONFIG_USB_SISUSBVGA) += misc/ | ||
74 | 76 | ||
75 | obj-$(CONFIG_USB_ATM) += atm/ | 77 | obj-$(CONFIG_USB_ATM) += atm/ |
76 | obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ | 78 | obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ |
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index cbd4a7d25d0b..8e184e2641cb 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c | |||
@@ -427,7 +427,7 @@ static void cxacru_poll_status(struct cxacru_data *instance) | |||
427 | atm_dev->link_rate = buf[CXINF_DOWNSTREAM_RATE] * 1000 / 424; | 427 | atm_dev->link_rate = buf[CXINF_DOWNSTREAM_RATE] * 1000 / 424; |
428 | atm_dev->signal = ATM_PHY_SIG_FOUND; | 428 | atm_dev->signal = ATM_PHY_SIG_FOUND; |
429 | 429 | ||
430 | dev_info(dev, "ADSL line: up (%d Kib/s down | %d Kib/s up)\n", | 430 | dev_info(dev, "ADSL line: up (%d kb/s down | %d kb/s up)\n", |
431 | buf[CXINF_DOWNSTREAM_RATE], buf[CXINF_UPSTREAM_RATE]); | 431 | buf[CXINF_DOWNSTREAM_RATE], buf[CXINF_UPSTREAM_RATE]); |
432 | break; | 432 | break; |
433 | 433 | ||
diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index 6a6eaa2a3b1c..d0cbbb7f0385 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c | |||
@@ -100,6 +100,8 @@ struct speedtch_instance_data { | |||
100 | 100 | ||
101 | struct work_struct status_checker; | 101 | struct work_struct status_checker; |
102 | 102 | ||
103 | unsigned char last_status; | ||
104 | |||
103 | int poll_delay; /* milliseconds */ | 105 | int poll_delay; /* milliseconds */ |
104 | 106 | ||
105 | struct timer_list resubmit_timer; | 107 | struct timer_list resubmit_timer; |
@@ -423,52 +425,48 @@ static void speedtch_check_status(struct speedtch_instance_data *instance) | |||
423 | struct usbatm_data *usbatm = instance->usbatm; | 425 | struct usbatm_data *usbatm = instance->usbatm; |
424 | struct atm_dev *atm_dev = usbatm->atm_dev; | 426 | struct atm_dev *atm_dev = usbatm->atm_dev; |
425 | unsigned char *buf = instance->scratch_buffer; | 427 | unsigned char *buf = instance->scratch_buffer; |
426 | int ret; | 428 | int down_speed, up_speed, ret; |
429 | unsigned char status; | ||
427 | 430 | ||
428 | atm_dbg(usbatm, "%s entered\n", __func__); | 431 | atm_dbg(usbatm, "%s entered\n", __func__); |
429 | 432 | ||
430 | ret = speedtch_read_status(instance); | 433 | ret = speedtch_read_status(instance); |
431 | if (ret < 0) { | 434 | if (ret < 0) { |
432 | atm_warn(usbatm, "error %d fetching device status\n", ret); | 435 | atm_warn(usbatm, "error %d fetching device status\n", ret); |
433 | if (instance->poll_delay < MAX_POLL_DELAY) | 436 | instance->poll_delay = min(2 * instance->poll_delay, MAX_POLL_DELAY); |
434 | instance->poll_delay *= 2; | ||
435 | return; | 437 | return; |
436 | } | 438 | } |
437 | 439 | ||
438 | if (instance->poll_delay > MIN_POLL_DELAY) | 440 | instance->poll_delay = max(instance->poll_delay / 2, MIN_POLL_DELAY); |
439 | instance->poll_delay /= 2; | ||
440 | 441 | ||
441 | atm_dbg(usbatm, "%s: line state %02x\n", __func__, buf[OFFSET_7]); | 442 | status = buf[OFFSET_7]; |
442 | 443 | ||
443 | switch (buf[OFFSET_7]) { | 444 | atm_dbg(usbatm, "%s: line state %02x\n", __func__, status); |
444 | case 0: | 445 | |
445 | if (atm_dev->signal != ATM_PHY_SIG_LOST) { | 446 | if ((status != instance->last_status) || !status) { |
447 | switch (status) { | ||
448 | case 0: | ||
446 | atm_dev->signal = ATM_PHY_SIG_LOST; | 449 | atm_dev->signal = ATM_PHY_SIG_LOST; |
447 | atm_info(usbatm, "ADSL line is down\n"); | 450 | if (instance->last_status) |
448 | /* It'll never resync again unless we ask it to... */ | 451 | atm_info(usbatm, "ADSL line is down\n"); |
452 | /* It may never resync again unless we ask it to... */ | ||
449 | ret = speedtch_start_synchro(instance); | 453 | ret = speedtch_start_synchro(instance); |
450 | } | 454 | break; |
451 | break; | ||
452 | 455 | ||
453 | case 0x08: | 456 | case 0x08: |
454 | if (atm_dev->signal != ATM_PHY_SIG_UNKNOWN) { | ||
455 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; | 457 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; |
456 | atm_info(usbatm, "ADSL line is blocked?\n"); | 458 | atm_info(usbatm, "ADSL line is blocked?\n"); |
457 | } | 459 | break; |
458 | break; | ||
459 | 460 | ||
460 | case 0x10: | 461 | case 0x10: |
461 | if (atm_dev->signal != ATM_PHY_SIG_LOST) { | ||
462 | atm_dev->signal = ATM_PHY_SIG_LOST; | 462 | atm_dev->signal = ATM_PHY_SIG_LOST; |
463 | atm_info(usbatm, "ADSL line is synchronising\n"); | 463 | atm_info(usbatm, "ADSL line is synchronising\n"); |
464 | } | 464 | break; |
465 | break; | ||
466 | 465 | ||
467 | case 0x20: | 466 | case 0x20: |
468 | if (atm_dev->signal != ATM_PHY_SIG_FOUND) { | 467 | down_speed = buf[OFFSET_b] | (buf[OFFSET_b + 1] << 8) |
469 | int down_speed = buf[OFFSET_b] | (buf[OFFSET_b + 1] << 8) | ||
470 | | (buf[OFFSET_b + 2] << 16) | (buf[OFFSET_b + 3] << 24); | 468 | | (buf[OFFSET_b + 2] << 16) | (buf[OFFSET_b + 3] << 24); |
471 | int up_speed = buf[OFFSET_b + 4] | (buf[OFFSET_b + 5] << 8) | 469 | up_speed = buf[OFFSET_b + 4] | (buf[OFFSET_b + 5] << 8) |
472 | | (buf[OFFSET_b + 6] << 16) | (buf[OFFSET_b + 7] << 24); | 470 | | (buf[OFFSET_b + 6] << 16) | (buf[OFFSET_b + 7] << 24); |
473 | 471 | ||
474 | if (!(down_speed & 0x0000ffff) && !(up_speed & 0x0000ffff)) { | 472 | if (!(down_speed & 0x0000ffff) && !(up_speed & 0x0000ffff)) { |
@@ -480,17 +478,17 @@ static void speedtch_check_status(struct speedtch_instance_data *instance) | |||
480 | atm_dev->signal = ATM_PHY_SIG_FOUND; | 478 | atm_dev->signal = ATM_PHY_SIG_FOUND; |
481 | 479 | ||
482 | atm_info(usbatm, | 480 | atm_info(usbatm, |
483 | "ADSL line is up (%d Kib/s down | %d Kib/s up)\n", | 481 | "ADSL line is up (%d kb/s down | %d kb/s up)\n", |
484 | down_speed, up_speed); | 482 | down_speed, up_speed); |
485 | } | 483 | break; |
486 | break; | ||
487 | 484 | ||
488 | default: | 485 | default: |
489 | if (atm_dev->signal != ATM_PHY_SIG_UNKNOWN) { | ||
490 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; | 486 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; |
491 | atm_info(usbatm, "Unknown line state %02x\n", buf[OFFSET_7]); | 487 | atm_info(usbatm, "Unknown line state %02x\n", status); |
488 | break; | ||
492 | } | 489 | } |
493 | break; | 490 | |
491 | instance->last_status = status; | ||
494 | } | 492 | } |
495 | } | 493 | } |
496 | 494 | ||
@@ -730,6 +728,7 @@ static int speedtch_bind(struct usbatm_data *usbatm, | |||
730 | 728 | ||
731 | instance->status_checker.timer.function = speedtch_status_poll; | 729 | instance->status_checker.timer.function = speedtch_status_poll; |
732 | instance->status_checker.timer.data = (unsigned long)instance; | 730 | instance->status_checker.timer.data = (unsigned long)instance; |
731 | instance->last_status = 0xff; | ||
733 | instance->poll_delay = MIN_POLL_DELAY; | 732 | instance->poll_delay = MIN_POLL_DELAY; |
734 | 733 | ||
735 | init_timer(&instance->resubmit_timer); | 734 | init_timer(&instance->resubmit_timer); |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 69e859e0f51d..adff5a77e31f 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -422,6 +422,17 @@ bail_out: | |||
422 | return -EIO; | 422 | return -EIO; |
423 | } | 423 | } |
424 | 424 | ||
425 | static void acm_tty_unregister(struct acm *acm) | ||
426 | { | ||
427 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
428 | usb_put_intf(acm->control); | ||
429 | acm_table[acm->minor] = NULL; | ||
430 | usb_free_urb(acm->ctrlurb); | ||
431 | usb_free_urb(acm->readurb); | ||
432 | usb_free_urb(acm->writeurb); | ||
433 | kfree(acm); | ||
434 | } | ||
435 | |||
425 | static void acm_tty_close(struct tty_struct *tty, struct file *filp) | 436 | static void acm_tty_close(struct tty_struct *tty, struct file *filp) |
426 | { | 437 | { |
427 | struct acm *acm = tty->driver_data; | 438 | struct acm *acm = tty->driver_data; |
@@ -436,14 +447,8 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp) | |||
436 | usb_kill_urb(acm->ctrlurb); | 447 | usb_kill_urb(acm->ctrlurb); |
437 | usb_kill_urb(acm->writeurb); | 448 | usb_kill_urb(acm->writeurb); |
438 | usb_kill_urb(acm->readurb); | 449 | usb_kill_urb(acm->readurb); |
439 | } else { | 450 | } else |
440 | tty_unregister_device(acm_tty_driver, acm->minor); | 451 | acm_tty_unregister(acm); |
441 | acm_table[acm->minor] = NULL; | ||
442 | usb_free_urb(acm->ctrlurb); | ||
443 | usb_free_urb(acm->readurb); | ||
444 | usb_free_urb(acm->writeurb); | ||
445 | kfree(acm); | ||
446 | } | ||
447 | } | 452 | } |
448 | up(&open_sem); | 453 | up(&open_sem); |
449 | } | 454 | } |
@@ -905,7 +910,8 @@ skip_normal_probe: | |||
905 | 910 | ||
906 | usb_driver_claim_interface(&acm_driver, data_interface, acm); | 911 | usb_driver_claim_interface(&acm_driver, data_interface, acm); |
907 | 912 | ||
908 | tty_register_device(acm_tty_driver, minor, &intf->dev); | 913 | usb_get_intf(control_interface); |
914 | tty_register_device(acm_tty_driver, minor, &control_interface->dev); | ||
909 | 915 | ||
910 | acm_table[minor] = acm; | 916 | acm_table[minor] = acm; |
911 | usb_set_intfdata (intf, acm); | 917 | usb_set_intfdata (intf, acm); |
@@ -954,12 +960,7 @@ static void acm_disconnect(struct usb_interface *intf) | |||
954 | usb_driver_release_interface(&acm_driver, acm->data); | 960 | usb_driver_release_interface(&acm_driver, acm->data); |
955 | 961 | ||
956 | if (!acm->used) { | 962 | if (!acm->used) { |
957 | tty_unregister_device(acm_tty_driver, acm->minor); | 963 | acm_tty_unregister(acm); |
958 | acm_table[acm->minor] = NULL; | ||
959 | usb_free_urb(acm->ctrlurb); | ||
960 | usb_free_urb(acm->readurb); | ||
961 | usb_free_urb(acm->writeurb); | ||
962 | kfree(acm); | ||
963 | up(&open_sem); | 964 | up(&open_sem); |
964 | return; | 965 | return; |
965 | } | 966 | } |
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index b7827df21f48..fc15b4acc8af 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c | |||
@@ -106,7 +106,7 @@ void hcd_buffer_destroy (struct usb_hcd *hcd) | |||
106 | void *hcd_buffer_alloc ( | 106 | void *hcd_buffer_alloc ( |
107 | struct usb_bus *bus, | 107 | struct usb_bus *bus, |
108 | size_t size, | 108 | size_t size, |
109 | int mem_flags, | 109 | unsigned mem_flags, |
110 | dma_addr_t *dma | 110 | dma_addr_t *dma |
111 | ) | 111 | ) |
112 | { | 112 | { |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 83e732a0d64a..8616356f55e8 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1112,7 +1112,7 @@ static void urb_unlink (struct urb *urb) | |||
1112 | * expects usb_submit_urb() to have sanity checked and conditioned all | 1112 | * expects usb_submit_urb() to have sanity checked and conditioned all |
1113 | * inputs in the urb | 1113 | * inputs in the urb |
1114 | */ | 1114 | */ |
1115 | static int hcd_submit_urb (struct urb *urb, int mem_flags) | 1115 | static int hcd_submit_urb (struct urb *urb, unsigned mem_flags) |
1116 | { | 1116 | { |
1117 | int status; | 1117 | int status; |
1118 | struct usb_hcd *hcd = urb->dev->bus->hcpriv; | 1118 | struct usb_hcd *hcd = urb->dev->bus->hcpriv; |
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 8dc13cde2f73..67db4a999b93 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
@@ -142,12 +142,12 @@ struct hcd_timeout { /* timeouts we allocate */ | |||
142 | 142 | ||
143 | struct usb_operations { | 143 | struct usb_operations { |
144 | int (*get_frame_number) (struct usb_device *usb_dev); | 144 | int (*get_frame_number) (struct usb_device *usb_dev); |
145 | int (*submit_urb) (struct urb *urb, int mem_flags); | 145 | int (*submit_urb) (struct urb *urb, unsigned mem_flags); |
146 | int (*unlink_urb) (struct urb *urb, int status); | 146 | int (*unlink_urb) (struct urb *urb, int status); |
147 | 147 | ||
148 | /* allocate dma-consistent buffer for URB_DMA_NOMAPPING */ | 148 | /* allocate dma-consistent buffer for URB_DMA_NOMAPPING */ |
149 | void *(*buffer_alloc)(struct usb_bus *bus, size_t size, | 149 | void *(*buffer_alloc)(struct usb_bus *bus, size_t size, |
150 | int mem_flags, | 150 | unsigned mem_flags, |
151 | dma_addr_t *dma); | 151 | dma_addr_t *dma); |
152 | void (*buffer_free)(struct usb_bus *bus, size_t size, | 152 | void (*buffer_free)(struct usb_bus *bus, size_t size, |
153 | void *addr, dma_addr_t dma); | 153 | void *addr, dma_addr_t dma); |
@@ -200,7 +200,7 @@ struct hc_driver { | |||
200 | int (*urb_enqueue) (struct usb_hcd *hcd, | 200 | int (*urb_enqueue) (struct usb_hcd *hcd, |
201 | struct usb_host_endpoint *ep, | 201 | struct usb_host_endpoint *ep, |
202 | struct urb *urb, | 202 | struct urb *urb, |
203 | int mem_flags); | 203 | unsigned mem_flags); |
204 | int (*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb); | 204 | int (*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb); |
205 | 205 | ||
206 | /* hw synch, freeing endpoint resources that urb_dequeue can't */ | 206 | /* hw synch, freeing endpoint resources that urb_dequeue can't */ |
@@ -247,7 +247,7 @@ int hcd_buffer_create (struct usb_hcd *hcd); | |||
247 | void hcd_buffer_destroy (struct usb_hcd *hcd); | 247 | void hcd_buffer_destroy (struct usb_hcd *hcd); |
248 | 248 | ||
249 | void *hcd_buffer_alloc (struct usb_bus *bus, size_t size, | 249 | void *hcd_buffer_alloc (struct usb_bus *bus, size_t size, |
250 | int mem_flags, dma_addr_t *dma); | 250 | unsigned mem_flags, dma_addr_t *dma); |
251 | void hcd_buffer_free (struct usb_bus *bus, size_t size, | 251 | void hcd_buffer_free (struct usb_bus *bus, size_t size, |
252 | void *addr, dma_addr_t dma); | 252 | void *addr, dma_addr_t dma); |
253 | 253 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 32ff32181852..c3e46d24a37e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/ioctl.h> | 26 | #include <linux/ioctl.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include <linux/usbdevice_fs.h> | 28 | #include <linux/usbdevice_fs.h> |
29 | #include <linux/kthread.h> | ||
29 | 30 | ||
30 | #include <asm/semaphore.h> | 31 | #include <asm/semaphore.h> |
31 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
@@ -47,8 +48,7 @@ static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */ | |||
47 | /* Wakes up khubd */ | 48 | /* Wakes up khubd */ |
48 | static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | 49 | static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); |
49 | 50 | ||
50 | static pid_t khubd_pid = 0; /* PID of khubd */ | 51 | static struct task_struct *khubd_task; |
51 | static DECLARE_COMPLETION(khubd_exited); | ||
52 | 52 | ||
53 | /* cycle leds on hubs that aren't blinking for attention */ | 53 | /* cycle leds on hubs that aren't blinking for attention */ |
54 | static int blinkenlights = 0; | 54 | static int blinkenlights = 0; |
@@ -2807,23 +2807,16 @@ loop: | |||
2807 | 2807 | ||
2808 | static int hub_thread(void *__unused) | 2808 | static int hub_thread(void *__unused) |
2809 | { | 2809 | { |
2810 | /* | ||
2811 | * This thread doesn't need any user-level access, | ||
2812 | * so get rid of all our resources | ||
2813 | */ | ||
2814 | |||
2815 | daemonize("khubd"); | ||
2816 | allow_signal(SIGKILL); | ||
2817 | |||
2818 | /* Send me a signal to get me die (for debugging) */ | ||
2819 | do { | 2810 | do { |
2820 | hub_events(); | 2811 | hub_events(); |
2821 | wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); | 2812 | wait_event_interruptible(khubd_wait, |
2813 | !list_empty(&hub_event_list) || | ||
2814 | kthread_should_stop()); | ||
2822 | try_to_freeze(); | 2815 | try_to_freeze(); |
2823 | } while (!signal_pending(current)); | 2816 | } while (!kthread_should_stop() || !list_empty(&hub_event_list)); |
2824 | 2817 | ||
2825 | pr_debug ("%s: khubd exiting\n", usbcore_name); | 2818 | pr_debug("%s: khubd exiting\n", usbcore_name); |
2826 | complete_and_exit(&khubd_exited, 0); | 2819 | return 0; |
2827 | } | 2820 | } |
2828 | 2821 | ||
2829 | static struct usb_device_id hub_id_table [] = { | 2822 | static struct usb_device_id hub_id_table [] = { |
@@ -2849,20 +2842,15 @@ static struct usb_driver hub_driver = { | |||
2849 | 2842 | ||
2850 | int usb_hub_init(void) | 2843 | int usb_hub_init(void) |
2851 | { | 2844 | { |
2852 | pid_t pid; | ||
2853 | |||
2854 | if (usb_register(&hub_driver) < 0) { | 2845 | if (usb_register(&hub_driver) < 0) { |
2855 | printk(KERN_ERR "%s: can't register hub driver\n", | 2846 | printk(KERN_ERR "%s: can't register hub driver\n", |
2856 | usbcore_name); | 2847 | usbcore_name); |
2857 | return -1; | 2848 | return -1; |
2858 | } | 2849 | } |
2859 | 2850 | ||
2860 | pid = kernel_thread(hub_thread, NULL, CLONE_KERNEL); | 2851 | khubd_task = kthread_run(hub_thread, NULL, "khubd"); |
2861 | if (pid >= 0) { | 2852 | if (!IS_ERR(khubd_task)) |
2862 | khubd_pid = pid; | ||
2863 | |||
2864 | return 0; | 2853 | return 0; |
2865 | } | ||
2866 | 2854 | ||
2867 | /* Fall through if kernel_thread failed */ | 2855 | /* Fall through if kernel_thread failed */ |
2868 | usb_deregister(&hub_driver); | 2856 | usb_deregister(&hub_driver); |
@@ -2873,12 +2861,7 @@ int usb_hub_init(void) | |||
2873 | 2861 | ||
2874 | void usb_hub_cleanup(void) | 2862 | void usb_hub_cleanup(void) |
2875 | { | 2863 | { |
2876 | int ret; | 2864 | kthread_stop(khubd_task); |
2877 | |||
2878 | /* Kill the thread */ | ||
2879 | ret = kill_proc(khubd_pid, SIGKILL, 1); | ||
2880 | |||
2881 | wait_for_completion(&khubd_exited); | ||
2882 | 2865 | ||
2883 | /* | 2866 | /* |
2884 | * Hub resources are freed for us by usb_deregister. It calls | 2867 | * Hub resources are freed for us by usb_deregister. It calls |
@@ -2890,7 +2873,6 @@ void usb_hub_cleanup(void) | |||
2890 | usb_deregister(&hub_driver); | 2873 | usb_deregister(&hub_driver); |
2891 | } /* usb_hub_cleanup() */ | 2874 | } /* usb_hub_cleanup() */ |
2892 | 2875 | ||
2893 | |||
2894 | static int config_descriptors_changed(struct usb_device *udev) | 2876 | static int config_descriptors_changed(struct usb_device *udev) |
2895 | { | 2877 | { |
2896 | unsigned index; | 2878 | unsigned index; |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index f50aaf25c98e..a428ef479bd7 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -320,7 +320,7 @@ int usb_sg_init ( | |||
320 | struct scatterlist *sg, | 320 | struct scatterlist *sg, |
321 | int nents, | 321 | int nents, |
322 | size_t length, | 322 | size_t length, |
323 | int mem_flags | 323 | unsigned mem_flags |
324 | ) | 324 | ) |
325 | { | 325 | { |
326 | int i; | 326 | int i; |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 740cb4c668df..00297f113849 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -196,6 +196,7 @@ usb_descriptor_attr (bDeviceClass, "%02x\n") | |||
196 | usb_descriptor_attr (bDeviceSubClass, "%02x\n") | 196 | usb_descriptor_attr (bDeviceSubClass, "%02x\n") |
197 | usb_descriptor_attr (bDeviceProtocol, "%02x\n") | 197 | usb_descriptor_attr (bDeviceProtocol, "%02x\n") |
198 | usb_descriptor_attr (bNumConfigurations, "%d\n") | 198 | usb_descriptor_attr (bNumConfigurations, "%d\n") |
199 | usb_descriptor_attr (bMaxPacketSize0, "%d\n") | ||
199 | 200 | ||
200 | static struct attribute *dev_attrs[] = { | 201 | static struct attribute *dev_attrs[] = { |
201 | /* current configuration's attributes */ | 202 | /* current configuration's attributes */ |
@@ -211,6 +212,7 @@ static struct attribute *dev_attrs[] = { | |||
211 | &dev_attr_bDeviceSubClass.attr, | 212 | &dev_attr_bDeviceSubClass.attr, |
212 | &dev_attr_bDeviceProtocol.attr, | 213 | &dev_attr_bDeviceProtocol.attr, |
213 | &dev_attr_bNumConfigurations.attr, | 214 | &dev_attr_bNumConfigurations.attr, |
215 | &dev_attr_bMaxPacketSize0.attr, | ||
214 | &dev_attr_speed.attr, | 216 | &dev_attr_speed.attr, |
215 | &dev_attr_devnum.attr, | 217 | &dev_attr_devnum.attr, |
216 | &dev_attr_version.attr, | 218 | &dev_attr_version.attr, |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 0faf18d511de..c0feee25ff0a 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -60,7 +60,7 @@ void usb_init_urb(struct urb *urb) | |||
60 | * | 60 | * |
61 | * The driver must call usb_free_urb() when it is finished with the urb. | 61 | * The driver must call usb_free_urb() when it is finished with the urb. |
62 | */ | 62 | */ |
63 | struct urb *usb_alloc_urb(int iso_packets, int mem_flags) | 63 | struct urb *usb_alloc_urb(int iso_packets, unsigned mem_flags) |
64 | { | 64 | { |
65 | struct urb *urb; | 65 | struct urb *urb; |
66 | 66 | ||
@@ -224,7 +224,7 @@ struct urb * usb_get_urb(struct urb *urb) | |||
224 | * GFP_NOIO, unless b) or c) apply | 224 | * GFP_NOIO, unless b) or c) apply |
225 | * | 225 | * |
226 | */ | 226 | */ |
227 | int usb_submit_urb(struct urb *urb, int mem_flags) | 227 | int usb_submit_urb(struct urb *urb, unsigned mem_flags) |
228 | { | 228 | { |
229 | int pipe, temp, max; | 229 | int pipe, temp, max; |
230 | struct usb_device *dev; | 230 | struct usb_device *dev; |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index a3c42203213a..99c85d2f92da 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -1129,7 +1129,7 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size, | |||
1129 | void *usb_buffer_alloc ( | 1129 | void *usb_buffer_alloc ( |
1130 | struct usb_device *dev, | 1130 | struct usb_device *dev, |
1131 | size_t size, | 1131 | size_t size, |
1132 | int mem_flags, | 1132 | unsigned mem_flags, |
1133 | dma_addr_t *dma | 1133 | dma_addr_t *dma |
1134 | ) | 1134 | ) |
1135 | { | 1135 | { |
@@ -1532,6 +1532,9 @@ EXPORT_SYMBOL(usb_register); | |||
1532 | EXPORT_SYMBOL(usb_deregister); | 1532 | EXPORT_SYMBOL(usb_deregister); |
1533 | EXPORT_SYMBOL(usb_disabled); | 1533 | EXPORT_SYMBOL(usb_disabled); |
1534 | 1534 | ||
1535 | EXPORT_SYMBOL_GPL(usb_get_intf); | ||
1536 | EXPORT_SYMBOL_GPL(usb_put_intf); | ||
1537 | |||
1535 | EXPORT_SYMBOL(usb_alloc_dev); | 1538 | EXPORT_SYMBOL(usb_alloc_dev); |
1536 | EXPORT_SYMBOL(usb_put_dev); | 1539 | EXPORT_SYMBOL(usb_put_dev); |
1537 | EXPORT_SYMBOL(usb_get_dev); | 1540 | EXPORT_SYMBOL(usb_get_dev); |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 4d692670f288..583db7c38cf1 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -470,7 +470,7 @@ static int dummy_disable (struct usb_ep *_ep) | |||
470 | } | 470 | } |
471 | 471 | ||
472 | static struct usb_request * | 472 | static struct usb_request * |
473 | dummy_alloc_request (struct usb_ep *_ep, int mem_flags) | 473 | dummy_alloc_request (struct usb_ep *_ep, unsigned mem_flags) |
474 | { | 474 | { |
475 | struct dummy_ep *ep; | 475 | struct dummy_ep *ep; |
476 | struct dummy_request *req; | 476 | struct dummy_request *req; |
@@ -507,7 +507,7 @@ dummy_alloc_buffer ( | |||
507 | struct usb_ep *_ep, | 507 | struct usb_ep *_ep, |
508 | unsigned bytes, | 508 | unsigned bytes, |
509 | dma_addr_t *dma, | 509 | dma_addr_t *dma, |
510 | int mem_flags | 510 | unsigned mem_flags |
511 | ) { | 511 | ) { |
512 | char *retval; | 512 | char *retval; |
513 | struct dummy_ep *ep; | 513 | struct dummy_ep *ep; |
@@ -540,7 +540,8 @@ fifo_complete (struct usb_ep *ep, struct usb_request *req) | |||
540 | } | 540 | } |
541 | 541 | ||
542 | static int | 542 | static int |
543 | dummy_queue (struct usb_ep *_ep, struct usb_request *_req, int mem_flags) | 543 | dummy_queue (struct usb_ep *_ep, struct usb_request *_req, |
544 | unsigned mem_flags) | ||
544 | { | 545 | { |
545 | struct dummy_ep *ep; | 546 | struct dummy_ep *ep; |
546 | struct dummy_request *req; | 547 | struct dummy_request *req; |
@@ -998,7 +999,7 @@ static int dummy_urb_enqueue ( | |||
998 | struct usb_hcd *hcd, | 999 | struct usb_hcd *hcd, |
999 | struct usb_host_endpoint *ep, | 1000 | struct usb_host_endpoint *ep, |
1000 | struct urb *urb, | 1001 | struct urb *urb, |
1001 | int mem_flags | 1002 | unsigned mem_flags |
1002 | ) { | 1003 | ) { |
1003 | struct dummy *dum; | 1004 | struct dummy *dum; |
1004 | struct urbp *urbp; | 1005 | struct urbp *urbp; |
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 5bb53ae88969..8509e955007d 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
@@ -945,15 +945,16 @@ config_buf (enum usb_device_speed speed, | |||
945 | 945 | ||
946 | /*-------------------------------------------------------------------------*/ | 946 | /*-------------------------------------------------------------------------*/ |
947 | 947 | ||
948 | static void eth_start (struct eth_dev *dev, int gfp_flags); | 948 | static void eth_start (struct eth_dev *dev, unsigned gfp_flags); |
949 | static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags); | 949 | static int alloc_requests (struct eth_dev *dev, unsigned n, unsigned gfp_flags); |
950 | 950 | ||
951 | static int | 951 | static int |
952 | set_ether_config (struct eth_dev *dev, int gfp_flags) | 952 | set_ether_config (struct eth_dev *dev, unsigned gfp_flags) |
953 | { | 953 | { |
954 | int result = 0; | 954 | int result = 0; |
955 | struct usb_gadget *gadget = dev->gadget; | 955 | struct usb_gadget *gadget = dev->gadget; |
956 | 956 | ||
957 | #if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) | ||
957 | /* status endpoint used for RNDIS and (optionally) CDC */ | 958 | /* status endpoint used for RNDIS and (optionally) CDC */ |
958 | if (!subset_active(dev) && dev->status_ep) { | 959 | if (!subset_active(dev) && dev->status_ep) { |
959 | dev->status = ep_desc (gadget, &hs_status_desc, | 960 | dev->status = ep_desc (gadget, &hs_status_desc, |
@@ -967,6 +968,7 @@ set_ether_config (struct eth_dev *dev, int gfp_flags) | |||
967 | goto done; | 968 | goto done; |
968 | } | 969 | } |
969 | } | 970 | } |
971 | #endif | ||
970 | 972 | ||
971 | dev->in = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc); | 973 | dev->in = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc); |
972 | dev->in_ep->driver_data = dev; | 974 | dev->in_ep->driver_data = dev; |
@@ -1079,7 +1081,7 @@ static void eth_reset_config (struct eth_dev *dev) | |||
1079 | * that returns config descriptors, and altsetting code. | 1081 | * that returns config descriptors, and altsetting code. |
1080 | */ | 1082 | */ |
1081 | static int | 1083 | static int |
1082 | eth_set_config (struct eth_dev *dev, unsigned number, int gfp_flags) | 1084 | eth_set_config (struct eth_dev *dev, unsigned number, unsigned gfp_flags) |
1083 | { | 1085 | { |
1084 | int result = 0; | 1086 | int result = 0; |
1085 | struct usb_gadget *gadget = dev->gadget; | 1087 | struct usb_gadget *gadget = dev->gadget; |
@@ -1596,7 +1598,7 @@ static void defer_kevent (struct eth_dev *dev, int flag) | |||
1596 | static void rx_complete (struct usb_ep *ep, struct usb_request *req); | 1598 | static void rx_complete (struct usb_ep *ep, struct usb_request *req); |
1597 | 1599 | ||
1598 | static int | 1600 | static int |
1599 | rx_submit (struct eth_dev *dev, struct usb_request *req, int gfp_flags) | 1601 | rx_submit (struct eth_dev *dev, struct usb_request *req, unsigned gfp_flags) |
1600 | { | 1602 | { |
1601 | struct sk_buff *skb; | 1603 | struct sk_buff *skb; |
1602 | int retval = -ENOMEM; | 1604 | int retval = -ENOMEM; |
@@ -1722,7 +1724,7 @@ clean: | |||
1722 | } | 1724 | } |
1723 | 1725 | ||
1724 | static int prealloc (struct list_head *list, struct usb_ep *ep, | 1726 | static int prealloc (struct list_head *list, struct usb_ep *ep, |
1725 | unsigned n, int gfp_flags) | 1727 | unsigned n, unsigned gfp_flags) |
1726 | { | 1728 | { |
1727 | unsigned i; | 1729 | unsigned i; |
1728 | struct usb_request *req; | 1730 | struct usb_request *req; |
@@ -1761,7 +1763,7 @@ extra: | |||
1761 | return 0; | 1763 | return 0; |
1762 | } | 1764 | } |
1763 | 1765 | ||
1764 | static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags) | 1766 | static int alloc_requests (struct eth_dev *dev, unsigned n, unsigned gfp_flags) |
1765 | { | 1767 | { |
1766 | int status; | 1768 | int status; |
1767 | 1769 | ||
@@ -1777,7 +1779,7 @@ fail: | |||
1777 | return status; | 1779 | return status; |
1778 | } | 1780 | } |
1779 | 1781 | ||
1780 | static void rx_fill (struct eth_dev *dev, int gfp_flags) | 1782 | static void rx_fill (struct eth_dev *dev, unsigned gfp_flags) |
1781 | { | 1783 | { |
1782 | struct usb_request *req; | 1784 | struct usb_request *req; |
1783 | unsigned long flags; | 1785 | unsigned long flags; |
@@ -2022,7 +2024,7 @@ static int rndis_control_ack (struct net_device *net) | |||
2022 | 2024 | ||
2023 | #endif /* RNDIS */ | 2025 | #endif /* RNDIS */ |
2024 | 2026 | ||
2025 | static void eth_start (struct eth_dev *dev, int gfp_flags) | 2027 | static void eth_start (struct eth_dev *dev, unsigned gfp_flags) |
2026 | { | 2028 | { |
2027 | DEBUG (dev, "%s\n", __FUNCTION__); | 2029 | DEBUG (dev, "%s\n", __FUNCTION__); |
2028 | 2030 | ||
@@ -2428,7 +2430,7 @@ autoconf_fail: | |||
2428 | dev->req->complete = eth_setup_complete; | 2430 | dev->req->complete = eth_setup_complete; |
2429 | 2431 | ||
2430 | /* ... and maybe likewise for status transfer */ | 2432 | /* ... and maybe likewise for status transfer */ |
2431 | #ifdef DEV_CONFIG_CDC | 2433 | #if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) |
2432 | if (dev->status_ep) { | 2434 | if (dev->status_ep) { |
2433 | dev->stat_req = eth_req_alloc (dev->status_ep, | 2435 | dev->stat_req = eth_req_alloc (dev->status_ep, |
2434 | STATUS_BYTECOUNT, GFP_KERNEL); | 2436 | STATUS_BYTECOUNT, GFP_KERNEL); |
diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index ed773a9111de..eaab26f4ed37 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c | |||
@@ -269,7 +269,7 @@ static int goku_ep_disable(struct usb_ep *_ep) | |||
269 | /*-------------------------------------------------------------------------*/ | 269 | /*-------------------------------------------------------------------------*/ |
270 | 270 | ||
271 | static struct usb_request * | 271 | static struct usb_request * |
272 | goku_alloc_request(struct usb_ep *_ep, int gfp_flags) | 272 | goku_alloc_request(struct usb_ep *_ep, unsigned gfp_flags) |
273 | { | 273 | { |
274 | struct goku_request *req; | 274 | struct goku_request *req; |
275 | 275 | ||
@@ -327,7 +327,7 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req) | |||
327 | */ | 327 | */ |
328 | static void * | 328 | static void * |
329 | goku_alloc_buffer(struct usb_ep *_ep, unsigned bytes, | 329 | goku_alloc_buffer(struct usb_ep *_ep, unsigned bytes, |
330 | dma_addr_t *dma, int gfp_flags) | 330 | dma_addr_t *dma, unsigned gfp_flags) |
331 | { | 331 | { |
332 | void *retval; | 332 | void *retval; |
333 | struct goku_ep *ep; | 333 | struct goku_ep *ep; |
@@ -789,7 +789,7 @@ finished: | |||
789 | /*-------------------------------------------------------------------------*/ | 789 | /*-------------------------------------------------------------------------*/ |
790 | 790 | ||
791 | static int | 791 | static int |
792 | goku_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) | 792 | goku_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) |
793 | { | 793 | { |
794 | struct goku_request *req; | 794 | struct goku_request *req; |
795 | struct goku_ep *ep; | 795 | struct goku_ep *ep; |
diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c index df75ab65a5ec..4842577789c9 100644 --- a/drivers/usb/gadget/lh7a40x_udc.c +++ b/drivers/usb/gadget/lh7a40x_udc.c | |||
@@ -1106,7 +1106,7 @@ static int lh7a40x_ep_disable(struct usb_ep *_ep) | |||
1106 | } | 1106 | } |
1107 | 1107 | ||
1108 | static struct usb_request *lh7a40x_alloc_request(struct usb_ep *ep, | 1108 | static struct usb_request *lh7a40x_alloc_request(struct usb_ep *ep, |
1109 | int gfp_flags) | 1109 | unsigned gfp_flags) |
1110 | { | 1110 | { |
1111 | struct lh7a40x_request *req; | 1111 | struct lh7a40x_request *req; |
1112 | 1112 | ||
@@ -1134,7 +1134,7 @@ static void lh7a40x_free_request(struct usb_ep *ep, struct usb_request *_req) | |||
1134 | } | 1134 | } |
1135 | 1135 | ||
1136 | static void *lh7a40x_alloc_buffer(struct usb_ep *ep, unsigned bytes, | 1136 | static void *lh7a40x_alloc_buffer(struct usb_ep *ep, unsigned bytes, |
1137 | dma_addr_t * dma, int gfp_flags) | 1137 | dma_addr_t * dma, unsigned gfp_flags) |
1138 | { | 1138 | { |
1139 | char *retval; | 1139 | char *retval; |
1140 | 1140 | ||
@@ -1158,7 +1158,7 @@ static void lh7a40x_free_buffer(struct usb_ep *ep, void *buf, dma_addr_t dma, | |||
1158 | * NOTE: Sets INDEX register | 1158 | * NOTE: Sets INDEX register |
1159 | */ | 1159 | */ |
1160 | static int lh7a40x_queue(struct usb_ep *_ep, struct usb_request *_req, | 1160 | static int lh7a40x_queue(struct usb_ep *_ep, struct usb_request *_req, |
1161 | int gfp_flags) | 1161 | unsigned gfp_flags) |
1162 | { | 1162 | { |
1163 | struct lh7a40x_request *req; | 1163 | struct lh7a40x_request *req; |
1164 | struct lh7a40x_ep *ep; | 1164 | struct lh7a40x_ep *ep; |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 13a3dbc9949b..477fab2e74d1 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
@@ -376,7 +376,7 @@ static int net2280_disable (struct usb_ep *_ep) | |||
376 | /*-------------------------------------------------------------------------*/ | 376 | /*-------------------------------------------------------------------------*/ |
377 | 377 | ||
378 | static struct usb_request * | 378 | static struct usb_request * |
379 | net2280_alloc_request (struct usb_ep *_ep, int gfp_flags) | 379 | net2280_alloc_request (struct usb_ep *_ep, unsigned gfp_flags) |
380 | { | 380 | { |
381 | struct net2280_ep *ep; | 381 | struct net2280_ep *ep; |
382 | struct net2280_request *req; | 382 | struct net2280_request *req; |
@@ -463,7 +463,7 @@ net2280_alloc_buffer ( | |||
463 | struct usb_ep *_ep, | 463 | struct usb_ep *_ep, |
464 | unsigned bytes, | 464 | unsigned bytes, |
465 | dma_addr_t *dma, | 465 | dma_addr_t *dma, |
466 | int gfp_flags | 466 | unsigned gfp_flags |
467 | ) | 467 | ) |
468 | { | 468 | { |
469 | void *retval; | 469 | void *retval; |
@@ -897,7 +897,7 @@ done (struct net2280_ep *ep, struct net2280_request *req, int status) | |||
897 | /*-------------------------------------------------------------------------*/ | 897 | /*-------------------------------------------------------------------------*/ |
898 | 898 | ||
899 | static int | 899 | static int |
900 | net2280_queue (struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) | 900 | net2280_queue (struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) |
901 | { | 901 | { |
902 | struct net2280_request *req; | 902 | struct net2280_request *req; |
903 | struct net2280_ep *ep; | 903 | struct net2280_ep *ep; |
@@ -1490,7 +1490,7 @@ show_registers (struct device *_dev, struct device_attribute *attr, char *buf) | |||
1490 | unsigned long flags; | 1490 | unsigned long flags; |
1491 | int i; | 1491 | int i; |
1492 | u32 t1, t2; | 1492 | u32 t1, t2; |
1493 | char *s; | 1493 | const char *s; |
1494 | 1494 | ||
1495 | dev = dev_get_drvdata (_dev); | 1495 | dev = dev_get_drvdata (_dev); |
1496 | next = buf; | 1496 | next = buf; |
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index a2b812af6e66..ff5533e69560 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -269,7 +269,7 @@ static int omap_ep_disable(struct usb_ep *_ep) | |||
269 | /*-------------------------------------------------------------------------*/ | 269 | /*-------------------------------------------------------------------------*/ |
270 | 270 | ||
271 | static struct usb_request * | 271 | static struct usb_request * |
272 | omap_alloc_request(struct usb_ep *ep, int gfp_flags) | 272 | omap_alloc_request(struct usb_ep *ep, unsigned gfp_flags) |
273 | { | 273 | { |
274 | struct omap_req *req; | 274 | struct omap_req *req; |
275 | 275 | ||
@@ -298,7 +298,7 @@ omap_alloc_buffer( | |||
298 | struct usb_ep *_ep, | 298 | struct usb_ep *_ep, |
299 | unsigned bytes, | 299 | unsigned bytes, |
300 | dma_addr_t *dma, | 300 | dma_addr_t *dma, |
301 | int gfp_flags | 301 | unsigned gfp_flags |
302 | ) | 302 | ) |
303 | { | 303 | { |
304 | void *retval; | 304 | void *retval; |
@@ -937,7 +937,7 @@ static void dma_channel_release(struct omap_ep *ep) | |||
937 | /*-------------------------------------------------------------------------*/ | 937 | /*-------------------------------------------------------------------------*/ |
938 | 938 | ||
939 | static int | 939 | static int |
940 | omap_ep_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) | 940 | omap_ep_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) |
941 | { | 941 | { |
942 | struct omap_ep *ep = container_of(_ep, struct omap_ep, ep); | 942 | struct omap_ep *ep = container_of(_ep, struct omap_ep, ep); |
943 | struct omap_req *req = container_of(_req, struct omap_req, req); | 943 | struct omap_req *req = container_of(_req, struct omap_req, req); |
@@ -2908,6 +2908,7 @@ static int __exit omap_udc_remove(struct device *dev) | |||
2908 | * make host resumes and VBUS detection trigger OMAP wakeup events; that | 2908 | * make host resumes and VBUS detection trigger OMAP wakeup events; that |
2909 | * may involve talking to an external transceiver (e.g. isp1301). | 2909 | * may involve talking to an external transceiver (e.g. isp1301). |
2910 | */ | 2910 | */ |
2911 | |||
2911 | static int omap_udc_suspend(struct device *dev, pm_message_t message, u32 level) | 2912 | static int omap_udc_suspend(struct device *dev, pm_message_t message, u32 level) |
2912 | { | 2913 | { |
2913 | u32 devstat; | 2914 | u32 devstat; |
@@ -2936,8 +2937,6 @@ static int omap_udc_resume(struct device *dev, u32 level) | |||
2936 | return 0; | 2937 | return 0; |
2937 | 2938 | ||
2938 | DBG("resume + wakeup/SRP\n"); | 2939 | DBG("resume + wakeup/SRP\n"); |
2939 | udc->gadget.dev.parent->power.power_state = PMSG_ON; | ||
2940 | udc->gadget.dev.power.power_state = PMSG_ON; | ||
2941 | omap_pullup(&udc->gadget, 1); | 2940 | omap_pullup(&udc->gadget, 1); |
2942 | 2941 | ||
2943 | /* maybe the host would enumerate us if we nudged it */ | 2942 | /* maybe the host would enumerate us if we nudged it */ |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 6a0b957af335..1507738337c4 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -332,7 +332,7 @@ static int pxa2xx_ep_disable (struct usb_ep *_ep) | |||
332 | * pxa2xx_ep_alloc_request - allocate a request data structure | 332 | * pxa2xx_ep_alloc_request - allocate a request data structure |
333 | */ | 333 | */ |
334 | static struct usb_request * | 334 | static struct usb_request * |
335 | pxa2xx_ep_alloc_request (struct usb_ep *_ep, int gfp_flags) | 335 | pxa2xx_ep_alloc_request (struct usb_ep *_ep, unsigned gfp_flags) |
336 | { | 336 | { |
337 | struct pxa2xx_request *req; | 337 | struct pxa2xx_request *req; |
338 | 338 | ||
@@ -367,7 +367,7 @@ pxa2xx_ep_free_request (struct usb_ep *_ep, struct usb_request *_req) | |||
367 | */ | 367 | */ |
368 | static void * | 368 | static void * |
369 | pxa2xx_ep_alloc_buffer(struct usb_ep *_ep, unsigned bytes, | 369 | pxa2xx_ep_alloc_buffer(struct usb_ep *_ep, unsigned bytes, |
370 | dma_addr_t *dma, int gfp_flags) | 370 | dma_addr_t *dma, unsigned gfp_flags) |
371 | { | 371 | { |
372 | char *retval; | 372 | char *retval; |
373 | 373 | ||
@@ -874,7 +874,7 @@ done: | |||
874 | /*-------------------------------------------------------------------------*/ | 874 | /*-------------------------------------------------------------------------*/ |
875 | 875 | ||
876 | static int | 876 | static int |
877 | pxa2xx_ep_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) | 877 | pxa2xx_ep_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) |
878 | { | 878 | { |
879 | struct pxa2xx_request *req; | 879 | struct pxa2xx_request *req; |
880 | struct pxa2xx_ep *ep; | 880 | struct pxa2xx_ep *ep; |
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index a6e035e24479..bb9b2d94eed5 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
@@ -612,7 +612,7 @@ static void source_sink_complete (struct usb_ep *ep, struct usb_request *req) | |||
612 | } | 612 | } |
613 | 613 | ||
614 | static struct usb_request * | 614 | static struct usb_request * |
615 | source_sink_start_ep (struct usb_ep *ep, int gfp_flags) | 615 | source_sink_start_ep (struct usb_ep *ep, unsigned gfp_flags) |
616 | { | 616 | { |
617 | struct usb_request *req; | 617 | struct usb_request *req; |
618 | int status; | 618 | int status; |
@@ -640,7 +640,7 @@ source_sink_start_ep (struct usb_ep *ep, int gfp_flags) | |||
640 | } | 640 | } |
641 | 641 | ||
642 | static int | 642 | static int |
643 | set_source_sink_config (struct zero_dev *dev, int gfp_flags) | 643 | set_source_sink_config (struct zero_dev *dev, unsigned gfp_flags) |
644 | { | 644 | { |
645 | int result = 0; | 645 | int result = 0; |
646 | struct usb_ep *ep; | 646 | struct usb_ep *ep; |
@@ -744,7 +744,7 @@ static void loopback_complete (struct usb_ep *ep, struct usb_request *req) | |||
744 | } | 744 | } |
745 | 745 | ||
746 | static int | 746 | static int |
747 | set_loopback_config (struct zero_dev *dev, int gfp_flags) | 747 | set_loopback_config (struct zero_dev *dev, unsigned gfp_flags) |
748 | { | 748 | { |
749 | int result = 0; | 749 | int result = 0; |
750 | struct usb_ep *ep; | 750 | struct usb_ep *ep; |
@@ -845,7 +845,7 @@ static void zero_reset_config (struct zero_dev *dev) | |||
845 | * by limiting configuration choices (like the pxa2xx). | 845 | * by limiting configuration choices (like the pxa2xx). |
846 | */ | 846 | */ |
847 | static int | 847 | static int |
848 | zero_set_config (struct zero_dev *dev, unsigned number, int gfp_flags) | 848 | zero_set_config (struct zero_dev *dev, unsigned number, unsigned gfp_flags) |
849 | { | 849 | { |
850 | int result = 0; | 850 | int result = 0; |
851 | struct usb_gadget *gadget = dev->gadget; | 851 | struct usb_gadget *gadget = dev->gadget; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 35248a37b717..149b13fc0a71 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -960,7 +960,7 @@ static int ehci_urb_enqueue ( | |||
960 | struct usb_hcd *hcd, | 960 | struct usb_hcd *hcd, |
961 | struct usb_host_endpoint *ep, | 961 | struct usb_host_endpoint *ep, |
962 | struct urb *urb, | 962 | struct urb *urb, |
963 | int mem_flags | 963 | unsigned mem_flags |
964 | ) { | 964 | ) { |
965 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 965 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
966 | struct list_head qtd_list; | 966 | struct list_head qtd_list; |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 45d89a7083b1..d74b2d68a50e 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -898,7 +898,7 @@ submit_async ( | |||
898 | struct usb_host_endpoint *ep, | 898 | struct usb_host_endpoint *ep, |
899 | struct urb *urb, | 899 | struct urb *urb, |
900 | struct list_head *qtd_list, | 900 | struct list_head *qtd_list, |
901 | int mem_flags | 901 | unsigned mem_flags |
902 | ) { | 902 | ) { |
903 | struct ehci_qtd *qtd; | 903 | struct ehci_qtd *qtd; |
904 | int epnum; | 904 | int epnum; |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index c2104cad4033..9af4f64532a9 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -588,7 +588,7 @@ static int intr_submit ( | |||
588 | struct usb_host_endpoint *ep, | 588 | struct usb_host_endpoint *ep, |
589 | struct urb *urb, | 589 | struct urb *urb, |
590 | struct list_head *qtd_list, | 590 | struct list_head *qtd_list, |
591 | int mem_flags | 591 | unsigned mem_flags |
592 | ) { | 592 | ) { |
593 | unsigned epnum; | 593 | unsigned epnum; |
594 | unsigned long flags; | 594 | unsigned long flags; |
@@ -633,7 +633,7 @@ done: | |||
633 | /* ehci_iso_stream ops work with both ITD and SITD */ | 633 | /* ehci_iso_stream ops work with both ITD and SITD */ |
634 | 634 | ||
635 | static struct ehci_iso_stream * | 635 | static struct ehci_iso_stream * |
636 | iso_stream_alloc (int mem_flags) | 636 | iso_stream_alloc (unsigned mem_flags) |
637 | { | 637 | { |
638 | struct ehci_iso_stream *stream; | 638 | struct ehci_iso_stream *stream; |
639 | 639 | ||
@@ -846,7 +846,7 @@ iso_stream_find (struct ehci_hcd *ehci, struct urb *urb) | |||
846 | /* ehci_iso_sched ops can be ITD-only or SITD-only */ | 846 | /* ehci_iso_sched ops can be ITD-only or SITD-only */ |
847 | 847 | ||
848 | static struct ehci_iso_sched * | 848 | static struct ehci_iso_sched * |
849 | iso_sched_alloc (unsigned packets, int mem_flags) | 849 | iso_sched_alloc (unsigned packets, unsigned mem_flags) |
850 | { | 850 | { |
851 | struct ehci_iso_sched *iso_sched; | 851 | struct ehci_iso_sched *iso_sched; |
852 | int size = sizeof *iso_sched; | 852 | int size = sizeof *iso_sched; |
@@ -919,7 +919,7 @@ itd_urb_transaction ( | |||
919 | struct ehci_iso_stream *stream, | 919 | struct ehci_iso_stream *stream, |
920 | struct ehci_hcd *ehci, | 920 | struct ehci_hcd *ehci, |
921 | struct urb *urb, | 921 | struct urb *urb, |
922 | int mem_flags | 922 | unsigned mem_flags |
923 | ) | 923 | ) |
924 | { | 924 | { |
925 | struct ehci_itd *itd; | 925 | struct ehci_itd *itd; |
@@ -1412,7 +1412,8 @@ itd_complete ( | |||
1412 | 1412 | ||
1413 | /*-------------------------------------------------------------------------*/ | 1413 | /*-------------------------------------------------------------------------*/ |
1414 | 1414 | ||
1415 | static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags) | 1415 | static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, |
1416 | unsigned mem_flags) | ||
1416 | { | 1417 | { |
1417 | int status = -EINVAL; | 1418 | int status = -EINVAL; |
1418 | unsigned long flags; | 1419 | unsigned long flags; |
@@ -1523,7 +1524,7 @@ sitd_urb_transaction ( | |||
1523 | struct ehci_iso_stream *stream, | 1524 | struct ehci_iso_stream *stream, |
1524 | struct ehci_hcd *ehci, | 1525 | struct ehci_hcd *ehci, |
1525 | struct urb *urb, | 1526 | struct urb *urb, |
1526 | int mem_flags | 1527 | unsigned mem_flags |
1527 | ) | 1528 | ) |
1528 | { | 1529 | { |
1529 | struct ehci_sitd *sitd; | 1530 | struct ehci_sitd *sitd; |
@@ -1772,7 +1773,8 @@ sitd_complete ( | |||
1772 | } | 1773 | } |
1773 | 1774 | ||
1774 | 1775 | ||
1775 | static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags) | 1776 | static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb, |
1777 | unsigned mem_flags) | ||
1776 | { | 1778 | { |
1777 | int status = -EINVAL; | 1779 | int status = -EINVAL; |
1778 | unsigned long flags; | 1780 | unsigned long flags; |
@@ -1822,7 +1824,8 @@ done: | |||
1822 | #else | 1824 | #else |
1823 | 1825 | ||
1824 | static inline int | 1826 | static inline int |
1825 | sitd_submit (struct ehci_hcd *ehci, struct urb *urb, int mem_flags) | 1827 | sitd_submit (struct ehci_hcd *ehci, struct urb *urb, |
1828 | unsigned mem_flags) | ||
1826 | { | 1829 | { |
1827 | ehci_dbg (ehci, "split iso support is disabled\n"); | 1830 | ehci_dbg (ehci, "split iso support is disabled\n"); |
1828 | return -ENOSYS; | 1831 | return -ENOSYS; |
diff --git a/drivers/usb/host/hc_crisv10.c b/drivers/usb/host/hc_crisv10.c index d9883d774d3a..81f8f6b7fdce 100644 --- a/drivers/usb/host/hc_crisv10.c +++ b/drivers/usb/host/hc_crisv10.c | |||
@@ -463,7 +463,8 @@ static void etrax_usb_free_epid(int epid); | |||
463 | 463 | ||
464 | static int etrax_remove_from_sb_list(struct urb *urb); | 464 | static int etrax_remove_from_sb_list(struct urb *urb); |
465 | 465 | ||
466 | static void* etrax_usb_buffer_alloc(struct usb_bus* bus, size_t size, int mem_flags, dma_addr_t *dma); | 466 | static void* etrax_usb_buffer_alloc(struct usb_bus* bus, size_t size, |
467 | unsigned mem_flags, dma_addr_t *dma); | ||
467 | static void etrax_usb_buffer_free(struct usb_bus *bus, size_t size, void *addr, dma_addr_t dma); | 468 | static void etrax_usb_buffer_free(struct usb_bus *bus, size_t size, void *addr, dma_addr_t dma); |
468 | 469 | ||
469 | static void etrax_usb_add_to_bulk_sb_list(struct urb *urb, int epid); | 470 | static void etrax_usb_add_to_bulk_sb_list(struct urb *urb, int epid); |
@@ -476,7 +477,7 @@ static int etrax_usb_submit_ctrl_urb(struct urb *urb); | |||
476 | static int etrax_usb_submit_intr_urb(struct urb *urb); | 477 | static int etrax_usb_submit_intr_urb(struct urb *urb); |
477 | static int etrax_usb_submit_isoc_urb(struct urb *urb); | 478 | static int etrax_usb_submit_isoc_urb(struct urb *urb); |
478 | 479 | ||
479 | static int etrax_usb_submit_urb(struct urb *urb, int mem_flags); | 480 | static int etrax_usb_submit_urb(struct urb *urb, unsigned mem_flags); |
480 | static int etrax_usb_unlink_urb(struct urb *urb, int status); | 481 | static int etrax_usb_unlink_urb(struct urb *urb, int status); |
481 | static int etrax_usb_get_frame_number(struct usb_device *usb_dev); | 482 | static int etrax_usb_get_frame_number(struct usb_device *usb_dev); |
482 | 483 | ||
@@ -1262,7 +1263,7 @@ static int etrax_usb_allocate_epid(void) | |||
1262 | return -1; | 1263 | return -1; |
1263 | } | 1264 | } |
1264 | 1265 | ||
1265 | static int etrax_usb_submit_urb(struct urb *urb, int mem_flags) | 1266 | static int etrax_usb_submit_urb(struct urb *urb, unsigned mem_flags) |
1266 | { | 1267 | { |
1267 | etrax_hc_t *hc; | 1268 | etrax_hc_t *hc; |
1268 | int ret = -EINVAL; | 1269 | int ret = -EINVAL; |
@@ -4277,7 +4278,8 @@ etrax_usb_bulk_eot_timer_func(unsigned long dummy) | |||
4277 | } | 4278 | } |
4278 | 4279 | ||
4279 | static void* | 4280 | static void* |
4280 | etrax_usb_buffer_alloc(struct usb_bus* bus, size_t size, int mem_flags, dma_addr_t *dma) | 4281 | etrax_usb_buffer_alloc(struct usb_bus* bus, size_t size, |
4282 | unsigned mem_flags, dma_addr_t *dma) | ||
4281 | { | 4283 | { |
4282 | return kmalloc(size, mem_flags); | 4284 | return kmalloc(size, mem_flags); |
4283 | } | 4285 | } |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index ff0a168e8eed..50b1970fe6b6 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -17,7 +17,7 @@ | |||
17 | * The driver basically works. A number of people have used it with a range | 17 | * The driver basically works. A number of people have used it with a range |
18 | * of devices. | 18 | * of devices. |
19 | * | 19 | * |
20 | *The driver passes all usbtests 1-14. | 20 | * The driver passes all usbtests 1-14. |
21 | * | 21 | * |
22 | * Suspending/resuming of root hub via sysfs works. Remote wakeup works too. | 22 | * Suspending/resuming of root hub via sysfs works. Remote wakeup works too. |
23 | * And suspending/resuming of platform device works too. Suspend/resume | 23 | * And suspending/resuming of platform device works too. Suspend/resume |
@@ -229,7 +229,7 @@ static void preproc_atl_queue(struct isp116x *isp116x) | |||
229 | struct isp116x_ep *ep; | 229 | struct isp116x_ep *ep; |
230 | struct urb *urb; | 230 | struct urb *urb; |
231 | struct ptd *ptd; | 231 | struct ptd *ptd; |
232 | u16 toggle, dir, len; | 232 | u16 toggle = 0, dir = PTD_DIR_SETUP, len; |
233 | 233 | ||
234 | for (ep = isp116x->atl_active; ep; ep = ep->active) { | 234 | for (ep = isp116x->atl_active; ep; ep = ep->active) { |
235 | BUG_ON(list_empty(&ep->hep->urb_list)); | 235 | BUG_ON(list_empty(&ep->hep->urb_list)); |
@@ -251,8 +251,6 @@ static void preproc_atl_queue(struct isp116x *isp116x) | |||
251 | dir = PTD_DIR_OUT; | 251 | dir = PTD_DIR_OUT; |
252 | break; | 252 | break; |
253 | case USB_PID_SETUP: | 253 | case USB_PID_SETUP: |
254 | toggle = 0; | ||
255 | dir = PTD_DIR_SETUP; | ||
256 | len = sizeof(struct usb_ctrlrequest); | 254 | len = sizeof(struct usb_ctrlrequest); |
257 | ep->data = urb->setup_packet; | 255 | ep->data = urb->setup_packet; |
258 | break; | 256 | break; |
@@ -264,11 +262,9 @@ static void preproc_atl_queue(struct isp116x *isp116x) | |||
264 | ? PTD_DIR_OUT : PTD_DIR_IN; | 262 | ? PTD_DIR_OUT : PTD_DIR_IN; |
265 | break; | 263 | break; |
266 | default: | 264 | default: |
267 | /* To please gcc */ | ||
268 | toggle = dir = 0; | ||
269 | ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__, | 265 | ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__, |
270 | ep->nextpid); | 266 | ep->nextpid); |
271 | BUG_ON(1); | 267 | BUG(); |
272 | } | 268 | } |
273 | 269 | ||
274 | ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle); | 270 | ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle); |
@@ -697,7 +693,7 @@ static int balance(struct isp116x *isp116x, u16 period, u16 load) | |||
697 | 693 | ||
698 | static int isp116x_urb_enqueue(struct usb_hcd *hcd, | 694 | static int isp116x_urb_enqueue(struct usb_hcd *hcd, |
699 | struct usb_host_endpoint *hep, struct urb *urb, | 695 | struct usb_host_endpoint *hep, struct urb *urb, |
700 | int mem_flags) | 696 | unsigned mem_flags) |
701 | { | 697 | { |
702 | struct isp116x *isp116x = hcd_to_isp116x(hcd); | 698 | struct isp116x *isp116x = hcd_to_isp116x(hcd); |
703 | struct usb_device *udev = urb->dev; | 699 | struct usb_device *udev = urb->dev; |
@@ -719,7 +715,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd, | |||
719 | } | 715 | } |
720 | /* avoid all allocations within spinlocks: request or endpoint */ | 716 | /* avoid all allocations within spinlocks: request or endpoint */ |
721 | if (!hep->hcpriv) { | 717 | if (!hep->hcpriv) { |
722 | ep = kcalloc(1, sizeof *ep, (__force unsigned)mem_flags); | 718 | ep = kcalloc(1, sizeof *ep, mem_flags); |
723 | if (!ep) | 719 | if (!ep) |
724 | return -ENOMEM; | 720 | return -ENOMEM; |
725 | } | 721 | } |
@@ -1054,7 +1050,7 @@ static int isp116x_hub_control(struct usb_hcd *hcd, | |||
1054 | break; | 1050 | break; |
1055 | case GetHubStatus: | 1051 | case GetHubStatus: |
1056 | DBG("GetHubStatus\n"); | 1052 | DBG("GetHubStatus\n"); |
1057 | *(__le32 *) buf = cpu_to_le32(0); | 1053 | *(__le32 *) buf = 0; |
1058 | break; | 1054 | break; |
1059 | case GetPortStatus: | 1055 | case GetPortStatus: |
1060 | DBG("GetPortStatus\n"); | 1056 | DBG("GetPortStatus\n"); |
@@ -1810,9 +1806,9 @@ static int isp116x_suspend(struct device *dev, pm_message_t state, u32 phase) | |||
1810 | ret = usb_suspend_device(hcd->self.root_hub, state); | 1806 | ret = usb_suspend_device(hcd->self.root_hub, state); |
1811 | if (!ret) { | 1807 | if (!ret) { |
1812 | dev->power.power_state = state; | 1808 | dev->power.power_state = state; |
1813 | INFO("%s suspended\n", (char *)hcd_name); | 1809 | INFO("%s suspended\n", hcd_name); |
1814 | } else | 1810 | } else |
1815 | ERR("%s suspend failed\n", (char *)hcd_name); | 1811 | ERR("%s suspend failed\n", hcd_name); |
1816 | 1812 | ||
1817 | return ret; | 1813 | return ret; |
1818 | } | 1814 | } |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 13cd2177b557..68decab280dd 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -180,7 +180,7 @@ static int ohci_urb_enqueue ( | |||
180 | struct usb_hcd *hcd, | 180 | struct usb_hcd *hcd, |
181 | struct usb_host_endpoint *ep, | 181 | struct usb_host_endpoint *ep, |
182 | struct urb *urb, | 182 | struct urb *urb, |
183 | int mem_flags | 183 | unsigned mem_flags |
184 | ) { | 184 | ) { |
185 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 185 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
186 | struct ed *ed; | 186 | struct ed *ed; |
@@ -673,8 +673,10 @@ retry: | |||
673 | 673 | ||
674 | ohci_dump (ohci, 1); | 674 | ohci_dump (ohci, 1); |
675 | 675 | ||
676 | if (ohci_to_hcd(ohci)->self.root_hub == NULL) | 676 | if (ohci_to_hcd(ohci)->self.root_hub == NULL) { |
677 | register_reboot_notifier (&ohci->reboot_notifier); | ||
677 | create_debug_files (ohci); | 678 | create_debug_files (ohci); |
679 | } | ||
678 | 680 | ||
679 | return 0; | 681 | return 0; |
680 | } | 682 | } |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index e2fc4129dfc6..83ca4549a50e 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -419,10 +419,11 @@ ohci_hub_descriptor ( | |||
419 | 419 | ||
420 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 420 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
421 | rh = roothub_b (ohci); | 421 | rh = roothub_b (ohci); |
422 | memset(desc->bitmap, 0xff, sizeof(desc->bitmap)); | ||
422 | desc->bitmap [0] = rh & RH_B_DR; | 423 | desc->bitmap [0] = rh & RH_B_DR; |
423 | if (ports > 7) { | 424 | if (ports > 7) { |
424 | desc->bitmap [1] = (rh & RH_B_DR) >> 8; | 425 | desc->bitmap [1] = (rh & RH_B_DR) >> 8; |
425 | desc->bitmap [2] = desc->bitmap [3] = 0xff; | 426 | desc->bitmap [2] = 0xff; |
426 | } else | 427 | } else |
427 | desc->bitmap [1] = 0xff; | 428 | desc->bitmap [1] = 0xff; |
428 | } | 429 | } |
diff --git a/drivers/usb/host/ohci-mem.c b/drivers/usb/host/ohci-mem.c index 23735a36af00..fd3c4d3714bd 100644 --- a/drivers/usb/host/ohci-mem.c +++ b/drivers/usb/host/ohci-mem.c | |||
@@ -84,7 +84,7 @@ dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma) | |||
84 | 84 | ||
85 | /* TDs ... */ | 85 | /* TDs ... */ |
86 | static struct td * | 86 | static struct td * |
87 | td_alloc (struct ohci_hcd *hc, int mem_flags) | 87 | td_alloc (struct ohci_hcd *hc, unsigned mem_flags) |
88 | { | 88 | { |
89 | dma_addr_t dma; | 89 | dma_addr_t dma; |
90 | struct td *td; | 90 | struct td *td; |
@@ -118,7 +118,7 @@ td_free (struct ohci_hcd *hc, struct td *td) | |||
118 | 118 | ||
119 | /* EDs ... */ | 119 | /* EDs ... */ |
120 | static struct ed * | 120 | static struct ed * |
121 | ed_alloc (struct ohci_hcd *hc, int mem_flags) | 121 | ed_alloc (struct ohci_hcd *hc, unsigned mem_flags) |
122 | { | 122 | { |
123 | dma_addr_t dma; | 123 | dma_addr_t dma; |
124 | struct ed *ed; | 124 | struct ed *ed; |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index b62d69937694..5cde76faab93 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -456,34 +456,22 @@ static int ohci_hcd_omap_drv_remove(struct device *dev) | |||
456 | 456 | ||
457 | #ifdef CONFIG_PM | 457 | #ifdef CONFIG_PM |
458 | 458 | ||
459 | /* states match PCI usage, always suspending the root hub except that | 459 | static int ohci_omap_suspend(struct device *dev, pm_message_t message, u32 level) |
460 | * 4 ~= D3cold (ACPI D3) with clock off (resume sees reset). | ||
461 | * | ||
462 | * FIXME: above comment is not right, and code is wrong, too :-(. | ||
463 | */ | ||
464 | |||
465 | static int ohci_omap_suspend(struct device *dev, pm_message_t state, u32 level) | ||
466 | { | 460 | { |
467 | struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev)); | 461 | struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev)); |
468 | int status = -EINVAL; | 462 | int status = -EINVAL; |
469 | 463 | ||
470 | if (level != SUSPEND_POWER_DOWN) | 464 | if (level != SUSPEND_POWER_DOWN) |
471 | return 0; | 465 | return 0; |
472 | if (state <= dev->power.power_state) | ||
473 | return 0; | ||
474 | 466 | ||
475 | dev_dbg(dev, "suspend to %d\n", state); | ||
476 | down(&ohci_to_hcd(ohci)->self.root_hub->serialize); | 467 | down(&ohci_to_hcd(ohci)->self.root_hub->serialize); |
477 | status = ohci_hub_suspend(ohci_to_hcd(ohci)); | 468 | status = ohci_hub_suspend(ohci_to_hcd(ohci)); |
478 | if (status == 0) { | 469 | if (status == 0) { |
479 | if (state >= 4) { | 470 | omap_ohci_clock_power(0); |
480 | omap_ohci_clock_power(0); | 471 | ohci_to_hcd(ohci)->self.root_hub->state = |
481 | ohci_to_hcd(ohci)->self.root_hub->state = | 472 | USB_STATE_SUSPENDED; |
482 | USB_STATE_SUSPENDED; | ||
483 | state = 4; | ||
484 | } | ||
485 | ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED; | 473 | ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED; |
486 | dev->power.power_state = state; | 474 | dev->power.power_state = PMSG_SUSPEND; |
487 | } | 475 | } |
488 | up(&ohci_to_hcd(ohci)->self.root_hub->serialize); | 476 | up(&ohci_to_hcd(ohci)->self.root_hub->serialize); |
489 | return status; | 477 | return status; |
@@ -497,29 +485,20 @@ static int ohci_omap_resume(struct device *dev, u32 level) | |||
497 | if (level != RESUME_POWER_ON) | 485 | if (level != RESUME_POWER_ON) |
498 | return 0; | 486 | return 0; |
499 | 487 | ||
500 | switch (dev->power.power_state) { | 488 | if (time_before(jiffies, ohci->next_statechange)) |
501 | case 0: | 489 | msleep(5); |
502 | break; | 490 | ohci->next_statechange = jiffies; |
503 | case 4: | 491 | omap_ohci_clock_power(1); |
504 | if (time_before(jiffies, ohci->next_statechange)) | ||
505 | msleep(5); | ||
506 | ohci->next_statechange = jiffies; | ||
507 | omap_ohci_clock_power(1); | ||
508 | /* FALLTHROUGH */ | ||
509 | default: | ||
510 | dev_dbg(dev, "resume from %d\n", dev->power.power_state); | ||
511 | #ifdef CONFIG_USB_SUSPEND | 492 | #ifdef CONFIG_USB_SUSPEND |
512 | /* get extra cleanup even if remote wakeup isn't in use */ | 493 | /* get extra cleanup even if remote wakeup isn't in use */ |
513 | status = usb_resume_device(ohci_to_hcd(ohci)->self.root_hub); | 494 | status = usb_resume_device(ohci_to_hcd(ohci)->self.root_hub); |
514 | #else | 495 | #else |
515 | down(&ohci_to_hcd(ohci)->self.root_hub->serialize); | 496 | down(&ohci_to_hcd(ohci)->self.root_hub->serialize); |
516 | status = ohci_hub_resume(ohci_to_hcd(ohci)); | 497 | status = ohci_hub_resume(ohci_to_hcd(ohci)); |
517 | up(&ohci_to_hcd(ohci)->self.root_hub->serialize); | 498 | up(&ohci_to_hcd(ohci)->self.root_hub->serialize); |
518 | #endif | 499 | #endif |
519 | if (status == 0) | 500 | if (status == 0) |
520 | dev->power.power_state = 0; | 501 | dev->power.power_state = PMSG_ON; |
521 | break; | ||
522 | } | ||
523 | return status; | 502 | return status; |
524 | } | 503 | } |
525 | 504 | ||
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 6c3f910bc307..7a890a65f55d 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -815,7 +815,7 @@ static int sl811h_urb_enqueue( | |||
815 | struct usb_hcd *hcd, | 815 | struct usb_hcd *hcd, |
816 | struct usb_host_endpoint *hep, | 816 | struct usb_host_endpoint *hep, |
817 | struct urb *urb, | 817 | struct urb *urb, |
818 | int mem_flags | 818 | unsigned mem_flags |
819 | ) { | 819 | ) { |
820 | struct sl811 *sl811 = hcd_to_sl811(hcd); | 820 | struct sl811 *sl811 = hcd_to_sl811(hcd); |
821 | struct usb_device *udev = urb->dev; | 821 | struct usb_device *udev = urb->dev; |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index 5f18084a116d..bbb36cd6ed61 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -1164,7 +1164,7 @@ static struct urb *uhci_find_urb_ep(struct uhci_hcd *uhci, struct urb *urb) | |||
1164 | 1164 | ||
1165 | static int uhci_urb_enqueue(struct usb_hcd *hcd, | 1165 | static int uhci_urb_enqueue(struct usb_hcd *hcd, |
1166 | struct usb_host_endpoint *ep, | 1166 | struct usb_host_endpoint *ep, |
1167 | struct urb *urb, int mem_flags) | 1167 | struct urb *urb, unsigned mem_flags) |
1168 | { | 1168 | { |
1169 | int ret; | 1169 | int ret; |
1170 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | 1170 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); |
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index fd59f6bdd67f..298e4a25e3d3 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
@@ -259,3 +259,16 @@ config USB_ATI_REMOTE | |||
259 | To compile this driver as a module, choose M here: the module will be | 259 | To compile this driver as a module, choose M here: the module will be |
260 | called ati_remote. | 260 | called ati_remote. |
261 | 261 | ||
262 | config USB_KEYSPAN_REMOTE | ||
263 | tristate "Keyspan DMR USB remote control (EXPERIMENTAL)" | ||
264 | depends on USB && INPUT && EXPERIMENTAL | ||
265 | ---help--- | ||
266 | Say Y here if you want to use a Keyspan DMR USB remote control. | ||
267 | Currently only the UIA-11 type of receiver has been tested. The tag | ||
268 | on the receiver that connects to the USB port should have a P/N that | ||
269 | will tell you what type of DMR you have. The UIA-10 type is not | ||
270 | supported at this time. This driver maps all buttons to keypress | ||
271 | events. | ||
272 | |||
273 | To compile this driver as a module, choose M here: the module will | ||
274 | be called keyspan_remote. | ||
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile index 831b2b0f1f05..f1547be632d4 100644 --- a/drivers/usb/input/Makefile +++ b/drivers/usb/input/Makefile | |||
@@ -31,6 +31,7 @@ obj-$(CONFIG_USB_ATI_REMOTE) += ati_remote.o | |||
31 | obj-$(CONFIG_USB_HID) += usbhid.o | 31 | obj-$(CONFIG_USB_HID) += usbhid.o |
32 | obj-$(CONFIG_USB_KBD) += usbkbd.o | 32 | obj-$(CONFIG_USB_KBD) += usbkbd.o |
33 | obj-$(CONFIG_USB_KBTAB) += kbtab.o | 33 | obj-$(CONFIG_USB_KBTAB) += kbtab.o |
34 | obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o | ||
34 | obj-$(CONFIG_USB_MOUSE) += usbmouse.o | 35 | obj-$(CONFIG_USB_MOUSE) += usbmouse.o |
35 | obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o | 36 | obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o |
36 | obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o | 37 | obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 100b49bd1d3e..2350e7a5ad70 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -1428,6 +1428,19 @@ void hid_init_reports(struct hid_device *hid) | |||
1428 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 | 1428 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 |
1429 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | 1429 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 |
1430 | 1430 | ||
1431 | #define USB_VENDOR_ID_LD 0x0f11 | ||
1432 | #define USB_DEVICE_ID_CASSY 0x1000 | ||
1433 | #define USB_DEVICE_ID_POCKETCASSY 0x1010 | ||
1434 | #define USB_DEVICE_ID_MOBILECASSY 0x1020 | ||
1435 | #define USB_DEVICE_ID_JWM 0x1080 | ||
1436 | #define USB_DEVICE_ID_DMMP 0x1081 | ||
1437 | #define USB_DEVICE_ID_UMIP 0x1090 | ||
1438 | #define USB_DEVICE_ID_VIDEOCOM 0x1200 | ||
1439 | #define USB_DEVICE_ID_COM3LAB 0x2000 | ||
1440 | #define USB_DEVICE_ID_TELEPORT 0x2010 | ||
1441 | #define USB_DEVICE_ID_NETWORKANALYSER 0x2020 | ||
1442 | #define USB_DEVICE_ID_POWERCONTROL 0x2030 | ||
1443 | |||
1431 | 1444 | ||
1432 | /* | 1445 | /* |
1433 | * Alphabetically sorted blacklist by quirk type. | 1446 | * Alphabetically sorted blacklist by quirk type. |
@@ -1463,6 +1476,17 @@ static struct hid_blacklist { | |||
1463 | { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE }, | 1476 | { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE }, |
1464 | { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE }, | 1477 | { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE }, |
1465 | { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, | 1478 | { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, |
1479 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_CASSY, HID_QUIRK_IGNORE }, | ||
1480 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_POCKETCASSY, HID_QUIRK_IGNORE }, | ||
1481 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_MOBILECASSY, HID_QUIRK_IGNORE }, | ||
1482 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_JWM, HID_QUIRK_IGNORE }, | ||
1483 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_DMMP, HID_QUIRK_IGNORE }, | ||
1484 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_UMIP, HID_QUIRK_IGNORE }, | ||
1485 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_VIDEOCOM, HID_QUIRK_IGNORE }, | ||
1486 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_COM3LAB, HID_QUIRK_IGNORE }, | ||
1487 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_TELEPORT, HID_QUIRK_IGNORE }, | ||
1488 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_NETWORKANALYSER, HID_QUIRK_IGNORE }, | ||
1489 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_POWERCONTROL, HID_QUIRK_IGNORE }, | ||
1466 | { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE }, | 1490 | { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE }, |
1467 | { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE }, | 1491 | { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE }, |
1468 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE }, | 1492 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE }, |
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c new file mode 100644 index 000000000000..67dc93685203 --- /dev/null +++ b/drivers/usb/input/keyspan_remote.c | |||
@@ -0,0 +1,633 @@ | |||
1 | /* | ||
2 | * keyspan_remote: USB driver for the Keyspan DMR | ||
3 | * | ||
4 | * Copyright (C) 2005 Zymeta Corporation - Michael Downey (downey@zymeta.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License as | ||
8 | * published by the Free Software Foundation, version 2. | ||
9 | * | ||
10 | * This driver has been put together with the support of Innosys, Inc. | ||
11 | * and Keyspan, Inc the manufacturers of the Keyspan USB DMR product. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/slab.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/moduleparam.h> | ||
21 | #include <linux/input.h> | ||
22 | #include <linux/usb.h> | ||
23 | |||
24 | #define DRIVER_VERSION "v0.1" | ||
25 | #define DRIVER_AUTHOR "Michael Downey <downey@zymeta.com>" | ||
26 | #define DRIVER_DESC "Driver for the USB Keyspan remote control." | ||
27 | #define DRIVER_LICENSE "GPL" | ||
28 | |||
29 | /* Parameters that can be passed to the driver. */ | ||
30 | static int debug; | ||
31 | module_param(debug, int, 0444); | ||
32 | MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); | ||
33 | |||
34 | /* Vendor and product ids */ | ||
35 | #define USB_KEYSPAN_VENDOR_ID 0x06CD | ||
36 | #define USB_KEYSPAN_PRODUCT_UIA11 0x0202 | ||
37 | |||
38 | /* Defines for converting the data from the remote. */ | ||
39 | #define ZERO 0x18 | ||
40 | #define ZERO_MASK 0x1F /* 5 bits for a 0 */ | ||
41 | #define ONE 0x3C | ||
42 | #define ONE_MASK 0x3F /* 6 bits for a 1 */ | ||
43 | #define SYNC 0x3F80 | ||
44 | #define SYNC_MASK 0x3FFF /* 14 bits for a SYNC sequence */ | ||
45 | #define STOP 0x00 | ||
46 | #define STOP_MASK 0x1F /* 5 bits for the STOP sequence */ | ||
47 | #define GAP 0xFF | ||
48 | |||
49 | #define RECV_SIZE 8 /* The UIA-11 type have a 8 byte limit. */ | ||
50 | |||
51 | /* table of devices that work with this driver */ | ||
52 | static struct usb_device_id keyspan_table[] = { | ||
53 | { USB_DEVICE(USB_KEYSPAN_VENDOR_ID, USB_KEYSPAN_PRODUCT_UIA11) }, | ||
54 | { } /* Terminating entry */ | ||
55 | }; | ||
56 | |||
57 | /* Structure to store all the real stuff that a remote sends to us. */ | ||
58 | struct keyspan_message { | ||
59 | u16 system; | ||
60 | u8 button; | ||
61 | u8 toggle; | ||
62 | }; | ||
63 | |||
64 | /* Structure used for all the bit testing magic needed to be done. */ | ||
65 | struct bit_tester { | ||
66 | u32 tester; | ||
67 | int len; | ||
68 | int pos; | ||
69 | int bits_left; | ||
70 | u8 buffer[32]; | ||
71 | }; | ||
72 | |||
73 | /* Structure to hold all of our driver specific stuff */ | ||
74 | struct usb_keyspan { | ||
75 | char name[128]; | ||
76 | char phys[64]; | ||
77 | struct usb_device* udev; | ||
78 | struct input_dev input; | ||
79 | struct usb_interface* interface; | ||
80 | struct usb_endpoint_descriptor* in_endpoint; | ||
81 | struct urb* irq_urb; | ||
82 | int open; | ||
83 | dma_addr_t in_dma; | ||
84 | unsigned char* in_buffer; | ||
85 | |||
86 | /* variables used to parse messages from remote. */ | ||
87 | struct bit_tester data; | ||
88 | int stage; | ||
89 | int toggle; | ||
90 | }; | ||
91 | |||
92 | /* | ||
93 | * Table that maps the 31 possible keycodes to input keys. | ||
94 | * Currently there are 15 and 17 button models so RESERVED codes | ||
95 | * are blank areas in the mapping. | ||
96 | */ | ||
97 | static int keyspan_key_table[] = { | ||
98 | KEY_RESERVED, /* 0 is just a place holder. */ | ||
99 | KEY_RESERVED, | ||
100 | KEY_STOP, | ||
101 | KEY_PLAYCD, | ||
102 | KEY_RESERVED, | ||
103 | KEY_PREVIOUSSONG, | ||
104 | KEY_REWIND, | ||
105 | KEY_FORWARD, | ||
106 | KEY_NEXTSONG, | ||
107 | KEY_RESERVED, | ||
108 | KEY_RESERVED, | ||
109 | KEY_RESERVED, | ||
110 | KEY_PAUSE, | ||
111 | KEY_VOLUMEUP, | ||
112 | KEY_RESERVED, | ||
113 | KEY_RESERVED, | ||
114 | KEY_RESERVED, | ||
115 | KEY_VOLUMEDOWN, | ||
116 | KEY_RESERVED, | ||
117 | KEY_UP, | ||
118 | KEY_RESERVED, | ||
119 | KEY_MUTE, | ||
120 | KEY_LEFT, | ||
121 | KEY_ENTER, | ||
122 | KEY_RIGHT, | ||
123 | KEY_RESERVED, | ||
124 | KEY_RESERVED, | ||
125 | KEY_DOWN, | ||
126 | KEY_RESERVED, | ||
127 | KEY_KPASTERISK, | ||
128 | KEY_RESERVED, | ||
129 | KEY_MENU | ||
130 | }; | ||
131 | |||
132 | static struct usb_driver keyspan_driver; | ||
133 | |||
134 | /* | ||
135 | * Debug routine that prints out what we've received from the remote. | ||
136 | */ | ||
137 | static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/ | ||
138 | { | ||
139 | char codes[4*RECV_SIZE]; | ||
140 | int i; | ||
141 | |||
142 | for (i = 0; i < RECV_SIZE; i++) { | ||
143 | snprintf(codes+i*3, 4, "%02x ", dev->in_buffer[i]); | ||
144 | } | ||
145 | |||
146 | dev_info(&dev->udev->dev, "%s\n", codes); | ||
147 | } | ||
148 | |||
149 | /* | ||
150 | * Routine that manages the bit_tester structure. It makes sure that there are | ||
151 | * at least bits_needed bits loaded into the tester. | ||
152 | */ | ||
153 | static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) | ||
154 | { | ||
155 | if (dev->data.bits_left >= bits_needed) | ||
156 | return(0); | ||
157 | |||
158 | /* | ||
159 | * Somehow we've missed the last message. The message will be repeated | ||
160 | * though so it's not too big a deal | ||
161 | */ | ||
162 | if (dev->data.pos >= dev->data.len) { | ||
163 | dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n", | ||
164 | __FUNCTION__, dev->data.pos, dev->data.len); | ||
165 | return(-1); | ||
166 | } | ||
167 | |||
168 | /* Load as much as we can into the tester. */ | ||
169 | while ((dev->data.bits_left + 7 < (sizeof(dev->data.tester) * 8)) && | ||
170 | (dev->data.pos < dev->data.len)) { | ||
171 | dev->data.tester += (dev->data.buffer[dev->data.pos++] << dev->data.bits_left); | ||
172 | dev->data.bits_left += 8; | ||
173 | } | ||
174 | |||
175 | return(0); | ||
176 | } | ||
177 | |||
178 | /* | ||
179 | * Routine that handles all the logic needed to parse out the message from the remote. | ||
180 | */ | ||
181 | static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs) | ||
182 | { | ||
183 | int i; | ||
184 | int found = 0; | ||
185 | struct keyspan_message message; | ||
186 | |||
187 | switch(remote->stage) { | ||
188 | case 0: | ||
189 | /* | ||
190 | * In stage 0 we want to find the start of a message. The remote sends a 0xFF as filler. | ||
191 | * So the first byte that isn't a FF should be the start of a new message. | ||
192 | */ | ||
193 | for (i = 0; i < RECV_SIZE && remote->in_buffer[i] == GAP; ++i); | ||
194 | |||
195 | if (i < RECV_SIZE) { | ||
196 | memcpy(remote->data.buffer, remote->in_buffer, RECV_SIZE); | ||
197 | remote->data.len = RECV_SIZE; | ||
198 | remote->data.pos = 0; | ||
199 | remote->data.tester = 0; | ||
200 | remote->data.bits_left = 0; | ||
201 | remote->stage = 1; | ||
202 | } | ||
203 | break; | ||
204 | |||
205 | case 1: | ||
206 | /* | ||
207 | * Stage 1 we should have 16 bytes and should be able to detect a | ||
208 | * SYNC. The SYNC is 14 bits, 7 0's and then 7 1's. | ||
209 | */ | ||
210 | memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); | ||
211 | remote->data.len += RECV_SIZE; | ||
212 | |||
213 | found = 0; | ||
214 | while ((remote->data.bits_left >= 14 || remote->data.pos < remote->data.len) && !found) { | ||
215 | for (i = 0; i < 8; ++i) { | ||
216 | if (keyspan_load_tester(remote, 14) != 0) { | ||
217 | remote->stage = 0; | ||
218 | return; | ||
219 | } | ||
220 | |||
221 | if ((remote->data.tester & SYNC_MASK) == SYNC) { | ||
222 | remote->data.tester = remote->data.tester >> 14; | ||
223 | remote->data.bits_left -= 14; | ||
224 | found = 1; | ||
225 | break; | ||
226 | } else { | ||
227 | remote->data.tester = remote->data.tester >> 1; | ||
228 | --remote->data.bits_left; | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | |||
233 | if (!found) { | ||
234 | remote->stage = 0; | ||
235 | remote->data.len = 0; | ||
236 | } else { | ||
237 | remote->stage = 2; | ||
238 | } | ||
239 | break; | ||
240 | |||
241 | case 2: | ||
242 | /* | ||
243 | * Stage 2 we should have 24 bytes which will be enough for a full | ||
244 | * message. We need to parse out the system code, button code, | ||
245 | * toggle code, and stop. | ||
246 | */ | ||
247 | memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); | ||
248 | remote->data.len += RECV_SIZE; | ||
249 | |||
250 | message.system = 0; | ||
251 | for (i = 0; i < 9; i++) { | ||
252 | keyspan_load_tester(remote, 6); | ||
253 | |||
254 | if ((remote->data.tester & ZERO_MASK) == ZERO) { | ||
255 | message.system = message.system << 1; | ||
256 | remote->data.tester = remote->data.tester >> 5; | ||
257 | remote->data.bits_left -= 5; | ||
258 | } else if ((remote->data.tester & ONE_MASK) == ONE) { | ||
259 | message.system = (message.system << 1) + 1; | ||
260 | remote->data.tester = remote->data.tester >> 6; | ||
261 | remote->data.bits_left -= 6; | ||
262 | } else { | ||
263 | err("%s - Unknown sequence found in system data.\n", __FUNCTION__); | ||
264 | remote->stage = 0; | ||
265 | return; | ||
266 | } | ||
267 | } | ||
268 | |||
269 | message.button = 0; | ||
270 | for (i = 0; i < 5; i++) { | ||
271 | keyspan_load_tester(remote, 6); | ||
272 | |||
273 | if ((remote->data.tester & ZERO_MASK) == ZERO) { | ||
274 | message.button = message.button << 1; | ||
275 | remote->data.tester = remote->data.tester >> 5; | ||
276 | remote->data.bits_left -= 5; | ||
277 | } else if ((remote->data.tester & ONE_MASK) == ONE) { | ||
278 | message.button = (message.button << 1) + 1; | ||
279 | remote->data.tester = remote->data.tester >> 6; | ||
280 | remote->data.bits_left -= 6; | ||
281 | } else { | ||
282 | err("%s - Unknown sequence found in button data.\n", __FUNCTION__); | ||
283 | remote->stage = 0; | ||
284 | return; | ||
285 | } | ||
286 | } | ||
287 | |||
288 | keyspan_load_tester(remote, 6); | ||
289 | if ((remote->data.tester & ZERO_MASK) == ZERO) { | ||
290 | message.toggle = 0; | ||
291 | remote->data.tester = remote->data.tester >> 5; | ||
292 | remote->data.bits_left -= 5; | ||
293 | } else if ((remote->data.tester & ONE_MASK) == ONE) { | ||
294 | message.toggle = 1; | ||
295 | remote->data.tester = remote->data.tester >> 6; | ||
296 | remote->data.bits_left -= 6; | ||
297 | } else { | ||
298 | err("%s - Error in message, invalid toggle.\n", __FUNCTION__); | ||
299 | } | ||
300 | |||
301 | keyspan_load_tester(remote, 5); | ||
302 | if ((remote->data.tester & STOP_MASK) == STOP) { | ||
303 | remote->data.tester = remote->data.tester >> 5; | ||
304 | remote->data.bits_left -= 5; | ||
305 | } else { | ||
306 | err("Bad message recieved, no stop bit found.\n"); | ||
307 | } | ||
308 | |||
309 | dev_dbg(&remote->udev, | ||
310 | "%s found valid message: system: %d, button: %d, toggle: %d\n", | ||
311 | __FUNCTION__, message.system, message.button, message.toggle); | ||
312 | |||
313 | if (message.toggle != remote->toggle) { | ||
314 | input_regs(&remote->input, regs); | ||
315 | input_report_key(&remote->input, keyspan_key_table[message.button], 1); | ||
316 | input_report_key(&remote->input, keyspan_key_table[message.button], 0); | ||
317 | input_sync(&remote->input); | ||
318 | remote->toggle = message.toggle; | ||
319 | } | ||
320 | |||
321 | remote->stage = 0; | ||
322 | break; | ||
323 | } | ||
324 | } | ||
325 | |||
326 | /* | ||
327 | * Routine for sending all the initialization messages to the remote. | ||
328 | */ | ||
329 | static int keyspan_setup(struct usb_device* dev) | ||
330 | { | ||
331 | int retval = 0; | ||
332 | |||
333 | retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
334 | 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); | ||
335 | if (retval) { | ||
336 | dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", | ||
337 | __FUNCTION__, retval); | ||
338 | return(retval); | ||
339 | } | ||
340 | |||
341 | retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
342 | 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); | ||
343 | if (retval) { | ||
344 | dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", | ||
345 | __FUNCTION__, retval); | ||
346 | return(retval); | ||
347 | } | ||
348 | |||
349 | retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
350 | 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); | ||
351 | if (retval) { | ||
352 | dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", | ||
353 | __FUNCTION__, retval); | ||
354 | return(retval); | ||
355 | } | ||
356 | |||
357 | dev_dbg(&dev->dev, "%s - Setup complete.\n", __FUNCTION__); | ||
358 | return(retval); | ||
359 | } | ||
360 | |||
361 | /* | ||
362 | * Routine used to handle a new message that has come in. | ||
363 | */ | ||
364 | static void keyspan_irq_recv(struct urb *urb, struct pt_regs *regs) | ||
365 | { | ||
366 | struct usb_keyspan *dev = urb->context; | ||
367 | int retval; | ||
368 | |||
369 | /* Check our status in case we need to bail out early. */ | ||
370 | switch (urb->status) { | ||
371 | case 0: | ||
372 | break; | ||
373 | |||
374 | /* Device went away so don't keep trying to read from it. */ | ||
375 | case -ECONNRESET: | ||
376 | case -ENOENT: | ||
377 | case -ESHUTDOWN: | ||
378 | return; | ||
379 | |||
380 | default: | ||
381 | goto resubmit; | ||
382 | break; | ||
383 | } | ||
384 | |||
385 | if (debug) | ||
386 | keyspan_print(dev); | ||
387 | |||
388 | keyspan_check_data(dev, regs); | ||
389 | |||
390 | resubmit: | ||
391 | retval = usb_submit_urb(urb, GFP_ATOMIC); | ||
392 | if (retval) | ||
393 | err ("%s - usb_submit_urb failed with result: %d", __FUNCTION__, retval); | ||
394 | } | ||
395 | |||
396 | static int keyspan_open(struct input_dev *dev) | ||
397 | { | ||
398 | struct usb_keyspan *remote = dev->private; | ||
399 | |||
400 | if (remote->open++) | ||
401 | return 0; | ||
402 | |||
403 | remote->irq_urb->dev = remote->udev; | ||
404 | if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) { | ||
405 | remote->open--; | ||
406 | return -EIO; | ||
407 | } | ||
408 | |||
409 | return 0; | ||
410 | } | ||
411 | |||
412 | static void keyspan_close(struct input_dev *dev) | ||
413 | { | ||
414 | struct usb_keyspan *remote = dev->private; | ||
415 | |||
416 | if (!--remote->open) | ||
417 | usb_kill_urb(remote->irq_urb); | ||
418 | } | ||
419 | |||
420 | /* | ||
421 | * Routine that sets up the driver to handle a specific USB device detected on the bus. | ||
422 | */ | ||
423 | static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id) | ||
424 | { | ||
425 | int i; | ||
426 | int retval = -ENOMEM; | ||
427 | char path[64]; | ||
428 | char *buf; | ||
429 | struct usb_keyspan *remote = NULL; | ||
430 | struct usb_host_interface *iface_desc; | ||
431 | struct usb_endpoint_descriptor *endpoint; | ||
432 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); | ||
433 | |||
434 | /* See if the offered device matches what we can accept */ | ||
435 | if ((udev->descriptor.idVendor != USB_KEYSPAN_VENDOR_ID) || | ||
436 | (udev->descriptor.idProduct != USB_KEYSPAN_PRODUCT_UIA11) ) | ||
437 | return -ENODEV; | ||
438 | |||
439 | /* allocate memory for our device state and initialize it */ | ||
440 | remote = kmalloc(sizeof(*remote), GFP_KERNEL); | ||
441 | if (remote == NULL) { | ||
442 | err("Out of memory\n"); | ||
443 | goto error; | ||
444 | } | ||
445 | memset(remote, 0x00, sizeof(*remote)); | ||
446 | |||
447 | remote->udev = udev; | ||
448 | remote->interface = interface; | ||
449 | remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */ | ||
450 | |||
451 | /* set up the endpoint information */ | ||
452 | /* use only the first in interrupt endpoint */ | ||
453 | iface_desc = interface->cur_altsetting; | ||
454 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
455 | endpoint = &iface_desc->endpoint[i].desc; | ||
456 | |||
457 | if (!remote->in_endpoint && | ||
458 | (endpoint->bEndpointAddress & USB_DIR_IN) && | ||
459 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
460 | /* we found our interrupt in endpoint */ | ||
461 | remote->in_endpoint = endpoint; | ||
462 | |||
463 | remote->in_buffer = usb_buffer_alloc(remote->udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma); | ||
464 | if (!remote->in_buffer) { | ||
465 | retval = -ENOMEM; | ||
466 | goto error; | ||
467 | } | ||
468 | } | ||
469 | } | ||
470 | |||
471 | if (!remote->in_endpoint) { | ||
472 | err("Could not find interrupt input endpoint.\n"); | ||
473 | retval = -ENODEV; | ||
474 | goto error; | ||
475 | } | ||
476 | |||
477 | remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
478 | if (!remote->irq_urb) { | ||
479 | err("Failed to allocate urb.\n"); | ||
480 | retval = -ENOMEM; | ||
481 | goto error; | ||
482 | } | ||
483 | |||
484 | retval = keyspan_setup(remote->udev); | ||
485 | if (retval) { | ||
486 | err("Failed to setup device.\n"); | ||
487 | retval = -ENODEV; | ||
488 | goto error; | ||
489 | } | ||
490 | |||
491 | /* | ||
492 | * Setup the input system with the bits we are going to be reporting | ||
493 | */ | ||
494 | remote->input.evbit[0] = BIT(EV_KEY); /* We will only report KEY events. */ | ||
495 | for (i = 0; i < 32; ++i) { | ||
496 | if (keyspan_key_table[i] != KEY_RESERVED) { | ||
497 | set_bit(keyspan_key_table[i], remote->input.keybit); | ||
498 | } | ||
499 | } | ||
500 | |||
501 | remote->input.private = remote; | ||
502 | remote->input.open = keyspan_open; | ||
503 | remote->input.close = keyspan_close; | ||
504 | |||
505 | usb_make_path(remote->udev, path, 64); | ||
506 | sprintf(remote->phys, "%s/input0", path); | ||
507 | |||
508 | remote->input.name = remote->name; | ||
509 | remote->input.phys = remote->phys; | ||
510 | remote->input.id.bustype = BUS_USB; | ||
511 | remote->input.id.vendor = le16_to_cpu(remote->udev->descriptor.idVendor); | ||
512 | remote->input.id.product = le16_to_cpu(remote->udev->descriptor.idProduct); | ||
513 | remote->input.id.version = le16_to_cpu(remote->udev->descriptor.bcdDevice); | ||
514 | |||
515 | if (!(buf = kmalloc(63, GFP_KERNEL))) { | ||
516 | usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); | ||
517 | kfree(remote); | ||
518 | return -ENOMEM; | ||
519 | } | ||
520 | |||
521 | if (remote->udev->descriptor.iManufacturer && | ||
522 | usb_string(remote->udev, remote->udev->descriptor.iManufacturer, buf, 63) > 0) | ||
523 | strcat(remote->name, buf); | ||
524 | |||
525 | if (remote->udev->descriptor.iProduct && | ||
526 | usb_string(remote->udev, remote->udev->descriptor.iProduct, buf, 63) > 0) | ||
527 | sprintf(remote->name, "%s %s", remote->name, buf); | ||
528 | |||
529 | if (!strlen(remote->name)) | ||
530 | sprintf(remote->name, "USB Keyspan Remote %04x:%04x", | ||
531 | remote->input.id.vendor, remote->input.id.product); | ||
532 | |||
533 | kfree(buf); | ||
534 | |||
535 | /* | ||
536 | * Initialize the URB to access the device. The urb gets sent to the device in keyspan_open() | ||
537 | */ | ||
538 | usb_fill_int_urb(remote->irq_urb, | ||
539 | remote->udev, usb_rcvintpipe(remote->udev, remote->in_endpoint->bEndpointAddress), | ||
540 | remote->in_buffer, RECV_SIZE, keyspan_irq_recv, remote, | ||
541 | remote->in_endpoint->bInterval); | ||
542 | remote->irq_urb->transfer_dma = remote->in_dma; | ||
543 | remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
544 | |||
545 | /* we can register the device now, as it is ready */ | ||
546 | input_register_device(&remote->input); | ||
547 | |||
548 | /* save our data pointer in this interface device */ | ||
549 | usb_set_intfdata(interface, remote); | ||
550 | |||
551 | /* let the user know what node this device is now attached to */ | ||
552 | info("connected: %s on %s", remote->name, path); | ||
553 | return 0; | ||
554 | |||
555 | error: | ||
556 | /* | ||
557 | * In case of error we need to clean up any allocated buffers | ||
558 | */ | ||
559 | if (remote->irq_urb) | ||
560 | usb_free_urb(remote->irq_urb); | ||
561 | |||
562 | if (remote->in_buffer) | ||
563 | usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); | ||
564 | |||
565 | if (remote) | ||
566 | kfree(remote); | ||
567 | |||
568 | return retval; | ||
569 | } | ||
570 | |||
571 | /* | ||
572 | * Routine called when a device is disconnected from the USB. | ||
573 | */ | ||
574 | static void keyspan_disconnect(struct usb_interface *interface) | ||
575 | { | ||
576 | struct usb_keyspan *remote; | ||
577 | |||
578 | /* prevent keyspan_open() from racing keyspan_disconnect() */ | ||
579 | lock_kernel(); | ||
580 | |||
581 | remote = usb_get_intfdata(interface); | ||
582 | usb_set_intfdata(interface, NULL); | ||
583 | |||
584 | if (remote) { /* We have a valid driver structure so clean up everything we allocated. */ | ||
585 | input_unregister_device(&remote->input); | ||
586 | usb_kill_urb(remote->irq_urb); | ||
587 | usb_free_urb(remote->irq_urb); | ||
588 | usb_buffer_free(interface_to_usbdev(interface), RECV_SIZE, remote->in_buffer, remote->in_dma); | ||
589 | kfree(remote); | ||
590 | } | ||
591 | |||
592 | unlock_kernel(); | ||
593 | |||
594 | info("USB Keyspan now disconnected"); | ||
595 | } | ||
596 | |||
597 | /* | ||
598 | * Standard driver set up sections | ||
599 | */ | ||
600 | static struct usb_driver keyspan_driver = | ||
601 | { | ||
602 | .owner = THIS_MODULE, | ||
603 | .name = "keyspan_remote", | ||
604 | .probe = keyspan_probe, | ||
605 | .disconnect = keyspan_disconnect, | ||
606 | .id_table = keyspan_table | ||
607 | }; | ||
608 | |||
609 | static int __init usb_keyspan_init(void) | ||
610 | { | ||
611 | int result; | ||
612 | |||
613 | /* register this driver with the USB subsystem */ | ||
614 | result = usb_register(&keyspan_driver); | ||
615 | if (result) | ||
616 | err("usb_register failed. Error number %d\n", result); | ||
617 | |||
618 | return result; | ||
619 | } | ||
620 | |||
621 | static void __exit usb_keyspan_exit(void) | ||
622 | { | ||
623 | /* deregister this driver with the USB subsystem */ | ||
624 | usb_deregister(&keyspan_driver); | ||
625 | } | ||
626 | |||
627 | module_init(usb_keyspan_init); | ||
628 | module_exit(usb_keyspan_exit); | ||
629 | |||
630 | MODULE_DEVICE_TABLE(usb, keyspan_table); | ||
631 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
632 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
633 | MODULE_LICENSE(DRIVER_LICENSE); | ||
diff --git a/drivers/usb/media/Makefile b/drivers/usb/media/Makefile index 2b76df7005fe..d83adffa925f 100644 --- a/drivers/usb/media/Makefile +++ b/drivers/usb/media/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for USB Media drivers | 2 | # Makefile for USB Media drivers |
3 | # | 3 | # |
4 | 4 | ||
5 | sn9c102-objs := sn9c102_core.o sn9c102_hv7131d.o sn9c102_mi0343.o sn9c102_pas106b.o sn9c102_pas202bcb.o sn9c102_tas5110c1b.o sn9c102_tas5130d1b.o | 5 | sn9c102-objs := sn9c102_core.o sn9c102_hv7131d.o sn9c102_mi0343.o sn9c102_ov7630.o sn9c102_pas106b.o sn9c102_pas202bcb.o sn9c102_tas5110c1b.o sn9c102_tas5130d1b.o |
6 | 6 | ||
7 | obj-$(CONFIG_USB_DABUSB) += dabusb.o | 7 | obj-$(CONFIG_USB_DABUSB) += dabusb.o |
8 | obj-$(CONFIG_USB_DSBR) += dsbr100.o | 8 | obj-$(CONFIG_USB_DSBR) += dsbr100.o |
diff --git a/drivers/usb/media/sn9c102.h b/drivers/usb/media/sn9c102.h index 8b8a4c8743f8..e5cea0e2eb57 100644 --- a/drivers/usb/media/sn9c102.h +++ b/drivers/usb/media/sn9c102.h | |||
@@ -56,7 +56,7 @@ | |||
56 | #define SN9C102_MODULE_AUTHOR "(C) 2004-2005 Luca Risolia" | 56 | #define SN9C102_MODULE_AUTHOR "(C) 2004-2005 Luca Risolia" |
57 | #define SN9C102_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>" | 57 | #define SN9C102_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>" |
58 | #define SN9C102_MODULE_LICENSE "GPL" | 58 | #define SN9C102_MODULE_LICENSE "GPL" |
59 | #define SN9C102_MODULE_VERSION "1:1.24" | 59 | #define SN9C102_MODULE_VERSION "1:1.24a" |
60 | #define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 24) | 60 | #define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 24) |
61 | 61 | ||
62 | enum sn9c102_bridge { | 62 | enum sn9c102_bridge { |
diff --git a/drivers/usb/media/sn9c102_core.c b/drivers/usb/media/sn9c102_core.c index 31d57400d5be..cf8cfbabefde 100644 --- a/drivers/usb/media/sn9c102_core.c +++ b/drivers/usb/media/sn9c102_core.c | |||
@@ -429,7 +429,7 @@ sn9c102_i2c_try_read(struct sn9c102_device* cam, | |||
429 | } | 429 | } |
430 | 430 | ||
431 | 431 | ||
432 | static int | 432 | int |
433 | sn9c102_i2c_try_write(struct sn9c102_device* cam, | 433 | sn9c102_i2c_try_write(struct sn9c102_device* cam, |
434 | struct sn9c102_sensor* sensor, u8 address, u8 value) | 434 | struct sn9c102_sensor* sensor, u8 address, u8 value) |
435 | { | 435 | { |
diff --git a/drivers/usb/media/sn9c102_ov7630.c b/drivers/usb/media/sn9c102_ov7630.c new file mode 100644 index 000000000000..d27c5aedeaf8 --- /dev/null +++ b/drivers/usb/media/sn9c102_ov7630.c | |||
@@ -0,0 +1,394 @@ | |||
1 | /*************************************************************************** | ||
2 | * Plug-in for OV7630 image sensor connected to the SN9C10x PC Camera * | ||
3 | * Controllers * | ||
4 | * * | ||
5 | * Copyright (C) 2005 by Luca Risolia <luca.risolia@studio.unibo.it> * | ||
6 | * * | ||
7 | * This program is free software; you can redistribute it and/or modify * | ||
8 | * it under the terms of the GNU General Public License as published by * | ||
9 | * the Free Software Foundation; either version 2 of the License, or * | ||
10 | * (at your option) any later version. * | ||
11 | * * | ||
12 | * This program is distributed in the hope that it will be useful, * | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | ||
15 | * GNU General Public License for more details. * | ||
16 | * * | ||
17 | * You should have received a copy of the GNU General Public License * | ||
18 | * along with this program; if not, write to the Free Software * | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * | ||
20 | ***************************************************************************/ | ||
21 | |||
22 | #include "sn9c102_sensor.h" | ||
23 | |||
24 | |||
25 | static struct sn9c102_sensor ov7630; | ||
26 | |||
27 | |||
28 | static int ov7630_init(struct sn9c102_device* cam) | ||
29 | { | ||
30 | int err = 0; | ||
31 | |||
32 | err += sn9c102_write_reg(cam, 0x00, 0x14); | ||
33 | err += sn9c102_write_reg(cam, 0x60, 0x17); | ||
34 | err += sn9c102_write_reg(cam, 0x0f, 0x18); | ||
35 | err += sn9c102_write_reg(cam, 0x50, 0x19); | ||
36 | |||
37 | err += sn9c102_i2c_write(cam, 0x12, 0x8d); | ||
38 | err += sn9c102_i2c_write(cam, 0x11, 0x00); | ||
39 | err += sn9c102_i2c_write(cam, 0x15, 0x34); | ||
40 | err += sn9c102_i2c_write(cam, 0x16, 0x03); | ||
41 | err += sn9c102_i2c_write(cam, 0x17, 0x1c); | ||
42 | err += sn9c102_i2c_write(cam, 0x18, 0xbd); | ||
43 | err += sn9c102_i2c_write(cam, 0x19, 0x06); | ||
44 | err += sn9c102_i2c_write(cam, 0x1a, 0xf6); | ||
45 | err += sn9c102_i2c_write(cam, 0x1b, 0x04); | ||
46 | err += sn9c102_i2c_write(cam, 0x20, 0x44); | ||
47 | err += sn9c102_i2c_write(cam, 0x23, 0xee); | ||
48 | err += sn9c102_i2c_write(cam, 0x26, 0xa0); | ||
49 | err += sn9c102_i2c_write(cam, 0x27, 0x9a); | ||
50 | err += sn9c102_i2c_write(cam, 0x28, 0x20); | ||
51 | err += sn9c102_i2c_write(cam, 0x29, 0x30); | ||
52 | err += sn9c102_i2c_write(cam, 0x2f, 0x3d); | ||
53 | err += sn9c102_i2c_write(cam, 0x30, 0x24); | ||
54 | err += sn9c102_i2c_write(cam, 0x32, 0x86); | ||
55 | err += sn9c102_i2c_write(cam, 0x60, 0xa9); | ||
56 | err += sn9c102_i2c_write(cam, 0x61, 0x42); | ||
57 | err += sn9c102_i2c_write(cam, 0x65, 0x00); | ||
58 | err += sn9c102_i2c_write(cam, 0x69, 0x38); | ||
59 | err += sn9c102_i2c_write(cam, 0x6f, 0x88); | ||
60 | err += sn9c102_i2c_write(cam, 0x70, 0x0b); | ||
61 | err += sn9c102_i2c_write(cam, 0x71, 0x00); | ||
62 | err += sn9c102_i2c_write(cam, 0x74, 0x21); | ||
63 | err += sn9c102_i2c_write(cam, 0x7d, 0xf7); | ||
64 | |||
65 | return err; | ||
66 | } | ||
67 | |||
68 | |||
69 | static int ov7630_set_ctrl(struct sn9c102_device* cam, | ||
70 | const struct v4l2_control* ctrl) | ||
71 | { | ||
72 | int err = 0; | ||
73 | |||
74 | switch (ctrl->id) { | ||
75 | case V4L2_CID_EXPOSURE: | ||
76 | err += sn9c102_i2c_write(cam, 0x10, ctrl->value >> 2); | ||
77 | err += sn9c102_i2c_write(cam, 0x76, ctrl->value & 0x03); | ||
78 | break; | ||
79 | case V4L2_CID_RED_BALANCE: | ||
80 | err += sn9c102_i2c_write(cam, 0x02, ctrl->value); | ||
81 | break; | ||
82 | case V4L2_CID_BLUE_BALANCE: | ||
83 | err += sn9c102_i2c_write(cam, 0x03, ctrl->value); | ||
84 | break; | ||
85 | case V4L2_CID_GAIN: | ||
86 | err += sn9c102_i2c_write(cam, 0x00, ctrl->value); | ||
87 | break; | ||
88 | case V4L2_CID_CONTRAST: | ||
89 | err += ctrl->value ? sn9c102_i2c_write(cam, 0x05, | ||
90 | (ctrl->value-1) | 0x20) | ||
91 | : sn9c102_i2c_write(cam, 0x05, 0x00); | ||
92 | break; | ||
93 | case V4L2_CID_BRIGHTNESS: | ||
94 | err += sn9c102_i2c_write(cam, 0x06, ctrl->value); | ||
95 | break; | ||
96 | case V4L2_CID_SATURATION: | ||
97 | err += sn9c102_i2c_write(cam, 0x03, ctrl->value << 4); | ||
98 | break; | ||
99 | case V4L2_CID_HUE: | ||
100 | err += ctrl->value ? sn9c102_i2c_write(cam, 0x04, | ||
101 | (ctrl->value-1) | 0x20) | ||
102 | : sn9c102_i2c_write(cam, 0x04, 0x00); | ||
103 | break; | ||
104 | case V4L2_CID_DO_WHITE_BALANCE: | ||
105 | err += sn9c102_i2c_write(cam, 0x0c, ctrl->value); | ||
106 | break; | ||
107 | case V4L2_CID_WHITENESS: | ||
108 | err += sn9c102_i2c_write(cam, 0x0d, ctrl->value); | ||
109 | break; | ||
110 | case V4L2_CID_AUTO_WHITE_BALANCE: | ||
111 | err += sn9c102_i2c_write(cam, 0x12, (ctrl->value << 2) | 0x09); | ||
112 | break; | ||
113 | case V4L2_CID_AUTOGAIN: | ||
114 | err += sn9c102_i2c_write(cam, 0x13, ctrl->value); | ||
115 | break; | ||
116 | case V4L2_CID_VFLIP: | ||
117 | err += sn9c102_i2c_write(cam, 0x75, 0x0e | (ctrl->value << 7)); | ||
118 | break; | ||
119 | case V4L2_CID_BLACK_LEVEL: | ||
120 | err += sn9c102_i2c_write(cam, 0x25, ctrl->value); | ||
121 | break; | ||
122 | case SN9C102_V4L2_CID_BRIGHT_LEVEL: | ||
123 | err += sn9c102_i2c_write(cam, 0x24, ctrl->value); | ||
124 | break; | ||
125 | case SN9C102_V4L2_CID_GAMMA: | ||
126 | err += sn9c102_i2c_write(cam, 0x14, (ctrl->value << 2) | 0x80); | ||
127 | break; | ||
128 | case SN9C102_V4L2_CID_BAND_FILTER: | ||
129 | err += sn9c102_i2c_write(cam, 0x2d, ctrl->value << 2); | ||
130 | break; | ||
131 | default: | ||
132 | return -EINVAL; | ||
133 | } | ||
134 | |||
135 | return err ? -EIO : 0; | ||
136 | } | ||
137 | |||
138 | |||
139 | static int ov7630_set_crop(struct sn9c102_device* cam, | ||
140 | const struct v4l2_rect* rect) | ||
141 | { | ||
142 | struct sn9c102_sensor* s = &ov7630; | ||
143 | int err = 0; | ||
144 | u8 v_start = (u8)(rect->top - s->cropcap.bounds.top) + 1; | ||
145 | |||
146 | err += sn9c102_write_reg(cam, v_start, 0x13); | ||
147 | |||
148 | return err; | ||
149 | } | ||
150 | |||
151 | |||
152 | static int ov7630_set_pix_format(struct sn9c102_device* cam, | ||
153 | const struct v4l2_pix_format* pix) | ||
154 | { | ||
155 | int err = 0; | ||
156 | |||
157 | if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X) | ||
158 | err += sn9c102_write_reg(cam, 0x20, 0x19); | ||
159 | else | ||
160 | err += sn9c102_write_reg(cam, 0x50, 0x19); | ||
161 | |||
162 | return err; | ||
163 | } | ||
164 | |||
165 | |||
166 | static struct sn9c102_sensor ov7630 = { | ||
167 | .name = "OV7630", | ||
168 | .maintainer = "Luca Risolia <luca.risolia@studio.unibo.it>", | ||
169 | .sysfs_ops = SN9C102_I2C_WRITE, | ||
170 | .frequency = SN9C102_I2C_100KHZ, | ||
171 | .interface = SN9C102_I2C_2WIRES, | ||
172 | .i2c_slave_id = 0x21, | ||
173 | .init = &ov7630_init, | ||
174 | .qctrl = { | ||
175 | { | ||
176 | .id = V4L2_CID_GAIN, | ||
177 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
178 | .name = "global gain", | ||
179 | .minimum = 0x00, | ||
180 | .maximum = 0x3f, | ||
181 | .step = 0x01, | ||
182 | .default_value = 0x14, | ||
183 | .flags = 0, | ||
184 | }, | ||
185 | { | ||
186 | .id = V4L2_CID_HUE, | ||
187 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
188 | .name = "hue", | ||
189 | .minimum = 0x00, | ||
190 | .maximum = 0x1f+1, | ||
191 | .step = 0x01, | ||
192 | .default_value = 0x00, | ||
193 | .flags = 0, | ||
194 | }, | ||
195 | { | ||
196 | .id = V4L2_CID_SATURATION, | ||
197 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
198 | .name = "saturation", | ||
199 | .minimum = 0x00, | ||
200 | .maximum = 0x0f, | ||
201 | .step = 0x01, | ||
202 | .default_value = 0x08, | ||
203 | .flags = 0, | ||
204 | }, | ||
205 | { | ||
206 | .id = V4L2_CID_CONTRAST, | ||
207 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
208 | .name = "contrast", | ||
209 | .minimum = 0x00, | ||
210 | .maximum = 0x1f+1, | ||
211 | .step = 0x01, | ||
212 | .default_value = 0x00, | ||
213 | .flags = 0, | ||
214 | }, | ||
215 | { | ||
216 | .id = V4L2_CID_EXPOSURE, | ||
217 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
218 | .name = "exposure", | ||
219 | .minimum = 0x000, | ||
220 | .maximum = 0x3ff, | ||
221 | .step = 0x001, | ||
222 | .default_value = 0x83<<2, | ||
223 | .flags = 0, | ||
224 | }, | ||
225 | { | ||
226 | .id = V4L2_CID_RED_BALANCE, | ||
227 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
228 | .name = "red balance", | ||
229 | .minimum = 0x00, | ||
230 | .maximum = 0xff, | ||
231 | .step = 0x01, | ||
232 | .default_value = 0x3a, | ||
233 | .flags = 0, | ||
234 | }, | ||
235 | { | ||
236 | .id = V4L2_CID_BLUE_BALANCE, | ||
237 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
238 | .name = "blue balance", | ||
239 | .minimum = 0x00, | ||
240 | .maximum = 0xff, | ||
241 | .step = 0x01, | ||
242 | .default_value = 0x77, | ||
243 | .flags = 0, | ||
244 | }, | ||
245 | { | ||
246 | .id = V4L2_CID_BRIGHTNESS, | ||
247 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
248 | .name = "brightness", | ||
249 | .minimum = 0x00, | ||
250 | .maximum = 0xff, | ||
251 | .step = 0x01, | ||
252 | .default_value = 0xa0, | ||
253 | .flags = 0, | ||
254 | }, | ||
255 | { | ||
256 | .id = V4L2_CID_DO_WHITE_BALANCE, | ||
257 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
258 | .name = "white balance background: blue", | ||
259 | .minimum = 0x00, | ||
260 | .maximum = 0x3f, | ||
261 | .step = 0x01, | ||
262 | .default_value = 0x20, | ||
263 | .flags = 0, | ||
264 | }, | ||
265 | { | ||
266 | .id = V4L2_CID_WHITENESS, | ||
267 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
268 | .name = "white balance background: red", | ||
269 | .minimum = 0x00, | ||
270 | .maximum = 0x3f, | ||
271 | .step = 0x01, | ||
272 | .default_value = 0x20, | ||
273 | .flags = 0, | ||
274 | }, | ||
275 | { | ||
276 | .id = V4L2_CID_AUTO_WHITE_BALANCE, | ||
277 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
278 | .name = "auto white balance", | ||
279 | .minimum = 0x00, | ||
280 | .maximum = 0x01, | ||
281 | .step = 0x01, | ||
282 | .default_value = 0x01, | ||
283 | .flags = 0, | ||
284 | }, | ||
285 | { | ||
286 | .id = V4L2_CID_AUTOGAIN, | ||
287 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
288 | .name = "gain & exposure mode", | ||
289 | .minimum = 0x00, | ||
290 | .maximum = 0x03, | ||
291 | .step = 0x01, | ||
292 | .default_value = 0x00, | ||
293 | .flags = 0, | ||
294 | }, | ||
295 | { | ||
296 | .id = V4L2_CID_VFLIP, | ||
297 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
298 | .name = "vertical flip", | ||
299 | .minimum = 0x00, | ||
300 | .maximum = 0x01, | ||
301 | .step = 0x01, | ||
302 | .default_value = 0x01, | ||
303 | .flags = 0, | ||
304 | }, | ||
305 | { | ||
306 | .id = V4L2_CID_BLACK_LEVEL, | ||
307 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
308 | .name = "black pixel ratio", | ||
309 | .minimum = 0x01, | ||
310 | .maximum = 0x9a, | ||
311 | .step = 0x01, | ||
312 | .default_value = 0x8a, | ||
313 | .flags = 0, | ||
314 | }, | ||
315 | { | ||
316 | .id = SN9C102_V4L2_CID_BRIGHT_LEVEL, | ||
317 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
318 | .name = "bright pixel ratio", | ||
319 | .minimum = 0x01, | ||
320 | .maximum = 0x9a, | ||
321 | .step = 0x01, | ||
322 | .default_value = 0x10, | ||
323 | .flags = 0, | ||
324 | }, | ||
325 | { | ||
326 | .id = SN9C102_V4L2_CID_BAND_FILTER, | ||
327 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
328 | .name = "band filter", | ||
329 | .minimum = 0x00, | ||
330 | .maximum = 0x01, | ||
331 | .step = 0x01, | ||
332 | .default_value = 0x00, | ||
333 | .flags = 0, | ||
334 | }, | ||
335 | { | ||
336 | .id = SN9C102_V4L2_CID_GAMMA, | ||
337 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
338 | .name = "rgb gamma", | ||
339 | .minimum = 0x00, | ||
340 | .maximum = 0x01, | ||
341 | .step = 0x01, | ||
342 | .default_value = 0x00, | ||
343 | .flags = 0, | ||
344 | }, | ||
345 | }, | ||
346 | .set_ctrl = &ov7630_set_ctrl, | ||
347 | .cropcap = { | ||
348 | .bounds = { | ||
349 | .left = 0, | ||
350 | .top = 0, | ||
351 | .width = 640, | ||
352 | .height = 480, | ||
353 | }, | ||
354 | .defrect = { | ||
355 | .left = 0, | ||
356 | .top = 0, | ||
357 | .width = 640, | ||
358 | .height = 480, | ||
359 | }, | ||
360 | }, | ||
361 | .set_crop = &ov7630_set_crop, | ||
362 | .pix_format = { | ||
363 | .width = 640, | ||
364 | .height = 480, | ||
365 | .pixelformat = V4L2_PIX_FMT_SBGGR8, | ||
366 | .priv = 8, | ||
367 | }, | ||
368 | .set_pix_format = &ov7630_set_pix_format | ||
369 | }; | ||
370 | |||
371 | |||
372 | int sn9c102_probe_ov7630(struct sn9c102_device* cam) | ||
373 | { | ||
374 | int err = 0; | ||
375 | |||
376 | sn9c102_attach_sensor(cam, &ov7630); | ||
377 | |||
378 | if (le16_to_cpu(ov7630.usbdev->descriptor.idProduct) != 0x608f && | ||
379 | le16_to_cpu(ov7630.usbdev->descriptor.idProduct) != 0x602c) | ||
380 | return -ENODEV; | ||
381 | |||
382 | err += sn9c102_write_reg(cam, 0x01, 0x01); | ||
383 | err += sn9c102_write_reg(cam, 0x00, 0x01); | ||
384 | err += sn9c102_write_reg(cam, 0x28, 0x17); | ||
385 | |||
386 | if (err) | ||
387 | return -EIO; | ||
388 | |||
389 | err += sn9c102_i2c_write(cam, 0x0b, 0); | ||
390 | if (err) | ||
391 | return -ENODEV; | ||
392 | |||
393 | return 0; | ||
394 | } | ||
diff --git a/drivers/usb/media/sn9c102_sensor.h b/drivers/usb/media/sn9c102_sensor.h index 6a7adebcb4bf..a45166c3488c 100644 --- a/drivers/usb/media/sn9c102_sensor.h +++ b/drivers/usb/media/sn9c102_sensor.h | |||
@@ -64,6 +64,7 @@ struct sn9c102_sensor; | |||
64 | */ | 64 | */ |
65 | extern int sn9c102_probe_hv7131d(struct sn9c102_device* cam); | 65 | extern int sn9c102_probe_hv7131d(struct sn9c102_device* cam); |
66 | extern int sn9c102_probe_mi0343(struct sn9c102_device* cam); | 66 | extern int sn9c102_probe_mi0343(struct sn9c102_device* cam); |
67 | extern int sn9c102_probe_ov7630(struct sn9c102_device* cam); | ||
67 | extern int sn9c102_probe_pas106b(struct sn9c102_device* cam); | 68 | extern int sn9c102_probe_pas106b(struct sn9c102_device* cam); |
68 | extern int sn9c102_probe_pas202bcb(struct sn9c102_device* cam); | 69 | extern int sn9c102_probe_pas202bcb(struct sn9c102_device* cam); |
69 | extern int sn9c102_probe_tas5110c1b(struct sn9c102_device* cam); | 70 | extern int sn9c102_probe_tas5110c1b(struct sn9c102_device* cam); |
@@ -80,6 +81,7 @@ static int (*sn9c102_sensor_table[])(struct sn9c102_device*) = { \ | |||
80 | &sn9c102_probe_pas106b, /* strong detection based on SENSOR ids */ \ | 81 | &sn9c102_probe_pas106b, /* strong detection based on SENSOR ids */ \ |
81 | &sn9c102_probe_pas202bcb, /* strong detection based on SENSOR ids */ \ | 82 | &sn9c102_probe_pas202bcb, /* strong detection based on SENSOR ids */ \ |
82 | &sn9c102_probe_hv7131d, /* strong detection based on SENSOR ids */ \ | 83 | &sn9c102_probe_hv7131d, /* strong detection based on SENSOR ids */ \ |
84 | &sn9c102_probe_ov7630, /* detection mostly based on USB pid/vid */ \ | ||
83 | &sn9c102_probe_tas5110c1b, /* detection based on USB pid/vid */ \ | 85 | &sn9c102_probe_tas5110c1b, /* detection based on USB pid/vid */ \ |
84 | &sn9c102_probe_tas5130d1b, /* detection based on USB pid/vid */ \ | 86 | &sn9c102_probe_tas5130d1b, /* detection based on USB pid/vid */ \ |
85 | NULL, \ | 87 | NULL, \ |
@@ -103,7 +105,8 @@ static const struct usb_device_id sn9c102_id_table[] = { \ | |||
103 | { USB_DEVICE(0x0c45, 0x6029), }, /* PAS106B */ \ | 105 | { USB_DEVICE(0x0c45, 0x6029), }, /* PAS106B */ \ |
104 | { USB_DEVICE(0x0c45, 0x602a), }, /* HV7131D */ \ | 106 | { USB_DEVICE(0x0c45, 0x602a), }, /* HV7131D */ \ |
105 | { USB_DEVICE(0x0c45, 0x602b), }, /* MI-0343 */ \ | 107 | { USB_DEVICE(0x0c45, 0x602b), }, /* MI-0343 */ \ |
106 | { USB_DEVICE(0x0c45, 0x602c), }, /* OV7620 */ \ | 108 | { USB_DEVICE(0x0c45, 0x602c), }, /* OV7630 */ \ |
109 | { USB_DEVICE(0x0c45, 0x602d), }, \ | ||
107 | { USB_DEVICE(0x0c45, 0x6030), }, /* MI03x */ \ | 110 | { USB_DEVICE(0x0c45, 0x6030), }, /* MI03x */ \ |
108 | { USB_DEVICE(0x0c45, 0x6080), }, \ | 111 | { USB_DEVICE(0x0c45, 0x6080), }, \ |
109 | { USB_DEVICE(0x0c45, 0x6082), }, /* MI0343 and MI0360 */ \ | 112 | { USB_DEVICE(0x0c45, 0x6082), }, /* MI0343 and MI0360 */ \ |
@@ -145,6 +148,8 @@ static const struct usb_device_id sn9c102_id_table[] = { \ | |||
145 | */ | 148 | */ |
146 | 149 | ||
147 | /* The "try" I2C I/O versions are used when probing the sensor */ | 150 | /* The "try" I2C I/O versions are used when probing the sensor */ |
151 | extern int sn9c102_i2c_try_write(struct sn9c102_device*,struct sn9c102_sensor*, | ||
152 | u8 address, u8 value); | ||
148 | extern int sn9c102_i2c_try_read(struct sn9c102_device*,struct sn9c102_sensor*, | 153 | extern int sn9c102_i2c_try_read(struct sn9c102_device*,struct sn9c102_sensor*, |
149 | u8 address); | 154 | u8 address); |
150 | 155 | ||
@@ -201,6 +206,8 @@ enum sn9c102_i2c_interface { | |||
201 | SN9C102_I2C_3WIRES, | 206 | SN9C102_I2C_3WIRES, |
202 | }; | 207 | }; |
203 | 208 | ||
209 | #define SN9C102_MAX_CTRLS V4L2_CID_LASTP1-V4L2_CID_BASE+10 | ||
210 | |||
204 | struct sn9c102_sensor { | 211 | struct sn9c102_sensor { |
205 | char name[32], /* sensor name */ | 212 | char name[32], /* sensor name */ |
206 | maintainer[64]; /* name of the mantainer <email> */ | 213 | maintainer[64]; /* name of the mantainer <email> */ |
@@ -243,7 +250,7 @@ struct sn9c102_sensor { | |||
243 | sensor according to the default configuration structures below. | 250 | sensor according to the default configuration structures below. |
244 | */ | 251 | */ |
245 | 252 | ||
246 | struct v4l2_queryctrl qctrl[V4L2_CID_LASTP1-V4L2_CID_BASE]; | 253 | struct v4l2_queryctrl qctrl[SN9C102_MAX_CTRLS]; |
247 | /* | 254 | /* |
248 | Optional list of default controls, defined as indicated in the | 255 | Optional list of default controls, defined as indicated in the |
249 | V4L2 API. Menu type controls are not handled by this interface. | 256 | V4L2 API. Menu type controls are not handled by this interface. |
@@ -356,7 +363,7 @@ struct sn9c102_sensor { | |||
356 | core module to store successfully updated values of the above | 363 | core module to store successfully updated values of the above |
357 | settings, for rollbacks..etc..in case of errors during atomic I/O | 364 | settings, for rollbacks..etc..in case of errors during atomic I/O |
358 | */ | 365 | */ |
359 | struct v4l2_queryctrl _qctrl[V4L2_CID_LASTP1-V4L2_CID_BASE]; | 366 | struct v4l2_queryctrl _qctrl[SN9C102_MAX_CTRLS]; |
360 | struct v4l2_rect _rect; | 367 | struct v4l2_rect _rect; |
361 | }; | 368 | }; |
362 | 369 | ||
@@ -367,5 +374,8 @@ struct sn9c102_sensor { | |||
367 | #define SN9C102_V4L2_CID_GREEN_BALANCE V4L2_CID_PRIVATE_BASE + 1 | 374 | #define SN9C102_V4L2_CID_GREEN_BALANCE V4L2_CID_PRIVATE_BASE + 1 |
368 | #define SN9C102_V4L2_CID_RESET_LEVEL V4L2_CID_PRIVATE_BASE + 2 | 375 | #define SN9C102_V4L2_CID_RESET_LEVEL V4L2_CID_PRIVATE_BASE + 2 |
369 | #define SN9C102_V4L2_CID_PIXEL_BIAS_VOLTAGE V4L2_CID_PRIVATE_BASE + 3 | 376 | #define SN9C102_V4L2_CID_PIXEL_BIAS_VOLTAGE V4L2_CID_PRIVATE_BASE + 3 |
377 | #define SN9C102_V4L2_CID_GAMMA V4L2_CID_PRIVATE_BASE + 4 | ||
378 | #define SN9C102_V4L2_CID_BAND_FILTER V4L2_CID_PRIVATE_BASE + 5 | ||
379 | #define SN9C102_V4L2_CID_BRIGHT_LEVEL V4L2_CID_PRIVATE_BASE + 6 | ||
370 | 380 | ||
371 | #endif /* _SN9C102_SENSOR_H_ */ | 381 | #endif /* _SN9C102_SENSOR_H_ */ |
diff --git a/drivers/usb/media/sn9c102_tas5110c1b.c b/drivers/usb/media/sn9c102_tas5110c1b.c index 690d62192273..8775999b5aff 100644 --- a/drivers/usb/media/sn9c102_tas5110c1b.c +++ b/drivers/usb/media/sn9c102_tas5110c1b.c | |||
@@ -24,8 +24,6 @@ | |||
24 | 24 | ||
25 | static struct sn9c102_sensor tas5110c1b; | 25 | static struct sn9c102_sensor tas5110c1b; |
26 | 26 | ||
27 | static struct v4l2_control tas5110c1b_gain; | ||
28 | |||
29 | 27 | ||
30 | static int tas5110c1b_init(struct sn9c102_device* cam) | 28 | static int tas5110c1b_init(struct sn9c102_device* cam) |
31 | { | 29 | { |
@@ -46,21 +44,6 @@ static int tas5110c1b_init(struct sn9c102_device* cam) | |||
46 | } | 44 | } |
47 | 45 | ||
48 | 46 | ||
49 | static int tas5110c1b_get_ctrl(struct sn9c102_device* cam, | ||
50 | struct v4l2_control* ctrl) | ||
51 | { | ||
52 | switch (ctrl->id) { | ||
53 | case V4L2_CID_GAIN: | ||
54 | ctrl->value = tas5110c1b_gain.value; | ||
55 | break; | ||
56 | default: | ||
57 | return -EINVAL; | ||
58 | } | ||
59 | |||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | |||
64 | static int tas5110c1b_set_ctrl(struct sn9c102_device* cam, | 47 | static int tas5110c1b_set_ctrl(struct sn9c102_device* cam, |
65 | const struct v4l2_control* ctrl) | 48 | const struct v4l2_control* ctrl) |
66 | { | 49 | { |
@@ -68,8 +51,7 @@ static int tas5110c1b_set_ctrl(struct sn9c102_device* cam, | |||
68 | 51 | ||
69 | switch (ctrl->id) { | 52 | switch (ctrl->id) { |
70 | case V4L2_CID_GAIN: | 53 | case V4L2_CID_GAIN: |
71 | if (!(err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value))) | 54 | err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value); |
72 | tas5110c1b_gain.value = ctrl->value; | ||
73 | break; | 55 | break; |
74 | default: | 56 | default: |
75 | return -EINVAL; | 57 | return -EINVAL; |
@@ -147,7 +129,6 @@ static struct sn9c102_sensor tas5110c1b = { | |||
147 | .height = 288, | 129 | .height = 288, |
148 | }, | 130 | }, |
149 | }, | 131 | }, |
150 | .get_ctrl = &tas5110c1b_get_ctrl, | ||
151 | .set_crop = &tas5110c1b_set_crop, | 132 | .set_crop = &tas5110c1b_set_crop, |
152 | .pix_format = { | 133 | .pix_format = { |
153 | .width = 352, | 134 | .width = 352, |
diff --git a/drivers/usb/media/sn9c102_tas5130d1b.c b/drivers/usb/media/sn9c102_tas5130d1b.c index b378e941bbe8..927eafdd8c73 100644 --- a/drivers/usb/media/sn9c102_tas5130d1b.c +++ b/drivers/usb/media/sn9c102_tas5130d1b.c | |||
@@ -24,8 +24,6 @@ | |||
24 | 24 | ||
25 | static struct sn9c102_sensor tas5130d1b; | 25 | static struct sn9c102_sensor tas5130d1b; |
26 | 26 | ||
27 | static struct v4l2_control tas5130d1b_gain, tas5130d1b_exposure; | ||
28 | |||
29 | 27 | ||
30 | static int tas5130d1b_init(struct sn9c102_device* cam) | 28 | static int tas5130d1b_init(struct sn9c102_device* cam) |
31 | { | 29 | { |
@@ -44,24 +42,6 @@ static int tas5130d1b_init(struct sn9c102_device* cam) | |||
44 | } | 42 | } |
45 | 43 | ||
46 | 44 | ||
47 | static int tas5130d1b_get_ctrl(struct sn9c102_device* cam, | ||
48 | struct v4l2_control* ctrl) | ||
49 | { | ||
50 | switch (ctrl->id) { | ||
51 | case V4L2_CID_GAIN: | ||
52 | ctrl->value = tas5130d1b_gain.value; | ||
53 | break; | ||
54 | case V4L2_CID_EXPOSURE: | ||
55 | ctrl->value = tas5130d1b_exposure.value; | ||
56 | break; | ||
57 | default: | ||
58 | return -EINVAL; | ||
59 | } | ||
60 | |||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | |||
65 | static int tas5130d1b_set_ctrl(struct sn9c102_device* cam, | 45 | static int tas5130d1b_set_ctrl(struct sn9c102_device* cam, |
66 | const struct v4l2_control* ctrl) | 46 | const struct v4l2_control* ctrl) |
67 | { | 47 | { |
@@ -69,12 +49,10 @@ static int tas5130d1b_set_ctrl(struct sn9c102_device* cam, | |||
69 | 49 | ||
70 | switch (ctrl->id) { | 50 | switch (ctrl->id) { |
71 | case V4L2_CID_GAIN: | 51 | case V4L2_CID_GAIN: |
72 | if (!(err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value))) | 52 | err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value); |
73 | tas5130d1b_gain.value = ctrl->value; | ||
74 | break; | 53 | break; |
75 | case V4L2_CID_EXPOSURE: | 54 | case V4L2_CID_EXPOSURE: |
76 | if (!(err += sn9c102_i2c_write(cam, 0x40, 0x47 - ctrl->value))) | 55 | err += sn9c102_i2c_write(cam, 0x40, 0x47 - ctrl->value); |
77 | tas5130d1b_exposure.value = ctrl->value; | ||
78 | break; | 56 | break; |
79 | default: | 57 | default: |
80 | return -EINVAL; | 58 | return -EINVAL; |
@@ -147,7 +125,6 @@ static struct sn9c102_sensor tas5130d1b = { | |||
147 | .flags = 0, | 125 | .flags = 0, |
148 | }, | 126 | }, |
149 | }, | 127 | }, |
150 | .get_ctrl = &tas5130d1b_get_ctrl, | ||
151 | .set_ctrl = &tas5130d1b_set_ctrl, | 128 | .set_ctrl = &tas5130d1b_set_ctrl, |
152 | .cropcap = { | 129 | .cropcap = { |
153 | .bounds = { | 130 | .bounds = { |
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index 3a896954b3a9..6649531fa824 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
@@ -139,6 +139,16 @@ config USB_IDMOUSE | |||
139 | 139 | ||
140 | source "drivers/usb/misc/sisusbvga/Kconfig" | 140 | source "drivers/usb/misc/sisusbvga/Kconfig" |
141 | 141 | ||
142 | config USB_LD | ||
143 | tristate "USB LD driver" | ||
144 | depends on USB && EXPERIMENTAL | ||
145 | help | ||
146 | This driver is for generic USB devices that use interrupt transfers, | ||
147 | like LD Didactic's USB devices. | ||
148 | |||
149 | To compile this driver as a module, choose M here: the | ||
150 | module will be called ldusb. | ||
151 | |||
142 | config USB_TEST | 152 | config USB_TEST |
143 | tristate "USB testing driver (DEVELOPMENT)" | 153 | tristate "USB testing driver (DEVELOPMENT)" |
144 | depends on USB && USB_DEVICEFS && EXPERIMENTAL | 154 | depends on USB && USB_DEVICEFS && EXPERIMENTAL |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 4a3814cbd48d..862e40a83689 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -9,6 +9,7 @@ obj-$(CONFIG_USB_EMI26) += emi26.o | |||
9 | obj-$(CONFIG_USB_EMI62) += emi62.o | 9 | obj-$(CONFIG_USB_EMI62) += emi62.o |
10 | obj-$(CONFIG_USB_IDMOUSE) += idmouse.o | 10 | obj-$(CONFIG_USB_IDMOUSE) += idmouse.o |
11 | obj-$(CONFIG_USB_LCD) += usblcd.o | 11 | obj-$(CONFIG_USB_LCD) += usblcd.o |
12 | obj-$(CONFIG_USB_LD) += ldusb.o | ||
12 | obj-$(CONFIG_USB_LED) += usbled.o | 13 | obj-$(CONFIG_USB_LED) += usbled.o |
13 | obj-$(CONFIG_USB_LEGOTOWER) += legousbtower.o | 14 | obj-$(CONFIG_USB_LEGOTOWER) += legousbtower.o |
14 | obj-$(CONFIG_USB_PHIDGETKIT) += phidgetkit.o | 15 | obj-$(CONFIG_USB_PHIDGETKIT) += phidgetkit.o |
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c new file mode 100644 index 000000000000..66ec88354b93 --- /dev/null +++ b/drivers/usb/misc/ldusb.c | |||
@@ -0,0 +1,794 @@ | |||
1 | /** | ||
2 | * Generic USB driver for report based interrupt in/out devices | ||
3 | * like LD Didactic's USB devices. LD Didactic's USB devices are | ||
4 | * HID devices which do not use HID report definitons (they use | ||
5 | * raw interrupt in and our reports only for communication). | ||
6 | * | ||
7 | * This driver uses a ring buffer for time critical reading of | ||
8 | * interrupt in reports and provides read and write methods for | ||
9 | * raw interrupt reports (similar to the Windows HID driver). | ||
10 | * Devices based on the book USB COMPLETE by Jan Axelson may need | ||
11 | * such a compatibility to the Windows HID driver. | ||
12 | * | ||
13 | * Copyright (C) 2005 Michael Hund <mhund@ld-didactic.de> | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or | ||
16 | * modify it under the terms of the GNU General Public License as | ||
17 | * published by the Free Software Foundation; either version 2 of | ||
18 | * the License, or (at your option) any later version. | ||
19 | * | ||
20 | * Derived from Lego USB Tower driver | ||
21 | * Copyright (C) 2003 David Glance <advidgsf@sourceforge.net> | ||
22 | * 2001-2004 Juergen Stuber <starblue@users.sourceforge.net> | ||
23 | * | ||
24 | * V0.1 (mh) Initial version | ||
25 | * V0.11 (mh) Added raw support for HID 1.0 devices (no interrupt out endpoint) | ||
26 | */ | ||
27 | |||
28 | #include <linux/config.h> | ||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/errno.h> | ||
31 | #include <linux/init.h> | ||
32 | #include <linux/slab.h> | ||
33 | #include <linux/module.h> | ||
34 | |||
35 | #include <asm/uaccess.h> | ||
36 | #include <linux/input.h> | ||
37 | #include <linux/usb.h> | ||
38 | #include <linux/poll.h> | ||
39 | |||
40 | /* Define these values to match your devices */ | ||
41 | #define USB_VENDOR_ID_LD 0x0f11 /* USB Vendor ID of LD Didactic GmbH */ | ||
42 | #define USB_DEVICE_ID_CASSY 0x1000 /* USB Product ID for all CASSY-S modules */ | ||
43 | #define USB_DEVICE_ID_POCKETCASSY 0x1010 /* USB Product ID for Pocket-CASSY */ | ||
44 | #define USB_DEVICE_ID_MOBILECASSY 0x1020 /* USB Product ID for Mobile-CASSY */ | ||
45 | #define USB_DEVICE_ID_JWM 0x1080 /* USB Product ID for Joule and Wattmeter */ | ||
46 | #define USB_DEVICE_ID_DMMP 0x1081 /* USB Product ID for Digital Multimeter P (reserved) */ | ||
47 | #define USB_DEVICE_ID_UMIP 0x1090 /* USB Product ID for UMI P */ | ||
48 | #define USB_DEVICE_ID_VIDEOCOM 0x1200 /* USB Product ID for VideoCom */ | ||
49 | #define USB_DEVICE_ID_COM3LAB 0x2000 /* USB Product ID for COM3LAB */ | ||
50 | #define USB_DEVICE_ID_TELEPORT 0x2010 /* USB Product ID for Terminal Adapter */ | ||
51 | #define USB_DEVICE_ID_NETWORKANALYSER 0x2020 /* USB Product ID for Network Analyser */ | ||
52 | #define USB_DEVICE_ID_POWERCONTROL 0x2030 /* USB Product ID for Controlling device for Power Electronics */ | ||
53 | |||
54 | #define USB_VENDOR_ID_VERNIER 0x08f7 | ||
55 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 | ||
56 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 | ||
57 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 | ||
58 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | ||
59 | |||
60 | |||
61 | #ifdef CONFIG_USB_DYNAMIC_MINORS | ||
62 | #define USB_LD_MINOR_BASE 0 | ||
63 | #else | ||
64 | #define USB_LD_MINOR_BASE 176 | ||
65 | #endif | ||
66 | |||
67 | /* table of devices that work with this driver */ | ||
68 | static struct usb_device_id ld_usb_table [] = { | ||
69 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_CASSY) }, | ||
70 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_POCKETCASSY) }, | ||
71 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_MOBILECASSY) }, | ||
72 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_JWM) }, | ||
73 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_DMMP) }, | ||
74 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_UMIP) }, | ||
75 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_VIDEOCOM) }, | ||
76 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_COM3LAB) }, | ||
77 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_TELEPORT) }, | ||
78 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_NETWORKANALYSER) }, | ||
79 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_POWERCONTROL) }, | ||
80 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) }, | ||
81 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, | ||
82 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, | ||
83 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, | ||
84 | { } /* Terminating entry */ | ||
85 | }; | ||
86 | MODULE_DEVICE_TABLE(usb, ld_usb_table); | ||
87 | MODULE_VERSION("V0.11"); | ||
88 | MODULE_AUTHOR("Michael Hund <mhund@ld-didactic.de>"); | ||
89 | MODULE_DESCRIPTION("LD USB Driver"); | ||
90 | MODULE_LICENSE("GPL"); | ||
91 | MODULE_SUPPORTED_DEVICE("LD USB Devices"); | ||
92 | |||
93 | #ifdef CONFIG_USB_DEBUG | ||
94 | static int debug = 1; | ||
95 | #else | ||
96 | static int debug = 0; | ||
97 | #endif | ||
98 | |||
99 | /* Use our own dbg macro */ | ||
100 | #define dbg_info(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) | ||
101 | |||
102 | /* Module parameters */ | ||
103 | module_param(debug, int, S_IRUGO | S_IWUSR); | ||
104 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
105 | |||
106 | /* All interrupt in transfers are collected in a ring buffer to | ||
107 | * avoid racing conditions and get better performance of the driver. | ||
108 | */ | ||
109 | static int ring_buffer_size = 128; | ||
110 | module_param(ring_buffer_size, int, 0); | ||
111 | MODULE_PARM_DESC(ring_buffer_size, "Read ring buffer size in reports"); | ||
112 | |||
113 | /* The write_buffer can contain more than one interrupt out transfer. | ||
114 | */ | ||
115 | static int write_buffer_size = 10; | ||
116 | module_param(write_buffer_size, int, 0); | ||
117 | MODULE_PARM_DESC(write_buffer_size, "Write buffer size in reports"); | ||
118 | |||
119 | /* As of kernel version 2.6.4 ehci-hcd uses an | ||
120 | * "only one interrupt transfer per frame" shortcut | ||
121 | * to simplify the scheduling of periodic transfers. | ||
122 | * This conflicts with our standard 1ms intervals for in and out URBs. | ||
123 | * We use default intervals of 2ms for in and 2ms for out transfers, | ||
124 | * which should be fast enough. | ||
125 | * Increase the interval to allow more devices that do interrupt transfers, | ||
126 | * or set to 1 to use the standard interval from the endpoint descriptors. | ||
127 | */ | ||
128 | static int min_interrupt_in_interval = 2; | ||
129 | module_param(min_interrupt_in_interval, int, 0); | ||
130 | MODULE_PARM_DESC(min_interrupt_in_interval, "Minimum interrupt in interval in ms"); | ||
131 | |||
132 | static int min_interrupt_out_interval = 2; | ||
133 | module_param(min_interrupt_out_interval, int, 0); | ||
134 | MODULE_PARM_DESC(min_interrupt_out_interval, "Minimum interrupt out interval in ms"); | ||
135 | |||
136 | /* Structure to hold all of our device specific stuff */ | ||
137 | struct ld_usb { | ||
138 | struct semaphore sem; /* locks this structure */ | ||
139 | struct usb_interface* intf; /* save off the usb interface pointer */ | ||
140 | |||
141 | int open_count; /* number of times this port has been opened */ | ||
142 | |||
143 | char* ring_buffer; | ||
144 | unsigned int ring_head; | ||
145 | unsigned int ring_tail; | ||
146 | |||
147 | wait_queue_head_t read_wait; | ||
148 | wait_queue_head_t write_wait; | ||
149 | |||
150 | char* interrupt_in_buffer; | ||
151 | struct usb_endpoint_descriptor* interrupt_in_endpoint; | ||
152 | struct urb* interrupt_in_urb; | ||
153 | int interrupt_in_interval; | ||
154 | size_t interrupt_in_endpoint_size; | ||
155 | int interrupt_in_running; | ||
156 | int interrupt_in_done; | ||
157 | |||
158 | char* interrupt_out_buffer; | ||
159 | struct usb_endpoint_descriptor* interrupt_out_endpoint; | ||
160 | struct urb* interrupt_out_urb; | ||
161 | int interrupt_out_interval; | ||
162 | size_t interrupt_out_endpoint_size; | ||
163 | int interrupt_out_busy; | ||
164 | }; | ||
165 | |||
166 | /* prevent races between open() and disconnect() */ | ||
167 | static DECLARE_MUTEX(disconnect_sem); | ||
168 | |||
169 | static struct usb_driver ld_usb_driver; | ||
170 | |||
171 | /** | ||
172 | * ld_usb_abort_transfers | ||
173 | * aborts transfers and frees associated data structures | ||
174 | */ | ||
175 | static void ld_usb_abort_transfers(struct ld_usb *dev) | ||
176 | { | ||
177 | /* shutdown transfer */ | ||
178 | if (dev->interrupt_in_running) { | ||
179 | dev->interrupt_in_running = 0; | ||
180 | if (dev->intf) | ||
181 | usb_kill_urb(dev->interrupt_in_urb); | ||
182 | } | ||
183 | if (dev->interrupt_out_busy) | ||
184 | if (dev->intf) | ||
185 | usb_kill_urb(dev->interrupt_out_urb); | ||
186 | } | ||
187 | |||
188 | /** | ||
189 | * ld_usb_delete | ||
190 | */ | ||
191 | static void ld_usb_delete(struct ld_usb *dev) | ||
192 | { | ||
193 | ld_usb_abort_transfers(dev); | ||
194 | |||
195 | /* free data structures */ | ||
196 | usb_free_urb(dev->interrupt_in_urb); | ||
197 | usb_free_urb(dev->interrupt_out_urb); | ||
198 | kfree(dev->ring_buffer); | ||
199 | kfree(dev->interrupt_in_buffer); | ||
200 | kfree(dev->interrupt_out_buffer); | ||
201 | kfree(dev); | ||
202 | } | ||
203 | |||
204 | /** | ||
205 | * ld_usb_interrupt_in_callback | ||
206 | */ | ||
207 | static void ld_usb_interrupt_in_callback(struct urb *urb, struct pt_regs *regs) | ||
208 | { | ||
209 | struct ld_usb *dev = urb->context; | ||
210 | size_t *actual_buffer; | ||
211 | unsigned int next_ring_head; | ||
212 | int retval; | ||
213 | |||
214 | if (urb->status) { | ||
215 | if (urb->status == -ENOENT || | ||
216 | urb->status == -ECONNRESET || | ||
217 | urb->status == -ESHUTDOWN) { | ||
218 | goto exit; | ||
219 | } else { | ||
220 | dbg_info(&dev->intf->dev, "%s: nonzero status received: %d\n", | ||
221 | __FUNCTION__, urb->status); | ||
222 | goto resubmit; /* maybe we can recover */ | ||
223 | } | ||
224 | } | ||
225 | |||
226 | if (urb->actual_length > 0) { | ||
227 | next_ring_head = (dev->ring_head+1) % ring_buffer_size; | ||
228 | if (next_ring_head != dev->ring_tail) { | ||
229 | actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_head*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); | ||
230 | /* actual_buffer gets urb->actual_length + interrupt_in_buffer */ | ||
231 | *actual_buffer = urb->actual_length; | ||
232 | memcpy(actual_buffer+1, dev->interrupt_in_buffer, urb->actual_length); | ||
233 | dev->ring_head = next_ring_head; | ||
234 | dbg_info(&dev->intf->dev, "%s: received %d bytes\n", | ||
235 | __FUNCTION__, urb->actual_length); | ||
236 | } else | ||
237 | dev_warn(&dev->intf->dev, | ||
238 | "Ring buffer overflow, %d bytes dropped\n", | ||
239 | urb->actual_length); | ||
240 | } | ||
241 | |||
242 | resubmit: | ||
243 | /* resubmit if we're still running */ | ||
244 | if (dev->interrupt_in_running && dev->intf) { | ||
245 | retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); | ||
246 | if (retval) | ||
247 | dev_err(&dev->intf->dev, | ||
248 | "usb_submit_urb failed (%d)\n", retval); | ||
249 | } | ||
250 | |||
251 | exit: | ||
252 | dev->interrupt_in_done = 1; | ||
253 | wake_up_interruptible(&dev->read_wait); | ||
254 | } | ||
255 | |||
256 | /** | ||
257 | * ld_usb_interrupt_out_callback | ||
258 | */ | ||
259 | static void ld_usb_interrupt_out_callback(struct urb *urb, struct pt_regs *regs) | ||
260 | { | ||
261 | struct ld_usb *dev = urb->context; | ||
262 | |||
263 | /* sync/async unlink faults aren't errors */ | ||
264 | if (urb->status && !(urb->status == -ENOENT || | ||
265 | urb->status == -ECONNRESET || | ||
266 | urb->status == -ESHUTDOWN)) | ||
267 | dbg_info(&dev->intf->dev, | ||
268 | "%s - nonzero write interrupt status received: %d\n", | ||
269 | __FUNCTION__, urb->status); | ||
270 | |||
271 | dev->interrupt_out_busy = 0; | ||
272 | wake_up_interruptible(&dev->write_wait); | ||
273 | } | ||
274 | |||
275 | /** | ||
276 | * ld_usb_open | ||
277 | */ | ||
278 | static int ld_usb_open(struct inode *inode, struct file *file) | ||
279 | { | ||
280 | struct ld_usb *dev; | ||
281 | int subminor; | ||
282 | int retval = 0; | ||
283 | struct usb_interface *interface; | ||
284 | |||
285 | nonseekable_open(inode, file); | ||
286 | subminor = iminor(inode); | ||
287 | |||
288 | down(&disconnect_sem); | ||
289 | |||
290 | interface = usb_find_interface(&ld_usb_driver, subminor); | ||
291 | |||
292 | if (!interface) { | ||
293 | err("%s - error, can't find device for minor %d\n", | ||
294 | __FUNCTION__, subminor); | ||
295 | retval = -ENODEV; | ||
296 | goto unlock_disconnect_exit; | ||
297 | } | ||
298 | |||
299 | dev = usb_get_intfdata(interface); | ||
300 | |||
301 | if (!dev) { | ||
302 | retval = -ENODEV; | ||
303 | goto unlock_disconnect_exit; | ||
304 | } | ||
305 | |||
306 | /* lock this device */ | ||
307 | if (down_interruptible(&dev->sem)) { | ||
308 | retval = -ERESTARTSYS; | ||
309 | goto unlock_disconnect_exit; | ||
310 | } | ||
311 | |||
312 | /* allow opening only once */ | ||
313 | if (dev->open_count) { | ||
314 | retval = -EBUSY; | ||
315 | goto unlock_exit; | ||
316 | } | ||
317 | dev->open_count = 1; | ||
318 | |||
319 | /* initialize in direction */ | ||
320 | dev->ring_head = 0; | ||
321 | dev->ring_tail = 0; | ||
322 | usb_fill_int_urb(dev->interrupt_in_urb, | ||
323 | interface_to_usbdev(interface), | ||
324 | usb_rcvintpipe(interface_to_usbdev(interface), | ||
325 | dev->interrupt_in_endpoint->bEndpointAddress), | ||
326 | dev->interrupt_in_buffer, | ||
327 | dev->interrupt_in_endpoint_size, | ||
328 | ld_usb_interrupt_in_callback, | ||
329 | dev, | ||
330 | dev->interrupt_in_interval); | ||
331 | |||
332 | dev->interrupt_in_running = 1; | ||
333 | dev->interrupt_in_done = 0; | ||
334 | |||
335 | retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); | ||
336 | if (retval) { | ||
337 | dev_err(&interface->dev, "Couldn't submit interrupt_in_urb %d\n", retval); | ||
338 | dev->interrupt_in_running = 0; | ||
339 | dev->open_count = 0; | ||
340 | goto unlock_exit; | ||
341 | } | ||
342 | |||
343 | /* save device in the file's private structure */ | ||
344 | file->private_data = dev; | ||
345 | |||
346 | unlock_exit: | ||
347 | up(&dev->sem); | ||
348 | |||
349 | unlock_disconnect_exit: | ||
350 | up(&disconnect_sem); | ||
351 | |||
352 | return retval; | ||
353 | } | ||
354 | |||
355 | /** | ||
356 | * ld_usb_release | ||
357 | */ | ||
358 | static int ld_usb_release(struct inode *inode, struct file *file) | ||
359 | { | ||
360 | struct ld_usb *dev; | ||
361 | int retval = 0; | ||
362 | |||
363 | dev = file->private_data; | ||
364 | |||
365 | if (dev == NULL) { | ||
366 | retval = -ENODEV; | ||
367 | goto exit; | ||
368 | } | ||
369 | |||
370 | if (down_interruptible(&dev->sem)) { | ||
371 | retval = -ERESTARTSYS; | ||
372 | goto exit; | ||
373 | } | ||
374 | |||
375 | if (dev->open_count != 1) { | ||
376 | retval = -ENODEV; | ||
377 | goto unlock_exit; | ||
378 | } | ||
379 | if (dev->intf == NULL) { | ||
380 | /* the device was unplugged before the file was released */ | ||
381 | up(&dev->sem); | ||
382 | /* unlock here as ld_usb_delete frees dev */ | ||
383 | ld_usb_delete(dev); | ||
384 | goto exit; | ||
385 | } | ||
386 | |||
387 | /* wait until write transfer is finished */ | ||
388 | if (dev->interrupt_out_busy) | ||
389 | wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); | ||
390 | ld_usb_abort_transfers(dev); | ||
391 | dev->open_count = 0; | ||
392 | |||
393 | unlock_exit: | ||
394 | up(&dev->sem); | ||
395 | |||
396 | exit: | ||
397 | return retval; | ||
398 | } | ||
399 | |||
400 | /** | ||
401 | * ld_usb_poll | ||
402 | */ | ||
403 | static unsigned int ld_usb_poll(struct file *file, poll_table *wait) | ||
404 | { | ||
405 | struct ld_usb *dev; | ||
406 | unsigned int mask = 0; | ||
407 | |||
408 | dev = file->private_data; | ||
409 | |||
410 | poll_wait(file, &dev->read_wait, wait); | ||
411 | poll_wait(file, &dev->write_wait, wait); | ||
412 | |||
413 | if (dev->ring_head != dev->ring_tail) | ||
414 | mask |= POLLIN | POLLRDNORM; | ||
415 | if (!dev->interrupt_out_busy) | ||
416 | mask |= POLLOUT | POLLWRNORM; | ||
417 | |||
418 | return mask; | ||
419 | } | ||
420 | |||
421 | /** | ||
422 | * ld_usb_read | ||
423 | */ | ||
424 | static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | ||
425 | loff_t *ppos) | ||
426 | { | ||
427 | struct ld_usb *dev; | ||
428 | size_t *actual_buffer; | ||
429 | size_t bytes_to_read; | ||
430 | int retval = 0; | ||
431 | |||
432 | dev = file->private_data; | ||
433 | |||
434 | /* verify that we actually have some data to read */ | ||
435 | if (count == 0) | ||
436 | goto exit; | ||
437 | |||
438 | /* lock this object */ | ||
439 | if (down_interruptible(&dev->sem)) { | ||
440 | retval = -ERESTARTSYS; | ||
441 | goto exit; | ||
442 | } | ||
443 | |||
444 | /* verify that the device wasn't unplugged */ | ||
445 | if (dev->intf == NULL) { | ||
446 | retval = -ENODEV; | ||
447 | err("No device or device unplugged %d\n", retval); | ||
448 | goto unlock_exit; | ||
449 | } | ||
450 | |||
451 | /* wait for data */ | ||
452 | if (dev->ring_head == dev->ring_tail) { | ||
453 | if (file->f_flags & O_NONBLOCK) { | ||
454 | retval = -EAGAIN; | ||
455 | goto unlock_exit; | ||
456 | } | ||
457 | retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); | ||
458 | if (retval < 0) | ||
459 | goto unlock_exit; | ||
460 | } | ||
461 | |||
462 | /* actual_buffer contains actual_length + interrupt_in_buffer */ | ||
463 | actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); | ||
464 | bytes_to_read = min(count, *actual_buffer); | ||
465 | if (bytes_to_read < *actual_buffer) | ||
466 | dev_warn(&dev->intf->dev, "Read buffer overflow, %d bytes dropped\n", | ||
467 | *actual_buffer-bytes_to_read); | ||
468 | |||
469 | /* copy one interrupt_in_buffer from ring_buffer into userspace */ | ||
470 | if (copy_to_user(buffer, actual_buffer+1, bytes_to_read)) { | ||
471 | retval = -EFAULT; | ||
472 | goto unlock_exit; | ||
473 | } | ||
474 | dev->ring_tail = (dev->ring_tail+1) % ring_buffer_size; | ||
475 | |||
476 | retval = bytes_to_read; | ||
477 | |||
478 | unlock_exit: | ||
479 | /* unlock the device */ | ||
480 | up(&dev->sem); | ||
481 | |||
482 | exit: | ||
483 | return retval; | ||
484 | } | ||
485 | |||
486 | /** | ||
487 | * ld_usb_write | ||
488 | */ | ||
489 | static ssize_t ld_usb_write(struct file *file, const char __user *buffer, | ||
490 | size_t count, loff_t *ppos) | ||
491 | { | ||
492 | struct ld_usb *dev; | ||
493 | size_t bytes_to_write; | ||
494 | int retval = 0; | ||
495 | |||
496 | dev = file->private_data; | ||
497 | |||
498 | /* verify that we actually have some data to write */ | ||
499 | if (count == 0) | ||
500 | goto exit; | ||
501 | |||
502 | /* lock this object */ | ||
503 | if (down_interruptible(&dev->sem)) { | ||
504 | retval = -ERESTARTSYS; | ||
505 | goto exit; | ||
506 | } | ||
507 | |||
508 | /* verify that the device wasn't unplugged */ | ||
509 | if (dev->intf == NULL) { | ||
510 | retval = -ENODEV; | ||
511 | err("No device or device unplugged %d\n", retval); | ||
512 | goto unlock_exit; | ||
513 | } | ||
514 | |||
515 | /* wait until previous transfer is finished */ | ||
516 | if (dev->interrupt_out_busy) { | ||
517 | if (file->f_flags & O_NONBLOCK) { | ||
518 | retval = -EAGAIN; | ||
519 | goto unlock_exit; | ||
520 | } | ||
521 | retval = wait_event_interruptible(dev->write_wait, !dev->interrupt_out_busy); | ||
522 | if (retval < 0) { | ||
523 | goto unlock_exit; | ||
524 | } | ||
525 | } | ||
526 | |||
527 | /* write the data into interrupt_out_buffer from userspace */ | ||
528 | bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); | ||
529 | if (bytes_to_write < count) | ||
530 | dev_warn(&dev->intf->dev, "Write buffer overflow, %d bytes dropped\n",count-bytes_to_write); | ||
531 | dbg_info(&dev->intf->dev, "%s: count = %d, bytes_to_write = %d\n", __FUNCTION__, count, bytes_to_write); | ||
532 | |||
533 | if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { | ||
534 | retval = -EFAULT; | ||
535 | goto unlock_exit; | ||
536 | } | ||
537 | |||
538 | if (dev->interrupt_out_endpoint == NULL) { | ||
539 | /* try HID_REQ_SET_REPORT=9 on control_endpoint instead of interrupt_out_endpoint */ | ||
540 | retval = usb_control_msg(interface_to_usbdev(dev->intf), | ||
541 | usb_sndctrlpipe(interface_to_usbdev(dev->intf), 0), | ||
542 | 9, | ||
543 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, | ||
544 | 1 << 8, 0, | ||
545 | dev->interrupt_out_buffer, | ||
546 | bytes_to_write, | ||
547 | USB_CTRL_SET_TIMEOUT * HZ); | ||
548 | if (retval < 0) | ||
549 | err("Couldn't submit HID_REQ_SET_REPORT %d\n", retval); | ||
550 | goto unlock_exit; | ||
551 | } | ||
552 | |||
553 | /* send off the urb */ | ||
554 | usb_fill_int_urb(dev->interrupt_out_urb, | ||
555 | interface_to_usbdev(dev->intf), | ||
556 | usb_sndintpipe(interface_to_usbdev(dev->intf), | ||
557 | dev->interrupt_out_endpoint->bEndpointAddress), | ||
558 | dev->interrupt_out_buffer, | ||
559 | bytes_to_write, | ||
560 | ld_usb_interrupt_out_callback, | ||
561 | dev, | ||
562 | dev->interrupt_out_interval); | ||
563 | |||
564 | dev->interrupt_out_busy = 1; | ||
565 | wmb(); | ||
566 | |||
567 | retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); | ||
568 | if (retval) { | ||
569 | dev->interrupt_out_busy = 0; | ||
570 | err("Couldn't submit interrupt_out_urb %d\n", retval); | ||
571 | goto unlock_exit; | ||
572 | } | ||
573 | retval = bytes_to_write; | ||
574 | |||
575 | unlock_exit: | ||
576 | /* unlock the device */ | ||
577 | up(&dev->sem); | ||
578 | |||
579 | exit: | ||
580 | return retval; | ||
581 | } | ||
582 | |||
583 | /* file operations needed when we register this driver */ | ||
584 | static struct file_operations ld_usb_fops = { | ||
585 | .owner = THIS_MODULE, | ||
586 | .read = ld_usb_read, | ||
587 | .write = ld_usb_write, | ||
588 | .open = ld_usb_open, | ||
589 | .release = ld_usb_release, | ||
590 | .poll = ld_usb_poll, | ||
591 | }; | ||
592 | |||
593 | /* | ||
594 | * usb class driver info in order to get a minor number from the usb core, | ||
595 | * and to have the device registered with devfs and the driver core | ||
596 | */ | ||
597 | static struct usb_class_driver ld_usb_class = { | ||
598 | .name = "ldusb%d", | ||
599 | .fops = &ld_usb_fops, | ||
600 | .minor_base = USB_LD_MINOR_BASE, | ||
601 | }; | ||
602 | |||
603 | /** | ||
604 | * ld_usb_probe | ||
605 | * | ||
606 | * Called by the usb core when a new device is connected that it thinks | ||
607 | * this driver might be interested in. | ||
608 | */ | ||
609 | static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
610 | { | ||
611 | struct usb_device *udev = interface_to_usbdev(intf); | ||
612 | struct ld_usb *dev = NULL; | ||
613 | struct usb_host_interface *iface_desc; | ||
614 | struct usb_endpoint_descriptor *endpoint; | ||
615 | char *buffer; | ||
616 | int i; | ||
617 | int retval = -ENOMEM; | ||
618 | |||
619 | /* allocate memory for our device state and intialize it */ | ||
620 | |||
621 | dev = kmalloc(sizeof(*dev), GFP_KERNEL); | ||
622 | if (dev == NULL) { | ||
623 | dev_err(&intf->dev, "Out of memory\n"); | ||
624 | goto exit; | ||
625 | } | ||
626 | memset(dev, 0x00, sizeof(*dev)); | ||
627 | init_MUTEX(&dev->sem); | ||
628 | dev->intf = intf; | ||
629 | init_waitqueue_head(&dev->read_wait); | ||
630 | init_waitqueue_head(&dev->write_wait); | ||
631 | |||
632 | /* workaround for early firmware versions on fast computers */ | ||
633 | if ((le16_to_cpu(udev->descriptor.idVendor) == USB_VENDOR_ID_LD) && | ||
634 | ((le16_to_cpu(udev->descriptor.idProduct) == USB_DEVICE_ID_CASSY) || | ||
635 | (le16_to_cpu(udev->descriptor.idProduct) == USB_DEVICE_ID_COM3LAB)) && | ||
636 | (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x103)) { | ||
637 | buffer = kmalloc(256, GFP_KERNEL); | ||
638 | /* usb_string makes SETUP+STALL to leave always ControlReadLoop */ | ||
639 | usb_string(udev, 255, buffer, 256); | ||
640 | kfree(buffer); | ||
641 | } | ||
642 | |||
643 | iface_desc = intf->cur_altsetting; | ||
644 | |||
645 | /* set up the endpoint information */ | ||
646 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
647 | endpoint = &iface_desc->endpoint[i].desc; | ||
648 | |||
649 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | ||
650 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
651 | dev->interrupt_in_endpoint = endpoint; | ||
652 | } | ||
653 | |||
654 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | ||
655 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
656 | dev->interrupt_out_endpoint = endpoint; | ||
657 | } | ||
658 | } | ||
659 | if (dev->interrupt_in_endpoint == NULL) { | ||
660 | dev_err(&intf->dev, "Interrupt in endpoint not found\n"); | ||
661 | goto error; | ||
662 | } | ||
663 | if (dev->interrupt_out_endpoint == NULL) | ||
664 | dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n"); | ||
665 | |||
666 | dev->interrupt_in_endpoint_size = le16_to_cpu(dev->interrupt_in_endpoint->wMaxPacketSize); | ||
667 | dev->ring_buffer = kmalloc(ring_buffer_size*(sizeof(size_t)+dev->interrupt_in_endpoint_size), GFP_KERNEL); | ||
668 | if (!dev->ring_buffer) { | ||
669 | dev_err(&intf->dev, "Couldn't allocate ring_buffer\n"); | ||
670 | goto error; | ||
671 | } | ||
672 | dev->interrupt_in_buffer = kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL); | ||
673 | if (!dev->interrupt_in_buffer) { | ||
674 | dev_err(&intf->dev, "Couldn't allocate interrupt_in_buffer\n"); | ||
675 | goto error; | ||
676 | } | ||
677 | dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
678 | if (!dev->interrupt_in_urb) { | ||
679 | dev_err(&intf->dev, "Couldn't allocate interrupt_in_urb\n"); | ||
680 | goto error; | ||
681 | } | ||
682 | dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? le16_to_cpu(dev->interrupt_out_endpoint->wMaxPacketSize) : | ||
683 | udev->descriptor.bMaxPacketSize0; | ||
684 | dev->interrupt_out_buffer = kmalloc(write_buffer_size*dev->interrupt_out_endpoint_size, GFP_KERNEL); | ||
685 | if (!dev->interrupt_out_buffer) { | ||
686 | dev_err(&intf->dev, "Couldn't allocate interrupt_out_buffer\n"); | ||
687 | goto error; | ||
688 | } | ||
689 | dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
690 | if (!dev->interrupt_out_urb) { | ||
691 | dev_err(&intf->dev, "Couldn't allocate interrupt_out_urb\n"); | ||
692 | goto error; | ||
693 | } | ||
694 | dev->interrupt_in_interval = min_interrupt_in_interval > dev->interrupt_in_endpoint->bInterval ? min_interrupt_in_interval : dev->interrupt_in_endpoint->bInterval; | ||
695 | if (dev->interrupt_out_endpoint) | ||
696 | dev->interrupt_out_interval = min_interrupt_out_interval > dev->interrupt_out_endpoint->bInterval ? min_interrupt_out_interval : dev->interrupt_out_endpoint->bInterval; | ||
697 | |||
698 | /* we can register the device now, as it is ready */ | ||
699 | usb_set_intfdata(intf, dev); | ||
700 | |||
701 | retval = usb_register_dev(intf, &ld_usb_class); | ||
702 | if (retval) { | ||
703 | /* something prevented us from registering this driver */ | ||
704 | dev_err(&intf->dev, "Not able to get a minor for this device.\n"); | ||
705 | usb_set_intfdata(intf, NULL); | ||
706 | goto error; | ||
707 | } | ||
708 | |||
709 | /* let the user know what node this device is now attached to */ | ||
710 | dev_info(&intf->dev, "LD USB Device #%d now attached to major %d minor %d\n", | ||
711 | (intf->minor - USB_LD_MINOR_BASE), USB_MAJOR, intf->minor); | ||
712 | |||
713 | exit: | ||
714 | return retval; | ||
715 | |||
716 | error: | ||
717 | ld_usb_delete(dev); | ||
718 | |||
719 | return retval; | ||
720 | } | ||
721 | |||
722 | /** | ||
723 | * ld_usb_disconnect | ||
724 | * | ||
725 | * Called by the usb core when the device is removed from the system. | ||
726 | */ | ||
727 | static void ld_usb_disconnect(struct usb_interface *intf) | ||
728 | { | ||
729 | struct ld_usb *dev; | ||
730 | int minor; | ||
731 | |||
732 | down(&disconnect_sem); | ||
733 | |||
734 | dev = usb_get_intfdata(intf); | ||
735 | usb_set_intfdata(intf, NULL); | ||
736 | |||
737 | down(&dev->sem); | ||
738 | |||
739 | minor = intf->minor; | ||
740 | |||
741 | /* give back our minor */ | ||
742 | usb_deregister_dev(intf, &ld_usb_class); | ||
743 | |||
744 | /* if the device is not opened, then we clean up right now */ | ||
745 | if (!dev->open_count) { | ||
746 | up(&dev->sem); | ||
747 | ld_usb_delete(dev); | ||
748 | } else { | ||
749 | dev->intf = NULL; | ||
750 | up(&dev->sem); | ||
751 | } | ||
752 | |||
753 | up(&disconnect_sem); | ||
754 | |||
755 | dev_info(&intf->dev, "LD USB Device #%d now disconnected\n", | ||
756 | (minor - USB_LD_MINOR_BASE)); | ||
757 | } | ||
758 | |||
759 | /* usb specific object needed to register this driver with the usb subsystem */ | ||
760 | static struct usb_driver ld_usb_driver = { | ||
761 | .owner = THIS_MODULE, | ||
762 | .name = "ldusb", | ||
763 | .probe = ld_usb_probe, | ||
764 | .disconnect = ld_usb_disconnect, | ||
765 | .id_table = ld_usb_table, | ||
766 | }; | ||
767 | |||
768 | /** | ||
769 | * ld_usb_init | ||
770 | */ | ||
771 | static int __init ld_usb_init(void) | ||
772 | { | ||
773 | int retval; | ||
774 | |||
775 | /* register this driver with the USB subsystem */ | ||
776 | retval = usb_register(&ld_usb_driver); | ||
777 | if (retval) | ||
778 | err("usb_register failed for the "__FILE__" driver. Error number %d\n", retval); | ||
779 | |||
780 | return retval; | ||
781 | } | ||
782 | |||
783 | /** | ||
784 | * ld_usb_exit | ||
785 | */ | ||
786 | static void __exit ld_usb_exit(void) | ||
787 | { | ||
788 | /* deregister this driver with the USB subsystem */ | ||
789 | usb_deregister(&ld_usb_driver); | ||
790 | } | ||
791 | |||
792 | module_init(ld_usb_init); | ||
793 | module_exit(ld_usb_exit); | ||
794 | |||
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index 755a4570477f..26266b30028e 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
@@ -19,11 +19,16 @@ | |||
19 | #define DATA_MAX 32 | 19 | #define DATA_MAX 32 |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * Defined by USB 2.0 clause 9.3, table 9.2. | ||
23 | */ | ||
24 | #define SETUP_MAX 8 | ||
25 | |||
26 | /* | ||
22 | * This limit exists to prevent OOMs when the user process stops reading. | 27 | * This limit exists to prevent OOMs when the user process stops reading. |
23 | */ | 28 | */ |
24 | #define EVENT_MAX 25 | 29 | #define EVENT_MAX 25 |
25 | 30 | ||
26 | #define PRINTF_DFL 120 | 31 | #define PRINTF_DFL 130 |
27 | 32 | ||
28 | struct mon_event_text { | 33 | struct mon_event_text { |
29 | struct list_head e_link; | 34 | struct list_head e_link; |
@@ -33,7 +38,9 @@ struct mon_event_text { | |||
33 | unsigned int tstamp; | 38 | unsigned int tstamp; |
34 | int length; /* Depends on type: xfer length or act length */ | 39 | int length; /* Depends on type: xfer length or act length */ |
35 | int status; | 40 | int status; |
41 | char setup_flag; | ||
36 | char data_flag; | 42 | char data_flag; |
43 | unsigned char setup[SETUP_MAX]; | ||
37 | unsigned char data[DATA_MAX]; | 44 | unsigned char data[DATA_MAX]; |
38 | }; | 45 | }; |
39 | 46 | ||
@@ -64,6 +71,22 @@ static void mon_text_dtor(void *, kmem_cache_t *, unsigned long); | |||
64 | * This is called with the whole mon_bus locked, so no additional lock. | 71 | * This is called with the whole mon_bus locked, so no additional lock. |
65 | */ | 72 | */ |
66 | 73 | ||
74 | static inline char mon_text_get_setup(struct mon_event_text *ep, | ||
75 | struct urb *urb, char ev_type) | ||
76 | { | ||
77 | |||
78 | if (!usb_pipecontrol(urb->pipe) || ev_type != 'S') | ||
79 | return '-'; | ||
80 | |||
81 | if (urb->transfer_flags & URB_NO_SETUP_DMA_MAP) | ||
82 | return 'D'; | ||
83 | if (urb->setup_packet == NULL) | ||
84 | return 'Z'; /* '0' would be not as pretty. */ | ||
85 | |||
86 | memcpy(ep->setup, urb->setup_packet, SETUP_MAX); | ||
87 | return 0; | ||
88 | } | ||
89 | |||
67 | static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, | 90 | static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, |
68 | int len, char ev_type) | 91 | int len, char ev_type) |
69 | { | 92 | { |
@@ -90,7 +113,6 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, | |||
90 | 113 | ||
91 | /* | 114 | /* |
92 | * Bulk is easy to shortcut reliably. | 115 | * Bulk is easy to shortcut reliably. |
93 | * XXX Control needs setup packet taken. | ||
94 | * XXX Other pipe types need consideration. Currently, we overdo it | 116 | * XXX Other pipe types need consideration. Currently, we overdo it |
95 | * and collect garbage for them: better more than less. | 117 | * and collect garbage for them: better more than less. |
96 | */ | 118 | */ |
@@ -144,6 +166,7 @@ static void mon_text_event(struct mon_reader_text *rp, struct urb *urb, | |||
144 | /* Collecting status makes debugging sense for submits, too */ | 166 | /* Collecting status makes debugging sense for submits, too */ |
145 | ep->status = urb->status; | 167 | ep->status = urb->status; |
146 | 168 | ||
169 | ep->setup_flag = mon_text_get_setup(ep, urb, ev_type); | ||
147 | ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type); | 170 | ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type); |
148 | 171 | ||
149 | rp->nevents++; | 172 | rp->nevents++; |
@@ -299,10 +322,25 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, | |||
299 | default: /* PIPE_BULK */ utype = 'B'; | 322 | default: /* PIPE_BULK */ utype = 'B'; |
300 | } | 323 | } |
301 | cnt += snprintf(pbuf + cnt, limit - cnt, | 324 | cnt += snprintf(pbuf + cnt, limit - cnt, |
302 | "%lx %u %c %c%c:%03u:%02u %d %d", | 325 | "%lx %u %c %c%c:%03u:%02u", |
303 | ep->id, ep->tstamp, ep->type, | 326 | ep->id, ep->tstamp, ep->type, |
304 | utype, udir, usb_pipedevice(ep->pipe), usb_pipeendpoint(ep->pipe), | 327 | utype, udir, usb_pipedevice(ep->pipe), usb_pipeendpoint(ep->pipe)); |
305 | ep->status, ep->length); | 328 | |
329 | if (ep->setup_flag == 0) { /* Setup packet is present and captured */ | ||
330 | cnt += snprintf(pbuf + cnt, limit - cnt, | ||
331 | " s %02x %02x %04x %04x %04x", | ||
332 | ep->setup[0], | ||
333 | ep->setup[1], | ||
334 | (ep->setup[3] << 8) | ep->setup[2], | ||
335 | (ep->setup[5] << 8) | ep->setup[4], | ||
336 | (ep->setup[7] << 8) | ep->setup[6]); | ||
337 | } else if (ep->setup_flag != '-') { /* Unable to capture setup packet */ | ||
338 | cnt += snprintf(pbuf + cnt, limit - cnt, | ||
339 | " %c __ __ ____ ____ ____", ep->setup_flag); | ||
340 | } else { /* No setup for this kind of URB */ | ||
341 | cnt += snprintf(pbuf + cnt, limit - cnt, " %d", ep->status); | ||
342 | } | ||
343 | cnt += snprintf(pbuf + cnt, limit - cnt, " %d", ep->length); | ||
306 | 344 | ||
307 | if ((data_len = ep->length) > 0) { | 345 | if ((data_len = ep->length) > 0) { |
308 | if (ep->data_flag == 0) { | 346 | if (ep->data_flag == 0) { |
diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index fd6ff4cb2c62..7ffa99b9760f 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c | |||
@@ -477,7 +477,7 @@ static int kaweth_reset(struct kaweth_device *kaweth) | |||
477 | } | 477 | } |
478 | 478 | ||
479 | static void kaweth_usb_receive(struct urb *, struct pt_regs *regs); | 479 | static void kaweth_usb_receive(struct urb *, struct pt_regs *regs); |
480 | static int kaweth_resubmit_rx_urb(struct kaweth_device *, int); | 480 | static int kaweth_resubmit_rx_urb(struct kaweth_device *, unsigned); |
481 | 481 | ||
482 | /**************************************************************** | 482 | /**************************************************************** |
483 | int_callback | 483 | int_callback |
@@ -550,7 +550,7 @@ static void kaweth_resubmit_tl(void *d) | |||
550 | * kaweth_resubmit_rx_urb | 550 | * kaweth_resubmit_rx_urb |
551 | ****************************************************************/ | 551 | ****************************************************************/ |
552 | static int kaweth_resubmit_rx_urb(struct kaweth_device *kaweth, | 552 | static int kaweth_resubmit_rx_urb(struct kaweth_device *kaweth, |
553 | int mem_flags) | 553 | unsigned mem_flags) |
554 | { | 554 | { |
555 | int result; | 555 | int result; |
556 | 556 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index d882fa3ad19a..0b03ddab53d9 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -264,16 +264,26 @@ | |||
264 | /* | 264 | /* |
265 | * Version Information | 265 | * Version Information |
266 | */ | 266 | */ |
267 | #define DRIVER_VERSION "v1.4.2" | 267 | #define DRIVER_VERSION "v1.4.3" |
268 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>" | 268 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>" |
269 | #define DRIVER_DESC "USB FTDI Serial Converters Driver" | 269 | #define DRIVER_DESC "USB FTDI Serial Converters Driver" |
270 | 270 | ||
271 | static int debug; | 271 | static int debug; |
272 | 272 | ||
273 | static struct usb_device_id id_table_sio [] = { | 273 | /* struct ftdi_sio_quirk is used by devices requiring special attention. */ |
274 | { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, | 274 | struct ftdi_sio_quirk { |
275 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, | 275 | void (*setup)(struct usb_serial *); /* Special settings during startup. */ |
276 | { } /* Terminating entry */ | 276 | }; |
277 | |||
278 | static void ftdi_USB_UIRT_setup (struct usb_serial *serial); | ||
279 | static void ftdi_HE_TIRA1_setup (struct usb_serial *serial); | ||
280 | |||
281 | static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { | ||
282 | .setup = ftdi_USB_UIRT_setup, | ||
283 | }; | ||
284 | |||
285 | static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { | ||
286 | .setup = ftdi_HE_TIRA1_setup, | ||
277 | }; | 287 | }; |
278 | 288 | ||
279 | /* | 289 | /* |
@@ -288,237 +298,11 @@ static struct usb_device_id id_table_sio [] = { | |||
288 | * the bcdDevice value is used to differentiate FT232BM and FT245BM from | 298 | * the bcdDevice value is used to differentiate FT232BM and FT245BM from |
289 | * the earlier FT8U232AM and FT8U232BM. For now, include all known VID/PID | 299 | * the earlier FT8U232AM and FT8U232BM. For now, include all known VID/PID |
290 | * combinations in both tables. | 300 | * combinations in both tables. |
291 | * FIXME: perhaps bcdDevice can also identify 12MHz devices, but I don't know | 301 | * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices, |
292 | * if those ever went into mass production. [Ian Abbott] | 302 | * but I don't know if those ever went into mass production. [Ian Abbott] |
293 | */ | 303 | */ |
294 | 304 | ||
295 | 305 | ||
296 | static struct usb_device_id id_table_8U232AM [] = { | ||
297 | { USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0, 0x3ff) }, | ||
298 | { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0, 0x3ff) }, | ||
299 | { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0, 0x3ff) }, | ||
300 | { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0, 0x3ff) }, | ||
301 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | ||
302 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | ||
303 | { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0, 0x3ff) }, | ||
304 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0, 0x3ff) }, | ||
305 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) }, | ||
306 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0, 0x3ff) }, | ||
307 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0, 0x3ff) }, | ||
308 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0, 0x3ff) }, | ||
309 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0, 0x3ff) }, | ||
310 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0, 0x3ff) }, | ||
311 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0, 0x3ff) }, | ||
312 | { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0, 0x3ff) }, | ||
313 | { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0, 0x3ff) }, | ||
314 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2101_PID, 0, 0x3ff) }, | ||
315 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2102_PID, 0, 0x3ff) }, | ||
316 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2103_PID, 0, 0x3ff) }, | ||
317 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2104_PID, 0, 0x3ff) }, | ||
318 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_1_PID, 0, 0x3ff) }, | ||
319 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_2_PID, 0, 0x3ff) }, | ||
320 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_1_PID, 0, 0x3ff) }, | ||
321 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_2_PID, 0, 0x3ff) }, | ||
322 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_1_PID, 0, 0x3ff) }, | ||
323 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_2_PID, 0, 0x3ff) }, | ||
324 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_1_PID, 0, 0x3ff) }, | ||
325 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_2_PID, 0, 0x3ff) }, | ||
326 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_3_PID, 0, 0x3ff) }, | ||
327 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_4_PID, 0, 0x3ff) }, | ||
328 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_1_PID, 0, 0x3ff) }, | ||
329 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_2_PID, 0, 0x3ff) }, | ||
330 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_3_PID, 0, 0x3ff) }, | ||
331 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_4_PID, 0, 0x3ff) }, | ||
332 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_1_PID, 0, 0x3ff) }, | ||
333 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_2_PID, 0, 0x3ff) }, | ||
334 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_3_PID, 0, 0x3ff) }, | ||
335 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_4_PID, 0, 0x3ff) }, | ||
336 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_1_PID, 0, 0x3ff) }, | ||
337 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_2_PID, 0, 0x3ff) }, | ||
338 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_3_PID, 0, 0x3ff) }, | ||
339 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_4_PID, 0, 0x3ff) }, | ||
340 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_5_PID, 0, 0x3ff) }, | ||
341 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_6_PID, 0, 0x3ff) }, | ||
342 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_7_PID, 0, 0x3ff) }, | ||
343 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_8_PID, 0, 0x3ff) }, | ||
344 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_1_PID, 0, 0x3ff) }, | ||
345 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_2_PID, 0, 0x3ff) }, | ||
346 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_3_PID, 0, 0x3ff) }, | ||
347 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_4_PID, 0, 0x3ff) }, | ||
348 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_5_PID, 0, 0x3ff) }, | ||
349 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_6_PID, 0, 0x3ff) }, | ||
350 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_7_PID, 0, 0x3ff) }, | ||
351 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_8_PID, 0, 0x3ff) }, | ||
352 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_1_PID, 0, 0x3ff) }, | ||
353 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_2_PID, 0, 0x3ff) }, | ||
354 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_3_PID, 0, 0x3ff) }, | ||
355 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_4_PID, 0, 0x3ff) }, | ||
356 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_5_PID, 0, 0x3ff) }, | ||
357 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0, 0x3ff) }, | ||
358 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0, 0x3ff) }, | ||
359 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0, 0x3ff) }, | ||
360 | { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0, 0x3ff) }, | ||
361 | { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0, 0x3ff) }, | ||
362 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0, 0x3ff) }, | ||
363 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0, 0x3ff) }, | ||
364 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) }, | ||
365 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) }, | ||
366 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) }, | ||
367 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0, 0x3ff) }, | ||
368 | { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) }, | ||
369 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0, 0x3ff) }, | ||
370 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) }, | ||
371 | { USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0, 0x3ff) }, | ||
372 | { USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0, 0x3ff) }, | ||
373 | { USB_DEVICE_VER(FTDI_VID, FTDI_RM_CANVIEW_PID, 0, 0x3ff) }, | ||
374 | { USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0, 0x3ff) }, | ||
375 | { USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0, 0x3ff) }, | ||
376 | { USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0, 0x3ff) }, | ||
377 | { USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0, 0x3ff) }, | ||
378 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID, 0, 0x3ff) }, | ||
379 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID, 0, 0x3ff) }, | ||
380 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID, 0, 0x3ff) }, | ||
381 | { } /* Terminating entry */ | ||
382 | }; | ||
383 | |||
384 | |||
385 | static struct usb_device_id id_table_FT232BM [] = { | ||
386 | { USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0x400, 0xffff) }, | ||
387 | { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0x400, 0xffff) }, | ||
388 | { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0x400, 0xffff) }, | ||
389 | { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0x400, 0xffff) }, | ||
390 | { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0x400, 0xffff) }, | ||
391 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) }, | ||
392 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) }, | ||
393 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0x400, 0xffff) }, | ||
394 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0x400, 0xffff) }, | ||
395 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0x400, 0xffff) }, | ||
396 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0x400, 0xffff) }, | ||
397 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0x400, 0xffff) }, | ||
398 | { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0x400, 0xffff) }, | ||
399 | { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0x400, 0xffff) }, | ||
400 | { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0x400, 0xffff) }, | ||
401 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) }, | ||
402 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) }, | ||
403 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) }, | ||
404 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_3_PID, 0x400, 0xffff) }, | ||
405 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_4_PID, 0x400, 0xffff) }, | ||
406 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_5_PID, 0x400, 0xffff) }, | ||
407 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_6_PID, 0x400, 0xffff) }, | ||
408 | { USB_DEVICE_VER(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID, 0x400, 0xffff) }, | ||
409 | { USB_DEVICE_VER(FTDI_VID, FTDI_PIEGROUP_PID, 0x400, 0xffff) }, | ||
410 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2101_PID, 0x400, 0xffff) }, | ||
411 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2102_PID, 0x400, 0xffff) }, | ||
412 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2103_PID, 0x400, 0xffff) }, | ||
413 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2104_PID, 0x400, 0xffff) }, | ||
414 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_1_PID, 0x400, 0xffff) }, | ||
415 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_2_PID, 0x400, 0xffff) }, | ||
416 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_1_PID, 0x400, 0xffff) }, | ||
417 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_2_PID, 0x400, 0xffff) }, | ||
418 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_1_PID, 0x400, 0xffff) }, | ||
419 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_2_PID, 0x400, 0xffff) }, | ||
420 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_1_PID, 0x400, 0xffff) }, | ||
421 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_2_PID, 0x400, 0xffff) }, | ||
422 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_3_PID, 0x400, 0xffff) }, | ||
423 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_4_PID, 0x400, 0xffff) }, | ||
424 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_1_PID, 0x400, 0xffff) }, | ||
425 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_2_PID, 0x400, 0xffff) }, | ||
426 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_3_PID, 0x400, 0xffff) }, | ||
427 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_4_PID, 0x400, 0xffff) }, | ||
428 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_1_PID, 0x400, 0xffff) }, | ||
429 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_2_PID, 0x400, 0xffff) }, | ||
430 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_3_PID, 0x400, 0xffff) }, | ||
431 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_4_PID, 0x400, 0xffff) }, | ||
432 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_1_PID, 0x400, 0xffff) }, | ||
433 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_2_PID, 0x400, 0xffff) }, | ||
434 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_3_PID, 0x400, 0xffff) }, | ||
435 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_4_PID, 0x400, 0xffff) }, | ||
436 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_5_PID, 0x400, 0xffff) }, | ||
437 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_6_PID, 0x400, 0xffff) }, | ||
438 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_7_PID, 0x400, 0xffff) }, | ||
439 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_8_PID, 0x400, 0xffff) }, | ||
440 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_1_PID, 0x400, 0xffff) }, | ||
441 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_2_PID, 0x400, 0xffff) }, | ||
442 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_3_PID, 0x400, 0xffff) }, | ||
443 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_4_PID, 0x400, 0xffff) }, | ||
444 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_5_PID, 0x400, 0xffff) }, | ||
445 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_6_PID, 0x400, 0xffff) }, | ||
446 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_7_PID, 0x400, 0xffff) }, | ||
447 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_8_PID, 0x400, 0xffff) }, | ||
448 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_1_PID, 0x400, 0xffff) }, | ||
449 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_2_PID, 0x400, 0xffff) }, | ||
450 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_3_PID, 0x400, 0xffff) }, | ||
451 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_4_PID, 0x400, 0xffff) }, | ||
452 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_5_PID, 0x400, 0xffff) }, | ||
453 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0x400, 0xffff) }, | ||
454 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0x400, 0xffff) }, | ||
455 | { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0x400, 0xffff) }, | ||
456 | { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0x400, 0xffff) }, | ||
457 | { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0x400, 0xffff) }, | ||
458 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0x400, 0xffff) }, | ||
459 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0x400, 0xffff) }, | ||
460 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0x400, 0xffff) }, | ||
461 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0x400, 0xffff) }, | ||
462 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E808_PID, 0x400, 0xffff) }, | ||
463 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E809_PID, 0x400, 0xffff) }, | ||
464 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80A_PID, 0x400, 0xffff) }, | ||
465 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80B_PID, 0x400, 0xffff) }, | ||
466 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80C_PID, 0x400, 0xffff) }, | ||
467 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80D_PID, 0x400, 0xffff) }, | ||
468 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80E_PID, 0x400, 0xffff) }, | ||
469 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80F_PID, 0x400, 0xffff) }, | ||
470 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E888_PID, 0x400, 0xffff) }, | ||
471 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E889_PID, 0x400, 0xffff) }, | ||
472 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88A_PID, 0x400, 0xffff) }, | ||
473 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88B_PID, 0x400, 0xffff) }, | ||
474 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88C_PID, 0x400, 0xffff) }, | ||
475 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88D_PID, 0x400, 0xffff) }, | ||
476 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, | ||
477 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, | ||
478 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) }, | ||
479 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0x400, 0xffff) }, | ||
480 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, | ||
481 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, | ||
482 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, | ||
483 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) }, | ||
484 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) }, | ||
485 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) }, | ||
486 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) }, | ||
487 | { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0x400, 0xffff) }, | ||
488 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0x400, 0xffff) }, | ||
489 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0x400, 0xffff) }, | ||
490 | { USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0x400, 0xffff) }, | ||
491 | { USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0x400, 0xffff) }, | ||
492 | { USB_DEVICE_VER(FTDI_VID, FTDI_RM_CANVIEW_PID, 0x400, 0xffff) }, | ||
493 | { USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0x400, 0xffff) }, | ||
494 | { USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0x400, 0xffff) }, | ||
495 | { USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0x400, 0xffff) }, | ||
496 | { USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0x400, 0xffff) }, | ||
497 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID, 0x400, 0xffff) }, | ||
498 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID, 0x400, 0xffff) }, | ||
499 | { USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID, 0x400, 0xffff) }, | ||
500 | { USB_DEVICE_VER(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID, 0x400, 0xffff) }, | ||
501 | { } /* Terminating entry */ | ||
502 | }; | ||
503 | |||
504 | |||
505 | static struct usb_device_id id_table_USB_UIRT [] = { | ||
506 | { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) }, | ||
507 | { } /* Terminating entry */ | ||
508 | }; | ||
509 | |||
510 | |||
511 | static struct usb_device_id id_table_HE_TIRA1 [] = { | ||
512 | { USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) }, | ||
513 | { } /* Terminating entry */ | ||
514 | }; | ||
515 | |||
516 | |||
517 | static struct usb_device_id id_table_FT2232C[] = { | ||
518 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | ||
519 | { } /* Terminating entry */ | ||
520 | }; | ||
521 | |||
522 | 306 | ||
523 | static struct usb_device_id id_table_combined [] = { | 307 | static struct usb_device_id id_table_combined [] = { |
524 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, | 308 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, |
@@ -540,14 +324,14 @@ static struct usb_device_id id_table_combined [] = { | |||
540 | { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) }, | 324 | { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) }, |
541 | { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) }, | 325 | { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) }, |
542 | { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) }, | 326 | { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) }, |
543 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) }, | 327 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) }, |
544 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) }, | 328 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) }, |
545 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) }, | 329 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) }, |
546 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_3_PID, 0x400, 0xffff) }, | 330 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) }, |
547 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_4_PID, 0x400, 0xffff) }, | 331 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) }, |
548 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_5_PID, 0x400, 0xffff) }, | 332 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, |
549 | { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_6_PID, 0x400, 0xffff) }, | 333 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, |
550 | { USB_DEVICE_VER(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID, 0x400, 0xffff) }, | 334 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, |
551 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, | 335 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, |
552 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, | 336 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, |
553 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, | 337 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, |
@@ -597,35 +381,37 @@ static struct usb_device_id id_table_combined [] = { | |||
597 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, | 381 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, |
598 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, | 382 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, |
599 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, | 383 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, |
600 | { USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) }, | 384 | { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID), |
601 | { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) }, | 385 | .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk }, |
386 | { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID), | ||
387 | .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk }, | ||
602 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) }, | 388 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) }, |
603 | { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) }, | 389 | { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) }, |
604 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) }, | 390 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) }, |
605 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) }, | 391 | { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) }, |
606 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E808_PID, 0x400, 0xffff) }, | 392 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) }, |
607 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E809_PID, 0x400, 0xffff) }, | 393 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) }, |
608 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80A_PID, 0x400, 0xffff) }, | 394 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) }, |
609 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80B_PID, 0x400, 0xffff) }, | 395 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) }, |
610 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80C_PID, 0x400, 0xffff) }, | 396 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) }, |
611 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80D_PID, 0x400, 0xffff) }, | 397 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) }, |
612 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80E_PID, 0x400, 0xffff) }, | 398 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) }, |
613 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80F_PID, 0x400, 0xffff) }, | 399 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) }, |
614 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E888_PID, 0x400, 0xffff) }, | 400 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) }, |
615 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E889_PID, 0x400, 0xffff) }, | 401 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) }, |
616 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88A_PID, 0x400, 0xffff) }, | 402 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) }, |
617 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88B_PID, 0x400, 0xffff) }, | 403 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) }, |
618 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88C_PID, 0x400, 0xffff) }, | 404 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) }, |
619 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88D_PID, 0x400, 0xffff) }, | 405 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) }, |
620 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, | 406 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) }, |
621 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, | 407 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) }, |
622 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, | 408 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, |
623 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, | 409 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, |
624 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, | 410 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, |
625 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, | 411 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, |
626 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, | 412 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, |
627 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) }, | 413 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) }, |
628 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) }, | 414 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) }, |
629 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) }, | 415 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) }, |
630 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) }, | 416 | { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) }, |
631 | { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) }, | 417 | { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) }, |
@@ -642,7 +428,7 @@ static struct usb_device_id id_table_combined [] = { | |||
642 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, | 428 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, |
643 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, | 429 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, |
644 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, | 430 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, |
645 | { USB_DEVICE_VER(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID, 0x400, 0xffff) }, | 431 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, |
646 | { } /* Terminating entry */ | 432 | { } /* Terminating entry */ |
647 | }; | 433 | }; |
648 | 434 | ||
@@ -705,12 +491,8 @@ struct ftdi_private { | |||
705 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP ) | 491 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP ) |
706 | 492 | ||
707 | /* function prototypes for a FTDI serial converter */ | 493 | /* function prototypes for a FTDI serial converter */ |
708 | static int ftdi_SIO_startup (struct usb_serial *serial); | 494 | static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id); |
709 | static int ftdi_8U232AM_startup (struct usb_serial *serial); | 495 | static int ftdi_sio_attach (struct usb_serial *serial); |
710 | static int ftdi_FT232BM_startup (struct usb_serial *serial); | ||
711 | static int ftdi_FT2232C_startup (struct usb_serial *serial); | ||
712 | static int ftdi_USB_UIRT_startup (struct usb_serial *serial); | ||
713 | static int ftdi_HE_TIRA1_startup (struct usb_serial *serial); | ||
714 | static void ftdi_shutdown (struct usb_serial *serial); | 496 | static void ftdi_shutdown (struct usb_serial *serial); |
715 | static int ftdi_open (struct usb_serial_port *port, struct file *filp); | 497 | static int ftdi_open (struct usb_serial_port *port, struct file *filp); |
716 | static void ftdi_close (struct usb_serial_port *port, struct file *filp); | 498 | static void ftdi_close (struct usb_serial_port *port, struct file *filp); |
@@ -733,14 +515,16 @@ static unsigned short int ftdi_232am_baud_to_divisor (int baud); | |||
733 | static __u32 ftdi_232bm_baud_base_to_divisor (int baud, int base); | 515 | static __u32 ftdi_232bm_baud_base_to_divisor (int baud, int base); |
734 | static __u32 ftdi_232bm_baud_to_divisor (int baud); | 516 | static __u32 ftdi_232bm_baud_to_divisor (int baud); |
735 | 517 | ||
736 | static struct usb_serial_device_type ftdi_SIO_device = { | 518 | static struct usb_serial_device_type ftdi_sio_device = { |
737 | .owner = THIS_MODULE, | 519 | .owner = THIS_MODULE, |
738 | .name = "FTDI SIO", | 520 | .name = "FTDI USB Serial Device", |
739 | .id_table = id_table_sio, | 521 | .short_name = "ftdi_sio", |
522 | .id_table = id_table_combined, | ||
740 | .num_interrupt_in = 0, | 523 | .num_interrupt_in = 0, |
741 | .num_bulk_in = 1, | 524 | .num_bulk_in = 1, |
742 | .num_bulk_out = 1, | 525 | .num_bulk_out = 1, |
743 | .num_ports = 1, | 526 | .num_ports = 1, |
527 | .probe = ftdi_sio_probe, | ||
744 | .open = ftdi_open, | 528 | .open = ftdi_open, |
745 | .close = ftdi_close, | 529 | .close = ftdi_close, |
746 | .throttle = ftdi_throttle, | 530 | .throttle = ftdi_throttle, |
@@ -755,143 +539,10 @@ static struct usb_serial_device_type ftdi_SIO_device = { | |||
755 | .ioctl = ftdi_ioctl, | 539 | .ioctl = ftdi_ioctl, |
756 | .set_termios = ftdi_set_termios, | 540 | .set_termios = ftdi_set_termios, |
757 | .break_ctl = ftdi_break_ctl, | 541 | .break_ctl = ftdi_break_ctl, |
758 | .attach = ftdi_SIO_startup, | 542 | .attach = ftdi_sio_attach, |
759 | .shutdown = ftdi_shutdown, | 543 | .shutdown = ftdi_shutdown, |
760 | }; | 544 | }; |
761 | 545 | ||
762 | static struct usb_serial_device_type ftdi_8U232AM_device = { | ||
763 | .owner = THIS_MODULE, | ||
764 | .name = "FTDI 8U232AM Compatible", | ||
765 | .id_table = id_table_8U232AM, | ||
766 | .num_interrupt_in = 0, | ||
767 | .num_bulk_in = 1, | ||
768 | .num_bulk_out = 1, | ||
769 | .num_ports = 1, | ||
770 | .open = ftdi_open, | ||
771 | .close = ftdi_close, | ||
772 | .throttle = ftdi_throttle, | ||
773 | .unthrottle = ftdi_unthrottle, | ||
774 | .write = ftdi_write, | ||
775 | .write_room = ftdi_write_room, | ||
776 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
777 | .read_bulk_callback = ftdi_read_bulk_callback, | ||
778 | .write_bulk_callback = ftdi_write_bulk_callback, | ||
779 | .tiocmget = ftdi_tiocmget, | ||
780 | .tiocmset = ftdi_tiocmset, | ||
781 | .ioctl = ftdi_ioctl, | ||
782 | .set_termios = ftdi_set_termios, | ||
783 | .break_ctl = ftdi_break_ctl, | ||
784 | .attach = ftdi_8U232AM_startup, | ||
785 | .shutdown = ftdi_shutdown, | ||
786 | }; | ||
787 | |||
788 | static struct usb_serial_device_type ftdi_FT232BM_device = { | ||
789 | .owner = THIS_MODULE, | ||
790 | .name = "FTDI FT232BM Compatible", | ||
791 | .id_table = id_table_FT232BM, | ||
792 | .num_interrupt_in = 0, | ||
793 | .num_bulk_in = 1, | ||
794 | .num_bulk_out = 1, | ||
795 | .num_ports = 1, | ||
796 | .open = ftdi_open, | ||
797 | .close = ftdi_close, | ||
798 | .throttle = ftdi_throttle, | ||
799 | .unthrottle = ftdi_unthrottle, | ||
800 | .write = ftdi_write, | ||
801 | .write_room = ftdi_write_room, | ||
802 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
803 | .read_bulk_callback = ftdi_read_bulk_callback, | ||
804 | .write_bulk_callback = ftdi_write_bulk_callback, | ||
805 | .tiocmget = ftdi_tiocmget, | ||
806 | .tiocmset = ftdi_tiocmset, | ||
807 | .ioctl = ftdi_ioctl, | ||
808 | .set_termios = ftdi_set_termios, | ||
809 | .break_ctl = ftdi_break_ctl, | ||
810 | .attach = ftdi_FT232BM_startup, | ||
811 | .shutdown = ftdi_shutdown, | ||
812 | }; | ||
813 | |||
814 | static struct usb_serial_device_type ftdi_FT2232C_device = { | ||
815 | .owner = THIS_MODULE, | ||
816 | .name = "FTDI FT2232C Compatible", | ||
817 | .id_table = id_table_FT2232C, | ||
818 | .num_interrupt_in = 0, | ||
819 | .num_bulk_in = 1, | ||
820 | .num_bulk_out = 1, | ||
821 | .num_ports = 1, | ||
822 | .open = ftdi_open, | ||
823 | .close = ftdi_close, | ||
824 | .throttle = ftdi_throttle, | ||
825 | .unthrottle = ftdi_unthrottle, | ||
826 | .write = ftdi_write, | ||
827 | .write_room = ftdi_write_room, | ||
828 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
829 | .read_bulk_callback = ftdi_read_bulk_callback, | ||
830 | .write_bulk_callback = ftdi_write_bulk_callback, | ||
831 | .tiocmget = ftdi_tiocmget, | ||
832 | .tiocmset = ftdi_tiocmset, | ||
833 | .ioctl = ftdi_ioctl, | ||
834 | .set_termios = ftdi_set_termios, | ||
835 | .break_ctl = ftdi_break_ctl, | ||
836 | .attach = ftdi_FT2232C_startup, | ||
837 | .shutdown = ftdi_shutdown, | ||
838 | }; | ||
839 | |||
840 | static struct usb_serial_device_type ftdi_USB_UIRT_device = { | ||
841 | .owner = THIS_MODULE, | ||
842 | .name = "USB-UIRT Infrared Tranceiver", | ||
843 | .id_table = id_table_USB_UIRT, | ||
844 | .num_interrupt_in = 0, | ||
845 | .num_bulk_in = 1, | ||
846 | .num_bulk_out = 1, | ||
847 | .num_ports = 1, | ||
848 | .open = ftdi_open, | ||
849 | .close = ftdi_close, | ||
850 | .throttle = ftdi_throttle, | ||
851 | .unthrottle = ftdi_unthrottle, | ||
852 | .write = ftdi_write, | ||
853 | .write_room = ftdi_write_room, | ||
854 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
855 | .read_bulk_callback = ftdi_read_bulk_callback, | ||
856 | .write_bulk_callback = ftdi_write_bulk_callback, | ||
857 | .tiocmget = ftdi_tiocmget, | ||
858 | .tiocmset = ftdi_tiocmset, | ||
859 | .ioctl = ftdi_ioctl, | ||
860 | .set_termios = ftdi_set_termios, | ||
861 | .break_ctl = ftdi_break_ctl, | ||
862 | .attach = ftdi_USB_UIRT_startup, | ||
863 | .shutdown = ftdi_shutdown, | ||
864 | }; | ||
865 | |||
866 | /* The TIRA1 is based on a FT232BM which requires a fixed baud rate of 100000 | ||
867 | * and which requires RTS-CTS to be enabled. */ | ||
868 | static struct usb_serial_device_type ftdi_HE_TIRA1_device = { | ||
869 | .owner = THIS_MODULE, | ||
870 | .name = "Home-Electronics TIRA-1 IR Transceiver", | ||
871 | .id_table = id_table_HE_TIRA1, | ||
872 | .num_interrupt_in = 0, | ||
873 | .num_bulk_in = 1, | ||
874 | .num_bulk_out = 1, | ||
875 | .num_ports = 1, | ||
876 | .open = ftdi_open, | ||
877 | .close = ftdi_close, | ||
878 | .throttle = ftdi_throttle, | ||
879 | .unthrottle = ftdi_unthrottle, | ||
880 | .write = ftdi_write, | ||
881 | .write_room = ftdi_write_room, | ||
882 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
883 | .read_bulk_callback = ftdi_read_bulk_callback, | ||
884 | .write_bulk_callback = ftdi_write_bulk_callback, | ||
885 | .tiocmget = ftdi_tiocmget, | ||
886 | .tiocmset = ftdi_tiocmset, | ||
887 | .ioctl = ftdi_ioctl, | ||
888 | .set_termios = ftdi_set_termios, | ||
889 | .break_ctl = ftdi_break_ctl, | ||
890 | .attach = ftdi_HE_TIRA1_startup, | ||
891 | .shutdown = ftdi_shutdown, | ||
892 | }; | ||
893 | |||
894 | |||
895 | 546 | ||
896 | #define WDR_TIMEOUT 5000 /* default urb timeout */ | 547 | #define WDR_TIMEOUT 5000 /* default urb timeout */ |
897 | 548 | ||
@@ -1212,6 +863,59 @@ check_and_exit: | |||
1212 | } /* set_serial_info */ | 863 | } /* set_serial_info */ |
1213 | 864 | ||
1214 | 865 | ||
866 | /* Determine type of FTDI chip based on USB config and descriptor. */ | ||
867 | static void ftdi_determine_type(struct usb_serial_port *port) | ||
868 | { | ||
869 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
870 | struct usb_serial *serial = port->serial; | ||
871 | struct usb_device *udev = serial->dev; | ||
872 | unsigned version; | ||
873 | unsigned interfaces; | ||
874 | |||
875 | /* Assume it is not the original SIO device for now. */ | ||
876 | priv->baud_base = 48000000 / 16; | ||
877 | priv->write_offset = 0; | ||
878 | |||
879 | version = le16_to_cpu(udev->descriptor.bcdDevice); | ||
880 | interfaces = udev->actconfig->desc.bNumInterfaces; | ||
881 | dbg("%s: bcdDevice = 0x%x, bNumInterfaces = %u", __FUNCTION__, | ||
882 | version, interfaces); | ||
883 | if (interfaces > 1) { | ||
884 | int inter; | ||
885 | |||
886 | /* Multiple interfaces. Assume FT2232C. */ | ||
887 | priv->chip_type = FT2232C; | ||
888 | /* Determine interface code. */ | ||
889 | inter = serial->interface->altsetting->desc.bInterfaceNumber; | ||
890 | if (inter == 0) { | ||
891 | priv->interface = PIT_SIOA; | ||
892 | } else { | ||
893 | priv->interface = PIT_SIOB; | ||
894 | } | ||
895 | /* BM-type devices have a bug where bcdDevice gets set | ||
896 | * to 0x200 when iSerialNumber is 0. */ | ||
897 | if (version < 0x500) { | ||
898 | dbg("%s: something fishy - bcdDevice too low for multi-interface device", | ||
899 | __FUNCTION__); | ||
900 | } | ||
901 | } else if (version < 0x200) { | ||
902 | /* Old device. Assume its the original SIO. */ | ||
903 | priv->chip_type = SIO; | ||
904 | priv->baud_base = 12000000 / 16; | ||
905 | priv->write_offset = 1; | ||
906 | } else if (version < 0x400) { | ||
907 | /* Assume its an FT8U232AM (or FT8U245AM) */ | ||
908 | /* (It might be a BM because of the iSerialNumber bug, | ||
909 | * but it will still work as an AM device.) */ | ||
910 | priv->chip_type = FT8U232AM; | ||
911 | } else { | ||
912 | /* Assume its an FT232BM (or FT245BM) */ | ||
913 | priv->chip_type = FT232BM; | ||
914 | } | ||
915 | info("Detected %s", ftdi_chip_name[priv->chip_type]); | ||
916 | } | ||
917 | |||
918 | |||
1215 | /* | 919 | /* |
1216 | * *************************************************************************** | 920 | * *************************************************************************** |
1217 | * Sysfs Attribute | 921 | * Sysfs Attribute |
@@ -1355,12 +1059,20 @@ static void remove_sysfs_attrs(struct usb_serial *serial) | |||
1355 | * *************************************************************************** | 1059 | * *************************************************************************** |
1356 | */ | 1060 | */ |
1357 | 1061 | ||
1358 | /* Common startup subroutine */ | 1062 | /* Probe function to check for special devices */ |
1359 | /* Called from ftdi_SIO_startup, etc. */ | 1063 | static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id) |
1360 | static int ftdi_common_startup (struct usb_serial *serial) | 1064 | { |
1065 | usb_set_serial_data(serial, (void *)id->driver_info); | ||
1066 | |||
1067 | return (0); | ||
1068 | } | ||
1069 | |||
1070 | /* attach subroutine */ | ||
1071 | static int ftdi_sio_attach (struct usb_serial *serial) | ||
1361 | { | 1072 | { |
1362 | struct usb_serial_port *port = serial->port[0]; | 1073 | struct usb_serial_port *port = serial->port[0]; |
1363 | struct ftdi_private *priv; | 1074 | struct ftdi_private *priv; |
1075 | struct ftdi_sio_quirk *quirk; | ||
1364 | 1076 | ||
1365 | dbg("%s",__FUNCTION__); | 1077 | dbg("%s",__FUNCTION__); |
1366 | 1078 | ||
@@ -1400,150 +1112,49 @@ static int ftdi_common_startup (struct usb_serial *serial) | |||
1400 | port->bulk_out_buffer = NULL; | 1112 | port->bulk_out_buffer = NULL; |
1401 | 1113 | ||
1402 | usb_set_serial_port_data(serial->port[0], priv); | 1114 | usb_set_serial_port_data(serial->port[0], priv); |
1403 | |||
1404 | return (0); | ||
1405 | } | ||
1406 | |||
1407 | |||
1408 | /* Startup for the SIO chip */ | ||
1409 | /* Called from usbserial:serial_probe */ | ||
1410 | static int ftdi_SIO_startup (struct usb_serial *serial) | ||
1411 | { | ||
1412 | struct ftdi_private *priv; | ||
1413 | int err; | ||
1414 | |||
1415 | dbg("%s",__FUNCTION__); | ||
1416 | |||
1417 | err = ftdi_common_startup(serial); | ||
1418 | if (err){ | ||
1419 | return (err); | ||
1420 | } | ||
1421 | |||
1422 | priv = usb_get_serial_port_data(serial->port[0]); | ||
1423 | priv->chip_type = SIO; | ||
1424 | priv->baud_base = 12000000 / 16; | ||
1425 | priv->write_offset = 1; | ||
1426 | |||
1427 | return (0); | ||
1428 | } | ||
1429 | |||
1430 | /* Startup for the 8U232AM chip */ | ||
1431 | /* Called from usbserial:serial_probe */ | ||
1432 | static int ftdi_8U232AM_startup (struct usb_serial *serial) | ||
1433 | { /* ftdi_8U232AM_startup */ | ||
1434 | struct ftdi_private *priv; | ||
1435 | int err; | ||
1436 | |||
1437 | dbg("%s",__FUNCTION__); | ||
1438 | err = ftdi_common_startup(serial); | ||
1439 | if (err){ | ||
1440 | return (err); | ||
1441 | } | ||
1442 | 1115 | ||
1443 | priv = usb_get_serial_port_data(serial->port[0]); | 1116 | ftdi_determine_type (serial->port[0]); |
1444 | priv->chip_type = FT8U232AM; | ||
1445 | priv->baud_base = 48000000 / 2; /* Would be / 16, but FTDI supports 0.125, 0.25 and 0.5 divisor fractions! */ | ||
1446 | |||
1447 | create_sysfs_attrs(serial); | 1117 | create_sysfs_attrs(serial); |
1448 | |||
1449 | return (0); | ||
1450 | } /* ftdi_8U232AM_startup */ | ||
1451 | 1118 | ||
1452 | /* Startup for the FT232BM chip */ | 1119 | /* Check for device requiring special set up. */ |
1453 | /* Called from usbserial:serial_probe */ | 1120 | quirk = (struct ftdi_sio_quirk *)usb_get_serial_data(serial); |
1454 | static int ftdi_FT232BM_startup (struct usb_serial *serial) | 1121 | if (quirk && quirk->setup) { |
1455 | { /* ftdi_FT232BM_startup */ | 1122 | quirk->setup(serial); |
1456 | struct ftdi_private *priv; | ||
1457 | int err; | ||
1458 | |||
1459 | dbg("%s",__FUNCTION__); | ||
1460 | err = ftdi_common_startup(serial); | ||
1461 | if (err){ | ||
1462 | return (err); | ||
1463 | } | 1123 | } |
1464 | |||
1465 | priv = usb_get_serial_port_data(serial->port[0]); | ||
1466 | priv->chip_type = FT232BM; | ||
1467 | priv->baud_base = 48000000 / 2; /* Would be / 16, but FT232BM supports multiple of 0.125 divisor fractions! */ | ||
1468 | 1124 | ||
1469 | create_sysfs_attrs(serial); | ||
1470 | |||
1471 | return (0); | 1125 | return (0); |
1472 | } /* ftdi_FT232BM_startup */ | 1126 | } /* ftdi_sio_attach */ |
1473 | |||
1474 | /* Startup for the FT2232C chip */ | ||
1475 | /* Called from usbserial:serial_probe */ | ||
1476 | static int ftdi_FT2232C_startup (struct usb_serial *serial) | ||
1477 | { /* ftdi_FT2232C_startup */ | ||
1478 | struct ftdi_private *priv; | ||
1479 | int err; | ||
1480 | int inter; | ||
1481 | |||
1482 | dbg("%s",__FUNCTION__); | ||
1483 | err = ftdi_common_startup(serial); | ||
1484 | if (err){ | ||
1485 | return (err); | ||
1486 | } | ||
1487 | 1127 | ||
1488 | priv = usb_get_serial_port_data(serial->port[0]); | ||
1489 | priv->chip_type = FT2232C; | ||
1490 | inter = serial->interface->altsetting->desc.bInterfaceNumber; | ||
1491 | 1128 | ||
1492 | if (inter) { | 1129 | /* Setup for the USB-UIRT device, which requires hardwired |
1493 | priv->interface = PIT_SIOB; | 1130 | * baudrate (38400 gets mapped to 312500) */ |
1494 | } | ||
1495 | else { | ||
1496 | priv->interface = PIT_SIOA; | ||
1497 | } | ||
1498 | priv->baud_base = 48000000 / 2; /* Would be / 16, but FT2232C supports multiple of 0.125 divisor fractions! */ | ||
1499 | |||
1500 | create_sysfs_attrs(serial); | ||
1501 | |||
1502 | return (0); | ||
1503 | } /* ftdi_FT2232C_startup */ | ||
1504 | |||
1505 | /* Startup for the USB-UIRT device, which requires hardwired baudrate (38400 gets mapped to 312500) */ | ||
1506 | /* Called from usbserial:serial_probe */ | 1131 | /* Called from usbserial:serial_probe */ |
1507 | static int ftdi_USB_UIRT_startup (struct usb_serial *serial) | 1132 | static void ftdi_USB_UIRT_setup (struct usb_serial *serial) |
1508 | { /* ftdi_USB_UIRT_startup */ | 1133 | { |
1509 | struct ftdi_private *priv; | 1134 | struct ftdi_private *priv; |
1510 | int err; | ||
1511 | 1135 | ||
1512 | dbg("%s",__FUNCTION__); | 1136 | dbg("%s",__FUNCTION__); |
1513 | err = ftdi_8U232AM_startup(serial); | ||
1514 | if (err){ | ||
1515 | return (err); | ||
1516 | } | ||
1517 | 1137 | ||
1518 | priv = usb_get_serial_port_data(serial->port[0]); | 1138 | priv = usb_get_serial_port_data(serial->port[0]); |
1519 | priv->flags |= ASYNC_SPD_CUST; | 1139 | priv->flags |= ASYNC_SPD_CUST; |
1520 | priv->custom_divisor = 77; | 1140 | priv->custom_divisor = 77; |
1521 | priv->force_baud = B38400; | 1141 | priv->force_baud = B38400; |
1522 | 1142 | } /* ftdi_USB_UIRT_setup */ | |
1523 | return (0); | ||
1524 | } /* ftdi_USB_UIRT_startup */ | ||
1525 | 1143 | ||
1526 | /* Startup for the HE-TIRA1 device, which requires hardwired | 1144 | /* Setup for the HE-TIRA1 device, which requires hardwired |
1527 | * baudrate (38400 gets mapped to 100000) */ | 1145 | * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */ |
1528 | static int ftdi_HE_TIRA1_startup (struct usb_serial *serial) | 1146 | static void ftdi_HE_TIRA1_setup (struct usb_serial *serial) |
1529 | { /* ftdi_HE_TIRA1_startup */ | 1147 | { |
1530 | struct ftdi_private *priv; | 1148 | struct ftdi_private *priv; |
1531 | int err; | ||
1532 | 1149 | ||
1533 | dbg("%s",__FUNCTION__); | 1150 | dbg("%s",__FUNCTION__); |
1534 | err = ftdi_FT232BM_startup(serial); | ||
1535 | if (err){ | ||
1536 | return (err); | ||
1537 | } | ||
1538 | 1151 | ||
1539 | priv = usb_get_serial_port_data(serial->port[0]); | 1152 | priv = usb_get_serial_port_data(serial->port[0]); |
1540 | priv->flags |= ASYNC_SPD_CUST; | 1153 | priv->flags |= ASYNC_SPD_CUST; |
1541 | priv->custom_divisor = 240; | 1154 | priv->custom_divisor = 240; |
1542 | priv->force_baud = B38400; | 1155 | priv->force_baud = B38400; |
1543 | priv->force_rtscts = 1; | 1156 | priv->force_rtscts = 1; |
1544 | 1157 | } /* ftdi_HE_TIRA1_setup */ | |
1545 | return (0); | ||
1546 | } /* ftdi_HE_TIRA1_startup */ | ||
1547 | 1158 | ||
1548 | 1159 | ||
1549 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect | 1160 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect |
@@ -2367,60 +1978,11 @@ static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigne | |||
2367 | { | 1978 | { |
2368 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 1979 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
2369 | 1980 | ||
2370 | int ret, mask; | ||
2371 | |||
2372 | dbg("%s cmd 0x%04x", __FUNCTION__, cmd); | 1981 | dbg("%s cmd 0x%04x", __FUNCTION__, cmd); |
2373 | 1982 | ||
2374 | /* Based on code from acm.c and others */ | 1983 | /* Based on code from acm.c and others */ |
2375 | switch (cmd) { | 1984 | switch (cmd) { |
2376 | 1985 | ||
2377 | case TIOCMBIS: /* turns on (Sets) the lines as specified by the mask */ | ||
2378 | dbg("%s TIOCMBIS", __FUNCTION__); | ||
2379 | if (get_user(mask, (unsigned long __user *) arg)) | ||
2380 | return -EFAULT; | ||
2381 | if (mask & TIOCM_DTR){ | ||
2382 | if ((ret = set_dtr(port, HIGH)) < 0) { | ||
2383 | err("Urb to set DTR failed"); | ||
2384 | return(ret); | ||
2385 | } | ||
2386 | } | ||
2387 | if (mask & TIOCM_RTS) { | ||
2388 | if ((ret = set_rts(port, HIGH)) < 0){ | ||
2389 | err("Urb to set RTS failed"); | ||
2390 | return(ret); | ||
2391 | } | ||
2392 | } | ||
2393 | return(0); | ||
2394 | break; | ||
2395 | |||
2396 | case TIOCMBIC: /* turns off (Clears) the lines as specified by the mask */ | ||
2397 | dbg("%s TIOCMBIC", __FUNCTION__); | ||
2398 | if (get_user(mask, (unsigned long __user *) arg)) | ||
2399 | return -EFAULT; | ||
2400 | if (mask & TIOCM_DTR){ | ||
2401 | if ((ret = set_dtr(port, LOW)) < 0){ | ||
2402 | err("Urb to unset DTR failed"); | ||
2403 | return(ret); | ||
2404 | } | ||
2405 | } | ||
2406 | if (mask & TIOCM_RTS) { | ||
2407 | if ((ret = set_rts(port, LOW)) < 0){ | ||
2408 | err("Urb to unset RTS failed"); | ||
2409 | return(ret); | ||
2410 | } | ||
2411 | } | ||
2412 | return(0); | ||
2413 | break; | ||
2414 | |||
2415 | /* | ||
2416 | * I had originally implemented TCSET{A,S}{,F,W} and | ||
2417 | * TCGET{A,S} here separately, however when testing I | ||
2418 | * found that the higher layers actually do the termios | ||
2419 | * conversions themselves and pass the call onto | ||
2420 | * ftdi_sio_set_termios. | ||
2421 | * | ||
2422 | */ | ||
2423 | |||
2424 | case TIOCGSERIAL: /* gets serial port data */ | 1986 | case TIOCGSERIAL: /* gets serial port data */ |
2425 | return get_serial_info(port, (struct serial_struct __user *) arg); | 1987 | return get_serial_info(port, (struct serial_struct __user *) arg); |
2426 | 1988 | ||
@@ -2516,24 +2078,9 @@ static int __init ftdi_init (void) | |||
2516 | int retval; | 2078 | int retval; |
2517 | 2079 | ||
2518 | dbg("%s", __FUNCTION__); | 2080 | dbg("%s", __FUNCTION__); |
2519 | retval = usb_serial_register(&ftdi_SIO_device); | 2081 | retval = usb_serial_register(&ftdi_sio_device); |
2520 | if (retval) | ||
2521 | goto failed_SIO_register; | ||
2522 | retval = usb_serial_register(&ftdi_8U232AM_device); | ||
2523 | if (retval) | ||
2524 | goto failed_8U232AM_register; | ||
2525 | retval = usb_serial_register(&ftdi_FT232BM_device); | ||
2526 | if (retval) | ||
2527 | goto failed_FT232BM_register; | ||
2528 | retval = usb_serial_register(&ftdi_FT2232C_device); | ||
2529 | if (retval) | ||
2530 | goto failed_FT2232C_register; | ||
2531 | retval = usb_serial_register(&ftdi_USB_UIRT_device); | ||
2532 | if (retval) | ||
2533 | goto failed_USB_UIRT_register; | ||
2534 | retval = usb_serial_register(&ftdi_HE_TIRA1_device); | ||
2535 | if (retval) | 2082 | if (retval) |
2536 | goto failed_HE_TIRA1_register; | 2083 | goto failed_sio_register; |
2537 | retval = usb_register(&ftdi_driver); | 2084 | retval = usb_register(&ftdi_driver); |
2538 | if (retval) | 2085 | if (retval) |
2539 | goto failed_usb_register; | 2086 | goto failed_usb_register; |
@@ -2541,18 +2088,8 @@ static int __init ftdi_init (void) | |||
2541 | info(DRIVER_VERSION ":" DRIVER_DESC); | 2088 | info(DRIVER_VERSION ":" DRIVER_DESC); |
2542 | return 0; | 2089 | return 0; |
2543 | failed_usb_register: | 2090 | failed_usb_register: |
2544 | usb_serial_deregister(&ftdi_HE_TIRA1_device); | 2091 | usb_serial_deregister(&ftdi_sio_device); |
2545 | failed_HE_TIRA1_register: | 2092 | failed_sio_register: |
2546 | usb_serial_deregister(&ftdi_USB_UIRT_device); | ||
2547 | failed_USB_UIRT_register: | ||
2548 | usb_serial_deregister(&ftdi_FT2232C_device); | ||
2549 | failed_FT2232C_register: | ||
2550 | usb_serial_deregister(&ftdi_FT232BM_device); | ||
2551 | failed_FT232BM_register: | ||
2552 | usb_serial_deregister(&ftdi_8U232AM_device); | ||
2553 | failed_8U232AM_register: | ||
2554 | usb_serial_deregister(&ftdi_SIO_device); | ||
2555 | failed_SIO_register: | ||
2556 | return retval; | 2093 | return retval; |
2557 | } | 2094 | } |
2558 | 2095 | ||
@@ -2563,12 +2100,7 @@ static void __exit ftdi_exit (void) | |||
2563 | dbg("%s", __FUNCTION__); | 2100 | dbg("%s", __FUNCTION__); |
2564 | 2101 | ||
2565 | usb_deregister (&ftdi_driver); | 2102 | usb_deregister (&ftdi_driver); |
2566 | usb_serial_deregister (&ftdi_HE_TIRA1_device); | 2103 | usb_serial_deregister (&ftdi_sio_device); |
2567 | usb_serial_deregister (&ftdi_USB_UIRT_device); | ||
2568 | usb_serial_deregister (&ftdi_FT2232C_device); | ||
2569 | usb_serial_deregister (&ftdi_FT232BM_device); | ||
2570 | usb_serial_deregister (&ftdi_8U232AM_device); | ||
2571 | usb_serial_deregister (&ftdi_SIO_device); | ||
2572 | 2104 | ||
2573 | } | 2105 | } |
2574 | 2106 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 9fcc7bd1fbe4..bd0ab3039bdd 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -697,7 +697,7 @@ UNUSUAL_DEV( 0x07af, 0x0004, 0x0100, 0x0133, | |||
697 | UNUSUAL_DEV( 0x07af, 0x0005, 0x0100, 0x0100, | 697 | UNUSUAL_DEV( 0x07af, 0x0005, 0x0100, 0x0100, |
698 | "Microtech", | 698 | "Microtech", |
699 | "USB-SCSI-HD50", | 699 | "USB-SCSI-HD50", |
700 | US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, | 700 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_euscsi_init, |
701 | US_FL_SCM_MULT_TARG ), | 701 | US_FL_SCM_MULT_TARG ), |
702 | 702 | ||
703 | #ifdef CONFIG_USB_STORAGE_DPCM | 703 | #ifdef CONFIG_USB_STORAGE_DPCM |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index cf3847edc50f..ce8518e658b6 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
@@ -33,7 +33,7 @@ extern int eth_header(struct sk_buff *skb, struct net_device *dev, | |||
33 | unsigned short type, void *daddr, | 33 | unsigned short type, void *daddr, |
34 | void *saddr, unsigned len); | 34 | void *saddr, unsigned len); |
35 | extern int eth_rebuild_header(struct sk_buff *skb); | 35 | extern int eth_rebuild_header(struct sk_buff *skb); |
36 | extern unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev); | 36 | extern __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); |
37 | extern void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, | 37 | extern void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, |
38 | unsigned char * haddr); | 38 | unsigned char * haddr); |
39 | extern int eth_header_cache(struct neighbour *neigh, | 39 | extern int eth_header_cache(struct neighbour *neigh, |
diff --git a/include/linux/fddidevice.h b/include/linux/fddidevice.h index 002f6367697d..e61e42dfd317 100644 --- a/include/linux/fddidevice.h +++ b/include/linux/fddidevice.h | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/if_fddi.h> | 25 | #include <linux/if_fddi.h> |
26 | 26 | ||
27 | #ifdef __KERNEL__ | 27 | #ifdef __KERNEL__ |
28 | extern unsigned short fddi_type_trans(struct sk_buff *skb, | 28 | extern __be16 fddi_type_trans(struct sk_buff *skb, |
29 | struct net_device *dev); | 29 | struct net_device *dev); |
30 | extern struct net_device *alloc_fddidev(int sizeof_priv); | 30 | extern struct net_device *alloc_fddidev(int sizeof_priv); |
31 | #endif | 31 | #endif |
diff --git a/include/linux/hdlc.h b/include/linux/hdlc.h index ed2927ef1ff7..df695e9ae327 100644 --- a/include/linux/hdlc.h +++ b/include/linux/hdlc.h | |||
@@ -242,8 +242,8 @@ static __inline__ struct net_device_stats *hdlc_stats(struct net_device *dev) | |||
242 | } | 242 | } |
243 | 243 | ||
244 | 244 | ||
245 | static __inline__ unsigned short hdlc_type_trans(struct sk_buff *skb, | 245 | static __inline__ __be16 hdlc_type_trans(struct sk_buff *skb, |
246 | struct net_device *dev) | 246 | struct net_device *dev) |
247 | { | 247 | { |
248 | hdlc_device *hdlc = dev_to_hdlc(dev); | 248 | hdlc_device *hdlc = dev_to_hdlc(dev); |
249 | 249 | ||
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 27e4d164a108..2f0c085f2c7d 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define NETLINK_AUDIT 9 /* auditing */ | 16 | #define NETLINK_AUDIT 9 /* auditing */ |
17 | #define NETLINK_FIB_LOOKUP 10 | 17 | #define NETLINK_FIB_LOOKUP 10 |
18 | #define NETLINK_ROUTE6 11 /* af_inet6 route comm channel */ | 18 | #define NETLINK_ROUTE6 11 /* af_inet6 route comm channel */ |
19 | #define NETLINK_NETFILTER 12 /* netfilter subsystem */ | ||
19 | #define NETLINK_IP6_FW 13 | 20 | #define NETLINK_IP6_FW 13 |
20 | #define NETLINK_DNRTMSG 14 /* DECnet routing messages */ | 21 | #define NETLINK_DNRTMSG 14 /* DECnet routing messages */ |
21 | #define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ | 22 | #define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ |
diff --git a/include/linux/usb.h b/include/linux/usb.h index eb282b581546..724637792996 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -938,17 +938,17 @@ static inline void usb_fill_int_urb (struct urb *urb, | |||
938 | } | 938 | } |
939 | 939 | ||
940 | extern void usb_init_urb(struct urb *urb); | 940 | extern void usb_init_urb(struct urb *urb); |
941 | extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags); | 941 | extern struct urb *usb_alloc_urb(int iso_packets, unsigned mem_flags); |
942 | extern void usb_free_urb(struct urb *urb); | 942 | extern void usb_free_urb(struct urb *urb); |
943 | #define usb_put_urb usb_free_urb | 943 | #define usb_put_urb usb_free_urb |
944 | extern struct urb *usb_get_urb(struct urb *urb); | 944 | extern struct urb *usb_get_urb(struct urb *urb); |
945 | extern int usb_submit_urb(struct urb *urb, int mem_flags); | 945 | extern int usb_submit_urb(struct urb *urb, unsigned mem_flags); |
946 | extern int usb_unlink_urb(struct urb *urb); | 946 | extern int usb_unlink_urb(struct urb *urb); |
947 | extern void usb_kill_urb(struct urb *urb); | 947 | extern void usb_kill_urb(struct urb *urb); |
948 | 948 | ||
949 | #define HAVE_USB_BUFFERS | 949 | #define HAVE_USB_BUFFERS |
950 | void *usb_buffer_alloc (struct usb_device *dev, size_t size, | 950 | void *usb_buffer_alloc (struct usb_device *dev, size_t size, |
951 | int mem_flags, dma_addr_t *dma); | 951 | unsigned mem_flags, dma_addr_t *dma); |
952 | void usb_buffer_free (struct usb_device *dev, size_t size, | 952 | void usb_buffer_free (struct usb_device *dev, size_t size, |
953 | void *addr, dma_addr_t dma); | 953 | void *addr, dma_addr_t dma); |
954 | 954 | ||
@@ -1055,7 +1055,7 @@ int usb_sg_init ( | |||
1055 | struct scatterlist *sg, | 1055 | struct scatterlist *sg, |
1056 | int nents, | 1056 | int nents, |
1057 | size_t length, | 1057 | size_t length, |
1058 | int mem_flags | 1058 | unsigned mem_flags |
1059 | ); | 1059 | ); |
1060 | void usb_sg_cancel (struct usb_sg_request *io); | 1060 | void usb_sg_cancel (struct usb_sg_request *io); |
1061 | void usb_sg_wait (struct usb_sg_request *io); | 1061 | void usb_sg_wait (struct usb_sg_request *io); |
diff --git a/include/linux/usb_cdc.h b/include/linux/usb_cdc.h index f22d6beecc73..ba617c372455 100644 --- a/include/linux/usb_cdc.h +++ b/include/linux/usb_cdc.h | |||
@@ -34,6 +34,7 @@ | |||
34 | #define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ | 34 | #define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ |
35 | #define USB_CDC_UNION_TYPE 0x06 /* union_desc */ | 35 | #define USB_CDC_UNION_TYPE 0x06 /* union_desc */ |
36 | #define USB_CDC_COUNTRY_TYPE 0x07 | 36 | #define USB_CDC_COUNTRY_TYPE 0x07 |
37 | #define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */ | ||
37 | #define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ | 38 | #define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ |
38 | #define USB_CDC_WHCM_TYPE 0x11 | 39 | #define USB_CDC_WHCM_TYPE 0x11 |
39 | #define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ | 40 | #define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ |
@@ -83,6 +84,18 @@ struct usb_cdc_union_desc { | |||
83 | /* ... and there could be other slave interfaces */ | 84 | /* ... and there could be other slave interfaces */ |
84 | } __attribute__ ((packed)); | 85 | } __attribute__ ((packed)); |
85 | 86 | ||
87 | /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */ | ||
88 | struct usb_cdc_network_terminal_desc { | ||
89 | __u8 bLength; | ||
90 | __u8 bDescriptorType; | ||
91 | __u8 bDescriptorSubType; | ||
92 | |||
93 | __u8 bEntityId; | ||
94 | __u8 iName; | ||
95 | __u8 bChannelIndex; | ||
96 | __u8 bPhysicalInterface; | ||
97 | } __attribute__ ((packed)); | ||
98 | |||
86 | /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ | 99 | /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ |
87 | struct usb_cdc_ether_desc { | 100 | struct usb_cdc_ether_desc { |
88 | __u8 bLength; | 101 | __u8 bLength; |
diff --git a/include/linux/usb_gadget.h b/include/linux/usb_gadget.h index b00f127cb447..71e608607324 100644 --- a/include/linux/usb_gadget.h +++ b/include/linux/usb_gadget.h | |||
@@ -107,18 +107,18 @@ struct usb_ep_ops { | |||
107 | int (*disable) (struct usb_ep *ep); | 107 | int (*disable) (struct usb_ep *ep); |
108 | 108 | ||
109 | struct usb_request *(*alloc_request) (struct usb_ep *ep, | 109 | struct usb_request *(*alloc_request) (struct usb_ep *ep, |
110 | int gfp_flags); | 110 | unsigned gfp_flags); |
111 | void (*free_request) (struct usb_ep *ep, struct usb_request *req); | 111 | void (*free_request) (struct usb_ep *ep, struct usb_request *req); |
112 | 112 | ||
113 | void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes, | 113 | void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes, |
114 | dma_addr_t *dma, int gfp_flags); | 114 | dma_addr_t *dma, unsigned gfp_flags); |
115 | void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma, | 115 | void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma, |
116 | unsigned bytes); | 116 | unsigned bytes); |
117 | // NOTE: on 2.6, drivers may also use dma_map() and | 117 | // NOTE: on 2.6, drivers may also use dma_map() and |
118 | // dma_sync_single_*() to directly manage dma overhead. | 118 | // dma_sync_single_*() to directly manage dma overhead. |
119 | 119 | ||
120 | int (*queue) (struct usb_ep *ep, struct usb_request *req, | 120 | int (*queue) (struct usb_ep *ep, struct usb_request *req, |
121 | int gfp_flags); | 121 | unsigned gfp_flags); |
122 | int (*dequeue) (struct usb_ep *ep, struct usb_request *req); | 122 | int (*dequeue) (struct usb_ep *ep, struct usb_request *req); |
123 | 123 | ||
124 | int (*set_halt) (struct usb_ep *ep, int value); | 124 | int (*set_halt) (struct usb_ep *ep, int value); |
@@ -214,7 +214,7 @@ usb_ep_disable (struct usb_ep *ep) | |||
214 | * Returns the request, or null if one could not be allocated. | 214 | * Returns the request, or null if one could not be allocated. |
215 | */ | 215 | */ |
216 | static inline struct usb_request * | 216 | static inline struct usb_request * |
217 | usb_ep_alloc_request (struct usb_ep *ep, int gfp_flags) | 217 | usb_ep_alloc_request (struct usb_ep *ep, unsigned gfp_flags) |
218 | { | 218 | { |
219 | return ep->ops->alloc_request (ep, gfp_flags); | 219 | return ep->ops->alloc_request (ep, gfp_flags); |
220 | } | 220 | } |
@@ -254,7 +254,7 @@ usb_ep_free_request (struct usb_ep *ep, struct usb_request *req) | |||
254 | */ | 254 | */ |
255 | static inline void * | 255 | static inline void * |
256 | usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma, | 256 | usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma, |
257 | int gfp_flags) | 257 | unsigned gfp_flags) |
258 | { | 258 | { |
259 | return ep->ops->alloc_buffer (ep, len, dma, gfp_flags); | 259 | return ep->ops->alloc_buffer (ep, len, dma, gfp_flags); |
260 | } | 260 | } |
@@ -330,7 +330,7 @@ usb_ep_free_buffer (struct usb_ep *ep, void *buf, dma_addr_t dma, unsigned len) | |||
330 | * reported when the usb peripheral is disconnected. | 330 | * reported when the usb peripheral is disconnected. |
331 | */ | 331 | */ |
332 | static inline int | 332 | static inline int |
333 | usb_ep_queue (struct usb_ep *ep, struct usb_request *req, int gfp_flags) | 333 | usb_ep_queue (struct usb_ep *ep, struct usb_request *req, unsigned gfp_flags) |
334 | { | 334 | { |
335 | return ep->ops->queue (ep, req, gfp_flags); | 335 | return ep->ops->queue (ep, req, gfp_flags); |
336 | } | 336 | } |
diff --git a/include/linux/wanrouter.h b/include/linux/wanrouter.h index 3e89f0f15f49..1b6b76a4eb54 100644 --- a/include/linux/wanrouter.h +++ b/include/linux/wanrouter.h | |||
@@ -516,8 +516,7 @@ struct wan_device { | |||
516 | /* Public functions available for device drivers */ | 516 | /* Public functions available for device drivers */ |
517 | extern int register_wan_device(struct wan_device *wandev); | 517 | extern int register_wan_device(struct wan_device *wandev); |
518 | extern int unregister_wan_device(char *name); | 518 | extern int unregister_wan_device(char *name); |
519 | unsigned short wanrouter_type_trans(struct sk_buff *skb, | 519 | __be16 wanrouter_type_trans(struct sk_buff *skb, struct net_device *dev); |
520 | struct net_device *dev); | ||
521 | int wanrouter_encapsulate(struct sk_buff *skb, struct net_device *dev, | 520 | int wanrouter_encapsulate(struct sk_buff *skb, struct net_device *dev, |
522 | unsigned short type); | 521 | unsigned short type); |
523 | 522 | ||
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index ef2738159ab3..4a26adfaed71 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
@@ -125,7 +125,8 @@ | |||
125 | */ | 125 | */ |
126 | extern struct sock *sctp_get_ctl_sock(void); | 126 | extern struct sock *sctp_get_ctl_sock(void); |
127 | extern int sctp_copy_local_addr_list(struct sctp_bind_addr *, | 127 | extern int sctp_copy_local_addr_list(struct sctp_bind_addr *, |
128 | sctp_scope_t, int gfp, int flags); | 128 | sctp_scope_t, unsigned int __nocast gfp, |
129 | int flags); | ||
129 | extern struct sctp_pf *sctp_get_pf_specific(sa_family_t family); | 130 | extern struct sctp_pf *sctp_get_pf_specific(sa_family_t family); |
130 | extern int sctp_register_pf(struct sctp_pf *, sa_family_t); | 131 | extern int sctp_register_pf(struct sctp_pf *, sa_family_t); |
131 | 132 | ||
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 88d9fe5975d5..58462164d960 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
@@ -181,17 +181,17 @@ const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t, | |||
181 | int sctp_chunk_iif(const struct sctp_chunk *); | 181 | int sctp_chunk_iif(const struct sctp_chunk *); |
182 | struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *, | 182 | struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *, |
183 | struct sctp_chunk *, | 183 | struct sctp_chunk *, |
184 | int gfp); | 184 | unsigned int __nocast gfp); |
185 | __u32 sctp_generate_verification_tag(void); | 185 | __u32 sctp_generate_verification_tag(void); |
186 | void sctp_populate_tie_tags(__u8 *cookie, __u32 curTag, __u32 hisTag); | 186 | void sctp_populate_tie_tags(__u8 *cookie, __u32 curTag, __u32 hisTag); |
187 | 187 | ||
188 | /* Prototypes for chunk-building functions. */ | 188 | /* Prototypes for chunk-building functions. */ |
189 | struct sctp_chunk *sctp_make_init(const struct sctp_association *, | 189 | struct sctp_chunk *sctp_make_init(const struct sctp_association *, |
190 | const struct sctp_bind_addr *, | 190 | const struct sctp_bind_addr *, |
191 | int gfp, int vparam_len); | 191 | unsigned int __nocast gfp, int vparam_len); |
192 | struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *, | 192 | struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *, |
193 | const struct sctp_chunk *, | 193 | const struct sctp_chunk *, |
194 | const int gfp, | 194 | const unsigned int __nocast gfp, |
195 | const int unkparam_len); | 195 | const int unkparam_len); |
196 | struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *, | 196 | struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *, |
197 | const struct sctp_chunk *); | 197 | const struct sctp_chunk *); |
@@ -265,7 +265,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, | |||
265 | struct sctp_endpoint *, | 265 | struct sctp_endpoint *, |
266 | struct sctp_association *asoc, | 266 | struct sctp_association *asoc, |
267 | void *event_arg, | 267 | void *event_arg, |
268 | int gfp); | 268 | unsigned int __nocast gfp); |
269 | 269 | ||
270 | /* 2nd level prototypes */ | 270 | /* 2nd level prototypes */ |
271 | void sctp_generate_t3_rtx_event(unsigned long peer); | 271 | void sctp_generate_t3_rtx_event(unsigned long peer); |
@@ -275,7 +275,8 @@ void sctp_ootb_pkt_free(struct sctp_packet *); | |||
275 | 275 | ||
276 | struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *, | 276 | struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *, |
277 | const struct sctp_association *, | 277 | const struct sctp_association *, |
278 | struct sctp_chunk *, int gfp, int *err, | 278 | struct sctp_chunk *, |
279 | unsigned int __nocast gfp, int *err, | ||
279 | struct sctp_chunk **err_chk_p); | 280 | struct sctp_chunk **err_chk_p); |
280 | int sctp_addip_addr_config(struct sctp_association *, sctp_param_t, | 281 | int sctp_addip_addr_config(struct sctp_association *, sctp_param_t, |
281 | struct sockaddr_storage*, int); | 282 | struct sockaddr_storage*, int); |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 7435528a1747..994009bbe3b4 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
@@ -445,7 +445,8 @@ struct sctp_ssnmap { | |||
445 | int malloced; | 445 | int malloced; |
446 | }; | 446 | }; |
447 | 447 | ||
448 | struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp); | 448 | struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, |
449 | unsigned int __nocast gfp); | ||
449 | void sctp_ssnmap_free(struct sctp_ssnmap *map); | 450 | void sctp_ssnmap_free(struct sctp_ssnmap *map); |
450 | void sctp_ssnmap_clear(struct sctp_ssnmap *map); | 451 | void sctp_ssnmap_clear(struct sctp_ssnmap *map); |
451 | 452 | ||
@@ -945,7 +946,8 @@ struct sctp_transport { | |||
945 | } cacc; | 946 | } cacc; |
946 | }; | 947 | }; |
947 | 948 | ||
948 | struct sctp_transport *sctp_transport_new(const union sctp_addr *, int); | 949 | struct sctp_transport *sctp_transport_new(const union sctp_addr *, |
950 | unsigned int __nocast); | ||
949 | void sctp_transport_set_owner(struct sctp_transport *, | 951 | void sctp_transport_set_owner(struct sctp_transport *, |
950 | struct sctp_association *); | 952 | struct sctp_association *); |
951 | void sctp_transport_route(struct sctp_transport *, union sctp_addr *, | 953 | void sctp_transport_route(struct sctp_transport *, union sctp_addr *, |
@@ -1093,9 +1095,10 @@ void sctp_bind_addr_init(struct sctp_bind_addr *, __u16 port); | |||
1093 | void sctp_bind_addr_free(struct sctp_bind_addr *); | 1095 | void sctp_bind_addr_free(struct sctp_bind_addr *); |
1094 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, | 1096 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, |
1095 | const struct sctp_bind_addr *src, | 1097 | const struct sctp_bind_addr *src, |
1096 | sctp_scope_t scope, int gfp,int flags); | 1098 | sctp_scope_t scope, unsigned int __nocast gfp, |
1099 | int flags); | ||
1097 | int sctp_add_bind_addr(struct sctp_bind_addr *, union sctp_addr *, | 1100 | int sctp_add_bind_addr(struct sctp_bind_addr *, union sctp_addr *, |
1098 | int gfp); | 1101 | unsigned int __nocast gfp); |
1099 | int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *); | 1102 | int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *); |
1100 | int sctp_bind_addr_match(struct sctp_bind_addr *, const union sctp_addr *, | 1103 | int sctp_bind_addr_match(struct sctp_bind_addr *, const union sctp_addr *, |
1101 | struct sctp_sock *); | 1104 | struct sctp_sock *); |
@@ -1104,9 +1107,10 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, | |||
1104 | int addrcnt, | 1107 | int addrcnt, |
1105 | struct sctp_sock *opt); | 1108 | struct sctp_sock *opt); |
1106 | union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, | 1109 | union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, |
1107 | int *addrs_len, int gfp); | 1110 | int *addrs_len, |
1111 | unsigned int __nocast gfp); | ||
1108 | int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len, | 1112 | int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len, |
1109 | __u16 port, int gfp); | 1113 | __u16 port, unsigned int __nocast gfp); |
1110 | 1114 | ||
1111 | sctp_scope_t sctp_scope(const union sctp_addr *); | 1115 | sctp_scope_t sctp_scope(const union sctp_addr *); |
1112 | int sctp_in_scope(const union sctp_addr *addr, const sctp_scope_t scope); | 1116 | int sctp_in_scope(const union sctp_addr *addr, const sctp_scope_t scope); |
@@ -1235,7 +1239,7 @@ static inline struct sctp_endpoint *sctp_ep(struct sctp_ep_common *base) | |||
1235 | } | 1239 | } |
1236 | 1240 | ||
1237 | /* These are function signatures for manipulating endpoints. */ | 1241 | /* These are function signatures for manipulating endpoints. */ |
1238 | struct sctp_endpoint *sctp_endpoint_new(struct sock *, int); | 1242 | struct sctp_endpoint *sctp_endpoint_new(struct sock *, unsigned int __nocast); |
1239 | void sctp_endpoint_free(struct sctp_endpoint *); | 1243 | void sctp_endpoint_free(struct sctp_endpoint *); |
1240 | void sctp_endpoint_put(struct sctp_endpoint *); | 1244 | void sctp_endpoint_put(struct sctp_endpoint *); |
1241 | void sctp_endpoint_hold(struct sctp_endpoint *); | 1245 | void sctp_endpoint_hold(struct sctp_endpoint *); |
@@ -1256,7 +1260,7 @@ int sctp_verify_init(const struct sctp_association *asoc, sctp_cid_t, | |||
1256 | struct sctp_chunk **err_chunk); | 1260 | struct sctp_chunk **err_chunk); |
1257 | int sctp_process_init(struct sctp_association *, sctp_cid_t cid, | 1261 | int sctp_process_init(struct sctp_association *, sctp_cid_t cid, |
1258 | const union sctp_addr *peer, | 1262 | const union sctp_addr *peer, |
1259 | sctp_init_chunk_t *init, int gfp); | 1263 | sctp_init_chunk_t *init, unsigned int __nocast gfp); |
1260 | __u32 sctp_generate_tag(const struct sctp_endpoint *); | 1264 | __u32 sctp_generate_tag(const struct sctp_endpoint *); |
1261 | __u32 sctp_generate_tsn(const struct sctp_endpoint *); | 1265 | __u32 sctp_generate_tsn(const struct sctp_endpoint *); |
1262 | 1266 | ||
@@ -1719,7 +1723,7 @@ static inline struct sctp_association *sctp_assoc(struct sctp_ep_common *base) | |||
1719 | 1723 | ||
1720 | struct sctp_association * | 1724 | struct sctp_association * |
1721 | sctp_association_new(const struct sctp_endpoint *, const struct sock *, | 1725 | sctp_association_new(const struct sctp_endpoint *, const struct sock *, |
1722 | sctp_scope_t scope, int gfp); | 1726 | sctp_scope_t scope, unsigned int __nocast gfp); |
1723 | void sctp_association_free(struct sctp_association *); | 1727 | void sctp_association_free(struct sctp_association *); |
1724 | void sctp_association_put(struct sctp_association *); | 1728 | void sctp_association_put(struct sctp_association *); |
1725 | void sctp_association_hold(struct sctp_association *); | 1729 | void sctp_association_hold(struct sctp_association *); |
@@ -1735,7 +1739,7 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc, | |||
1735 | const union sctp_addr *laddr); | 1739 | const union sctp_addr *laddr); |
1736 | struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *, | 1740 | struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *, |
1737 | const union sctp_addr *address, | 1741 | const union sctp_addr *address, |
1738 | const int gfp, | 1742 | const unsigned int __nocast gfp, |
1739 | const int peer_state); | 1743 | const int peer_state); |
1740 | void sctp_assoc_del_peer(struct sctp_association *asoc, | 1744 | void sctp_assoc_del_peer(struct sctp_association *asoc, |
1741 | const union sctp_addr *addr); | 1745 | const union sctp_addr *addr); |
@@ -1759,9 +1763,11 @@ void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned); | |||
1759 | void sctp_assoc_rwnd_decrease(struct sctp_association *, unsigned); | 1763 | void sctp_assoc_rwnd_decrease(struct sctp_association *, unsigned); |
1760 | void sctp_assoc_set_primary(struct sctp_association *, | 1764 | void sctp_assoc_set_primary(struct sctp_association *, |
1761 | struct sctp_transport *); | 1765 | struct sctp_transport *); |
1762 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *, int); | 1766 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *, |
1767 | unsigned int __nocast); | ||
1763 | int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *, | 1768 | int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *, |
1764 | struct sctp_cookie*, int gfp); | 1769 | struct sctp_cookie*, |
1770 | unsigned int __nocast gfp); | ||
1765 | 1771 | ||
1766 | int sctp_cmp_addr_exact(const union sctp_addr *ss1, | 1772 | int sctp_cmp_addr_exact(const union sctp_addr *ss1, |
1767 | const union sctp_addr *ss2); | 1773 | const union sctp_addr *ss2); |
diff --git a/include/net/sctp/ulpevent.h b/include/net/sctp/ulpevent.h index 1019d83a580a..90fe4bf6754f 100644 --- a/include/net/sctp/ulpevent.h +++ b/include/net/sctp/ulpevent.h | |||
@@ -88,7 +88,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( | |||
88 | __u16 error, | 88 | __u16 error, |
89 | __u16 outbound, | 89 | __u16 outbound, |
90 | __u16 inbound, | 90 | __u16 inbound, |
91 | int gfp); | 91 | unsigned int __nocast gfp); |
92 | 92 | ||
93 | struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( | 93 | struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( |
94 | const struct sctp_association *asoc, | 94 | const struct sctp_association *asoc, |
@@ -96,35 +96,35 @@ struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( | |||
96 | int flags, | 96 | int flags, |
97 | int state, | 97 | int state, |
98 | int error, | 98 | int error, |
99 | int gfp); | 99 | unsigned int __nocast gfp); |
100 | 100 | ||
101 | struct sctp_ulpevent *sctp_ulpevent_make_remote_error( | 101 | struct sctp_ulpevent *sctp_ulpevent_make_remote_error( |
102 | const struct sctp_association *asoc, | 102 | const struct sctp_association *asoc, |
103 | struct sctp_chunk *chunk, | 103 | struct sctp_chunk *chunk, |
104 | __u16 flags, | 104 | __u16 flags, |
105 | int gfp); | 105 | unsigned int __nocast gfp); |
106 | struct sctp_ulpevent *sctp_ulpevent_make_send_failed( | 106 | struct sctp_ulpevent *sctp_ulpevent_make_send_failed( |
107 | const struct sctp_association *asoc, | 107 | const struct sctp_association *asoc, |
108 | struct sctp_chunk *chunk, | 108 | struct sctp_chunk *chunk, |
109 | __u16 flags, | 109 | __u16 flags, |
110 | __u32 error, | 110 | __u32 error, |
111 | int gfp); | 111 | unsigned int __nocast gfp); |
112 | 112 | ||
113 | struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( | 113 | struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( |
114 | const struct sctp_association *asoc, | 114 | const struct sctp_association *asoc, |
115 | __u16 flags, | 115 | __u16 flags, |
116 | int gfp); | 116 | unsigned int __nocast gfp); |
117 | 117 | ||
118 | struct sctp_ulpevent *sctp_ulpevent_make_pdapi( | 118 | struct sctp_ulpevent *sctp_ulpevent_make_pdapi( |
119 | const struct sctp_association *asoc, | 119 | const struct sctp_association *asoc, |
120 | __u32 indication, int gfp); | 120 | __u32 indication, unsigned int __nocast gfp); |
121 | 121 | ||
122 | struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication( | 122 | struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication( |
123 | const struct sctp_association *asoc, int gfp); | 123 | const struct sctp_association *asoc, unsigned int __nocast gfp); |
124 | 124 | ||
125 | struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, | 125 | struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, |
126 | struct sctp_chunk *chunk, | 126 | struct sctp_chunk *chunk, |
127 | int gfp); | 127 | unsigned int __nocast gfp); |
128 | 128 | ||
129 | void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, | 129 | void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, |
130 | struct msghdr *); | 130 | struct msghdr *); |
diff --git a/include/net/sctp/ulpqueue.h b/include/net/sctp/ulpqueue.h index 961736d29d21..1a60c6d943c1 100644 --- a/include/net/sctp/ulpqueue.h +++ b/include/net/sctp/ulpqueue.h | |||
@@ -62,19 +62,22 @@ struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *, | |||
62 | void sctp_ulpq_free(struct sctp_ulpq *); | 62 | void sctp_ulpq_free(struct sctp_ulpq *); |
63 | 63 | ||
64 | /* Add a new DATA chunk for processing. */ | 64 | /* Add a new DATA chunk for processing. */ |
65 | int sctp_ulpq_tail_data(struct sctp_ulpq *, struct sctp_chunk *, int); | 65 | int sctp_ulpq_tail_data(struct sctp_ulpq *, struct sctp_chunk *, |
66 | unsigned int __nocast); | ||
66 | 67 | ||
67 | /* Add a new event for propagation to the ULP. */ | 68 | /* Add a new event for propagation to the ULP. */ |
68 | int sctp_ulpq_tail_event(struct sctp_ulpq *, struct sctp_ulpevent *ev); | 69 | int sctp_ulpq_tail_event(struct sctp_ulpq *, struct sctp_ulpevent *ev); |
69 | 70 | ||
70 | /* Renege previously received chunks. */ | 71 | /* Renege previously received chunks. */ |
71 | void sctp_ulpq_renege(struct sctp_ulpq *, struct sctp_chunk *, int); | 72 | void sctp_ulpq_renege(struct sctp_ulpq *, struct sctp_chunk *, |
73 | unsigned int __nocast); | ||
72 | 74 | ||
73 | /* Perform partial delivery. */ | 75 | /* Perform partial delivery. */ |
74 | void sctp_ulpq_partial_delivery(struct sctp_ulpq *, struct sctp_chunk *, int); | 76 | void sctp_ulpq_partial_delivery(struct sctp_ulpq *, struct sctp_chunk *, |
77 | unsigned int __nocast); | ||
75 | 78 | ||
76 | /* Abort the partial delivery. */ | 79 | /* Abort the partial delivery. */ |
77 | void sctp_ulpq_abort_pd(struct sctp_ulpq *, int); | 80 | void sctp_ulpq_abort_pd(struct sctp_ulpq *, unsigned int __nocast); |
78 | 81 | ||
79 | /* Clear the partial data delivery condition on this socket. */ | 82 | /* Clear the partial data delivery condition on this socket. */ |
80 | int sctp_clear_pd(struct sock *sk); | 83 | int sctp_clear_pd(struct sock *sk); |
diff --git a/include/net/x25device.h b/include/net/x25device.h index cf36a20ea3c5..d45ae883bd1d 100644 --- a/include/net/x25device.h +++ b/include/net/x25device.h | |||
@@ -5,8 +5,7 @@ | |||
5 | #include <linux/if_packet.h> | 5 | #include <linux/if_packet.h> |
6 | #include <linux/skbuff.h> | 6 | #include <linux/skbuff.h> |
7 | 7 | ||
8 | static inline unsigned short x25_type_trans(struct sk_buff *skb, | 8 | static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev) |
9 | struct net_device *dev) | ||
10 | { | 9 | { |
11 | skb->mac.raw = skb->data; | 10 | skb->mac.raw = skb->data; |
12 | skb->input_dev = skb->dev = dev; | 11 | skb->input_dev = skb->dev = dev; |
diff --git a/net/802/fddi.c b/net/802/fddi.c index ebcf4830d6f1..5ce24c4bb840 100644 --- a/net/802/fddi.c +++ b/net/802/fddi.c | |||
@@ -122,10 +122,10 @@ static int fddi_rebuild_header(struct sk_buff *skb) | |||
122 | * the proper pointer to the start of packet data (skb->data). | 122 | * the proper pointer to the start of packet data (skb->data). |
123 | */ | 123 | */ |
124 | 124 | ||
125 | unsigned short fddi_type_trans(struct sk_buff *skb, struct net_device *dev) | 125 | __be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev) |
126 | { | 126 | { |
127 | struct fddihdr *fddi = (struct fddihdr *)skb->data; | 127 | struct fddihdr *fddi = (struct fddihdr *)skb->data; |
128 | unsigned short type; | 128 | __be16 type; |
129 | 129 | ||
130 | /* | 130 | /* |
131 | * Set mac.raw field to point to FC byte, set data field to point | 131 | * Set mac.raw field to point to FC byte, set data field to point |
diff --git a/net/8021q/Kconfig b/net/8021q/Kconfig new file mode 100644 index 000000000000..c4a382e450e2 --- /dev/null +++ b/net/8021q/Kconfig | |||
@@ -0,0 +1,19 @@ | |||
1 | # | ||
2 | # Configuration for 802.1Q VLAN support | ||
3 | # | ||
4 | |||
5 | config VLAN_8021Q | ||
6 | tristate "802.1Q VLAN Support" | ||
7 | ---help--- | ||
8 | Select this and you will be able to create 802.1Q VLAN interfaces | ||
9 | on your ethernet interfaces. 802.1Q VLAN supports almost | ||
10 | everything a regular ethernet interface does, including | ||
11 | firewalling, bridging, and of course IP traffic. You will need | ||
12 | the 'vconfig' tool from the VLAN project in order to effectively | ||
13 | use VLANs. See the VLAN web page for more information: | ||
14 | <http://www.candelatech.com/~greear/vlan.html> | ||
15 | |||
16 | To compile this code as a module, choose M here: the module | ||
17 | will be called 8021q. | ||
18 | |||
19 | If unsure, say N. | ||
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 1f6d31670bc7..91e412b0ab00 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -578,6 +578,14 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
578 | if (!vlandev) | 578 | if (!vlandev) |
579 | continue; | 579 | continue; |
580 | 580 | ||
581 | if (netif_carrier_ok(dev)) { | ||
582 | if (!netif_carrier_ok(vlandev)) | ||
583 | netif_carrier_on(vlandev); | ||
584 | } else { | ||
585 | if (netif_carrier_ok(vlandev)) | ||
586 | netif_carrier_off(vlandev); | ||
587 | } | ||
588 | |||
581 | if ((vlandev->state & VLAN_LINK_STATE_MASK) != flgs) { | 589 | if ((vlandev->state & VLAN_LINK_STATE_MASK) != flgs) { |
582 | vlandev->state = (vlandev->state &~ VLAN_LINK_STATE_MASK) | 590 | vlandev->state = (vlandev->state &~ VLAN_LINK_STATE_MASK) |
583 | | flgs; | 591 | | flgs; |
diff --git a/net/Kconfig b/net/Kconfig index 9251b28e8d5d..2684e809a649 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
@@ -2,7 +2,7 @@ | |||
2 | # Network configuration | 2 | # Network configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | menu "Networking support" | 5 | menu "Networking" |
6 | 6 | ||
7 | config NET | 7 | config NET |
8 | bool "Networking support" | 8 | bool "Networking support" |
@@ -10,7 +10,9 @@ config NET | |||
10 | Unless you really know what you are doing, you should say Y here. | 10 | Unless you really know what you are doing, you should say Y here. |
11 | The reason is that some programs need kernel networking support even | 11 | The reason is that some programs need kernel networking support even |
12 | when running on a stand-alone machine that isn't connected to any | 12 | when running on a stand-alone machine that isn't connected to any |
13 | other computer. If you are upgrading from an older kernel, you | 13 | other computer. |
14 | |||
15 | If you are upgrading from an older kernel, you | ||
14 | should consider updating your networking tools too because changes | 16 | should consider updating your networking tools too because changes |
15 | in the kernel and the tools often go hand in hand. The tools are | 17 | in the kernel and the tools often go hand in hand. The tools are |
16 | contained in the package net-tools, the location and version number | 18 | contained in the package net-tools, the location and version number |
@@ -20,57 +22,14 @@ config NET | |||
20 | recommended to read the NET-HOWTO, available from | 22 | recommended to read the NET-HOWTO, available from |
21 | <http://www.tldp.org/docs.html#howto>. | 23 | <http://www.tldp.org/docs.html#howto>. |
22 | 24 | ||
23 | menu "Networking options" | 25 | # Make sure that all config symbols are dependent on NET |
24 | depends on NET | 26 | if NET |
25 | |||
26 | config PACKET | ||
27 | tristate "Packet socket" | ||
28 | ---help--- | ||
29 | The Packet protocol is used by applications which communicate | ||
30 | directly with network devices without an intermediate network | ||
31 | protocol implemented in the kernel, e.g. tcpdump. If you want them | ||
32 | to work, choose Y. | ||
33 | 27 | ||
34 | To compile this driver as a module, choose M here: the module will | 28 | menu "Networking options" |
35 | be called af_packet. | ||
36 | |||
37 | If unsure, say Y. | ||
38 | |||
39 | config PACKET_MMAP | ||
40 | bool "Packet socket: mmapped IO" | ||
41 | depends on PACKET | ||
42 | help | ||
43 | If you say Y here, the Packet protocol driver will use an IO | ||
44 | mechanism that results in faster communication. | ||
45 | |||
46 | If unsure, say N. | ||
47 | |||
48 | config UNIX | ||
49 | tristate "Unix domain sockets" | ||
50 | ---help--- | ||
51 | If you say Y here, you will include support for Unix domain sockets; | ||
52 | sockets are the standard Unix mechanism for establishing and | ||
53 | accessing network connections. Many commonly used programs such as | ||
54 | the X Window system and syslog use these sockets even if your | ||
55 | machine is not connected to any network. Unless you are working on | ||
56 | an embedded system or something similar, you therefore definitely | ||
57 | want to say Y here. | ||
58 | |||
59 | To compile this driver as a module, choose M here: the module will be | ||
60 | called unix. Note that several important services won't work | ||
61 | correctly if you say M here and then neglect to load the module. | ||
62 | |||
63 | Say Y unless you know what you are doing. | ||
64 | |||
65 | config NET_KEY | ||
66 | tristate "PF_KEY sockets" | ||
67 | select XFRM | ||
68 | ---help--- | ||
69 | PF_KEYv2 socket family, compatible to KAME ones. | ||
70 | They are required if you are going to use IPsec tools ported | ||
71 | from KAME. | ||
72 | 29 | ||
73 | Say Y unless you know what you are doing. | 30 | source "net/packet/Kconfig" |
31 | source "net/unix/Kconfig" | ||
32 | source "net/xfrm/Kconfig" | ||
74 | 33 | ||
75 | config INET | 34 | config INET |
76 | bool "TCP/IP networking" | 35 | bool "TCP/IP networking" |
@@ -94,30 +53,12 @@ config INET | |||
94 | 53 | ||
95 | Short answer: say Y. | 54 | Short answer: say Y. |
96 | 55 | ||
56 | if INET | ||
97 | source "net/ipv4/Kconfig" | 57 | source "net/ipv4/Kconfig" |
98 | |||
99 | # IPv6 as module will cause a CRASH if you try to unload it | ||
100 | config IPV6 | ||
101 | tristate "The IPv6 protocol" | ||
102 | depends on INET | ||
103 | default m | ||
104 | select CRYPTO if IPV6_PRIVACY | ||
105 | select CRYPTO_MD5 if IPV6_PRIVACY | ||
106 | ---help--- | ||
107 | This is complemental support for the IP version 6. | ||
108 | You will still be able to do traditional IPv4 networking as well. | ||
109 | |||
110 | For general information about IPv6, see | ||
111 | <http://playground.sun.com/pub/ipng/html/ipng-main.html>. | ||
112 | For Linux IPv6 development information, see <http://www.linux-ipv6.org>. | ||
113 | For specific information about IPv6 under Linux, read the HOWTO at | ||
114 | <http://www.bieringer.de/linux/IPv6/>. | ||
115 | |||
116 | To compile this protocol support as a module, choose M here: the | ||
117 | module will be called ipv6. | ||
118 | |||
119 | source "net/ipv6/Kconfig" | 58 | source "net/ipv6/Kconfig" |
120 | 59 | ||
60 | endif # if INET | ||
61 | |||
121 | menuconfig NETFILTER | 62 | menuconfig NETFILTER |
122 | bool "Network packet filtering (replaces ipchains)" | 63 | bool "Network packet filtering (replaces ipchains)" |
123 | ---help--- | 64 | ---help--- |
@@ -206,269 +147,16 @@ source "net/bridge/netfilter/Kconfig" | |||
206 | 147 | ||
207 | endif | 148 | endif |
208 | 149 | ||
209 | config XFRM | ||
210 | bool | ||
211 | depends on NET | ||
212 | |||
213 | source "net/xfrm/Kconfig" | ||
214 | |||
215 | source "net/sctp/Kconfig" | 150 | source "net/sctp/Kconfig" |
216 | 151 | source "net/atm/Kconfig" | |
217 | config ATM | 152 | source "net/bridge/Kconfig" |
218 | tristate "Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)" | 153 | source "net/8021q/Kconfig" |
219 | depends on EXPERIMENTAL | ||
220 | ---help--- | ||
221 | ATM is a high-speed networking technology for Local Area Networks | ||
222 | and Wide Area Networks. It uses a fixed packet size and is | ||
223 | connection oriented, allowing for the negotiation of minimum | ||
224 | bandwidth requirements. | ||
225 | |||
226 | In order to participate in an ATM network, your Linux box needs an | ||
227 | ATM networking card. If you have that, say Y here and to the driver | ||
228 | of your ATM card below. | ||
229 | |||
230 | Note that you need a set of user-space programs to actually make use | ||
231 | of ATM. See the file <file:Documentation/networking/atm.txt> for | ||
232 | further details. | ||
233 | |||
234 | config ATM_CLIP | ||
235 | tristate "Classical IP over ATM (EXPERIMENTAL)" | ||
236 | depends on ATM && INET | ||
237 | help | ||
238 | Classical IP over ATM for PVCs and SVCs, supporting InARP and | ||
239 | ATMARP. If you want to communication with other IP hosts on your ATM | ||
240 | network, you will typically either say Y here or to "LAN Emulation | ||
241 | (LANE)" below. | ||
242 | |||
243 | config ATM_CLIP_NO_ICMP | ||
244 | bool "Do NOT send ICMP if no neighbour (EXPERIMENTAL)" | ||
245 | depends on ATM_CLIP | ||
246 | help | ||
247 | Normally, an "ICMP host unreachable" message is sent if a neighbour | ||
248 | cannot be reached because there is no VC to it in the kernel's | ||
249 | ATMARP table. This may cause problems when ATMARP table entries are | ||
250 | briefly removed during revalidation. If you say Y here, packets to | ||
251 | such neighbours are silently discarded instead. | ||
252 | |||
253 | config ATM_LANE | ||
254 | tristate "LAN Emulation (LANE) support (EXPERIMENTAL)" | ||
255 | depends on ATM | ||
256 | help | ||
257 | LAN Emulation emulates services of existing LANs across an ATM | ||
258 | network. Besides operating as a normal ATM end station client, Linux | ||
259 | LANE client can also act as an proxy client bridging packets between | ||
260 | ELAN and Ethernet segments. You need LANE if you want to try MPOA. | ||
261 | |||
262 | config ATM_MPOA | ||
263 | tristate "Multi-Protocol Over ATM (MPOA) support (EXPERIMENTAL)" | ||
264 | depends on ATM && INET && ATM_LANE!=n | ||
265 | help | ||
266 | Multi-Protocol Over ATM allows ATM edge devices such as routers, | ||
267 | bridges and ATM attached hosts establish direct ATM VCs across | ||
268 | subnetwork boundaries. These shortcut connections bypass routers | ||
269 | enhancing overall network performance. | ||
270 | |||
271 | config ATM_BR2684 | ||
272 | tristate "RFC1483/2684 Bridged protocols" | ||
273 | depends on ATM && INET | ||
274 | help | ||
275 | ATM PVCs can carry ethernet PDUs according to rfc2684 (formerly 1483) | ||
276 | This device will act like an ethernet from the kernels point of view, | ||
277 | with the traffic being carried by ATM PVCs (currently 1 PVC/device). | ||
278 | This is sometimes used over DSL lines. If in doubt, say N. | ||
279 | |||
280 | config ATM_BR2684_IPFILTER | ||
281 | bool "Per-VC IP filter kludge" | ||
282 | depends on ATM_BR2684 | ||
283 | help | ||
284 | This is an experimental mechanism for users who need to terminating a | ||
285 | large number of IP-only vcc's. Do not enable this unless you are sure | ||
286 | you know what you are doing. | ||
287 | |||
288 | config BRIDGE | ||
289 | tristate "802.1d Ethernet Bridging" | ||
290 | ---help--- | ||
291 | If you say Y here, then your Linux box will be able to act as an | ||
292 | Ethernet bridge, which means that the different Ethernet segments it | ||
293 | is connected to will appear as one Ethernet to the participants. | ||
294 | Several such bridges can work together to create even larger | ||
295 | networks of Ethernets using the IEEE 802.1 spanning tree algorithm. | ||
296 | As this is a standard, Linux bridges will cooperate properly with | ||
297 | other third party bridge products. | ||
298 | |||
299 | In order to use the Ethernet bridge, you'll need the bridge | ||
300 | configuration tools; see <file:Documentation/networking/bridge.txt> | ||
301 | for location. Please read the Bridge mini-HOWTO for more | ||
302 | information. | ||
303 | |||
304 | If you enable iptables support along with the bridge support then you | ||
305 | turn your bridge into a bridging IP firewall. | ||
306 | iptables will then see the IP packets being bridged, so you need to | ||
307 | take this into account when setting up your firewall rules. | ||
308 | Enabling arptables support when bridging will let arptables see | ||
309 | bridged ARP traffic in the arptables FORWARD chain. | ||
310 | |||
311 | To compile this code as a module, choose M here: the module | ||
312 | will be called bridge. | ||
313 | |||
314 | If unsure, say N. | ||
315 | |||
316 | config VLAN_8021Q | ||
317 | tristate "802.1Q VLAN Support" | ||
318 | ---help--- | ||
319 | Select this and you will be able to create 802.1Q VLAN interfaces | ||
320 | on your ethernet interfaces. 802.1Q VLAN supports almost | ||
321 | everything a regular ethernet interface does, including | ||
322 | firewalling, bridging, and of course IP traffic. You will need | ||
323 | the 'vconfig' tool from the VLAN project in order to effectively | ||
324 | use VLANs. See the VLAN web page for more information: | ||
325 | <http://www.candelatech.com/~greear/vlan.html> | ||
326 | |||
327 | To compile this code as a module, choose M here: the module | ||
328 | will be called 8021q. | ||
329 | |||
330 | If unsure, say N. | ||
331 | |||
332 | config DECNET | ||
333 | tristate "DECnet Support" | ||
334 | ---help--- | ||
335 | The DECnet networking protocol was used in many products made by | ||
336 | Digital (now Compaq). It provides reliable stream and sequenced | ||
337 | packet communications over which run a variety of services similar | ||
338 | to those which run over TCP/IP. | ||
339 | |||
340 | To find some tools to use with the kernel layer support, please | ||
341 | look at Patrick Caulfield's web site: | ||
342 | <http://linux-decnet.sourceforge.net/>. | ||
343 | |||
344 | More detailed documentation is available in | ||
345 | <file:Documentation/networking/decnet.txt>. | ||
346 | |||
347 | Be sure to say Y to "/proc file system support" and "Sysctl support" | ||
348 | below when using DECnet, since you will need sysctl support to aid | ||
349 | in configuration at run time. | ||
350 | |||
351 | The DECnet code is also available as a module ( = code which can be | ||
352 | inserted in and removed from the running kernel whenever you want). | ||
353 | The module is called decnet. | ||
354 | |||
355 | source "net/decnet/Kconfig" | 154 | source "net/decnet/Kconfig" |
356 | |||
357 | source "net/llc/Kconfig" | 155 | source "net/llc/Kconfig" |
358 | |||
359 | config IPX | ||
360 | tristate "The IPX protocol" | ||
361 | select LLC | ||
362 | ---help--- | ||
363 | This is support for the Novell networking protocol, IPX, commonly | ||
364 | used for local networks of Windows machines. You need it if you | ||
365 | want to access Novell NetWare file or print servers using the Linux | ||
366 | Novell client ncpfs (available from | ||
367 | <ftp://platan.vc.cvut.cz/pub/linux/ncpfs/>) or from | ||
368 | within the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, | ||
369 | available from <http://www.tldp.org/docs.html#howto>). In order | ||
370 | to do the former, you'll also have to say Y to "NCP file system | ||
371 | support", below. | ||
372 | |||
373 | IPX is similar in scope to IP, while SPX, which runs on top of IPX, | ||
374 | is similar to TCP. There is also experimental support for SPX in | ||
375 | Linux (see "SPX networking", below). | ||
376 | |||
377 | To turn your Linux box into a fully featured NetWare file server and | ||
378 | IPX router, say Y here and fetch either lwared from | ||
379 | <ftp://ibiblio.org/pub/Linux/system/network/daemons/> or | ||
380 | mars_nwe from <ftp://www.compu-art.de/mars_nwe/>. For more | ||
381 | information, read the IPX-HOWTO available from | ||
382 | <http://www.tldp.org/docs.html#howto>. | ||
383 | |||
384 | General information about how to connect Linux, Windows machines and | ||
385 | Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>. | ||
386 | |||
387 | The IPX driver would enlarge your kernel by about 16 KB. To compile | ||
388 | this driver as a module, choose M here: the module will be called ipx. | ||
389 | Unless you want to integrate your Linux box with a local Novell | ||
390 | network, say N. | ||
391 | |||
392 | source "net/ipx/Kconfig" | 156 | source "net/ipx/Kconfig" |
393 | |||
394 | config ATALK | ||
395 | tristate "Appletalk protocol support" | ||
396 | select LLC | ||
397 | ---help--- | ||
398 | AppleTalk is the protocol that Apple computers can use to communicate | ||
399 | on a network. If your Linux box is connected to such a network and you | ||
400 | wish to connect to it, say Y. You will need to use the netatalk package | ||
401 | so that your Linux box can act as a print and file server for Macs as | ||
402 | well as access AppleTalk printers. Check out | ||
403 | <http://www.zettabyte.net/netatalk/> on the WWW for details. | ||
404 | EtherTalk is the name used for AppleTalk over Ethernet and the | ||
405 | cheaper and slower LocalTalk is AppleTalk over a proprietary Apple | ||
406 | network using serial links. EtherTalk and LocalTalk are fully | ||
407 | supported by Linux. | ||
408 | |||
409 | General information about how to connect Linux, Windows machines and | ||
410 | Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>. The | ||
411 | NET-3-HOWTO, available from | ||
412 | <http://www.tldp.org/docs.html#howto>, contains valuable | ||
413 | information as well. | ||
414 | |||
415 | To compile this driver as a module, choose M here: the module will be | ||
416 | called appletalk. You almost certainly want to compile it as a | ||
417 | module so you can restart your AppleTalk stack without rebooting | ||
418 | your machine. I hear that the GNU boycott of Apple is over, so | ||
419 | even politically correct people are allowed to say Y here. | ||
420 | |||
421 | source "drivers/net/appletalk/Kconfig" | 157 | source "drivers/net/appletalk/Kconfig" |
422 | 158 | source "net/x25/Kconfig" | |
423 | config X25 | 159 | source "net/lapb/Kconfig" |
424 | tristate "CCITT X.25 Packet Layer (EXPERIMENTAL)" | ||
425 | depends on EXPERIMENTAL | ||
426 | ---help--- | ||
427 | X.25 is a set of standardized network protocols, similar in scope to | ||
428 | frame relay; the one physical line from your box to the X.25 network | ||
429 | entry point can carry several logical point-to-point connections | ||
430 | (called "virtual circuits") to other computers connected to the X.25 | ||
431 | network. Governments, banks, and other organizations tend to use it | ||
432 | to connect to each other or to form Wide Area Networks (WANs). Many | ||
433 | countries have public X.25 networks. X.25 consists of two | ||
434 | protocols: the higher level Packet Layer Protocol (PLP) (say Y here | ||
435 | if you want that) and the lower level data link layer protocol LAPB | ||
436 | (say Y to "LAPB Data Link Driver" below if you want that). | ||
437 | |||
438 | You can read more about X.25 at <http://www.sangoma.com/x25.htm> and | ||
439 | <http://www.cisco.com/univercd/cc/td/doc/product/software/ios11/cbook/cx25.htm>. | ||
440 | Information about X.25 for Linux is contained in the files | ||
441 | <file:Documentation/networking/x25.txt> and | ||
442 | <file:Documentation/networking/x25-iface.txt>. | ||
443 | |||
444 | One connects to an X.25 network either with a dedicated network card | ||
445 | using the X.21 protocol (not yet supported by Linux) or one can do | ||
446 | X.25 over a standard telephone line using an ordinary modem (say Y | ||
447 | to "X.25 async driver" below) or over Ethernet using an ordinary | ||
448 | Ethernet card and the LAPB over Ethernet (say Y to "LAPB Data Link | ||
449 | Driver" and "LAPB over Ethernet driver" below). | ||
450 | |||
451 | To compile this driver as a module, choose M here: the module | ||
452 | will be called x25. If unsure, say N. | ||
453 | |||
454 | config LAPB | ||
455 | tristate "LAPB Data Link Driver (EXPERIMENTAL)" | ||
456 | depends on EXPERIMENTAL | ||
457 | ---help--- | ||
458 | Link Access Procedure, Balanced (LAPB) is the data link layer (i.e. | ||
459 | the lower) part of the X.25 protocol. It offers a reliable | ||
460 | connection service to exchange data frames with one other host, and | ||
461 | it is used to transport higher level protocols (mostly X.25 Packet | ||
462 | Layer, the higher part of X.25, but others are possible as well). | ||
463 | Usually, LAPB is used with specialized X.21 network cards, but Linux | ||
464 | currently supports LAPB only over Ethernet connections. If you want | ||
465 | to use LAPB connections over Ethernet, say Y here and to "LAPB over | ||
466 | Ethernet driver" below. Read | ||
467 | <file:Documentation/networking/lapb-module.txt> for technical | ||
468 | details. | ||
469 | |||
470 | To compile this driver as a module, choose M here: the | ||
471 | module will be called lapb. If unsure, say N. | ||
472 | 160 | ||
473 | config NET_DIVERT | 161 | config NET_DIVERT |
474 | bool "Frame Diverter (EXPERIMENTAL)" | 162 | bool "Frame Diverter (EXPERIMENTAL)" |
@@ -496,107 +184,10 @@ config NET_DIVERT | |||
496 | 184 | ||
497 | If unsure, say N. | 185 | If unsure, say N. |
498 | 186 | ||
499 | config ECONET | 187 | source "net/econet/Kconfig" |
500 | tristate "Acorn Econet/AUN protocols (EXPERIMENTAL)" | 188 | source "net/wanrouter/Kconfig" |
501 | depends on EXPERIMENTAL && INET | ||
502 | ---help--- | ||
503 | Econet is a fairly old and slow networking protocol mainly used by | ||
504 | Acorn computers to access file and print servers. It uses native | ||
505 | Econet network cards. AUN is an implementation of the higher level | ||
506 | parts of Econet that runs over ordinary Ethernet connections, on | ||
507 | top of the UDP packet protocol, which in turn runs on top of the | ||
508 | Internet protocol IP. | ||
509 | |||
510 | If you say Y here, you can choose with the next two options whether | ||
511 | to send Econet/AUN traffic over a UDP Ethernet connection or over | ||
512 | a native Econet network card. | ||
513 | |||
514 | To compile this driver as a module, choose M here: the module | ||
515 | will be called econet. | ||
516 | |||
517 | config ECONET_AUNUDP | ||
518 | bool "AUN over UDP" | ||
519 | depends on ECONET | ||
520 | help | ||
521 | Say Y here if you want to send Econet/AUN traffic over a UDP | ||
522 | connection (UDP is a packet based protocol that runs on top of the | ||
523 | Internet protocol IP) using an ordinary Ethernet network card. | ||
524 | |||
525 | config ECONET_NATIVE | ||
526 | bool "Native Econet" | ||
527 | depends on ECONET | ||
528 | help | ||
529 | Say Y here if you have a native Econet network card installed in | ||
530 | your computer. | ||
531 | |||
532 | config WAN_ROUTER | ||
533 | tristate "WAN router" | ||
534 | depends on EXPERIMENTAL | ||
535 | ---help--- | ||
536 | Wide Area Networks (WANs), such as X.25, frame relay and leased | ||
537 | lines, are used to interconnect Local Area Networks (LANs) over vast | ||
538 | distances with data transfer rates significantly higher than those | ||
539 | achievable with commonly used asynchronous modem connections. | ||
540 | Usually, a quite expensive external device called a `WAN router' is | ||
541 | needed to connect to a WAN. | ||
542 | |||
543 | As an alternative, WAN routing can be built into the Linux kernel. | ||
544 | With relatively inexpensive WAN interface cards available on the | ||
545 | market, a perfectly usable router can be built for less than half | ||
546 | the price of an external router. If you have one of those cards and | ||
547 | wish to use your Linux box as a WAN router, say Y here and also to | ||
548 | the WAN driver for your card, below. You will then need the | ||
549 | wan-tools package which is available from <ftp://ftp.sangoma.com/>. | ||
550 | Read <file:Documentation/networking/wan-router.txt> for more | ||
551 | information. | ||
552 | |||
553 | To compile WAN routing support as a module, choose M here: the | ||
554 | module will be called wanrouter. | ||
555 | |||
556 | If unsure, say N. | ||
557 | |||
558 | menu "QoS and/or fair queueing" | ||
559 | |||
560 | config NET_SCHED | ||
561 | bool "QoS and/or fair queueing" | ||
562 | ---help--- | ||
563 | When the kernel has several packets to send out over a network | ||
564 | device, it has to decide which ones to send first, which ones to | ||
565 | delay, and which ones to drop. This is the job of the packet | ||
566 | scheduler, and several different algorithms for how to do this | ||
567 | "fairly" have been proposed. | ||
568 | |||
569 | If you say N here, you will get the standard packet scheduler, which | ||
570 | is a FIFO (first come, first served). If you say Y here, you will be | ||
571 | able to choose from among several alternative algorithms which can | ||
572 | then be attached to different network devices. This is useful for | ||
573 | example if some of your network devices are real time devices that | ||
574 | need a certain minimum data flow rate, or if you need to limit the | ||
575 | maximum data flow rate for traffic which matches specified criteria. | ||
576 | This code is considered to be experimental. | ||
577 | |||
578 | To administer these schedulers, you'll need the user-level utilities | ||
579 | from the package iproute2+tc at <ftp://ftp.tux.org/pub/net/ip-routing/>. | ||
580 | That package also contains some documentation; for more, check out | ||
581 | <http://snafu.freedom.org/linux2.2/iproute-notes.html>. | ||
582 | |||
583 | This Quality of Service (QoS) support will enable you to use | ||
584 | Differentiated Services (diffserv) and Resource Reservation Protocol | ||
585 | (RSVP) on your Linux router if you also say Y to "QoS support", | ||
586 | "Packet classifier API" and to some classifiers below. Documentation | ||
587 | and software is at <http://diffserv.sourceforge.net/>. | ||
588 | |||
589 | If you say Y here and to "/proc file system" below, you will be able | ||
590 | to read status information about packet schedulers from the file | ||
591 | /proc/net/psched. | ||
592 | |||
593 | The available schedulers are listed in the following questions; you | ||
594 | can say Y to as many as you like. If unsure, say N now. | ||
595 | |||
596 | source "net/sched/Kconfig" | 189 | source "net/sched/Kconfig" |
597 | 190 | ||
598 | endmenu | ||
599 | |||
600 | menu "Network testing" | 191 | menu "Network testing" |
601 | 192 | ||
602 | config NET_PKTGEN | 193 | config NET_PKTGEN |
@@ -635,12 +226,9 @@ config NET_POLL_CONTROLLER | |||
635 | def_bool NETPOLL | 226 | def_bool NETPOLL |
636 | 227 | ||
637 | source "net/ax25/Kconfig" | 228 | source "net/ax25/Kconfig" |
638 | |||
639 | source "net/irda/Kconfig" | 229 | source "net/irda/Kconfig" |
640 | |||
641 | source "net/bluetooth/Kconfig" | 230 | source "net/bluetooth/Kconfig" |
642 | 231 | ||
643 | source "drivers/net/Kconfig" | 232 | endif # if NET |
644 | 233 | endmenu # Networking | |
645 | endmenu | ||
646 | 234 | ||
diff --git a/net/atm/Kconfig b/net/atm/Kconfig new file mode 100644 index 000000000000..bea2426229b1 --- /dev/null +++ b/net/atm/Kconfig | |||
@@ -0,0 +1,74 @@ | |||
1 | # | ||
2 | # Asynchronous Transfer Mode (ATM) (EXPERIMENTAL) | ||
3 | # | ||
4 | |||
5 | config ATM | ||
6 | tristate "Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)" | ||
7 | depends on EXPERIMENTAL | ||
8 | ---help--- | ||
9 | ATM is a high-speed networking technology for Local Area Networks | ||
10 | and Wide Area Networks. It uses a fixed packet size and is | ||
11 | connection oriented, allowing for the negotiation of minimum | ||
12 | bandwidth requirements. | ||
13 | |||
14 | In order to participate in an ATM network, your Linux box needs an | ||
15 | ATM networking card. If you have that, say Y here and to the driver | ||
16 | of your ATM card below. | ||
17 | |||
18 | Note that you need a set of user-space programs to actually make use | ||
19 | of ATM. See the file <file:Documentation/networking/atm.txt> for | ||
20 | further details. | ||
21 | |||
22 | config ATM_CLIP | ||
23 | tristate "Classical IP over ATM (EXPERIMENTAL)" | ||
24 | depends on ATM && INET | ||
25 | help | ||
26 | Classical IP over ATM for PVCs and SVCs, supporting InARP and | ||
27 | ATMARP. If you want to communication with other IP hosts on your ATM | ||
28 | network, you will typically either say Y here or to "LAN Emulation | ||
29 | (LANE)" below. | ||
30 | |||
31 | config ATM_CLIP_NO_ICMP | ||
32 | bool "Do NOT send ICMP if no neighbour (EXPERIMENTAL)" | ||
33 | depends on ATM_CLIP | ||
34 | help | ||
35 | Normally, an "ICMP host unreachable" message is sent if a neighbour | ||
36 | cannot be reached because there is no VC to it in the kernel's | ||
37 | ATMARP table. This may cause problems when ATMARP table entries are | ||
38 | briefly removed during revalidation. If you say Y here, packets to | ||
39 | such neighbours are silently discarded instead. | ||
40 | |||
41 | config ATM_LANE | ||
42 | tristate "LAN Emulation (LANE) support (EXPERIMENTAL)" | ||
43 | depends on ATM | ||
44 | help | ||
45 | LAN Emulation emulates services of existing LANs across an ATM | ||
46 | network. Besides operating as a normal ATM end station client, Linux | ||
47 | LANE client can also act as an proxy client bridging packets between | ||
48 | ELAN and Ethernet segments. You need LANE if you want to try MPOA. | ||
49 | |||
50 | config ATM_MPOA | ||
51 | tristate "Multi-Protocol Over ATM (MPOA) support (EXPERIMENTAL)" | ||
52 | depends on ATM && INET && ATM_LANE!=n | ||
53 | help | ||
54 | Multi-Protocol Over ATM allows ATM edge devices such as routers, | ||
55 | bridges and ATM attached hosts establish direct ATM VCs across | ||
56 | subnetwork boundaries. These shortcut connections bypass routers | ||
57 | enhancing overall network performance. | ||
58 | |||
59 | config ATM_BR2684 | ||
60 | tristate "RFC1483/2684 Bridged protocols" | ||
61 | depends on ATM && INET | ||
62 | help | ||
63 | ATM PVCs can carry ethernet PDUs according to rfc2684 (formerly 1483) | ||
64 | This device will act like an ethernet from the kernels point of view, | ||
65 | with the traffic being carried by ATM PVCs (currently 1 PVC/device). | ||
66 | This is sometimes used over DSL lines. If in doubt, say N. | ||
67 | |||
68 | config ATM_BR2684_IPFILTER | ||
69 | bool "Per-VC IP filter kludge" | ||
70 | depends on ATM_BR2684 | ||
71 | help | ||
72 | This is an experimental mechanism for users who need to terminating a | ||
73 | large number of IP-only vcc's. Do not enable this unless you are sure | ||
74 | you know what you are doing. | ||
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index e6954cf1459d..289956c4dd3e 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -289,8 +289,7 @@ xmit will add the additional header part in that case */ | |||
289 | * This is similar to eth_type_trans, which cannot be used because of | 289 | * This is similar to eth_type_trans, which cannot be used because of |
290 | * our dev->hard_header_len | 290 | * our dev->hard_header_len |
291 | */ | 291 | */ |
292 | static inline unsigned short br_type_trans(struct sk_buff *skb, | 292 | static inline __be16 br_type_trans(struct sk_buff *skb, struct net_device *dev) |
293 | struct net_device *dev) | ||
294 | { | 293 | { |
295 | struct ethhdr *eth; | 294 | struct ethhdr *eth; |
296 | unsigned char *rawp; | 295 | unsigned char *rawp; |
diff --git a/net/bridge/Kconfig b/net/bridge/Kconfig new file mode 100644 index 000000000000..db23d59746cf --- /dev/null +++ b/net/bridge/Kconfig | |||
@@ -0,0 +1,31 @@ | |||
1 | # | ||
2 | # 802.1d Ethernet Bridging | ||
3 | # | ||
4 | |||
5 | config BRIDGE | ||
6 | tristate "802.1d Ethernet Bridging" | ||
7 | ---help--- | ||
8 | If you say Y here, then your Linux box will be able to act as an | ||
9 | Ethernet bridge, which means that the different Ethernet segments it | ||
10 | is connected to will appear as one Ethernet to the participants. | ||
11 | Several such bridges can work together to create even larger | ||
12 | networks of Ethernets using the IEEE 802.1 spanning tree algorithm. | ||
13 | As this is a standard, Linux bridges will cooperate properly with | ||
14 | other third party bridge products. | ||
15 | |||
16 | In order to use the Ethernet bridge, you'll need the bridge | ||
17 | configuration tools; see <file:Documentation/networking/bridge.txt> | ||
18 | for location. Please read the Bridge mini-HOWTO for more | ||
19 | information. | ||
20 | |||
21 | If you enable iptables support along with the bridge support then you | ||
22 | turn your bridge into a bridging IP firewall. | ||
23 | iptables will then see the IP packets being bridged, so you need to | ||
24 | take this into account when setting up your firewall rules. | ||
25 | Enabling arptables support when bridging will let arptables see | ||
26 | bridged ARP traffic in the arptables FORWARD chain. | ||
27 | |||
28 | To compile this code as a module, choose M here: the module | ||
29 | will be called bridge. | ||
30 | |||
31 | If unsure, say N. | ||
diff --git a/net/decnet/Kconfig b/net/decnet/Kconfig index 2101da542ba8..92f2ec46fd22 100644 --- a/net/decnet/Kconfig +++ b/net/decnet/Kconfig | |||
@@ -1,6 +1,29 @@ | |||
1 | # | 1 | # |
2 | # DECnet configuration | 2 | # DECnet configuration |
3 | # | 3 | # |
4 | config DECNET | ||
5 | tristate "DECnet Support" | ||
6 | ---help--- | ||
7 | The DECnet networking protocol was used in many products made by | ||
8 | Digital (now Compaq). It provides reliable stream and sequenced | ||
9 | packet communications over which run a variety of services similar | ||
10 | to those which run over TCP/IP. | ||
11 | |||
12 | To find some tools to use with the kernel layer support, please | ||
13 | look at Patrick Caulfield's web site: | ||
14 | <http://linux-decnet.sourceforge.net/>. | ||
15 | |||
16 | More detailed documentation is available in | ||
17 | <file:Documentation/networking/decnet.txt>. | ||
18 | |||
19 | Be sure to say Y to "/proc file system support" and "Sysctl support" | ||
20 | below when using DECnet, since you will need sysctl support to aid | ||
21 | in configuration at run time. | ||
22 | |||
23 | The DECnet code is also available as a module ( = code which can be | ||
24 | inserted in and removed from the running kernel whenever you want). | ||
25 | The module is called decnet. | ||
26 | |||
4 | config DECNET_ROUTER | 27 | config DECNET_ROUTER |
5 | bool "DECnet: router support (EXPERIMENTAL)" | 28 | bool "DECnet: router support (EXPERIMENTAL)" |
6 | depends on DECNET && EXPERIMENTAL | 29 | depends on DECNET && EXPERIMENTAL |
diff --git a/net/econet/Kconfig b/net/econet/Kconfig new file mode 100644 index 000000000000..39a2d2975e0e --- /dev/null +++ b/net/econet/Kconfig | |||
@@ -0,0 +1,36 @@ | |||
1 | # | ||
2 | # Acorn Econet/AUN protocols | ||
3 | # | ||
4 | |||
5 | config ECONET | ||
6 | tristate "Acorn Econet/AUN protocols (EXPERIMENTAL)" | ||
7 | depends on EXPERIMENTAL && INET | ||
8 | ---help--- | ||
9 | Econet is a fairly old and slow networking protocol mainly used by | ||
10 | Acorn computers to access file and print servers. It uses native | ||
11 | Econet network cards. AUN is an implementation of the higher level | ||
12 | parts of Econet that runs over ordinary Ethernet connections, on | ||
13 | top of the UDP packet protocol, which in turn runs on top of the | ||
14 | Internet protocol IP. | ||
15 | |||
16 | If you say Y here, you can choose with the next two options whether | ||
17 | to send Econet/AUN traffic over a UDP Ethernet connection or over | ||
18 | a native Econet network card. | ||
19 | |||
20 | To compile this driver as a module, choose M here: the module | ||
21 | will be called econet. | ||
22 | |||
23 | config ECONET_AUNUDP | ||
24 | bool "AUN over UDP" | ||
25 | depends on ECONET | ||
26 | help | ||
27 | Say Y here if you want to send Econet/AUN traffic over a UDP | ||
28 | connection (UDP is a packet based protocol that runs on top of the | ||
29 | Internet protocol IP) using an ordinary Ethernet network card. | ||
30 | |||
31 | config ECONET_NATIVE | ||
32 | bool "Native Econet" | ||
33 | depends on ECONET | ||
34 | help | ||
35 | Say Y here if you have a native Econet network card installed in | ||
36 | your computer. | ||
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index ab60ea63688e..f6dbfb99b14d 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c | |||
@@ -155,7 +155,7 @@ int eth_rebuild_header(struct sk_buff *skb) | |||
155 | * This is normal practice and works for any 'now in use' protocol. | 155 | * This is normal practice and works for any 'now in use' protocol. |
156 | */ | 156 | */ |
157 | 157 | ||
158 | unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev) | 158 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) |
159 | { | 159 | { |
160 | struct ethhdr *eth; | 160 | struct ethhdr *eth; |
161 | unsigned char *rawp; | 161 | unsigned char *rawp; |
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index 3e63123f7bbd..df5386885a90 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
@@ -3,7 +3,6 @@ | |||
3 | # | 3 | # |
4 | config IP_MULTICAST | 4 | config IP_MULTICAST |
5 | bool "IP: multicasting" | 5 | bool "IP: multicasting" |
6 | depends on INET | ||
7 | help | 6 | help |
8 | This is code for addressing several networked computers at once, | 7 | This is code for addressing several networked computers at once, |
9 | enlarging your kernel by about 2 KB. You need multicasting if you | 8 | enlarging your kernel by about 2 KB. You need multicasting if you |
@@ -17,7 +16,6 @@ config IP_MULTICAST | |||
17 | 16 | ||
18 | config IP_ADVANCED_ROUTER | 17 | config IP_ADVANCED_ROUTER |
19 | bool "IP: advanced router" | 18 | bool "IP: advanced router" |
20 | depends on INET | ||
21 | ---help--- | 19 | ---help--- |
22 | If you intend to run your Linux box mostly as a router, i.e. as a | 20 | If you intend to run your Linux box mostly as a router, i.e. as a |
23 | computer that forwards and redistributes network packets, say Y; you | 21 | computer that forwards and redistributes network packets, say Y; you |
@@ -183,7 +181,6 @@ config IP_ROUTE_VERBOSE | |||
183 | 181 | ||
184 | config IP_PNP | 182 | config IP_PNP |
185 | bool "IP: kernel level autoconfiguration" | 183 | bool "IP: kernel level autoconfiguration" |
186 | depends on INET | ||
187 | help | 184 | help |
188 | This enables automatic configuration of IP addresses of devices and | 185 | This enables automatic configuration of IP addresses of devices and |
189 | of the routing table during kernel boot, based on either information | 186 | of the routing table during kernel boot, based on either information |
@@ -242,7 +239,6 @@ config IP_PNP_RARP | |||
242 | # bool ' IP: ARP support' CONFIG_IP_PNP_ARP | 239 | # bool ' IP: ARP support' CONFIG_IP_PNP_ARP |
243 | config NET_IPIP | 240 | config NET_IPIP |
244 | tristate "IP: tunneling" | 241 | tristate "IP: tunneling" |
245 | depends on INET | ||
246 | select INET_TUNNEL | 242 | select INET_TUNNEL |
247 | ---help--- | 243 | ---help--- |
248 | Tunneling means encapsulating data of one protocol type within | 244 | Tunneling means encapsulating data of one protocol type within |
@@ -260,7 +256,6 @@ config NET_IPIP | |||
260 | 256 | ||
261 | config NET_IPGRE | 257 | config NET_IPGRE |
262 | tristate "IP: GRE tunnels over IP" | 258 | tristate "IP: GRE tunnels over IP" |
263 | depends on INET | ||
264 | select XFRM | 259 | select XFRM |
265 | help | 260 | help |
266 | Tunneling means encapsulating data of one protocol type within | 261 | Tunneling means encapsulating data of one protocol type within |
@@ -319,7 +314,7 @@ config IP_PIMSM_V2 | |||
319 | 314 | ||
320 | config ARPD | 315 | config ARPD |
321 | bool "IP: ARP daemon support (EXPERIMENTAL)" | 316 | bool "IP: ARP daemon support (EXPERIMENTAL)" |
322 | depends on INET && EXPERIMENTAL | 317 | depends on EXPERIMENTAL |
323 | ---help--- | 318 | ---help--- |
324 | Normally, the kernel maintains an internal cache which maps IP | 319 | Normally, the kernel maintains an internal cache which maps IP |
325 | addresses to hardware addresses on the local network, so that | 320 | addresses to hardware addresses on the local network, so that |
@@ -344,7 +339,6 @@ config ARPD | |||
344 | 339 | ||
345 | config SYN_COOKIES | 340 | config SYN_COOKIES |
346 | bool "IP: TCP syncookie support (disabled per default)" | 341 | bool "IP: TCP syncookie support (disabled per default)" |
347 | depends on INET | ||
348 | ---help--- | 342 | ---help--- |
349 | Normal TCP/IP networking is open to an attack known as "SYN | 343 | Normal TCP/IP networking is open to an attack known as "SYN |
350 | flooding". This denial-of-service attack prevents legitimate remote | 344 | flooding". This denial-of-service attack prevents legitimate remote |
@@ -381,7 +375,6 @@ config SYN_COOKIES | |||
381 | 375 | ||
382 | config INET_AH | 376 | config INET_AH |
383 | tristate "IP: AH transformation" | 377 | tristate "IP: AH transformation" |
384 | depends on INET | ||
385 | select XFRM | 378 | select XFRM |
386 | select CRYPTO | 379 | select CRYPTO |
387 | select CRYPTO_HMAC | 380 | select CRYPTO_HMAC |
@@ -394,7 +387,6 @@ config INET_AH | |||
394 | 387 | ||
395 | config INET_ESP | 388 | config INET_ESP |
396 | tristate "IP: ESP transformation" | 389 | tristate "IP: ESP transformation" |
397 | depends on INET | ||
398 | select XFRM | 390 | select XFRM |
399 | select CRYPTO | 391 | select CRYPTO |
400 | select CRYPTO_HMAC | 392 | select CRYPTO_HMAC |
@@ -408,7 +400,6 @@ config INET_ESP | |||
408 | 400 | ||
409 | config INET_IPCOMP | 401 | config INET_IPCOMP |
410 | tristate "IP: IPComp transformation" | 402 | tristate "IP: IPComp transformation" |
411 | depends on INET | ||
412 | select XFRM | 403 | select XFRM |
413 | select INET_TUNNEL | 404 | select INET_TUNNEL |
414 | select CRYPTO | 405 | select CRYPTO |
@@ -421,7 +412,6 @@ config INET_IPCOMP | |||
421 | 412 | ||
422 | config INET_TUNNEL | 413 | config INET_TUNNEL |
423 | tristate "IP: tunnel transformation" | 414 | tristate "IP: tunnel transformation" |
424 | depends on INET | ||
425 | select XFRM | 415 | select XFRM |
426 | ---help--- | 416 | ---help--- |
427 | Support for generic IP tunnel transformation, which is required by | 417 | Support for generic IP tunnel transformation, which is required by |
@@ -431,7 +421,6 @@ config INET_TUNNEL | |||
431 | 421 | ||
432 | config IP_TCPDIAG | 422 | config IP_TCPDIAG |
433 | tristate "IP: TCP socket monitoring interface" | 423 | tristate "IP: TCP socket monitoring interface" |
434 | depends on INET | ||
435 | default y | 424 | default y |
436 | ---help--- | 425 | ---help--- |
437 | Support for TCP socket monitoring interface used by native Linux | 426 | Support for TCP socket monitoring interface used by native Linux |
@@ -447,7 +436,6 @@ config IP_TCPDIAG_IPV6 | |||
447 | 436 | ||
448 | config TCP_CONG_ADVANCED | 437 | config TCP_CONG_ADVANCED |
449 | bool "TCP: advanced congestion control" | 438 | bool "TCP: advanced congestion control" |
450 | depends on INET | ||
451 | ---help--- | 439 | ---help--- |
452 | Support for selection of various TCP congestion control | 440 | Support for selection of various TCP congestion control |
453 | modules. | 441 | modules. |
@@ -463,7 +451,6 @@ menu "TCP congestion control" | |||
463 | 451 | ||
464 | config TCP_CONG_BIC | 452 | config TCP_CONG_BIC |
465 | tristate "Binary Increase Congestion (BIC) control" | 453 | tristate "Binary Increase Congestion (BIC) control" |
466 | depends on INET | ||
467 | default y | 454 | default y |
468 | ---help--- | 455 | ---help--- |
469 | BIC-TCP is a sender-side only change that ensures a linear RTT | 456 | BIC-TCP is a sender-side only change that ensures a linear RTT |
@@ -478,7 +465,6 @@ config TCP_CONG_BIC | |||
478 | 465 | ||
479 | config TCP_CONG_WESTWOOD | 466 | config TCP_CONG_WESTWOOD |
480 | tristate "TCP Westwood+" | 467 | tristate "TCP Westwood+" |
481 | depends on INET | ||
482 | default m | 468 | default m |
483 | ---help--- | 469 | ---help--- |
484 | TCP Westwood+ is a sender-side only modification of the TCP Reno | 470 | TCP Westwood+ is a sender-side only modification of the TCP Reno |
@@ -493,7 +479,6 @@ config TCP_CONG_WESTWOOD | |||
493 | 479 | ||
494 | config TCP_CONG_HTCP | 480 | config TCP_CONG_HTCP |
495 | tristate "H-TCP" | 481 | tristate "H-TCP" |
496 | depends on INET | ||
497 | default m | 482 | default m |
498 | ---help--- | 483 | ---help--- |
499 | H-TCP is a send-side only modifications of the TCP Reno | 484 | H-TCP is a send-side only modifications of the TCP Reno |
@@ -505,7 +490,7 @@ config TCP_CONG_HTCP | |||
505 | 490 | ||
506 | config TCP_CONG_HSTCP | 491 | config TCP_CONG_HSTCP |
507 | tristate "High Speed TCP" | 492 | tristate "High Speed TCP" |
508 | depends on INET && EXPERIMENTAL | 493 | depends on EXPERIMENTAL |
509 | default n | 494 | default n |
510 | ---help--- | 495 | ---help--- |
511 | Sally Floyd's High Speed TCP (RFC 3649) congestion control. | 496 | Sally Floyd's High Speed TCP (RFC 3649) congestion control. |
@@ -516,7 +501,7 @@ config TCP_CONG_HSTCP | |||
516 | 501 | ||
517 | config TCP_CONG_HYBLA | 502 | config TCP_CONG_HYBLA |
518 | tristate "TCP-Hybla congestion control algorithm" | 503 | tristate "TCP-Hybla congestion control algorithm" |
519 | depends on INET && EXPERIMENTAL | 504 | depends on EXPERIMENTAL |
520 | default n | 505 | default n |
521 | ---help--- | 506 | ---help--- |
522 | TCP-Hybla is a sender-side only change that eliminates penalization of | 507 | TCP-Hybla is a sender-side only change that eliminates penalization of |
@@ -526,7 +511,7 @@ config TCP_CONG_HYBLA | |||
526 | 511 | ||
527 | config TCP_CONG_VEGAS | 512 | config TCP_CONG_VEGAS |
528 | tristate "TCP Vegas" | 513 | tristate "TCP Vegas" |
529 | depends on INET && EXPERIMENTAL | 514 | depends on EXPERIMENTAL |
530 | default n | 515 | default n |
531 | ---help--- | 516 | ---help--- |
532 | TCP Vegas is a sender-side only change to TCP that anticipates | 517 | TCP Vegas is a sender-side only change to TCP that anticipates |
@@ -537,7 +522,7 @@ config TCP_CONG_VEGAS | |||
537 | 522 | ||
538 | config TCP_CONG_SCALABLE | 523 | config TCP_CONG_SCALABLE |
539 | tristate "Scalable TCP" | 524 | tristate "Scalable TCP" |
540 | depends on INET && EXPERIMENTAL | 525 | depends on EXPERIMENTAL |
541 | default n | 526 | default n |
542 | ---help--- | 527 | ---help--- |
543 | Scalable TCP is a sender-side only change to TCP which uses a | 528 | Scalable TCP is a sender-side only change to TCP which uses a |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 9de83e6e0f1d..80d13103b2b0 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -107,7 +107,6 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) | |||
107 | newskb->pkt_type = PACKET_LOOPBACK; | 107 | newskb->pkt_type = PACKET_LOOPBACK; |
108 | newskb->ip_summed = CHECKSUM_UNNECESSARY; | 108 | newskb->ip_summed = CHECKSUM_UNNECESSARY; |
109 | BUG_TRAP(newskb->dst); | 109 | BUG_TRAP(newskb->dst); |
110 | nf_reset(newskb); | ||
111 | netif_rx(newskb); | 110 | netif_rx(newskb); |
112 | return 0; | 111 | return 0; |
113 | } | 112 | } |
@@ -188,14 +187,6 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
188 | skb = skb2; | 187 | skb = skb2; |
189 | } | 188 | } |
190 | 189 | ||
191 | #ifdef CONFIG_BRIDGE_NETFILTER | ||
192 | /* bridge-netfilter defers calling some IP hooks to the bridge layer | ||
193 | * and still needs the conntrack reference. | ||
194 | */ | ||
195 | if (skb->nf_bridge == NULL) | ||
196 | #endif | ||
197 | nf_reset(skb); | ||
198 | |||
199 | if (hh) { | 190 | if (hh) { |
200 | int hh_alen; | 191 | int hh_alen; |
201 | 192 | ||
diff --git a/net/ipv4/ipvs/Kconfig b/net/ipv4/ipvs/Kconfig index 63a82b4b64bb..c9820bfc493a 100644 --- a/net/ipv4/ipvs/Kconfig +++ b/net/ipv4/ipvs/Kconfig | |||
@@ -2,11 +2,11 @@ | |||
2 | # IP Virtual Server configuration | 2 | # IP Virtual Server configuration |
3 | # | 3 | # |
4 | menu "IP: Virtual Server Configuration" | 4 | menu "IP: Virtual Server Configuration" |
5 | depends on INET && NETFILTER | 5 | depends on NETFILTER |
6 | 6 | ||
7 | config IP_VS | 7 | config IP_VS |
8 | tristate "IP virtual server support (EXPERIMENTAL)" | 8 | tristate "IP virtual server support (EXPERIMENTAL)" |
9 | depends on INET && NETFILTER | 9 | depends on NETFILTER |
10 | ---help--- | 10 | ---help--- |
11 | IP Virtual Server support will let you build a high-performance | 11 | IP Virtual Server support will let you build a high-performance |
12 | virtual server based on cluster of two or more real servers. This | 12 | virtual server based on cluster of two or more real servers. This |
diff --git a/net/ipv4/ipvs/ip_vs_conn.c b/net/ipv4/ipvs/ip_vs_conn.c index 9f16ab309106..d0145a8b1551 100644 --- a/net/ipv4/ipvs/ip_vs_conn.c +++ b/net/ipv4/ipvs/ip_vs_conn.c | |||
@@ -758,7 +758,7 @@ static inline int todrop_entry(struct ip_vs_conn *cp) | |||
758 | return 1; | 758 | return 1; |
759 | } | 759 | } |
760 | 760 | ||
761 | 761 | /* Called from keventd and must protect itself from softirqs */ | |
762 | void ip_vs_random_dropentry(void) | 762 | void ip_vs_random_dropentry(void) |
763 | { | 763 | { |
764 | int idx; | 764 | int idx; |
@@ -773,7 +773,7 @@ void ip_vs_random_dropentry(void) | |||
773 | /* | 773 | /* |
774 | * Lock is actually needed in this loop. | 774 | * Lock is actually needed in this loop. |
775 | */ | 775 | */ |
776 | ct_write_lock(hash); | 776 | ct_write_lock_bh(hash); |
777 | 777 | ||
778 | list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) { | 778 | list_for_each_entry(cp, &ip_vs_conn_tab[hash], c_list) { |
779 | if (!cp->cport && !(cp->flags & IP_VS_CONN_F_NO_CPORT)) | 779 | if (!cp->cport && !(cp->flags & IP_VS_CONN_F_NO_CPORT)) |
@@ -806,7 +806,7 @@ void ip_vs_random_dropentry(void) | |||
806 | ip_vs_conn_expire_now(cp->control); | 806 | ip_vs_conn_expire_now(cp->control); |
807 | } | 807 | } |
808 | } | 808 | } |
809 | ct_write_unlock(hash); | 809 | ct_write_unlock_bh(hash); |
810 | } | 810 | } |
811 | } | 811 | } |
812 | 812 | ||
diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index 12a82e91d22a..7d99ede2ef79 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c | |||
@@ -90,7 +90,8 @@ int ip_vs_get_debug_level(void) | |||
90 | #endif | 90 | #endif |
91 | 91 | ||
92 | /* | 92 | /* |
93 | * update_defense_level is called from keventd and from sysctl. | 93 | * update_defense_level is called from keventd and from sysctl, |
94 | * so it needs to protect itself from softirqs | ||
94 | */ | 95 | */ |
95 | static void update_defense_level(void) | 96 | static void update_defense_level(void) |
96 | { | 97 | { |
@@ -110,6 +111,8 @@ static void update_defense_level(void) | |||
110 | 111 | ||
111 | nomem = (availmem < sysctl_ip_vs_amemthresh); | 112 | nomem = (availmem < sysctl_ip_vs_amemthresh); |
112 | 113 | ||
114 | local_bh_disable(); | ||
115 | |||
113 | /* drop_entry */ | 116 | /* drop_entry */ |
114 | spin_lock(&__ip_vs_dropentry_lock); | 117 | spin_lock(&__ip_vs_dropentry_lock); |
115 | switch (sysctl_ip_vs_drop_entry) { | 118 | switch (sysctl_ip_vs_drop_entry) { |
@@ -206,6 +209,8 @@ static void update_defense_level(void) | |||
206 | if (to_change >= 0) | 209 | if (to_change >= 0) |
207 | ip_vs_protocol_timeout_change(sysctl_ip_vs_secure_tcp>1); | 210 | ip_vs_protocol_timeout_change(sysctl_ip_vs_secure_tcp>1); |
208 | write_unlock(&__ip_vs_securetcp_lock); | 211 | write_unlock(&__ip_vs_securetcp_lock); |
212 | |||
213 | local_bh_enable(); | ||
209 | } | 214 | } |
210 | 215 | ||
211 | 216 | ||
@@ -1360,9 +1365,7 @@ proc_do_defense_mode(ctl_table *table, int write, struct file * filp, | |||
1360 | /* Restore the correct value */ | 1365 | /* Restore the correct value */ |
1361 | *valp = val; | 1366 | *valp = val; |
1362 | } else { | 1367 | } else { |
1363 | local_bh_disable(); | ||
1364 | update_defense_level(); | 1368 | update_defense_level(); |
1365 | local_bh_enable(); | ||
1366 | } | 1369 | } |
1367 | } | 1370 | } |
1368 | return rc; | 1371 | return rc; |
diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c index 42dc95102873..1dd824f3cf0a 100644 --- a/net/ipv4/netfilter/ip_conntrack_standalone.c +++ b/net/ipv4/netfilter/ip_conntrack_standalone.c | |||
@@ -432,6 +432,13 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum, | |||
432 | const struct net_device *out, | 432 | const struct net_device *out, |
433 | int (*okfn)(struct sk_buff *)) | 433 | int (*okfn)(struct sk_buff *)) |
434 | { | 434 | { |
435 | #if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE) | ||
436 | /* Previously seen (loopback)? Ignore. Do this before | ||
437 | fragment check. */ | ||
438 | if ((*pskb)->nfct) | ||
439 | return NF_ACCEPT; | ||
440 | #endif | ||
441 | |||
435 | /* Gather fragments. */ | 442 | /* Gather fragments. */ |
436 | if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { | 443 | if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { |
437 | *pskb = ip_ct_gather_frags(*pskb, | 444 | *pskb = ip_ct_gather_frags(*pskb, |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 726ea5e8180a..d675ff80b04d 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1685,7 +1685,7 @@ static void ip_handle_martian_source(struct net_device *dev, | |||
1685 | printk(KERN_WARNING "martian source %u.%u.%u.%u from " | 1685 | printk(KERN_WARNING "martian source %u.%u.%u.%u from " |
1686 | "%u.%u.%u.%u, on dev %s\n", | 1686 | "%u.%u.%u.%u, on dev %s\n", |
1687 | NIPQUAD(daddr), NIPQUAD(saddr), dev->name); | 1687 | NIPQUAD(daddr), NIPQUAD(saddr), dev->name); |
1688 | if (dev->hard_header_len) { | 1688 | if (dev->hard_header_len && skb->mac.raw) { |
1689 | int i; | 1689 | int i; |
1690 | unsigned char *p = skb->mac.raw; | 1690 | unsigned char *p = skb->mac.raw; |
1691 | printk(KERN_WARNING "ll header: "); | 1691 | printk(KERN_WARNING "ll header: "); |
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index e66ca9381cfd..95163cd52ae0 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
@@ -1,6 +1,26 @@ | |||
1 | # | 1 | # |
2 | # IPv6 configuration | 2 | # IPv6 configuration |
3 | # | 3 | # |
4 | |||
5 | # IPv6 as module will cause a CRASH if you try to unload it | ||
6 | config IPV6 | ||
7 | tristate "The IPv6 protocol" | ||
8 | default m | ||
9 | select CRYPTO if IPV6_PRIVACY | ||
10 | select CRYPTO_MD5 if IPV6_PRIVACY | ||
11 | ---help--- | ||
12 | This is complemental support for the IP version 6. | ||
13 | You will still be able to do traditional IPv4 networking as well. | ||
14 | |||
15 | For general information about IPv6, see | ||
16 | <http://playground.sun.com/pub/ipng/html/ipng-main.html>. | ||
17 | For Linux IPv6 development information, see <http://www.linux-ipv6.org>. | ||
18 | For specific information about IPv6 under Linux, read the HOWTO at | ||
19 | <http://www.bieringer.de/linux/IPv6/>. | ||
20 | |||
21 | To compile this protocol support as a module, choose M here: the | ||
22 | module will be called ipv6. | ||
23 | |||
4 | config IPV6_PRIVACY | 24 | config IPV6_PRIVACY |
5 | bool "IPv6: Privacy Extensions (RFC 3041) support" | 25 | bool "IPv6: Privacy Extensions (RFC 3041) support" |
6 | depends on IPV6 | 26 | depends on IPV6 |
diff --git a/net/ipx/Kconfig b/net/ipx/Kconfig index a16237c0e783..980a826f5d02 100644 --- a/net/ipx/Kconfig +++ b/net/ipx/Kconfig | |||
@@ -1,6 +1,39 @@ | |||
1 | # | 1 | # |
2 | # IPX configuration | 2 | # IPX configuration |
3 | # | 3 | # |
4 | config IPX | ||
5 | tristate "The IPX protocol" | ||
6 | select LLC | ||
7 | ---help--- | ||
8 | This is support for the Novell networking protocol, IPX, commonly | ||
9 | used for local networks of Windows machines. You need it if you | ||
10 | want to access Novell NetWare file or print servers using the Linux | ||
11 | Novell client ncpfs (available from | ||
12 | <ftp://platan.vc.cvut.cz/pub/linux/ncpfs/>) or from | ||
13 | within the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, | ||
14 | available from <http://www.tldp.org/docs.html#howto>). In order | ||
15 | to do the former, you'll also have to say Y to "NCP file system | ||
16 | support", below. | ||
17 | |||
18 | IPX is similar in scope to IP, while SPX, which runs on top of IPX, | ||
19 | is similar to TCP. There is also experimental support for SPX in | ||
20 | Linux (see "SPX networking", below). | ||
21 | |||
22 | To turn your Linux box into a fully featured NetWare file server and | ||
23 | IPX router, say Y here and fetch either lwared from | ||
24 | <ftp://ibiblio.org/pub/Linux/system/network/daemons/> or | ||
25 | mars_nwe from <ftp://www.compu-art.de/mars_nwe/>. For more | ||
26 | information, read the IPX-HOWTO available from | ||
27 | <http://www.tldp.org/docs.html#howto>. | ||
28 | |||
29 | General information about how to connect Linux, Windows machines and | ||
30 | Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>. | ||
31 | |||
32 | The IPX driver would enlarge your kernel by about 16 KB. To compile | ||
33 | this driver as a module, choose M here: the module will be called ipx. | ||
34 | Unless you want to integrate your Linux box with a local Novell | ||
35 | network, say N. | ||
36 | |||
4 | config IPX_INTERN | 37 | config IPX_INTERN |
5 | bool "IPX: Full internal IPX network" | 38 | bool "IPX: Full internal IPX network" |
6 | depends on IPX | 39 | depends on IPX |
diff --git a/net/lapb/Kconfig b/net/lapb/Kconfig new file mode 100644 index 000000000000..f0b5efb31a00 --- /dev/null +++ b/net/lapb/Kconfig | |||
@@ -0,0 +1,22 @@ | |||
1 | # | ||
2 | # LAPB Data Link Drive | ||
3 | # | ||
4 | |||
5 | config LAPB | ||
6 | tristate "LAPB Data Link Driver (EXPERIMENTAL)" | ||
7 | depends on EXPERIMENTAL | ||
8 | ---help--- | ||
9 | Link Access Procedure, Balanced (LAPB) is the data link layer (i.e. | ||
10 | the lower) part of the X.25 protocol. It offers a reliable | ||
11 | connection service to exchange data frames with one other host, and | ||
12 | it is used to transport higher level protocols (mostly X.25 Packet | ||
13 | Layer, the higher part of X.25, but others are possible as well). | ||
14 | Usually, LAPB is used with specialized X.21 network cards, but Linux | ||
15 | currently supports LAPB only over Ethernet connections. If you want | ||
16 | to use LAPB connections over Ethernet, say Y here and to "LAPB over | ||
17 | Ethernet driver" below. Read | ||
18 | <file:Documentation/networking/lapb-module.txt> for technical | ||
19 | details. | ||
20 | |||
21 | To compile this driver as a module, choose M here: the | ||
22 | module will be called lapb. If unsure, say N. | ||
diff --git a/net/packet/Kconfig b/net/packet/Kconfig new file mode 100644 index 000000000000..34ff93ff894d --- /dev/null +++ b/net/packet/Kconfig | |||
@@ -0,0 +1,26 @@ | |||
1 | # | ||
2 | # Packet configuration | ||
3 | # | ||
4 | |||
5 | config PACKET | ||
6 | tristate "Packet socket" | ||
7 | ---help--- | ||
8 | The Packet protocol is used by applications which communicate | ||
9 | directly with network devices without an intermediate network | ||
10 | protocol implemented in the kernel, e.g. tcpdump. If you want them | ||
11 | to work, choose Y. | ||
12 | |||
13 | To compile this driver as a module, choose M here: the module will | ||
14 | be called af_packet. | ||
15 | |||
16 | If unsure, say Y. | ||
17 | |||
18 | config PACKET_MMAP | ||
19 | bool "Packet socket: mmapped IO" | ||
20 | depends on PACKET | ||
21 | help | ||
22 | If you say Y here, the Packet protocol driver will use an IO | ||
23 | mechanism that results in faster communication. | ||
24 | |||
25 | If unsure, say N. | ||
26 | |||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 0269616e75a1..c9d5980aa4de 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -274,6 +274,9 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, struct | |||
274 | dst_release(skb->dst); | 274 | dst_release(skb->dst); |
275 | skb->dst = NULL; | 275 | skb->dst = NULL; |
276 | 276 | ||
277 | /* drop conntrack reference */ | ||
278 | nf_reset(skb); | ||
279 | |||
277 | spkt = (struct sockaddr_pkt*)skb->cb; | 280 | spkt = (struct sockaddr_pkt*)skb->cb; |
278 | 281 | ||
279 | skb_push(skb, skb->data-skb->mac.raw); | 282 | skb_push(skb, skb->data-skb->mac.raw); |
@@ -517,6 +520,9 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packe | |||
517 | dst_release(skb->dst); | 520 | dst_release(skb->dst); |
518 | skb->dst = NULL; | 521 | skb->dst = NULL; |
519 | 522 | ||
523 | /* drop conntrack reference */ | ||
524 | nf_reset(skb); | ||
525 | |||
520 | spin_lock(&sk->sk_receive_queue.lock); | 526 | spin_lock(&sk->sk_receive_queue.lock); |
521 | po->stats.tp_packets++; | 527 | po->stats.tp_packets++; |
522 | __skb_queue_tail(&sk->sk_receive_queue, skb); | 528 | __skb_queue_tail(&sk->sk_receive_queue, skb); |
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 7bac249258e3..59d3e71f8b85 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
@@ -1,6 +1,43 @@ | |||
1 | # | 1 | # |
2 | # Traffic control configuration. | 2 | # Traffic control configuration. |
3 | # | 3 | # |
4 | |||
5 | menuconfig NET_SCHED | ||
6 | bool "QoS and/or fair queueing" | ||
7 | ---help--- | ||
8 | When the kernel has several packets to send out over a network | ||
9 | device, it has to decide which ones to send first, which ones to | ||
10 | delay, and which ones to drop. This is the job of the packet | ||
11 | scheduler, and several different algorithms for how to do this | ||
12 | "fairly" have been proposed. | ||
13 | |||
14 | If you say N here, you will get the standard packet scheduler, which | ||
15 | is a FIFO (first come, first served). If you say Y here, you will be | ||
16 | able to choose from among several alternative algorithms which can | ||
17 | then be attached to different network devices. This is useful for | ||
18 | example if some of your network devices are real time devices that | ||
19 | need a certain minimum data flow rate, or if you need to limit the | ||
20 | maximum data flow rate for traffic which matches specified criteria. | ||
21 | This code is considered to be experimental. | ||
22 | |||
23 | To administer these schedulers, you'll need the user-level utilities | ||
24 | from the package iproute2+tc at <ftp://ftp.tux.org/pub/net/ip-routing/>. | ||
25 | That package also contains some documentation; for more, check out | ||
26 | <http://snafu.freedom.org/linux2.2/iproute-notes.html>. | ||
27 | |||
28 | This Quality of Service (QoS) support will enable you to use | ||
29 | Differentiated Services (diffserv) and Resource Reservation Protocol | ||
30 | (RSVP) on your Linux router if you also say Y to "QoS support", | ||
31 | "Packet classifier API" and to some classifiers below. Documentation | ||
32 | and software is at <http://diffserv.sourceforge.net/>. | ||
33 | |||
34 | If you say Y here and to "/proc file system" below, you will be able | ||
35 | to read status information about packet schedulers from the file | ||
36 | /proc/net/psched. | ||
37 | |||
38 | The available schedulers are listed in the following questions; you | ||
39 | can say Y to as many as you like. If unsure, say N now. | ||
40 | |||
4 | choice | 41 | choice |
5 | prompt "Packet scheduler clock source" | 42 | prompt "Packet scheduler clock source" |
6 | depends on NET_SCHED | 43 | depends on NET_SCHED |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 4b47dd6f2485..5b24ae0650d3 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -71,7 +71,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
71 | const struct sctp_endpoint *ep, | 71 | const struct sctp_endpoint *ep, |
72 | const struct sock *sk, | 72 | const struct sock *sk, |
73 | sctp_scope_t scope, | 73 | sctp_scope_t scope, |
74 | int gfp) | 74 | unsigned int __nocast gfp) |
75 | { | 75 | { |
76 | struct sctp_sock *sp; | 76 | struct sctp_sock *sp; |
77 | int i; | 77 | int i; |
@@ -272,7 +272,8 @@ fail_init: | |||
272 | /* Allocate and initialize a new association */ | 272 | /* Allocate and initialize a new association */ |
273 | struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep, | 273 | struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep, |
274 | const struct sock *sk, | 274 | const struct sock *sk, |
275 | sctp_scope_t scope, int gfp) | 275 | sctp_scope_t scope, |
276 | unsigned int __nocast gfp) | ||
276 | { | 277 | { |
277 | struct sctp_association *asoc; | 278 | struct sctp_association *asoc; |
278 | 279 | ||
@@ -478,7 +479,7 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc, | |||
478 | /* Add a transport address to an association. */ | 479 | /* Add a transport address to an association. */ |
479 | struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, | 480 | struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, |
480 | const union sctp_addr *addr, | 481 | const union sctp_addr *addr, |
481 | const int gfp, | 482 | const unsigned int __nocast gfp, |
482 | const int peer_state) | 483 | const int peer_state) |
483 | { | 484 | { |
484 | struct sctp_transport *peer; | 485 | struct sctp_transport *peer; |
@@ -1229,7 +1230,8 @@ void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned len) | |||
1229 | /* Build the bind address list for the association based on info from the | 1230 | /* Build the bind address list for the association based on info from the |
1230 | * local endpoint and the remote peer. | 1231 | * local endpoint and the remote peer. |
1231 | */ | 1232 | */ |
1232 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, int gfp) | 1233 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, |
1234 | unsigned int __nocast gfp) | ||
1233 | { | 1235 | { |
1234 | sctp_scope_t scope; | 1236 | sctp_scope_t scope; |
1235 | int flags; | 1237 | int flags; |
@@ -1251,7 +1253,8 @@ int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, int gfp) | |||
1251 | 1253 | ||
1252 | /* Build the association's bind address list from the cookie. */ | 1254 | /* Build the association's bind address list from the cookie. */ |
1253 | int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc, | 1255 | int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc, |
1254 | struct sctp_cookie *cookie, int gfp) | 1256 | struct sctp_cookie *cookie, |
1257 | unsigned int __nocast gfp) | ||
1255 | { | 1258 | { |
1256 | int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length); | 1259 | int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length); |
1257 | int var_size3 = cookie->raw_addr_list_len; | 1260 | int var_size3 = cookie->raw_addr_list_len; |
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index f90eadfb60a2..f71549710f2e 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -53,7 +53,8 @@ | |||
53 | 53 | ||
54 | /* Forward declarations for internal helpers. */ | 54 | /* Forward declarations for internal helpers. */ |
55 | static int sctp_copy_one_addr(struct sctp_bind_addr *, union sctp_addr *, | 55 | static int sctp_copy_one_addr(struct sctp_bind_addr *, union sctp_addr *, |
56 | sctp_scope_t scope, int gfp, int flags); | 56 | sctp_scope_t scope, unsigned int __nocast gfp, |
57 | int flags); | ||
57 | static void sctp_bind_addr_clean(struct sctp_bind_addr *); | 58 | static void sctp_bind_addr_clean(struct sctp_bind_addr *); |
58 | 59 | ||
59 | /* First Level Abstractions. */ | 60 | /* First Level Abstractions. */ |
@@ -63,7 +64,8 @@ static void sctp_bind_addr_clean(struct sctp_bind_addr *); | |||
63 | */ | 64 | */ |
64 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, | 65 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, |
65 | const struct sctp_bind_addr *src, | 66 | const struct sctp_bind_addr *src, |
66 | sctp_scope_t scope, int gfp, int flags) | 67 | sctp_scope_t scope, unsigned int __nocast gfp, |
68 | int flags) | ||
67 | { | 69 | { |
68 | struct sctp_sockaddr_entry *addr; | 70 | struct sctp_sockaddr_entry *addr; |
69 | struct list_head *pos; | 71 | struct list_head *pos; |
@@ -144,7 +146,7 @@ void sctp_bind_addr_free(struct sctp_bind_addr *bp) | |||
144 | 146 | ||
145 | /* Add an address to the bind address list in the SCTP_bind_addr structure. */ | 147 | /* Add an address to the bind address list in the SCTP_bind_addr structure. */ |
146 | int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, | 148 | int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, |
147 | int gfp) | 149 | unsigned int __nocast gfp) |
148 | { | 150 | { |
149 | struct sctp_sockaddr_entry *addr; | 151 | struct sctp_sockaddr_entry *addr; |
150 | 152 | ||
@@ -197,7 +199,8 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr) | |||
197 | * The second argument is the return value for the length. | 199 | * The second argument is the return value for the length. |
198 | */ | 200 | */ |
199 | union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, | 201 | union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, |
200 | int *addrs_len, int gfp) | 202 | int *addrs_len, |
203 | unsigned int __nocast gfp) | ||
201 | { | 204 | { |
202 | union sctp_params addrparms; | 205 | union sctp_params addrparms; |
203 | union sctp_params retval; | 206 | union sctp_params retval; |
@@ -249,7 +252,7 @@ end_raw: | |||
249 | * address parameters). | 252 | * address parameters). |
250 | */ | 253 | */ |
251 | int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, | 254 | int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, |
252 | int addrs_len, __u16 port, int gfp) | 255 | int addrs_len, __u16 port, unsigned int __nocast gfp) |
253 | { | 256 | { |
254 | union sctp_addr_param *rawaddr; | 257 | union sctp_addr_param *rawaddr; |
255 | struct sctp_paramhdr *param; | 258 | struct sctp_paramhdr *param; |
@@ -347,7 +350,8 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, | |||
347 | /* Copy out addresses from the global local address list. */ | 350 | /* Copy out addresses from the global local address list. */ |
348 | static int sctp_copy_one_addr(struct sctp_bind_addr *dest, | 351 | static int sctp_copy_one_addr(struct sctp_bind_addr *dest, |
349 | union sctp_addr *addr, | 352 | union sctp_addr *addr, |
350 | sctp_scope_t scope, int gfp, int flags) | 353 | sctp_scope_t scope, unsigned int __nocast gfp, |
354 | int flags) | ||
351 | { | 355 | { |
352 | int error = 0; | 356 | int error = 0; |
353 | 357 | ||
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c index 0c2ab7885058..61da2937e641 100644 --- a/net/sctp/chunk.c +++ b/net/sctp/chunk.c | |||
@@ -62,7 +62,7 @@ static void sctp_datamsg_init(struct sctp_datamsg *msg) | |||
62 | } | 62 | } |
63 | 63 | ||
64 | /* Allocate and initialize datamsg. */ | 64 | /* Allocate and initialize datamsg. */ |
65 | SCTP_STATIC struct sctp_datamsg *sctp_datamsg_new(int gfp) | 65 | SCTP_STATIC struct sctp_datamsg *sctp_datamsg_new(unsigned int __nocast gfp) |
66 | { | 66 | { |
67 | struct sctp_datamsg *msg; | 67 | struct sctp_datamsg *msg; |
68 | msg = kmalloc(sizeof(struct sctp_datamsg), gfp); | 68 | msg = kmalloc(sizeof(struct sctp_datamsg), gfp); |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index c44bf4165c6e..e47ac0d1a6d6 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
@@ -67,7 +67,8 @@ static void sctp_endpoint_bh_rcv(struct sctp_endpoint *ep); | |||
67 | * Initialize the base fields of the endpoint structure. | 67 | * Initialize the base fields of the endpoint structure. |
68 | */ | 68 | */ |
69 | static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | 69 | static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, |
70 | struct sock *sk, int gfp) | 70 | struct sock *sk, |
71 | unsigned int __nocast gfp) | ||
71 | { | 72 | { |
72 | struct sctp_sock *sp = sctp_sk(sk); | 73 | struct sctp_sock *sp = sctp_sk(sk); |
73 | memset(ep, 0, sizeof(struct sctp_endpoint)); | 74 | memset(ep, 0, sizeof(struct sctp_endpoint)); |
@@ -137,7 +138,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
137 | /* Create a sctp_endpoint with all that boring stuff initialized. | 138 | /* Create a sctp_endpoint with all that boring stuff initialized. |
138 | * Returns NULL if there isn't enough memory. | 139 | * Returns NULL if there isn't enough memory. |
139 | */ | 140 | */ |
140 | struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, int gfp) | 141 | struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, |
142 | unsigned int __nocast gfp) | ||
141 | { | 143 | { |
142 | struct sctp_endpoint *ep; | 144 | struct sctp_endpoint *ep; |
143 | 145 | ||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index e7f37faba7c0..ce9245e71fca 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -219,7 +219,7 @@ static void sctp_free_local_addr_list(void) | |||
219 | 219 | ||
220 | /* Copy the local addresses which are valid for 'scope' into 'bp'. */ | 220 | /* Copy the local addresses which are valid for 'scope' into 'bp'. */ |
221 | int sctp_copy_local_addr_list(struct sctp_bind_addr *bp, sctp_scope_t scope, | 221 | int sctp_copy_local_addr_list(struct sctp_bind_addr *bp, sctp_scope_t scope, |
222 | int gfp, int copy_flags) | 222 | unsigned int __nocast gfp, int copy_flags) |
223 | { | 223 | { |
224 | struct sctp_sockaddr_entry *addr; | 224 | struct sctp_sockaddr_entry *addr; |
225 | int error = 0; | 225 | int error = 0; |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 773cd93fa3d0..00d32b7c8266 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -78,7 +78,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
78 | static int sctp_process_param(struct sctp_association *asoc, | 78 | static int sctp_process_param(struct sctp_association *asoc, |
79 | union sctp_params param, | 79 | union sctp_params param, |
80 | const union sctp_addr *peer_addr, | 80 | const union sctp_addr *peer_addr, |
81 | int gfp); | 81 | unsigned int __nocast gfp); |
82 | 82 | ||
83 | /* What was the inbound interface for this chunk? */ | 83 | /* What was the inbound interface for this chunk? */ |
84 | int sctp_chunk_iif(const struct sctp_chunk *chunk) | 84 | int sctp_chunk_iif(const struct sctp_chunk *chunk) |
@@ -174,7 +174,7 @@ void sctp_init_cause(struct sctp_chunk *chunk, __u16 cause_code, | |||
174 | */ | 174 | */ |
175 | struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | 175 | struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, |
176 | const struct sctp_bind_addr *bp, | 176 | const struct sctp_bind_addr *bp, |
177 | int gfp, int vparam_len) | 177 | unsigned int __nocast gfp, int vparam_len) |
178 | { | 178 | { |
179 | sctp_inithdr_t init; | 179 | sctp_inithdr_t init; |
180 | union sctp_params addrs; | 180 | union sctp_params addrs; |
@@ -261,7 +261,7 @@ nodata: | |||
261 | 261 | ||
262 | struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | 262 | struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, |
263 | const struct sctp_chunk *chunk, | 263 | const struct sctp_chunk *chunk, |
264 | int gfp, int unkparam_len) | 264 | unsigned int __nocast gfp, int unkparam_len) |
265 | { | 265 | { |
266 | sctp_inithdr_t initack; | 266 | sctp_inithdr_t initack; |
267 | struct sctp_chunk *retval; | 267 | struct sctp_chunk *retval; |
@@ -1233,7 +1233,8 @@ void sctp_chunk_assign_tsn(struct sctp_chunk *chunk) | |||
1233 | 1233 | ||
1234 | /* Create a CLOSED association to use with an incoming packet. */ | 1234 | /* Create a CLOSED association to use with an incoming packet. */ |
1235 | struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep, | 1235 | struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep, |
1236 | struct sctp_chunk *chunk, int gfp) | 1236 | struct sctp_chunk *chunk, |
1237 | unsigned int __nocast gfp) | ||
1237 | { | 1238 | { |
1238 | struct sctp_association *asoc; | 1239 | struct sctp_association *asoc; |
1239 | struct sk_buff *skb; | 1240 | struct sk_buff *skb; |
@@ -1348,7 +1349,7 @@ nodata: | |||
1348 | struct sctp_association *sctp_unpack_cookie( | 1349 | struct sctp_association *sctp_unpack_cookie( |
1349 | const struct sctp_endpoint *ep, | 1350 | const struct sctp_endpoint *ep, |
1350 | const struct sctp_association *asoc, | 1351 | const struct sctp_association *asoc, |
1351 | struct sctp_chunk *chunk, int gfp, | 1352 | struct sctp_chunk *chunk, unsigned int __nocast gfp, |
1352 | int *error, struct sctp_chunk **errp) | 1353 | int *error, struct sctp_chunk **errp) |
1353 | { | 1354 | { |
1354 | struct sctp_association *retval = NULL; | 1355 | struct sctp_association *retval = NULL; |
@@ -1812,7 +1813,7 @@ int sctp_verify_init(const struct sctp_association *asoc, | |||
1812 | */ | 1813 | */ |
1813 | int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid, | 1814 | int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid, |
1814 | const union sctp_addr *peer_addr, | 1815 | const union sctp_addr *peer_addr, |
1815 | sctp_init_chunk_t *peer_init, int gfp) | 1816 | sctp_init_chunk_t *peer_init, unsigned int __nocast gfp) |
1816 | { | 1817 | { |
1817 | union sctp_params param; | 1818 | union sctp_params param; |
1818 | struct sctp_transport *transport; | 1819 | struct sctp_transport *transport; |
@@ -1983,7 +1984,7 @@ nomem: | |||
1983 | static int sctp_process_param(struct sctp_association *asoc, | 1984 | static int sctp_process_param(struct sctp_association *asoc, |
1984 | union sctp_params param, | 1985 | union sctp_params param, |
1985 | const union sctp_addr *peer_addr, | 1986 | const union sctp_addr *peer_addr, |
1986 | int gfp) | 1987 | unsigned int __nocast gfp) |
1987 | { | 1988 | { |
1988 | union sctp_addr addr; | 1989 | union sctp_addr addr; |
1989 | int i; | 1990 | int i; |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 778639db125a..39c970b5b198 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -63,7 +63,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
63 | void *event_arg, | 63 | void *event_arg, |
64 | sctp_disposition_t status, | 64 | sctp_disposition_t status, |
65 | sctp_cmd_seq_t *commands, | 65 | sctp_cmd_seq_t *commands, |
66 | int gfp); | 66 | unsigned int __nocast gfp); |
67 | static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | 67 | static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, |
68 | sctp_state_t state, | 68 | sctp_state_t state, |
69 | struct sctp_endpoint *ep, | 69 | struct sctp_endpoint *ep, |
@@ -71,7 +71,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | |||
71 | void *event_arg, | 71 | void *event_arg, |
72 | sctp_disposition_t status, | 72 | sctp_disposition_t status, |
73 | sctp_cmd_seq_t *commands, | 73 | sctp_cmd_seq_t *commands, |
74 | int gfp); | 74 | unsigned int __nocast gfp); |
75 | 75 | ||
76 | /******************************************************************** | 76 | /******************************************************************** |
77 | * Helper functions | 77 | * Helper functions |
@@ -497,7 +497,8 @@ static void sctp_cmd_assoc_failed(sctp_cmd_seq_t *commands, | |||
497 | static int sctp_cmd_process_init(sctp_cmd_seq_t *commands, | 497 | static int sctp_cmd_process_init(sctp_cmd_seq_t *commands, |
498 | struct sctp_association *asoc, | 498 | struct sctp_association *asoc, |
499 | struct sctp_chunk *chunk, | 499 | struct sctp_chunk *chunk, |
500 | sctp_init_chunk_t *peer_init, int gfp) | 500 | sctp_init_chunk_t *peer_init, |
501 | unsigned int __nocast gfp) | ||
501 | { | 502 | { |
502 | int error; | 503 | int error; |
503 | 504 | ||
@@ -852,7 +853,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, | |||
852 | struct sctp_endpoint *ep, | 853 | struct sctp_endpoint *ep, |
853 | struct sctp_association *asoc, | 854 | struct sctp_association *asoc, |
854 | void *event_arg, | 855 | void *event_arg, |
855 | int gfp) | 856 | unsigned int __nocast gfp) |
856 | { | 857 | { |
857 | sctp_cmd_seq_t commands; | 858 | sctp_cmd_seq_t commands; |
858 | const sctp_sm_table_entry_t *state_fn; | 859 | const sctp_sm_table_entry_t *state_fn; |
@@ -897,7 +898,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | |||
897 | void *event_arg, | 898 | void *event_arg, |
898 | sctp_disposition_t status, | 899 | sctp_disposition_t status, |
899 | sctp_cmd_seq_t *commands, | 900 | sctp_cmd_seq_t *commands, |
900 | int gfp) | 901 | unsigned int __nocast gfp) |
901 | { | 902 | { |
902 | int error; | 903 | int error; |
903 | 904 | ||
@@ -985,7 +986,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
985 | void *event_arg, | 986 | void *event_arg, |
986 | sctp_disposition_t status, | 987 | sctp_disposition_t status, |
987 | sctp_cmd_seq_t *commands, | 988 | sctp_cmd_seq_t *commands, |
988 | int gfp) | 989 | unsigned int __nocast gfp) |
989 | { | 990 | { |
990 | int error = 0; | 991 | int error = 0; |
991 | int force; | 992 | int force; |
diff --git a/net/sctp/ssnmap.c b/net/sctp/ssnmap.c index e627d2b451b6..25037daf3fa0 100644 --- a/net/sctp/ssnmap.c +++ b/net/sctp/ssnmap.c | |||
@@ -57,7 +57,8 @@ static inline size_t sctp_ssnmap_size(__u16 in, __u16 out) | |||
57 | /* Create a new sctp_ssnmap. | 57 | /* Create a new sctp_ssnmap. |
58 | * Allocate room to store at least 'len' contiguous TSNs. | 58 | * Allocate room to store at least 'len' contiguous TSNs. |
59 | */ | 59 | */ |
60 | struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp) | 60 | struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, |
61 | unsigned int __nocast gfp) | ||
61 | { | 62 | { |
62 | struct sctp_ssnmap *retval; | 63 | struct sctp_ssnmap *retval; |
63 | int size; | 64 | int size; |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index a63b69179607..d2f04ebe5081 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -57,7 +57,7 @@ | |||
57 | /* Initialize a new transport from provided memory. */ | 57 | /* Initialize a new transport from provided memory. */ |
58 | static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | 58 | static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, |
59 | const union sctp_addr *addr, | 59 | const union sctp_addr *addr, |
60 | int gfp) | 60 | unsigned int __nocast gfp) |
61 | { | 61 | { |
62 | /* Copy in the address. */ | 62 | /* Copy in the address. */ |
63 | peer->ipaddr = *addr; | 63 | peer->ipaddr = *addr; |
@@ -121,7 +121,8 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
121 | } | 121 | } |
122 | 122 | ||
123 | /* Allocate and initialize a new transport. */ | 123 | /* Allocate and initialize a new transport. */ |
124 | struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, int gfp) | 124 | struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, |
125 | unsigned int __nocast gfp) | ||
125 | { | 126 | { |
126 | struct sctp_transport *transport; | 127 | struct sctp_transport *transport; |
127 | 128 | ||
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index 17d0ff534735..0abd5101107c 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
@@ -74,7 +74,7 @@ SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) | |||
74 | 74 | ||
75 | /* Create a new sctp_ulpevent. */ | 75 | /* Create a new sctp_ulpevent. */ |
76 | SCTP_STATIC struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, | 76 | SCTP_STATIC struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, |
77 | int gfp) | 77 | unsigned int __nocast gfp) |
78 | { | 78 | { |
79 | struct sctp_ulpevent *event; | 79 | struct sctp_ulpevent *event; |
80 | struct sk_buff *skb; | 80 | struct sk_buff *skb; |
@@ -136,7 +136,7 @@ static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event) | |||
136 | struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( | 136 | struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( |
137 | const struct sctp_association *asoc, | 137 | const struct sctp_association *asoc, |
138 | __u16 flags, __u16 state, __u16 error, __u16 outbound, | 138 | __u16 flags, __u16 state, __u16 error, __u16 outbound, |
139 | __u16 inbound, int gfp) | 139 | __u16 inbound, unsigned int __nocast gfp) |
140 | { | 140 | { |
141 | struct sctp_ulpevent *event; | 141 | struct sctp_ulpevent *event; |
142 | struct sctp_assoc_change *sac; | 142 | struct sctp_assoc_change *sac; |
@@ -237,7 +237,7 @@ fail: | |||
237 | struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( | 237 | struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( |
238 | const struct sctp_association *asoc, | 238 | const struct sctp_association *asoc, |
239 | const struct sockaddr_storage *aaddr, | 239 | const struct sockaddr_storage *aaddr, |
240 | int flags, int state, int error, int gfp) | 240 | int flags, int state, int error, unsigned int __nocast gfp) |
241 | { | 241 | { |
242 | struct sctp_ulpevent *event; | 242 | struct sctp_ulpevent *event; |
243 | struct sctp_paddr_change *spc; | 243 | struct sctp_paddr_change *spc; |
@@ -350,7 +350,7 @@ fail: | |||
350 | */ | 350 | */ |
351 | struct sctp_ulpevent *sctp_ulpevent_make_remote_error( | 351 | struct sctp_ulpevent *sctp_ulpevent_make_remote_error( |
352 | const struct sctp_association *asoc, struct sctp_chunk *chunk, | 352 | const struct sctp_association *asoc, struct sctp_chunk *chunk, |
353 | __u16 flags, int gfp) | 353 | __u16 flags, unsigned int __nocast gfp) |
354 | { | 354 | { |
355 | struct sctp_ulpevent *event; | 355 | struct sctp_ulpevent *event; |
356 | struct sctp_remote_error *sre; | 356 | struct sctp_remote_error *sre; |
@@ -448,7 +448,7 @@ fail: | |||
448 | */ | 448 | */ |
449 | struct sctp_ulpevent *sctp_ulpevent_make_send_failed( | 449 | struct sctp_ulpevent *sctp_ulpevent_make_send_failed( |
450 | const struct sctp_association *asoc, struct sctp_chunk *chunk, | 450 | const struct sctp_association *asoc, struct sctp_chunk *chunk, |
451 | __u16 flags, __u32 error, int gfp) | 451 | __u16 flags, __u32 error, unsigned int __nocast gfp) |
452 | { | 452 | { |
453 | struct sctp_ulpevent *event; | 453 | struct sctp_ulpevent *event; |
454 | struct sctp_send_failed *ssf; | 454 | struct sctp_send_failed *ssf; |
@@ -557,7 +557,7 @@ fail: | |||
557 | */ | 557 | */ |
558 | struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( | 558 | struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( |
559 | const struct sctp_association *asoc, | 559 | const struct sctp_association *asoc, |
560 | __u16 flags, int gfp) | 560 | __u16 flags, unsigned int __nocast gfp) |
561 | { | 561 | { |
562 | struct sctp_ulpevent *event; | 562 | struct sctp_ulpevent *event; |
563 | struct sctp_shutdown_event *sse; | 563 | struct sctp_shutdown_event *sse; |
@@ -620,7 +620,7 @@ fail: | |||
620 | * 5.3.1.6 SCTP_ADAPTION_INDICATION | 620 | * 5.3.1.6 SCTP_ADAPTION_INDICATION |
621 | */ | 621 | */ |
622 | struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication( | 622 | struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication( |
623 | const struct sctp_association *asoc, int gfp) | 623 | const struct sctp_association *asoc, unsigned int __nocast gfp) |
624 | { | 624 | { |
625 | struct sctp_ulpevent *event; | 625 | struct sctp_ulpevent *event; |
626 | struct sctp_adaption_event *sai; | 626 | struct sctp_adaption_event *sai; |
@@ -657,7 +657,7 @@ fail: | |||
657 | */ | 657 | */ |
658 | struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, | 658 | struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, |
659 | struct sctp_chunk *chunk, | 659 | struct sctp_chunk *chunk, |
660 | int gfp) | 660 | unsigned int __nocast gfp) |
661 | { | 661 | { |
662 | struct sctp_ulpevent *event = NULL; | 662 | struct sctp_ulpevent *event = NULL; |
663 | struct sk_buff *skb; | 663 | struct sk_buff *skb; |
@@ -718,7 +718,8 @@ fail: | |||
718 | * various events. | 718 | * various events. |
719 | */ | 719 | */ |
720 | struct sctp_ulpevent *sctp_ulpevent_make_pdapi( | 720 | struct sctp_ulpevent *sctp_ulpevent_make_pdapi( |
721 | const struct sctp_association *asoc, __u32 indication, int gfp) | 721 | const struct sctp_association *asoc, __u32 indication, |
722 | unsigned int __nocast gfp) | ||
722 | { | 723 | { |
723 | struct sctp_ulpevent *event; | 724 | struct sctp_ulpevent *event; |
724 | struct sctp_pdapi_event *pd; | 725 | struct sctp_pdapi_event *pd; |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index d5dd2cf7ac4a..8bbc279d6c99 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
@@ -100,7 +100,7 @@ void sctp_ulpq_free(struct sctp_ulpq *ulpq) | |||
100 | 100 | ||
101 | /* Process an incoming DATA chunk. */ | 101 | /* Process an incoming DATA chunk. */ |
102 | int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | 102 | int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, |
103 | int gfp) | 103 | unsigned int __nocast gfp) |
104 | { | 104 | { |
105 | struct sk_buff_head temp; | 105 | struct sk_buff_head temp; |
106 | sctp_data_chunk_t *hdr; | 106 | sctp_data_chunk_t *hdr; |
@@ -778,7 +778,8 @@ static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed) | |||
778 | 778 | ||
779 | /* Partial deliver the first message as there is pressure on rwnd. */ | 779 | /* Partial deliver the first message as there is pressure on rwnd. */ |
780 | void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, | 780 | void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, |
781 | struct sctp_chunk *chunk, int gfp) | 781 | struct sctp_chunk *chunk, |
782 | unsigned int __nocast gfp) | ||
782 | { | 783 | { |
783 | struct sctp_ulpevent *event; | 784 | struct sctp_ulpevent *event; |
784 | struct sctp_association *asoc; | 785 | struct sctp_association *asoc; |
@@ -802,7 +803,7 @@ void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, | |||
802 | 803 | ||
803 | /* Renege some packets to make room for an incoming chunk. */ | 804 | /* Renege some packets to make room for an incoming chunk. */ |
804 | void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | 805 | void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, |
805 | int gfp) | 806 | unsigned int __nocast gfp) |
806 | { | 807 | { |
807 | struct sctp_association *asoc; | 808 | struct sctp_association *asoc; |
808 | __u16 needed, freed; | 809 | __u16 needed, freed; |
@@ -841,7 +842,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
841 | /* Notify the application if an association is aborted and in | 842 | /* Notify the application if an association is aborted and in |
842 | * partial delivery mode. Send up any pending received messages. | 843 | * partial delivery mode. Send up any pending received messages. |
843 | */ | 844 | */ |
844 | void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, int gfp) | 845 | void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, unsigned int __nocast gfp) |
845 | { | 846 | { |
846 | struct sctp_ulpevent *ev = NULL; | 847 | struct sctp_ulpevent *ev = NULL; |
847 | struct sock *sk; | 848 | struct sock *sk; |
diff --git a/net/unix/Kconfig b/net/unix/Kconfig new file mode 100644 index 000000000000..5a69733bcdad --- /dev/null +++ b/net/unix/Kconfig | |||
@@ -0,0 +1,21 @@ | |||
1 | # | ||
2 | # Unix Domain Sockets | ||
3 | # | ||
4 | |||
5 | config UNIX | ||
6 | tristate "Unix domain sockets" | ||
7 | ---help--- | ||
8 | If you say Y here, you will include support for Unix domain sockets; | ||
9 | sockets are the standard Unix mechanism for establishing and | ||
10 | accessing network connections. Many commonly used programs such as | ||
11 | the X Window system and syslog use these sockets even if your | ||
12 | machine is not connected to any network. Unless you are working on | ||
13 | an embedded system or something similar, you therefore definitely | ||
14 | want to say Y here. | ||
15 | |||
16 | To compile this driver as a module, choose M here: the module will be | ||
17 | called unix. Note that several important services won't work | ||
18 | correctly if you say M here and then neglect to load the module. | ||
19 | |||
20 | Say Y unless you know what you are doing. | ||
21 | |||
diff --git a/net/wanrouter/Kconfig b/net/wanrouter/Kconfig new file mode 100644 index 000000000000..1debe1cb054e --- /dev/null +++ b/net/wanrouter/Kconfig | |||
@@ -0,0 +1,29 @@ | |||
1 | # | ||
2 | # Configuration for WAN router | ||
3 | # | ||
4 | |||
5 | config WAN_ROUTER | ||
6 | tristate "WAN router" | ||
7 | depends on EXPERIMENTAL | ||
8 | ---help--- | ||
9 | Wide Area Networks (WANs), such as X.25, frame relay and leased | ||
10 | lines, are used to interconnect Local Area Networks (LANs) over vast | ||
11 | distances with data transfer rates significantly higher than those | ||
12 | achievable with commonly used asynchronous modem connections. | ||
13 | Usually, a quite expensive external device called a `WAN router' is | ||
14 | needed to connect to a WAN. | ||
15 | |||
16 | As an alternative, WAN routing can be built into the Linux kernel. | ||
17 | With relatively inexpensive WAN interface cards available on the | ||
18 | market, a perfectly usable router can be built for less than half | ||
19 | the price of an external router. If you have one of those cards and | ||
20 | wish to use your Linux box as a WAN router, say Y here and also to | ||
21 | the WAN driver for your card, below. You will then need the | ||
22 | wan-tools package which is available from <ftp://ftp.sangoma.com/>. | ||
23 | Read <file:Documentation/networking/wan-router.txt> for more | ||
24 | information. | ||
25 | |||
26 | To compile WAN routing support as a module, choose M here: the | ||
27 | module will be called wanrouter. | ||
28 | |||
29 | If unsure, say N. | ||
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c index d6844ac226f5..13b650ad22e2 100644 --- a/net/wanrouter/wanmain.c +++ b/net/wanrouter/wanmain.c | |||
@@ -358,10 +358,10 @@ int wanrouter_encapsulate(struct sk_buff *skb, struct net_device *dev, | |||
358 | */ | 358 | */ |
359 | 359 | ||
360 | 360 | ||
361 | unsigned short wanrouter_type_trans(struct sk_buff *skb, struct net_device *dev) | 361 | __be16 wanrouter_type_trans(struct sk_buff *skb, struct net_device *dev) |
362 | { | 362 | { |
363 | int cnt = skb->data[0] ? 0 : 1; /* there may be a pad present */ | 363 | int cnt = skb->data[0] ? 0 : 1; /* there may be a pad present */ |
364 | unsigned short ethertype; | 364 | __be16 ethertype; |
365 | 365 | ||
366 | switch (skb->data[cnt]) { | 366 | switch (skb->data[cnt]) { |
367 | case NLPID_IP: /* IP datagramm */ | 367 | case NLPID_IP: /* IP datagramm */ |
@@ -379,7 +379,7 @@ unsigned short wanrouter_type_trans(struct sk_buff *skb, struct net_device *dev) | |||
379 | skb->data[cnt+3], dev->name); | 379 | skb->data[cnt+3], dev->name); |
380 | return 0; | 380 | return 0; |
381 | } | 381 | } |
382 | ethertype = *((unsigned short*)&skb->data[cnt+4]); | 382 | ethertype = *((__be16*)&skb->data[cnt+4]); |
383 | cnt += 6; | 383 | cnt += 6; |
384 | break; | 384 | break; |
385 | 385 | ||
diff --git a/net/x25/Kconfig b/net/x25/Kconfig new file mode 100644 index 000000000000..e6759c9660bb --- /dev/null +++ b/net/x25/Kconfig | |||
@@ -0,0 +1,36 @@ | |||
1 | # | ||
2 | # CCITT X.25 Packet Layer | ||
3 | # | ||
4 | |||
5 | config X25 | ||
6 | tristate "CCITT X.25 Packet Layer (EXPERIMENTAL)" | ||
7 | depends on EXPERIMENTAL | ||
8 | ---help--- | ||
9 | X.25 is a set of standardized network protocols, similar in scope to | ||
10 | frame relay; the one physical line from your box to the X.25 network | ||
11 | entry point can carry several logical point-to-point connections | ||
12 | (called "virtual circuits") to other computers connected to the X.25 | ||
13 | network. Governments, banks, and other organizations tend to use it | ||
14 | to connect to each other or to form Wide Area Networks (WANs). Many | ||
15 | countries have public X.25 networks. X.25 consists of two | ||
16 | protocols: the higher level Packet Layer Protocol (PLP) (say Y here | ||
17 | if you want that) and the lower level data link layer protocol LAPB | ||
18 | (say Y to "LAPB Data Link Driver" below if you want that). | ||
19 | |||
20 | You can read more about X.25 at <http://www.sangoma.com/x25.htm> and | ||
21 | <http://www.cisco.com/univercd/cc/td/doc/product/software/ios11/cbook/cx25.htm>. | ||
22 | Information about X.25 for Linux is contained in the files | ||
23 | <file:Documentation/networking/x25.txt> and | ||
24 | <file:Documentation/networking/x25-iface.txt>. | ||
25 | |||
26 | One connects to an X.25 network either with a dedicated network card | ||
27 | using the X.21 protocol (not yet supported by Linux) or one can do | ||
28 | X.25 over a standard telephone line using an ordinary modem (say Y | ||
29 | to "X.25 async driver" below) or over Ethernet using an ordinary | ||
30 | Ethernet card and the LAPB over Ethernet (say Y to "LAPB Data Link | ||
31 | Driver" and "LAPB over Ethernet driver" below). | ||
32 | |||
33 | To compile this driver as a module, choose M here: the module | ||
34 | will be called x25. If unsure, say N. | ||
35 | |||
36 | |||
diff --git a/net/xfrm/Kconfig b/net/xfrm/Kconfig index 58ca6a972c48..0c1c04322baf 100644 --- a/net/xfrm/Kconfig +++ b/net/xfrm/Kconfig | |||
@@ -1,6 +1,10 @@ | |||
1 | # | 1 | # |
2 | # XFRM configuration | 2 | # XFRM configuration |
3 | # | 3 | # |
4 | config XFRM | ||
5 | bool | ||
6 | depends on NET | ||
7 | |||
4 | config XFRM_USER | 8 | config XFRM_USER |
5 | tristate "IPsec user configuration interface" | 9 | tristate "IPsec user configuration interface" |
6 | depends on INET && XFRM | 10 | depends on INET && XFRM |
@@ -10,3 +14,14 @@ config XFRM_USER | |||
10 | 14 | ||
11 | If unsure, say Y. | 15 | If unsure, say Y. |
12 | 16 | ||
17 | config NET_KEY | ||
18 | tristate "PF_KEY sockets" | ||
19 | select XFRM | ||
20 | ---help--- | ||
21 | PF_KEYv2 socket family, compatible to KAME ones. | ||
22 | They are required if you are going to use IPsec tools ported | ||
23 | from KAME. | ||
24 | |||
25 | Say Y unless you know what you are doing. | ||
26 | |||
27 | |||