p54usb.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. /*
  2. * Linux device driver for USB based Prism54
  3. *
  4. * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
  5. *
  6. * Based on the islsm (softmac prism54) driver, which is:
  7. * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. #include <linux/usb.h>
  14. #include <linux/pci.h>
  15. #include <linux/slab.h>
  16. #include <linux/firmware.h>
  17. #include <linux/etherdevice.h>
  18. #include <linux/delay.h>
  19. #include <linux/crc32.h>
  20. #include <linux/module.h>
  21. #include <net/mac80211.h>
  22. #include "p54.h"
  23. #include "lmac.h"
  24. #include "p54usb.h"
  25. MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
  26. MODULE_DESCRIPTION("Prism54 USB wireless driver");
  27. MODULE_LICENSE("GPL");
  28. MODULE_ALIAS("prism54usb");
  29. MODULE_FIRMWARE("isl3886usb");
  30. MODULE_FIRMWARE("isl3887usb");
  31. /*
  32. * Note:
  33. *
  34. * Always update our wiki's device list (located at:
  35. * http://wireless.kernel.org/en/users/Drivers/p54/devices ),
  36. * whenever you add a new device.
  37. */
  38. static struct usb_device_id p54u_table[] = {
  39. /* Version 1 devices (pci chip + net2280) */
  40. {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
  41. {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
  42. {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
  43. {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */
  44. {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
  45. {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
  46. {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
  47. {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
  48. {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
  49. {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
  50. {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
  51. {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
  52. {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
  53. {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
  54. {USB_DEVICE(0x0bf8, 0x1007)}, /* Fujitsu E-5400 USB */
  55. {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
  56. {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
  57. {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
  58. {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
  59. {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
  60. {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
  61. {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
  62. {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
  63. {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
  64. {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
  65. {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
  66. {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
  67. {USB_DEVICE(0x2001, 0x3762)}, /* Conceptronic C54U */
  68. {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
  69. {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
  70. /* Version 2 devices (3887) */
  71. {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
  72. {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
  73. {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
  74. {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
  75. {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
  76. {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
  77. {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
  78. {USB_DEVICE(0x07aa, 0x0020)}, /* Corega WLUSB2GTST USB */
  79. {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
  80. {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
  81. {USB_DEVICE(0x083a, 0x4531)}, /* T-Com Sinus 154 data II */
  82. {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */
  83. {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */
  84. {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
  85. {USB_DEVICE(0x0915, 0x2000)}, /* Cohiba Proto board */
  86. {USB_DEVICE(0x0915, 0x2002)}, /* Cohiba Proto board */
  87. {USB_DEVICE(0x0baf, 0x0118)}, /* U.S. Robotics U5 802.11g Adapter*/
  88. {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
  89. /* {USB_DEVICE(0x0cde, 0x0006)}, * Medion MD40900 already listed above,
  90. * just noting it here for clarity */
  91. {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
  92. {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
  93. {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
  94. {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
  95. {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
  96. {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
  97. {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
  98. {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
  99. {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
  100. /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */
  101. {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
  102. {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
  103. {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
  104. {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
  105. {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
  106. {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
  107. {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
  108. {}
  109. };
  110. MODULE_DEVICE_TABLE(usb, p54u_table);
  111. static const struct {
  112. u32 intf;
  113. enum p54u_hw_type type;
  114. const char *fw;
  115. char hw[20];
  116. } p54u_fwlist[__NUM_P54U_HWTYPES] = {
  117. {
  118. .type = P54U_NET2280,
  119. .intf = FW_LM86,
  120. .fw = "isl3886usb",
  121. .hw = "ISL3886 + net2280",
  122. },
  123. {
  124. .type = P54U_3887,
  125. .intf = FW_LM87,
  126. .fw = "isl3887usb",
  127. .hw = "ISL3887",
  128. },
  129. };
  130. static void p54u_rx_cb(struct urb *urb)
  131. {
  132. struct sk_buff *skb = (struct sk_buff *) urb->context;
  133. struct p54u_rx_info *info = (struct p54u_rx_info *)skb->cb;
  134. struct ieee80211_hw *dev = info->dev;
  135. struct p54u_priv *priv = dev->priv;
  136. skb_unlink(skb, &priv->rx_queue);
  137. if (unlikely(urb->status)) {
  138. dev_kfree_skb_irq(skb);
  139. return;
  140. }
  141. skb_put(skb, urb->actual_length);
  142. if (priv->hw_type == P54U_NET2280)
  143. skb_pull(skb, priv->common.tx_hdr_len);
  144. if (priv->common.fw_interface == FW_LM87) {
  145. skb_pull(skb, 4);
  146. skb_put(skb, 4);
  147. }
  148. if (p54_rx(dev, skb)) {
  149. skb = dev_alloc_skb(priv->common.rx_mtu + 32);
  150. if (unlikely(!skb)) {
  151. /* TODO check rx queue length and refill *somewhere* */
  152. return;
  153. }
  154. info = (struct p54u_rx_info *) skb->cb;
  155. info->urb = urb;
  156. info->dev = dev;
  157. urb->transfer_buffer = skb_tail_pointer(skb);
  158. urb->context = skb;
  159. } else {
  160. if (priv->hw_type == P54U_NET2280)
  161. skb_push(skb, priv->common.tx_hdr_len);
  162. if (priv->common.fw_interface == FW_LM87) {
  163. skb_push(skb, 4);
  164. skb_put(skb, 4);
  165. }
  166. skb_reset_tail_pointer(skb);
  167. skb_trim(skb, 0);
  168. urb->transfer_buffer = skb_tail_pointer(skb);
  169. }
  170. skb_queue_tail(&priv->rx_queue, skb);
  171. usb_anchor_urb(urb, &priv->submitted);
  172. if (usb_submit_urb(urb, GFP_ATOMIC)) {
  173. skb_unlink(skb, &priv->rx_queue);
  174. usb_unanchor_urb(urb);
  175. dev_kfree_skb_irq(skb);
  176. }
  177. }
  178. static void p54u_tx_cb(struct urb *urb)
  179. {
  180. struct sk_buff *skb = urb->context;
  181. struct ieee80211_hw *dev =
  182. usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
  183. p54_free_skb(dev, skb);
  184. }
  185. static void p54u_tx_dummy_cb(struct urb *urb) { }
  186. static void p54u_free_urbs(struct ieee80211_hw *dev)
  187. {
  188. struct p54u_priv *priv = dev->priv;
  189. usb_kill_anchored_urbs(&priv->submitted);
  190. }
  191. static void p54u_stop(struct ieee80211_hw *dev)
  192. {
  193. /*
  194. * TODO: figure out how to reliably stop the 3887 and net2280 so
  195. * the hardware is still usable next time we want to start it.
  196. * until then, we just stop listening to the hardware..
  197. */
  198. p54u_free_urbs(dev);
  199. }
  200. static int p54u_init_urbs(struct ieee80211_hw *dev)
  201. {
  202. struct p54u_priv *priv = dev->priv;
  203. struct urb *entry = NULL;
  204. struct sk_buff *skb;
  205. struct p54u_rx_info *info;
  206. int ret = 0;
  207. while (skb_queue_len(&priv->rx_queue) < 32) {
  208. skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);
  209. if (!skb) {
  210. ret = -ENOMEM;
  211. goto err;
  212. }
  213. entry = usb_alloc_urb(0, GFP_KERNEL);
  214. if (!entry) {
  215. ret = -ENOMEM;
  216. goto err;
  217. }
  218. usb_fill_bulk_urb(entry, priv->udev,
  219. usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),
  220. skb_tail_pointer(skb),
  221. priv->common.rx_mtu + 32, p54u_rx_cb, skb);
  222. info = (struct p54u_rx_info *) skb->cb;
  223. info->urb = entry;
  224. info->dev = dev;
  225. skb_queue_tail(&priv->rx_queue, skb);
  226. usb_anchor_urb(entry, &priv->submitted);
  227. ret = usb_submit_urb(entry, GFP_KERNEL);
  228. if (ret) {
  229. skb_unlink(skb, &priv->rx_queue);
  230. usb_unanchor_urb(entry);
  231. goto err;
  232. }
  233. usb_free_urb(entry);
  234. entry = NULL;
  235. }
  236. return 0;
  237. err:
  238. usb_free_urb(entry);
  239. kfree_skb(skb);
  240. p54u_free_urbs(dev);
  241. return ret;
  242. }
  243. static int p54u_open(struct ieee80211_hw *dev)
  244. {
  245. /*
  246. * TODO: Because we don't know how to reliably stop the 3887 and
  247. * the isl3886+net2280, other than brutally cut off all
  248. * communications. We have to reinitialize the urbs on every start.
  249. */
  250. return p54u_init_urbs(dev);
  251. }
  252. static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
  253. {
  254. u32 chk = 0;
  255. length >>= 2;
  256. while (length--) {
  257. chk ^= le32_to_cpu(*data++);
  258. chk = (chk >> 5) ^ (chk << 3);
  259. }
  260. return cpu_to_le32(chk);
  261. }
  262. static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
  263. {
  264. struct p54u_priv *priv = dev->priv;
  265. struct urb *data_urb;
  266. struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
  267. data_urb = usb_alloc_urb(0, GFP_ATOMIC);
  268. if (!data_urb) {
  269. p54_free_skb(dev, skb);
  270. return;
  271. }
  272. hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
  273. hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
  274. usb_fill_bulk_urb(data_urb, priv->udev,
  275. usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
  276. hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
  277. p54u_tx_cb : p54u_tx_dummy_cb, skb);
  278. data_urb->transfer_flags |= URB_ZERO_PACKET;
  279. usb_anchor_urb(data_urb, &priv->submitted);
  280. if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
  281. usb_unanchor_urb(data_urb);
  282. p54_free_skb(dev, skb);
  283. }
  284. usb_free_urb(data_urb);
  285. }
  286. static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
  287. {
  288. struct p54u_priv *priv = dev->priv;
  289. struct urb *int_urb = NULL, *data_urb = NULL;
  290. struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
  291. struct net2280_reg_write *reg = NULL;
  292. int err = -ENOMEM;
  293. reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
  294. if (!reg)
  295. goto out;
  296. int_urb = usb_alloc_urb(0, GFP_ATOMIC);
  297. if (!int_urb)
  298. goto out;
  299. data_urb = usb_alloc_urb(0, GFP_ATOMIC);
  300. if (!data_urb)
  301. goto out;
  302. reg->port = cpu_to_le16(NET2280_DEV_U32);
  303. reg->addr = cpu_to_le32(P54U_DEV_BASE);
  304. reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
  305. memset(hdr, 0, sizeof(*hdr));
  306. hdr->len = cpu_to_le16(skb->len);
  307. hdr->device_addr = ((struct p54_hdr *) skb->data)->req_id;
  308. usb_fill_bulk_urb(int_urb, priv->udev,
  309. usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),
  310. p54u_tx_dummy_cb, dev);
  311. /*
  312. * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
  313. * free what is inside the transfer_buffer after the last reference to
  314. * the int_urb is dropped.
  315. */
  316. int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
  317. reg = NULL;
  318. usb_fill_bulk_urb(data_urb, priv->udev,
  319. usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
  320. hdr, skb->len + sizeof(*hdr), FREE_AFTER_TX(skb) ?
  321. p54u_tx_cb : p54u_tx_dummy_cb, skb);
  322. data_urb->transfer_flags |= URB_ZERO_PACKET;
  323. usb_anchor_urb(int_urb, &priv->submitted);
  324. err = usb_submit_urb(int_urb, GFP_ATOMIC);
  325. if (err) {
  326. usb_unanchor_urb(int_urb);
  327. goto out;
  328. }
  329. usb_anchor_urb(data_urb, &priv->submitted);
  330. err = usb_submit_urb(data_urb, GFP_ATOMIC);
  331. if (err) {
  332. usb_unanchor_urb(data_urb);
  333. goto out;
  334. }
  335. out:
  336. usb_free_urb(int_urb);
  337. usb_free_urb(data_urb);
  338. if (err) {
  339. kfree(reg);
  340. p54_free_skb(dev, skb);
  341. }
  342. }
  343. static int p54u_write(struct p54u_priv *priv,
  344. struct net2280_reg_write *buf,
  345. enum net2280_op_type type,
  346. __le32 addr, __le32 val)
  347. {
  348. unsigned int ep;
  349. int alen;
  350. if (type & 0x0800)
  351. ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV);
  352. else
  353. ep = usb_sndbulkpipe(priv->udev, P54U_PIPE_BRG);
  354. buf->port = cpu_to_le16(type);
  355. buf->addr = addr;
  356. buf->val = val;
  357. return usb_bulk_msg(priv->udev, ep, buf, sizeof(*buf), &alen, 1000);
  358. }
  359. static int p54u_read(struct p54u_priv *priv, void *buf,
  360. enum net2280_op_type type,
  361. __le32 addr, __le32 *val)
  362. {
  363. struct net2280_reg_read *read = buf;
  364. __le32 *reg = buf;
  365. unsigned int ep;
  366. int alen, err;
  367. if (type & 0x0800)
  368. ep = P54U_PIPE_DEV;
  369. else
  370. ep = P54U_PIPE_BRG;
  371. read->port = cpu_to_le16(type);
  372. read->addr = addr;
  373. err = usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
  374. read, sizeof(*read), &alen, 1000);
  375. if (err)
  376. return err;
  377. err = usb_bulk_msg(priv->udev, usb_rcvbulkpipe(priv->udev, ep),
  378. reg, sizeof(*reg), &alen, 1000);
  379. if (err)
  380. return err;
  381. *val = *reg;
  382. return 0;
  383. }
  384. static int p54u_bulk_msg(struct p54u_priv *priv, unsigned int ep,
  385. void *data, size_t len)
  386. {
  387. int alen;
  388. return usb_bulk_msg(priv->udev, usb_sndbulkpipe(priv->udev, ep),
  389. data, len, &alen, 2000);
  390. }
  391. static int p54u_device_reset(struct ieee80211_hw *dev)
  392. {
  393. struct p54u_priv *priv = dev->priv;
  394. int ret, lock = (priv->intf->condition != USB_INTERFACE_BINDING);
  395. if (lock) {
  396. ret = usb_lock_device_for_reset(priv->udev, priv->intf);
  397. if (ret < 0) {
  398. dev_err(&priv->udev->dev, "(p54usb) unable to lock "
  399. "device for reset (%d)!\n", ret);
  400. return ret;
  401. }
  402. }
  403. ret = usb_reset_device(priv->udev);
  404. if (lock)
  405. usb_unlock_device(priv->udev);
  406. if (ret)
  407. dev_err(&priv->udev->dev, "(p54usb) unable to reset "
  408. "device (%d)!\n", ret);
  409. return ret;
  410. }
  411. static const char p54u_romboot_3887[] = "~~~~";
  412. static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
  413. {
  414. struct p54u_priv *priv = dev->priv;
  415. u8 *buf;
  416. int ret;
  417. buf = kmemdup(p54u_romboot_3887, 4, GFP_KERNEL);
  418. if (!buf)
  419. return -ENOMEM;
  420. ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
  421. buf, 4);
  422. kfree(buf);
  423. if (ret)
  424. dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
  425. "boot ROM (%d)!\n", ret);
  426. return ret;
  427. }
  428. static const char p54u_firmware_upload_3887[] = "<\r";
  429. static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
  430. {
  431. struct p54u_priv *priv = dev->priv;
  432. int err, alen;
  433. u8 carry = 0;
  434. u8 *buf, *tmp;
  435. const u8 *data;
  436. unsigned int left, remains, block_size;
  437. struct x2_header *hdr;
  438. unsigned long timeout;
  439. err = p54u_firmware_reset_3887(dev);
  440. if (err)
  441. return err;
  442. tmp = buf = kmalloc(P54U_FW_BLOCK, GFP_KERNEL);
  443. if (!buf)
  444. return -ENOMEM;
  445. left = block_size = min_t(size_t, P54U_FW_BLOCK, priv->fw->size);
  446. strcpy(buf, p54u_firmware_upload_3887);
  447. left -= strlen(p54u_firmware_upload_3887);
  448. tmp += strlen(p54u_firmware_upload_3887);
  449. data = priv->fw->data;
  450. remains = priv->fw->size;
  451. hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
  452. memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
  453. hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
  454. hdr->fw_length = cpu_to_le32(priv->fw->size);
  455. hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
  456. sizeof(u32)*2));
  457. left -= sizeof(*hdr);
  458. tmp += sizeof(*hdr);
  459. while (remains) {
  460. while (left--) {
  461. if (carry) {
  462. *tmp++ = carry;
  463. carry = 0;
  464. remains--;
  465. continue;
  466. }
  467. switch (*data) {
  468. case '~':
  469. *tmp++ = '}';
  470. carry = '^';
  471. break;
  472. case '}':
  473. *tmp++ = '}';
  474. carry = ']';
  475. break;
  476. default:
  477. *tmp++ = *data;
  478. remains--;
  479. break;
  480. }
  481. data++;
  482. }
  483. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
  484. if (err) {
  485. dev_err(&priv->udev->dev, "(p54usb) firmware "
  486. "upload failed!\n");
  487. goto err_upload_failed;
  488. }
  489. tmp = buf;
  490. left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
  491. }
  492. *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
  493. priv->fw->size));
  494. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
  495. if (err) {
  496. dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
  497. goto err_upload_failed;
  498. }
  499. timeout = jiffies + msecs_to_jiffies(1000);
  500. while (!(err = usb_bulk_msg(priv->udev,
  501. usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
  502. if (alen > 2 && !memcmp(buf, "OK", 2))
  503. break;
  504. if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
  505. err = -EINVAL;
  506. break;
  507. }
  508. if (time_after(jiffies, timeout)) {
  509. dev_err(&priv->udev->dev, "(p54usb) firmware boot "
  510. "timed out!\n");
  511. err = -ETIMEDOUT;
  512. break;
  513. }
  514. }
  515. if (err) {
  516. dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
  517. goto err_upload_failed;
  518. }
  519. buf[0] = 'g';
  520. buf[1] = '\r';
  521. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
  522. if (err) {
  523. dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
  524. goto err_upload_failed;
  525. }
  526. timeout = jiffies + msecs_to_jiffies(1000);
  527. while (!(err = usb_bulk_msg(priv->udev,
  528. usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
  529. if (alen > 0 && buf[0] == 'g')
  530. break;
  531. if (time_after(jiffies, timeout)) {
  532. err = -ETIMEDOUT;
  533. break;
  534. }
  535. }
  536. if (err)
  537. goto err_upload_failed;
  538. err_upload_failed:
  539. kfree(buf);
  540. return err;
  541. }
  542. static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
  543. {
  544. struct p54u_priv *priv = dev->priv;
  545. const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
  546. int err, alen;
  547. void *buf;
  548. __le32 reg;
  549. unsigned int remains, offset;
  550. const u8 *data;
  551. buf = kmalloc(512, GFP_KERNEL);
  552. if (!buf)
  553. return -ENOMEM;
  554. #define P54U_WRITE(type, addr, data) \
  555. do {\
  556. err = p54u_write(priv, buf, type,\
  557. cpu_to_le32((u32)(unsigned long)addr), data);\
  558. if (err) \
  559. goto fail;\
  560. } while (0)
  561. #define P54U_READ(type, addr) \
  562. do {\
  563. err = p54u_read(priv, buf, type,\
  564. cpu_to_le32((u32)(unsigned long)addr), &reg);\
  565. if (err)\
  566. goto fail;\
  567. } while (0)
  568. /* power down net2280 bridge */
  569. P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
  570. reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
  571. reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
  572. P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
  573. mdelay(100);
  574. /* power up bridge */
  575. reg |= cpu_to_le32(P54U_BRG_POWER_UP);
  576. reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
  577. P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
  578. mdelay(100);
  579. P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
  580. cpu_to_le32(NET2280_CLK_30Mhz |
  581. NET2280_PCI_ENABLE |
  582. NET2280_PCI_SOFT_RESET));
  583. mdelay(20);
  584. P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
  585. cpu_to_le32(PCI_COMMAND_MEMORY |
  586. PCI_COMMAND_MASTER));
  587. P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
  588. cpu_to_le32(NET2280_BASE));
  589. P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
  590. reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
  591. P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
  592. // TODO: we really need this?
  593. P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
  594. P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
  595. cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
  596. P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
  597. cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
  598. P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
  599. cpu_to_le32(NET2280_BASE2));
  600. /* finally done setting up the bridge */
  601. P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
  602. cpu_to_le32(PCI_COMMAND_MEMORY |
  603. PCI_COMMAND_MASTER));
  604. P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
  605. P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
  606. cpu_to_le32(P54U_DEV_BASE));
  607. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
  608. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  609. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  610. /* do romboot */
  611. P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
  612. P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
  613. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  614. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
  615. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
  616. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  617. mdelay(20);
  618. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  619. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  620. mdelay(20);
  621. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  622. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  623. mdelay(100);
  624. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  625. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  626. /* finally, we can upload firmware now! */
  627. remains = priv->fw->size;
  628. data = priv->fw->data;
  629. offset = ISL38XX_DEV_FIRMWARE_ADDR;
  630. while (remains) {
  631. unsigned int block_len = min(remains, (unsigned int)512);
  632. memcpy(buf, data, block_len);
  633. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
  634. if (err) {
  635. dev_err(&priv->udev->dev, "(p54usb) firmware block "
  636. "upload failed\n");
  637. goto fail;
  638. }
  639. P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
  640. cpu_to_le32(0xc0000f00));
  641. P54U_WRITE(NET2280_DEV_U32,
  642. 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
  643. P54U_WRITE(NET2280_DEV_U32,
  644. 0x0020 | (unsigned long)&devreg->direct_mem_win,
  645. cpu_to_le32(1));
  646. P54U_WRITE(NET2280_DEV_U32,
  647. 0x0024 | (unsigned long)&devreg->direct_mem_win,
  648. cpu_to_le32(block_len));
  649. P54U_WRITE(NET2280_DEV_U32,
  650. 0x0028 | (unsigned long)&devreg->direct_mem_win,
  651. cpu_to_le32(offset));
  652. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
  653. cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
  654. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
  655. cpu_to_le32(block_len >> 2));
  656. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
  657. cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
  658. mdelay(10);
  659. P54U_READ(NET2280_DEV_U32,
  660. 0x002C | (unsigned long)&devreg->direct_mem_win);
  661. if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
  662. !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
  663. dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
  664. "transfer failed\n");
  665. goto fail;
  666. }
  667. P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
  668. cpu_to_le32(NET2280_FIFO_FLUSH));
  669. remains -= block_len;
  670. data += block_len;
  671. offset += block_len;
  672. }
  673. /* do ramboot */
  674. P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
  675. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  676. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
  677. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
  678. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  679. mdelay(20);
  680. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  681. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  682. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  683. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  684. mdelay(100);
  685. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  686. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  687. /* start up the firmware */
  688. P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
  689. cpu_to_le32(ISL38XX_INT_IDENT_INIT));
  690. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  691. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  692. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
  693. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
  694. NET2280_USB_INTERRUPT_ENABLE));
  695. P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
  696. cpu_to_le32(ISL38XX_DEV_INT_RESET));
  697. err = usb_interrupt_msg(priv->udev,
  698. usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
  699. buf, sizeof(__le32), &alen, 1000);
  700. if (err || alen != sizeof(__le32))
  701. goto fail;
  702. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  703. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  704. if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
  705. err = -EINVAL;
  706. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
  707. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  708. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  709. #undef P54U_WRITE
  710. #undef P54U_READ
  711. fail:
  712. kfree(buf);
  713. return err;
  714. }
  715. static int p54_find_type(struct p54u_priv *priv)
  716. {
  717. int i;
  718. for (i = 0; i < __NUM_P54U_HWTYPES; i++)
  719. if (p54u_fwlist[i].type == priv->hw_type)
  720. break;
  721. if (i == __NUM_P54U_HWTYPES)
  722. return -EOPNOTSUPP;
  723. return i;
  724. }
  725. static int p54u_start_ops(struct p54u_priv *priv)
  726. {
  727. struct ieee80211_hw *dev = priv->common.hw;
  728. int ret;
  729. ret = p54_parse_firmware(dev, priv->fw);
  730. if (ret)
  731. goto err_out;
  732. ret = p54_find_type(priv);
  733. if (ret < 0)
  734. goto err_out;
  735. if (priv->common.fw_interface != p54u_fwlist[ret].intf) {
  736. dev_err(&priv->udev->dev, "wrong firmware, please get "
  737. "a firmware for \"%s\" and try again.\n",
  738. p54u_fwlist[ret].hw);
  739. ret = -ENODEV;
  740. goto err_out;
  741. }
  742. ret = priv->upload_fw(dev);
  743. if (ret)
  744. goto err_out;
  745. ret = p54u_open(dev);
  746. if (ret)
  747. goto err_out;
  748. ret = p54_read_eeprom(dev);
  749. if (ret)
  750. goto err_stop;
  751. p54u_stop(dev);
  752. ret = p54_register_common(dev, &priv->udev->dev);
  753. if (ret)
  754. goto err_stop;
  755. return 0;
  756. err_stop:
  757. p54u_stop(dev);
  758. err_out:
  759. /*
  760. * p54u_disconnect will do the rest of the
  761. * cleanup
  762. */
  763. return ret;
  764. }
  765. static void p54u_load_firmware_cb(const struct firmware *firmware,
  766. void *context)
  767. {
  768. struct p54u_priv *priv = context;
  769. struct usb_device *udev = priv->udev;
  770. int err;
  771. complete(&priv->fw_wait_load);
  772. if (firmware) {
  773. priv->fw = firmware;
  774. err = p54u_start_ops(priv);
  775. } else {
  776. err = -ENOENT;
  777. dev_err(&udev->dev, "Firmware not found.\n");
  778. }
  779. if (err) {
  780. struct device *parent = priv->udev->dev.parent;
  781. dev_err(&udev->dev, "failed to initialize device (%d)\n", err);
  782. if (parent)
  783. device_lock(parent);
  784. device_release_driver(&udev->dev);
  785. /*
  786. * At this point p54u_disconnect has already freed
  787. * the "priv" context. Do not use it anymore!
  788. */
  789. priv = NULL;
  790. if (parent)
  791. device_unlock(parent);
  792. }
  793. usb_put_dev(udev);
  794. }
  795. static int p54u_load_firmware(struct ieee80211_hw *dev,
  796. struct usb_interface *intf)
  797. {
  798. struct usb_device *udev = interface_to_usbdev(intf);
  799. struct p54u_priv *priv = dev->priv;
  800. struct device *device = &udev->dev;
  801. int err, i;
  802. BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
  803. init_completion(&priv->fw_wait_load);
  804. i = p54_find_type(priv);
  805. if (i < 0)
  806. return i;
  807. dev_info(&priv->udev->dev, "Loading firmware file %s\n",
  808. p54u_fwlist[i].fw);
  809. usb_get_dev(udev);
  810. err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw,
  811. device, GFP_KERNEL, priv,
  812. p54u_load_firmware_cb);
  813. if (err) {
  814. dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
  815. "(%d)!\n", p54u_fwlist[i].fw, err);
  816. usb_put_dev(udev);
  817. }
  818. return err;
  819. }
  820. static int p54u_probe(struct usb_interface *intf,
  821. const struct usb_device_id *id)
  822. {
  823. struct usb_device *udev = interface_to_usbdev(intf);
  824. struct ieee80211_hw *dev;
  825. struct p54u_priv *priv;
  826. int err;
  827. unsigned int i, recognized_pipes;
  828. dev = p54_init_common(sizeof(*priv));
  829. if (!dev) {
  830. dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
  831. return -ENOMEM;
  832. }
  833. priv = dev->priv;
  834. priv->hw_type = P54U_INVALID_HW;
  835. SET_IEEE80211_DEV(dev, &intf->dev);
  836. usb_set_intfdata(intf, dev);
  837. priv->udev = udev;
  838. priv->intf = intf;
  839. skb_queue_head_init(&priv->rx_queue);
  840. init_usb_anchor(&priv->submitted);
  841. usb_get_dev(udev);
  842. /* really lazy and simple way of figuring out if we're a 3887 */
  843. /* TODO: should just stick the identification in the device table */
  844. i = intf->altsetting->desc.bNumEndpoints;
  845. recognized_pipes = 0;
  846. while (i--) {
  847. switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
  848. case P54U_PIPE_DATA:
  849. case P54U_PIPE_MGMT:
  850. case P54U_PIPE_BRG:
  851. case P54U_PIPE_DEV:
  852. case P54U_PIPE_DATA | USB_DIR_IN:
  853. case P54U_PIPE_MGMT | USB_DIR_IN:
  854. case P54U_PIPE_BRG | USB_DIR_IN:
  855. case P54U_PIPE_DEV | USB_DIR_IN:
  856. case P54U_PIPE_INT | USB_DIR_IN:
  857. recognized_pipes++;
  858. }
  859. }
  860. priv->common.open = p54u_open;
  861. priv->common.stop = p54u_stop;
  862. if (recognized_pipes < P54U_PIPE_NUMBER) {
  863. #ifdef CONFIG_PM
  864. /* ISL3887 needs a full reset on resume */
  865. udev->reset_resume = 1;
  866. #endif /* CONFIG_PM */
  867. err = p54u_device_reset(dev);
  868. priv->hw_type = P54U_3887;
  869. dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
  870. priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
  871. priv->common.tx = p54u_tx_lm87;
  872. priv->upload_fw = p54u_upload_firmware_3887;
  873. } else {
  874. priv->hw_type = P54U_NET2280;
  875. dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
  876. priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
  877. priv->common.tx = p54u_tx_net2280;
  878. priv->upload_fw = p54u_upload_firmware_net2280;
  879. }
  880. err = p54u_load_firmware(dev, intf);
  881. if (err) {
  882. usb_put_dev(udev);
  883. p54_free_common(dev);
  884. }
  885. return err;
  886. }
  887. static void p54u_disconnect(struct usb_interface *intf)
  888. {
  889. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  890. struct p54u_priv *priv;
  891. if (!dev)
  892. return;
  893. priv = dev->priv;
  894. wait_for_completion(&priv->fw_wait_load);
  895. p54_unregister_common(dev);
  896. usb_put_dev(interface_to_usbdev(intf));
  897. release_firmware(priv->fw);
  898. p54_free_common(dev);
  899. }
  900. static int p54u_pre_reset(struct usb_interface *intf)
  901. {
  902. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  903. if (!dev)
  904. return -ENODEV;
  905. p54u_stop(dev);
  906. return 0;
  907. }
  908. static int p54u_resume(struct usb_interface *intf)
  909. {
  910. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  911. struct p54u_priv *priv;
  912. if (!dev)
  913. return -ENODEV;
  914. priv = dev->priv;
  915. if (unlikely(!(priv->upload_fw && priv->fw)))
  916. return 0;
  917. return priv->upload_fw(dev);
  918. }
  919. static int p54u_post_reset(struct usb_interface *intf)
  920. {
  921. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  922. struct p54u_priv *priv;
  923. int err;
  924. err = p54u_resume(intf);
  925. if (err)
  926. return err;
  927. /* reinitialize old device state */
  928. priv = dev->priv;
  929. if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
  930. ieee80211_restart_hw(dev);
  931. return 0;
  932. }
  933. #ifdef CONFIG_PM
  934. static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
  935. {
  936. return p54u_pre_reset(intf);
  937. }
  938. #endif /* CONFIG_PM */
  939. static struct usb_driver p54u_driver = {
  940. .name = "p54usb",
  941. .id_table = p54u_table,
  942. .probe = p54u_probe,
  943. .disconnect = p54u_disconnect,
  944. .pre_reset = p54u_pre_reset,
  945. .post_reset = p54u_post_reset,
  946. #ifdef CONFIG_PM
  947. .suspend = p54u_suspend,
  948. .resume = p54u_resume,
  949. .reset_resume = p54u_resume,
  950. #endif /* CONFIG_PM */
  951. .soft_unbind = 1,
  952. .disable_hub_initiated_lpm = 1,
  953. };
  954. module_usb_driver(p54u_driver);