p54usb.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  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/init.h>
  14. #include <linux/usb.h>
  15. #include <linux/pci.h>
  16. #include <linux/slab.h>
  17. #include <linux/firmware.h>
  18. #include <linux/etherdevice.h>
  19. #include <linux/delay.h>
  20. #include <linux/crc32.h>
  21. #include <linux/module.h>
  22. #include <net/mac80211.h>
  23. #include "p54.h"
  24. #include "lmac.h"
  25. #include "p54usb.h"
  26. MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
  27. MODULE_DESCRIPTION("Prism54 USB wireless driver");
  28. MODULE_LICENSE("GPL");
  29. MODULE_ALIAS("prism54usb");
  30. MODULE_FIRMWARE("isl3886usb");
  31. MODULE_FIRMWARE("isl3887usb");
  32. /*
  33. * Note:
  34. *
  35. * Always update our wiki's device list (located at:
  36. * http://wireless.kernel.org/en/users/Drivers/p54/devices ),
  37. * whenever you add a new device.
  38. */
  39. static struct usb_device_id p54u_table[] = {
  40. /* Version 1 devices (pci chip + net2280) */
  41. {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
  42. {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
  43. {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
  44. {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */
  45. {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
  46. {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
  47. {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
  48. {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */
  49. {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */
  50. {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */
  51. {USB_DEVICE(0x0846, 0x4200)}, /* Netgear WG121 */
  52. {USB_DEVICE(0x0846, 0x4210)}, /* Netgear WG121 the second ? */
  53. {USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
  54. {USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
  55. {USB_DEVICE(0x0bf8, 0x1007)}, /* Fujitsu E-5400 USB */
  56. {USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
  57. {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
  58. {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
  59. {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
  60. {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
  61. {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
  62. {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
  63. {USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
  64. {USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
  65. {USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
  66. {USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
  67. {USB_DEVICE(0x2001, 0x3703)}, /* DLink DWL-G122 */
  68. {USB_DEVICE(0x2001, 0x3762)}, /* Conceptronic C54U */
  69. {USB_DEVICE(0x5041, 0x2234)}, /* Linksys WUSB54G */
  70. {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */
  71. /* Version 2 devices (3887) */
  72. {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */
  73. {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */
  74. {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */
  75. {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */
  76. {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
  77. {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
  78. {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
  79. {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
  80. {USB_DEVICE(0x083a, 0x4503)}, /* T-Com Sinus 154 data II */
  81. {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
  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. dev_err(&priv->udev->dev, "(p54usb) cannot allocate firmware"
  445. "upload buffer!\n");
  446. return -ENOMEM;
  447. }
  448. left = block_size = min((size_t)P54U_FW_BLOCK, priv->fw->size);
  449. strcpy(buf, p54u_firmware_upload_3887);
  450. left -= strlen(p54u_firmware_upload_3887);
  451. tmp += strlen(p54u_firmware_upload_3887);
  452. data = priv->fw->data;
  453. remains = priv->fw->size;
  454. hdr = (struct x2_header *)(buf + strlen(p54u_firmware_upload_3887));
  455. memcpy(hdr->signature, X2_SIGNATURE, X2_SIGNATURE_SIZE);
  456. hdr->fw_load_addr = cpu_to_le32(ISL38XX_DEV_FIRMWARE_ADDR);
  457. hdr->fw_length = cpu_to_le32(priv->fw->size);
  458. hdr->crc = cpu_to_le32(~crc32_le(~0, (void *)&hdr->fw_load_addr,
  459. sizeof(u32)*2));
  460. left -= sizeof(*hdr);
  461. tmp += sizeof(*hdr);
  462. while (remains) {
  463. while (left--) {
  464. if (carry) {
  465. *tmp++ = carry;
  466. carry = 0;
  467. remains--;
  468. continue;
  469. }
  470. switch (*data) {
  471. case '~':
  472. *tmp++ = '}';
  473. carry = '^';
  474. break;
  475. case '}':
  476. *tmp++ = '}';
  477. carry = ']';
  478. break;
  479. default:
  480. *tmp++ = *data;
  481. remains--;
  482. break;
  483. }
  484. data++;
  485. }
  486. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
  487. if (err) {
  488. dev_err(&priv->udev->dev, "(p54usb) firmware "
  489. "upload failed!\n");
  490. goto err_upload_failed;
  491. }
  492. tmp = buf;
  493. left = block_size = min((unsigned int)P54U_FW_BLOCK, remains);
  494. }
  495. *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, priv->fw->data,
  496. priv->fw->size));
  497. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
  498. if (err) {
  499. dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
  500. goto err_upload_failed;
  501. }
  502. timeout = jiffies + msecs_to_jiffies(1000);
  503. while (!(err = usb_bulk_msg(priv->udev,
  504. usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
  505. if (alen > 2 && !memcmp(buf, "OK", 2))
  506. break;
  507. if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
  508. err = -EINVAL;
  509. break;
  510. }
  511. if (time_after(jiffies, timeout)) {
  512. dev_err(&priv->udev->dev, "(p54usb) firmware boot "
  513. "timed out!\n");
  514. err = -ETIMEDOUT;
  515. break;
  516. }
  517. }
  518. if (err) {
  519. dev_err(&priv->udev->dev, "(p54usb) firmware upload failed!\n");
  520. goto err_upload_failed;
  521. }
  522. buf[0] = 'g';
  523. buf[1] = '\r';
  524. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
  525. if (err) {
  526. dev_err(&priv->udev->dev, "(p54usb) firmware boot failed!\n");
  527. goto err_upload_failed;
  528. }
  529. timeout = jiffies + msecs_to_jiffies(1000);
  530. while (!(err = usb_bulk_msg(priv->udev,
  531. usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), buf, 128, &alen, 1000))) {
  532. if (alen > 0 && buf[0] == 'g')
  533. break;
  534. if (time_after(jiffies, timeout)) {
  535. err = -ETIMEDOUT;
  536. break;
  537. }
  538. }
  539. if (err)
  540. goto err_upload_failed;
  541. err_upload_failed:
  542. kfree(buf);
  543. return err;
  544. }
  545. static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
  546. {
  547. struct p54u_priv *priv = dev->priv;
  548. const struct p54p_csr *devreg = (const struct p54p_csr *) P54U_DEV_BASE;
  549. int err, alen;
  550. void *buf;
  551. __le32 reg;
  552. unsigned int remains, offset;
  553. const u8 *data;
  554. buf = kmalloc(512, GFP_KERNEL);
  555. if (!buf) {
  556. dev_err(&priv->udev->dev, "(p54usb) firmware buffer "
  557. "alloc failed!\n");
  558. return -ENOMEM;
  559. }
  560. #define P54U_WRITE(type, addr, data) \
  561. do {\
  562. err = p54u_write(priv, buf, type,\
  563. cpu_to_le32((u32)(unsigned long)addr), data);\
  564. if (err) \
  565. goto fail;\
  566. } while (0)
  567. #define P54U_READ(type, addr) \
  568. do {\
  569. err = p54u_read(priv, buf, type,\
  570. cpu_to_le32((u32)(unsigned long)addr), &reg);\
  571. if (err)\
  572. goto fail;\
  573. } while (0)
  574. /* power down net2280 bridge */
  575. P54U_READ(NET2280_BRG_U32, NET2280_GPIOCTL);
  576. reg |= cpu_to_le32(P54U_BRG_POWER_DOWN);
  577. reg &= cpu_to_le32(~P54U_BRG_POWER_UP);
  578. P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
  579. mdelay(100);
  580. /* power up bridge */
  581. reg |= cpu_to_le32(P54U_BRG_POWER_UP);
  582. reg &= cpu_to_le32(~P54U_BRG_POWER_DOWN);
  583. P54U_WRITE(NET2280_BRG_U32, NET2280_GPIOCTL, reg);
  584. mdelay(100);
  585. P54U_WRITE(NET2280_BRG_U32, NET2280_DEVINIT,
  586. cpu_to_le32(NET2280_CLK_30Mhz |
  587. NET2280_PCI_ENABLE |
  588. NET2280_PCI_SOFT_RESET));
  589. mdelay(20);
  590. P54U_WRITE(NET2280_BRG_CFG_U16, PCI_COMMAND,
  591. cpu_to_le32(PCI_COMMAND_MEMORY |
  592. PCI_COMMAND_MASTER));
  593. P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_0,
  594. cpu_to_le32(NET2280_BASE));
  595. P54U_READ(NET2280_BRG_CFG_U16, PCI_STATUS);
  596. reg |= cpu_to_le32(PCI_STATUS_REC_MASTER_ABORT);
  597. P54U_WRITE(NET2280_BRG_CFG_U16, PCI_STATUS, reg);
  598. // TODO: we really need this?
  599. P54U_READ(NET2280_BRG_U32, NET2280_RELNUM);
  600. P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_RSP,
  601. cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
  602. P54U_WRITE(NET2280_BRG_U32, NET2280_EPC_RSP,
  603. cpu_to_le32(NET2280_CLEAR_NAK_OUT_PACKETS_MODE));
  604. P54U_WRITE(NET2280_BRG_CFG_U32, PCI_BASE_ADDRESS_2,
  605. cpu_to_le32(NET2280_BASE2));
  606. /* finally done setting up the bridge */
  607. P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | PCI_COMMAND,
  608. cpu_to_le32(PCI_COMMAND_MEMORY |
  609. PCI_COMMAND_MASTER));
  610. P54U_WRITE(NET2280_DEV_CFG_U16, 0x10000 | 0x40 /* TRDY timeout */, 0);
  611. P54U_WRITE(NET2280_DEV_CFG_U32, 0x10000 | PCI_BASE_ADDRESS_0,
  612. cpu_to_le32(P54U_DEV_BASE));
  613. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
  614. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  615. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  616. /* do romboot */
  617. P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable, 0);
  618. P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
  619. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  620. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
  621. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
  622. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  623. mdelay(20);
  624. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  625. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  626. mdelay(20);
  627. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  628. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  629. mdelay(100);
  630. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  631. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  632. /* finally, we can upload firmware now! */
  633. remains = priv->fw->size;
  634. data = priv->fw->data;
  635. offset = ISL38XX_DEV_FIRMWARE_ADDR;
  636. while (remains) {
  637. unsigned int block_len = min(remains, (unsigned int)512);
  638. memcpy(buf, data, block_len);
  639. err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
  640. if (err) {
  641. dev_err(&priv->udev->dev, "(p54usb) firmware block "
  642. "upload failed\n");
  643. goto fail;
  644. }
  645. P54U_WRITE(NET2280_DEV_U32, &devreg->direct_mem_base,
  646. cpu_to_le32(0xc0000f00));
  647. P54U_WRITE(NET2280_DEV_U32,
  648. 0x0020 | (unsigned long)&devreg->direct_mem_win, 0);
  649. P54U_WRITE(NET2280_DEV_U32,
  650. 0x0020 | (unsigned long)&devreg->direct_mem_win,
  651. cpu_to_le32(1));
  652. P54U_WRITE(NET2280_DEV_U32,
  653. 0x0024 | (unsigned long)&devreg->direct_mem_win,
  654. cpu_to_le32(block_len));
  655. P54U_WRITE(NET2280_DEV_U32,
  656. 0x0028 | (unsigned long)&devreg->direct_mem_win,
  657. cpu_to_le32(offset));
  658. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_addr,
  659. cpu_to_le32(NET2280_EPA_FIFO_PCI_ADDR));
  660. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_len,
  661. cpu_to_le32(block_len >> 2));
  662. P54U_WRITE(NET2280_DEV_U32, &devreg->dma_ctrl,
  663. cpu_to_le32(ISL38XX_DMA_MASTER_CONTROL_TRIGGER));
  664. mdelay(10);
  665. P54U_READ(NET2280_DEV_U32,
  666. 0x002C | (unsigned long)&devreg->direct_mem_win);
  667. if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
  668. !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
  669. dev_err(&priv->udev->dev, "(p54usb) firmware DMA "
  670. "transfer failed\n");
  671. goto fail;
  672. }
  673. P54U_WRITE(NET2280_BRG_U32, NET2280_EPA_STAT,
  674. cpu_to_le32(NET2280_FIFO_FLUSH));
  675. remains -= block_len;
  676. data += block_len;
  677. offset += block_len;
  678. }
  679. /* do ramboot */
  680. P54U_READ(NET2280_DEV_U32, &devreg->ctrl_stat);
  681. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  682. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
  683. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
  684. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  685. mdelay(20);
  686. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  687. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  688. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  689. P54U_WRITE(NET2280_DEV_U32, &devreg->ctrl_stat, reg);
  690. mdelay(100);
  691. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  692. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  693. /* start up the firmware */
  694. P54U_WRITE(NET2280_DEV_U32, &devreg->int_enable,
  695. cpu_to_le32(ISL38XX_INT_IDENT_INIT));
  696. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  697. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  698. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1,
  699. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT_ENABLE |
  700. NET2280_USB_INTERRUPT_ENABLE));
  701. P54U_WRITE(NET2280_DEV_U32, &devreg->dev_int,
  702. cpu_to_le32(ISL38XX_DEV_INT_RESET));
  703. err = usb_interrupt_msg(priv->udev,
  704. usb_rcvbulkpipe(priv->udev, P54U_PIPE_INT),
  705. buf, sizeof(__le32), &alen, 1000);
  706. if (err || alen != sizeof(__le32))
  707. goto fail;
  708. P54U_READ(NET2280_DEV_U32, &devreg->int_ident);
  709. P54U_WRITE(NET2280_DEV_U32, &devreg->int_ack, reg);
  710. if (!(reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT)))
  711. err = -EINVAL;
  712. P54U_WRITE(NET2280_BRG_U32, NET2280_USBIRQENB1, 0);
  713. P54U_WRITE(NET2280_BRG_U32, NET2280_IRQSTAT1,
  714. cpu_to_le32(NET2280_PCI_INTA_INTERRUPT));
  715. #undef P54U_WRITE
  716. #undef P54U_READ
  717. fail:
  718. kfree(buf);
  719. return err;
  720. }
  721. static int p54_find_type(struct p54u_priv *priv)
  722. {
  723. int i;
  724. for (i = 0; i < __NUM_P54U_HWTYPES; i++)
  725. if (p54u_fwlist[i].type == priv->hw_type)
  726. break;
  727. if (i == __NUM_P54U_HWTYPES)
  728. return -EOPNOTSUPP;
  729. return i;
  730. }
  731. static int p54u_start_ops(struct p54u_priv *priv)
  732. {
  733. struct ieee80211_hw *dev = priv->common.hw;
  734. int ret;
  735. ret = p54_parse_firmware(dev, priv->fw);
  736. if (ret)
  737. goto err_out;
  738. ret = p54_find_type(priv);
  739. if (ret < 0)
  740. goto err_out;
  741. if (priv->common.fw_interface != p54u_fwlist[ret].intf) {
  742. dev_err(&priv->udev->dev, "wrong firmware, please get "
  743. "a firmware for \"%s\" and try again.\n",
  744. p54u_fwlist[ret].hw);
  745. ret = -ENODEV;
  746. goto err_out;
  747. }
  748. ret = priv->upload_fw(dev);
  749. if (ret)
  750. goto err_out;
  751. ret = p54u_open(dev);
  752. if (ret)
  753. goto err_out;
  754. ret = p54_read_eeprom(dev);
  755. if (ret)
  756. goto err_stop;
  757. p54u_stop(dev);
  758. ret = p54_register_common(dev, &priv->udev->dev);
  759. if (ret)
  760. goto err_stop;
  761. return 0;
  762. err_stop:
  763. p54u_stop(dev);
  764. err_out:
  765. /*
  766. * p54u_disconnect will do the rest of the
  767. * cleanup
  768. */
  769. return ret;
  770. }
  771. static void p54u_load_firmware_cb(const struct firmware *firmware,
  772. void *context)
  773. {
  774. struct p54u_priv *priv = context;
  775. struct usb_device *udev = priv->udev;
  776. int err;
  777. complete(&priv->fw_wait_load);
  778. if (firmware) {
  779. priv->fw = firmware;
  780. err = p54u_start_ops(priv);
  781. } else {
  782. err = -ENOENT;
  783. dev_err(&udev->dev, "Firmware not found.\n");
  784. }
  785. if (err) {
  786. struct device *parent = priv->udev->dev.parent;
  787. dev_err(&udev->dev, "failed to initialize device (%d)\n", err);
  788. if (parent)
  789. device_lock(parent);
  790. device_release_driver(&udev->dev);
  791. /*
  792. * At this point p54u_disconnect has already freed
  793. * the "priv" context. Do not use it anymore!
  794. */
  795. priv = NULL;
  796. if (parent)
  797. device_unlock(parent);
  798. }
  799. usb_put_dev(udev);
  800. }
  801. static int p54u_load_firmware(struct ieee80211_hw *dev,
  802. struct usb_interface *intf)
  803. {
  804. struct usb_device *udev = interface_to_usbdev(intf);
  805. struct p54u_priv *priv = dev->priv;
  806. struct device *device = &udev->dev;
  807. int err, i;
  808. BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
  809. init_completion(&priv->fw_wait_load);
  810. i = p54_find_type(priv);
  811. if (i < 0)
  812. return i;
  813. dev_info(&priv->udev->dev, "Loading firmware file %s\n",
  814. p54u_fwlist[i].fw);
  815. usb_get_dev(udev);
  816. err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw,
  817. device, GFP_KERNEL, priv,
  818. p54u_load_firmware_cb);
  819. if (err) {
  820. dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
  821. "(%d)!\n", p54u_fwlist[i].fw, err);
  822. }
  823. return err;
  824. }
  825. static int p54u_probe(struct usb_interface *intf,
  826. const struct usb_device_id *id)
  827. {
  828. struct usb_device *udev = interface_to_usbdev(intf);
  829. struct ieee80211_hw *dev;
  830. struct p54u_priv *priv;
  831. int err;
  832. unsigned int i, recognized_pipes;
  833. dev = p54_init_common(sizeof(*priv));
  834. if (!dev) {
  835. dev_err(&udev->dev, "(p54usb) ieee80211 alloc failed\n");
  836. return -ENOMEM;
  837. }
  838. priv = dev->priv;
  839. priv->hw_type = P54U_INVALID_HW;
  840. SET_IEEE80211_DEV(dev, &intf->dev);
  841. usb_set_intfdata(intf, dev);
  842. priv->udev = udev;
  843. priv->intf = intf;
  844. skb_queue_head_init(&priv->rx_queue);
  845. init_usb_anchor(&priv->submitted);
  846. usb_get_dev(udev);
  847. /* really lazy and simple way of figuring out if we're a 3887 */
  848. /* TODO: should just stick the identification in the device table */
  849. i = intf->altsetting->desc.bNumEndpoints;
  850. recognized_pipes = 0;
  851. while (i--) {
  852. switch (intf->altsetting->endpoint[i].desc.bEndpointAddress) {
  853. case P54U_PIPE_DATA:
  854. case P54U_PIPE_MGMT:
  855. case P54U_PIPE_BRG:
  856. case P54U_PIPE_DEV:
  857. case P54U_PIPE_DATA | USB_DIR_IN:
  858. case P54U_PIPE_MGMT | USB_DIR_IN:
  859. case P54U_PIPE_BRG | USB_DIR_IN:
  860. case P54U_PIPE_DEV | USB_DIR_IN:
  861. case P54U_PIPE_INT | USB_DIR_IN:
  862. recognized_pipes++;
  863. }
  864. }
  865. priv->common.open = p54u_open;
  866. priv->common.stop = p54u_stop;
  867. if (recognized_pipes < P54U_PIPE_NUMBER) {
  868. #ifdef CONFIG_PM
  869. /* ISL3887 needs a full reset on resume */
  870. udev->reset_resume = 1;
  871. #endif /* CONFIG_PM */
  872. err = p54u_device_reset(dev);
  873. priv->hw_type = P54U_3887;
  874. dev->extra_tx_headroom += sizeof(struct lm87_tx_hdr);
  875. priv->common.tx_hdr_len = sizeof(struct lm87_tx_hdr);
  876. priv->common.tx = p54u_tx_lm87;
  877. priv->upload_fw = p54u_upload_firmware_3887;
  878. } else {
  879. priv->hw_type = P54U_NET2280;
  880. dev->extra_tx_headroom += sizeof(struct net2280_tx_hdr);
  881. priv->common.tx_hdr_len = sizeof(struct net2280_tx_hdr);
  882. priv->common.tx = p54u_tx_net2280;
  883. priv->upload_fw = p54u_upload_firmware_net2280;
  884. }
  885. err = p54u_load_firmware(dev, intf);
  886. return err;
  887. }
  888. static void p54u_disconnect(struct usb_interface *intf)
  889. {
  890. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  891. struct p54u_priv *priv;
  892. if (!dev)
  893. return;
  894. priv = dev->priv;
  895. wait_for_completion(&priv->fw_wait_load);
  896. p54_unregister_common(dev);
  897. usb_put_dev(interface_to_usbdev(intf));
  898. release_firmware(priv->fw);
  899. p54_free_common(dev);
  900. }
  901. static int p54u_pre_reset(struct usb_interface *intf)
  902. {
  903. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  904. if (!dev)
  905. return -ENODEV;
  906. p54u_stop(dev);
  907. return 0;
  908. }
  909. static int p54u_resume(struct usb_interface *intf)
  910. {
  911. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  912. struct p54u_priv *priv;
  913. if (!dev)
  914. return -ENODEV;
  915. priv = dev->priv;
  916. if (unlikely(!(priv->upload_fw && priv->fw)))
  917. return 0;
  918. return priv->upload_fw(dev);
  919. }
  920. static int p54u_post_reset(struct usb_interface *intf)
  921. {
  922. struct ieee80211_hw *dev = usb_get_intfdata(intf);
  923. struct p54u_priv *priv;
  924. int err;
  925. err = p54u_resume(intf);
  926. if (err)
  927. return err;
  928. /* reinitialize old device state */
  929. priv = dev->priv;
  930. if (priv->common.mode != NL80211_IFTYPE_UNSPECIFIED)
  931. ieee80211_restart_hw(dev);
  932. return 0;
  933. }
  934. #ifdef CONFIG_PM
  935. static int p54u_suspend(struct usb_interface *intf, pm_message_t message)
  936. {
  937. return p54u_pre_reset(intf);
  938. }
  939. #endif /* CONFIG_PM */
  940. static struct usb_driver p54u_driver = {
  941. .name = "p54usb",
  942. .id_table = p54u_table,
  943. .probe = p54u_probe,
  944. .disconnect = p54u_disconnect,
  945. .pre_reset = p54u_pre_reset,
  946. .post_reset = p54u_post_reset,
  947. #ifdef CONFIG_PM
  948. .suspend = p54u_suspend,
  949. .resume = p54u_resume,
  950. .reset_resume = p54u_resume,
  951. #endif /* CONFIG_PM */
  952. .soft_unbind = 1,
  953. .disable_hub_initiated_lpm = 1,
  954. };
  955. module_usb_driver(p54u_driver);