0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/kernel.h>
0010 #include <linux/errno.h>
0011 #include <linux/slab.h>
0012 #include <linux/tty.h>
0013 #include <linux/tty_driver.h>
0014 #include <linux/tty_flip.h>
0015 #include <linux/module.h>
0016 #include <linux/spinlock.h>
0017 #include <linux/uaccess.h>
0018 #include <linux/usb.h>
0019 #include <linux/usb/serial.h>
0020
0021 #define KP_RETRIES 100
0022
0023 #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
0024 #define DRIVER_DESC "USB PocketPC PDA driver"
0025
0026 static int connect_retries = KP_RETRIES;
0027 static int initial_wait;
0028
0029
0030 static int ipaq_open(struct tty_struct *tty,
0031 struct usb_serial_port *port);
0032 static int ipaq_calc_num_ports(struct usb_serial *serial,
0033 struct usb_serial_endpoints *epds);
0034 static int ipaq_startup(struct usb_serial *serial);
0035
0036 static const struct usb_device_id ipaq_id_table[] = {
0037 { USB_DEVICE(0x0104, 0x00BE) },
0038 { USB_DEVICE(0x03F0, 0x1016) },
0039 { USB_DEVICE(0x03F0, 0x1116) },
0040 { USB_DEVICE(0x03F0, 0x1216) },
0041 { USB_DEVICE(0x03F0, 0x2016) },
0042 { USB_DEVICE(0x03F0, 0x2116) },
0043 { USB_DEVICE(0x03F0, 0x2216) },
0044 { USB_DEVICE(0x03F0, 0x3016) },
0045 { USB_DEVICE(0x03F0, 0x3116) },
0046 { USB_DEVICE(0x03F0, 0x3216) },
0047 { USB_DEVICE(0x03F0, 0x4016) },
0048 { USB_DEVICE(0x03F0, 0x4116) },
0049 { USB_DEVICE(0x03F0, 0x4216) },
0050 { USB_DEVICE(0x03F0, 0x5016) },
0051 { USB_DEVICE(0x03F0, 0x5116) },
0052 { USB_DEVICE(0x03F0, 0x5216) },
0053 { USB_DEVICE(0x0409, 0x00D5) },
0054 { USB_DEVICE(0x0409, 0x00D6) },
0055 { USB_DEVICE(0x0409, 0x00D7) },
0056 { USB_DEVICE(0x0409, 0x8024) },
0057 { USB_DEVICE(0x0409, 0x8025) },
0058 { USB_DEVICE(0x043E, 0x9C01) },
0059 { USB_DEVICE(0x045E, 0x00CE) },
0060 { USB_DEVICE(0x045E, 0x0400) },
0061 { USB_DEVICE(0x045E, 0x0401) },
0062 { USB_DEVICE(0x045E, 0x0402) },
0063 { USB_DEVICE(0x045E, 0x0403) },
0064 { USB_DEVICE(0x045E, 0x0404) },
0065 { USB_DEVICE(0x045E, 0x0405) },
0066 { USB_DEVICE(0x045E, 0x0406) },
0067 { USB_DEVICE(0x045E, 0x0407) },
0068 { USB_DEVICE(0x045E, 0x0408) },
0069 { USB_DEVICE(0x045E, 0x0409) },
0070 { USB_DEVICE(0x045E, 0x040A) },
0071 { USB_DEVICE(0x045E, 0x040B) },
0072 { USB_DEVICE(0x045E, 0x040C) },
0073 { USB_DEVICE(0x045E, 0x040D) },
0074 { USB_DEVICE(0x045E, 0x040E) },
0075 { USB_DEVICE(0x045E, 0x040F) },
0076 { USB_DEVICE(0x045E, 0x0410) },
0077 { USB_DEVICE(0x045E, 0x0411) },
0078 { USB_DEVICE(0x045E, 0x0412) },
0079 { USB_DEVICE(0x045E, 0x0413) },
0080 { USB_DEVICE(0x045E, 0x0414) },
0081 { USB_DEVICE(0x045E, 0x0415) },
0082 { USB_DEVICE(0x045E, 0x0416) },
0083 { USB_DEVICE(0x045E, 0x0417) },
0084 { USB_DEVICE(0x045E, 0x0432) },
0085 { USB_DEVICE(0x045E, 0x0433) },
0086 { USB_DEVICE(0x045E, 0x0434) },
0087 { USB_DEVICE(0x045E, 0x0435) },
0088 { USB_DEVICE(0x045E, 0x0436) },
0089 { USB_DEVICE(0x045E, 0x0437) },
0090 { USB_DEVICE(0x045E, 0x0438) },
0091 { USB_DEVICE(0x045E, 0x0439) },
0092 { USB_DEVICE(0x045E, 0x043A) },
0093 { USB_DEVICE(0x045E, 0x043B) },
0094 { USB_DEVICE(0x045E, 0x043C) },
0095 { USB_DEVICE(0x045E, 0x043D) },
0096 { USB_DEVICE(0x045E, 0x043E) },
0097 { USB_DEVICE(0x045E, 0x043F) },
0098 { USB_DEVICE(0x045E, 0x0440) },
0099 { USB_DEVICE(0x045E, 0x0441) },
0100 { USB_DEVICE(0x045E, 0x0442) },
0101 { USB_DEVICE(0x045E, 0x0443) },
0102 { USB_DEVICE(0x045E, 0x0444) },
0103 { USB_DEVICE(0x045E, 0x0445) },
0104 { USB_DEVICE(0x045E, 0x0446) },
0105 { USB_DEVICE(0x045E, 0x0447) },
0106 { USB_DEVICE(0x045E, 0x0448) },
0107 { USB_DEVICE(0x045E, 0x0449) },
0108 { USB_DEVICE(0x045E, 0x044A) },
0109 { USB_DEVICE(0x045E, 0x044B) },
0110 { USB_DEVICE(0x045E, 0x044C) },
0111 { USB_DEVICE(0x045E, 0x044D) },
0112 { USB_DEVICE(0x045E, 0x044E) },
0113 { USB_DEVICE(0x045E, 0x044F) },
0114 { USB_DEVICE(0x045E, 0x0450) },
0115 { USB_DEVICE(0x045E, 0x0451) },
0116 { USB_DEVICE(0x045E, 0x0452) },
0117 { USB_DEVICE(0x045E, 0x0453) },
0118 { USB_DEVICE(0x045E, 0x0454) },
0119 { USB_DEVICE(0x045E, 0x0455) },
0120 { USB_DEVICE(0x045E, 0x0456) },
0121 { USB_DEVICE(0x045E, 0x0457) },
0122 { USB_DEVICE(0x045E, 0x0458) },
0123 { USB_DEVICE(0x045E, 0x0459) },
0124 { USB_DEVICE(0x045E, 0x045A) },
0125 { USB_DEVICE(0x045E, 0x045B) },
0126 { USB_DEVICE(0x045E, 0x045C) },
0127 { USB_DEVICE(0x045E, 0x045D) },
0128 { USB_DEVICE(0x045E, 0x045E) },
0129 { USB_DEVICE(0x045E, 0x045F) },
0130 { USB_DEVICE(0x045E, 0x0460) },
0131 { USB_DEVICE(0x045E, 0x0461) },
0132 { USB_DEVICE(0x045E, 0x0462) },
0133 { USB_DEVICE(0x045E, 0x0463) },
0134 { USB_DEVICE(0x045E, 0x0464) },
0135 { USB_DEVICE(0x045E, 0x0465) },
0136 { USB_DEVICE(0x045E, 0x0466) },
0137 { USB_DEVICE(0x045E, 0x0467) },
0138 { USB_DEVICE(0x045E, 0x0468) },
0139 { USB_DEVICE(0x045E, 0x0469) },
0140 { USB_DEVICE(0x045E, 0x046A) },
0141 { USB_DEVICE(0x045E, 0x046B) },
0142 { USB_DEVICE(0x045E, 0x046C) },
0143 { USB_DEVICE(0x045E, 0x046D) },
0144 { USB_DEVICE(0x045E, 0x046E) },
0145 { USB_DEVICE(0x045E, 0x046F) },
0146 { USB_DEVICE(0x045E, 0x0470) },
0147 { USB_DEVICE(0x045E, 0x0471) },
0148 { USB_DEVICE(0x045E, 0x0472) },
0149 { USB_DEVICE(0x045E, 0x0473) },
0150 { USB_DEVICE(0x045E, 0x0474) },
0151 { USB_DEVICE(0x045E, 0x0475) },
0152 { USB_DEVICE(0x045E, 0x0476) },
0153 { USB_DEVICE(0x045E, 0x0477) },
0154 { USB_DEVICE(0x045E, 0x0478) },
0155 { USB_DEVICE(0x045E, 0x0479) },
0156 { USB_DEVICE(0x045E, 0x047A) },
0157 { USB_DEVICE(0x045E, 0x047B) },
0158 { USB_DEVICE(0x045E, 0x04C8) },
0159 { USB_DEVICE(0x045E, 0x04C9) },
0160 { USB_DEVICE(0x045E, 0x04CA) },
0161 { USB_DEVICE(0x045E, 0x04CB) },
0162 { USB_DEVICE(0x045E, 0x04CC) },
0163 { USB_DEVICE(0x045E, 0x04CD) },
0164 { USB_DEVICE(0x045E, 0x04CE) },
0165 { USB_DEVICE(0x045E, 0x04D7) },
0166 { USB_DEVICE(0x045E, 0x04D8) },
0167 { USB_DEVICE(0x045E, 0x04D9) },
0168 { USB_DEVICE(0x045E, 0x04DA) },
0169 { USB_DEVICE(0x045E, 0x04DB) },
0170 { USB_DEVICE(0x045E, 0x04DC) },
0171 { USB_DEVICE(0x045E, 0x04DD) },
0172 { USB_DEVICE(0x045E, 0x04DE) },
0173 { USB_DEVICE(0x045E, 0x04DF) },
0174 { USB_DEVICE(0x045E, 0x04E0) },
0175 { USB_DEVICE(0x045E, 0x04E1) },
0176 { USB_DEVICE(0x045E, 0x04E2) },
0177 { USB_DEVICE(0x045E, 0x04E3) },
0178 { USB_DEVICE(0x045E, 0x04E4) },
0179 { USB_DEVICE(0x045E, 0x04E5) },
0180 { USB_DEVICE(0x045E, 0x04E6) },
0181 { USB_DEVICE(0x045E, 0x04E7) },
0182 { USB_DEVICE(0x045E, 0x04E8) },
0183 { USB_DEVICE(0x045E, 0x04E9) },
0184 { USB_DEVICE(0x045E, 0x04EA) },
0185 { USB_DEVICE(0x049F, 0x0003) },
0186 { USB_DEVICE(0x049F, 0x0032) },
0187 { USB_DEVICE(0x04A4, 0x0014) },
0188 { USB_DEVICE(0x04AD, 0x0301) },
0189 { USB_DEVICE(0x04AD, 0x0302) },
0190 { USB_DEVICE(0x04AD, 0x0303) },
0191 { USB_DEVICE(0x04AD, 0x0306) },
0192 { USB_DEVICE(0x04B7, 0x0531) },
0193 { USB_DEVICE(0x04C5, 0x1058) },
0194 { USB_DEVICE(0x04C5, 0x1079) },
0195 { USB_DEVICE(0x04DA, 0x2500) },
0196 { USB_DEVICE(0x04DD, 0x9102) },
0197 { USB_DEVICE(0x04DD, 0x9121) },
0198 { USB_DEVICE(0x04DD, 0x9123) },
0199 { USB_DEVICE(0x04DD, 0x9151) },
0200 { USB_DEVICE(0x04DD, 0x91AC) },
0201 { USB_DEVICE(0x04E8, 0x5F00) },
0202 { USB_DEVICE(0x04E8, 0x5F01) },
0203 { USB_DEVICE(0x04E8, 0x5F02) },
0204 { USB_DEVICE(0x04E8, 0x5F03) },
0205 { USB_DEVICE(0x04E8, 0x5F04) },
0206 { USB_DEVICE(0x04E8, 0x6611) },
0207 { USB_DEVICE(0x04E8, 0x6613) },
0208 { USB_DEVICE(0x04E8, 0x6615) },
0209 { USB_DEVICE(0x04E8, 0x6617) },
0210 { USB_DEVICE(0x04E8, 0x6619) },
0211 { USB_DEVICE(0x04E8, 0x661B) },
0212 { USB_DEVICE(0x04E8, 0x662E) },
0213 { USB_DEVICE(0x04E8, 0x6630) },
0214 { USB_DEVICE(0x04E8, 0x6632) },
0215 { USB_DEVICE(0x04f1, 0x3011) },
0216 { USB_DEVICE(0x04F1, 0x3012) },
0217 { USB_DEVICE(0x0502, 0x1631) },
0218 { USB_DEVICE(0x0502, 0x1632) },
0219 { USB_DEVICE(0x0502, 0x16E1) },
0220 { USB_DEVICE(0x0502, 0x16E2) },
0221 { USB_DEVICE(0x0502, 0x16E3) },
0222 { USB_DEVICE(0x0536, 0x01A0) },
0223 { USB_DEVICE(0x0543, 0x0ED9) },
0224 { USB_DEVICE(0x0543, 0x1527) },
0225 { USB_DEVICE(0x0543, 0x1529) },
0226 { USB_DEVICE(0x0543, 0x152B) },
0227 { USB_DEVICE(0x0543, 0x152E) },
0228 { USB_DEVICE(0x0543, 0x1921) },
0229 { USB_DEVICE(0x0543, 0x1922) },
0230 { USB_DEVICE(0x0543, 0x1923) },
0231 { USB_DEVICE(0x05E0, 0x2000) },
0232 { USB_DEVICE(0x05E0, 0x2001) },
0233 { USB_DEVICE(0x05E0, 0x2002) },
0234 { USB_DEVICE(0x05E0, 0x2003) },
0235 { USB_DEVICE(0x05E0, 0x2004) },
0236 { USB_DEVICE(0x05E0, 0x2005) },
0237 { USB_DEVICE(0x05E0, 0x2006) },
0238 { USB_DEVICE(0x05E0, 0x2007) },
0239 { USB_DEVICE(0x05E0, 0x2008) },
0240 { USB_DEVICE(0x05E0, 0x2009) },
0241 { USB_DEVICE(0x05E0, 0x200A) },
0242 { USB_DEVICE(0x067E, 0x1001) },
0243 { USB_DEVICE(0x07CF, 0x2001) },
0244 { USB_DEVICE(0x07CF, 0x2002) },
0245 { USB_DEVICE(0x07CF, 0x2003) },
0246 { USB_DEVICE(0x0930, 0x0700) },
0247 { USB_DEVICE(0x0930, 0x0705) },
0248 { USB_DEVICE(0x0930, 0x0706) },
0249 { USB_DEVICE(0x0930, 0x0707) },
0250 { USB_DEVICE(0x0930, 0x0708) },
0251 { USB_DEVICE(0x0930, 0x0709) },
0252 { USB_DEVICE(0x0930, 0x070A) },
0253 { USB_DEVICE(0x0930, 0x070B) },
0254 { USB_DEVICE(0x094B, 0x0001) },
0255 { USB_DEVICE(0x0960, 0x0065) },
0256 { USB_DEVICE(0x0960, 0x0066) },
0257 { USB_DEVICE(0x0960, 0x0067) },
0258 { USB_DEVICE(0x0961, 0x0010) },
0259 { USB_DEVICE(0x099E, 0x0052) },
0260 { USB_DEVICE(0x099E, 0x4000) },
0261 { USB_DEVICE(0x0B05, 0x4200) },
0262 { USB_DEVICE(0x0B05, 0x4201) },
0263 { USB_DEVICE(0x0B05, 0x4202) },
0264 { USB_DEVICE(0x0B05, 0x420F) },
0265 { USB_DEVICE(0x0B05, 0x9200) },
0266 { USB_DEVICE(0x0B05, 0x9202) },
0267 { USB_DEVICE(0x0BB4, 0x00CE) },
0268 { USB_DEVICE(0x0BB4, 0x00CF) },
0269 { USB_DEVICE(0x0BB4, 0x0A01) },
0270 { USB_DEVICE(0x0BB4, 0x0A02) },
0271 { USB_DEVICE(0x0BB4, 0x0A03) },
0272 { USB_DEVICE(0x0BB4, 0x0A04) },
0273 { USB_DEVICE(0x0BB4, 0x0A05) },
0274 { USB_DEVICE(0x0BB4, 0x0A06) },
0275 { USB_DEVICE(0x0BB4, 0x0A07) },
0276 { USB_DEVICE(0x0BB4, 0x0A08) },
0277 { USB_DEVICE(0x0BB4, 0x0A09) },
0278 { USB_DEVICE(0x0BB4, 0x0A0A) },
0279 { USB_DEVICE(0x0BB4, 0x0A0B) },
0280 { USB_DEVICE(0x0BB4, 0x0A0C) },
0281 { USB_DEVICE(0x0BB4, 0x0A0D) },
0282 { USB_DEVICE(0x0BB4, 0x0A0E) },
0283 { USB_DEVICE(0x0BB4, 0x0A0F) },
0284 { USB_DEVICE(0x0BB4, 0x0A10) },
0285 { USB_DEVICE(0x0BB4, 0x0A11) },
0286 { USB_DEVICE(0x0BB4, 0x0A12) },
0287 { USB_DEVICE(0x0BB4, 0x0A13) },
0288 { USB_DEVICE(0x0BB4, 0x0A14) },
0289 { USB_DEVICE(0x0BB4, 0x0A15) },
0290 { USB_DEVICE(0x0BB4, 0x0A16) },
0291 { USB_DEVICE(0x0BB4, 0x0A17) },
0292 { USB_DEVICE(0x0BB4, 0x0A18) },
0293 { USB_DEVICE(0x0BB4, 0x0A19) },
0294 { USB_DEVICE(0x0BB4, 0x0A1A) },
0295 { USB_DEVICE(0x0BB4, 0x0A1B) },
0296 { USB_DEVICE(0x0BB4, 0x0A1C) },
0297 { USB_DEVICE(0x0BB4, 0x0A1D) },
0298 { USB_DEVICE(0x0BB4, 0x0A1E) },
0299 { USB_DEVICE(0x0BB4, 0x0A1F) },
0300 { USB_DEVICE(0x0BB4, 0x0A20) },
0301 { USB_DEVICE(0x0BB4, 0x0A21) },
0302 { USB_DEVICE(0x0BB4, 0x0A22) },
0303 { USB_DEVICE(0x0BB4, 0x0A23) },
0304 { USB_DEVICE(0x0BB4, 0x0A24) },
0305 { USB_DEVICE(0x0BB4, 0x0A25) },
0306 { USB_DEVICE(0x0BB4, 0x0A26) },
0307 { USB_DEVICE(0x0BB4, 0x0A27) },
0308 { USB_DEVICE(0x0BB4, 0x0A28) },
0309 { USB_DEVICE(0x0BB4, 0x0A29) },
0310 { USB_DEVICE(0x0BB4, 0x0A2A) },
0311 { USB_DEVICE(0x0BB4, 0x0A2B) },
0312 { USB_DEVICE(0x0BB4, 0x0A2C) },
0313 { USB_DEVICE(0x0BB4, 0x0A2D) },
0314 { USB_DEVICE(0x0BB4, 0x0A2E) },
0315 { USB_DEVICE(0x0BB4, 0x0A2F) },
0316 { USB_DEVICE(0x0BB4, 0x0A30) },
0317 { USB_DEVICE(0x0BB4, 0x0A31) },
0318 { USB_DEVICE(0x0BB4, 0x0A32) },
0319 { USB_DEVICE(0x0BB4, 0x0A33) },
0320 { USB_DEVICE(0x0BB4, 0x0A34) },
0321 { USB_DEVICE(0x0BB4, 0x0A35) },
0322 { USB_DEVICE(0x0BB4, 0x0A36) },
0323 { USB_DEVICE(0x0BB4, 0x0A37) },
0324 { USB_DEVICE(0x0BB4, 0x0A38) },
0325 { USB_DEVICE(0x0BB4, 0x0A39) },
0326 { USB_DEVICE(0x0BB4, 0x0A3A) },
0327 { USB_DEVICE(0x0BB4, 0x0A3B) },
0328 { USB_DEVICE(0x0BB4, 0x0A3C) },
0329 { USB_DEVICE(0x0BB4, 0x0A3D) },
0330 { USB_DEVICE(0x0BB4, 0x0A3E) },
0331 { USB_DEVICE(0x0BB4, 0x0A3F) },
0332 { USB_DEVICE(0x0BB4, 0x0A40) },
0333 { USB_DEVICE(0x0BB4, 0x0A41) },
0334 { USB_DEVICE(0x0BB4, 0x0A42) },
0335 { USB_DEVICE(0x0BB4, 0x0A43) },
0336 { USB_DEVICE(0x0BB4, 0x0A44) },
0337 { USB_DEVICE(0x0BB4, 0x0A45) },
0338 { USB_DEVICE(0x0BB4, 0x0A46) },
0339 { USB_DEVICE(0x0BB4, 0x0A47) },
0340 { USB_DEVICE(0x0BB4, 0x0A48) },
0341 { USB_DEVICE(0x0BB4, 0x0A49) },
0342 { USB_DEVICE(0x0BB4, 0x0A4A) },
0343 { USB_DEVICE(0x0BB4, 0x0A4B) },
0344 { USB_DEVICE(0x0BB4, 0x0A4C) },
0345 { USB_DEVICE(0x0BB4, 0x0A4D) },
0346 { USB_DEVICE(0x0BB4, 0x0A4E) },
0347 { USB_DEVICE(0x0BB4, 0x0A4F) },
0348 { USB_DEVICE(0x0BB4, 0x0A50) },
0349 { USB_DEVICE(0x0BB4, 0x0A51) },
0350 { USB_DEVICE(0x0BB4, 0x0A52) },
0351 { USB_DEVICE(0x0BB4, 0x0A53) },
0352 { USB_DEVICE(0x0BB4, 0x0A54) },
0353 { USB_DEVICE(0x0BB4, 0x0A55) },
0354 { USB_DEVICE(0x0BB4, 0x0A56) },
0355 { USB_DEVICE(0x0BB4, 0x0A57) },
0356 { USB_DEVICE(0x0BB4, 0x0A58) },
0357 { USB_DEVICE(0x0BB4, 0x0A59) },
0358 { USB_DEVICE(0x0BB4, 0x0A5A) },
0359 { USB_DEVICE(0x0BB4, 0x0A5B) },
0360 { USB_DEVICE(0x0BB4, 0x0A5C) },
0361 { USB_DEVICE(0x0BB4, 0x0A5D) },
0362 { USB_DEVICE(0x0BB4, 0x0A5E) },
0363 { USB_DEVICE(0x0BB4, 0x0A5F) },
0364 { USB_DEVICE(0x0BB4, 0x0A60) },
0365 { USB_DEVICE(0x0BB4, 0x0A61) },
0366 { USB_DEVICE(0x0BB4, 0x0A62) },
0367 { USB_DEVICE(0x0BB4, 0x0A63) },
0368 { USB_DEVICE(0x0BB4, 0x0A64) },
0369 { USB_DEVICE(0x0BB4, 0x0A65) },
0370 { USB_DEVICE(0x0BB4, 0x0A66) },
0371 { USB_DEVICE(0x0BB4, 0x0A67) },
0372 { USB_DEVICE(0x0BB4, 0x0A68) },
0373 { USB_DEVICE(0x0BB4, 0x0A69) },
0374 { USB_DEVICE(0x0BB4, 0x0A6A) },
0375 { USB_DEVICE(0x0BB4, 0x0A6B) },
0376 { USB_DEVICE(0x0BB4, 0x0A6C) },
0377 { USB_DEVICE(0x0BB4, 0x0A6D) },
0378 { USB_DEVICE(0x0BB4, 0x0A6E) },
0379 { USB_DEVICE(0x0BB4, 0x0A6F) },
0380 { USB_DEVICE(0x0BB4, 0x0A70) },
0381 { USB_DEVICE(0x0BB4, 0x0A71) },
0382 { USB_DEVICE(0x0BB4, 0x0A72) },
0383 { USB_DEVICE(0x0BB4, 0x0A73) },
0384 { USB_DEVICE(0x0BB4, 0x0A74) },
0385 { USB_DEVICE(0x0BB4, 0x0A75) },
0386 { USB_DEVICE(0x0BB4, 0x0A76) },
0387 { USB_DEVICE(0x0BB4, 0x0A77) },
0388 { USB_DEVICE(0x0BB4, 0x0A78) },
0389 { USB_DEVICE(0x0BB4, 0x0A79) },
0390 { USB_DEVICE(0x0BB4, 0x0A7A) },
0391 { USB_DEVICE(0x0BB4, 0x0A7B) },
0392 { USB_DEVICE(0x0BB4, 0x0A7C) },
0393 { USB_DEVICE(0x0BB4, 0x0A7D) },
0394 { USB_DEVICE(0x0BB4, 0x0A7E) },
0395 { USB_DEVICE(0x0BB4, 0x0A7F) },
0396 { USB_DEVICE(0x0BB4, 0x0A80) },
0397 { USB_DEVICE(0x0BB4, 0x0A81) },
0398 { USB_DEVICE(0x0BB4, 0x0A82) },
0399 { USB_DEVICE(0x0BB4, 0x0A83) },
0400 { USB_DEVICE(0x0BB4, 0x0A84) },
0401 { USB_DEVICE(0x0BB4, 0x0A85) },
0402 { USB_DEVICE(0x0BB4, 0x0A86) },
0403 { USB_DEVICE(0x0BB4, 0x0A87) },
0404 { USB_DEVICE(0x0BB4, 0x0A88) },
0405 { USB_DEVICE(0x0BB4, 0x0A89) },
0406 { USB_DEVICE(0x0BB4, 0x0A8A) },
0407 { USB_DEVICE(0x0BB4, 0x0A8B) },
0408 { USB_DEVICE(0x0BB4, 0x0A8C) },
0409 { USB_DEVICE(0x0BB4, 0x0A8D) },
0410 { USB_DEVICE(0x0BB4, 0x0A8E) },
0411 { USB_DEVICE(0x0BB4, 0x0A8F) },
0412 { USB_DEVICE(0x0BB4, 0x0A90) },
0413 { USB_DEVICE(0x0BB4, 0x0A91) },
0414 { USB_DEVICE(0x0BB4, 0x0A92) },
0415 { USB_DEVICE(0x0BB4, 0x0A93) },
0416 { USB_DEVICE(0x0BB4, 0x0A94) },
0417 { USB_DEVICE(0x0BB4, 0x0A95) },
0418 { USB_DEVICE(0x0BB4, 0x0A96) },
0419 { USB_DEVICE(0x0BB4, 0x0A97) },
0420 { USB_DEVICE(0x0BB4, 0x0A98) },
0421 { USB_DEVICE(0x0BB4, 0x0A99) },
0422 { USB_DEVICE(0x0BB4, 0x0A9A) },
0423 { USB_DEVICE(0x0BB4, 0x0A9B) },
0424 { USB_DEVICE(0x0BB4, 0x0A9C) },
0425 { USB_DEVICE(0x0BB4, 0x0A9D) },
0426 { USB_DEVICE(0x0BB4, 0x0A9E) },
0427 { USB_DEVICE(0x0BB4, 0x0A9F) },
0428 { USB_DEVICE(0x0BB4, 0x0BCE) },
0429 { USB_DEVICE(0x0BF8, 0x1001) },
0430 { USB_DEVICE(0x0C44, 0x03A2) },
0431 { USB_DEVICE(0x0C8E, 0x6000) },
0432 { USB_DEVICE(0x0CAD, 0x9001) },
0433 { USB_DEVICE(0x0F4E, 0x0200) },
0434 { USB_DEVICE(0x0F98, 0x0201) },
0435 { USB_DEVICE(0x0FB8, 0x3001) },
0436 { USB_DEVICE(0x0FB8, 0x3002) },
0437 { USB_DEVICE(0x0FB8, 0x3003) },
0438 { USB_DEVICE(0x0FB8, 0x4001) },
0439 { USB_DEVICE(0x1066, 0x00CE) },
0440 { USB_DEVICE(0x1066, 0x0300) },
0441 { USB_DEVICE(0x1066, 0x0500) },
0442 { USB_DEVICE(0x1066, 0x0600) },
0443 { USB_DEVICE(0x1066, 0x0700) },
0444 { USB_DEVICE(0x1114, 0x0001) },
0445 { USB_DEVICE(0x1114, 0x0004) },
0446 { USB_DEVICE(0x1114, 0x0006) },
0447 { USB_DEVICE(0x1182, 0x1388) },
0448 { USB_DEVICE(0x11D9, 0x1002) },
0449 { USB_DEVICE(0x11D9, 0x1003) },
0450 { USB_DEVICE(0x1231, 0xCE01) },
0451 { USB_DEVICE(0x1231, 0xCE02) },
0452 { USB_DEVICE(0x1690, 0x0601) },
0453 { USB_DEVICE(0x22B8, 0x4204) },
0454 { USB_DEVICE(0x22B8, 0x4214) },
0455 { USB_DEVICE(0x22B8, 0x4224) },
0456 { USB_DEVICE(0x22B8, 0x4234) },
0457 { USB_DEVICE(0x22B8, 0x4244) },
0458 { USB_DEVICE(0x3340, 0x011C) },
0459 { USB_DEVICE(0x3340, 0x0326) },
0460 { USB_DEVICE(0x3340, 0x0426) },
0461 { USB_DEVICE(0x3340, 0x043A) },
0462 { USB_DEVICE(0x3340, 0x051C) },
0463 { USB_DEVICE(0x3340, 0x053A) },
0464 { USB_DEVICE(0x3340, 0x071C) },
0465 { USB_DEVICE(0x3340, 0x0B1C) },
0466 { USB_DEVICE(0x3340, 0x0E3A) },
0467 { USB_DEVICE(0x3340, 0x0F1C) },
0468 { USB_DEVICE(0x3340, 0x0F3A) },
0469 { USB_DEVICE(0x3340, 0x1326) },
0470 { USB_DEVICE(0x3340, 0x191C) },
0471 { USB_DEVICE(0x3340, 0x2326) },
0472 { USB_DEVICE(0x3340, 0x3326) },
0473 { USB_DEVICE(0x3708, 0x20CE) },
0474 { USB_DEVICE(0x3708, 0x21CE) },
0475 { USB_DEVICE(0x4113, 0x0210) },
0476 { USB_DEVICE(0x4113, 0x0211) },
0477 { USB_DEVICE(0x4113, 0x0400) },
0478 { USB_DEVICE(0x4113, 0x0410) },
0479 { USB_DEVICE(0x413C, 0x4001) },
0480 { USB_DEVICE(0x413C, 0x4002) },
0481 { USB_DEVICE(0x413C, 0x4003) },
0482 { USB_DEVICE(0x413C, 0x4004) },
0483 { USB_DEVICE(0x413C, 0x4005) },
0484 { USB_DEVICE(0x413C, 0x4006) },
0485 { USB_DEVICE(0x413C, 0x4007) },
0486 { USB_DEVICE(0x413C, 0x4008) },
0487 { USB_DEVICE(0x413C, 0x4009) },
0488 { USB_DEVICE(0x4505, 0x0010) },
0489 { USB_DEVICE(0x5E04, 0xCE00) },
0490 { }
0491 };
0492
0493 MODULE_DEVICE_TABLE(usb, ipaq_id_table);
0494
0495
0496
0497 static struct usb_serial_driver ipaq_device = {
0498 .driver = {
0499 .owner = THIS_MODULE,
0500 .name = "ipaq",
0501 },
0502 .description = "PocketPC PDA",
0503 .id_table = ipaq_id_table,
0504 .bulk_in_size = 256,
0505 .bulk_out_size = 256,
0506 .open = ipaq_open,
0507 .attach = ipaq_startup,
0508 .calc_num_ports = ipaq_calc_num_ports,
0509 };
0510
0511 static struct usb_serial_driver * const serial_drivers[] = {
0512 &ipaq_device, NULL
0513 };
0514
0515 static int ipaq_open(struct tty_struct *tty,
0516 struct usb_serial_port *port)
0517 {
0518 struct usb_serial *serial = port->serial;
0519 int result = 0;
0520 int retries = connect_retries;
0521
0522 msleep(1000*initial_wait);
0523
0524
0525
0526
0527
0528
0529
0530
0531 while (retries) {
0532 retries--;
0533 result = usb_control_msg(serial->dev,
0534 usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
0535 0x1, 0, NULL, 0, 100);
0536 if (!result)
0537 break;
0538
0539 msleep(1000);
0540 }
0541 if (!retries && result) {
0542 dev_err(&port->dev, "%s - failed doing control urb, error %d\n",
0543 __func__, result);
0544 return result;
0545 }
0546
0547 return usb_serial_generic_open(tty, port);
0548 }
0549
0550 static int ipaq_calc_num_ports(struct usb_serial *serial,
0551 struct usb_serial_endpoints *epds)
0552 {
0553
0554
0555
0556
0557
0558 if (epds->num_bulk_in == 0 || epds->num_bulk_out == 0)
0559 return -ENODEV;
0560
0561
0562
0563
0564
0565 if (epds->num_bulk_in > 1 && epds->num_bulk_out > 1) {
0566 epds->bulk_in[0] = epds->bulk_in[1];
0567 epds->bulk_out[0] = epds->bulk_out[1];
0568 }
0569
0570
0571
0572
0573
0574 epds->num_bulk_in = 1;
0575 epds->num_bulk_out = 1;
0576
0577 return 1;
0578 }
0579
0580 static int ipaq_startup(struct usb_serial *serial)
0581 {
0582 if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
0583
0584
0585
0586
0587
0588 dev_err(&serial->dev->dev, "active config #%d != 1 ??\n",
0589 serial->dev->actconfig->desc.bConfigurationValue);
0590 return -ENODEV;
0591 }
0592
0593 return usb_reset_configuration(serial->dev);
0594 }
0595
0596 module_usb_serial_driver(serial_drivers, ipaq_id_table);
0597
0598 MODULE_AUTHOR(DRIVER_AUTHOR);
0599 MODULE_DESCRIPTION(DRIVER_DESC);
0600 MODULE_LICENSE("GPL");
0601
0602 module_param(connect_retries, int, 0644);
0603 MODULE_PARM_DESC(connect_retries,
0604 "Maximum number of connect retries (one second each)");
0605
0606 module_param(initial_wait, int, 0644);
0607 MODULE_PARM_DESC(initial_wait,
0608 "Time to wait before attempting a connection (in seconds)");