usb.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513
  1. /*
  2. * Copyright (c) 2011 Broadcom Corporation
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  11. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  13. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/firmware.h>
  19. #include <linux/usb.h>
  20. #include <linux/vmalloc.h>
  21. #include <brcmu_utils.h>
  22. #include <brcm_hw_ids.h>
  23. #include <brcmu_wifi.h>
  24. #include "bus.h"
  25. #include "debug.h"
  26. #include "firmware.h"
  27. #include "usb.h"
  28. #include "core.h"
  29. #include "common.h"
  30. #define IOCTL_RESP_TIMEOUT msecs_to_jiffies(2000)
  31. #define BRCMF_USB_RESET_GETVER_SPINWAIT 100 /* in unit of ms */
  32. #define BRCMF_USB_RESET_GETVER_LOOP_CNT 10
  33. #define BRCMF_POSTBOOT_ID 0xA123 /* ID to detect if dongle
  34. has boot up */
  35. #define BRCMF_USB_NRXQ 50
  36. #define BRCMF_USB_NTXQ 50
  37. #define BRCMF_USB_CBCTL_WRITE 0
  38. #define BRCMF_USB_CBCTL_READ 1
  39. #define BRCMF_USB_MAX_PKT_SIZE 1600
  40. BRCMF_FW_DEF(43143, "brcmfmac43143.bin");
  41. BRCMF_FW_DEF(43236B, "brcmfmac43236b.bin");
  42. BRCMF_FW_DEF(43242A, "brcmfmac43242a.bin");
  43. BRCMF_FW_DEF(43569, "brcmfmac43569.bin");
  44. static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
  45. BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
  46. BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B),
  47. BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B),
  48. BRCMF_FW_ENTRY(BRCM_CC_43238_CHIP_ID, 0x00000008, 43236B),
  49. BRCMF_FW_ENTRY(BRCM_CC_43242_CHIP_ID, 0xFFFFFFFF, 43242A),
  50. BRCMF_FW_ENTRY(BRCM_CC_43566_CHIP_ID, 0xFFFFFFFF, 43569),
  51. BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569)
  52. };
  53. #define TRX_MAGIC 0x30524448 /* "HDR0" */
  54. #define TRX_MAX_OFFSET 3 /* Max number of file offsets */
  55. #define TRX_UNCOMP_IMAGE 0x20 /* Trx holds uncompressed img */
  56. #define TRX_RDL_CHUNK 1500 /* size of each dl transfer */
  57. #define TRX_OFFSETS_DLFWLEN_IDX 0
  58. /* Control messages: bRequest values */
  59. #define DL_GETSTATE 0 /* returns the rdl_state_t struct */
  60. #define DL_CHECK_CRC 1 /* currently unused */
  61. #define DL_GO 2 /* execute downloaded image */
  62. #define DL_START 3 /* initialize dl state */
  63. #define DL_REBOOT 4 /* reboot the device in 2 seconds */
  64. #define DL_GETVER 5 /* returns the bootrom_id_t struct */
  65. #define DL_GO_PROTECTED 6 /* execute the downloaded code and set reset
  66. * event to occur in 2 seconds. It is the
  67. * responsibility of the downloaded code to
  68. * clear this event
  69. */
  70. #define DL_EXEC 7 /* jump to a supplied address */
  71. #define DL_RESETCFG 8 /* To support single enum on dongle
  72. * - Not used by bootloader
  73. */
  74. #define DL_DEFER_RESP_OK 9 /* Potentially defer the response to setup
  75. * if resp unavailable
  76. */
  77. /* states */
  78. #define DL_WAITING 0 /* waiting to rx first pkt */
  79. #define DL_READY 1 /* hdr was good, waiting for more of the
  80. * compressed image
  81. */
  82. #define DL_BAD_HDR 2 /* hdr was corrupted */
  83. #define DL_BAD_CRC 3 /* compressed image was corrupted */
  84. #define DL_RUNNABLE 4 /* download was successful,waiting for go cmd */
  85. #define DL_START_FAIL 5 /* failed to initialize correctly */
  86. #define DL_NVRAM_TOOBIG 6 /* host specified nvram data exceeds DL_NVRAM
  87. * value
  88. */
  89. #define DL_IMAGE_TOOBIG 7 /* firmware image too big */
  90. struct trx_header_le {
  91. __le32 magic; /* "HDR0" */
  92. __le32 len; /* Length of file including header */
  93. __le32 crc32; /* CRC from flag_version to end of file */
  94. __le32 flag_version; /* 0:15 flags, 16:31 version */
  95. __le32 offsets[TRX_MAX_OFFSET]; /* Offsets of partitions from start of
  96. * header
  97. */
  98. };
  99. struct rdl_state_le {
  100. __le32 state;
  101. __le32 bytes;
  102. };
  103. struct bootrom_id_le {
  104. __le32 chip; /* Chip id */
  105. __le32 chiprev; /* Chip rev */
  106. __le32 ramsize; /* Size of RAM */
  107. __le32 remapbase; /* Current remap base address */
  108. __le32 boardtype; /* Type of board */
  109. __le32 boardrev; /* Board revision */
  110. };
  111. struct brcmf_usb_image {
  112. struct list_head list;
  113. s8 *fwname;
  114. u8 *image;
  115. int image_len;
  116. };
  117. struct brcmf_usbdev_info {
  118. struct brcmf_usbdev bus_pub; /* MUST BE FIRST */
  119. spinlock_t qlock;
  120. struct list_head rx_freeq;
  121. struct list_head rx_postq;
  122. struct list_head tx_freeq;
  123. struct list_head tx_postq;
  124. uint rx_pipe, tx_pipe;
  125. int rx_low_watermark;
  126. int tx_low_watermark;
  127. int tx_high_watermark;
  128. int tx_freecount;
  129. bool tx_flowblock;
  130. spinlock_t tx_flowblock_lock;
  131. struct brcmf_usbreq *tx_reqs;
  132. struct brcmf_usbreq *rx_reqs;
  133. char fw_name[BRCMF_FW_NAME_LEN];
  134. const u8 *image; /* buffer for combine fw and nvram */
  135. int image_len;
  136. struct usb_device *usbdev;
  137. struct device *dev;
  138. struct mutex dev_init_lock;
  139. int ctl_in_pipe, ctl_out_pipe;
  140. struct urb *ctl_urb; /* URB for control endpoint */
  141. struct usb_ctrlrequest ctl_write;
  142. struct usb_ctrlrequest ctl_read;
  143. u32 ctl_urb_actual_length;
  144. int ctl_urb_status;
  145. int ctl_completed;
  146. wait_queue_head_t ioctl_resp_wait;
  147. ulong ctl_op;
  148. u8 ifnum;
  149. struct urb *bulk_urb; /* used for FW download */
  150. bool wowl_enabled;
  151. struct brcmf_mp_device *settings;
  152. };
  153. static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
  154. struct brcmf_usbreq *req);
  155. static struct brcmf_usbdev *brcmf_usb_get_buspub(struct device *dev)
  156. {
  157. struct brcmf_bus *bus_if = dev_get_drvdata(dev);
  158. return bus_if->bus_priv.usb;
  159. }
  160. static struct brcmf_usbdev_info *brcmf_usb_get_businfo(struct device *dev)
  161. {
  162. return brcmf_usb_get_buspub(dev)->devinfo;
  163. }
  164. static int brcmf_usb_ioctl_resp_wait(struct brcmf_usbdev_info *devinfo)
  165. {
  166. return wait_event_timeout(devinfo->ioctl_resp_wait,
  167. devinfo->ctl_completed, IOCTL_RESP_TIMEOUT);
  168. }
  169. static void brcmf_usb_ioctl_resp_wake(struct brcmf_usbdev_info *devinfo)
  170. {
  171. wake_up(&devinfo->ioctl_resp_wait);
  172. }
  173. static void
  174. brcmf_usb_ctl_complete(struct brcmf_usbdev_info *devinfo, int type, int status)
  175. {
  176. brcmf_dbg(USB, "Enter, status=%d\n", status);
  177. if (unlikely(devinfo == NULL))
  178. return;
  179. if (type == BRCMF_USB_CBCTL_READ) {
  180. if (status == 0)
  181. devinfo->bus_pub.stats.rx_ctlpkts++;
  182. else
  183. devinfo->bus_pub.stats.rx_ctlerrs++;
  184. } else if (type == BRCMF_USB_CBCTL_WRITE) {
  185. if (status == 0)
  186. devinfo->bus_pub.stats.tx_ctlpkts++;
  187. else
  188. devinfo->bus_pub.stats.tx_ctlerrs++;
  189. }
  190. devinfo->ctl_urb_status = status;
  191. devinfo->ctl_completed = true;
  192. brcmf_usb_ioctl_resp_wake(devinfo);
  193. }
  194. static void
  195. brcmf_usb_ctlread_complete(struct urb *urb)
  196. {
  197. struct brcmf_usbdev_info *devinfo =
  198. (struct brcmf_usbdev_info *)urb->context;
  199. brcmf_dbg(USB, "Enter\n");
  200. devinfo->ctl_urb_actual_length = urb->actual_length;
  201. brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_READ,
  202. urb->status);
  203. }
  204. static void
  205. brcmf_usb_ctlwrite_complete(struct urb *urb)
  206. {
  207. struct brcmf_usbdev_info *devinfo =
  208. (struct brcmf_usbdev_info *)urb->context;
  209. brcmf_dbg(USB, "Enter\n");
  210. brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_WRITE,
  211. urb->status);
  212. }
  213. static int
  214. brcmf_usb_send_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
  215. {
  216. int ret;
  217. u16 size;
  218. brcmf_dbg(USB, "Enter\n");
  219. if (devinfo == NULL || buf == NULL ||
  220. len == 0 || devinfo->ctl_urb == NULL)
  221. return -EINVAL;
  222. size = len;
  223. devinfo->ctl_write.wLength = cpu_to_le16p(&size);
  224. devinfo->ctl_urb->transfer_buffer_length = size;
  225. devinfo->ctl_urb_status = 0;
  226. devinfo->ctl_urb_actual_length = 0;
  227. usb_fill_control_urb(devinfo->ctl_urb,
  228. devinfo->usbdev,
  229. devinfo->ctl_out_pipe,
  230. (unsigned char *) &devinfo->ctl_write,
  231. buf, size,
  232. (usb_complete_t)brcmf_usb_ctlwrite_complete,
  233. devinfo);
  234. ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
  235. if (ret < 0)
  236. brcmf_err("usb_submit_urb failed %d\n", ret);
  237. return ret;
  238. }
  239. static int
  240. brcmf_usb_recv_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
  241. {
  242. int ret;
  243. u16 size;
  244. brcmf_dbg(USB, "Enter\n");
  245. if ((devinfo == NULL) || (buf == NULL) || (len == 0)
  246. || (devinfo->ctl_urb == NULL))
  247. return -EINVAL;
  248. size = len;
  249. devinfo->ctl_read.wLength = cpu_to_le16p(&size);
  250. devinfo->ctl_urb->transfer_buffer_length = size;
  251. devinfo->ctl_read.bRequestType = USB_DIR_IN
  252. | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
  253. devinfo->ctl_read.bRequest = 1;
  254. usb_fill_control_urb(devinfo->ctl_urb,
  255. devinfo->usbdev,
  256. devinfo->ctl_in_pipe,
  257. (unsigned char *) &devinfo->ctl_read,
  258. buf, size,
  259. (usb_complete_t)brcmf_usb_ctlread_complete,
  260. devinfo);
  261. ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
  262. if (ret < 0)
  263. brcmf_err("usb_submit_urb failed %d\n", ret);
  264. return ret;
  265. }
  266. static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
  267. {
  268. int err = 0;
  269. int timeout = 0;
  270. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  271. brcmf_dbg(USB, "Enter\n");
  272. if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
  273. return -EIO;
  274. if (test_and_set_bit(0, &devinfo->ctl_op))
  275. return -EIO;
  276. devinfo->ctl_completed = false;
  277. err = brcmf_usb_send_ctl(devinfo, buf, len);
  278. if (err) {
  279. brcmf_err("fail %d bytes: %d\n", err, len);
  280. clear_bit(0, &devinfo->ctl_op);
  281. return err;
  282. }
  283. timeout = brcmf_usb_ioctl_resp_wait(devinfo);
  284. clear_bit(0, &devinfo->ctl_op);
  285. if (!timeout) {
  286. brcmf_err("Txctl wait timed out\n");
  287. err = -EIO;
  288. }
  289. return err;
  290. }
  291. static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
  292. {
  293. int err = 0;
  294. int timeout = 0;
  295. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  296. brcmf_dbg(USB, "Enter\n");
  297. if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
  298. return -EIO;
  299. if (test_and_set_bit(0, &devinfo->ctl_op))
  300. return -EIO;
  301. devinfo->ctl_completed = false;
  302. err = brcmf_usb_recv_ctl(devinfo, buf, len);
  303. if (err) {
  304. brcmf_err("fail %d bytes: %d\n", err, len);
  305. clear_bit(0, &devinfo->ctl_op);
  306. return err;
  307. }
  308. timeout = brcmf_usb_ioctl_resp_wait(devinfo);
  309. err = devinfo->ctl_urb_status;
  310. clear_bit(0, &devinfo->ctl_op);
  311. if (!timeout) {
  312. brcmf_err("rxctl wait timed out\n");
  313. err = -EIO;
  314. }
  315. if (!err)
  316. return devinfo->ctl_urb_actual_length;
  317. else
  318. return err;
  319. }
  320. static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
  321. struct list_head *q, int *counter)
  322. {
  323. unsigned long flags;
  324. struct brcmf_usbreq *req;
  325. spin_lock_irqsave(&devinfo->qlock, flags);
  326. if (list_empty(q)) {
  327. spin_unlock_irqrestore(&devinfo->qlock, flags);
  328. return NULL;
  329. }
  330. req = list_entry(q->next, struct brcmf_usbreq, list);
  331. list_del_init(q->next);
  332. if (counter)
  333. (*counter)--;
  334. spin_unlock_irqrestore(&devinfo->qlock, flags);
  335. return req;
  336. }
  337. static void brcmf_usb_enq(struct brcmf_usbdev_info *devinfo,
  338. struct list_head *q, struct brcmf_usbreq *req,
  339. int *counter)
  340. {
  341. unsigned long flags;
  342. spin_lock_irqsave(&devinfo->qlock, flags);
  343. list_add_tail(&req->list, q);
  344. if (counter)
  345. (*counter)++;
  346. spin_unlock_irqrestore(&devinfo->qlock, flags);
  347. }
  348. static struct brcmf_usbreq *
  349. brcmf_usbdev_qinit(struct list_head *q, int qsize)
  350. {
  351. int i;
  352. struct brcmf_usbreq *req, *reqs;
  353. reqs = kcalloc(qsize, sizeof(struct brcmf_usbreq), GFP_ATOMIC);
  354. if (reqs == NULL)
  355. return NULL;
  356. req = reqs;
  357. for (i = 0; i < qsize; i++) {
  358. req->urb = usb_alloc_urb(0, GFP_ATOMIC);
  359. if (!req->urb)
  360. goto fail;
  361. INIT_LIST_HEAD(&req->list);
  362. list_add_tail(&req->list, q);
  363. req++;
  364. }
  365. return reqs;
  366. fail:
  367. brcmf_err("fail!\n");
  368. while (!list_empty(q)) {
  369. req = list_entry(q->next, struct brcmf_usbreq, list);
  370. if (req)
  371. usb_free_urb(req->urb);
  372. list_del(q->next);
  373. }
  374. return NULL;
  375. }
  376. static void brcmf_usb_free_q(struct list_head *q, bool pending)
  377. {
  378. struct brcmf_usbreq *req, *next;
  379. int i = 0;
  380. list_for_each_entry_safe(req, next, q, list) {
  381. if (!req->urb) {
  382. brcmf_err("bad req\n");
  383. break;
  384. }
  385. i++;
  386. if (pending) {
  387. usb_kill_urb(req->urb);
  388. } else {
  389. usb_free_urb(req->urb);
  390. list_del_init(&req->list);
  391. }
  392. }
  393. }
  394. static void brcmf_usb_del_fromq(struct brcmf_usbdev_info *devinfo,
  395. struct brcmf_usbreq *req)
  396. {
  397. unsigned long flags;
  398. spin_lock_irqsave(&devinfo->qlock, flags);
  399. list_del_init(&req->list);
  400. spin_unlock_irqrestore(&devinfo->qlock, flags);
  401. }
  402. static void brcmf_usb_tx_complete(struct urb *urb)
  403. {
  404. struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context;
  405. struct brcmf_usbdev_info *devinfo = req->devinfo;
  406. unsigned long flags;
  407. brcmf_dbg(USB, "Enter, urb->status=%d, skb=%p\n", urb->status,
  408. req->skb);
  409. brcmf_usb_del_fromq(devinfo, req);
  410. brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
  411. req->skb = NULL;
  412. brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
  413. spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
  414. if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
  415. devinfo->tx_flowblock) {
  416. brcmf_txflowblock(devinfo->dev, false);
  417. devinfo->tx_flowblock = false;
  418. }
  419. spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
  420. }
  421. static void brcmf_usb_rx_complete(struct urb *urb)
  422. {
  423. struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context;
  424. struct brcmf_usbdev_info *devinfo = req->devinfo;
  425. struct sk_buff *skb;
  426. brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status);
  427. brcmf_usb_del_fromq(devinfo, req);
  428. skb = req->skb;
  429. req->skb = NULL;
  430. /* zero lenght packets indicate usb "failure". Do not refill */
  431. if (urb->status != 0 || !urb->actual_length) {
  432. brcmu_pkt_buf_free_skb(skb);
  433. brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
  434. return;
  435. }
  436. if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
  437. skb_put(skb, urb->actual_length);
  438. brcmf_rx_frame(devinfo->dev, skb, true);
  439. brcmf_usb_rx_refill(devinfo, req);
  440. } else {
  441. brcmu_pkt_buf_free_skb(skb);
  442. brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
  443. }
  444. return;
  445. }
  446. static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
  447. struct brcmf_usbreq *req)
  448. {
  449. struct sk_buff *skb;
  450. int ret;
  451. if (!req || !devinfo)
  452. return;
  453. skb = dev_alloc_skb(devinfo->bus_pub.bus_mtu);
  454. if (!skb) {
  455. brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
  456. return;
  457. }
  458. req->skb = skb;
  459. usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
  460. skb->data, skb_tailroom(skb), brcmf_usb_rx_complete,
  461. req);
  462. req->devinfo = devinfo;
  463. brcmf_usb_enq(devinfo, &devinfo->rx_postq, req, NULL);
  464. ret = usb_submit_urb(req->urb, GFP_ATOMIC);
  465. if (ret) {
  466. brcmf_usb_del_fromq(devinfo, req);
  467. brcmu_pkt_buf_free_skb(req->skb);
  468. req->skb = NULL;
  469. brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
  470. }
  471. return;
  472. }
  473. static void brcmf_usb_rx_fill_all(struct brcmf_usbdev_info *devinfo)
  474. {
  475. struct brcmf_usbreq *req;
  476. if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
  477. brcmf_err("bus is not up=%d\n", devinfo->bus_pub.state);
  478. return;
  479. }
  480. while ((req = brcmf_usb_deq(devinfo, &devinfo->rx_freeq, NULL)) != NULL)
  481. brcmf_usb_rx_refill(devinfo, req);
  482. }
  483. static void
  484. brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
  485. {
  486. struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus;
  487. int old_state;
  488. brcmf_dbg(USB, "Enter, current state=%d, new state=%d\n",
  489. devinfo->bus_pub.state, state);
  490. if (devinfo->bus_pub.state == state)
  491. return;
  492. old_state = devinfo->bus_pub.state;
  493. devinfo->bus_pub.state = state;
  494. /* update state of upper layer */
  495. if (state == BRCMFMAC_USB_STATE_DOWN) {
  496. brcmf_dbg(USB, "DBUS is down\n");
  497. brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_DOWN);
  498. } else if (state == BRCMFMAC_USB_STATE_UP) {
  499. brcmf_dbg(USB, "DBUS is up\n");
  500. brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_UP);
  501. } else {
  502. brcmf_dbg(USB, "DBUS current state=%d\n", state);
  503. }
  504. }
  505. static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
  506. {
  507. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  508. struct brcmf_usbreq *req;
  509. int ret;
  510. unsigned long flags;
  511. brcmf_dbg(USB, "Enter, skb=%p\n", skb);
  512. if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
  513. ret = -EIO;
  514. goto fail;
  515. }
  516. req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq,
  517. &devinfo->tx_freecount);
  518. if (!req) {
  519. brcmf_err("no req to send\n");
  520. ret = -ENOMEM;
  521. goto fail;
  522. }
  523. req->skb = skb;
  524. req->devinfo = devinfo;
  525. usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
  526. skb->data, skb->len, brcmf_usb_tx_complete, req);
  527. req->urb->transfer_flags |= URB_ZERO_PACKET;
  528. brcmf_usb_enq(devinfo, &devinfo->tx_postq, req, NULL);
  529. ret = usb_submit_urb(req->urb, GFP_ATOMIC);
  530. if (ret) {
  531. brcmf_err("brcmf_usb_tx usb_submit_urb FAILED\n");
  532. brcmf_usb_del_fromq(devinfo, req);
  533. req->skb = NULL;
  534. brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req,
  535. &devinfo->tx_freecount);
  536. goto fail;
  537. }
  538. spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
  539. if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
  540. !devinfo->tx_flowblock) {
  541. brcmf_txflowblock(dev, true);
  542. devinfo->tx_flowblock = true;
  543. }
  544. spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
  545. return 0;
  546. fail:
  547. return ret;
  548. }
  549. static int brcmf_usb_up(struct device *dev)
  550. {
  551. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  552. brcmf_dbg(USB, "Enter\n");
  553. if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP)
  554. return 0;
  555. /* Success, indicate devinfo is fully up */
  556. brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP);
  557. if (devinfo->ctl_urb) {
  558. devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0);
  559. devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0);
  560. /* CTL Write */
  561. devinfo->ctl_write.bRequestType =
  562. USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
  563. devinfo->ctl_write.bRequest = 0;
  564. devinfo->ctl_write.wValue = cpu_to_le16(0);
  565. devinfo->ctl_write.wIndex = cpu_to_le16(devinfo->ifnum);
  566. /* CTL Read */
  567. devinfo->ctl_read.bRequestType =
  568. USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
  569. devinfo->ctl_read.bRequest = 1;
  570. devinfo->ctl_read.wValue = cpu_to_le16(0);
  571. devinfo->ctl_read.wIndex = cpu_to_le16(devinfo->ifnum);
  572. }
  573. brcmf_usb_rx_fill_all(devinfo);
  574. return 0;
  575. }
  576. static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
  577. {
  578. if (devinfo->ctl_urb)
  579. usb_kill_urb(devinfo->ctl_urb);
  580. if (devinfo->bulk_urb)
  581. usb_kill_urb(devinfo->bulk_urb);
  582. brcmf_usb_free_q(&devinfo->tx_postq, true);
  583. brcmf_usb_free_q(&devinfo->rx_postq, true);
  584. }
  585. static void brcmf_usb_down(struct device *dev)
  586. {
  587. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  588. brcmf_dbg(USB, "Enter\n");
  589. if (devinfo == NULL)
  590. return;
  591. if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_DOWN)
  592. return;
  593. brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_DOWN);
  594. brcmf_cancel_all_urbs(devinfo);
  595. }
  596. static void
  597. brcmf_usb_sync_complete(struct urb *urb)
  598. {
  599. struct brcmf_usbdev_info *devinfo =
  600. (struct brcmf_usbdev_info *)urb->context;
  601. devinfo->ctl_completed = true;
  602. brcmf_usb_ioctl_resp_wake(devinfo);
  603. }
  604. static int brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd,
  605. void *buffer, int buflen)
  606. {
  607. int ret;
  608. char *tmpbuf;
  609. u16 size;
  610. if ((!devinfo) || (devinfo->ctl_urb == NULL))
  611. return -EINVAL;
  612. tmpbuf = kmalloc(buflen, GFP_ATOMIC);
  613. if (!tmpbuf)
  614. return -ENOMEM;
  615. size = buflen;
  616. devinfo->ctl_urb->transfer_buffer_length = size;
  617. devinfo->ctl_read.wLength = cpu_to_le16p(&size);
  618. devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR |
  619. USB_RECIP_INTERFACE;
  620. devinfo->ctl_read.bRequest = cmd;
  621. usb_fill_control_urb(devinfo->ctl_urb,
  622. devinfo->usbdev,
  623. usb_rcvctrlpipe(devinfo->usbdev, 0),
  624. (unsigned char *) &devinfo->ctl_read,
  625. (void *) tmpbuf, size,
  626. (usb_complete_t)brcmf_usb_sync_complete, devinfo);
  627. devinfo->ctl_completed = false;
  628. ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
  629. if (ret < 0) {
  630. brcmf_err("usb_submit_urb failed %d\n", ret);
  631. goto finalize;
  632. }
  633. if (!brcmf_usb_ioctl_resp_wait(devinfo)) {
  634. usb_kill_urb(devinfo->ctl_urb);
  635. ret = -ETIMEDOUT;
  636. } else {
  637. memcpy(buffer, tmpbuf, buflen);
  638. }
  639. finalize:
  640. kfree(tmpbuf);
  641. return ret;
  642. }
  643. static bool
  644. brcmf_usb_dlneeded(struct brcmf_usbdev_info *devinfo)
  645. {
  646. struct bootrom_id_le id;
  647. u32 chipid, chiprev;
  648. brcmf_dbg(USB, "Enter\n");
  649. if (devinfo == NULL)
  650. return false;
  651. /* Check if firmware downloaded already by querying runtime ID */
  652. id.chip = cpu_to_le32(0xDEAD);
  653. brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
  654. chipid = le32_to_cpu(id.chip);
  655. chiprev = le32_to_cpu(id.chiprev);
  656. if ((chipid & 0x4300) == 0x4300)
  657. brcmf_dbg(USB, "chip %x rev 0x%x\n", chipid, chiprev);
  658. else
  659. brcmf_dbg(USB, "chip %d rev 0x%x\n", chipid, chiprev);
  660. if (chipid == BRCMF_POSTBOOT_ID) {
  661. brcmf_dbg(USB, "firmware already downloaded\n");
  662. brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
  663. return false;
  664. } else {
  665. devinfo->bus_pub.devid = chipid;
  666. devinfo->bus_pub.chiprev = chiprev;
  667. }
  668. return true;
  669. }
  670. static int
  671. brcmf_usb_resetcfg(struct brcmf_usbdev_info *devinfo)
  672. {
  673. struct bootrom_id_le id;
  674. u32 loop_cnt;
  675. int err;
  676. brcmf_dbg(USB, "Enter\n");
  677. loop_cnt = 0;
  678. do {
  679. mdelay(BRCMF_USB_RESET_GETVER_SPINWAIT);
  680. loop_cnt++;
  681. id.chip = cpu_to_le32(0xDEAD); /* Get the ID */
  682. err = brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
  683. if ((err) && (err != -ETIMEDOUT))
  684. return err;
  685. if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID))
  686. break;
  687. } while (loop_cnt < BRCMF_USB_RESET_GETVER_LOOP_CNT);
  688. if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID)) {
  689. brcmf_dbg(USB, "postboot chip 0x%x/rev 0x%x\n",
  690. le32_to_cpu(id.chip), le32_to_cpu(id.chiprev));
  691. brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
  692. return 0;
  693. } else {
  694. brcmf_err("Cannot talk to Dongle. Firmware is not UP, %d ms\n",
  695. BRCMF_USB_RESET_GETVER_SPINWAIT * loop_cnt);
  696. return -EINVAL;
  697. }
  698. }
  699. static int
  700. brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
  701. {
  702. int ret;
  703. if ((devinfo == NULL) || (devinfo->bulk_urb == NULL))
  704. return -EINVAL;
  705. /* Prepare the URB */
  706. usb_fill_bulk_urb(devinfo->bulk_urb, devinfo->usbdev,
  707. devinfo->tx_pipe, buffer, len,
  708. (usb_complete_t)brcmf_usb_sync_complete, devinfo);
  709. devinfo->bulk_urb->transfer_flags |= URB_ZERO_PACKET;
  710. devinfo->ctl_completed = false;
  711. ret = usb_submit_urb(devinfo->bulk_urb, GFP_ATOMIC);
  712. if (ret) {
  713. brcmf_err("usb_submit_urb failed %d\n", ret);
  714. return ret;
  715. }
  716. ret = brcmf_usb_ioctl_resp_wait(devinfo);
  717. return (ret == 0);
  718. }
  719. static int
  720. brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
  721. {
  722. unsigned int sendlen, sent, dllen;
  723. char *bulkchunk = NULL, *dlpos;
  724. struct rdl_state_le state;
  725. u32 rdlstate, rdlbytes;
  726. int err = 0;
  727. brcmf_dbg(USB, "Enter, fw %p, len %d\n", fw, fwlen);
  728. bulkchunk = kmalloc(TRX_RDL_CHUNK, GFP_ATOMIC);
  729. if (bulkchunk == NULL) {
  730. err = -ENOMEM;
  731. goto fail;
  732. }
  733. /* 1) Prepare USB boot loader for runtime image */
  734. brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
  735. rdlstate = le32_to_cpu(state.state);
  736. rdlbytes = le32_to_cpu(state.bytes);
  737. /* 2) Check we are in the Waiting state */
  738. if (rdlstate != DL_WAITING) {
  739. brcmf_err("Failed to DL_START\n");
  740. err = -EINVAL;
  741. goto fail;
  742. }
  743. sent = 0;
  744. dlpos = fw;
  745. dllen = fwlen;
  746. /* Get chip id and rev */
  747. while (rdlbytes != dllen) {
  748. /* Wait until the usb device reports it received all
  749. * the bytes we sent */
  750. if ((rdlbytes == sent) && (rdlbytes != dllen)) {
  751. if ((dllen-sent) < TRX_RDL_CHUNK)
  752. sendlen = dllen-sent;
  753. else
  754. sendlen = TRX_RDL_CHUNK;
  755. /* simply avoid having to send a ZLP by ensuring we
  756. * never have an even
  757. * multiple of 64
  758. */
  759. if (!(sendlen % 64))
  760. sendlen -= 4;
  761. /* send data */
  762. memcpy(bulkchunk, dlpos, sendlen);
  763. if (brcmf_usb_dl_send_bulk(devinfo, bulkchunk,
  764. sendlen)) {
  765. brcmf_err("send_bulk failed\n");
  766. err = -EINVAL;
  767. goto fail;
  768. }
  769. dlpos += sendlen;
  770. sent += sendlen;
  771. }
  772. err = brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state,
  773. sizeof(state));
  774. if (err) {
  775. brcmf_err("DL_GETSTATE Failed\n");
  776. goto fail;
  777. }
  778. rdlstate = le32_to_cpu(state.state);
  779. rdlbytes = le32_to_cpu(state.bytes);
  780. /* restart if an error is reported */
  781. if (rdlstate == DL_BAD_HDR || rdlstate == DL_BAD_CRC) {
  782. brcmf_err("Bad Hdr or Bad CRC state %d\n",
  783. rdlstate);
  784. err = -EINVAL;
  785. goto fail;
  786. }
  787. }
  788. fail:
  789. kfree(bulkchunk);
  790. brcmf_dbg(USB, "Exit, err=%d\n", err);
  791. return err;
  792. }
  793. static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, u8 *fw, int len)
  794. {
  795. int err;
  796. brcmf_dbg(USB, "Enter\n");
  797. if (devinfo == NULL)
  798. return -EINVAL;
  799. if (devinfo->bus_pub.devid == 0xDEAD)
  800. return -EINVAL;
  801. err = brcmf_usb_dl_writeimage(devinfo, fw, len);
  802. if (err == 0)
  803. devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_DONE;
  804. else
  805. devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_FAIL;
  806. brcmf_dbg(USB, "Exit, err=%d\n", err);
  807. return err;
  808. }
  809. static int brcmf_usb_dlrun(struct brcmf_usbdev_info *devinfo)
  810. {
  811. struct rdl_state_le state;
  812. brcmf_dbg(USB, "Enter\n");
  813. if (!devinfo)
  814. return -EINVAL;
  815. if (devinfo->bus_pub.devid == 0xDEAD)
  816. return -EINVAL;
  817. /* Check we are runnable */
  818. state.state = 0;
  819. brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state, sizeof(state));
  820. /* Start the image */
  821. if (state.state == cpu_to_le32(DL_RUNNABLE)) {
  822. if (brcmf_usb_dl_cmd(devinfo, DL_GO, &state, sizeof(state)))
  823. return -ENODEV;
  824. if (brcmf_usb_resetcfg(devinfo))
  825. return -ENODEV;
  826. /* The Dongle may go for re-enumeration. */
  827. } else {
  828. brcmf_err("Dongle not runnable\n");
  829. return -EINVAL;
  830. }
  831. brcmf_dbg(USB, "Exit\n");
  832. return 0;
  833. }
  834. static int
  835. brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
  836. {
  837. int err;
  838. brcmf_dbg(USB, "Enter\n");
  839. if (devinfo == NULL)
  840. return -ENODEV;
  841. if (!devinfo->image) {
  842. brcmf_err("No firmware!\n");
  843. return -ENOENT;
  844. }
  845. err = brcmf_usb_dlstart(devinfo,
  846. (u8 *)devinfo->image, devinfo->image_len);
  847. if (err == 0)
  848. err = brcmf_usb_dlrun(devinfo);
  849. return err;
  850. }
  851. static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo)
  852. {
  853. brcmf_dbg(USB, "Enter, devinfo %p\n", devinfo);
  854. /* free the URBS */
  855. brcmf_usb_free_q(&devinfo->rx_freeq, false);
  856. brcmf_usb_free_q(&devinfo->tx_freeq, false);
  857. usb_free_urb(devinfo->ctl_urb);
  858. usb_free_urb(devinfo->bulk_urb);
  859. kfree(devinfo->tx_reqs);
  860. kfree(devinfo->rx_reqs);
  861. if (devinfo->settings)
  862. brcmf_release_module_param(devinfo->settings);
  863. }
  864. static int check_file(const u8 *headers)
  865. {
  866. struct trx_header_le *trx;
  867. int actual_len = -1;
  868. brcmf_dbg(USB, "Enter\n");
  869. /* Extract trx header */
  870. trx = (struct trx_header_le *) headers;
  871. if (trx->magic != cpu_to_le32(TRX_MAGIC))
  872. return -1;
  873. headers += sizeof(struct trx_header_le);
  874. if (le32_to_cpu(trx->flag_version) & TRX_UNCOMP_IMAGE) {
  875. actual_len = le32_to_cpu(trx->offsets[TRX_OFFSETS_DLFWLEN_IDX]);
  876. return actual_len + sizeof(struct trx_header_le);
  877. }
  878. return -1;
  879. }
  880. static
  881. struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
  882. int nrxq, int ntxq)
  883. {
  884. brcmf_dbg(USB, "Enter\n");
  885. devinfo->bus_pub.nrxq = nrxq;
  886. devinfo->rx_low_watermark = nrxq / 2;
  887. devinfo->bus_pub.devinfo = devinfo;
  888. devinfo->bus_pub.ntxq = ntxq;
  889. devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DOWN;
  890. /* flow control when too many tx urbs posted */
  891. devinfo->tx_low_watermark = ntxq / 4;
  892. devinfo->tx_high_watermark = devinfo->tx_low_watermark * 3;
  893. devinfo->bus_pub.bus_mtu = BRCMF_USB_MAX_PKT_SIZE;
  894. /* Initialize other structure content */
  895. init_waitqueue_head(&devinfo->ioctl_resp_wait);
  896. /* Initialize the spinlocks */
  897. spin_lock_init(&devinfo->qlock);
  898. spin_lock_init(&devinfo->tx_flowblock_lock);
  899. INIT_LIST_HEAD(&devinfo->rx_freeq);
  900. INIT_LIST_HEAD(&devinfo->rx_postq);
  901. INIT_LIST_HEAD(&devinfo->tx_freeq);
  902. INIT_LIST_HEAD(&devinfo->tx_postq);
  903. devinfo->tx_flowblock = false;
  904. devinfo->rx_reqs = brcmf_usbdev_qinit(&devinfo->rx_freeq, nrxq);
  905. if (!devinfo->rx_reqs)
  906. goto error;
  907. devinfo->tx_reqs = brcmf_usbdev_qinit(&devinfo->tx_freeq, ntxq);
  908. if (!devinfo->tx_reqs)
  909. goto error;
  910. devinfo->tx_freecount = ntxq;
  911. devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC);
  912. if (!devinfo->ctl_urb)
  913. goto error;
  914. devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC);
  915. if (!devinfo->bulk_urb)
  916. goto error;
  917. return &devinfo->bus_pub;
  918. error:
  919. brcmf_err("failed!\n");
  920. brcmf_usb_detach(devinfo);
  921. return NULL;
  922. }
  923. static void brcmf_usb_wowl_config(struct device *dev, bool enabled)
  924. {
  925. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  926. brcmf_dbg(USB, "Configuring WOWL, enabled=%d\n", enabled);
  927. devinfo->wowl_enabled = enabled;
  928. if (enabled)
  929. device_set_wakeup_enable(devinfo->dev, true);
  930. else
  931. device_set_wakeup_enable(devinfo->dev, false);
  932. }
  933. static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
  934. .txdata = brcmf_usb_tx,
  935. .stop = brcmf_usb_down,
  936. .txctl = brcmf_usb_tx_ctlpkt,
  937. .rxctl = brcmf_usb_rx_ctlpkt,
  938. .wowl_config = brcmf_usb_wowl_config,
  939. };
  940. static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo)
  941. {
  942. int ret;
  943. /* Attach to the common driver interface */
  944. ret = brcmf_attach(devinfo->dev, devinfo->settings);
  945. if (ret) {
  946. brcmf_err("brcmf_attach failed\n");
  947. return ret;
  948. }
  949. ret = brcmf_usb_up(devinfo->dev);
  950. if (ret)
  951. goto fail;
  952. ret = brcmf_bus_start(devinfo->dev);
  953. if (ret)
  954. goto fail;
  955. return 0;
  956. fail:
  957. brcmf_detach(devinfo->dev);
  958. return ret;
  959. }
  960. static void brcmf_usb_probe_phase2(struct device *dev,
  961. const struct firmware *fw,
  962. void *nvram, u32 nvlen)
  963. {
  964. struct brcmf_bus *bus = dev_get_drvdata(dev);
  965. struct brcmf_usbdev_info *devinfo;
  966. int ret;
  967. brcmf_dbg(USB, "Start fw downloading\n");
  968. devinfo = bus->bus_priv.usb->devinfo;
  969. ret = check_file(fw->data);
  970. if (ret < 0) {
  971. brcmf_err("invalid firmware\n");
  972. release_firmware(fw);
  973. goto error;
  974. }
  975. devinfo->image = fw->data;
  976. devinfo->image_len = fw->size;
  977. ret = brcmf_usb_fw_download(devinfo);
  978. release_firmware(fw);
  979. if (ret)
  980. goto error;
  981. ret = brcmf_usb_bus_setup(devinfo);
  982. if (ret)
  983. goto error;
  984. mutex_unlock(&devinfo->dev_init_lock);
  985. return;
  986. error:
  987. brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
  988. mutex_unlock(&devinfo->dev_init_lock);
  989. device_release_driver(dev);
  990. }
  991. static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
  992. {
  993. struct brcmf_bus *bus = NULL;
  994. struct brcmf_usbdev *bus_pub = NULL;
  995. struct device *dev = devinfo->dev;
  996. int ret;
  997. brcmf_dbg(USB, "Enter\n");
  998. bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ);
  999. if (!bus_pub)
  1000. return -ENODEV;
  1001. bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC);
  1002. if (!bus) {
  1003. ret = -ENOMEM;
  1004. goto fail;
  1005. }
  1006. bus->dev = dev;
  1007. bus_pub->bus = bus;
  1008. bus->bus_priv.usb = bus_pub;
  1009. dev_set_drvdata(dev, bus);
  1010. bus->ops = &brcmf_usb_bus_ops;
  1011. bus->proto_type = BRCMF_PROTO_BCDC;
  1012. bus->always_use_fws_queue = true;
  1013. #ifdef CONFIG_PM
  1014. bus->wowl_supported = true;
  1015. #endif
  1016. devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB,
  1017. bus_pub->devid,
  1018. bus_pub->chiprev);
  1019. if (!devinfo->settings) {
  1020. ret = -ENOMEM;
  1021. goto fail;
  1022. }
  1023. if (!brcmf_usb_dlneeded(devinfo)) {
  1024. ret = brcmf_usb_bus_setup(devinfo);
  1025. if (ret)
  1026. goto fail;
  1027. /* we are done */
  1028. mutex_unlock(&devinfo->dev_init_lock);
  1029. return 0;
  1030. }
  1031. bus->chip = bus_pub->devid;
  1032. bus->chiprev = bus_pub->chiprev;
  1033. ret = brcmf_fw_map_chip_to_name(bus_pub->devid, bus_pub->chiprev,
  1034. brcmf_usb_fwnames,
  1035. ARRAY_SIZE(brcmf_usb_fwnames),
  1036. devinfo->fw_name, NULL);
  1037. if (ret)
  1038. goto fail;
  1039. /* request firmware here */
  1040. ret = brcmf_fw_get_firmwares(dev, 0, devinfo->fw_name, NULL,
  1041. brcmf_usb_probe_phase2);
  1042. if (ret) {
  1043. brcmf_err("firmware request failed: %d\n", ret);
  1044. goto fail;
  1045. }
  1046. return 0;
  1047. fail:
  1048. /* Release resources in reverse order */
  1049. kfree(bus);
  1050. brcmf_usb_detach(devinfo);
  1051. return ret;
  1052. }
  1053. static void
  1054. brcmf_usb_disconnect_cb(struct brcmf_usbdev_info *devinfo)
  1055. {
  1056. if (!devinfo)
  1057. return;
  1058. brcmf_dbg(USB, "Enter, bus_pub %p\n", devinfo);
  1059. brcmf_detach(devinfo->dev);
  1060. kfree(devinfo->bus_pub.bus);
  1061. brcmf_usb_detach(devinfo);
  1062. }
  1063. static int
  1064. brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
  1065. {
  1066. struct usb_device *usb = interface_to_usbdev(intf);
  1067. struct brcmf_usbdev_info *devinfo;
  1068. struct usb_interface_descriptor *desc;
  1069. struct usb_endpoint_descriptor *endpoint;
  1070. int ret = 0;
  1071. u32 num_of_eps;
  1072. u8 endpoint_num, ep;
  1073. brcmf_dbg(USB, "Enter 0x%04x:0x%04x\n", id->idVendor, id->idProduct);
  1074. devinfo = kzalloc(sizeof(*devinfo), GFP_ATOMIC);
  1075. if (devinfo == NULL)
  1076. return -ENOMEM;
  1077. devinfo->usbdev = usb;
  1078. devinfo->dev = &usb->dev;
  1079. /* Take an init lock, to protect for disconnect while still loading.
  1080. * Necessary because of the asynchronous firmware load construction
  1081. */
  1082. mutex_init(&devinfo->dev_init_lock);
  1083. mutex_lock(&devinfo->dev_init_lock);
  1084. usb_set_intfdata(intf, devinfo);
  1085. /* Check that the device supports only one configuration */
  1086. if (usb->descriptor.bNumConfigurations != 1) {
  1087. brcmf_err("Number of configurations: %d not supported\n",
  1088. usb->descriptor.bNumConfigurations);
  1089. ret = -ENODEV;
  1090. goto fail;
  1091. }
  1092. if ((usb->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) &&
  1093. (usb->descriptor.bDeviceClass != USB_CLASS_MISC) &&
  1094. (usb->descriptor.bDeviceClass != USB_CLASS_WIRELESS_CONTROLLER)) {
  1095. brcmf_err("Device class: 0x%x not supported\n",
  1096. usb->descriptor.bDeviceClass);
  1097. ret = -ENODEV;
  1098. goto fail;
  1099. }
  1100. desc = &intf->altsetting[0].desc;
  1101. if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
  1102. (desc->bInterfaceSubClass != 2) ||
  1103. (desc->bInterfaceProtocol != 0xff)) {
  1104. brcmf_err("non WLAN interface %d: 0x%x:0x%x:0x%x\n",
  1105. desc->bInterfaceNumber, desc->bInterfaceClass,
  1106. desc->bInterfaceSubClass, desc->bInterfaceProtocol);
  1107. ret = -ENODEV;
  1108. goto fail;
  1109. }
  1110. num_of_eps = desc->bNumEndpoints;
  1111. for (ep = 0; ep < num_of_eps; ep++) {
  1112. endpoint = &intf->altsetting[0].endpoint[ep].desc;
  1113. endpoint_num = usb_endpoint_num(endpoint);
  1114. if (!usb_endpoint_xfer_bulk(endpoint))
  1115. continue;
  1116. if (usb_endpoint_dir_in(endpoint)) {
  1117. if (!devinfo->rx_pipe)
  1118. devinfo->rx_pipe =
  1119. usb_rcvbulkpipe(usb, endpoint_num);
  1120. } else {
  1121. if (!devinfo->tx_pipe)
  1122. devinfo->tx_pipe =
  1123. usb_sndbulkpipe(usb, endpoint_num);
  1124. }
  1125. }
  1126. if (devinfo->rx_pipe == 0) {
  1127. brcmf_err("No RX (in) Bulk EP found\n");
  1128. ret = -ENODEV;
  1129. goto fail;
  1130. }
  1131. if (devinfo->tx_pipe == 0) {
  1132. brcmf_err("No TX (out) Bulk EP found\n");
  1133. ret = -ENODEV;
  1134. goto fail;
  1135. }
  1136. devinfo->ifnum = desc->bInterfaceNumber;
  1137. if (usb->speed == USB_SPEED_SUPER_PLUS)
  1138. brcmf_dbg(USB, "Broadcom super speed plus USB WLAN interface detected\n");
  1139. else if (usb->speed == USB_SPEED_SUPER)
  1140. brcmf_dbg(USB, "Broadcom super speed USB WLAN interface detected\n");
  1141. else if (usb->speed == USB_SPEED_HIGH)
  1142. brcmf_dbg(USB, "Broadcom high speed USB WLAN interface detected\n");
  1143. else
  1144. brcmf_dbg(USB, "Broadcom full speed USB WLAN interface detected\n");
  1145. ret = brcmf_usb_probe_cb(devinfo);
  1146. if (ret)
  1147. goto fail;
  1148. /* Success */
  1149. return 0;
  1150. fail:
  1151. mutex_unlock(&devinfo->dev_init_lock);
  1152. kfree(devinfo);
  1153. usb_set_intfdata(intf, NULL);
  1154. return ret;
  1155. }
  1156. static void
  1157. brcmf_usb_disconnect(struct usb_interface *intf)
  1158. {
  1159. struct brcmf_usbdev_info *devinfo;
  1160. brcmf_dbg(USB, "Enter\n");
  1161. devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
  1162. if (devinfo) {
  1163. mutex_lock(&devinfo->dev_init_lock);
  1164. /* Make sure that devinfo still exists. Firmware probe routines
  1165. * may have released the device and cleared the intfdata.
  1166. */
  1167. if (!usb_get_intfdata(intf))
  1168. goto done;
  1169. brcmf_usb_disconnect_cb(devinfo);
  1170. kfree(devinfo);
  1171. }
  1172. done:
  1173. brcmf_dbg(USB, "Exit\n");
  1174. }
  1175. /*
  1176. * only need to signal the bus being down and update the state.
  1177. */
  1178. static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
  1179. {
  1180. struct usb_device *usb = interface_to_usbdev(intf);
  1181. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
  1182. brcmf_dbg(USB, "Enter\n");
  1183. devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
  1184. if (devinfo->wowl_enabled)
  1185. brcmf_cancel_all_urbs(devinfo);
  1186. else
  1187. brcmf_detach(&usb->dev);
  1188. return 0;
  1189. }
  1190. /*
  1191. * (re-) start the bus.
  1192. */
  1193. static int brcmf_usb_resume(struct usb_interface *intf)
  1194. {
  1195. struct usb_device *usb = interface_to_usbdev(intf);
  1196. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
  1197. brcmf_dbg(USB, "Enter\n");
  1198. if (!devinfo->wowl_enabled)
  1199. return brcmf_usb_bus_setup(devinfo);
  1200. devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
  1201. brcmf_usb_rx_fill_all(devinfo);
  1202. return 0;
  1203. }
  1204. static int brcmf_usb_reset_resume(struct usb_interface *intf)
  1205. {
  1206. struct usb_device *usb = interface_to_usbdev(intf);
  1207. struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
  1208. brcmf_dbg(USB, "Enter\n");
  1209. return brcmf_fw_get_firmwares(&usb->dev, 0, devinfo->fw_name, NULL,
  1210. brcmf_usb_probe_phase2);
  1211. }
  1212. #define BRCMF_USB_DEVICE(dev_id) \
  1213. { USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) }
  1214. #define LINKSYS_USB_DEVICE(dev_id) \
  1215. { USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) }
  1216. static struct usb_device_id brcmf_usb_devid_table[] = {
  1217. BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID),
  1218. BRCMF_USB_DEVICE(BRCM_USB_43236_DEVICE_ID),
  1219. BRCMF_USB_DEVICE(BRCM_USB_43242_DEVICE_ID),
  1220. BRCMF_USB_DEVICE(BRCM_USB_43569_DEVICE_ID),
  1221. LINKSYS_USB_DEVICE(BRCM_USB_43235_LINKSYS_DEVICE_ID),
  1222. { USB_DEVICE(BRCM_USB_VENDOR_ID_LG, BRCM_USB_43242_LG_DEVICE_ID) },
  1223. /* special entry for device with firmware loaded and running */
  1224. BRCMF_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID),
  1225. { /* end: all zeroes */ }
  1226. };
  1227. MODULE_DEVICE_TABLE(usb, brcmf_usb_devid_table);
  1228. static struct usb_driver brcmf_usbdrvr = {
  1229. .name = KBUILD_MODNAME,
  1230. .probe = brcmf_usb_probe,
  1231. .disconnect = brcmf_usb_disconnect,
  1232. .id_table = brcmf_usb_devid_table,
  1233. .suspend = brcmf_usb_suspend,
  1234. .resume = brcmf_usb_resume,
  1235. .reset_resume = brcmf_usb_reset_resume,
  1236. .disable_hub_initiated_lpm = 1,
  1237. };
  1238. static int brcmf_usb_reset_device(struct device *dev, void *notused)
  1239. {
  1240. /* device past is the usb interface so we
  1241. * need to use parent here.
  1242. */
  1243. brcmf_dev_reset(dev->parent);
  1244. return 0;
  1245. }
  1246. void brcmf_usb_exit(void)
  1247. {
  1248. struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
  1249. int ret;
  1250. brcmf_dbg(USB, "Enter\n");
  1251. ret = driver_for_each_device(drv, NULL, NULL,
  1252. brcmf_usb_reset_device);
  1253. usb_deregister(&brcmf_usbdrvr);
  1254. }
  1255. void brcmf_usb_register(void)
  1256. {
  1257. brcmf_dbg(USB, "Enter\n");
  1258. usb_register(&brcmf_usbdrvr);
  1259. }